Skip to content

Commit af267c5

Browse files
committed
Inject repo actions into footer if no sidebar is present and it isn’t forced
1 parent 9de54ee commit af267c5

File tree

2 files changed

+59
-2
lines changed

2 files changed

+59
-2
lines changed

src/project/types/website/website-navigation.ts

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ import { HtmlPostProcessResult } from "../../../command/render/types.ts";
129129
import { isJupyterNotebook } from "../../../core/jupyter/jupyter.ts";
130130
import { kHtmlEmptyPostProcessResult } from "../../../command/render/constants.ts";
131131
import { expandAutoSidebarItems } from "./website-sidebar-auto.ts";
132+
import { ensureHtmlElements } from "../../../../tests/verify.ts";
132133

133134
// static navigation (initialized during project preRender)
134135
const navigation: Navigation = {
@@ -628,7 +629,7 @@ function handleRepoLinks(
628629
kWebsite,
629630
config,
630631
);
631-
const forecRepoActions = format.metadata[kSiteRepoActions] === true;
632+
const forceRepoActions = format.metadata[kSiteRepoActions] === true;
632633

633634
const elRepoSource = doc.querySelector(
634635
"[" + kDataQuartoSourceUrl + '="repo"]',
@@ -640,8 +641,53 @@ function handleRepoLinks(
640641
if (repoActions.length > 0) {
641642
// find the toc
642643
let repoTarget = doc.querySelector(`nav[role="doc-toc"]`);
643-
if (repoTarget === null && forecRepoActions) {
644+
if (repoTarget === null && forceRepoActions) {
644645
repoTarget = doc.querySelector("#quarto-margin-sidebar");
646+
} else if (repoTarget === null) {
647+
repoTarget = doc.querySelector(".nav-footer .nav-footer-center");
648+
if (!repoTarget) {
649+
const ensureEl = (
650+
doc: Document,
651+
tagname: string,
652+
classname: string,
653+
parent: Element,
654+
afterEl?: Element | null,
655+
) => {
656+
let el = parent.querySelector(`${tagname}.${classname}`);
657+
if (!el) {
658+
el = doc.createElement(tagname);
659+
el.classList.add(classname);
660+
if (afterEl !== null && afterEl && afterEl.nextElementSibling) {
661+
parent.insertBefore(el, afterEl.nextElementSibling);
662+
} else {
663+
parent.appendChild(el);
664+
}
665+
}
666+
return el;
667+
};
668+
669+
const footerEl = ensureEl(
670+
doc,
671+
"footer",
672+
"footer",
673+
doc.body,
674+
doc.querySelector("div#quarto-content"),
675+
);
676+
const footerContainer = ensureEl(
677+
doc,
678+
"div",
679+
"nav-footer",
680+
footerEl,
681+
);
682+
const footerCenterEl = ensureEl(
683+
doc,
684+
"div",
685+
"nav-footer-center",
686+
footerContainer,
687+
footerContainer.querySelector(".nav-footer-left"),
688+
);
689+
repoTarget = footerCenterEl;
690+
}
645691
}
646692

647693
if (repoTarget) {

src/resources/projects/website/navigation/quarto-nav.scss

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,17 @@ nav.sidebar.sidebar-navigation:not(.rollup) {
716716
font-size: $toc-font-size;
717717
}
718718

719+
.nav-footer .toc-actions {
720+
.action-links {
721+
display: flex;
722+
p {
723+
padding-right: 0.5em;
724+
}
725+
}
726+
padding-bottom: 0.5em;
727+
padding-top: 0.5em;
728+
}
729+
719730
// border weight
720731
// border style
721732
.nav-footer {

0 commit comments

Comments
 (0)