@dxos/react-ui-geo 0.8.4-main.72ec0f3 → 0.8.4-main.765dc60934

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/browser/{countries-110m-ZM3ZIEFS.mjs → countries-110m-RE5RNRQG.mjs} +1 -1
  3. package/dist/lib/browser/data.mjs +4 -3
  4. package/dist/lib/browser/data.mjs.map +4 -4
  5. package/dist/lib/browser/index.mjs +354 -461
  6. package/dist/lib/browser/index.mjs.map +4 -4
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/translations.mjs +19 -0
  9. package/dist/lib/browser/translations.mjs.map +7 -0
  10. package/dist/lib/node-esm/{countries-110m-3SFASWVD.mjs → countries-110m-4EDBXSFJ.mjs} +1 -1
  11. package/dist/lib/node-esm/data.mjs +5 -3
  12. package/dist/lib/node-esm/data.mjs.map +4 -4
  13. package/dist/lib/node-esm/index.mjs +354 -460
  14. package/dist/lib/node-esm/index.mjs.map +4 -4
  15. package/dist/lib/node-esm/meta.json +1 -1
  16. package/dist/lib/node-esm/translations.mjs +21 -0
  17. package/dist/lib/node-esm/translations.mjs.map +7 -0
  18. package/dist/types/data/airports.d.ts +4 -4
  19. package/dist/types/data/airports.d.ts.map +1 -1
  20. package/dist/types/data/cities.d.ts.map +1 -1
  21. package/dist/types/data/countries-110m.d.ts.map +1 -1
  22. package/dist/types/data/countries-dots-3.d.ts.map +1 -1
  23. package/dist/types/data/countries-dots-4.d.ts.map +1 -1
  24. package/dist/types/src/components/Globe/Globe.d.ts +5 -3
  25. package/dist/types/src/components/Globe/Globe.d.ts.map +1 -1
  26. package/dist/types/src/components/Globe/Globe.stories.d.ts +6 -4
  27. package/dist/types/src/components/Globe/Globe.stories.d.ts.map +1 -1
  28. package/dist/types/src/components/Map/Map.d.ts +19 -5
  29. package/dist/types/src/components/Map/Map.d.ts.map +1 -1
  30. package/dist/types/src/components/Map/Map.stories.d.ts.map +1 -1
  31. package/dist/types/src/components/Toolbar/Controls.d.ts.map +1 -1
  32. package/dist/types/src/hooks/context.d.ts +1 -3
  33. package/dist/types/src/hooks/context.d.ts.map +1 -1
  34. package/dist/types/src/hooks/useDrag.d.ts.map +1 -1
  35. package/dist/types/src/hooks/useGlobeZoomHandler.d.ts +1 -1
  36. package/dist/types/src/hooks/useGlobeZoomHandler.d.ts.map +1 -1
  37. package/dist/types/src/hooks/useMapZoomHandler.d.ts +1 -1
  38. package/dist/types/src/hooks/useMapZoomHandler.d.ts.map +1 -1
  39. package/dist/types/src/hooks/useSpinner.d.ts.map +1 -1
  40. package/dist/types/src/hooks/useTour.d.ts.map +1 -1
  41. package/dist/types/src/index.d.ts +0 -2
  42. package/dist/types/src/index.d.ts.map +1 -1
  43. package/dist/types/src/translations.d.ts +6 -6
  44. package/dist/types/src/translations.d.ts.map +1 -1
  45. package/dist/types/src/util/debug.d.ts.map +1 -1
  46. package/dist/types/src/util/inertia.d.ts.map +1 -1
  47. package/dist/types/src/util/path.d.ts.map +1 -1
  48. package/dist/types/src/util/render.d.ts.map +1 -1
  49. package/dist/types/tsconfig.tsbuildinfo +1 -1
  50. package/package.json +42 -36
  51. package/src/components/Globe/Globe.stories.tsx +8 -9
  52. package/src/components/Globe/Globe.tsx +55 -29
  53. package/src/components/Map/Map.stories.tsx +9 -8
  54. package/src/components/Map/Map.tsx +70 -29
  55. package/src/components/Toolbar/Controls.tsx +5 -5
  56. package/src/hooks/context.tsx +5 -34
  57. package/src/hooks/useSpinner.ts +0 -1
  58. package/src/index.ts +0 -2
  59. package/src/translations.ts +5 -5
  60. package/src/util/render.ts +0 -1
  61. package/dist/lib/browser/chunk-GMWLKTLN.mjs +0 -9
  62. package/dist/lib/browser/chunk-GMWLKTLN.mjs.map +0 -7
  63. package/dist/lib/node-esm/chunk-JODBF4CC.mjs +0 -11
  64. package/dist/lib/node-esm/chunk-JODBF4CC.mjs.map +0 -7
  65. /package/dist/lib/browser/{countries-110m-ZM3ZIEFS.mjs.map → countries-110m-RE5RNRQG.mjs.map} +0 -0
  66. /package/dist/lib/node-esm/{countries-110m-3SFASWVD.mjs.map → countries-110m-4EDBXSFJ.mjs.map} +0 -0
@@ -1,52 +1,14 @@
1
- import {
2
- loadTopology
3
- } from "./chunk-GMWLKTLN.mjs";
4
-
5
1
  // src/components/Globe/Globe.tsx
6
- import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
7
2
  import { easeLinear, easeSinOut, geoMercator, geoOrthographic, geoPath as geoPath2, geoTransverseMercator, interpolateNumber, transition } from "d3";
8
- import React3, { forwardRef, useEffect as useEffect4, useImperativeHandle, useMemo as useMemo2, useRef, useState as useState3 } from "react";
3
+ import React2, { forwardRef, useEffect as useEffect4, useImperativeHandle, useMemo as useMemo2, useRef, useState as useState3 } from "react";
9
4
  import { useResizeDetector } from "react-resize-detector";
10
- import { useDynamicRef, useThemeContext } from "@dxos/react-ui";
11
- import { mx } from "@dxos/react-ui-theme";
5
+ import { useComposedRefs, useControlledState, useDynamicRef, useThemeContext } from "@dxos/react-ui";
6
+ import { composable, composableProps, mx } from "@dxos/ui-theme";
12
7
 
13
8
  // src/hooks/context.tsx
14
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
15
- import React, { createContext, useContext } from "react";
9
+ import { createContext, useContext } from "react";
16
10
  import { raise } from "@dxos/debug";
17
- import { useControlledState } from "@dxos/react-ui";
18
- var defaults = {
19
- center: {
20
- lat: 51,
21
- lng: 0
22
- },
23
- zoom: 4
24
- };
25
11
  var GlobeContext = /* @__PURE__ */ createContext(void 0);
26
- var GlobeContextProvider = ({ children, size, center: centerParam = defaults.center, zoom: zoomParam = defaults.zoom, translation: translationParam, rotation: rotationParam }) => {
27
- var _effect = _useSignals();
28
- try {
29
- const [center, setCenter] = useControlledState(centerParam);
30
- const [zoom, setZoom] = useControlledState(zoomParam);
31
- const [translation, setTranslation] = useControlledState(translationParam);
32
- const [rotation, setRotation] = useControlledState(rotationParam);
33
- return /* @__PURE__ */ React.createElement(GlobeContext.Provider, {
34
- value: {
35
- size,
36
- center,
37
- zoom,
38
- translation,
39
- rotation,
40
- setCenter,
41
- setZoom,
42
- setTranslation,
43
- setRotation
44
- }
45
- }, children);
46
- } finally {
47
- _effect.f();
48
- }
49
- };
50
12
  var useGlobeContext = () => {
51
13
  return useContext(GlobeContext) ?? raise(new Error("Missing GlobeContext"));
52
14
  };
@@ -631,26 +593,9 @@ var useTour = (controller, points, options = {}) => {
631
593
  };
632
594
 
633
595
  // src/components/Toolbar/Controls.tsx
634
- import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
635
- import React2 from "react";
596
+ import React from "react";
636
597
  import { IconButton, Toolbar, useTranslation } from "@dxos/react-ui";
637
-
638
- // src/translations.ts
639
- var translationKey = "react-ui-geo";
640
- var translations = [
641
- {
642
- "en-US": {
643
- [translationKey]: {
644
- "zoom in icon button": "Zoom in",
645
- "zoom out icon button": "Zoom out",
646
- "start icon button": "Start",
647
- "toggle icon button": "Toggle"
648
- }
649
- }
650
- }
651
- ];
652
-
653
- // src/components/Toolbar/Controls.tsx
598
+ import { translationKey } from "#translations";
654
599
  var controlPositions = {
655
600
  topleft: "top-2 left-2",
656
601
  topright: "top-2 right-2",
@@ -658,52 +603,42 @@ var controlPositions = {
658
603
  bottomright: "bottom-2 right-2"
659
604
  };
660
605
  var ZoomControls = ({ classNames, onAction }) => {
661
- var _effect = _useSignals2();
662
- try {
663
- const { t } = useTranslation(translationKey);
664
- return /* @__PURE__ */ React2.createElement(Toolbar.Root, {
665
- classNames: [
666
- "gap-2",
667
- classNames
668
- ]
669
- }, /* @__PURE__ */ React2.createElement(IconButton, {
670
- icon: "ph--plus--regular",
671
- iconOnly: true,
672
- label: t("zoom in icon button"),
673
- onClick: () => onAction?.("zoom-in")
674
- }), /* @__PURE__ */ React2.createElement(IconButton, {
675
- icon: "ph--minus--regular",
676
- iconOnly: true,
677
- label: t("zoom out icon button"),
678
- onClick: () => onAction?.("zoom-out")
679
- }));
680
- } finally {
681
- _effect.f();
682
- }
606
+ const { t } = useTranslation(translationKey);
607
+ return /* @__PURE__ */ React.createElement(Toolbar.Root, {
608
+ classNames: [
609
+ "gap-2",
610
+ classNames
611
+ ]
612
+ }, /* @__PURE__ */ React.createElement(IconButton, {
613
+ icon: "ph--plus--regular",
614
+ iconOnly: true,
615
+ label: t("zoom-in-icon.button"),
616
+ onClick: () => onAction?.("zoom-in")
617
+ }), /* @__PURE__ */ React.createElement(IconButton, {
618
+ icon: "ph--minus--regular",
619
+ iconOnly: true,
620
+ label: t("zoom-out-icon.button"),
621
+ onClick: () => onAction?.("zoom-out")
622
+ }));
683
623
  };
684
624
  var ActionControls = ({ classNames, onAction }) => {
685
- var _effect = _useSignals2();
686
- try {
687
- const { t } = useTranslation(translationKey);
688
- return /* @__PURE__ */ React2.createElement(Toolbar.Root, {
689
- classNames: [
690
- "gap-2",
691
- classNames
692
- ]
693
- }, /* @__PURE__ */ React2.createElement(IconButton, {
694
- icon: "ph--path--regular",
695
- iconOnly: true,
696
- label: t("start icon button"),
697
- onClick: () => onAction?.("start")
698
- }), /* @__PURE__ */ React2.createElement(IconButton, {
699
- icon: "ph--globe-hemisphere-west--regular",
700
- iconOnly: true,
701
- label: t("toggle icon button"),
702
- onClick: () => onAction?.("toggle")
703
- }));
704
- } finally {
705
- _effect.f();
706
- }
625
+ const { t } = useTranslation(translationKey);
626
+ return /* @__PURE__ */ React.createElement(Toolbar.Root, {
627
+ classNames: [
628
+ "gap-2",
629
+ classNames
630
+ ]
631
+ }, /* @__PURE__ */ React.createElement(IconButton, {
632
+ icon: "ph--path--regular",
633
+ iconOnly: true,
634
+ label: t("start-icon.button"),
635
+ onClick: () => onAction?.("start")
636
+ }), /* @__PURE__ */ React.createElement(IconButton, {
637
+ icon: "ph--globe-hemisphere-west--regular",
638
+ iconOnly: true,
639
+ label: t("toggle-icon.button"),
640
+ onClick: () => onAction?.("toggle")
641
+ }));
707
642
  };
708
643
 
709
644
  // src/components/Globe/Globe.tsx
@@ -761,186 +696,166 @@ var getProjection = (type = "orthographic") => {
761
696
  }
762
697
  return type ?? geoOrthographic();
763
698
  };
764
- var GlobeRoot = ({ classNames, children, ...props }) => {
765
- var _effect = _useSignals3();
766
- try {
767
- const { ref, width, height } = useResizeDetector();
768
- return /* @__PURE__ */ React3.createElement("div", {
769
- ref,
770
- className: mx("relative flex grow overflow-hidden", classNames)
771
- }, /* @__PURE__ */ React3.createElement(GlobeContextProvider, {
699
+ var GlobeRoot = composable(({ children, center: centerProp, zoom: zoomProp, translation: translationProp, rotation: rotationProp, ...props }, forwardedRef) => {
700
+ const localRef = useRef(null);
701
+ const composedRef = useComposedRefs(localRef, forwardedRef);
702
+ const { width, height } = useResizeDetector({
703
+ targetRef: localRef
704
+ });
705
+ const [center, setCenter] = useControlledState(centerProp);
706
+ const [zoom, setZoom] = useControlledState(zoomProp ?? 4);
707
+ const [translation, setTranslation] = useControlledState(translationProp);
708
+ const [rotation, setRotation] = useControlledState(rotationProp);
709
+ return /* @__PURE__ */ React2.createElement(GlobeContext.Provider, {
710
+ value: {
772
711
  size: {
773
712
  width,
774
713
  height
775
714
  },
776
- ...props
777
- }, children));
778
- } finally {
779
- _effect.f();
780
- }
781
- };
782
- var GlobeCanvas = /* @__PURE__ */ forwardRef(({ projection: projectionParam, topology, features, styles: stylesParam }, forwardRef3) => {
783
- var _effect = _useSignals3();
784
- try {
785
- const { themeMode } = useThemeContext();
786
- const styles = useMemo2(() => stylesParam ?? defaultStyles[themeMode], [
787
- stylesParam,
788
- themeMode
789
- ]);
790
- const [canvas, setCanvas] = useState3(null);
791
- const canvasRef = (canvas2) => setCanvas(canvas2);
792
- const projection = useMemo2(() => getProjection(projectionParam), [
793
- projectionParam
794
- ]);
795
- const layers = useMemo2(() => {
796
- return timer(() => createLayers(topology, features, styles));
797
- }, [
798
- topology,
799
- features,
800
- styles
801
- ]);
802
- const { size, center, zoom, translation, rotation, setCenter, setZoom, setTranslation, setRotation } = useGlobeContext();
803
- const zoomRef = useDynamicRef(zoom);
804
- useEffect4(() => {
805
- if (center) {
806
- setZoom(1);
807
- setRotation(positionToRotation(geoToPosition(center)));
808
- }
809
- }, [
810
- center
811
- ]);
812
- const zooming = useRef(false);
813
- useImperativeHandle(forwardRef3, () => {
814
- return {
815
- canvas,
816
- projection,
817
- center,
818
- get zoom() {
819
- return zoomRef.current;
820
- },
821
- translation,
822
- rotation,
823
- setCenter,
824
- setZoom: (s) => {
825
- if (typeof s === "function") {
826
- const is = interpolateNumber(zoomRef.current, s(zoomRef.current));
827
- transition().ease(zooming.current ? easeLinear : easeSinOut).duration(200).tween("scale", () => (t) => setZoom(is(t))).on("end", () => {
828
- zooming.current = false;
829
- });
830
- } else {
831
- setZoom(s);
832
- }
833
- },
834
- setTranslation,
835
- setRotation
836
- };
837
- }, [
838
- canvas
839
- ]);
840
- const generator = useMemo2(() => canvas && projection && geoPath2(projection, canvas.getContext("2d", {
841
- alpha: false
842
- })), [
843
- canvas,
844
- projection
845
- ]);
846
- useEffect4(() => {
847
- if (canvas && projection) {
848
- timer(() => {
849
- projection.scale(Math.min(size.width, size.height) / 2 * zoom).translate([
850
- size.width / 2 + (translation?.x ?? 0),
851
- size.height / 2 + (translation?.y ?? 0)
852
- ]).rotate(rotation ?? [
853
- 0,
854
- 0,
855
- 0
856
- ]);
857
- renderLayers(generator, layers, zoom, styles);
858
- });
859
- }
860
- }, [
861
- generator,
862
- size,
715
+ center,
863
716
  zoom,
864
717
  translation,
865
718
  rotation,
866
- layers
867
- ]);
868
- if (!size.width || !size.height) {
869
- return null;
719
+ setCenter,
720
+ setZoom,
721
+ setTranslation,
722
+ setRotation
870
723
  }
871
- return /* @__PURE__ */ React3.createElement("canvas", {
872
- ref: canvasRef,
873
- width: size.width,
874
- height: size.height
875
- });
876
- } finally {
877
- _effect.f();
878
- }
724
+ }, /* @__PURE__ */ React2.createElement("div", {
725
+ ...composableProps(props, {
726
+ classNames: "relative dx-container"
727
+ }),
728
+ ref: composedRef
729
+ }, children));
879
730
  });
880
- var GlobeDebug = ({ position = "topleft" }) => {
881
- var _effect = _useSignals3();
882
- try {
883
- const { size, zoom, translation, rotation } = useGlobeContext();
884
- return /* @__PURE__ */ React3.createElement("div", {
885
- className: mx("z-10 absolute is-96 p-2 overflow-hidden border border-green-700 rounded", controlPositions[position])
886
- }, /* @__PURE__ */ React3.createElement("pre", {
887
- className: "font-mono text-xs text-green-700"
888
- }, JSON.stringify({
889
- size,
890
- zoom,
731
+ var GlobeCanvas = /* @__PURE__ */ forwardRef(({ projection: projectionProp, topology, features, styles: stylesProp }, forwardRef3) => {
732
+ const { themeMode } = useThemeContext();
733
+ const styles = useMemo2(() => stylesProp ?? defaultStyles[themeMode], [
734
+ stylesProp,
735
+ themeMode
736
+ ]);
737
+ const [canvas, setCanvas] = useState3(null);
738
+ const canvasRef = (canvas2) => setCanvas(canvas2);
739
+ const projection = useMemo2(() => getProjection(projectionProp), [
740
+ projectionProp
741
+ ]);
742
+ const layers = useMemo2(() => {
743
+ return timer(() => createLayers(topology, features, styles));
744
+ }, [
745
+ topology,
746
+ features,
747
+ styles
748
+ ]);
749
+ const { size, center, zoom, translation, rotation, setCenter, setZoom, setTranslation, setRotation } = useGlobeContext();
750
+ const zoomRef = useDynamicRef(zoom);
751
+ useEffect4(() => {
752
+ if (center) {
753
+ setZoom(1);
754
+ setRotation(positionToRotation(geoToPosition(center)));
755
+ }
756
+ }, [
757
+ center
758
+ ]);
759
+ const zooming = useRef(false);
760
+ useImperativeHandle(forwardRef3, () => {
761
+ return {
762
+ canvas,
763
+ projection,
764
+ center,
765
+ get zoom() {
766
+ return zoomRef.current;
767
+ },
891
768
  translation,
892
- rotation
893
- }, null, 2)));
894
- } finally {
895
- _effect.f();
769
+ rotation,
770
+ setCenter,
771
+ setZoom: (state) => {
772
+ if (typeof state === "function") {
773
+ const is = interpolateNumber(zoomRef.current, state(zoomRef.current));
774
+ transition().ease(zooming.current ? easeLinear : easeSinOut).duration(200).tween("scale", () => (t) => setZoom(is(t))).on("end", () => {
775
+ zooming.current = false;
776
+ });
777
+ } else {
778
+ setZoom(state);
779
+ }
780
+ },
781
+ setTranslation,
782
+ setRotation
783
+ };
784
+ }, [
785
+ canvas
786
+ ]);
787
+ const generator = useMemo2(() => canvas && projection && geoPath2(projection, canvas.getContext("2d", {
788
+ alpha: false
789
+ })), [
790
+ canvas,
791
+ projection
792
+ ]);
793
+ useEffect4(() => {
794
+ if (canvas && projection) {
795
+ timer(() => {
796
+ projection.scale(Math.min(size.width, size.height) / 2 * zoom).translate([
797
+ size.width / 2 + (translation?.x ?? 0),
798
+ size.height / 2 + (translation?.y ?? 0)
799
+ ]).rotate(rotation ?? [
800
+ 0,
801
+ 0,
802
+ 0
803
+ ]);
804
+ renderLayers(generator, layers, zoom, styles);
805
+ });
806
+ }
807
+ }, [
808
+ generator,
809
+ size,
810
+ zoom,
811
+ translation,
812
+ rotation,
813
+ layers
814
+ ]);
815
+ if (!size.width || !size.height) {
816
+ return null;
896
817
  }
818
+ return /* @__PURE__ */ React2.createElement("canvas", {
819
+ ref: canvasRef,
820
+ width: size.width,
821
+ height: size.height
822
+ });
823
+ });
824
+ var GlobeDebug = ({ position = "topleft" }) => {
825
+ const { size, zoom, translation, rotation } = useGlobeContext();
826
+ return /* @__PURE__ */ React2.createElement("div", {
827
+ className: mx("z-10 absolute w-96 p-2 overflow-hidden border border-green-700 rounded-sm", controlPositions[position])
828
+ }, /* @__PURE__ */ React2.createElement("pre", {
829
+ className: "font-mono text-xs text-green-700"
830
+ }, JSON.stringify({
831
+ size,
832
+ zoom,
833
+ translation,
834
+ rotation
835
+ }, null, 2)));
897
836
  };
898
837
  var GlobePanel = ({ position, classNames, children }) => {
899
- var _effect = _useSignals3();
900
- try {
901
- return /* @__PURE__ */ React3.createElement("div", {
902
- className: mx("z-10 absolute overflow-hidden", controlPositions[position], classNames)
903
- }, children);
904
- } finally {
905
- _effect.f();
906
- }
838
+ return /* @__PURE__ */ React2.createElement("div", {
839
+ className: mx("z-10 absolute overflow-hidden", controlPositions[position], classNames)
840
+ }, children);
907
841
  };
908
842
  var CustomControl = ({ position, children }) => {
909
- var _effect = _useSignals3();
910
- try {
911
- return /* @__PURE__ */ React3.createElement("div", {
912
- className: mx("z-10 absolute overflow-hidden", controlPositions[position])
913
- }, children);
914
- } finally {
915
- _effect.f();
916
- }
917
- };
918
- var GlobeZoom = ({ onAction, position = "bottomleft", ...props }) => {
919
- var _effect = _useSignals3();
920
- try {
921
- return /* @__PURE__ */ React3.createElement(CustomControl, {
922
- position,
923
- ...props
924
- }, /* @__PURE__ */ React3.createElement(ZoomControls, {
925
- onAction
926
- }));
927
- } finally {
928
- _effect.f();
929
- }
930
- };
931
- var GlobeAction = ({ onAction, position = "bottomright", ...props }) => {
932
- var _effect = _useSignals3();
933
- try {
934
- return /* @__PURE__ */ React3.createElement(CustomControl, {
935
- position,
936
- ...props
937
- }, /* @__PURE__ */ React3.createElement(ActionControls, {
938
- onAction
939
- }));
940
- } finally {
941
- _effect.f();
942
- }
843
+ return /* @__PURE__ */ React2.createElement("div", {
844
+ className: mx("z-10 absolute overflow-hidden", controlPositions[position])
845
+ }, children);
943
846
  };
847
+ var GlobeZoom = ({ onAction, position = "bottomleft", ...props }) => /* @__PURE__ */ React2.createElement(CustomControl, {
848
+ position,
849
+ ...props
850
+ }, /* @__PURE__ */ React2.createElement(ZoomControls, {
851
+ onAction
852
+ }));
853
+ var GlobeAction = ({ onAction, position = "bottomright", ...props }) => /* @__PURE__ */ React2.createElement(CustomControl, {
854
+ position,
855
+ ...props
856
+ }, /* @__PURE__ */ React2.createElement(ActionControls, {
857
+ onAction
858
+ }));
944
859
  var Globe = {
945
860
  Root: GlobeRoot,
946
861
  Canvas: GlobeCanvas,
@@ -951,217 +866,198 @@ var Globe = {
951
866
  };
952
867
 
953
868
  // src/components/Map/Map.tsx
954
- import { useSignals as _useSignals4 } from "@preact-signals/safe-react/tracking";
955
869
  import "leaflet/dist/leaflet.css";
956
870
  import { createContext as createContext2 } from "@radix-ui/react-context";
957
871
  import L, { Control, DomEvent, DomUtil, latLngBounds } from "leaflet";
958
- import React4, { forwardRef as forwardRef2, useEffect as useEffect5, useImperativeHandle as useImperativeHandle2, useRef as useRef2, useState as useState4 } from "react";
872
+ import React3, { forwardRef as forwardRef2, useEffect as useEffect5, useImperativeHandle as useImperativeHandle2, useRef as useRef2 } from "react";
959
873
  import { createRoot } from "react-dom/client";
960
874
  import { MapContainer, Marker, Popup, TileLayer, useMap, useMapEvents } from "react-leaflet";
961
875
  import { ThemeProvider, Tooltip } from "@dxos/react-ui";
962
- import { defaultTx, mx as mx2 } from "@dxos/react-ui-theme";
963
- var defaults2 = {
876
+ import { composable as composable2, composableProps as composableProps2, defaultTx, mx as mx2 } from "@dxos/ui-theme";
877
+ var defaults = {
964
878
  center: {
965
879
  lat: 51,
966
880
  lng: 0
967
881
  },
968
882
  zoom: 4
969
883
  };
970
- var [MapContextProvier, useMapContext] = createContext2("Map");
971
- var MapRoot = /* @__PURE__ */ forwardRef2(({ classNames, scrollWheelZoom = true, doubleClickZoom = true, touchZoom = true, center, zoom, onChange, ...props }, forwardedRef) => {
972
- var _effect = _useSignals4();
973
- try {
974
- const [attention, setAttention] = useState4(false);
975
- const mapRef = useRef2(null);
976
- const map = mapRef.current;
977
- useImperativeHandle2(forwardedRef, () => ({
978
- setCenter: (center2, zoom2) => {
979
- mapRef.current?.setView(center2, zoom2);
980
- },
981
- setZoom: (cb) => {
982
- mapRef.current?.setZoom(cb(mapRef.current?.getZoom() ?? 0));
983
- }
984
- }), []);
985
- useEffect5(() => {
986
- if (!map) {
987
- return;
988
- }
989
- if (attention) {
990
- map.scrollWheelZoom.enable();
991
- } else {
992
- map.scrollWheelZoom.disable();
993
- }
994
- }, [
995
- map,
996
- attention
997
- ]);
998
- return /* @__PURE__ */ React4.createElement(MapContextProvier, {
999
- attention,
1000
- onChange
1001
- }, /* @__PURE__ */ React4.createElement(MapContainer, {
1002
- ...props,
1003
- ref: mapRef,
1004
- className: mx2("group relative grid bs-full is-full !bg-baseSurface dx-focus-ring-inset", classNames),
1005
- attributionControl: false,
1006
- zoomControl: false,
1007
- scrollWheelZoom,
1008
- doubleClickZoom,
1009
- touchZoom,
1010
- center: center ?? defaults2.center,
1011
- zoom: zoom ?? defaults2.zoom
1012
- }));
1013
- } finally {
1014
- _effect.f();
1015
- }
884
+ var [MapContextProvider, useMapContext] = createContext2("Map");
885
+ var MapRoot = composable2(({ children, onChange, ...props }, forwardedRef) => {
886
+ const attention = false;
887
+ return /* @__PURE__ */ React3.createElement(MapContextProvider, {
888
+ attention,
889
+ onChange
890
+ }, /* @__PURE__ */ React3.createElement("div", {
891
+ ...composableProps2(props, {
892
+ role: "none",
893
+ classNames: "dx-container grid dx-focus-ring-inset"
894
+ }),
895
+ ref: forwardedRef
896
+ }, children));
1016
897
  });
1017
898
  MapRoot.displayName = "Map.Root";
899
+ var MAP_CONTENT_NAME = "Map.Content";
900
+ var MapContent = /* @__PURE__ */ forwardRef2(({ classNames, scrollWheelZoom = true, doubleClickZoom = true, touchZoom = true, center, zoom, children, ...props }, forwardedRef) => {
901
+ const { attention } = useMapContext(MAP_CONTENT_NAME);
902
+ const mapRef = useRef2(null);
903
+ const map = mapRef.current;
904
+ useImperativeHandle2(forwardedRef, () => ({
905
+ setCenter: (center2, zoom2) => {
906
+ mapRef.current?.setView(center2, zoom2);
907
+ },
908
+ setZoom: (cb) => {
909
+ mapRef.current?.setZoom(cb(mapRef.current?.getZoom() ?? 0));
910
+ }
911
+ }), []);
912
+ useEffect5(() => {
913
+ if (!map) {
914
+ return;
915
+ }
916
+ if (attention) {
917
+ map.scrollWheelZoom.enable();
918
+ } else {
919
+ map.scrollWheelZoom.disable();
920
+ }
921
+ }, [
922
+ map,
923
+ attention
924
+ ]);
925
+ return /* @__PURE__ */ React3.createElement(MapContainer, {
926
+ ...props,
927
+ className: mx2("group relative grid bg-base-surface!", classNames),
928
+ attributionControl: false,
929
+ zoomControl: false,
930
+ scrollWheelZoom,
931
+ doubleClickZoom,
932
+ touchZoom,
933
+ center: center ?? defaults.center,
934
+ zoom: zoom ?? defaults.zoom,
935
+ whenReady: () => {
936
+ },
937
+ ref: mapRef
938
+ }, children);
939
+ });
940
+ MapContent.displayName = "Map.Content";
941
+ var MAP_TILES_NAME = "Map.Tiles";
1018
942
  var MapTiles = (_props) => {
1019
- var _effect = _useSignals4();
1020
- try {
1021
- const ref = useRef2(null);
1022
- const { onChange } = useMapContext(MapTiles.displayName);
1023
- useMapEvents({
1024
- zoomstart: (ev) => {
1025
- onChange?.({
1026
- center: ev.target.getCenter(),
1027
- zoom: ev.target.getZoom()
1028
- });
1029
- }
1030
- });
1031
- const { attention } = useMapContext(MapTiles.displayName);
1032
- useEffect5(() => {
1033
- if (ref.current) {
1034
- ref.current.getContainer().dataset.attention = attention ? "1" : "0";
1035
- }
1036
- }, [
1037
- attention
1038
- ]);
1039
- return /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(TileLayer, {
1040
- ref,
1041
- "data-attention": attention,
1042
- detectRetina: true,
1043
- className: 'dark:grayscale dark:invert data-[attention="0"]:!opacity-80',
1044
- url: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
1045
- keepBuffer: 4
1046
- }));
1047
- } finally {
1048
- _effect.f();
1049
- }
943
+ const ref = useRef2(null);
944
+ const { onChange } = useMapContext(MAP_TILES_NAME);
945
+ useMapEvents({
946
+ zoomstart: (ev) => {
947
+ onChange?.({
948
+ center: ev.target.getCenter(),
949
+ zoom: ev.target.getZoom()
950
+ });
951
+ }
952
+ });
953
+ const { attention } = useMapContext(MAP_TILES_NAME);
954
+ useEffect5(() => {
955
+ if (ref.current) {
956
+ ref.current.getContainer().dataset.attention = attention ? "1" : "0";
957
+ }
958
+ }, [
959
+ attention
960
+ ]);
961
+ return /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement(TileLayer, {
962
+ ref,
963
+ "data-attention": attention,
964
+ detectRetina: true,
965
+ className: 'dark:grayscale dark:invert data-[attention="0"]:!opacity-80',
966
+ url: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
967
+ keepBuffer: 4
968
+ }));
1050
969
  };
1051
- MapTiles.displayName = "Map.Tiles";
970
+ MapTiles.displayName = MAP_TILES_NAME;
1052
971
  var MapMarkers = ({ selected, markers }) => {
1053
- var _effect = _useSignals4();
1054
- try {
1055
- const map = useMap();
1056
- useEffect5(() => {
1057
- if (markers.length > 0) {
1058
- const bounds = latLngBounds(markers.map((marker) => marker.location));
1059
- map.fitBounds(bounds);
1060
- } else {
1061
- map.setView(defaults2.center, defaults2.zoom);
1062
- }
1063
- }, [
1064
- markers
1065
- ]);
1066
- return /* @__PURE__ */ React4.createElement(React4.Fragment, null, markers?.map(({ id, title, location: { lat, lng } }) => {
1067
- return /* @__PURE__ */ React4.createElement(Marker, {
1068
- key: id,
1069
- position: {
1070
- lat,
1071
- lng
1072
- },
1073
- icon: (
1074
- // TODO(burdon): Create custom icon from bundled assets.
1075
- // TODO(burdon): Selection state.
1076
- new L.Icon({
1077
- iconUrl: "https://dxos.network/marker-icon.png",
1078
- iconRetinaUrl: "https://dxos.network/marker-icon-2x.png",
1079
- shadowUrl: "https://dxos.network/marker-shadow.png",
1080
- iconSize: [
1081
- 25,
1082
- 41
1083
- ],
1084
- iconAnchor: [
1085
- 12,
1086
- 41
1087
- ],
1088
- popupAnchor: [
1089
- 1,
1090
- -34
1091
- ],
1092
- shadowSize: [
1093
- 41,
1094
- 41
1095
- ]
1096
- })
1097
- )
1098
- }, title && /* @__PURE__ */ React4.createElement(Popup, null, title));
1099
- }));
1100
- } finally {
1101
- _effect.f();
1102
- }
972
+ const map = useMap();
973
+ useEffect5(() => {
974
+ if (markers.length > 0) {
975
+ const bounds = latLngBounds(markers.map((marker) => marker.location));
976
+ map.fitBounds(bounds);
977
+ } else {
978
+ map.setView(defaults.center, defaults.zoom);
979
+ }
980
+ }, [
981
+ markers
982
+ ]);
983
+ return /* @__PURE__ */ React3.createElement(React3.Fragment, null, markers?.map(({ id, title, location: { lat, lng } }) => {
984
+ return /* @__PURE__ */ React3.createElement(Marker, {
985
+ key: id,
986
+ position: {
987
+ lat,
988
+ lng
989
+ },
990
+ icon: (
991
+ // TODO(burdon): Create custom icon from bundled assets.
992
+ // TODO(burdon): Selection state.
993
+ new L.Icon({
994
+ iconUrl: "https://dxos.network/marker-icon.png",
995
+ iconRetinaUrl: "https://dxos.network/marker-icon-2x.png",
996
+ shadowUrl: "https://dxos.network/marker-shadow.png",
997
+ iconSize: [
998
+ 25,
999
+ 41
1000
+ ],
1001
+ iconAnchor: [
1002
+ 12,
1003
+ 41
1004
+ ],
1005
+ popupAnchor: [
1006
+ 1,
1007
+ -34
1008
+ ],
1009
+ shadowSize: [
1010
+ 41,
1011
+ 41
1012
+ ]
1013
+ })
1014
+ )
1015
+ }, title && /* @__PURE__ */ React3.createElement(Popup, null, title));
1016
+ }));
1103
1017
  };
1104
1018
  MapMarkers.displayName = "Map.Markers";
1105
1019
  var CustomControl2 = ({ position, children }) => {
1106
- var _effect = _useSignals4();
1107
- try {
1108
- const map = useMap();
1109
- useEffect5(() => {
1110
- const control = new Control({
1111
- position
1112
- });
1113
- control.onAdd = () => {
1114
- const container = DomUtil.create("div", mx2("!m-0", controlPositions[position]));
1115
- DomEvent.disableClickPropagation(container);
1116
- DomEvent.disableScrollPropagation(container);
1117
- const root = createRoot(container);
1118
- root.render(/* @__PURE__ */ React4.createElement(ThemeProvider, {
1119
- tx: defaultTx
1120
- }, /* @__PURE__ */ React4.createElement(Tooltip.Provider, null, children)));
1121
- return container;
1122
- };
1123
- control.addTo(map);
1124
- return () => {
1125
- control.remove();
1126
- };
1127
- }, [
1128
- map,
1129
- position,
1130
- children
1131
- ]);
1132
- return null;
1133
- } finally {
1134
- _effect.f();
1135
- }
1136
- };
1137
- var MapZoom = ({ onAction, position = "bottomleft", ...props }) => {
1138
- var _effect = _useSignals4();
1139
- try {
1140
- return /* @__PURE__ */ React4.createElement(CustomControl2, {
1141
- position,
1142
- ...props
1143
- }, /* @__PURE__ */ React4.createElement(ZoomControls, {
1144
- onAction
1145
- }));
1146
- } finally {
1147
- _effect.f();
1148
- }
1149
- };
1150
- var MapAction = ({ onAction, position = "bottomright", ...props }) => {
1151
- var _effect = _useSignals4();
1152
- try {
1153
- return /* @__PURE__ */ React4.createElement(CustomControl2, {
1154
- position,
1155
- ...props
1156
- }, /* @__PURE__ */ React4.createElement(ActionControls, {
1157
- onAction
1158
- }));
1159
- } finally {
1160
- _effect.f();
1161
- }
1020
+ const map = useMap();
1021
+ useEffect5(() => {
1022
+ const control = new Control({
1023
+ position
1024
+ });
1025
+ control.onAdd = () => {
1026
+ const container = DomUtil.create("div", mx2("m-0!", controlPositions[position]));
1027
+ DomEvent.disableClickPropagation(container);
1028
+ DomEvent.disableScrollPropagation(container);
1029
+ const root = createRoot(container);
1030
+ root.render(/* @__PURE__ */ React3.createElement(ThemeProvider, {
1031
+ tx: defaultTx
1032
+ }, /* @__PURE__ */ React3.createElement(Tooltip.Provider, null, children)));
1033
+ return container;
1034
+ };
1035
+ control.addTo(map);
1036
+ return () => {
1037
+ control.remove();
1038
+ };
1039
+ }, [
1040
+ map,
1041
+ position,
1042
+ children
1043
+ ]);
1044
+ return null;
1162
1045
  };
1046
+ var MapZoom = ({ onAction, position = "bottomleft", ...props }) => /* @__PURE__ */ React3.createElement(CustomControl2, {
1047
+ position,
1048
+ ...props
1049
+ }, /* @__PURE__ */ React3.createElement(ZoomControls, {
1050
+ onAction
1051
+ }));
1052
+ var MapAction = ({ onAction, position = "bottomright", ...props }) => /* @__PURE__ */ React3.createElement(CustomControl2, {
1053
+ position,
1054
+ ...props
1055
+ }, /* @__PURE__ */ React3.createElement(ActionControls, {
1056
+ onAction
1057
+ }));
1163
1058
  var Map = {
1164
1059
  Root: MapRoot,
1060
+ Content: MapContent,
1165
1061
  Tiles: MapTiles,
1166
1062
  Markers: MapMarkers,
1167
1063
  Zoom: MapZoom,
@@ -1170,7 +1066,7 @@ var Map = {
1170
1066
  export {
1171
1067
  ActionControls,
1172
1068
  Globe,
1173
- GlobeContextProvider,
1069
+ GlobeContext,
1174
1070
  Map,
1175
1071
  ZoomControls,
1176
1072
  closestPoint,
@@ -1182,13 +1078,10 @@ export {
1182
1078
  geoPoint,
1183
1079
  geoToPosition,
1184
1080
  getDistance,
1185
- loadTopology,
1186
1081
  positionToRotation,
1187
1082
  renderLayers,
1188
1083
  restrictAxis,
1189
1084
  timer,
1190
- translationKey,
1191
- translations,
1192
1085
  useDrag,
1193
1086
  useGlobeContext,
1194
1087
  useGlobeZoomHandler,