Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RTL Rendering for Guides #51613

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 11 additions & 0 deletions guides/assets/javascripts/guides.js
Original file line number Diff line number Diff line change
Expand Up @@ -186,4 +186,15 @@
}
})
});

// Observe the HTML tag for Google Translate CSS class, to swap our lang direction LTR/RTL.
var observer = new MutationObserver(function(mutations, _observer) {
each(mutations, function(mutation) {
if (mutation.type === "attributes" && mutation.attributeName == "class") {
mutation.target.dir = mutation.target.classList.contains("translated-rtl") ? "rtl" : "ltr";
}
})
});
observer.observe(document.querySelector("html"), { attributeFilter: ["class"] });

}).call(this);
91 changes: 74 additions & 17 deletions guides/assets/stylesrc/_main.scss
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ body.guide {

-webkit-tap-highlight-color:rgba(38, 27, 35, 0);


// ----------------------------------------------------------------------------
// Typographic Baseline
// ----------------------------------------------------------------------------
Expand Down Expand Up @@ -57,7 +58,6 @@ body.guide {

margin: 0 0 0.75em 0; // Space after paragraph
text-align: left;

} // p

// Links
Expand Down Expand Up @@ -259,12 +259,6 @@ body.guide {
}
} // dd
} // dl

// :where(&[dir="ltr"]) dd { margin-left: 1.5em; }
// :where(&[dir="rtl"]) dd { margin-right: 1.5em; }

// :where(&[dir="ltr"]) :is(dd) { margin-left: 0; padding-left: 0; }
// :where(&[dir="rtl"]) :is(dd) { margin-right: 0; padding-right: 0; }

li {
margin-bottom: 0.5em;
Expand All @@ -274,7 +268,7 @@ body.guide {

pre, code {
font-size: 1rem;
font-family: "IBM Plex Mono", "Anonymous Pro", "Inconsolata", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace;
font-family: "IBM Plex Mono", "Anonymous Pro", "Inconsolata", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace !important;
line-height: 1.5;
margin: 1em 0;
overflow: auto;
Expand Down Expand Up @@ -322,14 +316,17 @@ body.guide {

.wrapper {
padding: 1em;

:where(body[dir="ltr"]) & { text-align: left; }
:where(body[dir="rtl"]) & { text-align: right; }
text-align: left;

@include media('>desktop') { // 1024
max-width: calc(55rem + 420px);
margin: 0 auto;
padding-right: 470px;

:where(html[dir="rtl"]) & {
padding-right: 1.5em;
padding-left: 470px;
}
}
} // .wrapper

Expand Down Expand Up @@ -584,8 +581,8 @@ body.guide {
z-index: 15;
padding-bottom: 0.125em;

:where(body[dir="ltr"]) & { background-position: right top; padding-right: 1em; }
:where(body[dir="rtl"]) & { background-position: left top; padding-left: 1em; }
:where(html[dir="ltr"]) & { background-position: right top; padding-right: 1em; }
:where(html[dir="rtl"]) & { background-position: left top; padding-left: 1em; }
}


Expand All @@ -604,8 +601,8 @@ body.guide {
max-width: 1000px;
z-index: 10;

:where(body[dir="ltr"]) & { left: auto; right: 50px; }
:where(body[dir="rtl"]) & { left: 50px; right: auto; }
:where(html[dir="ltr"]) & { left: auto; right: 50px; }
:where(html[dir="rtl"]) & { left: 50px; right: auto; }

&.visible {
display: block !important;
Expand Down Expand Up @@ -706,6 +703,11 @@ body.guide {
right: 50px;
max-height: calc(100vh - 200px);
width: 400px;

:where(html[dir="rtl"]) & {
right: auto;
left: 50px;
}
}

&.guide-index {
Expand All @@ -714,11 +716,20 @@ body.guide {

@include media('>desktop-ultra-wide') {
right: calc(30vw - 400px);

:where(html[dir="rtl"]) & {
right: auto;
left: calc(30vw - 400px);
}
}

@include media('>desktop-hd') { // 1920

right: calc(40vw - 400px);

:where(html[dir="rtl"]) & {
right: auto;
left: calc(40vw - 400px);
}
}

h3.chapter img {
Expand Down Expand Up @@ -820,6 +831,11 @@ body.guide {
background-color: $stop-bkgnd;
opacity: 0;
transition: opacity 0.2s ease-in-out;

:where(html[dir="rtl"]) & {
right: -3.5em;
left: unset;
}
}

a.active::after {
Expand All @@ -838,6 +854,11 @@ body.guide {
background-color: $rf-brand;
opacity: 0;
transition: opacity 0.2s ease-in-out;

:where(html[dir="rtl"]) & {
right: -3em;
left: unset;
}
}

a.active::before {
Expand All @@ -852,4 +873,40 @@ body.guide {
}
}

} // body.guide
} // body.guide

html[dir="rtl"] {
body.guide {
direction: rtl;

p, table th, .wrapper,
#guides .guides-section-container .guides-section {
text-align: right;
}
} // body.guide

&:lang(ar), &:lang(fa) {
body.guide {
h1, h2, h3, h4, h5, h6, p, dl, dd, dt, ul, ol, li,
header#page_header nav#feature_nav .header-logo a {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems oddly specific 😄 , wouldn't it work to apply to all a tags like the other tags?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is overriding the .header-logo a where a font is defined. Most a tags are inheriting from their parent. This one is simply an explicit override of line 438 in _main.scss

font-family: "Noto Sans Arabic", sans-serif !important;
font-optical-sizing: auto;
font-weight: 400;
font-style: normal;
font-variation-settings: "wdth" 100;
}
} // body.guide
} // &:lang(ar), &:lang(fa)

&:lang(he), &:lang(iw) {
body.guide {
h1, h2, h3, h4, h5, h6, p, dl, dd, dt, ul, ol, li,
header#page_header nav#feature_nav .header-logo a {
font-family: "Heebo", sans-serif !important;
font-optical-sizing: auto;
font-weight: 400;
font-style: normal;
}
} // body.guide
} // &:lang(he), &:lang(iw)
} // html[dir="rtl"]
18 changes: 10 additions & 8 deletions guides/assets/stylesrc/components/_code-container.scss
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,22 @@
/* Same bottom margin for special boxes than for regular paragraphs, this way
intermediate whitespace looks uniform. */

.interstitial {
.interstitial,
dl dd .interstitial {
background-repeat: no-repeat;
background-size: 36px 36px;
border-radius: $base-border-radius;
border: 2px solid $gray-500;
border-style: solid !important;
border-width: 2px !important;
min-height: calc(36px + 1.2em);
min-height: calc(36px + 1.5em);
margin: 2em auto;
padding: 0.75em !important;
position: relative;

// Padding and spacing for LTR vs RTL langauge defaults
:where(body[dir="ltr"]) & { background-position: 10px 10px; padding-right: 1em !important; padding-left: 56px !important; }
:where(body[dir="rtl"]) & { background-position: calc(100% - 10px) 10px; padding-right: 56px !important; padding-left: 1em !important; }
:where(html[dir="ltr"]) & { background-position: 10px 10px; padding-right: 1em !important; padding-left: 56px !important; }
:where(html[dir="rtl"]) & { background-position: calc(100% - 10px) 10px; padding-right: 56px !important; padding-left: 1em !important; }

/* Remove bottom margin of paragraphs in special boxes, otherwise they get a
spurious blank area below with the box background. */
Expand All @@ -39,6 +40,8 @@ intermediate whitespace looks uniform. */
background-color: $gray-900;
min-height: auto; // remove if icon is restored
padding-left: 1em !important; // remove if icon is restored
direction: ltr !important;
text-align: left !important;

pre {margin: 0;}

Expand All @@ -52,9 +55,9 @@ intermediate whitespace looks uniform. */
padding: 0.25em 0.5em !important;
position: absolute;
bottom: 10px;
:where(body[dir="ltr"]) & { right: 10px; }
:where(body[dir="rtl"]) & { left: 10px; }
right: 10px;
text-transform: uppercase;
width: auto;
} // button.clipboard-button
} // &.code

Expand Down Expand Up @@ -92,5 +95,4 @@ intermediate whitespace looks uniform. */
&.kindle {
padding-top: 1em !important;
}
} // .interstitial

} // .interstitial
9 changes: 7 additions & 2 deletions guides/source/layout.html.erb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<!doctype html>
<html lang="en">
<html dir="<%= @direction %>" lang="en">

<head>
<meta charset="utf-8">
Expand All @@ -25,10 +25,15 @@
<meta property="og:image" content="https://avatars.githubusercontent.com/u/4223" />
<meta property="og:type" content="website" />

<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Arabic:wght@100..900&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Heebo:wght@100..900&family=Noto+Sans+Arabic:wght@100..900&display=swap" rel="stylesheet">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will these cause the fonts to be downloaded upfront, or just they're actually referenced/needed? (i.e. for those specific languages, assuming we make the change to only refer to them there)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They load on page load. Not sure how we could only include that font for dir changed pages. Is there a technique you'd suggest?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jathayde well, simple erb -> if can do the work.

<% if @direction == "rtl" %>
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Arabic:wght@100..900&display=swap" rel="stylesheet">
  <link href="https://fonts.googleapis.com/css2?family=Heebo:wght@100..900&family=Noto+Sans+Arabic:wght@100..900&display=swap" rel="stylesheet">
<% endif %>

Also, you can use unicode-range and system fonts without using 3rd party fonts.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@idangoldman unfortunately because we may swap dir on-the-fly with a google translation trigger, it won't work to embed that conditional via ERB.

We'd have to do it via JS and manually append the link tags when the translation changes.

I don't know much/enough about those system fonts for this though, @jathayde do you / have you tried?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@carlosantoniodasilva yeah fair point...

After looking into the codebase, I saw that all the currently used fonts in the guides are declaired as @font-face in guides/assets/stylesrc/style.scss.

@jathayde, what about adding the new fonts support into that file as @font-face with specific unicode-range, that way the fonts will be used (downloaded) only if characters on the unicode-range are presented on the screen.

Stay with me, it's a bit long ->

/* RTL Fonts Support for Arabic */
@font-face { font-family:"Noto Sans Arabic"; font-style:normal; font-weight:100; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-Thin.woff2?v=4.0") format("woff2"); }
@font-face { font-family:"Noto Sans Arabic"; font-style:italic; font-weight:100; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-ThinItalic.woff2?v=4.0") format("woff2"); }
@font-face { font-family:"Noto Sans Arabic"; font-style:normal; font-weight:200; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-ExtraLight.woff2?v=4.0") format("woff2"); }
@font-face { font-family:"Noto Sans Arabic"; font-style:italic; font-weight:200; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-ExtraLightItalic.woff2?v=4.0") format("woff2"); }
@font-face { font-family:"Noto Sans Arabic"; font-style:normal; font-weight:300; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-Light.woff2?v=4.0") format("woff2"); }
@font-face { font-family:"Noto Sans Arabic"; font-style:italic; font-weight:300; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-LightItalic.woff2?v=4.0") format("woff2"); }
@font-face { font-family:"Noto Sans Arabic"; font-style:normal; font-weight:400; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-Regular.woff2?v=4.0") format("woff2"); }
@font-face { font-family:"Noto Sans Arabic"; font-style:italic; font-weight:400; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-Italic.woff2?v=4.0") format("woff2"); }
@font-face { font-family:"Noto Sans Arabic"; font-style:normal; font-weight:500; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-Medium.woff2?v=4.0") format("woff2"); }
@font-face { font-family:"Noto Sans Arabic"; font-style:italic; font-weight:500; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-MediumItalic.woff2?v=4.0") format("woff2"); }
@font-face { font-family:"Noto Sans Arabic"; font-style:normal; font-weight:600; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-SemiBold.woff2?v=4.0") format("woff2"); }
@font-face { font-family:"Noto Sans Arabic"; font-style:italic; font-weight:600; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-SemiBoldItalic.woff2?v=4.0") format("woff2"); }
@font-face { font-family:"Noto Sans Arabic"; font-style:normal; font-weight:700; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-Bold.woff2?v=4.0") format("woff2"); }
@font-face { font-family:"Noto Sans Arabic"; font-style:italic; font-weight:700; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-BoldItalic.woff2?v=4.0") format("woff2"); }
@font-face { font-family:"Noto Sans Arabic"; font-style:normal; font-weight:800; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-ExtraBold.woff2?v=4.0") format("woff2"); }
@font-face { font-family:"Noto Sans Arabic"; font-style:italic; font-weight:800; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-ExtraBoldItalic.woff2?v=4.0") format("woff2"); }
@font-face { font-family:"Noto Sans Arabic"; font-style:normal; font-weight:900; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-Black.woff2?v=4.0") format("woff2"); }
@font-face { font-family:"Noto Sans Arabic"; font-style:italic; font-weight:900; font-display:swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; src:url("https://rubyonrails.org/assets/fonts/NotoSansArabic-BlackItalic.woff2?v=4.0") format("woff2"); }

/* RTL Fonts Support for Hebrew */
@font-face { font-family:Heebo; font-style:normal; font-weight:100; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-Thin.woff2?v=4.0") format("woff2"); }
@font-face { font-family:Heebo; font-style:italic; font-weight:100; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-ThinItalic.woff2?v=4.0") format("woff2"); }`
@font-face { font-family:Heebo; font-style:normal; font-weight:200; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-ExtraLight.woff2?v=4.0") format("woff2"); }
@font-face { font-family:Heebo; font-style:italic; font-weight:200; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-ExtraLightItalic.woff2?v=4.0") format("woff2"); }
@font-face { font-family:Heebo; font-style:normal; font-weight:300; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-Light.woff2?v=4.0") format("woff2"); }
@font-face { font-family:Heebo; font-style:italic; font-weight:300; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-LightItalic.woff2?v=4.0") format("woff2"); }
@font-face { font-family:Heebo; font-style:normal; font-weight:400; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-Regular.woff2?v=4.0") format("woff2"); }
@font-face { font-family:Heebo; font-style:italic; font-weight:400; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-Italic.woff2?v=4.0") format("woff2"); }
@font-face { font-family:Heebo; font-style:normal; font-weight:500; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-Medium.woff2?v=4.0") format("woff2"); }
@font-face { font-family:Heebo; font-style:italic; font-weight:500; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-MediumItalic.woff2?v=4.0") format("woff2"); }
@font-face { font-family:Heebo; font-style:normal; font-weight:600; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-SemiBold.woff2?v=4.0") format("woff2"); }
@font-face { font-family:Heebo; font-style:italic; font-weight:600; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-SemiBoldItalic.woff2?v=4.0") format("woff2"); }
@font-face { font-family:Heebo; font-style:normal; font-weight:700; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-Bold.woff2?v=4.0") format("woff2"); }
@font-face { font-family:Heebo; font-style:italic; font-weight:700; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-BoldItalic.woff2?v=4.0") format("woff2"); }
@font-face { font-family:Heebo; font-style:normal; font-weight:800; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-ExtraBold.woff2?v=4.0") format("woff2"); }
@font-face { font-family:Heebo; font-style:italic; font-weight:800; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-ExtraBoldItalic.woff2?v=4.0") format("woff2"); }
@font-face { font-family:Heebo; font-style:normal; font-weight:900; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-Black.woff2?v=4.0") format("woff2"); }
@font-face { font-family:Heebo; font-style:italic; font-weight:900; font-display:swap; unicode-range: U+0590-05FF, U+FB1D-FB4F; src:url("https://rubyonrails.org/assets/fonts/Heebo-BlackItalic.woff2?v=4.0") format("woff2"); }

One thing, I haven't found how the fonts are generated/downloaded/stored on rubyonrails.org.

Another thing, Inter, Noto Sans Arabic, Heebo font face declaration can become more readable with writing a mixin inputs a map of the fonts options and outputs the above.

References:

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Playing with this right now and the only issue I've got is that Google bypasses this step for you when you serve from their CDN. We could download and host the fonts, but without doing that, I don't see a clear way to limit to unicode ranges. @carlosantoniodasilva do we want to try and serve these from our domain?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, I think we could leverage a variable font to reduce the @font-face calls instead of needing 18 declarations for each weight/style combo.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jathayde I don't think we want to include all of those font-faces on rubyonrails.org . We did that for the main guides fonts, but this seems very specific use case to store there, we should leverage google instead.

What I'd prefer is just not load up those fonts upfront, but instead when they swap to a font that does require them. We could perhaps use JS to programmatically load the fonts from Google (by adding the tags to the head) when they select one of the fonts that require it? I don't think this is a blocker, but if that sounds like it could be okay I could look into it.


<meta name="theme-color" content="#C81418">
</head>

<body dir="<%= @direction %>" class="guide">
<body class="guide">
<nav id="topNav" aria-label="Secondary">
<div class="wrapper">
<strong class="more-info-label">More at <a href="https://rubyonrails.org/">rubyonrails.org:</a> </strong>
Expand Down