forked from rolsf/rolsf.xyz
initial commit
This commit is contained in:
commit
8bda86b24a
5 changed files with 242 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
*.html
|
BIN
Manrope[wght].woff2
Normal file
BIN
Manrope[wght].woff2
Normal file
Binary file not shown.
67
build.js
Normal file
67
build.js
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
const fs = require("node:fs/promises");
|
||||||
|
|
||||||
|
let meta;
|
||||||
|
|
||||||
|
const chooseFortune = () => {
|
||||||
|
const authors = Object.keys(meta.fortune);
|
||||||
|
const chosenAuthor = authors[Math.floor(Math.random()*authors.length)];
|
||||||
|
const fortunes = meta.fortune[chosenAuthor];
|
||||||
|
const chosenFortune = fortunes[Math.floor(Math.random()*fortunes.length)];
|
||||||
|
return {
|
||||||
|
text: chosenFortune,
|
||||||
|
name: chosenAuthor
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const getPosts = async () => {
|
||||||
|
const posts = [];
|
||||||
|
for (let i = 0; i < meta.targets.length; i++) {
|
||||||
|
const t = meta.targets[i];
|
||||||
|
const data = JSON.parse(await fs.readFile(`./~${t}/manifest.rolsf.json`));
|
||||||
|
if (!data.document || data.document !== "xyz.rolsf.manifest.own.1") {
|
||||||
|
throw new Error(`unsupported own manifest for target: '${t}'`);
|
||||||
|
}
|
||||||
|
data.posts.forEach(post => {
|
||||||
|
post.user = t;
|
||||||
|
posts.push(post);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
posts.sort((a, b) => b.unix_time - a.unix_time);
|
||||||
|
return posts;
|
||||||
|
};
|
||||||
|
|
||||||
|
const Post = ({ href="#", user, date, title }) =>
|
||||||
|
`<a href="${href}" class="post-link">
|
||||||
|
<span class="user">${user}</span>
|
||||||
|
<span class="date">${date}</span>
|
||||||
|
<span class="title">${title}</span>
|
||||||
|
</a>`;
|
||||||
|
|
||||||
|
const Fortune = ({text, name}) =>
|
||||||
|
`<div class="fortune"><span id="fortune-text">“${text}”</span><span id="fortune-name"> -- ${name}</span></div>`;
|
||||||
|
|
||||||
|
const MainPage = async () =>
|
||||||
|
`<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>${meta.brand}</title>
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<main>
|
||||||
|
<span class="h1">${meta.brand}</span>
|
||||||
|
${Fortune(chooseFortune())}
|
||||||
|
${(await getPosts()).map(Post).join("")}
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>`;
|
||||||
|
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
meta = JSON.parse((await fs.readFile("./meta.json")));
|
||||||
|
await fs.writeFile("./main.html", await MainPage());
|
||||||
|
};
|
||||||
|
|
||||||
|
main();
|
35
meta.json
Normal file
35
meta.json
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
{
|
||||||
|
"document": "xyz.rolsf.manifest.meta.1",
|
||||||
|
"brand": "rolsf",
|
||||||
|
"targets": [],
|
||||||
|
"fortune": {
|
||||||
|
"hippoz": [
|
||||||
|
"and i somehow lost my pants, which caused me to be naked and run home, which may or may not have been caused by pulseaudio",
|
||||||
|
"🩲ronliv",
|
||||||
|
"forgot to mention i literally woke up laughing and continued laughing long after waking up",
|
||||||
|
"YOUR COMPUTER. IT NEVER TURNS OFF.",
|
||||||
|
"we can tie this into the idea of biocentrism",
|
||||||
|
"it spends 500ms in busy javascript computing some lovecraftian DOM tree",
|
||||||
|
"react literally has preemptive multitasking built in",
|
||||||
|
"yes!!! i need lib-xdg-gtk-gnome-flatpak-portal-systemd!!!! you dont understand!!!",
|
||||||
|
"have i been brainwashed by big terminal or something",
|
||||||
|
"im still debating whether or not it's a troll"
|
||||||
|
],
|
||||||
|
"alan": [
|
||||||
|
"What you view as insane is my sanity."
|
||||||
|
],
|
||||||
|
"rot": [
|
||||||
|
"make a song using samples from linux sound themes",
|
||||||
|
"the joke is so overdone you might as well just not post it"
|
||||||
|
],
|
||||||
|
"tuna": [
|
||||||
|
"this code is fucked up bruh"
|
||||||
|
],
|
||||||
|
"kemal": [
|
||||||
|
"6ac minecraft.jar",
|
||||||
|
"if someone gets the joke here, congrats",
|
||||||
|
"the joke literally went over from your head",
|
||||||
|
"sadly it's a troll"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
139
style.css
Normal file
139
style.css
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: "Manrope";
|
||||||
|
src: url("Manrope[wght].woff2") format('woff2');
|
||||||
|
font-weight: 125 950;
|
||||||
|
font-stretch: 75% 125%;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--bg-1: #dad4c9;
|
||||||
|
--bg: #eeeeee;
|
||||||
|
--fg-1: hsl(154, 0%, 40%);
|
||||||
|
--fg: #1c2420;
|
||||||
|
|
||||||
|
--space-unit: 1rem;
|
||||||
|
--space-xxs: calc(0.25 * var(--space-unit));
|
||||||
|
--space-xs: calc(0.5 * var(--space-unit));
|
||||||
|
--space-sm: calc(0.75 * var(--space-unit));
|
||||||
|
--space-md: calc(1.25 * var(--space-unit));
|
||||||
|
--space-lg: calc(2 * var(--space-unit));
|
||||||
|
--space-xl: calc(3.25 * var(--space-unit));
|
||||||
|
--space-xxl: calc(5.25 * var(--space-unit));
|
||||||
|
|
||||||
|
--h1: 3.052rem;
|
||||||
|
--h2: 2.441rem;
|
||||||
|
--h3: 1.953rem;
|
||||||
|
--h4: 1.563rem;
|
||||||
|
--h5: 1.25rem;
|
||||||
|
--small: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
body, html {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-size: 100%;
|
||||||
|
background-color: var(--bg);
|
||||||
|
color: var(--fg);
|
||||||
|
font-family: "Manrope", system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
main {
|
||||||
|
margin: 30px auto;
|
||||||
|
width: clamp(200px, 100%, 800px);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* text */
|
||||||
|
|
||||||
|
.h1 { font-size: var(--h1); }
|
||||||
|
.h2 { font-size: var(--h2); }
|
||||||
|
.h3 { font-size: var(--h3); }
|
||||||
|
.h4 { font-size: var(--h4); }
|
||||||
|
.h5 { font-size: var(--h5); }
|
||||||
|
.small { font-size: var(--small); }
|
||||||
|
|
||||||
|
/* card */
|
||||||
|
|
||||||
|
.card-accent {
|
||||||
|
padding: var(--space-md);
|
||||||
|
margin: var(--space-md);
|
||||||
|
margin-top: 0;
|
||||||
|
background-color: var(--bg-1);
|
||||||
|
border-radius: var(--space-md);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* post */
|
||||||
|
|
||||||
|
.post-link {
|
||||||
|
display: block;
|
||||||
|
text-decoration: none;
|
||||||
|
color: currentColor;
|
||||||
|
margin-bottom: var(--space-lg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-link .user {
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-link .date {
|
||||||
|
font-weight: normal;
|
||||||
|
color: var(--fg-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-link .title {
|
||||||
|
display: block;
|
||||||
|
font-size: var(--h4);
|
||||||
|
line-height: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-link .title::after {
|
||||||
|
display: inline;
|
||||||
|
content: " ->";
|
||||||
|
color: var(--fg-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fortune */
|
||||||
|
|
||||||
|
@keyframes fortune-drop {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
visibility: hidden;
|
||||||
|
transform: translateY(-12px);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
visibility: visible;
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.fortune {
|
||||||
|
animation: fortune-drop 0.3s cubic-bezier(0.46,0.03,0.52,0.96) forwards;
|
||||||
|
display: block;
|
||||||
|
margin-bottom: var(--space-lg);
|
||||||
|
font-size: var(--h5);
|
||||||
|
}
|
||||||
|
|
||||||
|
#fortune-name {
|
||||||
|
color: var(--fg-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* all */
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {margin-bottom: 1rem;}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5 {
|
||||||
|
margin: var(--space-sm) 0 var(--space-xs);
|
||||||
|
font-family: 'Poppins', sans-serif;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: 1.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
margin-top: 0;
|
||||||
|
font-size: var(--h1);
|
||||||
|
}
|
Loading…
Reference in a new issue