Files
Andreas Reinhold / reiniandClaude Opus 5 7ffc1c1ead
docker / test (8.5) (push) Successful in 3m29s
linter / quality (push) Successful in 1m21s
tests / ci (8.5) (push) Successful in 3m27s
docker / build-and-push (push) Successful in 7m38s
docker / release (push) Skipped
Give the website the app's Material 3 look
The site's tokens now carry the app's --md-sys-* names, with shape,
elevation, motion, state, type and spacing values copied from Livewire
Material 2.1 and the colours from the indigo profile, including its
high-contrast light and dark values for prefers-contrast: more. Cards
are outlined, the gallery uses a connected button group instead of
segmented buttons, buttons use M3 Expressive sizes, state layers and
pressed shapes, and layouts follow the M3 window classes with logical
properties. A Light/Dark/System toggle in the nav sets data-theme
before the first paint, and no text is dimmed with opacity.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 22:58:24 +02:00

1652 lines
47 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* SealShare website theme.
*
* The site looks like the app: Material 3 Expressive as Livewire Material 2.1 draws it, written by hand
* in plain CSS, because the site has no build step. The tokens carry the app's names (--md-sys-*) and
* its values, copied here rather than imported, so nothing loads from another host:
*
* - Colour roles from the indigo profile in resources/css/material-scheme.json (seed #4f46e5,
* Vibrant, Material 3 spec 2025): profiles.indigo.light and .dark at standard contrast, and
* profiles.indigo.contrast.high.light and .dark for visitors whose system asks for more contrast
* (prefers-contrast: more). The medium contrast level is not used. Only the roles the site draws
* with are copied; copy them again when indigo is regenerated differently. The site does not
* follow the colour profile an admin chooses.
* - Shape, elevation, motion, state, type and spacing from Livewire Material's token files
* (vendor/nonameweb/livewire-material/resources/css/tokens/), only the tokens used below.
*
* Light or dark is <html data-theme>, written before the first paint by the inline script in each
* page's <head> from the visitor's choice in the nav (Light, Dark or System, remembered in
* localStorage). Without JavaScript the attribute is absent and the system setting decides.
*
* Widths are M3's window size classes: compact below 600px, medium from 600px, expanded from 840px,
* large from 1200px.
*
* Shared by index.html and privacy.html.
*/
/* Google Sans Flex, the app's typeface, served from this site (SIL OFL 1.1, fonts/OFL.txt) — not
from Google, which would hand every visitor's IP address to Google. The same cut the app ships:
Latin and Latin Extended, weight 400700. */
@font-face {
font-family: 'Google Sans Flex';
src: url('../fonts/GoogleSansFlex-Latin.woff2') format('woff2');
font-weight: 400 700;
font-style: normal;
font-display: swap;
}
/* ---------------------------------------------------------------- tokens */
:root {
color-scheme: light;
/* Colour: indigo, light, standard contrast (profiles.indigo.light). */
--md-sys-color-surface: #faf4ff;
--md-sys-color-surface-container-low: #f5eeff;
--md-sys-color-surface-container: #ede4ff;
--md-sys-color-surface-container-high: #e8deff;
--md-sys-color-surface-container-highest: #e2d7ff;
--md-sys-color-on-surface: #32294f;
--md-sys-color-on-surface-variant: #5f557f;
--md-sys-color-outline: #7b719c;
--md-sys-color-outline-variant: #b2a6d5;
--md-sys-color-primary: #4a3fe2;
--md-sys-color-on-primary: #f4f1ff;
--md-sys-color-primary-container: #9795ff;
--md-sys-color-on-primary-container: #14007e;
--md-sys-color-secondary: #6249b2;
--md-sys-color-secondary-container: #d8caff;
--md-sys-color-on-secondary-container: #4e339c;
--md-sys-color-tertiary-container: #fd8bca;
--md-sys-color-on-tertiary-container: #610244;
--md-sys-color-success: #006943;
--md-sys-color-shadow: #000000;
/* Shape (tokens/shape.css). */
--md-sys-shape-corner-xs: 4px;
--md-sys-shape-corner-sm: 8px;
--md-sys-shape-corner-md: 12px;
--md-sys-shape-corner-full: 9999px;
/* Elevation (tokens/elevation.css). */
--md-sys-elevation-1: 0 1px 2px 0 color-mix(in srgb, var(--md-sys-color-shadow) 30%, transparent), 0 1px 3px 1px color-mix(in srgb, var(--md-sys-color-shadow) 15%, transparent);
--md-sys-elevation-2: 0 1px 2px 0 color-mix(in srgb, var(--md-sys-color-shadow) 30%, transparent), 0 2px 6px 2px color-mix(in srgb, var(--md-sys-color-shadow) 15%, transparent);
/* Motion (tokens/motion.css): Expressive springs sampled into linear(), each with its duration. */
--md-sys-motion-spatial-fast: linear(0, 0.0195, 0.0716, 0.1471, 0.2381, 0.3378, 0.4404, 0.5416, 0.6378, 0.7265, 0.806, 0.8754, 0.9342, 0.9826, 1.0211, 1.0503, 1.0713, 1.0849, 1.0924, 1.0948, 1.0931, 1.0882, 1.0812, 1.0726, 1.0632, 1.0534, 1.0438, 1.0347, 1.0263, 1.0187, 1.0121, 1.0064, 1.0018, 0.9981, 0.9953, 0.9933, 0.992, 0.9913, 0.991, 0.9912, 0.9916, 0.9923, 0.9931, 0.994, 0.9949, 0.9958, 0.9967, 0.9975, 1);
--md-sys-motion-spatial-fast-duration: 350ms;
--md-sys-motion-effects-fast: linear(0, 0.0163, 0.0576, 0.1147, 0.1807, 0.2507, 0.3214, 0.3902, 0.4558, 0.5172, 0.5737, 0.6253, 0.6718, 0.7136, 0.7508, 0.7837, 0.8128, 0.8383, 0.8606, 0.8801, 0.897, 0.9117, 0.9244, 0.9353, 0.9448, 0.9529, 0.9599, 0.9658, 0.9709, 0.9753, 0.979, 0.9822, 0.9849, 0.9872, 0.9892, 0.9909, 0.9923, 0.9935, 0.9945, 0.9954, 0.9961, 0.9967, 0.9972, 0.9977, 0.998, 0.9983, 0.9986, 0.9988, 1);
--md-sys-motion-effects-fast-duration: 150ms;
--md-sys-motion-effects-default: linear(0, 0.0124, 0.0446, 0.0902, 0.1443, 0.2032, 0.2642, 0.3253, 0.3849, 0.4422, 0.4963, 0.547, 0.594, 0.6372, 0.6768, 0.7127, 0.7452, 0.7745, 0.8009, 0.8244, 0.8454, 0.8641, 0.8807, 0.8954, 0.9084, 0.9199, 0.93, 0.9389, 0.9467, 0.9536, 0.9596, 0.9648, 0.9694, 0.9734, 0.9769, 0.98, 0.9826, 0.985, 0.987, 0.9887, 0.9902, 0.9916, 0.9927, 0.9937, 0.9946, 0.9953, 0.9959, 0.9965, 1);
--md-sys-motion-effects-default-duration: 200ms;
/* State (tokens/state.css). */
--md-sys-state-hover-state-layer-opacity: 0.08;
--md-sys-state-focus-state-layer-opacity: 0.1;
--md-sys-state-pressed-state-layer-opacity: 0.1;
--md-sys-state-disabled-content-opacity: 0.38;
--md-sys-state-disabled-container-opacity: 0.12;
/* Type (tokens/type.css). */
--md-ref-typeface-brand: 'Google Sans Flex', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
--md-ref-typeface-plain: var(--md-ref-typeface-brand);
--md-ref-typeface-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
--md-ref-typeface-weight-regular: 400;
--md-ref-typeface-weight-medium: 500;
--md-sys-typescale-display-lg: var(--md-ref-typeface-weight-regular) 3.5625rem/4rem var(--md-ref-typeface-brand);
--md-sys-typescale-display-lg-tracking: -0.0125rem;
--md-sys-typescale-display-md: var(--md-ref-typeface-weight-regular) 2.8125rem/3.25rem var(--md-ref-typeface-brand);
--md-sys-typescale-display-md-tracking: 0rem;
--md-sys-typescale-display-sm: var(--md-ref-typeface-weight-regular) 2.25rem/2.75rem var(--md-ref-typeface-brand);
--md-sys-typescale-display-sm-tracking: 0rem;
--md-sys-typescale-headline-lg: var(--md-ref-typeface-weight-regular) 2rem/2.5rem var(--md-ref-typeface-brand);
--md-sys-typescale-headline-lg-tracking: 0rem;
--md-sys-typescale-headline-md: var(--md-ref-typeface-weight-regular) 1.75rem/2.25rem var(--md-ref-typeface-brand);
--md-sys-typescale-headline-md-tracking: 0rem;
--md-sys-typescale-title-lg: var(--md-ref-typeface-weight-regular) 1.375rem/1.75rem var(--md-ref-typeface-brand);
--md-sys-typescale-title-lg-tracking: 0rem;
--md-sys-typescale-title-md: var(--md-ref-typeface-weight-medium) 1rem/1.5rem var(--md-ref-typeface-plain);
--md-sys-typescale-title-md-tracking: 0.0125rem;
--md-sys-typescale-title-sm: var(--md-ref-typeface-weight-medium) 0.875rem/1.25rem var(--md-ref-typeface-plain);
--md-sys-typescale-title-sm-tracking: 0.00625rem;
--md-sys-typescale-body-lg: var(--md-ref-typeface-weight-regular) 1rem/1.5rem var(--md-ref-typeface-plain);
--md-sys-typescale-body-lg-tracking: 0.03125rem;
--md-sys-typescale-body-md: var(--md-ref-typeface-weight-regular) 0.875rem/1.25rem var(--md-ref-typeface-plain);
--md-sys-typescale-body-md-tracking: 0.0125rem;
--md-sys-typescale-label-lg: var(--md-ref-typeface-weight-medium) 0.875rem/1.25rem var(--md-ref-typeface-plain);
--md-sys-typescale-label-lg-tracking: 0.00625rem;
/* Spacing (tokens/spacing.css). */
--md-sys-measurement-space25: 2px;
--md-sys-measurement-space50: 4px;
--md-sys-measurement-space75: 6px;
--md-sys-measurement-space100: 8px;
--md-sys-measurement-space200: 16px;
--md-sys-measurement-space300: 24px;
--md-sys-measurement-space400: 32px;
--md-sys-measurement-space500: 40px;
--md-sys-measurement-space600: 48px;
--md-sys-measurement-space700: 56px;
--md-sys-measurement-space800: 64px;
--md-sys-measurement-space900: 72px;
/* The site's own layout: M3's margins (16px compact, 24px from medium) and the page width. */
--site-margin: var(--md-sys-measurement-space200);
--site-width: 1200px;
--site-bar-height: var(--md-sys-measurement-space800);
--site-section-space: var(--md-sys-measurement-space700);
}
/* Colour: indigo, dark, standard contrast (profiles.indigo.dark). */
:root[data-theme="dark"] {
color-scheme: dark;
--md-sys-color-surface: #10062d;
--md-sys-color-surface-container-low: #160b36;
--md-sys-color-surface-container: #1c113f;
--md-sys-color-surface-container-high: #231649;
--md-sys-color-surface-container-highest: #291c53;
--md-sys-color-on-surface: #eae1ff;
--md-sys-color-on-surface-variant: #b0a4d3;
--md-sys-color-outline: #7a6f9b;
--md-sys-color-outline-variant: #4b426a;
--md-sys-color-primary: #a7a5ff;
--md-sys-color-on-primary: #1c00a0;
--md-sys-color-primary-container: #9795ff;
--md-sys-color-on-primary-container: #14007e;
--md-sys-color-secondary: #a98ffd;
--md-sys-color-secondary-container: #4d329b;
--md-sys-color-on-secondary-container: #d6c9ff;
--md-sys-color-tertiary-container: #fa88c8;
--md-sys-color-on-tertiary-container: #5e0042;
--md-sys-color-success: #3bb27b;
}
/* Without JavaScript there is no data-theme, and the system decides: the same dark values. */
@media (prefers-color-scheme: dark) {
:root:not([data-theme]) {
color-scheme: dark;
--md-sys-color-surface: #10062d;
--md-sys-color-surface-container-low: #160b36;
--md-sys-color-surface-container: #1c113f;
--md-sys-color-surface-container-high: #231649;
--md-sys-color-surface-container-highest: #291c53;
--md-sys-color-on-surface: #eae1ff;
--md-sys-color-on-surface-variant: #b0a4d3;
--md-sys-color-outline: #7a6f9b;
--md-sys-color-outline-variant: #4b426a;
--md-sys-color-primary: #a7a5ff;
--md-sys-color-on-primary: #1c00a0;
--md-sys-color-primary-container: #9795ff;
--md-sys-color-on-primary-container: #14007e;
--md-sys-color-secondary: #a98ffd;
--md-sys-color-secondary-container: #4d329b;
--md-sys-color-on-secondary-container: #d6c9ff;
--md-sys-color-tertiary-container: #fa88c8;
--md-sys-color-on-tertiary-container: #5e0042;
--md-sys-color-success: #3bb27b;
}
}
/* High contrast, when the system asks for more: profiles.indigo.contrast.high. Light first, which the
dark selectors below outrank by specificity. */
@media (prefers-contrast: more) {
:root {
--md-sys-color-surface: #faf4ff;
--md-sys-color-surface-container-low: #f5eeff;
--md-sys-color-surface-container: #ede4ff;
--md-sys-color-surface-container-high: #e8deff;
--md-sys-color-surface-container-highest: #e2d7ff;
--md-sys-color-on-surface: #000000;
--md-sys-color-on-surface-variant: #22193f;
--md-sys-color-outline: #433961;
--md-sys-color-outline-variant: #524972;
--md-sys-color-primary: #110075;
--md-sys-color-on-primary: #d3d0ff;
--md-sys-color-primary-container: #3c2ed5;
--md-sys-color-on-primary-container: #ffffff;
--md-sys-color-secondary: #240069;
--md-sys-color-secondary-container: #553ba4;
--md-sys-color-on-secondary-container: #ffffff;
--md-sys-color-tertiary-container: #882964;
--md-sys-color-on-tertiary-container: #ffffff;
--md-sys-color-success: #002515;
}
:root[data-theme="dark"] {
--md-sys-color-surface: #10062d;
--md-sys-color-surface-container-low: #160b36;
--md-sys-color-surface-container: #1c113f;
--md-sys-color-surface-container-high: #231649;
--md-sys-color-surface-container-highest: #291c53;
--md-sys-color-on-surface: #ffffff;
--md-sys-color-on-surface-variant: #eae1ff;
--md-sys-color-outline: #beb2e2;
--md-sys-color-outline-variant: #a99dcc;
--md-sys-color-primary: #e6e2ff;
--md-sys-color-on-primary: #1a0099;
--md-sys-color-primary-container: #9b99ff;
--md-sys-color-on-primary-container: #000000;
--md-sys-color-secondary: #eae1ff;
--md-sys-color-secondary-container: #ac93ff;
--md-sys-color-on-secondary-container: #000000;
--md-sys-color-tertiary-container: #fa88c8;
--md-sys-color-on-tertiary-container: #000000;
--md-sys-color-success: #89fcbf;
}
}
@media (prefers-contrast: more) and (prefers-color-scheme: dark) {
:root:not([data-theme]) {
--md-sys-color-surface: #10062d;
--md-sys-color-surface-container-low: #160b36;
--md-sys-color-surface-container: #1c113f;
--md-sys-color-surface-container-high: #231649;
--md-sys-color-surface-container-highest: #291c53;
--md-sys-color-on-surface: #ffffff;
--md-sys-color-on-surface-variant: #eae1ff;
--md-sys-color-outline: #beb2e2;
--md-sys-color-outline-variant: #a99dcc;
--md-sys-color-primary: #e6e2ff;
--md-sys-color-on-primary: #1a0099;
--md-sys-color-primary-container: #9b99ff;
--md-sys-color-on-primary-container: #000000;
--md-sys-color-secondary: #eae1ff;
--md-sys-color-secondary-container: #ac93ff;
--md-sys-color-on-secondary-container: #000000;
--md-sys-color-tertiary-container: #fa88c8;
--md-sys-color-on-tertiary-container: #000000;
--md-sys-color-success: #89fcbf;
}
}
@media (width >= 600px) {
:root {
--site-margin: var(--md-sys-measurement-space300);
--site-section-space: var(--md-sys-measurement-space900);
}
}
@media (width >= 1200px) {
:root {
--site-section-space: calc(var(--md-sys-measurement-space600) * 2);
}
}
/* Reduced motion zeroes every duration, so everything that moves through the tokens turns instant. */
@media (prefers-reduced-motion: reduce) {
:root {
--md-sys-motion-spatial-fast-duration: 0ms;
--md-sys-motion-effects-fast-duration: 0ms;
--md-sys-motion-effects-default-duration: 0ms;
}
}
/* ---------------------------------------------------------------- base */
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
scroll-padding-top: calc(var(--site-bar-height) + var(--md-sys-measurement-space200));
-webkit-text-size-adjust: 100%;
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
}
body {
margin: 0;
background-color: var(--md-sys-color-surface);
color: var(--md-sys-color-on-surface);
font: var(--md-sys-typescale-body-lg);
letter-spacing: var(--md-sys-typescale-body-lg-tracking);
-webkit-font-smoothing: antialiased;
}
img,
svg {
display: block;
max-width: 100%;
}
a {
color: var(--md-sys-color-primary);
text-decoration-line: underline;
text-decoration-thickness: from-font;
text-underline-offset: 0.15em;
}
/* M3's focus indicator: 3px in secondary, 2px out, for keyboard focus only. */
:focus-visible {
outline: 3px solid var(--md-sys-color-secondary);
outline-offset: 2px;
}
h1,
h2,
h3,
p {
margin: 0;
}
h1,
h2,
h3 {
text-wrap: balance;
}
p {
text-wrap: pretty;
}
code {
font-family: var(--md-ref-typeface-mono);
font-size: 0.9em;
}
.icon {
width: 24px;
height: 24px;
flex-shrink: 0;
fill: currentColor;
}
[hidden] {
display: none !important;
}
/* The icon and shape sprite at the top of each page: symbols only, nothing drawn. */
.sprite {
position: absolute;
width: 0;
height: 0;
overflow: hidden;
}
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
clip-path: inset(50%);
white-space: nowrap;
}
a.skip-link {
position: absolute;
inset-block-start: var(--md-sys-measurement-space100);
inset-inline-start: var(--md-sys-measurement-space100);
z-index: 100;
translate: 0 -200%;
}
a.skip-link:focus-visible {
translate: 0 0;
}
.container {
width: 100%;
max-width: var(--site-width);
margin-inline: auto;
padding-inline: var(--site-margin);
}
/* ---------------------------------------------------------------- type */
/* The hero's line: display, larger as the window grows. */
.display {
font: var(--md-sys-typescale-display-sm);
letter-spacing: var(--md-sys-typescale-display-sm-tracking);
}
@media (width >= 600px) {
.display {
font: var(--md-sys-typescale-display-md);
letter-spacing: var(--md-sys-typescale-display-md-tracking);
}
}
@media (width >= 1200px) {
.display {
font: var(--md-sys-typescale-display-lg);
letter-spacing: var(--md-sys-typescale-display-lg-tracking);
}
}
/* Page and section titles. */
.headline {
font: var(--md-sys-typescale-headline-md);
letter-spacing: var(--md-sys-typescale-headline-md-tracking);
}
@media (width >= 600px) {
.headline {
font: var(--md-sys-typescale-headline-lg);
letter-spacing: var(--md-sys-typescale-headline-lg-tracking);
}
}
/* Card titles. */
.title {
font: var(--md-sys-typescale-title-lg);
letter-spacing: var(--md-sys-typescale-title-lg-tracking);
}
.lede {
max-inline-size: 60ch;
color: var(--md-sys-color-on-surface-variant);
font: var(--md-sys-typescale-body-lg);
letter-spacing: var(--md-sys-typescale-body-lg-tracking);
}
/* A section's label above its title: an icon and a word on a tonal pill, not interactive. */
.eyebrow {
display: inline-flex;
justify-self: start;
width: fit-content;
align-items: center;
gap: var(--md-sys-measurement-space100);
padding-block: var(--md-sys-measurement-space75);
padding-inline: calc(var(--md-sys-measurement-space100) + var(--md-sys-measurement-space50)) var(--md-sys-measurement-space200);
border-radius: var(--md-sys-shape-corner-full);
background-color: var(--md-sys-color-secondary-container);
color: var(--md-sys-color-on-secondary-container);
font: var(--md-sys-typescale-label-lg);
letter-spacing: var(--md-sys-typescale-label-lg-tracking);
}
.eyebrow .icon {
width: 20px;
height: 20px;
}
/* ---------------------------------------------------------------- interaction */
/* M3's state layer: the content colour over the element, 8% on hover, 10% on focus and press. */
.btn,
.icon-btn,
.nav__links a:not(.btn),
.faq summary {
position: relative;
isolation: isolate;
}
.btn::before,
.icon-btn::before,
.nav__links a:not(.btn)::before,
.faq summary::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
border-radius: inherit;
background-color: currentColor;
opacity: 0;
pointer-events: none;
transition: opacity var(--md-sys-motion-effects-fast-duration) var(--md-sys-motion-effects-fast);
}
@media (hover: hover) {
.btn:hover::before,
.icon-btn:hover::before,
.nav__links a:not(.btn):hover::before,
.faq summary:hover::before {
opacity: var(--md-sys-state-hover-state-layer-opacity);
}
}
.btn:focus-visible::before,
.icon-btn:focus-visible::before,
.nav__links a:not(.btn):focus-visible::before,
.faq summary:focus-visible::before {
opacity: var(--md-sys-state-focus-state-layer-opacity);
}
.btn:active::before,
.icon-btn:active::before,
.nav__links a:not(.btn):active::before,
.faq summary:active::before {
opacity: var(--md-sys-state-pressed-state-layer-opacity);
}
/* M3's 48px minimum target around a control drawn smaller. */
.btn::after,
.icon-btn::after,
.nav__links a:not(.btn)::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 100%;
height: 100%;
min-width: var(--md-sys-measurement-space600);
min-height: var(--md-sys-measurement-space600);
transform: translate(-50%, -50%);
}
/* ---------------------------------------------------------------- buttons */
/* M3 Expressive buttons. The default is the small size (40px, label-large); .btn--lg is the medium
size (56px, title-medium) for the page's main calls to action. Round at rest, squarer while
pressed, on the fast spatial spring; colours on the fast effects spring. */
.btn {
--btn-height: 40px;
--btn-padding: var(--md-sys-measurement-space200);
--btn-icon: 20px;
--btn-pressed: var(--md-sys-shape-corner-sm);
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--md-sys-measurement-space100);
min-block-size: var(--btn-height);
padding-inline: var(--btn-padding);
border: 0;
border-radius: calc(var(--btn-height) / 2);
background-color: transparent;
color: var(--md-sys-color-primary);
font: var(--md-sys-typescale-label-lg);
letter-spacing: var(--md-sys-typescale-label-lg-tracking);
text-decoration: none;
white-space: nowrap;
cursor: pointer;
-webkit-user-select: none;
user-select: none;
transition-property: border-radius, background-color, color, box-shadow;
transition-duration: var(--md-sys-motion-spatial-fast-duration), var(--md-sys-motion-effects-fast-duration), var(--md-sys-motion-effects-fast-duration), var(--md-sys-motion-effects-fast-duration);
transition-timing-function: var(--md-sys-motion-spatial-fast), var(--md-sys-motion-effects-fast), var(--md-sys-motion-effects-fast), var(--md-sys-motion-effects-fast);
}
.btn:active {
border-radius: var(--btn-pressed);
}
.btn .icon {
width: var(--btn-icon);
height: var(--btn-icon);
}
.btn--lg {
--btn-height: 56px;
--btn-padding: var(--md-sys-measurement-space300);
--btn-icon: 24px;
--btn-pressed: var(--md-sys-shape-corner-md);
font: var(--md-sys-typescale-title-md);
letter-spacing: var(--md-sys-typescale-title-md-tracking);
}
.btn--filled {
background-color: var(--md-sys-color-primary);
color: var(--md-sys-color-on-primary);
}
.btn--tonal {
background-color: var(--md-sys-color-secondary-container);
color: var(--md-sys-color-on-secondary-container);
}
.btn--outlined {
border: 1px solid var(--md-sys-color-outline-variant);
color: var(--md-sys-color-on-surface-variant);
}
@media (hover: hover) {
.btn--filled:hover,
.btn--tonal:hover {
box-shadow: var(--md-sys-elevation-1);
}
}
.btn:is(:disabled, [aria-disabled="true"]) {
box-shadow: none;
color: color-mix(in srgb, var(--md-sys-color-on-surface) calc(var(--md-sys-state-disabled-content-opacity) * 100%), transparent);
cursor: not-allowed;
}
.btn:is(.btn--filled, .btn--tonal):is(:disabled, [aria-disabled="true"]) {
background-color: color-mix(in srgb, var(--md-sys-color-on-surface) calc(var(--md-sys-state-disabled-container-opacity) * 100%), transparent);
}
.btn:is(:disabled, [aria-disabled="true"])::before {
display: none;
}
/* A standard icon button: 40px drawn, a 48px target, on-surface-variant. */
.icon-btn {
display: inline-flex;
flex-shrink: 0;
align-items: center;
justify-content: center;
width: 40px;
height: 40px;
padding: 0;
border: 0;
border-radius: 20px;
background-color: transparent;
color: var(--md-sys-color-on-surface-variant);
cursor: pointer;
transition: border-radius var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-spatial-fast);
}
.icon-btn:active {
border-radius: var(--md-sys-shape-corner-sm);
}
/* M3 Expressive's connected button group, the successor of segmented buttons: segments 2px apart,
round outer corners and small inner ones, and the chosen segment (aria-pressed) fully round in
secondary-container with a check. */
.button-group {
display: inline-flex;
gap: var(--md-sys-measurement-space25);
}
.button-group .btn {
min-inline-size: var(--md-sys-measurement-space600);
border-radius: var(--md-sys-shape-corner-sm);
background-color: var(--md-sys-color-surface-container);
color: var(--md-sys-color-on-surface-variant);
}
.button-group .btn:first-child {
border-start-start-radius: calc(var(--btn-height) / 2);
border-end-start-radius: calc(var(--btn-height) / 2);
}
.button-group .btn:last-child {
border-start-end-radius: calc(var(--btn-height) / 2);
border-end-end-radius: calc(var(--btn-height) / 2);
}
.button-group .btn:active {
border-radius: var(--md-sys-shape-corner-xs);
}
.button-group .btn:first-child:active {
border-radius: calc(var(--btn-height) / 2) var(--md-sys-shape-corner-xs) var(--md-sys-shape-corner-xs) calc(var(--btn-height) / 2);
}
.button-group .btn:last-child:active {
border-radius: var(--md-sys-shape-corner-xs) calc(var(--btn-height) / 2) calc(var(--btn-height) / 2) var(--md-sys-shape-corner-xs);
}
.button-group .btn[aria-pressed="true"] {
border-radius: calc(var(--btn-height) / 2);
background-color: var(--md-sys-color-secondary-container);
color: var(--md-sys-color-on-secondary-container);
}
.button-group .btn .icon {
display: none;
}
.button-group .btn[aria-pressed="true"] .icon {
display: block;
}
/* ---------------------------------------------------------------- nav */
/* The top app bar: surface at rest, surface-container once the page scrolls under it. */
.nav {
position: sticky;
top: 0;
z-index: 50;
background-color: var(--md-sys-color-surface);
transition: background-color var(--md-sys-motion-effects-default-duration) var(--md-sys-motion-effects-default);
}
.nav[data-scrolled] {
background-color: var(--md-sys-color-surface-container);
}
.nav__bar {
display: flex;
align-items: center;
gap: var(--md-sys-measurement-space100);
min-height: var(--site-bar-height);
}
.brand {
display: inline-flex;
align-items: center;
gap: var(--md-sys-measurement-space100);
min-block-size: var(--md-sys-measurement-space600);
color: var(--md-sys-color-on-surface);
font: var(--md-sys-typescale-title-lg);
letter-spacing: var(--md-sys-typescale-title-lg-tracking);
text-decoration: none;
}
.brand svg {
width: 32px;
height: 32px;
color: var(--md-sys-color-primary);
}
.nav__toggle {
display: none;
margin-inline-start: auto;
color: var(--md-sys-color-on-surface);
}
.nav__toggle .icon-close {
display: none;
}
.nav__toggle[aria-expanded="true"] .icon-menu {
display: none;
}
.nav__toggle[aria-expanded="true"] .icon-close {
display: block;
}
.nav__bar > nav {
margin-inline-start: auto;
}
.nav__links {
display: flex;
align-items: center;
gap: var(--md-sys-measurement-space50);
margin: 0;
padding: 0;
list-style: none;
}
.nav__links a:not(.btn) {
display: inline-flex;
align-items: center;
min-block-size: 40px;
padding-inline: calc(var(--md-sys-measurement-space100) + var(--md-sys-measurement-space50));
border-radius: 20px;
color: var(--md-sys-color-on-surface-variant);
font: var(--md-sys-typescale-label-lg);
letter-spacing: var(--md-sys-typescale-label-lg-tracking);
text-decoration: none;
}
.nav__links .btn {
margin-inline-start: var(--md-sys-measurement-space100);
}
/* Light, Dark or System. Without JavaScript there is nothing to switch, so it stays hidden. */
.theme-toggle {
display: none;
}
:root[data-theme-choice] .theme-toggle {
display: inline-flex;
}
.theme-toggle .icon {
display: none;
}
:root[data-theme-choice="light"] .theme-toggle .icon-light-mode,
:root[data-theme-choice="dark"] .theme-toggle .icon-dark-mode,
:root[data-theme-choice="system"] .theme-toggle .icon-brightness-auto {
display: block;
}
/* Below expanded, the links fold into a menu under the bar. */
@media (width < 840px) {
.nav__toggle {
display: inline-flex;
}
.nav__bar > nav {
margin-inline-start: 0;
}
.nav__links {
position: absolute;
inset-block-start: 100%;
inset-inline: var(--site-margin);
display: none;
flex-direction: column;
align-items: stretch;
gap: 0;
padding-block: var(--md-sys-measurement-space100);
border-radius: var(--md-sys-shape-corner-xs);
background-color: var(--md-sys-color-surface-container);
box-shadow: var(--md-sys-elevation-2);
}
.nav__links.is-open {
display: flex;
}
.nav__links a:not(.btn) {
min-block-size: var(--md-sys-measurement-space600);
padding-inline: var(--md-sys-measurement-space200);
border-radius: 0;
color: var(--md-sys-color-on-surface);
}
.nav__links .btn {
width: calc(100% - 2 * var(--md-sys-measurement-space200));
margin: var(--md-sys-measurement-space100) var(--md-sys-measurement-space200) 0;
}
}
/* ---------------------------------------------------------------- hero */
.hero {
position: relative;
overflow: clip;
padding-block: var(--md-sys-measurement-space500) var(--md-sys-measurement-space700);
}
.hero__grid {
display: grid;
align-items: center;
gap: var(--md-sys-measurement-space500);
}
.hero__copy {
display: grid;
gap: var(--md-sys-measurement-space300);
justify-items: start;
}
.hero__actions {
display: flex;
flex-wrap: wrap;
gap: var(--md-sys-measurement-space200);
margin-block-start: var(--md-sys-measurement-space100);
}
.hero__facts {
display: flex;
flex-wrap: wrap;
gap: var(--md-sys-measurement-space100) var(--md-sys-measurement-space300);
margin: var(--md-sys-measurement-space100) 0 0;
padding: 0;
list-style: none;
color: var(--md-sys-color-on-surface-variant);
font: var(--md-sys-typescale-body-md);
letter-spacing: var(--md-sys-typescale-body-md-tracking);
}
.hero__facts li {
display: inline-flex;
align-items: center;
gap: var(--md-sys-measurement-space75);
}
.hero__facts .icon {
width: 20px;
height: 20px;
color: var(--md-sys-color-success);
}
.hero__visual {
position: relative;
padding-block-end: var(--md-sys-measurement-space500);
}
.hero__visual .device--phone {
position: absolute;
inset-inline-end: -2%;
bottom: 0;
width: 25%;
}
/* Two Expressive shapes behind the devices: decoration only. */
.hero__shape {
position: absolute;
z-index: -1;
fill: currentColor;
}
.hero__shape--one {
top: -8%;
inset-inline-end: -6%;
width: 46%;
color: var(--md-sys-color-secondary-container);
rotate: 12deg;
}
.hero__shape--two {
bottom: -4%;
inset-inline-start: -10%;
width: 30%;
color: var(--md-sys-color-surface-container-highest);
}
@media (width >= 600px) {
.hero {
padding-block: var(--md-sys-measurement-space800) var(--md-sys-measurement-space900);
}
}
@media (width >= 840px) {
.hero__grid {
grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
gap: var(--md-sys-measurement-space600);
}
.hero__visual {
padding-block-end: var(--md-sys-measurement-space600);
}
}
@media (width >= 1200px) {
.hero {
padding-block: calc(var(--md-sys-measurement-space600) * 2) calc(var(--md-sys-measurement-space700) * 2);
}
.hero__grid {
gap: var(--md-sys-measurement-space900);
}
}
/* ---------------------------------------------------------------- sections */
.section {
padding-block: var(--site-section-space);
overflow-x: clip;
}
.section--tint {
background-color: var(--md-sys-color-surface-container-low);
}
.section__head {
display: grid;
gap: var(--md-sys-measurement-space200);
max-width: 760px;
margin-block-end: var(--md-sys-measurement-space400);
}
.section__head--center {
margin-inline: auto;
text-align: center;
justify-items: center;
}
@media (width >= 600px) {
.section__head {
margin-block-end: var(--md-sys-measurement-space600);
}
}
/* M3's outlined card: surface, an outline-variant edge, the medium corner, and no shape change. */
.reason,
.step,
.feature,
.faq details,
.contact,
.table-scroll {
border: 1px solid var(--md-sys-color-outline-variant);
border-radius: var(--md-sys-shape-corner-md);
background-color: var(--md-sys-color-surface);
}
/* "Why run your own": a statement beside four reasons. */
.why {
display: grid;
gap: var(--md-sys-measurement-space500);
align-items: start;
}
.why__statement {
display: grid;
gap: var(--md-sys-measurement-space300);
}
.reasons {
display: grid;
gap: var(--md-sys-measurement-space200);
}
.reason {
display: grid;
gap: var(--md-sys-measurement-space200);
align-content: start;
padding: var(--md-sys-measurement-space300);
}
.reason p {
color: var(--md-sys-color-on-surface-variant);
}
@media (width >= 600px) {
.reasons {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (width >= 840px) {
.why {
grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
gap: var(--md-sys-measurement-space600);
}
.why__statement {
position: sticky;
top: calc(var(--site-bar-height) + var(--md-sys-measurement-space400));
}
}
@media (width >= 1200px) {
.why {
gap: var(--md-sys-measurement-space900);
}
}
/* An icon on an M3 Expressive shape. */
.badge-icon {
position: relative;
display: grid;
place-items: center;
width: 56px;
height: 56px;
color: var(--md-sys-color-on-primary-container);
}
.badge-icon > svg:first-child {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
color: var(--md-sys-color-primary-container);
fill: currentColor;
}
.badge-icon .icon {
position: relative;
}
.badge-icon--secondary {
color: var(--md-sys-color-on-secondary-container);
}
.badge-icon--secondary > svg:first-child {
color: var(--md-sys-color-secondary-container);
}
.badge-icon--tertiary {
color: var(--md-sys-color-on-tertiary-container);
}
.badge-icon--tertiary > svg:first-child {
color: var(--md-sys-color-tertiary-container);
}
/* How it works: three steps. */
.steps {
display: grid;
gap: var(--md-sys-measurement-space200);
margin: 0;
padding: 0;
list-style: none;
counter-reset: step;
}
.step {
position: relative;
display: grid;
gap: var(--md-sys-measurement-space200);
align-content: start;
padding: var(--md-sys-measurement-space300);
counter-increment: step;
}
/* The step's number, a decoration beside its title. */
.step::before {
content: counter(step);
position: absolute;
inset-block-start: var(--md-sys-measurement-space300);
inset-inline-end: var(--md-sys-measurement-space300);
color: var(--md-sys-color-outline);
font: var(--md-sys-typescale-display-md);
letter-spacing: var(--md-sys-typescale-display-md-tracking);
}
.step p {
color: var(--md-sys-color-on-surface-variant);
}
@media (width >= 840px) {
.steps {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
}
/* Features. */
.features {
display: grid;
gap: var(--md-sys-measurement-space200);
}
.feature {
display: grid;
grid-template-columns: auto 1fr;
gap: var(--md-sys-measurement-space50) var(--md-sys-measurement-space200);
align-content: start;
padding: var(--md-sys-measurement-space300);
}
.feature .badge-icon {
grid-row: span 2;
width: 48px;
height: 48px;
}
.feature h3 {
align-self: end;
font: var(--md-sys-typescale-title-md);
letter-spacing: var(--md-sys-typescale-title-md-tracking);
}
.feature p {
color: var(--md-sys-color-on-surface-variant);
font: var(--md-sys-typescale-body-md);
letter-spacing: var(--md-sys-typescale-body-md-tracking);
}
@media (width >= 600px) {
.features {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
/* Three columns only from large: at expanded they leave too little room for the text. */
@media (width >= 1200px) {
.features {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
}
/* ---------------------------------------------------------------- gallery */
.gallery__controls {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: var(--md-sys-measurement-space200) var(--md-sys-measurement-space300);
margin-block-end: var(--md-sys-measurement-space500);
}
.gallery {
display: grid;
gap: var(--md-sys-measurement-space500) var(--md-sys-measurement-space400);
margin: 0;
padding: 0;
list-style: none;
}
.gallery--phone {
grid-template-columns: repeat(2, minmax(0, 1fr));
column-gap: var(--md-sys-measurement-space200);
max-width: 1040px;
margin-inline: auto;
}
.gallery[hidden] {
display: none;
}
.shot {
display: grid;
gap: var(--md-sys-measurement-space200);
margin: 0;
}
.shot figcaption {
display: grid;
gap: var(--md-sys-measurement-space25);
text-align: center;
}
.shot figcaption strong {
font: var(--md-sys-typescale-title-md);
letter-spacing: var(--md-sys-typescale-title-md-tracking);
}
.shot figcaption span {
color: var(--md-sys-color-on-surface-variant);
font: var(--md-sys-typescale-body-md);
letter-spacing: var(--md-sys-typescale-body-md-tracking);
}
@media (width >= 840px) {
.gallery--desktop {
grid-template-columns: repeat(2, minmax(0, 1fr));
column-gap: var(--md-sys-measurement-space600);
}
.gallery--phone {
grid-template-columns: repeat(4, minmax(0, 1fr));
column-gap: var(--md-sys-measurement-space400);
}
}
@media (width >= 1200px) {
.gallery--desktop {
column-gap: calc(var(--md-sys-measurement-space400) + var(--md-sys-measurement-space700));
}
}
/* ---------------------------------------------------------------- compare */
.compare {
display: grid;
gap: var(--md-sys-measurement-space600);
}
.compare__block {
display: grid;
gap: var(--md-sys-measurement-space200);
}
.compare__block h3 {
font: var(--md-sys-typescale-title-lg);
letter-spacing: var(--md-sys-typescale-title-lg-tracking);
}
.compare__block > p {
color: var(--md-sys-color-on-surface-variant);
}
.table-scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.compare table {
width: 100%;
min-width: 860px;
border-collapse: separate;
border-spacing: 0;
font: var(--md-sys-typescale-body-md);
letter-spacing: var(--md-sys-typescale-body-md-tracking);
}
.compare caption {
padding: var(--md-sys-measurement-space200) var(--md-sys-measurement-space300);
border-block-end: 1px solid var(--md-sys-color-outline-variant);
color: var(--md-sys-color-on-surface-variant);
text-align: start;
}
.compare th,
.compare td {
padding: calc(var(--md-sys-measurement-space100) + var(--md-sys-measurement-space50)) var(--md-sys-measurement-space200);
border-block-end: 1px solid var(--md-sys-color-outline-variant);
text-align: start;
vertical-align: top;
}
.compare tbody tr:last-child > * {
border-block-end: 0;
}
.compare thead tr {
background-color: var(--md-sys-color-surface);
}
.compare thead th {
color: var(--md-sys-color-on-surface);
font: var(--md-sys-typescale-title-sm);
letter-spacing: var(--md-sys-typescale-title-sm-tracking);
white-space: nowrap;
}
.compare tbody th {
position: sticky;
inset-inline-start: 0;
z-index: 1;
min-width: 170px;
background-color: var(--md-sys-color-surface);
color: var(--md-sys-color-on-surface-variant);
font: var(--md-sys-typescale-title-sm);
letter-spacing: var(--md-sys-typescale-title-sm-tracking);
}
.compare thead th:first-child {
position: sticky;
inset-inline-start: 0;
z-index: 2;
background-color: var(--md-sys-color-surface);
}
/* SealShare's own column: its heading in the secondary-container pair, its cells a tone up. */
.compare .is-us {
background-color: var(--md-sys-color-surface-container-high);
color: var(--md-sys-color-on-surface);
}
.compare thead .is-us {
background-color: var(--md-sys-color-secondary-container);
color: var(--md-sys-color-on-secondary-container);
}
.compare__sources {
display: grid;
gap: var(--md-sys-measurement-space100);
margin: 0;
padding-inline-start: var(--md-sys-measurement-space300);
color: var(--md-sys-color-on-surface-variant);
font: var(--md-sys-typescale-body-md);
letter-spacing: var(--md-sys-typescale-body-md-tracking);
overflow-wrap: anywhere;
}
.compare__note {
color: var(--md-sys-color-on-surface-variant);
font: var(--md-sys-typescale-body-md);
letter-spacing: var(--md-sys-typescale-body-md-tracking);
}
/* The numbered notes under the tables read as one block. */
.compare__notes {
display: grid;
gap: var(--md-sys-measurement-space100);
}
.compare__notes sup,
.compare td sup {
line-height: 0;
}
/* ---------------------------------------------------------------- install */
.install {
display: grid;
gap: var(--md-sys-measurement-space500);
align-items: start;
}
.install__copy {
display: grid;
gap: var(--md-sys-measurement-space300);
justify-items: start;
}
.install__list {
display: grid;
gap: var(--md-sys-measurement-space200);
margin: 0;
padding: 0;
list-style: none;
}
.install__list li {
display: grid;
grid-template-columns: auto 1fr;
gap: var(--md-sys-measurement-space200);
color: var(--md-sys-color-on-surface-variant);
}
.install__list .icon {
color: var(--md-sys-color-primary);
}
/* The compose commands: a filled card (surface-container-highest) in the theme's own ink. */
.code {
overflow: hidden;
border-radius: var(--md-sys-shape-corner-md);
background-color: var(--md-sys-color-surface-container-highest);
color: var(--md-sys-color-on-surface);
}
.code__bar {
display: flex;
align-items: center;
gap: var(--md-sys-measurement-space100);
padding: var(--md-sys-measurement-space200) var(--md-sys-measurement-space300);
border-block-end: 1px solid var(--md-sys-color-outline-variant);
color: var(--md-sys-color-on-surface-variant);
font: var(--md-sys-typescale-label-lg);
letter-spacing: var(--md-sys-typescale-label-lg-tracking);
}
.code__bar .icon {
width: 20px;
height: 20px;
}
.code pre {
margin: 0;
padding: var(--md-sys-measurement-space300);
overflow-x: auto;
font-family: var(--md-ref-typeface-mono);
font-size: 0.875rem;
line-height: 1.5rem;
}
.code pre code {
font-size: inherit;
}
.code .comment {
color: var(--md-sys-color-on-surface-variant);
}
@media (width >= 840px) {
.install {
grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
gap: var(--md-sys-measurement-space600);
}
}
@media (width >= 1200px) {
.install {
gap: var(--md-sys-measurement-space800);
}
}
/* ---------------------------------------------------------------- faq */
.faq {
display: grid;
gap: var(--md-sys-measurement-space100);
max-width: 860px;
margin-inline: auto;
}
.faq summary {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--md-sys-measurement-space200);
min-height: var(--md-sys-measurement-space800);
padding: var(--md-sys-measurement-space200) var(--md-sys-measurement-space300);
border-radius: calc(var(--md-sys-shape-corner-md) - 1px);
font: var(--md-sys-typescale-title-md);
letter-spacing: var(--md-sys-typescale-title-md-tracking);
cursor: pointer;
list-style: none;
}
.faq details[open] summary {
border-end-start-radius: 0;
border-end-end-radius: 0;
}
.faq summary::-webkit-details-marker {
display: none;
}
.faq summary .icon {
color: var(--md-sys-color-on-surface-variant);
transition: rotate var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-spatial-fast);
}
.faq details[open] summary .icon {
rotate: 180deg;
}
.faq__answer {
display: grid;
gap: var(--md-sys-measurement-space200);
padding: 0 var(--md-sys-measurement-space300) var(--md-sys-measurement-space300);
color: var(--md-sys-color-on-surface-variant);
}
/* ---------------------------------------------------------------- contact */
.contact {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: var(--md-sys-measurement-space300);
padding: var(--md-sys-measurement-space400) var(--md-sys-measurement-space300);
}
.contact > div {
display: grid;
gap: var(--md-sys-measurement-space100);
}
.contact p {
color: var(--md-sys-color-on-surface-variant);
}
.contact a:not(.btn) {
display: inline-flex;
align-items: center;
gap: var(--md-sys-measurement-space100);
min-block-size: var(--md-sys-measurement-space600);
width: fit-content;
font: var(--md-sys-typescale-title-md);
letter-spacing: var(--md-sys-typescale-title-md-tracking);
}
@media (width >= 840px) {
.contact {
padding: var(--md-sys-measurement-space600);
}
}
/* ---------------------------------------------------------------- footer */
.footer {
padding-block: var(--md-sys-measurement-space700) var(--md-sys-measurement-space500);
background-color: var(--md-sys-color-surface-container-low);
color: var(--md-sys-color-on-surface-variant);
font: var(--md-sys-typescale-body-md);
letter-spacing: var(--md-sys-typescale-body-md-tracking);
}
.footer__grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: var(--md-sys-measurement-space400);
}
.footer__grid > :first-child {
grid-column: 1 / -1;
}
.footer__blurb {
max-width: 380px;
margin-block-start: var(--md-sys-measurement-space100);
}
.footer h2 {
margin-block-end: var(--md-sys-measurement-space100);
color: var(--md-sys-color-on-surface);
font: var(--md-sys-typescale-title-sm);
letter-spacing: var(--md-sys-typescale-title-sm-tracking);
}
.footer ul {
display: grid;
margin: 0;
padding: 0;
list-style: none;
}
.footer ul a {
display: inline-flex;
align-items: center;
min-block-size: var(--md-sys-measurement-space500);
}
.footer a {
color: var(--md-sys-color-on-surface-variant);
text-decoration: none;
}
.footer a:hover {
color: var(--md-sys-color-on-surface);
text-decoration-line: underline;
}
.footer__bottom {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
gap: var(--md-sys-measurement-space100) var(--md-sys-measurement-space300);
margin-block-start: var(--md-sys-measurement-space500);
padding-block-start: var(--md-sys-measurement-space300);
border-block-start: 1px solid var(--md-sys-color-outline-variant);
}
@media (width >= 600px) {
.footer__grid {
grid-template-columns: minmax(0, 2fr) repeat(2, minmax(0, 1fr));
}
.footer__grid > :first-child {
grid-column: auto;
}
}
/* ---------------------------------------------------------------- legal page */
.legal {
padding-block: var(--md-sys-measurement-space500) var(--md-sys-measurement-space800);
}
.legal article {
display: grid;
gap: var(--md-sys-measurement-space200);
max-width: 760px;
margin-inline: auto;
}
.legal h1 {
margin-block-end: var(--md-sys-measurement-space50);
}
.legal h2 {
margin-block-start: var(--md-sys-measurement-space300);
font: var(--md-sys-typescale-title-lg);
letter-spacing: var(--md-sys-typescale-title-lg-tracking);
}
.legal ul {
display: grid;
gap: var(--md-sys-measurement-space100);
margin: 0;
padding-inline-start: var(--md-sys-measurement-space300);
}
.legal .meta {
color: var(--md-sys-color-on-surface-variant);
font: var(--md-sys-typescale-body-md);
letter-spacing: var(--md-sys-typescale-body-md-tracking);
}
@media (width >= 600px) {
.legal {
padding-block: var(--md-sys-measurement-space800) calc(var(--md-sys-measurement-space500) * 2);
}
}