OSM.HistoryChangesetsLayer = L.FeatureGroup.extend({
_changesets: new Map,
- _getChangesetStyle: function ({ isHighlighted }) {
- let className = "changeset-in-sidebar-viewport";
-
+ _getChangesetStyle: function ({ isHighlighted, sidebarRelativePosition }) {
+ let className;
+
+ if (sidebarRelativePosition > 0) {
+ className = "changeset-above-sidebar-viewport";
+ } else if (sidebarRelativePosition < 0) {
+ className = "changeset-below-sidebar-viewport";
+ } else {
+ className = "changeset-in-sidebar-viewport";
+ }
if (isHighlighted) {
className += " changeset-highlighted";
}
this._updateChangesetStyle(changeset);
},
+ setChangesetSidebarRelativePosition: function (id, state) {
+ const changeset = this._changesets.get(id);
+ if (!changeset) return;
+
+ changeset.sidebarRelativePosition = state;
+ this._updateChangesetStyle(changeset);
+ },
+
getLayerId: function (layer) {
return layer.id;
}
disableChangesetIntersectionObserver();
if (!window.IntersectionObserver) return;
- let ignoreIntersectionEvents = true;
+ let keepInitialLocation = true;
changesetIntersectionObserver = new IntersectionObserver((entries) => {
- if (ignoreIntersectionEvents) {
- ignoreIntersectionEvents = false;
- return;
- }
-
let closestTargetToTop,
closestDistanceToTop = Infinity,
closestTargetToBottom,
closestDistanceToBottom = Infinity;
for (const entry of entries) {
- if (entry.isIntersecting) continue;
+ const id = $(entry.target).data("changeset")?.id;
+
+ if (entry.isIntersecting) {
+ if (id) changesetsLayer.setChangesetSidebarRelativePosition(id, 0);
+ continue;
+ }
const distanceToTop = entry.rootBounds.top - entry.boundingClientRect.bottom;
const distanceToBottom = entry.boundingClientRect.top - entry.rootBounds.bottom;
+
+ if (id) changesetsLayer.setChangesetSidebarRelativePosition(id, distanceToTop >= 0 ? 1 : -1);
+
if (distanceToTop >= 0 && distanceToTop < closestDistanceToTop) {
closestDistanceToTop = distanceToTop;
closestTargetToTop = entry.target;
}
}
+ if (keepInitialLocation) {
+ keepInitialLocation = false;
+ return;
+ }
+
if (closestTargetToTop && closestDistanceToTop < closestDistanceToBottom) {
const id = $(closestTargetToTop).data("changeset")?.id;
if (id) {
/* Rules for the history sidebar */
+.changeset-above-sidebar-viewport {
+ --changeset-border-color: #CC7755;
+ --changeset-fill-color: #888888;
+}
.changeset-in-sidebar-viewport {
--changeset-border-color: #FF9500;
&.changeset-highlighted {
}
--changeset-fill-color: #FFFFAF;
}
+.changeset-below-sidebar-viewport {
+ --changeset-border-color: #8888AA;
+ --changeset-fill-color: #888888;
+}
#sidebar .changesets {
li {