Compare commits
28 Commits
5fa39c1148
...
pages
| Author | SHA1 | Date | |
|---|---|---|---|
| 39f002fae7 | |||
| 8adb96f38f | |||
| df88404769 | |||
| 8a6c10cab9 | |||
| bda6ae5eb9 | |||
| 3c94a3b8b9 | |||
| 9790042526 | |||
| d7ea149189 | |||
| 2b70a85da2 | |||
| 7a7e977270 | |||
| d3441c94b0 | |||
| 1feda56206 | |||
| d955cf9c94 | |||
| d260e7ff6c | |||
| 13960b60c5 | |||
| bef2373fad | |||
| 576c15a876 | |||
| b37b9117e0 | |||
| 213316ba2a | |||
| 7f8db19f54 | |||
| cd3d7e8848 | |||
| 7e1fbbc484 | |||
| b09875aea1 | |||
| 30712b53a0 | |||
| 8cb076de0d | |||
| 4f16c28bca | |||
| adcde00acc | |||
| f078ba8054 |
@ -1,6 +1,14 @@
|
||||
import { DateTime } from "luxon";
|
||||
|
||||
export default function(eleventyConfig) {
|
||||
eleventyConfig.addFilter("filterByDate", (listings, date) => {
|
||||
date = DateTime.fromISO(date, { zone: "utc" });
|
||||
return listings.filter((listing) => {
|
||||
let postDate = DateTime.fromJSDate(listing.data.date, { zone: "utc" });
|
||||
return postDate.equals(date);
|
||||
});
|
||||
})
|
||||
|
||||
// Return the keys used in an object
|
||||
eleventyConfig.addFilter("getKeys", target => {
|
||||
return Object.keys(target);
|
||||
@ -17,7 +25,10 @@ export default function(eleventyConfig) {
|
||||
tagline = "makin' stuff";
|
||||
break;
|
||||
case "beauty and health":
|
||||
tagline = "lookin' good";
|
||||
tagline = "feelin' good";
|
||||
break;
|
||||
case "business":
|
||||
tagline = "makin' money";
|
||||
break;
|
||||
case "food and drink":
|
||||
tagline = "good eatin'";
|
||||
@ -25,6 +36,9 @@ export default function(eleventyConfig) {
|
||||
case "history and science":
|
||||
tagline = "book learnin'"
|
||||
break;
|
||||
case "miscellany and more":
|
||||
tagline = "leaves me guessin'";
|
||||
break;
|
||||
case "repair and diy":
|
||||
tagline = "fixin' stuff";
|
||||
break;
|
||||
@ -54,7 +68,7 @@ export default function(eleventyConfig) {
|
||||
|
||||
/* Filter out structural tags */
|
||||
eleventyConfig.addFilter("removeCoreTags", (tags) => {
|
||||
return tags.filter(tag => ["all"].indexOf(tag) === -1);
|
||||
return tags.filter(tag => ["all", "ads", "daily"].indexOf(tag) === -1);
|
||||
});
|
||||
|
||||
/* What it says on the tin */
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
export default {
|
||||
title: "Fediverse Skillshare Classifieds",
|
||||
description: "Skillshares and more",
|
||||
url: "",
|
||||
description: "Skillshare listings for the Fediverse",
|
||||
url: "https://inherentlee.codeberg.page/fedi-skillshares",
|
||||
author: "Lee Cattarin"
|
||||
}
|
||||
|
||||
16
_includes/daily-listings.njk
Normal file
16
_includes/daily-listings.njk
Normal file
@ -0,0 +1,16 @@
|
||||
<div id="listings">
|
||||
{% for tag in collections | getKeys | removeCoreTags | sortAlphabetically %}
|
||||
<div class="category">
|
||||
<div class="category-title">
|
||||
<h2>{{ tag }}</h2>
|
||||
<p>{{ tag | getTagline }}</p>
|
||||
</div>
|
||||
{% if collections[tag] | filterByDate(today) | length == 0 %}
|
||||
<p>No listings.</p>
|
||||
{% endif %}
|
||||
{% for listing in collections[tag] | filterByDate(today) %}
|
||||
{% include "listing.njk" %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
@ -3,16 +3,15 @@
|
||||
<li>
|
||||
maintained by <a href="https://leecat.art" target="_blank">lee</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/daily/">Listings by day</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/feed.xml">RSS</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://heckin.technology/inherentlee/fedi-classifieds"
|
||||
target="_blank">source code</a>
|
||||
</li>
|
||||
<li>
|
||||
{% if page.url == "/" %}
|
||||
<a href="/submit/">submit your own</a>
|
||||
{% elif page.url == "/submit/" %}
|
||||
<a href="/">return home</a>
|
||||
{% endif %}
|
||||
</li>
|
||||
</ul>
|
||||
</footer>
|
||||
|
||||
@ -1,15 +1,10 @@
|
||||
<header>
|
||||
<nav>
|
||||
{% if page.url == "/submit/" %}
|
||||
<a href="/">Return Home</a>
|
||||
{% elif page.url == "/" %}
|
||||
<a href="/submit/">Submit Your Own</a>
|
||||
{% endif %}
|
||||
<ul>
|
||||
<li><a id="skip" href="#main">skip to content</a></li>
|
||||
<li><a href="/" {% if page.url === "/" %}aria-current="page"{% endif %}>home page</a></li>
|
||||
<li><a href="/about/" {% if page.url === "/about/" %}aria-current="page"{% endif %}>about this site</a></li>
|
||||
<li><a href="/submit/" {% if page.url === "/submit/" %}aria-current="page"{% endif %}>submit a listing</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="wip">
|
||||
<p>This site is still a bit of a proof-of-concept. I don't know yet if it'll
|
||||
go anywhere! Feel free to sign up regardless and I'll put ya in. (Note: all
|
||||
handles that are @test.test are, I hope obviously, fake data.)</p>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
@ -11,7 +11,6 @@
|
||||
{% endif %}
|
||||
<title>{{ pageTitle }}</title>
|
||||
<meta name="description" content="{{ description or metadata.description }}">
|
||||
<link rel="alternate" href="/feed.xml" type="application/atom+xml" title="{{ metadata.title }}">
|
||||
|
||||
<meta property="og:title" content="{{ pageTitle }}" />
|
||||
<meta property="og:type" content="website" />
|
||||
|
||||
16
_includes/listing.njk
Normal file
16
_includes/listing.njk
Normal file
@ -0,0 +1,16 @@
|
||||
<div class="listing{% if listing.data.draft %} draft{% endif %}">
|
||||
<h3>{{ listing.data.title }}</h3>
|
||||
<p class="blurb">
|
||||
<strong>
|
||||
<a href="https://{{ listing.data.url }}"
|
||||
target="_blank">{{ listing.data.handle }}</a>
|
||||
offers:</strong> {{ listing.data.blurb }}
|
||||
</p>
|
||||
{% if listing.data.rate %}
|
||||
<p>Suggested rate: {{ listing.data.rate }}</p>
|
||||
{% endif %}
|
||||
<p class="listed-on">
|
||||
listed on <time datetime="{{ listing.date | htmlDateString }}"
|
||||
>{{ listing.date | readableDate() }}</time>
|
||||
</p>
|
||||
</div>
|
||||
@ -2,7 +2,7 @@
|
||||
columns: 3;
|
||||
}
|
||||
|
||||
@media (max-width: 1050px) {
|
||||
@media (max-width: 1200px) {
|
||||
#listings {
|
||||
columns: 2;
|
||||
}
|
||||
@ -73,7 +73,7 @@
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.category-title:has(h2:target) {
|
||||
animation: none;
|
||||
font-weight: bold;
|
||||
color: var(--color-cyan);
|
||||
}
|
||||
}
|
||||
|
||||
18
css/main.css
18
css/main.css
@ -36,7 +36,6 @@ body {
|
||||
|
||||
main {
|
||||
padding-bottom: 2rem;
|
||||
border-bottom: solid var(--color-pink);
|
||||
}
|
||||
|
||||
@media (max-width: 1050px) {
|
||||
@ -83,12 +82,29 @@ p {
|
||||
|
||||
a {
|
||||
color: var(--color-cyan);
|
||||
text-decoration-thickness: .1rem;
|
||||
transition: text-decoration-thickness .5s;
|
||||
border-radius: .05rem;
|
||||
}
|
||||
|
||||
a:visited {
|
||||
color: var(--color-pink);
|
||||
}
|
||||
|
||||
@media (any-hover: hover) {
|
||||
a:hover {
|
||||
text-decoration-thickness: .2rem;
|
||||
}
|
||||
}
|
||||
|
||||
a:focus-visible {
|
||||
outline: solid var(--color-pink);
|
||||
}
|
||||
|
||||
a:visited:focus-visible {
|
||||
outline-color: var(--color-cyan);
|
||||
}
|
||||
|
||||
main ul {
|
||||
margin-left: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
|
||||
63
css/nav.css
63
css/nav.css
@ -1,40 +1,47 @@
|
||||
nav {
|
||||
margin: 1rem 25%;
|
||||
text-align: center;
|
||||
border-bottom: solid var(--color-pink);
|
||||
}
|
||||
|
||||
nav a,
|
||||
footer li {
|
||||
font-family: "Bebas Neue";
|
||||
font-size: 1.3rem;
|
||||
}
|
||||
|
||||
nav a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.wip {
|
||||
margin: 1rem 0;
|
||||
border: solid var(--color-cyan);
|
||||
border-radius: .1rem;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.wip p {
|
||||
margin: 0;
|
||||
padding: .25rem 0 1rem;
|
||||
}
|
||||
|
||||
footer {
|
||||
padding: 1rem 0;
|
||||
}
|
||||
|
||||
nav ul,
|
||||
footer ul {
|
||||
list-style: none;
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
list-style: none;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
text-align: center;
|
||||
gap: .2rem;
|
||||
}
|
||||
|
||||
header,
|
||||
nav li,
|
||||
footer li {
|
||||
display: inline;
|
||||
font-family: "Bebas Neue";
|
||||
font-size: 1.3rem;
|
||||
}
|
||||
|
||||
header {
|
||||
border-bottom: solid var(--color-pink);
|
||||
}
|
||||
|
||||
footer {
|
||||
border-top: solid var(--color-pink);
|
||||
}
|
||||
|
||||
a[aria-current="page"] {
|
||||
text-decoration: line-through;
|
||||
color: rgb(from var(--color-pink) r g b / 65%);
|
||||
}
|
||||
|
||||
/* Skip link */
|
||||
#skip {
|
||||
-webkit-clip-path: polygon(0 0, 0 0, 0 0, 0 0);
|
||||
clip-path: polygon(0 0, 0 0, 0 0, 0 0);
|
||||
}
|
||||
|
||||
#skip:focus-visible {
|
||||
-webkit-clip-path: none;
|
||||
clip-path: none;
|
||||
}
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import { IdAttributePlugin } from "@11ty/eleventy";
|
||||
import { HtmlBasePlugin, IdAttributePlugin } from "@11ty/eleventy";
|
||||
import { feedPlugin } from "@11ty/eleventy-plugin-rss";
|
||||
|
||||
import pluginFilters from "./_config/filters.js";
|
||||
|
||||
@ -25,9 +26,38 @@ export default async function(eleventyConfig) {
|
||||
/* All filters from _config/filters.js */
|
||||
eleventyConfig.addPlugin(pluginFilters);
|
||||
|
||||
/* Pathprefix stuff */
|
||||
eleventyConfig.addPlugin(HtmlBasePlugin);
|
||||
|
||||
/* `id` attributes */
|
||||
eleventyConfig.addPlugin(IdAttributePlugin);
|
||||
|
||||
/* RSS */
|
||||
eleventyConfig.addPlugin(feedPlugin, {
|
||||
type: "atom", // or "rss", "json"
|
||||
outputPath: "/feed.xml",
|
||||
collection: {
|
||||
name: "daily", // iterate over `collections.posts`
|
||||
limit: 10, // 0 means no limit
|
||||
},
|
||||
metadata: {
|
||||
language: "en",
|
||||
title: "Fediverse Skillshare Classifieds",
|
||||
subtitle: "Skillshare listings for the Fediverse",
|
||||
base: "https://inherentlee.codeberg.page/",
|
||||
author: {
|
||||
name: "Lee Cattarin"
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
/* Draft handling */
|
||||
eleventyConfig.addPreprocessor("drafts", "*", (data, content) => {
|
||||
if(data.draft) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
/* Shortcodes */
|
||||
eleventyConfig.addShortcode("currentBuildDate", () => {
|
||||
return (new Date()).toISOString();
|
||||
|
||||
17
node_modules/.package-lock.json
generated
vendored
17
node_modules/.package-lock.json
generated
vendored
@ -129,6 +129,23 @@
|
||||
"url": "https://opencollective.com/11ty"
|
||||
}
|
||||
},
|
||||
"node_modules/@11ty/eleventy-plugin-rss": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-rss/-/eleventy-plugin-rss-3.0.0.tgz",
|
||||
"integrity": "sha512-kKW4DcR57xAyRx0e8gNhKh56ahHVEaAj8/TuXQDnw+B46ig2bWADJAlyj/GdV37IG5ja9dZ4SgKZrs/CHz6YWQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@11ty/eleventy-utils": "^2.0.7",
|
||||
"@11ty/posthtml-urls": "^1.0.2",
|
||||
"debug": "^4.4.3",
|
||||
"posthtml": "^0.16.7"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/11ty"
|
||||
}
|
||||
},
|
||||
"node_modules/@11ty/eleventy-utils": {
|
||||
"version": "2.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-2.0.7.tgz",
|
||||
|
||||
20
node_modules/@11ty/eleventy-plugin-rss/.eleventy.js
generated
vendored
Normal file
20
node_modules/@11ty/eleventy-plugin-rss/.eleventy.js
generated
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
import rssPlugin from "./src/rssPlugin.js";
|
||||
import dateRfc3339 from "./src/dateRfc3339.js";
|
||||
import dateRfc822 from "./src/dateRfc822.js";
|
||||
import getNewestCollectionItemDate from "./src/getNewestCollectionItemDate.js";
|
||||
import virtualTemplate from "./src/virtualTemplate.js";
|
||||
|
||||
import absoluteUrl from "./src/absoluteUrl.js";
|
||||
import convertHtmlToAbsoluteUrls from "./src/htmlToAbsoluteUrls.js";
|
||||
|
||||
export default rssPlugin;
|
||||
|
||||
export {
|
||||
rssPlugin,
|
||||
virtualTemplate as feedPlugin,
|
||||
dateRfc3339 as dateToRfc3339,
|
||||
dateRfc822 as dateToRfc822,
|
||||
getNewestCollectionItemDate as getNewestCollectionItemDate,
|
||||
absoluteUrl as absoluteUrl,
|
||||
convertHtmlToAbsoluteUrls as convertHtmlToAbsoluteUrls
|
||||
};
|
||||
21
node_modules/@11ty/eleventy-plugin-rss/LICENSE
generated
vendored
Normal file
21
node_modules/@11ty/eleventy-plugin-rss/LICENSE
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018 Zach Leatherman @zachleat
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
34
node_modules/@11ty/eleventy-plugin-rss/README.md
generated
vendored
Normal file
34
node_modules/@11ty/eleventy-plugin-rss/README.md
generated
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
<p align="center"><img src="https://www.11ty.dev/img/logo-github.svg" width="200" height="200" alt="11ty Logo"></p>
|
||||
|
||||
# eleventy-plugin-rss 🕚⚡️🎈🐀
|
||||
|
||||
A pack of [Eleventy](https://github.com/11ty/eleventy) filters for generating Atom, JSON and RSS feeds using the Nunjucks templating engine.
|
||||
|
||||
|
||||
See `sample/feed.njk` for an example Atom feed template, `sample/feed.json` for an example JSON feed template, or `sample/feed-rss.njk` for an example RSS feed template.
|
||||
|
||||
## [The full `eleventy-plugin-rss` documentation is on 11ty.dev](https://www.11ty.dev/docs/plugins/rss/).
|
||||
|
||||
* _This is a plugin for the [Eleventy static site generator](https://www.11ty.dev/)._
|
||||
* Find more [Eleventy plugins](https://www.11ty.dev/docs/plugins/).
|
||||
* Please star [Eleventy on GitHub](https://github.com/11ty/eleventy/), follow [@eleven_ty](https://twitter.com/eleven_ty) on Twitter, and support [11ty on Open Collective](https://opencollective.com/11ty)
|
||||
|
||||
[](https://www.npmjs.com/package/@11ty/eleventy-plugin-rss) [](https://github.com/11ty/eleventy-plugin-rss/issues)
|
||||
|
||||
## Installation
|
||||
|
||||
```
|
||||
npm install @11ty/eleventy-plugin-rss
|
||||
```
|
||||
|
||||
_[The full `eleventy-plugin-rss` documentation is on 11ty.dev](https://www.11ty.dev/docs/plugins/rss/)._
|
||||
|
||||
## Tests
|
||||
|
||||
```
|
||||
npm run test
|
||||
```
|
||||
|
||||
- We use the [ava JavaScript test runner](https://github.com/avajs/ava) ([Assertions documentation](https://github.com/avajs/ava/blob/master/docs/03-assertions.md))
|
||||
- ℹ️ To keep tests fast, thou shalt try to avoid writing files in tests.
|
||||
|
||||
50
node_modules/@11ty/eleventy-plugin-rss/package.json
generated
vendored
Normal file
50
node_modules/@11ty/eleventy-plugin-rss/package.json
generated
vendored
Normal file
@ -0,0 +1,50 @@
|
||||
{
|
||||
"name": "@11ty/eleventy-plugin-rss",
|
||||
"version": "3.0.0",
|
||||
"type": "module",
|
||||
"description": "Generate an Atom, RSS, or JSON feed.",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"main": ".eleventy.js",
|
||||
"scripts": {
|
||||
"test": "npx ava",
|
||||
"sample": "cd sample && npx @11ty/eleventy --config=config-sample.js --pathprefix=pathprefix",
|
||||
"clean": "rm -rf sample/_site"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/11ty/eleventy-plugin-rss.git"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/11ty"
|
||||
},
|
||||
"keywords": [
|
||||
"eleventy",
|
||||
"eleventy-plugin"
|
||||
],
|
||||
"author": {
|
||||
"name": "Zach Leatherman",
|
||||
"email": "zachleatherman@gmail.com",
|
||||
"url": "https://zachleat.com/"
|
||||
},
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/11ty/eleventy-plugin-rss/issues"
|
||||
},
|
||||
"homepage": "https://www.11ty.dev/docs/plugins/rss/",
|
||||
"11ty": {
|
||||
"compatibility": ">=3.0.0-alpha.15"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@11ty/eleventy": "^3.1.5",
|
||||
"ava": "^6.4.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@11ty/eleventy-utils": "^2.0.7",
|
||||
"@11ty/posthtml-urls": "^1.0.2",
|
||||
"debug": "^4.4.3",
|
||||
"posthtml": "^0.16.7"
|
||||
}
|
||||
}
|
||||
13
node_modules/@11ty/eleventy-plugin-rss/src/absoluteUrl.js
generated
vendored
Normal file
13
node_modules/@11ty/eleventy-plugin-rss/src/absoluteUrl.js
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
import debugUtil from "debug";
|
||||
const debug = debugUtil("Eleventy:Rss");
|
||||
|
||||
// This is deprecated! Use the Eleventy HTML <base> plugin instead (2.0+)
|
||||
export default function(url, base) {
|
||||
try {
|
||||
return (new URL(url, base)).toString()
|
||||
} catch(e) {
|
||||
debug("Trying to convert %o to be an absolute url with base %o and failed, returning: %o (invalid url)", url, base, url)
|
||||
// TODO add debug output!
|
||||
return url;
|
||||
}
|
||||
};
|
||||
11
node_modules/@11ty/eleventy-plugin-rss/src/dateRfc3339.js
generated
vendored
Normal file
11
node_modules/@11ty/eleventy-plugin-rss/src/dateRfc3339.js
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
// Atom uses RFC 3339 dates
|
||||
// https://tools.ietf.org/html/rfc3339#section-5.8
|
||||
export default function(dateObj) {
|
||||
let s = dateObj.toISOString();
|
||||
|
||||
// remove milliseconds
|
||||
let split = s.split(".");
|
||||
split.pop();
|
||||
|
||||
return split.join("") + "Z";
|
||||
}
|
||||
23
node_modules/@11ty/eleventy-plugin-rss/src/dateRfc822.js
generated
vendored
Normal file
23
node_modules/@11ty/eleventy-plugin-rss/src/dateRfc822.js
generated
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
export default function pubDateRFC822(value, timeZone = undefined) {
|
||||
const date = new Date(value);
|
||||
const options = {
|
||||
weekday: 'short',
|
||||
day: '2-digit',
|
||||
month: 'short',
|
||||
year: 'numeric',
|
||||
|
||||
hour: '2-digit',
|
||||
minute: '2-digit',
|
||||
second: '2-digit',
|
||||
hourCycle: 'h23',
|
||||
|
||||
timeZone: timeZone,
|
||||
timeZoneName: 'longOffset',
|
||||
};
|
||||
|
||||
const formattedDate = new Intl.DateTimeFormat('en-US', options).format(date);
|
||||
const [wkd, mmm, dd, yyyy, time, z] = formattedDate.replace(/([,\s]+)/g, ' ').split(' ');
|
||||
const tz = z.replace(/GMT(?<sign>\+|\-)(?<hour>\d\d):(?<minute>\d\d)/, '$<sign>$<hour>$<minute>');
|
||||
|
||||
return `${wkd}, ${dd} ${mmm} ${yyyy} ${time} ${tz}`;
|
||||
}
|
||||
7
node_modules/@11ty/eleventy-plugin-rss/src/getNewestCollectionItemDate.js
generated
vendored
Normal file
7
node_modules/@11ty/eleventy-plugin-rss/src/getNewestCollectionItemDate.js
generated
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
export default function(collection, emptyFallbackDate) {
|
||||
if( !collection || !collection.length ) {
|
||||
return emptyFallbackDate || new Date();
|
||||
}
|
||||
|
||||
return new Date(Math.max(...collection.map(item => {return item.date})));
|
||||
}
|
||||
21
node_modules/@11ty/eleventy-plugin-rss/src/htmlToAbsoluteUrls.js
generated
vendored
Normal file
21
node_modules/@11ty/eleventy-plugin-rss/src/htmlToAbsoluteUrls.js
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
import posthtml from 'posthtml';
|
||||
import urls from '@11ty/posthtml-urls';
|
||||
import absoluteUrl from "./absoluteUrl.js";
|
||||
|
||||
// This is deprecated! Use the Eleventy HTML <base> plugin instead (2.0+)
|
||||
export default async function(htmlContent, base, processOptions = {}) {
|
||||
if( !base ) {
|
||||
throw new Error( "eleventy-plugin-rss: htmlToAbsoluteUrls(absolutePostUrl) was missing the full URL base `absolutePostUrl` argument.")
|
||||
}
|
||||
|
||||
let options = {
|
||||
eachURL: function(url) {
|
||||
return absoluteUrl(url.trim(), base);
|
||||
}
|
||||
};
|
||||
|
||||
let modifier = posthtml().use(urls(options));
|
||||
|
||||
let result = await modifier.process(htmlContent, processOptions);
|
||||
return result.html;
|
||||
};
|
||||
60
node_modules/@11ty/eleventy-plugin-rss/src/rssPlugin.js
generated
vendored
Normal file
60
node_modules/@11ty/eleventy-plugin-rss/src/rssPlugin.js
generated
vendored
Normal file
@ -0,0 +1,60 @@
|
||||
import pkg from "../package.json" with {type: "json"};
|
||||
|
||||
import dateRfc3339 from "./dateRfc3339.js";
|
||||
import dateRfc822 from "./dateRfc822.js";
|
||||
import getNewestCollectionItemDate from "./getNewestCollectionItemDate.js";
|
||||
|
||||
import absoluteUrl from "./absoluteUrl.js";
|
||||
import convertHtmlToAbsoluteUrls from "./htmlToAbsoluteUrls.js";
|
||||
|
||||
|
||||
export default function eleventyRssPlugin(eleventyConfig, options = {}) {
|
||||
eleventyConfig.versionCheck(pkg["11ty"].compatibility);
|
||||
|
||||
// Guaranteed unique, first add wins
|
||||
const pluginHtmlBase = eleventyConfig.resolvePlugin("@11ty/eleventy/html-base-plugin");
|
||||
eleventyConfig.addPlugin(pluginHtmlBase, options.htmlBasePluginOptions || {});
|
||||
|
||||
// Dates
|
||||
eleventyConfig.addNunjucksFilter("getNewestCollectionItemDate", getNewestCollectionItemDate);
|
||||
eleventyConfig.addNunjucksFilter("dateToRfc3339", dateRfc3339);
|
||||
eleventyConfig.addNunjucksFilter("dateToRfc822", dateRfc822);
|
||||
|
||||
// Deprecated in favor of the more efficient HTML <base> plugin bundled with Eleventy
|
||||
eleventyConfig.addNunjucksFilter("absoluteUrl", absoluteUrl);
|
||||
|
||||
// Deprecated in favor of the more efficient HTML <base> plugin bundled with Eleventy
|
||||
eleventyConfig.addNunjucksAsyncFilter("htmlToAbsoluteUrls", (htmlContent, base, callback) => {
|
||||
if(!htmlContent) {
|
||||
callback(null, "");
|
||||
return;
|
||||
}
|
||||
|
||||
let posthtmlOptions = Object.assign({
|
||||
// default PostHTML render options
|
||||
closingSingleTag: "slash"
|
||||
}, options.posthtmlRenderOptions);
|
||||
|
||||
convertHtmlToAbsoluteUrls(htmlContent, base, posthtmlOptions).then(html => {
|
||||
callback(null, html);
|
||||
});
|
||||
});
|
||||
|
||||
// These are removed, their names are incorrect! Issue #8, #21
|
||||
eleventyConfig.addNunjucksFilter("rssLastUpdatedDate", () => {
|
||||
throw new Error("The `rssLastUpdatedDate` filter was removed. Use `getNewestCollectionItemDate | dateToRfc3339` (for Atom) or `getNewestCollectionItemDate | dateToRfc822` (for RSS) instead.")
|
||||
});
|
||||
eleventyConfig.addNunjucksFilter("rssDate", () => {
|
||||
throw new Error("The `rssDate` filter was removed. Use `dateToRfc3339` (for Atom) or `dateToRfc822` (for RSS) instead.");
|
||||
});
|
||||
};
|
||||
|
||||
Object.defineProperty(eleventyRssPlugin, "eleventyPackage", {
|
||||
value: pkg.name
|
||||
});
|
||||
|
||||
Object.defineProperty(eleventyRssPlugin, "eleventyPluginOptions", {
|
||||
value: {
|
||||
unique: true
|
||||
}
|
||||
});
|
||||
204
node_modules/@11ty/eleventy-plugin-rss/src/virtualTemplate.js
generated
vendored
Normal file
204
node_modules/@11ty/eleventy-plugin-rss/src/virtualTemplate.js
generated
vendored
Normal file
@ -0,0 +1,204 @@
|
||||
import debugUtil from "debug";
|
||||
import pkg from "../package.json" with {type: "json"};
|
||||
|
||||
import { DeepCopy } from "@11ty/eleventy-utils";
|
||||
|
||||
import rssPlugin from "./rssPlugin.js";
|
||||
|
||||
const debug = debugUtil("Eleventy:Rss:Feed");
|
||||
|
||||
function getFeedContent({ type, stylesheet, collection, script }) {
|
||||
// Note: page.lang comes from the i18n plugin: https://www.11ty.dev/docs/plugins/i18n/#page.lang
|
||||
|
||||
if(type === "rss") {
|
||||
// Nunjucks template
|
||||
return `<?xml version="1.0" encoding="utf-8"?>
|
||||
${stylesheet ? `<?xml-stylesheet href="${stylesheet}" type="text/xsl"?>\n` : ""}<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="{{ metadata.base | addPathPrefixToFullUrl }}" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
${script ? `<script src="${script}" xmlns="http://www.w3.org/1999/xhtml"></script>` : ""}
|
||||
<title>{{ metadata.title }}</title>
|
||||
<link>{{ metadata.base | addPathPrefixToFullUrl }}</link>
|
||||
<atom:link href="{{ permalink | htmlBaseUrl(metadata.base) }}" rel="self" type="application/rss+xml" />
|
||||
<description>{{ metadata.subtitle }}</description>
|
||||
<language>{{ metadata.language or page.lang }}</language>
|
||||
{%- if metadata.icon %}<image>{{ metadata.icon }}</image>{%- endif %}
|
||||
{%- for post in collections.${collection.name} | reverse | eleventyFeedHead(${collection.limit}) %}
|
||||
{%- set absolutePostUrl = post.url | htmlBaseUrl(metadata.base) %}
|
||||
<item>
|
||||
<title>{{ post.data.title }}</title>
|
||||
<link>{{ absolutePostUrl }}</link>
|
||||
{%- if (post.data.summary) -%}
|
||||
<description>{{ post.data.summary }}</description>
|
||||
<content:encoded>{{ post.content | renderTransforms(post.data.page, metadata.base) }}</content:encoded>
|
||||
{%- else -%}
|
||||
<description>{{ post.content | renderTransforms(post.data.page, metadata.base) }}</description>
|
||||
{%- endif -%}
|
||||
<pubDate>{{ post.date | dateToRfc822 }}</pubDate>
|
||||
<dc:creator>{{ metadata.author.name }}</dc:creator>
|
||||
<guid>{{ absolutePostUrl }}</guid>
|
||||
</item>
|
||||
{%- endfor %}
|
||||
</channel>
|
||||
</rss>`;
|
||||
}
|
||||
|
||||
if(type === "atom") {
|
||||
// Nunjucks template
|
||||
return `<?xml version="1.0" encoding="utf-8"?>
|
||||
${stylesheet ? `<?xml-stylesheet href="${stylesheet}" type="text/xsl"?>\n` : ""}<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="{{ metadata.language or page.lang }}">
|
||||
${script ? `<script src="${script}" xmlns="http://www.w3.org/1999/xhtml"></script>` : ""}
|
||||
<title>{{ metadata.title }}</title>
|
||||
<subtitle>{{ metadata.subtitle }}</subtitle>
|
||||
<link href="{{ permalink | htmlBaseUrl(metadata.base) }}" rel="self" />
|
||||
<link href="{{ metadata.base | addPathPrefixToFullUrl }}" />
|
||||
<updated>{{ collections['${collection.name}'] | getNewestCollectionItemDate | dateToRfc3339 }}</updated>
|
||||
<id>{{ metadata.base | addPathPrefixToFullUrl }}</id>
|
||||
{%- if metadata.icon %}
|
||||
<icon>{{ metadata.icon }}</icon>
|
||||
{%- endif %}
|
||||
{%- if metadata.logo %}
|
||||
<icon>{{ metadata.logo }}</icon>
|
||||
{%- endif %}
|
||||
<author>
|
||||
<name>{{ metadata.author.name }}</name>
|
||||
{%- if metadata.author.email %}
|
||||
<email>{{ metadata.author.email }}</email>
|
||||
{%- endif %}
|
||||
</author>
|
||||
{%- for post in collections['${collection.name}'] | reverse | eleventyFeedHead(${collection.limit}) %}
|
||||
{%- set absolutePostUrl %}{{ post.url | htmlBaseUrl(metadata.base) }}{% endset %}
|
||||
<entry>
|
||||
<title>{{ post.data.title }}</title>
|
||||
<link href="{{ absolutePostUrl }}" />
|
||||
<updated>{{ post.date | dateToRfc3339 }}</updated>
|
||||
<id>{{ absolutePostUrl }}</id>
|
||||
{%- if post.data.summary %}
|
||||
<summary>{{ post.data.summary }}</summary>
|
||||
{%- endif %}
|
||||
<content type="html">{{ post.content | renderTransforms(post.data.page, metadata.base) }}</content>
|
||||
</entry>
|
||||
{%- endfor %}
|
||||
</feed>`;
|
||||
}
|
||||
|
||||
if(type === "json") {
|
||||
return `{
|
||||
"version": "https://jsonfeed.org/version/1.1",
|
||||
"title": "{{ metadata.title }}",
|
||||
"language": "{{ metadata.language or page.lang }}",
|
||||
"home_page_url": "{{ metadata.base | addPathPrefixToFullUrl }}",
|
||||
"feed_url": "{{ permalink | htmlBaseUrl(metadata.base) }}",
|
||||
"description": "{{ metadata.description }}",
|
||||
"authors": [
|
||||
{
|
||||
"name": "{{ metadata.author.name }}"{% if metadata.author.email %},
|
||||
"url": "mailto:{{ metadata.author.email }}"
|
||||
{%- endif %}
|
||||
}
|
||||
],
|
||||
"items": [
|
||||
{%- for post in collections['${collection.name}'] | reverse | eleventyFeedHead(${collection.limit}) %}
|
||||
{%- set absolutePostUrl %}{{ post.url | htmlBaseUrl(metadata.base) }}{% endset %}
|
||||
{
|
||||
"id": "{{ absolutePostUrl }}",
|
||||
"url": "{{ absolutePostUrl }}",
|
||||
"title": "{{ post.data.title }}",
|
||||
"content_html": {% if post.content %}{{ post.content | renderTransforms(post.data.page, metadata.base) | dump | safe }}{% else %}""{% endif %},
|
||||
"date_published": "{{ post.date | dateToRfc3339 }}"
|
||||
}
|
||||
{% if not loop.last %},{% endif %}
|
||||
{%- endfor %}
|
||||
]
|
||||
}`
|
||||
}
|
||||
|
||||
throw new Error("Missing or invalid feed type. Received: " + type);
|
||||
}
|
||||
|
||||
export default function eleventyFeedPlugin(eleventyConfig, options = {}) {
|
||||
eleventyConfig.versionCheck(pkg["11ty"].compatibility);
|
||||
|
||||
// Guaranteed unique, first add wins
|
||||
const pluginHtmlBase = eleventyConfig.resolvePlugin("@11ty/eleventy/html-base-plugin");
|
||||
eleventyConfig.addPlugin(pluginHtmlBase, options.htmlBasePluginOptions || {});
|
||||
|
||||
// Guaranteed unique, first add wins
|
||||
eleventyConfig.addPlugin(rssPlugin, options.rssPluginOptions || {});
|
||||
|
||||
let slugifyFilter = eleventyConfig.getFilter("slugify");
|
||||
let inputPathSuffix = options?.metadata?.title ? `-${slugifyFilter(options?.metadata?.title)}` : "";
|
||||
|
||||
options = DeepCopy({
|
||||
// rss and json also supported
|
||||
type: "atom",
|
||||
collection: {
|
||||
name: false, // required
|
||||
limit: 0, // limit number of entries, 0 means no limit
|
||||
},
|
||||
outputPath: "/feed.xml",
|
||||
inputPath: `eleventy-plugin-feed${inputPathSuffix}-${options.type || "atom"}.njk`, // TODO make this more unique
|
||||
templateData: {},
|
||||
metadata: {
|
||||
title: "Blog Title",
|
||||
subtitle: "This is a longer description about your blog.",
|
||||
language: "", // downstream templates use `page.lang` as fallback
|
||||
base: "https://example.com/",
|
||||
author: {
|
||||
name: "Your Name",
|
||||
email: "", // Optional
|
||||
}
|
||||
}
|
||||
}, options);
|
||||
|
||||
if(!options.collection?.name) {
|
||||
throw new Error("Missing `collection.name` option in feedPlugin from @11ty/eleventy-plugin-rss.");
|
||||
}
|
||||
if(typeof options.collection?.name !== "string") {
|
||||
throw new Error("Only string is supported in `collection.name` option in feedPlugin from @11ty/eleventy-plugin-rss. Received: " + typeof options.collection?.name);
|
||||
}
|
||||
|
||||
let eleventyExcludeFromCollections;
|
||||
let eleventyImport;
|
||||
if(options.collection.name === "all") {
|
||||
eleventyExcludeFromCollections = true;
|
||||
eleventyImport = {};
|
||||
} else {
|
||||
eleventyExcludeFromCollections = [ options.collection.name ]
|
||||
eleventyImport = {
|
||||
collections: [ options.collection.name ],
|
||||
};
|
||||
}
|
||||
|
||||
let templateData = {
|
||||
...options?.templateData || {},
|
||||
permalink: options.outputPath,
|
||||
eleventyExcludeFromCollections,
|
||||
eleventyImport,
|
||||
layout: false,
|
||||
metadata: options.metadata,
|
||||
};
|
||||
|
||||
// Get the first `n` elements of a collection.
|
||||
eleventyConfig.addFilter("eleventyFeedHead", function(array, n) {
|
||||
if(!n || n === 0) {
|
||||
return array;
|
||||
}
|
||||
if(n < 0) {
|
||||
return array.slice(n);
|
||||
}
|
||||
return array.slice(0, n);
|
||||
});
|
||||
|
||||
eleventyConfig.addTemplate(options.inputPath, getFeedContent(options), templateData);
|
||||
};
|
||||
|
||||
Object.defineProperty(eleventyFeedPlugin, "eleventyPackage", {
|
||||
value: `${pkg.name}/feed-plugin`
|
||||
});
|
||||
|
||||
Object.defineProperty(eleventyFeedPlugin, "eleventyPluginOptions", {
|
||||
value: {
|
||||
// multiple adds of this one is OK
|
||||
unique: false
|
||||
}
|
||||
});
|
||||
18
package-lock.json
generated
18
package-lock.json
generated
@ -10,6 +10,7 @@
|
||||
"license": "AGPL-3.0-only",
|
||||
"devDependencies": {
|
||||
"@11ty/eleventy": "^3.1.5",
|
||||
"@11ty/eleventy-plugin-rss": "^3.0.0",
|
||||
"luxon": "^3.7.2"
|
||||
}
|
||||
},
|
||||
@ -138,6 +139,23 @@
|
||||
"url": "https://opencollective.com/11ty"
|
||||
}
|
||||
},
|
||||
"node_modules/@11ty/eleventy-plugin-rss": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-rss/-/eleventy-plugin-rss-3.0.0.tgz",
|
||||
"integrity": "sha512-kKW4DcR57xAyRx0e8gNhKh56ahHVEaAj8/TuXQDnw+B46ig2bWADJAlyj/GdV37IG5ja9dZ4SgKZrs/CHz6YWQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@11ty/eleventy-utils": "^2.0.7",
|
||||
"@11ty/posthtml-urls": "^1.0.2",
|
||||
"debug": "^4.4.3",
|
||||
"posthtml": "^0.16.7"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/11ty"
|
||||
}
|
||||
},
|
||||
"node_modules/@11ty/eleventy-utils": {
|
||||
"version": "2.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-2.0.7.tgz",
|
||||
|
||||
@ -3,7 +3,8 @@
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"scripts": {
|
||||
"build": "rm -rf _site && npx @11ty/eleventy --quiet",
|
||||
"build": "rm -rf _site && npx @11ty/eleventy",
|
||||
"build-codeberg": "rm -rf _site && npx @11ty/eleventy --pathprefix=fedi-skillshares",
|
||||
"dev": "rm -rf _live && npx @11ty/eleventy --serve --quiet --output _live"
|
||||
},
|
||||
"keywords": [],
|
||||
@ -12,6 +13,7 @@
|
||||
"type": "module",
|
||||
"devDependencies": {
|
||||
"@11ty/eleventy": "^3.1.5",
|
||||
"@11ty/eleventy-plugin-rss": "^3.0.0",
|
||||
"luxon": "^3.7.2"
|
||||
}
|
||||
}
|
||||
|
||||
51
src/about.njk
Normal file
51
src/about.njk
Normal file
@ -0,0 +1,51 @@
|
||||
---
|
||||
title: About the Classifieds
|
||||
---
|
||||
|
||||
<p>
|
||||
We all have something to share. So let's help others learn.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a href="/submit/">Post a listing</a> for your skill and someone might reach
|
||||
out for help! <a href="/">Read the listings</a> and see if there's things you
|
||||
want to know.
|
||||
</p>
|
||||
|
||||
<h2>Why not a hashtag?</h2>
|
||||
|
||||
<p>
|
||||
I... I love fedi, I really do, but we all know that federation has its flaws.
|
||||
One such flaw is that discovery can be limited, and looking up a hashtag is
|
||||
not really a guarantee that you'll see all the posts under that hashtag. While
|
||||
I was looking at this concept, someone told me about the hashtag
|
||||
<a href="https://flipping.rocks/tags/knowItTeachIt" target="_blank">#knowItTeachIt</a>
|
||||
and of course, I promptly went to check it out. And saw a single post
|
||||
from 2023. Apparently there's more in that tag, but my server doesn't
|
||||
know that. So yeah. Maybe more than a hashtag, then.
|
||||
</p>
|
||||
|
||||
<h2>Is this paid?</h2>
|
||||
|
||||
<p>
|
||||
Some listings may have a stated rate, whether that is monetary, skill swap, or free.
|
||||
If there's no stated rate, free is assumed. Feel free to talk to the person/people
|
||||
you reach out to about compensation!
|
||||
</p>
|
||||
|
||||
<h2>Who made this?</h2>
|
||||
|
||||
<p>
|
||||
Hi, I'm Lee! I like to make silly little websites. You can find all my contact
|
||||
methods on the site linked to my name in the footer, or just
|
||||
<a href="https://flipping.rocks/@inherentlee" target="_blank">send me a message
|
||||
on fedi</a>.
|
||||
</p>
|
||||
|
||||
<h2>Colophon</h2>
|
||||
|
||||
<p>
|
||||
Built with <a href="https://11ty.dev" target="_blank">{{ eleventy.generator }}</a>,
|
||||
and <a href="https://declare-ai.org/1.0.0/none.html" target="_blank">without the
|
||||
aid of generative AI</a>. Hosted on Codeberg Pages.
|
||||
</p>
|
||||
@ -1,8 +0,0 @@
|
||||
---
|
||||
title: film photography
|
||||
handle: 00
|
||||
server: test.test
|
||||
tags: art and crafts
|
||||
blurb: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||
date: 2026-04-21
|
||||
---
|
||||
@ -1,8 +0,0 @@
|
||||
---
|
||||
title: let's talk about the roman empire
|
||||
handle: 01
|
||||
server: test.test
|
||||
tags: history and science
|
||||
blurb: Quisque mauris erat, tempor non egestas sollicitudin, feugiat id risus. Duis eget ornare nunc. Cras sodales, eros quis finibus luctus, enim sem dictum ante, sed sodales ipsum ante a metus.
|
||||
date: 2026-04-22
|
||||
---
|
||||
@ -1,8 +0,0 @@
|
||||
---
|
||||
title: neurodivergent coping strats
|
||||
handle: 02
|
||||
server: test.test
|
||||
tags: interpersonal and life
|
||||
blurb: Fusce faucibus mauris ut metus molestie viverra. In varius erat in lectus scelerisque, vitae ornare sapien euismod. Pellentesque ornare aliquam erat, pellentesque eleifend tellus consequat ut. Donec mollis, lacus vitae bibendum hendrerit, nisi metus dignissim lacus, nec tincidunt nisl ligula vel metus.
|
||||
date: 2026-04-23
|
||||
---
|
||||
@ -1,8 +0,0 @@
|
||||
---
|
||||
title: editing 102
|
||||
handle: 03
|
||||
server: test.test
|
||||
tags: writing editing and literature
|
||||
blurb: Sed a commodo lectus. Curabitur tincidunt, eros vel mollis dapibus, mauris dui pharetra mauris, et dapibus leo nisi vitae eros.
|
||||
date: 2026-04-24
|
||||
---
|
||||
@ -1,8 +0,0 @@
|
||||
---
|
||||
title: sourdough starting!
|
||||
handle: 04
|
||||
server: test.test
|
||||
tags: food and drink
|
||||
blurb: Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vivamus vitae augue ac neque congue pellentesque vitae a enim. Donec euismod dolor sit amet dui dapibus posuere. Donec eget blandit ligula, ac tempor nunc.
|
||||
date: 2026-04-25
|
||||
---
|
||||
@ -1,8 +0,0 @@
|
||||
---
|
||||
title: bug identification for beginners
|
||||
handle: 05
|
||||
server: test.test
|
||||
tags: animals and the outdoors
|
||||
blurb: Duis interdum purus non iaculis convallis. Nunc mi lorem, consequat sed luctus vitae, lobortis in arcu.
|
||||
date: 2026-04-26
|
||||
---
|
||||
@ -1,8 +0,0 @@
|
||||
---
|
||||
title: fix your sink or toilet
|
||||
handle: 06
|
||||
server: test.test
|
||||
tags: repair and diy
|
||||
blurb: Aliquam justo justo, scelerisque a ligula sed, elementum pharetra quam. Ut augue nibh, finibus vel dui nec, sagittis bibendum leo. Quisque libero diam, maximus in dui ac, sollicitudin congue enim.
|
||||
date: 2026-04-27
|
||||
---
|
||||
@ -1,7 +1,8 @@
|
||||
---
|
||||
title: Navigating Workplace Transition
|
||||
handle: 07
|
||||
server: test.test
|
||||
handle: "@07@test.test"
|
||||
url: "test.test/@07"
|
||||
draft: true
|
||||
tags: interpersonal and life
|
||||
blurb: Donec nisl ligula, mollis sit amet gravida eget, aliquam vitae nibh. Fusce diam nulla, interdum a ex a, semper lacinia elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc lacinia fermentum arcu, molestie ornare purus lobortis eget. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nunc convallis turpis nisi, nec volutpat dui semper at.
|
||||
date: 2026-04-28
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
---
|
||||
title: Picking the right haircut
|
||||
handle: 08
|
||||
server: test.test
|
||||
tags: beauty and health
|
||||
blurb: Duis nec varius dui. In mauris neque, scelerisque sed commodo accumsan, sodales vitae tortor.
|
||||
date: 2026-04-30
|
||||
---
|
||||
@ -1,3 +1,6 @@
|
||||
export default {
|
||||
permalink: false,
|
||||
tags: [
|
||||
"ads"
|
||||
]
|
||||
};
|
||||
|
||||
@ -0,0 +1,5 @@
|
||||
export default {
|
||||
tags: [
|
||||
"animals and the outdoors"
|
||||
]
|
||||
};
|
||||
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: Dog training
|
||||
handle: "@Goodworkdog@sunny.garden"
|
||||
url: "sunny.garden/@Goodworkdog"
|
||||
blurb: "I can advise you on animal behavior, enrichment, problem solving, multi-pet homes, dog sports, and changes in home life. I have multiple certifications. I can’t offer veterinary advice, but I will tell you when to see a vet instead of a trainer."
|
||||
date: 2026-05-01
|
||||
---
|
||||
7
src/ads/animals-and-the-outdoors/nilajones-zeroes-ca.md
Normal file
7
src/ads/animals-and-the-outdoors/nilajones-zeroes-ca.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: "🌿Home gardening - including low spoons 🪴🧑🏼🦽"
|
||||
handle: "@NilaJones@zeroes.ca"
|
||||
url: "zeroes.ca/@NilaJones"
|
||||
blurb: "Want to grow a few herbs or flowers on your balcony? Or enough food to feed your family for a year? Something in between? I've been doing and teaching organic gardening for a long long time, and I love to answer questions or brainstorm together 🌿"
|
||||
date: 2026-05-01
|
||||
---
|
||||
7
src/ads/animals-and-the-outdoors/taq-thicc-horse.md
Normal file
7
src/ads/animals-and-the-outdoors/taq-thicc-horse.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: "Intimacy with Plants - Discovering Their Unique Features"
|
||||
handle: "@taq@thicc.horse"
|
||||
url: "thicc.horse/@taq"
|
||||
blurb: "Not focused on plant care or identification, but building curiosity and awareness of the features of plants which help with identification. Enjoy walks more by taking the time to explore the differences in each plant. Leaf shape, texture, size and growth patterns, symmetries. Soon you'll be recognizing old friends from across the street!"
|
||||
date: 2026-05-02
|
||||
---
|
||||
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: Foraging in the UK
|
||||
handle: "@worshipthesquid@weirder.earth"
|
||||
url: "weirder.earth/@worshipthesquid"
|
||||
blurb: "I'm happy to share responsible UK plant foraging skills, including figuring out how you can get started. I'm in Scotland (but the rest of the UK shares a lot of the same plants). (Also always excited to hear about others' foraging and plant connection!)"
|
||||
date: 2026-05-04
|
||||
---
|
||||
5
src/ads/art-and-crafts/art-and-crafts.11tydata.js
Normal file
5
src/ads/art-and-crafts/art-and-crafts.11tydata.js
Normal file
@ -0,0 +1,5 @@
|
||||
export default {
|
||||
tags: [
|
||||
"art and crafts"
|
||||
]
|
||||
};
|
||||
7
src/ads/art-and-crafts/jessicatheviartist-kind-social.md
Normal file
7
src/ads/art-and-crafts/jessicatheviartist-kind-social.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: "I can help you get started with recording music"
|
||||
handle: "@JessicatheVIArtist@kind.social"
|
||||
url: "kind.social/@JessicatheVIArtist"
|
||||
blurb: "If you're just starting out with a digital audio workstation, I can help you understand concepts. How do I record myself, what are takes, and how do I make myself sound good? What the heck are pre- and post-fader sends, and what on earth is MIDI?? I can also help you understand synthesis if you've got a hardware or software synth you'd like to tame. What are oscillators, filters, envelopes and LFOs and how do I create a whole new sound? If you've got a website or app you're developing, I can also offer feedback on its accessibility to screen reader users."
|
||||
date: 2026-05-02
|
||||
---
|
||||
7
src/ads/art-and-crafts/moss-kind-social.md
Normal file
7
src/ads/art-and-crafts/moss-kind-social.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: "Art/design critique and encouragement"
|
||||
handle: "@moss@kind.social"
|
||||
url: "kind.social/@moss"
|
||||
blurb: "I am a visual jack of all trades, pretty experienced in some. Creative critique & external support is a really great way to grow as an artist or designer (those titles used here in the broadest sense possible). Whether you’re starting a project, stuck on a piece and trying to discern next steps, or it’s a finished project you want to reflect on, I’m happy to give whatever balance of kind constructive critique &/or positive reinforcement you need. My best mediums are in no particular order: fountain pens & ink, photography, lighting & production design, analog/irl interaction design, visual narratives, and installation/themed environments. I’ve taken classes in & enjoyed digital painting, game design, neon art, ceramics and many more. I’m less skilled in audio, software, & film/video. I also enjoy creative research, as well as brainstorming how to make your interests adaptive and accessible for different kinds of disabilities & health challenges. (I have limited spoons so please check in with me on my bandwidth/timelines, and I’d love to swap skills, especially if you’re looking for a lot of support!)"
|
||||
date: 2026-05-02
|
||||
---
|
||||
5
src/ads/beauty-and-health/beauty-and-health.11tydata.js
Normal file
5
src/ads/beauty-and-health/beauty-and-health.11tydata.js
Normal file
@ -0,0 +1,5 @@
|
||||
export default {
|
||||
tags: [
|
||||
"beauty and health"
|
||||
]
|
||||
};
|
||||
7
src/ads/beauty-and-health/texan_reverend-kind-social.md
Normal file
7
src/ads/beauty-and-health/texan_reverend-kind-social.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: Making the Respirator and Masking Experience Better
|
||||
handle: "@Texan_Reverend@kind.social"
|
||||
url: "kind.social/@Texan_Reverend"
|
||||
blurb: Are you interested in a mask or respirator to protect you from wildfire smoke, pathogens, construction dust, or allergens? Are people close to you asking that you mask up, but it's uncomfortable or hard to get in the habit? I can help with... Finding models of a good size and shape. Adjustments to achieve a good fit and seal. Safe and effective modifications. Fun and engaging decorations. Learning more about how respirators work and how they're tested.
|
||||
date: 2026-05-01
|
||||
---
|
||||
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: "AMA about parkrun"
|
||||
handle: "@thegiddystitcher@sunny.garden"
|
||||
url: "sunny.garden/@thegiddystitcher"
|
||||
blurb: "Parkrun is a free weekly 5k event run by volunteers around the world. Talk to me to learn more about it, how to join, whether you're welcome at your level of fitness (yes), what it's like to volunteer. No question too anxious!"
|
||||
date: 2026-05-03
|
||||
---
|
||||
5
src/ads/business/business.11tydata.js
Normal file
5
src/ads/business/business.11tydata.js
Normal file
@ -0,0 +1,5 @@
|
||||
export default {
|
||||
tags: [
|
||||
"business"
|
||||
]
|
||||
};
|
||||
7
src/ads/business/mariyadelano-hachyderm-io.md
Normal file
7
src/ads/business/mariyadelano-hachyderm-io.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: Answers to Your Silly Marketing Questions
|
||||
handle: "@mariyadelano@hachyderm.io"
|
||||
url: "hachyderm.io/@mariyadelano"
|
||||
blurb: I want to answer marketing questions that you have been too afraid to ask. The sillier your question, the better! Examples for inspiration... why would I want to collect people’s emails for a list? Why do SEO blogs look like that? How did LinkedIn posts become this particular kind of cringe? Why does nobody think my website is the coolest thing since sliced bread? Be brave and maybe we will all learn something.
|
||||
date: 2026-05-01
|
||||
---
|
||||
7
src/ads/food-and-drink/cthulku-zeroes-ca.md
Normal file
7
src/ads/food-and-drink/cthulku-zeroes-ca.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: "How do I make this without meat/dairy/eggs?!"
|
||||
handle: "@cthulku@zeroes.ca"
|
||||
url: "zeroes.ca/@cthulku"
|
||||
blurb: "I am a food dork with a couple decades' experience with both vegan and vegetarian (ovo-lacto) cookery, and I quite enjoy finding ways to make normally omnivorous dishes vegetarian. While I'm not one to build a homebrew Beyond burger, I have experience with a wide range of vegan proteins and preparations, as well as techniques and tips that I've picked up over the years, to make something that may not fool an omnivore, but will still be delicious! I'm thinking of more of a Q&A type service, rather than any kind of structured lesson, but every journey begins with a single step and all that."
|
||||
date: 2026-05-02
|
||||
---
|
||||
5
src/ads/food-and-drink/food-and-drink.11tydata.js
Normal file
5
src/ads/food-and-drink/food-and-drink.11tydata.js
Normal file
@ -0,0 +1,5 @@
|
||||
export default {
|
||||
tags: [
|
||||
"food and drink"
|
||||
]
|
||||
};
|
||||
7
src/ads/food-and-drink/liferstate-mas-to.md
Normal file
7
src/ads/food-and-drink/liferstate-mas-to.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: How To Drink Wine
|
||||
handle: "@lifertate@mas.to"
|
||||
url: "mas.to/@liferstate"
|
||||
blurb: If you've ever felt intimidated by the supermarket wine aisle, or wanted something better but not known where to start, I can help. Like food, wine tells stories about geography, history, politics. I can advise you on food pairings, lesser known regions/grape varieties, how to get a good deal, and what *not* to buy. Don't ask an app what you should drink - ask me! Unlike the people in the app, I know what I'm about and I will not bullshit you.
|
||||
date: 2026-05-02
|
||||
---
|
||||
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: pure math Q&A
|
||||
handle: "@AdrianRiskin@kolektiva.social"
|
||||
url: "kolektiva.social/@AdrianRiskin"
|
||||
blurb: I am happy to help with K-12 math, undergraduate pure math, e.g. college algebra, precalc, calc, discrete, intro to proof, abstract algebra, number theory, analysis, etc. Also graduate level graph theory.
|
||||
date: 2026-05-01
|
||||
---
|
||||
@ -0,0 +1,5 @@
|
||||
export default {
|
||||
tags: [
|
||||
"history and science"
|
||||
]
|
||||
};
|
||||
7
src/ads/history-and-science/minmi-sfba-social.md
Normal file
7
src/ads/history-and-science/minmi-sfba-social.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: Applied statistics
|
||||
handle: "@minmi@sfba.social"
|
||||
url: "sfba.social/@minmi"
|
||||
blurb: "I am happy to answer any questions about statistics and data analysis. Whether it’s homework, curiosity, trying to understand a study or run an analysis, happy to share what I know!"
|
||||
date: 2026-05-02
|
||||
---
|
||||
7
src/ads/history-and-science/tonyamarie-chaosfem-tw.md
Normal file
7
src/ads/history-and-science/tonyamarie-chaosfem-tw.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: Ask a math teacher
|
||||
handle: "@TonyaMarie@chaosfem.tw"
|
||||
url: "chaosfem.tw/@TonyaMarie"
|
||||
blurb: "Need help with your kid's homework? Going back to school? Retired teacher will help with your math questions up through basic college level!"
|
||||
date: 2026-05-01
|
||||
---
|
||||
@ -0,0 +1,5 @@
|
||||
export default {
|
||||
tags: [
|
||||
"interpersonal and life"
|
||||
]
|
||||
};
|
||||
7
src/ads/miscellany-and-more/alice-lgbtqia-space.md
Normal file
7
src/ads/miscellany-and-more/alice-lgbtqia-space.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: "Learn Lockpicking with Alice"
|
||||
handle: "@alice@lgbtqia.space"
|
||||
url: "lgbtqia.space/@alice"
|
||||
blurb: "I've been an expert at opening things in unconventional ways for many years, and I'm always happy to talk locks, lockpicking/bypassing, and other security-related topics. I have short lessons under the #LearnLockpickingWithAlice hashtag on Fedi."
|
||||
date: 2026-05-01
|
||||
---
|
||||
@ -0,0 +1,5 @@
|
||||
export default {
|
||||
tags: [
|
||||
"miscellany and more"
|
||||
]
|
||||
};
|
||||
7
src/ads/repair-and-diy/essanay-sfba-social.md
Normal file
7
src/ads/repair-and-diy/essanay-sfba-social.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: "Wind-up and Acoustic Record Players"
|
||||
handle: "@Essanay@sfba.social"
|
||||
url: "sfba.social/@Essanay"
|
||||
blurb: "Do you have an old Victrola or Edison cylinder player that doesn't work? I've fixed a bunch of them and I can help diagnose problems, and maybe even help you fix it. And if you're anywhere near me (Northern California) I could even come take a look at it. This account is for the Niles Essanay Silent FIlm Museum, in Fremont CA, where we have several restored machines on display. I can also give advice on handling of movies (on physical film) and I'm learning how to fix projectors."
|
||||
date: 2026-05-03
|
||||
---
|
||||
7
src/ads/repair-and-diy/iris-neuromatch-social.md
Normal file
7
src/ads/repair-and-diy/iris-neuromatch-social.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: "How To Mend Things"
|
||||
handle: "@iris@neuromatch.social"
|
||||
url: "neuromatch.social/@iris"
|
||||
blurb: "I attempt to fix everything, some of it succeeds. Bring me (virtually) your thing that is damaged and we can assess whether it is, or can shortly be, within your capabilities (and current inventory of tools and materials) to fix it. Examples: favorite mug cracked, zipper broke, office chair sinking, backpack falling apart."
|
||||
date: 2026-05-02
|
||||
---
|
||||
5
src/ads/repair-and-diy/repair-and-diy.11tydata.js
Normal file
5
src/ads/repair-and-diy/repair-and-diy.11tydata.js
Normal file
@ -0,0 +1,5 @@
|
||||
export default {
|
||||
tags: [
|
||||
"repair and diy"
|
||||
]
|
||||
};
|
||||
7
src/ads/repair-and-diy/thesecondvariation-graz-social.md
Normal file
7
src/ads/repair-and-diy/thesecondvariation-graz-social.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: "Emotional support and technical advice when repairing your bicycle"
|
||||
handle: "@TheSecondVariation@graz.social"
|
||||
url: "graz.social/@TheSecondVariation"
|
||||
blurb: "I can help you repair your bicycle by giving advice. Besides I am also happy to give you advice on other bicycle related things."
|
||||
date: 2026-05-03
|
||||
---
|
||||
@ -1,8 +1,8 @@
|
||||
---
|
||||
title: introductory web development and terminal basics
|
||||
handle: inherentlee
|
||||
server: flipping.rocks
|
||||
tags: technology
|
||||
handle: "@inherentlee@flipping.rocks"
|
||||
url: "flipping.rocks/@inherentlee"
|
||||
blurb: I'm happy to help you set up a personal or hobby site with HTML, CSS, and JS basics, or maybe a static site generator! Alternately, I'll talk about git and the terminal.
|
||||
rate: free or skill swap
|
||||
date: 2026-04-29
|
||||
---
|
||||
7
src/ads/technology/mzedp-plasmatrap-com.md
Normal file
7
src/ads/technology/mzedp-plasmatrap-com.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: "Renewable Energy Q&A"
|
||||
handle: "@mzedp@plasmatrap.com"
|
||||
url: "plasmatrap.com/@mzedp"
|
||||
blurb: "I'm an electrical engineer with a specialization in Solar energy, glad to offer guidance on solar energy/renewables/energy transition related questions."
|
||||
date: 2026-05-03
|
||||
---
|
||||
7
src/ads/technology/rpgwaiter-based-zone.md
Normal file
7
src/ads/technology/rpgwaiter-based-zone.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: Mobile device hacking advice
|
||||
handle: "@rpgwaiter@based.zone"
|
||||
url: "based.zone/@rpgwaiter"
|
||||
blurb: "I've been exploiting/reverse engineering mobile devices for over 10 years. I'm always happy to discuss tooling, techniques, or anything else related to hacking mobile devices. Want to know how a certain app works? I have experience in everything from mitm traffic capture to memory hacking with Frida and static binary analysis, feel free to ask!"
|
||||
date: 2026-05-01
|
||||
---
|
||||
5
src/ads/technology/technology.11tydata.js
Normal file
5
src/ads/technology/technology.11tydata.js
Normal file
@ -0,0 +1,5 @@
|
||||
export default {
|
||||
tags: [
|
||||
"technology"
|
||||
]
|
||||
};
|
||||
7
src/ads/technology/twinkle-sweet-succubi-services.md
Normal file
7
src/ads/technology/twinkle-sweet-succubi-services.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: what the hell is C?
|
||||
handle: "@twinkle@sweet.succubi.services"
|
||||
url: "sweet.succubi.services/twinkle"
|
||||
blurb: Have you wanted to get into programming but don't know where to start? Do you know a programming language already but feel like you don't get Why Things Are Like This? I myself started out with the C programming language-- and I'd love to pass on the knowledge to more people, because I think a good programming lesson is rare nowadays!
|
||||
date: 2026-05-01
|
||||
---
|
||||
7
src/ads/technology/x0-dragonscave-space.md
Normal file
7
src/ads/technology/x0-dragonscave-space.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: NVDA screen reader basics to advanced
|
||||
handle: "@x0@dragonscave.space"
|
||||
url: "dragonscave.space/@x0"
|
||||
blurb: I'm a blind Windows user who has been cutting my teeth on Non-Visual Desktop Access (NVDA) for over a decade. I use it to do everything from file management to web apps to development. If you're just getting started with screen readers, or know your way around the basics and want to take your usage to the next level, I can help! I'll happily teach a sighted person who is picking up NVDA for proper accessibility testing as well, you never know if your app or website works right with a screen reader until you drive it with one.
|
||||
date: 2026-05-02
|
||||
---
|
||||
@ -1,8 +1,7 @@
|
||||
---
|
||||
title:
|
||||
handle:
|
||||
server:
|
||||
tags:
|
||||
url:
|
||||
blurb:
|
||||
date:
|
||||
---
|
||||
|
||||
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: Scientific paper editing
|
||||
handle: "@SRLevine@neuromatch.social"
|
||||
url: "neuromatch.social/@SRLevine"
|
||||
blurb: Do you have all of the information/data/figures, but an awkwardly worded paper? Do you need help getting it ready for submission? Would you otherwise turn to AI? Happy to help, particularly in field (organic chemistry, chemical biology), but should be able to mange most of chemistry & biology. Can also help with qualifying exam papers, etc.
|
||||
date: 2026-05-02
|
||||
---
|
||||
@ -0,0 +1,5 @@
|
||||
export default {
|
||||
tags: [
|
||||
"writing editing and literature"
|
||||
]
|
||||
};
|
||||
21
src/daily.njk
Normal file
21
src/daily.njk
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
title: Day-by-day listings
|
||||
pagination:
|
||||
data: collections.daily
|
||||
size: 30
|
||||
reverse: true
|
||||
---
|
||||
{% css %}
|
||||
ol {
|
||||
list-style: none;
|
||||
text-align: center;
|
||||
}
|
||||
{% endcss %}
|
||||
|
||||
<ol>
|
||||
{% for post in pagination.items %}
|
||||
<li>
|
||||
<a href="{{ post.url }}">{{ post.data.title }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ol>
|
||||
7
src/daily/2026-04-29.njk
Normal file
7
src/daily/2026-04-29.njk
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: April 29th, 2026
|
||||
---
|
||||
{% css %}{% include "css/listings.css" %}{% endcss %}
|
||||
|
||||
{% set today = "2026-04-29" %}
|
||||
{% include "daily-listings.njk" %}
|
||||
7
src/daily/2026-05-01.njk
Normal file
7
src/daily/2026-05-01.njk
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: May 1st, 2026
|
||||
---
|
||||
{% css %}{% include "css/listings.css" %}{% endcss %}
|
||||
|
||||
{% set today = "2026-05-01" %}
|
||||
{% include "daily-listings.njk" %}
|
||||
7
src/daily/2026-05-02.njk
Normal file
7
src/daily/2026-05-02.njk
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: May 2nd, 2026
|
||||
---
|
||||
{% css %}{% include "css/listings.css" %}{% endcss %}
|
||||
|
||||
{% set today = "2026-05-02" %}
|
||||
{% include "daily-listings.njk" %}
|
||||
7
src/daily/2026-05-03.njk
Normal file
7
src/daily/2026-05-03.njk
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: May 3rd, 2026
|
||||
---
|
||||
{% css %}{% include "css/listings.css" %}{% endcss %}
|
||||
|
||||
{% set today = "2026-05-03" %}
|
||||
{% include "daily-listings.njk" %}
|
||||
7
src/daily/2026-05-04.njk
Normal file
7
src/daily/2026-05-04.njk
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: May 4th, 2026
|
||||
---
|
||||
{% css %}{% include "css/listings.css" %}{% endcss %}
|
||||
|
||||
{% set today = "2026-05-04" %}
|
||||
{% include "daily-listings.njk" %}
|
||||
6
src/daily/daily.11tydata.js
Normal file
6
src/daily/daily.11tydata.js
Normal file
@ -0,0 +1,6 @@
|
||||
export default {
|
||||
layout: "base.njk",
|
||||
tags: [
|
||||
"daily"
|
||||
]
|
||||
}
|
||||
@ -1,8 +1,7 @@
|
||||
---
|
||||
layout: base.njk
|
||||
title: Fediverse Skillshare Classifieds
|
||||
---
|
||||
{% css %}{% include "css/home.css" %}{% endcss %}
|
||||
{% css %}{% include "css/listings.css" %}{% endcss %}
|
||||
|
||||
<div id="jump-links">
|
||||
<h2>jump to...</h2>
|
||||
@ -22,19 +21,11 @@ title: Fediverse Skillshare Classifieds
|
||||
<h2>{{ tag }}</h2>
|
||||
<p>{{ tag | getTagline }}</p>
|
||||
</div>
|
||||
{% if collections[tag].length == 0 %}
|
||||
<p>No listings.</p>
|
||||
{% endif %}
|
||||
{% for listing in collections[tag] %}
|
||||
<div class="listing">
|
||||
<h3>{{ listing.data.title }}</h3>
|
||||
<p class="blurb">
|
||||
<strong>
|
||||
<a href="https://{{ listing.data.server }}/@{{ listing.data.handle }}"
|
||||
target="_blank">@{{ listing.data.handle }}@{{ listing.data.server}}</a>
|
||||
offers:</strong> {{ listing.data.blurb }}
|
||||
</p>
|
||||
<p class="listed-on">
|
||||
listed on <time datetime="{{ listing.date | htmlDateString }}">{{ listing.date | readableDate() }}</time>
|
||||
</p>
|
||||
</div>
|
||||
{% include "listing.njk" %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
3
src/src.11tydata.js
Normal file
3
src/src.11tydata.js
Normal file
@ -0,0 +1,3 @@
|
||||
export default {
|
||||
layout: "base.njk"
|
||||
}
|
||||
@ -1,5 +1,4 @@
|
||||
---
|
||||
layout: base.njk
|
||||
title: Submit a Listing
|
||||
---
|
||||
|
||||
@ -15,29 +14,29 @@ title: Submit a Listing
|
||||
<p>To submit to the Skillshare Classifieds, you'll need:</p>
|
||||
|
||||
<ul>
|
||||
<li>your fediverse handle</li>
|
||||
<li>the link to your fediverse profile</li>
|
||||
<li>the <a href="#category-guide">most relevant category</a> for your listing</li>
|
||||
<li>a title for your offering</li>
|
||||
<li>a short description</li>
|
||||
<li>optionally, a suggested rate - if not provided, free is the assumption</li>
|
||||
</ul>
|
||||
|
||||
<p>See <a href="/">the home page</a> for inspiration.</p>
|
||||
|
||||
<p> You can submit using the embed below,
|
||||
<p> You can submit using
|
||||
<a href="https://airtable.com/appbdRJ59MLprB1iC/pagfJTOl4KPwh7trd/form"
|
||||
target="_blank">open the form in a new tab</a>, or
|
||||
target="_blank">the listing submission form</a>,
|
||||
<a href="https://flipping.rocks/@inherentlee" target="_blank">message me on
|
||||
fedi</a>, or
|
||||
<a href="mailto:lee.cattarin@gmail.com?subject=Fediverse%20Skillshare%20Classifieds">email
|
||||
Lee</a> all the information mentioned above.
|
||||
me</a> all the information mentioned above.
|
||||
</p>
|
||||
|
||||
<p>Feel free to submit multiple times in multiple categories, but I'd prefer that
|
||||
all offerings within one category be grouped into one listing if possible!</p>
|
||||
|
||||
<iframe class="airtable-embed"
|
||||
src="https://airtable.com/embed/appbdRJ59MLprB1iC/pagfJTOl4KPwh7trd/form"
|
||||
frameborder="0" onmousewheel="" width="100%" height="533"
|
||||
style="background: transparent; border: 1px solid #ccc;">
|
||||
</iframe>
|
||||
all offerings within one category be grouped into one listing if possible!
|
||||
Exceptions can be made for wildly divergent topics, but try to keep it short
|
||||
and sweet.
|
||||
</p>
|
||||
|
||||
<h2>Category guide</h2>
|
||||
|
||||
@ -64,6 +63,13 @@ title: Submit a Listing
|
||||
<li>Workouts for core strength</li>
|
||||
</ul>
|
||||
|
||||
<h3 class="category-title">Business</h3>
|
||||
<ul>
|
||||
<li>Job interview practice</li>
|
||||
<li>Guide to changing fields</li>
|
||||
<li>Writing a good performance review</li>
|
||||
</ul>
|
||||
|
||||
<h3 class="category-title">Food and Drink</h3>
|
||||
<ul>
|
||||
<li>Sourdough starting</li>
|
||||
@ -81,10 +87,15 @@ title: Submit a Listing
|
||||
<h3 class="category-title">Interpersonal and Life</h3>
|
||||
<ul>
|
||||
<li>Neurodivergent life tactics</li>
|
||||
<li>Navigating workplace transition</li>
|
||||
<li>Navigating workplace transition (also totally cool in "Business")</li>
|
||||
<li>Mediating hard discussions</li>
|
||||
</ul>
|
||||
|
||||
<h3 class="category-title">Miscellany and More</h3>
|
||||
<ul>
|
||||
<li>Surprise me!</li>
|
||||
</ul>
|
||||
|
||||
<h3 class="category-title">Repair and DIY</h3>
|
||||
<ul>
|
||||
<li>Plumbing basics</li>
|
||||
|
||||
Reference in New Issue
Block a user