@mapcomponents/react-maplibre 0.1.11 → 0.1.15

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 (135) hide show
  1. package/.github/workflows/storybook.yml +10 -5
  2. package/coverage/clover.xml +894 -747
  3. package/coverage/coverage-final.json +22 -17
  4. package/coverage/lcov-report/block-navigation.js +8 -0
  5. package/coverage/lcov-report/index.html +188 -122
  6. package/coverage/lcov-report/sorter.js +26 -0
  7. package/coverage/lcov-report/{components → src/components}/MapLibreMap/MapLibreMap.js.html +17 -11
  8. package/coverage/lcov-report/{components → src/components}/MapLibreMap/index.html +17 -11
  9. package/coverage/lcov-report/{components → src/components}/MlCreatePdfButton/MlCreatePdfButton.js.html +17 -11
  10. package/coverage/lcov-report/{components → src/components}/MlCreatePdfButton/index.html +17 -11
  11. package/coverage/lcov-report/{components → src/components}/MlFeatureEditor/MlFeatureEditor.js.html +17 -11
  12. package/coverage/lcov-report/{components → src/components}/MlFeatureEditor/index.html +17 -11
  13. package/coverage/lcov-report/{components → src/components}/MlFillExtrusionLayer/MlFillExtrusionLayer.js.html +17 -11
  14. package/coverage/lcov-report/{components → src/components}/MlFillExtrusionLayer/index.html +17 -11
  15. package/coverage/lcov-report/{components → src/components}/MlFollowGps/MlFollowGps.js.html +84 -69
  16. package/coverage/lcov-report/{components → src/components}/MlFollowGps/index.html +27 -21
  17. package/coverage/lcov-report/{components → src/components}/MlGPXViewer/MlGPXViewer.js.html +73 -61
  18. package/coverage/lcov-report/{components → src/components}/MlGPXViewer/gpxConverter.js.html +56 -71
  19. package/coverage/lcov-report/{components → src/components}/MlGPXViewer/index.html +32 -26
  20. package/coverage/lcov-report/{components → src/components}/MlGeoJsonLayer/MlGeoJsonLayer.js.html +162 -48
  21. package/coverage/lcov-report/{components → src/components}/MlGeoJsonLayer/index.html +35 -29
  22. package/coverage/lcov-report/src/components/MlImageMarkerLayer/MlImageMarkerLayer.js.html +311 -0
  23. package/coverage/lcov-report/{components → src/components}/MlImageMarkerLayer/index.html +35 -29
  24. package/coverage/lcov-report/{components/MlImageMarkerLayer/MlImageMarkerLayer.js.html → src/components/MlLayer/MlLayer.js.html} +123 -126
  25. package/coverage/lcov-report/src/components/MlLayer/index.html +117 -0
  26. package/coverage/lcov-report/{components → src/components}/MlLayerMagnify/MlLayerMagnify.js.html +48 -42
  27. package/coverage/lcov-report/{components → src/components}/MlLayerMagnify/index.html +31 -25
  28. package/coverage/lcov-report/{components → src/components}/MlLayerSwipe/MlLayerSwipe.js.html +45 -42
  29. package/coverage/lcov-report/{components → src/components}/MlLayerSwipe/index.html +31 -25
  30. package/coverage/lcov-report/src/components/MlLayerSwitcher/MlLayerSwitcher.js.html +755 -0
  31. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/LayerBox.js.html +380 -0
  32. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/index.html +117 -0
  33. package/coverage/lcov-report/src/components/MlLayerSwitcher/index.html +117 -0
  34. package/coverage/lcov-report/{components → src/components}/MlMarker/MlMarker.js.html +18 -12
  35. package/coverage/lcov-report/{components → src/components}/MlMarker/index.html +17 -11
  36. package/coverage/lcov-report/{components → src/components}/MlNavigationCompass/MlNavigationCompass.js.html +17 -11
  37. package/coverage/lcov-report/{components → src/components}/MlNavigationCompass/index.html +17 -11
  38. package/coverage/lcov-report/{components → src/components}/MlNavigationTools/MlNavigationTools.js.html +57 -42
  39. package/coverage/lcov-report/{components → src/components}/MlNavigationTools/index.html +25 -19
  40. package/coverage/lcov-report/{components → src/components}/MlOsmLayer/MlOsmLayer.js.html +17 -11
  41. package/coverage/lcov-report/{components → src/components}/MlOsmLayer/index.html +17 -11
  42. package/coverage/lcov-report/{components → src/components}/MlScaleReference/MlScaleReference.js.html +17 -11
  43. package/coverage/lcov-report/{components → src/components}/MlScaleReference/index.html +17 -11
  44. package/coverage/lcov-report/{components → src/components}/MlShareMapState/MlShareMapState.js.html +224 -26
  45. package/coverage/lcov-report/{components → src/components}/MlShareMapState/index.html +25 -19
  46. package/coverage/lcov-report/{components → src/components}/MlSpatialElevationProfile/MlSpatialElevationProfile.js.html +17 -11
  47. package/coverage/lcov-report/{components → src/components}/MlSpatialElevationProfile/index.html +17 -11
  48. package/coverage/lcov-report/{components → src/components}/MlThreeJsLayer/MlThreeJsLayer.js.html +37 -55
  49. package/coverage/lcov-report/{components → src/components}/MlThreeJsLayer/index.html +31 -25
  50. package/coverage/lcov-report/{components → src/components}/MlUseMapDebugger/MlUseMapDebugger.js.html +17 -11
  51. package/coverage/lcov-report/{components → src/components}/MlUseMapDebugger/index.html +17 -11
  52. package/coverage/lcov-report/{components → src/components}/MlVectorTileLayer/MlVectorTileLayer.js.html +17 -11
  53. package/coverage/lcov-report/{components → src/components}/MlVectorTileLayer/index.html +17 -11
  54. package/coverage/lcov-report/{components → src/components}/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.js.html +17 -11
  55. package/coverage/lcov-report/{components → src/components}/MlWmsFeatureInfoPopup/index.html +17 -11
  56. package/coverage/lcov-report/{components → src/components}/MlWmsLayer/MlWmsLayer.js.html +20 -14
  57. package/coverage/lcov-report/{components → src/components}/MlWmsLayer/index.html +21 -15
  58. package/coverage/lcov-report/{components → src/components}/MlWmsLoader/MlWmsLoader.js.html +38 -20
  59. package/coverage/lcov-report/{components → src/components}/MlWmsLoader/index.html +23 -17
  60. package/coverage/lcov-report/src/hooks/index.html +147 -0
  61. package/coverage/lcov-report/{components/MlLayer/MlLayer.js.html → src/hooks/useMap.js.html} +86 -119
  62. package/coverage/lcov-report/{hooks → src/hooks}/useMapState.js.html +98 -92
  63. package/coverage/lcov-report/{hooks → src/hooks}/useWms.js.html +25 -19
  64. package/coverage/lcov-report/src/i18n.js.html +167 -0
  65. package/coverage/lcov-report/src/index.html +117 -0
  66. package/coverage/lcov-report/src/translations/english.js.html +95 -0
  67. package/coverage/lcov-report/src/translations/german.js.html +95 -0
  68. package/coverage/lcov-report/src/translations/index.html +132 -0
  69. package/coverage/lcov.info +1620 -1306
  70. package/dist/b556faa3bc6829d2.png +0 -0
  71. package/dist/index.esm.js +976 -688
  72. package/dist/index.esm.js.map +1 -1
  73. package/package.json +3 -1
  74. package/public/assets/dop.png +0 -0
  75. package/public/assets/historic.png +0 -0
  76. package/public/assets/osm.png +0 -0
  77. package/public/thumbnails/MlFollowGps.png +0 -0
  78. package/public/thumbnails/MlThreeJsLayer.png +0 -0
  79. package/rollup.config.js +7 -1
  80. package/src/components/MapLibreMap/lib/MapLibreGlWrapper.js +53 -67
  81. package/src/components/MlCreatePdfButton/MlCreatePdfButton.meta.json +1 -1
  82. package/src/components/MlFeatureEditor/MlFeatureEditor.meta.json +2 -2
  83. package/src/components/MlFollowGps/MlFollowGps.js +49 -46
  84. package/src/components/MlFollowGps/MlFollowGps.meta.json +2 -2
  85. package/src/components/MlFollowGps/assets/marker.png +0 -0
  86. package/src/components/MlGPXViewer/MlGPXViewer.js +45 -43
  87. package/src/components/MlGPXViewer/gpxConverter.js +22 -29
  88. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.js +45 -9
  89. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.meta.json +1 -1
  90. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.js +21 -57
  91. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.test.js +6 -7
  92. package/src/components/MlLayer/MlLayer.js +28 -6
  93. package/src/components/MlLayer/MlLayer.test.js +12 -10
  94. package/src/components/MlLayerMagnify/MlLayerMagnify.js +3 -3
  95. package/src/components/MlLayerSwipe/MlLayerSwipe.js +4 -5
  96. package/src/components/MlLayerSwitcher/MlLayerSwitcher.css +17 -0
  97. package/src/components/MlLayerSwitcher/MlLayerSwitcher.doc.de.md +3 -0
  98. package/src/components/MlLayerSwitcher/MlLayerSwitcher.js +223 -0
  99. package/src/components/MlLayerSwitcher/MlLayerSwitcher.meta_.json +15 -0
  100. package/src/components/MlLayerSwitcher/MlLayerSwitcher.stories.js +106 -0
  101. package/src/components/MlLayerSwitcher/assets/sample_1.json +26 -0
  102. package/src/components/MlLayerSwitcher/assets/sample_2.json +22 -0
  103. package/src/components/MlLayerSwitcher/components/LayerBox.js +98 -0
  104. package/src/components/MlMarker/MlMarker.js +1 -1
  105. package/src/components/MlNavigationTools/MlNavigationTools.js +29 -26
  106. package/src/components/MlScaleReference/MlScaleReference.meta.json +1 -1
  107. package/src/components/MlScaleReference/MlScaleReference.stories.js +25 -21
  108. package/src/components/MlShareMapState/MlShareMapState.js +73 -9
  109. package/src/components/MlShareMapState/MlShareMapState.stories.js +24 -1
  110. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.stories.js +12 -6
  111. package/src/components/MlThreeJsLayer/MlThreeJsLayer.js +8 -15
  112. package/src/components/MlVectorTileLayer/MlVectorTileLayer.meta.json +3 -3
  113. package/src/components/MlWmsLayer/MlWmsLayer.js +1 -1
  114. package/src/components/MlWmsLoader/MlWmsLoader.js +8 -4
  115. package/src/components/MlWmsLoader/MlWmsLoader.meta.json +1 -1
  116. package/src/components/MlWmsLoader/MlWmsLoader.stories.js +5 -4
  117. package/src/decorators/EmptyMapContextDecorator.js +11 -6
  118. package/src/decorators/MapContext3DDecorator.js +25 -20
  119. package/src/decorators/MapContextDashboardDecorator.js +7 -2
  120. package/src/decorators/MapContextDecorator.js +7 -3
  121. package/src/decorators/MapContextKlokantechBasicDecorator.js +8 -4
  122. package/src/decorators/MultiMapContextDecorator.js +2 -1
  123. package/src/hooks/useMap.js +36 -62
  124. package/src/hooks/useMapState.js +3 -3
  125. package/src/hooks/useWms.js +7 -6
  126. package/src/i18n.js +28 -0
  127. package/src/index.js +3 -0
  128. package/src/translations/english.js +4 -0
  129. package/src/translations/german.js +4 -0
  130. package/src/ui_components/ImageLoader.js +73 -0
  131. package/src/ui_components/Sidebar.js +76 -22
  132. package/src/ui_components/TopToolbar.js +18 -18
  133. package/coverage/lcov-report/components/MlLayer/index.html +0 -111
  134. package/coverage/lcov-report/hooks/index.html +0 -141
  135. package/coverage/lcov-report/hooks/useMap.js.html +0 -377
package/dist/index.esm.js CHANGED
@@ -5,17 +5,18 @@ import maplibregl from 'maplibre-gl/dist/maplibre-gl';
5
5
  import 'maplibre-gl/dist/maplibre-gl.css';
6
6
  import { v4 } from 'uuid';
7
7
  import Button from '@mui/material/Button';
8
+ import RoomIcon from '@mui/icons-material/Room';
9
+ import { lineString, length, lineChunk, point, circle, bbox, lineOffset, distance } from '@turf/turf';
8
10
  import maplibregl$1, { Popup } from 'maplibre-gl';
9
11
  import jsPDF from 'jspdf';
10
12
  import PrinterIcon from '@mui/icons-material/Print';
11
- import { lineString, length, lineChunk, point, bbox } from '@turf/turf';
12
13
  import ButtonGroup from '@mui/material/ButtonGroup';
13
14
  import ControlPointIcon from '@mui/icons-material/ControlPoint';
14
15
  import RemoveCircleOutlineIcon from '@mui/icons-material/RemoveCircleOutline';
15
16
  import GpsFixedIcon from '@mui/icons-material/GpsFixed';
16
17
  import _styled from '@emotion/styled/base';
17
18
  import { css } from '@emotion/css';
18
- import RoomIcon from '@mui/icons-material/Room';
19
+ import useMediaQuery from '@mui/material/useMediaQuery';
19
20
  import '@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css';
20
21
  import MapboxDraw from '@mapbox/mapbox-gl-draw';
21
22
  import Point from '@mapbox/point-geometry';
@@ -30,6 +31,7 @@ import FileCopy from '@mui/icons-material/FileCopy';
30
31
  import List from '@mui/material/List';
31
32
  import ListItem from '@mui/material/ListItem';
32
33
  import ListItemText from '@mui/material/ListItemText';
34
+ import { lineString as lineString$1, polygon } from '@turf/helpers';
33
35
 
34
36
  function ownKeys(object, enumerableOnly) {
35
37
  var keys = Object.keys(object);
@@ -287,7 +289,7 @@ var MapLibreGlWrapper = function MapLibreGlWrapper(props) {
287
289
  on: function on(eventName, handler, options, componentId) {
288
290
  if (!self.eventHandlers[eventName]) return;
289
291
 
290
- if (typeof options === 'string') {
292
+ if (typeof options === "string") {
291
293
  componentId = options;
292
294
  options = {};
293
295
  }
@@ -340,7 +342,7 @@ var MapLibreGlWrapper = function MapLibreGlWrapper(props) {
340
342
  /**
341
343
  * Array containing an object for each layer in the MapLibre instance providing information on visibility, loading state, order, paint & layout properties
342
344
  */
343
- layerState: {},
345
+ layerState: [],
344
346
 
345
347
  /**
346
348
  * Maps layerIds to layerState in JSON string form for quick deep comparisons
@@ -428,7 +430,7 @@ var MapLibreGlWrapper = function MapLibreGlWrapper(props) {
428
430
  */
429
431
  oldViewportStateString: "{}",
430
432
  getViewport: function getViewport() {
431
- return typeof self.map.getCenter === 'function' ? {
433
+ return typeof self.map.getCenter === "function" ? {
432
434
  center: function (_ref) {
433
435
  var lng = _ref.lng,
434
436
  lat = _ref.lat,
@@ -444,24 +446,8 @@ var MapLibreGlWrapper = function MapLibreGlWrapper(props) {
444
446
  pitch: self.map.getPitch()
445
447
  } : {};
446
448
  },
447
- viewportRefreshEnabled: true,
448
- viewportRefreshWaiting: false,
449
- refreshViewport: function refreshViewport(force) {
450
- if (self.wrapper.viewportRefreshEnabled || force) {
451
- self.wrapper.viewportRefreshEnabled = false;
452
- self.wrapper.viewportState = self.wrapper.getViewport();
453
- self.wrapper.viewportStateString = JSON.stringify(self.wrapper.viewportState);
454
- setTimeout(function () {
455
- self.wrapper.viewportRefreshEnabled = true;
456
-
457
- if (self.wrapper.viewportRefreshWaiting) {
458
- self.wrapper.viewportRefreshWaiting = false;
459
- self.wrapper.refreshViewport();
460
- }
461
- }, 50);
462
- } else {
463
- self.wrapper.viewportRefreshWaiting = true;
464
- }
449
+ refreshViewport: function refreshViewport() {
450
+ self.wrapper.viewportState = self.wrapper.getViewport();
465
451
  }
466
452
  };
467
453
  /**
@@ -738,7 +724,7 @@ var MapLibreGlWrapper = function MapLibreGlWrapper(props) {
738
724
  if (response.ok) {
739
725
  return response.json();
740
726
  } else {
741
- throw new Error('error loading map style.json');
727
+ throw new Error("error loading map style.json");
742
728
  }
743
729
  }).then(function (styleJson) {
744
730
  styleJson.layers.forEach(function (item) {
@@ -757,15 +743,11 @@ var MapLibreGlWrapper = function MapLibreGlWrapper(props) {
757
743
  case 3:
758
744
  self.map = new maplibregl.Map(props.mapOptions);
759
745
  self.addNativeMaplibreFunctionsAndProps();
760
- self.wrapper.refreshViewport(true);
746
+ self.wrapper.refreshViewport();
761
747
  self.wrapper.fire("viewportchange");
762
748
  self.map.on("move", function () {
763
- self.wrapper.refreshViewport();
764
-
765
- if (self.wrapper.viewportStateString !== self.wrapper.oldViewportStateString) {
766
- self.wrapper.oldViewportStateString = self.wrapper.viewportStateString;
767
- self.wrapper.fire("viewportchange");
768
- }
749
+ self.wrapper.viewportState = self.wrapper.getViewport();
750
+ self.wrapper.fire("viewportchange");
769
751
  });
770
752
  self.map.on("data", function () {
771
753
  self.wrapper.refreshLayerState();
@@ -1057,191 +1039,167 @@ MlFillExtrusionLayer.propTypes = {
1057
1039
  insertBeforeLayer: PropTypes.string
1058
1040
  };
1059
1041
 
1060
- var nmMap = {
1061
- street: ["footway", "street", "road", "street_name", "residential", "path", "pedestrian", "road_reference", "road_reference_intl", "square", "place"],
1062
- number: ["house_number", "street_number"],
1063
- place: ["city", "village", "hamlet", "locality", "croft", "neighbourhood", "suburb", "city_district", "district", "quarter", "borough", "city_block", "residential", "commercial", "industrial", "houses", "subdivision", "allotments", "postal_city", "town", "municipality", "local_administrative_area"],
1064
- zip: ["postcode", "partial_postcode"],
1065
- state: ["state", "province", "state_code"]
1066
- };
1042
+ /**
1043
+ * React hook that allows subscribing to map state changes
1044
+ *
1045
+ * @component
1046
+ */
1067
1047
 
1068
- var nmConverter = function nmConverter(nmAddress) {
1069
- var addressArr = [];
1048
+ function useMapState(props) {
1049
+ // Use a useRef hook to reference the layer object to be able to access it later inside useEffect hooks
1050
+ var mapContext = useContext(MapContext);
1051
+ var initializedRef = useRef(false);
1052
+ var mapRef = useRef(undefined);
1070
1053
 
1071
- for (var key in nmMap) {
1072
- nmMap[key].some(function (element) {
1073
- if (nmAddress.hasOwnProperty(element)) {
1074
- addressArr.push(nmAddress[element]);
1075
- return true;
1076
- }
1054
+ var _useState = useState(undefined),
1055
+ _useState2 = _slicedToArray(_useState, 2),
1056
+ center = _useState2[0],
1057
+ setCenter = _useState2[1];
1077
1058
 
1078
- return false;
1079
- });
1080
- }
1059
+ var _useState3 = useState(undefined),
1060
+ _useState4 = _slicedToArray(_useState3, 2),
1061
+ viewport = _useState4[0],
1062
+ setViewport = _useState4[1];
1081
1063
 
1082
- return addressArr.join(", ");
1083
- };
1064
+ var viewportRef = useRef(undefined);
1084
1065
 
1085
- var toPixels = function toPixels(length) {
1086
- var conversionFactor = 96;
1087
- conversionFactor /= 25.4;
1088
- return conversionFactor * length + "px";
1089
- };
1066
+ var _useState5 = useState(undefined),
1067
+ _useState6 = _slicedToArray(_useState5, 2),
1068
+ layers = _useState6[0],
1069
+ setLayers = _useState6[1];
1090
1070
 
1091
- var createPdf = function createPdf(map, locationValue, setLoading) {
1092
- setLoading(true);
1093
- var width = 210;
1094
- var height = 297; // Calculate pixel ratio
1071
+ var layersRef = useRef(undefined); //const mapRef = useRef(props.map);
1095
1072
 
1096
- var actualPixelRatio = window.devicePixelRatio; // Create map container
1073
+ var componentId = useRef(v4());
1074
+ /**
1075
+ * returns the element if it matches the defined filter criteria
1076
+ * to be used as filter function on the layers array
1077
+ *
1078
+ * @param {object} layer
1079
+ */
1097
1080
 
1098
- var hidden = document.createElement("div");
1099
- hidden.className = "hidden-map";
1100
- document.body.appendChild(hidden);
1101
- var container = document.createElement("div");
1102
- container.style.width = toPixels(width);
1103
- container.style.height = toPixels(height);
1104
- hidden.appendChild(container); //Render map
1081
+ var layerIdFilter = useCallback(function (layer) {
1082
+ var _props$filter, _props$filter2;
1105
1083
 
1106
- var renderMap = new maplibregl$1.Map({
1107
- container: container,
1108
- center: map.getCenter(),
1109
- zoom: map.getZoom(),
1110
- bearing: map.getBearing(),
1111
- pitch: map.getPitch(),
1112
- interactive: false,
1113
- preserveDrawingBuffer: true,
1114
- fadeDuration: 0,
1115
- attributionControl: false
1116
- });
1117
- var style = map.getStyle();
1084
+ if (!(props !== null && props !== void 0 && (_props$filter = props.filter) !== null && _props$filter !== void 0 && _props$filter.includeBaseLayers) && layer.baseLayer) {
1085
+ return false;
1086
+ }
1118
1087
 
1119
- var _loop = function _loop(name) {
1120
- var src = style.sources[name];
1121
- Object.keys(src).forEach(function (key) {
1122
- //delete properties if value is undefined.
1123
- // for instance, raster-dem might has undefined value in "url" and "bounds"
1124
- if (!src[key]) {
1125
- delete src[key];
1088
+ if (typeof ((_props$filter2 = props.filter) === null || _props$filter2 === void 0 ? void 0 : _props$filter2.matchLayerIds) !== "undefined") {
1089
+ if (props.filter.matchLayerIds instanceof RegExp) {
1090
+ return props.filter.matchLayerIds.test(layer.id);
1091
+ } else {
1092
+ return layer.id.includes(props.filter.matchLayerIds);
1126
1093
  }
1127
- });
1128
- };
1094
+ }
1129
1095
 
1130
- for (var name in style.sources) {
1131
- _loop(name);
1132
- }
1096
+ return true;
1097
+ }, [props.filter]);
1098
+ var refreshLayerState = useCallback(function () {
1099
+ var _layerState = mapRef.current.wrapper.layerState.filter(layerIdFilter);
1133
1100
 
1134
- renderMap.setStyle(style);
1135
- renderMap.once("idle", function () {
1136
- var _hidden$parentNode;
1101
+ var _layerStateString = JSON.stringify(_layerState);
1137
1102
 
1138
- // TO DO: It is still under development
1139
- var pdf = new jsPDF({
1140
- orientation: "p",
1141
- unit: "mm",
1142
- compress: true
1143
- });
1144
- Object.defineProperty(window, "devicePixelRatio", {
1145
- get: function get() {
1146
- return 300 / 96;
1103
+ if (layersRef.current !== _layerStateString) {
1104
+ layersRef.current = _layerStateString;
1105
+ setLayers(_layerState);
1106
+ }
1107
+ }, [layerIdFilter]);
1108
+ useEffect(function () {
1109
+ var _componentId = componentId.current;
1110
+ return function () {
1111
+ if (mapRef.current) {
1112
+ mapRef.current.cleanup(_componentId);
1113
+ mapRef.current = undefined;
1147
1114
  }
1148
- });
1149
- var offsetX = 2.5;
1150
- var offsetY = 2.5;
1151
- var marginTop = 3;
1152
- var marginBottom = 3;
1153
- var innerMargin = 2;
1154
- var logo = "data:image/png;base64,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";
1155
- var textBuffer = 1;
1156
- var lineHeight = 3.25;
1157
- var text = locationValue ? nmConverter(locationValue.address) : "";
1158
- var textChunksSeperator = text.split(",");
1159
- var textChunks = [];
1160
-
1161
- if (textChunks.length) {
1162
- textChunksSeperator.forEach(function (chunk) {
1163
- var limitChunks = chunk.match(/.{1,34}/g);
1164
- textChunks.push.apply(textChunks, _toConsumableArray(limitChunks));
1165
- });
1166
- } //Render map image
1167
1115
 
1116
+ initializedRef.current = false;
1117
+ };
1118
+ }, []);
1119
+ useEffect(function () {
1120
+ var _props$watch, _props$watch2;
1168
1121
 
1169
- pdf.addImage(renderMap.getCanvas().toDataURL("image/png"), "png", 0, 0, 210, 297, null, "FAST"); //Render lower left Copyright box
1170
-
1171
- pdf.setFillColor("white");
1172
- pdf.rect(138, 287, 297, 10, "F");
1173
- pdf.setFontSize(10); // optional
1122
+ if (!mapContext.mapExists(props.mapId) || initializedRef.current) return; // the MapLibre-gl instance (mapContext.getMap(props.mapId)) is accessible here
1123
+ // initialize the layer and add it to the MapLibre-gl instance or do something else with it
1174
1124
 
1175
- pdf.text("Datenquelle: © OpenStreetMap-Mitwirkende", 140, pdf.internal.pageSize.height - 3); //Render infobox
1125
+ initializedRef.current = true;
1126
+ mapRef.current = mapContext.getMap(props.mapId);
1127
+ /*
1128
+ mapRef.current.on(
1129
+ "move",
1130
+ () => {
1131
+ setCenter(mapRef.current.getCenter());
1132
+ },
1133
+ componentId.current
1134
+ );
1135
+ */
1176
1136
 
1177
- pdf.setFillColor("white");
1178
- var infoBoxSize = textChunks.length * lineHeight + marginTop + marginBottom + lineHeight * 2 + innerMargin * 2 + textBuffer;
1179
- pdf.rect(offsetX, 2, 66.5, infoBoxSize, "F");
1180
- pdf.setFontSize(10);
1181
- pdf.text("Karten PDF:", 6, offsetY + marginTop); //Render inner infobox
1137
+ if (props !== null && props !== void 0 && (_props$watch = props.watch) !== null && _props$watch !== void 0 && _props$watch.viewport) {
1138
+ setViewport(mapRef.current.wrapper.viewportState);
1139
+ mapRef.current.wrapper.on("viewportchange", function () {
1140
+ var _mapRef$current;
1182
1141
 
1183
- pdf.rect(6, 7, 60, textChunks.length * lineHeight + innerMargin * 2 + textBuffer);
1184
- pdf.setFontSize(10); //Write out address
1142
+ if (viewportRef.current !== ((_mapRef$current = mapRef.current) === null || _mapRef$current === void 0 ? void 0 : _mapRef$current.wrapper.viewportStateString)) {
1143
+ var _mapRef$current2, _mapRef$current3, _mapRef$current3$wrap;
1185
1144
 
1186
- textChunks.forEach(function (text, i) {
1187
- pdf.text(text.trim(), 8, 10 + i * 3.5 + innerMargin);
1188
- }); //Add WG Logo
1145
+ setViewport((_mapRef$current2 = mapRef.current) === null || _mapRef$current2 === void 0 ? void 0 : _mapRef$current2.wrapper.viewportState);
1146
+ setCenter((_mapRef$current3 = mapRef.current) === null || _mapRef$current3 === void 0 ? void 0 : (_mapRef$current3$wrap = _mapRef$current3.wrapper.viewportState) === null || _mapRef$current3$wrap === void 0 ? void 0 : _mapRef$current3$wrap.center);
1147
+ }
1148
+ }, componentId.current);
1149
+ }
1189
1150
 
1190
- pdf.addImage(logo, "png", 5, offsetY + marginTop + lineHeight * 2 + textChunks.length * 3 + innerMargin * 2, 3, 3, null, "FAST"); //Add WG Url
1151
+ if (props !== null && props !== void 0 && (_props$watch2 = props.watch) !== null && _props$watch2 !== void 0 && _props$watch2.layers) {
1152
+ var _props$filter3, _props$filter4;
1191
1153
 
1192
- pdf.setFontSize(10);
1193
- pdf.text("wheregroup.com", 40, offsetY + marginTop + lineHeight * 2 + textChunks.length * lineHeight + innerMargin * 2 + textBuffer); //Set pdfs props
1154
+ refreshLayerState();
1155
+ mapRef.current.wrapper.on("layerchange", refreshLayerState, {
1156
+ includeBaseLayers: props === null || props === void 0 ? void 0 : (_props$filter3 = props.filter) === null || _props$filter3 === void 0 ? void 0 : _props$filter3.includeBaseLayers,
1157
+ matchLayerIds: props === null || props === void 0 ? void 0 : (_props$filter4 = props.filter) === null || _props$filter4 === void 0 ? void 0 : _props$filter4.matchLayerIds
1158
+ }, componentId.current);
1159
+ }
1160
+ }, [mapContext.mapIds, mapContext, props.mapId, refreshLayerState]);
1161
+ return {
1162
+ layers: layers,
1163
+ viewport: viewport
1164
+ };
1165
+ }
1194
1166
 
1195
- pdf.setProperties({
1196
- title: "Map export",
1197
- subject: "Map export",
1198
- creator: "WhereGroup GmbH",
1199
- author: "(c)WhereGroup GmbH, (c)OpenStreetMap"
1200
- });
1201
- pdf.save("Map.pdf");
1202
- renderMap.remove();
1203
- (_hidden$parentNode = hidden.parentNode) === null || _hidden$parentNode === void 0 ? void 0 : _hidden$parentNode.removeChild(hidden);
1204
- Object.defineProperty(window, "devicePixelRatio", {
1205
- get: function get() {
1206
- return actualPixelRatio;
1207
- }
1208
- });
1209
- setLoading(false);
1210
- });
1167
+ useMapState.defaultProps = {
1168
+ mapId: undefined,
1169
+ watch: {
1170
+ layers: true,
1171
+ sources: false,
1172
+ viewport: false
1173
+ },
1174
+ filter: {
1175
+ includeBaseLayers: false
1176
+ }
1211
1177
  };
1178
+ useMapState.propTypes = {
1179
+ /**
1180
+ * Id of the target MapLibre instance in mapContext
1181
+ */
1182
+ mapId: PropTypes.string,
1212
1183
 
1213
- /**
1214
- * Renders a button that will create a PDF version of the current map view (dimensions adjusted to fit Din A4 Paper).
1215
- *
1216
- * @component
1217
- */
1218
-
1219
- var MlCreatePdfButton = function MlCreatePdfButton(props) {
1220
- var mapContext = useContext(MapContext);
1221
- var initializedRef = useRef(false);
1222
- var mapRef = useRef(undefined);
1223
- useEffect(function () {
1224
- if (!mapContext.mapExists(props.mapId) || initializedRef.current) return;
1225
- initializedRef.current = true;
1226
- mapRef.current = mapContext.getMap(props.mapId);
1227
- }, [mapContext.mapIds, mapContext, props.mapId]);
1228
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Button, {
1229
- color: "primary",
1230
- variant: "contained",
1231
- onClick: function onClick() {
1232
- createPdf(mapRef.current, null, function () {});
1233
- }
1234
- }, /*#__PURE__*/React__default.createElement(PrinterIcon, null)));
1235
- };
1184
+ /**
1185
+ * Defines map Resources to watch
1186
+ */
1187
+ watch: PropTypes.shape({
1188
+ layers: PropTypes.bool,
1189
+ sources: PropTypes.bool,
1190
+ viewport: PropTypes.bool
1191
+ }),
1236
1192
 
1237
- MlCreatePdfButton.defaultProps = {
1238
- mapId: undefined
1239
- };
1240
- MlCreatePdfButton.propTypes = {
1241
1193
  /**
1242
- * Id of the target MapLibre instance in mapContext
1194
+ * Filter string or RegExp to more explicitly define the elements watched and increase performance
1195
+ * strings will be matched using layerId.includes(matchString)
1196
+ * RegExps will be matched using matchRegExp.test(layerId)
1243
1197
  */
1244
- mapId: PropTypes.string
1198
+ filter: PropTypes.shape({
1199
+ includeBaseLayers: PropTypes.bool,
1200
+ matchLayerIds: PropTypes.oneOfType([PropTypes.string, PropTypes.instanceOf(RegExp)]),
1201
+ matchSourceIds: PropTypes.oneOfType([PropTypes.string, PropTypes.instanceOf(RegExp)])
1202
+ })
1245
1203
  };
1246
1204
 
1247
1205
  var _showNextTransitionSegment = function _showNextTransitionSegment(props, layerId, map, transitionInProgressRef, transitionGeojsonDataRef, transitionGeojsonCommonDataRef, currentTransitionStepRef, msPerStep, transitionTimeoutRef) {
@@ -1417,6 +1375,14 @@ var msPerStep = 50;
1417
1375
  var MlGeoJsonLayer = function MlGeoJsonLayer(props) {
1418
1376
  // Use a useRef hook to reference the layer object to be able to access it later inside useEffect hooks
1419
1377
  var mapContext = useContext(MapContext);
1378
+ var mapState = useMapState({
1379
+ mapId: props.mapId,
1380
+ watch: {
1381
+ viewport: false,
1382
+ layers: true,
1383
+ sources: false
1384
+ }
1385
+ });
1420
1386
  var oldGeojsonRef = useRef(null);
1421
1387
  var mapRef = useRef(null);
1422
1388
  var initializedRef = useRef(false);
@@ -1442,11 +1408,17 @@ var MlGeoJsonLayer = function MlGeoJsonLayer(props) {
1442
1408
  };
1443
1409
  }, []);
1444
1410
  useEffect(function () {
1445
- if (!mapRef.current || !initializedRef.current) return; // the MapLibre-gl instance (mapContext.map) is accessible here
1446
- // initialize the layer and add it to the MapLibre-gl instance or do something else with it
1411
+ if (!mapRef.current || !initializedRef.current) return;
1412
+
1413
+ for (var key in props.layout) {
1414
+ mapContext.getMap(props.mapId).setLayoutProperty(layerId.current, key, props.layout[key]);
1415
+ }
1416
+ }, [props.layout, mapContext, props.mapId]);
1417
+ useEffect(function () {
1418
+ if (!mapRef.current || !initializedRef.current) return;
1447
1419
 
1448
1420
  for (var key in props.paint) {
1449
- mapContext.getMap(props.mapId).setPaintProperty(componentId.current, key, props.paint[key]);
1421
+ mapContext.getMap(props.mapId).setPaintProperty(layerId.current, key, props.paint[key]);
1450
1422
  }
1451
1423
  }, [props.paint, mapContext, props.mapId]);
1452
1424
  var transitionToGeojson = useCallback(function (newGeojson) {
@@ -1475,6 +1447,22 @@ var MlGeoJsonLayer = function MlGeoJsonLayer(props) {
1475
1447
  // initialize the layer and add it to the MapLibre-gl instance or do something else with it
1476
1448
 
1477
1449
  if (props.geojson) {
1450
+ //check if insertBeforeLayer exists
1451
+ if (props.insertBeforeLayer) {
1452
+ var _mapState$layers;
1453
+
1454
+ var layerFound = false;
1455
+ mapState === null || mapState === void 0 ? void 0 : (_mapState$layers = mapState.layers) === null || _mapState$layers === void 0 ? void 0 : _mapState$layers.forEach(function (layer) {
1456
+ if (layer.id === props.insertBeforeLayer) {
1457
+ layerFound = true;
1458
+ }
1459
+ });
1460
+
1461
+ if (!layerFound) {
1462
+ return;
1463
+ }
1464
+ }
1465
+
1478
1466
  initializedRef.current = true;
1479
1467
  var geojson = props.geojson;
1480
1468
 
@@ -1494,7 +1482,8 @@ var MlGeoJsonLayer = function MlGeoJsonLayer(props) {
1494
1482
  paint: props.paint || {
1495
1483
  "line-color": "rgb(100,200,100)",
1496
1484
  "line-width": 10
1497
- }
1485
+ },
1486
+ layout: props.layout || {}
1498
1487
  }, props.insertBeforeLayer, componentId.current);
1499
1488
 
1500
1489
  if (typeof props.onHover !== "undefined") {
@@ -1514,7 +1503,7 @@ var MlGeoJsonLayer = function MlGeoJsonLayer(props) {
1514
1503
  oldGeojsonRef.current = props.geojson;
1515
1504
  }
1516
1505
  }
1517
- }, [mapContext.mapIds, mapContext, props, transitionToGeojson]);
1506
+ }, [mapContext.mapIds, mapContext, props, transitionToGeojson, mapState.layers]);
1518
1507
  return /*#__PURE__*/React__default.createElement(React__default.Fragment, null);
1519
1508
  };
1520
1509
 
@@ -1531,8 +1520,17 @@ MlGeoJsonLayer.propTypes = {
1531
1520
  type: PropTypes.string,
1532
1521
 
1533
1522
  /**
1534
- * Paint object, that is passed to the addLayer call.
1535
- * Possible propsdepend on the layer type.
1523
+ * Layout property object, that is passed to the addLayer call.
1524
+ * Possible props depend on the layer type.
1525
+ * https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/#line
1526
+ * https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/#circle
1527
+ * https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/#fill
1528
+ */
1529
+ layout: PropTypes.object,
1530
+
1531
+ /**
1532
+ * Paint property object, that is passed to the addLayer call.
1533
+ * Possible props depend on the layer type.
1536
1534
  * https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/#line
1537
1535
  * https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/#circle
1538
1536
  * https://maplibre.org/maplibre-gl-js-docs/style-spec/layers/#fill
@@ -1584,43 +1582,100 @@ MlGeoJsonLayer.propTypes = {
1584
1582
  idSuffix: PropTypes.string
1585
1583
  };
1586
1584
 
1587
- var MlImageMarkerLayer = function MlImageMarkerLayer(props) {
1585
+ function useMap(props) {
1588
1586
  // Use a useRef hook to reference the layer object to be able to access it later inside useEffect hooks
1589
- var mapRef = useRef(null);
1590
- var componentId = useRef((props.idPrefix ? props.idPrefix : "MlOsmLayer-") + v4());
1591
1587
  var mapContext = useContext(MapContext);
1592
- var layerInitializedRef = useRef(false);
1593
- var idSuffixRef = useRef(props.idSuffix || new Date().getTime());
1594
- var imageIdRef = useRef(props.imageId || "img_" + new Date().getTime());
1595
- var layerId = useRef((props.layerId || "MlImageMarkerLayer-") + idSuffixRef.current);
1588
+ var mapState = useMapState({
1589
+ mapId: props.mapId,
1590
+ watch: {
1591
+ viewport: false,
1592
+ layers: true,
1593
+ sources: false
1594
+ }
1595
+ });
1596
+ var initializedRef = useRef(false);
1597
+ var mapRef = useRef(undefined);
1598
+ var componentId = useRef(v4());
1599
+
1600
+ var _useState = useState(undefined),
1601
+ _useState2 = _slicedToArray(_useState, 2),
1602
+ mapIsReady = _useState2[0],
1603
+ setMapIsReady = _useState2[1];
1604
+
1596
1605
  useEffect(function () {
1597
1606
  var _componentId = componentId.current;
1598
1607
  return function () {
1599
- // This is the cleanup function, it is called when this react component is removed from react-dom
1600
1608
  if (mapRef.current) {
1601
1609
  mapRef.current.cleanup(_componentId);
1602
- mapRef.current = null;
1610
+ mapRef.current = undefined;
1603
1611
  }
1612
+
1613
+ initializedRef.current = false;
1614
+ setMapIsReady(false);
1604
1615
  };
1605
1616
  }, []);
1606
1617
  useEffect(function () {
1607
- if (!mapRef.current || mapRef.current && !mapContext.getMap(props.mapId).getLayer(layerId.current) || !props.options) return; // the MapLibre-gl instance (mapContext.map) is accessible here
1618
+ if (!mapContext.mapExists(props.mapId) || initializedRef.current) return;
1619
+ console.log("initialize useMap hook"); //check if insertBeforeLayer exists
1620
+
1621
+ if (props.waitForLayer) {
1622
+ var _mapState$layers;
1623
+
1624
+ var layerFound = false;
1625
+ mapState === null || mapState === void 0 ? void 0 : (_mapState$layers = mapState.layers) === null || _mapState$layers === void 0 ? void 0 : _mapState$layers.forEach(function (layer) {
1626
+ console.log(layer.id + " " + props.waitForLayer);
1627
+
1628
+ if (layer.id === props.waitForLayer) {
1629
+ layerFound = true;
1630
+ }
1631
+ });
1632
+
1633
+ if (!layerFound) {
1634
+ return;
1635
+ }
1636
+ }
1637
+
1638
+ console.log("done initialize useMap hook"); // the MapLibre-gl instance (mapContext.getMap(props.mapId)) is accessible here
1639
+ // initialize the layer and add it to the MapLibre-gl instance or do something else with it
1640
+
1641
+ initializedRef.current = true;
1642
+ mapRef.current = mapContext.getMap(props.mapId);
1643
+ setMapIsReady(true);
1644
+ }, [mapContext.mapIds, mapState.layers, mapContext, props.mapId]);
1645
+ return {
1646
+ map: mapRef.current,
1647
+ mapIsReady: mapIsReady,
1648
+ componentId: componentId.current,
1649
+ layers: mapState.layers
1650
+ };
1651
+ }
1652
+
1653
+ var MlImageMarkerLayer = function MlImageMarkerLayer(props) {
1654
+ var mapHook = useMap({
1655
+ mapId: props.mapId,
1656
+ waitForLayer: props.insertBeforeLayer
1657
+ });
1658
+ var layerInitializedRef = useRef(false);
1659
+ var imageIdRef = useRef(props.imageId || "img_" + new Date().getTime());
1660
+ var layerId = useRef(props.layerId || "MlImageMarkerLayer-" + mapHook.componentId);
1661
+ useEffect(function () {
1662
+ if (!mapHook.mapIsReady || mapHook.map && !mapHook.map.getLayer(layerId.current) || !props.options) return; // the MapLibre-gl instance (mapContext.map) is accessible here
1608
1663
  // initialize the layer and add it to the MapLibre-gl instance or do something else with it
1609
1664
 
1610
1665
  var key;
1611
1666
 
1612
1667
  if (props.options.layout) {
1613
1668
  for (key in props.options.layout) {
1614
- mapContext.getMap(props.mapId).setLayoutProperty(layerId.current, key, props.options.layout[key]);
1669
+ mapHook.map.setLayoutProperty(layerId.current, key, props.options.layout[key]);
1615
1670
  }
1616
1671
  }
1617
1672
 
1618
1673
  if (props.options.paint) {
1619
1674
  for (key in props.options.paint) {
1620
- mapContext.getMap(props.mapId).setPaintProperty(layerId.current, key, props.options.paint[key]);
1675
+ mapHook.map.setPaintProperty(layerId.current, key, props.options.paint[key]);
1621
1676
  }
1622
1677
  }
1623
- }, [props.options, layerId.current, mapContext, props.mapId]);
1678
+ }, [props.options, layerId.current, props.mapId]);
1624
1679
  var addLayer = useCallback(function () {
1625
1680
  var tmpOptions = _objectSpread2({
1626
1681
  id: layerId.current,
@@ -1628,180 +1683,531 @@ var MlImageMarkerLayer = function MlImageMarkerLayer(props) {
1628
1683
  }, props.options);
1629
1684
 
1630
1685
  tmpOptions.layout["icon-image"] = imageIdRef.current;
1631
- mapRef.current.addLayer(tmpOptions, props.insertBeforeLayer, componentId.current);
1632
- }, [props]);
1686
+ mapHook.map.addLayer(tmpOptions, props.insertBeforeLayer, mapHook.componentId);
1687
+ }, [props, mapHook.mapIsReady, mapHook.map]);
1633
1688
  useEffect(function () {
1634
- if (!props.options || !mapContext.mapExists(props.mapId) || layerInitializedRef.current) return; // the MapLibre-gl instance (mapContext.map) is accessible here
1635
- // initialize the layer and add it to the MapLibre-gl instance or do something else with it
1636
-
1637
- mapRef.current = mapContext.getMap(props.mapId);
1689
+ if (!props.options || !mapHook.mapIsReady || layerInitializedRef.current) return;
1638
1690
  layerInitializedRef.current = true;
1639
1691
 
1640
1692
  if (props.imgSrc) {
1641
- mapRef.current.loadImage(props.imgSrc, function (error, image) {
1693
+ mapHook.map.loadImage(props.imgSrc, function (error, image) {
1642
1694
  if (error) throw error;
1643
- mapRef.current.addImage(imageIdRef.current, image, componentId.current);
1695
+ mapHook.map.addImage(imageIdRef.current, image, mapHook.componentId);
1644
1696
  });
1645
1697
  }
1646
1698
 
1647
1699
  addLayer();
1648
- }, [mapContext.mapIds, mapContext, props, addLayer]);
1700
+ }, [mapHook.mapIsReady, mapHook.map, addLayer, props]);
1649
1701
  useEffect(function () {
1650
- if (!mapRef.current || mapRef.current && !mapContext.getMap(props.mapId).getLayer(layerId.current) || !props.options) {
1702
+ if (!mapHook.mapIsReady || mapHook.map && !mapHook.map.getLayer(layerId.current) || !props.options) {
1651
1703
  return;
1652
- } // the MapLibre-gl instance (mapContext.map) is accessible here
1653
- // initialize the layer and add it to the MapLibre-gl instance or do something else with it
1654
-
1704
+ }
1655
1705
 
1656
- mapRef.current.getSource(layerId.current).setData(props.options.source.data);
1657
- }, [props.options.source.data, mapContext, props]);
1706
+ mapHook.map.getSource(layerId.current).setData(props.options.source.data);
1707
+ }, [props.options.source.data, props]);
1658
1708
  return /*#__PURE__*/React__default.createElement(React__default.Fragment, null);
1659
1709
  };
1660
1710
 
1661
- function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
1662
-
1663
- function SvgRotateRight(props) {
1664
- return /*#__PURE__*/createElement("svg", _extends({
1665
- width: "39.675098mm",
1666
- height: "104.27064mm",
1667
- viewBox: "0 0 39.675098 104.27064"
1668
- }, props), /*#__PURE__*/createElement("g", {
1669
- transform: "translate(-86.019554,-58.032633)"
1670
- }, /*#__PURE__*/createElement("path", {
1671
- style: {
1672
- strokeWidth: 0.744756
1673
- },
1674
- d: "m 442.74023,219.33594 -117.62695,32.32422 54.71094,31.12304 c -21.99397,41.5931 -32.8507,84.88283 -38.33008,127.89649 -6.86182,50.94051 -5.95715,103.99765 20.23828,155.46484 5.97246,11.72776 13.65817,23.59773 24.38867,35.06641 2.6597,2.84073 5.65602,5.75455 9.12891,8.68164 0.87557,0.7378 1.85363,1.52609 2.95117,2.35547 0.29669,0.22563 0.63616,0.47742 1.02149,0.75586 l 0.58203,0.42578 34.57812,-15.12305 -0.33789,-0.2207 c -0.0265,-0.0151 -0.0842,-0.0587 -0.18359,-0.13086 -0.46723,-0.34885 -0.9819,-0.76796 -1.56055,-1.25 -2.29757,-1.91343 -4.46539,-4.04643 -6.64062,-6.33985 -8.80052,-9.27114 -15.30333,-19.4993 -20.83985,-30.13867 -24.42289,-46.90715 -24.77465,-97.03535 -18.58008,-146.68164 4.94388,-37.37493 13.65299,-74.4847 30.20508,-109.92969 l 58.6211,33.34766 z",
1675
- transform: "scale(0.26458333)"
1676
- })));
1677
- }
1678
-
1679
- var _g;
1680
-
1681
- function _extends$1() { _extends$1 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$1.apply(this, arguments); }
1682
-
1683
- function SvgRotateLeft(props) {
1684
- return /*#__PURE__*/createElement("svg", _extends$1({
1685
- width: "39.675098mm",
1686
- height: "104.27064mm",
1687
- viewBox: "0 0 39.675098 104.27064"
1688
- }, props), _g || (_g = /*#__PURE__*/createElement("g", {
1689
- transform: "translate(-86.019554,-58.032633)"
1690
- }, /*#__PURE__*/createElement("path", {
1691
- d: "m 94.572523,58.032633 31.122127,8.55245 -14.4756,8.234638 c 5.81924,11.004841 8.69175,22.458582 10.1415,33.839279 1.81552,13.47801 1.57616,27.51604 -5.35471,41.13341 -1.58021,3.10296 -3.61373,6.24356 -6.45284,9.27798 -0.70371,0.75161 -1.49649,1.52256 -2.41535,2.29702 -0.23167,0.19521 -0.49044,0.40378 -0.78083,0.62322 -0.0785,0.0597 -0.16832,0.12632 -0.27027,0.19999 l -0.154,0.11265 -9.148793,-4.00131 0.0894,-0.0584 c 0.007,-0.004 0.02228,-0.0155 0.04857,-0.0346 0.123621,-0.0923 0.259794,-0.20319 0.412895,-0.33073 0.607899,-0.50626 1.181468,-1.07062 1.756997,-1.67742 2.328481,-2.45299 4.049011,-5.15919 5.513881,-7.97419 6.46189,-12.41085 6.55496,-25.67394 4.91598,-38.80952 -1.30807,-9.888781 -3.61235,-19.707408 -7.99176,-29.085561 l -15.510171,8.823235 z"
1692
- }))));
1693
- }
1694
-
1695
- var _g$1;
1696
-
1697
- function _extends$2() { _extends$2 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$2.apply(this, arguments); }
1698
-
1699
- function SvgNeedle(props) {
1700
- return /*#__PURE__*/createElement("svg", _extends$2({
1701
- width: "75.967445mm",
1702
- height: "234.71339mm",
1703
- viewBox: "0 0 75.967445 234.71339"
1704
- }, props), _g$1 || (_g$1 = /*#__PURE__*/createElement("g", {
1705
- transform: "translate(-76.705281,-29.77268)"
1706
- }, /*#__PURE__*/createElement("path", {
1707
- d: "m 114.68901,29.77268 37.98372,117.3567 H 76.705281 Z"
1708
- }), /*#__PURE__*/createElement("path", {
1709
- d: "m 114.68901,264.48608 37.98372,-117.3567 H 76.705281 Z"
1710
- }))));
1711
- }
1712
-
1713
- function _EMOTION_STRINGIFIED_CSS_ERROR__() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
1714
-
1715
- var NeedleButton = _styled("div", process.env.NODE_ENV === "production" ? {
1716
- target: "e12lzm5x2"
1717
- } : {
1718
- target: "e12lzm5x2",
1719
- label: "NeedleButton"
1720
- })(process.env.NODE_ENV === "production" ? {
1721
- name: "1204o9",
1722
- styles: "width:40%;display:flex;align-items:center;&:hover{cursor:pointer;}path{filter:drop-shadow(0px 0px 15px rgba(0, 0, 0, 0.2));}&:hover path{filter:drop-shadow(0px 0px 13px rgba(255, 255, 255, 0.1));}path:nth-of-type(2){fill:#343434;}&:hover path:nth-of-type(2){fill:#434343;}path:nth-of-type(1){fill:#e90318;}&:hover path:nth-of-type(1){fill:#fb4052;}"
1723
- } : {
1724
- name: "1204o9",
1725
- styles: "width:40%;display:flex;align-items:center;&:hover{cursor:pointer;}path{filter:drop-shadow(0px 0px 15px rgba(0, 0, 0, 0.2));}&:hover path{filter:drop-shadow(0px 0px 13px rgba(255, 255, 255, 0.1));}path:nth-of-type(2){fill:#343434;}&:hover path:nth-of-type(2){fill:#434343;}path:nth-of-type(1){fill:#e90318;}&:hover path:nth-of-type(1){fill:#fb4052;}",
1726
- map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1sTmF2aWdhdGlvbkNvbXBhc3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBYStCIiwiZmlsZSI6Ik1sTmF2aWdhdGlvbkNvbXBhc3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZVJlZiwgdXNlRWZmZWN0LCB1c2VDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5cbmltcG9ydCB7IE1hcENvbnRleHQgfSBmcm9tIFwiQG1hcGNvbXBvbmVudHMvcmVhY3QtY29yZVwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSBcInV1aWRcIjtcblxuaW1wb3J0IHsgUmVhY3RDb21wb25lbnQgYXMgUm90YXRlUmlnaHRJY29uIH0gZnJvbSBcIi4vYXNzZXRzL3JvdGF0ZV9yaWdodC5zdmdcIjtcbmltcG9ydCB7IFJlYWN0Q29tcG9uZW50IGFzIFJvdGF0ZUxlZnRJY29uIH0gZnJvbSBcIi4vYXNzZXRzL3JvdGF0ZV9sZWZ0LnN2Z1wiO1xuaW1wb3J0IHsgUmVhY3RDb21wb25lbnQgYXMgTmVlZGxlSWNvbiB9IGZyb20gXCIuL2Fzc2V0cy9uZWVkbGUuc3ZnXCI7XG5cbmltcG9ydCBzdHlsZWQgZnJvbSBcIkBlbW90aW9uL3N0eWxlZFwiO1xuaW1wb3J0IHsgY3NzIH0gZnJvbSBcIkBlbW90aW9uL2Nzc1wiO1xuXG5jb25zdCBOZWVkbGVCdXR0b24gPSBzdHlsZWQuZGl2YFxuICB3aWR0aDogNDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuXG4gICY6aG92ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuICBwYXRoIHtcbiAgICBmaWx0ZXI6IGRyb3Atc2hhZG93KDBweCAwcHggMTVweCByZ2JhKDAsIDAsIDAsIDAuMikpO1xuICB9XG4gICY6aG92ZXIgcGF0aCB7XG4gICAgZmlsdGVyOiBkcm9wLXNoYWRvdygwcHggMHB4IDEzcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpKTtcbiAgfVxuICBwYXRoOm50aC1vZi10eXBlKDIpIHtcbiAgICBmaWxsOiAjMzQzNDM0O1xuICB9XG4gICY6aG92ZXIgcGF0aDpudGgtb2YtdHlwZSgyKSB7XG4gICAgZmlsbDogIzQzNDM0MztcbiAgfVxuICBwYXRoOm50aC1vZi10eXBlKDEpIHtcbiAgICBmaWxsOiAjZTkwMzE4O1xuICB9XG4gICY6aG92ZXIgcGF0aDpudGgtb2YtdHlwZSgxKSB7XG4gICAgZmlsbDogI2ZiNDA1MjtcbiAgfVxuYDtcbmNvbnN0IE5lZWRsZUNvbnRhaW5lciA9IHN0eWxlZC5kaXZgXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBkaXNwbGF5OiBmbGV4O1xuICB6LWluZGV4OiAxMDAyO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cbiAgbWFyZ2luLWxlZnQ6IC0zMCU7XG4gIHBhdGg6bnRoLW9mLXR5cGUoMikge1xuICB9XG4gIHN2ZyBnIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNzYuNzA1MywgLTI5Ljc3MjcpIHNjYWxlKDIsIDEpO1xuICB9XG4gIHN2ZyB7XG4gICAgei1pbmRleDogOTk5MDtcbiAgICBoZWlnaHQ6IDE1MHB4O1xuICAgIHdpZHRoOiAyMDBweDtcbiAgfVxuYDtcbmNvbnN0IFJvdGF0ZUJ1dHRvbiA9IHN0eWxlZC5kaXZgXG4gIHdpZHRoOiAzMCU7XG4gIG1hcmdpbi10b3A6IDE0cHg7XG4gIHotaW5kZXg6IDk5OTtcbiAgZGlzcGxheTogZmxleDtcblxuICBzdmc6aG92ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuICBzdmc6aG92ZXIgcGF0aCB7XG4gICAgZmlsbDogI2VjZWNlYztcbiAgICBmaWx0ZXI6IGRyb3Atc2hhZG93KDBweCAwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xKSk7XG4gIH1cbiAgcGF0aCB7XG4gICAgZmlsbDogI2JiYjtcbiAgfVxuICBzdmcge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC42KTtcbiAgICB6LWluZGV4OiA5OTkwO1xuICAgIGhlaWdodDogMTcycHg7XG4gIH1cbmA7XG5cbi8qKlxuICogTmF2aWdhdGlvbiBjb21wb25lbnQgdGhhdCBkaXNwbGF5cyBhIGNvbXBhc3MgY29tcG9uZW50IHdoaWNoIGluZGljYXRlcyB0aGUgY3VycmVudCBvcmlhbnRhdGlvbiBvZiB0aGUgbWFwIGl0IGlzIHJlZ2lzdGVyZWQgZm9yIGFuZCBvZmZlcnMgY29udHJvbHMgdG8gdHVybiB0aGUgYmVhcmluZyA5MMKwIGxlZnQvcmlnaHQgb3IgcmVzZXQgbm9ydGggdG8gcG9pbnQgdXAuXG4gKlxuICogQWxsIHN0eWxlIHByb3BzIGFyZSBhcHBsaWVkIHVzaW5nIEBlbW90aW9uL2NzcyB0byBhbGxvdyBtb3JlIGNvbXBsZXggY3NzIHNlbGVjdG9ycy5cbiAqXG4gKiBAY29tcG9uZW50XG4gKi9cbmNvbnN0IE1sTmF2aWdhdGlvbkNvbXBhc3MgPSAocHJvcHMpID0+IHtcbiAgLy8gVXNlIGEgdXNlUmVmIGhvb2sgdG8gcmVmZXJlbmNlIHRoZSBsYXllciBvYmplY3QgdG8gYmUgYWJsZSB0byBhY2Nlc3MgaXQgbGF0ZXIgaW5zaWRlIHVzZUVmZmVjdCBob29rc1xuICBjb25zdCBtYXBDb250ZXh0ID0gdXNlQ29udGV4dChNYXBDb250ZXh0KTtcblxuICBjb25zdCBpbml0aWFsaXplZFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IG1hcFJlZiA9IHVzZVJlZih1bmRlZmluZWQpO1xuICBjb25zdCBjb21wb25lbnRJZCA9IHVzZVJlZigocHJvcHMuaWRQcmVmaXggPyBwcm9wcy5pZFByZWZpeCA6IFwiTWxOYXZpZ2F0aW9uQ29tcGFzcy1cIikgKyB1dWlkdjQoKSk7XG5cbiAgY29uc3QgW2JlYXJpbmcsIHNldEJlYXJpbmddID0gdXNlU3RhdGUoMCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgX2NvbXBvbmVudElkID0gY29tcG9uZW50SWQuY3VycmVudDtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBjbGVhbnVwIGZ1bmN0aW9uLCBpdCBpcyBjYWxsZWQgd2hlbiB0aGlzIHJlYWN0IGNvbXBvbmVudCBpcyByZW1vdmVkIGZyb20gcmVhY3QtZG9tXG5cbiAgICAgIGlmIChtYXBSZWYuY3VycmVudCkge1xuICAgICAgICBtYXBSZWYuY3VycmVudC5jbGVhbnVwKF9jb21wb25lbnRJZCk7XG4gICAgICAgIG1hcFJlZi5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaW5pdGlhbGl6ZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghbWFwQ29udGV4dC5tYXBFeGlzdHMocHJvcHMubWFwSWQpIHx8IGluaXRpYWxpemVkUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICBpbml0aWFsaXplZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICBtYXBSZWYuY3VycmVudCA9IG1hcENvbnRleHQuZ2V0TWFwKHByb3BzLm1hcElkKTtcblxuICAgIG1hcFJlZi5jdXJyZW50Lm9uKFxuICAgICAgXCJyb3RhdGVcIixcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0QmVhcmluZyhNYXRoLnJvdW5kKG1hcFJlZi5jdXJyZW50LmdldEJlYXJpbmcoKSkpO1xuICAgICAgfSxcbiAgICAgIGNvbXBvbmVudElkLmN1cnJlbnRcbiAgICApO1xuICAgIHNldEJlYXJpbmcoTWF0aC5yb3VuZChtYXBSZWYuY3VycmVudC5nZXRCZWFyaW5nKCkpKTtcbiAgfSwgW21hcENvbnRleHQubWFwSWRzLCBtYXBDb250ZXh0LCBwcm9wcy5tYXBJZF0pO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtjc3Moe1xuICAgICAgICAgIHpJbmRleDogMTAwMCxcbiAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAuLi5wcm9wcy5zdHlsZSxcbiAgICAgICAgfSl9XG4gICAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9e2Nzcyh7XG4gICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgICAgYm9yZGVyOiBcIjEwcHggc29saWQgI2JjYmNiY1wiLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiM3MTcxNzFcIixcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IFwicmFkaWFsLWdyYWRpZW50KCM3MTcxNzEsICM0MTQxNDEpXCIsXG4gICAgICAgICAgICBoZWlnaHQ6IFwiMjAwcHhcIixcbiAgICAgICAgICAgIHdpZHRoOiBcIjIwMHB4XCIsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiNTAlXCIsXG4gICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBcInNjYWxlKDAuMikgdHJhbnNsYXRlWCgtNDQ4cHgpIHRyYW5zbGF0ZVkoLTQ0OHB4KVwiLFxuICAgICAgICAgICAgLi4ucHJvcHMuYmFja2dyb3VuZFN0eWxlLFxuICAgICAgICAgIH0pfVxuICAgICAgICA+XG4gICAgICAgICAgPFJvdGF0ZUJ1dHRvbiBjbGFzc05hbWU9e2Nzcyh7IC4uLnByb3BzLnJvdGF0ZVJpZ2h0U3R5bGUgfSl9PlxuICAgICAgICAgICAgPFJvdGF0ZVJpZ2h0SWNvblxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGJlYXJpbmcgPSBNYXRoLnJvdW5kKG1hcFJlZi5jdXJyZW50Py5nZXRCZWFyaW5nKCkpO1xuICAgICAgICAgICAgICAgIGxldCByZXN0ID0gTWF0aC5yb3VuZChiZWFyaW5nICUgOTApO1xuICAgICAgICAgICAgICAgIGlmIChiZWFyaW5nID4gMCkge1xuICAgICAgICAgICAgICAgICAgcmVzdCA9IDkwIC0gcmVzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3QgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlc3QgPSA5MDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFwUmVmLmN1cnJlbnQ/LnNldEJlYXJpbmcoTWF0aC5yb3VuZChiZWFyaW5nICsgTWF0aC5hYnMocmVzdCkpKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID48L1JvdGF0ZVJpZ2h0SWNvbj5cbiAgICAgICAgICA8L1JvdGF0ZUJ1dHRvbj5cbiAgICAgICAgICA8TmVlZGxlQnV0dG9uXG4gICAgICAgICAgICBjbGFzc05hbWU9e2Nzcyh7IC4uLnByb3BzLm5lZWRsZVN0eWxlIH0pfVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICBtYXBSZWYuY3VycmVudD8uc2V0QmVhcmluZygwKTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPE5lZWRsZUNvbnRhaW5lclxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogXCJyb3RhdGUoXCIgKyBiZWFyaW5nICsgXCJkZWcpXCIsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxOZWVkbGVJY29uIC8+XG4gICAgICAgICAgICA8L05lZWRsZUNvbnRhaW5lcj5cbiAgICAgICAgICA8L05lZWRsZUJ1dHRvbj5cbiAgICAgICAgICA8Um90YXRlQnV0dG9uIGNsYXNzTmFtZT17Y3NzKHsgLi4ucHJvcHMucm90YXRlTGVmdFN0eWxlIH0pfT5cbiAgICAgICAgICAgIDxSb3RhdGVMZWZ0SWNvblxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGJlYXJpbmcgPSBNYXRoLnJvdW5kKG1hcFJlZi5jdXJyZW50Py5nZXRCZWFyaW5nKCkpO1xuICAgICAgICAgICAgICAgIGxldCByZXN0ID0gTWF0aC5yb3VuZChiZWFyaW5nICUgOTApO1xuICAgICAgICAgICAgICAgIGlmIChiZWFyaW5nIDwgMCkge1xuICAgICAgICAgICAgICAgICAgcmVzdCA9IDkwICsgcmVzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3QgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlc3QgPSA5MDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFwUmVmLmN1cnJlbnQ/LnNldEJlYXJpbmcoTWF0aC5yb3VuZChiZWFyaW5nIC0gTWF0aC5hYnMocmVzdCkpKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID48L1JvdGF0ZUxlZnRJY29uPlxuICAgICAgICAgIDwvUm90YXRlQnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvPlxuICApO1xufTtcblxuTWxOYXZpZ2F0aW9uQ29tcGFzcy5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBDb21wb25lbnQgaWQgcHJlZml4XG4gICAqL1xuICBpZFByZWZpeDogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqXG4gICAqIFN0eWxlIG9iamVjdCB0byBhZGp1c3QgY3NzIGRlZmluaXRpb25zIG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqXG4gICAqIFN0eWxlIG9iamVjdCB0byBhZGp1c3QgY3NzIGRlZmluaXRpb25zIG9mIHRoZSBiYWNrZ3JvdW5kLlxuICAgKi9cbiAgYmFja2dyb3VuZFN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKipcbiAgICogU3R5bGUgb2JqZWN0IHRvIGFkanVzdCBjc3MgZGVmaW5pdGlvbnMgb2YgdGhlIGNvbXBhc3MgbmVlZGxlLlxuICAgKi9cbiAgbmVlZGxlU3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKlxuICAgKiBTdHlsZSBvYmplY3QgdG8gYWRqdXN0IGNzcyBkZWZpbml0aW9ucyBvZiB0aGUgcm90YXRlIHJpZ2h0IGJ1dHRvbi5cbiAgICovXG4gIHJvdGF0ZVJpZ2h0U3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKlxuICAgKiBTdHlsZSBvYmplY3QgdG8gYWRqdXN0IGNzcyBkZWZpbml0aW9ucyBvZiB0aGUgcm90YXRlIGxlZnQgYnV0dG9uLlxuICAgKi9cbiAgcm90YXRlTGVmdFN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWxOYXZpZ2F0aW9uQ29tcGFzcztcbiJdfQ== */",
1727
- toString: _EMOTION_STRINGIFIED_CSS_ERROR__
1728
- });
1729
-
1730
- var NeedleContainer = _styled("div", process.env.NODE_ENV === "production" ? {
1731
- target: "e12lzm5x1"
1732
- } : {
1733
- target: "e12lzm5x1",
1734
- label: "NeedleContainer"
1735
- })(process.env.NODE_ENV === "production" ? {
1736
- name: "1m8y6tb",
1737
- styles: "pointer-events:none;display:flex;z-index:1002;position:absolute;align-items:center;margin-left:-30%;path:nth-of-type(2){}svg g{transform:translate(-76.7053, -29.7727) scale(2, 1);}svg{z-index:9990;height:150px;width:200px;}"
1738
- } : {
1739
- name: "1m8y6tb",
1740
- styles: "pointer-events:none;display:flex;z-index:1002;position:absolute;align-items:center;margin-left:-30%;path:nth-of-type(2){}svg g{transform:translate(-76.7053, -29.7727) scale(2, 1);}svg{z-index:9990;height:150px;width:200px;}",
1741
- map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1sTmF2aWdhdGlvbkNvbXBhc3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0NrQyIsImZpbGUiOiJNbE5hdmlnYXRpb25Db21wYXNzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuXG5pbXBvcnQgeyBNYXBDb250ZXh0IH0gZnJvbSBcIkBtYXBjb21wb25lbnRzL3JlYWN0LWNvcmVcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gXCJ1dWlkXCI7XG5cbmltcG9ydCB7IFJlYWN0Q29tcG9uZW50IGFzIFJvdGF0ZVJpZ2h0SWNvbiB9IGZyb20gXCIuL2Fzc2V0cy9yb3RhdGVfcmlnaHQuc3ZnXCI7XG5pbXBvcnQgeyBSZWFjdENvbXBvbmVudCBhcyBSb3RhdGVMZWZ0SWNvbiB9IGZyb20gXCIuL2Fzc2V0cy9yb3RhdGVfbGVmdC5zdmdcIjtcbmltcG9ydCB7IFJlYWN0Q29tcG9uZW50IGFzIE5lZWRsZUljb24gfSBmcm9tIFwiLi9hc3NldHMvbmVlZGxlLnN2Z1wiO1xuXG5pbXBvcnQgc3R5bGVkIGZyb20gXCJAZW1vdGlvbi9zdHlsZWRcIjtcbmltcG9ydCB7IGNzcyB9IGZyb20gXCJAZW1vdGlvbi9jc3NcIjtcblxuY29uc3QgTmVlZGxlQnV0dG9uID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6IDQwJTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAmOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbiAgcGF0aCB7XG4gICAgZmlsdGVyOiBkcm9wLXNoYWRvdygwcHggMHB4IDE1cHggcmdiYSgwLCAwLCAwLCAwLjIpKTtcbiAgfVxuICAmOmhvdmVyIHBhdGgge1xuICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMHB4IDBweCAxM3B4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSk7XG4gIH1cbiAgcGF0aDpudGgtb2YtdHlwZSgyKSB7XG4gICAgZmlsbDogIzM0MzQzNDtcbiAgfVxuICAmOmhvdmVyIHBhdGg6bnRoLW9mLXR5cGUoMikge1xuICAgIGZpbGw6ICM0MzQzNDM7XG4gIH1cbiAgcGF0aDpudGgtb2YtdHlwZSgxKSB7XG4gICAgZmlsbDogI2U5MDMxODtcbiAgfVxuICAmOmhvdmVyIHBhdGg6bnRoLW9mLXR5cGUoMSkge1xuICAgIGZpbGw6ICNmYjQwNTI7XG4gIH1cbmA7XG5jb25zdCBOZWVkbGVDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgZGlzcGxheTogZmxleDtcbiAgei1pbmRleDogMTAwMjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuXG4gIG1hcmdpbi1sZWZ0OiAtMzAlO1xuICBwYXRoOm50aC1vZi10eXBlKDIpIHtcbiAgfVxuICBzdmcgZyB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTc2LjcwNTMsIC0yOS43NzI3KSBzY2FsZSgyLCAxKTtcbiAgfVxuICBzdmcge1xuICAgIHotaW5kZXg6IDk5OTA7XG4gICAgaGVpZ2h0OiAxNTBweDtcbiAgICB3aWR0aDogMjAwcHg7XG4gIH1cbmA7XG5jb25zdCBSb3RhdGVCdXR0b24gPSBzdHlsZWQuZGl2YFxuICB3aWR0aDogMzAlO1xuICBtYXJnaW4tdG9wOiAxNHB4O1xuICB6LWluZGV4OiA5OTk7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgc3ZnOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbiAgc3ZnOmhvdmVyIHBhdGgge1xuICAgIGZpbGw6ICNlY2VjZWM7XG4gICAgZmlsdGVyOiBkcm9wLXNoYWRvdygwcHggMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMSkpO1xuICB9XG4gIHBhdGgge1xuICAgIGZpbGw6ICNiYmI7XG4gIH1cbiAgc3ZnIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNik7XG4gICAgei1pbmRleDogOTk5MDtcbiAgICBoZWlnaHQ6IDE3MnB4O1xuICB9XG5gO1xuXG4vKipcbiAqIE5hdmlnYXRpb24gY29tcG9uZW50IHRoYXQgZGlzcGxheXMgYSBjb21wYXNzIGNvbXBvbmVudCB3aGljaCBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgb3JpYW50YXRpb24gb2YgdGhlIG1hcCBpdCBpcyByZWdpc3RlcmVkIGZvciBhbmQgb2ZmZXJzIGNvbnRyb2xzIHRvIHR1cm4gdGhlIGJlYXJpbmcgOTDCsCBsZWZ0L3JpZ2h0IG9yIHJlc2V0IG5vcnRoIHRvIHBvaW50IHVwLlxuICpcbiAqIEFsbCBzdHlsZSBwcm9wcyBhcmUgYXBwbGllZCB1c2luZyBAZW1vdGlvbi9jc3MgdG8gYWxsb3cgbW9yZSBjb21wbGV4IGNzcyBzZWxlY3RvcnMuXG4gKlxuICogQGNvbXBvbmVudFxuICovXG5jb25zdCBNbE5hdmlnYXRpb25Db21wYXNzID0gKHByb3BzKSA9PiB7XG4gIC8vIFVzZSBhIHVzZVJlZiBob29rIHRvIHJlZmVyZW5jZSB0aGUgbGF5ZXIgb2JqZWN0IHRvIGJlIGFibGUgdG8gYWNjZXNzIGl0IGxhdGVyIGluc2lkZSB1c2VFZmZlY3QgaG9va3NcbiAgY29uc3QgbWFwQ29udGV4dCA9IHVzZUNvbnRleHQoTWFwQ29udGV4dCk7XG5cbiAgY29uc3QgaW5pdGlhbGl6ZWRSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCBtYXBSZWYgPSB1c2VSZWYodW5kZWZpbmVkKTtcbiAgY29uc3QgY29tcG9uZW50SWQgPSB1c2VSZWYoKHByb3BzLmlkUHJlZml4ID8gcHJvcHMuaWRQcmVmaXggOiBcIk1sTmF2aWdhdGlvbkNvbXBhc3MtXCIpICsgdXVpZHY0KCkpO1xuXG4gIGNvbnN0IFtiZWFyaW5nLCBzZXRCZWFyaW5nXSA9IHVzZVN0YXRlKDApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IF9jb21wb25lbnRJZCA9IGNvbXBvbmVudElkLmN1cnJlbnQ7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgY2xlYW51cCBmdW5jdGlvbiwgaXQgaXMgY2FsbGVkIHdoZW4gdGhpcyByZWFjdCBjb21wb25lbnQgaXMgcmVtb3ZlZCBmcm9tIHJlYWN0LWRvbVxuXG4gICAgICBpZiAobWFwUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgbWFwUmVmLmN1cnJlbnQuY2xlYW51cChfY29tcG9uZW50SWQpO1xuICAgICAgICBtYXBSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGluaXRpYWxpemVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIW1hcENvbnRleHQubWFwRXhpc3RzKHByb3BzLm1hcElkKSB8fCBpbml0aWFsaXplZFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgaW5pdGlhbGl6ZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgbWFwUmVmLmN1cnJlbnQgPSBtYXBDb250ZXh0LmdldE1hcChwcm9wcy5tYXBJZCk7XG5cbiAgICBtYXBSZWYuY3VycmVudC5vbihcbiAgICAgIFwicm90YXRlXCIsXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldEJlYXJpbmcoTWF0aC5yb3VuZChtYXBSZWYuY3VycmVudC5nZXRCZWFyaW5nKCkpKTtcbiAgICAgIH0sXG4gICAgICBjb21wb25lbnRJZC5jdXJyZW50XG4gICAgKTtcbiAgICBzZXRCZWFyaW5nKE1hdGgucm91bmQobWFwUmVmLmN1cnJlbnQuZ2V0QmVhcmluZygpKSk7XG4gIH0sIFttYXBDb250ZXh0Lm1hcElkcywgbWFwQ29udGV4dCwgcHJvcHMubWFwSWRdKTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17Y3NzKHtcbiAgICAgICAgICB6SW5kZXg6IDEwMDAsXG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgLi4ucHJvcHMuc3R5bGUsXG4gICAgICAgIH0pfVxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPXtjc3Moe1xuICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgIGJvcmRlcjogXCIxMHB4IHNvbGlkICNiY2JjYmNcIixcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjNzE3MTcxXCIsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBcInJhZGlhbC1ncmFkaWVudCgjNzE3MTcxLCAjNDE0MTQxKVwiLFxuICAgICAgICAgICAgaGVpZ2h0OiBcIjIwMHB4XCIsXG4gICAgICAgICAgICB3aWR0aDogXCIyMDBweFwiLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjUwJVwiLFxuICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIHRyYW5zZm9ybTogXCJzY2FsZSgwLjIpIHRyYW5zbGF0ZVgoLTQ0OHB4KSB0cmFuc2xhdGVZKC00NDhweClcIixcbiAgICAgICAgICAgIC4uLnByb3BzLmJhY2tncm91bmRTdHlsZSxcbiAgICAgICAgICB9KX1cbiAgICAgICAgPlxuICAgICAgICAgIDxSb3RhdGVCdXR0b24gY2xhc3NOYW1lPXtjc3MoeyAuLi5wcm9wcy5yb3RhdGVSaWdodFN0eWxlIH0pfT5cbiAgICAgICAgICAgIDxSb3RhdGVSaWdodEljb25cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBiZWFyaW5nID0gTWF0aC5yb3VuZChtYXBSZWYuY3VycmVudD8uZ2V0QmVhcmluZygpKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdCA9IE1hdGgucm91bmQoYmVhcmluZyAlIDkwKTtcbiAgICAgICAgICAgICAgICBpZiAoYmVhcmluZyA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlc3QgPSA5MCAtIHJlc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICByZXN0ID0gOTA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcFJlZi5jdXJyZW50Py5zZXRCZWFyaW5nKE1hdGgucm91bmQoYmVhcmluZyArIE1hdGguYWJzKHJlc3QpKSk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+PC9Sb3RhdGVSaWdodEljb24+XG4gICAgICAgICAgPC9Sb3RhdGVCdXR0b24+XG4gICAgICAgICAgPE5lZWRsZUJ1dHRvblxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjc3MoeyAuLi5wcm9wcy5uZWVkbGVTdHlsZSB9KX1cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgbWFwUmVmLmN1cnJlbnQ/LnNldEJlYXJpbmcoMCk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxOZWVkbGVDb250YWluZXJcbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFwicm90YXRlKFwiICsgYmVhcmluZyArIFwiZGVnKVwiLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8TmVlZGxlSWNvbiAvPlxuICAgICAgICAgICAgPC9OZWVkbGVDb250YWluZXI+XG4gICAgICAgICAgPC9OZWVkbGVCdXR0b24+XG4gICAgICAgICAgPFJvdGF0ZUJ1dHRvbiBjbGFzc05hbWU9e2Nzcyh7IC4uLnByb3BzLnJvdGF0ZUxlZnRTdHlsZSB9KX0+XG4gICAgICAgICAgICA8Um90YXRlTGVmdEljb25cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBiZWFyaW5nID0gTWF0aC5yb3VuZChtYXBSZWYuY3VycmVudD8uZ2V0QmVhcmluZygpKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdCA9IE1hdGgucm91bmQoYmVhcmluZyAlIDkwKTtcbiAgICAgICAgICAgICAgICBpZiAoYmVhcmluZyA8IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlc3QgPSA5MCArIHJlc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICByZXN0ID0gOTA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcFJlZi5jdXJyZW50Py5zZXRCZWFyaW5nKE1hdGgucm91bmQoYmVhcmluZyAtIE1hdGguYWJzKHJlc3QpKSk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+PC9Sb3RhdGVMZWZ0SWNvbj5cbiAgICAgICAgICA8L1JvdGF0ZUJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbk1sTmF2aWdhdGlvbkNvbXBhc3MucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQ29tcG9uZW50IGlkIHByZWZpeFxuICAgKi9cbiAgaWRQcmVmaXg6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiBTdHlsZSBvYmplY3QgdG8gYWRqdXN0IGNzcyBkZWZpbml0aW9ucyBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKlxuICAgKiBTdHlsZSBvYmplY3QgdG8gYWRqdXN0IGNzcyBkZWZpbml0aW9ucyBvZiB0aGUgYmFja2dyb3VuZC5cbiAgICovXG4gIGJhY2tncm91bmRTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqXG4gICAqIFN0eWxlIG9iamVjdCB0byBhZGp1c3QgY3NzIGRlZmluaXRpb25zIG9mIHRoZSBjb21wYXNzIG5lZWRsZS5cbiAgICovXG4gIG5lZWRsZVN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKipcbiAgICogU3R5bGUgb2JqZWN0IHRvIGFkanVzdCBjc3MgZGVmaW5pdGlvbnMgb2YgdGhlIHJvdGF0ZSByaWdodCBidXR0b24uXG4gICAqL1xuICByb3RhdGVSaWdodFN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKipcbiAgICogU3R5bGUgb2JqZWN0IHRvIGFkanVzdCBjc3MgZGVmaW5pdGlvbnMgb2YgdGhlIHJvdGF0ZSBsZWZ0IGJ1dHRvbi5cbiAgICovXG4gIHJvdGF0ZUxlZnRTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1sTmF2aWdhdGlvbkNvbXBhc3M7XG4iXX0= */",
1742
- toString: _EMOTION_STRINGIFIED_CSS_ERROR__
1743
- });
1711
+ var marker = "b556faa3bc6829d2.png";
1744
1712
 
1745
- var RotateButton = _styled("div", process.env.NODE_ENV === "production" ? {
1746
- target: "e12lzm5x0"
1747
- } : {
1748
- target: "e12lzm5x0",
1749
- label: "RotateButton"
1750
- })(process.env.NODE_ENV === "production" ? {
1751
- name: "1j4uu1m",
1752
- styles: "width:30%;margin-top:14px;z-index:999;display:flex;svg:hover{cursor:pointer;}svg:hover path{fill:#ececec;filter:drop-shadow(0px 0px 5px rgba(0, 0, 0, 0.1));}path{fill:#bbb;}svg{transform:scale(0.6);z-index:9990;height:172px;}"
1753
- } : {
1754
- name: "1j4uu1m",
1755
- styles: "width:30%;margin-top:14px;z-index:999;display:flex;svg:hover{cursor:pointer;}svg:hover path{fill:#ececec;filter:drop-shadow(0px 0px 5px rgba(0, 0, 0, 0.1));}path{fill:#bbb;}svg{transform:scale(0.6);z-index:9990;height:172px;}",
1756
- map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1sTmF2aWdhdGlvbkNvbXBhc3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMkQrQiIsImZpbGUiOiJNbE5hdmlnYXRpb25Db21wYXNzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuXG5pbXBvcnQgeyBNYXBDb250ZXh0IH0gZnJvbSBcIkBtYXBjb21wb25lbnRzL3JlYWN0LWNvcmVcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gXCJ1dWlkXCI7XG5cbmltcG9ydCB7IFJlYWN0Q29tcG9uZW50IGFzIFJvdGF0ZVJpZ2h0SWNvbiB9IGZyb20gXCIuL2Fzc2V0cy9yb3RhdGVfcmlnaHQuc3ZnXCI7XG5pbXBvcnQgeyBSZWFjdENvbXBvbmVudCBhcyBSb3RhdGVMZWZ0SWNvbiB9IGZyb20gXCIuL2Fzc2V0cy9yb3RhdGVfbGVmdC5zdmdcIjtcbmltcG9ydCB7IFJlYWN0Q29tcG9uZW50IGFzIE5lZWRsZUljb24gfSBmcm9tIFwiLi9hc3NldHMvbmVlZGxlLnN2Z1wiO1xuXG5pbXBvcnQgc3R5bGVkIGZyb20gXCJAZW1vdGlvbi9zdHlsZWRcIjtcbmltcG9ydCB7IGNzcyB9IGZyb20gXCJAZW1vdGlvbi9jc3NcIjtcblxuY29uc3QgTmVlZGxlQnV0dG9uID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6IDQwJTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAmOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbiAgcGF0aCB7XG4gICAgZmlsdGVyOiBkcm9wLXNoYWRvdygwcHggMHB4IDE1cHggcmdiYSgwLCAwLCAwLCAwLjIpKTtcbiAgfVxuICAmOmhvdmVyIHBhdGgge1xuICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMHB4IDBweCAxM3B4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSk7XG4gIH1cbiAgcGF0aDpudGgtb2YtdHlwZSgyKSB7XG4gICAgZmlsbDogIzM0MzQzNDtcbiAgfVxuICAmOmhvdmVyIHBhdGg6bnRoLW9mLXR5cGUoMikge1xuICAgIGZpbGw6ICM0MzQzNDM7XG4gIH1cbiAgcGF0aDpudGgtb2YtdHlwZSgxKSB7XG4gICAgZmlsbDogI2U5MDMxODtcbiAgfVxuICAmOmhvdmVyIHBhdGg6bnRoLW9mLXR5cGUoMSkge1xuICAgIGZpbGw6ICNmYjQwNTI7XG4gIH1cbmA7XG5jb25zdCBOZWVkbGVDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgZGlzcGxheTogZmxleDtcbiAgei1pbmRleDogMTAwMjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuXG4gIG1hcmdpbi1sZWZ0OiAtMzAlO1xuICBwYXRoOm50aC1vZi10eXBlKDIpIHtcbiAgfVxuICBzdmcgZyB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTc2LjcwNTMsIC0yOS43NzI3KSBzY2FsZSgyLCAxKTtcbiAgfVxuICBzdmcge1xuICAgIHotaW5kZXg6IDk5OTA7XG4gICAgaGVpZ2h0OiAxNTBweDtcbiAgICB3aWR0aDogMjAwcHg7XG4gIH1cbmA7XG5jb25zdCBSb3RhdGVCdXR0b24gPSBzdHlsZWQuZGl2YFxuICB3aWR0aDogMzAlO1xuICBtYXJnaW4tdG9wOiAxNHB4O1xuICB6LWluZGV4OiA5OTk7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgc3ZnOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbiAgc3ZnOmhvdmVyIHBhdGgge1xuICAgIGZpbGw6ICNlY2VjZWM7XG4gICAgZmlsdGVyOiBkcm9wLXNoYWRvdygwcHggMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMSkpO1xuICB9XG4gIHBhdGgge1xuICAgIGZpbGw6ICNiYmI7XG4gIH1cbiAgc3ZnIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNik7XG4gICAgei1pbmRleDogOTk5MDtcbiAgICBoZWlnaHQ6IDE3MnB4O1xuICB9XG5gO1xuXG4vKipcbiAqIE5hdmlnYXRpb24gY29tcG9uZW50IHRoYXQgZGlzcGxheXMgYSBjb21wYXNzIGNvbXBvbmVudCB3aGljaCBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgb3JpYW50YXRpb24gb2YgdGhlIG1hcCBpdCBpcyByZWdpc3RlcmVkIGZvciBhbmQgb2ZmZXJzIGNvbnRyb2xzIHRvIHR1cm4gdGhlIGJlYXJpbmcgOTDCsCBsZWZ0L3JpZ2h0IG9yIHJlc2V0IG5vcnRoIHRvIHBvaW50IHVwLlxuICpcbiAqIEFsbCBzdHlsZSBwcm9wcyBhcmUgYXBwbGllZCB1c2luZyBAZW1vdGlvbi9jc3MgdG8gYWxsb3cgbW9yZSBjb21wbGV4IGNzcyBzZWxlY3RvcnMuXG4gKlxuICogQGNvbXBvbmVudFxuICovXG5jb25zdCBNbE5hdmlnYXRpb25Db21wYXNzID0gKHByb3BzKSA9PiB7XG4gIC8vIFVzZSBhIHVzZVJlZiBob29rIHRvIHJlZmVyZW5jZSB0aGUgbGF5ZXIgb2JqZWN0IHRvIGJlIGFibGUgdG8gYWNjZXNzIGl0IGxhdGVyIGluc2lkZSB1c2VFZmZlY3QgaG9va3NcbiAgY29uc3QgbWFwQ29udGV4dCA9IHVzZUNvbnRleHQoTWFwQ29udGV4dCk7XG5cbiAgY29uc3QgaW5pdGlhbGl6ZWRSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCBtYXBSZWYgPSB1c2VSZWYodW5kZWZpbmVkKTtcbiAgY29uc3QgY29tcG9uZW50SWQgPSB1c2VSZWYoKHByb3BzLmlkUHJlZml4ID8gcHJvcHMuaWRQcmVmaXggOiBcIk1sTmF2aWdhdGlvbkNvbXBhc3MtXCIpICsgdXVpZHY0KCkpO1xuXG4gIGNvbnN0IFtiZWFyaW5nLCBzZXRCZWFyaW5nXSA9IHVzZVN0YXRlKDApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IF9jb21wb25lbnRJZCA9IGNvbXBvbmVudElkLmN1cnJlbnQ7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgY2xlYW51cCBmdW5jdGlvbiwgaXQgaXMgY2FsbGVkIHdoZW4gdGhpcyByZWFjdCBjb21wb25lbnQgaXMgcmVtb3ZlZCBmcm9tIHJlYWN0LWRvbVxuXG4gICAgICBpZiAobWFwUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgbWFwUmVmLmN1cnJlbnQuY2xlYW51cChfY29tcG9uZW50SWQpO1xuICAgICAgICBtYXBSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGluaXRpYWxpemVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIW1hcENvbnRleHQubWFwRXhpc3RzKHByb3BzLm1hcElkKSB8fCBpbml0aWFsaXplZFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgaW5pdGlhbGl6ZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgbWFwUmVmLmN1cnJlbnQgPSBtYXBDb250ZXh0LmdldE1hcChwcm9wcy5tYXBJZCk7XG5cbiAgICBtYXBSZWYuY3VycmVudC5vbihcbiAgICAgIFwicm90YXRlXCIsXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldEJlYXJpbmcoTWF0aC5yb3VuZChtYXBSZWYuY3VycmVudC5nZXRCZWFyaW5nKCkpKTtcbiAgICAgIH0sXG4gICAgICBjb21wb25lbnRJZC5jdXJyZW50XG4gICAgKTtcbiAgICBzZXRCZWFyaW5nKE1hdGgucm91bmQobWFwUmVmLmN1cnJlbnQuZ2V0QmVhcmluZygpKSk7XG4gIH0sIFttYXBDb250ZXh0Lm1hcElkcywgbWFwQ29udGV4dCwgcHJvcHMubWFwSWRdKTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17Y3NzKHtcbiAgICAgICAgICB6SW5kZXg6IDEwMDAsXG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgLi4ucHJvcHMuc3R5bGUsXG4gICAgICAgIH0pfVxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPXtjc3Moe1xuICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgIGJvcmRlcjogXCIxMHB4IHNvbGlkICNiY2JjYmNcIixcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjNzE3MTcxXCIsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBcInJhZGlhbC1ncmFkaWVudCgjNzE3MTcxLCAjNDE0MTQxKVwiLFxuICAgICAgICAgICAgaGVpZ2h0OiBcIjIwMHB4XCIsXG4gICAgICAgICAgICB3aWR0aDogXCIyMDBweFwiLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjUwJVwiLFxuICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIHRyYW5zZm9ybTogXCJzY2FsZSgwLjIpIHRyYW5zbGF0ZVgoLTQ0OHB4KSB0cmFuc2xhdGVZKC00NDhweClcIixcbiAgICAgICAgICAgIC4uLnByb3BzLmJhY2tncm91bmRTdHlsZSxcbiAgICAgICAgICB9KX1cbiAgICAgICAgPlxuICAgICAgICAgIDxSb3RhdGVCdXR0b24gY2xhc3NOYW1lPXtjc3MoeyAuLi5wcm9wcy5yb3RhdGVSaWdodFN0eWxlIH0pfT5cbiAgICAgICAgICAgIDxSb3RhdGVSaWdodEljb25cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBiZWFyaW5nID0gTWF0aC5yb3VuZChtYXBSZWYuY3VycmVudD8uZ2V0QmVhcmluZygpKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdCA9IE1hdGgucm91bmQoYmVhcmluZyAlIDkwKTtcbiAgICAgICAgICAgICAgICBpZiAoYmVhcmluZyA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlc3QgPSA5MCAtIHJlc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICByZXN0ID0gOTA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcFJlZi5jdXJyZW50Py5zZXRCZWFyaW5nKE1hdGgucm91bmQoYmVhcmluZyArIE1hdGguYWJzKHJlc3QpKSk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+PC9Sb3RhdGVSaWdodEljb24+XG4gICAgICAgICAgPC9Sb3RhdGVCdXR0b24+XG4gICAgICAgICAgPE5lZWRsZUJ1dHRvblxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjc3MoeyAuLi5wcm9wcy5uZWVkbGVTdHlsZSB9KX1cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgbWFwUmVmLmN1cnJlbnQ/LnNldEJlYXJpbmcoMCk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxOZWVkbGVDb250YWluZXJcbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFwicm90YXRlKFwiICsgYmVhcmluZyArIFwiZGVnKVwiLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8TmVlZGxlSWNvbiAvPlxuICAgICAgICAgICAgPC9OZWVkbGVDb250YWluZXI+XG4gICAgICAgICAgPC9OZWVkbGVCdXR0b24+XG4gICAgICAgICAgPFJvdGF0ZUJ1dHRvbiBjbGFzc05hbWU9e2Nzcyh7IC4uLnByb3BzLnJvdGF0ZUxlZnRTdHlsZSB9KX0+XG4gICAgICAgICAgICA8Um90YXRlTGVmdEljb25cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBiZWFyaW5nID0gTWF0aC5yb3VuZChtYXBSZWYuY3VycmVudD8uZ2V0QmVhcmluZygpKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdCA9IE1hdGgucm91bmQoYmVhcmluZyAlIDkwKTtcbiAgICAgICAgICAgICAgICBpZiAoYmVhcmluZyA8IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlc3QgPSA5MCArIHJlc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICByZXN0ID0gOTA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcFJlZi5jdXJyZW50Py5zZXRCZWFyaW5nKE1hdGgucm91bmQoYmVhcmluZyAtIE1hdGguYWJzKHJlc3QpKSk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+PC9Sb3RhdGVMZWZ0SWNvbj5cbiAgICAgICAgICA8L1JvdGF0ZUJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbk1sTmF2aWdhdGlvbkNvbXBhc3MucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQ29tcG9uZW50IGlkIHByZWZpeFxuICAgKi9cbiAgaWRQcmVmaXg6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiBTdHlsZSBvYmplY3QgdG8gYWRqdXN0IGNzcyBkZWZpbml0aW9ucyBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKlxuICAgKiBTdHlsZSBvYmplY3QgdG8gYWRqdXN0IGNzcyBkZWZpbml0aW9ucyBvZiB0aGUgYmFja2dyb3VuZC5cbiAgICovXG4gIGJhY2tncm91bmRTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqXG4gICAqIFN0eWxlIG9iamVjdCB0byBhZGp1c3QgY3NzIGRlZmluaXRpb25zIG9mIHRoZSBjb21wYXNzIG5lZWRsZS5cbiAgICovXG4gIG5lZWRsZVN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKipcbiAgICogU3R5bGUgb2JqZWN0IHRvIGFkanVzdCBjc3MgZGVmaW5pdGlvbnMgb2YgdGhlIHJvdGF0ZSByaWdodCBidXR0b24uXG4gICAqL1xuICByb3RhdGVSaWdodFN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKipcbiAgICogU3R5bGUgb2JqZWN0IHRvIGFkanVzdCBjc3MgZGVmaW5pdGlvbnMgb2YgdGhlIHJvdGF0ZSBsZWZ0IGJ1dHRvbi5cbiAgICovXG4gIHJvdGF0ZUxlZnRTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1sTmF2aWdhdGlvbkNvbXBhc3M7XG4iXX0= */",
1757
- toString: _EMOTION_STRINGIFIED_CSS_ERROR__
1758
- });
1759
1713
  /**
1760
- * Navigation component that displays a compass component which indicates the current oriantation of the map it is registered for and offers controls to turn the bearing 90° left/right or reset north to point up.
1714
+ * Adds a button that makes the map follow the users GPS position using
1715
+ * navigator.geolocation.watchPosition if activated
1761
1716
  *
1762
- * All style props are applied using @emotion/css to allow more complex css selectors.
1717
+ * @param {object} props
1718
+ * @param {string} props.mapId Id of the target MapLibre instance in mapContext
1763
1719
  *
1764
1720
  * @component
1765
1721
  */
1766
1722
 
1767
-
1768
- var MlNavigationCompass = function MlNavigationCompass(props) {
1723
+ var MlFollowGps = function MlFollowGps(props) {
1769
1724
  // Use a useRef hook to reference the layer object to be able to access it later inside useEffect hooks
1770
1725
  var mapContext = useContext(MapContext);
1726
+
1727
+ var _useState = useState(false),
1728
+ _useState2 = _slicedToArray(_useState, 2),
1729
+ isFollowed = _useState2[0],
1730
+ setIsFollowed = _useState2[1];
1731
+
1732
+ var _useState3 = useState(undefined),
1733
+ _useState4 = _slicedToArray(_useState3, 2),
1734
+ geoJson = _useState4[0],
1735
+ setGeoJson = _useState4[1];
1736
+
1737
+ var watchIdRef = useRef(undefined);
1738
+
1739
+ var _useState5 = useState(false),
1740
+ _useState6 = _slicedToArray(_useState5, 2),
1741
+ locationAccessDenied = _useState6[0],
1742
+ setLocationAccessDenied = _useState6[1];
1743
+
1771
1744
  var initializedRef = useRef(false);
1772
1745
  var mapRef = useRef(undefined);
1773
- var componentId = useRef((props.idPrefix ? props.idPrefix : "MlNavigationCompass-") + v4());
1746
+ var componentId = useRef((props.idPrefix ? props.idPrefix : "MlFollowGps-") + v4());
1774
1747
 
1775
- var _useState = useState(0),
1776
- _useState2 = _slicedToArray(_useState, 2),
1777
- bearing = _useState2[0],
1778
- setBearing = _useState2[1];
1748
+ var _useState7 = useState(),
1749
+ _useState8 = _slicedToArray(_useState7, 2),
1750
+ accuracyGeoJson = _useState8[0],
1751
+ setAccuracyGeoJson = _useState8[1];
1779
1752
 
1780
1753
  useEffect(function () {
1781
1754
  var _componentId = componentId.current;
1782
1755
  return function () {
1783
1756
  // This is the cleanup function, it is called when this react component is removed from react-dom
1757
+ // try to remove anything this component has added to the MapLibre-gl instance
1758
+ // e.g.: remove the layer
1759
+ // mapContext.getMap(props.mapId).removeLayer(layerRef.current);
1760
+ // check for the existence of map.style before calling getLayer or getSource
1784
1761
  if (mapRef.current) {
1785
1762
  mapRef.current.cleanup(_componentId);
1786
1763
  mapRef.current = undefined;
1787
1764
  }
1788
1765
 
1789
- initializedRef.current = false;
1766
+ if (watchIdRef.current) {
1767
+ initializedRef.current = false;
1768
+ navigator.geolocation.clearWatch(watchIdRef.current);
1769
+ watchIdRef.current = undefined;
1770
+ }
1790
1771
  };
1791
1772
  }, []);
1792
1773
  useEffect(function () {
1793
- if (!mapContext.mapExists(props.mapId) || initializedRef.current) return;
1774
+ if (!mapContext.mapExists(props.mapId) || initializedRef.current) return; // the MapLibre-gl instance (mapContext.getMap(props.mapId)) is accessible here
1775
+ // initialize the layer and add it to the MapLibre-gl instance or do something else with it
1776
+
1794
1777
  initializedRef.current = true;
1795
1778
  mapRef.current = mapContext.getMap(props.mapId);
1796
- mapRef.current.on("rotate", function () {
1797
- setBearing(Math.round(mapRef.current.getBearing()));
1798
- }, componentId.current);
1799
- setBearing(Math.round(mapRef.current.getBearing()));
1779
+ mapRef.current.setCenter([7.132122000552613, 50.716405378037706]);
1800
1780
  }, [mapContext.mapIds, mapContext, props.mapId]);
1801
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("div", {
1802
- className: /*#__PURE__*/css(_objectSpread2({
1803
- zIndex: 1000,
1804
- top: 0,
1781
+
1782
+ var getLocationSuccess = function getLocationSuccess(pos) {
1783
+ if (!mapRef.current) return;
1784
+ mapRef.current.setCenter([pos.coords.longitude, pos.coords.latitude]);
1785
+ var geoJsonPoint = point([pos.coords.longitude, pos.coords.latitude]);
1786
+ setGeoJson(geoJsonPoint);
1787
+ setAccuracyGeoJson(circle(geoJsonPoint, pos.coords.accuracy / 1000));
1788
+ };
1789
+
1790
+ var getLocationError = function getLocationError(err) {
1791
+ console.log("Access of user location denied");
1792
+ setLocationAccessDenied(true);
1793
+ };
1794
+
1795
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, isFollowed && geoJson && /*#__PURE__*/React__default.createElement(MlGeoJsonLayer, {
1796
+ geojson: accuracyGeoJson,
1797
+ type: "fill",
1798
+ paint: {
1799
+ "fill-color": "#ee7700",
1800
+ "fill-opacity": 0.5
1801
+ },
1802
+ insertBeforeLayer: "MlFollowGpsMarker"
1803
+ }), isFollowed && geoJson && /*#__PURE__*/React__default.createElement(MlImageMarkerLayer, {
1804
+ layerId: "MlFollowGpsMarker",
1805
+ options: {
1806
+ type: "symbol",
1807
+ source: {
1808
+ type: "geojson",
1809
+ data: geoJson
1810
+ },
1811
+ layout: {
1812
+ "icon-size": 0.1,
1813
+ "icon-offset": [0, -340]
1814
+ }
1815
+ },
1816
+ imgSrc: marker
1817
+ }), /*#__PURE__*/React__default.createElement(Button, {
1818
+ sx: _objectSpread2({
1819
+ zIndex: 1002,
1820
+ color: isFollowed ? props.onColor : props.offColor
1821
+ }, props.style),
1822
+ disabled: locationAccessDenied,
1823
+ onClick: function onClick() {
1824
+ if (isFollowed) {
1825
+ navigator.geolocation.clearWatch(watchIdRef.current);
1826
+ } else {
1827
+ watchIdRef.current = navigator.geolocation.watchPosition(getLocationSuccess, getLocationError);
1828
+ }
1829
+
1830
+ setIsFollowed(!isFollowed);
1831
+ }
1832
+ }, " ", /*#__PURE__*/React__default.createElement(RoomIcon, {
1833
+ sx: {
1834
+ fontSize: props.style.fontSize
1835
+ }
1836
+ }), " "));
1837
+ };
1838
+
1839
+ MlFollowGps.defaultProps = {
1840
+ mapId: undefined,
1841
+ style: {
1842
+ minWidth: "30px",
1843
+ minHeight: "30px",
1844
+ width: "30px",
1845
+ height: "30px",
1846
+ backgroundColor: "#414141",
1847
+ borderRadius: "23%",
1848
+ margin: 0.15,
1849
+ fontSize: "1.3em",
1850
+ ":hover": {
1851
+ backgroundColor: "#515151",
1852
+ color: "#ececec"
1853
+ }
1854
+ },
1855
+ onColor: "#ececec",
1856
+ offColor: "#666"
1857
+ };
1858
+ MlFollowGps.propTypes = {
1859
+ /**
1860
+ * Id of the target MapLibre instance in mapContext
1861
+ */
1862
+ mapId: PropTypes.string,
1863
+
1864
+ /**
1865
+ * CSS style object that is applied to the button component
1866
+ */
1867
+ style: PropTypes.object,
1868
+
1869
+ /**
1870
+ * Active button font color
1871
+ */
1872
+ onColor: PropTypes.string,
1873
+
1874
+ /**
1875
+ * Inactive button font color
1876
+ */
1877
+ offColor: PropTypes.string
1878
+ };
1879
+
1880
+ var nmMap = {
1881
+ street: ["footway", "street", "road", "street_name", "residential", "path", "pedestrian", "road_reference", "road_reference_intl", "square", "place"],
1882
+ number: ["house_number", "street_number"],
1883
+ place: ["city", "village", "hamlet", "locality", "croft", "neighbourhood", "suburb", "city_district", "district", "quarter", "borough", "city_block", "residential", "commercial", "industrial", "houses", "subdivision", "allotments", "postal_city", "town", "municipality", "local_administrative_area"],
1884
+ zip: ["postcode", "partial_postcode"],
1885
+ state: ["state", "province", "state_code"]
1886
+ };
1887
+
1888
+ var nmConverter = function nmConverter(nmAddress) {
1889
+ var addressArr = [];
1890
+
1891
+ for (var key in nmMap) {
1892
+ nmMap[key].some(function (element) {
1893
+ if (nmAddress.hasOwnProperty(element)) {
1894
+ addressArr.push(nmAddress[element]);
1895
+ return true;
1896
+ }
1897
+
1898
+ return false;
1899
+ });
1900
+ }
1901
+
1902
+ return addressArr.join(", ");
1903
+ };
1904
+
1905
+ var toPixels = function toPixels(length) {
1906
+ var conversionFactor = 96;
1907
+ conversionFactor /= 25.4;
1908
+ return conversionFactor * length + "px";
1909
+ };
1910
+
1911
+ var createPdf = function createPdf(map, locationValue, setLoading) {
1912
+ setLoading(true);
1913
+ var width = 210;
1914
+ var height = 297; // Calculate pixel ratio
1915
+
1916
+ var actualPixelRatio = window.devicePixelRatio; // Create map container
1917
+
1918
+ var hidden = document.createElement("div");
1919
+ hidden.className = "hidden-map";
1920
+ document.body.appendChild(hidden);
1921
+ var container = document.createElement("div");
1922
+ container.style.width = toPixels(width);
1923
+ container.style.height = toPixels(height);
1924
+ hidden.appendChild(container); //Render map
1925
+
1926
+ var renderMap = new maplibregl$1.Map({
1927
+ container: container,
1928
+ center: map.getCenter(),
1929
+ zoom: map.getZoom(),
1930
+ bearing: map.getBearing(),
1931
+ pitch: map.getPitch(),
1932
+ interactive: false,
1933
+ preserveDrawingBuffer: true,
1934
+ fadeDuration: 0,
1935
+ attributionControl: false
1936
+ });
1937
+ var style = map.getStyle();
1938
+
1939
+ var _loop = function _loop(name) {
1940
+ var src = style.sources[name];
1941
+ Object.keys(src).forEach(function (key) {
1942
+ //delete properties if value is undefined.
1943
+ // for instance, raster-dem might has undefined value in "url" and "bounds"
1944
+ if (!src[key]) {
1945
+ delete src[key];
1946
+ }
1947
+ });
1948
+ };
1949
+
1950
+ for (var name in style.sources) {
1951
+ _loop(name);
1952
+ }
1953
+
1954
+ renderMap.setStyle(style);
1955
+ renderMap.once("idle", function () {
1956
+ var _hidden$parentNode;
1957
+
1958
+ // TO DO: It is still under development
1959
+ var pdf = new jsPDF({
1960
+ orientation: "p",
1961
+ unit: "mm",
1962
+ compress: true
1963
+ });
1964
+ Object.defineProperty(window, "devicePixelRatio", {
1965
+ get: function get() {
1966
+ return 300 / 96;
1967
+ }
1968
+ });
1969
+ var offsetX = 2.5;
1970
+ var offsetY = 2.5;
1971
+ var marginTop = 3;
1972
+ var marginBottom = 3;
1973
+ var innerMargin = 2;
1974
+ var logo = "data:image/png;base64,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";
1975
+ var textBuffer = 1;
1976
+ var lineHeight = 3.25;
1977
+ var text = locationValue ? nmConverter(locationValue.address) : "";
1978
+ var textChunksSeperator = text.split(",");
1979
+ var textChunks = [];
1980
+
1981
+ if (textChunks.length) {
1982
+ textChunksSeperator.forEach(function (chunk) {
1983
+ var limitChunks = chunk.match(/.{1,34}/g);
1984
+ textChunks.push.apply(textChunks, _toConsumableArray(limitChunks));
1985
+ });
1986
+ } //Render map image
1987
+
1988
+
1989
+ pdf.addImage(renderMap.getCanvas().toDataURL("image/png"), "png", 0, 0, 210, 297, null, "FAST"); //Render lower left Copyright box
1990
+
1991
+ pdf.setFillColor("white");
1992
+ pdf.rect(138, 287, 297, 10, "F");
1993
+ pdf.setFontSize(10); // optional
1994
+
1995
+ pdf.text("Datenquelle: © OpenStreetMap-Mitwirkende", 140, pdf.internal.pageSize.height - 3); //Render infobox
1996
+
1997
+ pdf.setFillColor("white");
1998
+ var infoBoxSize = textChunks.length * lineHeight + marginTop + marginBottom + lineHeight * 2 + innerMargin * 2 + textBuffer;
1999
+ pdf.rect(offsetX, 2, 66.5, infoBoxSize, "F");
2000
+ pdf.setFontSize(10);
2001
+ pdf.text("Karten PDF:", 6, offsetY + marginTop); //Render inner infobox
2002
+
2003
+ pdf.rect(6, 7, 60, textChunks.length * lineHeight + innerMargin * 2 + textBuffer);
2004
+ pdf.setFontSize(10); //Write out address
2005
+
2006
+ textChunks.forEach(function (text, i) {
2007
+ pdf.text(text.trim(), 8, 10 + i * 3.5 + innerMargin);
2008
+ }); //Add WG Logo
2009
+
2010
+ pdf.addImage(logo, "png", 5, offsetY + marginTop + lineHeight * 2 + textChunks.length * 3 + innerMargin * 2, 3, 3, null, "FAST"); //Add WG Url
2011
+
2012
+ pdf.setFontSize(10);
2013
+ pdf.text("wheregroup.com", 40, offsetY + marginTop + lineHeight * 2 + textChunks.length * lineHeight + innerMargin * 2 + textBuffer); //Set pdfs props
2014
+
2015
+ pdf.setProperties({
2016
+ title: "Map export",
2017
+ subject: "Map export",
2018
+ creator: "WhereGroup GmbH",
2019
+ author: "(c)WhereGroup GmbH, (c)OpenStreetMap"
2020
+ });
2021
+ pdf.save("Map.pdf");
2022
+ renderMap.remove();
2023
+ (_hidden$parentNode = hidden.parentNode) === null || _hidden$parentNode === void 0 ? void 0 : _hidden$parentNode.removeChild(hidden);
2024
+ Object.defineProperty(window, "devicePixelRatio", {
2025
+ get: function get() {
2026
+ return actualPixelRatio;
2027
+ }
2028
+ });
2029
+ setLoading(false);
2030
+ });
2031
+ };
2032
+
2033
+ /**
2034
+ * Renders a button that will create a PDF version of the current map view (dimensions adjusted to fit Din A4 Paper).
2035
+ *
2036
+ * @component
2037
+ */
2038
+
2039
+ var MlCreatePdfButton = function MlCreatePdfButton(props) {
2040
+ var mapContext = useContext(MapContext);
2041
+ var initializedRef = useRef(false);
2042
+ var mapRef = useRef(undefined);
2043
+ useEffect(function () {
2044
+ if (!mapContext.mapExists(props.mapId) || initializedRef.current) return;
2045
+ initializedRef.current = true;
2046
+ mapRef.current = mapContext.getMap(props.mapId);
2047
+ }, [mapContext.mapIds, mapContext, props.mapId]);
2048
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Button, {
2049
+ color: "primary",
2050
+ variant: "contained",
2051
+ onClick: function onClick() {
2052
+ createPdf(mapRef.current, null, function () {});
2053
+ }
2054
+ }, /*#__PURE__*/React__default.createElement(PrinterIcon, null)));
2055
+ };
2056
+
2057
+ MlCreatePdfButton.defaultProps = {
2058
+ mapId: undefined
2059
+ };
2060
+ MlCreatePdfButton.propTypes = {
2061
+ /**
2062
+ * Id of the target MapLibre instance in mapContext
2063
+ */
2064
+ mapId: PropTypes.string
2065
+ };
2066
+
2067
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2068
+
2069
+ function SvgRotateRight(props) {
2070
+ return /*#__PURE__*/createElement("svg", _extends({
2071
+ width: "39.675098mm",
2072
+ height: "104.27064mm",
2073
+ viewBox: "0 0 39.675098 104.27064"
2074
+ }, props), /*#__PURE__*/createElement("g", {
2075
+ transform: "translate(-86.019554,-58.032633)"
2076
+ }, /*#__PURE__*/createElement("path", {
2077
+ style: {
2078
+ strokeWidth: 0.744756
2079
+ },
2080
+ d: "m 442.74023,219.33594 -117.62695,32.32422 54.71094,31.12304 c -21.99397,41.5931 -32.8507,84.88283 -38.33008,127.89649 -6.86182,50.94051 -5.95715,103.99765 20.23828,155.46484 5.97246,11.72776 13.65817,23.59773 24.38867,35.06641 2.6597,2.84073 5.65602,5.75455 9.12891,8.68164 0.87557,0.7378 1.85363,1.52609 2.95117,2.35547 0.29669,0.22563 0.63616,0.47742 1.02149,0.75586 l 0.58203,0.42578 34.57812,-15.12305 -0.33789,-0.2207 c -0.0265,-0.0151 -0.0842,-0.0587 -0.18359,-0.13086 -0.46723,-0.34885 -0.9819,-0.76796 -1.56055,-1.25 -2.29757,-1.91343 -4.46539,-4.04643 -6.64062,-6.33985 -8.80052,-9.27114 -15.30333,-19.4993 -20.83985,-30.13867 -24.42289,-46.90715 -24.77465,-97.03535 -18.58008,-146.68164 4.94388,-37.37493 13.65299,-74.4847 30.20508,-109.92969 l 58.6211,33.34766 z",
2081
+ transform: "scale(0.26458333)"
2082
+ })));
2083
+ }
2084
+
2085
+ var _g;
2086
+
2087
+ function _extends$1() { _extends$1 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$1.apply(this, arguments); }
2088
+
2089
+ function SvgRotateLeft(props) {
2090
+ return /*#__PURE__*/createElement("svg", _extends$1({
2091
+ width: "39.675098mm",
2092
+ height: "104.27064mm",
2093
+ viewBox: "0 0 39.675098 104.27064"
2094
+ }, props), _g || (_g = /*#__PURE__*/createElement("g", {
2095
+ transform: "translate(-86.019554,-58.032633)"
2096
+ }, /*#__PURE__*/createElement("path", {
2097
+ d: "m 94.572523,58.032633 31.122127,8.55245 -14.4756,8.234638 c 5.81924,11.004841 8.69175,22.458582 10.1415,33.839279 1.81552,13.47801 1.57616,27.51604 -5.35471,41.13341 -1.58021,3.10296 -3.61373,6.24356 -6.45284,9.27798 -0.70371,0.75161 -1.49649,1.52256 -2.41535,2.29702 -0.23167,0.19521 -0.49044,0.40378 -0.78083,0.62322 -0.0785,0.0597 -0.16832,0.12632 -0.27027,0.19999 l -0.154,0.11265 -9.148793,-4.00131 0.0894,-0.0584 c 0.007,-0.004 0.02228,-0.0155 0.04857,-0.0346 0.123621,-0.0923 0.259794,-0.20319 0.412895,-0.33073 0.607899,-0.50626 1.181468,-1.07062 1.756997,-1.67742 2.328481,-2.45299 4.049011,-5.15919 5.513881,-7.97419 6.46189,-12.41085 6.55496,-25.67394 4.91598,-38.80952 -1.30807,-9.888781 -3.61235,-19.707408 -7.99176,-29.085561 l -15.510171,8.823235 z"
2098
+ }))));
2099
+ }
2100
+
2101
+ var _g$1;
2102
+
2103
+ function _extends$2() { _extends$2 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$2.apply(this, arguments); }
2104
+
2105
+ function SvgNeedle(props) {
2106
+ return /*#__PURE__*/createElement("svg", _extends$2({
2107
+ width: "75.967445mm",
2108
+ height: "234.71339mm",
2109
+ viewBox: "0 0 75.967445 234.71339"
2110
+ }, props), _g$1 || (_g$1 = /*#__PURE__*/createElement("g", {
2111
+ transform: "translate(-76.705281,-29.77268)"
2112
+ }, /*#__PURE__*/createElement("path", {
2113
+ d: "m 114.68901,29.77268 37.98372,117.3567 H 76.705281 Z"
2114
+ }), /*#__PURE__*/createElement("path", {
2115
+ d: "m 114.68901,264.48608 37.98372,-117.3567 H 76.705281 Z"
2116
+ }))));
2117
+ }
2118
+
2119
+ function _EMOTION_STRINGIFIED_CSS_ERROR__() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
2120
+
2121
+ var NeedleButton = _styled("div", process.env.NODE_ENV === "production" ? {
2122
+ target: "e12lzm5x2"
2123
+ } : {
2124
+ target: "e12lzm5x2",
2125
+ label: "NeedleButton"
2126
+ })(process.env.NODE_ENV === "production" ? {
2127
+ name: "1204o9",
2128
+ styles: "width:40%;display:flex;align-items:center;&:hover{cursor:pointer;}path{filter:drop-shadow(0px 0px 15px rgba(0, 0, 0, 0.2));}&:hover path{filter:drop-shadow(0px 0px 13px rgba(255, 255, 255, 0.1));}path:nth-of-type(2){fill:#343434;}&:hover path:nth-of-type(2){fill:#434343;}path:nth-of-type(1){fill:#e90318;}&:hover path:nth-of-type(1){fill:#fb4052;}"
2129
+ } : {
2130
+ name: "1204o9",
2131
+ styles: "width:40%;display:flex;align-items:center;&:hover{cursor:pointer;}path{filter:drop-shadow(0px 0px 15px rgba(0, 0, 0, 0.2));}&:hover path{filter:drop-shadow(0px 0px 13px rgba(255, 255, 255, 0.1));}path:nth-of-type(2){fill:#343434;}&:hover path:nth-of-type(2){fill:#434343;}path:nth-of-type(1){fill:#e90318;}&:hover path:nth-of-type(1){fill:#fb4052;}",
2132
+ map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1sTmF2aWdhdGlvbkNvbXBhc3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBYStCIiwiZmlsZSI6Ik1sTmF2aWdhdGlvbkNvbXBhc3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZVJlZiwgdXNlRWZmZWN0LCB1c2VDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5cbmltcG9ydCB7IE1hcENvbnRleHQgfSBmcm9tIFwiQG1hcGNvbXBvbmVudHMvcmVhY3QtY29yZVwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSBcInV1aWRcIjtcblxuaW1wb3J0IHsgUmVhY3RDb21wb25lbnQgYXMgUm90YXRlUmlnaHRJY29uIH0gZnJvbSBcIi4vYXNzZXRzL3JvdGF0ZV9yaWdodC5zdmdcIjtcbmltcG9ydCB7IFJlYWN0Q29tcG9uZW50IGFzIFJvdGF0ZUxlZnRJY29uIH0gZnJvbSBcIi4vYXNzZXRzL3JvdGF0ZV9sZWZ0LnN2Z1wiO1xuaW1wb3J0IHsgUmVhY3RDb21wb25lbnQgYXMgTmVlZGxlSWNvbiB9IGZyb20gXCIuL2Fzc2V0cy9uZWVkbGUuc3ZnXCI7XG5cbmltcG9ydCBzdHlsZWQgZnJvbSBcIkBlbW90aW9uL3N0eWxlZFwiO1xuaW1wb3J0IHsgY3NzIH0gZnJvbSBcIkBlbW90aW9uL2Nzc1wiO1xuXG5jb25zdCBOZWVkbGVCdXR0b24gPSBzdHlsZWQuZGl2YFxuICB3aWR0aDogNDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuXG4gICY6aG92ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuICBwYXRoIHtcbiAgICBmaWx0ZXI6IGRyb3Atc2hhZG93KDBweCAwcHggMTVweCByZ2JhKDAsIDAsIDAsIDAuMikpO1xuICB9XG4gICY6aG92ZXIgcGF0aCB7XG4gICAgZmlsdGVyOiBkcm9wLXNoYWRvdygwcHggMHB4IDEzcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpKTtcbiAgfVxuICBwYXRoOm50aC1vZi10eXBlKDIpIHtcbiAgICBmaWxsOiAjMzQzNDM0O1xuICB9XG4gICY6aG92ZXIgcGF0aDpudGgtb2YtdHlwZSgyKSB7XG4gICAgZmlsbDogIzQzNDM0MztcbiAgfVxuICBwYXRoOm50aC1vZi10eXBlKDEpIHtcbiAgICBmaWxsOiAjZTkwMzE4O1xuICB9XG4gICY6aG92ZXIgcGF0aDpudGgtb2YtdHlwZSgxKSB7XG4gICAgZmlsbDogI2ZiNDA1MjtcbiAgfVxuYDtcbmNvbnN0IE5lZWRsZUNvbnRhaW5lciA9IHN0eWxlZC5kaXZgXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBkaXNwbGF5OiBmbGV4O1xuICB6LWluZGV4OiAxMDAyO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cbiAgbWFyZ2luLWxlZnQ6IC0zMCU7XG4gIHBhdGg6bnRoLW9mLXR5cGUoMikge1xuICB9XG4gIHN2ZyBnIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNzYuNzA1MywgLTI5Ljc3MjcpIHNjYWxlKDIsIDEpO1xuICB9XG4gIHN2ZyB7XG4gICAgei1pbmRleDogOTk5MDtcbiAgICBoZWlnaHQ6IDE1MHB4O1xuICAgIHdpZHRoOiAyMDBweDtcbiAgfVxuYDtcbmNvbnN0IFJvdGF0ZUJ1dHRvbiA9IHN0eWxlZC5kaXZgXG4gIHdpZHRoOiAzMCU7XG4gIG1hcmdpbi10b3A6IDE0cHg7XG4gIHotaW5kZXg6IDk5OTtcbiAgZGlzcGxheTogZmxleDtcblxuICBzdmc6aG92ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuICBzdmc6aG92ZXIgcGF0aCB7XG4gICAgZmlsbDogI2VjZWNlYztcbiAgICBmaWx0ZXI6IGRyb3Atc2hhZG93KDBweCAwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xKSk7XG4gIH1cbiAgcGF0aCB7XG4gICAgZmlsbDogI2JiYjtcbiAgfVxuICBzdmcge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC42KTtcbiAgICB6LWluZGV4OiA5OTkwO1xuICAgIGhlaWdodDogMTcycHg7XG4gIH1cbmA7XG5cbi8qKlxuICogTmF2aWdhdGlvbiBjb21wb25lbnQgdGhhdCBkaXNwbGF5cyBhIGNvbXBhc3MgY29tcG9uZW50IHdoaWNoIGluZGljYXRlcyB0aGUgY3VycmVudCBvcmlhbnRhdGlvbiBvZiB0aGUgbWFwIGl0IGlzIHJlZ2lzdGVyZWQgZm9yIGFuZCBvZmZlcnMgY29udHJvbHMgdG8gdHVybiB0aGUgYmVhcmluZyA5MMKwIGxlZnQvcmlnaHQgb3IgcmVzZXQgbm9ydGggdG8gcG9pbnQgdXAuXG4gKlxuICogQWxsIHN0eWxlIHByb3BzIGFyZSBhcHBsaWVkIHVzaW5nIEBlbW90aW9uL2NzcyB0byBhbGxvdyBtb3JlIGNvbXBsZXggY3NzIHNlbGVjdG9ycy5cbiAqXG4gKiBAY29tcG9uZW50XG4gKi9cbmNvbnN0IE1sTmF2aWdhdGlvbkNvbXBhc3MgPSAocHJvcHMpID0+IHtcbiAgLy8gVXNlIGEgdXNlUmVmIGhvb2sgdG8gcmVmZXJlbmNlIHRoZSBsYXllciBvYmplY3QgdG8gYmUgYWJsZSB0byBhY2Nlc3MgaXQgbGF0ZXIgaW5zaWRlIHVzZUVmZmVjdCBob29rc1xuICBjb25zdCBtYXBDb250ZXh0ID0gdXNlQ29udGV4dChNYXBDb250ZXh0KTtcblxuICBjb25zdCBpbml0aWFsaXplZFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IG1hcFJlZiA9IHVzZVJlZih1bmRlZmluZWQpO1xuICBjb25zdCBjb21wb25lbnRJZCA9IHVzZVJlZigocHJvcHMuaWRQcmVmaXggPyBwcm9wcy5pZFByZWZpeCA6IFwiTWxOYXZpZ2F0aW9uQ29tcGFzcy1cIikgKyB1dWlkdjQoKSk7XG5cbiAgY29uc3QgW2JlYXJpbmcsIHNldEJlYXJpbmddID0gdXNlU3RhdGUoMCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgX2NvbXBvbmVudElkID0gY29tcG9uZW50SWQuY3VycmVudDtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBjbGVhbnVwIGZ1bmN0aW9uLCBpdCBpcyBjYWxsZWQgd2hlbiB0aGlzIHJlYWN0IGNvbXBvbmVudCBpcyByZW1vdmVkIGZyb20gcmVhY3QtZG9tXG5cbiAgICAgIGlmIChtYXBSZWYuY3VycmVudCkge1xuICAgICAgICBtYXBSZWYuY3VycmVudC5jbGVhbnVwKF9jb21wb25lbnRJZCk7XG4gICAgICAgIG1hcFJlZi5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaW5pdGlhbGl6ZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghbWFwQ29udGV4dC5tYXBFeGlzdHMocHJvcHMubWFwSWQpIHx8IGluaXRpYWxpemVkUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICBpbml0aWFsaXplZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICBtYXBSZWYuY3VycmVudCA9IG1hcENvbnRleHQuZ2V0TWFwKHByb3BzLm1hcElkKTtcblxuICAgIG1hcFJlZi5jdXJyZW50Lm9uKFxuICAgICAgXCJyb3RhdGVcIixcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0QmVhcmluZyhNYXRoLnJvdW5kKG1hcFJlZi5jdXJyZW50LmdldEJlYXJpbmcoKSkpO1xuICAgICAgfSxcbiAgICAgIGNvbXBvbmVudElkLmN1cnJlbnRcbiAgICApO1xuICAgIHNldEJlYXJpbmcoTWF0aC5yb3VuZChtYXBSZWYuY3VycmVudC5nZXRCZWFyaW5nKCkpKTtcbiAgfSwgW21hcENvbnRleHQubWFwSWRzLCBtYXBDb250ZXh0LCBwcm9wcy5tYXBJZF0pO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtjc3Moe1xuICAgICAgICAgIHpJbmRleDogMTAwMCxcbiAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAuLi5wcm9wcy5zdHlsZSxcbiAgICAgICAgfSl9XG4gICAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9e2Nzcyh7XG4gICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgICAgYm9yZGVyOiBcIjEwcHggc29saWQgI2JjYmNiY1wiLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiM3MTcxNzFcIixcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IFwicmFkaWFsLWdyYWRpZW50KCM3MTcxNzEsICM0MTQxNDEpXCIsXG4gICAgICAgICAgICBoZWlnaHQ6IFwiMjAwcHhcIixcbiAgICAgICAgICAgIHdpZHRoOiBcIjIwMHB4XCIsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiNTAlXCIsXG4gICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBcInNjYWxlKDAuMikgdHJhbnNsYXRlWCgtNDQ4cHgpIHRyYW5zbGF0ZVkoLTQ0OHB4KVwiLFxuICAgICAgICAgICAgLi4ucHJvcHMuYmFja2dyb3VuZFN0eWxlLFxuICAgICAgICAgIH0pfVxuICAgICAgICA+XG4gICAgICAgICAgPFJvdGF0ZUJ1dHRvbiBjbGFzc05hbWU9e2Nzcyh7IC4uLnByb3BzLnJvdGF0ZVJpZ2h0U3R5bGUgfSl9PlxuICAgICAgICAgICAgPFJvdGF0ZVJpZ2h0SWNvblxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGJlYXJpbmcgPSBNYXRoLnJvdW5kKG1hcFJlZi5jdXJyZW50Py5nZXRCZWFyaW5nKCkpO1xuICAgICAgICAgICAgICAgIGxldCByZXN0ID0gTWF0aC5yb3VuZChiZWFyaW5nICUgOTApO1xuICAgICAgICAgICAgICAgIGlmIChiZWFyaW5nID4gMCkge1xuICAgICAgICAgICAgICAgICAgcmVzdCA9IDkwIC0gcmVzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3QgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlc3QgPSA5MDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFwUmVmLmN1cnJlbnQ/LnNldEJlYXJpbmcoTWF0aC5yb3VuZChiZWFyaW5nICsgTWF0aC5hYnMocmVzdCkpKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID48L1JvdGF0ZVJpZ2h0SWNvbj5cbiAgICAgICAgICA8L1JvdGF0ZUJ1dHRvbj5cbiAgICAgICAgICA8TmVlZGxlQnV0dG9uXG4gICAgICAgICAgICBjbGFzc05hbWU9e2Nzcyh7IC4uLnByb3BzLm5lZWRsZVN0eWxlIH0pfVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICBtYXBSZWYuY3VycmVudD8uc2V0QmVhcmluZygwKTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPE5lZWRsZUNvbnRhaW5lclxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogXCJyb3RhdGUoXCIgKyBiZWFyaW5nICsgXCJkZWcpXCIsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxOZWVkbGVJY29uIC8+XG4gICAgICAgICAgICA8L05lZWRsZUNvbnRhaW5lcj5cbiAgICAgICAgICA8L05lZWRsZUJ1dHRvbj5cbiAgICAgICAgICA8Um90YXRlQnV0dG9uIGNsYXNzTmFtZT17Y3NzKHsgLi4ucHJvcHMucm90YXRlTGVmdFN0eWxlIH0pfT5cbiAgICAgICAgICAgIDxSb3RhdGVMZWZ0SWNvblxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGJlYXJpbmcgPSBNYXRoLnJvdW5kKG1hcFJlZi5jdXJyZW50Py5nZXRCZWFyaW5nKCkpO1xuICAgICAgICAgICAgICAgIGxldCByZXN0ID0gTWF0aC5yb3VuZChiZWFyaW5nICUgOTApO1xuICAgICAgICAgICAgICAgIGlmIChiZWFyaW5nIDwgMCkge1xuICAgICAgICAgICAgICAgICAgcmVzdCA9IDkwICsgcmVzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3QgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlc3QgPSA5MDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFwUmVmLmN1cnJlbnQ/LnNldEJlYXJpbmcoTWF0aC5yb3VuZChiZWFyaW5nIC0gTWF0aC5hYnMocmVzdCkpKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID48L1JvdGF0ZUxlZnRJY29uPlxuICAgICAgICAgIDwvUm90YXRlQnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvPlxuICApO1xufTtcblxuTWxOYXZpZ2F0aW9uQ29tcGFzcy5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBDb21wb25lbnQgaWQgcHJlZml4XG4gICAqL1xuICBpZFByZWZpeDogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqXG4gICAqIFN0eWxlIG9iamVjdCB0byBhZGp1c3QgY3NzIGRlZmluaXRpb25zIG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqXG4gICAqIFN0eWxlIG9iamVjdCB0byBhZGp1c3QgY3NzIGRlZmluaXRpb25zIG9mIHRoZSBiYWNrZ3JvdW5kLlxuICAgKi9cbiAgYmFja2dyb3VuZFN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKipcbiAgICogU3R5bGUgb2JqZWN0IHRvIGFkanVzdCBjc3MgZGVmaW5pdGlvbnMgb2YgdGhlIGNvbXBhc3MgbmVlZGxlLlxuICAgKi9cbiAgbmVlZGxlU3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKlxuICAgKiBTdHlsZSBvYmplY3QgdG8gYWRqdXN0IGNzcyBkZWZpbml0aW9ucyBvZiB0aGUgcm90YXRlIHJpZ2h0IGJ1dHRvbi5cbiAgICovXG4gIHJvdGF0ZVJpZ2h0U3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKlxuICAgKiBTdHlsZSBvYmplY3QgdG8gYWRqdXN0IGNzcyBkZWZpbml0aW9ucyBvZiB0aGUgcm90YXRlIGxlZnQgYnV0dG9uLlxuICAgKi9cbiAgcm90YXRlTGVmdFN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWxOYXZpZ2F0aW9uQ29tcGFzcztcbiJdfQ== */",
2133
+ toString: _EMOTION_STRINGIFIED_CSS_ERROR__
2134
+ });
2135
+
2136
+ var NeedleContainer = _styled("div", process.env.NODE_ENV === "production" ? {
2137
+ target: "e12lzm5x1"
2138
+ } : {
2139
+ target: "e12lzm5x1",
2140
+ label: "NeedleContainer"
2141
+ })(process.env.NODE_ENV === "production" ? {
2142
+ name: "1m8y6tb",
2143
+ styles: "pointer-events:none;display:flex;z-index:1002;position:absolute;align-items:center;margin-left:-30%;path:nth-of-type(2){}svg g{transform:translate(-76.7053, -29.7727) scale(2, 1);}svg{z-index:9990;height:150px;width:200px;}"
2144
+ } : {
2145
+ name: "1m8y6tb",
2146
+ styles: "pointer-events:none;display:flex;z-index:1002;position:absolute;align-items:center;margin-left:-30%;path:nth-of-type(2){}svg g{transform:translate(-76.7053, -29.7727) scale(2, 1);}svg{z-index:9990;height:150px;width:200px;}",
2147
+ map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1sTmF2aWdhdGlvbkNvbXBhc3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0NrQyIsImZpbGUiOiJNbE5hdmlnYXRpb25Db21wYXNzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuXG5pbXBvcnQgeyBNYXBDb250ZXh0IH0gZnJvbSBcIkBtYXBjb21wb25lbnRzL3JlYWN0LWNvcmVcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gXCJ1dWlkXCI7XG5cbmltcG9ydCB7IFJlYWN0Q29tcG9uZW50IGFzIFJvdGF0ZVJpZ2h0SWNvbiB9IGZyb20gXCIuL2Fzc2V0cy9yb3RhdGVfcmlnaHQuc3ZnXCI7XG5pbXBvcnQgeyBSZWFjdENvbXBvbmVudCBhcyBSb3RhdGVMZWZ0SWNvbiB9IGZyb20gXCIuL2Fzc2V0cy9yb3RhdGVfbGVmdC5zdmdcIjtcbmltcG9ydCB7IFJlYWN0Q29tcG9uZW50IGFzIE5lZWRsZUljb24gfSBmcm9tIFwiLi9hc3NldHMvbmVlZGxlLnN2Z1wiO1xuXG5pbXBvcnQgc3R5bGVkIGZyb20gXCJAZW1vdGlvbi9zdHlsZWRcIjtcbmltcG9ydCB7IGNzcyB9IGZyb20gXCJAZW1vdGlvbi9jc3NcIjtcblxuY29uc3QgTmVlZGxlQnV0dG9uID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6IDQwJTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAmOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbiAgcGF0aCB7XG4gICAgZmlsdGVyOiBkcm9wLXNoYWRvdygwcHggMHB4IDE1cHggcmdiYSgwLCAwLCAwLCAwLjIpKTtcbiAgfVxuICAmOmhvdmVyIHBhdGgge1xuICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMHB4IDBweCAxM3B4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSk7XG4gIH1cbiAgcGF0aDpudGgtb2YtdHlwZSgyKSB7XG4gICAgZmlsbDogIzM0MzQzNDtcbiAgfVxuICAmOmhvdmVyIHBhdGg6bnRoLW9mLXR5cGUoMikge1xuICAgIGZpbGw6ICM0MzQzNDM7XG4gIH1cbiAgcGF0aDpudGgtb2YtdHlwZSgxKSB7XG4gICAgZmlsbDogI2U5MDMxODtcbiAgfVxuICAmOmhvdmVyIHBhdGg6bnRoLW9mLXR5cGUoMSkge1xuICAgIGZpbGw6ICNmYjQwNTI7XG4gIH1cbmA7XG5jb25zdCBOZWVkbGVDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgZGlzcGxheTogZmxleDtcbiAgei1pbmRleDogMTAwMjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuXG4gIG1hcmdpbi1sZWZ0OiAtMzAlO1xuICBwYXRoOm50aC1vZi10eXBlKDIpIHtcbiAgfVxuICBzdmcgZyB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTc2LjcwNTMsIC0yOS43NzI3KSBzY2FsZSgyLCAxKTtcbiAgfVxuICBzdmcge1xuICAgIHotaW5kZXg6IDk5OTA7XG4gICAgaGVpZ2h0OiAxNTBweDtcbiAgICB3aWR0aDogMjAwcHg7XG4gIH1cbmA7XG5jb25zdCBSb3RhdGVCdXR0b24gPSBzdHlsZWQuZGl2YFxuICB3aWR0aDogMzAlO1xuICBtYXJnaW4tdG9wOiAxNHB4O1xuICB6LWluZGV4OiA5OTk7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgc3ZnOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbiAgc3ZnOmhvdmVyIHBhdGgge1xuICAgIGZpbGw6ICNlY2VjZWM7XG4gICAgZmlsdGVyOiBkcm9wLXNoYWRvdygwcHggMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMSkpO1xuICB9XG4gIHBhdGgge1xuICAgIGZpbGw6ICNiYmI7XG4gIH1cbiAgc3ZnIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNik7XG4gICAgei1pbmRleDogOTk5MDtcbiAgICBoZWlnaHQ6IDE3MnB4O1xuICB9XG5gO1xuXG4vKipcbiAqIE5hdmlnYXRpb24gY29tcG9uZW50IHRoYXQgZGlzcGxheXMgYSBjb21wYXNzIGNvbXBvbmVudCB3aGljaCBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgb3JpYW50YXRpb24gb2YgdGhlIG1hcCBpdCBpcyByZWdpc3RlcmVkIGZvciBhbmQgb2ZmZXJzIGNvbnRyb2xzIHRvIHR1cm4gdGhlIGJlYXJpbmcgOTDCsCBsZWZ0L3JpZ2h0IG9yIHJlc2V0IG5vcnRoIHRvIHBvaW50IHVwLlxuICpcbiAqIEFsbCBzdHlsZSBwcm9wcyBhcmUgYXBwbGllZCB1c2luZyBAZW1vdGlvbi9jc3MgdG8gYWxsb3cgbW9yZSBjb21wbGV4IGNzcyBzZWxlY3RvcnMuXG4gKlxuICogQGNvbXBvbmVudFxuICovXG5jb25zdCBNbE5hdmlnYXRpb25Db21wYXNzID0gKHByb3BzKSA9PiB7XG4gIC8vIFVzZSBhIHVzZVJlZiBob29rIHRvIHJlZmVyZW5jZSB0aGUgbGF5ZXIgb2JqZWN0IHRvIGJlIGFibGUgdG8gYWNjZXNzIGl0IGxhdGVyIGluc2lkZSB1c2VFZmZlY3QgaG9va3NcbiAgY29uc3QgbWFwQ29udGV4dCA9IHVzZUNvbnRleHQoTWFwQ29udGV4dCk7XG5cbiAgY29uc3QgaW5pdGlhbGl6ZWRSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCBtYXBSZWYgPSB1c2VSZWYodW5kZWZpbmVkKTtcbiAgY29uc3QgY29tcG9uZW50SWQgPSB1c2VSZWYoKHByb3BzLmlkUHJlZml4ID8gcHJvcHMuaWRQcmVmaXggOiBcIk1sTmF2aWdhdGlvbkNvbXBhc3MtXCIpICsgdXVpZHY0KCkpO1xuXG4gIGNvbnN0IFtiZWFyaW5nLCBzZXRCZWFyaW5nXSA9IHVzZVN0YXRlKDApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IF9jb21wb25lbnRJZCA9IGNvbXBvbmVudElkLmN1cnJlbnQ7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgY2xlYW51cCBmdW5jdGlvbiwgaXQgaXMgY2FsbGVkIHdoZW4gdGhpcyByZWFjdCBjb21wb25lbnQgaXMgcmVtb3ZlZCBmcm9tIHJlYWN0LWRvbVxuXG4gICAgICBpZiAobWFwUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgbWFwUmVmLmN1cnJlbnQuY2xlYW51cChfY29tcG9uZW50SWQpO1xuICAgICAgICBtYXBSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGluaXRpYWxpemVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIW1hcENvbnRleHQubWFwRXhpc3RzKHByb3BzLm1hcElkKSB8fCBpbml0aWFsaXplZFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgaW5pdGlhbGl6ZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgbWFwUmVmLmN1cnJlbnQgPSBtYXBDb250ZXh0LmdldE1hcChwcm9wcy5tYXBJZCk7XG5cbiAgICBtYXBSZWYuY3VycmVudC5vbihcbiAgICAgIFwicm90YXRlXCIsXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldEJlYXJpbmcoTWF0aC5yb3VuZChtYXBSZWYuY3VycmVudC5nZXRCZWFyaW5nKCkpKTtcbiAgICAgIH0sXG4gICAgICBjb21wb25lbnRJZC5jdXJyZW50XG4gICAgKTtcbiAgICBzZXRCZWFyaW5nKE1hdGgucm91bmQobWFwUmVmLmN1cnJlbnQuZ2V0QmVhcmluZygpKSk7XG4gIH0sIFttYXBDb250ZXh0Lm1hcElkcywgbWFwQ29udGV4dCwgcHJvcHMubWFwSWRdKTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17Y3NzKHtcbiAgICAgICAgICB6SW5kZXg6IDEwMDAsXG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgLi4ucHJvcHMuc3R5bGUsXG4gICAgICAgIH0pfVxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPXtjc3Moe1xuICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgIGJvcmRlcjogXCIxMHB4IHNvbGlkICNiY2JjYmNcIixcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjNzE3MTcxXCIsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBcInJhZGlhbC1ncmFkaWVudCgjNzE3MTcxLCAjNDE0MTQxKVwiLFxuICAgICAgICAgICAgaGVpZ2h0OiBcIjIwMHB4XCIsXG4gICAgICAgICAgICB3aWR0aDogXCIyMDBweFwiLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjUwJVwiLFxuICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIHRyYW5zZm9ybTogXCJzY2FsZSgwLjIpIHRyYW5zbGF0ZVgoLTQ0OHB4KSB0cmFuc2xhdGVZKC00NDhweClcIixcbiAgICAgICAgICAgIC4uLnByb3BzLmJhY2tncm91bmRTdHlsZSxcbiAgICAgICAgICB9KX1cbiAgICAgICAgPlxuICAgICAgICAgIDxSb3RhdGVCdXR0b24gY2xhc3NOYW1lPXtjc3MoeyAuLi5wcm9wcy5yb3RhdGVSaWdodFN0eWxlIH0pfT5cbiAgICAgICAgICAgIDxSb3RhdGVSaWdodEljb25cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBiZWFyaW5nID0gTWF0aC5yb3VuZChtYXBSZWYuY3VycmVudD8uZ2V0QmVhcmluZygpKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdCA9IE1hdGgucm91bmQoYmVhcmluZyAlIDkwKTtcbiAgICAgICAgICAgICAgICBpZiAoYmVhcmluZyA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlc3QgPSA5MCAtIHJlc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICByZXN0ID0gOTA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcFJlZi5jdXJyZW50Py5zZXRCZWFyaW5nKE1hdGgucm91bmQoYmVhcmluZyArIE1hdGguYWJzKHJlc3QpKSk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+PC9Sb3RhdGVSaWdodEljb24+XG4gICAgICAgICAgPC9Sb3RhdGVCdXR0b24+XG4gICAgICAgICAgPE5lZWRsZUJ1dHRvblxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjc3MoeyAuLi5wcm9wcy5uZWVkbGVTdHlsZSB9KX1cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgbWFwUmVmLmN1cnJlbnQ/LnNldEJlYXJpbmcoMCk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxOZWVkbGVDb250YWluZXJcbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFwicm90YXRlKFwiICsgYmVhcmluZyArIFwiZGVnKVwiLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8TmVlZGxlSWNvbiAvPlxuICAgICAgICAgICAgPC9OZWVkbGVDb250YWluZXI+XG4gICAgICAgICAgPC9OZWVkbGVCdXR0b24+XG4gICAgICAgICAgPFJvdGF0ZUJ1dHRvbiBjbGFzc05hbWU9e2Nzcyh7IC4uLnByb3BzLnJvdGF0ZUxlZnRTdHlsZSB9KX0+XG4gICAgICAgICAgICA8Um90YXRlTGVmdEljb25cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBiZWFyaW5nID0gTWF0aC5yb3VuZChtYXBSZWYuY3VycmVudD8uZ2V0QmVhcmluZygpKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdCA9IE1hdGgucm91bmQoYmVhcmluZyAlIDkwKTtcbiAgICAgICAgICAgICAgICBpZiAoYmVhcmluZyA8IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlc3QgPSA5MCArIHJlc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICByZXN0ID0gOTA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcFJlZi5jdXJyZW50Py5zZXRCZWFyaW5nKE1hdGgucm91bmQoYmVhcmluZyAtIE1hdGguYWJzKHJlc3QpKSk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+PC9Sb3RhdGVMZWZ0SWNvbj5cbiAgICAgICAgICA8L1JvdGF0ZUJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbk1sTmF2aWdhdGlvbkNvbXBhc3MucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQ29tcG9uZW50IGlkIHByZWZpeFxuICAgKi9cbiAgaWRQcmVmaXg6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiBTdHlsZSBvYmplY3QgdG8gYWRqdXN0IGNzcyBkZWZpbml0aW9ucyBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKlxuICAgKiBTdHlsZSBvYmplY3QgdG8gYWRqdXN0IGNzcyBkZWZpbml0aW9ucyBvZiB0aGUgYmFja2dyb3VuZC5cbiAgICovXG4gIGJhY2tncm91bmRTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqXG4gICAqIFN0eWxlIG9iamVjdCB0byBhZGp1c3QgY3NzIGRlZmluaXRpb25zIG9mIHRoZSBjb21wYXNzIG5lZWRsZS5cbiAgICovXG4gIG5lZWRsZVN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKipcbiAgICogU3R5bGUgb2JqZWN0IHRvIGFkanVzdCBjc3MgZGVmaW5pdGlvbnMgb2YgdGhlIHJvdGF0ZSByaWdodCBidXR0b24uXG4gICAqL1xuICByb3RhdGVSaWdodFN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKipcbiAgICogU3R5bGUgb2JqZWN0IHRvIGFkanVzdCBjc3MgZGVmaW5pdGlvbnMgb2YgdGhlIHJvdGF0ZSBsZWZ0IGJ1dHRvbi5cbiAgICovXG4gIHJvdGF0ZUxlZnRTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1sTmF2aWdhdGlvbkNvbXBhc3M7XG4iXX0= */",
2148
+ toString: _EMOTION_STRINGIFIED_CSS_ERROR__
2149
+ });
2150
+
2151
+ var RotateButton = _styled("div", process.env.NODE_ENV === "production" ? {
2152
+ target: "e12lzm5x0"
2153
+ } : {
2154
+ target: "e12lzm5x0",
2155
+ label: "RotateButton"
2156
+ })(process.env.NODE_ENV === "production" ? {
2157
+ name: "1j4uu1m",
2158
+ styles: "width:30%;margin-top:14px;z-index:999;display:flex;svg:hover{cursor:pointer;}svg:hover path{fill:#ececec;filter:drop-shadow(0px 0px 5px rgba(0, 0, 0, 0.1));}path{fill:#bbb;}svg{transform:scale(0.6);z-index:9990;height:172px;}"
2159
+ } : {
2160
+ name: "1j4uu1m",
2161
+ styles: "width:30%;margin-top:14px;z-index:999;display:flex;svg:hover{cursor:pointer;}svg:hover path{fill:#ececec;filter:drop-shadow(0px 0px 5px rgba(0, 0, 0, 0.1));}path{fill:#bbb;}svg{transform:scale(0.6);z-index:9990;height:172px;}",
2162
+ map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1sTmF2aWdhdGlvbkNvbXBhc3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMkQrQiIsImZpbGUiOiJNbE5hdmlnYXRpb25Db21wYXNzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuXG5pbXBvcnQgeyBNYXBDb250ZXh0IH0gZnJvbSBcIkBtYXBjb21wb25lbnRzL3JlYWN0LWNvcmVcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gXCJ1dWlkXCI7XG5cbmltcG9ydCB7IFJlYWN0Q29tcG9uZW50IGFzIFJvdGF0ZVJpZ2h0SWNvbiB9IGZyb20gXCIuL2Fzc2V0cy9yb3RhdGVfcmlnaHQuc3ZnXCI7XG5pbXBvcnQgeyBSZWFjdENvbXBvbmVudCBhcyBSb3RhdGVMZWZ0SWNvbiB9IGZyb20gXCIuL2Fzc2V0cy9yb3RhdGVfbGVmdC5zdmdcIjtcbmltcG9ydCB7IFJlYWN0Q29tcG9uZW50IGFzIE5lZWRsZUljb24gfSBmcm9tIFwiLi9hc3NldHMvbmVlZGxlLnN2Z1wiO1xuXG5pbXBvcnQgc3R5bGVkIGZyb20gXCJAZW1vdGlvbi9zdHlsZWRcIjtcbmltcG9ydCB7IGNzcyB9IGZyb20gXCJAZW1vdGlvbi9jc3NcIjtcblxuY29uc3QgTmVlZGxlQnV0dG9uID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6IDQwJTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAmOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbiAgcGF0aCB7XG4gICAgZmlsdGVyOiBkcm9wLXNoYWRvdygwcHggMHB4IDE1cHggcmdiYSgwLCAwLCAwLCAwLjIpKTtcbiAgfVxuICAmOmhvdmVyIHBhdGgge1xuICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMHB4IDBweCAxM3B4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSk7XG4gIH1cbiAgcGF0aDpudGgtb2YtdHlwZSgyKSB7XG4gICAgZmlsbDogIzM0MzQzNDtcbiAgfVxuICAmOmhvdmVyIHBhdGg6bnRoLW9mLXR5cGUoMikge1xuICAgIGZpbGw6ICM0MzQzNDM7XG4gIH1cbiAgcGF0aDpudGgtb2YtdHlwZSgxKSB7XG4gICAgZmlsbDogI2U5MDMxODtcbiAgfVxuICAmOmhvdmVyIHBhdGg6bnRoLW9mLXR5cGUoMSkge1xuICAgIGZpbGw6ICNmYjQwNTI7XG4gIH1cbmA7XG5jb25zdCBOZWVkbGVDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgZGlzcGxheTogZmxleDtcbiAgei1pbmRleDogMTAwMjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuXG4gIG1hcmdpbi1sZWZ0OiAtMzAlO1xuICBwYXRoOm50aC1vZi10eXBlKDIpIHtcbiAgfVxuICBzdmcgZyB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTc2LjcwNTMsIC0yOS43NzI3KSBzY2FsZSgyLCAxKTtcbiAgfVxuICBzdmcge1xuICAgIHotaW5kZXg6IDk5OTA7XG4gICAgaGVpZ2h0OiAxNTBweDtcbiAgICB3aWR0aDogMjAwcHg7XG4gIH1cbmA7XG5jb25zdCBSb3RhdGVCdXR0b24gPSBzdHlsZWQuZGl2YFxuICB3aWR0aDogMzAlO1xuICBtYXJnaW4tdG9wOiAxNHB4O1xuICB6LWluZGV4OiA5OTk7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgc3ZnOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbiAgc3ZnOmhvdmVyIHBhdGgge1xuICAgIGZpbGw6ICNlY2VjZWM7XG4gICAgZmlsdGVyOiBkcm9wLXNoYWRvdygwcHggMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMSkpO1xuICB9XG4gIHBhdGgge1xuICAgIGZpbGw6ICNiYmI7XG4gIH1cbiAgc3ZnIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNik7XG4gICAgei1pbmRleDogOTk5MDtcbiAgICBoZWlnaHQ6IDE3MnB4O1xuICB9XG5gO1xuXG4vKipcbiAqIE5hdmlnYXRpb24gY29tcG9uZW50IHRoYXQgZGlzcGxheXMgYSBjb21wYXNzIGNvbXBvbmVudCB3aGljaCBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgb3JpYW50YXRpb24gb2YgdGhlIG1hcCBpdCBpcyByZWdpc3RlcmVkIGZvciBhbmQgb2ZmZXJzIGNvbnRyb2xzIHRvIHR1cm4gdGhlIGJlYXJpbmcgOTDCsCBsZWZ0L3JpZ2h0IG9yIHJlc2V0IG5vcnRoIHRvIHBvaW50IHVwLlxuICpcbiAqIEFsbCBzdHlsZSBwcm9wcyBhcmUgYXBwbGllZCB1c2luZyBAZW1vdGlvbi9jc3MgdG8gYWxsb3cgbW9yZSBjb21wbGV4IGNzcyBzZWxlY3RvcnMuXG4gKlxuICogQGNvbXBvbmVudFxuICovXG5jb25zdCBNbE5hdmlnYXRpb25Db21wYXNzID0gKHByb3BzKSA9PiB7XG4gIC8vIFVzZSBhIHVzZVJlZiBob29rIHRvIHJlZmVyZW5jZSB0aGUgbGF5ZXIgb2JqZWN0IHRvIGJlIGFibGUgdG8gYWNjZXNzIGl0IGxhdGVyIGluc2lkZSB1c2VFZmZlY3QgaG9va3NcbiAgY29uc3QgbWFwQ29udGV4dCA9IHVzZUNvbnRleHQoTWFwQ29udGV4dCk7XG5cbiAgY29uc3QgaW5pdGlhbGl6ZWRSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCBtYXBSZWYgPSB1c2VSZWYodW5kZWZpbmVkKTtcbiAgY29uc3QgY29tcG9uZW50SWQgPSB1c2VSZWYoKHByb3BzLmlkUHJlZml4ID8gcHJvcHMuaWRQcmVmaXggOiBcIk1sTmF2aWdhdGlvbkNvbXBhc3MtXCIpICsgdXVpZHY0KCkpO1xuXG4gIGNvbnN0IFtiZWFyaW5nLCBzZXRCZWFyaW5nXSA9IHVzZVN0YXRlKDApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IF9jb21wb25lbnRJZCA9IGNvbXBvbmVudElkLmN1cnJlbnQ7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgY2xlYW51cCBmdW5jdGlvbiwgaXQgaXMgY2FsbGVkIHdoZW4gdGhpcyByZWFjdCBjb21wb25lbnQgaXMgcmVtb3ZlZCBmcm9tIHJlYWN0LWRvbVxuXG4gICAgICBpZiAobWFwUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgbWFwUmVmLmN1cnJlbnQuY2xlYW51cChfY29tcG9uZW50SWQpO1xuICAgICAgICBtYXBSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGluaXRpYWxpemVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIW1hcENvbnRleHQubWFwRXhpc3RzKHByb3BzLm1hcElkKSB8fCBpbml0aWFsaXplZFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgaW5pdGlhbGl6ZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgbWFwUmVmLmN1cnJlbnQgPSBtYXBDb250ZXh0LmdldE1hcChwcm9wcy5tYXBJZCk7XG5cbiAgICBtYXBSZWYuY3VycmVudC5vbihcbiAgICAgIFwicm90YXRlXCIsXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldEJlYXJpbmcoTWF0aC5yb3VuZChtYXBSZWYuY3VycmVudC5nZXRCZWFyaW5nKCkpKTtcbiAgICAgIH0sXG4gICAgICBjb21wb25lbnRJZC5jdXJyZW50XG4gICAgKTtcbiAgICBzZXRCZWFyaW5nKE1hdGgucm91bmQobWFwUmVmLmN1cnJlbnQuZ2V0QmVhcmluZygpKSk7XG4gIH0sIFttYXBDb250ZXh0Lm1hcElkcywgbWFwQ29udGV4dCwgcHJvcHMubWFwSWRdKTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17Y3NzKHtcbiAgICAgICAgICB6SW5kZXg6IDEwMDAsXG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgLi4ucHJvcHMuc3R5bGUsXG4gICAgICAgIH0pfVxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPXtjc3Moe1xuICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgIGJvcmRlcjogXCIxMHB4IHNvbGlkICNiY2JjYmNcIixcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjNzE3MTcxXCIsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBcInJhZGlhbC1ncmFkaWVudCgjNzE3MTcxLCAjNDE0MTQxKVwiLFxuICAgICAgICAgICAgaGVpZ2h0OiBcIjIwMHB4XCIsXG4gICAgICAgICAgICB3aWR0aDogXCIyMDBweFwiLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjUwJVwiLFxuICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIHRyYW5zZm9ybTogXCJzY2FsZSgwLjIpIHRyYW5zbGF0ZVgoLTQ0OHB4KSB0cmFuc2xhdGVZKC00NDhweClcIixcbiAgICAgICAgICAgIC4uLnByb3BzLmJhY2tncm91bmRTdHlsZSxcbiAgICAgICAgICB9KX1cbiAgICAgICAgPlxuICAgICAgICAgIDxSb3RhdGVCdXR0b24gY2xhc3NOYW1lPXtjc3MoeyAuLi5wcm9wcy5yb3RhdGVSaWdodFN0eWxlIH0pfT5cbiAgICAgICAgICAgIDxSb3RhdGVSaWdodEljb25cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBiZWFyaW5nID0gTWF0aC5yb3VuZChtYXBSZWYuY3VycmVudD8uZ2V0QmVhcmluZygpKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdCA9IE1hdGgucm91bmQoYmVhcmluZyAlIDkwKTtcbiAgICAgICAgICAgICAgICBpZiAoYmVhcmluZyA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlc3QgPSA5MCAtIHJlc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICByZXN0ID0gOTA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcFJlZi5jdXJyZW50Py5zZXRCZWFyaW5nKE1hdGgucm91bmQoYmVhcmluZyArIE1hdGguYWJzKHJlc3QpKSk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+PC9Sb3RhdGVSaWdodEljb24+XG4gICAgICAgICAgPC9Sb3RhdGVCdXR0b24+XG4gICAgICAgICAgPE5lZWRsZUJ1dHRvblxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjc3MoeyAuLi5wcm9wcy5uZWVkbGVTdHlsZSB9KX1cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgbWFwUmVmLmN1cnJlbnQ/LnNldEJlYXJpbmcoMCk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxOZWVkbGVDb250YWluZXJcbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFwicm90YXRlKFwiICsgYmVhcmluZyArIFwiZGVnKVwiLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8TmVlZGxlSWNvbiAvPlxuICAgICAgICAgICAgPC9OZWVkbGVDb250YWluZXI+XG4gICAgICAgICAgPC9OZWVkbGVCdXR0b24+XG4gICAgICAgICAgPFJvdGF0ZUJ1dHRvbiBjbGFzc05hbWU9e2Nzcyh7IC4uLnByb3BzLnJvdGF0ZUxlZnRTdHlsZSB9KX0+XG4gICAgICAgICAgICA8Um90YXRlTGVmdEljb25cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBiZWFyaW5nID0gTWF0aC5yb3VuZChtYXBSZWYuY3VycmVudD8uZ2V0QmVhcmluZygpKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdCA9IE1hdGgucm91bmQoYmVhcmluZyAlIDkwKTtcbiAgICAgICAgICAgICAgICBpZiAoYmVhcmluZyA8IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlc3QgPSA5MCArIHJlc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICByZXN0ID0gOTA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcFJlZi5jdXJyZW50Py5zZXRCZWFyaW5nKE1hdGgucm91bmQoYmVhcmluZyAtIE1hdGguYWJzKHJlc3QpKSk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+PC9Sb3RhdGVMZWZ0SWNvbj5cbiAgICAgICAgICA8L1JvdGF0ZUJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbk1sTmF2aWdhdGlvbkNvbXBhc3MucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQ29tcG9uZW50IGlkIHByZWZpeFxuICAgKi9cbiAgaWRQcmVmaXg6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiBTdHlsZSBvYmplY3QgdG8gYWRqdXN0IGNzcyBkZWZpbml0aW9ucyBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKlxuICAgKiBTdHlsZSBvYmplY3QgdG8gYWRqdXN0IGNzcyBkZWZpbml0aW9ucyBvZiB0aGUgYmFja2dyb3VuZC5cbiAgICovXG4gIGJhY2tncm91bmRTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqXG4gICAqIFN0eWxlIG9iamVjdCB0byBhZGp1c3QgY3NzIGRlZmluaXRpb25zIG9mIHRoZSBjb21wYXNzIG5lZWRsZS5cbiAgICovXG4gIG5lZWRsZVN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKipcbiAgICogU3R5bGUgb2JqZWN0IHRvIGFkanVzdCBjc3MgZGVmaW5pdGlvbnMgb2YgdGhlIHJvdGF0ZSByaWdodCBidXR0b24uXG4gICAqL1xuICByb3RhdGVSaWdodFN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKipcbiAgICogU3R5bGUgb2JqZWN0IHRvIGFkanVzdCBjc3MgZGVmaW5pdGlvbnMgb2YgdGhlIHJvdGF0ZSBsZWZ0IGJ1dHRvbi5cbiAgICovXG4gIHJvdGF0ZUxlZnRTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1sTmF2aWdhdGlvbkNvbXBhc3M7XG4iXX0= */",
2163
+ toString: _EMOTION_STRINGIFIED_CSS_ERROR__
2164
+ });
2165
+ /**
2166
+ * Navigation component that displays a compass component which indicates the current oriantation of the map it is registered for and offers controls to turn the bearing 90° left/right or reset north to point up.
2167
+ *
2168
+ * All style props are applied using @emotion/css to allow more complex css selectors.
2169
+ *
2170
+ * @component
2171
+ */
2172
+
2173
+
2174
+ var MlNavigationCompass = function MlNavigationCompass(props) {
2175
+ // Use a useRef hook to reference the layer object to be able to access it later inside useEffect hooks
2176
+ var mapContext = useContext(MapContext);
2177
+ var initializedRef = useRef(false);
2178
+ var mapRef = useRef(undefined);
2179
+ var componentId = useRef((props.idPrefix ? props.idPrefix : "MlNavigationCompass-") + v4());
2180
+
2181
+ var _useState = useState(0),
2182
+ _useState2 = _slicedToArray(_useState, 2),
2183
+ bearing = _useState2[0],
2184
+ setBearing = _useState2[1];
2185
+
2186
+ useEffect(function () {
2187
+ var _componentId = componentId.current;
2188
+ return function () {
2189
+ // This is the cleanup function, it is called when this react component is removed from react-dom
2190
+ if (mapRef.current) {
2191
+ mapRef.current.cleanup(_componentId);
2192
+ mapRef.current = undefined;
2193
+ }
2194
+
2195
+ initializedRef.current = false;
2196
+ };
2197
+ }, []);
2198
+ useEffect(function () {
2199
+ if (!mapContext.mapExists(props.mapId) || initializedRef.current) return;
2200
+ initializedRef.current = true;
2201
+ mapRef.current = mapContext.getMap(props.mapId);
2202
+ mapRef.current.on("rotate", function () {
2203
+ setBearing(Math.round(mapRef.current.getBearing()));
2204
+ }, componentId.current);
2205
+ setBearing(Math.round(mapRef.current.getBearing()));
2206
+ }, [mapContext.mapIds, mapContext, props.mapId]);
2207
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("div", {
2208
+ className: /*#__PURE__*/css(_objectSpread2({
2209
+ zIndex: 1000,
2210
+ top: 0,
1805
2211
  position: "absolute"
1806
2212
  }, props.style), process.env.NODE_ENV === "production" ? "" : ";label:MlNavigationCompass;", process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1sTmF2aWdhdGlvbkNvbXBhc3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUltQiIsImZpbGUiOiJNbE5hdmlnYXRpb25Db21wYXNzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuXG5pbXBvcnQgeyBNYXBDb250ZXh0IH0gZnJvbSBcIkBtYXBjb21wb25lbnRzL3JlYWN0LWNvcmVcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gXCJ1dWlkXCI7XG5cbmltcG9ydCB7IFJlYWN0Q29tcG9uZW50IGFzIFJvdGF0ZVJpZ2h0SWNvbiB9IGZyb20gXCIuL2Fzc2V0cy9yb3RhdGVfcmlnaHQuc3ZnXCI7XG5pbXBvcnQgeyBSZWFjdENvbXBvbmVudCBhcyBSb3RhdGVMZWZ0SWNvbiB9IGZyb20gXCIuL2Fzc2V0cy9yb3RhdGVfbGVmdC5zdmdcIjtcbmltcG9ydCB7IFJlYWN0Q29tcG9uZW50IGFzIE5lZWRsZUljb24gfSBmcm9tIFwiLi9hc3NldHMvbmVlZGxlLnN2Z1wiO1xuXG5pbXBvcnQgc3R5bGVkIGZyb20gXCJAZW1vdGlvbi9zdHlsZWRcIjtcbmltcG9ydCB7IGNzcyB9IGZyb20gXCJAZW1vdGlvbi9jc3NcIjtcblxuY29uc3QgTmVlZGxlQnV0dG9uID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6IDQwJTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAmOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbiAgcGF0aCB7XG4gICAgZmlsdGVyOiBkcm9wLXNoYWRvdygwcHggMHB4IDE1cHggcmdiYSgwLCAwLCAwLCAwLjIpKTtcbiAgfVxuICAmOmhvdmVyIHBhdGgge1xuICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMHB4IDBweCAxM3B4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSk7XG4gIH1cbiAgcGF0aDpudGgtb2YtdHlwZSgyKSB7XG4gICAgZmlsbDogIzM0MzQzNDtcbiAgfVxuICAmOmhvdmVyIHBhdGg6bnRoLW9mLXR5cGUoMikge1xuICAgIGZpbGw6ICM0MzQzNDM7XG4gIH1cbiAgcGF0aDpudGgtb2YtdHlwZSgxKSB7XG4gICAgZmlsbDogI2U5MDMxODtcbiAgfVxuICAmOmhvdmVyIHBhdGg6bnRoLW9mLXR5cGUoMSkge1xuICAgIGZpbGw6ICNmYjQwNTI7XG4gIH1cbmA7XG5jb25zdCBOZWVkbGVDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgZGlzcGxheTogZmxleDtcbiAgei1pbmRleDogMTAwMjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuXG4gIG1hcmdpbi1sZWZ0OiAtMzAlO1xuICBwYXRoOm50aC1vZi10eXBlKDIpIHtcbiAgfVxuICBzdmcgZyB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTc2LjcwNTMsIC0yOS43NzI3KSBzY2FsZSgyLCAxKTtcbiAgfVxuICBzdmcge1xuICAgIHotaW5kZXg6IDk5OTA7XG4gICAgaGVpZ2h0OiAxNTBweDtcbiAgICB3aWR0aDogMjAwcHg7XG4gIH1cbmA7XG5jb25zdCBSb3RhdGVCdXR0b24gPSBzdHlsZWQuZGl2YFxuICB3aWR0aDogMzAlO1xuICBtYXJnaW4tdG9wOiAxNHB4O1xuICB6LWluZGV4OiA5OTk7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgc3ZnOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbiAgc3ZnOmhvdmVyIHBhdGgge1xuICAgIGZpbGw6ICNlY2VjZWM7XG4gICAgZmlsdGVyOiBkcm9wLXNoYWRvdygwcHggMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMSkpO1xuICB9XG4gIHBhdGgge1xuICAgIGZpbGw6ICNiYmI7XG4gIH1cbiAgc3ZnIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNik7XG4gICAgei1pbmRleDogOTk5MDtcbiAgICBoZWlnaHQ6IDE3MnB4O1xuICB9XG5gO1xuXG4vKipcbiAqIE5hdmlnYXRpb24gY29tcG9uZW50IHRoYXQgZGlzcGxheXMgYSBjb21wYXNzIGNvbXBvbmVudCB3aGljaCBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgb3JpYW50YXRpb24gb2YgdGhlIG1hcCBpdCBpcyByZWdpc3RlcmVkIGZvciBhbmQgb2ZmZXJzIGNvbnRyb2xzIHRvIHR1cm4gdGhlIGJlYXJpbmcgOTDCsCBsZWZ0L3JpZ2h0IG9yIHJlc2V0IG5vcnRoIHRvIHBvaW50IHVwLlxuICpcbiAqIEFsbCBzdHlsZSBwcm9wcyBhcmUgYXBwbGllZCB1c2luZyBAZW1vdGlvbi9jc3MgdG8gYWxsb3cgbW9yZSBjb21wbGV4IGNzcyBzZWxlY3RvcnMuXG4gKlxuICogQGNvbXBvbmVudFxuICovXG5jb25zdCBNbE5hdmlnYXRpb25Db21wYXNzID0gKHByb3BzKSA9PiB7XG4gIC8vIFVzZSBhIHVzZVJlZiBob29rIHRvIHJlZmVyZW5jZSB0aGUgbGF5ZXIgb2JqZWN0IHRvIGJlIGFibGUgdG8gYWNjZXNzIGl0IGxhdGVyIGluc2lkZSB1c2VFZmZlY3QgaG9va3NcbiAgY29uc3QgbWFwQ29udGV4dCA9IHVzZUNvbnRleHQoTWFwQ29udGV4dCk7XG5cbiAgY29uc3QgaW5pdGlhbGl6ZWRSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCBtYXBSZWYgPSB1c2VSZWYodW5kZWZpbmVkKTtcbiAgY29uc3QgY29tcG9uZW50SWQgPSB1c2VSZWYoKHByb3BzLmlkUHJlZml4ID8gcHJvcHMuaWRQcmVmaXggOiBcIk1sTmF2aWdhdGlvbkNvbXBhc3MtXCIpICsgdXVpZHY0KCkpO1xuXG4gIGNvbnN0IFtiZWFyaW5nLCBzZXRCZWFyaW5nXSA9IHVzZVN0YXRlKDApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IF9jb21wb25lbnRJZCA9IGNvbXBvbmVudElkLmN1cnJlbnQ7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgY2xlYW51cCBmdW5jdGlvbiwgaXQgaXMgY2FsbGVkIHdoZW4gdGhpcyByZWFjdCBjb21wb25lbnQgaXMgcmVtb3ZlZCBmcm9tIHJlYWN0LWRvbVxuXG4gICAgICBpZiAobWFwUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgbWFwUmVmLmN1cnJlbnQuY2xlYW51cChfY29tcG9uZW50SWQpO1xuICAgICAgICBtYXBSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGluaXRpYWxpemVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIW1hcENvbnRleHQubWFwRXhpc3RzKHByb3BzLm1hcElkKSB8fCBpbml0aWFsaXplZFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgaW5pdGlhbGl6ZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgbWFwUmVmLmN1cnJlbnQgPSBtYXBDb250ZXh0LmdldE1hcChwcm9wcy5tYXBJZCk7XG5cbiAgICBtYXBSZWYuY3VycmVudC5vbihcbiAgICAgIFwicm90YXRlXCIsXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldEJlYXJpbmcoTWF0aC5yb3VuZChtYXBSZWYuY3VycmVudC5nZXRCZWFyaW5nKCkpKTtcbiAgICAgIH0sXG4gICAgICBjb21wb25lbnRJZC5jdXJyZW50XG4gICAgKTtcbiAgICBzZXRCZWFyaW5nKE1hdGgucm91bmQobWFwUmVmLmN1cnJlbnQuZ2V0QmVhcmluZygpKSk7XG4gIH0sIFttYXBDb250ZXh0Lm1hcElkcywgbWFwQ29udGV4dCwgcHJvcHMubWFwSWRdKTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17Y3NzKHtcbiAgICAgICAgICB6SW5kZXg6IDEwMDAsXG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgLi4ucHJvcHMuc3R5bGUsXG4gICAgICAgIH0pfVxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPXtjc3Moe1xuICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgIGJvcmRlcjogXCIxMHB4IHNvbGlkICNiY2JjYmNcIixcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjNzE3MTcxXCIsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBcInJhZGlhbC1ncmFkaWVudCgjNzE3MTcxLCAjNDE0MTQxKVwiLFxuICAgICAgICAgICAgaGVpZ2h0OiBcIjIwMHB4XCIsXG4gICAgICAgICAgICB3aWR0aDogXCIyMDBweFwiLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjUwJVwiLFxuICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIHRyYW5zZm9ybTogXCJzY2FsZSgwLjIpIHRyYW5zbGF0ZVgoLTQ0OHB4KSB0cmFuc2xhdGVZKC00NDhweClcIixcbiAgICAgICAgICAgIC4uLnByb3BzLmJhY2tncm91bmRTdHlsZSxcbiAgICAgICAgICB9KX1cbiAgICAgICAgPlxuICAgICAgICAgIDxSb3RhdGVCdXR0b24gY2xhc3NOYW1lPXtjc3MoeyAuLi5wcm9wcy5yb3RhdGVSaWdodFN0eWxlIH0pfT5cbiAgICAgICAgICAgIDxSb3RhdGVSaWdodEljb25cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBiZWFyaW5nID0gTWF0aC5yb3VuZChtYXBSZWYuY3VycmVudD8uZ2V0QmVhcmluZygpKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdCA9IE1hdGgucm91bmQoYmVhcmluZyAlIDkwKTtcbiAgICAgICAgICAgICAgICBpZiAoYmVhcmluZyA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlc3QgPSA5MCAtIHJlc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICByZXN0ID0gOTA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcFJlZi5jdXJyZW50Py5zZXRCZWFyaW5nKE1hdGgucm91bmQoYmVhcmluZyArIE1hdGguYWJzKHJlc3QpKSk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+PC9Sb3RhdGVSaWdodEljb24+XG4gICAgICAgICAgPC9Sb3RhdGVCdXR0b24+XG4gICAgICAgICAgPE5lZWRsZUJ1dHRvblxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjc3MoeyAuLi5wcm9wcy5uZWVkbGVTdHlsZSB9KX1cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgbWFwUmVmLmN1cnJlbnQ/LnNldEJlYXJpbmcoMCk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxOZWVkbGVDb250YWluZXJcbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFwicm90YXRlKFwiICsgYmVhcmluZyArIFwiZGVnKVwiLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8TmVlZGxlSWNvbiAvPlxuICAgICAgICAgICAgPC9OZWVkbGVDb250YWluZXI+XG4gICAgICAgICAgPC9OZWVkbGVCdXR0b24+XG4gICAgICAgICAgPFJvdGF0ZUJ1dHRvbiBjbGFzc05hbWU9e2Nzcyh7IC4uLnByb3BzLnJvdGF0ZUxlZnRTdHlsZSB9KX0+XG4gICAgICAgICAgICA8Um90YXRlTGVmdEljb25cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBiZWFyaW5nID0gTWF0aC5yb3VuZChtYXBSZWYuY3VycmVudD8uZ2V0QmVhcmluZygpKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdCA9IE1hdGgucm91bmQoYmVhcmluZyAlIDkwKTtcbiAgICAgICAgICAgICAgICBpZiAoYmVhcmluZyA8IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlc3QgPSA5MCArIHJlc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICByZXN0ID0gOTA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcFJlZi5jdXJyZW50Py5zZXRCZWFyaW5nKE1hdGgucm91bmQoYmVhcmluZyAtIE1hdGguYWJzKHJlc3QpKSk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+PC9Sb3RhdGVMZWZ0SWNvbj5cbiAgICAgICAgICA8L1JvdGF0ZUJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbk1sTmF2aWdhdGlvbkNvbXBhc3MucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQ29tcG9uZW50IGlkIHByZWZpeFxuICAgKi9cbiAgaWRQcmVmaXg6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiBTdHlsZSBvYmplY3QgdG8gYWRqdXN0IGNzcyBkZWZpbml0aW9ucyBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKlxuICAgKiBTdHlsZSBvYmplY3QgdG8gYWRqdXN0IGNzcyBkZWZpbml0aW9ucyBvZiB0aGUgYmFja2dyb3VuZC5cbiAgICovXG4gIGJhY2tncm91bmRTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqXG4gICAqIFN0eWxlIG9iamVjdCB0byBhZGp1c3QgY3NzIGRlZmluaXRpb25zIG9mIHRoZSBjb21wYXNzIG5lZWRsZS5cbiAgICovXG4gIG5lZWRsZVN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKipcbiAgICogU3R5bGUgb2JqZWN0IHRvIGFkanVzdCBjc3MgZGVmaW5pdGlvbnMgb2YgdGhlIHJvdGF0ZSByaWdodCBidXR0b24uXG4gICAqL1xuICByb3RhdGVSaWdodFN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKipcbiAgICogU3R5bGUgb2JqZWN0IHRvIGFkanVzdCBjc3MgZGVmaW5pdGlvbnMgb2YgdGhlIHJvdGF0ZSBsZWZ0IGJ1dHRvbi5cbiAgICovXG4gIHJvdGF0ZUxlZnRTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1sTmF2aWdhdGlvbkNvbXBhc3M7XG4iXX0= */")
1807
2213
  }, /*#__PURE__*/React__default.createElement("div", {
@@ -1860,200 +2266,49 @@ var MlNavigationCompass = function MlNavigationCompass(props) {
1860
2266
  rest = 90 + rest;
1861
2267
  }
1862
2268
 
1863
- if (rest === 0) {
1864
- rest = 90;
1865
- }
1866
-
1867
- (_mapRef$current5 = mapRef.current) === null || _mapRef$current5 === void 0 ? void 0 : _mapRef$current5.setBearing(Math.round(bearing - Math.abs(rest)));
1868
- }
1869
- })))));
1870
- };
1871
-
1872
- MlNavigationCompass.propTypes = {
1873
- /**
1874
- * Component id prefix
1875
- */
1876
- idPrefix: PropTypes.string,
1877
-
1878
- /**
1879
- * Style object to adjust css definitions of the component.
1880
- */
1881
- style: PropTypes.object,
1882
-
1883
- /**
1884
- * Style object to adjust css definitions of the background.
1885
- */
1886
- backgroundStyle: PropTypes.object,
1887
-
1888
- /**
1889
- * Style object to adjust css definitions of the compass needle.
1890
- */
1891
- needleStyle: PropTypes.object,
1892
-
1893
- /**
1894
- * Style object to adjust css definitions of the rotate right button.
1895
- */
1896
- rotateRightStyle: PropTypes.object,
1897
-
1898
- /**
1899
- * Style object to adjust css definitions of the rotate left button.
1900
- */
1901
- rotateLeftStyle: PropTypes.object
1902
- };
1903
-
1904
- /**
1905
- * Adds a button that makes the map follow the users GPS position using
1906
- * navigator.geolocation.watchPosition if activated
1907
- *
1908
- * @param {object} props
1909
- * @param {string} props.mapId Id of the target MapLibre instance in mapContext
1910
- *
1911
- * @component
1912
- */
1913
-
1914
- var MlFollowGps = function MlFollowGps(props) {
1915
- // Use a useRef hook to reference the layer object to be able to access it later inside useEffect hooks
1916
- var mapContext = useContext(MapContext);
1917
-
1918
- var _useState = useState(false),
1919
- _useState2 = _slicedToArray(_useState, 2),
1920
- isFollowed = _useState2[0],
1921
- setIsFollowed = _useState2[1];
1922
-
1923
- var _useState3 = useState(undefined),
1924
- _useState4 = _slicedToArray(_useState3, 2),
1925
- geoJson = _useState4[0],
1926
- setGeoJson = _useState4[1];
1927
-
1928
- var watchIdRef = useRef(undefined);
1929
-
1930
- var _useState5 = useState(false),
1931
- _useState6 = _slicedToArray(_useState5, 2),
1932
- locationAccessDenied = _useState6[0],
1933
- setLocationAccessDenied = _useState6[1];
1934
-
1935
- var initializedRef = useRef(false);
1936
- var mapRef = useRef(undefined);
1937
- var componentId = useRef((props.idPrefix ? props.idPrefix : "MlFollowGps-") + v4());
1938
-
1939
- var _useState7 = useState(30),
1940
- _useState8 = _slicedToArray(_useState7, 2),
1941
- accuracyRadius = _useState8[0],
1942
- setAccuracyRadius = _useState8[1];
1943
-
1944
- useEffect(function () {
1945
- var _componentId = componentId.current;
1946
- return function () {
1947
- // This is the cleanup function, it is called when this react component is removed from react-dom
1948
- // try to remove anything this component has added to the MapLibre-gl instance
1949
- // e.g.: remove the layer
1950
- // mapContext.getMap(props.mapId).removeLayer(layerRef.current);
1951
- // check for the existence of map.style before calling getLayer or getSource
1952
- if (mapRef.current) {
1953
- mapRef.current.cleanup(_componentId);
1954
- mapRef.current = undefined;
1955
- }
1956
-
1957
- if (watchIdRef.current) {
1958
- initializedRef.current = false;
1959
- navigator.geolocation.clearWatch(watchIdRef.current);
1960
- watchIdRef.current = undefined;
1961
- }
1962
- };
1963
- }, []);
1964
- useEffect(function () {
1965
- if (!mapContext.mapExists(props.mapId) || initializedRef.current) return; // the MapLibre-gl instance (mapContext.getMap(props.mapId)) is accessible here
1966
- // initialize the layer and add it to the MapLibre-gl instance or do something else with it
1967
-
1968
- initializedRef.current = true;
1969
- mapRef.current = mapContext.getMap(props.mapId);
1970
- mapRef.current.setCenter([7.132122000552613, 50.716405378037706]);
1971
- }, [mapContext.mapIds, mapContext, props.mapId]);
1972
-
1973
- var getLocationSuccess = function getLocationSuccess(pos) {
1974
- if (!mapRef.current) return;
1975
- mapRef.current.setCenter([pos.coords.longitude, pos.coords.latitude]);
1976
- setAccuracyRadius(pos.coords.accuracy);
1977
- setGeoJson(point([pos.coords.longitude, pos.coords.latitude]));
1978
- };
1979
-
1980
- var getLocationError = function getLocationError(err) {
1981
- console.log("Access of user location denied");
1982
- setLocationAccessDenied(true);
1983
- };
1984
-
1985
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, isFollowed && geoJson && /*#__PURE__*/React__default.createElement(MlGeoJsonLayer, {
1986
- geojson: geoJson,
1987
- type: "circle",
1988
- paint: {
1989
- "circle-radius": {
1990
- stops: [[0, 0], [20, accuracyRadius / 0.075 / Math.cos(geoJson.geometry.coordinates[1] * Math.PI / 180)]],
1991
- base: 2
1992
- },
1993
- "circle-color": "#ee7700",
1994
- "circle-opacity": 0.5
1995
- }
1996
- }), isFollowed && geoJson && /*#__PURE__*/React__default.createElement(MlImageMarkerLayer, {
1997
- options: {
1998
- type: "symbol",
1999
- source: {
2000
- type: "geojson",
2001
- data: geoJson
2002
- },
2003
- layout: {
2004
- "icon-size": 0.1,
2005
- "icon-offset": [0, -340]
2006
- }
2007
- },
2008
- imgSrc: "/assets/marker.png"
2009
- }), /*#__PURE__*/React__default.createElement(Button, {
2010
- sx: _objectSpread2({
2011
- zIndex: 1002,
2012
- color: isFollowed ? "#bbb" : "#666"
2013
- }, props.style),
2014
- disabled: locationAccessDenied,
2015
- onClick: function onClick() {
2016
- if (isFollowed) {
2017
- navigator.geolocation.clearWatch(watchIdRef.current);
2018
- } else {
2019
- watchIdRef.current = navigator.geolocation.watchPosition(getLocationSuccess, getLocationError);
2020
- }
2021
-
2022
- setIsFollowed(!isFollowed);
2023
- }
2024
- }, " ", /*#__PURE__*/React__default.createElement(RoomIcon, {
2025
- sx: {}
2026
- }), " "));
2027
- };
2269
+ if (rest === 0) {
2270
+ rest = 90;
2271
+ }
2028
2272
 
2029
- MlFollowGps.defaultProps = {
2030
- mapId: undefined,
2031
- style: {
2032
- minWidth: "30px",
2033
- minHeight: "30px",
2034
- width: "30px",
2035
- height: "30px",
2036
- backgroundColor: "#414141",
2037
- borderRadius: "23%",
2038
- margin: 0.15,
2039
- ":hover": {
2040
- backgroundColor: "#515151",
2041
- color: "#ececec"
2273
+ (_mapRef$current5 = mapRef.current) === null || _mapRef$current5 === void 0 ? void 0 : _mapRef$current5.setBearing(Math.round(bearing - Math.abs(rest)));
2042
2274
  }
2043
- }
2275
+ })))));
2044
2276
  };
2045
- MlFollowGps.propTypes = {
2277
+
2278
+ MlNavigationCompass.propTypes = {
2046
2279
  /**
2047
- * Id of the target MapLibre instance in mapContext
2280
+ * Component id prefix
2048
2281
  */
2049
- mapId: PropTypes.string,
2282
+ idPrefix: PropTypes.string,
2050
2283
 
2051
2284
  /**
2052
- * CSS style object that is applied to the button component
2285
+ * Style object to adjust css definitions of the component.
2286
+ */
2287
+ style: PropTypes.object,
2288
+
2289
+ /**
2290
+ * Style object to adjust css definitions of the background.
2291
+ */
2292
+ backgroundStyle: PropTypes.object,
2293
+
2294
+ /**
2295
+ * Style object to adjust css definitions of the compass needle.
2296
+ */
2297
+ needleStyle: PropTypes.object,
2298
+
2299
+ /**
2300
+ * Style object to adjust css definitions of the rotate right button.
2053
2301
  */
2054
- style: PropTypes.object
2302
+ rotateRightStyle: PropTypes.object,
2303
+
2304
+ /**
2305
+ * Style object to adjust css definitions of the rotate left button.
2306
+ */
2307
+ rotateLeftStyle: PropTypes.object
2055
2308
  };
2056
2309
 
2310
+ var _excluded$1 = ["color"];
2311
+
2057
2312
  var MlNavigationTools = function MlNavigationTools(props) {
2058
2313
  var mapContext = useContext(MapContext);
2059
2314
  var initializedRef = useRef(false);
@@ -2070,21 +2325,22 @@ var MlNavigationTools = function MlNavigationTools(props) {
2070
2325
  locationAccessDenied = _useState4[0],
2071
2326
  setLocationAccessDenied = _useState4[1];
2072
2327
 
2328
+ var mediaIsMobile = useMediaQuery("(max-width:900px)");
2073
2329
  var buttonStyle = {
2074
- minWidth: "30px",
2075
- minHeight: "30px",
2076
- width: "30px",
2077
- height: "30px",
2078
- color: "#bbb",
2330
+ minWidth: "20px",
2331
+ minHeight: "20px",
2332
+ width: mediaIsMobile ? "50px" : "30px",
2333
+ height: mediaIsMobile ? "50px" : "30px",
2079
2334
  backgroundColor: "#414141",
2080
2335
  borderRadius: "23%",
2081
2336
  //border: "1px solid #bbb",
2082
2337
  //boxShadow: "0px 0px 4px rgba(0,0,0,.5)",
2083
2338
  margin: 0.15,
2339
+ fontSize: mediaIsMobile ? "1.5em" : "1.2em",
2084
2340
  ":hover": {
2085
- backgroundColor: "#515151",
2086
- color: "#ececec"
2087
- }
2341
+ backgroundColor: "#515151"
2342
+ },
2343
+ color: "#ececec"
2088
2344
  };
2089
2345
  useEffect(function () {
2090
2346
  var _componentId = componentId.current;
@@ -2164,8 +2420,8 @@ var MlNavigationTools = function MlNavigationTools(props) {
2164
2420
  style: {
2165
2421
  zIndex: 501,
2166
2422
  position: "absolute",
2167
- right: "20px",
2168
- bottom: "20px",
2423
+ right: mediaIsMobile ? "15px" : "5px",
2424
+ bottom: mediaIsMobile ? "40px" : "20px",
2169
2425
  display: "flex",
2170
2426
  flexDirection: "column"
2171
2427
  }
@@ -2173,15 +2429,15 @@ var MlNavigationTools = function MlNavigationTools(props) {
2173
2429
  style: {
2174
2430
  width: "31px",
2175
2431
  position: "relative",
2176
- height: "50px",
2177
- marginLeft: "-5px"
2432
+ height: mediaIsMobile ? "55px" : "45px",
2433
+ marginLeft: mediaIsMobile ? "3px" : "-5px",
2434
+ transform: mediaIsMobile ? "scale(1.6)" : "scale(1)"
2178
2435
  },
2179
2436
  backgroundStyle: {
2180
2437
  boxShadow: "0px 0px 18px rgba(0,0,0,.5)"
2181
2438
  }
2182
2439
  }), /*#__PURE__*/React__default.createElement(Button, {
2183
2440
  sx: _objectSpread2(_objectSpread2({}, buttonStyle), {}, {
2184
- fontSize: ".9em",
2185
2441
  fontWeight: 600
2186
2442
  }),
2187
2443
  onClick: adjustPitch
@@ -2191,15 +2447,22 @@ var MlNavigationTools = function MlNavigationTools(props) {
2191
2447
  disabled: locationAccessDenied
2192
2448
  }, /*#__PURE__*/React__default.createElement(GpsFixedIcon, {
2193
2449
  sx: {
2194
- width: ".9em"
2450
+ fontSize: mediaIsMobile ? "1.5em" : "1.2em"
2195
2451
  }
2196
- })), /*#__PURE__*/React__default.createElement(MlFollowGps, null), /*#__PURE__*/React__default.createElement(ButtonGroup, {
2452
+ })), /*#__PURE__*/React__default.createElement(MlFollowGps, {
2453
+ style: _objectSpread2({}, function (_ref) {
2454
+ var color = _ref.color,
2455
+ rest = _objectWithoutProperties(_ref, _excluded$1);
2456
+
2457
+ return rest;
2458
+ }(buttonStyle))
2459
+ }), /*#__PURE__*/React__default.createElement(ButtonGroup, {
2197
2460
  orientation: "vertical",
2198
2461
  sx: {
2199
- width: "30px",
2462
+ width: "50px",
2200
2463
  border: "none",
2201
2464
  Button: {
2202
- minWidth: "30px !important",
2465
+ minWidth: "20px !important",
2203
2466
  border: "none",
2204
2467
  padding: 0
2205
2468
  },
@@ -2208,22 +2471,42 @@ var MlNavigationTools = function MlNavigationTools(props) {
2208
2471
  }
2209
2472
  }
2210
2473
  }, /*#__PURE__*/React__default.createElement(Button, {
2211
- sx: buttonStyle,
2474
+ sx: _objectSpread2(_objectSpread2({}, buttonStyle), {}, {
2475
+ color: "#ececec"
2476
+ }),
2212
2477
  onClick: zoomIn
2213
- }, /*#__PURE__*/React__default.createElement(ControlPointIcon, null)), /*#__PURE__*/React__default.createElement(Button, {
2214
- sx: buttonStyle,
2478
+ }, /*#__PURE__*/React__default.createElement(ControlPointIcon, {
2479
+ sx: {
2480
+ fontSize: mediaIsMobile ? "1.5em" : "1.2em"
2481
+ }
2482
+ })), /*#__PURE__*/React__default.createElement(Button, {
2483
+ sx: _objectSpread2(_objectSpread2({}, buttonStyle), {}, {
2484
+ color: "#ececec"
2485
+ }),
2215
2486
  onClick: zoomOut
2216
- }, /*#__PURE__*/React__default.createElement(RemoveCircleOutlineIcon, null))));
2487
+ }, /*#__PURE__*/React__default.createElement(RemoveCircleOutlineIcon, {
2488
+ sx: {
2489
+ fontSize: mediaIsMobile ? "1.5em" : "1.2em"
2490
+ }
2491
+ }))));
2217
2492
  };
2218
2493
 
2219
2494
  var MlLayer = function MlLayer(props) {
2220
2495
  // Use a useRef hook to reference the layer object to be able to access it later inside useEffect hooks
2221
2496
  var mapContext = useContext(MapContext);
2497
+ var mapState = useMapState({
2498
+ mapId: props.mapId,
2499
+ watch: {
2500
+ viewport: false,
2501
+ layers: true,
2502
+ sources: false
2503
+ }
2504
+ });
2222
2505
  var layerInitializedRef = useRef(false);
2223
2506
  var mapRef = useRef(null);
2224
2507
  var componentId = useRef((props.layerId ? props.layerId : "MlLayer-") + v4());
2225
2508
  var idSuffixRef = useRef(props.idSuffix || new Date().getTime());
2226
- var layerId = (props.layerId || "MlLayer-") + idSuffixRef.current;
2509
+ var layerId = useRef(props.layerId || componentId.current);
2227
2510
  var layerPaintConfRef = useRef(undefined);
2228
2511
  var layerLayoutConfRef = useRef(undefined);
2229
2512
  useEffect(function () {
@@ -2263,6 +2546,22 @@ var MlLayer = function MlLayer(props) {
2263
2546
  useEffect(function () {
2264
2547
  if (!mapContext.mapExists(props.mapId) || layerInitializedRef.current) return; // the MapLibre-gl instance (mapContext.map) is accessible here
2265
2548
  // initialize the layer and add it to the MapLibre-gl instance or do something else with it
2549
+ //check if insertBeforeLayer exists
2550
+
2551
+ if (props.insertBeforeLayer) {
2552
+ var _mapState$layers;
2553
+
2554
+ var layerFound = false;
2555
+ mapState === null || mapState === void 0 ? void 0 : (_mapState$layers = mapState.layers) === null || _mapState$layers === void 0 ? void 0 : _mapState$layers.forEach(function (layer) {
2556
+ if (layer.id === props.insertBeforeLayer) {
2557
+ layerFound = true;
2558
+ }
2559
+ });
2560
+
2561
+ if (!layerFound) {
2562
+ return;
2563
+ }
2564
+ }
2266
2565
 
2267
2566
  mapRef.current = mapContext.getMap(props.mapId);
2268
2567
 
@@ -2271,7 +2570,7 @@ var MlLayer = function MlLayer(props) {
2271
2570
 
2272
2571
  layerInitializedRef.current = true;
2273
2572
  mapRef.current.addLayer(_objectSpread2({
2274
- id: layerId,
2573
+ id: layerId.current,
2275
2574
  type: "background",
2276
2575
  paint: {
2277
2576
  "background-color": "rgba(0,0,0,0)"
@@ -2280,7 +2579,7 @@ var MlLayer = function MlLayer(props) {
2280
2579
  layerPaintConfRef.current = JSON.stringify((_props$options = props.options) === null || _props$options === void 0 ? void 0 : _props$options.paint);
2281
2580
  layerLayoutConfRef.current = JSON.stringify((_props$options2 = props.options) === null || _props$options2 === void 0 ? void 0 : _props$options2.layout);
2282
2581
  }
2283
- }, [mapContext.mapIds, mapContext, props, layerId]);
2582
+ }, [mapContext.mapIds, mapContext, props, mapState.layers]);
2284
2583
  return /*#__PURE__*/React__default.createElement(React__default.Fragment, null);
2285
2584
  };
2286
2585
 
@@ -2537,7 +2836,7 @@ var defaultProps = {
2537
2836
 
2538
2837
  var MlWmsLayer = function MlWmsLayer(props) {
2539
2838
  var mapContext = useContext(MapContext);
2540
- var componentId = useRef((props.idPrefix ? props.idPrefix : "MlWmsLayer-") + v4());
2839
+ var componentId = useRef(props.layerId || "MlWmsLayer-" + v4());
2541
2840
  var mapRef = useRef(null);
2542
2841
  var initializedRef = useRef(false);
2543
2842
  var layerId = useRef(props.layerId || componentId.current);
@@ -4143,7 +4442,7 @@ var MlLayerMagnify = function MlLayerMagnify(props) {
4143
4442
  return false;
4144
4443
  }
4145
4444
 
4146
- if (!mapContext.mapExists(props.map1Id) || !mapContext.mapExists(props.map2Id)) {
4445
+ if (!mapContext.getMap(props.map1Id) || !mapContext.getMap(props.map2Id)) {
4147
4446
  return false;
4148
4447
  }
4149
4448
 
@@ -4188,7 +4487,7 @@ var MlLayerMagnify = function MlLayerMagnify(props) {
4188
4487
  useEffect(function () {
4189
4488
  if (!mapExists() || syncMoveInitializedRef.current) return;
4190
4489
  syncMoveInitializedRef.current = true;
4191
- syncCleanupFunctionRef.current = syncMove(mapContext.getMap(props.map1Id), mapContext.getMap(props.map2Id));
4490
+ syncCleanupFunctionRef.current = syncMove(mapContext.getMap(props.map1Id).map, mapContext.getMap(props.map2Id).map);
4192
4491
 
4193
4492
  if (mapContext.maps[props.map1Id].getCanvas().clientWidth > mapContext.maps[props.map1Id].getCanvas().clientHeight && magnifierRadiusRef.current * 2 > mapContext.maps[props.map1Id].getCanvas().clientHeight) {
4194
4493
  magnifierRadiusRef.current = Math.floor(mapContext.maps[props.map1Id].getCanvas().clientHeight / 2);
@@ -4300,7 +4599,7 @@ var MlLayerSwipe = function MlLayerSwipe(props) {
4300
4599
  return false;
4301
4600
  }
4302
4601
 
4303
- if (!mapContext.mapExists(props.map1Id) || !mapContext.mapExists(props.map2Id)) {
4602
+ if (!mapContext.getMap(props.map1Id) || !mapContext.getMap(props.map2Id)) {
4304
4603
  return false;
4305
4604
  }
4306
4605
 
@@ -4333,7 +4632,7 @@ var MlLayerSwipe = function MlLayerSwipe(props) {
4333
4632
  useEffect(function () {
4334
4633
  if (!mapExists() || initializedRef.current) return;
4335
4634
  initializedRef.current = true;
4336
- syncCleanupFunctionRef.current = syncMove(mapContext.getMap(props.map1Id), mapContext.getMap(props.map2Id));
4635
+ syncCleanupFunctionRef.current = syncMove(mapContext.getMap(props.map1Id).map, mapContext.getMap(props.map2Id).map);
4337
4636
  onMove({
4338
4637
  clientX: mapContext.maps[props.map1Id].getCanvas().clientWidth / 2
4339
4638
  });
@@ -4399,6 +4698,19 @@ MlLayerSwipe.propTypes = {
4399
4698
  var GeoJsonContext = /*#__PURE__*/React__default.createContext({});
4400
4699
  var GeoJsonContextProvider = GeoJsonContext.Provider;
4401
4700
 
4701
+ /**
4702
+ * https://github.com/mapbox/togeojson
4703
+ *
4704
+ * Copyright (c) 2016 Mapbox All rights reserved.
4705
+ *
4706
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
4707
+ *
4708
+ * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
4709
+ *
4710
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
4711
+ *
4712
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4713
+ */
4402
4714
  var toGeoJSON = function () {
4403
4715
  var removeSpace = /\s*/g,
4404
4716
  trimSpace = /^\s*|\s*$/g,
@@ -5039,6 +5351,7 @@ var MlGPXViewer = function MlGPXViewer(props) {
5039
5351
  setMetaData = _useState6[1];
5040
5352
 
5041
5353
  var fileupload = useRef(null);
5354
+ var mediaIsMobile = useMediaQuery("(max-width:900px)");
5042
5355
  var popup = useRef(new Popup({
5043
5356
  closeButton: false,
5044
5357
  closeOnClick: true
@@ -5236,14 +5549,20 @@ var MlGPXViewer = function MlGPXViewer(props) {
5236
5549
  fileupload.current.click();
5237
5550
  };
5238
5551
 
5239
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(IconButton, {
5240
- onClick: manualUpload,
5552
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("div", {
5241
5553
  style: {
5242
- position: "absolute",
5554
+ position: "fixed",
5243
5555
  right: "5px",
5244
- bottom: "75px",
5245
- backgroundColor: "rgba(255,255,255,1)",
5556
+ bottom: mediaIsMobile ? "40px" : "25px",
5557
+ display: "flex",
5558
+ flexDirection: "column",
5559
+ gap: "5px",
5246
5560
  zIndex: 1000
5561
+ }
5562
+ }, /*#__PURE__*/React__default.createElement(IconButton, {
5563
+ onClick: manualUpload,
5564
+ style: {
5565
+ backgroundColor: "rgba(255,255,255,1)"
5247
5566
  },
5248
5567
  size: "large"
5249
5568
  }, /*#__PURE__*/React__default.createElement("input", {
@@ -5258,14 +5577,10 @@ var MlGPXViewer = function MlGPXViewer(props) {
5258
5577
  }), /*#__PURE__*/React__default.createElement(FileCopy, null)), /*#__PURE__*/React__default.createElement(IconButton, {
5259
5578
  onClick: toogleDrawer,
5260
5579
  style: {
5261
- position: "absolute",
5262
- right: "5px",
5263
- bottom: "25px",
5264
- backgroundColor: "rgba(255,255,255,1)",
5265
- zIndex: 1000
5580
+ backgroundColor: "rgba(255,255,255,1)"
5266
5581
  },
5267
5582
  size: "large"
5268
- }, /*#__PURE__*/React__default.createElement(InfoIcon, null)), /*#__PURE__*/React__default.createElement(Drawer, {
5583
+ }, /*#__PURE__*/React__default.createElement(InfoIcon, null))), /*#__PURE__*/React__default.createElement(Drawer, {
5269
5584
  variant: "persistent",
5270
5585
  anchor: "left",
5271
5586
  open: open
@@ -5366,165 +5681,138 @@ GeoJsonProvider.propTypes = {
5366
5681
  };
5367
5682
 
5368
5683
  /**
5369
- * React hook that allows subscribing to map state changes
5684
+ * MlSpatialElevationProfile returns a Button that will add a standard OSM tile layer to the maplibre-gl instance.
5370
5685
  *
5371
5686
  * @component
5372
5687
  */
5373
5688
 
5374
- function useMapState(props) {
5375
- // Use a useRef hook to reference the layer object to be able to access it later inside useEffect hooks
5689
+ var MlSpatialElevationProfile = function MlSpatialElevationProfile(props) {
5376
5690
  var mapContext = useContext(MapContext);
5691
+ var componentId = useRef((props.idPrefix ? props.idPrefix : "MlSpatialElevationProfile-") + v4());
5692
+ var mapRef = useRef(null);
5377
5693
  var initializedRef = useRef(false);
5378
- var mapRef = useRef(undefined);
5379
-
5380
- var _useState = useState(undefined),
5381
- _useState2 = _slicedToArray(_useState, 2),
5382
- center = _useState2[0],
5383
- setCenter = _useState2[1];
5384
-
5385
- var _useState3 = useState(undefined),
5386
- _useState4 = _slicedToArray(_useState3, 2),
5387
- viewport = _useState4[0],
5388
- setViewport = _useState4[1];
5389
-
5390
- var viewportRef = useRef(undefined);
5391
-
5392
- var _useState5 = useState(undefined),
5393
- _useState6 = _slicedToArray(_useState5, 2),
5394
- layers = _useState6[0],
5395
- setLayers = _useState6[1];
5396
-
5397
- var layersRef = useRef(undefined); //const mapRef = useRef(props.map);
5398
-
5399
- var componentId = useRef(v4());
5400
- /**
5401
- * returns the element if it matches the defined filter criteria
5402
- * to be used as filter function on the layers array
5403
- *
5404
- * @param {object} layer
5405
- */
5406
-
5407
- var layerIdFilter = useCallback(function (layer) {
5408
- if (!props.filter.includeBaseLayers && layer.baseLayer) {
5409
- return false;
5410
- }
5411
-
5412
- if (typeof props.filter.matchLayerIds !== "undefined") {
5413
- if (props.filter.matchLayerIds instanceof RegExp) {
5414
- return props.filter.matchLayerIds.test(layer.id);
5415
- } else {
5416
- return layer.id.includes(props.filter.matchLayerIds);
5417
- }
5418
- }
5419
-
5420
- return true;
5421
- }, [props.filter]);
5422
- var refreshLayerState = useCallback(function () {
5423
- var _layerState = mapRef.current.wrapper.layerState.filter(layerIdFilter);
5424
-
5425
- var _layerStateString = JSON.stringify(_layerState);
5426
-
5427
- if (layersRef.current !== _layerStateString) {
5428
- layersRef.current = _layerStateString;
5429
- setLayers(_layerState);
5430
- }
5431
- }, [layerIdFilter]);
5694
+ var dataSource = useContext(GeoJsonContext);
5695
+ var sourceName = useRef("elevationprofile-" + v4());
5696
+ var layerName = useRef("elevationprofile-layer-" + v4());
5697
+ var createStep = useCallback(function (x, y, z, x2, y2) {
5698
+ //const summand = 0.0002;
5699
+ var line = lineString$1([[x, y], [x2, y2]]);
5700
+ var offsetLine = lineOffset(line, 5, {
5701
+ units: "meters"
5702
+ });
5703
+ var x3 = offsetLine.geometry.coordinates[0][0];
5704
+ var y3 = offsetLine.geometry.coordinates[0][1];
5705
+ var x4 = offsetLine.geometry.coordinates[1][0];
5706
+ var y4 = offsetLine.geometry.coordinates[1][1];
5707
+ return polygon([[[x, y], [x2, y2], [x4, y4], [x3, y3], [x, y]]], {
5708
+ height: z * props.elevationFactor
5709
+ });
5710
+ }, [props.elevationFactor]);
5432
5711
  useEffect(function () {
5433
5712
  var _componentId = componentId.current;
5434
5713
  return function () {
5714
+ // This is the cleanup function, it is called when this react component is removed from react-dom
5435
5715
  if (mapRef.current) {
5436
5716
  mapRef.current.cleanup(_componentId);
5437
- mapRef.current = undefined;
5717
+ mapRef.current = null;
5438
5718
  }
5439
-
5440
- initializedRef.current = false;
5441
5719
  };
5442
5720
  }, []);
5443
5721
  useEffect(function () {
5444
- var _props$watch, _props$watch2;
5445
-
5446
- if (!mapContext.mapExists(props.mapId) || initializedRef.current) return; // the MapLibre-gl instance (mapContext.getMap(props.mapId)) is accessible here
5447
- // initialize the layer and add it to the MapLibre-gl instance or do something else with it
5448
-
5722
+ if (!mapContext.mapExists(props.mapId) || initializedRef.current) return;
5449
5723
  initializedRef.current = true;
5450
5724
  mapRef.current = mapContext.getMap(props.mapId);
5451
- /*
5452
- mapRef.current.on(
5453
- "move",
5454
- () => {
5455
- setCenter(mapRef.current.getCenter());
5456
- },
5457
- componentId.current
5458
- );
5459
- */
5725
+ mapRef.current.addSource(sourceName.current, {
5726
+ type: "geojson",
5727
+ data: dataSource.data
5728
+ }, componentId.current);
5729
+ mapRef.current.addLayer({
5730
+ id: layerName.current,
5731
+ source: sourceName.current,
5732
+ type: "fill-extrusion",
5733
+ paint: {
5734
+ "fill-extrusion-height": ["get", "height"],
5735
+ "fill-extrusion-opacity": 0.9,
5736
+ "fill-extrusion-color": ["interpolate", ["linear"], ["get", "height"], 0, "rgba(0, 0, 255, 0)", 0.1, "royalblue", 0.3, "cyan", 0.5, "lime", 0.7, "yellow", 1, "yellow"]
5737
+ }
5738
+ }, props.insertBeforeLayer, componentId.current);
5739
+ }, [mapContext.mapIds, props.insertBeforeLayer, props.mapId, dataSource, mapContext]);
5740
+ useEffect(function () {
5741
+ var _mapRef$current$getSo;
5460
5742
 
5461
- if (props !== null && props !== void 0 && (_props$watch = props.watch) !== null && _props$watch !== void 0 && _props$watch.viewport) {
5462
- setViewport(mapRef.current.wrapper.viewportState);
5463
- mapRef.current.wrapper.on("viewportchange", function () {
5464
- var _mapRef$current;
5743
+ if (!mapRef.current || !mapRef.current.getLayer(layerName.current)) return;
5744
+ var data = dataSource.data;
5745
+ if (!data || !data.features) return;
5746
+ var line = data.features.find(function (element) {
5747
+ return element.geometry.type === "LineString";
5748
+ });
5749
+ if (!line || !line.geometry) return;
5750
+ var heights = line.geometry.coordinates.map(function (coordinate, index) {
5751
+ return coordinate[2];
5752
+ });
5753
+ var min = Math.min.apply(Math, _toConsumableArray(heights));
5754
+ var max = Math.max.apply(Math, _toConsumableArray(heights)) - min;
5755
+ max = max === 0 ? 1 : max;
5756
+ mapRef.current.setPaintProperty(layerName.current, "fill-extrusion-color", ["interpolate", ["linear"], ["get", "height"], 0, "rgb(0,255,55)", max * props.elevationFactor, "rgb(255,0,0)"]);
5465
5757
 
5466
- if (viewportRef.current !== ((_mapRef$current = mapRef.current) === null || _mapRef$current === void 0 ? void 0 : _mapRef$current.wrapper.viewportStateString)) {
5467
- var _mapRef$current2, _mapRef$current3, _mapRef$current3$wrap;
5758
+ var lerp = function lerp(x, y, a) {
5759
+ return x * (1 - a) + y * a;
5760
+ };
5468
5761
 
5469
- setViewport((_mapRef$current2 = mapRef.current) === null || _mapRef$current2 === void 0 ? void 0 : _mapRef$current2.wrapper.viewportState);
5470
- setCenter((_mapRef$current3 = mapRef.current) === null || _mapRef$current3 === void 0 ? void 0 : (_mapRef$current3$wrap = _mapRef$current3.wrapper.viewportState) === null || _mapRef$current3$wrap === void 0 ? void 0 : _mapRef$current3$wrap.center);
5762
+ var points = [];
5763
+ line.geometry.coordinates.forEach(function (coordinate, index) {
5764
+ //const point = createPoint(coordinate[0],coordinate[1],coordinate[2]-min);
5765
+ //points.push(point);
5766
+ if (line.geometry.coordinates[index + 1]) {
5767
+ var wayLength = distance([coordinate[0], coordinate[1]], [line.geometry.coordinates[index + 1][0], line.geometry.coordinates[index + 1][1]], {
5768
+ units: "kilometers"
5769
+ });
5770
+ var listLength = ~~(wayLength * 1000 / 10);
5771
+ listLength = listLength < 1 ? 1 : listLength;
5772
+
5773
+ for (var i = 0; i < listLength; i++) {
5774
+ var x = lerp(line.geometry.coordinates[index][0], line.geometry.coordinates[index + 1][0], i / listLength);
5775
+ var y = lerp(line.geometry.coordinates[index][1], line.geometry.coordinates[index + 1][1], i / listLength);
5776
+ var z = lerp(line.geometry.coordinates[index][2] - min, line.geometry.coordinates[index + 1][2] - min, i / listLength);
5777
+ var x2 = lerp(line.geometry.coordinates[index][0], line.geometry.coordinates[index + 1][0], (i + 1) / listLength);
5778
+ var y2 = lerp(line.geometry.coordinates[index][1], line.geometry.coordinates[index + 1][1], (i + 1) / listLength);
5779
+ var point = createStep(x, y, z, x2, y2);
5780
+ points.push(point);
5471
5781
  }
5472
- }, componentId.current);
5473
- }
5474
-
5475
- if (props !== null && props !== void 0 && (_props$watch2 = props.watch) !== null && _props$watch2 !== void 0 && _props$watch2.layers) {
5476
- var _props$filter, _props$filter2;
5477
-
5478
- refreshLayerState();
5479
- mapRef.current.wrapper.on("layerchange", refreshLayerState, {
5480
- includeBaseLayers: props === null || props === void 0 ? void 0 : (_props$filter = props.filter) === null || _props$filter === void 0 ? void 0 : _props$filter.includeBaseLayers,
5481
- matchLayerIds: props === null || props === void 0 ? void 0 : (_props$filter2 = props.filter) === null || _props$filter2 === void 0 ? void 0 : _props$filter2.matchLayerIds
5482
- }, componentId.current);
5483
- }
5484
- }, [mapContext.mapIds, mapContext, props.mapId, refreshLayerState]);
5485
- return {
5486
- layers: layers,
5487
- viewport: viewport
5488
- };
5489
- }
5782
+ }
5783
+ });
5784
+ var newData = dataSource.getEmptyFeatureCollection();
5785
+ newData.features = points;
5786
+ (_mapRef$current$getSo = mapRef.current.getSource(sourceName.current)) === null || _mapRef$current$getSo === void 0 ? void 0 : _mapRef$current$getSo.setData(newData);
5787
+ }, [dataSource.data, createStep, dataSource, props.elevationFactor, mapContext]);
5788
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null);
5789
+ };
5490
5790
 
5491
- useMapState.defaultProps = {
5492
- mapId: undefined,
5493
- watch: {
5494
- layers: true,
5495
- sources: false,
5496
- viewport: false
5497
- },
5498
- filter: {
5499
- includeBaseLayers: false
5500
- }
5791
+ MlSpatialElevationProfile.defaultProps = {
5792
+ elevationFactor: 1
5501
5793
  };
5502
- useMapState.propTypes = {
5794
+ MlSpatialElevationProfile.propTypes = {
5503
5795
  /**
5504
5796
  * Id of the target MapLibre instance in mapContext
5505
5797
  */
5506
5798
  mapId: PropTypes.string,
5507
5799
 
5508
5800
  /**
5509
- * Defines map Resources to watch
5801
+ * Prefix of the component id this component uses when adding elements to the MapLibreGl-instance
5510
5802
  */
5511
- watch: PropTypes.shape({
5512
- layers: PropTypes.bool,
5513
- sources: PropTypes.bool,
5514
- viewport: PropTypes.bool
5515
- }),
5803
+ idPrefix: PropTypes.string,
5516
5804
 
5517
5805
  /**
5518
- * Filter string or RegExp to more explicitly define the elements watched and increase performance
5519
- * strings will be matched using layerId.includes(matchString)
5520
- * RegExps will be matched using matchRegExp.test(layerId)
5806
+ * Number describes the factor of the height of the elevation
5521
5807
  */
5522
- filter: PropTypes.shape({
5523
- includeBaseLayers: PropTypes.bool,
5524
- matchLayerIds: PropTypes.oneOfType([PropTypes.string, PropTypes.instanceOf(RegExp)]),
5525
- matchSourceIds: PropTypes.oneOfType([PropTypes.string, PropTypes.instanceOf(RegExp)])
5526
- })
5808
+ elevationFactor: PropTypes.number,
5809
+
5810
+ /**
5811
+ * The layerId of an existing layer this layer should be rendered visually beneath
5812
+ * https://maplibre.org/maplibre-gl-js-docs/api/map/#map#addlayer - see "beforeId" property
5813
+ */
5814
+ insertBeforeLayer: PropTypes.string
5527
5815
  };
5528
5816
 
5529
- export { GeoJsonContext, GeoJsonProvider, MapLibreMap, MlBasicComponent, MlComponentTemplate, MlCreatePdfButton, MlFeatureEditor, MlFillExtrusionLayer, MlGPXViewer, MlGeoJsonLayer, MlImageMarkerLayer, MlLayer, MlLayerMagnify, MlLayerSwipe, MlNavigationCompass, MlNavigationTools, MlOsmLayer, MlVectorTileLayer, MlWmsLayer, useMapState };
5817
+ export { GeoJsonContext, GeoJsonProvider, MapLibreMap, MlBasicComponent, MlComponentTemplate, MlCreatePdfButton, MlFeatureEditor, MlFillExtrusionLayer, MlFollowGps, MlGPXViewer, MlGeoJsonLayer, MlImageMarkerLayer, MlLayer, MlLayerMagnify, MlLayerSwipe, MlNavigationCompass, MlNavigationTools, MlOsmLayer, MlSpatialElevationProfile, MlVectorTileLayer, MlWmsLayer, useMap, useMapState };
5530
5818
  //# sourceMappingURL=index.esm.js.map