react-spatial 1.4.0 → 1.4.1
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.
- package/.github/workflows/conventional-pr-title.yml +21 -0
- package/.github/workflows/main.yml +28 -0
- package/.husky/commit-msg +4 -0
- package/.husky/post-checkout +4 -0
- package/.husky/post-merge +4 -0
- package/.husky/post-rebase +4 -0
- package/.husky/pre-commit +4 -0
- package/.nvmrc +1 -0
- package/.whitesource +8 -0
- package/CHANGELOG.md +54 -0
- package/DEVELOP.md +113 -0
- package/README.md +1 -1
- package/__mocks__/mapbox-gl.js +11 -0
- package/__mocks__/resize-observer-polyfill.js +9 -0
- package/babel.config.js +3 -0
- package/commitlint.config.js +1 -0
- package/data/topic1.js +119 -0
- package/data/topic2.js +28 -0
- package/doc/README.md +21 -0
- package/doc/doc-config.json +4 -0
- package/netlify.toml +3 -0
- package/package.json +30 -41
- package/pull_request_template.md +16 -0
- package/renovate.json +4 -0
- package/scripts/read-pkg-json.js +17 -0
- package/src/components/BaseLayerSwitcher/BaseLayerSwitcher.js +322 -0
- package/src/components/BaseLayerSwitcher/BaseLayerSwitcher.test.js +69 -0
- package/src/components/BaseLayerSwitcher/README.md +61 -0
- package/src/components/BaseLayerSwitcher/__snapshots__/BaseLayerSwitcher.test.js.snap +88 -0
- package/src/components/BaseLayerSwitcher/index.js +1 -0
- package/src/components/BasicMap/BasicMap.js +413 -0
- package/src/components/BasicMap/BasicMap.test.js +281 -0
- package/src/components/BasicMap/README.md +18 -0
- package/src/components/BasicMap/index.js +1 -0
- package/{components → src/components}/CanvasSaveButton/CanvasSaveButton.js +320 -93
- package/src/components/CanvasSaveButton/CanvasSaveButton.test.js +148 -0
- package/src/components/CanvasSaveButton/README.md +76 -0
- package/src/components/CanvasSaveButton/__snapshots__/CanvasSaveButton.test.js.snap +76 -0
- package/src/components/CanvasSaveButton/index.js +1 -0
- package/src/components/Copyright/Copyright.js +89 -0
- package/src/components/Copyright/Copyright.test.js +134 -0
- package/src/components/Copyright/README.md +36 -0
- package/src/components/Copyright/index.js +1 -0
- package/src/components/FeatureExportButton/FeatureExportButton.js +118 -0
- package/src/components/FeatureExportButton/FeatureExportButton.test.js +417 -0
- package/src/components/FeatureExportButton/README.md +76 -0
- package/src/components/FeatureExportButton/__snapshots__/FeatureExportButton.test.js.snap +67 -0
- package/src/components/FeatureExportButton/index.js +1 -0
- package/src/components/FitExtent/FitExtent.js +62 -0
- package/src/components/FitExtent/FitExtent.test.js +48 -0
- package/src/components/FitExtent/README.md +34 -0
- package/src/components/FitExtent/__snapshots__/FitExtent.test.js.snap +13 -0
- package/src/components/FitExtent/index.js +1 -0
- package/{components → src/components}/Geolocation/Geolocation.js +144 -61
- package/src/components/Geolocation/Geolocation.test.js +267 -0
- package/src/components/Geolocation/README.md +25 -0
- package/src/components/Geolocation/__snapshots__/Geolocation.test.js.snap +92 -0
- package/src/components/Geolocation/index.js +1 -0
- package/src/components/LayerTree/LayerTree.js +487 -0
- package/src/components/LayerTree/LayerTree.test.js +337 -0
- package/src/components/LayerTree/README.md +92 -0
- package/src/components/LayerTree/__snapshots__/LayerTree.test.js.snap +1746 -0
- package/src/components/LayerTree/index.js +1 -0
- package/src/components/MousePosition/MousePosition.js +175 -0
- package/src/components/MousePosition/MousePosition.test.js +132 -0
- package/src/components/MousePosition/README.md +50 -0
- package/src/components/MousePosition/__snapshots__/MousePosition.test.js.snap +76 -0
- package/src/components/MousePosition/index.js +1 -0
- package/src/components/NorthArrow/NorthArrow.js +75 -0
- package/src/components/NorthArrow/NorthArrow.test.js +104 -0
- package/src/components/NorthArrow/README.md +59 -0
- package/src/components/NorthArrow/__snapshots__/NorthArrow.test.js.snap +117 -0
- package/src/components/NorthArrow/index.js +1 -0
- package/src/components/Overlay/Overlay.js +176 -0
- package/src/components/Overlay/Overlay.test.js +149 -0
- package/src/components/Overlay/README.md +59 -0
- package/src/components/Overlay/__snapshots__/Overlay.test.js.snap +9 -0
- package/src/components/Overlay/index.js +1 -0
- package/src/components/Permalink/Permalink.js +326 -0
- package/src/components/Permalink/Permalink.test.js +285 -0
- package/src/components/Permalink/README.md +105 -0
- package/src/components/Permalink/index.js +1 -0
- package/{components → src/components}/Popup/Popup.js +165 -55
- package/src/components/Popup/Popup.test.js +307 -0
- package/src/components/Popup/README.md +93 -0
- package/src/components/Popup/__snapshots__/Popup.test.js.snap +180 -0
- package/src/components/Popup/index.js +1 -0
- package/src/components/README.md +41 -0
- package/{components → src/components}/ResizeHandler/ResizeHandler.js +50 -15
- package/src/components/ResizeHandler/ResizeHandler.test.js +344 -0
- package/src/components/ResizeHandler/index.js +1 -0
- package/src/components/RouteSchedule/README.md +118 -0
- package/src/components/RouteSchedule/RouteSchedule.js +364 -0
- package/src/components/RouteSchedule/RouteSchedule.test.js +113 -0
- package/src/components/RouteSchedule/__snapshots__/RouteSchedule.test.js.snap +248 -0
- package/src/components/RouteSchedule/index.js +1 -0
- package/src/components/ScaleLine/README.md +29 -0
- package/src/components/ScaleLine/ScaleLine.js +50 -0
- package/src/components/ScaleLine/ScaleLine.test.js +30 -0
- package/src/components/ScaleLine/__snapshots__/ScaleLine.test.js.snap +7 -0
- package/src/components/ScaleLine/index.js +1 -0
- package/src/components/StopsFinder/README.md +50 -0
- package/src/components/StopsFinder/StopsFinder.js +284 -0
- package/src/components/StopsFinder/StopsFinder.test.js +17 -0
- package/src/components/StopsFinder/StopsFinderOption.js +61 -0
- package/src/components/StopsFinder/__snapshots__/StopsFinder.test.js.snap +133 -0
- package/src/components/StopsFinder/index.js +1 -0
- package/src/components/Zoom/README.md +25 -0
- package/src/components/Zoom/Zoom.js +180 -0
- package/src/components/Zoom/Zoom.test.js +141 -0
- package/src/components/Zoom/__snapshots__/Zoom.test.js.snap +201 -0
- package/src/components/Zoom/index.js +1 -0
- package/{propTypes.js → src/propTypes.js} +16 -12
- package/{setupTests.js → src/setupTests.js} +1 -1
- package/src/styleguidist/ComponentsList.js +52 -0
- package/src/styleguidist/StyleGuide.js +277 -0
- package/src/styleguidist/styleguidist.css +38 -0
- package/src/utils/GlobalsForOle.js +99 -0
- package/src/utils/KML.js +594 -0
- package/src/utils/KML.test.js +337 -0
- package/src/utils/KMLFormat.js +100 -0
- package/src/utils/KMLFormat.test.js +50 -0
- package/{utils → src/utils}/Styles.js +20 -14
- package/src/utils/__snapshots__/KML.test.js.snap.KML-readFeatures()-and-writeFeatures()-should-read-and-write-lineDash-and-fillPattern-style-for-polygon.canvas-image.png +0 -0
- package/src/utils/__snapshots__/getPolygonPattern.test.js.snap.getPolygonPattern()-render-pattern-2-(cross)-color-and-(light-blue)-opacity.canvas-image.png +0 -0
- package/src/utils/__snapshots__/getPolygonPattern.test.js.snap.getPolygonPattern()-render-pattern-3-(diagonal-line-from-bottom-left-tot-top-right)-with-color-(light-blue)-and-opacity.canvas-image.png +0 -0
- package/src/utils/__snapshots__/getPolygonPattern.test.js.snap.getPolygonPattern()-render-pattern-4-(diagonal-line-from-top-left-to-bottom-right)-with-color-(light-blue)-and-opacity.canvas-image.png +0 -0
- package/{utils → src/utils}/getPolygonPattern.js +34 -6
- package/src/utils/getPolygonPattern.test.js +61 -0
- package/{utils → src/utils}/timeUtils.js +22 -5
- package/src/utils/timeUtils.test.js +30 -0
- package/styleguide.config.js +251 -0
- package/components/BaseLayerSwitcher/BaseLayerSwitcher.js +0 -231
- package/components/BaseLayerSwitcher/BaseLayerSwitcher.js.map +0 -7
- package/components/BaseLayerSwitcher/index.js +0 -1
- package/components/BaseLayerSwitcher/index.js.map +0 -7
- package/components/BasicMap/BasicMap.js +0 -278
- package/components/BasicMap/BasicMap.js.map +0 -7
- package/components/BasicMap/index.js +0 -1
- package/components/BasicMap/index.js.map +0 -7
- package/components/CanvasSaveButton/CanvasSaveButton.js.map +0 -7
- package/components/CanvasSaveButton/index.js +0 -1
- package/components/CanvasSaveButton/index.js.map +0 -7
- package/components/Copyright/Copyright.js +0 -55
- package/components/Copyright/Copyright.js.map +0 -7
- package/components/Copyright/index.js +0 -1
- package/components/Copyright/index.js.map +0 -7
- package/components/FeatureExportButton/FeatureExportButton.js +0 -62
- package/components/FeatureExportButton/FeatureExportButton.js.map +0 -7
- package/components/FeatureExportButton/index.js +0 -1
- package/components/FeatureExportButton/index.js.map +0 -7
- package/components/FitExtent/FitExtent.js +0 -32
- package/components/FitExtent/FitExtent.js.map +0 -7
- package/components/FitExtent/index.js +0 -1
- package/components/FitExtent/index.js.map +0 -7
- package/components/Geolocation/Geolocation.js.map +0 -7
- package/components/Geolocation/index.js +0 -1
- package/components/Geolocation/index.js.map +0 -7
- package/components/LayerTree/LayerTree.js +0 -278
- package/components/LayerTree/LayerTree.js.map +0 -7
- package/components/LayerTree/index.js +0 -1
- package/components/LayerTree/index.js.map +0 -7
- package/components/MousePosition/MousePosition.js +0 -110
- package/components/MousePosition/MousePosition.js.map +0 -7
- package/components/MousePosition/index.js +0 -1
- package/components/MousePosition/index.js.map +0 -7
- package/components/NorthArrow/NorthArrow.js +0 -43
- package/components/NorthArrow/NorthArrow.js.map +0 -7
- package/components/NorthArrow/index.js +0 -1
- package/components/NorthArrow/index.js.map +0 -7
- package/components/Overlay/Overlay.js +0 -122
- package/components/Overlay/Overlay.js.map +0 -7
- package/components/Overlay/index.js +0 -1
- package/components/Overlay/index.js.map +0 -7
- package/components/Permalink/Permalink.js +0 -206
- package/components/Permalink/Permalink.js.map +0 -7
- package/components/Permalink/index.js +0 -1
- package/components/Permalink/index.js.map +0 -7
- package/components/Popup/Popup.js.map +0 -7
- package/components/Popup/index.js +0 -1
- package/components/Popup/index.js.map +0 -7
- package/components/ResizeHandler/ResizeHandler.js.map +0 -7
- package/components/ResizeHandler/index.js +0 -1
- package/components/ResizeHandler/index.js.map +0 -7
- package/components/RouteSchedule/RouteSchedule.js +0 -220
- package/components/RouteSchedule/RouteSchedule.js.map +0 -7
- package/components/RouteSchedule/index.js +0 -1
- package/components/RouteSchedule/index.js.map +0 -7
- package/components/ScaleLine/ScaleLine.js +0 -32
- package/components/ScaleLine/ScaleLine.js.map +0 -7
- package/components/ScaleLine/index.js +0 -1
- package/components/ScaleLine/index.js.map +0 -7
- package/components/StopsFinder/StopsFinder.js +0 -210
- package/components/StopsFinder/StopsFinder.js.map +0 -7
- package/components/StopsFinder/StopsFinderOption.js +0 -50
- package/components/StopsFinder/StopsFinderOption.js.map +0 -7
- package/components/StopsFinder/index.js +0 -1
- package/components/StopsFinder/index.js.map +0 -7
- package/components/Zoom/Zoom.js +0 -120
- package/components/Zoom/Zoom.js.map +0 -7
- package/components/Zoom/index.js +0 -1
- package/components/Zoom/index.js.map +0 -7
- package/propTypes.js.map +0 -7
- package/setupTests.js.map +0 -7
- package/utils/GlobalsForOle.js +0 -94
- package/utils/GlobalsForOle.js.map +0 -7
- package/utils/KML.js +0 -412
- package/utils/KML.js.map +0 -7
- package/utils/KMLFormat.js +0 -69
- package/utils/KMLFormat.js.map +0 -7
- package/utils/Styles.js.map +0 -7
- package/utils/getPolygonPattern.js.map +0 -7
- package/utils/timeUtils.js.map +0 -7
- /package/{components → src/components}/BaseLayerSwitcher/BaseLayerSwitcher.md.scss +0 -0
- /package/{components → src/components}/BaseLayerSwitcher/BaseLayerSwitcher.scss +0 -0
- /package/{components → src/components}/BasicMap/BasicMap.md.scss +0 -0
- /package/{components → src/components}/CanvasSaveButton/CanvasSaveButton.md.scss +0 -0
- /package/{components → src/components}/Copyright/Copyright.md.scss +0 -0
- /package/{components → src/components}/FeatureExportButton/FeatureExportButton.md.scss +0 -0
- /package/{components → src/components}/FitExtent/FitExtent.md.scss +0 -0
- /package/{components → src/components}/Geolocation/Geolocation.md.scss +0 -0
- /package/{components → src/components}/Geolocation/Geolocation.scss +0 -0
- /package/{components → src/components}/LayerTree/LayerTree.md.scss +0 -0
- /package/{components → src/components}/LayerTree/LayerTree.scss +0 -0
- /package/{components → src/components}/MousePosition/MousePosition.md.scss +0 -0
- /package/{components → src/components}/NorthArrow/NorthArrow.scss +0 -0
- /package/{components → src/components}/Overlay/Overlay.md.scss +0 -0
- /package/{components → src/components}/Overlay/Overlay.scss +0 -0
- /package/{components → src/components}/Permalink/Permalink.md.scss +0 -0
- /package/{components → src/components}/Popup/Popup.md.scss +0 -0
- /package/{components → src/components}/Popup/Popup.scss +0 -0
- /package/{components → src/components}/RouteSchedule/RouteSchedule.md.scss +0 -0
- /package/{components → src/components}/RouteSchedule/RouteSchedule.scss +0 -0
- /package/{components → src/components}/ScaleLine/ScaleLine.scss +0 -0
- /package/{components → src/components}/Zoom/Zoom.md.scss +0 -0
- /package/{components → src/components}/Zoom/Zoom.scss +0 -0
- /package/{images → src/images}/RouteSchedule/firstStation.png +0 -0
- /package/{images → src/images}/RouteSchedule/lastStation.png +0 -0
- /package/{images → src/images}/RouteSchedule/line.png +0 -0
- /package/{images → src/images}/RouteSchedule/station.png +0 -0
- /package/{images → src/images}/baselayer/baselayer.basebright.png +0 -0
- /package/{images → src/images}/baselayer/baselayer.osm.png +0 -0
- /package/{images → src/images}/baselayer/baselayer.travic.png +0 -0
- /package/{images → src/images}/baselayer/open.topo.map.png +0 -0
- /package/{images → src/images}/baselayer/osm.baselayer.hot.png +0 -0
- /package/{images → src/images}/baselayer/osm.baselayer.png +0 -0
- /package/{images → src/images}/favicon.png +0 -0
- /package/{images → src/images}/geops_logo.png +0 -0
- /package/{images → src/images}/geops_logo.svg +0 -0
- /package/{images → src/images}/geops_qr.png +0 -0
- /package/{images → src/images}/mots/bus_poi-blue-01.svg +0 -0
- /package/{images → src/images}/mots/bus_poi-grey-01.svg +0 -0
- /package/{images → src/images}/mots/bus_round-blue-01.svg +0 -0
- /package/{images → src/images}/mots/bus_round-grey-01.svg +0 -0
- /package/{images → src/images}/mots/bus_square-blue-01.svg +0 -0
- /package/{images → src/images}/mots/bus_square-grey-01.svg +0 -0
- /package/{images → src/images}/mots/cable_car_poi-blue-01.svg +0 -0
- /package/{images → src/images}/mots/cable_car_poi-grey-01.svg +0 -0
- /package/{images → src/images}/mots/cable_car_round-blue-01.svg +0 -0
- /package/{images → src/images}/mots/cable_car_round-grey-01.svg +0 -0
- /package/{images → src/images}/mots/cable_car_square-blue-01.svg +0 -0
- /package/{images → src/images}/mots/cable_car_square-grey-01.svg +0 -0
- /package/{images → src/images}/mots/ferry_poi-blue-01.svg +0 -0
- /package/{images → src/images}/mots/ferry_poi-grey-01.svg +0 -0
- /package/{images → src/images}/mots/ferry_round-blue-01.svg +0 -0
- /package/{images → src/images}/mots/ferry_round-grey-01.svg +0 -0
- /package/{images → src/images}/mots/ferry_square-blue-01.svg +0 -0
- /package/{images → src/images}/mots/ferry_square-grey-01.svg +0 -0
- /package/{images → src/images}/mots/funicular_round-blue-01.svg +0 -0
- /package/{images → src/images}/mots/funicular_round-grey-01.svg +0 -0
- /package/{images → src/images}/mots/funicular_square-blue-01.svg +0 -0
- /package/{images → src/images}/mots/gondola_round-blue-01.svg +0 -0
- /package/{images → src/images}/mots/rail_poi-blue-01.svg +0 -0
- /package/{images → src/images}/mots/rail_poi-grey-01.svg +0 -0
- /package/{images → src/images}/mots/rail_round-blue-01.svg +0 -0
- /package/{images → src/images}/mots/rail_round-grey-01.svg +0 -0
- /package/{images → src/images}/mots/rail_square-blue-01.svg +0 -0
- /package/{images → src/images}/mots/rail_square-grey-01.svg +0 -0
- /package/{images → src/images}/mots/subway_round blue-01.svg +0 -0
- /package/{images → src/images}/mots/subway_round-blue-01.svg +0 -0
- /package/{images → src/images}/mots/tram_poi-blue-01.svg +0 -0
- /package/{images → src/images}/mots/tram_poi-grey-01.svg +0 -0
- /package/{images → src/images}/mots/tram_round-blue-01.svg +0 -0
- /package/{images → src/images}/mots/tram_round-grey-01.svg +0 -0
- /package/{images → src/images}/mots/tram_square-blue-01.svg +0 -0
- /package/{images → src/images}/mots/tram_square-grey-01.svg +0 -0
- /package/{images → src/images}/northArrow.svg +0 -0
- /package/{images → src/images}/northArrow.url.svg +0 -0
- /package/{images → src/images}/northArrowCircle.svg +0 -0
- /package/{images → src/images}/northArrowCircle.url.svg +0 -0
- /package/{themes → src/themes}/README.md +0 -0
- /package/{themes → src/themes}/default/components.scss +0 -0
- /package/{themes → src/themes}/default/examples.scss +0 -0
- /package/{themes → src/themes}/default/index.scss +0 -0
- /package/{themes → src/themes}/default/mixins.scss +0 -0
- /package/{themes → src/themes}/default/variables.scss +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# How to
|
|
2
|
+
|
|
3
|
+
<!-- Please provide a test link and quick description how to see the change -->
|
|
4
|
+
|
|
5
|
+
# Others
|
|
6
|
+
|
|
7
|
+
<!-- Thanks for the PR! Feel free to add or remove items if there are not necessary. -->
|
|
8
|
+
|
|
9
|
+
- [ ] It's not a hack or at least an unauthorized hack :).
|
|
10
|
+
- [ ] The images added are optimized.
|
|
11
|
+
- [ ] Everything in ticket description has been fixed.
|
|
12
|
+
- [ ] The author of the MR has made its own review before assigning the reviewer.
|
|
13
|
+
- [ ] The title means something for a human being and follows the [conventional commits](https://www.conventionalcommits.org/) specification.
|
|
14
|
+
- [ ] The title contains [WIP] if it's necessary.
|
|
15
|
+
- [ ] Labels applied. if it's a release? a hotfix?
|
|
16
|
+
- [ ] Tests added.
|
package/renovate.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const pjson = require('../package.json');
|
|
2
|
+
|
|
3
|
+
const { peerDependencies } = pjson;
|
|
4
|
+
|
|
5
|
+
const packageKeys = Object.keys(peerDependencies);
|
|
6
|
+
|
|
7
|
+
const arg = process.argv[2];
|
|
8
|
+
|
|
9
|
+
if (arg === 'add') {
|
|
10
|
+
console.log(`yarn install --force`);
|
|
11
|
+
} else if (arg === 'remove') {
|
|
12
|
+
console.log(
|
|
13
|
+
`rm -rf ${packageKeys.map((p) => `node_modules/${p}`).join(' ')}`,
|
|
14
|
+
);
|
|
15
|
+
} else {
|
|
16
|
+
console.log('echo "wrong argument."');
|
|
17
|
+
}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/* eslint-disable jsx-a11y/interactive-supports-focus */
|
|
2
|
+
import React, { useState, useEffect } from 'react';
|
|
3
|
+
import PropTypes from 'prop-types';
|
|
4
|
+
import { FaChevronLeft } from 'react-icons/fa';
|
|
5
|
+
import { Layer } from 'mobility-toolbox-js/ol';
|
|
6
|
+
import { unByKey } from 'ol/Observable';
|
|
7
|
+
|
|
8
|
+
const propTypes = {
|
|
9
|
+
/**
|
|
10
|
+
* An array of [mobility-toolbox-js layers](https://mobility-toolbox-js.geops.io/api/identifiers%20html#ol-layers).
|
|
11
|
+
*/
|
|
12
|
+
layers: PropTypes.arrayOf(PropTypes.instanceOf(Layer)).isRequired,
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Object containing relative paths to the base layer images. Object
|
|
16
|
+
* keys need to correspond to layer keys
|
|
17
|
+
*/
|
|
18
|
+
layerImages: PropTypes.objectOf(PropTypes.string),
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* CSS class to apply on the container.
|
|
22
|
+
*/
|
|
23
|
+
className: PropTypes.string,
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Alternative text rendered if layer images can't be loaded
|
|
27
|
+
*/
|
|
28
|
+
altText: PropTypes.string,
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Button titles.
|
|
32
|
+
*/
|
|
33
|
+
titles: PropTypes.shape({
|
|
34
|
+
button: PropTypes.string,
|
|
35
|
+
openSwitcher: PropTypes.string,
|
|
36
|
+
closeSwitcher: PropTypes.string,
|
|
37
|
+
}),
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Image (node) rendered in the switcher close button.
|
|
41
|
+
*/
|
|
42
|
+
closeButtonImage: PropTypes.node,
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Translation function.
|
|
46
|
+
* @param {function} Translation function returning the translated string.
|
|
47
|
+
*/
|
|
48
|
+
t: PropTypes.func,
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const defaultProps = {
|
|
52
|
+
className: 'rs-base-layer-switcher',
|
|
53
|
+
altText: 'Source not found',
|
|
54
|
+
titles: {
|
|
55
|
+
button: 'Base layers',
|
|
56
|
+
openSwitcher: 'Open Baselayer-Switcher',
|
|
57
|
+
closeSwitcher: 'Close Baselayer-Switcher',
|
|
58
|
+
},
|
|
59
|
+
closeButtonImage: <FaChevronLeft />,
|
|
60
|
+
layerImages: undefined,
|
|
61
|
+
t: (s) => {
|
|
62
|
+
return s;
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const getVisibleLayer = (layers) => {
|
|
67
|
+
return layers.find((layer) => {
|
|
68
|
+
return layer.visible;
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const getNextImage = (currentLayer, layers, layerImages) => {
|
|
73
|
+
const currentIndex = layers.indexOf(
|
|
74
|
+
layers.find((layer) => {
|
|
75
|
+
return layer === currentLayer;
|
|
76
|
+
}),
|
|
77
|
+
);
|
|
78
|
+
const nextIndex = currentIndex + 1 === layers.length ? 0 : currentIndex + 1;
|
|
79
|
+
return layerImages[nextIndex];
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const getImageStyle = (url) => {
|
|
83
|
+
return url
|
|
84
|
+
? {
|
|
85
|
+
backgroundImage: `url(${url})`,
|
|
86
|
+
backgroundSize: 'cover',
|
|
87
|
+
backgroundRepeat: 'no-repeat',
|
|
88
|
+
backgroundPosition: 'center',
|
|
89
|
+
}
|
|
90
|
+
: null;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The BaseLayerSwitcher component renders a button interface for switching the visible
|
|
95
|
+
* [mobility-toolbox-js layer](https://mobility-toolbox-js.geops.io/api/identifiers%20html#ol-layers)
|
|
96
|
+
* when defined as base layer.
|
|
97
|
+
*/
|
|
98
|
+
|
|
99
|
+
function BaseLayerSwitcher({
|
|
100
|
+
layers,
|
|
101
|
+
layerImages,
|
|
102
|
+
className,
|
|
103
|
+
altText,
|
|
104
|
+
titles,
|
|
105
|
+
closeButtonImage,
|
|
106
|
+
t,
|
|
107
|
+
}) {
|
|
108
|
+
const [switcherOpen, setSwitcherOpen] = useState(false);
|
|
109
|
+
const [isClosed, setIsClosed] = useState(true);
|
|
110
|
+
const [currentLayer, setCurrentLayer] = useState(
|
|
111
|
+
getVisibleLayer(layers) || layers[0],
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
useEffect(() => {
|
|
115
|
+
// Update the layer selected when a visibility changes.
|
|
116
|
+
const olKeys = (layers || []).map((layer) => {
|
|
117
|
+
return layer.on('change:visible', (evt) => {
|
|
118
|
+
if (evt.target.visible && currentLayer !== evt.target) {
|
|
119
|
+
setCurrentLayer(evt.target);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
return () => {
|
|
124
|
+
unByKey(olKeys);
|
|
125
|
+
};
|
|
126
|
+
}, [currentLayer, layers]);
|
|
127
|
+
|
|
128
|
+
/* Images are loaded from props if provided, fallback from layer */
|
|
129
|
+
const images = layerImages
|
|
130
|
+
? Object.keys(layerImages).map((layerImage) => {
|
|
131
|
+
return layerImages[layerImage];
|
|
132
|
+
})
|
|
133
|
+
: layers.map((layer) => {
|
|
134
|
+
return layer.get('previewImage');
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
const openClass = switcherOpen ? ' rs-open' : '';
|
|
138
|
+
const hiddenStyle = switcherOpen && !isClosed ? 'visible' : 'hidden';
|
|
139
|
+
|
|
140
|
+
const handleSwitcherClick = () => {
|
|
141
|
+
if (layers.length === 2) {
|
|
142
|
+
/* On only two layer options the opener becomes a layer toggle button */
|
|
143
|
+
const nextLayer = layers.find((layer) => {
|
|
144
|
+
return !layer.visible;
|
|
145
|
+
});
|
|
146
|
+
if (currentLayer.setVisible) {
|
|
147
|
+
currentLayer.setVisible(false);
|
|
148
|
+
} else {
|
|
149
|
+
currentLayer.visible = false;
|
|
150
|
+
}
|
|
151
|
+
setCurrentLayer(nextLayer);
|
|
152
|
+
if (nextLayer.setVisible) {
|
|
153
|
+
nextLayer.setVisible(true);
|
|
154
|
+
} else {
|
|
155
|
+
nextLayer.visible = true;
|
|
156
|
+
}
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// eslint-disable-next-line consistent-return
|
|
160
|
+
return setSwitcherOpen(true) && setIsClosed(false);
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
const onLayerSelect = (layer) => {
|
|
164
|
+
if (!switcherOpen) {
|
|
165
|
+
setSwitcherOpen(true);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
setCurrentLayer(layer);
|
|
169
|
+
if (layer.setVisible) {
|
|
170
|
+
layer.setVisible(true);
|
|
171
|
+
} else {
|
|
172
|
+
// eslint-disable-next-line no-param-reassign
|
|
173
|
+
layer.visible = true;
|
|
174
|
+
}
|
|
175
|
+
layers
|
|
176
|
+
.filter((l) => {
|
|
177
|
+
return l !== layer;
|
|
178
|
+
})
|
|
179
|
+
.forEach((l) => {
|
|
180
|
+
if (l.setVisible) {
|
|
181
|
+
l.setVisible(false);
|
|
182
|
+
} else {
|
|
183
|
+
// eslint-disable-next-line no-param-reassign
|
|
184
|
+
l.visible = false;
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
setSwitcherOpen(false);
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
/* Get next image for closed button */
|
|
191
|
+
const nextImage = getNextImage(currentLayer, layers, images);
|
|
192
|
+
|
|
193
|
+
useEffect(() => {
|
|
194
|
+
/* Ensure correct layer is active on app load */
|
|
195
|
+
if (currentLayer !== getVisibleLayer(layers)) {
|
|
196
|
+
setCurrentLayer(getVisibleLayer(layers) || layers[0]);
|
|
197
|
+
}
|
|
198
|
+
}, [currentLayer, layers]);
|
|
199
|
+
|
|
200
|
+
useEffect(() => {
|
|
201
|
+
/* Used for correct layer image render with animation */
|
|
202
|
+
let timeout;
|
|
203
|
+
if (!switcherOpen) {
|
|
204
|
+
timeout = setTimeout(() => {
|
|
205
|
+
setIsClosed(true);
|
|
206
|
+
}, 200);
|
|
207
|
+
} else {
|
|
208
|
+
timeout = setTimeout(() => {
|
|
209
|
+
setIsClosed(false);
|
|
210
|
+
}, 800);
|
|
211
|
+
}
|
|
212
|
+
return () => {
|
|
213
|
+
return clearTimeout(timeout);
|
|
214
|
+
};
|
|
215
|
+
}, [switcherOpen]);
|
|
216
|
+
|
|
217
|
+
if (!layers || layers.length < 2 || !currentLayer) {
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const toggleBtn = (
|
|
222
|
+
<div className="rs-base-layer-switcher-btn-wrapper">
|
|
223
|
+
<div
|
|
224
|
+
className="rs-base-layer-switcher-close-btn"
|
|
225
|
+
role="button"
|
|
226
|
+
onClick={() => {
|
|
227
|
+
return setSwitcherOpen(false);
|
|
228
|
+
}}
|
|
229
|
+
onKeyPress={(e) => {
|
|
230
|
+
return e.which === 13 && setSwitcherOpen(false);
|
|
231
|
+
}}
|
|
232
|
+
tabIndex={switcherOpen ? '0' : '-1'}
|
|
233
|
+
aria-label={titles.closeSwitcher}
|
|
234
|
+
title={titles.closeSwitcher}
|
|
235
|
+
>
|
|
236
|
+
{closeButtonImage}
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
return (
|
|
242
|
+
<div className={`${className}${openClass}`}>
|
|
243
|
+
<div
|
|
244
|
+
className={`rs-base-layer-switcher-button rs-opener${openClass}`}
|
|
245
|
+
role="button"
|
|
246
|
+
title={titles.openSwitcher}
|
|
247
|
+
aria-label={titles.openSwitcher}
|
|
248
|
+
onClick={handleSwitcherClick}
|
|
249
|
+
onKeyPress={(e) => {
|
|
250
|
+
if (e.which === 13) {
|
|
251
|
+
handleSwitcherClick();
|
|
252
|
+
}
|
|
253
|
+
}}
|
|
254
|
+
style={getImageStyle(nextImage)}
|
|
255
|
+
tabIndex="0"
|
|
256
|
+
>
|
|
257
|
+
<div className="rs-base-layer-switcher-title">
|
|
258
|
+
{layers.length !== 2
|
|
259
|
+
? titles.button
|
|
260
|
+
: layers.find((layer) => {
|
|
261
|
+
return !layer.visible;
|
|
262
|
+
}) &&
|
|
263
|
+
t(
|
|
264
|
+
layers.find((layer) => {
|
|
265
|
+
return !layer.visible;
|
|
266
|
+
}).name,
|
|
267
|
+
)}
|
|
268
|
+
</div>
|
|
269
|
+
{nextImage ? null : <span className="rs-alt-text">{t(altText)}</span>}
|
|
270
|
+
</div>
|
|
271
|
+
{layers.map((layer, idx) => {
|
|
272
|
+
const layerName = layer.name;
|
|
273
|
+
const activeClass = layerName === currentLayer.name ? ' rs-active' : '';
|
|
274
|
+
const imageStyle = getImageStyle(
|
|
275
|
+
layerImages ? layerImages[`${layer.key}`] : layer.get('previewImage'),
|
|
276
|
+
);
|
|
277
|
+
return (
|
|
278
|
+
<div
|
|
279
|
+
key={layer.key}
|
|
280
|
+
className="rs-base-layer-switcher-btn-wrapper"
|
|
281
|
+
style={{
|
|
282
|
+
/* stylelint-disable-next-line value-keyword-case */
|
|
283
|
+
overflow: hiddenStyle,
|
|
284
|
+
/* stylelint-disable-next-line value-keyword-case */
|
|
285
|
+
zIndex: layers.length - idx,
|
|
286
|
+
}}
|
|
287
|
+
>
|
|
288
|
+
<div
|
|
289
|
+
className={`rs-base-layer-switcher-button${openClass}`}
|
|
290
|
+
role="button"
|
|
291
|
+
title={t(layerName)}
|
|
292
|
+
aria-label={t(layerName)}
|
|
293
|
+
onClick={() => {
|
|
294
|
+
return onLayerSelect(layer);
|
|
295
|
+
}}
|
|
296
|
+
onKeyPress={(e) => {
|
|
297
|
+
if (e.which === 13) {
|
|
298
|
+
onLayerSelect(layer);
|
|
299
|
+
}
|
|
300
|
+
}}
|
|
301
|
+
style={imageStyle}
|
|
302
|
+
tabIndex={switcherOpen ? '0' : '-1'}
|
|
303
|
+
>
|
|
304
|
+
<div className={`rs-base-layer-switcher-title${activeClass}`}>
|
|
305
|
+
{t(layerName)}
|
|
306
|
+
</div>
|
|
307
|
+
{imageStyle ? null : (
|
|
308
|
+
<span className="rs-alt-text">{t(altText)}</span>
|
|
309
|
+
)}
|
|
310
|
+
</div>
|
|
311
|
+
</div>
|
|
312
|
+
);
|
|
313
|
+
})}
|
|
314
|
+
{toggleBtn}
|
|
315
|
+
</div>
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
BaseLayerSwitcher.propTypes = propTypes;
|
|
320
|
+
BaseLayerSwitcher.defaultProps = defaultProps;
|
|
321
|
+
|
|
322
|
+
export default BaseLayerSwitcher;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Layer } from 'mobility-toolbox-js/ol';
|
|
3
|
+
import { fireEvent, render } from '@testing-library/react';
|
|
4
|
+
import BaseLayerSwitcher from './BaseLayerSwitcher';
|
|
5
|
+
|
|
6
|
+
describe('BaseLayerSwitcher', () => {
|
|
7
|
+
let layers;
|
|
8
|
+
const layerImages = {
|
|
9
|
+
layerFoo: 'foo',
|
|
10
|
+
layerBar: 'bar',
|
|
11
|
+
layerFoobar: 'foobar',
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
layers = [
|
|
16
|
+
new Layer({
|
|
17
|
+
name: 'bl1',
|
|
18
|
+
}),
|
|
19
|
+
new Layer({
|
|
20
|
+
name: 'bl2',
|
|
21
|
+
visible: false,
|
|
22
|
+
}),
|
|
23
|
+
new Layer({
|
|
24
|
+
name: 'bl3',
|
|
25
|
+
visible: false,
|
|
26
|
+
}),
|
|
27
|
+
];
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
describe('matches snapshots', () => {
|
|
31
|
+
test('using default properties.', () => {
|
|
32
|
+
const { container } = render(
|
|
33
|
+
<BaseLayerSwitcher layers={layers} layerImages={layerImages} />,
|
|
34
|
+
);
|
|
35
|
+
expect(container.innerHTML).toMatchSnapshot();
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test('the correct baselayer is visible on mount', () => {
|
|
40
|
+
render(<BaseLayerSwitcher layers={layers} layerImages={layerImages} />);
|
|
41
|
+
expect(layers[0].visible).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('removes open class and switches layer on click', async () => {
|
|
45
|
+
const { container } = render(
|
|
46
|
+
<BaseLayerSwitcher layers={layers} layerImages={layerImages} />,
|
|
47
|
+
);
|
|
48
|
+
await fireEvent.click(container.querySelector('.rs-opener'));
|
|
49
|
+
await fireEvent.click(
|
|
50
|
+
container.querySelectorAll('.rs-base-layer-switcher-button')[3],
|
|
51
|
+
);
|
|
52
|
+
expect(layers[2].visible).toBe(true);
|
|
53
|
+
expect(!!container.querySelector('.rs-base-layer-switcher rs-open')).toBe(
|
|
54
|
+
false,
|
|
55
|
+
);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test('toggles base map instead of opening when only two base layers', async () => {
|
|
59
|
+
const { container } = render(
|
|
60
|
+
<BaseLayerSwitcher layers={layers.slice(0, 2)} />,
|
|
61
|
+
);
|
|
62
|
+
expect(layers[0].visible).toBe(true);
|
|
63
|
+
await fireEvent.click(container.querySelector('.rs-opener'));
|
|
64
|
+
expect(layers[1].visible).toBe(true);
|
|
65
|
+
expect(!!container.querySelector('.rs-base-layer-switcher rs-open')).toBe(
|
|
66
|
+
false,
|
|
67
|
+
);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
The following example demonstrates the use of BaseLayerSwitcher:
|
|
2
|
+
|
|
3
|
+
```jsx
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import Map from 'ol/Map';
|
|
6
|
+
import TileLayer from 'ol/layer/Tile';
|
|
7
|
+
import OSM from 'ol/source/OSM';
|
|
8
|
+
import { MapboxLayer, Layer } from 'mobility-toolbox-js/ol';
|
|
9
|
+
import BaseLayerSwitcher from 'react-spatial/components/BaseLayerSwitcher';
|
|
10
|
+
import BasicMap from 'react-spatial/components/BasicMap';
|
|
11
|
+
import osmImage from 'react-spatial/images/baselayer/baselayer.osm.png';
|
|
12
|
+
import travicImage from 'react-spatial/images/baselayer/baselayer.travic.png';
|
|
13
|
+
import basebrightImage from 'react-spatial/images/baselayer/baselayer.basebright.png';
|
|
14
|
+
|
|
15
|
+
const center = [1149722.7037660484, 6618091.313553318];
|
|
16
|
+
const map = new Map({ controls: [] });
|
|
17
|
+
const travicLayer = new MapboxLayer({
|
|
18
|
+
url: `https://maps.geops.io/styles/travic_v2/style.json?key=${apiKey}`,
|
|
19
|
+
name: 'Travic',
|
|
20
|
+
key: 'travic.baselayer',
|
|
21
|
+
visible: true,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const basebrightLayer = new MapboxLayer({
|
|
25
|
+
url: `https://maps.geops.io/styles/base_bright_v2/style.json?key=${apiKey}`,
|
|
26
|
+
name: 'Base - Bright',
|
|
27
|
+
key: 'basebright.baselayer',
|
|
28
|
+
visible: false,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const osmLayer = new Layer({
|
|
32
|
+
olLayer: new TileLayer({
|
|
33
|
+
source: new OSM(),
|
|
34
|
+
}),
|
|
35
|
+
name: 'OSM',
|
|
36
|
+
key: 'osm.baselayer',
|
|
37
|
+
visible: false,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const layerImages = {
|
|
41
|
+
'travic.baselayer': travicImage,
|
|
42
|
+
'basebright.baselayer': basebrightImage,
|
|
43
|
+
'osm.baselayer': osmImage,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const layers = [travicLayer, basebrightLayer, osmLayer];
|
|
47
|
+
|
|
48
|
+
<div className="rs-base-layer-example">
|
|
49
|
+
<BasicMap
|
|
50
|
+
map={map}
|
|
51
|
+
center={center}
|
|
52
|
+
zoom={6}
|
|
53
|
+
layers={layers}
|
|
54
|
+
tabIndex={0}
|
|
55
|
+
/>
|
|
56
|
+
<BaseLayerSwitcher
|
|
57
|
+
layers={layers}
|
|
58
|
+
layerImages={layerImages}
|
|
59
|
+
/>
|
|
60
|
+
</div>;
|
|
61
|
+
```
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`BaseLayerSwitcher matches snapshots using default properties. 1`] = `
|
|
4
|
+
<div class="rs-base-layer-switcher">
|
|
5
|
+
<div class="rs-base-layer-switcher-button rs-opener"
|
|
6
|
+
role="button"
|
|
7
|
+
title="Open Baselayer-Switcher"
|
|
8
|
+
aria-label="Open Baselayer-Switcher"
|
|
9
|
+
style="background-image: url(bar); background-size: cover; background-repeat: no-repeat; background-position: center;"
|
|
10
|
+
tabindex="0"
|
|
11
|
+
>
|
|
12
|
+
<div class="rs-base-layer-switcher-title">
|
|
13
|
+
Base layers
|
|
14
|
+
</div>
|
|
15
|
+
</div>
|
|
16
|
+
<div class="rs-base-layer-switcher-btn-wrapper"
|
|
17
|
+
style="overflow: hidden; z-index: 3;"
|
|
18
|
+
>
|
|
19
|
+
<div class="rs-base-layer-switcher-button"
|
|
20
|
+
role="button"
|
|
21
|
+
title="bl1"
|
|
22
|
+
aria-label="bl1"
|
|
23
|
+
tabindex="-1"
|
|
24
|
+
>
|
|
25
|
+
<div class="rs-base-layer-switcher-title rs-active">
|
|
26
|
+
bl1
|
|
27
|
+
</div>
|
|
28
|
+
<span class="rs-alt-text">
|
|
29
|
+
Source not found
|
|
30
|
+
</span>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
<div class="rs-base-layer-switcher-btn-wrapper"
|
|
34
|
+
style="overflow: hidden; z-index: 2;"
|
|
35
|
+
>
|
|
36
|
+
<div class="rs-base-layer-switcher-button"
|
|
37
|
+
role="button"
|
|
38
|
+
title="bl2"
|
|
39
|
+
aria-label="bl2"
|
|
40
|
+
tabindex="-1"
|
|
41
|
+
>
|
|
42
|
+
<div class="rs-base-layer-switcher-title">
|
|
43
|
+
bl2
|
|
44
|
+
</div>
|
|
45
|
+
<span class="rs-alt-text">
|
|
46
|
+
Source not found
|
|
47
|
+
</span>
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
<div class="rs-base-layer-switcher-btn-wrapper"
|
|
51
|
+
style="overflow: hidden; z-index: 1;"
|
|
52
|
+
>
|
|
53
|
+
<div class="rs-base-layer-switcher-button"
|
|
54
|
+
role="button"
|
|
55
|
+
title="bl3"
|
|
56
|
+
aria-label="bl3"
|
|
57
|
+
tabindex="-1"
|
|
58
|
+
>
|
|
59
|
+
<div class="rs-base-layer-switcher-title">
|
|
60
|
+
bl3
|
|
61
|
+
</div>
|
|
62
|
+
<span class="rs-alt-text">
|
|
63
|
+
Source not found
|
|
64
|
+
</span>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
<div class="rs-base-layer-switcher-btn-wrapper">
|
|
68
|
+
<div class="rs-base-layer-switcher-close-btn"
|
|
69
|
+
role="button"
|
|
70
|
+
tabindex="-1"
|
|
71
|
+
aria-label="Close Baselayer-Switcher"
|
|
72
|
+
title="Close Baselayer-Switcher"
|
|
73
|
+
>
|
|
74
|
+
<svg stroke="currentColor"
|
|
75
|
+
fill="currentColor"
|
|
76
|
+
stroke-width="0"
|
|
77
|
+
viewbox="0 0 320 512"
|
|
78
|
+
height="1em"
|
|
79
|
+
width="1em"
|
|
80
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
81
|
+
>
|
|
82
|
+
<path d="M34.52 239.03L228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z">
|
|
83
|
+
</path>
|
|
84
|
+
</svg>
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './BaseLayerSwitcher';
|