0 ? null : styles.disabled
+ selectedLines.length > 0 ? null : styles.disabled,
+ isMobile ? styles.buttonMobile : null
)}>
Siirry karttanäkymään
diff --git a/src/components/home.module.css b/src/components/home.module.css
index 2fd3280..ed2cf73 100644
--- a/src/components/home.module.css
+++ b/src/components/home.module.css
@@ -2,6 +2,10 @@
padding: var(--contentContainerPadding);
}
+.rootMobile {
+ overflow: hidden;
+}
+
.button {
color: #fff;
text-align: center;
@@ -17,6 +21,11 @@
width: 350px;
transition: 0.2s;
margin-right: 15px;
+ border-radius: 5px;
+}
+
+.buttonMobile {
+ height: 40px;
}
.disabled {
@@ -41,6 +50,10 @@
border-top: 1px solid #dedede;
}
+.buttonContainerMobile {
+ flex-direction: column;
+}
+
.divider {
margin: 10px;
border-bottom: 1px solid #dedede;
diff --git a/src/components/lineList.js b/src/components/lineList.js
index f2feb8c..aa381a1 100644
--- a/src/components/lineList.js
+++ b/src/components/lineList.js
@@ -169,7 +169,11 @@ const LineList = inject("lineStore")(
.map((line, index) => (
handleClick(line)}>
diff --git a/src/components/lineList.module.css b/src/components/lineList.module.css
index c715450..9ce767d 100644
--- a/src/components/lineList.module.css
+++ b/src/components/lineList.module.css
@@ -6,6 +6,12 @@
border-radius: 5px;
}
+.divContainerMobile {
+ margin: 5px;
+ padding: 3px 3px 3px 7px;
+ border-radius: 5px;
+}
+
.loading {
padding-top: 10vh;
}
diff --git a/src/components/map.js b/src/components/map.js
index b84fafb..714171a 100644
--- a/src/components/map.js
+++ b/src/components/map.js
@@ -1,11 +1,14 @@
import React from "react";
+import Header from "./header";
import Sidebar from "./sidebar";
import MapLeaflet from "./mapLeaflet";
+import classnames from "classnames";
import styles from "./map.module.css";
+import { isMobile } from "../utils/browser";
const COLORS = [
"66B2FF",
- "FF3333",
+ "ff6633",
"10864B",
"CDB100",
"1D80B2",
@@ -13,7 +16,6 @@ const COLORS = [
"F7922D",
"DC00DC",
];
-
class Map extends React.Component {
constructor() {
super();
@@ -23,13 +25,32 @@ class Map extends React.Component {
showFilterFullScreen: false,
isFullScreen: false,
center: null,
+ bottomsheetState: { context: { mapBottomPadding: 0, buttonBottomPadding: 0 } },
+ isMobile: false,
+ showPrintLayout: false,
};
this.mapLeafletToggleFullscreen = this.mapLeafletToggleFullscreen.bind(this);
this.routeFilterToggleFilter = this.routeFilterToggleFilter.bind(this);
this.routeFilterItemToggleChecked = this.routeFilterItemToggleChecked.bind(this);
this.setMapCenter = this.setMapCenter.bind(this);
+ this.setDrawerHeight = this.setDrawerHeight.bind(this);
+ }
+
+ componentDidMount() {
+ window.addEventListener("resize", this.resizeHandler);
+ this.setState({ isMobile: isMobile });
+ this.togglePrintLayout = this.togglePrintLayout.bind(this);
}
+ componentWillUnmount() {
+ window.removeEventListener("resize", this.resizeHandler);
+ }
+
+ resizeHandler = () => {
+ const mobile = window.innerWidth < 700;
+ this.setState({ isMobile: mobile });
+ };
+
setMapCenter(center) {
this.setState({ center });
}
@@ -86,12 +107,22 @@ class Map extends React.Component {
return routes;
}
+ setDrawerHeight = (height) => {
+ if (this.refs.drawer.scrollTop < height) {
+ this.refs.drawer.scrollTop = height;
+ }
+ };
+ togglePrintLayout() {
+ this.setState({ showPrintLayout: !this.state.showPrintLayout });
+ this.setState();
+ }
+
render() {
const lines = this.props.mapProps.map((props) => {
const routes = props.lineRoutes.map((r) => ({
- ...r,
- name: props.nameFi,
- id: `${props.nameFi}_${r.routeId}_${r.direction}_${r.dateBegin}_${r.dateEnd}`
+ ...r,
+ name: props.nameFi,
+ id: `${props.nameFi}_${r.routeId}_${r.direction}_${r.dateBegin}_${r.dateEnd}`,
}));
return {
lineId: props.lineId,
@@ -103,32 +134,71 @@ class Map extends React.Component {
notes: props.notes,
};
});
-
- const routes = lines.reduce(( acc, curr ) => acc.concat(curr.routes), [])
+ const routes = lines.reduce((acc, curr) => acc.concat(curr.routes), []);
const coloredRoutes = this.coloredRoutes(routes);
+
+ const mapComponent = (
+
+ );
+
return (
-
-
+ {this.state.isMobile &&
}
+ {this.state.isMobile && (
+
+ )}
+ {!this.state.isMobile && (
+
+ )}
+ {this.state.isMobile ? (
+
{mapComponent}
+ ) : (
+ mapComponent
+ )}
);
}
diff --git a/src/components/map.module.css b/src/components/map.module.css
index bdc4fae..744b819 100644
--- a/src/components/map.module.css
+++ b/src/components/map.module.css
@@ -8,3 +8,50 @@
flex-direction: row;
}
}
+
+.drawerContainer {
+ background-color: #eef1f3;
+ overflow-y: scroll;
+ height: 100%;
+ position: absolute;
+ width: 100%;
+ scroll-behavior: smooth;
+}
+
+.drawerPadding {
+ height: 99%;
+ width: 0;
+}
+
+.drawerContent {
+ z-index: 5;
+ min-height: 55vh;
+ background: white;
+ position: relative;
+ background-color: #eef1f3;
+}
+
+.dragLine {
+ width: 30px;
+ height: 4px;
+ border-radius: 2px;
+ background-color: #cccccc;
+ display: block;
+ z-index: 2;
+ margin: auto;
+ position: relative;
+ top: -65px;
+}
+.contentContainer {
+ position: relative;
+ transition: 0.5s;
+ top: -80px;
+ box-shadow: 0 -10px 10px -10px rgba(0, 0, 0, 0.3);
+ border-radius: 15px 15px 0 0;
+ padding-top: 15px;
+ background-color: #eef1f3;
+}
+
+.mapContainer {
+ z-index: 1;
+}
diff --git a/src/components/mapContainer.js b/src/components/mapContainer.js
index 6722c04..d74b6b9 100644
--- a/src/components/mapContainer.js
+++ b/src/components/mapContainer.js
@@ -80,6 +80,7 @@ const restroomQuery = `
lon
point
dateImported
+ mode
}
}
}
@@ -122,9 +123,16 @@ class MapContainer extends Component {
const restrooms = await fetch({
query: restroomQuery,
});
- return restrooms.data && restrooms.data.allRestrooms
- ? restrooms.data.allRestrooms.edges
- : [];
+
+ const restroomsData =
+ restrooms.data && restrooms.data.allRestrooms
+ ? restrooms.data.allRestrooms.edges
+ : [];
+
+ const restroomsInUse = restroomsData.filter(
+ (restroom) => restroom.node.mode === "käytössä"
+ );
+ return restroomsInUse;
};
lineObject = (param, params, index) => {
diff --git a/src/components/mapLeaflet.js b/src/components/mapLeaflet.js
index f4f9ea4..0869a45 100644
--- a/src/components/mapLeaflet.js
+++ b/src/components/mapLeaflet.js
@@ -4,6 +4,12 @@ import L from "leaflet";
import { first, last } from "lodash";
import "leaflet/dist/leaflet.css";
import { mapIcon, stopIcon } from "../utils/mapIcon";
+import {
+ closestPointCompareReducer,
+ closestPointInGeometry,
+} from "../utils/closestPoint";
+import { circleMarker } from "leaflet";
+import "mapillary-js/dist/mapillary.css";
import startIcon1 from "../icons/icon-suunta1.svg";
import startIcon2 from "../icons/icon-suunta2.svg";
import timeIcon1 from "../icons/icon-time1.svg";
@@ -15,6 +21,8 @@ import fullScreenEnterIcon from "../icons/icon-fullscreen-enter.svg";
import fullScreenExitIcon from "../icons/icon-fullscreen-exit.svg";
import restroomIcon from "../icons/restroom-solid.svg";
import styles from "./mapLeaflet.module.css";
+import MapillaryViewer from "./MapillaryViewer.js";
+import { isMobile } from "../utils/browser";
const MAX_DISTANCE_TO_RESTROOM = 500;
@@ -47,18 +55,19 @@ const addMarkersToLayer = (stops, direction, map, restrooms) => {
const firstStopMarkerLatLng = L.marker([firstStop.lat, firstStop.lon]).getLatLng();
const lastStopMarkerLatLng = L.marker([lastStop.lat, lastStop.lon]).getLatLng();
const closeByRestrooms = [];
- restrooms.forEach((restroom) => {
- const restroomMarker = L.marker([restroom.node.lat, restroom.node.lon]).getLatLng();
- const distanceFromFirstStop = firstStopMarkerLatLng.distanceTo(restroomMarker);
- const distanceFromLastStop = lastStopMarkerLatLng.distanceTo(restroomMarker);
- if (
- distanceFromFirstStop < MAX_DISTANCE_TO_RESTROOM ||
- distanceFromLastStop < MAX_DISTANCE_TO_RESTROOM
- ) {
- closeByRestrooms.push(restroom.node);
- }
- });
-
+ if (restrooms) {
+ restrooms.forEach((restroom) => {
+ const restroomMarker = L.marker([restroom.node.lat, restroom.node.lon]).getLatLng();
+ const distanceFromFirstStop = firstStopMarkerLatLng.distanceTo(restroomMarker);
+ const distanceFromLastStop = lastStopMarkerLatLng.distanceTo(restroomMarker);
+ if (
+ distanceFromFirstStop < MAX_DISTANCE_TO_RESTROOM ||
+ distanceFromLastStop < MAX_DISTANCE_TO_RESTROOM
+ ) {
+ closeByRestrooms.push(restroom.node);
+ }
+ });
+ }
closeByRestrooms.forEach((closeByRestroom) => {
let icon = mapIcon(restroomIcon);
const markerr = L.marker([closeByRestroom.lat, closeByRestroom.lon], { icon });
@@ -101,7 +110,7 @@ const addGeometryLayer = (geometries, map) => {
});
};
-const addControlButton = (map, toggleFullscreen) => {
+const addControlButton = (map, toggleFullscreen, resetMapillaryLocation) => {
const FullScreenControl = L.Control.extend({
options: {
position: "topleft",
@@ -116,6 +125,7 @@ const addControlButton = (map, toggleFullscreen) => {
container.appendChild(icon);
container.onclick = () => {
icon.src = toggleFullscreen() ? fullScreenExitIcon : fullScreenEnterIcon;
+ resetMapillaryLocation();
};
L.DomEvent.disableClickPropagation(container);
return container;
@@ -147,15 +157,41 @@ const addLocationButton = (map, toggleLocation) => {
map.addControl(new LocationControl());
};
+const addMapillaryButton = (map, initMapillaryLayer) => {
+ const MapillaryControl = L.Control.extend({
+ options: {
+ position: "topleft",
+ },
+ onAdd: () => {
+ const icon = L.DomUtil.create("div");
+ const container = L.DomUtil.create("button", "leaflet-bar leaflet-control");
+ icon.height = "11";
+ icon.width = "11";
+ icon.innerHTML = "M";
+ icon.style.fontSize = "15px";
+ icon.style.fontWeight = "500";
+ container.className = styles.controlButton;
+ icon.style.color = isMobile ? "black" : "rgb(5, 203, 99)";
+ container.appendChild(icon);
+ container.onclick = () => {
+ icon.style.color = initMapillaryLayer() ? "rgb(5, 203, 99)" : "black";
+ };
+ L.DomEvent.disableClickPropagation(container);
+ return container;
+ },
+ });
+ map.addControl(new MapillaryControl());
+};
+
const addRouteFilterLayer = (map) => {
const RouteFilterControl = L.Control.extend({
options: {
- position: "bottomright",
+ position: "topright",
},
onAdd: () => {
const container = L.DomUtil.create(
"div",
- "leaflet-bar leaflet-control leaflet-control-bottomright " + styles.filterArea
+ "leaflet-bar leaflet-control leaflet-control-topright " + styles.filterArea
);
L.DomEvent.disableScrollPropagation(container);
L.DomEvent.disableClickPropagation(container);
@@ -165,11 +201,18 @@ const addRouteFilterLayer = (map) => {
map.addControl(new RouteFilterControl());
};
-const updateFilterLayer = (isFullScreen) => {
+const updateFilterLayer = (isFullScreen, isRouteFilterExpanded, mapillaryLocation) => {
// This function moves all routeFilters from sidebar to map and vice versa
+ const routeFilter = document.getElementsByClassName("leaflet-control-topright")[0];
+
if (isFullScreen) {
+ if (isRouteFilterExpanded && mapillaryLocation) {
+ routeFilter.style.height = "45vh";
+ } else {
+ routeFilter.style.height = null;
+ }
for (const node of document.querySelectorAll(".route-filter")) {
- document.getElementsByClassName("leaflet-control-bottomright")[0].appendChild(node);
+ document.getElementsByClassName("leaflet-control-topright")[0].appendChild(node);
}
} else {
for (const node of document.querySelectorAll(".route-filter")) {
@@ -186,6 +229,9 @@ class MapLeaflet extends React.Component {
this.state = {
locationOn: false,
locationMarker: null,
+ showMapillaryLayer: !isMobile,
+ mapillaryLocation: null,
+ mapillaryImageLocation: null,
};
this.map = null;
@@ -193,18 +239,31 @@ class MapLeaflet extends React.Component {
this.initializeMap = this.initializeMap.bind(this);
this.addLayersToMap = this.addLayersToMap.bind(this);
this.toggleLocation = this.toggleLocation.bind(this);
+ this.initMapillaryLayer = this.initMapillaryLayer.bind(this);
+ this.bindEvents = this.bindEvents.bind(this);
+ this.onClick = this.onClick.bind(this);
+ this.setMapillaryLocation = this.setMapillaryLocation.bind(this);
}
componentDidMount() {
this.initializeMap();
+ this.bindEvents();
}
componentDidUpdate(prevProps, prevState) {
// All layers except the base layer are removed when the component is updated
this.map.eachLayer((layer) => {
- if (!layer.options.baseLayer) this.map.removeLayer(layer);
+ if (!layer.options.baseLayer) {
+ if (
+ layer.options.type !== "mapillaryGeoJsonLayer" &&
+ layer.options.type !== "mapillaryImageMarker" &&
+ layer.options.type !== "mapillaryHighlightMarker" &&
+ !layer._layers
+ ) {
+ this.map.removeLayer(layer);
+ }
+ }
});
-
// Leaflet map is updated once geometry and stop data has been fetched
// The view (bounding box) is set only the first time the route stops are recieved
if (
@@ -236,10 +295,56 @@ class MapLeaflet extends React.Component {
this.state.locationMarker.addTo(this.map);
}
- updateFilterLayer(this.props.isFullScreen);
+ if (this.props.selectedRoutes.length !== prevProps.selectedRoutes.length) {
+ this.resetMapillaryLocation();
+ }
+
+ updateFilterLayer(
+ this.props.isFullScreen,
+ this.props.isRouteFilterExpanded,
+ this.state.mapillaryLocation
+ );
this.map.invalidateSize();
}
+ bindEvents = () => {
+ if (!this.map || this.eventsEnabled) {
+ return;
+ }
+
+ this.map.on("click", this.onClick);
+ this.map.on("mousemove", this.onHover);
+ this.eventsEnabled = true;
+ };
+
+ unbindEvents = () => {
+ if (!this.map || !this.eventsEnabled) {
+ return;
+ }
+
+ this.map.off("click", this.onMapClick);
+ this.map.off("mousemove", this.onHover);
+ this.eventsEnabled = false;
+ };
+
+ removeMarker = () => {
+ if (this.marker) {
+ this.marker.remove();
+ this.marker = null;
+ }
+ };
+
+ componentWillUnmount() {
+ this.unbindEvents();
+ this.removeMarker();
+ }
+
+ initMapillaryLayer() {
+ const showMapillaryLayer = this.state.showMapillaryLayer;
+ this.setState({ showMapillaryLayer: !showMapillaryLayer });
+ return this.state.showMapillaryLayer;
+ }
+
toggleLocation() {
const nextLocationOn = !this.state.locationOn;
@@ -275,25 +380,29 @@ class MapLeaflet extends React.Component {
}
initializeMap() {
- const baseMapOptions = {
- maxZoom: 18,
- tileSize: 512,
- zoomOffset: -1,
- attribution:
- 'Map data ©
OpenStreetMap contributors, ' +
- '
CC-BY-SA, ' +
- 'Imagery ©
Mapbox',
- retina: L.retina ? "@2x" : "",
- baseLayer: true,
- };
const digitransitTileLayer = L.tileLayer(
- "https://digitransit-prod-cdn-origin.azureedge.net/map/v1/hsl-map/{z}/{x}/{y}{retina}.png",
- baseMapOptions
+ "https://cdn.digitransit.fi/map/v2/hsl-map/{z}/{x}/{y}{retina}.png",
+ {
+ maxZoom: 18,
+ tileSize: 512,
+ zoomOffset: -1,
+ attribution:
+ 'Map data ©
OpenStreetMap contributors, ' +
+ '
CC-BY-SA, ' +
+ 'Imagery ©
Mapbox',
+ retina: L.Browser.retina ? "@2x" : "", // Use @2x tiles for retina displays
+ baseLayer: true,
+ }
);
const aerialTileLayer = L.tileLayer(
- "https://ortophotos.blob.core.windows.net/hsy-map/hsy_tiles2/{z}/{x}/{y}{retina}.jpg",
- baseMapOptions
+ "https://ortophotos.blob.core.windows.net/hsy-map/hsy_tiles2/{z}/{x}/{y}.jpg",
+ {
+ maxZoom: 18,
+ tileSize: 256,
+ attribution: 'Imagery ©
HSY',
+ detectRetina: true, // @2x tiles not available, use detectRetina -feature
+ }
);
this.map = L.map("map-leaflet", {
@@ -308,12 +417,19 @@ class MapLeaflet extends React.Component {
};
L.control.layers(baseMaps).addTo(this.map);
- addControlButton(this.map, this.props.toggleFullscreen);
+ if (!isMobile) {
+ addControlButton(
+ this.map,
+ this.props.toggleFullscreen,
+ this.resetMapillaryLocation
+ );
+ }
addLocationButton(this.map, this.toggleLocation);
+ addMapillaryButton(this.map, this.initMapillaryLayer);
addRouteFilterLayer(this.map);
}
- addLayersToMap() {
+ async addLayersToMap() {
if (this.props.routes) {
const selectedStops = this.props.routes.filter((route) =>
this.props.selectedRoutes.includes(
@@ -340,15 +456,137 @@ class MapLeaflet extends React.Component {
}
}
+ onClick(e) {
+ if (!this.state.showMapillaryLayer) {
+ return;
+ }
+ for (const key in e.target._layers) {
+ const layer = e.target._layers[key];
+ if (layer) {
+ if (layer.options.type === "mapillaryHighlightMarker") {
+ this.setState({ mapillaryLocation: layer._latlng });
+ }
+ }
+ }
+ }
+
+ setMapillaryLocation(position, playService) {
+ if (!this.state.mapillaryLocation) {
+ if (playService) {
+ playService.stop();
+ }
+ return;
+ }
+ if (this.imageMarker) {
+ this.imageMarker.remove();
+ this.imageMarker = null;
+ }
+ if (this.map && position) {
+ const marker = this.createMarker({
+ position: position,
+ opacity: 1,
+ type: "mapillaryImageMarker",
+ color: "red",
+ });
+ if (!this.imageMarker) {
+ this.imageMarker = marker;
+ this.imageMarker.addTo(this.map);
+ } else {
+ this.imageMarker.setLatLng(position);
+ }
+ } else if (!position) {
+ this.removeMarker();
+ }
+ this.setState({ mapillaryImageLocation: { lat: position.lat, lng: position.lon } });
+ }
+
+ onHover = (e) => {
+ if (!this.state.showMapillaryLayer) {
+ return;
+ }
+ const { latlng } = e;
+ const features = [];
+ this.map.eachLayer((layer) => {
+ if (layer.feature && layer.feature.geometry) {
+ features.push(layer.feature);
+ }
+ });
+ if (!features.length) {
+ return;
+ }
+
+ // Get the feature closest to where the user is hovering
+ let featurePoint = closestPointCompareReducer(
+ features,
+ (feature) => closestPointInGeometry(latlng, feature.geometry, 200),
+ latlng
+ );
+ this.highlightedLocation = featurePoint;
+
+ featurePoint = featurePoint && !featurePoint.equals(latlng) ? featurePoint : false;
+ this.highlightMapillaryPoint(featurePoint);
+ };
+
+ createMarker = (options) => {
+ return circleMarker(options.position, {
+ type: options.type,
+ radius: 4,
+ color: options.color,
+ opacity: options.opacity,
+ });
+ };
+
+ highlightMapillaryPoint = (position) => {
+ if (this.mapillaryHighlightMarker) {
+ this.mapillaryHighlightMarker.remove();
+ this.marker = null;
+ }
+
+ if (this.map && position) {
+ const marker = this.createMarker({
+ position: position,
+ opacity: 0.25,
+ type: "mapillaryHighlightMarker",
+ color: "red",
+ });
+ this.mapillaryHighlightMarker = marker;
+ this.mapillaryHighlightMarker.addTo(this.map);
+ } else if (!position) {
+ this.removeMarker();
+ }
+ };
+
+ resetMapillaryLocation = () => {
+ this.map.eachLayer((layer) => {
+ if (!layer.options.baseLayer) {
+ this.map.removeLayer(layer);
+ }
+ });
+ this.setState({ mapillaryLocation: null });
+ };
+
render() {
- // Container div (id="map-leaflet") for leaflet map is created
return (
+ className={classNames(styles.container, {
+ [styles.containerMobile]: isMobile,
+ })}>
+
+ {this.state.mapillaryLocation && (
+
+ )}
+
);
}
}
diff --git a/src/components/mapLeaflet.module.css b/src/components/mapLeaflet.module.css
index 77a6a16..92a7b7f 100644
--- a/src/components/mapLeaflet.module.css
+++ b/src/components/mapLeaflet.module.css
@@ -1,8 +1,19 @@
.root {
width: 100%;
- min-height: 400px;
- height: 100vh;
+ height: 100%;
overflow: hidden;
+ flex: 1;
+}
+
+.container {
+ width: 100%;
+ height: 100vh;
+ display: flex;
+ flex-direction: column;
+}
+
+.containerMobile {
+ height: calc(100vh - 55px);
}
@media (max-width: 767px) {
@@ -30,7 +41,7 @@
}
.fullScreen {
- position: fixed !important;
+ position: relative;
left: 0;
top: 0;
width: 100%;
@@ -47,6 +58,16 @@
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.65);
}
+.controlbuttontest {
+ background-color: red;
+ width: 26px;
+ height: 26px;
+ border: none;
+ border-radius: 4px;
+ cursor: pointer;
+ box-shadow: 0 1px 5px rgba(0, 0, 0, 0.65);
+}
+
.controlButton img {
padding-top: 4px;
}
@@ -60,3 +81,8 @@
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
+
+.printableMap {
+ max-width: 750px;
+ max-height: 750px;
+}
diff --git a/src/components/mapillaryViewer.module.css b/src/components/mapillaryViewer.module.css
new file mode 100644
index 0000000..6aa79d1
--- /dev/null
+++ b/src/components/mapillaryViewer.module.css
@@ -0,0 +1,52 @@
+.viewerWrapper {
+ display: flex;
+ width: 100%;
+ flex: 1;
+ color: white;
+}
+
+.mapillaryElement {
+ width: 100%;
+ height: 100%;
+ color: white;
+}
+
+div[class~="mapillary-attribution-username"] {
+ color: white;
+}
+
+div[class~="mapillary-attribution-date"] {
+ color: white;
+}
+
+.errorMessage {
+ position: absolute;
+ color: red;
+ z-index: 99;
+ padding: 3px;
+}
+
+.closeButton {
+ position: absolute;
+ right: 0px;
+ padding: 3px;
+ cursor: pointer;
+}
+
+.mapillary-js-canvas {
+ width: 100%;
+}
+
+.closeButtonIcon {
+ height: 30px;
+ width: 30px;
+ fill: #66b2ff;
+ transition: 0.2s;
+}
+
+.closeButtonIcon:hover {
+ height: 30px;
+ width: 30px;
+ fill: #9bccfe;
+ transition: 0.2s;
+}
diff --git a/src/components/notes.module.css b/src/components/notes.module.css
index 948134c..7e61271 100644
--- a/src/components/notes.module.css
+++ b/src/components/notes.module.css
@@ -1,3 +1,10 @@
.note {
font-size: 12px;
}
+
+@media print {
+ .note {
+ visibility: hidden;
+ height: 0px;
+ }
+}
diff --git a/src/components/routeFilter.js b/src/components/routeFilter.js
index 80118f7..86079e2 100644
--- a/src/components/routeFilter.js
+++ b/src/components/routeFilter.js
@@ -13,7 +13,7 @@ const parseDate = (date) => {
const RouteFilter = (props) => (