From cff48047b00b890600356fad29064b6a28532c2b Mon Sep 17 00:00:00 2001
From: Thomas Hackl <hackl@data-quest.de>
Date: Mon, 6 Feb 2023 08:36:42 +0000
Subject: [PATCH] Resolve ""Zweistufiger" Vollbildmodus"

Closes #2037, #1759, and #2097

Merge request studip/studip!1326
---
 app/views/oer/market/details.php              |   2 +-
 lib/wiki.inc.php                              |  12 ++
 .../images/icons/black/focusmode-off.svg      |   1 -
 .../images/icons/black/fullscreen-off.svg     |   1 -
 .../images/icons/black/fullscreen-on.svg      |   1 -
 .../images/icons/blue/focusmode-off.svg       |   1 -
 .../images/icons/blue/fullscreen-off.svg      |   1 -
 .../images/icons/blue/fullscreen-off2.svg     |   1 -
 .../images/icons/blue/fullscreen-off3.svg     |   1 -
 .../images/icons/blue/fullscreen-on.svg       |   1 -
 .../images/icons/blue/fullscreen-on2.svg      |   1 -
 .../images/icons/blue/fullscreen-on3.svg      |   1 -
 .../images/icons/blue/fullscreen-on4.svg      |   1 -
 .../images/icons/blue/fullscreen-on5.svg      |   1 -
 .../images/icons/blue/screen-compact.svg      |   1 +
 .../assets/images/icons/blue/screen-full.svg  |   1 +
 .../images/icons/blue/screen-standard.svg     |   1 +
 .../images/icons/green/focusmode-off.svg      |   1 -
 .../images/icons/green/fullscreen-off.svg     |   1 -
 .../images/icons/green/fullscreen-on.svg      |   1 -
 .../images/icons/grey/focusmode-off.svg       |   1 -
 .../images/icons/grey/fullscreen-off.svg      |   1 -
 .../images/icons/grey/fullscreen-on.svg       |   2 +-
 .../assets/images/icons/red/focusmode-off.svg |   1 -
 .../images/icons/red/fullscreen-off.svg       |   1 -
 .../assets/images/icons/red/fullscreen-on.svg |   1 -
 .../images/icons/white/focusmode-off.svg      |   1 -
 .../images/icons/white/fullscreen-off.svg     |   1 -
 .../images/icons/white/fullscreen-off2.svg    |   1 -
 .../images/icons/white/fullscreen-off3.svg    |   1 -
 .../images/icons/white/fullscreen-on.svg      |   1 -
 .../images/icons/white/fullscreen-on2.svg     |   1 -
 .../images/icons/white/fullscreen-on3.svg     |   1 -
 .../images/icons/white/fullscreen-on4.svg     |   1 -
 .../images/icons/white/screen-compact.svg     |   1 +
 .../assets/images/icons/white/screen-full.svg |   1 +
 .../images/icons/white/screen-standard.svg    |   1 +
 .../images/icons/yellow/focusmode-off.svg     |   1 -
 .../images/icons/yellow/fullscreen-off.svg    |   1 -
 .../images/icons/yellow/fullscreen-on.svg     |   1 -
 .../javascripts/bootstrap/application.js      |   8 -
 .../javascripts/bootstrap/fullscreen.js       |  33 +++-
 .../javascripts/bootstrap/responsive.js       |   8 +-
 .../assets/javascripts/bootstrap/sidebar.js   |  58 +-----
 .../assets/javascripts/lib/fullscreen.js      |  66 +++----
 .../assets/javascripts/lib/responsive.js      |  11 +-
 resources/assets/javascripts/lib/sidebar.js   |  26 +--
 .../assets/stylesheets/scss/contentbar.scss   |  23 ---
 .../assets/stylesheets/scss/courseware.scss   |  33 ++--
 resources/assets/stylesheets/scss/header.scss |   2 +-
 resources/assets/stylesheets/scss/index.scss  |   9 +
 .../assets/stylesheets/scss/layouts.scss      |  17 +-
 .../assets/stylesheets/scss/responsive.scss   | 103 ++++++++---
 .../assets/stylesheets/scss/sidebar.scss      |   6 +-
 resources/assets/stylesheets/studip.less      |   3 -
 resources/assets/stylesheets/studip.scss      |   2 +-
 .../courseware/CoursewareRibbon.vue           |  25 +--
 .../CoursewareStructuralElement.vue           |  19 +-
 .../components/responsive/NavigationItem.vue  |  13 +-
 .../responsive/ResponsiveContentBar.vue       |  42 ++++-
 .../responsive/ResponsiveNavigation.vue       | 167 +++++++++++-------
 .../responsive/ResponsiveSkipLinks.vue        |   2 +-
 .../responsive/ToggleFullscreen.vue           |  51 ------
 templates/contentbar/contentbar.php           |   5 -
 templates/header.php                          |  13 +-
 templates/tabs.php                            |   9 +-
 66 files changed, 415 insertions(+), 392 deletions(-)
 delete mode 100644 public/assets/images/icons/black/focusmode-off.svg
 delete mode 100644 public/assets/images/icons/black/fullscreen-off.svg
 delete mode 100644 public/assets/images/icons/black/fullscreen-on.svg
 delete mode 100644 public/assets/images/icons/blue/focusmode-off.svg
 delete mode 100644 public/assets/images/icons/blue/fullscreen-off.svg
 delete mode 100644 public/assets/images/icons/blue/fullscreen-off2.svg
 delete mode 100644 public/assets/images/icons/blue/fullscreen-off3.svg
 delete mode 100644 public/assets/images/icons/blue/fullscreen-on.svg
 delete mode 100644 public/assets/images/icons/blue/fullscreen-on2.svg
 delete mode 100644 public/assets/images/icons/blue/fullscreen-on3.svg
 delete mode 100644 public/assets/images/icons/blue/fullscreen-on4.svg
 delete mode 100644 public/assets/images/icons/blue/fullscreen-on5.svg
 create mode 100644 public/assets/images/icons/blue/screen-compact.svg
 create mode 100644 public/assets/images/icons/blue/screen-full.svg
 create mode 100644 public/assets/images/icons/blue/screen-standard.svg
 delete mode 100644 public/assets/images/icons/green/focusmode-off.svg
 delete mode 100644 public/assets/images/icons/green/fullscreen-off.svg
 delete mode 100644 public/assets/images/icons/green/fullscreen-on.svg
 delete mode 100644 public/assets/images/icons/grey/focusmode-off.svg
 delete mode 100644 public/assets/images/icons/grey/fullscreen-off.svg
 delete mode 100644 public/assets/images/icons/red/focusmode-off.svg
 delete mode 100644 public/assets/images/icons/red/fullscreen-off.svg
 delete mode 100644 public/assets/images/icons/red/fullscreen-on.svg
 delete mode 100644 public/assets/images/icons/white/focusmode-off.svg
 delete mode 100644 public/assets/images/icons/white/fullscreen-off.svg
 delete mode 100644 public/assets/images/icons/white/fullscreen-off2.svg
 delete mode 100644 public/assets/images/icons/white/fullscreen-off3.svg
 delete mode 100644 public/assets/images/icons/white/fullscreen-on.svg
 delete mode 100644 public/assets/images/icons/white/fullscreen-on2.svg
 delete mode 100644 public/assets/images/icons/white/fullscreen-on3.svg
 delete mode 100644 public/assets/images/icons/white/fullscreen-on4.svg
 create mode 100644 public/assets/images/icons/white/screen-compact.svg
 create mode 100644 public/assets/images/icons/white/screen-full.svg
 create mode 100644 public/assets/images/icons/white/screen-standard.svg
 delete mode 100644 public/assets/images/icons/yellow/focusmode-off.svg
 delete mode 100644 public/assets/images/icons/yellow/fullscreen-off.svg
 delete mode 100644 public/assets/images/icons/yellow/fullscreen-on.svg
 delete mode 100644 resources/vue/components/responsive/ToggleFullscreen.vue

diff --git a/app/views/oer/market/details.php b/app/views/oer/market/details.php
index e764d908772..60468bbfcb7 100644
--- a/app/views/oer/market/details.php
+++ b/app/views/oer/market/details.php
@@ -336,7 +336,7 @@ if ($material['player_url'] || $material->isVideo() || $material->isPDF()) {
     $actions->addLink(
         _('Vollbild aktivieren'),
         "#",
-        Icon::create("fullscreen-on", Icon::ROLE_CLICKABLE),
+        Icon::create('screen-full'),
         ['onclick' => "STUDIP.OER.requestFullscreen('.lernmarktplatz_player');"]
     );
 }
diff --git a/lib/wiki.inc.php b/lib/wiki.inc.php
index 6d37e541686..f7caafe643e 100644
--- a/lib/wiki.inc.php
+++ b/lib/wiki.inc.php
@@ -1028,6 +1028,12 @@ function wikiEdit($keyword, $wikiData, $user_id, $backpage=NULL, $ancestor=NULL)
                 ['data-confirm' => showDeleteDialog($page->keyword, $page->version)]
             );
         }
+        $actionMenu->addLink(
+            '#',
+            _('Als Vollbild anzeigen'),
+            Icon::create('screen-compact'),
+            ['class' => 'fullscreen-trigger']
+        );
     }
 
     // Create content bar.
@@ -1593,6 +1599,12 @@ function showWikiPage($keyword, $version, $special="", $show_comments="icon", $h
                 ['data-confirm' => showDeleteDialog($page->keyword, $page->version)]
             );
         }
+        $actionMenu->addLink(
+            '#',
+            _('Als Vollbild anzeigen'),
+            Icon::create('screen-full'),
+            ['class' => 'fullscreen-trigger']
+        );
     }
 
     // Create content bar.
diff --git a/public/assets/images/icons/black/focusmode-off.svg b/public/assets/images/icons/black/focusmode-off.svg
deleted file mode 100644
index d7fe2e4a128..00000000000
--- a/public/assets/images/icons/black/focusmode-off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="16" height="16" id="icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 54" fill="#000000"><g id="fullscreen-off"><polygon points="51 20.13 33.87 20.13 33.87 2.99 37.29 2.99 37.29 16.7 51 16.7 51 20.13"/><polygon points="33.86 50.87 33.86 33.73 51 33.73 51 37.16 37.29 37.16 37.29 50.87 33.86 50.87"/><polygon points="20.16 50.97 16.73 50.97 16.73 37.26 3.02 37.26 3.02 33.84 20.16 33.84 20.16 50.97"/><polygon points="3.02 20.02 3.02 16.6 16.73 16.6 16.73 2.89 20.16 2.89 20.16 20.02 3.02 20.02"/></g></svg>
diff --git a/public/assets/images/icons/black/fullscreen-off.svg b/public/assets/images/icons/black/fullscreen-off.svg
deleted file mode 100644
index d7fe2e4a128..00000000000
--- a/public/assets/images/icons/black/fullscreen-off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="16" height="16" id="icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 54" fill="#000000"><g id="fullscreen-off"><polygon points="51 20.13 33.87 20.13 33.87 2.99 37.29 2.99 37.29 16.7 51 16.7 51 20.13"/><polygon points="33.86 50.87 33.86 33.73 51 33.73 51 37.16 37.29 37.16 37.29 50.87 33.86 50.87"/><polygon points="20.16 50.97 16.73 50.97 16.73 37.26 3.02 37.26 3.02 33.84 20.16 33.84 20.16 50.97"/><polygon points="3.02 20.02 3.02 16.6 16.73 16.6 16.73 2.89 20.16 2.89 20.16 20.02 3.02 20.02"/></g></svg>
diff --git a/public/assets/images/icons/black/fullscreen-on.svg b/public/assets/images/icons/black/fullscreen-on.svg
deleted file mode 100644
index 9f42af51f67..00000000000
--- a/public/assets/images/icons/black/fullscreen-on.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="16" height="16" id="icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 54" fill="#000000"><g id="zoom-in-3"><polygon points="51 20.12 47.57 20.12 47.57 6.42 33.86 6.42 33.86 2.99 51 2.99 51 20.12"/><polygon points="20.15 50.97 3.02 50.97 3.02 33.83 6.44 33.83 6.44 47.54 20.15 47.54 20.15 50.97"/><polygon points="33.86 50.97 33.86 47.54 47.57 47.54 47.57 33.83 51 33.83 51 50.97 33.86 50.97"/><polygon points="3.02 20.12 3.02 2.99 20.15 2.99 20.15 6.42 6.44 6.42 6.44 20.12 3.02 20.12"/></g></svg>
diff --git a/public/assets/images/icons/blue/focusmode-off.svg b/public/assets/images/icons/blue/focusmode-off.svg
deleted file mode 100644
index b7e965abb2c..00000000000
--- a/public/assets/images/icons/blue/focusmode-off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56 56"><defs><style>.e{fill:#28497c;}</style></defs><g id="c"><g id="d"><polygon class="e" points="56 20 36 20 36 0 40 0 40 16 56 16 56 20"/><polygon class="e" points="20 56 16 56 16 40 0 40 0 36 20 36 20 56"/><polygon class="e" points="36 56 36 36 56 36 56 40 40 40 40 56 36 56"/><polygon class="e" points="0 20 0 16 16 16 16 0 20 0 20 20 0 20"/></g></g></svg>
diff --git a/public/assets/images/icons/blue/fullscreen-off.svg b/public/assets/images/icons/blue/fullscreen-off.svg
deleted file mode 100644
index b7e965abb2c..00000000000
--- a/public/assets/images/icons/blue/fullscreen-off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56 56"><defs><style>.e{fill:#28497c;}</style></defs><g id="c"><g id="d"><polygon class="e" points="56 20 36 20 36 0 40 0 40 16 56 16 56 20"/><polygon class="e" points="20 56 16 56 16 40 0 40 0 36 20 36 20 56"/><polygon class="e" points="36 56 36 36 56 36 56 40 40 40 40 56 36 56"/><polygon class="e" points="0 20 0 16 16 16 16 0 20 0 20 20 0 20"/></g></g></svg>
diff --git a/public/assets/images/icons/blue/fullscreen-off2.svg b/public/assets/images/icons/blue/fullscreen-off2.svg
deleted file mode 100644
index c10c1d1e5fa..00000000000
--- a/public/assets/images/icons/blue/fullscreen-off2.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52.83 52.83"><defs><style>.e{fill:#28497c;}</style></defs><g id="c"><g id="d"><polygon class="e" points="50.45 22.45 30.45 22.45 30.45 2.45 34.45 2.45 34.45 18.45 50.45 18.45 50.45 22.45"/><polygon class="e" points="22.45 50.45 18.45 50.45 18.45 34.45 2.45 34.45 2.45 30.45 22.45 30.45 22.45 50.45"/><polygon class="e" points="30.45 50.45 30.45 30.45 50.45 30.45 50.45 34.45 34.45 34.45 34.45 50.45 30.45 50.45"/><polygon class="e" points="2.45 22.45 2.45 18.45 18.45 18.45 18.45 2.45 22.45 2.45 22.45 22.45 2.45 22.45"/><rect class="e" x="8.95" y="-2.49" width="4" height="26.87" transform="translate(-4.54 10.95) rotate(-45)"/><rect class="e" x="39.66" y="28.53" width="4" height="26.26" transform="translate(-17.26 41.66) rotate(-45)"/><rect class="e" x="39.9" y="-2.53" width="4" height="26.92" transform="translate(20 -26.42) rotate(45)"/><rect class="e" x="8.93" y="28.44" width="4" height="26.92" transform="translate(32.83 4.54) rotate(45)"/></g></g></svg>
diff --git a/public/assets/images/icons/blue/fullscreen-off3.svg b/public/assets/images/icons/blue/fullscreen-off3.svg
deleted file mode 100644
index 6830b2e06e4..00000000000
--- a/public/assets/images/icons/blue/fullscreen-off3.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56 56"><defs><style>.e{fill:#28497c;}</style></defs><g id="c"><g id="d"><polygon class="e" points="44.01 20.01 36.01 20.01 36.01 12.01 32.06 8.06 32.01 8.02 32.01 24.01 48 24.01 47.96 23.96 44.01 20.01"/><rect class="e" x="13" y="5.1" width="4" height="19.8" transform="translate(-6.21 15) rotate(-45)"/><rect class="e" x="39.5" y="30.89" width="4" height="21.21" transform="translate(-17.19 41.5) rotate(-45)"/><rect class="e" x="38.96" y="5.06" width="4" height="19.8" transform="translate(22.58 -24.58) rotate(45)"/><rect class="e" x="12.71" y="30.96" width="4" height="20.51" transform="translate(33.45 1.67) rotate(45)"/><path class="e" d="M52,4V52H4V4H52M56,0H0V56H56V0h0Z"/><polygon class="e" points="11.99 36.02 20 36.02 20 44.03 23.95 47.98 24 48.01 24 32.02 8.01 32.02 8.05 32.07 11.99 36.02"/><polygon class="e" points="36.01 44.03 36.01 36.02 44.01 36.02 47.96 32.07 48 32.02 32.01 32.02 32.01 48.01 32.06 47.98 36.01 44.03"/><polygon class="e" points="20 12.01 20 20.01 11.99 20.01 8.05 23.96 8.01 24.01 24 24.01 24 8.02 23.95 8.06 20 12.01"/></g></g></svg>
diff --git a/public/assets/images/icons/blue/fullscreen-on.svg b/public/assets/images/icons/blue/fullscreen-on.svg
deleted file mode 100644
index 08c249cf959..00000000000
--- a/public/assets/images/icons/blue/fullscreen-on.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 55.98 55.98"><defs><style>.e{fill:#28497c;}</style></defs><g id="c"><g id="d"><g><polygon class="e" points="35.99 0 35.99 4 51.98 4 51.98 19.99 55.98 19.99 55.98 0 35.99 0"/><polygon class="e" points="4 35.99 0 35.99 0 55.98 19.99 55.98 19.99 51.98 4 51.98 4 35.99"/></g><g><polygon class="e" points="55.98 35.99 51.98 35.99 51.98 51.98 35.99 51.98 35.99 55.98 55.98 55.98 55.98 35.99"/><polygon class="e" points="19.99 4 19.99 0 0 0 0 19.99 4 19.99 4 4 19.99 4"/></g></g></g></svg>
diff --git a/public/assets/images/icons/blue/fullscreen-on2.svg b/public/assets/images/icons/blue/fullscreen-on2.svg
deleted file mode 100644
index 16ba091dd1b..00000000000
--- a/public/assets/images/icons/blue/fullscreen-on2.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 55.98 55.98"><defs><style>.e{fill:#28497c;}</style></defs><g id="c"><g id="d"><g><polygon class="e" points="35.99 0 35.99 4 51.98 4 51.98 19.99 55.98 19.99 55.98 0 35.99 0"/><polygon class="e" points="4 35.99 0 35.99 0 55.98 19.99 55.98 19.99 51.98 4 51.98 4 35.99"/></g><g><polygon class="e" points="55.98 35.99 51.98 35.99 51.98 51.98 35.99 51.98 35.99 55.98 55.98 55.98 55.98 35.99"/><polygon class="e" points="19.99 4 19.99 0 0 0 0 19.99 4 19.99 4 4 19.99 4"/></g><rect class="e" x="9.44" y="-2.04" width="4" height="26.97" transform="translate(-4.74 11.44) rotate(-45)"/><rect class="e" x="42.48" y="31.04" width="4" height="26.87" transform="translate(-18.42 44.48) rotate(-45)"/><rect class="e" x="42.46" y="-2.03" width="4" height="26.92" transform="translate(21.1 -28.09) rotate(45)"/><rect class="e" x="9.43" y="31" width="4" height="26.92" transform="translate(34.79 4.94) rotate(45)"/></g></g></svg>
diff --git a/public/assets/images/icons/blue/fullscreen-on3.svg b/public/assets/images/icons/blue/fullscreen-on3.svg
deleted file mode 100644
index bdaad6d5942..00000000000
--- a/public/assets/images/icons/blue/fullscreen-on3.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56 56"><defs><style>.e{fill:#28497c;}</style></defs><g id="c"><g id="d"><g><polygon class="e" points="35.99 12.02 44 12.02 44 20.03 47.95 23.98 48 24.01 48 8.02 32.01 8.02 32.05 8.07 35.99 12.02"/><polygon class="e" points="20.01 44.01 12.01 44.01 12.01 36.01 8.06 32.06 8.01 32.02 8.01 48.01 24 48.01 23.96 47.96 20.01 44.01"/><polygon class="e" points="44 36.01 44 44.01 35.99 44.01 32.05 47.96 32.01 48.01 48 48.01 48 32.02 47.95 32.06 44 36.01"/><polygon class="e" points="12.01 20.03 12.01 12.02 20.01 12.02 23.96 8.07 24 8.02 8.01 8.02 8.01 24.01 8.06 23.98 12.01 20.03"/></g><rect class="e" x="16" y="8.1" width="4" height="19.8" transform="translate(-7.46 18) rotate(-45)"/><rect class="e" x="36.5" y="27.89" width="4" height="21.21" transform="translate(-15.95 38.5) rotate(-45)"/><rect class="e" x="35.96" y="8.06" width="4" height="19.8" transform="translate(23.82 -21.58) rotate(45)"/><rect class="e" x="15.71" y="27.96" width="4" height="20.51" transform="translate(32.21 -1.33) rotate(45)"/><path class="e" d="M52,4V52H4V4H52M56,0H0V56H56V0h0Z"/></g></g></svg>
diff --git a/public/assets/images/icons/blue/fullscreen-on4.svg b/public/assets/images/icons/blue/fullscreen-on4.svg
deleted file mode 100644
index da6502ec76f..00000000000
--- a/public/assets/images/icons/blue/fullscreen-on4.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 55.98 55.98"><defs><style>.e{fill:#28497c;}</style></defs><g id="c"><g id="d"><g><polygon class="e" points="35.99 0 35.99 4 51.98 4 51.98 19.99 55.98 19.99 55.98 0 35.99 0"/><polygon class="e" points="4 35.99 0 35.99 0 55.98 19.99 55.98 19.99 51.98 4 51.98 4 35.99"/></g><g><polygon class="e" points="55.98 35.99 51.98 35.99 51.98 51.98 35.99 51.98 35.99 55.98 55.98 55.98 55.98 35.99"/><polygon class="e" points="19.99 4 19.99 0 0 0 0 19.99 4 19.99 4 4 19.99 4"/></g><rect class="e" x="7.98" y="11.98" width="40" height="8"/><path class="e" d="M43.98,15.98v24H11.98V15.98H43.98m4-4H7.98V43.98H47.98V11.98h0Z"/></g></g></svg>
diff --git a/public/assets/images/icons/blue/fullscreen-on5.svg b/public/assets/images/icons/blue/fullscreen-on5.svg
deleted file mode 100644
index 8566dece4ed..00000000000
--- a/public/assets/images/icons/blue/fullscreen-on5.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 55.98 55.98"><defs><style>.e{fill:#28497c;}</style></defs><g id="c"><g id="d"><g><polygon class="e" points="35.99 0 35.99 4 51.98 4 51.98 49.99 55.98 49.99 55.98 0 35.99 0"/><polygon class="e" points="4 5.99 0 5.99 0 55.98 19.99 55.98 19.99 51.98 4 51.98 4 5.99"/></g><g><polygon class="e" points="55.98 35.99 51.98 35.99 51.98 51.98 5.99 51.98 5.99 55.98 55.98 55.98 55.98 35.99"/><polygon class="e" points="49.99 4 49.99 0 0 0 0 19.99 4 19.99 4 4 49.99 4"/></g><rect class="e" x="7.98" y="19.98" width="32" height="8"/><path class="e" d="M35.98,23.98v20H11.98V23.98h24m4-4H7.98v28H39.98V19.98h0Z"/></g></g></svg>
diff --git a/public/assets/images/icons/blue/screen-compact.svg b/public/assets/images/icons/blue/screen-compact.svg
new file mode 100644
index 00000000000..24a3618a790
--- /dev/null
+++ b/public/assets/images/icons/blue/screen-compact.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><defs><style>.f{fill:none;}.g{fill:#28497c;}</style></defs><g id="c"><rect class="f" width="64" height="64"/></g><g id="d"><g id="e"><g><polygon class="g" points="40.01 4.02 40.01 8.02 56 8.02 56 24.01 60 24.01 60 4.02 40.01 4.02"/><polygon class="g" points="8.02 40.01 4.02 40.01 4.02 60 24.01 60 24.01 56 8.02 56 8.02 40.01"/></g><g><polygon class="g" points="60 40.01 56 40.01 56 56 40.01 56 40.01 60 60 60 60 40.01"/><polygon class="g" points="24.01 8.02 24.01 4.02 4.02 4.02 4.02 24.01 8.02 24.01 8.02 8.02 24.01 8.02"/></g></g></g></svg>
\ No newline at end of file
diff --git a/public/assets/images/icons/blue/screen-full.svg b/public/assets/images/icons/blue/screen-full.svg
new file mode 100644
index 00000000000..23d2d614fb2
--- /dev/null
+++ b/public/assets/images/icons/blue/screen-full.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><defs><style>.f{fill:none;}.g{fill:#28497c;}</style></defs><g id="c"><rect class="f" width="64" height="64"/></g><g id="d"><g id="e"><polygon class="g" points="60 40.01 56 40.01 56 56 40.01 56 40.01 60 60 60 60 40.01"/><polygon class="g" points="24.01 8.02 24.01 4.02 4.02 4.02 4.02 24.01 8.02 24.01 8.02 8.02 24.01 8.02"/><polygon class="g" points="8.02 56 8.02 40.01 4.02 40.01 4.02 60 24.01 60 24.01 56 8.02 56"/><polygon class="g" points="56 8.02 56 24.01 60 24.01 60 4.02 40.01 4.02 40.01 8.02 56 8.02"/><polygon class="g" points="34.01 14 34.05 14.05 38 18 43.19 18 34.12 27.08 36.95 29.9 46.01 20.84 46.01 26.01 49.96 29.96 50 30 50 14 34.01 14"/><polygon class="g" points="26.01 46.01 20.84 46.01 29.87 36.98 27.05 34.15 18 43.19 18 38 14.05 34.05 14 34.01 14 50 30 50 29.96 49.96 26.01 46.01"/></g></g></svg>
\ No newline at end of file
diff --git a/public/assets/images/icons/blue/screen-standard.svg b/public/assets/images/icons/blue/screen-standard.svg
new file mode 100644
index 00000000000..05a5deeba25
--- /dev/null
+++ b/public/assets/images/icons/blue/screen-standard.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><defs><style>.f{fill:none;}.g{fill:#28497c;}</style></defs><g id="c"><rect class="f" width="64" height="64"/></g><g id="d"><g id="e"><polygon class="g" points="60 24 40 24 40 4 44 4 44 20 60 20 60 24"/><polygon class="g" points="24 60 20 60 20 44 4 44 4 40 24 40 24 60"/><polygon class="g" points="40 60 40 40 60 40 60 44 44 44 44 60 40 60"/><polygon class="g" points="4 24 4 20 20 20 20 4 24 4 24 24 4 24"/></g></g></svg>
\ No newline at end of file
diff --git a/public/assets/images/icons/green/focusmode-off.svg b/public/assets/images/icons/green/focusmode-off.svg
deleted file mode 100644
index b5aa40664b3..00000000000
--- a/public/assets/images/icons/green/focusmode-off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="16" height="16" id="icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 54" fill="#00962d"><g id="fullscreen-off"><polygon points="51 20.13 33.87 20.13 33.87 2.99 37.29 2.99 37.29 16.7 51 16.7 51 20.13"/><polygon points="33.86 50.87 33.86 33.73 51 33.73 51 37.16 37.29 37.16 37.29 50.87 33.86 50.87"/><polygon points="20.16 50.97 16.73 50.97 16.73 37.26 3.02 37.26 3.02 33.84 20.16 33.84 20.16 50.97"/><polygon points="3.02 20.02 3.02 16.6 16.73 16.6 16.73 2.89 20.16 2.89 20.16 20.02 3.02 20.02"/></g></svg>
diff --git a/public/assets/images/icons/green/fullscreen-off.svg b/public/assets/images/icons/green/fullscreen-off.svg
deleted file mode 100644
index b5aa40664b3..00000000000
--- a/public/assets/images/icons/green/fullscreen-off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="16" height="16" id="icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 54" fill="#00962d"><g id="fullscreen-off"><polygon points="51 20.13 33.87 20.13 33.87 2.99 37.29 2.99 37.29 16.7 51 16.7 51 20.13"/><polygon points="33.86 50.87 33.86 33.73 51 33.73 51 37.16 37.29 37.16 37.29 50.87 33.86 50.87"/><polygon points="20.16 50.97 16.73 50.97 16.73 37.26 3.02 37.26 3.02 33.84 20.16 33.84 20.16 50.97"/><polygon points="3.02 20.02 3.02 16.6 16.73 16.6 16.73 2.89 20.16 2.89 20.16 20.02 3.02 20.02"/></g></svg>
diff --git a/public/assets/images/icons/green/fullscreen-on.svg b/public/assets/images/icons/green/fullscreen-on.svg
deleted file mode 100644
index 38c011b2843..00000000000
--- a/public/assets/images/icons/green/fullscreen-on.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="16" height="16" id="icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 54" fill="#00962d"><g id="zoom-in-3"><polygon points="51 20.12 47.57 20.12 47.57 6.42 33.86 6.42 33.86 2.99 51 2.99 51 20.12"/><polygon points="20.15 50.97 3.02 50.97 3.02 33.83 6.44 33.83 6.44 47.54 20.15 47.54 20.15 50.97"/><polygon points="33.86 50.97 33.86 47.54 47.57 47.54 47.57 33.83 51 33.83 51 50.97 33.86 50.97"/><polygon points="3.02 20.12 3.02 2.99 20.15 2.99 20.15 6.42 6.44 6.42 6.44 20.12 3.02 20.12"/></g></svg>
diff --git a/public/assets/images/icons/grey/focusmode-off.svg b/public/assets/images/icons/grey/focusmode-off.svg
deleted file mode 100644
index 6509d7976b2..00000000000
--- a/public/assets/images/icons/grey/focusmode-off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="16" height="16" id="icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 54" fill="#6e6e6e"><g id="fullscreen-off"><polygon points="51 20.13 33.87 20.13 33.87 2.99 37.29 2.99 37.29 16.7 51 16.7 51 20.13"/><polygon points="33.86 50.87 33.86 33.73 51 33.73 51 37.16 37.29 37.16 37.29 50.87 33.86 50.87"/><polygon points="20.16 50.97 16.73 50.97 16.73 37.26 3.02 37.26 3.02 33.84 20.16 33.84 20.16 50.97"/><polygon points="3.02 20.02 3.02 16.6 16.73 16.6 16.73 2.89 20.16 2.89 20.16 20.02 3.02 20.02"/></g></svg>
diff --git a/public/assets/images/icons/grey/fullscreen-off.svg b/public/assets/images/icons/grey/fullscreen-off.svg
deleted file mode 100644
index 6509d7976b2..00000000000
--- a/public/assets/images/icons/grey/fullscreen-off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="16" height="16" id="icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 54" fill="#6e6e6e"><g id="fullscreen-off"><polygon points="51 20.13 33.87 20.13 33.87 2.99 37.29 2.99 37.29 16.7 51 16.7 51 20.13"/><polygon points="33.86 50.87 33.86 33.73 51 33.73 51 37.16 37.29 37.16 37.29 50.87 33.86 50.87"/><polygon points="20.16 50.97 16.73 50.97 16.73 37.26 3.02 37.26 3.02 33.84 20.16 33.84 20.16 50.97"/><polygon points="3.02 20.02 3.02 16.6 16.73 16.6 16.73 2.89 20.16 2.89 20.16 20.02 3.02 20.02"/></g></svg>
diff --git a/public/assets/images/icons/grey/fullscreen-on.svg b/public/assets/images/icons/grey/fullscreen-on.svg
index d2e63bcea90..4ce992f9080 100644
--- a/public/assets/images/icons/grey/fullscreen-on.svg
+++ b/public/assets/images/icons/grey/fullscreen-on.svg
@@ -1 +1 @@
-<svg width="16" height="16" id="icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 54" fill="#6e6e6e"><g id="zoom-in-3"><polygon points="51 20.12 47.57 20.12 47.57 6.42 33.86 6.42 33.86 2.99 51 2.99 51 20.12"/><polygon points="20.15 50.97 3.02 50.97 3.02 33.83 6.44 33.83 6.44 47.54 20.15 47.54 20.15 50.97"/><polygon points="33.86 50.97 33.86 47.54 47.57 47.54 47.57 33.83 51 33.83 51 50.97 33.86 50.97"/><polygon points="3.02 20.12 3.02 2.99 20.15 2.99 20.15 6.42 6.44 6.42 6.44 20.12 3.02 20.12"/></g></svg>
+<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 55.98 55.98"><defs><style>.e{fill:#6e6e6e;}</style></defs><g id="c"><g id="d"><g><polygon class="e" points="35.99 0 35.99 4 51.98 4 51.98 19.99 55.98 19.99 55.98 0 35.99 0"/><polygon class="e" points="4 35.99 0 35.99 0 55.98 19.99 55.98 19.99 51.98 4 51.98 4 35.99"/></g><g><polygon class="e" points="55.98 35.99 51.98 35.99 51.98 51.98 35.99 51.98 35.99 55.98 55.98 55.98 55.98 35.99"/><polygon class="e" points="19.99 4 19.99 0 0 0 0 19.99 4 19.99 4 4 19.99 4"/></g></g></g></svg>
\ No newline at end of file
diff --git a/public/assets/images/icons/red/focusmode-off.svg b/public/assets/images/icons/red/focusmode-off.svg
deleted file mode 100644
index 9767595021a..00000000000
--- a/public/assets/images/icons/red/focusmode-off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="16" height="16" id="icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 54" fill="#cb1800"><g id="fullscreen-off"><polygon points="51 20.13 33.87 20.13 33.87 2.99 37.29 2.99 37.29 16.7 51 16.7 51 20.13"/><polygon points="33.86 50.87 33.86 33.73 51 33.73 51 37.16 37.29 37.16 37.29 50.87 33.86 50.87"/><polygon points="20.16 50.97 16.73 50.97 16.73 37.26 3.02 37.26 3.02 33.84 20.16 33.84 20.16 50.97"/><polygon points="3.02 20.02 3.02 16.6 16.73 16.6 16.73 2.89 20.16 2.89 20.16 20.02 3.02 20.02"/></g></svg>
diff --git a/public/assets/images/icons/red/fullscreen-off.svg b/public/assets/images/icons/red/fullscreen-off.svg
deleted file mode 100644
index 9767595021a..00000000000
--- a/public/assets/images/icons/red/fullscreen-off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="16" height="16" id="icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 54" fill="#cb1800"><g id="fullscreen-off"><polygon points="51 20.13 33.87 20.13 33.87 2.99 37.29 2.99 37.29 16.7 51 16.7 51 20.13"/><polygon points="33.86 50.87 33.86 33.73 51 33.73 51 37.16 37.29 37.16 37.29 50.87 33.86 50.87"/><polygon points="20.16 50.97 16.73 50.97 16.73 37.26 3.02 37.26 3.02 33.84 20.16 33.84 20.16 50.97"/><polygon points="3.02 20.02 3.02 16.6 16.73 16.6 16.73 2.89 20.16 2.89 20.16 20.02 3.02 20.02"/></g></svg>
diff --git a/public/assets/images/icons/red/fullscreen-on.svg b/public/assets/images/icons/red/fullscreen-on.svg
deleted file mode 100644
index b592812d95f..00000000000
--- a/public/assets/images/icons/red/fullscreen-on.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="16" height="16" id="icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 54" fill="#cb1800"><g id="zoom-in-3"><polygon points="51 20.12 47.57 20.12 47.57 6.42 33.86 6.42 33.86 2.99 51 2.99 51 20.12"/><polygon points="20.15 50.97 3.02 50.97 3.02 33.83 6.44 33.83 6.44 47.54 20.15 47.54 20.15 50.97"/><polygon points="33.86 50.97 33.86 47.54 47.57 47.54 47.57 33.83 51 33.83 51 50.97 33.86 50.97"/><polygon points="3.02 20.12 3.02 2.99 20.15 2.99 20.15 6.42 6.44 6.42 6.44 20.12 3.02 20.12"/></g></svg>
diff --git a/public/assets/images/icons/white/focusmode-off.svg b/public/assets/images/icons/white/focusmode-off.svg
deleted file mode 100644
index f852c7fb908..00000000000
--- a/public/assets/images/icons/white/focusmode-off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56 56"><defs><style>.e{fill:#fff;}</style></defs><g id="c"><g id="d"><polygon class="e" points="56 20 36 20 36 0 40 0 40 16 56 16 56 20"/><polygon class="e" points="20 56 16 56 16 40 0 40 0 36 20 36 20 56"/><polygon class="e" points="36 56 36 36 56 36 56 40 40 40 40 56 36 56"/><polygon class="e" points="0 20 0 16 16 16 16 0 20 0 20 20 0 20"/></g></g></svg>
diff --git a/public/assets/images/icons/white/fullscreen-off.svg b/public/assets/images/icons/white/fullscreen-off.svg
deleted file mode 100644
index f852c7fb908..00000000000
--- a/public/assets/images/icons/white/fullscreen-off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56 56"><defs><style>.e{fill:#fff;}</style></defs><g id="c"><g id="d"><polygon class="e" points="56 20 36 20 36 0 40 0 40 16 56 16 56 20"/><polygon class="e" points="20 56 16 56 16 40 0 40 0 36 20 36 20 56"/><polygon class="e" points="36 56 36 36 56 36 56 40 40 40 40 56 36 56"/><polygon class="e" points="0 20 0 16 16 16 16 0 20 0 20 20 0 20"/></g></g></svg>
diff --git a/public/assets/images/icons/white/fullscreen-off2.svg b/public/assets/images/icons/white/fullscreen-off2.svg
deleted file mode 100644
index 5c7b0c61b72..00000000000
--- a/public/assets/images/icons/white/fullscreen-off2.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52.83 52.83"><defs><style>.e{fill:#fff;}</style></defs><g id="c"><g id="d"><polygon class="e" points="50.45 22.45 30.45 22.45 30.45 2.45 34.45 2.45 34.45 18.45 50.45 18.45 50.45 22.45"/><polygon class="e" points="22.45 50.45 18.45 50.45 18.45 34.45 2.45 34.45 2.45 30.45 22.45 30.45 22.45 50.45"/><polygon class="e" points="30.45 50.45 30.45 30.45 50.45 30.45 50.45 34.45 34.45 34.45 34.45 50.45 30.45 50.45"/><polygon class="e" points="2.45 22.45 2.45 18.45 18.45 18.45 18.45 2.45 22.45 2.45 22.45 22.45 2.45 22.45"/><rect class="e" x="8.95" y="-2.49" width="4" height="26.87" transform="translate(-4.54 10.95) rotate(-45)"/><rect class="e" x="39.66" y="28.53" width="4" height="26.26" transform="translate(-17.26 41.66) rotate(-45)"/><rect class="e" x="39.9" y="-2.53" width="4" height="26.92" transform="translate(20 -26.42) rotate(45)"/><rect class="e" x="8.93" y="28.44" width="4" height="26.92" transform="translate(32.83 4.54) rotate(45)"/></g></g></svg>
diff --git a/public/assets/images/icons/white/fullscreen-off3.svg b/public/assets/images/icons/white/fullscreen-off3.svg
deleted file mode 100644
index d51bf9d6dde..00000000000
--- a/public/assets/images/icons/white/fullscreen-off3.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56 56"><defs><style>.e{fill:#fff;}</style></defs><g id="c"><g id="d"><polygon class="e" points="44.01 20.01 36.01 20.01 36.01 12.01 32.06 8.06 32.01 8.02 32.01 24.01 48 24.01 47.96 23.96 44.01 20.01"/><rect class="e" x="13" y="5.1" width="4" height="19.8" transform="translate(-6.21 15) rotate(-45)"/><rect class="e" x="39.5" y="30.89" width="4" height="21.21" transform="translate(-17.19 41.5) rotate(-45)"/><rect class="e" x="38.96" y="5.06" width="4" height="19.8" transform="translate(22.58 -24.58) rotate(45)"/><rect class="e" x="12.71" y="30.96" width="4" height="20.51" transform="translate(33.45 1.67) rotate(45)"/><path class="e" d="M52,4V52H4V4H52M56,0H0V56H56V0h0Z"/><polygon class="e" points="11.99 36.02 20 36.02 20 44.03 23.95 47.98 24 48.01 24 32.02 8.01 32.02 8.05 32.07 11.99 36.02"/><polygon class="e" points="36.01 44.03 36.01 36.02 44.01 36.02 47.96 32.07 48 32.02 32.01 32.02 32.01 48.01 32.06 47.98 36.01 44.03"/><polygon class="e" points="20 12.01 20 20.01 11.99 20.01 8.05 23.96 8.01 24.01 24 24.01 24 8.02 23.95 8.06 20 12.01"/></g></g></svg>
diff --git a/public/assets/images/icons/white/fullscreen-on.svg b/public/assets/images/icons/white/fullscreen-on.svg
deleted file mode 100644
index 6c1066524e5..00000000000
--- a/public/assets/images/icons/white/fullscreen-on.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 55.98 55.98"><defs><style>.e{fill:#fff;}</style></defs><g id="c"><g id="d"><g><polygon class="e" points="35.99 0 35.99 4 51.98 4 51.98 19.99 55.98 19.99 55.98 0 35.99 0"/><polygon class="e" points="4 35.99 0 35.99 0 55.98 19.99 55.98 19.99 51.98 4 51.98 4 35.99"/></g><g><polygon class="e" points="55.98 35.99 51.98 35.99 51.98 51.98 35.99 51.98 35.99 55.98 55.98 55.98 55.98 35.99"/><polygon class="e" points="19.99 4 19.99 0 0 0 0 19.99 4 19.99 4 4 19.99 4"/></g></g></g></svg>
diff --git a/public/assets/images/icons/white/fullscreen-on2.svg b/public/assets/images/icons/white/fullscreen-on2.svg
deleted file mode 100644
index bc25ed8454d..00000000000
--- a/public/assets/images/icons/white/fullscreen-on2.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 55.98 55.98"><defs><style>.e{fill:#fff;}</style></defs><g id="c"><g id="d"><g><polygon class="e" points="35.99 0 35.99 4 51.98 4 51.98 19.99 55.98 19.99 55.98 0 35.99 0"/><polygon class="e" points="4 35.99 0 35.99 0 55.98 19.99 55.98 19.99 51.98 4 51.98 4 35.99"/></g><g><polygon class="e" points="55.98 35.99 51.98 35.99 51.98 51.98 35.99 51.98 35.99 55.98 55.98 55.98 55.98 35.99"/><polygon class="e" points="19.99 4 19.99 0 0 0 0 19.99 4 19.99 4 4 19.99 4"/></g><rect class="e" x="9.44" y="-2.04" width="4" height="26.97" transform="translate(-4.74 11.44) rotate(-45)"/><rect class="e" x="42.48" y="31.04" width="4" height="26.87" transform="translate(-18.42 44.48) rotate(-45)"/><rect class="e" x="42.46" y="-2.03" width="4" height="26.92" transform="translate(21.1 -28.09) rotate(45)"/><rect class="e" x="9.43" y="31" width="4" height="26.92" transform="translate(34.79 4.94) rotate(45)"/></g></g></svg>
diff --git a/public/assets/images/icons/white/fullscreen-on3.svg b/public/assets/images/icons/white/fullscreen-on3.svg
deleted file mode 100644
index 0492439d477..00000000000
--- a/public/assets/images/icons/white/fullscreen-on3.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56 56"><defs><style>.e{fill:#fff;}</style></defs><g id="c"><g id="d"><g><polygon class="e" points="35.99 12.02 44 12.02 44 20.03 47.95 23.98 48 24.01 48 8.02 32.01 8.02 32.05 8.07 35.99 12.02"/><polygon class="e" points="20.01 44.01 12.01 44.01 12.01 36.01 8.06 32.06 8.01 32.02 8.01 48.01 24 48.01 23.96 47.96 20.01 44.01"/><polygon class="e" points="44 36.01 44 44.01 35.99 44.01 32.05 47.96 32.01 48.01 48 48.01 48 32.02 47.95 32.06 44 36.01"/><polygon class="e" points="12.01 20.03 12.01 12.02 20.01 12.02 23.96 8.07 24 8.02 8.01 8.02 8.01 24.01 8.06 23.98 12.01 20.03"/></g><rect class="e" x="16" y="8.1" width="4" height="19.8" transform="translate(-7.46 18) rotate(-45)"/><rect class="e" x="36.5" y="27.89" width="4" height="21.21" transform="translate(-15.95 38.5) rotate(-45)"/><rect class="e" x="35.96" y="8.06" width="4" height="19.8" transform="translate(23.82 -21.58) rotate(45)"/><rect class="e" x="15.71" y="27.96" width="4" height="20.51" transform="translate(32.21 -1.33) rotate(45)"/><path class="e" d="M52,4V52H4V4H52M56,0H0V56H56V0h0Z"/></g></g></svg>
diff --git a/public/assets/images/icons/white/fullscreen-on4.svg b/public/assets/images/icons/white/fullscreen-on4.svg
deleted file mode 100644
index 0e406efc1a9..00000000000
--- a/public/assets/images/icons/white/fullscreen-on4.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 55.98 55.98"><defs><style>.e{fill:#fff;}</style></defs><g id="c"><g id="d"><g><polygon class="e" points="35.99 0 35.99 4 51.98 4 51.98 19.99 55.98 19.99 55.98 0 35.99 0"/><polygon class="e" points="4 35.99 0 35.99 0 55.98 19.99 55.98 19.99 51.98 4 51.98 4 35.99"/></g><g><polygon class="e" points="55.98 35.99 51.98 35.99 51.98 51.98 35.99 51.98 35.99 55.98 55.98 55.98 55.98 35.99"/><polygon class="e" points="19.99 4 19.99 0 0 0 0 19.99 4 19.99 4 4 19.99 4"/></g><rect class="e" x="7.98" y="11.98" width="40" height="8"/><path class="e" d="M43.98,15.98v24H11.98V15.98H43.98m4-4H7.98V43.98H47.98V11.98h0Z"/></g></g></svg>
diff --git a/public/assets/images/icons/white/screen-compact.svg b/public/assets/images/icons/white/screen-compact.svg
new file mode 100644
index 00000000000..6c9415b16cb
--- /dev/null
+++ b/public/assets/images/icons/white/screen-compact.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><defs><style>.f{fill:none;}.g{fill:#ffffff;}</style></defs><g id="c"><rect class="f" width="64" height="64"/></g><g id="d"><g id="e"><g><polygon class="g" points="40.01 4.02 40.01 8.02 56 8.02 56 24.01 60 24.01 60 4.02 40.01 4.02"/><polygon class="g" points="8.02 40.01 4.02 40.01 4.02 60 24.01 60 24.01 56 8.02 56 8.02 40.01"/></g><g><polygon class="g" points="60 40.01 56 40.01 56 56 40.01 56 40.01 60 60 60 60 40.01"/><polygon class="g" points="24.01 8.02 24.01 4.02 4.02 4.02 4.02 24.01 8.02 24.01 8.02 8.02 24.01 8.02"/></g></g></g></svg>
\ No newline at end of file
diff --git a/public/assets/images/icons/white/screen-full.svg b/public/assets/images/icons/white/screen-full.svg
new file mode 100644
index 00000000000..e721e14316d
--- /dev/null
+++ b/public/assets/images/icons/white/screen-full.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><defs><style>.f{fill:none;}.g{fill:#ffffff;}</style></defs><g id="c"><rect class="f" width="64" height="64"/></g><g id="d"><g id="e"><polygon class="g" points="60 40.01 56 40.01 56 56 40.01 56 40.01 60 60 60 60 40.01"/><polygon class="g" points="24.01 8.02 24.01 4.02 4.02 4.02 4.02 24.01 8.02 24.01 8.02 8.02 24.01 8.02"/><polygon class="g" points="8.02 56 8.02 40.01 4.02 40.01 4.02 60 24.01 60 24.01 56 8.02 56"/><polygon class="g" points="56 8.02 56 24.01 60 24.01 60 4.02 40.01 4.02 40.01 8.02 56 8.02"/><polygon class="g" points="34.01 14 34.05 14.05 38 18 43.19 18 34.12 27.08 36.95 29.9 46.01 20.84 46.01 26.01 49.96 29.96 50 30 50 14 34.01 14"/><polygon class="g" points="26.01 46.01 20.84 46.01 29.87 36.98 27.05 34.15 18 43.19 18 38 14.05 34.05 14 34.01 14 50 30 50 29.96 49.96 26.01 46.01"/></g></g></svg>
\ No newline at end of file
diff --git a/public/assets/images/icons/white/screen-standard.svg b/public/assets/images/icons/white/screen-standard.svg
new file mode 100644
index 00000000000..24ff02b3353
--- /dev/null
+++ b/public/assets/images/icons/white/screen-standard.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><defs><style>.f{fill:none;}.g{fill:#ffffff;}</style></defs><g id="c"><rect class="f" width="64" height="64"/></g><g id="d"><g id="e"><polygon class="g" points="60 24 40 24 40 4 44 4 44 20 60 20 60 24"/><polygon class="g" points="24 60 20 60 20 44 4 44 4 40 24 40 24 60"/><polygon class="g" points="40 60 40 40 60 40 60 44 44 44 44 60 40 60"/><polygon class="g" points="4 24 4 20 20 20 20 4 24 4 24 24 4 24"/></g></g></svg>
\ No newline at end of file
diff --git a/public/assets/images/icons/yellow/focusmode-off.svg b/public/assets/images/icons/yellow/focusmode-off.svg
deleted file mode 100644
index a98b0e00c12..00000000000
--- a/public/assets/images/icons/yellow/focusmode-off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="16" height="16" id="icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 54" fill="#ffad00"><g id="fullscreen-off"><polygon points="51 20.13 33.87 20.13 33.87 2.99 37.29 2.99 37.29 16.7 51 16.7 51 20.13"/><polygon points="33.86 50.87 33.86 33.73 51 33.73 51 37.16 37.29 37.16 37.29 50.87 33.86 50.87"/><polygon points="20.16 50.97 16.73 50.97 16.73 37.26 3.02 37.26 3.02 33.84 20.16 33.84 20.16 50.97"/><polygon points="3.02 20.02 3.02 16.6 16.73 16.6 16.73 2.89 20.16 2.89 20.16 20.02 3.02 20.02"/></g></svg>
diff --git a/public/assets/images/icons/yellow/fullscreen-off.svg b/public/assets/images/icons/yellow/fullscreen-off.svg
deleted file mode 100644
index a98b0e00c12..00000000000
--- a/public/assets/images/icons/yellow/fullscreen-off.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="16" height="16" id="icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 54" fill="#ffad00"><g id="fullscreen-off"><polygon points="51 20.13 33.87 20.13 33.87 2.99 37.29 2.99 37.29 16.7 51 16.7 51 20.13"/><polygon points="33.86 50.87 33.86 33.73 51 33.73 51 37.16 37.29 37.16 37.29 50.87 33.86 50.87"/><polygon points="20.16 50.97 16.73 50.97 16.73 37.26 3.02 37.26 3.02 33.84 20.16 33.84 20.16 50.97"/><polygon points="3.02 20.02 3.02 16.6 16.73 16.6 16.73 2.89 20.16 2.89 20.16 20.02 3.02 20.02"/></g></svg>
diff --git a/public/assets/images/icons/yellow/fullscreen-on.svg b/public/assets/images/icons/yellow/fullscreen-on.svg
deleted file mode 100644
index 3a3d01b8ca7..00000000000
--- a/public/assets/images/icons/yellow/fullscreen-on.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="16" height="16" id="icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 54" fill="#ffad00"><g id="zoom-in-3"><polygon points="51 20.12 47.57 20.12 47.57 6.42 33.86 6.42 33.86 2.99 51 2.99 51 20.12"/><polygon points="20.15 50.97 3.02 50.97 3.02 33.83 6.44 33.83 6.44 47.54 20.15 47.54 20.15 50.97"/><polygon points="33.86 50.97 33.86 47.54 47.57 47.54 47.57 33.83 51 33.83 51 50.97 33.86 50.97"/><polygon points="3.02 20.12 3.02 2.99 20.15 2.99 20.15 6.42 6.44 6.42 6.44 20.12 3.02 20.12"/></g></svg>
diff --git a/resources/assets/javascripts/bootstrap/application.js b/resources/assets/javascripts/bootstrap/application.js
index a7101fa9a90..d9175d3752f 100644
--- a/resources/assets/javascripts/bootstrap/application.js
+++ b/resources/assets/javascripts/bootstrap/application.js
@@ -365,11 +365,3 @@ jQuery(document).on('click', 'a[data-behaviour~="ajax-toggle"]', function (event
         $('#open_variable').attr('value', $(this).parent('fieldset').data('open'));
     });
 }(jQuery));
-
-// Trigger consuming mode on contentbar
-STUDIP.domReady(function () {
-    $(document).on("click", ".consuming_mode_trigger", function () {
-        $("body").toggleClass("consuming_mode");
-        return false;
-    });
-});
diff --git a/resources/assets/javascripts/bootstrap/fullscreen.js b/resources/assets/javascripts/bootstrap/fullscreen.js
index 2a72173be02..990eae7e8a0 100644
--- a/resources/assets/javascripts/bootstrap/fullscreen.js
+++ b/resources/assets/javascripts/bootstrap/fullscreen.js
@@ -1,7 +1,26 @@
-STUDIP.domReady(function () {
-    $('.fullscreen-toggle').click(() => STUDIP.Fullscreen.toggle());
-
-    if (sessionStorage.getItem('studip-fullscreen') == 'on' && $('.fullscreen-toggle').length > 0) {
-        STUDIP.Fullscreen.enter(true);
-    }
-}, true);
+STUDIP.ready(() => {
+    $('#fullscreen-on').on('click', event => {
+        event.preventDefault();
+        STUDIP.Vue.emit('toggle-compact-navigation', true);
+    });
+    $('#fullscreen-off').on('click', event => {
+        event.preventDefault();
+        STUDIP.Vue.emit('toggle-compact-navigation', false);
+    });
+    $('#focusmode-on, .fullscreen-trigger').on('click', event => {
+        event.preventDefault();
+        STUDIP.Fullscreen.activate();
+    });
+    // Listen for fullscreen exit, ending focus mode with it.
+    document.addEventListener('fullscreenchange', event => {
+        if (!document.fullscreenElement) {
+            STUDIP.Fullscreen.deactivate();
+        }
+    });
+    // Fullscreen exit on Safari
+    document.addEventListener('webkitfullscreenchange', event => {
+        if (!document.webkitFullscreenElement) {
+            STUDIP.Fullscreen.deactivate();
+        }
+    });
+});
diff --git a/resources/assets/javascripts/bootstrap/responsive.js b/resources/assets/javascripts/bootstrap/responsive.js
index 0dd71493140..af06f281caa 100644
--- a/resources/assets/javascripts/bootstrap/responsive.js
+++ b/resources/assets/javascripts/bootstrap/responsive.js
@@ -2,8 +2,12 @@
 STUDIP.domReady(() => {
     STUDIP.Responsive.engage();
 
-    if (STUDIP.Responsive.isFullscreen()) {
-        document.querySelector('html').classList.add('fullscreen-mode');
+    if (STUDIP.Responsive.isCompactNavigation()) {
+        document.documentElement.classList.add('fullscreen-mode');
+        const sidebar = document.getElementById('sidebar');
+        if (sidebar) {
+            sidebar.style.display = 'none';
+        }
     }
 
 }, true);
diff --git a/resources/assets/javascripts/bootstrap/sidebar.js b/resources/assets/javascripts/bootstrap/sidebar.js
index 01e9d963e94..92b37d6dec3 100644
--- a/resources/assets/javascripts/bootstrap/sidebar.js
+++ b/resources/assets/javascripts/bootstrap/sidebar.js
@@ -1,58 +1,4 @@
-function heightChangeHandler() {
-    var curr_height = $(document).height();
-    if (doc_height !== curr_height) {
-        doc_height = curr_height;
-        $(document.body).trigger('sticky_kit:recalc');
-    }
-}
-
-// Handle dynamic content
-if (window.MutationObserver !== undefined) {
-    // Attach mutation observer to #content and trigger it on
-    // changes to class and style attributes (which affect the height
-    // of the content). Trigger a recalculation of the sticky kit when
-    // a mutation occurs so the sidebar will
-    $(document).ready(function() {
-        if ($('#content').length === 0) {
-            return;
-        }
-        var target = $('#content').get(0),
-            stickyObserver = new window.MutationObserver(function() {
-                window.requestAnimationFrame(function() {
-                    $(document.body).trigger('sticky_kit:recalc');
-                });
-            });
-        stickyObserver.observe(target, {
-            attributes: true,
-            attributeFilter: ['style', 'class'],
-            characterData: true,
-            childList: true,
-            subtree: true
-        });
-    });
-} else {
-    // Stores document height (we will need this to check for changes)
-    var doc_height;
-
-    STUDIP.domReady(() => {
-        doc_height = $(document).height();
-    });
-
-    // Recalculcate positions on ajax and img load events.
-    // Inside the handlers the current document height is compared
-    // to the previous height before the event occured so recalculation
-    // only happens on actual changes
-    $(document).on('ajaxComplete', heightChangeHandler);
-    $(document).on('load', '#content img', heightChangeHandler);
-
-    // Specialized handler to trigger recalculation when wysiwyg
-    // instances are created.
-    $(document).on('load.wysiwyg', 'textarea', function() {
-        $(document.body).trigger('sticky_kit:recalc');
-    });
-}
-
-// Engage
+// Set correct sidebar height for stickyness
 STUDIP.domReady(() => {
-    STUDIP.Sidebar.checkActiveLineHeight();
+    STUDIP.Sidebar.adjustHeight();
 });
diff --git a/resources/assets/javascripts/lib/fullscreen.js b/resources/assets/javascripts/lib/fullscreen.js
index 5d91eb9aabc..16001da8862 100644
--- a/resources/assets/javascripts/lib/fullscreen.js
+++ b/resources/assets/javascripts/lib/fullscreen.js
@@ -1,51 +1,27 @@
 const Fullscreen = {
-    toggle () {
-        if (sessionStorage.getItem('studip-fullscreen') === 'on') {
-            STUDIP.Fullscreen.leave();
-        } else {
-            STUDIP.Fullscreen.enter();
+    activate() {
+        STUDIP.ActionMenu.closeAll();
+        if (document.documentElement.classList.contains('fullscreen-mode')) {
+            const cache = STUDIP.Cache.getInstance('responsive.');
+            cache.set('was-compact-navigation', true);
+        }
+        STUDIP.Vue.emit('switch-focus-mode', true);
+        document.documentElement.classList.remove('fullscreen-mode');
+        document.body.classList.add('consuming_mode');
+        if (document.body.requestFullscreen) {
+            document.body.requestFullscreen({ hide: true });
+        } else if (document.body.webkitRequestFullscreen) { /* Safari */
+            document.body.webkitRequestFullscreen({ hide: true });
         }
     },
-
-    enter (immediate = false) {
-        // Set appropriate class on html element to trigger fullscreen mode and
-        // transisitions
-        $('html').addClass('is-fullscreen').toggleClass('is-fullscreen-immediately', immediate);
-
-        // Attach key handler that allows keypress on escape to leave fullscreen
-        $(document).on('keydown.key27', (event) => {
-            if (event.key === 'Escape') {
-                STUDIP.Fullscreen.leave();
-            }
-        });
-
-        // Store indicator in session
-        sessionStorage.setItem('studip-fullscreen', 'on');
-    },
-
-    leave () {
-        // Remove indicator from session
-        sessionStorage.removeItem('studip-fullscreen');
-
-        // Deactivate key handler
-        $(document).off('keydown.key27');
-
-        (new Promise((resolve, reject) => {
-            var timeout = setTimeout(() => {
-                $('#sidebar').off('transitionend');
-                resolve();
-            }, 500);
-            $('#sidebar').one('transitionend', () => {
-                clearTimeout(timeout);
-                resolve();
-            });
-        })).then(() => {
-            $(document.body).trigger('sticky_kit:recalc');
-        });
-
-
-        // Remove classes on html element
-        $('html').removeClass('is-fullscreen is-fullscreen-immediately');
+    deactivate() {
+        STUDIP.Vue.emit('switch-focus-mode', false);
+        document.body.classList.remove('consuming_mode');
+        const cache = STUDIP.Cache.getInstance('responsive.');
+        if (cache.get('was-compact-navigation')) {
+            STUDIP.Vue.emit('toggle-compact-navigation', true);
+        }
+        cache.remove('was-compact-navigation');
     }
 };
 
diff --git a/resources/assets/javascripts/lib/responsive.js b/resources/assets/javascripts/lib/responsive.js
index a493e8ddb7b..ee851fc137b 100644
--- a/resources/assets/javascripts/lib/responsive.js
+++ b/resources/assets/javascripts/lib/responsive.js
@@ -26,10 +26,15 @@ const Responsive = {
         return Responsive.media_query.matches;
     },
 
-    isFullscreen() {
+    isCompactNavigation() {
         const cache = STUDIP.Cache.getInstance('responsive.');
-
-        return cache.get('fullscreen-mode') ?? false;
+        let result = false;
+        if (STUDIP.USER_ID) {
+            result = cache.get('fullscreen-mode') ?? false;
+        } else {
+            cache.remove('fullscreen-mode');
+        }
+        return result;
     }
 };
 
diff --git a/resources/assets/javascripts/lib/sidebar.js b/resources/assets/javascripts/lib/sidebar.js
index 8f01d793602..d3d67d5e805 100644
--- a/resources/assets/javascripts/lib/sidebar.js
+++ b/resources/assets/javascripts/lib/sidebar.js
@@ -18,17 +18,19 @@ const Sidebar = {
     }
 };
 
-Sidebar.checkActiveLineHeight = () => {
-    $('#sidebar .sidebar-widget-content .widget-links li.active a.active').each(function() {
-        var link = $(this);
-        var actual_text = link.text();
-        link.text('tmp');
-        var default_height = link.outerHeight();
-        link.text(actual_text);
-        var actual_height = link.outerHeight();
-        if (actual_height > default_height) { //it is rendered in more lines
-            link.css('line-height', '20px');
-        }
-    });
+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/contentbar.scss b/resources/assets/stylesheets/scss/contentbar.scss
index a4e24afdc13..b85fdf9c169 100644
--- a/resources/assets/stylesheets/scss/contentbar.scss
+++ b/resources/assets/stylesheets/scss/contentbar.scss
@@ -119,26 +119,3 @@
     }
 
 }
-
-body:not(.consuming_mode) {
-    .consuming_mode_trigger {
-        @include icon(before, fullscreen-on, clickable, 24px, 0);
-        margin-top: -2px;
-        margin-left: 0
-    }
-}
-
-body.consuming_mode {
-    .contentbar {
-        margin-left: 10px;
-        margin-right: 0;
-        padding-left: 20px;
-        padding-right: 20px;
-    }
-
-    .consuming_mode_trigger {
-        @include icon(before, focusmode-off, clickable, 24px, 0);
-        margin-top: -2px;
-        margin-left: 0
-    }
-}
diff --git a/resources/assets/stylesheets/scss/courseware.scss b/resources/assets/stylesheets/scss/courseware.scss
index 1eb349aa12f..ccc11bfc176 100644
--- a/resources/assets/stylesheets/scss/courseware.scss
+++ b/resources/assets/stylesheets/scss/courseware.scss
@@ -400,14 +400,6 @@ $consum_ribbon_width: calc(100% - 58px);
             @include background-icon(table-of-contents, clickable, 24);
         }
 
-        &.cw-ribbon-button-zoom {
-            @include background-icon(fullscreen-on, clickable, 24);
-        }
-
-        &.cw-ribbon-button-zoom-out {
-            @include background-icon(focusmode-off, clickable, 24);
-        }
-
         &.cw-ribbon-button-prev {
             @include background-icon(arr_1left, clickable, 24);
             margin: 0 0.5em 0 0;
@@ -654,7 +646,7 @@ ribbon end
     }
 
     .cw-container-wrapper {
-        max-width: 1095px;
+        max-width: $max-content-width;
         margin: 0;
         padding: 0;
         display: flex;
@@ -816,7 +808,7 @@ ribbon end
     margin-bottom: 1em;
 
     &.cw-container-colspan-full {
-        max-width: 1095px;
+        max-width: $max-content-width;
         width: 100%;
     }
     &.cw-container-colspan-half {
@@ -824,7 +816,7 @@ ribbon end
         width: 100%;
     }
     &.cw-container-colspan-half-center {
-        width: 1095px;
+        width: $max-content-width;
         .cw-container-content {
             max-width: 540px;
             margin: auto;
@@ -974,7 +966,7 @@ form.cw-container-dialog-edit-form {
 .cw-container-wrapper-discuss {
     .cw-container-colspan-full {
         .cw-content-wrapper {
-            max-width: 1095px;
+            max-width: $max-content-width;
         }
     }
     .cw-container-colspan-half,
@@ -1064,7 +1056,7 @@ form.cw-container-dialog-edit-form {
 
 @media only screen and (max-width: 1820px) {
     .cw-structural-element .cw-container-wrapper.cw-container-wrapper-discuss {
-        max-width: 1095px;
+        max-width: $max-content-width;
         .cw-container.cw-container-list.cw-container-item.cw-container-colspan-full {
             .cw-default-block {
                 flex-flow: column;
@@ -1079,7 +1071,7 @@ form.cw-container-dialog-edit-form {
 
 @media only screen and (max-width: 1200px) {
     .cw-structural-element .cw-container-wrapper.cw-container-wrapper-discuss {
-        max-width: 1095px;
+        max-width: $max-content-width;
         .cw-container.cw-container-list.cw-container-item.cw-container-colspan-half,
         .cw-container.cw-container-list.cw-container-item.cw-container-colspan-half-center {
             .cw-default-block {
@@ -2034,7 +2026,7 @@ c o m p a n i o n  o v e r l a y
 
 .cw-companion-box-wrapper {
         width: 100%;
-        max-width: 1095px;
+        max-width: $max-content-width;
 }
 
 /* * * * * * * * * * * * * * * * * *
@@ -2048,9 +2040,6 @@ v i e w  w i d g e t
     .cw-action-widget-show-toc {
         @include background-icon(table-of-contents, clickable);
     }
-    .cw-action-widget-show-consume-mode {
-        @include background-icon(fullscreen-on, clickable);
-    }
     .cw-action-widget-edit{
         @include background-icon(edit, clickable);
     }
@@ -2249,7 +2238,7 @@ d a s h b o a r d
         margin-right: 1em;
 
         &.cw-dashboard-box-full {
-            max-width: 1095px;
+            max-width: $max-content-width;
             width: calc(100% - 16px);
         }
         &.cw-dashboard-box-half {
@@ -2301,7 +2290,7 @@ d a s h b o a r d
 }
 
 .cw-activities-wrapper {
-    max-width: 1095px;
+    max-width: $max-content-width;
 
     .cw-companion-box {
         margin: 10px;
@@ -4381,7 +4370,7 @@ headline block
         min-height: 600px;
         overflow: hidden;
         background-position: center;
-        background-size: 1095px;
+        background-size: $max-content-width;
         background-repeat: no-repeat;
 
         &.half {
@@ -5394,5 +5383,5 @@ w i z a r d  e l e m e n t s
     }
 }
 /* * * * * * * * * * * * * * * * * *
-w i z a r d  e l e m e n t s  e n d 
+w i z a r d  e l e m e n t s  e n d
 * * * * * * * * * * * * * * * * * */
diff --git a/resources/assets/stylesheets/scss/header.scss b/resources/assets/stylesheets/scss/header.scss
index 1f146cf456f..48cb571c63c 100644
--- a/resources/assets/stylesheets/scss/header.scss
+++ b/resources/assets/stylesheets/scss/header.scss
@@ -21,7 +21,7 @@
     transform: translate(0, 0) !important; // We need !important due to the horizontal scroll handler
     position: fixed;
     top: 0;
-    z-index: 1000;
+    z-index: 1001;
 
 }
 
diff --git a/resources/assets/stylesheets/scss/index.scss b/resources/assets/stylesheets/scss/index.scss
index 47d21cb09b5..c5e00599e49 100644
--- a/resources/assets/stylesheets/scss/index.scss
+++ b/resources/assets/stylesheets/scss/index.scss
@@ -1,3 +1,7 @@
+body {
+    min-height: 100%;
+}
+
 #main-header {
     grid-column: 1 / 3;
     grid-row: 1 / 1;
@@ -117,6 +121,11 @@
 
 #index,
 #login {
+
+    #current-page-structure {
+        display: none;
+    }
+
     .messagebox {
         margin: 50px 0 -25px 50px;
         width: 418px;
diff --git a/resources/assets/stylesheets/scss/layouts.scss b/resources/assets/stylesheets/scss/layouts.scss
index 27be3c41fd6..46689d537c0 100644
--- a/resources/assets/stylesheets/scss/layouts.scss
+++ b/resources/assets/stylesheets/scss/layouts.scss
@@ -2,12 +2,13 @@
 
 $page-margin: 15px;
 
-$content-width: 400px;
-$content-margin: 12px;
-
 $sidebar-padding: 12px;
 $sidebar-width: 270px;
 
+$content-width: 400px;
+$content-margin: 12px;
+$max-content-width: 4 * $sidebar-width + $page-margin;
+
 $footer-height: 32px;
 
 $site-width: ($page-margin * 2 + $sidebar-width + $sidebar-padding * 2 + $sidebar-border-width * 2 + $content-width + $content-margin * 2);
@@ -15,6 +16,11 @@ $page-width: ($sidebar-width + $sidebar-padding * 2 + $sidebar-border-width * 2
 
 $grid-gap: 0;
 
+html {
+    height: 100vh;
+    overflow-y: auto;
+}
+
 body {
     background-color: $white;
     display: grid;
@@ -22,6 +28,10 @@ body {
     grid-row-gap: $grid-gap;
     grid-template-columns: ($sidebar-width + $sidebar-padding) 1fr;
     grid-template-rows: auto 1fr $footer-height;
+
+    &::backdrop {
+        background: $white;
+    }
 }
 
 #main-header {
@@ -214,6 +224,7 @@ body {
     grid-row: 3 / 4;
     justify-content: space-between;
     line-height: $footer-height - 4px;
+    z-index: 1000;
 }
 
 #main-footer-info {
diff --git a/resources/assets/stylesheets/scss/responsive.scss b/resources/assets/stylesheets/scss/responsive.scss
index 7610f960c5e..a1e09d412b6 100644
--- a/resources/assets/stylesheets/scss/responsive.scss
+++ b/resources/assets/stylesheets/scss/responsive.scss
@@ -11,14 +11,13 @@ $sidebarIn: -15px;
 $sidebarOut: -330px;
 
 #responsive-toggle-desktop,
-#responsive-toggle-fullscreen {
+#responsive-toggle-fullscreen,
+#responsive-toggle-focusmode {
     display: none;
 }
 
-#responsive-toggle-fullscreen {
-    position: relative;
-    top: 4px;
-
+#responsive-toggle-fullscreen,
+#responsive-toggle-focusmode {
     img {
         cursor: pointer;
     }
@@ -35,6 +34,7 @@ $sidebarOut: -330px;
     }
 }
 
+
 #responsive-menu {
     font-size: $font-size-base;
     margin-top: 4px;
@@ -261,6 +261,10 @@ $sidebarOut: -330px;
     }
 }
 
+.cw-ribbon-button-zoom {
+    display: none;
+}
+
 .responsive-display,
 .fullscreen-mode body:not(.consuming_mode) {
 
@@ -272,7 +276,12 @@ $sidebarOut: -330px;
         flex: 0;
     }
 
-    #site-title,
+    #site-title {
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+    }
+
     #quicksearch_item,
     #avatar-menu-container,
     #current-page-structure {
@@ -281,7 +290,7 @@ $sidebarOut: -330px;
 
     #header-links {
         > ul {
-            > li:not(#responsive-toggle-fullscreen):not(.helpbar-container) {
+            > li:not(#responsive-toggle-fullscreen):not(#responsive-toggle-focusmode):not(.helpbar-container) {
                 display: none;
             }
 
@@ -365,6 +374,7 @@ $sidebarOut: -330px;
     }
 
     #responsive-contentbar {
+        justify-content: stretch;
         margin-bottom: 15px;
         padding-bottom: 0.5em;
         padding-left: 5px;
@@ -395,7 +405,7 @@ $sidebarOut: -330px;
 
         .contentbar-wrapper-left {
             flex: 1;
-            max-width: unset;
+            min-width: 0;
 
             & > .contentbar-icon {
                 margin-right: 15px;
@@ -403,12 +413,20 @@ $sidebarOut: -330px;
 
             .contentbar-breadcrumb {
                 font-size: $font-size-large;
-                width: calc(100% - 75px);
 
                 > img {
                     margin-left: 15px;
                     width: 24px;
                 }
+
+                > span {
+                    display: inline;
+                    flex-shrink: 10000;
+                    min-width: 0;
+                    overflow: hidden;
+                    text-overflow: ellipsis;
+                    white-space: nowrap;
+                }
             }
         }
 
@@ -508,27 +526,49 @@ $sidebarOut: -330px;
             max-height: unset;
             opacity: 1;
             overflow: unset;
-        }
-
-        #responsive-menu {
-            max-width: calc(100% - 100px);
-            min-width: calc(100% - 100px);
-            width: calc(100% - 100px);
+            width: calc(100% - 20px);
         }
 
         #main-header {
             flex-basis: 100%;
         }
 
+        #header-links {
+            margin-left: auto;
+
+            ul {
+                li {
+                    &:not(#responsive-toggle-fullscreen):not(#responsive-toggle-focusmode) {
+                        padding: 0;
+                    }
+
+                    .helpbar-container {
+                        right: 0;
+                    }
+                }
+            }
+        }
+
+        #responsive-toggle-fullscreen,
+        #responsive-toggle-focusmode {
+            margin-top: 4px;
+            padding: 4px 0 0;
+        }
+
         #responsive-toggle-fullscreen {
             display: block;
-            right: 30px;
         }
 
         .contentbar:not(#responsive-contentbar) {
             display: none;
         }
 
+        #responsive-contentbar-container {
+            position: fixed;
+            width: 100vw;
+            z-index: 1000;
+        }
+
         #responsive-contentbar {
             padding-left: 15px;
 
@@ -544,14 +584,17 @@ $sidebarOut: -330px;
 
         #content-wrapper {
             flex: 1;
-            height: 100%;
+            margin-top: 75px;
+            min-height: calc(100vh - 150px);
         }
     }
 }
 
 .consuming_mode {
     display: unset;
+    overflow-y: auto;
 
+    #skip_link_navigation,
     #main-header,
     #sidebar,
     #main-footer,
@@ -559,13 +602,29 @@ $sidebarOut: -330px;
         display: none;
     }
 
-    #content {
-        height: 100vh;
-        position: fixed;
-        width: 100vw;
+    #content-wrapper {
+        display: block;
+        margin-left: auto;
+        margin-right: auto;
+        max-width: $max-content-width;
+        min-height: 100vh;
+        padding-top: 10px;
+    }
 
+    #content {
         .contentbar {
-            margin-right: 30px;
+            margin: 10px;
+            padding-left: 20px;
+            padding-right: 20px;
+            width: calc(100% - 60px);
+
+            .action-menu {
+                display: none;
+            }
+        }
+
+        .cw-companion-box-wrapper {
+            padding-top: 120px;
         }
     }
 
diff --git a/resources/assets/stylesheets/scss/sidebar.scss b/resources/assets/stylesheets/scss/sidebar.scss
index e44196c68d1..a0118e8af5b 100644
--- a/resources/assets/stylesheets/scss/sidebar.scss
+++ b/resources/assets/stylesheets/scss/sidebar.scss
@@ -4,11 +4,13 @@
     display: inline-block;
     margin-top: 15px;
     padding: 0 5px 7px 15px;
+    position: sticky;
     text-align: left;
+    top: 50px;
     z-index: 2;
 
     .sidebar-image {
-        width: $sidebar-width;
+        width: calc($sidebar-width - 2px);
         height: 60px;
         max-height: 60px;
 
@@ -66,7 +68,7 @@
         background: $white;
         border: 1px solid $content-color-40;
         margin: 15px 0 0;
-        width: $sidebar-width - 2px;
+        width: $sidebar-width - 5px;
     }
     .sidebar-widget-header {
         @include clearfix();
diff --git a/resources/assets/stylesheets/studip.less b/resources/assets/stylesheets/studip.less
index 97eb904b044..1cb3da3db77 100644
--- a/resources/assets/stylesheets/studip.less
+++ b/resources/assets/stylesheets/studip.less
@@ -19,9 +19,6 @@
 
 /* --- Standardvorgaben ----------------------------------------------------- */
 //TODO: the Body-Background color should be similar to A:link.toolbar and A:visited.toolbar for best effect!!
-html, body {
-    height: 100%;
-}
 body {
     background-color: #d8dadc;
     background-repeat: repeat-x;
diff --git a/resources/assets/stylesheets/studip.scss b/resources/assets/stylesheets/studip.scss
index 3e476e6eed8..fb38beb1d87 100644
--- a/resources/assets/stylesheets/studip.scss
+++ b/resources/assets/stylesheets/studip.scss
@@ -7,6 +7,7 @@
 @import "scss/variables";
 @import "scss/breakpoints";
 @import "scss/visibility";
+@import "scss/layouts";
 
 @import "scss/actionmenu";
 @import "scss/activityfeed";
@@ -46,7 +47,6 @@
 @import "scss/forum";
 @import "scss/gradebook";
 @import "scss/grid";
-@import "scss/layouts";
 @import "scss/header";
 @import "scss/headings";
 @import "scss/helpbar";
diff --git a/resources/vue/components/courseware/CoursewareRibbon.vue b/resources/vue/components/courseware/CoursewareRibbon.vue
index 7450bf699d4..ddf5c9b2149 100644
--- a/resources/vue/components/courseware/CoursewareRibbon.vue
+++ b/resources/vue/components/courseware/CoursewareRibbon.vue
@@ -21,15 +21,6 @@
                     @click.prevent="activeToolbar"
                 >
                 </button>
-                <button
-                    v-if="showModeSwitchButton"
-                    ref="consumeModeSwitch"
-                    class="cw-ribbon-button"
-                    :class="[consumeMode ? 'cw-ribbon-button-zoom-out' : 'cw-ribbon-button-zoom']"
-                    :title="consumeMode ? textRibbon.fullscreen_off : textRibbon.fullscreen_on"
-                     @click="toggleConsumeMode"
-                >
-                </button>
                 <slot name="menu" />
             </div>
             <div v-if="consumeMode" class="cw-ribbon-consume-bottom"></div>
@@ -112,13 +103,15 @@ export default {
 
         }),
         toggleConsumeMode() {
-            STUDIP.Vue.emit('toggle-focus-mode', !this.consumeMode);
+            STUDIP.eventBus.emit('toggle-focus-mode', !this.consumeMode);
             if (!this.consumeMode) {
+                document.body.classList.add('consuming_mode');
                 this.coursewareConsumeMode(true);
                 this.coursewareSelectedToolbarItem('contents');
                 this.coursewareViewMode('read');
             } else {
                 this.coursewareConsumeMode(false);
+                document.body.classList.remove('consuming_mode');
             }
         },
         activeToolbar() {
@@ -138,8 +131,17 @@ export default {
     mounted() {
         window.addEventListener('scroll', this.handleScroll);
         if (this.isContentBar) {
-            STUDIP.Vue.emit('courseware-contentbar-mounted', this);
+            STUDIP.eventBus.emit('courseware-contentbar-mounted', this);
         }
+
+        this.globalOn('switch-focus-mode', (state) => {
+            if (state !== this.consumeMode) {
+                this.toggleConsumeMode();
+            }
+        });
+    },
+    beforeDestroy() {
+        STUDIP.eventBus.off('switch-focus-mode');
     },
     watch: {
         toolsActive(newState, oldState) {
@@ -157,7 +159,6 @@ export default {
             }
         },
         consumeMode(newState) {
-            this.$refs.consumeModeSwitch?.focus();
             if (newState) {
                 document.body.classList.add('consuming_mode');
             } else {
diff --git a/resources/vue/components/courseware/CoursewareStructuralElement.vue b/resources/vue/components/courseware/CoursewareStructuralElement.vue
index 53322266050..e396bcff914 100644
--- a/resources/vue/components/courseware/CoursewareStructuralElement.vue
+++ b/resources/vue/components/courseware/CoursewareStructuralElement.vue
@@ -63,10 +63,11 @@
                                 @showSuggest="menuAction('showSuggest')"
                                 @linkElement="menuAction('linkElement')"
                                 @removeLock="menuAction('removeLock')"
+                                @activateFullscreen="menuAction('activateFullscreen')"
                             />
                         </template>
                     </courseware-ribbon>
-                    
+
                     <div v-if="structuralElementLoaded && !isLink" class="cw-companion-box-wrapper">
                         <courseware-companion-box
                             v-if="!canVisit"
@@ -1033,6 +1034,7 @@ export default {
                 { id: 4, label: this.$gettext('Informationen anzeigen'), icon: 'info', emit: 'showInfo' },
                 { id: 5, label: this.$gettext('Lesezeichen setzen'), icon: 'star', emit: 'setBookmark' },
                 { id: 6, label: this.$gettext('Lerninhalt für OER Campus vorschlagen'), icon: 'oer-campus', emit: 'showSuggest' },
+                { id: 7, label: this.$gettext('Als Vollbild anzeigen'), icon: 'screen-full', emit: 'activateFullscreen'},
 
             ];
             if (this.canEdit) {
@@ -1319,6 +1321,9 @@ export default {
                 case 'linkElement':
                     this.showElementPublicLinkDialog(true);
                     break;
+                case 'activateFullscreen':
+                    STUDIP.Fullscreen.activate();
+                    break;
             }
         },
         async closeEditDialog() {
@@ -1541,7 +1546,7 @@ export default {
                 this.companionSuccess({
                     info:
                         this.$gettextInterpolate(
-                            this.$gettext('Die Seite %{ pageTitle } wurde erfolgreich angelegt.'), 
+                            this.$gettext('Die Seite %{ pageTitle } wurde erfolgreich angelegt.'),
                             { pageTitle: newElement.attributes.title }
                         )
                 });
@@ -1639,7 +1644,7 @@ export default {
                         this.keyboardSelected = containerId;
                         const container = this.containerById({id: containerId});
                         const index = this.containerList.findIndex(c => c.id === container.id);
-                        this.assistiveLive = 
+                        this.assistiveLive =
                             this.$gettextInterpolate(
                                 this.$gettext('%{containerTitle} Abschnitt ausgewählt. Aktuelle Position in der Liste: %{pos} von %{listLength}. Drücken Sie die Aufwärts- und Abwärtspfeiltasten, um die Position zu ändern, die Leertaste zum Ablegen, die Escape-Taste zum Abbrechen.')
                                 , {containerTitle: container.attributes.title, pos: index + 1, listLength: this.containerList.length}
@@ -1669,7 +1674,7 @@ export default {
                 const container = this.containerById({id: containerId});
                 const newPos = currentIndex - 1;
                 this.containerList.splice(newPos, 0, this.containerList.splice(currentIndex, 1)[0]);
-                this.assistiveLive = 
+                this.assistiveLive =
                     this.$gettextInterpolate(
                         this.$gettext('%{containerTitle} Abschnitt. Aktuelle Position in der Liste: %{pos} von %{listLength}.')
                         , {containerTitle: container.attributes.title, pos: newPos + 1, listLength: this.containerList.length}
@@ -1682,7 +1687,7 @@ export default {
                 const container = this.containerById({id: containerId});
                 const newPos = currentIndex + 1;
                 this.containerList.splice(newPos, 0, this.containerList.splice(currentIndex, 1)[0]);
-                this.assistiveLive = 
+                this.assistiveLive =
                     this.$gettextInterpolate(
                         this.$gettext('%{containerTitle} Abschnitt. Aktuelle Position in der Liste: %{pos} von %{listLength}.')
                         , {containerTitle: container.attributes.title, pos: newPos + 1, listLength: this.containerList.length}
@@ -1692,7 +1697,7 @@ export default {
         abortKeyboardSorting(containerId) {
             const container = this.containerById({id: containerId});
             this.keyboardSelected = null;
-            this.assistiveLive = 
+            this.assistiveLive =
                 this.$gettextInterpolate(
                     this.$gettext('%{containerTitle} Abschnitt, Neuordnung abgebrochen.')
                     , {containerTitle: container.attributes.title}
@@ -1703,7 +1708,7 @@ export default {
             const container = this.containerById({id: containerId});
             const currentIndex = this.containerList.findIndex(container => container.id === containerId);
             this.keyboardSelected = null;
-            this.assistiveLive = 
+            this.assistiveLive =
                 this.$gettextInterpolate(
                     this.$gettext('%{containerTitle} Abschnitt, abgelegt. Entgültige Position in der Liste: %{pos} von %{listLength}.')
                     , {containerTitle: container.attributes.title, pos: currentIndex + 1, listLength: this.containerList.length}
diff --git a/resources/vue/components/responsive/NavigationItem.vue b/resources/vue/components/responsive/NavigationItem.vue
index 0bfd6d2bd23..c227771648c 100644
--- a/resources/vue/components/responsive/NavigationItem.vue
+++ b/resources/vue/components/responsive/NavigationItem.vue
@@ -2,7 +2,8 @@
     <li v-if="item.visible" class="navigation-item" :class="{'navigation-item-active': active}">
         <template v-if="hasChildren()">
             <div class="navigation-title">
-                <a :href="item.url" :title="navigateToText(item.title)" tabindex="0">
+                <a :href="item.url" :title="navigateToText(item.title)"
+                   :aria-label="navigateToText(item.title)" tabindex="0">
                     <span class="navigation-icon">
                         <studip-icon v-if="isCourse" shape="seminar" role="info_alt" size="24" alt=""></studip-icon>
                         <img v-if="item.icon" :src="iconUrl" width="24" alt="">
@@ -12,14 +13,16 @@
                     </span>
                 </a>
             </div>
-            <button class="styleless navigation-in" tabindex="0"
+            <button class="styleless navigation-in"
                     :title="openNavigationText(item.title)"
+                    :aria-label="openNavigationText(item.title)"
                     @click="moveTo(item.path)" @keydown.prevent.enter="moveTo(item.path)" @keydown.prevent.space="moveTo(item.path)">
                 <studip-icon shape="arr_1right" role="info_alt" size="20" alt=""></studip-icon>
             </button>
         </template>
         <div v-else class="navigation-title">
-            <a :href="item.url" tabindex="0" :title="navigateToText(item.title)">
+            <a :href="item.url" tabindex="0" :title="navigateToText(item.title)"
+               :aria-label="navigateToText(item.title)">
                 <studip-icon v-if="isCourse" shape="seminar" role="info_alt" size="24" alt=""></studip-icon>
                 <img v-if="item.icon" :src="iconUrl" width="24" alt="">
                 {{ item.title }}
@@ -61,7 +64,7 @@ export default {
             return STUDIP.URLHelper.getURL(url);
         },
         moveTo(path) {
-            STUDIP.Vue.emit('responsive-navigation-move-to', path);
+            STUDIP.eventBus.emit('responsive-navigation-move-to', path);
         },
         hasChildren() {
             return this.item.children && Object.keys(this.item.children).length > 0;
@@ -74,7 +77,7 @@ export default {
         },
         openNavigationText(itemTitle) {
             return this.$gettextInterpolate(
-                this.$gettext('Öffne Navigation %{ title }'),
+                this.$gettext('Unternavigation zu %{ title } öffnen'),
                 { title: itemTitle }
             );
         }
diff --git a/resources/vue/components/responsive/ResponsiveContentBar.vue b/resources/vue/components/responsive/ResponsiveContentBar.vue
index efcb160dc0f..6899c3b91f5 100644
--- a/resources/vue/components/responsive/ResponsiveContentBar.vue
+++ b/resources/vue/components/responsive/ResponsiveContentBar.vue
@@ -14,7 +14,9 @@
                 </div>
                 <div class="contentbar-wrapper-left">
                     <studip-icon :shape="icon" size="24" role="info" class="text-bottom contentbar-icon"></studip-icon>
-                    <nav class="contentbar-breadcrumb" ref="breadcrumbs">{{ title }}</nav>
+                    <nav class="contentbar-breadcrumb" ref="breadcrumbs">
+                        <span>{{ title }}</span>
+                    </nav>
                 </div>
                 <div class="contentbar-wrapper-right" ref="wrapperRight"></div>
             </div>
@@ -66,27 +68,44 @@ export default {
             const sidebar = document.getElementById('sidebar');
             const content = document.getElementById('content-wrapper');
             const pageTitle = document.getElementById('page-title-container');
-            const html = document.querySelector('html');
             if (this.sidebarOpen) {
                 sidebar.classList.add('responsive-hide');
                 sidebar.classList.remove('responsive-show');
 
-                if (html.classList.contains('responsive-display') && !html.classList.contains('fullscreen-mode')) {
+                if (document.documentElement.classList.contains('responsive-display')
+                        && !document.documentElement.classList.contains('fullscreen-mode')) {
                     content.style.display = null;
                     pageTitle.style.display = null;
                 }
 
+                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.classList.add('responsive-show');
                 sidebar.classList.remove('responsive-hide');
-                if (html.classList.contains('responsive-display') && !html.classList.contains('fullscreen-mode')) {
+                if (document.documentElement.classList.contains('responsive-display')
+                        && !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';
                         pageTitle.style.display = 'none';
                     }, 300);
                 }
+
+                if (!document.documentElement.classList.contains('responsive-display')) {
+                    document.body.style.display = 'grid';
+                }
+
                 this.sidebarOpen = true;
             }
 
@@ -155,6 +174,8 @@ export default {
         this.$nextTick(() => {
             const realContentbar = document.querySelector('.contentbar:not(#responsive-contentbar)');
             if (realContentbar) {
+                STUDIP.eventBus.emit('has-contentbar', true);
+
                 this.realContentbar = realContentbar;
                 this.realContentbarSource = '#content';
                 this.realContentbarIconContainer = '.contentbar-nav';
@@ -165,6 +186,8 @@ export default {
 
                 const cwContentbar = document.querySelector('#contentbar header');
                 if (cwContentbar) {
+                    STUDIP.eventBus.emit('has-contentbar', true);
+
                     this.realContentbar = cwContentbar;
                     this.realContentbarSource = '.cw-structural-element-content > div';
                     this.realContentbarIconContainer = '.cw-ribbon-nav';
@@ -180,7 +203,9 @@ export default {
         })
 
         // Use courseware contentbar instead of this Vue component.
-        STUDIP.Vue.on('courseware-contentbar-mounted', element => {
+        this.globalOn('courseware-contentbar-mounted', element => {
+            STUDIP.eventBus.emit('has-contentbar', true);
+
             this.realContentbar = element.$el.querySelector('header');
             this.realContentbarSource = '.cw-structural-element-content > div';
             this.realContentbarIconContainer = '.cw-ribbon-nav';
@@ -192,18 +217,21 @@ export default {
             });
         })
 
-        STUDIP.Vue.on('toggle-focus-mode', (state) => {
+        this.globalOn('toggle-focus-mode', (state) => {
             const html = document.querySelector('html');
             if (html.classList.contains('responsive-display') || html.classList.contains('fullscreen-mode')) {
                 this.adjustExistingContentbar(!state);
             }
-        })
+        });
 
     },
     beforeDestroy() {
         if (this.realContentbar) {
             this.adjustExistingContentbar(false);
         }
+
+        STUDIP.eventBus.off('toggle-focus-mode');
+        STUDIP.eventBus.off('courseware-contentbar-mounted');
     }
 }
 </script>
diff --git a/resources/vue/components/responsive/ResponsiveNavigation.vue b/resources/vue/components/responsive/ResponsiveNavigation.vue
index 09420217d95..3f4d1633097 100644
--- a/resources/vue/components/responsive/ResponsiveNavigation.vue
+++ b/resources/vue/components/responsive/ResponsiveNavigation.vue
@@ -3,8 +3,9 @@
         <div class="responsive-navigation-header">
             <transition name="slide" appear>
                 <button id="responsive-navigation-button" class="styleless"
-                        :title="showMenu ? $gettext('Navigation schließen') : $gettext('Navigation öffnen')"
-                        aria-owns="responsive-navigation-items"
+                        :aria-label="showMenu
+                            ? $gettext('Navigation schließen')
+                            : $gettext('Navigation öffnen')"
                         @click.prevent="toggleMenu"
                         @keydown.prevent.space="toggleMenu"
                         @keydown.prevent.enter="toggleMenu">
@@ -14,8 +15,6 @@
                     </studip-icon>
                 </button>
             </transition>
-            <toggle-fullscreen v-if="!isResponsive && !isFocusMode && me.username != 'nobody'"
-                               :is-fullscreen="isFullscreen"></toggle-fullscreen>
         </div>
         <transition name="appear" appear>
             <nav v-show="showMenu" id="responsive-navigation-items" class="responsive" ref="navigation"
@@ -26,7 +25,8 @@
                             <div class="profile-pic">
                                 <img :src="me.avatar"
                                      @click.prevent="toggleAvatarMenu"
-                                     :title="$gettext('Profilnavigation öffnen')">
+                                     :title="$gettext('Profilnavigation öffnen')"
+                                     :aria-label="$gettext('Profilnavigation öffnen')">
                             </div>
                             <div class="profile-data">
                                 <div>{{ me.fullname }}</div>
@@ -34,11 +34,12 @@
                             </div>
                         </section>
                         <section class="open-avatarmenu">
-                            <button class="styleless" tabindex="0" ref="openAvatarmenu"
+                            <button class="styleless" ref="openAvatarmenu"
                                     @keydown.prevent.enter="toggleAvatarMenu"
                                     @keydown.prevent.space="toggleAvatarMenu"
                                     @click.prevent="toggleAvatarMenu"
-                                    :title="$gettext('Profilnavigation öffnen')">
+                                    :title="$gettext('Profilnavigation öffnen')"
+                                    :aria-label="$gettext('Profilnavigation öffnen')">
                                 <studip-icon shape="arr_1right" role="info_alt" :size="iconSize" alt=""></studip-icon>
                             </button>
                         </section>
@@ -48,10 +49,12 @@
                                     :click-outside-deactivates="true">
                             <div>
                                 <div class="close-avatarmenu">
-                                    <button class="styleless" ref="closeAvatarmenu"  tabindex="0"
+                                    <button class="styleless" ref="closeAvatarmenu"
                                             @keydown.prevent.enter="toggleAvatarMenu"
                                             @keydown.prevent.space="toggleAvatarMenu"
-                                            @click="toggleAvatarMenu">
+                                            @click="toggleAvatarMenu"
+                                            :title="$gettext('Profilnavigation schließen')"
+                                            :aria-label="$gettext('Profilnavigation schließen')">
                                         <studip-icon shape="arr_1left" role="info_alt" :size="iconSize"></studip-icon>
                                     </button>
                                 </div>
@@ -65,9 +68,10 @@
                 </header>
                 <ul class="main-navigation">
                     <li v-if="currentParent != null" class="navigation-item navigation-up">
-                        <div class="navigation-title" :title="$gettext('Zum Start')" @click="moveTo('/')">
+                        <div class="navigation-title" :title="$gettext('Zum Start')"
+                             :aria-label="$gettext('Zum Start')">
                             <button class="styleless" @click="moveTo('/')" @keydown.prevent.enter="moveTo('/')"
-                                    @keydown.prevent.space="moveTo('/')" tabindex="0">
+                                    @keydown.prevent.space="moveTo('/')">
                                 <div class="navigation-icon">
                                     <studip-icon shape="arr_2up" role="info_alt" :size="iconSize - 4"></studip-icon>
                                 </div>
@@ -79,11 +83,12 @@
                     </li>
                     <li v-if="currentParent != null" class="navigation-item navigation-current">
                         <div class="navigation-title">
-                            <button class="styleless" tabindex="0"
+                            <button class="styleless"
                                     @click="moveTo(currentParent.path)"
                                     @keydown.prevent.enter="moveTo(currentParent.path)"
                                     @keydown.prevent.space="moveTo(currentParent.path)"
-                                    :title="$gettext('Eine Ebene höher')">
+                                    :title="$gettext('Eine Ebene höher')"
+                                    :aria-label="$gettext('Eine Ebene höher')">
                                 <div class="navigation-icon">
                                     <studip-icon shape="arr_1left" role="info_alt" :size="iconSize - 4"></studip-icon>
                                 </div>
@@ -99,9 +104,9 @@
             </nav>
         </transition>
         <responsive-content-bar v-if="(isResponsive || isFullscreen) && !isFocusMode"
-                                :has-sidebar="hasSidebar" :title="initialTitle"
+                                :has-sidebar="hasSidebar" :title="contentbarTitle" :aria-label="contentbarTitle"
                                 ref="contentbar"></responsive-content-bar>
-        <responsive-skip-links v-if="isFullscreen && hasSkiplinks" :links="skipLinks"></responsive-skip-links>
+        <responsive-skip-links v-if="(isResponsive || isFullscreen) && hasSkiplinks" :links="skipLinks"></responsive-skip-links>
     </div>
 </template>
 
@@ -109,13 +114,12 @@
 import NavigationItem from './NavigationItem.vue';
 import StudipIcon from '../StudipIcon.vue';
 import ResponsiveContentBar from './ResponsiveContentBar.vue';
-import ToggleFullscreen from './ToggleFullscreen.vue';
 import ResponsiveSkipLinks from './ResponsiveSkipLinks.vue';
 import { FocusTrap } from 'focus-trap-vue';
 
 export default {
     name: 'ResponsiveNavigation',
-    components: { ResponsiveContentBar, StudipIcon, NavigationItem, ToggleFullscreen, ResponsiveSkipLinks, FocusTrap },
+    components: { ResponsiveContentBar, StudipIcon, NavigationItem, ResponsiveSkipLinks, FocusTrap },
     props: {
         me: {
             type: Object,
@@ -154,7 +158,9 @@ export default {
             avatarNavigation: studipNavigation.avatar,
             avatarMenuOpen: false,
             observer: null,
-            hasSkiplinks: document.querySelector('#skiplink_list') !== null
+            hasSkiplinks: document.querySelector('#skiplink_list') !== null,
+            hasContentbar: false,
+            contentbarTitle: ''
         }
     },
     computed: {
@@ -183,10 +189,6 @@ export default {
             ];
 
             if (this.isFullscreen) {
-                links.push(
-                    { url: '#toggle-fullscreen', label: this.$gettext('Vollbildmodus verlassen') },
-                );
-
                 if (this.hasSidebar) {
                     let name = '';
                     if (document.getElementById('sidebar').classList.contains('responsive-show')) {
@@ -272,6 +274,10 @@ export default {
 
             this.showMenu = !this.showMenu;
 
+            if (!this.showMenu && this.avatarMenuOpen) {
+                this.toggleAvatarMenu();
+            }
+
             this.$nextTick(() => {
                 if (this.showMenu && !this.headerMagic) {
                     this.currentNavigation = this.initialNavigation;
@@ -286,22 +292,41 @@ export default {
             })
         },
         /**
-         * Turn fullscreen mode on or off
+         * Turn compact navigation mode on or off
          * @param state
          */
-        setFullscreen(state) {
-            const html = document.querySelector('html');
+        setCompactNavigation(state) {
             const sidebar = document.getElementById('sidebar');
             const cache = STUDIP.Cache.getInstance('responsive.');
 
             if (state) {
-                html.classList.add('fullscreen-mode');
+                if (this.hasContentbar) {
+                    document.getElementById('responsive-toggle-focusmode').style.display = 'block';
+                }
+                document.documentElement.classList.add('fullscreen-mode');
                 cache.set('fullscreen-mode', true);
+
+                const siteTitle = document.getElementById('site-title');
+                siteTitle.dataset.originalTitle = siteTitle.textContent.trim();
+                siteTitle.textContent = this.initialTitle;
+
+                sidebar.style.display = 'none';
+
             } else {
-                html.classList.remove('fullscreen-mode');
-                sidebar.classList.remove('responsive-show', 'fullscreen-mode');
+                document.documentElement.classList.remove('fullscreen-mode');
+                sidebar?.classList.remove('responsive-show', 'fullscreen-mode');
                 this.showMenu = false;
                 cache.remove('fullscreen-mode');
+                document.getElementById('responsive-toggle-focusmode').style.display = 'none';
+                document.body.style.display = null;
+
+                const siteTitle = document.getElementById('site-title');
+                if (siteTitle.dataset.originalTitle) {
+                    siteTitle.textContent = siteTitle.dataset.originalTitle.trim();
+                }
+
+                sidebar.style.display = '';
+
             }
 
             this.isFullscreen = state;
@@ -321,10 +346,10 @@ export default {
             this.avatarMenuOpen = false;
             this.currentNavigation = this.findItem(path ? path : '/', this.studipNavigation);
             this.$nextTick(() => {
-                const current = document.querySelector('.navigation-current') ?? document.querySelector('.navigation-item');
-                if (current) {
-                    current.focus();
-                }
+                const current = document.querySelector('.navigation-current')
+                    ? document.querySelector('.navigation-current .navigation-title button')
+                    : document.querySelector('.navigation-item .navigation-title a');
+                current.focus();
             })
         },
         /**
@@ -364,6 +389,13 @@ export default {
          */
         toggleAvatarMenu() {
             this.avatarMenuOpen = !this.avatarMenuOpen;
+
+            // Focus first menu entry.
+            if (this.avatarMenuOpen) {
+                this.$nextTick(() => {
+                    document.querySelector('.avatar-navigation .navigation-item .navigation-title a').focus();
+                });
+            }
         },
         onChangeViewMode(tagName, classes) {
             const classList = classes.split(' ');
@@ -373,19 +405,19 @@ export default {
                 case 'BODY':
                     if (classList.includes('consuming_mode')) {
                         this.isFocusMode = true;
-                        STUDIP.Vue.emit('consuming-mode-enabled');
-                        this.setFullscreen(false);
+                        STUDIP.eventBus.emit('consuming-mode-enabled');
+                        this.setCompactNavigation(false);
                     } else {
                         this.isFocusMode = false;
-                        STUDIP.Vue.emit('consuming-mode-disabled');
+                        STUDIP.eventBus.emit('consuming-mode-disabled');
                     }
                     if (classList.includes('fixed')) {
                         this.headerMagic = true;
-                        STUDIP.Vue.emit('header-magic-enabled');
+                        STUDIP.eventBus.emit('header-magic-enabled');
                     } else {
                         this.headerMagic = false;
                         this.showMenu = false;
-                        STUDIP.Vue.emit('header-magic-disabled');
+                        STUDIP.eventBus.emit('header-magic-disabled');
                     }
                     break;
                 // Watch for "responsive-display" and "fullscreen-mode" class changes
@@ -394,16 +426,16 @@ export default {
                         this.isResponsive = true;
 
                         if (classList.includes('fullscreen-mode')) {
-                            this.setFullscreen(false);
+                            this.setCompactNavigation(false);
                         }
 
-                        STUDIP.Vue.emit('responsive-display-enabled');
+                        STUDIP.eventBus.emit('responsive-display-enabled');
                         this.$nextTick(() => {
                             this.moveHelpbar();
                         })
                     } else {
                         this.isResponsive = false;
-                        STUDIP.Vue.emit('responsive-display-disabled');
+                        STUDIP.eventBus.emit('responsive-display-disabled');
                         this.$nextTick(() => {
                             this.moveHelpbar();
                         })
@@ -412,10 +444,12 @@ export default {
                     if (classList.includes('fullscreen-mode')) {
                         this.isFullscreen = true;
 
-                        STUDIP.Vue.emit('fullscreen-enabled');
+                        STUDIP.eventBus.emit('fullscreen-enabled');
+                        document.getElementById('sidebar').style.display = 'none';
                     } else {
                         this.isFullscreen = false;
-                        STUDIP.Vue.emit('fullscreen-disabled');
+                        STUDIP.eventBus.emit('fullscreen-disabled');
+                        document.getElementById('sidebar').style.display = '';
                     }
                     break;
                 case 'HEADER':
@@ -437,7 +471,7 @@ export default {
             return navigation.navigation;
         },
         captureOutsideClick(target) {
-            if (target !== null) {
+            if (this.showMenu && target !== null) {
                 if (!this.$refs.container.contains(target)) {
                     this.toggleMenu();
                 }
@@ -458,26 +492,27 @@ export default {
     },
     mounted() {
         const cache = STUDIP.Cache.getInstance('responsive.');
-        const html = document.querySelector('html');
-        const body = document.querySelector('body');
         const fullscreen = cache.get('fullscreen-mode') ?? false;
-        const fullscreenDocument = html.classList.contains('fullscreen-mode');
-
-        this.isFullscreen = fullscreenDocument || fullscreen;
-        if (this.isFullscreen && !fullscreenDocument) {
-            html.classList.add('fullscreen-mode');
-        }
+        const fullscreenDocument = document.documentElement.classList.contains('fullscreen-mode');
 
-        if (html.classList.contains('responsive-display')) {
+        if (document.documentElement.classList.contains('responsive-display')) {
             this.isResponsive = true;
         }
 
+        this.isFullscreen = !this.isResponsive && (fullscreenDocument || fullscreen);
+        if (this.isFullscreen && !fullscreenDocument) {
+            this.setCompactNavigation(true);
+        }
         // Re-structure some DOM elements
         this.$nextTick(() => {
             if (this.isResponsive || (this.isFullscreen && !this.isFocusMode)) {
                 this.moveHelpbar();
-            }
 
+                this.contentbarTitle = document.querySelector('.sidebar-image .sidebar-title').textContent;
+                const siteTitle = document.getElementById('site-title');
+                siteTitle.dataset.originalTitle = siteTitle.textContent.trim();
+                siteTitle.textContent = this.initialTitle;
+            }
         });
 
         // Pressing escape should close an open navigation.
@@ -490,13 +525,13 @@ export default {
         this.initialNavigation = this.currentNavigation;
         this.initialTitle = this.initialNavigation.title;
 
-        STUDIP.Vue.on('responsive-navigation-move-to', path => {
+        this.globalOn('responsive-navigation-move-to', path => {
             this.moveTo(path);
         });
 
         // Listen to changes in fullscreen setting
-        STUDIP.Vue.on('toggle-fullscreen', value => {
-            this.setFullscreen(value);
+        this.globalOn('toggle-compact-navigation', value => {
+            this.setCompactNavigation(value);
         });
 
         /*
@@ -511,21 +546,31 @@ export default {
         });
 
         // Observe <html> for class changes.
-        this.observer.observe(html, {
+        this.observer.observe(document.documentElement, {
             attributes: true,
             attributeOldValue : false,
             attributeFilter: ['class']
         });
 
         // Observe <body> for class changes.
-        this.observer.observe(body, {
+        this.observer.observe(document.body, {
             attributes: true,
             attributeOldValue : false,
             attributeFilter: ['class']
         });
 
+        this.globalOn('has-contentbar', value => {
+            this.hasContentbar = value;
+            if (value && this.isFullscreen) {
+                document.getElementById('responsive-toggle-focusmode').style.display = 'block';
+            }
+        });
+
         // Observe courseware contentbar for consuming mode.
-        STUDIP.Vue.on('courseware-ribbon-mounted', element => {
+        this.globalOn('courseware-contentbar-mounted', element => {
+            if (this.isFullscreen) {
+                document.getElementById('responsive-toggle-focusmode').style.display = 'block';
+            }
             this.observer.observe(element.$el.querySelector('header.cw-ribbon'), {
                 attributes: true,
                 attributeOldValue : false,
@@ -536,6 +581,10 @@ export default {
     beforeDestroy() {
         this.observer.disconnect();
         document.getElementById('header-links').style.display = null;
+        STUDIP.eventBus.off('responsive-navigation-move-to');
+        STUDIP.eventBus.off('toggle-compact-navigation');
+        STUDIP.eventBus.off('has-contentbar');
+        STUDIP.eventBus.off('courseware-contentbar-mounted');
     }
 }
 </script>
diff --git a/resources/vue/components/responsive/ResponsiveSkipLinks.vue b/resources/vue/components/responsive/ResponsiveSkipLinks.vue
index 52f0bfcfdbb..7668191d095 100644
--- a/resources/vue/components/responsive/ResponsiveSkipLinks.vue
+++ b/resources/vue/components/responsive/ResponsiveSkipLinks.vue
@@ -37,7 +37,7 @@ export default {
             allButtons.forEach(button => {
                 document.getElementById('skiplink_list').appendChild(button.parentNode);
             });
-        })
+        });
     },
     beforeDestroy() {
         const buttons = document.querySelectorAll('button.skiplink:not([data-in-fullscreen="1"])');
diff --git a/resources/vue/components/responsive/ToggleFullscreen.vue b/resources/vue/components/responsive/ToggleFullscreen.vue
deleted file mode 100644
index 77ce8fbdbc6..00000000000
--- a/resources/vue/components/responsive/ToggleFullscreen.vue
+++ /dev/null
@@ -1,51 +0,0 @@
-<template>
-    <div>
-        <MountingPortal mount-to="#responsive-toggle-fullscreen" append>
-            <portal-target name="toggle-fullscreen-off"></portal-target>
-        </MountingPortal>
-        <MountingPortal mount-to="#non-responsive-toggle-fullscreen" append>
-            <portal-target name="toggle-fullscreen-on"></portal-target>
-        </MountingPortal>
-        <portal :to="isFullscreen ? 'toggle-fullscreen-off' : 'toggle-fullscreen-on'">
-            <button class="styleless" id="toggle-fullscreen"
-                    :title="isFullscreen ? $gettext('Vollbildmodus verlassen') : $gettext('Vollbildmodus aktivieren')"
-                    @click.prevent="toggleFullscreen"
-                    @keydown.prevent.enter="toggleFullscreen"
-                    @keydown.prevent.space="toggleFullscreen">
-                <studip-icon :shape="isFullscreen ? 'fullscreen-off' : 'fullscreen-on4'"
-                             :role="isFullscreen ? 'info_alt' : 'clickable'" :size="iconSize" alt=""></studip-icon>
-            </button>
-        </portal>
-    </div>
-</template>
-
-<script>
-import StudipIcon from '../StudipIcon.vue';
-
-export default {
-    name: 'ToggleFullscreen',
-    components: { StudipIcon },
-    props: {
-        isFullscreen: {
-            type: Boolean,
-            default: false
-        },
-        iconSize: {
-            type: Number,
-            default: 24
-        }
-    },
-    methods: {
-        toggleFullscreen() {
-            STUDIP.Vue.emit('toggle-fullscreen', !this.isFullscreen);
-        }
-    },
-    created() {
-        window.addEventListener('keydown', e => {
-            if (e.key === 'Escape' && this.isFullscreen) {
-                this.toggleFullscreen();
-            }
-        });
-    }
-}
-</script>
diff --git a/templates/contentbar/contentbar.php b/templates/contentbar/contentbar.php
index 9183516ffc7..a6e51a37b9d 100644
--- a/templates/contentbar/contentbar.php
+++ b/templates/contentbar/contentbar.php
@@ -23,11 +23,6 @@
                 </div>
             <? endif ?>
 
-            <div class="contentbar-button-wrapper contentbar-consuming-mode-wrapper">
-                <button class="contentbar-button contentbar-button-zoom consuming_mode_trigger"
-                        title="<?= _('Fokusmodus ein-/ausschalten') ?>"></button>
-            </div>
-
             <? if ($actionMenu) : ?>
                 <div class="contentbar-button-wrapper contentbar-action-menu-wrapper">
                     <?= $actionMenu->render() ?>
diff --git a/templates/header.php b/templates/header.php
index d49b8efe2bc..51620ce130b 100644
--- a/templates/header.php
+++ b/templates/header.php
@@ -203,7 +203,18 @@ if ($navigation) {
                 </li>
             <? endif; ?>
 
-                <li id="responsive-toggle-fullscreen"></li>
+                <li id="responsive-toggle-fullscreen">
+                    <button class="styleless" id="fullscreen-off"
+                            title="<?= _('Kompakte Navigation ausschalten') ?>">
+                        <?= Icon::create('screen-standard', ICON::ROLE_INFO_ALT)->asImg(24) ?>
+                    </button>
+                </li>
+                <li id="responsive-toggle-focusmode">
+                    <button class="styleless consuming_mode_trigger" id="focusmode-on"
+                            title="<?= _('Vollbild aktivieren') ?>">
+                        <?= Icon::create('screen-full', ICON::ROLE_INFO_ALT)->asImg(24) ?>
+                    </button>
+                </li>
             </ul>
         </div>
     </div>
diff --git a/templates/tabs.php b/templates/tabs.php
index 0072705cda8..e5b00a4d7e6 100644
--- a/templates/tabs.php
+++ b/templates/tabs.php
@@ -43,5 +43,12 @@ foreach (Navigation::getItem("/")->getSubNavigation() as $path => $nav) {
     <? if (is_object($GLOBALS['perm']) && $GLOBALS['perm']->have_perm('autor')) : ?>
         <?= Helpbar::get()->render() ?>
     <? endif; ?>
-    <div id="non-responsive-toggle-fullscreen"></div>
+    <? if (User::findCurrent()) : ?>
+    <div id="non-responsive-toggle-fullscreen">
+        <button class="styleless" id="fullscreen-on"
+                title="<?= _('Kompakte Navigation aktivieren') ?>">
+            <?= Icon::create('screen-compact')->asImg(24) ?>
+        </button>
+    </div>
+    <? endif ?>
 </div>
-- 
GitLab