Skip to content

Commit 442d762

Browse files
committed
working!
1 parent 442fd13 commit 442d762

File tree

2 files changed

+69
-44
lines changed

2 files changed

+69
-44
lines changed

src/App.svelte

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -48,46 +48,39 @@
4848
}
4949
5050
function addMarkerClasses(entries, hashlevel) {
51-
for (const entry of entries) {
52-
entry.isSelected = selectedMarker
53-
? entry.page_title === selectedMarker.page_title &&
54-
entry.geohash === selectedMarker.geohash
55-
: false;
56-
}
5751
if (hashlevel > 7.5) {
5852
for (const entry of entries) {
59-
entry.sizeClass = "full";
53+
entry.displayClass = "full";
6054
}
6155
} else {
6256
for (const entry of entries) {
63-
entry.sizeClass = "dot";
57+
entry.displayClass = "dot";
6458
}
6559
for (const entry of getUniqueByGeoHash({
6660
entries,
6761
hashLength: hashlevel - 0.5,
6862
scoreField: "page_len",
6963
})) {
70-
entry.sizeClass = "reduced";
64+
entry.displayClass = "reduced";
7165
}
7266
for (const entry of getUniqueByGeoHash({
7367
entries,
7468
hashLength: hashlevel - 1.5,
7569
scoreField: "page_len",
7670
})) {
77-
entry.sizeClass = "full";
71+
entry.displayClass = "full";
7872
}
7973
}
80-
// Sort entries so "full" size class appears last
81-
// TODO: probably better done via the CSS classes
82-
entries.sort((a, b) => {
83-
if (a.isSelected) {
84-
console.log("here");
85-
return -1;
74+
for (const entry of entries) {
75+
if (selectedMarker) {
76+
if (
77+
entry.page_title === selectedMarker.page_title &&
78+
entry.geohash === selectedMarker.geohash
79+
) {
80+
entry.displayClass = "selected";
81+
}
8682
}
87-
if (a.sizeClass === "full" && b.sizeClass !== "full") return -1;
88-
if (a.sizeClass !== "full" && b.sizeClass === "full") return 1;
89-
return 0;
90-
});
83+
}
9184
return entries;
9285
}
9386
async function handleBoundsChange(event) {

src/lib/Map.svelte

Lines changed: 56 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script>
22
import { onMount, onDestroy } from "svelte";
3-
import L from "leaflet";
3+
import L, { marker } from "leaflet";
44
import "leaflet/dist/leaflet.css";
55
import { createEventDispatcher } from "svelte";
66
@@ -11,15 +11,14 @@
1111
1212
let mapElement;
1313
let map;
14-
let markerLayer;
15-
let startZoom = 0;
14+
// Create a layers object to hold different marker type layers
15+
let markerLayer = null;
1616
// Use the traditional event dispatcher
1717
const dispatch = createEventDispatcher();
1818
1919
let isFlying = false; // Track if map is currently in flyTo animation
2020
21-
let selectedMarker = null;
22-
21+
let hoveredMarker = null;
2322
function computeMarkerHtml(marker) {
2423
const iconByType = {
2524
adm1st: "map",
@@ -63,9 +62,7 @@
6362
}
6463
}
6564
return `
66-
<div class="map-marker marker-size-${marker.sizeClass} ${
67-
marker.isSelected ? "marker-selected" : ""
68-
}" >
65+
<div class="map-marker marker-display-${marker.displayClass}" >
6966
<div class="marker-icon-circle">
7067
<img src="/icons/${icon}.svg">
7168
</div>
@@ -97,7 +94,18 @@
9794
})
9895
.addTo(map);
9996
100-
// Create a layer group for markers
97+
// Create layer groups for different marker types
98+
for (const layerType of [
99+
{ name: "tinydot", zIndex: 100 },
100+
{ name: "dot", zIndex: 200 },
101+
{ name: "reduced", zIndex: 300 },
102+
{ name: "full", zIndex: 400 },
103+
{ name: "selected", zIndex: 500 },
104+
]) {
105+
map.createPane(layerType.name);
106+
map.getPane(layerType.name).style.zIndex = layerType.zIndex;
107+
}
108+
101109
markerLayer = L.layerGroup().addTo(map);
102110
103111
// Add initial markers
@@ -168,28 +176,50 @@
168176
// Function to update markers when the markers prop changes
169177
function updateMarkers() {
170178
if (!map || !markerLayer) return;
171-
172179
// Clear existing markers
173180
markerLayer.clearLayers();
174-
175181
// Add new markers
176-
markers.forEach((marker) => {
177-
// Set isSelected property based on selected marker
178182
183+
const iconSizesByDisplayClass = {
184+
tinydot: [12, 12],
185+
dot: [18, 18],
186+
reduced: [28, 28],
187+
full: [128, 32],
188+
selected: [128, 32],
189+
};
190+
markers.forEach((marker) => {
179191
const markerHtml = computeMarkerHtml(marker);
192+
let displayClass = marker.displayClass;
193+
let pane = marker.displayClass;
194+
if (hoveredMarker === marker) {
195+
console.log("hovered");
196+
displayClass = "full";
197+
pane = "selected";
198+
}
180199
const icon = L.divIcon({
181200
className: "custom-div-icon",
182201
html: markerHtml,
183-
iconSize: [128, 32],
202+
iconSize: iconSizesByDisplayClass[displayClass],
184203
});
204+
185205
const mapMarker = L.marker([marker.lat, marker.lon], {
186206
icon: icon,
187-
}).addTo(markerLayer);
207+
pane: pane,
208+
});
188209
189210
// Add click handler to dispatch custom markerclick event
190211
mapMarker.on("click", () => {
191212
dispatch("markerclick", marker);
192213
});
214+
mapMarker.on("mouseover", () => {
215+
if (hoveredMarker !== marker) {
216+
hoveredMarker = marker;
217+
updateMarkers();
218+
}
219+
});
220+
221+
// Add marker to the appropriate layer based on its size class and selection state
222+
mapMarker.addTo(markerLayer);
193223
});
194224
}
195225
@@ -233,47 +263,47 @@
233263
z-index: 1000 !important; /* Ensure hovered markers appear above others */
234264
}
235265
&:hover > .marker-icon-circle,
236-
&.marker-selected > .marker-icon-circle {
266+
&.marker-display-selected > .marker-icon-circle {
237267
--circle-size: 32px !important;
238268
box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.35);
239269
z-index: 1000 !important;
240270
}
241271
242-
&.marker-selected {
272+
&.marker-display-selected {
243273
/* Ensure hovered markers appear above others */
244274
z-index: 1000 !important;
245275
}
246276
247277
&:hover > .marker-text-container,
248-
&.marker-selected > .marker-text-container {
278+
&.marker-display-selected > .marker-text-container {
249279
visibility: visible;
250280
opacity: 1;
251281
}
252282
253-
&.marker-selected > .marker-icon-circle {
283+
&.marker-display-selected > .marker-icon-circle {
254284
border: 6px solid #f00707;
255285
box-shadow: 8px 8px 16px rgba(0, 0, 0, 0.95);
256286
}
257287
258-
&.marker-size-full > .marker-text-container {
288+
&.marker-display-full > .marker-text-container {
259289
visibility: visible;
260290
opacity: 1;
261291
}
262292
263-
&.marker-size-full > .marker-icon-circle {
293+
&.marker-display-full > .marker-icon-circle {
264294
--circle-size: 32px;
265295
box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.35);
266296
}
267297
268-
&.marker-size-reduced > .marker-icon-circle {
298+
&.marker-display-reduced > .marker-icon-circle {
269299
--circle-size: 24px;
270300
}
271301
272-
&.marker-size-dot > .marker-icon-circle {
302+
&.marker-display-dot > .marker-icon-circle {
273303
--circle-size: 12px;
274304
}
275305
276-
&.marker-size-tinydot > .marker-icon-circle {
306+
&.marker-display-tinydot > .marker-icon-circle {
277307
--circle-size: 4px;
278308
}
279309
@@ -341,6 +371,8 @@
341371
color: white;
342372
-webkit-text-stroke: 6px white;
343373
text-stroke: 6px white;
374+
-webkit-text-stroke-linejoin: round;
375+
text-stroke-linejoin: round;
344376
z-index: 1;
345377
}
346378
</style>

0 commit comments

Comments
 (0)