From 3aecaab4d0387b063c9e02a3523eec4d9a70df4e Mon Sep 17 00:00:00 2001
From: Thomas Hackl <hackl@data-quest.de>
Date: Thu, 23 Mar 2023 14:49:21 +0000
Subject: [PATCH] Resolve "Responsive Navigation: Aufklappen der Sidebar
 erfordert Scrollen an den Seitenanfang"

Closes #2360, #2337, #2318, and #2152

Merge request studip/studip!1587
---
 .../javascripts/bootstrap/responsive.js       |  2 +-
 .../assets/javascripts/bootstrap/sidebar.js   |  6 ----
 resources/assets/javascripts/entry-base.js    |  1 -
 resources/assets/javascripts/lib/sidebar.js   | 15 --------
 .../assets/stylesheets/scss/courseware.scss   |  2 +-
 .../assets/stylesheets/scss/responsive.scss   | 35 +++++++++----------
 .../assets/stylesheets/scss/sidebar.scss      |  3 ++
 .../responsive/ResponsiveContentBar.vue       | 16 ++++-----
 .../responsive/ResponsiveNavigation.vue       |  7 ++--
 9 files changed, 30 insertions(+), 57 deletions(-)
 delete mode 100644 resources/assets/javascripts/bootstrap/sidebar.js

diff --git a/resources/assets/javascripts/bootstrap/responsive.js b/resources/assets/javascripts/bootstrap/responsive.js
index af06f281caa..7ee9b15800e 100644
--- a/resources/assets/javascripts/bootstrap/responsive.js
+++ b/resources/assets/javascripts/bootstrap/responsive.js
@@ -6,7 +6,7 @@ STUDIP.domReady(() => {
         document.documentElement.classList.add('fullscreen-mode');
         const sidebar = document.getElementById('sidebar');
         if (sidebar) {
-            sidebar.style.display = 'none';
+            sidebar.ariaHidden = 'true';
         }
     }
 
diff --git a/resources/assets/javascripts/bootstrap/sidebar.js b/resources/assets/javascripts/bootstrap/sidebar.js
deleted file mode 100644
index 04630c09e67..00000000000
--- a/resources/assets/javascripts/bootstrap/sidebar.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// Set correct sidebar height for stickyness
-STUDIP.domReady(() => {
-    if (!STUDIP.Responsive.isResponsive()) {
-        STUDIP.Sidebar.adjustHeight();
-    }
-});
diff --git a/resources/assets/javascripts/entry-base.js b/resources/assets/javascripts/entry-base.js
index f6f55958fb9..70b78e7217a 100644
--- a/resources/assets/javascripts/entry-base.js
+++ b/resources/assets/javascripts/entry-base.js
@@ -28,7 +28,6 @@ import "./bootstrap/studip_helper_attributes.js"
 import "./bootstrap/header_magic.js"
 import "./bootstrap/header_navigation.js"
 import "./bootstrap/personal_notifications.js"
-import "./bootstrap/sidebar.js"
 import "./bootstrap/dialog.js"
 import "./bootstrap/jsupdater.js"
 import "./bootstrap/files.js"
diff --git a/resources/assets/javascripts/lib/sidebar.js b/resources/assets/javascripts/lib/sidebar.js
index d3d67d5e805..3cb1c05eba8 100644
--- a/resources/assets/javascripts/lib/sidebar.js
+++ b/resources/assets/javascripts/lib/sidebar.js
@@ -18,19 +18,4 @@ const Sidebar = {
     }
 };
 
-Sidebar.adjustHeight = () => {
-    const display = $('#sidebar').css('display');
-
-    if (display === 'none') {
-        $('#sidebar').css('display', 'block');
-    }
-    const lastWidget = $('.sidebar-widget:last-child');
-    if (lastWidget.length > 0) {
-        const height = lastWidget.offset().top + lastWidget.height();
-        $('#sidebar').css('height', height + 'px');
-    }
-    if (display === 'none') {
-        $('#sidebar').css('display', 'none');
-    }
-}
 export default Sidebar;
diff --git a/resources/assets/stylesheets/scss/courseware.scss b/resources/assets/stylesheets/scss/courseware.scss
index 34f9df37161..175b2a606cd 100644
--- a/resources/assets/stylesheets/scss/courseware.scss
+++ b/resources/assets/stylesheets/scss/courseware.scss
@@ -5376,5 +5376,5 @@ s h e l f  i t e m s
     }
 }
 /* * * * * * * * * * * * * * * * * *
-s h e l f  i t e m s  e n d 
+s h e l f  i t e m s  e n d
 * * * * * * * * * * * * * * * * * */
diff --git a/resources/assets/stylesheets/scss/responsive.scss b/resources/assets/stylesheets/scss/responsive.scss
index 6dc068ddddf..57047bc464a 100644
--- a/resources/assets/stylesheets/scss/responsive.scss
+++ b/resources/assets/stylesheets/scss/responsive.scss
@@ -261,8 +261,10 @@ $sidebarOut: -330px;
     }
 }
 
-.cw-ribbon-button-zoom {
-    display: none;
+#responsive-contentbar-container {
+    position: fixed;
+    width: 100vw;
+    z-index: 1000;
 }
 
 .responsive-display,
@@ -314,8 +316,11 @@ $sidebarOut: -330px;
     #sidebar {
         background-color: $white;
         max-height: calc(100vh - 100px);
+        left: 15px;
         position: absolute;
+        top: 116px;
         transform: translateX($sidebarOut);
+        visibility: hidden;
         z-index: 100;
 
         &.responsive-hide {
@@ -328,10 +333,9 @@ $sidebarOut: -330px;
             @media not prefers-reduced-motion {
                 animation: slide-in $transition-duration forwards;
             }
-
-            left: 15px;
-            position: relative;
-            top: 60px;
+            position: sticky;
+            top: 100px;
+            visibility: visible;
         }
 
         .sidebar-image {
@@ -347,6 +351,9 @@ $sidebarOut: -330px;
         }
 
         @keyframes slide-in {
+            0% {
+                transform: translateX($sidebarOut);
+            }
             100% {
                 transform: translateX($sidebarIn);
             }
@@ -374,6 +381,7 @@ $sidebarOut: -330px;
     }
 
     #content-wrapper {
+        margin-top: 65px;
         width: calc(100vw - 2 * $page-margin);
     }
 
@@ -387,7 +395,6 @@ $sidebarOut: -330px;
         justify-content: stretch;
         margin-bottom: 15px;
         padding-bottom: 0.5em;
-        padding-left: 5px;
 
         .contentbar-nav,
         .cw-ribbon-nav {
@@ -441,7 +448,7 @@ $sidebarOut: -330px;
         }
 
         > .contentbar-wrapper-right {
-            flex: 1;
+            flex: 0;
             left: 5px;
             position: relative;
 
@@ -489,6 +496,7 @@ $sidebarOut: -330px;
     }
 
     #toc {
+        max-width: 100vw;
         position: absolute;
         right: -8px;
         top: -21px;
@@ -550,6 +558,7 @@ $sidebarOut: -330px;
     #sidebar {
         height: 100%;
         position: fixed;
+        top: 75px;
         transform: translateX($sidebarOut);
         -webkit-transform: translateX($sidebarOut);
         top: 80px;
@@ -613,12 +622,6 @@ $sidebarOut: -330px;
             display: none;
         }
 
-        #responsive-contentbar-container {
-            position: fixed;
-            width: 100vw;
-            z-index: 1000;
-        }
-
         #responsive-contentbar {
             padding-left: 15px;
 
@@ -628,10 +631,6 @@ $sidebarOut: -330px;
             }
         }
 
-        #sidebar.responsive-hide {
-            top: 110px;
-        }
-
         #content-wrapper {
             flex: 1;
             margin-top: 75px;
diff --git a/resources/assets/stylesheets/scss/sidebar.scss b/resources/assets/stylesheets/scss/sidebar.scss
index 4d4efc02df5..c009e0e8d07 100644
--- a/resources/assets/stylesheets/scss/sidebar.scss
+++ b/resources/assets/stylesheets/scss/sidebar.scss
@@ -2,11 +2,14 @@
     background: $white;
     border-left: 0;
     display: inline-block;
+    height: max-content;
+    margin-bottom: $page-margin + 35px;
     margin-top: 15px;
     padding: 0 5px 7px 15px;
     position: sticky;
     text-align: left;
     top: 50px;
+    width: $sidebar-width;
     z-index: 2;
 
     .sidebar-image {
diff --git a/resources/vue/components/responsive/ResponsiveContentBar.vue b/resources/vue/components/responsive/ResponsiveContentBar.vue
index 6899c3b91f5..051b83f5aa1 100644
--- a/resources/vue/components/responsive/ResponsiveContentBar.vue
+++ b/resources/vue/components/responsive/ResponsiveContentBar.vue
@@ -69,32 +69,28 @@ export default {
             const content = document.getElementById('content-wrapper');
             const pageTitle = document.getElementById('page-title-container');
             if (this.sidebarOpen) {
+                sidebar.ariaHidden = 'true';
                 sidebar.classList.add('responsive-hide');
                 sidebar.classList.remove('responsive-show');
 
                 if (document.documentElement.classList.contains('responsive-display')
                         && !document.documentElement.classList.contains('fullscreen-mode')) {
-                    content.style.display = null;
-                    pageTitle.style.display = null;
+                    content.style.display = '';
+                    pageTitle.style.display = '';
                 }
 
                 if (!document.documentElement.classList.contains('responsive-display')) {
                     document.body.style.display = 'flex';
                 }
 
-                // Hide sidebar after slide-out animation has ended so that it isn't focusable anymore.
-                setTimeout(() => {
-                    sidebar.style.display = 'none';
-                }, 301);
-
                 this.sidebarOpen = false;
             } else {
-                sidebar.style.display = '';
-
+                sidebar.ariaHidden = '';
                 sidebar.classList.add('responsive-show');
                 sidebar.classList.remove('responsive-hide');
+
                 if (document.documentElement.classList.contains('responsive-display')
-                        && !document.documentElement.classList.contains('fullscreen-mode')) {
+                    && !document.documentElement.classList.contains('fullscreen-mode')) {
                     // Set a timeout here so that the content "disappears" after slide-in aninmation is finished.
                     setTimeout(() => {
                         content.style.display = 'none';
diff --git a/resources/vue/components/responsive/ResponsiveNavigation.vue b/resources/vue/components/responsive/ResponsiveNavigation.vue
index 500c0304203..81b6a4da352 100644
--- a/resources/vue/components/responsive/ResponsiveNavigation.vue
+++ b/resources/vue/components/responsive/ResponsiveNavigation.vue
@@ -312,7 +312,7 @@ export default {
                     siteTitle.textContent = this.initialTitle;
                 }
 
-                sidebar.style.display = 'none';
+                sidebar.ariaHidden = 'true';
 
             } else {
                 document.documentElement.classList.remove('fullscreen-mode');
@@ -327,8 +327,7 @@ export default {
                     siteTitle.textContent = siteTitle.dataset.originalTitle.trim();
                 }
 
-                sidebar.style.display = '';
-
+                sidebar.ariaHidden = '';
             }
 
             this.isFullscreen = state;
@@ -447,11 +446,9 @@ export default {
                         this.isFullscreen = true;
 
                         STUDIP.eventBus.emit('fullscreen-enabled');
-                        document.getElementById('sidebar').style.display = 'none';
                     } else {
                         this.isFullscreen = false;
                         STUDIP.eventBus.emit('fullscreen-disabled');
-                        document.getElementById('sidebar').style.display = '';
                     }
                     break;
                 case 'HEADER':
-- 
GitLab