diff --git a/docs/css/kolibri-base.css b/docs/css/kolibri-base.css index 35fd0b62..b98c2ea2 100644 --- a/docs/css/kolibri-base.css +++ b/docs/css/kolibri-base.css @@ -92,7 +92,7 @@ em { /* emphasis looks like highlighted with text marker */ &::before { content: ""; position: absolute; - inset: -3px; + inset: 0; /* -3px leads to strange line-break issues */ background-color: var(--kolibri-color-select); z-index: -10; rotate: -2deg; diff --git a/docs/src/examples/navigation/simple/starter.js b/docs/src/examples/navigation/simple/starter.js index 77098ff8..66697ba6 100644 --- a/docs/src/examples/navigation/simple/starter.js +++ b/docs/src/examples/navigation/simple/starter.js @@ -21,8 +21,8 @@ siteController.registerPage(URI_HASH_HOME, HomePage()); siteController.registerPage(URI_HASH_UNSTYLED, UnstyledPage()); siteController.registerPage(URI_HASH_MASTER_DETAIL, MasterDetailPage()); -SimpleNavigationProjector(siteController, siteProjector.sideNavigationElement); -SimpleNavigationProjector(siteController, siteProjector.topNavigationElement); +SimpleNavigationProjector(siteController, siteProjector.sideNavigationElement, true); +SimpleNavigationProjector(siteController, siteProjector.topNavigationElement, false); siteController.gotoUriHash(window.location.hash); diff --git a/docs/src/kolibri/navigation/projector/simple/simpleNavigationProjector.js b/docs/src/kolibri/navigation/projector/simple/simpleNavigationProjector.js index f952b455..3ef2a279 100644 --- a/docs/src/kolibri/navigation/projector/simple/simpleNavigationProjector.js +++ b/docs/src/kolibri/navigation/projector/simple/simpleNavigationProjector.js @@ -1,8 +1,20 @@ +import {select} from "../../../util/dom.js"; export { SimpleNavigationProjector } const PAGE_CLASS = "simpleNavigationProjector"; +const iconSVGStr = ` + + + + + + + + +`; + /** * A projector of anchors to all pages that are registered in the {@link SiteControllerType}. * It binds each anchor to the "visited" state and highlights the currently selected page (uriHash). @@ -10,7 +22,8 @@ const PAGE_CLASS = "simpleNavigationProjector"; * such that the same projector can be used for horizontal and vertical display. * @constructor * @param { !SiteControllerType } siteController - the source of the information that we display - * @param { !HTMLDivElement } root - where to mount the view + * @param { !HTMLDivElement } root - where to mount the view + * @param { Boolean= } canHide - whether this navigation can hide itself, defaults to false * @return { NavigationProjectorType } * @example * // set up @@ -24,9 +37,9 @@ const PAGE_CLASS = "simpleNavigationProjector"; * SimpleNavigationProjector(siteController, siteProjector.topNavigationElement); */ -const SimpleNavigationProjector = (siteController, root) => { +const SimpleNavigationProjector = (siteController, root, canHide=false) => { - root.innerHTML = ` `; + root.innerHTML = ` `; const projectNavigation = () => { @@ -35,10 +48,10 @@ const SimpleNavigationProjector = (siteController, root) => { document.head.innerHTML += projectorStyle; } - const navigationDiv = root.querySelector(`nav.${PAGE_CLASS}`); + const [navigationEl] = select(root, `nav.${PAGE_CLASS}`); // view is just so many anchors - navigationDiv.innerHTML = + navigationEl.innerHTML = (canHide ? `
${iconSVGStr}
` : '') + Object.entries(siteController.getAllPages()) .map( ([hash, page]) => `${page.titleText}`) .join(" "); @@ -49,13 +62,18 @@ const SimpleNavigationProjector = (siteController, root) => { Object.entries(siteController.getAllPages()) .forEach( ([hash, page]) => page.onVisited( visited => { if (!visited) return; - navigationDiv.querySelector(`a[href="${hash}"]`).classList.add("visited"); + navigationEl.querySelector(`a[href="${hash}"]`)?.classList?.add("visited"); } )); // update which anchor shows the current page siteController.onUriHashChanged((newHash, oldHash) => { - navigationDiv.querySelector(`a[href="${oldHash}"]`)?.classList?.remove("current"); - navigationDiv.querySelector(`a[href="${newHash}"]`)?.classList?.add ("current"); + navigationEl.querySelector(`a[href="${oldHash}"]`)?.classList?.remove("current"); + navigationEl.querySelector(`a[href="${newHash}"]`)?.classList?.add ("current"); }); + + if (canHide) { + navigationEl.classList.toggle("hide"); + select(navigationEl, ".toggler").head().onclick = _evt => navigationEl.classList.toggle("hide"); + } }; projectNavigation(); @@ -65,18 +83,44 @@ const projectorStyle = `