@dxos/react-ui-geo 0.8.4-main.548089c → 0.8.4-main.59c2e9b

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