Skip to content

Commit deda145

Browse files
authored
Feature: Make members explorer highlight the current member being viewed (#187)
1 parent efe9613 commit deda145

File tree

7 files changed

+71
-4
lines changed

7 files changed

+71
-4
lines changed

core/webdoc-default-template/src/app/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import "./toc";
12
import Explorer from "./components/Explorer";
23
import Footer from "./components/Footer";
34
import Header from "./components/Header";
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// @flow
2+
3+
const toc /*: Map<string, HTMLElement> */ = new Map();
4+
const css = "page-members-explorer__item--current";
5+
let current /*: HTMLElement | null */ = null;
6+
7+
function onIntersectionChange(entries /*: IntersectionObserverEntry[] */) {
8+
for (let i = entries.length - 1; i >= 0; i--) {
9+
const {target, isIntersecting} = entries[i];
10+
const id = target.getAttribute("data-id");
11+
const explorerItemElement = toc.get(id);
12+
13+
explorerItemElement.setAttribute("data-visible", String(isIntersecting));
14+
}
15+
16+
let next = null;
17+
for (const [, explorerItemElement] of toc) {
18+
if (explorerItemElement.getAttribute("data-visible") === "true") {
19+
next = explorerItemElement;
20+
}
21+
}
22+
23+
if (next !== current) {
24+
if (next) next.classList.add(css);
25+
if (current) current.classList.remove(css);
26+
current = next;
27+
}
28+
}
29+
30+
if (typeof IntersectionObserver !== "undefined") {
31+
const observer = new IntersectionObserver(onIntersectionChange, {
32+
root: null,
33+
rootMargin: "0px",
34+
threshold: [1],
35+
});
36+
37+
document.addEventListener("DOMContentLoaded", function() {
38+
for (const explorerItemElement of document.querySelectorAll(".page-members-explorer__item")) {
39+
const targetId = explorerItemElement.getAttribute("data-id");
40+
const targetElement = document.querySelector(`.member__title[data-id="${targetId}"]`);
41+
42+
if (!targetElement) {
43+
console.warn(`${targetId} member not found in DOM!`);
44+
continue;
45+
}
46+
47+
toc.set(targetId, explorerItemElement);
48+
observer.observe(targetElement);
49+
}
50+
});
51+
}

core/webdoc-default-template/src/styles/members-explorer.scss

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@
4141
&:hover {
4242
background-color: rgba(0, 0, 0, 0.04);
4343
}
44+
45+
&--current {
46+
a {
47+
/* See toc.js */
48+
color: $colorPrimary;
49+
}
50+
}
4451
}
4552

4653
@media only screen and (max-width: 800px) {

core/webdoc-default-template/static/styles/index.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/webdoc-default-template/tmpl/components/member/index.tmpl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ const examples = doc.examples ? doc.examples : [];
1818
const modifiers = [
1919
doc.deprecated ? "member__title_deprecated" : ""
2020
].join(" ");
21+
const uniqueId = this.mangled(doc);
2122
?>
22-
<div class="member" id="<?js= doc.name ?>">
23+
<div class="member" id="<?js= doc.name ?>" data-id="<?js= uniqueId ?>">
2324
<?js if (doc.name !== "constructor") { ?>
24-
<section class="member__title <?js= modifiers ?>">
25+
<section class="member__title <?js= modifiers ?>" data-id="<?js= uniqueId ?>">
2526
<a href="<?js= this.getPlugin("linker").getURI(doc) ?>">
2627
<img
2728
src="<?js= linkSvg ?>"

core/webdoc-default-template/tmpl/components/members-explorer/category.tmpl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
<section class="page-members-explorer-category__title"><?js= title ?></section>
1919
<ul class="page-members-explorer-category__items">
2020
<?js members.forEach((member) => { ?>
21-
<li class="page-members-explorer__item"><?js= this.linkTo(member.path, member.name) ?></li>
21+
<li class="page-members-explorer__item" data-id="<?js= this.mangled(member) ?>">
22+
<?js= this.linkTo(member.path, member.name) ?>
23+
</li>
2224
<?js }) ?>
2325
</ul>
2426
</div>

core/webdoc-template-library/src/TemplateRenderer.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import type {
88
import {tag, templateLogger} from "./Logger";
99
import {SymbolLinks} from "./SymbolLinks";
1010
import fs from "fs";
11+
import {mangled} from "@webdoc/model";
1112
import {merge} from "lodash";
1213
import path from "path";
1314

@@ -259,6 +260,10 @@ export class TemplateRenderer {
259260
return str.replace(/&/g, "&amp;").replace(/</g, "&lt;");
260261
};
261262

263+
mangled(doc: Doc): string {
264+
return mangled(doc);
265+
}
266+
262267
/**
263268
* Finds all the members namespaces of {@code doc}.
264269
*

0 commit comments

Comments
 (0)