From 5ec4ccb0b6ed893a9896f229d6977c48e1d5be02 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ji=C5=99=C3=AD=20Setni=C4=8Dka?= <setnicka@seznam.cz>
Date: Tue, 5 Sep 2023 19:21:54 +0200
Subject: [PATCH] =?UTF-8?q?Responzivn=C3=AD=20design:=20Pure=20CSS=20hambu?=
 =?UTF-8?q?rger=20menu?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Originální inspirace: https://codepen.io/erikterwan/pen/EVzeRP

Klasický trik se skrytým checkboxem.
---
 mo/web/templates/base.html |  6 +++
 static/mo.css              | 86 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 92 insertions(+)

diff --git a/mo/web/templates/base.html b/mo/web/templates/base.html
index 782a7d7f..183467a2 100644
--- a/mo/web/templates/base.html
+++ b/mo/web/templates/base.html
@@ -20,6 +20,12 @@
 	</div>
 </header>
 <div id="nav-wrapper">
+	<!-- A fake / hidden checkbox is used as click receiver -->
+	<input class="hamburger" type="checkbox" />
+	<span></span>
+	<span></span>
+	<span></span>
+
 	<nav id="main-menu" class="content">
 		{% for item in get_menu() %}
 			<a {% if item.classes %}class="{{ " ".join(item.classes) }}"{% endif %} href="{{ item.url }}">{{ item.name }}</a>
diff --git a/static/mo.css b/static/mo.css
index 3c0c7d96..8d394880 100644
--- a/static/mo.css
+++ b/static/mo.css
@@ -46,6 +46,7 @@ header h1 { margin: auto 20px 0px; color: #222; }
 	border: 1px #222 solid;
 	z-index: 10;
 }
+#nav-wrapper input.hamburger { display: none; }
 
 footer {
 	margin-top: auto;
@@ -563,4 +564,89 @@ table.data input.form-control {
 	header h1 {
 		font-size: 18px;
 	}
+
+	/* Hamburger responsive menu (original source: https://codepen.io/erikterwan/pen/EVzeRP) */
+	#nav-wrapper {
+		background-color: rgba(255, 255, 255, 0.8);
+		border: none;
+		z-index: 1;
+		padding-top: 10px;
+		user-select: none;
+	}
+	#nav-wrapper input.hamburger {
+		display: block;
+		margin-left: 10px;
+		width: 40px;
+		height: 32px;
+		position: absolute;
+		top: -2px;
+		left: -7px;
+
+		cursor: pointer;
+
+		opacity: 0; /* hide this */
+		z-index: 2; /* and place it over the hamburger */
+		-webkit-touch-callout: none;
+	}
+
+	/* Hamburger symbol */
+	#nav-wrapper span {
+		display: block;
+		width: 33px;
+		height: 4px;
+		margin-left: 10px;
+		margin-bottom: 5px;
+		position: relative;
+
+		background: #222;
+		border-radius: 3px;
+
+		z-index: 1;
+
+		transform-origin: 4px 0px;
+
+		transition: transform 0.5s cubic-bezier(0.77,0.2,0.05,1.0),
+			background 0.5s cubic-bezier(0.77,0.2,0.05,1.0),
+			opacity 0.55s ease;
+	}
+	#nav-wrapper span:first-child { transform-origin: 0% 0%; }
+	#nav-wrapper span:nth-last-child(2) { transform-origin: 0% 100%; }
+
+	/* Hamburger crossmark symbol */
+	#nav-wrapper input.hamburger:checked ~ span {
+		background-color: #fff;
+		opacity: 1;
+		transform: rotate(45deg) translate(-2px, -1px);
+	}
+	#nav-wrapper input.hamburger:checked ~ span:nth-last-child(3) {
+		opacity: 0;
+		transform: rotate(0deg) scale(0.2, 0.2);
+	}
+	#nav-wrapper input.hamburger:checked ~ span:nth-last-child(2) {
+		transform: rotate(-45deg) translate(0, -1px);
+	}
+
+	nav#main-menu {
+		position: absolute;
+		max-width: 300px;
+		max-height: 100vh;
+		top: 0px;
+		padding-top: 35px;
+
+		flex-direction: column;
+		flex-wrap: nowrap;
+
+		background: #222;
+		-webkit-font-smoothing: antialiased;
+		/* to stop flickering of text in safari */
+
+		transform: translate(-120%, 0);
+
+		transition: transform 0.5s cubic-bezier(0.77,0.2,0.05,1.0);
+		overflow-y: scroll;
+	}
+	#nav-wrapper input.hamburger:checked ~ nav#main-menu { transform: none; }
+
+	nav#main-menu > .right { margin-left: 0px; }
+	nav#main-menu > form > input { width: 100%; }
 }
-- 
GitLab