mirror of
https://github.com/matrix-org/matrix-spec
synced 2025-12-21 00:48:38 +01:00
Implement folding for the TOC sidebar
This commit is contained in:
parent
76e1426f92
commit
32854cc980
|
|
@ -524,3 +524,98 @@ nav.foldable-nav {
|
||||||
margin: initial;
|
margin: initial;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fix some visual bugs regarding sidebar_menu_foldable / foldable-nav support
|
||||||
|
// and extend it to ordered lists
|
||||||
|
nav.foldable-nav {
|
||||||
|
.with-child ol {
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ol-1 > li {
|
||||||
|
padding-left: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
ol.foldable {
|
||||||
|
max-height: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:checked ~ ol.foldable {
|
||||||
|
max-height: 100vmax;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ol-1 .with-child > label:before {
|
||||||
|
display: inline-block;
|
||||||
|
font-family: inherit;
|
||||||
|
font-style: normal;
|
||||||
|
font-variant: normal;
|
||||||
|
text-rendering: auto;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
font-weight: 900; content: "+";
|
||||||
|
position: absolute;
|
||||||
|
left: 0.1em;
|
||||||
|
padding-left: 0.4em;
|
||||||
|
padding-right: 0.4em;
|
||||||
|
font-size: 1em;
|
||||||
|
color: $gray-900;
|
||||||
|
transform: unset;
|
||||||
|
transition: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ol-1 .with-child > input:checked ~ label:before {
|
||||||
|
color: $gray-900;
|
||||||
|
content: "-";
|
||||||
|
transform: unset;
|
||||||
|
transition: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
.with-child ol { margin-top: 0.1em; }
|
||||||
|
|
||||||
|
/* Fix bugs and annoyances with unordered lists */
|
||||||
|
.ul-1 .with-child > label:before {
|
||||||
|
font-weight: 900; content: "+";
|
||||||
|
font-family: inherit;
|
||||||
|
transform: unset;
|
||||||
|
transition: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ul-1 .with-child > input:checked ~ label:before {
|
||||||
|
color: $gray-900;
|
||||||
|
content: "-";
|
||||||
|
transform: unset;
|
||||||
|
transition: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (hover: hover) and (pointer: fine) {
|
||||||
|
nav.foldable-nav {
|
||||||
|
|
||||||
|
.ul-1 .with-child > label:hover:before {
|
||||||
|
color: $gray-900;
|
||||||
|
transform: unset;
|
||||||
|
transition: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ul-1 .with-child > input:checked ~ label:hover:before {
|
||||||
|
color: $gray-900;
|
||||||
|
transform: unset;
|
||||||
|
transition: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ol-1 .with-child > label:hover:before {
|
||||||
|
color: $gray-900;
|
||||||
|
transform: unset;
|
||||||
|
transition: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ol-1 .with-child > input:checked ~ label:hover:before {
|
||||||
|
color: $gray-900;
|
||||||
|
transform: unset;
|
||||||
|
transition: unset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -107,9 +107,10 @@ function makeToc() {
|
||||||
|
|
||||||
// we have to adjust heading IDs to ensure that they are unique
|
// we have to adjust heading IDs to ensure that they are unique
|
||||||
const nav = document.createElement("nav");
|
const nav = document.createElement("nav");
|
||||||
|
nav.classList.add("td-sidebar-nav", "foldable-nav");
|
||||||
nav.id = "TableOfContents";
|
nav.id = "TableOfContents";
|
||||||
|
|
||||||
const section = makeTocSection(tocTargets, 0);
|
const section = makeTocSection(tocTargets, 0, 1);
|
||||||
nav.appendChild(section.content);
|
nav.appendChild(section.content);
|
||||||
// build the TOC and append to it title and content
|
// build the TOC and append to it title and content
|
||||||
const toc = document.createElement("div");
|
const toc = document.createElement("div");
|
||||||
|
|
@ -130,10 +131,24 @@ function makeToc() {
|
||||||
// create a single ToC entry
|
// create a single ToC entry
|
||||||
function makeTocEntry(heading) {
|
function makeTocEntry(heading) {
|
||||||
const li = document.createElement("li");
|
const li = document.createElement("li");
|
||||||
|
li.classList.add("td-sidebar-nav__section-title", "td-sidebar-nav__section");
|
||||||
|
|
||||||
|
const input = document.createElement("input");
|
||||||
|
input.setAttribute("id", `toc-${heading.id}-check`);
|
||||||
|
input.setAttribute("type", "checkbox");
|
||||||
|
const label = document.createElement("label");
|
||||||
|
label.setAttribute("for", `toc-${heading.id}-check`);
|
||||||
|
|
||||||
const a = document.createElement("a");
|
const a = document.createElement("a");
|
||||||
a.setAttribute("href", `#${heading.id}`);
|
a.setAttribute("href", `#${heading.id}`);
|
||||||
|
a.setAttribute("id", `toc-${heading.id}`);
|
||||||
|
a.classList.add("td-sidebar-link", "td-sidebar-link__page");
|
||||||
a.textContent = heading.textContent;
|
a.textContent = heading.textContent;
|
||||||
li.appendChild(a);
|
|
||||||
|
li.appendChild(input);
|
||||||
|
li.appendChild(label);
|
||||||
|
label.appendChild(a);
|
||||||
|
|
||||||
return li;
|
return li;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -142,8 +157,9 @@ Each ToC section is an `<ol>` element.
|
||||||
ToC entries are `<li>` elements and these contain nested ToC sections,
|
ToC entries are `<li>` elements and these contain nested ToC sections,
|
||||||
whenever we go to the next heading level down.
|
whenever we go to the next heading level down.
|
||||||
*/
|
*/
|
||||||
function makeTocSection(headings, index) {
|
function makeTocSection(headings, index, depth) {
|
||||||
const ol = document.createElement("ol");
|
const ol = document.createElement("ol");
|
||||||
|
ol.classList.add("td-sidebar-nav__section", `ol-${depth}`);
|
||||||
let previousHeading = null;
|
let previousHeading = null;
|
||||||
let previousLi = null;
|
let previousLi = null;
|
||||||
let i = index;
|
let i = index;
|
||||||
|
|
@ -152,13 +168,20 @@ function makeTocSection(headings, index) {
|
||||||
const thisHeading = headings[i];
|
const thisHeading = headings[i];
|
||||||
if (previousHeading && (thisHeading.tagName > previousHeading.tagName)) {
|
if (previousHeading && (thisHeading.tagName > previousHeading.tagName)) {
|
||||||
// we are going down a heading level, create a new nested section
|
// we are going down a heading level, create a new nested section
|
||||||
const section = makeTocSection(headings, i);
|
const section = makeTocSection(headings, i, depth+1);
|
||||||
previousLi.appendChild(section.content);
|
previousLi.appendChild(section.content);
|
||||||
i = section.index -1;
|
if (depth >= 1) {
|
||||||
|
section.content.classList.add("foldable");
|
||||||
|
}
|
||||||
|
previousLi.classList.add("with-child");
|
||||||
|
i = section.index - 1;
|
||||||
}
|
}
|
||||||
else if (previousHeading && (previousHeading.tagName > thisHeading.tagName)) {
|
else if (previousHeading && (previousHeading.tagName > thisHeading.tagName)) {
|
||||||
// we have come back up a level, so a section is finished
|
// we have come back up a level, so a section is finished
|
||||||
for (let li of lis) {
|
for (let li of lis) {
|
||||||
|
if (!li.classList.contains("with-child")) {
|
||||||
|
li.classList.add("without-child");
|
||||||
|
}
|
||||||
ol.appendChild(li);
|
ol.appendChild(li);
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
|
|
@ -174,6 +197,9 @@ function makeTocSection(headings, index) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (let li of lis) {
|
for (let li of lis) {
|
||||||
|
if (!li.classList.contains("with-child")) {
|
||||||
|
li.classList.add("without-child");
|
||||||
|
}
|
||||||
ol.appendChild(li);
|
ol.appendChild(li);
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue