8367321: Fix CSS bugs in dark theme

8366942: Dark mode pages briefly blink before going dark

Reviewed-by: nbenalla, liach
This commit is contained in:
Hannes Wallnöfer 2025-10-07 15:16:08 +00:00
parent 0f2a95c15d
commit 8a20656ed0
4 changed files with 69 additions and 55 deletions

View File

@ -378,7 +378,8 @@ public class Head extends Content {
mainBodyScript.append("const pathtoroot = ")
.appendStringLiteral(ptrPath + "/")
.append(";\n")
.append("loadScripts(document, 'script');");
.append("loadScripts();\n")
.append("initTheme();\n");
}
addScriptElement(head, DocPaths.JQUERY_JS);
addScriptElement(head, DocPaths.JQUERY_UI_JS);

View File

@ -11,12 +11,13 @@ var typeSearchIndex;
var memberSearchIndex;
var tagSearchIndex;
var oddRowColor = "odd-row-color";
var evenRowColor = "even-row-color";
var sortAsc = "sort-asc";
var sortDesc = "sort-desc";
var tableTab = "table-tab";
var activeTableTab = "active-table-tab";
const oddRowColor = "odd-row-color";
const evenRowColor = "even-row-color";
const sortAsc = "sort-asc";
const sortDesc = "sort-desc";
const tableTab = "table-tab";
const activeTableTab = "active-table-tab";
const THEMES = Object.freeze(["theme-light", "theme-dark", "theme-os"]);
const linkIcon = "##REPLACE:doclet.Link_icon##";
const linkToSection = "##REPLACE:doclet.Link_to_section##";
@ -30,21 +31,20 @@ if (typeof hljs !== "undefined") {
}
}
function loadScripts(doc, tag) {
createElem(doc, tag, 'script-files/search.js');
createElem(doc, tag, 'module-search-index.js');
createElem(doc, tag, 'package-search-index.js');
createElem(doc, tag, 'type-search-index.js');
createElem(doc, tag, 'member-search-index.js');
createElem(doc, tag, 'tag-search-index.js');
function loadScripts() {
createScript('script-files/search.js');
createScript('module-search-index.js');
createScript('package-search-index.js');
createScript('type-search-index.js');
createScript('member-search-index.js');
createScript('tag-search-index.js');
}
function createElem(doc, tag, path) {
var script = doc.createElement(tag);
var scriptElement = doc.getElementsByTagName(tag)[0];
function createScript(path) {
var script = document.createElement("script");
script.src = pathtoroot + path;
scriptElement.parentNode.insertBefore(script, scriptElement);
var firstScript = document.getElementsByTagName("script")[0];
firstScript.parentNode.insertBefore(script, firstScript);
}
// Helper for making content containing release names comparable lexicographically
@ -312,21 +312,31 @@ function makeFilterWidget(sidebar, updateToc) {
return sidebar;
}
function getTheme() {
return localStorage.getItem('theme') || THEMES[0];
}
function initTheme() {
document.body.classList.add(getTheme());
}
function setTopMargin() {
// Dynamically set scroll margin to accomodate for draft header
var headerHeight = Math.ceil(document.querySelector("header").offsetHeight);
document.querySelector(":root")
.style.setProperty("--nav-height", headerHeight + "px");
}
document.addEventListener("readystatechange", (e) => {
if (document.readyState === "interactive") {
setTopMargin();
}
if (sessionStorage.getItem("sidebar") === "hidden") {
const sidebar = document.querySelector(".main-grid nav.toc");
if (sidebar) sidebar.classList.add("hide-sidebar");
if (sessionStorage.getItem("sidebar") === "hidden") {
const sidebar = document.querySelector(".main-grid nav.toc");
if (sidebar) sidebar.classList.add("hide-sidebar");
}
}
});
document.addEventListener("DOMContentLoaded", function(e) {
setTopMargin();
const subnav = document.querySelector("ol.sub-nav-list");
@ -375,13 +385,16 @@ document.addEventListener("DOMContentLoaded", function(e) {
themePanelVisible = false;
}
}
var currentTheme = getTheme();
themePanel.querySelectorAll("input").forEach(input => {
input.removeAttribute("disabled");
if (input.id === currentTheme) {
input.checked = true;
}
input.addEventListener("change", e => {
setTheme(e.target.value);
})
});
const THEMES = ["theme-light", "theme-dark", "theme-os"];
function setTheme(theme) {
THEMES.forEach(t => {
if (t !== theme) document.body.classList.remove(t);
@ -390,7 +403,6 @@ document.addEventListener("DOMContentLoaded", function(e) {
localStorage.setItem("theme", theme);
document.getElementById(theme).checked = true;
}
setTheme(localStorage.getItem("theme") || THEMES[0]);
makeFilterWidget(sidebar, updateToc);
if (tocMenu) {
navbar.appendChild(tocMenu);

View File

@ -73,7 +73,7 @@ body {
--selected-link-color: #4a698a;
/* Background colors for generated tables */
--table-header-color: #ebeff4;
--even-row-color: #ffffff;
--even-row-color: #fdfdfe;
--odd-row-color: #f0f0f2;
/* Text color for page title */
--title-color: #2c4557;
@ -109,17 +109,19 @@ body {
/* Colors for invalid tag notifications */
--invalid-tag-background-color: #ffe6e6;
--invalid-tag-text-color: #000000;
--icon-filter: none;
--caption-link-color: var(--subnav-link-color);
}
body.theme-dark {
--body-text-color: #e8e8e8;
--block-text-color: #e8e8e8;
--body-background-color: #222528;
--body-background-color: #1f2124;
--section-background-color: var(--body-background-color);
--detail-background-color: var(--body-background-color);
--code-background-color: #303940;
--mark-background-color: #313131;
--detail-block-color: #f4f4f4;
--detail-block-color: #31363c;
--navbar-background-color: #395A6F;
--navbar-text-color: #ffffff;
--subnav-background-color: #3d454d;
@ -133,11 +135,11 @@ body.theme-dark {
--odd-row-color: #2d3135;
--title-color: #fff;
--link-color: #94badb;
--link-color-active: #ffb45b;
--toc-background-color: #31363c;
--link-color-active: #e8a351;
--toc-background-color: #2f3439;
--toc-highlight-color: var(--subnav-background-color);
--toc-hover-color: #3f4146;
--snippet-background-color: #2d363c;
--snippet-background-color: #2c353b;
--snippet-text-color: var(--block-text-color);
--snippet-highlight-color: #f7c590;
--pre-background-color: var(--snippet-background-color);
@ -155,10 +157,8 @@ body.theme-dark {
--button-focus-filter: brightness(104%);
--invalid-tag-background-color: #ffe6e6;
--invalid-tag-text-color: #000000;
div.main-grid img,
.inherited-list h3 > button {
filter: invert(100%) brightness(160%);
}
--icon-filter: invert(100%) brightness(160%);
--caption-link-color: var(--link-color);
}
/*
@ -168,12 +168,12 @@ body.theme-dark {
body {
--body-text-color: #e8e8e8;
--block-text-color: #e8e8e8;
--body-background-color: #222528;
--body-background-color: #1f2124;
--section-background-color: var(--body-background-color);
--detail-background-color: var(--body-background-color);
--code-background-color: #303940;
--mark-background-color: #313131;
--detail-block-color: #f4f4f4;
--detail-block-color: #31363c;
--navbar-background-color: #395A6F;
--navbar-text-color: #ffffff;
--subnav-background-color: #3d454d;
@ -187,11 +187,11 @@ body.theme-dark {
--odd-row-color: #2d3135;
--title-color: #fff;
--link-color: #94badb;
--link-color-active: #ffb45b;
--toc-background-color: #31363c;
--link-color-active: #e8a351;
--toc-background-color: #2f3439;
--toc-highlight-color: var(--subnav-background-color);
--toc-hover-color: #3f4146;
--snippet-background-color: #2d363c;
--snippet-background-color: #2c353b;
--snippet-text-color: var(--block-text-color);
--snippet-highlight-color: #f7c590;
--pre-background-color: var(--snippet-background-color);
@ -209,15 +209,13 @@ body.theme-dark {
--button-focus-filter: brightness(104%);
--invalid-tag-background-color: #ffe6e6;
--invalid-tag-text-color: #000000;
div.main-grid img,
.inherited-list h3 > button {
filter: invert(100%) brightness(160%);
}
--icon-filter: invert(100%) brightness(160%);
--caption-link-color: var(--link-color);
}
body.theme-light {
--body-text-color: #282828;
--block-text-color: #282828;
--body-text-color: #181818;
--block-text-color: #181818;
--body-background-color: #ffffff;
--section-background-color: var(--body-background-color);
--detail-background-color: var(--body-background-color);
@ -233,7 +231,7 @@ body.theme-dark {
--selected-text-color: #253441;
--selected-link-color: #4a698a;
--table-header-color: #ebeff4;
--even-row-color: #ffffff;
--even-row-color: #fdfdfe;
--odd-row-color: #f0f0f2;
--title-color: #2c4557;
--link-color: #437291;
@ -259,10 +257,8 @@ body.theme-dark {
--button-focus-filter: brightness(104%);
--invalid-tag-background-color: #ffe6e6;
--invalid-tag-text-color: #000000;
div.main-grid img,
.inherited-list h3 > button {
filter: none;
}
--icon-filter: none;
--caption-link-color: var(--subnav-link-color);
}
}
/*
@ -288,6 +284,9 @@ div.main-grid {
max-width: var(--max-content-width);
margin: var(--content-margin);
}
div.main-grid img {
filter: var(--icon-filter);
}
a:link, a:visited {
text-decoration:none;
color:var(--link-color);
@ -909,12 +908,12 @@ ul.preview-feature-list input {
.caption a:visited,
.inherited-list h3 a:link,
.inherited-list h3 a:visited {
color:var(--subnav-link-color);
color:var(--caption-link-color);
}
.caption a:hover,
.caption a:active,
.inherited-list.expanded h3 a:hover,
.inherited-list.expanded h3 a:active {
.inherited-list h3 a:hover,
.inherited-list h3 a:active {
color: var(--link-color-active);
}
div.table-tabs {
@ -1539,6 +1538,7 @@ section[class$="-details"] .detail > div {
height: 1.6em;
vertical-align: middle;
top: -2px;
filter: var(--icon-filter);
}
.inherited-list h3:has(button) {
padding-left: 2px;

View File

@ -427,7 +427,8 @@ public class TestSearch extends JavadocTester {
<script type="text/javascript" src="script-files/jquery-ui.min.js"></script>""",
"""
const pathtoroot = "./";
loadScripts(document, 'script');""",
loadScripts();
initTheme();""",
"<div class=\"nav-list-search\">",
"""
<li><a href="search.html">Search</a></li>""",