rustdoc: merge theme css into rustdoc.css

Based on
https://github.com/rust-lang/rust/pull/115812#issuecomment-1717960119

Having them in separate files used to make more sense, before the
migration to CSS variables made the theme files as small as they are
nowadays. This is already how docs.rs and mdBook do it.
This commit is contained in:
Michael Howell 2023-09-13 15:08:45 -07:00
parent cbccf800b8
commit 7e86fd61e8
21 changed files with 798 additions and 448 deletions

View file

@ -846,7 +846,7 @@ impl Step for RustdocTheme {
let rustdoc = builder.bootstrap_out.join("rustdoc"); let rustdoc = builder.bootstrap_out.join("rustdoc");
let mut cmd = builder.tool_cmd(Tool::RustdocTheme); let mut cmd = builder.tool_cmd(Tool::RustdocTheme);
cmd.arg(rustdoc.to_str().unwrap()) cmd.arg(rustdoc.to_str().unwrap())
.arg(builder.src.join("src/librustdoc/html/static/css/themes").to_str().unwrap()) .arg(builder.src.join("src/librustdoc/html/static/css/rustdoc.css").to_str().unwrap())
.env("RUSTC_STAGE", self.compiler.stage.to_string()) .env("RUSTC_STAGE", self.compiler.stage.to_string())
.env("RUSTC_SYSROOT", builder.sysroot(self.compiler)) .env("RUSTC_SYSROOT", builder.sysroot(self.compiler))
.env("RUSTDOC_LIBDIR", builder.sysroot_libdir(self.compiler, self.compiler.host)) .env("RUSTDOC_LIBDIR", builder.sysroot_libdir(self.compiler, self.compiler.host))

View file

@ -410,9 +410,15 @@ impl Options {
let to_check = matches.opt_strs("check-theme"); let to_check = matches.opt_strs("check-theme");
if !to_check.is_empty() { if !to_check.is_empty() {
let paths = match theme::load_css_paths( let mut content =
std::str::from_utf8(static_files::STATIC_FILES.theme_light_css.bytes).unwrap(), std::str::from_utf8(static_files::STATIC_FILES.rustdoc_css.bytes).unwrap();
) { if let Some((_, inside)) = content.split_once("/* Begin theme: light */") {
content = inside;
}
if let Some((inside, _)) = content.split_once("/* End theme: light */") {
content = inside;
}
let paths = match theme::load_css_paths(content) {
Ok(p) => p, Ok(p) => p,
Err(e) => { Err(e) => {
diag.struct_err(e).emit(); diag.struct_err(e).emit();
@ -550,9 +556,15 @@ impl Options {
let mut themes = Vec::new(); let mut themes = Vec::new();
if matches.opt_present("theme") { if matches.opt_present("theme") {
let paths = match theme::load_css_paths( let mut content =
std::str::from_utf8(static_files::STATIC_FILES.theme_light_css.bytes).unwrap(), std::str::from_utf8(static_files::STATIC_FILES.rustdoc_css.bytes).unwrap();
) { if let Some((_, inside)) = content.split_once("/* Begin theme: light */") {
content = inside;
}
if let Some((inside, _)) = content.split_once("/* End theme: light */") {
content = inside;
}
let paths = match theme::load_css_paths(content) {
Ok(p) => p, Ok(p) => p,
Err(e) => { Err(e) => {
diag.struct_err(e).emit(); diag.struct_err(e).emit();

View file

@ -107,8 +107,8 @@ pub(crate) struct SharedContext<'tcx> {
pub(super) module_sorting: ModuleSorting, pub(super) module_sorting: ModuleSorting,
/// Additional CSS files to be added to the generated docs. /// Additional CSS files to be added to the generated docs.
pub(crate) style_files: Vec<StylePath>, pub(crate) style_files: Vec<StylePath>,
/// Suffix to be added on resource files (if suffix is "-v2" then "light.css" becomes /// Suffix to add on resource files (if suffix is "-v2" then "search-index.js" becomes
/// "light-v2.css"). /// "search-index-v2.js").
pub(crate) resource_suffix: String, pub(crate) resource_suffix: String,
/// Optional path string to be used to load static files on output pages. If not set, uses /// Optional path string to be used to load static files on output pages. If not set, uses
/// combinations of `../` to reach the documentation root. /// combinations of `../` to reach the documentation root.
@ -714,18 +714,9 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> {
You need to enable JavaScript be able to update your settings.\ You need to enable JavaScript be able to update your settings.\
</section>\ </section>\
</noscript>\ </noscript>\
<script defer src=\"{static_root_path}{settings_js}\"></script>\ <script defer src=\"{static_root_path}{settings_js}\"></script>",
<link rel=\"preload\" href=\"{static_root_path}{theme_light_css}\" \
as=\"style\">\
<link rel=\"preload\" href=\"{static_root_path}{theme_dark_css}\" \
as=\"style\">\
<link rel=\"preload\" href=\"{static_root_path}{theme_ayu_css}\" \
as=\"style\">",
static_root_path = page.get_static_root_path(), static_root_path = page.get_static_root_path(),
settings_js = static_files::STATIC_FILES.settings_js, settings_js = static_files::STATIC_FILES.settings_js,
theme_light_css = static_files::STATIC_FILES.theme_light_css,
theme_dark_css = static_files::STATIC_FILES.theme_dark_css,
theme_ayu_css = static_files::STATIC_FILES.theme_ayu_css,
); );
// Pre-load all theme CSS files, so that switching feels seamless. // Pre-load all theme CSS files, so that switching feels seamless.
// //

View file

@ -28,3 +28,216 @@ nav.sub {
https://github.com/rust-lang/rust/issues/102576 */ https://github.com/rust-lang/rust/issues/102576 */
display: none; display: none;
} }
/* Begin: styles for themes
Keep the default light and dark themes synchronized with the ones
in rustdoc.css */
/* Begin theme: light */
:root {
--main-background-color: white;
--main-color: black;
--settings-input-color: #2196f3;
--settings-input-border-color: #717171;
--settings-button-color: #000;
--settings-button-border-focus: #717171;
--sidebar-background-color: #f5f5f5;
--sidebar-background-color-hover: #e0e0e0;
--code-block-background-color: #f5f5f5;
--scrollbar-track-background-color: #dcdcdc;
--scrollbar-thumb-background-color: rgba(36, 37, 39, 0.6);
--scrollbar-color: rgba(36, 37, 39, 0.6) #d9d9d9;
--headings-border-bottom-color: #ddd;
--border-color: #e0e0e0;
--button-background-color: #fff;
--right-side-color: grey;
--code-attribute-color: #999;
--toggles-color: #999;
--toggle-filter: none;
--search-input-focused-border-color: #66afe9;
--copy-path-button-color: #999;
--copy-path-img-filter: invert(50%);
--copy-path-img-hover-filter: invert(35%);
--codeblock-error-hover-color: rgb(255, 0, 0);
--codeblock-error-color: rgba(255, 0, 0, .5);
--codeblock-ignore-hover-color: rgb(255, 142, 0);
--codeblock-ignore-color: rgba(255, 142, 0, .6);
--warning-border-color: #ff8e00;
--type-link-color: #ad378a;
--trait-link-color: #6e4fc9;
--assoc-item-link-color: #3873ad;
--function-link-color: #ad7c37;
--macro-link-color: #068000;
--keyword-link-color: #3873ad;
--mod-link-color: #3873ad;
--link-color: #3873ad;
--sidebar-link-color: #356da4;
--sidebar-current-link-background-color: #fff;
--search-result-link-focus-background-color: #ccc;
--search-result-border-color: #aaa3;
--search-color: #000;
--search-error-code-background-color: #d0cccc;
--search-results-alias-color: #000;
--search-results-grey-color: #999;
--search-tab-title-count-color: #888;
--search-tab-button-not-selected-border-top-color: #e6e6e6;
--search-tab-button-not-selected-background: #e6e6e6;
--search-tab-button-selected-border-top-color: #0089ff;
--search-tab-button-selected-background: #fff;
--stab-background-color: #fff5d6;
--stab-code-color: #000;
--code-highlight-kw-color: #8959a8;
--code-highlight-kw-2-color: #4271ae;
--code-highlight-lifetime-color: #b76514;
--code-highlight-prelude-color: #4271ae;
--code-highlight-prelude-val-color: #c82829;
--code-highlight-number-color: #718c00;
--code-highlight-string-color: #718c00;
--code-highlight-literal-color: #c82829;
--code-highlight-attribute-color: #c82829;
--code-highlight-self-color: #c82829;
--code-highlight-macro-color: #3e999f;
--code-highlight-question-mark-color: #ff9011;
--code-highlight-comment-color: #8e908c;
--code-highlight-doc-comment-color: #4d4d4c;
--src-line-numbers-span-color: #c67e2d;
--src-line-number-highlighted-background-color: #fdffd3;
--test-arrow-color: #f5f5f5;
--test-arrow-background-color: rgba(78, 139, 202, 0.2);
--test-arrow-hover-color: #f5f5f5;
--test-arrow-hover-background-color: rgb(78, 139, 202);
--target-background-color: #fdffd3;
--target-border-color: #ad7c37;
--kbd-color: #000;
--kbd-background: #fafbfc;
--kbd-box-shadow-color: #c6cbd1;
--rust-logo-filter: initial;
/* match border-color; uses https://codepen.io/sosuke/pen/Pjoqqp */
--crate-search-div-filter: invert(100%) sepia(0%) saturate(4223%) hue-rotate(289deg)
brightness(114%) contrast(76%);
--crate-search-div-hover-filter: invert(44%) sepia(18%) saturate(23%) hue-rotate(317deg)
brightness(96%) contrast(93%);
--crate-search-hover-border: #717171;
--src-sidebar-background-selected: #fff;
--src-sidebar-background-hover: #e0e0e0;
--table-alt-row-background-color: #f5f5f5;
--codeblock-link-background: #eee;
--scrape-example-toggle-line-background: #ccc;
--scrape-example-toggle-line-hover-background: #999;
--scrape-example-code-line-highlight: #fcffd6;
--scrape-example-code-line-highlight-focus: #f6fdb0;
--scrape-example-help-border-color: #555;
--scrape-example-help-color: #333;
--scrape-example-help-hover-border-color: #000;
--scrape-example-help-hover-color: #000;
--scrape-example-code-wrapper-background-start: rgba(255, 255, 255, 1);
--scrape-example-code-wrapper-background-end: rgba(255, 255, 255, 0);
}
/* End theme: light */
@media (prefers-color-scheme: dark) {
/* Begin theme: dark */
:root {
--main-background-color: #353535;
--main-color: #ddd;
--settings-input-color: #2196f3;
--settings-input-border-color: #999;
--settings-button-color: #000;
--settings-button-border-focus: #ffb900;
--sidebar-background-color: #505050;
--sidebar-background-color-hover: #676767;
--code-block-background-color: #2A2A2A;
--scrollbar-track-background-color: #717171;
--scrollbar-thumb-background-color: rgba(32, 34, 37, .6);
--scrollbar-color: rgba(32,34,37,.6) #5a5a5a;
--headings-border-bottom-color: #d2d2d2;
--border-color: #e0e0e0;
--button-background-color: #f0f0f0;
--right-side-color: grey;
--code-attribute-color: #999;
--toggles-color: #999;
--toggle-filter: invert(100%);
--search-input-focused-border-color: #008dfd;
--copy-path-button-color: #999;
--copy-path-img-filter: invert(50%);
--copy-path-img-hover-filter: invert(65%);
--codeblock-error-hover-color: rgb(255, 0, 0);
--codeblock-error-color: rgba(255, 0, 0, .5);
--codeblock-ignore-hover-color: rgb(255, 142, 0);
--codeblock-ignore-color: rgba(255, 142, 0, .6);
--warning-border-color: #ff8e00;
--type-link-color: #2dbfb8;
--trait-link-color: #b78cf2;
--assoc-item-link-color: #d2991d;
--function-link-color: #2bab63;
--macro-link-color: #09bd00;
--keyword-link-color: #d2991d;
--mod-link-color: #d2991d;
--link-color: #d2991d;
--sidebar-link-color: #fdbf35;
--sidebar-current-link-background-color: #444;
--search-result-link-focus-background-color: #616161;
--search-result-border-color: #aaa3;
--search-color: #111;
--search-error-code-background-color: #484848;
--search-results-alias-color: #fff;
--search-results-grey-color: #ccc;
--search-tab-title-count-color: #888;
--search-tab-button-not-selected-border-top-color: #252525;
--search-tab-button-not-selected-background: #252525;
--search-tab-button-selected-border-top-color: #0089ff;
--search-tab-button-selected-background: #353535;
--stab-background-color: #314559;
--stab-code-color: #e6e1cf;
--code-highlight-kw-color: #ab8ac1;
--code-highlight-kw-2-color: #769acb;
--code-highlight-lifetime-color: #d97f26;
--code-highlight-prelude-color: #769acb;
--code-highlight-prelude-val-color: #ee6868;
--code-highlight-number-color: #83a300;
--code-highlight-string-color: #83a300;
--code-highlight-literal-color: #ee6868;
--code-highlight-attribute-color: #ee6868;
--code-highlight-self-color: #ee6868;
--code-highlight-macro-color: #3e999f;
--code-highlight-question-mark-color: #ff9011;
--code-highlight-comment-color: #8d8d8b;
--code-highlight-doc-comment-color: #8ca375;
--src-line-numbers-span-color: #3b91e2;
--src-line-number-highlighted-background-color: #0a042f;
--test-arrow-color: #dedede;
--test-arrow-background-color: rgba(78, 139, 202, 0.2);
--test-arrow-hover-color: #dedede;
--test-arrow-hover-background-color: #4e8bca;
--target-background-color: #494a3d;
--target-border-color: #bb7410;
--kbd-color: #000;
--kbd-background: #fafbfc;
--kbd-box-shadow-color: #c6cbd1;
--rust-logo-filter: drop-shadow(1px 0 0px #fff)
drop-shadow(0 1px 0 #fff)
drop-shadow(-1px 0 0 #fff)
drop-shadow(0 -1px 0 #fff);
/* match border-color; uses https://codepen.io/sosuke/pen/Pjoqqp */
--crate-search-div-filter: invert(94%) sepia(0%) saturate(721%) hue-rotate(255deg)
brightness(90%) contrast(90%);
--crate-search-div-hover-filter: invert(69%) sepia(60%) saturate(6613%) hue-rotate(184deg)
brightness(100%) contrast(91%);
--crate-search-hover-border: #2196f3;
--src-sidebar-background-selected: #333;
--src-sidebar-background-hover: #444;
--table-alt-row-background-color: #2a2a2a;
--codeblock-link-background: #333;
--scrape-example-toggle-line-background: #999;
--scrape-example-toggle-line-hover-background: #c5c5c5;
--scrape-example-code-line-highlight: #5b3b01;
--scrape-example-code-line-highlight-focus: #7c4b0f;
--scrape-example-help-border-color: #aaa;
--scrape-example-help-color: #eee;
--scrape-example-help-hover-border-color: #fff;
--scrape-example-help-hover-color: #fff;
--scrape-example-code-wrapper-background-start: rgba(53, 53, 53, 1);
--scrape-example-code-wrapper-background-end: rgba(53, 53, 53, 0);
}
/* End theme: dark */
}

View file

@ -2098,3 +2098,413 @@ in src-script.js
} }
/* End: styles for --scrape-examples feature */ /* End: styles for --scrape-examples feature */
/* Begin: styles for themes
Keep the default light and dark themes synchronized with the ones
in noscript.css
The special "Begin theme" and "End theme" below are used by a lot of
tooling to ensure different themes all define all the variables. Do not
alter their formatting. */
/* Begin theme: light */
:root[data-theme="light"] {
--main-background-color: white;
--main-color: black;
--settings-input-color: #2196f3;
--settings-input-border-color: #717171;
--settings-button-color: #000;
--settings-button-border-focus: #717171;
--sidebar-background-color: #f5f5f5;
--sidebar-background-color-hover: #e0e0e0;
--code-block-background-color: #f5f5f5;
--scrollbar-track-background-color: #dcdcdc;
--scrollbar-thumb-background-color: rgba(36, 37, 39, 0.6);
--scrollbar-color: rgba(36, 37, 39, 0.6) #d9d9d9;
--headings-border-bottom-color: #ddd;
--border-color: #e0e0e0;
--button-background-color: #fff;
--right-side-color: grey;
--code-attribute-color: #999;
--toggles-color: #999;
--toggle-filter: none;
--search-input-focused-border-color: #66afe9;
--copy-path-button-color: #999;
--copy-path-img-filter: invert(50%);
--copy-path-img-hover-filter: invert(35%);
--codeblock-error-hover-color: rgb(255, 0, 0);
--codeblock-error-color: rgba(255, 0, 0, .5);
--codeblock-ignore-hover-color: rgb(255, 142, 0);
--codeblock-ignore-color: rgba(255, 142, 0, .6);
--warning-border-color: #ff8e00;
--type-link-color: #ad378a;
--trait-link-color: #6e4fc9;
--assoc-item-link-color: #3873ad;
--function-link-color: #ad7c37;
--macro-link-color: #068000;
--keyword-link-color: #3873ad;
--mod-link-color: #3873ad;
--link-color: #3873ad;
--sidebar-link-color: #356da4;
--sidebar-current-link-background-color: #fff;
--search-result-link-focus-background-color: #ccc;
--search-result-border-color: #aaa3;
--search-color: #000;
--search-error-code-background-color: #d0cccc;
--search-results-alias-color: #000;
--search-results-grey-color: #999;
--search-tab-title-count-color: #888;
--search-tab-button-not-selected-border-top-color: #e6e6e6;
--search-tab-button-not-selected-background: #e6e6e6;
--search-tab-button-selected-border-top-color: #0089ff;
--search-tab-button-selected-background: #fff;
--stab-background-color: #fff5d6;
--stab-code-color: #000;
--code-highlight-kw-color: #8959a8;
--code-highlight-kw-2-color: #4271ae;
--code-highlight-lifetime-color: #b76514;
--code-highlight-prelude-color: #4271ae;
--code-highlight-prelude-val-color: #c82829;
--code-highlight-number-color: #718c00;
--code-highlight-string-color: #718c00;
--code-highlight-literal-color: #c82829;
--code-highlight-attribute-color: #c82829;
--code-highlight-self-color: #c82829;
--code-highlight-macro-color: #3e999f;
--code-highlight-question-mark-color: #ff9011;
--code-highlight-comment-color: #8e908c;
--code-highlight-doc-comment-color: #4d4d4c;
--src-line-numbers-span-color: #c67e2d;
--src-line-number-highlighted-background-color: #fdffd3;
--test-arrow-color: #f5f5f5;
--test-arrow-background-color: rgba(78, 139, 202, 0.2);
--test-arrow-hover-color: #f5f5f5;
--test-arrow-hover-background-color: rgb(78, 139, 202);
--target-background-color: #fdffd3;
--target-border-color: #ad7c37;
--kbd-color: #000;
--kbd-background: #fafbfc;
--kbd-box-shadow-color: #c6cbd1;
--rust-logo-filter: initial;
/* match border-color; uses https://codepen.io/sosuke/pen/Pjoqqp */
--crate-search-div-filter: invert(100%) sepia(0%) saturate(4223%) hue-rotate(289deg)
brightness(114%) contrast(76%);
--crate-search-div-hover-filter: invert(44%) sepia(18%) saturate(23%) hue-rotate(317deg)
brightness(96%) contrast(93%);
--crate-search-hover-border: #717171;
--src-sidebar-background-selected: #fff;
--src-sidebar-background-hover: #e0e0e0;
--table-alt-row-background-color: #f5f5f5;
--codeblock-link-background: #eee;
--scrape-example-toggle-line-background: #ccc;
--scrape-example-toggle-line-hover-background: #999;
--scrape-example-code-line-highlight: #fcffd6;
--scrape-example-code-line-highlight-focus: #f6fdb0;
--scrape-example-help-border-color: #555;
--scrape-example-help-color: #333;
--scrape-example-help-hover-border-color: #000;
--scrape-example-help-hover-color: #000;
--scrape-example-code-wrapper-background-start: rgba(255, 255, 255, 1);
--scrape-example-code-wrapper-background-end: rgba(255, 255, 255, 0);
}
/* End theme: light */
/* Begin theme: dark */
:root[data-theme="dark"] {
--main-background-color: #353535;
--main-color: #ddd;
--settings-input-color: #2196f3;
--settings-input-border-color: #999;
--settings-button-color: #000;
--settings-button-border-focus: #ffb900;
--sidebar-background-color: #505050;
--sidebar-background-color-hover: #676767;
--code-block-background-color: #2A2A2A;
--scrollbar-track-background-color: #717171;
--scrollbar-thumb-background-color: rgba(32, 34, 37, .6);
--scrollbar-color: rgba(32,34,37,.6) #5a5a5a;
--headings-border-bottom-color: #d2d2d2;
--border-color: #e0e0e0;
--button-background-color: #f0f0f0;
--right-side-color: grey;
--code-attribute-color: #999;
--toggles-color: #999;
--toggle-filter: invert(100%);
--search-input-focused-border-color: #008dfd;
--copy-path-button-color: #999;
--copy-path-img-filter: invert(50%);
--copy-path-img-hover-filter: invert(65%);
--codeblock-error-hover-color: rgb(255, 0, 0);
--codeblock-error-color: rgba(255, 0, 0, .5);
--codeblock-ignore-hover-color: rgb(255, 142, 0);
--codeblock-ignore-color: rgba(255, 142, 0, .6);
--warning-border-color: #ff8e00;
--type-link-color: #2dbfb8;
--trait-link-color: #b78cf2;
--assoc-item-link-color: #d2991d;
--function-link-color: #2bab63;
--macro-link-color: #09bd00;
--keyword-link-color: #d2991d;
--mod-link-color: #d2991d;
--link-color: #d2991d;
--sidebar-link-color: #fdbf35;
--sidebar-current-link-background-color: #444;
--search-result-link-focus-background-color: #616161;
--search-result-border-color: #aaa3;
--search-color: #111;
--search-error-code-background-color: #484848;
--search-results-alias-color: #fff;
--search-results-grey-color: #ccc;
--search-tab-title-count-color: #888;
--search-tab-button-not-selected-border-top-color: #252525;
--search-tab-button-not-selected-background: #252525;
--search-tab-button-selected-border-top-color: #0089ff;
--search-tab-button-selected-background: #353535;
--stab-background-color: #314559;
--stab-code-color: #e6e1cf;
--code-highlight-kw-color: #ab8ac1;
--code-highlight-kw-2-color: #769acb;
--code-highlight-lifetime-color: #d97f26;
--code-highlight-prelude-color: #769acb;
--code-highlight-prelude-val-color: #ee6868;
--code-highlight-number-color: #83a300;
--code-highlight-string-color: #83a300;
--code-highlight-literal-color: #ee6868;
--code-highlight-attribute-color: #ee6868;
--code-highlight-self-color: #ee6868;
--code-highlight-macro-color: #3e999f;
--code-highlight-question-mark-color: #ff9011;
--code-highlight-comment-color: #8d8d8b;
--code-highlight-doc-comment-color: #8ca375;
--src-line-numbers-span-color: #3b91e2;
--src-line-number-highlighted-background-color: #0a042f;
--test-arrow-color: #dedede;
--test-arrow-background-color: rgba(78, 139, 202, 0.2);
--test-arrow-hover-color: #dedede;
--test-arrow-hover-background-color: #4e8bca;
--target-background-color: #494a3d;
--target-border-color: #bb7410;
--kbd-color: #000;
--kbd-background: #fafbfc;
--kbd-box-shadow-color: #c6cbd1;
--rust-logo-filter: drop-shadow(1px 0 0px #fff)
drop-shadow(0 1px 0 #fff)
drop-shadow(-1px 0 0 #fff)
drop-shadow(0 -1px 0 #fff);
/* match border-color; uses https://codepen.io/sosuke/pen/Pjoqqp */
--crate-search-div-filter: invert(94%) sepia(0%) saturate(721%) hue-rotate(255deg)
brightness(90%) contrast(90%);
--crate-search-div-hover-filter: invert(69%) sepia(60%) saturate(6613%) hue-rotate(184deg)
brightness(100%) contrast(91%);
--crate-search-hover-border: #2196f3;
--src-sidebar-background-selected: #333;
--src-sidebar-background-hover: #444;
--table-alt-row-background-color: #2a2a2a;
--codeblock-link-background: #333;
--scrape-example-toggle-line-background: #999;
--scrape-example-toggle-line-hover-background: #c5c5c5;
--scrape-example-code-line-highlight: #5b3b01;
--scrape-example-code-line-highlight-focus: #7c4b0f;
--scrape-example-help-border-color: #aaa;
--scrape-example-help-color: #eee;
--scrape-example-help-hover-border-color: #fff;
--scrape-example-help-hover-color: #fff;
--scrape-example-code-wrapper-background-start: rgba(53, 53, 53, 1);
--scrape-example-code-wrapper-background-end: rgba(53, 53, 53, 0);
}
/* End theme: dark */
/* Begin theme: ayu */
/*
Based off of the Ayu theme
Original by Dempfi (https://github.com/dempfi/ayu)
*/
:root[data-theme="ayu"] {
--main-background-color: #0f1419;
--main-color: #c5c5c5;
--settings-input-color: #ffb454;
--settings-input-border-color: #999;
--settings-button-color: #fff;
--settings-button-border-focus: #e0e0e0;
--sidebar-background-color: #14191f;
--sidebar-background-color-hover: rgba(70, 70, 70, 0.33);
--code-block-background-color: #191f26;
--scrollbar-track-background-color: transparent;
--scrollbar-thumb-background-color: #5c6773;
--scrollbar-color: #5c6773 #24292f;
--headings-border-bottom-color: #5c6773;
--border-color: #5c6773;
--button-background-color: #141920;
--right-side-color: grey;
--code-attribute-color: #999;
--toggles-color: #999;
--toggle-filter: invert(100%);
--search-input-focused-border-color: #5c6773; /* Same as `--border-color`. */
--copy-path-button-color: #fff;
--copy-path-img-filter: invert(70%);
--copy-path-img-hover-filter: invert(100%);
--codeblock-error-hover-color: rgb(255, 0, 0);
--codeblock-error-color: rgba(255, 0, 0, .5);
--codeblock-ignore-hover-color: rgb(255, 142, 0);
--codeblock-ignore-color: rgba(255, 142, 0, .6);
--warning-border-color: #ff8e00;
--type-link-color: #ffa0a5;
--trait-link-color: #39afd7;
--assoc-item-link-color: #39afd7;
--function-link-color: #fdd687;
--macro-link-color: #a37acc;
--keyword-link-color: #39afd7;
--mod-link-color: #39afd7;
--link-color: #39afd7;
--sidebar-link-color: #53b1db;
--sidebar-current-link-background-color: transparent;
--search-result-link-focus-background-color: #3c3c3c;
--search-result-border-color: #aaa3;
--search-color: #fff;
--search-error-code-background-color: #4f4c4c;
--search-results-alias-color: #c5c5c5;
--search-results-grey-color: #999;
--search-tab-title-count-color: #888;
--search-tab-button-not-selected-border-top-color: none;
--search-tab-button-not-selected-background: transparent !important;
--search-tab-button-selected-border-top-color: none;
--search-tab-button-selected-background: #141920 !important;
--stab-background-color: #314559;
--stab-code-color: #e6e1cf;
--code-highlight-kw-color: #ff7733;
--code-highlight-kw-2-color: #ff7733;
--code-highlight-lifetime-color: #ff7733;
--code-highlight-prelude-color: #69f2df;
--code-highlight-prelude-val-color: #ff7733;
--code-highlight-number-color: #b8cc52;
--code-highlight-string-color: #b8cc52;
--code-highlight-literal-color: #ff7733;
--code-highlight-attribute-color: #e6e1cf;
--code-highlight-self-color: #36a3d9;
--code-highlight-macro-color: #a37acc;
--code-highlight-question-mark-color: #ff9011;
--code-highlight-comment-color: #788797;
--code-highlight-doc-comment-color: #a1ac88;
--src-line-numbers-span-color: #5c6773;
--src-line-number-highlighted-background-color: rgba(255, 236, 164, 0.06);
--test-arrow-color: #788797;
--test-arrow-background-color: rgba(57, 175, 215, 0.09);
--test-arrow-hover-color: #c5c5c5;
--test-arrow-hover-background-color: rgba(57, 175, 215, 0.368);
--target-background-color: rgba(255, 236, 164, 0.06);
--target-border-color: rgba(255, 180, 76, 0.85);
--kbd-color: #c5c5c5;
--kbd-background: #314559;
--kbd-box-shadow-color: #5c6773;
--rust-logo-filter: drop-shadow(1px 0 0px #fff)
drop-shadow(0 1px 0 #fff)
drop-shadow(-1px 0 0 #fff)
drop-shadow(0 -1px 0 #fff);
/* match border-color; uses https://codepen.io/sosuke/pen/Pjoqqp */
--crate-search-div-filter: invert(41%) sepia(12%) saturate(487%) hue-rotate(171deg)
brightness(94%) contrast(94%);
--crate-search-div-hover-filter: invert(98%) sepia(12%) saturate(81%) hue-rotate(343deg)
brightness(113%) contrast(76%);
--crate-search-hover-border: #e0e0e0;
--src-sidebar-background-selected: #14191f;
--src-sidebar-background-hover: #14191f;
--table-alt-row-background-color: #191f26;
--codeblock-link-background: #333;
--scrape-example-toggle-line-background: #999;
--scrape-example-toggle-line-hover-background: #c5c5c5;
--scrape-example-code-line-highlight: #5b3b01;
--scrape-example-code-line-highlight-focus: #7c4b0f;
--scrape-example-help-border-color: #aaa;
--scrape-example-help-color: #eee;
--scrape-example-help-hover-border-color: #fff;
--scrape-example-help-hover-color: #fff;
--scrape-example-code-wrapper-background-start: rgba(15, 20, 25, 1);
--scrape-example-code-wrapper-background-end: rgba(15, 20, 25, 0);
}
:root[data-theme="ayu"] h1,
:root[data-theme="ayu"] h2,
:root[data-theme="ayu"] h3,
:root[data-theme="ayu"] h4,
:where(:root[data-theme="ayu"]) h1 a,
:root[data-theme="ayu"] .sidebar h2 a,
:root[data-theme="ayu"] .sidebar h3 a,
:root[data-theme="ayu"] #source-sidebar > .title {
color: #fff;
}
:root[data-theme="ayu"] .docblock code {
color: #ffb454;
}
:root[data-theme="ayu"] .docblock a > code {
color: #39AFD7 !important;
}
:root[data-theme="ayu"] .code-header,
:root[data-theme="ayu"] .docblock pre > code,
:root[data-theme="ayu"] pre,
:root[data-theme="ayu"] pre > code,
:root[data-theme="ayu"] .item-info code,
:root[data-theme="ayu"] .rustdoc.source .example-wrap {
color: #e6e1cf;
}
:root[data-theme="ayu"] .sidebar .current,
:root[data-theme="ayu"] .sidebar a:hover,
:root[data-theme="ayu"] #src-sidebar div.files > a:hover,
:root[data-theme="ayu"] details.dir-entry summary:hover,
:root[data-theme="ayu"] #src-sidebar div.files > a:focus,
:root[data-theme="ayu"] details.dir-entry summary:focus,
:root[data-theme="ayu"] #src-sidebar div.files > a.selected {
color: #ffb44c;
}
:root[data-theme="ayu"] .sidebar-elems .location {
color: #ff7733;
}
:root[data-theme="ayu"] .src-line-numbers .line-highlighted {
color: #708090;
padding-right: 7px;
border-right: 1px solid #ffb44c;
}
:root[data-theme="ayu"] .search-results a:hover,
:root[data-theme="ayu"] .search-results a:focus {
color: #fff !important;
background-color: #3c3c3c;
}
:root[data-theme="ayu"] .search-results a {
color: #0096cf;
}
:root[data-theme="ayu"] .search-results a div.desc {
color: #c5c5c5;
}
:root[data-theme="ayu"] .result-name .primitive > i,
:root[data-theme="ayu"] .result-name .keyword > i {
color: #788797;
}
:root[data-theme="ayu"] #search-tabs > button.selected {
border-bottom: 1px solid #ffb44c !important;
border-top: none;
}
:root[data-theme="ayu"] #search-tabs > button:not(.selected) {
border: none;
background-color: transparent !important;
}
:root[data-theme="ayu"] #search-tabs > button:hover {
border-bottom: 1px solid rgba(242, 151, 24, 0.3);
}
:root[data-theme="ayu"] #settings-menu > a img {
filter: invert(100);
}
/* End theme: ayu */
/* End: styles for themes */

View file

@ -1,181 +0,0 @@
/*
Based off of the Ayu theme
Original by Dempfi (https://github.com/dempfi/ayu)
*/
:root {
--main-background-color: #0f1419;
--main-color: #c5c5c5;
--settings-input-color: #ffb454;
--settings-input-border-color: #999;
--settings-button-color: #fff;
--settings-button-border-focus: #e0e0e0;
--sidebar-background-color: #14191f;
--sidebar-background-color-hover: rgba(70, 70, 70, 0.33);
--code-block-background-color: #191f26;
--scrollbar-track-background-color: transparent;
--scrollbar-thumb-background-color: #5c6773;
--scrollbar-color: #5c6773 #24292f;
--headings-border-bottom-color: #5c6773;
--border-color: #5c6773;
--button-background-color: #141920;
--right-side-color: grey;
--code-attribute-color: #999;
--toggles-color: #999;
--toggle-filter: invert(100%);
--search-input-focused-border-color: #5c6773; /* Same as `--border-color`. */
--copy-path-button-color: #fff;
--copy-path-img-filter: invert(70%);
--copy-path-img-hover-filter: invert(100%);
--codeblock-error-hover-color: rgb(255, 0, 0);
--codeblock-error-color: rgba(255, 0, 0, .5);
--codeblock-ignore-hover-color: rgb(255, 142, 0);
--codeblock-ignore-color: rgba(255, 142, 0, .6);
--warning-border-color: #ff8e00;
--type-link-color: #ffa0a5;
--trait-link-color: #39afd7;
--assoc-item-link-color: #39afd7;
--function-link-color: #fdd687;
--macro-link-color: #a37acc;
--keyword-link-color: #39afd7;
--mod-link-color: #39afd7;
--link-color: #39afd7;
--sidebar-link-color: #53b1db;
--sidebar-current-link-background-color: transparent;
--search-result-link-focus-background-color: #3c3c3c;
--search-result-border-color: #aaa3;
--search-color: #fff;
--search-error-code-background-color: #4f4c4c;
--search-results-alias-color: #c5c5c5;
--search-results-grey-color: #999;
--search-tab-title-count-color: #888;
--search-tab-button-not-selected-border-top-color: none;
--search-tab-button-not-selected-background: transparent !important;
--search-tab-button-selected-border-top-color: none;
--search-tab-button-selected-background: #141920 !important;
--stab-background-color: #314559;
--stab-code-color: #e6e1cf;
--code-highlight-kw-color: #ff7733;
--code-highlight-kw-2-color: #ff7733;
--code-highlight-lifetime-color: #ff7733;
--code-highlight-prelude-color: #69f2df;
--code-highlight-prelude-val-color: #ff7733;
--code-highlight-number-color: #b8cc52;
--code-highlight-string-color: #b8cc52;
--code-highlight-literal-color: #ff7733;
--code-highlight-attribute-color: #e6e1cf;
--code-highlight-self-color: #36a3d9;
--code-highlight-macro-color: #a37acc;
--code-highlight-question-mark-color: #ff9011;
--code-highlight-comment-color: #788797;
--code-highlight-doc-comment-color: #a1ac88;
--src-line-numbers-span-color: #5c6773;
--src-line-number-highlighted-background-color: rgba(255, 236, 164, 0.06);
--test-arrow-color: #788797;
--test-arrow-background-color: rgba(57, 175, 215, 0.09);
--test-arrow-hover-color: #c5c5c5;
--test-arrow-hover-background-color: rgba(57, 175, 215, 0.368);
--target-background-color: rgba(255, 236, 164, 0.06);
--target-border-color: rgba(255, 180, 76, 0.85);
--kbd-color: #c5c5c5;
--kbd-background: #314559;
--kbd-box-shadow-color: #5c6773;
--rust-logo-filter: drop-shadow(1px 0 0px #fff)
drop-shadow(0 1px 0 #fff)
drop-shadow(-1px 0 0 #fff)
drop-shadow(0 -1px 0 #fff);
/* match border-color; uses https://codepen.io/sosuke/pen/Pjoqqp */
--crate-search-div-filter: invert(41%) sepia(12%) saturate(487%) hue-rotate(171deg)
brightness(94%) contrast(94%);
--crate-search-div-hover-filter: invert(98%) sepia(12%) saturate(81%) hue-rotate(343deg)
brightness(113%) contrast(76%);
--crate-search-hover-border: #e0e0e0;
--src-sidebar-background-selected: #14191f;
--src-sidebar-background-hover: #14191f;
--table-alt-row-background-color: #191f26;
--codeblock-link-background: #333;
--scrape-example-toggle-line-background: #999;
--scrape-example-toggle-line-hover-background: #c5c5c5;
--scrape-example-code-line-highlight: #5b3b01;
--scrape-example-code-line-highlight-focus: #7c4b0f;
--scrape-example-help-border-color: #aaa;
--scrape-example-help-color: #eee;
--scrape-example-help-hover-border-color: #fff;
--scrape-example-help-hover-color: #fff;
--scrape-example-code-wrapper-background-start: rgba(15, 20, 25, 1);
--scrape-example-code-wrapper-background-end: rgba(15, 20, 25, 0);
}
h1, h2, h3, h4,
h1 a, .sidebar h2 a, .sidebar h3 a,
#src-sidebar > .title {
color: #fff;
}
h4 {
border: none;
}
.docblock code {
color: #ffb454;
}
.docblock a > code {
color: #39AFD7 !important;
}
.code-header,
.docblock pre > code,
pre, pre > code,
.item-info code,
.rustdoc.src .example-wrap {
color: #e6e1cf;
}
.sidebar .current,
.sidebar a:hover,
#src-sidebar div.files > a:hover, details.dir-entry summary:hover,
#src-sidebar div.files > a:focus, details.dir-entry summary:focus,
#src-sidebar div.files > a.selected {
color: #ffb44c;
}
.sidebar-elems .location {
color: #ff7733;
}
.src-line-numbers .line-highlighted {
color: #708090;
padding-right: 7px;
border-right: 1px solid #ffb44c;
}
.search-results a:hover,
.search-results a:focus {
color: #fff !important;
background-color: #3c3c3c;
}
.search-results a {
color: #0096cf;
}
.search-results a div.desc {
color: #c5c5c5;
}
.result-name .primitive > i, .result-name .keyword > i {
color: #788797;
}
#search-tabs > button.selected {
border-bottom: 1px solid #ffb44c !important;
border-top: none;
}
#search-tabs > button:not(.selected) {
border: none;
background-color: transparent !important;
}
#search-tabs > button:hover {
border-bottom: 1px solid rgba(242, 151, 24, 0.3);
}
#settings-menu > a img {
filter: invert(100);
}

View file

@ -1,102 +0,0 @@
:root {
--main-background-color: #353535;
--main-color: #ddd;
--settings-input-color: #2196f3;
--settings-input-border-color: #999;
--settings-button-color: #000;
--settings-button-border-focus: #ffb900;
--sidebar-background-color: #505050;
--sidebar-background-color-hover: #676767;
--code-block-background-color: #2A2A2A;
--scrollbar-track-background-color: #717171;
--scrollbar-thumb-background-color: rgba(32, 34, 37, .6);
--scrollbar-color: rgba(32,34,37,.6) #5a5a5a;
--headings-border-bottom-color: #d2d2d2;
--border-color: #e0e0e0;
--button-background-color: #f0f0f0;
--right-side-color: grey;
--code-attribute-color: #999;
--toggles-color: #999;
--toggle-filter: invert(100%);
--search-input-focused-border-color: #008dfd;
--copy-path-button-color: #999;
--copy-path-img-filter: invert(50%);
--copy-path-img-hover-filter: invert(65%);
--codeblock-error-hover-color: rgb(255, 0, 0);
--codeblock-error-color: rgba(255, 0, 0, .5);
--codeblock-ignore-hover-color: rgb(255, 142, 0);
--codeblock-ignore-color: rgba(255, 142, 0, .6);
--warning-border-color: #ff8e00;
--type-link-color: #2dbfb8;
--trait-link-color: #b78cf2;
--assoc-item-link-color: #d2991d;
--function-link-color: #2bab63;
--macro-link-color: #09bd00;
--keyword-link-color: #d2991d;
--mod-link-color: #d2991d;
--link-color: #d2991d;
--sidebar-link-color: #fdbf35;
--sidebar-current-link-background-color: #444;
--search-result-link-focus-background-color: #616161;
--search-result-border-color: #aaa3;
--search-color: #111;
--search-error-code-background-color: #484848;
--search-results-alias-color: #fff;
--search-results-grey-color: #ccc;
--search-tab-title-count-color: #888;
--search-tab-button-not-selected-border-top-color: #252525;
--search-tab-button-not-selected-background: #252525;
--search-tab-button-selected-border-top-color: #0089ff;
--search-tab-button-selected-background: #353535;
--stab-background-color: #314559;
--stab-code-color: #e6e1cf;
--code-highlight-kw-color: #ab8ac1;
--code-highlight-kw-2-color: #769acb;
--code-highlight-lifetime-color: #d97f26;
--code-highlight-prelude-color: #769acb;
--code-highlight-prelude-val-color: #ee6868;
--code-highlight-number-color: #83a300;
--code-highlight-string-color: #83a300;
--code-highlight-literal-color: #ee6868;
--code-highlight-attribute-color: #ee6868;
--code-highlight-self-color: #ee6868;
--code-highlight-macro-color: #3e999f;
--code-highlight-question-mark-color: #ff9011;
--code-highlight-comment-color: #8d8d8b;
--code-highlight-doc-comment-color: #8ca375;
--src-line-numbers-span-color: #3b91e2;
--src-line-number-highlighted-background-color: #0a042f;
--test-arrow-color: #dedede;
--test-arrow-background-color: rgba(78, 139, 202, 0.2);
--test-arrow-hover-color: #dedede;
--test-arrow-hover-background-color: #4e8bca;
--target-background-color: #494a3d;
--target-border-color: #bb7410;
--kbd-color: #000;
--kbd-background: #fafbfc;
--kbd-box-shadow-color: #c6cbd1;
--rust-logo-filter: drop-shadow(1px 0 0px #fff)
drop-shadow(0 1px 0 #fff)
drop-shadow(-1px 0 0 #fff)
drop-shadow(0 -1px 0 #fff);
/* match border-color; uses https://codepen.io/sosuke/pen/Pjoqqp */
--crate-search-div-filter: invert(94%) sepia(0%) saturate(721%) hue-rotate(255deg)
brightness(90%) contrast(90%);
--crate-search-div-hover-filter: invert(69%) sepia(60%) saturate(6613%) hue-rotate(184deg)
brightness(100%) contrast(91%);
--crate-search-hover-border: #2196f3;
--src-sidebar-background-selected: #333;
--src-sidebar-background-hover: #444;
--table-alt-row-background-color: #2a2a2a;
--codeblock-link-background: #333;
--scrape-example-toggle-line-background: #999;
--scrape-example-toggle-line-hover-background: #c5c5c5;
--scrape-example-code-line-highlight: #5b3b01;
--scrape-example-code-line-highlight-focus: #7c4b0f;
--scrape-example-help-border-color: #aaa;
--scrape-example-help-color: #eee;
--scrape-example-help-hover-border-color: #fff;
--scrape-example-help-hover-color: #fff;
--scrape-example-code-wrapper-background-start: rgba(53, 53, 53, 1);
--scrape-example-code-wrapper-background-end: rgba(53, 53, 53, 0);
}

View file

@ -1,99 +0,0 @@
:root {
--main-background-color: white;
--main-color: black;
--settings-input-color: #2196f3;
--settings-input-border-color: #717171;
--settings-button-color: #000;
--settings-button-border-focus: #717171;
--sidebar-background-color: #f5f5f5;
--sidebar-background-color-hover: #e0e0e0;
--code-block-background-color: #f5f5f5;
--scrollbar-track-background-color: #dcdcdc;
--scrollbar-thumb-background-color: rgba(36, 37, 39, 0.6);
--scrollbar-color: rgba(36, 37, 39, 0.6) #d9d9d9;
--headings-border-bottom-color: #ddd;
--border-color: #e0e0e0;
--button-background-color: #fff;
--right-side-color: grey;
--code-attribute-color: #999;
--toggles-color: #999;
--toggle-filter: none;
--search-input-focused-border-color: #66afe9;
--copy-path-button-color: #999;
--copy-path-img-filter: invert(50%);
--copy-path-img-hover-filter: invert(35%);
--codeblock-error-hover-color: rgb(255, 0, 0);
--codeblock-error-color: rgba(255, 0, 0, .5);
--codeblock-ignore-hover-color: rgb(255, 142, 0);
--codeblock-ignore-color: rgba(255, 142, 0, .6);
--warning-border-color: #ff8e00;
--type-link-color: #ad378a;
--trait-link-color: #6e4fc9;
--assoc-item-link-color: #3873ad;
--function-link-color: #ad7c37;
--macro-link-color: #068000;
--keyword-link-color: #3873ad;
--mod-link-color: #3873ad;
--link-color: #3873ad;
--sidebar-link-color: #356da4;
--sidebar-current-link-background-color: #fff;
--search-result-link-focus-background-color: #ccc;
--search-result-border-color: #aaa3;
--search-color: #000;
--search-error-code-background-color: #d0cccc;
--search-results-alias-color: #000;
--search-results-grey-color: #999;
--search-tab-title-count-color: #888;
--search-tab-button-not-selected-border-top-color: #e6e6e6;
--search-tab-button-not-selected-background: #e6e6e6;
--search-tab-button-selected-border-top-color: #0089ff;
--search-tab-button-selected-background: #fff;
--stab-background-color: #fff5d6;
--stab-code-color: #000;
--code-highlight-kw-color: #8959a8;
--code-highlight-kw-2-color: #4271ae;
--code-highlight-lifetime-color: #b76514;
--code-highlight-prelude-color: #4271ae;
--code-highlight-prelude-val-color: #c82829;
--code-highlight-number-color: #718c00;
--code-highlight-string-color: #718c00;
--code-highlight-literal-color: #c82829;
--code-highlight-attribute-color: #c82829;
--code-highlight-self-color: #c82829;
--code-highlight-macro-color: #3e999f;
--code-highlight-question-mark-color: #ff9011;
--code-highlight-comment-color: #8e908c;
--code-highlight-doc-comment-color: #4d4d4c;
--src-line-numbers-span-color: #c67e2d;
--src-line-number-highlighted-background-color: #fdffd3;
--test-arrow-color: #f5f5f5;
--test-arrow-background-color: rgba(78, 139, 202, 0.2);
--test-arrow-hover-color: #f5f5f5;
--test-arrow-hover-background-color: rgb(78, 139, 202);
--target-background-color: #fdffd3;
--target-border-color: #ad7c37;
--kbd-color: #000;
--kbd-background: #fafbfc;
--kbd-box-shadow-color: #c6cbd1;
--rust-logo-filter: initial;
/* match border-color; uses https://codepen.io/sosuke/pen/Pjoqqp */
--crate-search-div-filter: invert(100%) sepia(0%) saturate(4223%) hue-rotate(289deg)
brightness(114%) contrast(76%);
--crate-search-div-hover-filter: invert(44%) sepia(18%) saturate(23%) hue-rotate(317deg)
brightness(96%) contrast(93%);
--crate-search-hover-border: #717171;
--src-sidebar-background-selected: #fff;
--src-sidebar-background-hover: #e0e0e0;
--table-alt-row-background-color: #f5f5f5;
--codeblock-link-background: #eee;
--scrape-example-toggle-line-background: #ccc;
--scrape-example-toggle-line-hover-background: #999;
--scrape-example-code-line-highlight: #fcffd6;
--scrape-example-code-line-highlight-focus: #f6fdb0;
--scrape-example-help-border-color: #555;
--scrape-example-help-color: #333;
--scrape-example-help-hover-border-color: #000;
--scrape-example-help-hover-color: #000;
--scrape-example-code-wrapper-background-start: rgba(255, 255, 255, 1);
--scrape-example-code-wrapper-background-end: rgba(255, 255, 255, 0);
}

View file

@ -204,9 +204,6 @@ function preLoadCss(cssUrl) {
// Sending request for the CSS and the JS files at the same time so it will // Sending request for the CSS and the JS files at the same time so it will
// hopefully be loaded when the JS will generate the settings content. // hopefully be loaded when the JS will generate the settings content.
loadScript(getVar("static-root-path") + getVar("settings-js")); loadScript(getVar("static-root-path") + getVar("settings-js"));
preLoadCss(getVar("static-root-path") + getVar("theme-light-css"));
preLoadCss(getVar("static-root-path") + getVar("theme-dark-css"));
preLoadCss(getVar("static-root-path") + getVar("theme-ayu-css"));
// Pre-load all theme CSS files, so that switching feels seamless. // Pre-load all theme CSS files, so that switching feels seamless.
// //
// When loading settings.html as a standalone page, the equivalent HTML is // When loading settings.html as a standalone page, the equivalent HTML is

View file

@ -5,6 +5,7 @@
// the page, so we don't see major layout changes during the load of the page. // the page, so we don't see major layout changes during the load of the page.
"use strict"; "use strict";
const builtinThemes = ["light", "dark", "ayu"];
const darkThemes = ["dark", "ayu"]; const darkThemes = ["dark", "ayu"];
window.currentTheme = document.getElementById("themeStyle"); window.currentTheme = document.getElementById("themeStyle");
@ -119,19 +120,22 @@ function switchTheme(newThemeName, saveTheme) {
updateLocalStorage("theme", newThemeName); updateLocalStorage("theme", newThemeName);
} }
let newHref; document.documentElement.setAttribute("data-theme", newThemeName);
if (newThemeName === "light" || newThemeName === "dark" || newThemeName === "ayu") { if (builtinThemes.indexOf(newThemeName) !== -1) {
newHref = getVar("static-root-path") + getVar("theme-" + newThemeName + "-css"); if (window.currentTheme) {
window.currentTheme.parentNode.removeChild(window.currentTheme);
window.currentTheme = null;
}
} else { } else {
newHref = getVar("root-path") + newThemeName + getVar("resource-suffix") + ".css"; const newHref = getVar("root-path") + newThemeName +
} getVar("resource-suffix") + ".css";
if (!window.currentTheme) {
if (!window.currentTheme) { document.write(`<link rel="stylesheet" id="themeStyle" href="${newHref}">`);
document.write(`<link rel="stylesheet" id="themeStyle" href="${newHref}">`); window.currentTheme = document.getElementById("themeStyle");
window.currentTheme = document.getElementById("themeStyle"); } else if (newHref !== window.currentTheme.href) {
} else if (newHref !== window.currentTheme.href) { window.currentTheme.href = newHref;
window.currentTheme.href = newHref; }
} }
} }

View file

@ -108,9 +108,6 @@ static_files! {
rust_favicon_svg => "static/images/favicon.svg", rust_favicon_svg => "static/images/favicon.svg",
rust_favicon_png_16 => "static/images/favicon-16x16.png", rust_favicon_png_16 => "static/images/favicon-16x16.png",
rust_favicon_png_32 => "static/images/favicon-32x32.png", rust_favicon_png_32 => "static/images/favicon-32x32.png",
theme_light_css => "static/css/themes/light.css",
theme_dark_css => "static/css/themes/dark.css",
theme_ayu_css => "static/css/themes/ayu.css",
fira_sans_regular => "static/fonts/FiraSans-Regular.woff2", fira_sans_regular => "static/fonts/FiraSans-Regular.woff2",
fira_sans_medium => "static/fonts/FiraSans-Medium.woff2", fira_sans_medium => "static/fonts/FiraSans-Medium.woff2",
fira_sans_license => "static/fonts/FiraSans-LICENSE.txt", fira_sans_license => "static/fonts/FiraSans-LICENSE.txt",

View file

@ -33,9 +33,6 @@
data-channel="{{rust_channel}}" {#+ #} data-channel="{{rust_channel}}" {#+ #}
data-search-js="{{files.search_js}}" {#+ #} data-search-js="{{files.search_js}}" {#+ #}
data-settings-js="{{files.settings_js}}" {#+ #} data-settings-js="{{files.settings_js}}" {#+ #}
data-theme-light-css="{{files.theme_light_css}}" {#+ #}
data-theme-dark-css="{{files.theme_dark_css}}" {#+ #}
data-theme-ayu-css="{{files.theme_ayu_css}}" {#+ #}
> {# #} > {# #}
<script src="{{static_root_path|safe}}{{files.storage_js}}"></script> {# #} <script src="{{static_root_path|safe}}{{files.storage_js}}"></script> {# #}
{% if page.css_class.contains("crate") %} {% if page.css_class.contains("crate") %}
@ -51,12 +48,6 @@
<script defer src="{{static_root_path|safe}}{{files.scrape_examples_js}}"></script> {# #} <script defer src="{{static_root_path|safe}}{{files.scrape_examples_js}}"></script> {# #}
{% endif %} {% endif %}
<noscript> {# #} <noscript> {# #}
<link rel="stylesheet" {#+ #}
media="(prefers-color-scheme:light)" {#+ #}
href="{{static_root_path|safe}}{{files.theme_light_css}}"> {# #}
<link rel="stylesheet" {#+ #}
media="(prefers-color-scheme:dark)" {#+ #}
href="{{static_root_path|safe}}{{files.theme_dark_css}}"> {# #}
<link rel="stylesheet" {#+ #} <link rel="stylesheet" {#+ #}
href="{{static_root_path|safe}}{{files.noscript_css}}"> {# #} href="{{static_root_path|safe}}{{files.noscript_css}}"> {# #}
</noscript> {# #} </noscript> {# #}

View file

@ -430,8 +430,8 @@ fn opts() -> Vec<RustcOptGroup> {
o.optopt( o.optopt(
"", "",
"resource-suffix", "resource-suffix",
"suffix to add to CSS and JavaScript files, e.g., \"light.css\" will become \ "suffix to add to CSS and JavaScript files, e.g., \"search-index.js\" will \
\"light-suffix.css\"", become \"search-index-suffix.js\"",
"PATH", "PATH",
) )
}), }),

View file

@ -185,6 +185,9 @@ pub(crate) fn parse_selectors(
while let Some(c) = iter.next() { while let Some(c) = iter.next() {
match c { match c {
'{' => { '{' => {
if selector.trim().starts_with(":root[data-theme") {
selector = String::from(":root");
}
let s = minifier::css::minify(selector.trim()).map(|s| s.to_string())?; let s = minifier::css::minify(selector.trim()).map(|s| s.to_string())?;
parse_rules(content, s, iter, paths)?; parse_rules(content, s, iter, paths)?;
selector.clear(); selector.clear();

View file

@ -100,7 +100,7 @@ fn check_invalid_css() {
#[test] #[test]
fn test_with_minification() { fn test_with_minification() {
let text = include_str!("../html/static/css/themes/dark.css"); let text = include_str!("../html/static/css/noscript.css");
let minified = minifier::css::minify(&text).expect("CSS minification failed").to_string(); let minified = minifier::css::minify(&text).expect("CSS minification failed").to_string();
let against = load_css_paths(text).unwrap(); let against = load_css_paths(text).unwrap();

View file

@ -1,25 +1,37 @@
use std::env::args; use std::env::args;
use std::fs::read_dir; use std::fs::File;
use std::io::{BufRead, BufReader, BufWriter, Write};
use std::path::Path; use std::path::Path;
use std::process::{exit, Command}; use std::process::{exit, Command};
const FILES_TO_IGNORE: &[&str] = &["light.css"]; fn get_themes<P: AsRef<Path>>(style_path: P) -> Vec<String> {
fn get_folders<P: AsRef<Path>>(folder_path: P) -> Vec<String> {
let mut ret = Vec::with_capacity(10); let mut ret = Vec::with_capacity(10);
for entry in read_dir(folder_path.as_ref()).expect("read_dir failed") { const BEGIN_THEME_MARKER: &'static str = "/* Begin theme: ";
let entry = entry.expect("Couldn't unwrap entry"); const END_THEME_MARKER: &'static str = "/* End theme: ";
let path = entry.path();
if !path.is_file() { let timestamp =
continue; std::time::SystemTime::UNIX_EPOCH.elapsed().expect("time is after UNIX epoch").as_millis();
let mut in_theme = None;
for line in BufReader::new(File::open(style_path).expect("read rustdoc.css failed")).lines() {
let line = line.expect("read line from rustdoc.css failed");
let line = line.trim();
if line.starts_with(BEGIN_THEME_MARKER) {
let theme_name = &line[BEGIN_THEME_MARKER.len()..].trim().trim_end_matches("*/").trim();
let filename = format!("build/tmp/rustdoc.bootstrap.{timestamp}.{theme_name}.css");
in_theme = Some(BufWriter::new(
File::create(&filename).expect("failed to create temporary test css file"),
));
ret.push(filename);
} }
let filename = path.file_name().expect("file_name failed"); if let Some(in_theme) = in_theme.as_mut() {
if FILES_TO_IGNORE.iter().any(|x| x == &filename) { in_theme.write_all(line.as_bytes()).expect("write to temporary test css file");
continue; in_theme.write_all(b"\n").expect("write to temporary test css file");
}
if line.starts_with(END_THEME_MARKER) {
in_theme = None;
} }
ret.push(format!("{}", path.display()));
} }
ret ret
} }
@ -32,10 +44,10 @@ fn main() {
exit(1); exit(1);
} }
let rustdoc_bin = &argv[1]; let rustdoc_bin = &argv[1];
let themes_folder = &argv[2]; let style_path = &argv[2];
let themes = get_folders(&themes_folder); let themes = get_themes(&style_path);
if themes.is_empty() { if themes.is_empty() {
eprintln!("No theme found in \"{}\"...", themes_folder); eprintln!("No themes found in \"{}\"...", style_path);
exit(1); exit(1);
} }
let arg_name = "--check-theme".to_owned(); let arg_name = "--check-theme".to_owned();

View file

@ -64,6 +64,7 @@ pub mod fluent_alphabetical;
pub mod mir_opt_tests; pub mod mir_opt_tests;
pub mod pal; pub mod pal;
pub mod primitive_docs; pub mod primitive_docs;
pub mod rustdoc_css_themes;
pub mod rustdoc_gui_tests; pub mod rustdoc_gui_tests;
pub mod style; pub mod style;
pub mod target_specific_tests; pub mod target_specific_tests;

View file

@ -104,6 +104,7 @@ fn main() {
check!(ui_tests, &tests_path); check!(ui_tests, &tests_path);
check!(mir_opt_tests, &tests_path, bless); check!(mir_opt_tests, &tests_path, bless);
check!(rustdoc_gui_tests, &tests_path); check!(rustdoc_gui_tests, &tests_path);
check!(rustdoc_css_themes, &librustdoc_path);
// Checks that only make sense for the compiler. // Checks that only make sense for the compiler.
check!(error_codes, &root_path, &[&compiler_path, &librustdoc_path], verbose); check!(error_codes, &root_path, &[&compiler_path, &librustdoc_path], verbose);

View file

@ -0,0 +1,99 @@
//! Tidy check to make sure light and dark themes are synchronized between
//! JS-controlled rustdoc.css and noscript.css
use std::path::Path;
pub fn check(librustdoc_path: &Path, bad: &mut bool) {
let rustdoc_css = "html/static/css/rustdoc.css";
let noscript_css = "html/static/css/noscript.css";
let rustdoc_css_contents = std::fs::read_to_string(librustdoc_path.join(rustdoc_css))
.unwrap_or_else(|e| panic!("failed to read librustdoc/{rustdoc_css}: {e}"));
let noscript_css_contents = std::fs::read_to_string(librustdoc_path.join(noscript_css))
.unwrap_or_else(|e| panic!("failed to read librustdoc/{noscript_css}: {e}"));
compare_themes_from_files(
"light",
rustdoc_css_contents.lines().enumerate().map(|(i, l)| (i + 1, l.trim())),
noscript_css_contents.lines().enumerate().map(|(i, l)| (i + 1, l.trim())),
bad,
);
compare_themes_from_files(
"dark",
rustdoc_css_contents.lines().enumerate(),
noscript_css_contents.lines().enumerate(),
bad,
);
}
fn compare_themes_from_files<'a>(
name: &str,
mut rustdoc_css_lines: impl Iterator<Item = (usize, &'a str)>,
mut noscript_css_lines: impl Iterator<Item = (usize, &'a str)>,
bad: &mut bool,
) {
let begin_theme_pat = format!("/* Begin theme: {name}");
let mut found_theme = None;
let mut found_theme_noscript = None;
while let Some((rustdoc_css_line_number, rustdoc_css_line)) = rustdoc_css_lines.next() {
if !rustdoc_css_line.starts_with(&begin_theme_pat) {
continue;
}
if let Some(found_theme) = found_theme {
tidy_error!(
bad,
"rustdoc.css contains two {name} themes on lines {rustdoc_css_line_number} and {found_theme}",
);
return;
}
found_theme = Some(rustdoc_css_line_number);
while let Some((noscript_css_line_number, noscript_css_line)) = noscript_css_lines.next() {
if !noscript_css_line.starts_with(&begin_theme_pat) {
continue;
}
if let Some(found_theme_noscript) = found_theme_noscript {
tidy_error!(
bad,
"noscript.css contains two {name} themes on lines {noscript_css_line_number} and {found_theme_noscript}",
);
return;
}
found_theme_noscript = Some(noscript_css_line_number);
compare_themes(name, &mut rustdoc_css_lines, &mut noscript_css_lines, bad);
}
}
}
fn compare_themes<'a>(
name: &str,
rustdoc_css_lines: impl Iterator<Item = (usize, &'a str)>,
noscript_css_lines: impl Iterator<Item = (usize, &'a str)>,
bad: &mut bool,
) {
let end_theme_pat = format!("/* End theme: {name}");
for (
(rustdoc_css_line_number, rustdoc_css_line),
(noscript_css_line_number, noscript_css_line),
) in rustdoc_css_lines.zip(noscript_css_lines)
{
if noscript_css_line.starts_with(":root {")
&& rustdoc_css_line.starts_with(&format!(r#":root[data-theme="{name}"] {{"#))
{
// selectors are different between rustdoc.css and noscript.css
// that's why they both exist: one uses JS, the other uses media queries
continue;
}
if noscript_css_line.starts_with(&end_theme_pat)
&& rustdoc_css_line.starts_with(&end_theme_pat)
{
break;
}
if rustdoc_css_line != noscript_css_line {
tidy_error!(
bad,
"noscript.css:{noscript_css_line_number} and rustdoc.css:{rustdoc_css_line_number} contain copies of {name} theme that are not the same",
);
eprintln!("- {noscript_css_line}");
eprintln!("+ {rustdoc_css_line}");
return;
}
}
}

View file

@ -100,7 +100,7 @@ Options:
check if given theme is valid check if given theme is valid
--resource-suffix PATH --resource-suffix PATH
suffix to add to CSS and JavaScript files, e.g., suffix to add to CSS and JavaScript files, e.g.,
"light.css" will become "light-suffix.css" "search-index.js" will become "search-index-suffix.js"
--edition EDITION --edition EDITION
edition to use when compiling rust code (default: edition to use when compiling rust code (default:
2015) 2015)

View file

@ -5,6 +5,7 @@ include ../tools.mk
OUTPUT_DIR := "$(TMPDIR)/rustdoc-themes" OUTPUT_DIR := "$(TMPDIR)/rustdoc-themes"
all: all:
cp $(S)/src/librustdoc/html/static/css/themes/light.css $(TMPDIR)/test.css awk '/Begin theme: light/ {in_theme=1;next} /End theme:/ {in_theme=0} { if (in_theme) print }' \
< '$(S)/src/librustdoc/html/static/css/noscript.css' > '$(TMPDIR)/test.css'
$(RUSTDOC) -o $(OUTPUT_DIR) foo.rs --theme $(TMPDIR)/test.css $(RUSTDOC) -o $(OUTPUT_DIR) foo.rs --theme $(TMPDIR)/test.css
$(HTMLDOCCK) $(OUTPUT_DIR) foo.rs $(HTMLDOCCK) $(OUTPUT_DIR) foo.rs