redesign ... within a redesign?????? #1
13 changed files with 387 additions and 60 deletions
|
@ -1,4 +1,4 @@
|
||||||
h1, h2, h3, h4, h5, h6, p, br {
|
h1, h2, h3, h4, h5, h6, p, li, br {
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
/* text-shadow: 1px 1px 0 var(--color-text-shadow); */
|
/* text-shadow: 1px 1px 0 var(--color-text-shadow); */
|
||||||
|
@ -27,6 +27,11 @@ h1 a, h2 a, h3 a, h4 a, h5 a, h6 a {
|
||||||
|
|
||||||
p {
|
p {
|
||||||
margin-inline-start: 1rem;
|
margin-inline-start: 1rem;
|
||||||
|
margin-block: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.nomargin {
|
||||||
|
margin-block: unset;
|
||||||
}
|
}
|
||||||
|
|
||||||
ul {
|
ul {
|
||||||
|
@ -39,7 +44,51 @@ ul li {
|
||||||
margin-block: 1.5rem;
|
margin-block: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div {
|
||||||
|
margin-block: 1.5em;
|
||||||
|
margin-inline-start: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: var(--color-accent);
|
color: var(--color-accent);
|
||||||
text-decoration: underline solid currentColor 1px;
|
text-decoration: underline solid currentColor 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
display: inline-block;
|
||||||
|
font: inherit;
|
||||||
|
background-color: var(--color-code);
|
||||||
|
padding-inline: 0.5rem;
|
||||||
|
color: var(--color-code-text);
|
||||||
|
user-select: all;
|
||||||
|
}
|
||||||
|
|
||||||
|
button, input {
|
||||||
|
border: none;
|
||||||
|
background: transparent;
|
||||||
|
color: inherit;
|
||||||
|
font: inherit;
|
||||||
|
padding: 0;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type=text], input[type=url] {
|
||||||
|
padding-inline: 0.5rem;
|
||||||
|
border-inline: 0.5em solid var(--color-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
button, input[type=submit] {
|
||||||
|
padding-inline: 0.5rem;
|
||||||
|
background-color: var(--color-accent);
|
||||||
|
color: var(--color-bg);
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:active, input[type=submit]:active {
|
||||||
|
background-color: transparent;
|
||||||
|
color: var(--color-accent);
|
||||||
}
|
}
|
Binary file not shown.
Binary file not shown.
|
@ -1,15 +1,6 @@
|
||||||
@font-face {
|
|
||||||
font-family: "m3x6";
|
|
||||||
src: url("./m3x6/m3x6.ttf");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "jbm";
|
|
||||||
src: url("./jbm/jbm.ttf");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "dos";
|
font-family: "dos";
|
||||||
|
font-weight: regular;
|
||||||
src: url("./dos/dos.woff");
|
src: url("./dos/dos.woff");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,10 @@
|
||||||
:root {
|
:root {
|
||||||
--color-bg-scrim: #111;
|
--color-bg-scrim: #111;
|
||||||
--color-bg: #222;
|
--color-bg: #222;
|
||||||
|
--color-code: #000;
|
||||||
|
--color-code-text: #888;
|
||||||
--color-text: #ccc;
|
--color-text: #ccc;
|
||||||
--color-accent: #aca;
|
--color-accent: #bac;
|
||||||
|
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
font-smooth: never;
|
font-smooth: never;
|
||||||
|
@ -21,6 +23,7 @@ html {
|
||||||
body {
|
body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0.1px 1rem;
|
padding: 0.1px 1rem;
|
||||||
|
padding-block-end: 1.5rem;
|
||||||
min-height: 100%;
|
min-height: 100%;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
91
index.js
91
index.js
|
@ -1,11 +1,13 @@
|
||||||
import express from "express";
|
import express from "express";
|
||||||
import { config } from "dotenv";
|
import { config as dotenvConfig } from "dotenv";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import SQLite from 'better-sqlite3';
|
import SQLite from 'better-sqlite3';
|
||||||
import { Kysely, SqliteDialect } from 'kysely';
|
import { Kysely, SqliteDialect } from 'kysely';
|
||||||
import { nanoid } from "nanoid";
|
import { nanoid } from "nanoid";
|
||||||
import { JSDOM } from "jsdom";
|
import { JSDOM } from "jsdom";
|
||||||
|
|
||||||
|
dotenvConfig();
|
||||||
|
|
||||||
const __dirname = import.meta.dirname;
|
const __dirname = import.meta.dirname;
|
||||||
|
|
||||||
const rawDB = new SQLite('abtmtr.db');
|
const rawDB = new SQLite('abtmtr.db');
|
||||||
|
@ -24,31 +26,19 @@ app.set('view engine', 'ejs');
|
||||||
app.use('/assets', express.static('assets'));
|
app.use('/assets', express.static('assets'));
|
||||||
app.set('views', path.join(__dirname, "views", "pages"));
|
app.set('views', path.join(__dirname, "views", "pages"));
|
||||||
|
|
||||||
app.locals = {
|
// app.use(async (req, res, next) => {
|
||||||
visibility: [
|
// const buttonsJson = await fetch("https://cdn.abtmtr.link/site_content/buttons.json")
|
||||||
"Backend",
|
// .catch(() => res.status(500).send())
|
||||||
"Personal",
|
// .then((res) => res.json())
|
||||||
"Friends-only",
|
// .catch(() => res.status(500).send());
|
||||||
"Login-only",
|
// const followingJson = await fetch("https://cdn.abtmtr.link/site_content/following.json")
|
||||||
"Public"
|
// .catch(() => res.status(500).send())
|
||||||
]
|
// .then((res) => res.json())
|
||||||
}
|
// .catch(() => res.status(500).send());
|
||||||
|
// app.locals.buttons = buttonsJson;
|
||||||
config();
|
// app.locals.following = followingJson;
|
||||||
|
// next();
|
||||||
app.use(async (req, res, next) => {
|
// })
|
||||||
const buttonsJson = await fetch("https://cdn.abtmtr.link/site_content/buttons.json")
|
|
||||||
.catch(() => res.status(500).send())
|
|
||||||
.then((res) => res.json())
|
|
||||||
.catch(() => res.status(500).send());
|
|
||||||
const followingJson = await fetch("https://cdn.abtmtr.link/site_content/following.json")
|
|
||||||
.catch(() => res.status(500).send())
|
|
||||||
.then((res) => res.json())
|
|
||||||
.catch(() => res.status(500).send());
|
|
||||||
app.locals.buttons = buttonsJson;
|
|
||||||
app.locals.following = followingJson;
|
|
||||||
next();
|
|
||||||
})
|
|
||||||
|
|
||||||
app.get('/', async (req, res) => {
|
app.get('/', async (req, res) => {
|
||||||
const statusesJson = await fetch("https://cdn.abtmtr.link/site_content/v13/statuses.json")
|
const statusesJson = await fetch("https://cdn.abtmtr.link/site_content/v13/statuses.json")
|
||||||
|
@ -60,38 +50,50 @@ app.get('/', async (req, res) => {
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|
||||||
app.get('/services', async (req, res) => {
|
app.get('/servers', async (req, res) => {
|
||||||
const servicesJson = await fetch("https://cdn.abtmtr.link/site_content/v13/services.json")
|
const servicesJson = await fetch("https://cdn.abtmtr.link/site_content/v13/services.json")
|
||||||
.catch(() => res.status(500).send())
|
.catch(() => res.status(500).send())
|
||||||
.then((res) => res.json());
|
.then((res) => res.json());
|
||||||
|
|
||||||
res.render('services/index', { services: servicesJson });
|
|
||||||
});
|
|
||||||
|
|
||||||
app.get('/computers', async (req, res) => {
|
|
||||||
const computersJson = await fetch("https://cdn.abtmtr.link/site_content/v13/computers.json")
|
const computersJson = await fetch("https://cdn.abtmtr.link/site_content/v13/computers.json")
|
||||||
.catch(() => res.status(500).send())
|
.catch(() => res.status(500).send())
|
||||||
.then((res) => res.json());
|
.then((res) => res.json());
|
||||||
|
|
||||||
res.render('computers/index', { computers: computersJson });
|
res.render('servers', {
|
||||||
|
services: servicesJson,
|
||||||
|
computers: computersJson,
|
||||||
|
visibility: [
|
||||||
|
"for domain performance",
|
||||||
|
"for personal use",
|
||||||
|
"for use by friends of abtmtr.link's webmaster(s)",
|
||||||
|
"for restricted public use",
|
||||||
|
"for public use"
|
||||||
|
]
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get('/links', async (req, res) => {
|
app.get('/about', async (req, res) => {
|
||||||
const linksJson = await fetch("https://cdn.abtmtr.link/site_content/v13/links.json")
|
const linksJson = await fetch("https://cdn.abtmtr.link/site_content/v13/links.json")
|
||||||
.catch(() => res.status(500).send())
|
.catch(() => res.status(500).send())
|
||||||
.then((res) => res.json());
|
.then((res) => res.json());
|
||||||
|
|
||||||
res.render('links/index', {
|
res.render('about', {
|
||||||
links: linksJson
|
links: linksJson
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get('/matkap', (req, res) => {
|
app.get('/sites', async (req, res) => {
|
||||||
res.render('matkap/index');
|
const buttonsJson = await fetch("https://cdn.abtmtr.link/site_content/buttons.json")
|
||||||
});
|
.catch(() => res.status(500).send())
|
||||||
|
.then((res) => res.json())
|
||||||
|
.catch(() => res.status(500).send());
|
||||||
|
const followingJson = await fetch("https://cdn.abtmtr.link/site_content/following.json")
|
||||||
|
.catch(() => res.status(500).send())
|
||||||
|
.then((res) => res.json())
|
||||||
|
.catch(() => res.status(500).send());
|
||||||
|
|
||||||
app.get('/about', (req, res) => {
|
res.render('sites', {
|
||||||
res.render('about/index');
|
b: buttonsJson, f: followingJson
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get('/blurbs', async (req, res) => {
|
app.get('/blurbs', async (req, res) => {
|
||||||
|
@ -101,7 +103,7 @@ app.get('/blurbs', async (req, res) => {
|
||||||
.where('verified', '=', 1)
|
.where('verified', '=', 1)
|
||||||
.orderBy('time', "desc")
|
.orderBy('time', "desc")
|
||||||
.execute();
|
.execute();
|
||||||
res.render('blurbs/index', { data });
|
res.render('blurbs', { data });
|
||||||
});
|
});
|
||||||
|
|
||||||
// brbrleibbghbelsbbsbuuebbuubsubss
|
// brbrleibbghbelsbbsbuuebbuubsubss
|
||||||
|
@ -114,6 +116,11 @@ async function cleanupBlurbles() {
|
||||||
.execute()
|
.execute()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
app.get('/blurbs/testsend', async (req, res) => {
|
||||||
|
|
||||||
|
res.render('blurbsent', { id: "THISISATESTLOL" });
|
||||||
|
});
|
||||||
|
|
||||||
app.get('/blurbs/send', async (req, res) => {
|
app.get('/blurbs/send', async (req, res) => {
|
||||||
const body = req.query;
|
const body = req.query;
|
||||||
const errors = [];
|
const errors = [];
|
||||||
|
@ -153,7 +160,7 @@ app.get('/blurbs/send', async (req, res) => {
|
||||||
|
|
||||||
cleanupBlurbles();
|
cleanupBlurbles();
|
||||||
|
|
||||||
res.render('blurbs/sent', { id: postId });
|
res.render('blurbsent', { id: postId });
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get('/blurbs/check', async (req, res) => {
|
app.get('/blurbs/check', async (req, res) => {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<footer>
|
<footer>
|
||||||
<h1>abtmtr.link v13-2</h1>
|
<h1>abtmtr.link v13-2</h1>
|
||||||
<p>(c) MeowcaTheoRange 2023-24</p>
|
<p class="nomargin">(c) MeowcaTheoRange 2023-24</p>
|
||||||
<p>licensed under the <a href="https://git.abtmtr.link/MeowcaTheoRange/KarkatPublicLicense/">KKPL</a>.</p>
|
<p class="nomargin">licensed under the <a href="https://git.abtmtr.link/MeowcaTheoRange/KarkatPublicLicense/">KKPL</a>.</p>
|
||||||
<p>fork <a href="https://git.abtmtr.link/MeowcaTheoRange/abtmtr-v13/">MeowcaTheoRange/abtmtr-v13</a> with git</p>
|
<p class="nomargin">fork <a href="https://git.abtmtr.link/MeowcaTheoRange/abtmtr-v13/">MeowcaTheoRange/abtmtr-v13</a> with git</p>
|
||||||
</footer>
|
</footer>
|
44
views/pages/about.ejs
Normal file
44
views/pages/about.ejs
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<%- include("../components/page-head.ejs") %>
|
||||||
|
<body>
|
||||||
|
<main>
|
||||||
|
<h1>about</h1>
|
||||||
|
<p>hey, i'm MeowcaTheoRange.<br />i run abtmtr.link, for the most part.</p>
|
||||||
|
<h2>MeowcaTheoRange's h-card</h2>
|
||||||
|
<div class="h-card">
|
||||||
|
<h3><span class="p-name">Theo Range</span>
|
||||||
|
(<span class="p-nickname">MeowcaTheoRange</span>)</h3>
|
||||||
|
<p class="nomargin">(<span class="p-honorific-prefix">Mx.</span>
|
||||||
|
<span class="p-given-name">Theo</span>
|
||||||
|
<span class="p-family-name">Range</span>)</p>
|
||||||
|
<p class="nomargin">
|
||||||
|
<span class="p-gender-identity">Non-binary</span>,
|
||||||
|
<span class="p-pronouns">they/them</span>
|
||||||
|
</p>
|
||||||
|
<p><img class="u-photo" src="https://abtmtr.link/favicon.ico" height="72"></p>
|
||||||
|
<p class="nomargin">
|
||||||
|
<a class="u-url" href="https://abtmtr.link/">website</a>,
|
||||||
|
<a class="u-email" href="mailto:me@abtmtr.link">email</a>
|
||||||
|
</p>
|
||||||
|
<p class="nomargin">
|
||||||
|
born <time class="dt-bday">2007-08-07</time>
|
||||||
|
</p>
|
||||||
|
<p class="p-adr nomargin">
|
||||||
|
<span class="p-region">Minnesota</span>,
|
||||||
|
<span class="p-country-name">USA</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<h2>MeowcaTheoRange's links</h2>
|
||||||
|
<p>where else is MeowcaTheoRange?</p>
|
||||||
|
<ul>
|
||||||
|
<% links.forEach((link) => { %>
|
||||||
|
<li><h3><a href="<%= link.link %>" target="_blank"><%= link.title %> / <%= new URL(link.link).hostname %></a></h3>
|
||||||
|
<p class="nomargin"><%= link.subtitle %></p>
|
||||||
|
</li>
|
||||||
|
<% }) %>
|
||||||
|
</ul>
|
||||||
|
</main>
|
||||||
|
<%- include("../components/footer.ejs") %>
|
||||||
|
</body>
|
||||||
|
</html>
|
42
views/pages/blurbs.ejs
Normal file
42
views/pages/blurbs.ejs
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<%- include("../components/page-head.ejs") %>
|
||||||
|
<body>
|
||||||
|
<main>
|
||||||
|
<h1>blurbs</h1>
|
||||||
|
<p>what are other sites saying about abtmtr.link?</p>
|
||||||
|
<h2>submit a blurb</h2>
|
||||||
|
<form action="/blurbs/send" method="get">
|
||||||
|
<p>
|
||||||
|
<label for="siteName">Website URL:</label>
|
||||||
|
<input type="url" name="site" id="siteName">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<label for="blurbText">Blurb:</label>
|
||||||
|
<input type="text" name="text" id="blurbText" maxlength="140" minlength="1">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<input type="submit" value="Submit Blurb">
|
||||||
|
</p>
|
||||||
|
<p style="opacity: 0.5;">by clicking this button and successfully submitting a blurb, you agree that your input may be displayed on this site and stored on abtmtr.link servers.</p>
|
||||||
|
<p style="opacity: 0.5;">you'll also need to verify your blurb by leaving a X/HTML snippet on your site. further instructions will be given to do this after you submit your blurb. thanks!</p>
|
||||||
|
</form>
|
||||||
|
<h2>current blurbs</h2>
|
||||||
|
<ul>
|
||||||
|
<% data.forEach((blurb) => { %>
|
||||||
|
<li class="blurb" id="<%= blurb.id %>"><a href="<%= blurb.site %>" target="_blank"><%= new URL(blurb.site).host %></a>: <%= blurb.blurb %> <a class="removePopup" href="/blurbs/check?id=<%= blurb.id %>">remove</a></li>
|
||||||
|
<% }) %>
|
||||||
|
</ul>
|
||||||
|
</main>
|
||||||
|
<%- include("../components/footer.ejs") %>
|
||||||
|
<style>
|
||||||
|
.blurb .removePopup {
|
||||||
|
visibility: hidden;
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
.blurb:hover .removePopup {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</body>
|
||||||
|
</html>
|
34
views/pages/blurbsent.ejs
Normal file
34
views/pages/blurbsent.ejs
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<%- include("../components/page-head.ejs") %>
|
||||||
|
<body>
|
||||||
|
<main>
|
||||||
|
<h1>blurb sent</h1>
|
||||||
|
<p>congrations! you done it!</p>
|
||||||
|
<h2>what now?</h2>
|
||||||
|
<p>you have to add one of these code snippets to your site in order for the blurb to actually pop up.</p>
|
||||||
|
<p>invisible: <code tabindex="0"><link rel="me" href="https://abtmtr.link/blurbs/#<%= id %>"></code></p>
|
||||||
|
<p>visible: <code tabindex="0"><a rel="me" href="https://abtmtr.link/blurbs/#<%= id %>"></a></code></p>
|
||||||
|
<p>88x31: <code tabindex="0"><a rel="me" href="https://abtmtr.link/blurbs/#<%= id %>" target="_blank"><img src="https://cdn.abtmtr.link/site_content/88x31/abtmtr_link.png"></a></code></p>
|
||||||
|
<p>if you want to remove your blurb from abtmtr.link, remove the snippet from your site and then click "remove" on the blurb.</p>
|
||||||
|
<p>do not leave this site until you have added the snippet! you can bookmark this page if you need to:</p>
|
||||||
|
<p><code tabindex="0">https://abtmtr.link/blurbs/check/?id=<%= id %></code></p>
|
||||||
|
<p>once you've done that, click this button below, and your blurb should appear if everything was done correctly. make sure your page has updated in your browser!</p>
|
||||||
|
<form action="/blurbs/check/" method="get">
|
||||||
|
<input type="hidden" value="<%= id %>" name="id">
|
||||||
|
<p><input type="submit" value="Done and added"></p>
|
||||||
|
</form>
|
||||||
|
<p style="opacity: 0.5;">can't/don't want to add the snippet? <a href="/about" target="_blank">contact me</a>.</p>
|
||||||
|
</main>
|
||||||
|
<%- include("../components/footer.ejs") %>
|
||||||
|
<style>
|
||||||
|
.blurb .removePopup {
|
||||||
|
visibility: hidden;
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
.blurb:hover .removePopup {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -9,15 +9,19 @@
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<h3><a href="/blurbs/">blurbs</a></h3>
|
<h3><a href="/blurbs/">blurbs</a></h3>
|
||||||
<p>what are other sites saying about abtmtr.link?</p>
|
<p class="nomargin">what are other sites saying about abtmtr.link?</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<h3><a href="/servers/">servers</a></h3>
|
<h3><a href="/servers/">servers</a></h3>
|
||||||
<p>about the services on abtmtr.link and the machines that serve them.</p>
|
<p class="nomargin">about the services on abtmtr.link and the machines that serve them.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h3><a href="/sites/">sites</a></h3>
|
||||||
|
<p class="nomargin">a collection of other sites in the form of 88x31s.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<h3><a href="/about/">about</a></h3>
|
<h3><a href="/about/">about</a></h3>
|
||||||
<p>who runs abtmtr.link?</p>
|
<p class="nomargin">who runs abtmtr.link?</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</main>
|
</main>
|
||||||
|
|
32
views/pages/servers.ejs
Normal file
32
views/pages/servers.ejs
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<%- include("../components/page-head.ejs") %>
|
||||||
|
<body>
|
||||||
|
<main>
|
||||||
|
<h1>servers</h1>
|
||||||
|
<p>about the services on abtmtr.link and the machines that serve them.</p>
|
||||||
|
<h2>services</h2>
|
||||||
|
<p>stuff that's hosted on abtmtr.link.</p>
|
||||||
|
<ul>
|
||||||
|
<% services.forEach((service) => { %>
|
||||||
|
<li>
|
||||||
|
<h3><a href="https://<%= service.domain %>/" target="_blank"><%= service.domain %> / <%= service.when.month %> <%= service.when.year %></a></h3>
|
||||||
|
<p class="nomargin">Runs <%= service.software %> <%= visibility[service.visibility] %></p>
|
||||||
|
</li>
|
||||||
|
<% }) %>
|
||||||
|
</ul>
|
||||||
|
<h2>machines</h2>
|
||||||
|
<p>stuff that hosts on abtmtr.link.</p>
|
||||||
|
<ul>
|
||||||
|
<% computers.forEach((puter) => { %>
|
||||||
|
<li>
|
||||||
|
<h3><%= puter.name %> / <%= puter.whenGot.month %> <%= puter.whenGot.year %></h3>
|
||||||
|
<p class="nomargin"><%= puter.model %> / <%= puter.description %></p>
|
||||||
|
<p><%= puter.subtitle %></p>
|
||||||
|
</li>
|
||||||
|
<% }) %>
|
||||||
|
</ul>
|
||||||
|
</main>
|
||||||
|
<%- include("../components/footer.ejs") %>
|
||||||
|
</body>
|
||||||
|
</html>
|
121
views/pages/sites.ejs
Normal file
121
views/pages/sites.ejs
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<%- include("../components/page-head.ejs") %>
|
||||||
|
<body>
|
||||||
|
<main>
|
||||||
|
<h1>sites</h1>
|
||||||
|
<p>a large collection of 88x31s.</p>
|
||||||
|
<h2>friends (<%= b.length %>)</h2>
|
||||||
|
<div>
|
||||||
|
<% b.forEach((button) => { %>
|
||||||
|
<% if (button.img != null) { %>
|
||||||
|
<a class="web-button" target="_blank" href="<%= button.href %>"><img src="<%= button.img %>" title="<%= button.alt %>" alt="<%= button.alt %>" /></a>
|
||||||
|
<% } else { %>
|
||||||
|
<a class="web-button noimg" target="_blank" href="<%= button.href %>" title="<%= button.alt %>" style="background-color: <%= button.accent[0] %>;color: <%= button.accent[1] %>"><span><%= button.name %></span></a>
|
||||||
|
<% } %>
|
||||||
|
<% }) %>
|
||||||
|
</div>
|
||||||
|
<h2>following (<%= f.length %>)</h2>
|
||||||
|
<div>
|
||||||
|
<% f.forEach((button) => { %>
|
||||||
|
<% if (button.img != null) { %>
|
||||||
|
<a class="web-button" target="_blank" href="<%= button.href %>"><img src="<%= button.img %>" title="<%= button.alt %>" alt="<%= button.alt %>" /></a>
|
||||||
|
<% } else { %>
|
||||||
|
<a class="web-button noimg" target="_blank" href="<%= button.href %>" title="<%= button.alt %>" style="background-color: <%= button.accent[0] %>;color: <%= button.accent[1] %>"><span><%= button.name %></span></a>
|
||||||
|
<% } %>
|
||||||
|
<% }) %>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
<%- include("../components/footer.ejs") %>
|
||||||
|
<style>
|
||||||
|
@property --hue {
|
||||||
|
syntax: '<number>';
|
||||||
|
initial-value: 0;
|
||||||
|
inherits: false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes hue-shift {
|
||||||
|
0% {
|
||||||
|
--hue: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
50% {
|
||||||
|
--hue: 180;
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
--hue: 360;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.web-button img {
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.web-button {
|
||||||
|
position: relative;
|
||||||
|
filter: grayscale(1);
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
transition: all 0.5s ease-out;
|
||||||
|
opacity: 1 !important;
|
||||||
|
display: inline-block;
|
||||||
|
width: 88px;
|
||||||
|
height: 31px;
|
||||||
|
line-height: 31px;
|
||||||
|
border: 1px solid black;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin: 0.5rem;
|
||||||
|
text-decoration: none;
|
||||||
|
text-align: center;
|
||||||
|
/* text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0 8px;
|
||||||
|
box-sizing: border-box; */
|
||||||
|
}
|
||||||
|
|
||||||
|
.web-button.noimg {
|
||||||
|
text-shadow: 1px 1px 0 #000;
|
||||||
|
box-shadow:
|
||||||
|
inset -1px -1px 0 0 #000,
|
||||||
|
inset 1px 1px 0 0 #fff,
|
||||||
|
inset -2px -2px 0 0 #0008;
|
||||||
|
/* background-image: linear-gradient(135deg, transparent, #8888); */
|
||||||
|
}
|
||||||
|
|
||||||
|
.web-button:hover {
|
||||||
|
left: -4px;
|
||||||
|
top: -4px;
|
||||||
|
z-index: 999;
|
||||||
|
filter: grayscale(0);
|
||||||
|
animation: hue-shift 1s linear infinite;
|
||||||
|
transition: all 0.0625s ease-out;
|
||||||
|
--shadow: hsl(var(--hue), 50%, 75%);
|
||||||
|
box-shadow:
|
||||||
|
4px 4px 0 -1px var(--shadow),
|
||||||
|
3px 3px 0 -1px var(--shadow),
|
||||||
|
2px 2px 0 -1px var(--shadow),
|
||||||
|
1px 1px 0 -1px var(--shadow),
|
||||||
|
4px 4px 0 0px black,
|
||||||
|
3px 3px 0 0px black,
|
||||||
|
2px 2px 0 0px black,
|
||||||
|
1px 1px 0 0px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.web-button.noimg:hover {
|
||||||
|
box-shadow:
|
||||||
|
inset -1px -1px 0 0 #000,
|
||||||
|
inset 1px 1px 0 0 #fff,
|
||||||
|
inset -2px -2px 0 0 #0008,
|
||||||
|
4px 4px 0 -1px var(--shadow),
|
||||||
|
3px 3px 0 -1px var(--shadow),
|
||||||
|
2px 2px 0 -1px var(--shadow),
|
||||||
|
1px 1px 0 -1px var(--shadow),
|
||||||
|
4px 4px 0 0px black,
|
||||||
|
3px 3px 0 0px black,
|
||||||
|
2px 2px 0 0px black,
|
||||||
|
1px 1px 0 0px black;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in a new issue