Commit graph

2226 commits

Author SHA1 Message Date
Yuki Okushi
fbcaf046cc
Rollup merge of #107477 - GuillaumeGomez:css-var, r=notriddle
Migrate last part of CSS themes to CSS variables

No changes in the output. This is already tested in `tests/rustdoc-gui/search-tab.goml` so no need to add a GUI test.

r? `@notriddle`
2023-01-31 11:46:25 +09:00
Yuki Okushi
b10e60170c
Rollup merge of #107476 - notriddle:notriddle/item-decl-3, r=GuillaumeGomez
rustdoc: remove unnecessary wrapper `div.item-decl` from HTML
2023-01-31 11:46:24 +09:00
Guillaume Gomez
e9f5630067 Migrate last part of CSS themes to CSS variables 2023-01-30 19:28:47 +01:00
Michael Howell
7080f80e8b rustdoc: remove unnecessary wrapper div.item-decl from HTML 2023-01-30 11:06:18 -07:00
Matthias Krüger
d1320a542f
Rollup merge of #107177 - thanatos:fix-doc-errant-light-theme, r=notriddle
Keep all theme-updating logic together

Prior to this PR, if the page is restored from the browser bfcache¹, we call `switchToSavedTheme`. But `switchToSavedTheme` never looks at the `use-system-theme` preference. Further, if it can't find a saved theme, it will fall back to the default of "light".

For a user with cookies disabled² whose preferred color scheme is dark, this means the theme will wobble back and forth between dark and light. The sequence that occurs is,

1. The page is loaded. During a page load, we consult `use-system-theme`: as cookies are disabled, this preference is unset. The default is true.

   Because the default is true, we look at the preferred color scheme: for our example user, that's "dark". **The page theme is set to dark.** We'll attempt to store these preferences in localStorage, but fail due to cookies being disabled.

2. The user navigates through the docs. Subsequent page loads happen, and the same process in step 1 recurs. Previous pages are (potentially) put into the bfcache.

3. The user navigates backwards/forwards, causing a page in bfcache to be pulled out of cache. The `pageShow` event handler is triggered. However, this calls `switchToSavedTheme`: this doesn't consider the system theme, as noted above. Instead, it only looks for a saved theme. However, with cookies disabled, there is none. It defaults to light. **The page theme is set to light!** The user wonders why the dark theme is lost.

There are effectively two functions trying to determine and apply the correct theme: `updateSystemTheme` and `switchToSavedTheme`. Thus, we merge them into just one: `updateTheme`. This function contains all the logic for determining the correct theme, and is called in all circumstances where we need to set the theme:

* The initial page load
* If the browser preferred color scheme (i.e., light/dark mode) is changed
* If the page is restored from bfcache
* If the user updates the theme preferences (i.e., in `settings.js`)

Fixes https://github.com/rust-lang/rust/issues/94250.

¹bfcache: https://web.dev/bfcache/ The bfcache is used to sleep a page, if the user navigates away from it, and to restore it from cache if the user returns to it.

²Note that the browser preference that enables/disables cookies really controls many forms of storage. The same preference thus also affects localStorage. (This is so a normal browser user doesn't need to understand the distinction between "cookies" and "localStorage".)
2023-01-30 17:50:09 +01:00
Roy Wellington Ⅳ
727a1fd194 Keep all theme-updating logic together
Prior to this PR, if the page is restored from the browser bfcache¹, we
call `switchToSavedTheme`. But `switchToSavedTheme` never looks at the
`use-system-theme` preference. Further, if it can't find a saved theme,
it will fall back to the default of "light".

For a user with cookies disabled² whose preferred color scheme is dark,
this means the theme will wobble back and forth between dark and light.
The sequence that occurs is,

1. The page is loaded. During a page load, we consult
   `use-system-theme`: as cookies are disabled, this preference is
   unset. The default is true.

   Because the default is true, we look at the preferred color scheme:
   for our example user, that's "dark". **The page theme is set to
   dark.** We'll attempt to store these preferences in localStorage, but
   fail due to cookies being disabled.

2. The user navigates through the docs. Subsequent page loads happen,
   and the same process in step 1 recurs. Previous pages are
   (potentially) put into the bfcache.

3. The user navigates backwards/forwards, causing a page in bfcache to
   be pulled out of cache. The `pageShow` event handler is triggered.
   However, this calls `switchToSavedTheme`: this doesn't consider the
   system theme, as noted above. Instead, it only looks for a saved
   theme. However, with cookies disabled, there is none. It defaults to
   light. **The page theme is set to light!** The user wonders why the
   dark theme is lost.

There are effectively two functions trying to determine and apply the
correct theme: `updateSystemTheme` and `switchToSavedTheme`. Thus, we
merge them into just one: `updateTheme`. This function contains all the
logic for determining the correct theme, and is called in all
circumstances where we need to set the theme:

* The initial page load
* If the browser preferred color scheme (i.e., light/dark mode) is
  changed
* If the page is restored from bfcache
* If the user updates the theme preferences (i.e., in `settings.js`)

Fixes #94250.

¹bfcache: https://web.dev/bfcache/ The bfcache is used to sleep a page,
if the user navigates away from it, and to restore it from cache if the
user returns to it.

²Note that the browser preference that enables/disables cookies really
controls many forms of storage. The same preference thus also affects
localStorage. (This is so a normal browser user doesn't need to
understand the distinction between "cookies" and "localStorage".)
2023-01-30 02:36:52 -05:00
Michael Howell
0959149323 rustdoc: remove inline javascript from copy-path button 2023-01-27 16:22:59 -07:00
Michael Howell
97f8189614 rustdoc: remove mostly-unused CSS classes import/module-item 2023-01-26 12:55:19 -07:00
Matthias Krüger
f268c7b454
Rollup merge of #107266 - kadiwa4:source_viewer_scrollbar, r=notriddle
rustdoc: prohibit scroll bar on source viewer in Safari

Fixes #106455.
2023-01-25 22:19:55 +01:00
KaDiWa
11a94f242d
rustdoc: prevent scroll bar on source viewer 2023-01-24 16:46:45 +01:00
Michael Howell
1c41b4d5ac rustdoc: remove dead settings JS for obsolete select-wrapper 2023-01-23 15:08:33 -07:00
Michael Howell
5dd87c58aa rustdoc: simplify settings popover DOM
* Changes the class names so that they all start with `setting-`.
  That should make it harder to accidentally use a setting class outside
  the settings popover, where loading the CSS might accidentally change
  the styles of something unrelated.
* Get rid of an unnecessary wrapper DIV around the radio button line.
* Simplify CSS selectors by making the DOM easier and more intuitive
  to target.
2023-01-23 15:08:33 -07:00
Dylan DPC
d9593768d4
Rollup merge of #107186 - GuillaumeGomez:correct-pseudo-element-selector, r=notriddle
rustdoc: Use correct pseudo-element selector

As explained [here](https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements#syntax).

I wrote it on top of #107152 so we'll need to wait for this one to be merged first.

r? `@notriddle`
2023-01-23 11:52:05 +05:30
Matthias Krüger
d41a14f91e
Rollup merge of #107152 - GuillaumeGomez:migrate-to-css-var, r=notriddle
Migrate scraped-examples top and bottom "borders" to CSS variables

r? `@notriddle`
2023-01-22 11:43:07 +01:00
Guillaume Gomez
26e2360b26 Use correct pseudo-element selector 2023-01-22 11:11:29 +01:00
Roy Wellington Ⅳ
ee9e8cd0ec This function appears to be unused
The comment says that it is called from main.js, but there don't seem to
be any references to it in main.js.

A quick ripgrep says there are no references in all of librustdoc.
2023-01-21 17:33:49 -05:00
Guillaume Gomez
397e4b13f9 Migrate scraped-examples top and bottom "borders" to CSS variables 2023-01-21 12:15:42 +01:00
Michael Goulet
34d4df5bd5
Rollup merge of #107131 - notriddle:notriddle/rustdoc-radio-display-inline-flex, r=GuillaumeGomez
rustdoc: use CSS inline layout for radio line instead of flexbox

This uses less code to lay them out the same way. Already tested here:

5ce39f42bd/tests/rustdoc-gui/settings.goml (L123)
2023-01-20 21:33:24 -05:00
Michael Goulet
7565b9aa4a
Rollup merge of #107095 - notriddle:notriddle/sidebar-current, r=GuillaumeGomez
rustdoc: remove redundant CSS selector `.sidebar .current`

Since the current sidebar item is already a link, it doesn't do anything.
2023-01-20 21:33:23 -05:00
Michael Howell
112d85c1ec rustdoc: use CSS inline layout for radio line instead of flexbox
This uses less code to lay them out the same way.
2023-01-20 14:28:16 -07:00
Michael Howell
05889fc52e rustdoc: remove redundant CSS selector .sidebar .current
Since the current sidebar item is already a link, it doesn't
do anything.
2023-01-19 16:30:05 -07:00
Michael Goulet
e12c6b277f
Rollup merge of #107045 - notriddle:notriddle/settings-css-setting-line, r=GuillaumeGomez
rustdoc: remove redundant CSS rule `#settings .setting-line`

Since the current version of settings.js always nests things below a div with ID `settings`, this rule always overrode the one above.
2023-01-18 18:00:31 -05:00
Michael Goulet
6595127e66
Rollup merge of #107042 - notriddle:notriddle/rustdoc-js-question, r=GuillaumeGomez
rustdoc: fix corner cases with "?" JS keyboard command
2023-01-18 18:00:31 -05:00
Michael Goulet
f7066f79d7
Rollup merge of #105796 - notriddle:notriddle/rustdoc-search-stop-doing-demerits, r=GuillaumeGomez
rustdoc: simplify JS search routine by not messing with lev distance

Since the sorting function accounts for an `index` field, there's not much reason to also be applying changes to the levenshtein distance. Instead, we can just not treat `lev` as a filter if there's already a non-sentinel value for `index`.

<details>

This change gives slightly more weight to the index and path part, as search criteria, than it used to. This changes some of the test cases, but not in any obviously-"worse" way, and, in particular, substring matches are a bigger deal than levenshtein distances (we're assuming that a typo is less likely than someone just not typing the entire name).

The biggest change is the addition of a `path_lev` field to result items. It's always zero if the search query has no parent path part and for type queries, making the check in the `sortResults` function a no-op. When it's present, it is used to implement different precedence for the parent path and the tail.

Consider the query `hashset::insert`, a test case [that already exists and can be found here](5c6a1681a9/src/test/rustdoc-js-std/path-ordering.js). We want the ordering shown in the test case:

```
        { 'path': 'std::collections::hash_set::HashSet', 'name': 'insert' },
        { 'path': 'std::collections::hash_set::HashSet', 'name': 'get_or_insert' },
        { 'path': 'std::collections::hash_set::HashSet', 'name': 'get_or_insert_with' },
        { 'path': 'std::collections::hash_set::HashSet', 'name': 'get_or_insert_owned' },
        { 'path': 'std::collections::hash_map::HashMap', 'name': 'insert' },
```

We do not want this ordering, which is the ordering that would occur if substring position took priority over `path_lev`:

```
        { 'path': 'std::collections::hash_set::HashSet', 'name': 'insert' },
        { 'path': 'std::collections::hash_map::HashMap', 'name': 'insert' }, // BAD
        { 'path': 'std::collections::hash_set::HashSet', 'name': 'get_or_insert' },
        { 'path': 'std::collections::hash_set::HashSet', 'name': 'get_or_insert_with' },
        { 'path': 'std::collections::hash_set::HashSet', 'name': 'get_or_insert_owned' },
```

We also do not want `HashSet::iter` to appear before `HashMap::insert`, which is what would happen if `path_lev` took priority over the appearance of any substring match. This is why the `sortResults` function has `path_lev` sandwiched between a `index < 0` check and a `index` comparison check:

```
        { 'path': 'std::collections::hash_set::HashSet', 'name': 'insert' },
        { 'path': 'std::collections::hash_set::HashSet', 'name': 'get_or_insert' },
        { 'path': 'std::collections::hash_set::HashSet', 'name': 'get_or_insert_with' },
        { 'path': 'std::collections::hash_set::HashSet', 'name': 'get_or_insert_owned' },
        { 'path': 'std::collections::hash_set::HashSet', 'name': 'iter' }, // BAD
        { 'path': 'std::collections::hash_map::HashMap', 'name': 'insert' },
```

The old code implemented a similar feature by manipulating the `lev` member based on whether a substring match was found and averaging in the path distance (`item.lev = name_lev + path_lev / 10`), so the path lev wound up acting like a tie breaker, but it gives slightly different results for `Vec::new`, [changing the test case](https://github.com/rust-lang/rust/pull/105796/files#diff-b346e2ef72a407915f438063c8c2c04f7a621df98923d441b41c0312211a5b21) because of the slight changes to ordering priority.

</details>

Based on https://github.com/rust-lang/rust/pull/103710#issuecomment-1296894296

Previews:

* https://notriddle.com/notriddle-rustdoc-demos/rustdoc-search-stop-doing-demerits/std/index.html
* https://notriddle.com/notriddle-rustdoc-demos/rustdoc-search-stop-doing-demerits-compiler/index.html
2023-01-18 18:00:28 -05:00
Michael Howell
9ee4df0e9c rustdoc: remove redundant rule #settings .setting-line
Since the current version of settings.js always nests things below
a div with ID `settings`, this rule always overrode the one above.
2023-01-18 12:39:13 -07:00
Michael Howell
bb5fb53b30 rustdoc: fix "?" keyboard command when radio button is focused
This extends the special case with checkbox settings to also cover radios.
2023-01-18 12:14:00 -07:00
Michael Howell
deb05758c8 rustdoc: put focus on the help link when opening it from keyboard
This prevents some strange blur-event-related bugs with the "?" command
by ensuring that the focus remains in the same spot when the settings
area closes.
2023-01-18 12:14:00 -07:00
Dylan DPC
43b1e732db
Rollup merge of #107014 - notriddle:notriddle/js-cleanup, r=GuillaumeGomez
rustdoc: remove deprecated / unused code from main.js
2023-01-18 15:55:39 +05:30
Michael Howell
708b529f31 rustdoc: stop using deprecated window.event when there's an ev param 2023-01-17 17:54:58 -07:00
Michael Howell
6d7e2135f1 rustdoc: remove function handleClick that's only used once 2023-01-17 17:22:05 -07:00
Michael Howell
54089e6390 rustdoc: instead of .setting-name { width: 100% }, use default div CSS 2023-01-17 11:49:36 -07:00
Michael Howell
59ba74cacb rustdoc: simplify JS search routine by not messing with lev distance
Since the sorting function accounts for an `index` field, there's not much
reason to also be applying changes to the levenshtein distance. Instead,
we can just not treat `lev` as a filter if there's already a non-sentinel
value for `index`.

This change gives slightly more weight to the index and path part, as
search criteria, than it used to. This changes some of the test cases,
but not in any obviously-"worse" way, and, in particular, substring matches
are a bigger deal than levenshtein distances (we're assuming that a typo
is less likely than someone just not typing the entire name).

Based on
https://github.com/rust-lang/rust/pull/103710#issuecomment-1296894296
2023-01-14 12:04:11 -07:00
Matthias Krüger
14fbc21466
Rollup merge of #106828 - notriddle:notriddle/notable-trait-docblock, r=GuillaumeGomez
rustdoc: remove `docblock` class from notable trait popover

This commit builds on b72de9be74, which removes the `docblock` class from the All Items page, and 9457380ac9, which removes the `docblock` class from the item decl.

Fixes #92974
2023-01-14 18:45:27 +01:00
Yuki Okushi
caa1d47fba
Rollup merge of #106819 - notriddle:notriddle/rm-h1-fqn, r=GuillaumeGomez
rustdoc: remove unnecessary DOM class `h1.fqn`

It's misleading. The main heading sometimes isn't an fully qualified name at all.

It's also redundant. It's always a child of `div.main-heading`, so just use that.
2023-01-14 12:04:37 +09:00
Michael Howell
5314ed5627 rustdoc: remove docblock class from notable trait popover
This commit builds on b72de9be74, which removes
the `docblock` class from the All Items page, and
9457380ac9, which removes the `docblock` class
from the item decl.

Fixes #92974
2023-01-13 15:42:29 -07:00
Michael Howell
1d328de3ec rustdoc: rename CSS rustdoc-toggle -> toggle and toggle -> settings-toggle
This swaps things around so that the class that gets used more often has
the shorter name.
2023-01-13 12:38:03 -07:00
Michael Howell
39b90a5f6e rustdoc: remove unnecessary DOM class h1.fqn
It's misleading. The main heading sometimes isn't an fully qualified name at all.

It's also redundant. It's always a child of `div.main-heading`, so just use that.
2023-01-13 10:09:25 -07:00
Albert Larsan
40ba0e84d5
Change src/test to tests in source files, fix tidy and tests 2023-01-11 09:32:13 +00:00
Yuki Okushi
8248f1d50a
Rollup merge of #106690 - GuillaumeGomez:item-declaration-scrolling, r=notriddle
Fix scrolling for item declaration block

Fixes https://github.com/rust-lang/rust/issues/105580.

The `contain: layout` was the issue here and the bug was actually on both mobile and desktop.

r? `@notriddle`
2023-01-11 14:18:58 +09:00
Guillaume Gomez
0399a636e6 Fix scrolling for item declaration block 2023-01-10 18:27:42 +01:00
Michael Howell
1c766d03a7 rustdoc: merge common CSS for a 2023-01-09 11:09:19 -07:00
Matthias Krüger
98ad442946
Rollup merge of #106556 - notriddle:notriddle/margin-left-content-mobile, r=GuillaumeGomez
rustdoc: remove no-op mobile CSS `.content { margin-left: 0 }`

This rule was added to override non-zero left margin on `.content`, which was removed in 135281ed15 and the margin-left was put on the docblock.
2023-01-07 20:43:23 +01:00
Michael Howell
a7ac923088 rustdoc: remove no-op mobile CSS .content { margin-left: 0 }
This rule was added to override non-zero left margin on `.content`,
which was removed in 135281ed15 and
the margin-left was put on the docblock.
2023-01-06 22:21:54 -07:00
Michael Howell
16a3c8032e rustdoc: remove no-op CSS .rustdoc.source .sidebar { width: 0 }
This CSS was added in dc2c972334,
before 6a5f8b1aef when the sidebars
were merged.

Now that they are merged, the source sidebar is being pushed
off-screen anyway, so giving it zero width doesn't do much.
2023-01-06 13:14:41 -07:00
Dylan DPC
dd97619b1f
Rollup merge of #106502 - notriddle:notriddle/user-select, r=GuillaumeGomez
rustdoc: remove legacy user-select CSS

According to [caniuse], the only supported browser that requires the vendor prefix, as defined in [RFC 1985], is Safari.

* The last version of Chrome that required a vendor prefix was version 53. The current version is 108.
* Firefox 68 is the last version that required a vendor prefix. The [current Firefox ESR] is version 102.
* The current version of Safari for Mac and iOS still requires a prefix.
* The last version of Edge that required a vendor frefix was 18. The current version of Edge is 108.
* UCAndroid support is unknown, but if it still requires a vendor prefix, it's more likely to be `-webkit-` than `-moz-` or `-ms-`, since they would want to emulate iOS for compatibility.

[caniuse]: https://caniuse.com/?search=user-select
[RFC 1985]: https://rust-lang.github.io/rfcs/1985-tiered-browser-support.html
[current Firefox ESR]: https://wiki.mozilla.org/Releases
2023-01-06 11:38:58 +05:30
Michael Howell
0de182a581 rustdoc: remove legacy user-select CSS
According to [caniuse], the only supported browser that requires the vendor prefix,
as defined in [RFC 1985], is Safari.

* The last version of Chrome that required a vendor prefix was version 53.
  The current version is 108.
* Firefox 68 is the last version that required a vendor prefix. The
  [current Firefox ESR] is version 102.
* The current version of Safari for Mac and iOS still requires a prefix.
* The last version of Edge that required a vendor frefix was 18. The current
  version of Edge is 108.
* UCAndroid support is unknown, but if it still requires a vendor prefix,
  it's more likely to be `-webkit-` than `-moz-` or `-ms-`, since they
  would want to emulate iOS for compatibility.

[caniuse]: https://caniuse.com/?search=user-select
[RFC 1985]: https://rust-lang.github.io/rfcs/1985-tiered-browser-support.html
[current Firefox ESR]: https://wiki.mozilla.org/Releases
2023-01-05 11:25:06 -07:00
bors
388538fc96 Auto merge of #106487 - GuillaumeGomez:fix-kbd-var, r=notriddle
Fix --kbd-color variable name in rustdoc.css

Interestingly enough, it only impacted the dark theme.

Before:

![Screenshot from 2023-01-05 11-03-17](https://user-images.githubusercontent.com/3050060/210754145-c3bb0f50-d35f-4543-bf73-010a4524a803.png)

After:

![Screenshot from 2023-01-05 11-03-05](https://user-images.githubusercontent.com/3050060/210754190-85c2f146-a774-4463-9cd3-9495b7c91bd7.png)

r? `@notriddle`
2023-01-05 15:47:39 +00:00
Guillaume Gomez
407e72e0ce Fix --kbd-color variable name in rustdoc.css 2023-01-05 11:03:35 +01:00
Michael Goulet
6132993144
Rollup merge of #106462 - notriddle:notriddle/logo-container-sidebar, r=GuillaumeGomez
rustdoc: remove unnecessary wrapper around sidebar and mobile logos

This commit changes `.sidebar a:hover:not(.logo-container)` to add the `:not()` pseudo-class, retaining the old appearance of the logo when mousing over it.

This didn't used to be necessary because the `a.sidebar-logo` was `display:inline`, and was what got the `background` changed on hover, while the `div.logo-container` inside it was `display:block`. This resulted in the hover rule not having any effect, because the logo-container box was not actually nested inside the sidebar-logo box:

https://www.w3.org/TR/CSS2/visuren.html#anonymous-block-level

> When an inline box contains an in-flow block-level box, the inline box (and its inline ancestors within the same line box) are broken around the block-level box (and any block-level siblings that are consecutive or separated only by collapsible whitespace and/or out-of-flow elements), splitting the inline box into two boxes (even if either side is empty), one on each side of the block-level box(es). The line boxes before the break and after the break are enclosed in anonymous block boxes, and the block-level box becomes a sibling of those anonymous boxes. When such an inline box is affected by relative positioning, any resulting translation also affects the block-level box contained in the inline box.
2023-01-04 20:36:28 -08:00
Matthias Krüger
836321effb
Rollup merge of #106437 - notriddle:notriddle/http-url, r=GuillaumeGomez
rustdoc: fix buggy JS check for absolute URL

The old code did the wrong thing when faced with a crate named "http".
2023-01-04 23:39:50 +01:00