diff --git a/.github/workflows/build.sh b/.github/workflows/build.sh
index 75cef84afce..6e91d19ebde 100755
--- a/.github/workflows/build.sh
+++ b/.github/workflows/build.sh
@@ -37,6 +37,10 @@ else
fi
mdbook build -d "$dest_dir"
+
+# Disable the redbox button in built versions of the course
+echo '// Disabled in published builds, see build.sh' > "${dest_dir}/html/theme/redbox.js"
+
mv "$dest_dir/pandoc/pdf/comprehensive-rust.pdf" "$dest_dir/html/"
(cd "$dest_dir/exerciser" && zip --recurse-paths ../html/comprehensive-rust-exercises.zip comprehensive-rust-exercises/)
diff --git a/STYLE.md b/STYLE.md
index 0a5ce73a2f0..c405a199579 100644
--- a/STYLE.md
+++ b/STYLE.md
@@ -15,14 +15,9 @@ important to keep this in mind when adding content: we only have limited
vertical space. Scrolling up and down should be avoided since it is very jarring
for people who attend the class.
-You can test the amount of space available using a simple tool. Uncomment these
-lines in the `book.toml` file to have a red rectangle rendered on top of all
-pages:
-
-```toml
-[preprocessor.aspect-ratio-helper]
-command = "./aspect-ratio-helper.py"
-```
+You can test the amount of space available using a simple tool. This tool can be
+used by clicking a toggle button next to the search button on left side of the
+navbar.
The rectangle has an aspect ratio similar to what you can see when you share
your screen on a 16:9 display or projector.
diff --git a/aspect-ratio-helper.py b/aspect-ratio-helper.py
deleted file mode 100755
index 904d3e8b6a8..00000000000
--- a/aspect-ratio-helper.py
+++ /dev/null
@@ -1,85 +0,0 @@
-#!/usr/bin/env python3
-
-# Copyright 2023 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""mdbook preprocessor which will help show the presentation aspect ratio.
-
-The preprocessor adds a large red rectangle on every page. The
-rectangle has an aspect ratio of 16 to 8.5, meaning that it is
-slightly smaller than a standard 16/9 monitor.
-
-The idea is that this approximates what the course participants can
-see at once during a class. This in turn will help you estimate when
-the slides are too large to be seen without scrolling.
-
-Enable it in book.toml.
-"""
-
-import json
-import sys
-import textwrap
-
-
-def update_book_items(items):
- aspect_ratio_helper = textwrap.dedent("""
-
-
-
-
- """)
-
- for item in items:
- if type(item) != dict:
- continue
-
- chapter = item.get('Chapter')
- if not chapter:
- continue
-
- chapter['content'] = aspect_ratio_helper + chapter['content']
- update_book_items(chapter['sub_items'])
-
-
-if __name__ == '__main__':
- if len(sys.argv) > 1:
- if sys.argv[1] == "supports":
- sys.exit(0)
-
- context, book = json.load(sys.stdin)
- update_book_items(book['sections'])
- print(json.dumps(book))
diff --git a/book.toml b/book.toml
index b84ed87c392..ff8e0ca7236 100644
--- a/book.toml
+++ b/book.toml
@@ -22,13 +22,6 @@ class = "bob"
[preprocessor.course]
verbose = false # Report timing information.
-# Enable this preprocessor to overlay a large red rectangle on the
-# pages. This will show you an estimate of what the course
-# participants can see during the presentation.
-#
-# [preprocessor.aspect-ratio-helper]
-# command = "./aspect-ratio-helper.py"
-
[output.pandoc]
optional = true
hosted-html = "https://google.github.io/comprehensive-rust/"
@@ -47,9 +40,10 @@ urlcolor = "red"
[output.html]
curly-quotes = true
-additional-js = ["theme/speaker-notes.js"]
+additional-js = ["theme/speaker-notes.js", "theme/redbox.js"]
additional-css = [
"theme/css/svgbob.css",
+ "theme/css/redbox.css",
"theme/css/speaker-notes.css",
"theme/css/language-picker.css",
"theme/css/rtl.css",
diff --git a/theme/css/redbox.css b/theme/css/redbox.css
new file mode 100644
index 00000000000..79e9ed99078
--- /dev/null
+++ b/theme/css/redbox.css
@@ -0,0 +1,20 @@
+div#aspect-ratio-helper {
+ position: fixed;
+ top: 8px;
+ left: 8px;
+ right: 8px;
+ z-index: 1000;
+ pointer-events: none;
+}
+
+div#aspect-ratio-helper div {
+ outline: 3px dashed red;
+ margin: 0 auto;
+ /* At this width, the theme fonts are readable in a 16
+ person conference room. If the browser is wider, the
+ text becomes too small to be legible. */
+ max-width: 980px;
+ /* On a standard 16/9 monitor, we expect to lose a bit
+ of vertical space to borders. */
+ aspect-ratio: 16/8.5;
+}
diff --git a/theme/redbox.js b/theme/redbox.js
new file mode 100644
index 00000000000..dd8a1c31380
--- /dev/null
+++ b/theme/redbox.js
@@ -0,0 +1,38 @@
+(function redBoxButton() {
+ // Create a new div element
+ var newDiv = document.createElement("div");
+ // Set the id attribute of the new div
+ newDiv.id = "aspect-ratio-helper";
+ // Create a nested div inside the new div
+ var nestedDiv = document.createElement("div");
+ // Append the nested div to the new div
+ newDiv.appendChild(nestedDiv, newDiv.firstChild);
+ // Get the parent element where you want to append the new div
+ var parentElement = document.body; // Change this to your desired parent element
+ // Append the new div to the parent element
+ parentElement.insertBefore(newDiv, parentElement.firstChild);
+ // Create the button element
+ var hideShowButton = document.createElement("button");
+ hideShowButton.innerHTML = '';
+ hideShowButton.className = "icon-button";
+ hideShowButton.type = "button";
+ hideShowButton.title =
+ "Outline the area that fits on one screen while teaching the course.";
+ hideShowButton.id = "Dev";
+ var navbarButtons = document.getElementsByClassName("left-buttons");
+ navbarButtons[0].insertBefore(hideShowButton, navbarButtons.firstChild);
+ //Default hiding the redbox
+ document.getElementById("aspect-ratio-helper").style.display = "none";
+ //Add Event listener to button to perform on click action.
+ hideShowButton.addEventListener("click", function () {
+ if (
+ document.getElementById("aspect-ratio-helper").style.display === "none"
+ ) {
+ document.getElementById("aspect-ratio-helper").style.display = "block";
+ hideShowButton.innerHTML = '';
+ } else {
+ document.getElementById("aspect-ratio-helper").style.display = "none";
+ hideShowButton.innerHTML = '';
+ }
+ });
+})();