@dxos/react-ui-geo 0.8.4-main.e8ec1fe → 0.8.4-main.ef1bc66f44

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