Files
website/stylesheet.css

1088 lines
15 KiB
CSS

/*----------------------
General
----------------------*/
/* Monocraft, a pixel font in the style of Minecraft's; browsers take the first format they support. */
@font-face {
font-family: 'minecraft';
src: url('assets/fonts/Monocraft/Monocraft.woff2?v=4.2') format('woff2'),
url('assets/fonts/Monocraft/Monocraft.woff?v=4.2') format('woff'),
url('assets/fonts/Monocraft/Monocraft.ttf?v=4.2') format('truetype');
}
/* Reset browser defaults; padding and borders count inside an element's width. */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
/* Text scales gently with the screen width, never below 14px, and grows with browser zoom. */
body {
font-family: 'minecraft', sans-serif;
font-size: clamp(14px, 0.8rem + 0.5vw, 26px);
background-color: black;
}
h1 {
font-size: 1.5em;
}
h2 {
font-size: 1.25em;
}
/* Back-to-top button: its top margin keeps it below the first screen, then it sticks to the bottom-right corner. */
.top {
position: sticky;
bottom: 1%;
display: block;
width: 55px;
height: 55px;
margin: calc(100vh + 50px) 1% 0 auto;
padding: 10px;
font-size: 35px;
line-height: 35px;
text-align: center;
text-decoration: none;
color: white;
background: #AA00AA;
border-radius: 50%;
opacity: 85%;
}
@media (max-width: 700px) {
.top {
width: 44px;
height: 44px;
padding: 8px;
font-size: 28px;
line-height: 28px;
}
}
/* Lists are used for navigation and icon rows, never as bulleted lists. */
ul, nav {
list-style: none;
}
/* Links take the color of their surroundings and brighten slightly on hover. */
a {
text-decoration: none;
color: inherit;
cursor: pointer;
opacity: 0.9;
}
a:hover {
opacity: 1.0;
}
/* Gives text a dark shadow so it stays readable over a background image. */
.outlined {
text-shadow: 0px 2px black;
}
/* Rounds the corners of image panels. */
.roundedcorners {
border-radius: 15px;
}
/* Fills a panel with its background image, centered and cropped rather than tiled. */
.zoomedout {
background-repeat: no-repeat;
background-position: center center;
background-size: cover;
}
/*----------------------
Header
----------------------*/
/* Logo on the left, menu on the right: the first row of the banner or page it sits in. */
header {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
padding: 2vh 3vh 2vh 24px;
color: #FFFFFF;
}
.main-logo {
display: block;
width: min(95px, 16vw);
}
header nav {
font-size: clamp(14px, 0.7rem + 0.5vw, 22px);
text-align: center;
}
/* The row of buttons wraps onto another row rather than running off the screen. */
header nav ul {
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
}
header nav li {
margin: 0 0.8em;
line-height: 2;
white-space: nowrap;
}
header nav li:last-child {
margin-right: 0;
}
/* Narrow screens: logo above a centered menu, which then has room for larger text. */
@media (max-width: 1000px) {
header {
flex-direction: column;
padding: 20px 30px;
}
header nav {
font-size: clamp(14px, 4vw, 20px);
}
header nav ul {
justify-content: center;
}
}
/*----------------------
Banner
----------------------*/
/* Full-screen opening panel: the header on top, the tagline centered in the rest. */
.banner {
position: relative;
display: flex;
flex-direction: column;
min-height: 100vh;
}
/* The background image sits behind everything in the banner, header included. */
.banner .background-image {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-size: cover;
z-index: -1;
}
/* The white text shadow lifts the tagline off the image. */
.tagline {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 2em 0 3em;
text-align: center;
font-size: 45px;
text-shadow: 0 1px 0 #FFFFFF, 0 3px 0 #FFFFFF, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
}
.tagline p {
max-width: 800px;
margin-bottom: 17.5px;
padding: 0 20px;
}
/* Join Discord: white on Discord's brand color (4.6:1 contrast). */
.discord-button {
margin-top: 8%;
padding: 0.35em 0.8em;
font-size: clamp(22px, 3.5vw, 52px);
color: #FFFFFF;
background-color: #5865F2;
border-radius: 0.3em;
text-shadow: 0 2px 0 rgba(0, 0, 0, 0.35);
box-shadow: 0 0.12em 0 #3C45A5, 0 0 30px rgba(88, 101, 242, 0.5);
opacity: 1;
}
.discord-button:hover,
.discord-button:focus-visible {
background-color: #4752C4;
}
/*----------------------
Section Layout
----------------------*/
/* A section below the banner: a column of .box rows over a background image, each row holding .flex-child panels. */
.games {
display: flex;
flex-direction: column;
color: white;
}
.games h1,
.games h2 {
text-align: center;
}
/* One row. The side margins keep the content away from the screen edges. */
.box {
display: flex;
margin: 2% 12%;
}
/* Phones: narrower side margins so the text keeps a usable width. */
@media (max-width: 700px) {
.box {
margin: 3% 4%;
}
}
/* Panels in a row share its width equally unless sized below. */
.flex-child {
flex: 1;
}
/* Breathing room around a text panel that sits beside an image panel. */
.splitter {
margin: 3%;
}
/* An image-and-text row: 60% image, 40% text; the image panel takes its height from the text. */
.games .box > .flex-child.small {
flex: 2;
}
.games .box > .flex-child.large {
flex: 3;
}
/* Narrow screens: image and text stack, and the image panel gets a height of its own. */
@media (max-width: 1000px) {
.games .box {
flex-wrap: wrap;
}
.games .box > .flex-child.small,
.games .box > .flex-child.large {
flex-basis: 100%;
}
.games .box > .flex-child.large {
min-height: 40vh;
}
}
/*----------------------
Games
----------------------*/
#smp {
background-image: url(assets/images/smp-banner-one.png);
background-size: cover;
}
/*----------------------
Shop
----------------------*/
/* A dark gradient sits over the screenshot so the white text and rank cards stay readable. */
#shop {
background-image: linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.6)), url(assets/images/bad-shop.png);
background-size: cover;
background-position: center;
}
/* The rank cards share one row and wrap onto more rows on narrow screens. */
.ranks {
flex-wrap: wrap;
justify-content: center;
gap: 3vh;
}
/* The whole card is the link to the rank's store page. */
.rank {
display: flex;
flex-direction: column;
align-items: center;
flex: 1 1 280px;
max-width: 420px;
padding: 2vh;
color: white;
background-color: rgba(0, 0, 0, 0.55);
border-radius: 15px;
opacity: 1;
}
.rank:hover,
.rank:focus-visible {
outline: 2px solid #FFAA00;
}
/* The rank badge image at the top of the card. */
.rank img {
width: 100%;
max-width: 250px;
border-radius: 10px;
}
.rank .price {
margin: 1.5vh 0;
font-size: 1.6em;
}
/* The billing period sits on its own line under the price. */
.rank .price span {
display: block;
font-size: 0.8em;
opacity: 0.7;
}
/* The benefit list fills the card so every Buy button sits on the same line across the row. */
.rank ul {
align-self: stretch;
flex: 1;
margin-bottom: 2vh;
text-align: left;
}
.rank li {
margin-bottom: 1vh;
}
/* Lists have no bullets (see the General section), so each benefit gets a gold dash instead. */
.rank li::before {
content: "- ";
color: #FFAA00;
}
.buy {
padding: 0.4em 1em;
font-size: 1em;
color: black;
background-color: #FFAA00;
border-radius: 0.3em;
}
.rank:hover .buy,
.rank:focus-visible .buy {
background-color: #FFC84A;
}
/*----------------------
Team
----------------------*/
#team {
background-image: linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.6)), url(assets/images/sky.png);
background-size: cover;
background-position: center;
}
/* The staff cards share rows and wrap as needed. */
.staff {
flex-wrap: wrap;
justify-content: center;
gap: 3vh;
}
.member {
flex: 0 1 220px;
padding: 2vh;
text-align: center;
color: white;
background-color: rgba(0, 0, 0, 0.55);
border-radius: 15px;
}
/* Heads are 8x8 pixel art scaled up, so keep the pixels crisp rather than blurred. */
.member img {
width: 128px;
max-width: 100%;
height: auto;
border-radius: 10px;
image-rendering: pixelated;
}
.member .name {
margin-top: 1.5vh;
font-size: 1.2em;
}
.member .role {
font-size: 0.9em;
}
/* Row of application buttons. */
.apply {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 2vh;
margin: 2vh 0 4vh;
}
.apply-button {
display: inline-flex;
align-items: center;
gap: 0.5em;
padding: 0.5em 1em;
font-size: 1em;
color: white;
background-color: rgba(0, 0, 0, 0.55);
border: 2px solid #AA00AA;
border-radius: 0.3em;
}
.apply-button:hover,
.apply-button:focus-visible {
background-color: #AA00AA;
}
/*----------------------
World
----------------------*/
#world {
background-image: linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.6)), url(assets/images/front-page-headliner.png);
background-size: cover;
background-position: center;
}
/*----------------------
FAQ
----------------------*/
#faq {
background-image: linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.6)), url(assets/images/space.png);
background-size: cover;
background-position: center;
}
/* Two columns side by side; they stack on narrow screens. */
.faq {
flex-wrap: wrap;
gap: 3vh;
}
.qa {
flex: 1 1 320px;
padding: 2vh;
color: white;
background-color: rgba(0, 0, 0, 0.55);
border-radius: 15px;
}
/* A question (or a heading in the facts column), spaced away from the answer above it. */
.qa .q {
margin-top: 2vh;
color: #FFAA00;
}
.qa .q:first-child {
margin-top: 0;
}
.qa a {
color: #55FFFF;
text-decoration: underline;
}
/*----------------------
Subpages
----------------------*/
/* apply.php and the policy routes: one section, tall enough that the footer never sits mid-screen. */
.page {
min-height: 100vh;
padding-bottom: 4vh;
}
#apply {
background-image: linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.6)), url(/assets/images/sky.png);
background-size: cover;
background-position: center;
}
#policy {
background-image: linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.6)), url(/assets/images/space.png);
background-size: cover;
background-position: center;
}
/* Dark translucent text panel. */
.panel {
padding: 3vh;
line-height: 1.5;
color: white;
background-color: rgba(0, 0, 0, 0.55);
border-radius: 15px;
}
.panel p {
margin-bottom: 1.5vh;
}
.panel a {
color: #55FFFF;
text-decoration: underline;
}
.panel .apply-button {
text-decoration: none;
color: white;
}
/* Status message: closed form, failed send, validation summary. */
.notice {
padding: 1.5vh 2vh;
background-color: rgba(255, 170, 0, 0.15);
border: 2px solid #FFAA00;
border-radius: 0.3em;
}
/* Policy documents. Lists get their bullets back here. */
.policy h2 {
margin: 3vh 0 1.5vh;
font-size: 1.4em;
color: #FFAA00;
}
.policy h3 {
margin: 2vh 0 0.8vh;
font-size: 1.1em;
color: #55FFFF;
}
.policy ul,
.policy ol {
margin: 0 0 1.5vh 1.5em;
list-style: disc;
}
.policy ol {
list-style: decimal;
}
.policy li {
margin-bottom: 0.6vh;
}
.policy .note,
.policy .source {
font-size: 0.85em;
opacity: 0.8;
}
.policy .source {
margin-top: 4vh;
}
/* Application form fields. */
.field {
margin-bottom: 3vh;
}
fieldset {
border: 0;
min-width: 0;
}
/* The whole form is disabled while applications are closed. */
fieldset:disabled {
opacity: 0.6;
}
.field .question {
display: block;
margin-bottom: 1vh;
color: #FFAA00;
}
.field .required {
color: #FF5555;
}
.field .hint {
margin-bottom: 1vh;
font-size: 0.85em;
opacity: 0.7;
}
.field input[type="text"],
.field input[type="url"],
.field input[type="number"],
.field textarea {
width: 100%;
padding: 0.6em 0.8em;
font: inherit;
color: white;
background-color: rgba(255, 255, 255, 0.08);
border: 2px solid #555555;
border-radius: 0.3em;
}
.field input[type="number"] {
width: 8em;
}
.field textarea {
min-height: 8em;
resize: vertical;
}
.field input:focus,
.field textarea:focus {
outline: none;
border-color: #FFAA00;
}
.field.invalid input,
.field.invalid textarea {
border-color: #FF5555;
}
/* A radio or checkbox with its label. */
.field .choice {
display: flex;
align-items: flex-start;
gap: 0.6em;
margin-bottom: 0.8vh;
cursor: pointer;
}
.field .choice input {
flex: none;
width: 1.1em;
height: 1.1em;
margin-top: 0.2em;
accent-color: #FFAA00;
}
.field .error {
margin-top: 0.8vh;
color: #FF5555;
}
.submit {
padding: 0.5em 1.2em;
font: inherit;
font-size: 1em;
color: black;
background-color: #FFAA00;
border: 0;
border-radius: 0.3em;
cursor: pointer;
}
.submit:hover,
.submit:focus-visible {
background-color: #FFC84A;
}
/* Spam trap: off screen for people, visible to bots. */
.honeypot {
position: absolute;
left: -9999px;
width: 1px;
height: 1px;
overflow: hidden;
}
/*----------------------
Footer
----------------------*/
footer {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
color: white;
background-color: black;
padding: 60px 0;
}
/* Row of social icons. */
footer ul {
display: flex;
margin-bottom: 25px;
font-size: 32px;
}
footer ul li {
margin: 0 8px;
}
footer ul li:first-child {
margin-left: 0;
}
footer ul li:last-child {
margin-right: 0;
}
footer p {
text-transform: uppercase;
font-size: 14px;
color: rgba(255,255,255,0.6);
margin-bottom: 10px;
}
footer p a {
color: #FFFFFF;
}
@media (max-width: 700px) {
footer {
padding: 80px 15px;
}
}
/*----------------------
Colors
----------------------*/
/* Minecraft's sixteen chat colors by code. .bukkit-blue is Aqua (&b); Blue (&9) is .bukkit-true-blue. */
/* Black (&0) */
.bukkit-black {
color: #000000;
}
/* Dark Blue (&1) */
.bukkit-darkblue {
color: #0000AA;
}
/* Dark Green (&2) */
.bukkit-darkgreen {
color: #00AA00;
}
/* Dark Aqua (&3) */
.bukkit-dark-aqua {
color: #00AAAA;
}
/* Dark Red (&4) */
.bukkit-dark-red {
color: #AA0000;
}
/* Dark Purple (&5) */
.bukkit-dark-purple {
color: #AA00AA;
}
/* Gold (&6) */
.bukkit-gold {
color: #FFAA00;
}
/* Gray (&7) */
.bukkit-gray {
color: #AAAAAA;
}
/* Dark Gray (&8) */
.bukkit-dark-gray {
color: #555555;
}
/* Blue (&9) */
.bukkit-true-blue {
color: #5555FF;
}
/* Green (&a) */
.bukkit-green {
color: #55FF55;
}
/* Aqua (&b) */
.bukkit-blue {
color: #55FFFF;
}
/* Red (&c) */
.bukkit-red {
color: #FF5555;
}
/* Light Purple (&d) */
.bukkit-light-purple {
color: #FF55FF;
}
/* Yellow (&e) */
.bukkit-yellow {
color: #FFFF55;
}
/* White (&f) */
.bukkit-white {
color: #FFFFFF;
}