Hello whiny.lol

This commit is contained in:
2026-03-09 18:41:02 +00:00
commit b880a1acc2
181 changed files with 3017 additions and 0 deletions

53
assets/css/fonts.css Normal file
View File

@@ -0,0 +1,53 @@
/* Body */
@font-face {
font-family: "Inter Variable";
font-style: normal;
font-display: swap;
src: url("/fonts/Inter.woff2") format("woff2");
font-weight: 100 900;
}
@font-face {
font-family: "Inter Variable";
font-style: italic;
font-display: swap;
src: url("/fonts/Inter-Italic.woff2") format("woff2");
font-weight: 100 900;
}
/* Heading */
@font-face {
font-family: "IBM Plex Sans Variable";
font-style: normal;
font-display: swap;
src: url("/fonts/IBM Plex Sans Var-Roman.woff2") format("woff2");
font-weight: 100 900;
}
@font-face {
font-family: "IBM Plex Sans Variable";
font-style: italic;
font-display: swap;
src: url("/fonts/IBM Plex Sans Var-Italic.woff2") format("woff2");
font-weight: 100 900;
}
/* Mono */
@font-face {
font-family: "IBM Plex Mono";
font-style: normal;
font-display: swap;
src: url("/fonts/IBMPlexMono-Regular.woff2") format("woff2");
font-weight: 400;
}
@font-face {
font-family: "IBM Plex Mono";
font-style: italic;
font-display: swap;
src: url("/fonts/IBMPlexMono-Italic.woff2") format("woff2");
font-weight: 400;
}

775
assets/css/styles.css Executable file
View File

@@ -0,0 +1,775 @@
:root {
/* Fonts */
--body: "Inter Variable", sans-serif;
--heading: "IBM Plex Sans Variable", sans-serif;
--monospace: "IBM Plex Mono", monospace;
/* Padding */
--padding-100: 0.5rem;
--padding-200: 0.75rem;
--padding-300: 1rem;
--padding-400: 1.25rem;
--padding-500: 1.5rem;
--padding-600: 1.75rem;
--padding-700: 2rem;
/* Spacing */
--spacing-small: 2.5rem;
--spacing-medium: 3rem;
--spacing-large: 6rem;
/* Widths */
--width-page: 60rem;
--width-content: 50rem;
--width-constrained: 72ch;
/* UI */
--text: rgb(240 240 240);
--text-2: rgb(200 200 200);
--text-3: rgb(150 150 150);
--primary: rgb(28 28 55);
--secondary: rgb(15 12 35);
--background: rgb(22 22 40);
--accent-dark: rgb(45 45 65);
--accent-light: rgb(50 50 80);
/* Miscellaneous */
--header-height: 64px;
}
/* CSS Reset - Josh W. Comeau */
*,
*::before,
*::after {
box-sizing: border-box;
}
* {
margin: 0;
}
input,
button,
textarea,
select {
font: inherit;
}
img,
picture,
video,
canvas,
svg {
display: block;
max-inline-size: 100%;
block-size: auto;
}
/* Typography */
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: var(--heading);
font-variation-settings: 'wdth' 85; /* I have to add this due to a WebKit issue (215605) */
font-weight: 500;
text-wrap: balance;
overflow-wrap: break-word;
}
h1 {
font-size: clamp(1.625rem, 1rem + 1.25vw, 1.75rem);
line-height: 1.25em;
}
h2 {
font-size: clamp(1.5rem, 0.875rem + 1.25vw, 1.625rem);
line-height: 1.275em;
}
h3 {
font-size: clamp(1.375rem, 0.75rem + 1.25vw, 1.5rem);
line-height: 1.3em;
}
h4 {
font-size: clamp(1.25rem, 0.625rem + 1.25vw, 1.375rem);
line-height: 1.375em;
}
h5 {
font-size: clamp(1.125rem, 0.5rem + 1.25vw, 1.25rem);
line-height: 1.45em;
}
h6 {
font-size: clamp(1rem, 0.375rem + 1.25vw, 1.125rem);
}
p {
overflow-wrap: break-word;
word-break: break-word;
}
a {
color: var(--text);
text-decoration: none;
font-weight: 500;
}
a:is(:hover, :focus-visible) {
color: var(--text-2);
}
strong {
font-weight: 600;
}
pre {
font-size: 0.875rem;
padding: var(--padding-300);
border: 1px solid var(--accent-dark);
white-space: pre-wrap;
}
code {
font-family: var(--monospace);
}
code:not(pre code) {
background-color: var(--accent-dark);
padding-inline: 0.125em;
}
time {
font-weight: inherit;
}
/* Page elements */
html {
scroll-behavior: smooth;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
scrollbar-gutter: stable;
}
html:has(dialog[open]) {
overflow: hidden;
}
body {
font-family: var(--body);
font-size: 1rem;
line-height: 1.5;
background-color: var(--background);
color: var(--text);
min-block-size: 100vh;
display: flex;
flex-direction: column;
}
main {
flex: 1;
}
/* Header & navigation */
header {
position: sticky;
inset-block-start: 0;
background-color: var(--primary);
z-index: 10;
}
.main-navigation {
display: flex;
justify-content: space-between;
align-items: center;
padding: var(--padding-400) var(--padding-200);
gap: var(--padding-400);
}
.site-title svg {
block-size: 24px;
}
/* Main navigation */
.main-navigation a:is(:hover, :focus-visible) {
color: var(--text-2);
}
#menu-button {
display: none;
font-size: inherit;
}
#menu-button:is(:hover, :focus-visible, [aria-expanded='true']) {
color: var(--text-2);
}
/* Mobile menu */
.mobile-navigation {
position: fixed;
inline-size: 100%;
background-color: var(--primary);
inset-block-start: var(--header-height);
border-block-end: 1px solid var(--accent-light);
}
.mobile-navigation.nav-open {
display: block;
}
.mobile-navigation.nav-closed {
display: none;
}
.mobile-navigation .row {
gap: var(--padding-400);
padding-inline: var(--padding-200);
padding-block-end: var(--padding-600);
}
.mobile-navigation a {
font-family: var(--heading);
font-variation-settings: 'wdth' 85;
font-size: 1.5rem;
line-height: 1.35em;
}
.mobile-navigation a:is(:hover, :focus-visible) {
color: var(--text-2);
}
/* Hero */
.hero {
background: linear-gradient(var(--primary), var(--secondary));
border-block-end: 1px solid var(--accent-light);
}
.hero-inner {
padding-block: var(--padding-600) var(--spacing-medium);
padding-inline: var(--padding-200);
}
.hero-inner:not(.home) * + * {
margin-block-start: var(--padding-500);
}
.hero-inner p {
font-size: 0.875rem;
color: var(--text-2);
}
/* Content specific */
.hero-inner .cover {
border-radius: var(--padding-200);
}
/* Homepage specific */
.hero-inner.home {
padding-block: 4.75rem var(--spacing-large);
}
.hero-inner.home h1 {
font-size: clamp(2.125rem, 0.25rem + 3.75vw, 2.5rem);
line-height: 1.3em;
margin-block-end: 0;
max-inline-size: 20ch;
}
.hero-inner.home p {
color: var(--text);
font-size: clamp(1rem, 0.375rem + 1.25vw, 1.125rem);
max-inline-size: 35ch;
}
/* Container */
.container {
padding: var(--spacing-medium) var(--padding-200);
}
.width-content,
.width-page {
margin-inline: auto;
}
.width-content {
max-inline-size: var(--width-content);
}
.width-page {
max-inline-size: var(--width-page);
}
/* Row */
.row {
display: flex;
flex-flow: wrap;
align-items: center;
gap: var(--padding-300);
}
.row:is(ul) {
list-style: none;
padding: 0;
}
.row.centered {
justify-content: center;
}
.row.vertical {
flex-direction: column;
align-items: initial;
}
/* Link */
.link {
display: inline-block;
font-size: 0.875rem;
cursor: pointer;
}
.link:is(button) {
color: inherit;
background: transparent;
padding: 0;
border: none;
}
/* Button-style links */
.link:is(.badge, .pill) {
background-color: var(--primary);
border: 1px solid var(--accent-light);
border-radius: var(--padding-300);
}
.link:is(.badge, .pill):is(:hover, :focus-visible) {
color: inherit;
background-color: var(--accent-light);
}
.link.badge {
padding: var(--padding-100) var(--padding-300);
}
.link.pill {
padding: var(--padding-300);
}
/* With icon */
.link.icon {
display: flex;
align-items: center;
gap: var(--padding-300);
}
.link.icon :is(img, svg) {
inline-size: 20px;
}
/* Meta */
.link.meta {
color: var(--text-2);
}
.link.meta:is(:hover, :focus-visible) {
color: var(--text);
}
.link.meta.icon {
gap: var(--padding-100);
}
.link.icon.meta :is(img, svg) {
inline-size: 18px;
}
/* Pagination */
.pagination {
padding-block-start: var(--spacing-medium);
}
.pagination .link {
padding: var(--padding-200) var(--padding-400);
border-radius: var(--padding-300);
border: 1px solid var(--accent-dark);
}
.pagination .link:is(:hover, :focus-visible) {
color: inherit;
border: 1px solid var(--accent-light);
background-color: var(--accent-light);
}
.pagination .link.current-page {
background-color: var(--secondary);
border: 1px solid var(--accent-light);
cursor: default;
}
/* Reusable blocks for text content */
.block {
border: 1px solid var(--accent-light);
background-color: var(--secondary);
border-radius: var(--padding-300);
}
.block-title {
font-size: 1.125rem;
padding: var(--padding-300);
border-block-end: 1px solid var(--accent-light);
}
.block .block-content {
padding: var(--padding-300);
}
.block .link:is(.badge, .pill) {
border-radius: var(--padding-100);
}
/* Overview */
.block.overview {
margin-block-end: var(--spacing-small);
}
.block.overview .block-content {
padding: var(--padding-500) var(--padding-300);
}
.score {
font-size: 1.875rem;
line-height: 1.125em;
margin-block-end: var(--padding-500);
}
/* Dialog & modal */
dialog.block {
padding: unset;
margin: auto;
color: inherit;
inline-size: var(--width-constrained);
animation: dialog cubic-bezier(0.86,0,0.07,1) 0.5s both;
}
dialog::backdrop {
background-color: rgb(0 0 0 / 0.5);
}
dialog.block .block-title {
font-size: 1.25rem;
}
dialog.block .block-content {
overflow-y: scroll;
max-block-size: 25dvh;
scrollbar-width: none;
}
dialog .options {
border-block-start: 1px solid var(--accent-light);
}
dialog .options .row {
justify-content: end;
}
@keyframes dialog {
0% {
scale: 0.95;
opacity: 0%;
}
100% {
scale: 1;
opacity: 100%;
}
}
/* Block alt */
.block.opt-out {
border-style: dashed;
border-color: var(--accent-light);
background-color: initial;
}
.block.opt-out .block-content p {
font-size: 0.875rem;
color: var(--text-2);
margin-block-start: var(--padding-300);
}
#gc-status {
line-height: 1.5;
}
/* Text content — Prose */
.prose {
line-height: 1.6;
}
.prose > :first-child {
margin-block-start: 0;
}
.prose > :last-child {
margin-block-end: 0;
}
.prose > * {
scroll-margin-block-start: calc(45vh - var(--header-height));
}
.prose > * + * {
margin-block-start: var(--padding-500);
}
.prose > :is(h1, h2, h3, blockquote) {
margin-block: var(--spacing-small);
}
.prose :is(p, li, blockquote) {
max-inline-size: var(--width-constrained);
}
.prose a:not([class]) {
font-weight: 600;
text-decoration: underline;
}
.prose strong > * {
font-weight: inherit;
}
.prose > blockquote {
padding: var(--padding-300);
border-inline-start: 4px solid var(--accent-dark);
background: linear-gradient(90deg, var(--secondary), transparent);
}
.prose > blockquote > * + * {
margin-block-start: var(--padding-500);
}
.prose > hr {
all: unset;
display: block;
inline-size: 100%;
block-size: 1px;
background-color: var(--accent-light);
margin-block: var(--spacing-small);
}
/* Images */
.prose > :is(figure, img) {
margin-block: var(--spacing-small);
}
.prose > figure {
background-color: var(--secondary);
}
.prose > figure figcaption {
border-block-end: 1px solid var(--accent-light);
text-align: center;
font-size: 0.875rem;
padding: var(--padding-200);
}
/* Lists */
.prose > ul,
.prose > ol {
padding-inline-start: var(--padding-500);
}
.prose > * + ul,
.prose > * + ol {
margin-block-start: var(--padding-500);
}
.prose > ul li,
.prose > ol li {
margin-block-end: var(--padding-500);
}
.prose > ul li::marker,
.prose > ol li::marker {
color: var(--text-2);
}
.prose > ul li :is(ul, ol) {
margin-block-start: var(--padding-500);
padding-inline-start: var(--padding-300);
}
/* Post list */
.cards {
display: grid;
gap: var(--padding-300);
grid-template-columns: repeat(2, 1fr);
}
.card {
background-color: var(--primary);
border-radius: var(--padding-300);
border: 1px solid var(--accent-light);
overflow: hidden;
}
.card-info {
padding: var(--padding-300);
}
.card h3 {
font-size: clamp(1.063rem, 0.753rem + 0.62vw, 1.125rem);
}
.card-info p {
margin-block-start: var(--padding-300);
font-size: clamp(0.813rem, 0.503rem + 0.62vw, 0.875rem);
color: var(--text-2);
}
/* Homepage latest content */
.latest {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: var(--padding-300);
}
.latest:not(:last-child) {
margin-block-end: var(--spacing-medium);
}
.latest h2 {
font-size: 1.5rem;
margin-block-end: var(--padding-500);
}
/* Opt-out */
/* Share */
.share {
background: linear-gradient(var(--secondary), var(--background));
border-block-start: 1px solid var(--accent-light);
}
.share-inner {
padding: var(--spacing-medium) var(--padding-200);
}
.share-inner > * + * {
margin-block-start: var(--padding-500);
}
.share-inner h2 {
font-size: 1.5rem;
margin-block-end: var(--padding-500);
}
/* Footer */
footer {
border-block-start: 1px solid var(--accent-light);
}
.footer-inner {
display: flex;
inline-size: 100%;
justify-content: space-between;
padding: var(--spacing-small) var(--padding-200);
color: var(--text-2);
font-size: 0.875rem;
}
.footer-text {
line-height: 1.5;
}
.footer-text > * + * {
margin-block-start: var(--padding-300);
}
footer .row {
align-self: flex-start;
text-align: end;
}
footer a {
color: var(--text-2);
}
footer a:is(:hover, :focus-visible) {
color: var(--text);
}
/* Mobile */
@media screen and (max-width: 38rem) {
.main-navigation .row {
display: none;
}
#menu-button {
display: inherit;
}
.latest {
grid-template-columns: 1fr;
gap: var(--spacing-medium);
}
.cards {
grid-template-columns: 1fr;
}
.footer-inner {
flex-direction: column;
align-items: center;
gap: var(--spacing-medium);
}
.footer-text {
text-align: center;
}
.footer-inner .row {
flex-direction: column;
align-self: center;
}
}

42
assets/js/menu.js Normal file
View File

@@ -0,0 +1,42 @@
function mobileMenu() {
const menu = document.querySelector(".mobile-navigation");
const button = document.getElementById("menu-button");
const open = menu.classList.contains("nav-open");
if (open) {
menu.classList.replace("nav-open", "nav-closed");
button.setAttribute("aria-expanded", "false");
button.setAttribute("aria-label", "Open mobile navigation");
button.textContent = "Menu";
} else {
document.body.classList.add("overflow-hidden");
menu.classList.replace("nav-closed", "nav-open");
button.setAttribute("aria-expanded", "true");
button.setAttribute("aria-label", "Close mobile navigation");
button.textContent = "Close";
}
}
document.addEventListener("keydown", (e) => {
if (e.key === "Escape") {
const menu = document.querySelector(".mobile-navigation");
const open = menu.classList.contains("nav-open");
if (open) {
mobileMenu();
}
}
});
window.addEventListener("resize", () => {
const menu = document.querySelector(".mobile-navigation");
const button = document.getElementById("menu-button");
const open = menu.classList.contains("nav-open");
if (window.innerWidth > 640) {
if (open) {
menu.classList.replace("nav-open", "nav-closed");
button.setAttribute("aria-expanded", "false");
button.setAttribute("aria-label", "Open mobile navigation");
button.textContent = "Menu";
}
}
});