Skip to content

Commit c52797e

Browse files
committed
fix route map preview image popovers in chrome
Tested with Firefox and things still seem to work there best I can tell!
1 parent cb95509 commit c52797e

File tree

4 files changed

+69
-24
lines changed

4 files changed

+69
-24
lines changed

_includes/schedule_table.html

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@
4545
{% endif %}
4646
<td class="{{part-cancelled-class}}">
4747
{% if plan.route_id %}
48-
<a href="{{site.baseurl}}/routes/{{ plan.route_id }}/" title="{{ plan.route_id }}" popovertarget="map-popover-{{run.date | slugify}}-part-{{ forloop.index}}">{{route.name}}</a>
48+
<a href="{{site.baseurl}}/routes/{{ plan.route_id }}/"
49+
class="route-preview-map-link"
50+
title="{{ plan.route_id }}"
51+
popovertarget="map-popover-{{run.date | slugify}}-part-{{ forloop.index}}">{{route.name}}</a>
4952
<div id="map-popover-{{run.date | slugify}}-part-{{ forloop.index}}" class="route-map-popover" popover>
5053
<img src="{{ '/img/routes/' | append: plan.route_id | append: '.jpg' | relative_url }}" alt="{{ route.name }} map" class="route-image" loading="lazy"/>
5154
</div>
@@ -98,4 +101,4 @@
98101
{% endfor %}
99102
<tfoot id="schedule-finished" style="display: none"><tr><td colspan="3">A new schedule is coming! <a href="https://github.com/raceconditionrunning/raceconditionrunning.github.io">Contribute on GitHub</a></td></tr></tfoot>
100103
</table>
101-
</div>
104+
</div>

_layouts/base.html

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -127,21 +127,52 @@ <h2 class="align-self-center">Race Condition Running</h2>
127127

128128
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.8/js/bootstrap.bundle.min.js" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
129129
<script>
130-
// Schedule table popovers on homepage and lore page
131-
document.addEventListener("DOMContentLoaded", function() {
132-
const popover = document.querySelectorAll("[popovertarget]");
130+
(function() {
131+
const GUTTER = 8;
133132

134-
popover.forEach((e) => {
135-
const target = document.querySelector("#" + e.getAttribute("popovertarget"));
136-
e.addEventListener("mouseover",()=>{
137-
target.showPopover();
138-
});
133+
function getTarget(trigger) {
134+
const targetId = trigger.getAttribute("popovertarget");
135+
if (!targetId) {
136+
return null;
137+
}
138+
return document.getElementById(targetId);
139+
}
139140

140-
e.addEventListener("mouseout",()=>{
141-
target.hidePopover();
142-
});
143-
});
144-
});
141+
function positionPopover(trigger, popover) {
142+
const rect = trigger.getBoundingClientRect();
143+
const left = Math.max(GUTTER, Math.min(rect.left, window.innerWidth - GUTTER));
144+
popover.style.left = `${left}px`;
145+
popover.style.top = `${rect.bottom + GUTTER}px`;
146+
}
147+
148+
function handleMouseOver(event) {
149+
const trigger = event.target.closest("[popovertarget]");
150+
if (!trigger || trigger.contains(event.relatedTarget)) {
151+
return;
152+
}
153+
const popover = getTarget(trigger);
154+
if (!popover) {
155+
return;
156+
}
157+
positionPopover(trigger, popover);
158+
popover.showPopover();
159+
}
160+
161+
function handleMouseOut(event) {
162+
const trigger = event.target.closest("[popovertarget]");
163+
if (!trigger || trigger.contains(event.relatedTarget)) {
164+
return;
165+
}
166+
const popover = getTarget(trigger);
167+
if (!popover) {
168+
return;
169+
}
170+
popover.hidePopover();
171+
}
172+
173+
document.addEventListener("mouseover", handleMouseOver);
174+
document.addEventListener("mouseout", handleMouseOut);
175+
})();
145176
</script>
146177
</body>
147178
</html>

css/style.scss

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,28 @@ tr:has(+ tr) td {
125125
padding-bottom: .25rem;
126126
}
127127

128-
:popover-open {
129-
position: absolute;
128+
.route-map-popover {
129+
pointer-events: none;
130+
}
131+
132+
.route-map-popover:popover-open {
133+
position: fixed;
130134
inset: unset;
131135
border: 1px solid gray;
136+
background-color: var(--bs-body-bg);
137+
padding: .25rem;
138+
z-index: 1000;
139+
box-shadow: 0 0.25rem 0.75rem rgba(0,0,0,.35);
132140
}
133-
:popover-open img {
141+
142+
.route-map-popover img {
134143
max-width: 80vw;
144+
height: auto;
145+
display: block;
146+
}
147+
148+
.schedule-table .route-map-popover img {
149+
max-width: min(36rem, 80vw);
135150
}
136151

137152
:target {

pages/routes.html

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,24 +136,20 @@ <h1 class="visually-hidden">{{ page.title }}</h1>
136136
const container = document.createElement("div");
137137
container.innerHTML = `
138138
<a href="${route.id}/"
139+
class="route-preview-map-link"
139140
title="${route.id}"
140141
popovertarget="${popoverId}">
141142
${value}
142143
</a>
143144
<div id="${popoverId}"
144145
class="route-map-popover"
145146
popover>
146-
<img src="{{ '/img/routes/' | absolute_url }}${route.id}.jpg"
147+
<img src="{{ '/img/routes/' | relative_url }}${route.id}.jpg"
147148
alt="${route.name} map"
148149
class="route-image"
149150
loading="lazy" />
150151
</div>
151152
`;
152-
const link = container.querySelector('a');
153-
const popover = container.querySelector('.route-map-popover');
154-
link.addEventListener('mouseover', () => popover.showPopover());
155-
link.addEventListener('mouseout', () => popover.hidePopover());
156-
157153
return container;
158154
}
159155
},

0 commit comments

Comments
 (0)