Files
godot-website/assets/css/releases/4.4.scss
Adam Scott 8c3a18b062 Fixes some issues with the 4.4 release page (#1033)
- Fixes missing margins of the download content
- Add Play Store and Horizon Store releases
- Display all downloads when JavaScript is disabled
2025-03-06 16:09:44 +01:00

1717 lines
37 KiB
SCSS

---
---
@import "common/colors";
@import "common/release";
$column-max-width: 400px;
$column-min-width: 300px;
$container-break: 450px;
$grid-gap: 30px;
$one-column-max-width: ($column-max-width * 2) - ($grid-gap * 1);
$two-columns-max-width: ($column-max-width * 3) - ($grid-gap * 2);
$mobile-max-width: 700px;
@mixin screen-is-two-columns-wide() {
@media screen and (max-width: #{$two-columns-max-width}) {
@content;
}
}
@mixin screen-is-one-column-wide() {
@media screen and (max-width: #{$one-column-max-width}) {
@content;
}
}
@mixin is-mobile() {
@media screen and (max-width: #{$mobile-max-width}) {
@content;
}
}
$anchor-offset: 75px;
$header-background-color: #25282b;
$header-background-image: image-set(
url("/storage/releases/4.4/images/outskirts_background.webp") 1x,
url("/storage/releases/4.4/images/outskirts_background_2x.webp") 2x
);
$header-background-position: 55% 50%;
$header-background-repeat: no-repeat;
$header-background-size: cover;
$header-logo-image: url("/storage/releases/4.4/images/release-logo.svg");
$header-logo-position: center;
$header-logo-repeat: no-repeat;
$header-logo-height: 140px;
$header-logo-size: contain;
$header-gap-top: 80px;
$header-gap-bottom: 80px;
$header-content-color: white;
$header-numbers-gap: 20px;
$header-bar-height: 20px;
$header-bar-commits-color: $color-godot-blue;
$header-bar-commits-color-inactive: #487491;
$header-bar-contributors-color: #f47e7a;
$header-bar-contributors-color-inactive: #a66160;
$header-bar-gap: 10px;
$header-version-font-weight: 800;
$release-background-end: #bcbcbc;
$release-title-font-size: r-desktop-mobile(35px, 25px);
$release-section-margin-top: r-desktop-mobile(80px, 40px);
$release-section-margin-bottom: r-desktop-mobile(40px, 20px);
$card-padding: r-desktop-mobile(17px, 15px);
$card-title-font-size: r-desktop-mobile(20px, 18px);
$card-content-font-size-clamp-min: r-desktop-mobile(14px, 0.8em);
$card-content-font-size-clamp-val: r-desktop-mobile(7cqw, 4cqw);
$card-content-font-size-clamp-max: r-desktop-mobile(16px, 1em);
$card-box-shadow: 0 9px 10px -10px #0000008f;
$download-gap: r-desktop-mobile(8px, 4px);
$download-font-size: r-desktop-mobile(18px, 12px);
$section-hue-offset: 10;
$sections: r-generate-sections(
$sections: (
"foundation",
"links",
"highlights",
"general",
"platforms",
"scripting",
"systems",
"special-thanks",
),
$base-category: "foundation",
$base-color: $color-godot-blue,
$offset: $section-hue-offset,
);
// Add "download" to be a copy of "foundation", and make it on top order-wise.
$sections: map-merge(
(
"download": map-get($sections, "foundation"),
),
$sections
);
$donate-robot-size: 500px;
@mixin card-media-margin($direction, $margin) {
@if $direction == "top" {
margin: calc(-1 * #{$margin})
calc(-1 * #{$margin}) -1px
calc(-1 * #{$margin});
margin: #{"round(down, calc(-1 * #{$margin}), 1px)"}
#{"round(up, calc(-1 * #{$margin}), 1px)"}
0
#{"round(down, calc(-1 * #{$margin}), 1px)"};
} @else if $direction == "right" {
margin: calc(-1 * #{$margin})
calc(-1 * #{$margin})
calc(-1 * #{$margin} - 1px)
0;
margin: #{"round(down, calc(-1 * #{$margin}), 1px)"}
#{"round(up, calc(-1 * #{$margin}), 1px)"}
#{"round(up, calc(-1 * #{$margin} - 1px), 1px)"}
0;
} @else if $direction == "bottom" {
margin: 0
calc(-1 * #{$margin})
calc(-1 * #{$margin} - 1px)
calc(-1 * #{$margin});
margin: 0
#{"round(up, calc(-1 * #{$margin}), 1px)"}
#{"round(up, calc(-1 * #{$margin} - 1px), 1px)"}
#{"round(down, calc(-1 * #{$margin}), 1px)"};
} @else if $direction == "left" {
margin: calc(-1 * #{$margin})
0
calc(-1 * #{$margin} - 1px)
calc(-1 * #{$margin});
margin: #{"round(down, calc(-1 * #{$margin}), 1px)"}
0
#{"round(up, calc(-1 * #{$margin} - 1px), 1px)"}
#{"round(down, calc(-1 * #{$margin}), 1px)"};
}
}
:root {
--card-padding: #{r-get-desktop($card-padding)};
@include is-mobile() {
--card-padding: #{r-get-mobile($card-padding)};
}
scroll-behavior: smooth;
@media (prefers-reduced-motion) {
scroll-behavior: auto;
}
scroll-padding-top: var(--card-padding);
}
#scroll-to-top {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1;
pointer-events: none;
.link {
pointer-events: all;
position: fixed;
bottom: 0;
right: 0;
width: 50px;
height: 50px;
margin: var(--card-padding);
text-decoration: none;
background-color: white;
border-radius: var(--card-padding);
display: flex;
align-items: center;
justify-content: center;
box-shadow: rgba(0, 0, 0, 25%) 1px 1px 5px;
color: black;
font-size: 1.5em;
&:hover {
span {
font-size: 35px;
}
}
span {
transition: font-size 0.2s ease-in-out;
transform: translateY(-3px);
}
}
}
#foundation-donate {
background-color: #eff1f5;
@include is-dark() {
background-color: #283a5b;
}
.robot-1,
.robot-2 {
color: #cfd5e0;
@include is-dark() {
color: #233452;
}
font-size: $donate-robot-size;
position: absolute;
z-index: -1;
}
.robot-1 {
// Top left.
top: 0;
left: 0;
transform: translateX(-250px) translateY(-40cqh) rotate(180deg);
}
.robot-2 {
// Bottom right.
bottom: 0;
right: 0;
transform: translateX(250px) translateY(40cqh);
}
.c-blockquote {
margin-top: auto;
margin-bottom: auto;
}
.release-card-media {
justify-content: end;
}
}
#download-download {
.release-card-media {
.release-platform {
display: none;
margin: var(--card-padding);
&.active {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--card-padding);
}
.release-button {
display: flex;
flex-direction: column;
align-items: center;
}
.main-download-details {
font-size: 14px;
opacity: 0.6;
}
.download-button {
display: grid;
gap: var(--card-padding);
padding: 0;
grid-template-columns: auto 1fr;
text-align: center;
align-items: center;
text-decoration: none;
background-color: var(--primary-color);
color: white;
line-height: 32px;
.download-title {
display: flex;
flex-direction: row;
gap: var(--card-padding);
color: var(--primary-color-text-title);
font-size: 20px;
img {
display: inline-block;
filter: invert(1);
margin-left: var(--card-padding);
width: 22px;
vertical-align: text-bottom;
}
}
.download-hint {
display: flex;
flex-direction: column;
justify-content: center;
background-color: var(--primary-color-text-title);
color: var(--dark-color);
padding: 12px 16px;
font-weight: bold;
border-radius: 0 var(--button-border-radius)
var(--button-border-radius) 0;
height: 100%;
box-sizing: border-box;
}
}
.download-net-button {
background-color: rgba(111, 111, 111, 27%);
-webkit-backdrop-filter: blur(4px);
backdrop-filter: blur(4px);
}
}
}
.c-blockquote {
text-align: center;
max-width: 500px;
margin: auto;
}
}
#links {
margin-top: 0;
margin-bottom: 0;
.release-card {
box-shadow: none;
}
}
.links-container {
list-style: none;
margin: 0;
padding: 0;
width: 100%;
display: flex;
flex-wrap: wrap;
gap: calc(var(--card-padding) / 2);
align-items: center;
justify-content: center;
& > li {
margin: 0;
}
.link {
display: flex;
min-width: 50px;
align-items: center;
justify-content: center;
padding: calc(var(--card-padding) / 2);
border-radius: calc(var(--card-padding) / 2);
text-decoration: none;
color: white;
box-shadow: $card-box-shadow;
font-size: 1em;
font-weight: 800;
background: linear-gradient(
to bottom,
var(--color-top),
var(--color-bottom)
);
@at-root #{selector-replace(&, ".links-container", ".links-container.links-container-subsections")} {
font-weight: 600;
--color-top: var(--color-top-muted);
--color-bottom: var(--color-bottom-muted);
}
@at-root #{selector-replace(&, ".links-container", ".links-container.main-list")} {
font-size: 150%;
@each $section-name, $section-colors in $sections {
&.link-#{$section-name} {
--color-top: #{map-get($section-colors, "color-top")};
--color-bottom: #{map-get($section-colors, "color-bottom")};
}
}
}
&:hover {
& > span {
text-decoration: underline;
}
}
}
&.main-list {
font-size: 150%;
.link {
@each $section-name, $section-colors in $sections {
&.link-#{$section-name} {
--color-top: #{map-get($section-colors, "color-top")};
--color-bottom: #{map-get($section-colors, "color-bottom")};
}
}
}
}
}
#special-thanks-release-authors {
.release-card-media {
.release-card-authors {
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 10px;
padding: var(--card-padding);
&::after {
content: "";
flex: auto;
}
.release-card-author {
line-height: 0.5em;
font-size: 12px;
&.size-1 {
font-size: 14px;
}
&.size-2 {
font-size: 16px;
}
&.size-3 {
font-size: 20px;
}
&.size-4 {
font-size: 22px;
}
&.size-5 {
font-size: 24px;
}
&.size-6 {
font-size: 26px;
}
a {
color: black;
text-decoration: none;
text-decoration-color: black;
@include is-dark() {
color: white;
text-decoration-color: white;
}
&:hover {
text-decoration: underline;
}
}
}
}
}
}
#special-thanks-remi {
.c-blockquote {
padding-left: var(--card-padding);
border-left: 2px solid grey;
font-size: clamp(
var(--card-content-font-size-clamp-min),
var(--card-content-font-size-clamp-val),
var(--card-content-font-size-clamp-max)
);
font-weight: 400;
font-style: italic;
& > p {
line-height: 1.5;
margin: 16px 0;
&:first-child {
margin-top: 0;
}
&:last-child {
margin-bottom: 0;
}
}
}
}
#special-thanks-credits {
p:has(+ .c-content-assets) {
margin-bottom: 0;
}
.c-content-assets {
margin: 0;
li {
line-height: 1;
margin-bottom: 0;
}
}
}
#highlights {
margin-top: var(--release-section-margin-bottom);
}
.release-container {
position: relative;
width: 100%;
height: 100%;
background-color: #25282b;
@include is-light() {
background-color: #cecece;
}
a {
text-decoration-thickness: 1px;
}
/**
* Responsive sizes.
*/
--release-title-font-size: #{r-get-desktop($release-title-font-size)};
--release-section-margin-top: #{r-get-desktop($release-section-margin-top)};
--release-section-margin-bottom: #{r-get-desktop(
$release-section-margin-bottom
)};
--card-padding: #{r-get-desktop($card-padding)};
--card-title-font-size: #{r-get-desktop($card-title-font-size)};
--card-content-font-size-clamp-min: #{r-get-desktop(
$card-content-font-size-clamp-min
)};
--card-content-font-size-clamp-val: #{r-get-desktop(
$card-content-font-size-clamp-val
)};
--card-content-font-size-clamp-max: #{r-get-desktop(
$card-content-font-size-clamp-max
)};
--download-gap: #{r-get-desktop($download-gap)};
--download-font-size: #{r-get-desktop($download-font-size)};
@include is-mobile() {
--release-title-font-size: #{r-get-mobile($release-title-font-size)};
--release-section-margin-top: #{r-get-mobile($release-section-margin-top)};
--release-section-margin-bottom: #{r-get-mobile(
$release-section-margin-bottom
)};
--card-padding: #{r-get-mobile($card-padding)};
--card-title-font-size: #{r-get-mobile($card-title-font-size)};
--card-content-font-size-clamp-min: #{r-get-mobile(
$card-content-font-size-clamp-min
)};
--card-content-font-size-clamp-val: #{r-get-mobile(
$card-content-font-size-clamp-val
)};
--card-content-font-size-clamp-max: #{r-get-mobile(
$card-content-font-size-clamp-max
)};
--download-gap: #{r-get-mobile($download-gap)};
--download-font-size: #{r-get-mobile($download-font-size)};
}
/** Color **/
--card-background-color: white;
--card-color: #2d2d2d;
--color-code-symbol: #{$color-code-symbol--light};
--color-code-keyword: #{$color-code-keyword--light};
--color-code-controlflow: #{$color-code-controlflow--light};
--color-code-basetype: #{$color-code-basetype--light};
--color-code-enginetype: #{$color-code-enginetype--light};
--color-code-usertype: #{$color-code-usertype--light};
--color-code-string: #{$color-code-string--light};
--color-code-background: #{$color-code-background--light};
--color-code-text: #{$color-code-text--light};
--color-code-function: #{$color-code-function--light};
--color-code-membervariable: #{$color-code-membervariable--light};
--color-code-gdscript-function: #{$color-code-gdscript-function--light};
--color-code-gdscript-globalfunction: #{$color-code-gdscript-globalfunction--light};
--color-code-gdscript-nodepath: #{$color-code-gdscript-nodepath--light};
--color-code-gdscript-nodereference: #{$color-code-gdscript-nodereference--light};
--color-code-gdscript-annotation: #{$color-code-gdscript-annotation--light};
--color-code-gdscript-stringname: #{$color-code-gdscript-stringname--light};
@include is-dark() {
--card-background-color: #333639;
--card-color: white;
--color-code-symbol: #{$color-code-symbol--dark};
--color-code-keyword: #{$color-code-keyword--dark};
--color-code-controlflow: #{$color-code-controlflow--dark};
--color-code-basetype: #{$color-code-basetype--dark};
--color-code-enginetype: #{$color-code-enginetype--dark};
--color-code-usertype: #{$color-code-usertype--dark};
--color-code-string: #{$color-code-string--dark};
--color-code-background: #{$color-code-background--dark};
--color-code-text: #{$color-code-text--dark};
--color-code-function: #{$color-code-function--dark};
--color-code-membervariable: #{$color-code-membervariable--dark};
--color-code-gdscript-function: #{$color-code-gdscript-function--dark};
--color-code-gdscript-globalfunction: #{$color-code-gdscript-globalfunction--dark};
--color-code-gdscript-nodepath: #{$color-code-gdscript-nodepath--dark};
--color-code-gdscript-nodereference: #{$color-code-gdscript-nodereference--dark};
--color-code-gdscript-annotation: #{$color-code-gdscript-annotation--dark};
--color-code-gdscript-stringname: #{$color-code-gdscript-stringname--dark};
}
code.highlight,
.code-highlight {
$_padding: 5px;
background-color: color-mix(
in srgb,
var(--color-code-background),
transparent 15%
);
@include is-dark() {
background-color: color-mix(
in srgb,
var(--color-code-background),
transparent 50%
);
}
display: inline-block;
padding: 0 ($_padding / 2);
margin: 0 0;
border-radius: $_padding;
color: var(--color-code-text);
font-family:
ui-monospace,
SFMono-Regular,
SF Mono,
Menlo,
Consolas,
Liberation Mono,
monospace;
@each $key
in (
symbol
keyword
controlflow
basetype
function
membervariable
gdscript-globalfunction
gdscript-annotation
)
{
.#{$key},
&.#{$key} {
color: var(--color-code-#{$key});
}
}
}
.replace-me {
&::before {
content: "TODO: replace me";
}
color: red !important;
}
a[href=""],
a:not([href]) {
color: red !important;
}
.release-header {
position: relative;
perspective: 1px;
transform-style: preserve-3d;
overflow: hidden;
.release-header-background {
content: "";
position: absolute;
top: -64px;
left: 0;
width: 100%;
height: calc(100% + 64px);
background-image: $header-background-image;
background-position: $header-background-position;
background-repeat: $header-background-repeat;
background-size: $header-background-size;
transform: translateZ(-1px) scale(2);
}
.release-header-content {
position: relative;
z-index: 1;
padding-top: $header-gap-top;
padding-bottom: $header-gap-bottom * 2;
.container {
overflow: visible;
}
.header-main-title {
background-image: $header-logo-image;
background-repeat: $header-logo-repeat;
background-position: $header-logo-position;
background-size: $header-logo-size;
height: $header-logo-height;
margin-bottom: 60px;
filter: drop-shadow(
0 0 20px #000000fc
); // To give it some distinction from the background
.header-main-title-text {
display: none;
}
// Margin between the title and the first .header-content
& + .header-content {
margin-top: 30vh;
}
}
.header-content {
color: $header-content-color;
gap: 20px;
padding: var(--card-padding);
margin-top: var(--card-padding);
border-radius: var(--card-padding);
backdrop-filter: blur(5px);
background-color: rgba(0, 0, 0, 0.75);
box-shadow: $card-box-shadow;
hr {
border-color: white;
}
.header-text {
> .header-title {
color: $header-content-color;
}
}
p {
hyphens: auto;
&:first-child {
margin-top: 0;
}
&:last-child {
margin-bottom: 0;
}
}
&.header-content-note {
font-size: 75%;
.header-note-title {
font-style: italic;
font-weight: 800;
font-size: 125%;
}
}
.header-numbers {
margin: auto;
min-width: 405px;
.header-numbers-commits {
--bar-color: #{$header-bar-commits-color};
.header-numbers-line.inactive {
--bar-color: #{$header-bar-commits-color-inactive};
}
}
.header-numbers-contributors {
--bar-color: #{$header-bar-contributors-color};
.header-numbers-line.inactive {
--bar-color: #{$header-bar-contributors-color-inactive};
}
}
.header-numbers-entry {
margin-bottom: $header-numbers-gap;
&:last-of-type {
margin-bottom: 0;
}
.header-numbers-line {
font-variant-numeric: tabular-nums;
.version {
font-weight: $header-version-font-weight;
margin-right: $header-bar-gap;
}
&.inactive {
.version,
.number {
opacity: 0.7;
}
}
.bar {
display: inline-block;
height: $header-bar-height;
background-color: var(--bar-color, #{$color-godot-blue});
transform: translateY(2px);
margin-right: $header-bar-gap;
}
}
}
}
}
}
}
.release-content {
position: relative;
top: -70px;
margin-top: 0;
color: black;
.release-cards {
display: grid;
width: 100%;
gap: var(--card-padding);
grid-template-columns: repeat(3, minmax($column-min-width, 1fr));
grid-auto-flow: row dense;
&.two-columns {
grid-template-columns: repeat(2, minmax($column-min-width, 1fr));
}
@include screen-is-two-columns-wide() {
grid-template-columns: repeat(2, minmax($column-min-width, 1fr));
}
@include screen-is-one-column-wide() {
&,
&.two-columns {
grid-template-columns: minmax($column-min-width, 1fr);
}
}
}
.release-card {
container-type: inline-size;
container-name: release-card;
contain: paint;
border-radius: var(--card-padding);
padding: var(--card-padding);
background-color: var(--card-background-color);
color: var(--card-color);
box-shadow: $card-box-shadow;
&.transparent-card {
background-color: transparent;
box-shadow: none;
}
@mixin media-top() {
grid-template-areas:
"media"
"contnt";
grid-template-rows:
auto
minmax(max-content, 1fr);
grid-template-columns: 1fr;
&:has(.release-card-image, .release-card-video) {
// Makes sure that we limit the height of media, but not other content.
grid-template-rows:
minmax(auto, 30cqh)
minmax(max-content, 1fr);
}
.release-card-media {
@include card-media-margin("top", var(--card-padding));
}
}
@mixin media-bottom() {
grid-template-areas:
"contnt"
"media";
grid-template-rows:
minmax(max-content, 1fr)
auto;
grid-template-columns: 1fr;
&:has(.release-card-image, .release-card-video) {
// Makes sure that we limit the height of media, but not other content.
grid-template-rows:
minmax(max-content, 1fr)
minmax(auto, 30cqh);
}
.release-card-media {
@include card-media-margin("bottom", var(--card-padding));
}
}
@mixin media-left() {
grid-template-areas: "media contnt";
grid-template-columns: minmax(auto, 40cqw) minmax(30%, 1fr);
grid-template-rows: 1fr;
.release-card-media {
@include card-media-margin("left", var(--card-padding));
}
}
@mixin media-right() {
grid-template-areas: "contnt media";
grid-template-columns: minmax(30%, 1fr) minmax(auto, 40cqw);
grid-template-rows: 1fr;
.release-card-media {
@include card-media-margin("right", var(--card-padding));
}
}
&.media-top .release-card-container {
@include media-top();
}
&.media-bottom .release-card-container {
@include media-bottom();
}
&.media-left .release-card-container {
@include media-left();
@container release-card (width <= #{$container-break}) {
@include media-top();
}
}
&.media-right .release-card-container {
@include media-right();
@container release-card (width <= #{$container-break}) {
@include media-bottom();
}
}
& *::selection {
background-color: var(--color-selection);
}
&.inverted {
background: var(--color-top)
linear-gradient(to bottom, var(--color-top), var(--color-bottom));
color: white;
.release-card-container {
.release-card-content .release-card-content-container {
.c-title {
color: white;
& > a {
color: white;
}
}
.c-blockquote {
color: white;
span.highlight {
color: var(--color-invert-highlight);
}
}
.c-content {
a {
color: var(--color-invert-highlight);
text-decoration-color: var(--color-invert-highlight);
&:visited {
color: color-mix(
in srgb,
var(--color-invert-highlight),
black 10%
);
text-decoration-color: color-mix(
in srgb,
var(--color-invert-highlight),
black 10%
);
}
}
.links-container {
a,
a:visited {
color: white;
text-decoration-color: white;
}
}
}
.c-link {
.c-link-a {
color: white;
text-decoration-color: white;
}
.contributor-area {
.contributor-list {
a {
color: var(--color-invert-highlight);
text-decoration-color: var(--color-invert-highlight);
}
}
}
}
}
}
}
.release-card-container {
display: grid;
gap: var(--card-padding);
grid-template-areas: "contnt";
height: 100%;
.release-card-content {
grid-area: contnt;
container-type: inline-size;
container-name: release-card-content;
.release-card-content-container {
gap: var(--card-padding);
height: 100%;
// Base display properties for browsers who don't support `:has()`.
display: flex;
flex-direction: column;
&:has(.c-title):has(.c-blockquote):has(.c-content) {
display: grid;
flex-direction: unset;
grid-template-areas:
"quote title"
"quote contnt"
"quote link";
grid-template-columns: 2fr 3fr;
grid-template-rows:
min-content
1fr
auto;
&:not(:has(.c-link)) {
grid-template-areas:
"quote title"
"quote contnt";
grid-template-rows:
min-content
1fr;
}
&.force-one-column {
grid-template-areas:
"quote"
"title"
"contnt"
"link";
grid-template-columns: 1fr;
grid-template-rows:
min-content
auto
1fr
auto;
&:not(:has(.c-link)) {
grid-template-areas:
"quote"
"title"
"contnt";
grid-template-rows:
min-content
auto
1fr;
}
}
@container release-card-content (width < #{$container-break}) {
grid-template-areas:
"quote"
"title"
"contnt"
"link";
grid-template-columns: 1fr;
grid-template-rows:
min-content
auto
1fr
auto;
&:not(:has(.c-link)) {
grid-template-areas:
"quote"
"title"
"contnt";
grid-template-rows:
min-content
auto
1fr;
}
}
}
&:not(:has(.c-title)):has(.c-blockquote):has(.c-content) {
display: grid;
flex-direction: unset;
grid-template-areas:
"quote contnt"
"quote link";
grid-template-columns: 2fr 3fr;
grid-template-rows:
1fr
auto;
&:not(:has(.c-link)) {
grid-template-areas: "quote contnt";
grid-template-rows: 1fr;
}
&.force-one-column {
grid-template-areas:
"quote"
"contnt"
"link";
grid-template-columns: 1fr;
grid-template-rows:
min-content
1fr
auto;
&:not(:has(.c-link)) {
grid-template-areas:
"quote"
"contnt";
grid-template-rows:
min-content
1fr;
}
}
@container release-card-content (width < #{$container-break}) {
grid-template-areas:
"quote"
"contnt"
"link";
grid-template-columns: 1fr;
grid-template-rows:
min-content
1fr
auto;
&:not(:has(.c-link)) {
grid-template-areas:
"quote"
"contnt";
grid-template-rows:
min-content
1fr;
}
}
}
&:has(.c-title):has(.c-blockquote):not(:has(.c-content)) {
display: grid;
flex-direction: unset;
grid-template-areas:
"title"
"quote"
"link";
grid-template-rows:
min-content
1fr
auto;
&:not(:has(.c-link)) {
grid-template-areas:
"title"
"quote";
grid-template-rows:
min-content
1fr;
}
}
&:has(.c-title):not(:has(.c-blockquote)):has(.c-content) {
display: grid;
flex-direction: unset;
grid-template-areas:
"title"
"contnt"
"link";
grid-template-rows:
min-content
1fr
auto;
&:not(:has(.c-link)) {
grid-template-areas:
"title"
"contnt";
grid-template-rows:
min-content
1fr;
}
}
&:not(:has(.c-title)):has(.c-blockquote):not(:has(.c-content)) {
display: grid;
flex-direction: unset;
grid-template-areas:
"quote"
"link";
grid-template-rows:
auto
auto;
&:not(:has(.c-link)) {
grid-template-areas: "quote";
grid-template-rows: auto;
}
}
&:not(:has(.c-title)):not(:has(.c-blockquote)):has(.c-content) {
display: grid;
flex-direction: unset;
grid-template-areas:
"contnt"
"link";
grid-template-rows:
auto
auto;
&:not(:has(.c-link)) {
grid-template-areas: "contnt";
grid-template-rows: auto;
}
}
.c-title {
grid-area: title;
margin-bottom: 0;
color: var(--color-top);
font-weight: 700;
font-size: var(--card-title-font-size);
a {
color: var(--color-top);
@include is-dark() {
color: white;
text-decoration-color: white;
}
text-decoration: none;
&:hover {
text-decoration: underline;
}
p {
line-height: normal;
margin: 0;
}
}
}
.c-blockquote {
grid-area: quote;
font-size: clamp(30px, 7cqw, 35px);
font-weight: 800;
p {
line-height: normal;
margin: 0;
}
span.highlight {
color: var(--color-highlight);
}
}
.c-content {
grid-area: contnt;
font-size: clamp(
var(--card-content-font-size-clamp-min),
var(--card-content-font-size-clamp-val),
var(--card-content-font-size-clamp-max)
);
hyphens: auto;
& > p,
& > ul {
&:first-child {
margin-top: 0;
}
&:last-child {
margin-bottom: 0;
}
}
& > ul:last-child > li:last-child {
margin-bottom: 0;
}
.links-container {
a,
a:visited {
color: white;
text-decoration-color: white;
}
}
a {
color: var(--color-highlight);
text-decoration-color: var(--color-highlight);
&:visited {
color: color-mix(in srgb, var(--color-highlight), black 10%);
text-decoration-color: color-mix(
in srgb,
var(--color-highlight),
black 10%
);
}
}
}
.c-link {
grid-area: link;
position: relative;
margin-top: 10px;
color: inherit;
user-select: none;
.c-link-a {
color: black;
text-decoration-color: black;
text-decoration: underline;
font-size: 21px;
font-weight: 700;
@include is-dark() {
color: white;
text-decoration-color: white;
}
}
.contributor-area {
display: grid;
grid-template-areas: "icon list";
grid-template-columns: 50px auto;
margin-top: 1em;
font-size: 80%;
user-select: auto;
.contributor-icon {
grid-area: icon;
display: flex;
align-items: center;
}
.contributor-list {
grid-area: list;
display: flex;
align-items: center;
a {
color: var(--color-highlight);
text-decoration-color: var(--color-highlight);
}
}
}
}
}
}
.release-card-media {
grid-area: media;
position: relative;
contain: paint;
container-type: inline-size;
container-name: release-card-media;
.release-card-comparison {
$comparison-range-indicator-width: 0.25em;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
// The indicator is the black bar.
.comparison-range-indicator {
position: absolute;
top: -2px;
left: calc(50% - ($comparison-range-indicator-width / 2));
width: 0.25em;
height: calc(100% + 4px);
background-color: black;
}
.comparison-range {
position: absolute;
top: -2px;
left: 0;
width: 100%;
height: calc(100% + 4px);
background-color: transparent;
user-select: none;
-webkit-appearance: none !important;
appearance: none;
overflow: hidden;
// Create a mixin here because Chromium doesn't like
// to have its `::-webkit-slider-thumb` as a co-declared
// style with `::-moz-range-thumb`.
@mixin thumb() {
-webkit-appearance: none !important;
appearance: none;
background-color: transparent;
color: transparent;
border: none;
}
&::-moz-range-thumb {
@include thumb();
}
&::-webkit-slider-thumb {
@include thumb();
}
&::-moz-range-track,
&::-webkit-slider-runnable-track {
-webkit-appearance: none !important;
appearance: none;
}
&:focus {
outline: none;
}
}
}
@each $type in (video, image) {
.release-card-#{$type}-container {
position: absolute;
width: 100%;
height: 100%;
}
.release-card-#{$type}-label {
position: absolute;
top: 0;
left: 0;
font-size: 1em;
font-weight: 700;
color: white;
-webkit-text-stroke: 2px black;
paint-order: stroke fill;
margin: 0.5em;
}
.#{$type}-comparison-b {
--mask-width: 50%;
mask-image: linear-gradient(
to right,
transparent 0%,
transparent var(--mask-width, 50%),
white calc(var(--mask-width, 50%) + 0.000001%),
white
);
}
.#{$type}-comparison-b .release-card-#{$type}-label {
left: unset;
right: 0;
}
}
.release-card-video,
.release-card-image {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
overflow: hidden;
&.position-top-left {
object-position: top left;
}
&.position-top-center {
object-position: top center;
}
&.position-bottom-left {
object-position: bottom left;
}
&.position-bottom-center {
object-position: bottom center;
}
&.position-center-right {
object-position: center right;
}
}
&:has(> .release-card-button) {
display: grid;
justify-content: center;
align-items: center;
}
.release-card-button {
display: flex;
justify-content: center;
align-items: center;
text-align: center;
font-weight: 700;
background-color: var(--color-top);
color: white;
margin: var(--card-padding);
padding: var(--card-padding);
border-radius: 14px;
text-decoration: none;
cursor: pointer;
}
.release-card-content-creator {
position: absolute;
bottom: 0;
right: 0;
width: fit-content;
font-size: 60%;
color: white;
font-weight: 600;
background-color: rgba(0, 0, 0, 0.75);
border-top-left-radius: 999999px;
padding: 0.25em 0.75em 0.35em 1.25em;
a {
// color: var(--color-invert);
//text-decoration-color: var(--color-invert);
color: white;
text-decoration-color: white;
}
p {
margin: 0;
}
}
}
}
}
.section {
margin-top: var(--release-section-margin-top);
margin-bottom: var(--release-section-margin-bottom);
&:first-of-type {
margin-top: 0;
}
&:last-of-type {
margin-bottom: 0;
}
&.subsection {
--color-top: var(--color-top-muted);
--color-bottom: var(--color-bottom-muted);
}
// Remove margins from the .subsection under a .section
&:has(+ .subsection) {
margin-bottom: 0;
}
& + .subsection {
margin-top: 0;
}
.section-title {
container-type: inline-size;
container-name: section-title;
margin-bottom: calc(var(--card-padding) * 2);
}
.section-title h3 {
position: relative;
background: var(--color-top)
linear-gradient(to bottom, var(--color-top), var(--color-bottom));
padding: calc(var(--card-padding) * 2);
border-radius: var(--card-padding);
margin-bottom: 0;
box-shadow: $card-box-shadow;
font-size: #{"max(clamp(4cqw, 50px, 6cqw), 2em)"};
font-weight: 800;
@at-root #{selector-replace(&, ".section", ".section.subsection")} {
font-size: #{"max(clamp(2cqw, 35px, 4cqw), 1.5em)"};
font-weight: 600;
}
contain: paint;
.section-robot {
position: absolute;
bottom: 0;
right: 0;
transform: translateX(250px) translateY(30cqh);
color: var(--color-top);
font-size: $donate-robot-size;
z-index: -1;
}
}
.section-title a {
color: white;
text-decoration-color: white;
text-decoration: none;
&:hover {
text-decoration: underline;
filter: none;
}
}
}
@each $section-name, $section-colors in $sections {
.section-#{$section-name} {
--color-top: #{map-get($section-colors, "color-top")};
--color-bottom: #{map-get($section-colors, "color-bottom")};
--color-top-muted: #{map-get($section-colors, "color-top-muted")};
--color-bottom-muted: #{map-get($section-colors, "color-bottom-muted")};
--color-selection: #{map-get($section-colors, "color-selection")};
--color-invert: #{map-get($section-colors, "color-invert")};
--color-highlight: #{map-get($section-colors, "color-highlight")};
--color-highlight-switch: #{map-get(
$section-colors,
"color-highlight--dark"
)};
--color-invert-highlight: #{map-get(
$section-colors,
"color-invert-highlight"
)};
@include is-light() {
--color-selection: #{map-get(
$section-colors,
"color-selection--light"
)};
}
@include is-dark() {
--color-highlight: #{map-get(
$section-colors,
"color-highlight--dark"
)};
--color-highlight-switch: #{map-get(
$section-colors,
"color-highlight"
)};
}
}
}
}
}
ul.list-style-none {
padding-left: 0;
& > li {
list-style: none;
}
}
.span-3 {
grid-column: span 3;
@include screen-is-two-columns-wide() {
grid-column: span 2;
}
@include screen-is-one-column-wide() {
grid-column: span 1;
}
}
.span-2-at-3-col {
grid-column: span 2;
@include screen-is-two-columns-wide() {
grid-column: span 1;
}
}
.span-2 {
grid-column: span 2;
@include screen-is-one-column-wide() {
grid-column: span 1;
}
}
.align-right {
text-align: right;
}
.overflow-y-hidden {
overflow-y: hidden;
}