blob: 147e0ed5adbf9c52379555e6eabc2320bbabdd8d [file] [log] [blame] [edit]
/* Custom CSS for the Rust Specification. */
/*
.parenthetical class used to keep e.g. "less-than symbol (<)" from wrapping
the end parenthesis onto its own line. Use in a span between the last word and
the parenthetical. So for this example, you'd use
```less-than <span class="parenthetical">symbol (`<`)</span>```
*/
.parenthetical {
white-space: nowrap;
}
/*
Warnings are defined using admonitions in blockquotes:
> [!WARNING]
> This is bad!
*/
main .warning blockquote {
padding: 0px;
}
main .warning blockquote p {
padding: 0px 20px;
margin: 10px 0;
}
main .warning blockquote p:first-child::before {
content: "⚠️ ";
}
.light main .warning blockquote,
.rust main .warning blockquote {
border: 2px solid red;
background: #ffcece;
}
.rust main .warning blockquote {
/* overrides previous declaration */
border-color: #961717;
}
.coal main .warning blockquote,
.navy main .warning blockquote,
.ayu main .warning blockquote {
background: #542626;
}
/* Make the links higher contrast on dark themes */
.coal main .warning blockquote p a,
.navy main .warning blockquote p a,
.ayu main .warning blockquote p a {
color: #80d0d0;
}
/* <kbd> tags can be used to highlight specific character elements. */
kbd {
border: 1px solid #999;
display: inline-block;
border-radius: 3px;
padding: 0 0.6ex;
background: #eee;
box-shadow: inset -1px -1px 0 #999;
vertical-align: baseline;
color: #000;
height: 1.55em;
font-style: normal;
font-weight: bold;
font-family: inherit;
font-size: revert;
line-height: revert;
}
kbd.optional {
border-style: dashed;
background: #fff;
}
var.optional {
border-style: dashed;
}
/* <var> tags can be used for non-terminals. */
var {
border: 1px solid #9c9;
box-shadow: inset -1px -1px 0 #9c9;
font-style: normal;
display: inline-block;
vertical-align: baseline;
border-radius: 7px;
padding: 0 4px;
background: #dfd;
margin: 2px;
}
var.type {
box-shadow: inset -1px -1px 0 #c99;
border-color: #c99;
background: #fdd;
}
/* <span class="repeat"> can be used for a grammar production that repeats zero or more times. */
span.repeat {
position: relative;
border: 1px dashed #393;
border-radius: 10px;
display: inline-block;
padding: 6px;
margin-left: 0.5ex;
margin-top: 1em;
margin-bottom: 0.5ex;
min-width: 3.8em;
text-align: center;
}
span.repeat::before {
content: "zero or more";
white-space: nowrap;
display: block;
text-align: center;
font-size: 0.75em;
position: absolute;
left: 0;
right: 0;
top: -1.4em;
color: #393;
}
var > span {
display: inline-block;
border-right: 1px dotted green;
padding-right: 0.5ex;
margin-right: 0.5ex;
font-style: italic;
}
/* <span class="version"> can be used to highlight a specific version of Rust. */
span.version {
float: right;
margin-left: 1em;
margin-bottom: 1em;
background: #f7c0eb;
padding: 0.2ex 0.5ex;
border-radius: 5px;
display: block;
box-shadow: inset -1px -1px 0 #a06894;
font-size: 0.9em;
}
/* <dfn> tags are used to indicate a specific word or phrase is being defined. */
dfn {
font-style: italic;
text-decoration: underline;
}
.content main {
/* Provides space on the left for the rule call-outs. */
padding-left: 4em;
}
/* Rules are generated via r[foo.bar] syntax, processed by mdbook-spec. */
.rule {
--font-size-mult: 0.8;
--font-size: calc(1em * var(--font-size-mult));
font-size: var(--font-size);
}
/* included in the grid below as 20px */
.page, .content {
padding-left: 0;
padding-right: 0;
}
/* required to accomodate above, somehow... */
#menu-bar {
margin-left: 0;
}
main {
/* To nicely display rules (`[a.b.c]`) on a side of the main text body we
use grid layout. */
display: grid;
grid-template-columns:
/* Left margin / place for rules */
[rules] minmax(20px, 1fr)
/* The main text body */
[text] auto
/* Right margin */
[margin] minmax(20px, 1fr);
/* We do these by hand via the grid */
margin: 0;
padding: 0 !important;
max-width: none !important;
}
main > * {
/* By default grid items can't be smaller than their content.
That is, by default `min-width: auto`.
We want to be able to force code blocks to be scrollable,
so we need to overwrite `min-width`. */
min-width: 0;
max-width: var(--content-max-width);
/* All elements should be in the main text body... */
grid-column: text;
}
main > .rule {
/* ... except the rules, which must be in the left margin */
grid-column: rules;
}
/* Unset footnote margin,
see below for more information about margins */
/* FIXME: this doesn't work. `unset` can still break the margin of the next element,
and since mdbook applies the margin to `:not(.footnore-definition)`,
it can literally be anything, so there is no way to properly fix it,
without changing mdbook... */
:not(.footnote-definition) + .footnote-definition,
.footnote-definition + :not(.footnote-definition) {
margin-block-start: unset;
}
:not(.footnote-definition) + .footnote-definition {
margin-top: calc(2em - 16px);
}
.footnote-definition:has(+ :not(.footnote-definition)) {
margin-bottom: calc(2em - 16px);
}
/* This is quite dumb, ugh.
CSS doesn't allow margin colapsing between grid items and anything else
(src: <https://stackoverflow.com/a/37837971>), which means that the margins
of li's children are not collapsed with ul's margins, adding too much margins.
Ideally we'd add `<div>`s for each grid cell, so that margin collapsing happens
as-usual inside of them. But, we don't have that kind of control over mdbook. */
main > ul > li > *:first-child,
main > ul > li > pre:first-child > pre.playground {
margin-top: 0;
}
main > ul > li > *:last-child,
main > ul > li > pre:last-child > pre.playground {
margin-bottom: 0;
}
/* Similarly to the above, margin collapse doesn't happen between grid items,
so we have to replace it with grid gap. (p, pre, and ul had 16px vertical margins) */
main {
row-gap: 16px;
}
main > p,
main > pre,
main > pre > pre.playground,
main > ul {
margin-top: 0;
margin-bottom: 0;
}
/* Values for header margin-top and blockquote margin are taken from mdbook's general.css,
values for header margin-bottom are taken from <https://www.w3schools.com/cssref/css_default_values.php> */
main > h2 {
margin-top: calc(2.5em - 16px);
margin-bottom: calc(0.83em - 16px);
}
main > h3 {
margin-top: calc(2.5em - 16px);
margin-bottom: calc(1em - 16px);
}
main > h4 {
margin-top: calc(2em - 16px);
margin-bottom: calc(1.33em - 16px);
}
main > h5 {
margin-top: calc(2em - 16px);
margin-bottom: calc(1.67em - 16px);
}
main > h6 {
margin-top: calc(2em - 16px);
margin-bottom: calc(2.33em - 16px);
}
main > blockquote {
margin-top: calc(20px - 16px);
margin-bottom: calc(20px - 16px);
}
main > .rule {
max-width: unset;
justify-self: right;
width: 100%;
/* We use a container query to know the size of the "left margin",
so that we can hide rules is there is not enough space. */
container-type: inline-size;
container-name: rule;
}
.rule-link {
float: right;
text-align: right;
padding-right: 10px;
/* We add `<wbr>` ourselves and only want breaks there */
word-break: keep-all;
/* Remove the blue coloring of links on rules that mdbook normally sets. */
color: #999 !important;
}
/* When clicking a rule, it is added as a URL fragment and the browser will
navigate to it. This adds an indicator that the linked rule is the one that
is "current", just like normal headers are in mdbook.
*/
.rule:target a::before {
display: inline-block;
content: "»";
padding-right: 5px;
}
/* Dodge » from headings */
.rule:has(+ h1:target),
.rule:has(+ h2:target),
.rule:has(+ h3:target),
.rule:has(+ h4:target),
.rule:has(+ h5:target),
.rule:has(+ h6:target) {
padding-right: 24px;
}
/* Hide the rules if the width of the container is too small.
The cutoff point is chosen semi-arbitrary, it felt that
when `width < 14em`, there are too many breaks. */
@container rule (width < 14em) {
main > .rule a span {
display: none;
}
main > .rule a::before {
content: "[*]";
}
}
/* Align rules to various siblings */
.rule:has(+ p),
.rule:has(+ ul) {
margin-top: calc((1em - var(--font-size)) / var(--font-size-mult) / 2);
}
.rule:has(+ h1) {
align-self: center;
}
.rule:has(+ h2) {
/* multiplying by this turns h2's em into .rule's em*/
--h2-em-mult: calc(
(1 / var(--font-size-mult)) /* to main font size */
* 1.5 /* to h2 font size */
);
margin-top: calc(
/* h2 margin top */
2.5em * var(--h2-em-mult) - 16px
/* half of the font size difference */
+ (1em * var(--h2-em-mult) - 1em) / 2
)
}
.rule:has(+ h3) {
/* multiplying by this turns h3's em into .rule's em*/
--h3-em-mult: calc(
(1 / var(--font-size-mult)) /* to main font size */
* 1.17 /* to h3 font size */
);
margin-top: calc(
/* h3 margin top */
2.5em * var(--h3-em-mult) - 16px
/* half of the font size difference */
+ (1em * var(--h3-em-mult) - 1em) / 2
)
}
.rule:has(+ h4) {
/* multiplying by this turns h4's em into .rule's em*/
--h4-em-mult: calc(
(1 / var(--font-size-mult)) /* to main font size */
* 1 /* to h4 font size */
);
margin-top: calc(
/* h4 margin top */
2em * var(--h4-em-mult) - 16px
/* half of the font size difference */
+ (1em * var(--h4-em-mult) - 1em) / 2
)
}
.rule:has(+ h5) {
/* multiplying by this turns h5's em into .rule's em*/
--h5-em-mult: calc(
(1 / var(--font-size-mult)) /* to main font size */
* 0.83 /* to h5 font size */
);
margin-top: calc(
/* h5 margin top */
2em * var(--h5-em-mult) - 16px
/* half of the font size difference */
+ (1em * var(--h5-em-mult) - 1em) / 2
)
}
.rule:has(+ h6) {
/* multiplying by this turns h6's em into .rule's em*/
--h6-em-mult: calc(
(1 / var(--font-size-mult)) /* to main font size */
* 0.67 /* to h6 font size */
);
margin-top: calc(
/* h6 margin top */
2em * var(--h6-em-mult) - 16px
/* half of the font size difference */
+ (1em * var(--h6-em-mult) - 1em) / 2
)
}
/* Sets the color for [!HISTORY] blockquote admonitions. */
.history > blockquote {
background: #f7c0eb;
}
/* Provides a anchor container for positioning popups. */
.popup-container {
position: relative;
}
/* In the test summary page, a convenience class for toggling visibility. */
.popup-hidden {
display: none;
}
/* In the test summary page, the styling for the uncovered rule popup. */
.uncovered-rules-popup {
position: absolute;
left: -250px;
width: 400px;
background: var(--bg);
border-radius: 4px;
border: 1px solid;
z-index: 1000;
padding: 1rem;
}
/* The popup that shows when viewing tests for a specific rule. */
.tests-popup {
color: var(--fg);
background: var(--bg);
border-radius: 4px;
border: 1px solid;
z-index: 1000;
padding: 1rem;
}