Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support dark mode #1888

Merged
merged 38 commits into from
Mar 20, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
22da13d
Consolidate the `<script>` lines
dscho Oct 20, 2024
e7c96e4
css: avoid redundant CSS rules
dscho Oct 20, 2024
e45839e
css: remove the `link-*-color` variables
dscho Sep 27, 2024
d45e972
css: switch to using CSS custom properties
dscho Sep 27, 2024
7a62c72
Offer a dark mode if indicated by the operating system
dscho Sep 27, 2024
fad54b4
Add a dark/light mode toggle
dscho Sep 27, 2024
148a592
dark-mode: adjust the background
dscho Oct 20, 2024
9ff500e
dark mode: dim images
dscho Sep 27, 2024
d8c3f0d
dark-mode: adapt verseblocks
dscho Sep 27, 2024
6cd6af6
dark-mode: replace hard-coded #fff with the `--main-bg` property
dscho Sep 27, 2024
84f7e0f
dark mode: adapt front page
dscho Oct 20, 2024
3ead9ed
dark-mode: use a not-too-dark color for navbar links
dscho Oct 20, 2024
4f886dd
dark mode: make the circled labels in the About section readable
dscho Oct 20, 2024
80281c3
dark-mode: adjust the search
dscho Oct 20, 2024
703f84d
dark-mode: decrease brightness of the ruler in the sidebar
dscho Oct 20, 2024
4edd45e
dark mode: adjust colors for manual pages' drop-downs
dscho Oct 20, 2024
eed55b4
dark mode: adjust some border colors
dscho Mar 14, 2025
66738f4
dark-mode: invert the images in the `About` section
dscho Mar 15, 2025
bed5a78
dark-mode(about): dim the navigation buttons
dscho Mar 15, 2025
9d6aa8a
dark-mode: add an alternative Git logo
dscho Mar 15, 2025
050154b
Gnome image update
TheGiraffe3 Nov 28, 2024
ae898d7
Finish converting logos that have backrounds
TheGiraffe3 Nov 28, 2024
6f24edc
Better PostGRESQL logo
TheGiraffe3 Dec 2, 2024
04ca69c
Eclipse logo update
TheGiraffe3 Dec 3, 2024
12e369b
company-project-logos: update Microsoft & PostgreSQL
To1ne Mar 17, 2025
d572b11
Merge pull request #16 from TheGiraffe3/dark-mode
dscho Dec 3, 2024
c7c71b3
layout: replace code icon with pure CSS solution
To1ne Mar 17, 2025
6b851b5
dark-mode: don't apply color filter on all images
To1ne Mar 17, 2025
d91a0f8
css: fix cursor being truncated
To1ne Mar 17, 2025
ba78582
css: make the header responsive
To1ne Mar 18, 2025
2f9f1f4
css: fluid sizing of the tagline
To1ne Mar 19, 2025
3e7d9fc
js: add correct href to "Show all results..."
To1ne Mar 17, 2025
1de8079
css: place dark-mode icon next to tagline on mobile
To1ne Mar 19, 2025
432ee98
Merge pull request #19 from To1ne/dark-mode
dscho Mar 17, 2025
3a34170
Merge branch 'To1ne/dark-mode'
dscho Mar 19, 2025
633c6f8
Merge pull request #21 from To1ne/toon-dark-grid-header
dscho Mar 19, 2025
9675370
dark-mode: drop the text shadow in search results
dscho Mar 20, 2025
994925a
playwright: verify that dark mode works
dscho Mar 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 39 additions & 6 deletions assets/js/application.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ const baseURLPrefix = (() => {

$(document).ready(function() {
BrowserFallbacks.init();
DarkMode.init();
Search.init();
Dropdowns.init();
Forms.init();
Expand Down Expand Up @@ -222,7 +223,12 @@ var Search = {
$("#show-results-label").text("No matching pages found.");
return;
}
$("#show-results-label").text("Show all results...");

const language = document.querySelector("html")?.getAttribute("lang");
$("#show-results-label")
.text("Show all results...")
.attr('href', `${baseURLPrefix}search/results?search=${term}${language && `&language=${language}`}`);

const loadButton = $("#load-more-results");
loadButton.text(`Loading ${
results.results.length < 2
Expand Down Expand Up @@ -299,11 +305,6 @@ var Search = {
selectResultOption: function() {
var link = $('#search-results a')[Search.selectedIndex];
var url = $(link).attr('href');
if(!url) {
const term = $('#search-text').val();
const language = document.querySelector("html")?.getAttribute("lang");
url = `${baseURLPrefix}search/results?search=${term}${language && `&language=${language}`}`;
}
window.location.href = url;
selectedIndex = 0;
},
Expand Down Expand Up @@ -551,6 +552,38 @@ var Downloads = {
},
}

var DarkMode = {
init: function() {
const button = $('#dark-mode-button');
if (!button.length) return;

// Check for dark mode preference at the OS level
const prefersDarkScheme = window.matchMedia("(prefers-color-scheme: dark)").matches;

// Get the user's theme preference from local storage, if it's available
const currentTheme = localStorage.getItem("theme");

if ((prefersDarkScheme && currentTheme !== "light")
|| (!prefersDarkScheme && currentTheme === "dark")) {
button.attr("src", `${baseURLPrefix}images/light-mode.svg`);
}
button.css("display", "block");

button.click(function(e) {
e.preventDefault();
let theme
if (prefersDarkScheme) {
theme = document.documentElement.dataset.theme === "light" ? "dark" : "light"
} else {
theme = document.documentElement.dataset.theme === "dark" ? "light" : "dark"
}
document.documentElement.dataset.theme = theme
localStorage.setItem("theme", theme);
button.attr("src", `${baseURLPrefix}images/${theme === "dark" ? "light" : "dark"}-mode.svg`);
});
},
}

// Scroll to Top
$('#scrollToTop').removeClass('no-js');
$(window).scroll(function() {
Expand Down
17 changes: 14 additions & 3 deletions assets/sass/application.scss
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,18 @@ $baseurl: "{{ .Site.BaseURL }}{{ if (and (ne .Site.BaseURL "/") (ne .Site.BaseUR
@import 'book2';
@import 'lists';
@import 'about';
@import 'dark-mode';

code {
display: inline;
padding: 0 5px;
}

pre {
background-color: #fff;
border: solid 1px #efeee6;
background-color: var(--main-bg);
border: solid 1px var(--pre-border);
border-radius: 3px;
color: $orange;
color: var(--orange);
display: block;
font-family: $fixed-width-font-family;
font-variant-ligatures: none;
Expand All @@ -50,3 +51,13 @@ pre {
.d-flex{
display: flex;
}

#dark-mode-button {
grid-area: dark;
display: none;
width: 28px;
background-color: transparent;
text-decoration: none;
align-self: center;
margin: 5px;
}
11 changes: 5 additions & 6 deletions assets/sass/book.scss
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
@import "variables";
@import "mixins";
@import "layout";

.ebooks img {
padding: 5px;
Expand All @@ -13,7 +12,7 @@
padding-bottom: 20px !important;
background-color: transparent !important;
overflow: hidden;
border: solid 1px lighten($base-border-color, 10%);
border: solid 1px var(--base-border-color-lighter-10);
}

#book-intro {
Expand All @@ -36,7 +35,7 @@
.license {
font-size: 11px;
line-height: 1.3;
color: $light-font-color;
color: var(--light-font-color);
}

a#open-book {
Expand All @@ -52,7 +51,7 @@
display: none;
padding-left: 22px;
font-size: 12px;
color: $light-font-color;
color: var(--light-font-color);
text-align: center;
text-indent: 40px;

Expand All @@ -74,7 +73,7 @@ ol.book-toc {
}

h2 {
color: $font-color;
color: var(--font-color);
}

a {
Expand Down Expand Up @@ -140,7 +139,7 @@ ol.book-toc {

&.active {
font-weight: bold;
color: $orange;
color: var(--orange);
}
}
}
Expand Down
193 changes: 193 additions & 0 deletions assets/sass/dark-mode.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
@mixin mode($mode: light, $theme: "") {
// Palette
$orange: #f14e32;
$blue: #009099;
$font-color: #4e443c;
$aside-font-color: lighten($font-color, 20%);
$light-font-color: #9a9994;
$link-color: #0388a6;
$nav-link-color: #413932;
$fixed-width-font-color: #4e443c;
$button-bg-color: #dfddd554;
$button-bg-hover-color: #fafafae5;
$button-color: #{$link-color};
$mark-bg-color: #ff0;
$mark-color: #000;
$base-border-color: #d8d7cf;
$callout-color: #e9e8e0;
$highlight-bg-color: #eee0b5;
$pre-border: #efeee6;
$black-3: #333333;
$main-bg: #fcfcfa;
$main-border: #e2e0d8;
$bg-color: #f0efe7 url($baseurl + "images/bg/body.jpg");
$sidebar-bg-color: #efefe7;
$no-changes-bg-color: #f5f5f3;
$dropdown-active-bg-color: #fff;
$versions-footer-bg-color: #eae9e0;
$search-border: #ceccc5;
$search-focus-border: #007175;

@if $mode == dark {
$orange: #d7834f;
$blue: #007a7e;
$font-color: #b3b1b1;
$aside-font-color: darken($font-color, 10%);
$light-font-color: #bdbbb0;
$link-color: #d7834f;
$nav-link-color: #979594;
$fixed-width-font-color: #afa7a0;
$button-bg-hover-color: #dfddd599;
$button-color: #{$button-bg-hover-color};
$mark-bg-color: #898882;
$mark-color: #d2d2d2;
$base-border-color: #b3b2a7;
$callout-color: #555555;
$highlight-bg-color: #47412d;
$pre-border: #494945;
$black-3: #cccccc;
$main-bg: #333333;
$main-border: #5e5e5a;
$bg-color: #2a2a2aff;
$sidebar-bg-color: #3d3d3a;
$no-changes-bg-color: #515150;
$dropdown-active-bg-color: #515150;
$versions-footer-bg-color: #1f1f1e;
$search-border: #5e5e5a;
$search-focus-border: #ceccc5;

:root#{$theme} {
div#masthead {
background: transparent;
}

div#masthead::before {
content: "";
width: 100%;
height: 295px;
@include background-image-2x($baseurl + "images/bg/isometric-grid", 35px, 21px, top right, repeat);
position: absolute;
filter: brightness(.4) contrast(1.6);
z-index: -1;
}

img {
filter: brightness(.6) contrast(1.2);
}

// the images in the About section would be too dark
body#about {
img:not(.no-filter) {
filter: brightness(0.9) contrast(0.6) invert(1);
}

ol#about-nav li a {
filter: brightness(0.8);
}
}

img[alt="Git"] {
filter: unset;
content: url(./images/logo.dark-mode.svg);
}

a.subtle-button {
background-image: linear-gradient(#555555, #777777);
border-top: solid 1px #333333;
border-right: solid 1px #333333;
border-bottom: solid 1px #333333;
border-left: solid 1px #333333;
@include box-shadow(none);
}

#front-nav img {
filter: none;
}

div.monitor {
filter: brightness(.85);
}

.monitor a {
color: #dbd7d7;
}

hr.sidebar {
filter: brightness(0.5);
}

#documentation #main div.verseblock pre.content {
color: var(--light-font-color);
background-color: #5e5951;
}

form#search {
@include box-shadow(none);
}

input.pagefind-ui__search-input {
background: var(--main-bg);
}

#search-results table td.matches :is(a:hover, a.highlight) {
text-shadow:unset;
}

#reference-version {
background-color: #6f6e6954;
}

#l10n-versions-dropdown footer a {
color: #6969dd;
}
}
}

:root#{$theme} {
--orange: #{$orange};
--orange-darker-5: #{darken($orange, 5%)};
--blue: #{$blue};
--font-color: #{$font-color};
--aside-font-color: #{$aside-font-color};
--light-font-color: #{$light-font-color};
--light-font-color-darker-10: #{darken($light-font-color, 10%)};
--light-font-color-darker-25: #{darken($light-font-color, 25%)};
--light-font-color-darker-35: #{darken($light-font-color, 35%)};
--light-font-color-darker-55: #{darken($light-font-color, 55%)};
--light-font-color-lighter-20: #{lighten($light-font-color, 20%)};
--link-color: #{$link-color};
--nav-link-color: #{$nav-link-color};
--link-hover-color: #{lighten($link-color, 10%)};
--fixed-width-font-color: #{$fixed-width-font-color};
--button-bg-color: #{$button-bg-color};
--button-bg-hover-color: #{$button-bg-hover-color};
--button-color: #{$button-color};
--mark-bg-color: #{$mark-bg-color};
--mark-color: #{$mark-color};
--base-border-color: #{$base-border-color};
--base-border-color-darker-8: #{darken($base-border-color, 8%)};
--base-border-color-lighter-10: #{lighten($base-border-color, 10%)};
--callout-color: #{$callout-color};
--highlight-bg-color: #{$highlight-bg-color};
--pre-border: #{$pre-border};

--black-3: #{$black-3};
--main-bg: #{$main-bg};
--main-border: #{$main-border};
--sidebar-bg-color: #{$sidebar-bg-color};
--bg-color: #{$bg-color};
--no-changes-bg-color: #{$no-changes-bg-color};
--dropdown-active-bg-color: #{$dropdown-active-bg-color};
--versions-footer-bg-color: #{$versions-footer-bg-color};
--search-border: #{$search-border};
--search-focus-border: #{$search-focus-border};
}
}

@include mode
@include mode($mode: dark, $theme: '[data-theme="dark"]')

@media screen and (prefers-color-scheme: dark) {
@include mode($mode: dark, $theme: ':not([data-theme="light"])')
@include mode($mode: light)
}
Loading
Loading