Change map styles to "Voyager" (#13227)

This commit is contained in:
Bram Kragten 2022-07-19 20:56:50 +02:00 committed by GitHub
parent bd50d6a6a3
commit d41159591c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 29 deletions

View File

@ -5,8 +5,7 @@ export type LeafletModuleType = typeof import("leaflet");
export type LeafletDrawModuleType = typeof import("leaflet-draw"); export type LeafletDrawModuleType = typeof import("leaflet-draw");
export const setupLeafletMap = async ( export const setupLeafletMap = async (
mapElement: HTMLElement, mapElement: HTMLElement
darkMode?: boolean
): Promise<[Map, LeafletModuleType, TileLayer]> => { ): Promise<[Map, LeafletModuleType, TileLayer]> => {
if (!mapElement.parentNode) { if (!mapElement.parentNode) {
throw new Error("Cannot setup Leaflet map on disconnected element"); throw new Error("Cannot setup Leaflet map on disconnected element");
@ -23,7 +22,7 @@ export const setupLeafletMap = async (
mapElement.parentNode.appendChild(style); mapElement.parentNode.appendChild(style);
map.setView([52.3731339, 4.8903147], 13); map.setView([52.3731339, 4.8903147], 13);
const tileLayer = createTileLayer(Leaflet, Boolean(darkMode)).addTo(map); const tileLayer = createTileLayer(Leaflet).addTo(map);
return [map, Leaflet, tileLayer]; return [map, Leaflet, tileLayer];
}; };
@ -31,23 +30,19 @@ export const setupLeafletMap = async (
export const replaceTileLayer = ( export const replaceTileLayer = (
leaflet: LeafletModuleType, leaflet: LeafletModuleType,
map: Map, map: Map,
tileLayer: TileLayer, tileLayer: TileLayer
darkMode: boolean
): TileLayer => { ): TileLayer => {
map.removeLayer(tileLayer); map.removeLayer(tileLayer);
tileLayer = createTileLayer(leaflet, darkMode); tileLayer = createTileLayer(leaflet);
tileLayer.addTo(map); tileLayer.addTo(map);
return tileLayer; return tileLayer;
}; };
const createTileLayer = ( const createTileLayer = (leaflet: LeafletModuleType): TileLayer =>
leaflet: LeafletModuleType,
darkMode: boolean
): TileLayer =>
leaflet.tileLayer( leaflet.tileLayer(
`https://{s}.basemaps.cartocdn.com/${ `https://basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}${
darkMode ? "dark_all" : "light_all" leaflet.Browser.retina ? "@2x.png" : ".png"
}/{z}/{x}/{y}${leaflet.Browser.retina ? "@2x.png" : ".png"}`, }`,
{ {
attribution: attribution:
'&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>, &copy; <a href="https://carto.com/attributions">CARTO</a>', '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>, &copy; <a href="https://carto.com/attributions">CARTO</a>',

View File

@ -6,21 +6,19 @@ import {
Map, Map,
Marker, Marker,
Polyline, Polyline,
TileLayer,
} from "leaflet"; } from "leaflet";
import { css, CSSResultGroup, PropertyValues, ReactiveElement } from "lit"; import { css, CSSResultGroup, PropertyValues, ReactiveElement } from "lit";
import { customElement, property, state } from "lit/decorators"; import { customElement, property, state } from "lit/decorators";
import { import {
LeafletModuleType, LeafletModuleType,
replaceTileLayer,
setupLeafletMap, setupLeafletMap,
} from "../../common/dom/setup-leaflet-map"; } from "../../common/dom/setup-leaflet-map";
import { computeStateDomain } from "../../common/entity/compute_state_domain"; import { computeStateDomain } from "../../common/entity/compute_state_domain";
import { computeStateName } from "../../common/entity/compute_state_name"; import { computeStateName } from "../../common/entity/compute_state_name";
import "./ha-entity-marker"; import { installResizeObserver } from "../../panels/lovelace/common/install-resize-observer";
import { HomeAssistant } from "../../types"; import { HomeAssistant } from "../../types";
import "../ha-icon-button"; import "../ha-icon-button";
import { installResizeObserver } from "../../panels/lovelace/common/install-resize-observer"; import "./ha-entity-marker";
const getEntityId = (entity: string | HaMapEntity): string => const getEntityId = (entity: string | HaMapEntity): string =>
typeof entity === "string" ? entity : entity.entity_id; typeof entity === "string" ? entity : entity.entity_id;
@ -60,8 +58,6 @@ export class HaMap extends ReactiveElement {
private Leaflet?: LeafletModuleType; private Leaflet?: LeafletModuleType;
private _tileLayer?: TileLayer;
private _resizeObserver?: ResizeObserver; private _resizeObserver?: ResizeObserver;
private _mapItems: Array<Marker | Circle> = []; private _mapItems: Array<Marker | Circle> = [];
@ -142,12 +138,6 @@ export class HaMap extends ReactiveElement {
return; return;
} }
const darkMode = this.darkMode ?? this.hass.themes.darkMode; const darkMode = this.darkMode ?? this.hass.themes.darkMode;
this._tileLayer = replaceTileLayer(
this.Leaflet!,
this.leafletMap!,
this._tileLayer!,
darkMode
);
this.shadowRoot!.getElementById("map")!.classList.toggle("dark", darkMode); this.shadowRoot!.getElementById("map")!.classList.toggle("dark", darkMode);
} }
@ -159,10 +149,7 @@ export class HaMap extends ReactiveElement {
this.shadowRoot!.append(map); this.shadowRoot!.append(map);
} }
const darkMode = this.darkMode ?? this.hass.themes.darkMode; const darkMode = this.darkMode ?? this.hass.themes.darkMode;
[this.leafletMap, this.Leaflet, this._tileLayer] = await setupLeafletMap( [this.leafletMap, this.Leaflet] = await setupLeafletMap(map);
map,
darkMode
);
this.shadowRoot!.getElementById("map")!.classList.toggle("dark", darkMode); this.shadowRoot!.getElementById("map")!.classList.toggle("dark", darkMode);
this._loaded = true; this._loaded = true;
} }
@ -473,6 +460,13 @@ export class HaMap extends ReactiveElement {
.dark { .dark {
color: #ffffff; color: #ffffff;
} }
.leaflet-tile-pane {
filter: var(--map-filter);
}
.dark .leaflet-bar a {
background: var(--card-background-color);
color: #ffffff;
}
.leaflet-marker-draggable { .leaflet-marker-draggable {
cursor: move !important; cursor: move !important;
} }

View File

@ -46,6 +46,7 @@ export const darkStyles = {
"codemirror-qualifier": "#DECB6B", "codemirror-qualifier": "#DECB6B",
"codemirror-type": "#DECB6B", "codemirror-type": "#DECB6B",
"energy-grid-return-color": "#a280db", "energy-grid-return-color": "#a280db",
"map-filter": "invert(.9) hue-rotate(170deg) grayscale(.7)",
}; };
export const derivedStyles = { export const derivedStyles = {