Get rid of web components

This commit is contained in:
2025-11-21 17:56:20 -06:00
parent 3e24bb336a
commit 87fa41f2ac
7 changed files with 45 additions and 460 deletions

View File

@@ -117,77 +117,22 @@ export default async function (eleventyConfig) {
});
// Shortcodes
// Cowsay
eleventyConfig.addFilter("cowsay", (cowText) => {
const cowCaptionReplacementTable = [
[
`
o ^__^
o (oo)\\_______
(__)\\ )\\/\\
||----w |
|| ||`,
"",
],
[/\(\s+/g, ""],
[/\s+\(/g, ""],
[/_{3,}/g, ""],
[/-{3,}/g, ""],
[/\s\)/g, ""],
[/\n/g, ""],
[/\s{2,}/g, " "],
[/^ /, ""],
];
return `
<figure>
<pre class="language-" role="img" aria-label="ASCII COW">${cowText}</pre>
<figcaption id="cow-caption">
A cow thinking: <em>${multiReplace(cowText, cowCaptionReplacementTable)}</em>. The cow is illustrated using
preformatted text characters.
</figcaption>
</figure>
`;
});
// Embed a toot
eleventyConfig.addAsyncShortcode("toot", async function (instance, ID) {
const tootData = await fetch(`https://${instance}/api/v1/statuses/${ID}`);
const toot = await tootData.json();
const dateObj = new Date(toot.created_at);
const dateTime = `${dateObj.getDate()}${dateSuffixAdder(dateObj.getDate())} of ${monthMap[dateObj.getMonth()]}, ${dateObj.getFullYear()}, at ${timeFormatter(dateObj.getHours(), dateObj.getMinutes())}`;
return `
<wc-toot
author_name="${toot.account.display_name}"
author_url="${toot.url.replace(/\/[0-9]+/, "")}"
author_username="${toot.account.username}"
avatar_url="${toot.account.avatar_static}"
toot_content="${toot.content}"
toot_url="${toot.url}"
publish_date="${dateTime}"
sharp_corner="">
</wc-toot>
`;
});
// Embed audio
// Audio player
eleventyConfig.addShortcode(
"audio",
function (title, artist, media_url, cover_url) {
return `
<wc-card>
<wc-mplayer
title="${title}"
artist="${artist}"
media_url="${media_url}"
cover_url="${cover_url}"
/>
</wc-card>
<figure class="mplayer">
<div class="coverContainer">
<img src="${cover_url}" class="albumCover">
</div>
<div class="captionAndPlayer">
<figcaption class="mplayerInfo">
<span class="songTitle">${title}</span><br /><span class="artist">${artist}</span>
</figcaption>
<audio controls src="${media_url}" class="player"></audio>
</div>
</figure>
`;
},
);

View File

@@ -127,18 +127,6 @@
/* Shadow */
--box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
/* Web Component Tokens */
--wc-card-background-color: var(--card-color);
--wc-card-border-radius: var(--border-radius);
--wc-card-margin: 0 0 var(--space-s) 0;
--wc-card-box-shadow: var(--box-shadow);
--wc-link-color: var(--text-color);
--wc-link-decoration-color: var(--contrast-color);
--wc-link-decoration-thickness: var(--link-decoration-thickness);
--wc-comment-text-margin: var(--space-xs) 0 0 0;
--wc-profile-pic-size: var(--space-l);
--wc-profile-pic-border-radius: 10rem;
}
@media (prefers-color-scheme: dark) {
@@ -438,7 +426,7 @@ body.barebones {
text-align: center;
}
figcaption {
figcaption:not(.mplayerInfo) {
font-size: var(--step--1);
font-style: italic;
padding-top: var(--space-3xs);
@@ -504,43 +492,47 @@ table th {
}
/* Audio Player */
wc-mplayer {
width: 100%;
.albumCover {
object-fit: cover;
}
wc-mplayer::part(artist) {
font-size: var(--meta-font-size);
}
wc-mplayer::part(cover),
wc-mplayer::part(coverContainer) {
width: var(--space-3xl);
height: var(--space-3xl);
.albumCover,
.coverContainer {
width: var(--space-4xl);
height: var(--space-4xl);
border-radius: var(--border-radius);
}
wc-mplayer::part(captionAndPlayer) {
.artist {
font-size: var(--meta-font-size);
margin-bottom: var(--space-s);
}
.captionAndPlayer {
display: flex;
flex-flow: column nowrap;
justify-content: space-between;
width: 100%;
}
wc-mplayer::part(main) {
.mplayer {
background-color: var(--card-color);
border-radius: var(--border-radius);
box-shadow: var(--box-shadow);
display: flex;
gap: var(--space-s);
margin: 0;
margin: 0 0 var(--space-s) 0;
padding: var(--space-m);
width: 100%;
}
wc-mplayer::part(player) {
.player {
align-self: flex-end;
border-radius: var(--border-radius);
width: 100%;
}
wc-mplayer::part(title) {
.songTitle {
font-size: var(--step-1);
font-variation-settings:
"opsz" 50,
@@ -550,41 +542,13 @@ wc-mplayer::part(title) {
}
/* Comments */
#comments {
grid-column: var(--span-grid);
}
.continue-discussion {
grid-column: var(--span-grid);
}
.continue-discussion button {
margin-top: var(--space-xs);
}
wc-comment::part(author-link),
wc-toot::part(author-link) {
font-size: var(--step-0);
text-decoration: none;
}
wc-comment::part(main) {
padding: var(--space-m);
}
wc-comment::part(publish-date),
wc-toot::part(publish-date) {
font-family: var(--meta-font-family);
font-size: var(--meta-font-size);
font-style: var(--meta-font-style);
font-variation-settings: var(--font-variation-settings);
}
wc-toot::part(main) {
color: white;
font-family: var(--meta-font-family);
font-size: var(--step--1);
}
wc-toot::part(author),
wc-toot::part(author-link) {
color: white;
font-style: var(--meta-font-style);
font-variation-settings: "wght" 600;
}
/* Code Fences */
pre,
code {
@@ -1062,6 +1026,18 @@ article.post {
margin-right: var(--space-3xs);
}
}
.card {
align-items: flex-start;
background-color: var(--card-color);
border-radius: var(--border-radius);
box-shadow: var(--box-shadow);
display: flex;
flex-flow: row nowrap;
justify-content: flex-start;
margin: 0 0 var(--space-s) 0;
padding: var(--single-gap) 1.1rem var(--single-gap) 1.1rem;
width: 100%;
}
.gallery-images {
display: flex;
flex-flow: row wrap;

View File

@@ -1,33 +0,0 @@
const template = document.createElement('template');
template.innerHTML = `
<style>
#card {
align-items: flex-start;
background-color: var(--wc-card-background-color);
border-radius: var(--wc-card-border-radius);
box-shadow: var(--wc-card-box-shadow);
display: flex;
flex-flow: row nowrap;
justify-content: flex-start;
margin: var(--wc-card-margin);
padding: var(--single-gap) 1.1rem var(--single-gap) 1.1rem;
width: 100%;
}
</style>
<div id="card" part="main">
<slot></slot>
</div>
`
class card extends HTMLElement {
constructor() {
super();
this._shadowRoot = this.attachShadow({ 'mode': 'open' });
this._shadowRoot.appendChild(template.content.cloneNode(true));
}
}
window.customElements.define('wc-card', card);

View File

@@ -1,76 +0,0 @@
const template = document.createElement('template');
template.innerHTML = `
<style>
a {
color: var(--wc-link-color);
text-decoration-color: var(--wc-link-decoration-color);
text-decoration-thickness: var(--wc-link-decoration-thickness);
}
#comment {
margin: var(--wc-comment-text-margin);
}
#comment p {
margin: 0 auto 0 auto;
}
#meta {
display: flex;
flex-flow: row nowrap;
}
#meta-text {
display: flex;
flex-flow: column nowrap;
width: 100%;
}
#meta-text p {
margin: 0 1rem 0 1rem;
}
</style>
<article id="commentContainer" class="blog-comment" part="main">
<div id="meta" part="meta">
<div>
<wc-profile-pic url="" />
</div>
<div id="meta-text" part="meta-text">
<p id="author" part="author">
<a id="author-link" part="author-link"></a><span> says:</span>
</p>
<p id="publish-date" part="publish-date"></p>
</div>
</div>
<div id="comment" part="content">
</div>
</article>
`
class comment extends HTMLElement {
constructor() {
super();
this._shadowRoot = this.attachShadow({ 'mode': 'open' });
this._shadowRoot.appendChild(template.content.cloneNode(true));
this.$comment = this._shadowRoot.querySelector('#commentContainer');
}
static get observedAttributes() {
return ['author_name', 'author_url', 'avatar_url', 'comment_content', 'publish_date'];
}
attributeChangedCallback(name, oldVal, newVal) {
if (oldVal != newVal) {
this[name] = newVal;
this.render();
}
}
render() {
this.$comment.querySelector('#author-link').innerHTML = this.author_name;
this.$comment.querySelector('#author-link').href = this.author_url;
this.$comment.querySelector('wc-profile-pic').setAttribute('url', this.avatar_url)
this.$comment.querySelector('#comment').innerHTML = this.comment_content;
this.$comment.querySelector('#publish-date').innerHTML = this.publish_date;
}
}
window.customElements.define('wc-comment', comment);

View File

@@ -1,51 +0,0 @@
const template = document.createElement("template");
template.innerHTML = `
<style>
.cover {
object-fit: cover;
}
</style>
<figure class="mplayer" part="main">
<div class="coverContainer" part="coverContainer">
<img src="" class="cover" part="cover">
</div>
<div part="captionAndPlayer">
<figcaption part="caption">
<span class="title" part="title"></span><br /><span class="artist" part="artist"></span>
</figcaption>
<audio controls src="" class="player" part="player"></audio>
</div>
</figure>
`;
class mplayer extends HTMLElement {
constructor() {
super();
this._shadowRoot = this.attachShadow({ mode: "open" });
this._shadowRoot.appendChild(template.content.cloneNode(true));
this.$mplayer = this._shadowRoot.querySelector(".mplayer");
}
static get observedAttributes() {
return ["title", "artist", "media_url", "cover_url"];
}
attributeChangedCallback(name, oldVal, newVal) {
if (oldVal != newVal) {
this[name] = newVal;
this.render();
}
}
render() {
this.$mplayer.querySelector(".title").innerHTML = this.title;
this.$mplayer.querySelector(".artist").innerHTML = this.artist;
this.$mplayer.querySelector(".player").src = this.media_url;
this.$mplayer.querySelector(".coverContainer > img").src = this.cover_url;
}
}
window.customElements.define("wc-mplayer", mplayer);

View File

@@ -1,40 +0,0 @@
const template = document.createElement('template');
template.innerHTML = `
<style>
#profilePic {
border-radius: var(--wc-profile-pic-border-radius);
width: var(--wc-profile-pic-size);
height: var(--wc-profile-pic-size);
}
</style>
<img src="" id="profilePic"/>
`
class profilePic extends HTMLElement {
constructor() {
super();
this._shadowRoot = this.attachShadow({ 'mode': 'open' });
this._shadowRoot.appendChild(template.content.cloneNode(true));
this.$profilePic = this._shadowRoot.querySelector('#profilePic');
}
static get observedAttributes() {
return ['url'];
}
attributeChangedCallback(name, oldVal, newVal) {
if (oldVal != newVal) {
this[name] = newVal;
this.render();
}
}
render() {
this.url ? this.$profilePic.src = this.url : null;
}
}
window.customElements.define('wc-profile-pic', profilePic);

File diff suppressed because one or more lines are too long