blob: 0a0ff2e8b1c7a3d1ec0908c89f15d821e184d457 [file] [log] [blame]
// Copyright (C) 2020 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// -----------------------------------------------------------------------------
// Common + CSS reset
// -----------------------------------------------------------------------------
:root {
--site-header-height: 50px;
--home-highlights-height: 128px;
--content-max-width: 1100px;
--anim-ease: cubic-bezier(0.4, 0, 0.2, 1);
// This is set to 1 by JS after onload. This is to prevent flickering on
// page load on the nav bar and other entries while transitioning in their
// initial state.
--anim-enabled: 0;
--anim-time: calc(0.15s * var(--anim-enabled));
}
$wide: "(max-width: 1100px)";
$mobile: "(max-width: 768px)";
@mixin minimal-scrollbar {
&::-webkit-scrollbar {
width: 8px;
background-color: transparent;
}
&::-webkit-scrollbar-thumb {
background-color: #ccc;
border-radius: 8px;
}
}
@media (max-aspect-ratio: 1/1) {
:root {
--home-highlights-height: 256px;
}
}
* {
box-sizing: border-box;
-webkit-tap-highlight-color: none;
}
html {
font-family: Roboto, sans-serif;
-webkit-font-smoothing: antialiased;
}
html,
body {
padding: 0;
margin: 0;
}
h1,
h2,
h3 {
font-family: inherit;
font-size: inherit;
font-weight: inherit;
padding: 0;
margin: 0;
}
// -----------------------------------------------------------------------------
// Site header
// -----------------------------------------------------------------------------
.site-header {
background-color: hsl(210, 30%, 16%);
color: hsl(210, 17%, 98%);
position: sticky; // Sticky so the .docs element below doesn't start @ 0.
top: 0;
width: 100%;
--sh-padding-y: 5px;
max-height: var(--site-header-height);
padding: var(--sh-padding-y) 30px;
box-shadow: rgba(0, 0, 0, 0.3) 0 3px 3px 0;
overflow: hidden;
display: flex;
z-index: 10;
transition: max-height var(--anim-ease) var(--anim-time);
&.expanded {
max-height: 100vh;
}
.brand {
img {
height: 40px;
vertical-align: bottom;
}
font-weight: 200;
font-size: 28px;
flex-grow: 1;
.brand-docs {
text-transform: uppercase;
font-size: 14px;
color: #ecba2a;
vertical-align: bottom;
line-height: 30px;
font-weight: 400;
}
}
> *:not(:first-child) {
line-height: calc(var(--site-header-height) - var(--sh-padding-y) * 2);
font-family: "Source Sans Pro", sans-serif;
font-weight: 400;
font-size: 1.1rem;
margin: 0 20px;
color: hsl(210, 17%, 85%);
}
a {
text-decoration: none;
&:hover {
color: hsl(210, 17%, 100%);
}
}
.menu {
visibility: hidden;
font-family: "Material Icons Round";
font-size: 24px;
text-align: center;
position: absolute;
right: 0;
top: 0;
line-height: var(--site-header-height);
}
@media #{$mobile} {
flex-direction: column;
> *:not(:first-child) {
margin-left: 40px;
}
.menu {
visibility: visible;
}
}
}
#search {
position: relative;
flex-grow: 0;
transition: flex-grow cubic-bezier(1, 0.01, 1, 1) var(--anim-time),
background-color ease var(--anim-time);
padding: 0;
&::before {
visibility: hidden;
user-select: none;
content: "";
position: fixed;
left: 0;
right: 0;
top: var(--site-header-height);
bottom: 0;
z-index: -100;
background-color: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(3px);
opacity: 0;
transition: opacity ease var(--anim-time), visibility 0s;
}
&:focus-within {
flex-grow: 1000;
&::before {
display: block;
opacity: 1;
visibility: visible;
}
#search-res {
display: block;
}
}
@media #{$mobile} {
display: none;
}
#search-box {
width: 100%;
height: 32px;
font-size: 1rem;
color: #333;
background-color: rgba(255, 255, 255, 0.9);
border: 1px solid #eee;
border-radius: 2px;
background-image: url('data:image/svg+xml;utf-8,<svg xmlns="http://www.w3.org/2000/svg" height="48" width="48"><path d="M39.8 41.95 26.65 28.8q-1.5 1.3-3.5 2.025-2 .725-4.25.725-5.4 0-9.15-3.75T6 18.75q0-5.3 3.75-9.05 3.75-3.75 9.1-3.75 5.3 0 9.025 3.75 3.725 3.75 3.725 9.05 0 2.15-.7 4.15-.7 2-2.1 3.75L42 39.75Zm-20.95-13.4q4.05 0 6.9-2.875Q28.6 22.8 28.6 18.75t-2.85-6.925Q22.9 8.95 18.85 8.95q-4.1 0-6.975 2.875T9 18.75q0 4.05 2.875 6.925t6.975 2.875Z"/></svg>');
background-repeat: no-repeat;
background-size: contain;
padding-left: 40px;
outline: none;
&:hover,
&:focus {
background-color: rgba(255, 255, 255, 0.95);
}
}
#search-res {
display: none;
background-color: rgba(255, 255, 255, 1);
border: 1px solid #eee;
box-shadow: #aaa 0px 1px 5px;
color: #333;
line-height: initial;
margin-top: -4px;
overflow-x: auto;
position: fixed;
top: var(--site-header-height);
max-height: calc(100vh - var(--site-header-height));
z-index: 10;
> div {
padding: 10px;
margin: 0;
&:hover {
background-color: #f0f0f0;
}
}
.sr-title {
color: #333;
font-weight: bold;
}
.sr-snippet {
color: #444;
font-size: 0.9rem;
}
a {
text-decoration: none;
}
a:hover {
color: initial;
}
&:empty {
visibility: hidden;
}
}
}
// -----------------------------------------------------------------------------
// Site footer
// -----------------------------------------------------------------------------
// Footer in the index page.
.site-footer {
background-color: hsl(210, 30%, 16%);
padding: 1em 0;
font-size: 14px;
color: #fff;
text-align: center;
ul {
list-style: none;
margin: 0;
padding: 0;
li {
display: inline;
padding: 0 10px;
&:not(:last-child) {
border-right: solid 1px #fff;
}
}
}
a,
a:visited {
text-decoration: none;
color: inherit;
}
.docs-footer-notice {
display: none;
}
}
// Footer overrides for the /docs/ page.
.docs .site-footer {
grid-area: footer;
background: transparent;
color: #666;
text-align: left;
margin: 0 20px;
padding: 12px 0;
.docs-footer-notice {
padding: 0;
margin: 0;
display: block;
}
ul {
display: none;
}
}
// -----------------------------------------------------------------------------
// Site content
// -----------------------------------------------------------------------------
.site-content {
.section-wrapper {
border-bottom: solid 1px #eee;
&:nth-child(2n + 1) {
background-color: hsl(210, 17%, 98%);
}
}
section {
display: block;
position: relative;
overflow: hidden;
padding: 0 20px;
margin: 0 auto;
max-width: calc(var(--content-max-width) + 2 * 20px);
}
.banner {
height: calc(
100vh - var(--home-highlights-height) - var(--site-header-height)
);
@media (max-height: 639px) {
// If the screen is too short (e.g. smartphone in landscape mode)
// move the highlights sections (the four tiles) out of the visible
// viewport.
height: calc(100vh - var(--site-header-height));
}
min-height: 25vw;
display: grid;
grid-template-columns: 1fr;
grid-template-rows: 1fr 1fr 5fr;
h1,
h2 {
margin: auto;
font-family: "Source Sans Pro", sans-serif;
text-align: center;
color: hsl(0, 0, 35%);
span {
white-space: nowrap;
}
}
h1 {
font-size: 2.5rem;
font-size: calc(min(4rem, 8vw, 6vh));
font-weight: 400;
padding-top: calc(max(1rem, 2vh));
}
h2 {
font-size: 1.25rem;
font-size: calc(min(2rem, 6vw, 4vh));
font-weight: 200;
padding-top: 10px;
}
.home-img {
padding: 1rem 0;
overflow: hidden;
position: relative;
display: flex;
img {
max-height: 100%;
max-width: 100%;
margin: auto;
display: block;
}
}
}
.home-highlights {
&:before {
border-top: 1px solid hsl(210, 17%, 90%);
}
height: var(--home-highlights-height);
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: 1fr;
background-color: #fff;
z-index: 2;
@media (max-aspect-ratio: 1/1) {
grid-template-columns: repeat(2, 1fr);
}
> a {
color: hsl(0, 0, 20%);
font-size: 22px;
font-weight: 400;
text-align: center;
padding: 20px 0;
font-family: "Source Sans Pro", sans-serif;
text-decoration: none;
.icon {
background-image: url("/assets/sprite.png");
background-repeat: no-repeat;
width: 64px;
height: 64px;
margin: auto;
background-size: 256px 128px;
filter: grayscale(1);
transition: filter ease var(--anim-time);
}
&:nth-child(1) .icon {
background-position: 0 -64px;
}
&:nth-child(2) .icon {
background-position: -64px -64px;
}
&:nth-child(3) .icon {
background-position: -128px -64px;
}
&:nth-child(4) .icon {
background-position: -192px -64px;
}
&:hover {
background-color: hsl(210, 17%, 90%);
.icon {
filter: grayscale(0);
}
}
}
}
.home-section {
min-height: calc(min(100vh - var(--site-header-height), 800px));
padding: 5% 20px;
display: grid;
grid-template-rows: 1fr;
grid-column-gap: 4vw;
> img {
grid-area: img;
max-width: 100%;
max-height: 55vh;
margin: auto;
margin-top: 40px;
}
h2,
> div {
grid-area: content;
}
h2 {
font-family: "Source Sans Pro", sans-serif;
font-weight: 600;
font-size: 2.5rem;
color: #333;
text-align: center;
}
&:nth-child(2n) {
grid-template-columns: 5fr 4fr;
grid-template-areas: "content img";
h2 {
padding: 0 0 0 50px;
text-align: left;
}
}
&:nth-child(2n + 1) {
grid-template-columns: 4fr 5fr;
grid-template-areas: "img content";
h2 {
padding: 0 50px 0 0;
text-align: left;
}
}
@media (max-aspect-ratio: 1/1) {
padding: 5vh 20px;
&:nth-child(n) {
grid-template-rows: auto auto;
grid-template-columns: 1fr;
grid-template-areas: "img" "content";
grid-row-gap: 30px;
h2 {
padding: 0;
text-align: center;
}
}
> img {
padding: 0 10vw;
}
}
div {
grid-area: content;
.button {
display: inline-block;
background: #337ab7;
font-weight: 500;
color: #fff;
border-radius: 6px;
font-size: 18px;
padding: 10px 16px;
transition: background-color ease var(--anim-time);
text-decoration: none;
&:hover {
background: #286090;
}
}
}
.home-item {
display: grid;
grid-template-rows: auto auto;
grid-template-columns: 50px auto;
grid-template-areas: "img title" "img label";
grid-column-gap: 20px;
padding: 20px 30px;
margin: 10px 0;
// border: 1px solid #eee;
font-family: "Source Sans Pro", sans-serif;
color: #111111;
transition: filter var(--anim-ease) var(--anim-time),
background-color var(--anim-ease) var(--anim-time),
transform var(--anim-ease) var(--anim-time),
box-shadow linear var(--anim-time);
border-radius: 6px;
filter: opacity(0.6);
&:hover {
background-color: hsla(0, 0, 0, 0.02);
filter: opacity(1);
transform: scale(1.01);
}
> img,
> i {
grid-area: img;
margin: auto;
font-size: 50px;
}
> h3 {
grid-area: title;
font-size: 1.25rem;
line-height: 20px;
font-weight: 600;
}
> p {
grid-area: label;
font-size: 1rem;
font-weight: 400;
margin: 1em 0;
}
}
}
}
// -----------------------------------------------------------------------------
// Docs
// -----------------------------------------------------------------------------
.docs {
min-height: 100vh;
display: grid;
--nav-width: 240px;
--toc-width: 180px;
// 1665px is the clientWidth on a macbook pro. Adjust the layout so that
// the max-width of the central .doc fits precisely when the browser is
// full-screen on a macbook.
--max-doc-width: calc(1665px - var(--toc-width) - var(--nav-width));
grid-template-columns: var(--nav-width) minmax(auto, var(--max-doc-width)) var(
--toc-width
);
grid-template-rows: 1fr max-content;
grid-template-areas: "nav doc toc" "nav footer toc";
background-color: hsl(210, 10%, 97%);
.nav {
grid-area: nav;
border-right: 1px solid hsl(210, 30%, 90%);
background-color: #fefefe;
padding: 20px 0;
padding-right: 16px;
position: sticky;
top: var(--site-header-height);
height: calc(100vh - var(--site-header-height));
overflow-y: auto;
@include minimal-scrollbar;
a {
color: inherit;
text-decoration: none;
line-height: 24px;
display: flex;
transition: background-color var(--anim-ease) var(--anim-time),
visibility linear var(--anim-time);
border-radius: 0 10px 10px 0;
-webkit-tap-highlight-color: transparent;
&[href] {
&:hover {
color: #000;
background-color: #f1f3f4;
}
&.selected {
background-color: #ecba2a;
}
}
}
ul {
list-style: none;
margin: 0;
padding: 0;
overflow: hidden;
li {
font-size: 1rem;
font-weight: 400;
font-family: "Source Sans Pro", sans-serif;
color: #4a4a4a;
max-width: 100%;
margin: 3px 0;
}
p {
margin: 0;
}
}
// Applies only to outer-level submenus.
> ul {
position: static; // Otherwise gets v-centered in the middle.
> li {
padding-bottom: 10px;
margin-bottom: 10px;
font-weight: 600;
color: #111;
&:not(:last-child) {
border-bottom: 1px solid #eee;
}
&.compressible {
> p > a::after {
content: "keyboard_arrow_up";
font-family: "Material Icons Round";
font-size: 24px;
width: 24px;
transition: transform var(--anim-ease) var(--anim-time);
margin: 0 0 0 auto;
font-weight: 200;
color: #666;
}
> ul {
transition: max-height var(--anim-ease) var(--anim-time),
opacity var(--anim-ease) var(--anim-time);
opacity: 1;
}
&.compressed {
// The JS will compute and set the maxHeight on each
// element depending on the size of their children.
// !important is needed to override the element-inline
// max-height property set by JS, which is prioritary.
> ul {
max-height: 0 !important;
visibility: hidden;
opacity: 0;
}
> p > a::after {
transform: scaleY(-1);
}
}
} // .compressible
}
}
li a {
padding-left: 16px;
}
li li a {
padding-left: 30px;
}
li li li a {
padding-left: 44px;
}
.expanded a::after {
transform: rotate(180deg);
}
}
.doc {
grid-area: doc;
background-color: #fff;
margin: 20px;
padding: 30px 40px;
font-family: Roboto, sans-serif;
font-size: 1rem;
font-weight: 400;
line-height: 24px;
-webkit-font-smoothing: antialiased;
color: #4a4a4a;
position: relative;
box-shadow: 0 1px 2px 0 rgba(60, 64, 67, 0.1),
0 1px 3px 1px rgba(60, 64, 67, 0.15);
overflow: hidden;
a {
text-decoration: none;
&:link {
color: #007b83;
}
&:visited {
color: #8e3317;
}
&:hover {
color: #009da8;
}
&[href^="http"] {
// External link.
&:after {
content: "open_in_new";
font-family: "Material Icons Round";
color: #666;
text-decoration: none;
margin-left: 2px;
margin-right: 4px;
vertical-align: bottom;
}
}
}
h1,
h2,
h3 {
margin: 10px 0;
padding: 0;
padding-top: 30px;
}
h1 {
font-size: 2.25rem;
line-height: 2.25rem;
margin: 0;
padding: 0;
margin-bottom: 1.5rem;
font-family: "Source Sans Pro", sans-serif;
}
h2 {
font-size: 1.5rem;
border-bottom: 1px solid #e8eaed;
padding-bottom: 6px;
}
h3 {
font-size: 1.25rem;
}
* {
max-width: 100%;
}
img[alt$="screenshot"] {
box-shadow: 0 0 10px 2px #eee;
}
code:not(.code-block) {
background: hsla(210, 17%, 90%, 0.2);
border: 1px solid #e8eaed;
border-radius: 6px;
padding: 1px 4px;
}
.code-block {
overflow-x: auto;
white-space: pre;
border-radius: 6px;
box-shadow: 1px 1px 6px #999;
border-top: 5px solid #8bc34a;
}
// Hide mermaid graphs until they are rendered, this is to avoid showing
// the mermaid source while the renderer generates the SVG.
.mermaid {
transition: opacity var(--anim-ease) var(--anim-time);
&:not(.rendered) {
opacity: 0;
}
}
.anchor {
margin-left: -29px;
padding-right: 5px;
text-decoration: none;
position: absolute;
padding-top: var(--site-header-height);
margin-top: calc(-1 * var(--site-header-height));
outline: none;
opacity: 0;
transition: opacity var(--anim-ease) var(--anim-time);
&::before {
content: "insert_link";
font-family: "Material Icons Round";
color: #333;
font-size: 24px;
}
}
*:hover .anchor {
opacity: 1;
}
code {
font-family: "Roboto Mono", monospace;
font-size: 14px;
}
table {
width: 100%;
font-size: 14px;
border-spacing: 0;
border-collapse: collapse;
th,
td {
padding: 8px;
border: 0 solid #dadce0;
border-top-width: 1px;
border-bottom-width: 1px;
}
tr {
height: 20px;
}
tr:target {
background-color: #ecba2a;
}
thead {
text-align: left;
background-color: #e8eaed;
color: #202124;
}
}
&[data-md-file^="/docs/reference/"] {
h1,
h2,
h3 {
code {
margin-left: 20px;
color: #666;
}
}
table {
width: 100%;
font-size: 14px;
border-spacing: 0;
border-collapse: collapse;
th,
td {
padding: 8px;
border: 0 solid #dadce0;
border-top-width: 1px;
border-bottom-width: 1px;
}
tr {
height: 20px;
}
thead {
text-align: left;
background-color: #e8eaed;
color: #202124;
}
td {
&:first-child {
background: #f7f7f7;
}
/* Not really 100% but makes sure that the description
* column takes most of the width */
&:last-child {
width: 80%;
}
}
}
}
.callout {
padding: 0.5rem 0.5rem 0.5rem 2rem;
border: none;
border-radius: 2px;
margin-left: auto;
margin-right: auto;
width: 90%;
border-left: 3px solid transparent;
box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05),
0 0 0.05rem rgba(0, 0, 0, 0.1);
&:before {
font-family: "Material Icons Round";
position: absolute;
font-size: 1.5rem;
margin-left: -1.75rem;
margin-top: -2px;
}
&.note {
background-color: #e8f0fe;
border-color: #1967d2;
color: #1967d2;
&:before {
content: "bookmark";
}
}
&.summary {
background-color: #e4f7fb;
border-color: #129eaf;
color: #129eaf;
&:before {
content: "sms";
}
}
&.tip {
background-color: #e6f4ea;
border-color: #188038;
color: #188038;
&:before {
content: "star";
}
}
&.todo {
background-color: #f1f3f4;
border-color: #5f6368;
color: #5f6368;
&:before {
content: "error";
}
}
&.warning {
background-color: #fce8e6;
border-color: #c5221f;
color: #c5221f;
&:before {
content: "warning";
}
}
}
}
.toc {
grid-area: toc;
padding: 20px 16px 20px 0;
position: sticky;
top: var(--site-header-height);
height: calc(100vh - var(--site-header-height));
overflow-y: auto;
@include minimal-scrollbar;
font-family: "Source Sans Pro", sans-serif;
word-break: break-word;
a {
text-decoration: none;
}
a,
a:visited {
color: #333;
}
a.highlighted {
font-weight: 500;
color: hsl(45, 100%, 40%);
}
font-size: 0.875rem;
ul {
list-style: none;
margin: 0;
padding: 0;
li {
margin: 5px 0;
/* This make it so that a single word gets elided but if there
* are multiple words they span across lines. */
overflow: hidden;
text-overflow: ellipsis;
white-space: break-spaces;
word-break: normal;
}
}
> ul {
border-left: 4px solid #ecba2a;
padding-left: 10px;
position: static; // Otherwise gets v-centered in the middle.
top: calc(var(--site-header-height) + 25px);
}
}
@media #{$wide} {
grid-template-columns: var(--nav-width) auto 0;
.toc {
display: none;
}
}
@media #{$mobile} {
display: block;
.doc {
margin: 0;
padding: 20px;
}
.nav {
// JS will persistently toggle to .after_first_click. This is to
// avoid spurious transitions on page load.
display: none;
--nav-width-mobile: calc(min(90vw, 360px));
width: var(--nav-width-mobile);
position: fixed;
z-index: 2;
height: 100vh;
overflow-y: auto;
top: var(--site-header-height);
transition: transform var(--anim-ease) var(--anim-time),
box-shadow var(--anim-ease) var(--anim-time),
visibility ease var(--anim-time);
transform: translateX(calc(-1 * var(--nav-width-mobile)));
visibility: hidden;
> ul {
position: static;
top: 0;
}
&.after_first_click {
display: block;
}
&.expanded {
visibility: visible;
transform: translateX(0);
box-shadow: 0 1px 0 100vw rgba(0, 0, 0, 0.4);
}
}
}
}