Implemented collapsing sub-menus - closes #93

This commit is contained in:
Lucas Hinderberger 2020-10-17 19:32:06 +02:00
parent a20230f555
commit 84378a22ea
3 changed files with 46 additions and 12 deletions

View file

@ -14,19 +14,23 @@ header > .container { display: flex; align-items: center; }
main { flex: 1; }
main > .container { display: flex; }
#sidebar { display: flex; flex-direction: column; padding: 50px 10px; background: #2185d0; color: white; font-weight: 500; }
#sidebar { display: flex; flex-direction: column; padding: 50px 10px; background: #2185d0; color: white; font-weight: 500; box-sizing: border-box; }
#sidebar nav { width: 350px; box-sizing: border-box; flex: 1; }
#sidebar nav .fas { width: 30px; text-align: center; }
#sidebar nav a { text-decoration: none; color: white; }
#sidebar nav ul { list-style-type: none; padding: 0; margin: 0; }
#sidebar .nav-section a { display: block; padding: 7px 10px; margin: 0 -10px 5px; background: #4595d3; font-size: 14pt; }
#sidebar .nav-section a:hover, #sidebar .nav-section.active a { background: #27628f; margin-left: -15px; padding-left: 15px; margin-right: -15px; }
#sidebar .nav-section a { display: block; padding: 7px 10px; margin: 0 -10px 5px; background: #4595d3; font-size: 12pt; }
#sidebar .nav-section:hover a, #sidebar .nav-section.active a { background: #27628f; margin-left: -15px; padding-left: 15px; padding-right: 15px; margin-right: -15px; }
#sidebar .nav-second-level a { font-size: 11pt; }
#sidebar .nav-second-level ul { margin-left: 15px; padding: 7px 0; }
#sidebar .nav-second-level li { margin-bottom: 10px; }
#sidebar .nav-second-level a:hover, #sidebar .nav-second-level a.active { text-decoration: underline; }
#sidebar .sidebar-close-button { display: none; position: relative; text-align: right; top: -35px; }
#sidebar .sidebar-close-button a:hover { color: red; }
#sidebar-overlay { display: none; opacity: 0; position: absolute; width: 100%; height: 100%; z-index: 999; background: #000a; }
#sidebar .section-collapse-button { margin-left: 0 !important; padding-left: 5px !important; }
#sidebar .section-collapse-button:hover { color: #cfffff; }
#sidebar .section-link { margin-right: 0 !important; padding-right: 5px !important; }
#sidebar-overlay { display: none; opacity: 0; position: fixed; width: 100%; height: 100%; z-index: 999; background: #000a; }
.sidebar-overlay-in { opacity: 1; }
article { padding: 50px 0; width: 800px; }
@ -65,6 +69,7 @@ footer { background: #f5f5f5; text-align: center; font-size: 8pt; padding: 15px;
.action-buttons { flex: 1; }
.action-buttons a { text-decoration: none; color: black; margin-left: 10px; }
.action-buttons a:hover { text-decoration: underline; }
.collapsible { overflow-y: hidden; transition: max-height 500ms; }
.container { max-width: 1300px; margin: auto; height: 100%; }
.flex-spacer { flex: 99; }
@ -75,11 +80,10 @@ footer { background: #f5f5f5; text-align: center; font-size: 8pt; padding: 15px;
.narrow-only { display: initial; }
#header-logo { margin-left: 0; }
#sidebar { display: block; position: absolute; left: 0; top: 0; height: 100%; transform: translateX(-400px); z-index: 9999; }
#sidebar { display: block; position: fixed; overflow-y: auto; left: 0; top: 0; height: 100%; transform: translateX(-400px); z-index: 9999; }
#sidebar .sidebar-close-button { display: block; }
#sidebar nav { width: 300px; }
#sidebar .nav-section a { font-size: 12pt; }
#sidebar .nav-second-level { font-size: 11pt; }
#sidebar .nav-section a { font-size: 11pt; }
#sidebar-overlay.sidebar-overlay-in { display: block; }
article { margin-left: 0; margin-right: 0; padding-top: 0; width: 100%; }

22
assets/js/collapse.js Normal file
View file

@ -0,0 +1,22 @@
function onCollapseButtonClick(button) {
let icon = button.querySelector(".fas")
let collapseId = button.dataset["collapseId"]
let collapseElement = document.getElementById(collapseId)
if (collapseElement.style.maxHeight == "0px") {
icon.classList.remove("fa-plus-square")
icon.classList.add("fa-minus-square")
collapseElement.style.maxHeight = collapseElement.scrollHeight + "px"
} else {
console.log(collapseElement.style.maxHeight)
if (collapseElement.style.maxHeight === "") { // This is a workaround to fix animation when no initial maxHeight has been set
collapseElement.style.maxHeight = collapseElement.scrollHeight + "px"
void collapseElement.offsetWidth // Needed to trigger render
}
icon.classList.add("fa-plus-square")
icon.classList.remove("fa-minus-square")
collapseElement.style.maxHeight = "0px"
}
}

View file

@ -24,6 +24,7 @@
<link rel="stylesheet" type="text/css" href="https://fonts.codeberg.org/dist/fontawesome5/css/solid.min.css" async>
<link rel="stylesheet" type="text/css" href="https://fonts.codeberg.org/dist/fontawesome5/css/fontawesome.min.css" async>
<script type="text/javascript" src="/assets/js/collapse.js"></script>
<script type="text/javascript" src="/assets/js/sidebar.js"></script>
</head>
@ -53,17 +54,24 @@
<div class="container">
<div id="sidebar">
<nav>
<div class="sidebar-close-button"><a href="#" onclick="hideSidebar()">{% fas_icon "times-circle" %}</a></div>
<div class="sidebar-close-button"><a href="javascript:void(0)" onclick="hideSidebar()">{% fas_icon "times-circle" %}</a></div>
<ul>
{% for entry in collections.all | eleventyNavigation %}
{% set active = entry.url == page.url or entry.key == eleventyNavigation.parent %}
{% if (not entry.draft) or active %}
<li class="nav-section{% if active %} active{% endif %}">
<a href="{{ entry.url }}">{% fas_icon entry.icon | default("caret-right") %} {{ entry.title }}</a>
<li class="nav-section{% if active %} active{% endif %}" style="display: flex;">
<a class="section-link" href="{{ entry.url }}" style="flex: 1;">{% fas_icon entry.icon | default("caret-right") %} {{ entry.title }}</a>
{% if entry.children.length > 0 %}
<a class="section-collapse-button" data-collapse-id="nav-second-level-{{ entry.key }}" href="javascript:void(0)" onclick="onCollapseButtonClick(this)">
{% if active %}{% fas_icon "minus-square" %}{% else %}{% fas_icon "plus-square" %}{% endif %}
</a>
{% else %}
<a class="section-collapse-button"><!-- Intentionally left blank --></a>
{% endif %}
</li>
{% if active and entry.children.length > 0 %}
<li class="nav-second-level">
{% if entry.children.length > 0 %}
<li class="nav-second-level collapsible" id="nav-second-level-{{ entry.key }}"{% if not active %} style="max-height: 0px;"{% endif %}>
<ul>
{% for child in entry.children %}
{% set child_active = child.url == page.url %}