@dxos/react-ui-geo 0.8.2-main.fbd8ed0 → 0.8.2-staging.4d6ad0f

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.
@@ -55,11 +55,13 @@ __export(node_exports, {
55
55
  });
56
56
  module.exports = __toCommonJS(node_exports);
57
57
  var import_chunk_LAICG6L2 = require("./chunk-LAICG6L2.cjs");
58
+ var import_tracking = require("@preact-signals/safe-react/tracking");
58
59
  var import_d3 = require("d3");
59
60
  var import_react = __toESM(require("react"));
60
61
  var import_react_resize_detector = require("react-resize-detector");
61
62
  var import_react_ui = require("@dxos/react-ui");
62
63
  var import_react_ui_theme = require("@dxos/react-ui-theme");
64
+ var import_tracking2 = require("@preact-signals/safe-react/tracking");
63
65
  var import_react2 = __toESM(require("react"));
64
66
  var import_debug = require("@dxos/debug");
65
67
  var import_react_ui2 = require("@dxos/react-ui");
@@ -77,8 +79,10 @@ var import_react6 = require("react");
77
79
  var import_d37 = require("d3");
78
80
  var import_react7 = require("react");
79
81
  var import_versor2 = __toESM(require("versor"));
82
+ var import_tracking3 = require("@preact-signals/safe-react/tracking");
80
83
  var import_react8 = __toESM(require("react"));
81
84
  var import_react_ui3 = require("@dxos/react-ui");
85
+ var import_tracking4 = require("@preact-signals/safe-react/tracking");
82
86
  var import_leaflet = require("leaflet/dist/leaflet.css");
83
87
  var import_leaflet2 = __toESM(require("leaflet"));
84
88
  var import_react9 = __toESM(require("react"));
@@ -90,23 +94,28 @@ var import_react_ui4 = require("@dxos/react-ui");
90
94
  var import_react_ui_theme2 = require("@dxos/react-ui-theme");
91
95
  var GlobeContext = /* @__PURE__ */ (0, import_react2.createContext)(void 0);
92
96
  var GlobeContextProvider = ({ children, size, center: _center, scale: _scale, translation: _translation, rotation: _rotation }) => {
93
- const [center, setCenter] = (0, import_react_ui2.useControlledState)(_center);
94
- const [scale, setScale] = (0, import_react_ui2.useControlledState)(_scale);
95
- const [translation, setTranslation] = (0, import_react_ui2.useControlledState)(_translation);
96
- const [rotation, setRotation] = (0, import_react_ui2.useControlledState)(_rotation);
97
- return /* @__PURE__ */ import_react2.default.createElement(GlobeContext.Provider, {
98
- value: {
99
- size,
100
- center,
101
- scale,
102
- translation,
103
- rotation,
104
- setCenter,
105
- setScale,
106
- setTranslation,
107
- setRotation
108
- }
109
- }, children);
97
+ var _effect = (0, import_tracking2.useSignals)();
98
+ try {
99
+ const [center, setCenter] = (0, import_react_ui2.useControlledState)(_center);
100
+ const [scale, setScale] = (0, import_react_ui2.useControlledState)(_scale);
101
+ const [translation, setTranslation] = (0, import_react_ui2.useControlledState)(_translation);
102
+ const [rotation, setRotation] = (0, import_react_ui2.useControlledState)(_rotation);
103
+ return /* @__PURE__ */ import_react2.default.createElement(GlobeContext.Provider, {
104
+ value: {
105
+ size,
106
+ center,
107
+ scale,
108
+ translation,
109
+ rotation,
110
+ setCenter,
111
+ setScale,
112
+ setTranslation,
113
+ setRotation
114
+ }
115
+ }, children);
116
+ } finally {
117
+ _effect.f();
118
+ }
110
119
  };
111
120
  var useGlobeContext = () => {
112
121
  return (0, import_react2.useContext)(GlobeContext) ?? (0, import_debug.raise)(new Error("Missing GlobeContext"));
@@ -658,52 +667,62 @@ var controlPositions = {
658
667
  bottomright: "bottom-2 right-2"
659
668
  };
660
669
  var ZoomControls = ({ classNames, onAction }) => {
661
- return /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.Toolbar.Root, {
662
- classNames: [
663
- "gap-1",
664
- classNames
665
- ]
666
- }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.IconButton, {
667
- //
668
- icon: "ph--plus--regular",
669
- label: "zoom in",
670
- iconOnly: true,
671
- size: 5,
672
- classNames: "px-0 aspect-square",
673
- onClick: () => onAction?.("zoom-in")
674
- }), /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.IconButton, {
675
- //
676
- icon: "ph--minus--regular",
677
- label: "zoom out",
678
- iconOnly: true,
679
- size: 5,
680
- classNames: "px-0 aspect-square",
681
- onClick: () => onAction?.("zoom-out")
682
- }));
670
+ var _effect = (0, import_tracking3.useSignals)();
671
+ try {
672
+ return /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.Toolbar.Root, {
673
+ classNames: [
674
+ "gap-1",
675
+ classNames
676
+ ]
677
+ }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.IconButton, {
678
+ //
679
+ icon: "ph--plus--regular",
680
+ label: "zoom in",
681
+ iconOnly: true,
682
+ size: 5,
683
+ classNames: "px-0 aspect-square",
684
+ onClick: () => onAction?.("zoom-in")
685
+ }), /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.IconButton, {
686
+ //
687
+ icon: "ph--minus--regular",
688
+ label: "zoom out",
689
+ iconOnly: true,
690
+ size: 5,
691
+ classNames: "px-0 aspect-square",
692
+ onClick: () => onAction?.("zoom-out")
693
+ }));
694
+ } finally {
695
+ _effect.f();
696
+ }
683
697
  };
684
698
  var ActionControls = ({ classNames, onAction }) => {
685
- return /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.Toolbar.Root, {
686
- classNames: [
687
- "gap-1",
688
- classNames
689
- ]
690
- }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.IconButton, {
691
- //
692
- icon: "ph--play--regular",
693
- label: "start",
694
- iconOnly: true,
695
- size: 5,
696
- classNames: "px-0 aspect-square",
697
- onClick: () => onAction?.("start")
698
- }), /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.IconButton, {
699
- //
700
- icon: "ph--globe-hemisphere-west--regular",
701
- label: "toggle",
702
- iconOnly: true,
703
- size: 5,
704
- classNames: "px-0 aspect-square",
705
- onClick: () => onAction?.("toggle")
706
- }));
699
+ var _effect = (0, import_tracking3.useSignals)();
700
+ try {
701
+ return /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.Toolbar.Root, {
702
+ classNames: [
703
+ "gap-1",
704
+ classNames
705
+ ]
706
+ }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.IconButton, {
707
+ //
708
+ icon: "ph--play--regular",
709
+ label: "start",
710
+ iconOnly: true,
711
+ size: 5,
712
+ classNames: "px-0 aspect-square",
713
+ onClick: () => onAction?.("start")
714
+ }), /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.IconButton, {
715
+ //
716
+ icon: "ph--globe-hemisphere-west--regular",
717
+ label: "toggle",
718
+ iconOnly: true,
719
+ size: 5,
720
+ classNames: "px-0 aspect-square",
721
+ onClick: () => onAction?.("toggle")
722
+ }));
723
+ } finally {
724
+ _effect.f();
725
+ }
707
726
  };
708
727
  var defaultStyles = {
709
728
  light: {
@@ -760,149 +779,188 @@ var getProjection = (type = "orthographic") => {
760
779
  return type ?? (0, import_d3.geoOrthographic)();
761
780
  };
762
781
  var GlobeRoot = ({ classNames, children, ...props }) => {
763
- const { ref, width, height } = (0, import_react_resize_detector.useResizeDetector)();
764
- return /* @__PURE__ */ import_react.default.createElement("div", {
765
- ref,
766
- className: (0, import_react_ui_theme.mx)("relative flex grow overflow-hidden", classNames)
767
- }, /* @__PURE__ */ import_react.default.createElement(GlobeContextProvider, {
768
- size: {
769
- width,
770
- height
771
- },
772
- ...props
773
- }, children));
782
+ var _effect = (0, import_tracking.useSignals)();
783
+ try {
784
+ const { ref, width, height } = (0, import_react_resize_detector.useResizeDetector)();
785
+ return /* @__PURE__ */ import_react.default.createElement("div", {
786
+ ref,
787
+ className: (0, import_react_ui_theme.mx)("relative flex grow overflow-hidden", classNames)
788
+ }, /* @__PURE__ */ import_react.default.createElement(GlobeContextProvider, {
789
+ size: {
790
+ width,
791
+ height
792
+ },
793
+ ...props
794
+ }, children));
795
+ } finally {
796
+ _effect.f();
797
+ }
774
798
  };
775
799
  var GlobeCanvas = /* @__PURE__ */ (0, import_react.forwardRef)(({ projection: _projection, topology, features, styles: _styles }, forwardRef3) => {
776
- const { themeMode } = (0, import_react_ui.useThemeContext)();
777
- const styles = (0, import_react.useMemo)(() => _styles ?? defaultStyles[themeMode], [
778
- _styles,
779
- themeMode
780
- ]);
781
- const [canvas, setCanvas] = (0, import_react.useState)(null);
782
- const canvasRef = (canvas2) => setCanvas(canvas2);
783
- const projection = (0, import_react.useMemo)(() => getProjection(_projection), [
784
- _projection
785
- ]);
786
- const layers = (0, import_react.useMemo)(() => {
787
- return timer(() => createLayers(topology, features, styles));
788
- }, [
789
- topology,
790
- features,
791
- styles
792
- ]);
793
- const { size, center, scale, translation, rotation, setCenter, setScale, setTranslation, setRotation } = useGlobeContext();
794
- const scaleRef = (0, import_react_ui.useDynamicRef)(scale);
795
- (0, import_react.useEffect)(() => {
796
- if (center) {
797
- setScale(1);
798
- setRotation(positionToRotation(geoToPosition(center)));
799
- }
800
- }, [
801
- center
802
- ]);
803
- const zooming = (0, import_react.useRef)(false);
804
- (0, import_react.useImperativeHandle)(forwardRef3, () => {
805
- return {
800
+ var _effect = (0, import_tracking.useSignals)();
801
+ try {
802
+ const { themeMode } = (0, import_react_ui.useThemeContext)();
803
+ const styles = (0, import_react.useMemo)(() => _styles ?? defaultStyles[themeMode], [
804
+ _styles,
805
+ themeMode
806
+ ]);
807
+ const [canvas, setCanvas] = (0, import_react.useState)(null);
808
+ const canvasRef = (canvas2) => setCanvas(canvas2);
809
+ const projection = (0, import_react.useMemo)(() => getProjection(_projection), [
810
+ _projection
811
+ ]);
812
+ const layers = (0, import_react.useMemo)(() => {
813
+ return timer(() => createLayers(topology, features, styles));
814
+ }, [
815
+ topology,
816
+ features,
817
+ styles
818
+ ]);
819
+ const { size, center, scale, translation, rotation, setCenter, setScale, setTranslation, setRotation } = useGlobeContext();
820
+ const scaleRef = (0, import_react_ui.useDynamicRef)(scale);
821
+ (0, import_react.useEffect)(() => {
822
+ if (center) {
823
+ setScale(1);
824
+ setRotation(positionToRotation(geoToPosition(center)));
825
+ }
826
+ }, [
827
+ center
828
+ ]);
829
+ const zooming = (0, import_react.useRef)(false);
830
+ (0, import_react.useImperativeHandle)(forwardRef3, () => {
831
+ return {
832
+ canvas,
833
+ projection,
834
+ center,
835
+ get scale() {
836
+ return scaleRef.current;
837
+ },
838
+ translation,
839
+ rotation,
840
+ setCenter,
841
+ setScale: (s) => {
842
+ if (typeof s === "function") {
843
+ const is = (0, import_d3.interpolateNumber)(scaleRef.current, s(scaleRef.current));
844
+ (0, import_d3.transition)().ease(zooming.current ? import_d3.easeLinear : import_d3.easeSinOut).duration(200).tween("scale", () => (t) => setScale(is(t))).on("end", () => {
845
+ zooming.current = false;
846
+ });
847
+ } else {
848
+ setScale(s);
849
+ }
850
+ },
851
+ setTranslation,
852
+ setRotation
853
+ };
854
+ }, [
855
+ canvas
856
+ ]);
857
+ const generator = (0, import_react.useMemo)(() => canvas && projection && (0, import_d3.geoPath)(projection, canvas.getContext("2d", {
858
+ alpha: false
859
+ })), [
806
860
  canvas,
807
- projection,
808
- center,
809
- get scale() {
810
- return scaleRef.current;
811
- },
861
+ projection
862
+ ]);
863
+ (0, import_react.useEffect)(() => {
864
+ if (canvas && projection) {
865
+ timer(() => {
866
+ projection.scale(Math.min(size.width, size.height) / 2 * scale).translate([
867
+ size.width / 2 + (translation?.x ?? 0),
868
+ size.height / 2 + (translation?.y ?? 0)
869
+ ]).rotate(rotation ?? [
870
+ 0,
871
+ 0,
872
+ 0
873
+ ]);
874
+ renderLayers(generator, layers, scale, styles);
875
+ });
876
+ }
877
+ }, [
878
+ generator,
879
+ size,
880
+ scale,
812
881
  translation,
813
882
  rotation,
814
- setCenter,
815
- setScale: (s) => {
816
- if (typeof s === "function") {
817
- const is = (0, import_d3.interpolateNumber)(scaleRef.current, s(scaleRef.current));
818
- (0, import_d3.transition)().ease(zooming.current ? import_d3.easeLinear : import_d3.easeSinOut).duration(200).tween("scale", () => (t) => setScale(is(t))).on("end", () => {
819
- zooming.current = false;
820
- });
821
- } else {
822
- setScale(s);
823
- }
824
- },
825
- setTranslation,
826
- setRotation
827
- };
828
- }, [
829
- canvas
830
- ]);
831
- const generator = (0, import_react.useMemo)(() => canvas && projection && (0, import_d3.geoPath)(projection, canvas.getContext("2d", {
832
- alpha: false
833
- })), [
834
- canvas,
835
- projection
836
- ]);
837
- (0, import_react.useEffect)(() => {
838
- if (canvas && projection) {
839
- timer(() => {
840
- projection.scale(Math.min(size.width, size.height) / 2 * scale).translate([
841
- size.width / 2 + (translation?.x ?? 0),
842
- size.height / 2 + (translation?.y ?? 0)
843
- ]).rotate(rotation ?? [
844
- 0,
845
- 0,
846
- 0
847
- ]);
848
- renderLayers(generator, layers, scale, styles);
849
- });
883
+ layers
884
+ ]);
885
+ if (!size.width || !size.height) {
886
+ return null;
850
887
  }
851
- }, [
852
- generator,
853
- size,
854
- scale,
855
- translation,
856
- rotation,
857
- layers
858
- ]);
859
- if (!size.width || !size.height) {
860
- return null;
888
+ return /* @__PURE__ */ import_react.default.createElement("canvas", {
889
+ ref: canvasRef,
890
+ width: size.width,
891
+ height: size.height
892
+ });
893
+ } finally {
894
+ _effect.f();
861
895
  }
862
- return /* @__PURE__ */ import_react.default.createElement("canvas", {
863
- ref: canvasRef,
864
- width: size.width,
865
- height: size.height
866
- });
867
896
  });
868
897
  var GlobeDebug = ({ position = "topleft" }) => {
869
- const { size, scale, translation, rotation } = useGlobeContext();
870
- return /* @__PURE__ */ import_react.default.createElement("div", {
871
- className: (0, import_react_ui_theme.mx)("z-10 absolute w-96 p-2 overflow-hidden border border-green-700 rounded", controlPositions[position])
872
- }, /* @__PURE__ */ import_react.default.createElement("pre", {
873
- className: "font-mono text-xs text-green-700"
874
- }, JSON.stringify({
875
- size,
876
- scale,
877
- translation,
878
- rotation
879
- }, null, 2)));
898
+ var _effect = (0, import_tracking.useSignals)();
899
+ try {
900
+ const { size, scale, translation, rotation } = useGlobeContext();
901
+ return /* @__PURE__ */ import_react.default.createElement("div", {
902
+ className: (0, import_react_ui_theme.mx)("z-10 absolute w-96 p-2 overflow-hidden border border-green-700 rounded", controlPositions[position])
903
+ }, /* @__PURE__ */ import_react.default.createElement("pre", {
904
+ className: "font-mono text-xs text-green-700"
905
+ }, JSON.stringify({
906
+ size,
907
+ scale,
908
+ translation,
909
+ rotation
910
+ }, null, 2)));
911
+ } finally {
912
+ _effect.f();
913
+ }
880
914
  };
881
915
  var GlobePanel = ({ position, classNames, children }) => {
882
- return /* @__PURE__ */ import_react.default.createElement("div", {
883
- className: (0, import_react_ui_theme.mx)("z-10 absolute overflow-hidden", controlPositions[position], classNames)
884
- }, children);
916
+ var _effect = (0, import_tracking.useSignals)();
917
+ try {
918
+ return /* @__PURE__ */ import_react.default.createElement("div", {
919
+ className: (0, import_react_ui_theme.mx)("z-10 absolute overflow-hidden", controlPositions[position], classNames)
920
+ }, children);
921
+ } finally {
922
+ _effect.f();
923
+ }
885
924
  };
886
925
  var CustomControl = ({ position, children }) => {
887
- return /* @__PURE__ */ import_react.default.createElement("div", {
888
- className: (0, import_react_ui_theme.mx)("z-10 absolute overflow-hidden", controlPositions[position])
889
- }, children);
926
+ var _effect = (0, import_tracking.useSignals)();
927
+ try {
928
+ return /* @__PURE__ */ import_react.default.createElement("div", {
929
+ className: (0, import_react_ui_theme.mx)("z-10 absolute overflow-hidden", controlPositions[position])
930
+ }, children);
931
+ } finally {
932
+ _effect.f();
933
+ }
890
934
  };
891
935
  var Globe = {
892
936
  Root: GlobeRoot,
893
937
  Canvas: GlobeCanvas,
894
- Zoom: ({ onAction, position = "bottomleft", ...props }) => /* @__PURE__ */ import_react.default.createElement(CustomControl, {
895
- position,
896
- ...props
897
- }, /* @__PURE__ */ import_react.default.createElement(ZoomControls, {
898
- onAction
899
- })),
900
- Action: ({ onAction, position = "bottomright", ...props }) => /* @__PURE__ */ import_react.default.createElement(CustomControl, {
901
- position,
902
- ...props
903
- }, /* @__PURE__ */ import_react.default.createElement(ActionControls, {
904
- onAction
905
- })),
938
+ Zoom: ({ onAction, position = "bottomleft", ...props }) => {
939
+ var _effect = (0, import_tracking.useSignals)();
940
+ try {
941
+ return /* @__PURE__ */ import_react.default.createElement(CustomControl, {
942
+ position,
943
+ ...props
944
+ }, /* @__PURE__ */ import_react.default.createElement(ZoomControls, {
945
+ onAction
946
+ }));
947
+ } finally {
948
+ _effect.f();
949
+ }
950
+ },
951
+ Action: ({ onAction, position = "bottomright", ...props }) => {
952
+ var _effect = (0, import_tracking.useSignals)();
953
+ try {
954
+ return /* @__PURE__ */ import_react.default.createElement(CustomControl, {
955
+ position,
956
+ ...props
957
+ }, /* @__PURE__ */ import_react.default.createElement(ActionControls, {
958
+ onAction
959
+ }));
960
+ } finally {
961
+ _effect.f();
962
+ }
963
+ },
906
964
  Debug: GlobeDebug,
907
965
  Panel: GlobePanel
908
966
  };
@@ -915,159 +973,188 @@ var defaults = {
915
973
  zoom: 4
916
974
  };
917
975
  var MapRoot = ({ classNames, center = defaults.center, zoom = defaults.zoom, ...props }) => {
918
- return /* @__PURE__ */ import_react9.default.createElement(import_react_leaflet.MapContainer, {
919
- className: (0, import_react_ui_theme2.mx)("relative flex w-full h-full grow bg-baseSurface", classNames),
920
- attributionControl: false,
921
- // TODO(burdon): Only if attention.
922
- scrollWheelZoom: true,
923
- zoomControl: false,
924
- center,
925
- zoom,
926
- ...props
927
- });
976
+ var _effect = (0, import_tracking4.useSignals)();
977
+ try {
978
+ return /* @__PURE__ */ import_react9.default.createElement(import_react_leaflet.MapContainer, {
979
+ className: (0, import_react_ui_theme2.mx)("relative flex w-full h-full grow bg-baseSurface", classNames),
980
+ attributionControl: false,
981
+ // TODO(burdon): Only if attention.
982
+ scrollWheelZoom: true,
983
+ zoomControl: false,
984
+ center,
985
+ zoom,
986
+ ...props
987
+ });
988
+ } finally {
989
+ _effect.f();
990
+ }
928
991
  };
929
992
  var MapCanvas = /* @__PURE__ */ (0, import_react9.forwardRef)(({ markers, center, zoom, onChange }, forwardedRef) => {
930
- const { ref, width, height } = (0, import_react_resize_detector2.useResizeDetector)({
931
- refreshRate: 200
932
- });
933
- const map = (0, import_react_leaflet.useMap)();
934
- (0, import_react9.useImperativeHandle)(forwardedRef, () => ({
935
- setCenter: (center2, zoom2) => {
936
- map.setView(center2, zoom2);
937
- },
938
- setZoom: (cb) => {
939
- map.setZoom(cb(map.getZoom()));
940
- }
941
- }), [
942
- map
943
- ]);
944
- (0, import_react9.useEffect)(() => {
945
- if (width && height) {
946
- map.invalidateSize();
947
- }
948
- }, [
949
- width,
950
- height
951
- ]);
952
- (0, import_react9.useEffect)(() => {
953
- if (center) {
954
- map.setView(center, zoom);
955
- } else if (zoom !== void 0) {
956
- map.setZoom(zoom);
957
- }
958
- }, [
959
- center,
960
- zoom
961
- ]);
962
- (0, import_react9.useEffect)(() => {
963
- const handler = (0, import_async.debounce)(() => {
964
- onChange?.({
965
- center: map.getCenter(),
966
- zoom: map.getZoom()
967
- });
968
- }, 100);
969
- map.on("move", handler);
970
- map.on("zoom", handler);
971
- return () => {
972
- map.off("move", handler);
973
- map.off("zoom", handler);
974
- };
975
- }, [
976
- map,
977
- onChange
978
- ]);
979
- (0, import_react9.useEffect)(() => {
980
- if (markers.length > 0) {
981
- const bounds = (0, import_leaflet2.latLngBounds)(markers.map((marker) => marker.location));
982
- map.fitBounds(bounds);
983
- } else {
984
- map.setView(defaults.center, defaults.zoom);
985
- }
986
- }, [
987
- markers
988
- ]);
989
- return /* @__PURE__ */ import_react9.default.createElement("div", {
990
- ref,
991
- className: "flex w-full h-full overflow-hidden bg-baseSurface"
992
- }, /* @__PURE__ */ import_react9.default.createElement(import_react_leaflet.TileLayer, {
993
- className: "dark:filter dark:grayscale dark:invert",
994
- url: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
995
- }), markers?.map(({ id, title, location: { lat, lng } }) => {
996
- return /* @__PURE__ */ import_react9.default.createElement(import_react_leaflet.Marker, {
997
- key: id,
998
- position: {
999
- lat,
1000
- lng
993
+ var _effect = (0, import_tracking4.useSignals)();
994
+ try {
995
+ const { ref, width, height } = (0, import_react_resize_detector2.useResizeDetector)({
996
+ refreshRate: 200
997
+ });
998
+ const map = (0, import_react_leaflet.useMap)();
999
+ (0, import_react9.useImperativeHandle)(forwardedRef, () => ({
1000
+ setCenter: (center2, zoom2) => {
1001
+ map.setView(center2, zoom2);
1001
1002
  },
1002
- icon: (
1003
- // TODO(burdon): Create custom icon from bundled assets.
1004
- new import_leaflet2.default.Icon({
1005
- iconUrl: "https://dxos.network/marker-icon.png",
1006
- iconRetinaUrl: "https://dxos.network/marker-icon-2x.png",
1007
- shadowUrl: "https://dxos.network/marker-shadow.png",
1008
- iconSize: [
1009
- 25,
1010
- 41
1011
- ],
1012
- iconAnchor: [
1013
- 12,
1014
- 41
1015
- ],
1016
- popupAnchor: [
1017
- 1,
1018
- -34
1019
- ],
1020
- shadowSize: [
1021
- 41,
1022
- 41
1023
- ]
1024
- })
1025
- )
1026
- }, title && /* @__PURE__ */ import_react9.default.createElement(import_react_leaflet.Popup, null, title));
1027
- }));
1003
+ setZoom: (cb) => {
1004
+ map.setZoom(cb(map.getZoom()));
1005
+ }
1006
+ }), [
1007
+ map
1008
+ ]);
1009
+ (0, import_react9.useEffect)(() => {
1010
+ if (width && height) {
1011
+ map.invalidateSize();
1012
+ }
1013
+ }, [
1014
+ width,
1015
+ height
1016
+ ]);
1017
+ (0, import_react9.useEffect)(() => {
1018
+ if (center) {
1019
+ map.setView(center, zoom);
1020
+ } else if (zoom !== void 0) {
1021
+ map.setZoom(zoom);
1022
+ }
1023
+ }, [
1024
+ center,
1025
+ zoom
1026
+ ]);
1027
+ (0, import_react9.useEffect)(() => {
1028
+ const handler = (0, import_async.debounce)(() => {
1029
+ onChange?.({
1030
+ center: map.getCenter(),
1031
+ zoom: map.getZoom()
1032
+ });
1033
+ }, 100);
1034
+ map.on("move", handler);
1035
+ map.on("zoom", handler);
1036
+ return () => {
1037
+ map.off("move", handler);
1038
+ map.off("zoom", handler);
1039
+ };
1040
+ }, [
1041
+ map,
1042
+ onChange
1043
+ ]);
1044
+ (0, import_react9.useEffect)(() => {
1045
+ if (markers.length > 0) {
1046
+ const bounds = (0, import_leaflet2.latLngBounds)(markers.map((marker) => marker.location));
1047
+ map.fitBounds(bounds);
1048
+ } else {
1049
+ map.setView(defaults.center, defaults.zoom);
1050
+ }
1051
+ }, [
1052
+ markers
1053
+ ]);
1054
+ return /* @__PURE__ */ import_react9.default.createElement("div", {
1055
+ ref,
1056
+ className: "flex w-full h-full overflow-hidden bg-baseSurface"
1057
+ }, /* @__PURE__ */ import_react9.default.createElement(import_react_leaflet.TileLayer, {
1058
+ className: "dark:filter dark:grayscale dark:invert",
1059
+ url: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
1060
+ }), markers?.map(({ id, title, location: { lat, lng } }) => {
1061
+ return /* @__PURE__ */ import_react9.default.createElement(import_react_leaflet.Marker, {
1062
+ key: id,
1063
+ position: {
1064
+ lat,
1065
+ lng
1066
+ },
1067
+ icon: (
1068
+ // TODO(burdon): Create custom icon from bundled assets.
1069
+ new import_leaflet2.default.Icon({
1070
+ iconUrl: "https://dxos.network/marker-icon.png",
1071
+ iconRetinaUrl: "https://dxos.network/marker-icon-2x.png",
1072
+ shadowUrl: "https://dxos.network/marker-shadow.png",
1073
+ iconSize: [
1074
+ 25,
1075
+ 41
1076
+ ],
1077
+ iconAnchor: [
1078
+ 12,
1079
+ 41
1080
+ ],
1081
+ popupAnchor: [
1082
+ 1,
1083
+ -34
1084
+ ],
1085
+ shadowSize: [
1086
+ 41,
1087
+ 41
1088
+ ]
1089
+ })
1090
+ )
1091
+ }, title && /* @__PURE__ */ import_react9.default.createElement(import_react_leaflet.Popup, null, title));
1092
+ }));
1093
+ } finally {
1094
+ _effect.f();
1095
+ }
1028
1096
  });
1029
1097
  var CustomControl2 = ({ position, children }) => {
1030
- const map = (0, import_react_leaflet.useMap)();
1031
- (0, import_react9.useEffect)(() => {
1032
- const control = new import_leaflet2.Control({
1033
- position
1034
- });
1035
- control.onAdd = () => {
1036
- const container = import_leaflet2.DomUtil.create("div", (0, import_react_ui_theme2.mx)("!m-0", controlPositions[position]));
1037
- import_leaflet2.DomEvent.disableClickPropagation(container);
1038
- import_leaflet2.DomEvent.disableScrollPropagation(container);
1039
- const root = (0, import_client.createRoot)(container);
1040
- root.render(/* @__PURE__ */ import_react9.default.createElement(import_react_ui4.ThemeProvider, {
1041
- tx: import_react_ui_theme2.defaultTx
1042
- }, /* @__PURE__ */ import_react9.default.createElement(import_react_ui4.Tooltip.Provider, null, children)));
1043
- return container;
1044
- };
1045
- control.addTo(map);
1046
- return () => {
1047
- control.remove();
1048
- };
1049
- }, [
1050
- map,
1051
- position,
1052
- children
1053
- ]);
1054
- return null;
1098
+ var _effect = (0, import_tracking4.useSignals)();
1099
+ try {
1100
+ const map = (0, import_react_leaflet.useMap)();
1101
+ (0, import_react9.useEffect)(() => {
1102
+ const control = new import_leaflet2.Control({
1103
+ position
1104
+ });
1105
+ control.onAdd = () => {
1106
+ const container = import_leaflet2.DomUtil.create("div", (0, import_react_ui_theme2.mx)("!m-0", controlPositions[position]));
1107
+ import_leaflet2.DomEvent.disableClickPropagation(container);
1108
+ import_leaflet2.DomEvent.disableScrollPropagation(container);
1109
+ const root = (0, import_client.createRoot)(container);
1110
+ root.render(/* @__PURE__ */ import_react9.default.createElement(import_react_ui4.ThemeProvider, {
1111
+ tx: import_react_ui_theme2.defaultTx
1112
+ }, /* @__PURE__ */ import_react9.default.createElement(import_react_ui4.Tooltip.Provider, null, children)));
1113
+ return container;
1114
+ };
1115
+ control.addTo(map);
1116
+ return () => {
1117
+ control.remove();
1118
+ };
1119
+ }, [
1120
+ map,
1121
+ position,
1122
+ children
1123
+ ]);
1124
+ return null;
1125
+ } finally {
1126
+ _effect.f();
1127
+ }
1055
1128
  };
1056
1129
  var Map = {
1057
1130
  Root: MapRoot,
1058
1131
  Canvas: MapCanvas,
1059
- Zoom: ({ onAction, position = "bottomleft", ...props }) => /* @__PURE__ */ import_react9.default.createElement(CustomControl2, {
1060
- position,
1061
- ...props
1062
- }, /* @__PURE__ */ import_react9.default.createElement(ZoomControls, {
1063
- onAction
1064
- })),
1065
- Action: ({ onAction, position = "bottomright", ...props }) => /* @__PURE__ */ import_react9.default.createElement(CustomControl2, {
1066
- position,
1067
- ...props
1068
- }, /* @__PURE__ */ import_react9.default.createElement(ActionControls, {
1069
- onAction
1070
- }))
1132
+ Zoom: ({ onAction, position = "bottomleft", ...props }) => {
1133
+ var _effect = (0, import_tracking4.useSignals)();
1134
+ try {
1135
+ return /* @__PURE__ */ import_react9.default.createElement(CustomControl2, {
1136
+ position,
1137
+ ...props
1138
+ }, /* @__PURE__ */ import_react9.default.createElement(ZoomControls, {
1139
+ onAction
1140
+ }));
1141
+ } finally {
1142
+ _effect.f();
1143
+ }
1144
+ },
1145
+ Action: ({ onAction, position = "bottomright", ...props }) => {
1146
+ var _effect = (0, import_tracking4.useSignals)();
1147
+ try {
1148
+ return /* @__PURE__ */ import_react9.default.createElement(CustomControl2, {
1149
+ position,
1150
+ ...props
1151
+ }, /* @__PURE__ */ import_react9.default.createElement(ActionControls, {
1152
+ onAction
1153
+ }));
1154
+ } finally {
1155
+ _effect.f();
1156
+ }
1157
+ }
1071
1158
  };
1072
1159
  // Annotate the CommonJS export names for ESM import in node:
1073
1160
  0 && (module.exports = {