/* Custom CSS for the Rust Specification. */ /* Per-theme variables. */ :root { --railroad-background-color: hsl(30, 20%, 95%); --railroad-background-image: linear-gradient(to right, rgba(30, 30, 30, .05) 1px, transparent 1px), linear-gradient(to bottom, rgba(30, 30, 30, .05) 1px, transparent 1px); --railroad-path-stroke: black; --railroad-rect-stroke: black; --railroad-rect-fill: hsl(-290, 70%, 90%); } .light { --alert-note-color: #0969da; --alert-warning-color: #9a6700; --alert-edition-color: #1a7f37; --alert-example-color: #8250df; --grammar-literal-bg: #fafafa; } .rust { --alert-note-color: #023b95; --alert-warning-color: #603700; --alert-edition-color: #008200; --alert-example-color: #8250df; --grammar-literal-bg: #dedede; } .light, .rust { --grammar-comment-color: lch(from var(--quote-bg) calc(l - 50) 0 0); --inline-code-color: var(--grammar-comment-color); } .coal, .navy { --alert-note-color: #4493f8; --alert-warning-color: #d29922; --alert-edition-color: #3fb950; --alert-example-color: #ab7df8; --grammar-literal-bg: #1d1f21; } .ayu { --alert-note-color: #74b9ff; --alert-warning-color: #f0b72f; --alert-edition-color: #2bd853; --alert-example-color: #d3abff; --grammar-literal-bg: #191f26; } .coal, .navy, .ayu { --grammar-comment-color: lch(from var(--quote-bg) calc(l + 50) 0 0); --inline-code-color: var(--grammar-comment-color); --railroad-background-color: hsl(230, 10%, 20%); --railroad-background-image: linear-gradient(to right, rgba(150, 150, 150, .05) 1px, transparent 1px), linear-gradient(to bottom, rgba(150, 150, 150, .05) 1px, transparent 1px); --railroad-path-stroke: hsl(200, 10%, 60%); --railroad-text-fill: hsl(230, 30%, 80%); --railroad-rect-stroke: hsl(200, 10%, 50%); --railroad-rect-fill: hsl(230, 20%, 20%); } /* .parenthetical class used to keep e.g. "less-than symbol (symbol (```` */ .parenthetical { white-space: nowrap; } /* Admonitions are defined with blockquotes: > [!WARNING] > This is bad! See tools/mdbook-spec/src/admonitions.rs. */ .alert blockquote { /* Add some padding to make the vertical bar a little taller than the text.*/ padding: 8px 0px 8px 20px; /* Add a solid color bar on the left side. */ border-inline-start-style: solid; border-inline-start-width: 4px; /* Disable the background color from mdbook for a cleaner look. */ background-color: inherit; /* Disable border blocks from mdbook. */ border-block-start: none; border-block-end: none; /* Reduce margin from mdbook, it uses a lot of space. */ margin: 10px 0; } .alert-title { /* Slightly increase the weight for more emphasis. */ font-weight: 600; /* Vertically center the icon with the text. */ display: flex; align-items: center; /* Remove default large margins for a more compact display. Important to override .alert p rule. */ margin: 0 0 8px 0 !important; } .alert blockquote > :nth-child(2) { /* Default margins of content just below the label add too much space. */ margin-top: 0; } .alert blockquote > :last-child { /* Default margins of content add too much space. */ margin-bottom: 0; } .alert-title svg { fill: currentColor; /* Add some space between the icon and the text. */ margin-right: 8px; } .alert-note blockquote { border-inline-start-color: var(--alert-note-color); } .alert-warning blockquote { border-inline-start-color: var(--alert-warning-color); } .alert-edition blockquote { border-inline-start-color: var(--alert-edition-color); } .alert-example blockquote { border-inline-start-color: var(--alert-example-color); } .alert-note .alert-title { color: var(--alert-note-color); } .alert-warning .alert-title { color: var(--alert-warning-color); } .alert-edition .alert-title { color: var(--alert-edition-color); } /* Puts a rounded rectangle around the edition date. */ .alert-title-edition { padding: 0px 5px; margin-right: 1rem; border: 2px solid var(--alert-edition-color); border-radius: 15px; font-weight: bold; color: var(--alert-edition-color); } .alert-example .alert-title { color: var(--alert-example-color); } /* 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; } /* 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; } /* 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; } /* 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; } /* 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 accommodate above, somehow... */ #mdbook-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(36px, 1fr) /* The main text body */ [text] auto /* Right margin */ [margin] minmax(36px, 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; } hr { /* For some reason, grid is shrinking this to a point. */ width: 100%; } /* Too much space with the grid. */ .footnote-definition { margin-top: 0; } .footnote-definition li:first-child > *:first-child { margin-top: 0; } /* This is quite dumb, ugh. CSS doesn't allow margin collapsing between grid items and anything else (src: ), which means that the margins of li's children are not collapsed with ul's margins, adding too much margins. Ideally we'd add `

`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, main > ol:not(.footnote-definition) > li > *:first-child, main > ol:not(.footnote-definition) > li > pre:first-child > pre.playground { margin-top: 0; } main > ul > li > *:last-child, main > ul > li > pre:last-child > pre.playground, main > ol:not(.footnote-definition) > li > *:last-child, main > ol:not(.footnote-definition) > 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, main > ol { 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 */ :root { /* 1.6 is body font-size */ --h2-margin-top: calc(1.5rem * 1.6 * 2.5 - 16px); --h3-margin-top: calc(1.17rem * 1.6 * 2.5 - 16px); --h4-margin-top: calc(1.00rem * 1.6 * 2 - 16px); --h5-margin-top: calc(0.83rem * 1.6 * 2 - 16px); --h6-margin-top: calc(0.67rem * 1.6 * 2 - 16px); } main > h2 { margin-top: var(--h2-margin-top); margin-bottom: calc(0.83em - 16px); } main > h3 { margin-top: var(--h3-margin-top); margin-bottom: calc(1em - 16px); } main > h4 { margin-top: var(--h4-margin-top); margin-bottom: calc(1.33em - 16px); } main > h5 { margin-top: var(--h5-margin-top); margin-bottom: calc(1.67em - 16px); } main > h6 { margin-top: var(--h6-margin-top); 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 `` 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; } /* Test links */ .test-link { float: right; padding-right: 10px; } .rule .popup-container > a { float: right; text-align: right; } /* 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 .rule-link::before { display: inline-block; content: "»"; padding-right: 5px; } /* Make it bolder/easier to read when selected. */ .rule:target .rule-link { color: var(--fg) !important; } /* Dodge » from headings */ /* Note: Some rules have a .tests-popup in the way, so that's why this selects either with or without. */ .rule:has(+ h1:target, + .tests-popup + h1:target), .rule:has(+ h2:target, + .tests-popup + h2:target), .rule:has(+ h3:target, + .tests-popup + h3:target), .rule:has(+ h4:target, + .tests-popup + h4:target), .rule:has(+ h5:target, + .tests-popup + h5:target), .rule:has(+ h6:target, + .tests-popup + h6:target) { padding-right: 24px; } /* This positioning is to push the popup down over the header's top margin. Ideally I would like the popup to show *below* the header, but I have no idea how to do that. */ .tests-popup:has(+ h2) { position: relative; top: calc(var(--h2-margin-top) + 10px); } .tests-popup:has(+ h3) { position: relative; top: calc(var(--h3-margin-top) + 10px); } .tests-popup:has(+ h4) { position: relative; top: calc(var(--h4-margin-top) + 10px); } .tests-popup:has(+ h5) { position: relative; top: calc(var(--h5-margin-top) + 10px); } .tests-popup:has(+ h6) { position: relative; top: calc(var(--h6-margin-top) + 10px); } /* Hide the rules if the width of the container is too small. The cutoff point is chosen semi-arbitrary, it felt that when `width .rule a.rule-link span, .test-link > a span { display: none; } main > .rule > a.rule-link::before { content: "[*]"; } .test-link > a::before { content: "[T]"; } } /* Align rules to various siblings */ .rule:has(+ p, + .tests-popup + p), .rule:has(+ ul, + .tests-popup + ul), .rule:has(+ ol, + .tests-popup + ol) { margin-top: calc((1em - var(--font-size)) / var(--font-size-mult) / 2); } .rule:has(+ h1, + .tests-popup + h1) { align-self: center; } .rule:has(+ h2, + .tests-popup + 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, + .tests-popup + 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, + .tests-popup + 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, + .tests-popup + 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, + .tests-popup + 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; } /* The box that contains the grammar. */ .grammar-container { font-family: var(--mono-font); /* Enable absolute positioning for the target chevron. */ position: relative; background-color: var(--quote-bg); border-block-start: .1em solid var(--quote-border); border-block-end: .1em solid var(--quote-border); margin-top: 4px; margin-bottom: 4px; padding: 0 20px; } /* English words inside the grammar. */ .grammar-text { font-family: "Open Sans", sans-serif; } /* Comments inside the grammar. */ .grammar-comment { font-family: "Open Sans", sans-serif; color: var(--grammar-comment-color); } .grammar-comment code.hljs { background: var(--grammar-literal-bg); } /* Places a box around literals to differentiate from other grammar punctuation like | and ( . */ .grammar-literal { font-family: var(--mono-font); border-radius: 4px; border: solid 1px var(--theme-popup-border); font-weight: bold; font-size: var(--code-font-size); padding: 1px 4px; color: var(--inline-code-color); } .grammar-literal { background-color: var(--grammar-literal-bg); } .grammar-production:target, .railroad-production:target { scroll-margin-top: 50vh; } .railroad-production { /* Enables absolute positioning of the target chevron. */ position: relative; } /* Adds an indicator to the targeted production name. */ .grammar-production:target::before, .railroad-production:target::before { content: "»"; position: absolute; left: 3px; font-size: 2rem; font-weight: bolder; /* For some reason, the vertical alignment is slightly off center. This helps with that alignment. It was too difficult to try to fix that via absolute positioning. */ line-height: 1; } /* Overrides the positioning of the chevron from the rule above. */ .railroad-production:target::before { left: -20px; top: 8px; } /* The toggle button. */ .grammar-toggle-railroad { width: 160px; padding: 5px 0px; border-radius: 5px; cursor: pointer; } /* This is used to toggle the hidden status of the railroad diagrams. */ .grammar-hidden { display: none; } svg.railroad { background-color: var(--railroad-background-color); background-size: 15px 15px; background-image: var(--railroad-background-image); } svg.railroad rect.railroad_canvas { stroke-width: 0px; fill: none; } svg.railroad path { stroke-width: 3px; stroke: var(--railroad-path-stroke); fill: none; } svg.railroad .debug { stroke-width: 1px; stroke: red; } svg.railroad text { font: 14px monospace; text-anchor: middle; fill: var(--railroad-text-fill); } svg.railroad .nonterminal text { font-weight: bold; } svg.railroad text.comment { font: italic 12px monospace; } svg.railroad rect { stroke-width: 3px; stroke: var(--railroad-rect-stroke); fill: var(--railroad-rect-fill); } svg.railroad g.labeledbox>rect { stroke-width: 1px; stroke: grey; stroke-dasharray: 5px; fill: rgba(90, 90, 150, .1); } svg.railroad g.exceptbox > rect { fill:rgba(245, 160, 125, .1); }