commit 2b225197b4c33017271ec8edd756b48a0063345f Author: Ricardo Date: Sat Jan 24 12:13:34 2026 +0100 Initial commit: Indiekit Eleventy theme diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea329ac --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# Dependencies +node_modules/ + +# Build output +_site/ +css/style.css + +# Cache +.cache/ + +# Content (symlinked at runtime) +content/ +uploads/ + +# Personal overrides (should be in parent repo) +*.rmendes + +# OS files +.DS_Store +Thumbs.db + +# Editor +.vscode/ +.idea/ +*.swp +*.swo diff --git a/404.njk b/404.njk new file mode 100644 index 0000000..332ccc1 --- /dev/null +++ b/404.njk @@ -0,0 +1,8 @@ +--- +layout: layouts/base.njk +title: Page Not Found +permalink: /404.html +--- +

404 - Page Not Found

+

Sorry, the page you're looking for doesn't exist.

+

Go back to the homepage

diff --git a/README.md b/README.md new file mode 100644 index 0000000..db997e0 --- /dev/null +++ b/README.md @@ -0,0 +1,56 @@ +# Indiekit Eleventy Theme + +A modern, responsive Eleventy theme designed for [Indiekit](https://getindiekit.com/)-powered IndieWeb blogs. + +## Features + +- **IndieWeb Ready**: Full h-card, h-entry, h-feed microformats support +- **Dark Mode**: Automatic dark/light mode with manual toggle +- **Responsive**: Mobile-first design with Tailwind CSS +- **Social Integration**: + - Bluesky and Mastodon feeds in sidebar + - GitHub activity page + - Funkwhale listening history + - YouTube channel display +- **Performance**: Optimized images, lazy loading, prefetching +- **Accessible**: Semantic HTML, proper ARIA labels + +## Usage + +This theme is designed to be used as a git submodule in an Indiekit deployment: + +```bash +git submodule add https://github.com/rmdes/indiekit-eleventy-theme.git eleventy-site +``` + +## Configuration + +The theme uses environment variables for configuration. See the data files in `_data/` for required variables: + +- `SITE_NAME`, `SITE_URL`, `SITE_DESCRIPTION` +- `AUTHOR_NAME`, `AUTHOR_BIO`, `AUTHOR_AVATAR` +- `GITHUB_USERNAME`, `BLUESKY_HANDLE`, `MASTODON_INSTANCE` +- And more... + +## Directory Structure + +``` +├── _data/ # Eleventy data files (site config, API fetchers) +├── _includes/ # Layouts and components +├── css/ # Tailwind CSS source +├── images/ # Static images +├── *.njk # Page templates +├── eleventy.config.js +└── package.json +``` + +## Development + +```bash +npm install +npm run dev +``` + +## License + +MIT diff --git a/_data/blueskyFeed.js b/_data/blueskyFeed.js new file mode 100644 index 0000000..b0083bc --- /dev/null +++ b/_data/blueskyFeed.js @@ -0,0 +1,68 @@ +/** + * Bluesky Feed Data + * Fetches recent posts from Bluesky using the AT Protocol API + */ + +import EleventyFetch from "@11ty/eleventy-fetch"; +import { BskyAgent } from "@atproto/api"; + +export default async function () { + const handle = process.env.BLUESKY_HANDLE || ""; + + try { + // Create agent and resolve handle to DID + const agent = new BskyAgent({ service: "https://bsky.social" }); + + // Get the author's feed using public API (no auth needed for public posts) + const feedUrl = `https://public.api.bsky.app/xrpc/app.bsky.feed.getAuthorFeed?actor=${handle}&limit=10`; + + const response = await EleventyFetch(feedUrl, { + duration: "15m", // Cache for 15 minutes + type: "json", + fetchOptions: { + headers: { + Accept: "application/json", + }, + }, + }); + + if (!response.feed) { + console.log("No Bluesky feed found for handle:", handle); + return []; + } + + // Transform the feed into a simpler format + return response.feed.map((item) => { + // Extract rkey from AT URI (at://did:plc:xxx/app.bsky.feed.post/rkey) + const rkey = item.post.uri.split("/").pop(); + const postUrl = `https://bsky.app/profile/${item.post.author.handle}/post/${rkey}`; + + return { + text: item.post.record.text, + createdAt: item.post.record.createdAt, + uri: item.post.uri, + url: postUrl, + cid: item.post.cid, + author: { + handle: item.post.author.handle, + displayName: item.post.author.displayName, + avatar: item.post.author.avatar, + }, + likeCount: item.post.likeCount || 0, + repostCount: item.post.repostCount || 0, + replyCount: item.post.replyCount || 0, + // Extract any embedded links or images + embed: item.post.embed + ? { + type: item.post.embed.$type, + images: item.post.embed.images || [], + external: item.post.embed.external || null, + } + : null, + }; + }); + } catch (error) { + console.error("Error fetching Bluesky feed:", error.message); + return []; + } +} diff --git a/_data/cv.js b/_data/cv.js new file mode 100644 index 0000000..576eac9 --- /dev/null +++ b/_data/cv.js @@ -0,0 +1,190 @@ +/** + * CV Data - Easy to update! + * + * To add a new experience: Add an entry to the `experience` array + * To add a new project: Add an entry to the `projects` array + * To update skills: Modify the `skills` object + */ + +export default { + // Last updated date - automatically set to build time + lastUpdated: new Date().toISOString().split("T")[0], + + // Work Experience - Add new positions at the TOP of the array + experience: [ + { + title: "Middleware Engineer", + company: "FGTB-ABVV", + location: "Brussels", + startDate: "2023-11", + endDate: null, // null = present + type: "full-time", + description: "Technology Specialist focusing on IT infrastructure and application delivery", + highlights: [ + "Strategic migration of Java applications from legacy IBM Datapowers and PureApp systems", + "Containerized application deployment on VMware Linux and OpenShift Kubernetes clusters", + "Mastering OpenShift, Kubernetes, and Docker technologies" + ] + }, + { + title: "Solution Architect", + company: "OSINTukraine.com", + location: "Remote", + startDate: "2022-02", + endDate: null, + type: "volunteer", + description: "Open-source intelligence (OSINT) initiative for Ukraine conflict monitoring", + highlights: [ + "Collection, archiving, translation, analysis and dissemination of critical information", + "Monitoring Russian Telegram channels with filtering, categorization, and archiving", + "Sub-projects: War crimes archive, Drones research, Location-related alerts system" + ] + }, + { + title: "DevOps Training", + company: "BeCode", + location: "Brussels", + startDate: "2021-09", + endDate: "2022-03", + type: "training", + description: "7-month intensive DevOps specialization", + highlights: [ + "Vagrant and Ansible infrastructure as code for WordPress, Nginx, Redis", + "Docker Swarm cluster management", + "GitLab CI/CD with SonarQube security audits", + "Jenkins pipelines, Python basics, Prometheus/Grafana monitoring" + ] + }, + { + title: "CTO", + company: "DigitYser", + location: "Brussels", + startDate: "2018-10", + endDate: "2020-03", + type: "full-time", + description: "Digital flagship of tech communities in Brussels", + highlights: [ + "Hosting infrastructure and automation", + "Integrations with digital marketing tools", + "Technical Event Management: Livestreaming, sound, video, photos" + ] + }, + { + title: "Solution Architect", + company: "Armada.digital", + location: "Brussels", + startDate: "2016-05", + endDate: "2021-12", + type: "freelance", + description: "Consultancy to amplify visibility of good causes", + highlights: [ + "Custom communication and collaboration solutions", + "Empowering individuals and ethical businesses" + ] + }, + { + title: "FactChecking Platform", + company: "Journalistes Solidaires", + location: "Brussels", + startDate: "2020-03", + endDate: "2020-05", + type: "volunteer", + description: "Cloudron/Docker backend for factchecking workflow", + highlights: [ + "WordPress with custom post types for COVID-19 disinformation monitoring" + ] + }, + { + title: "Event Manager", + company: "European Data Innovation Hub", + location: "Brussels", + startDate: "2019-02", + endDate: "2020-03", + type: "full-time", + description: "Technical event organization and management" + }, + { + title: "Technical Advisor", + company: "WomenPreneur-Initiative", + location: "Brussels", + startDate: "2019-01", + endDate: "2020-01", + type: "volunteer", + description: "Technical guidance for women-focused entrepreneurship initiative" + }, + { + title: "Technical Advisor", + company: "Promote Ukraine", + location: "Brussels", + startDate: "2019-01", + endDate: "2020-01", + type: "freelance", + description: "Technical consulting for Ukraine advocacy organization" + } + ], + + // Current/Recent Projects - Add new projects at the TOP + projects: [ + { + name: "OSINT Intelligence Platform", + url: "https://osintukraine.com", + description: "Real-time monitoring and analysis platform for open-source intelligence", + technologies: ["Docker", "Telegram API", "Python", "PostgreSQL"], + status: "active" + }, + { + name: "Indiekit Cloudron Package", + url: "https://github.com/rmdes/indiekit-cloudron", + description: "Cloudron-packaged IndieWeb publishing server with Eleventy frontend", + technologies: ["Node.js", "Eleventy", "Docker", "Cloudron"], + status: "active" + } + // Add more projects here as needed + ], + + // Skills - Organized by category + skills: { + containers: ["OpenShift", "Kubernetes", "Docker", "Docker Swarm"], + automation: ["Ansible", "Vagrant", "GitLab CI/CD", "Jenkins", "GitHub Actions"], + monitoring: ["Prometheus", "Grafana", "OpenTelemetry"], + systems: ["Linux Administration", "System Administration", "VMware"], + hosting: ["Cloudron", "On-Premise", "Cloud Infrastructure"], + web: ["Nginx", "Redis", "WordPress", "TLS/SSL", "Eleventy"], + security: ["SonarQube", "Information Assurance", "OSINT"], + languages: ["Python", "Bash", "JavaScript", "Node.js"] + }, + + // Languages spoken + languages: [ + { name: "Portuguese", level: "Native" }, + { name: "French", level: "Fluent" }, + { name: "English", level: "Fluent" }, + { name: "Spanish", level: "Conversational" } + ], + + // Education + education: [ + { + degree: "DevOps Training", + institution: "BeCode", + location: "Brussels", + year: "2021-2022", + description: "7-month intensive DevOps specialization" + }, + { + degree: "Bachelor's in Management Information Technology", + institution: "ISLA - Instituto Superior de Gestão e Tecnologia", + location: "Portugal", + year: "1998-2001", + description: "Curso Técnico Superior Profissional de Informática de Gestão" + } + ], + + // Interests + interests: [ + "Music Production (Ableton Live, Ableton Push 3)", + "IndieWeb & Decentralized Tech", + "Open Source Intelligence (OSINT)", + "Democracy & Digital Rights" + ] +}; diff --git a/_data/funkwhaleActivity.js b/_data/funkwhaleActivity.js new file mode 100644 index 0000000..316aeb4 --- /dev/null +++ b/_data/funkwhaleActivity.js @@ -0,0 +1,123 @@ +/** + * Funkwhale Activity Data + * Fetches from Indiekit's endpoint-funkwhale public API + */ + +import EleventyFetch from "@11ty/eleventy-fetch"; + +const INDIEKIT_URL = process.env.SITE_URL || "https://example.com"; +const FUNKWHALE_INSTANCE = process.env.FUNKWHALE_INSTANCE || ""; + +/** + * Fetch from Indiekit's public Funkwhale API endpoint + */ +async function fetchFromIndiekit(endpoint) { + try { + const url = `${INDIEKIT_URL}/funkwhaleapi/api/${endpoint}`; + console.log(`[funkwhaleActivity] Fetching from Indiekit: ${url}`); + const data = await EleventyFetch(url, { + duration: "15m", + type: "json", + }); + console.log(`[funkwhaleActivity] Indiekit ${endpoint} success`); + return data; + } catch (error) { + console.log( + `[funkwhaleActivity] Indiekit API unavailable for ${endpoint}: ${error.message}` + ); + return null; + } +} + +/** + * Format duration in seconds to human-readable string + */ +function formatDuration(seconds) { + if (!seconds || seconds < 0) return "0:00"; + + const hours = Math.floor(seconds / 3600); + const minutes = Math.floor((seconds % 3600) / 60); + + if (hours > 24) { + const days = Math.floor(hours / 24); + return `${days}d`; + } + + if (hours > 0) { + return `${hours}h ${minutes}m`; + } + + return `${minutes}m`; +} + +export default async function () { + try { + console.log("[funkwhaleActivity] Fetching Funkwhale data..."); + + // Fetch all data from Indiekit API + const [nowPlaying, listenings, favorites, stats] = await Promise.all([ + fetchFromIndiekit("now-playing"), + fetchFromIndiekit("listenings"), + fetchFromIndiekit("favorites"), + fetchFromIndiekit("stats"), + ]); + + // Check if we got data + const hasData = nowPlaying || listenings?.listenings?.length || stats?.summary; + + if (!hasData) { + console.log("[funkwhaleActivity] No data available from Indiekit"); + return { + nowPlaying: null, + listenings: [], + favorites: [], + stats: null, + instanceUrl: FUNKWHALE_INSTANCE, + source: "unavailable", + }; + } + + console.log("[funkwhaleActivity] Using Indiekit API data"); + + // Format stats with human-readable durations + let formattedStats = null; + if (stats?.summary) { + formattedStats = { + ...stats, + summary: { + all: { + ...stats.summary.all, + totalDurationFormatted: formatDuration(stats.summary.all?.totalDuration || 0), + }, + month: { + ...stats.summary.month, + totalDurationFormatted: formatDuration(stats.summary.month?.totalDuration || 0), + }, + week: { + ...stats.summary.week, + totalDurationFormatted: formatDuration(stats.summary.week?.totalDuration || 0), + }, + }, + }; + } + + return { + nowPlaying: nowPlaying || null, + listenings: listenings?.listenings || [], + favorites: favorites?.favorites || [], + stats: formattedStats, + instanceUrl: FUNKWHALE_INSTANCE, + source: "indiekit", + }; + } catch (error) { + console.error("[funkwhaleActivity] Error:", error.message); + return { + nowPlaying: null, + listenings: [], + favorites: [], + stats: null, + instanceUrl: FUNKWHALE_INSTANCE, + source: "error", + }; + } +} diff --git a/_data/githubActivity.js b/_data/githubActivity.js new file mode 100644 index 0000000..f3f5f19 --- /dev/null +++ b/_data/githubActivity.js @@ -0,0 +1,228 @@ +/** + * GitHub Activity Data + * Fetches from Indiekit's endpoint-github public API + * Falls back to direct GitHub API if Indiekit is unavailable + */ + +import EleventyFetch from "@11ty/eleventy-fetch"; + +const GITHUB_USERNAME = process.env.GITHUB_USERNAME || ""; +const INDIEKIT_URL = process.env.SITE_URL || "https://example.com"; + +// Fallback featured repos if Indiekit API unavailable (from env: comma-separated) +const FALLBACK_FEATURED_REPOS = process.env.GITHUB_FEATURED_REPOS?.split(",").filter(Boolean) || []; + +/** + * Fetch from Indiekit's public GitHub API endpoint + */ +async function fetchFromIndiekit(endpoint) { + try { + const url = `${INDIEKIT_URL}/githubapi/api/${endpoint}`; + console.log(`[githubActivity] Fetching from Indiekit: ${url}`); + const data = await EleventyFetch(url, { + duration: "15m", + type: "json", + }); + console.log(`[githubActivity] Indiekit ${endpoint} success`); + return data; + } catch (error) { + console.log( + `[githubActivity] Indiekit API unavailable for ${endpoint}: ${error.message}` + ); + return null; + } +} + +/** + * Fetch from GitHub API directly + */ +async function fetchFromGitHub(endpoint) { + const url = `https://api.github.com${endpoint}`; + const headers = { + Accept: "application/vnd.github.v3+json", + "User-Agent": "Eleventy-Site", + }; + + if (process.env.GITHUB_TOKEN) { + headers.Authorization = `Bearer ${process.env.GITHUB_TOKEN}`; + } + + return await EleventyFetch(url, { + duration: "15m", + type: "json", + fetchOptions: { headers }, + }); +} + +/** + * Truncate text with ellipsis + */ +function truncate(text, maxLength = 80) { + if (!text || text.length <= maxLength) return text || ""; + return text.slice(0, maxLength - 1) + "..."; +} + +/** + * Extract commits from push events + */ +function extractCommits(events) { + if (!Array.isArray(events)) return []; + + return events + .filter((event) => event.type === "PushEvent") + .flatMap((event) => + (event.payload?.commits || []).map((commit) => ({ + sha: commit.sha.slice(0, 7), + message: truncate(commit.message.split("\n")[0]), + url: `https://github.com/${event.repo.name}/commit/${commit.sha}`, + repo: event.repo.name, + repoUrl: `https://github.com/${event.repo.name}`, + date: event.created_at, + })) + ) + .slice(0, 10); +} + +/** + * Extract PRs/Issues from events + */ +function extractContributions(events) { + if (!Array.isArray(events)) return []; + + return events + .filter( + (event) => + (event.type === "PullRequestEvent" || event.type === "IssuesEvent") && + event.payload?.action === "opened" + ) + .map((event) => { + const item = event.payload.pull_request || event.payload.issue; + return { + type: event.type === "PullRequestEvent" ? "pr" : "issue", + title: truncate(item?.title), + url: item?.html_url, + repo: event.repo.name, + repoUrl: `https://github.com/${event.repo.name}`, + number: item?.number, + date: event.created_at, + }; + }) + .slice(0, 10); +} + +/** + * Format starred repos + */ +function formatStarred(repos) { + if (!Array.isArray(repos)) return []; + + return repos.map((repo) => ({ + name: repo.full_name, + description: truncate(repo.description, 120), + url: repo.html_url, + stars: repo.stargazers_count, + language: repo.language, + topics: repo.topics?.slice(0, 5) || [], + })); +} + +/** + * Fetch featured repos directly from GitHub (fallback) + */ +async function fetchFeaturedFromGitHub(repoList) { + const featured = []; + + for (const repoFullName of repoList) { + try { + const repo = await fetchFromGitHub(`/repos/${repoFullName}`); + let commits = []; + try { + const commitsData = await fetchFromGitHub( + `/repos/${repoFullName}/commits?per_page=5` + ); + commits = commitsData.map((c) => ({ + sha: c.sha.slice(0, 7), + message: truncate(c.commit.message.split("\n")[0]), + url: c.html_url, + date: c.commit.author.date, + })); + } catch (e) { + console.log(`[githubActivity] Could not fetch commits for ${repoFullName}`); + } + + featured.push({ + fullName: repo.full_name, + name: repo.name, + description: repo.description, + url: repo.html_url, + stars: repo.stargazers_count, + forks: repo.forks_count, + language: repo.language, + isPrivate: repo.private, + commits, + }); + } catch (error) { + console.log(`[githubActivity] Could not fetch ${repoFullName}: ${error.message}`); + } + } + + return featured; +} + +export default async function () { + try { + console.log("[githubActivity] Fetching GitHub data..."); + + // Try Indiekit public API first + const [indiekitStars, indiekitCommits, indiekitActivity, indiekitFeatured] = + await Promise.all([ + fetchFromIndiekit("stars"), + fetchFromIndiekit("commits"), + fetchFromIndiekit("activity"), + fetchFromIndiekit("featured"), + ]); + + // Check if Indiekit API is available + const hasIndiekitData = + indiekitStars?.stars || + indiekitCommits?.commits || + indiekitFeatured?.featured; + + if (hasIndiekitData) { + console.log("[githubActivity] Using Indiekit API data"); + return { + stars: indiekitStars?.stars || [], + commits: indiekitCommits?.commits || [], + activity: indiekitActivity?.activity || [], + featured: indiekitFeatured?.featured || [], + source: "indiekit", + }; + } + + // Fallback to direct GitHub API + console.log("[githubActivity] Falling back to GitHub API"); + + const [events, starred, featured] = await Promise.all([ + fetchFromGitHub(`/users/${GITHUB_USERNAME}/events/public?per_page=50`), + fetchFromGitHub(`/users/${GITHUB_USERNAME}/starred?per_page=20&sort=created`), + fetchFeaturedFromGitHub(FALLBACK_FEATURED_REPOS), + ]); + + return { + stars: formatStarred(starred || []), + commits: extractCommits(events || []), + contributions: extractContributions(events || []), + featured, + source: "github", + }; + } catch (error) { + console.error("[githubActivity] Error:", error.message); + return { + stars: [], + commits: [], + contributions: [], + featured: [], + source: "error", + }; + } +} diff --git a/_data/githubRepos.js b/_data/githubRepos.js new file mode 100644 index 0000000..1b8fe5f --- /dev/null +++ b/_data/githubRepos.js @@ -0,0 +1,48 @@ +/** + * GitHub Repos Data + * Fetches public repositories from GitHub API + */ + +import EleventyFetch from "@11ty/eleventy-fetch"; + +export default async function () { + const username = process.env.GITHUB_USERNAME || ""; + + try { + // Fetch public repos, sorted by updated date + const url = `https://api.github.com/users/${username}/repos?sort=updated&per_page=10&type=owner`; + + const repos = await EleventyFetch(url, { + duration: "1h", // Cache for 1 hour + type: "json", + fetchOptions: { + headers: { + Accept: "application/vnd.github.v3+json", + "User-Agent": "Eleventy-Site", + }, + }, + }); + + // Filter and transform repos + return repos + .filter((repo) => !repo.fork && !repo.private) // Exclude forks and private repos + .map((repo) => ({ + name: repo.name, + full_name: repo.full_name, + description: repo.description, + html_url: repo.html_url, + homepage: repo.homepage, + language: repo.language, + stargazers_count: repo.stargazers_count, + forks_count: repo.forks_count, + open_issues_count: repo.open_issues_count, + topics: repo.topics || [], + updated_at: repo.updated_at, + created_at: repo.created_at, + })) + .slice(0, 10); // Limit to 10 repos + } catch (error) { + console.error("Error fetching GitHub repos:", error.message); + return []; + } +} diff --git a/_data/mastodonFeed.js b/_data/mastodonFeed.js new file mode 100644 index 0000000..0c79abf --- /dev/null +++ b/_data/mastodonFeed.js @@ -0,0 +1,96 @@ +/** + * Mastodon Feed Data + * Fetches recent posts from Mastodon using the public API + */ + +import EleventyFetch from "@11ty/eleventy-fetch"; + +export default async function () { + const instance = process.env.MASTODON_INSTANCE?.replace("https://", "") || ""; + const username = process.env.MASTODON_USER || ""; + + try { + // First, look up the account ID + const lookupUrl = `https://${instance}/api/v1/accounts/lookup?acct=${username}`; + + const account = await EleventyFetch(lookupUrl, { + duration: "1h", // Cache account lookup for 1 hour + type: "json", + fetchOptions: { + headers: { + Accept: "application/json", + }, + }, + }); + + if (!account || !account.id) { + console.log("Mastodon account not found:", username); + return []; + } + + // Fetch recent statuses (excluding replies and boosts for cleaner feed) + const statusesUrl = `https://${instance}/api/v1/accounts/${account.id}/statuses?limit=10&exclude_replies=true&exclude_reblogs=true`; + + const statuses = await EleventyFetch(statusesUrl, { + duration: "15m", // Cache for 15 minutes + type: "json", + fetchOptions: { + headers: { + Accept: "application/json", + }, + }, + }); + + if (!statuses || !Array.isArray(statuses)) { + console.log("No Mastodon statuses found for:", username); + return []; + } + + // Transform statuses into a simpler format + return statuses.map((status) => ({ + id: status.id, + url: status.url, + text: stripHtml(status.content), + htmlContent: status.content, + createdAt: status.created_at, + author: { + username: status.account.username, + displayName: status.account.display_name || status.account.username, + avatar: status.account.avatar, + url: status.account.url, + }, + favouritesCount: status.favourites_count || 0, + reblogsCount: status.reblogs_count || 0, + repliesCount: status.replies_count || 0, + // Media attachments + media: status.media_attachments + ? status.media_attachments.map((m) => ({ + type: m.type, + url: m.url, + previewUrl: m.preview_url, + description: m.description, + })) + : [], + })); + } catch (error) { + console.error("Error fetching Mastodon feed:", error.message); + return []; + } +} + +// Simple HTML stripper for plain text display +function stripHtml(html) { + if (!html) return ""; + return html + .replace(//gi, " ") + .replace(/<\/p>/gi, " ") + .replace(/<[^>]+>/g, "") + .replace(/&/g, "&") + .replace(/</g, "<") + .replace(/>/g, ">") + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/ /g, " ") + .replace(/\s+/g, " ") + .trim(); +} diff --git a/_data/site.js b/_data/site.js new file mode 100644 index 0000000..0f4b389 --- /dev/null +++ b/_data/site.js @@ -0,0 +1,66 @@ +/** + * Site configuration for Eleventy + * + * Configure via environment variables in Cloudron app settings. + * All values have sensible defaults for initial deployment. + */ + +// Parse social links from env (format: "name|url|icon,name|url|icon") +function parseSocialLinks(envVar) { + if (!envVar) return []; + return envVar.split(",").map((link) => { + const [name, url, icon] = link.split("|").map((s) => s.trim()); + return { name, url, rel: "me", icon: icon || name.toLowerCase() }; + }); +} + +// Default social links if none configured +const defaultSocial = [ + { + name: "GitHub", + url: "https://github.com/", + rel: "me", + icon: "github", + }, +]; + +export default { + // Basic site info + name: process.env.SITE_NAME || "My IndieWeb Blog", + url: process.env.SITE_URL || "https://example.com", + me: process.env.SITE_URL || "https://example.com", + locale: process.env.SITE_LOCALE || "en", + description: + process.env.SITE_DESCRIPTION || + "An IndieWeb-powered blog with Micropub support", + + // Author info (shown in h-card, about page, etc.) + author: { + name: process.env.AUTHOR_NAME || "Blog Author", + url: process.env.SITE_URL || "https://example.com", + avatar: process.env.AUTHOR_AVATAR || "/images/default-avatar.svg", + title: process.env.AUTHOR_TITLE || "", + bio: process.env.AUTHOR_BIO || "Welcome to my IndieWeb blog.", + location: process.env.AUTHOR_LOCATION || "", + email: process.env.AUTHOR_EMAIL || "", + }, + + // Social links (for rel="me" and footer) + // Set SITE_SOCIAL env var as: "GitHub|https://github.com/user|github,Mastodon|https://mastodon.social/@user|mastodon" + social: parseSocialLinks(process.env.SITE_SOCIAL) || defaultSocial, + + // Feed integrations (usernames for data fetching) + feeds: { + github: process.env.GITHUB_USERNAME || "", + bluesky: process.env.BLUESKY_HANDLE || "", + mastodon: { + instance: process.env.MASTODON_INSTANCE?.replace("https://", "") || "", + username: process.env.MASTODON_USER || "", + }, + }, + + // Webmentions configuration + webmentions: { + domain: process.env.SITE_URL?.replace("https://", "").replace("http://", "") || "example.com", + }, +}; diff --git a/_data/youtubeChannel.js b/_data/youtubeChannel.js new file mode 100644 index 0000000..7fbf461 --- /dev/null +++ b/_data/youtubeChannel.js @@ -0,0 +1,206 @@ +/** + * YouTube Channel Data + * Fetches from Indiekit's endpoint-youtube public API + * Supports single or multiple channels + */ + +import EleventyFetch from "@11ty/eleventy-fetch"; + +const INDIEKIT_URL = process.env.SITE_URL || "https://example.com"; + +/** + * Fetch from Indiekit's public YouTube API endpoint + */ +async function fetchFromIndiekit(endpoint) { + try { + const url = `${INDIEKIT_URL}/youtubeapi/api/${endpoint}`; + console.log(`[youtubeChannel] Fetching from Indiekit: ${url}`); + const data = await EleventyFetch(url, { + duration: "5m", + type: "json", + }); + console.log(`[youtubeChannel] Indiekit ${endpoint} success`); + return data; + } catch (error) { + console.log( + `[youtubeChannel] Indiekit API unavailable for ${endpoint}: ${error.message}` + ); + return null; + } +} + +/** + * Format large numbers with locale separators + */ +function formatNumber(num) { + if (!num) return "0"; + return new Intl.NumberFormat().format(num); +} + +/** + * Format view count with K/M suffix for compact display + */ +function formatViewCount(num) { + if (!num) return "0"; + if (num >= 1000000) { + return (num / 1000000).toFixed(1).replace(/\.0$/, "") + "M"; + } + if (num >= 1000) { + return (num / 1000).toFixed(1).replace(/\\.0$/, "") + "K"; + } + return num.toString(); +} + +/** + * Format relative time from ISO date string + */ +function formatRelativeTime(dateString) { + if (!dateString) return ""; + const date = new Date(dateString); + const now = new Date(); + const diffMs = now - date; + const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24)); + + if (diffDays === 0) return "Today"; + if (diffDays === 1) return "Yesterday"; + if (diffDays < 7) return `${diffDays} days ago`; + if (diffDays < 30) return `${Math.floor(diffDays / 7)} weeks ago`; + if (diffDays < 365) return `${Math.floor(diffDays / 30)} months ago`; + return `${Math.floor(diffDays / 365)} years ago`; +} + +/** + * Format channel data with computed fields + */ +function formatChannel(channel) { + if (!channel) return null; + return { + ...channel, + subscriberCountFormatted: formatNumber(channel.subscriberCount), + videoCountFormatted: formatNumber(channel.videoCount), + viewCountFormatted: formatNumber(channel.viewCount), + url: `https://www.youtube.com/channel/${channel.id}`, + }; +} + +/** + * Format video data with computed fields + */ +function formatVideo(video) { + return { + ...video, + viewCountFormatted: formatViewCount(video.viewCount), + relativeTime: formatRelativeTime(video.publishedAt), + }; +} + +export default async function () { + try { + console.log("[youtubeChannel] Fetching YouTube data..."); + + // Fetch all data from Indiekit API + const [channelData, videosData, liveData] = await Promise.all([ + fetchFromIndiekit("channel"), + fetchFromIndiekit("videos"), + fetchFromIndiekit("live"), + ]); + + // Check if we got data + const hasData = + channelData?.channel || + channelData?.channels?.length || + videosData?.videos?.length; + + if (!hasData) { + console.log("[youtubeChannel] No data available from Indiekit"); + return { + channel: null, + channels: [], + videos: [], + videosByChannel: {}, + liveStatus: null, + liveStatuses: [], + isMultiChannel: false, + source: "unavailable", + }; + } + + console.log("[youtubeChannel] Using Indiekit API data"); + + // Determine if multi-channel mode + const isMultiChannel = !!(channelData?.channels && channelData.channels.length > 1); + + // Format channels + let channels = []; + let channel = null; + + if (isMultiChannel) { + channels = (channelData.channels || []).map(formatChannel).filter(Boolean); + channel = channels[0] || null; + } else { + channel = formatChannel(channelData?.channel); + channels = channel ? [channel] : []; + } + + // Format videos + const videos = (videosData?.videos || []).map(formatVideo); + + // Group videos by channel if multi-channel + let videosByChannel = {}; + if (isMultiChannel && videosData?.videosByChannel) { + for (const [channelName, channelVideos] of Object.entries(videosData.videosByChannel)) { + videosByChannel[channelName] = (channelVideos || []).map(formatVideo); + } + } else if (channel) { + videosByChannel[channel.configName || channel.title] = videos; + } + + // Format live status + let liveStatus = null; + let liveStatuses = []; + + if (liveData) { + if (isMultiChannel && liveData.liveStatuses) { + liveStatuses = liveData.liveStatuses; + // Find first live or upcoming + const live = liveStatuses.find((s) => s.isLive); + const upcoming = liveStatuses.find((s) => s.isUpcoming && !s.isLive); + liveStatus = { + isLive: !!live, + isUpcoming: !live && !!upcoming, + stream: live?.stream || upcoming?.stream || null, + }; + } else { + liveStatus = { + isLive: liveData.isLive || false, + isUpcoming: liveData.isUpcoming || false, + stream: liveData.stream || null, + }; + liveStatuses = [{ ...liveStatus, channelConfigName: channel?.configName }]; + } + } + + return { + channel, + channels, + videos, + videosByChannel, + liveStatus, + liveStatuses, + isMultiChannel, + source: "indiekit", + }; + } catch (error) { + console.error("[youtubeChannel] Error:", error.message); + return { + channel: null, + channels: [], + videos: [], + videosByChannel: {}, + liveStatus: null, + liveStatuses: [], + isMultiChannel: false, + source: "error", + }; + } +} diff --git a/_includes/components/blog-sidebar.njk b/_includes/components/blog-sidebar.njk new file mode 100644 index 0000000..3ac588c --- /dev/null +++ b/_includes/components/blog-sidebar.njk @@ -0,0 +1,184 @@ +{# Blog Sidebar - Shown on individual post pages #} +{# Contains: Author compact card, Related posts, Categories, Recent posts #} + +{# Author Compact Card #} +
+
+ {{ site.author.name }} +
+ + {{ site.author.name }} + +

{{ site.author.title }}

+
+
+
+ +{# Post Navigation Widget - Previous/Next #} +{% if previousPost or nextPost %} +
+

More Posts

+
+ {% if previousPost %} + + {% endif %} + {% if nextPost %} +
+ Next + + {{ nextPost.data.title or nextPost.data.name or "Untitled" }} + +
+ {% endif %} +
+
+{% endif %} + +{# Table of Contents Widget (for articles with headings) #} +{% if toc and toc.length %} +
+

Contents

+ +
+{% endif %} + +{# Categories for This Post #} +{% if category %} +
+

Categories

+
+ {% if category is string %} + + {{ category }} + + {% else %} + {% for cat in category %} + + {{ cat }} + + {% endfor %} + {% endif %} +
+
+{% endif %} + +{# Recent Posts Widget #} +{% if collections.posts %} +
+

Recent Posts

+ + + View all posts + +
+{% endif %} + +{# Webmentions Widget (if this post has any) #} +{% if webmentions and webmentions.length %} +
+

+ + + + Interactions +

+
+ {% set likes = webmentions | filter("like-of") %} + {% set reposts = webmentions | filter("repost-of") %} + {% set replies = webmentions | filter("in-reply-to") %} + + {% if likes.length %} +

+ {{ likes.length }} likes +

+ {% endif %} + {% if reposts.length %} +

+ {{ reposts.length }} reposts +

+ {% endif %} + {% if replies.length %} +

+ {{ replies.length }} replies +

+ {% endif %} +
+
+{% endif %} + +{# Share Widget #} +
+

Share

+ +
+ +{# Subscribe Widget #} + diff --git a/_includes/components/funkwhale-stats-content.njk b/_includes/components/funkwhale-stats-content.njk new file mode 100644 index 0000000..12822e7 --- /dev/null +++ b/_includes/components/funkwhale-stats-content.njk @@ -0,0 +1,66 @@ +{# Stats Summary Cards #} +{% if summary %} +
+
+ {{ summary.totalPlays or 0 }} + Plays +
+
+ {{ summary.uniqueTracks or 0 }} + Tracks +
+
+ {{ summary.uniqueArtists or 0 }} + Artists +
+
+ {{ summary.totalDurationFormatted or '0m' }} + Listened +
+
+{% endif %} + +{# Top Artists #} +{% if topArtists and topArtists.length %} +
+

Top Artists

+
+ {% for artist in topArtists | head(5) %} +
+ {{ loop.index }} + {{ artist.name }} + {{ artist.playCount }} plays +
+ {% endfor %} +
+
+{% endif %} + +{# Top Albums #} +{% if topAlbums and topAlbums.length %} +
+

Top Albums

+
+ {% for album in topAlbums | head(5) %} +
+ {% if album.coverUrl %} + + {% else %} +
+ + + +
+ {% endif %} +

{{ album.title }}

+

{{ album.artist }}

+

{{ album.playCount }} plays

+
+ {% endfor %} +
+
+{% endif %} + +{% if not summary and not topArtists and not topAlbums %} +

No statistics available for this period.

+{% endif %} diff --git a/_includes/components/h-card.njk b/_includes/components/h-card.njk new file mode 100644 index 0000000..fc97162 --- /dev/null +++ b/_includes/components/h-card.njk @@ -0,0 +1,64 @@ +{# h-card - IndieWeb identity microformat #} +{# See: https://microformats.org/wiki/h-card #} + +
+ {# Avatar #} + + + {# Name and identity #} + + {{ site.author.name }} + + + {# Title/role #} + {% if site.author.title %} + + {{ site.author.title }} + + {% endif %} + + {# Location #} + {% if site.author.location %} + + {% endif %} + + {# Social links with rel="me" #} + +
diff --git a/_includes/components/reply-context.njk b/_includes/components/reply-context.njk new file mode 100644 index 0000000..9398caa --- /dev/null +++ b/_includes/components/reply-context.njk @@ -0,0 +1,63 @@ +{# Reply Context Component #} +{# Displays rich context for replies, likes, reposts, and bookmarks #} +{# Uses h-cite microformat for citing external content #} + +{% if in_reply_to or like_of or repost_of or bookmark_of %} + +{% endif %} diff --git a/_includes/components/sidebar.njk b/_includes/components/sidebar.njk new file mode 100644 index 0000000..79e1463 --- /dev/null +++ b/_includes/components/sidebar.njk @@ -0,0 +1,258 @@ +{# Sidebar Components #} +{# Contains: Author card, Bluesky feed, GitHub repos, RSS feed #} + +{# Author Card Widget #} +
+
+ {{ site.author.name }} +
+ + {{ site.author.name }} + +

{{ site.author.title }}

+

{{ site.author.location }}

+
+
+

{{ site.author.bio }}

+
+ +{# Social Feed Widget - Tabbed Bluesky/Mastodon #} +{% if (blueskyFeed and blueskyFeed.length) or (mastodonFeed and mastodonFeed.length) %} +
+

Social Activity

+ + {# Tab buttons #} +
+ {% if blueskyFeed and blueskyFeed.length %} + + {% endif %} + {% if mastodonFeed and mastodonFeed.length %} + + {% endif %} +
+ + {# Bluesky Tab Content #} + {% if blueskyFeed and blueskyFeed.length %} +
+ + + View on Bluesky + + +
+ {% endif %} + + {# Mastodon Tab Content #} + {% if mastodonFeed and mastodonFeed.length %} +
+ + + View on Mastodon + + +
+ {% endif %} +
+{% endif %} + +{# GitHub Repos Widget #} +{% if githubRepos and githubRepos.length %} +
+

+ + GitHub Projects +

+
    + {% for repo in githubRepos | head(5) %} +
  • + + {{ repo.name }} + + {% if repo.description %} +

    {{ repo.description | truncate(80) }}

    + {% endif %} +
    + {% if repo.language %} + {{ repo.language }} + {% endif %} + {{ repo.stargazers_count }} stars +
    +
  • + {% endfor %} +
+ + View all repositories + +
+{% endif %} + +{# Funkwhale Now Playing Widget #} +{% if funkwhaleActivity and (funkwhaleActivity.nowPlaying or funkwhaleActivity.stats) %} +
+

+ + + + Listening +

+ + {# Now Playing / Recently Played #} + {% if funkwhaleActivity.nowPlaying and funkwhaleActivity.nowPlaying.track %} +
+ {% if funkwhaleActivity.nowPlaying.status == 'now-playing' %} +
+ + + + + + Now Playing +
+ {% elif funkwhaleActivity.nowPlaying.status == 'recently-played' %} +
Recently Played
+ {% endif %} + +
+ {% if funkwhaleActivity.nowPlaying.coverUrl %} + + {% endif %} +
+

+ {% if funkwhaleActivity.nowPlaying.trackUrl %} + + {{ funkwhaleActivity.nowPlaying.track }} + + {% else %} + {{ funkwhaleActivity.nowPlaying.track }} + {% endif %} +

+

{{ funkwhaleActivity.nowPlaying.artist }}

+
+
+
+ {% endif %} + + {# Quick Stats #} + {% if funkwhaleActivity.stats and funkwhaleActivity.stats.summary %} + {% set stats = funkwhaleActivity.stats.summary.all %} +
+
+ {{ stats.totalPlays or 0 }} + plays +
+
+ {{ stats.uniqueArtists or 0 }} + artists +
+
+ {{ stats.totalDurationFormatted or '0m' }} + listened +
+
+ {% endif %} + + + View full listening history + + +
+{% endif %} + +{# Recent Posts Widget (for non-blog pages) #} +{% if recentPosts and recentPosts.length %} +
+

Recent Posts

+ + + View all posts + +
+{% endif %} + +{# Categories/Tags Widget #} +{% if categories and categories.length %} +
+

Categories

+
+ {% for category in categories %} + + {{ category }} + + {% endfor %} +
+
+{% endif %} diff --git a/_includes/components/webmentions.njk b/_includes/components/webmentions.njk new file mode 100644 index 0000000..5af3f1e --- /dev/null +++ b/_includes/components/webmentions.njk @@ -0,0 +1,158 @@ +{# Webmentions Component #} +{# Displays likes, reposts, and replies for a post #} + +{% set mentions = webmentions | webmentionsForUrl(page.url) %} + +{% if mentions.length %} +
+

+ Webmentions ({{ mentions.length }}) +

+ + {# Likes #} + {% set likes = mentions | webmentionsByType('likes') %} + {% if likes.length %} +
+

+ {{ likes.length }} Like{% if likes.length != 1 %}s{% endif %} +

+
+ {% for like in likes %} + + {{ like.author.name }} + + {% endfor %} +
+
+ {% endif %} + + {# Reposts #} + {% set reposts = mentions | webmentionsByType('reposts') %} + {% if reposts.length %} +
+

+ {{ reposts.length }} Repost{% if reposts.length != 1 %}s{% endif %} +

+
+ {% for repost in reposts %} + + {{ repost.author.name }} + + {% endfor %} +
+
+ {% endif %} + + {# Replies #} + {% set replies = mentions | webmentionsByType('replies') %} + {% if replies.length %} +
+

+ {{ replies.length }} Repl{% if replies.length != 1 %}ies{% else %}y{% endif %} +

+ +
+ {% endif %} + + {# Other mentions #} + {% set otherMentions = mentions | webmentionsByType('mentions') %} + {% if otherMentions.length %} +
+

+ {{ otherMentions.length }} Mention{% if otherMentions.length != 1 %}s{% endif %} +

+ +
+ {% endif %} +
+{% endif %} + +{# Webmention send form #} +
+

+ Send a Webmention +

+

+ Have you written a response to this post? Send a webmention by entering your post URL below. +

+
+ + + +
+
diff --git a/_includes/layouts/base.njk b/_includes/layouts/base.njk new file mode 100644 index 0000000..d0fa075 --- /dev/null +++ b/_includes/layouts/base.njk @@ -0,0 +1,219 @@ + + + + + + {% if title %}{{ title }} - {% endif %}{{ site.name }} + + {# OpenGraph meta tags #} + {% set ogTitle = title | default(site.name) %} + {% set ogDesc = description | default(content | ogDescription(200)) | default(site.description) %} + {% set contentImage = content | extractFirstImage %} + + + + + + + {% if photo %} + + {% elif image %} + + {% elif contentImage %} + + {% else %} + + {% endif %} + + + + + {# Twitter Card meta tags #} + {% set hasImage = photo or image or contentImage %} + + + + {% if photo %} + + {% elif image %} + + {% elif contentImage %} + + {% endif %} + + + + + + + + + + + + + + + + {# IndieAuth rel="me" links for identity verification #} + {% for social in site.social %} + + {% endfor %} + + + + + +
+ {% if withSidebar %} +
+
+ {{ content | safe }} +
+ +
+ {% elif withBlogSidebar %} +
+
+ {{ content | safe }} +
+ +
+ {% else %} + {{ content | safe }} + {% endif %} +
+ + + + + diff --git a/_includes/layouts/home.njk b/_includes/layouts/home.njk new file mode 100644 index 0000000..126c7f4 --- /dev/null +++ b/_includes/layouts/home.njk @@ -0,0 +1,208 @@ +--- +layout: layouts/base.njk +withSidebar: true +--- + +{# Hero Section #} +
+
+ {# Avatar #} + {{ site.author.name }} + + {# Introduction #} +
+

+ {{ site.author.name }} +

+

+ {{ site.author.title }} +

+

+ {{ site.author.bio }} +

+ + {# Social Links #} + +
+
+
+ +{# Work Experience Timeline - only show if data exists #} +{% if cv.experience and cv.experience.length %} +
+

Experience

+ +
+ {% for job in cv.experience %} +
+
+

+ {{ job.title }} +

+ @ {{ job.company }} + {% if job.type != "full-time" %} + {{ job.type }} + {% endif %} +
+ +

+ - + {% if job.endDate %} + + {% else %} + Present + {% endif %} + · {{ job.location }} +

+ + {% if job.description %} +

{{ job.description }}

+ {% endif %} + + {% if job.highlights %} +
    + {% for highlight in job.highlights %} +
  • {{ highlight }}
  • + {% endfor %} +
+ {% endif %} +
+ {% endfor %} +
+
+{% endif %} + +{# Projects Section - only show if data exists #} +{% if cv.projects and cv.projects.length %} +
+

Projects

+ +
+ {% for project in cv.projects %} +
+

+ {% if project.url %} + + {{ project.name }} + + {% else %} + {{ project.name }} + {% endif %} +

+ +

{{ project.description }}

+ +
+ {% for tech in project.technologies %} + {{ tech }} + {% endfor %} +
+ + {% if project.status == "active" %} + Active + {% endif %} +
+ {% endfor %} +
+
+{% endif %} + +{# Skills Section - only show if data exists #} +{% if cv.skills and (cv.skills | dictsort | length) %} +
+

Skills

+ +
+ {% for category, skills in cv.skills %} +
+

+ {{ category }} +

+
+ {% for skill in skills %} + {{ skill }} + {% endfor %} +
+
+ {% endfor %} +
+
+{% endif %} + +{# Education & Languages - only show if data exists #} +{% if (cv.education and cv.education.length) or (cv.languages and cv.languages.length) %} +
+ {# Education #} + {% if cv.education and cv.education.length %} +
+

Education

+ {% for edu in cv.education %} +
+

{{ edu.degree }}

+

{{ edu.institution }}

+

{{ edu.year }} · {{ edu.location }}

+
+ {% endfor %} +
+ {% endif %} + + {# Languages #} + {% if cv.languages and cv.languages.length %} +
+

Languages

+
    + {% for lang in cv.languages %} +
  • + {{ lang.name }} + {{ lang.level }} +
  • + {% endfor %} +
+
+ {% endif %} +
+{% endif %} + +{# Interests - only show if data exists #} +{% if cv.interests and cv.interests.length %} +
+

Interests

+
+ {% for interest in cv.interests %} + {{ interest }} + {% endfor %} +
+
+{% endif %} + +{# Last Updated - only show if CV has content #} +{% if cv.lastUpdated and (cv.experience.length or cv.projects.length) %} +

+ Last updated: {{ cv.lastUpdated }} +

+{% endif %} diff --git a/_includes/layouts/post.njk b/_includes/layouts/post.njk new file mode 100644 index 0000000..d7d7bcb --- /dev/null +++ b/_includes/layouts/post.njk @@ -0,0 +1,123 @@ +--- +layout: layouts/base.njk +withBlogSidebar: true +--- +
+ {% if title %} +

{{ title }}

+ {% endif %} + + + + {# Bridgy syndication content - controls what gets posted to social networks #} + {# Uses description/summary if available, otherwise first 280 chars of content #} + {% set bridgySummary = description or summary or (content | ogDescription(280)) %} + {% if bridgySummary %} + + {% endif %} + +
+ {{ content | safe }} +
+ + {# Rich reply context with h-cite microformat #} + {% include "components/reply-context.njk" %} + + {# Syndication Footer - shows where this post was also published #} + {% if syndication %} + + {% endif %} + + + + {# Author h-card for IndieWeb authorship #} + + + {# JSON-LD Structured Data for SEO #} + {% set postImage = photo or image or (content | extractFirstImage) %} + {% set postDesc = description | default(content | ogDescription(160)) %} + +
+ +{# Webmentions display - likes, reposts, replies #} +{% include "components/webmentions.njk" %} diff --git a/about.njk b/about.njk new file mode 100644 index 0000000..b182335 --- /dev/null +++ b/about.njk @@ -0,0 +1,68 @@ +--- +layout: layouts/base.njk +title: About +permalink: /about/ +--- +
+
+ {{ site.author.name }} +
+

+ {{ site.author.name }} +

+ {% if site.author.title %} +

+ {{ site.author.title }} +

+ {% endif %} + {% if site.author.location %} +

+ {{ site.author.location }} +

+ {% endif %} + +
+
+ +
+

{{ site.author.bio }}

+ +

About This Site

+

+ This site is powered by Indiekit, an IndieWeb + server that supports Micropub, Webmentions, and other IndieWeb standards. It runs on + Cloudron for easy self-hosting. +

+ +

IndieWeb

+

+ I'm part of the IndieWeb movement - owning my content + and identity online. You can interact with my posts through Webmentions - reply, like, + or repost from your own website and it will show up here. +

+ + {% if site.social.length > 0 %} +

Connect

+

Find me on:

+ + {% endif %} + + {% if site.author.email %} +

+ Or send me an email at + {{ site.author.email }} +

+ {% endif %} +
+
diff --git a/articles.njk b/articles.njk new file mode 100644 index 0000000..a13cb40 --- /dev/null +++ b/articles.njk @@ -0,0 +1,92 @@ +--- +layout: layouts/base.njk +title: Articles +withSidebar: true +pagination: + data: collections.articles + size: 20 + alias: paginatedArticles +permalink: "articles/{% if pagination.pageNumber > 0 %}page/{{ pagination.pageNumber + 1 }}/{% endif %}" +--- +
+

Articles

+

+ Long-form posts and essays. + ({{ collections.articles.length }} total) +

+ + {% if paginatedArticles.length > 0 %} +
    + {% for post in paginatedArticles %} +
  • +
    +

    + + {{ post.data.title or "Untitled" }} + +

    +
    + +

    + {{ post.templateContent | striptags | truncate(250) }} +

    + + Read more → + +
  • + {% endfor %} +
+ + {# Pagination controls #} + {% if pagination.pages.length > 1 %} + + {% endif %} + + {% else %} +

No articles yet.

+ {% endif %} +
diff --git a/blog.njk b/blog.njk new file mode 100644 index 0000000..0b8ca0b --- /dev/null +++ b/blog.njk @@ -0,0 +1,130 @@ +--- +layout: layouts/base.njk +title: Blog +withSidebar: true +pagination: + data: collections.posts + size: 20 + alias: paginatedPosts +permalink: "blog/{% if pagination.pageNumber > 0 %}page/{{ pagination.pageNumber + 1 }}/{% endif %}" +--- +
+

Blog

+

+ All posts including articles and notes. + ({{ collections.posts.length }} total) +

+ + {% if paginatedPosts.length > 0 %} +
    + {% for post in paginatedPosts %} +
  • + {# Article with title #} + {% if post.data.title %} +
    +

    + + {{ post.data.title }} + +

    + +
    +

    + {{ post.templateContent | striptags | truncate(250) }} +

    + + Read more → + + + {# Note without title #} + {% else %} +
    + + + + {% if post.data.category %} + + {% if post.data.category is string %} + {{ post.data.category }} + {% else %} + {% for cat in post.data.category %} + {{ cat }} + {% endfor %} + {% endif %} + + {% endif %} +
    +
    + {{ post.templateContent | safe }} +
    + + {% endif %} +
  • + {% endfor %} +
+ + {# Pagination controls #} + {% if pagination.pages.length > 1 %} + + {% endif %} + + {% else %} +

No posts yet. Create your first post using a Micropub client!

+

Some popular Micropub clients:

+ + {% endif %} +
diff --git a/bookmarks.njk b/bookmarks.njk new file mode 100644 index 0000000..070500d --- /dev/null +++ b/bookmarks.njk @@ -0,0 +1,29 @@ +--- +layout: layouts/base.njk +title: Bookmarks +permalink: /bookmarks/ +--- +

Bookmarks

+ +{% if collections.bookmarks.length > 0 %} + +{% else %} +

No bookmarks yet.

+{% endif %} diff --git a/categories-index.njk b/categories-index.njk new file mode 100644 index 0000000..1875dbd --- /dev/null +++ b/categories-index.njk @@ -0,0 +1,27 @@ +--- +layout: layouts/base.njk +title: Categories +withSidebar: true +permalink: categories/ +--- +
+

Categories

+

+ Browse posts by category. + ({{ collections.categories.length }} categories) +

+ + {% if collections.categories.length > 0 %} +
    + {% for cat in collections.categories %} +
  • + + {{ cat }} + +
  • + {% endfor %} +
+ {% else %} +

No categories yet.

+ {% endif %} +
diff --git a/categories.njk b/categories.njk new file mode 100644 index 0000000..da037ad --- /dev/null +++ b/categories.njk @@ -0,0 +1,69 @@ +--- +layout: layouts/base.njk +withSidebar: true +pagination: + data: collections.categories + size: 1 + alias: category +permalink: "categories/{{ category | slugify }}/" +eleventyComputed: + title: "{{ category }}" +--- +
+

{{ category }}

+

+ Posts tagged with "{{ category }}". +

+ + {% set categoryPosts = [] %} + {% for post in collections.posts %} + {% if post.data.category %} + {% if post.data.category is string %} + {% if post.data.category == category %} + {% set categoryPosts = (categoryPosts.push(post), categoryPosts) %} + {% endif %} + {% else %} + {% if category in post.data.category %} + {% set categoryPosts = (categoryPosts.push(post), categoryPosts) %} + {% endif %} + {% endif %} + {% endif %} + {% endfor %} + + {% if categoryPosts.length > 0 %} +

{{ categoryPosts.length }} post{% if categoryPosts.length != 1 %}s{% endif %}

+ + {% else %} +

No posts found with this category.

+ {% endif %} + + +
diff --git a/css/tailwind.css b/css/tailwind.css new file mode 100644 index 0000000..8c9b8e6 --- /dev/null +++ b/css/tailwind.css @@ -0,0 +1,317 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* Accessibility utilities */ +@layer utilities { + .visually-hidden { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; + } + + .skip-link { + @apply absolute -top-full left-0 z-50 bg-primary-600 text-white px-4 py-2; + } + + .skip-link:focus { + @apply top-0; + } +} + +/* Reduce motion for accessibility */ +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } +} + +/* Dark mode body background */ +@layer base { + body { + @apply bg-white dark:bg-surface-950 text-surface-900 dark:text-surface-100; + } +} + +/* Layout styles */ +@layer components { + /* Site header */ + .site-header { + @apply bg-white dark:bg-surface-900 border-b border-surface-200 dark:border-surface-700 py-4 sticky top-0 z-50; + } + + .header-container { + @apply flex items-center justify-between; + } + + .site-title { + @apply text-xl font-bold text-surface-900 dark:text-white no-underline hover:text-primary-600 dark:hover:text-primary-400 transition-colors; + } + + /* Header actions (nav + theme toggle) */ + .header-actions { + @apply hidden md:flex items-center gap-4; + } + + .site-nav { + @apply flex items-center gap-4; + } + + .site-nav a { + @apply text-surface-600 dark:text-surface-400 hover:text-primary-600 dark:hover:text-primary-400 no-underline transition-colors py-2; + } + + /* Mobile menu toggle button */ + .menu-toggle { + @apply md:hidden p-2 rounded-lg text-surface-600 dark:text-surface-400 hover:bg-surface-100 dark:hover:bg-surface-800 transition-colors; + } + + /* Mobile navigation dropdown */ + .mobile-nav { + @apply md:hidden border-t border-surface-200 dark:border-surface-700 bg-white dark:bg-surface-900; + } + + .mobile-nav a { + @apply block px-4 py-3 text-surface-600 dark:text-surface-400 hover:bg-surface-100 dark:hover:bg-surface-800 hover:text-primary-600 dark:hover:text-primary-400 no-underline transition-colors border-b border-surface-100 dark:border-surface-800 last:border-b-0; + } + + /* Theme toggle button */ + .theme-toggle { + @apply p-2 rounded-lg text-surface-600 dark:text-surface-400 hover:bg-surface-100 dark:hover:bg-surface-800 transition-colors; + } + + .theme-toggle .sun-icon { + @apply hidden; + } + + .theme-toggle .moon-icon { + @apply block; + } + + .dark .theme-toggle .sun-icon { + @apply block; + } + + .dark .theme-toggle .moon-icon { + @apply hidden; + } + + /* Container */ + .container { + @apply max-w-5xl mx-auto px-4; + } + + /* Site footer */ + .site-footer { + @apply mt-12 py-8 border-t border-surface-200 dark:border-surface-700 text-center text-sm text-surface-500; + } + + .site-footer a { + @apply text-primary-600 dark:text-primary-400 hover:underline; + } + + /* Layout with sidebar - mobile-first with responsive grid */ + .layout-with-sidebar { + @apply grid gap-6 md:gap-8 lg:grid-cols-3; + } + + .main-content { + @apply lg:col-span-2 min-w-0; /* min-w-0 prevents flex/grid overflow */ + } + + .sidebar { + @apply space-y-6 lg:sticky lg:top-24 lg:self-start; + } + + /* Main content area - adjust padding for mobile */ + main.container { + @apply py-6 md:py-8; + } +} + +/* Custom component styles */ +@layer components { + /* Post list */ + .post-list { + @apply list-none p-0 m-0 space-y-6; + } + + .post-list li { + @apply pb-6 border-b border-surface-200 dark:border-surface-700 last:border-0; + } + + /* Post meta */ + .post-meta { + @apply text-sm text-surface-600 dark:text-surface-400 flex flex-wrap gap-2 items-center; + } + + /* Category tags */ + .p-category { + @apply inline-block px-2 py-0.5 text-xs bg-primary-100 dark:bg-primary-900 text-primary-800 dark:text-primary-200 rounded; + } + + /* Webmention styles */ + .webmention-likes .avatar-row { + @apply flex flex-wrap gap-1; + } + + .webmention-likes img { + @apply w-8 h-8 rounded-full; + } + + /* GitHub components */ + .repo-card { + @apply p-4 border border-surface-200 dark:border-surface-700 rounded-lg; + } + + .repo-meta { + @apply flex gap-4 text-sm text-surface-600 dark:text-surface-400 mt-2; + } + + /* Timeline for CV */ + .timeline { + @apply relative pl-6 border-l-2 border-primary-500; + } + + .timeline-item { + @apply relative pb-6 last:pb-0; + } + + .timeline-item::before { + content: ''; + @apply absolute -left-[calc(1.5rem+5px)] top-1.5 w-3 h-3 bg-primary-500 rounded-full; + } + + /* Skills badges */ + .skill-badge { + @apply inline-block px-3 py-1 text-sm bg-surface-100 dark:bg-surface-800 rounded-full; + } + + /* Widget cards */ + .widget { + @apply p-4 bg-surface-100 dark:bg-surface-800 rounded-lg; + } + + .widget-title { + @apply font-bold text-lg mb-4; + } + + /* Post cards */ + .post-card { + @apply p-5 bg-white dark:bg-surface-800 rounded-lg border border-surface-200 dark:border-surface-700 shadow-sm; + } + + .post-header { + @apply flex flex-wrap items-center gap-2; + } + + .post-footer { + @apply pt-3 border-t border-surface-100 dark:border-surface-700; + } + + /* Pagination */ + .pagination { + @apply mt-12 pt-8 border-t border-surface-200 dark:border-surface-700 flex flex-col sm:flex-row items-center justify-between gap-4; + } + + .pagination-info { + @apply text-sm text-surface-600 dark:text-surface-400; + } + + .pagination-links { + @apply flex items-center gap-2; + } + + .pagination-link { + @apply inline-flex items-center gap-1 px-4 py-2 text-sm font-medium bg-surface-100 dark:bg-surface-800 rounded-lg hover:bg-surface-200 dark:hover:bg-surface-700 transition-colors; + } + + .pagination-link.disabled { + @apply opacity-50 cursor-not-allowed hover:bg-surface-100 dark:hover:bg-surface-800; + } +} + +/* Focus states */ +@layer base { + a:focus-visible, + button:focus-visible, + input:focus-visible, + textarea:focus-visible, + select:focus-visible { + @apply outline-2 outline-offset-2 outline-primary-500; + } +} + +/* Video embeds */ +@layer components { + .video-embed { + @apply relative w-full aspect-video my-4; + } + + .video-embed iframe { + @apply absolute inset-0 w-full h-full rounded-lg; + } +} + +/* Performance: content-visibility for off-screen rendering optimization */ +@layer utilities { + .content-auto { + content-visibility: auto; + contain-intrinsic-size: auto 500px; + } +} + +/* Apply content-visibility to images and post items for performance */ +@layer base { + /* Responsive typography */ + html { + @apply text-base md:text-lg; + } + + /* Prevent horizontal overflow */ + body { + @apply overflow-x-hidden; + } + + /* Images - prevent overflow and add content-visibility */ + img { + @apply max-w-full h-auto; + content-visibility: auto; + } + + /* Pre/code blocks - prevent overflow on mobile */ + pre { + @apply overflow-x-auto max-w-full; + } + + code { + @apply break-words; + } + + /* Links in content - break long URLs */ + .e-content a, + .prose a { + @apply break-words; + word-break: break-word; + } + + article { + scroll-margin-top: 80px; /* Prevent header overlap when scrolling to anchors */ + } + + .post-list li { + content-visibility: auto; + contain-intrinsic-size: auto 200px; + } +} diff --git a/eleventy.config.js b/eleventy.config.js new file mode 100644 index 0000000..1049ea1 --- /dev/null +++ b/eleventy.config.js @@ -0,0 +1,360 @@ +import pluginWebmentions from "@chrisburnell/eleventy-cache-webmentions"; +import pluginRss from "@11ty/eleventy-plugin-rss"; +import embedEverything from "eleventy-plugin-embed-everything"; +import { eleventyImageTransformPlugin } from "@11ty/eleventy-img"; +import sitemap from "@quasibit/eleventy-plugin-sitemap"; +import markdownIt from "markdown-it"; +import { minify } from "html-minifier-terser"; +import { createHash } from "crypto"; +import { readFileSync } from "fs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const siteUrl = process.env.SITE_URL || "https://example.com"; + +export default function (eleventyConfig) { + // Ignore output directory (prevents re-processing generated files via symlink) + eleventyConfig.ignores.add("_site"); + eleventyConfig.ignores.add("_site/**"); + + // Configure markdown-it with linkify enabled (auto-convert URLs to links) + const md = markdownIt({ + html: true, + linkify: true, // Auto-convert URLs to clickable links + typographer: true, + }); + eleventyConfig.setLibrary("md", md); + + // RSS plugin for feed filters (dateToRfc822, absoluteUrl, etc.) + // Custom feed templates in feed.njk and feed-json.njk use these filters + eleventyConfig.addPlugin(pluginRss); + + // JSON encode filter for JSON feed + eleventyConfig.addFilter("jsonEncode", (value) => { + return JSON.stringify(value); + }); + + // Alias dateToRfc822 (plugin provides dateToRfc2822) + eleventyConfig.addFilter("dateToRfc822", (date) => { + return pluginRss.dateToRfc2822(date); + }); + + // Embed Everything - auto-embed YouTube, Vimeo, Bluesky, Mastodon, etc. + eleventyConfig.addPlugin(embedEverything, { + use: ["youtube", "vimeo", "twitter", "mastodon", "bluesky", "spotify", "soundcloud"], + youtube: { + options: { + lite: false, + recommendSelfOnly: true, + }, + }, + mastodon: { + options: { + server: "mstdn.social", + }, + }, + }); + + // Custom transform to convert YouTube links to embeds + eleventyConfig.addTransform("youtube-link-to-embed", function (content, outputPath) { + if (!outputPath || !outputPath.endsWith(".html")) { + return content; + } + // Match tags where href contains youtube.com/watch or youtu.be + // Link text can be: URL, www.youtube..., youtube..., or youtube-related text + const youtubePattern = /]+href="https?:\/\/(?:www\.)?(?:youtube\.com\/watch\?v=|youtu\.be\/)([a-zA-Z0-9_-]+)[^"]*"[^>]*>(?:https?:\/\/)?(?:www\.)?[^<]*(?:youtube|youtu\.be)[^<]*<\/a>/gi; + + content = content.replace(youtubePattern, (match, videoId) => { + // Use standard YouTube iframe with exact oEmbed parameters + return `

`; + }); + + // Clean up empty

tags created by the replacement + content = content.replace(/

\s*<\/p>/g, ''); + + return content; + }); + + // Image optimization - transforms tags automatically + eleventyConfig.addPlugin(eleventyImageTransformPlugin, { + extensions: "html", + formats: ["webp", "jpeg"], + widths: ["auto"], + failOnError: false, + defaultAttributes: { + loading: "lazy", + decoding: "async", + sizes: "auto", + alt: "", + }, + }); + + // Sitemap generation + eleventyConfig.addPlugin(sitemap, { + sitemap: { + hostname: siteUrl, + }, + }); + + // HTML minification for production builds + eleventyConfig.addTransform("htmlmin", async function (content, outputPath) { + if (outputPath && outputPath.endsWith(".html")) { + return await minify(content, { + collapseWhitespace: true, + removeComments: true, + html5: true, + decodeEntities: true, + minifyCSS: true, + minifyJS: true, + }); + } + return content; + }); + + // Copy static assets to output + eleventyConfig.addPassthroughCopy("css"); + eleventyConfig.addPassthroughCopy("images"); + + // Watch for content changes + eleventyConfig.addWatchTarget("./content/"); + eleventyConfig.addWatchTarget("./css/"); + + // Webmentions plugin configuration + const wmDomain = siteUrl.replace("https://", "").replace("http://", ""); + eleventyConfig.addPlugin(pluginWebmentions, { + domain: siteUrl, + feed: `https://webmention.io/api/mentions.jf2?domain=${wmDomain}&token=${process.env.WEBMENTION_IO_TOKEN}`, + key: "children", + }); + + // Date formatting filter + eleventyConfig.addFilter("dateDisplay", (dateObj) => { + if (!dateObj) return ""; + const date = new Date(dateObj); + return date.toLocaleDateString("en-GB", { + year: "numeric", + month: "long", + day: "numeric", + }); + }); + + // ISO date filter + eleventyConfig.addFilter("isoDate", (dateObj) => { + if (!dateObj) return ""; + return new Date(dateObj).toISOString(); + }); + + // Truncate filter + eleventyConfig.addFilter("truncate", (str, len = 200) => { + if (!str) return ""; + if (str.length <= len) return str; + return str.slice(0, len).trim() + "..."; + }); + + // Clean excerpt for OpenGraph - strips HTML, decodes entities, removes extra whitespace + eleventyConfig.addFilter("ogDescription", (content, len = 200) => { + if (!content) return ""; + // Strip HTML tags + let text = content.replace(/<[^>]+>/g, ' '); + // Decode common HTML entities + text = text.replace(/&/g, '&') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/ /g, ' '); + // Remove extra whitespace + text = text.replace(/\s+/g, ' ').trim(); + // Truncate + if (text.length > len) { + text = text.slice(0, len).trim() + "..."; + } + return text; + }); + + // Extract first image from content for OpenGraph fallback + eleventyConfig.addFilter("extractFirstImage", (content) => { + if (!content) return null; + // Match tags and extract src attribute + const imgMatch = content.match(/]+src=["']([^"']+)["']/i); + if (imgMatch && imgMatch[1]) { + let src = imgMatch[1]; + // Skip data URIs and external placeholder images + if (src.startsWith('data:')) return null; + // Return the src (will be made absolute in template) + return src; + } + return null; + }); + + // Head filter for arrays + eleventyConfig.addFilter("head", (array, n) => { + if (!Array.isArray(array) || n < 1) return array; + return array.slice(0, n); + }); + + // Slugify filter + eleventyConfig.addFilter("slugify", (str) => { + if (!str) return ""; + return str + .toLowerCase() + .replace(/[^\w\s-]/g, "") + .replace(/[\s_-]+/g, "-") + .replace(/^-+|-+$/g, ""); + }); + + // Hash filter for cache busting - generates MD5 hash of file content + eleventyConfig.addFilter("hash", (filePath) => { + try { + const fullPath = resolve(__dirname, filePath.startsWith("/") ? `.${filePath}` : filePath); + const content = readFileSync(fullPath); + return createHash("md5").update(content).digest("hex").slice(0, 8); + } catch { + // Return timestamp as fallback if file not found + return Date.now().toString(36); + } + }); + + // Date filter (for sidebar dates) + eleventyConfig.addFilter("date", (dateObj, format) => { + if (!dateObj) return ""; + const date = new Date(dateObj); + const options = {}; + + if (format.includes("MMM")) options.month = "short"; + if (format.includes("d")) options.day = "numeric"; + if (format.includes("yyyy")) options.year = "numeric"; + + return date.toLocaleDateString("en-US", options); + }); + + // Webmention filters + eleventyConfig.addFilter("webmentionsForUrl", function (webmentions, url) { + if (!webmentions || !url) return []; + const absoluteUrl = url.startsWith("http") + ? url + : `${siteUrl}${url}`; + return webmentions.filter( + (wm) => + wm["wm-target"] === absoluteUrl || + wm["wm-target"] === absoluteUrl.replace(/\/$/, "") + ); + }); + + eleventyConfig.addFilter("webmentionsByType", function (mentions, type) { + if (!mentions) return []; + const typeMap = { + likes: "like-of", + reposts: "repost-of", + bookmarks: "bookmark-of", + replies: "in-reply-to", + mentions: "mention-of", + }; + const wmProperty = typeMap[type] || type; + return mentions.filter((m) => m["wm-property"] === wmProperty); + }); + + // Collections for different post types + // Note: content path is content/ due to symlink structure + // "posts" shows ALL content types combined + eleventyConfig.addCollection("posts", function (collectionApi) { + return collectionApi + .getFilteredByGlob("content/**/*.md") + .sort((a, b) => b.date - a.date); + }); + + eleventyConfig.addCollection("notes", function (collectionApi) { + return collectionApi + .getFilteredByGlob("content/notes/**/*.md") + .sort((a, b) => b.date - a.date); + }); + + eleventyConfig.addCollection("articles", function (collectionApi) { + return collectionApi + .getFilteredByGlob("content/articles/**/*.md") + .sort((a, b) => b.date - a.date); + }); + + eleventyConfig.addCollection("bookmarks", function (collectionApi) { + return collectionApi + .getFilteredByGlob("content/bookmarks/**/*.md") + .sort((a, b) => b.date - a.date); + }); + + eleventyConfig.addCollection("photos", function (collectionApi) { + return collectionApi + .getFilteredByGlob("content/photos/**/*.md") + .sort((a, b) => b.date - a.date); + }); + + eleventyConfig.addCollection("likes", function (collectionApi) { + return collectionApi + .getFilteredByGlob("content/likes/**/*.md") + .sort((a, b) => b.date - a.date); + }); + + // Replies collection - posts with in_reply_to property + eleventyConfig.addCollection("replies", function (collectionApi) { + return collectionApi + .getAll() + .filter((item) => item.data.in_reply_to) + .sort((a, b) => b.date - a.date); + }); + + // Reposts collection - posts with repost_of property + eleventyConfig.addCollection("reposts", function (collectionApi) { + return collectionApi + .getAll() + .filter((item) => item.data.repost_of) + .sort((a, b) => b.date - a.date); + }); + + // All content combined for homepage feed + eleventyConfig.addCollection("feed", function (collectionApi) { + return collectionApi + .getFilteredByGlob("content/**/*.md") + .sort((a, b) => b.date - a.date) + .slice(0, 20); + }); + + // Categories collection - deduplicated by slug to avoid duplicate permalinks + eleventyConfig.addCollection("categories", function (collectionApi) { + const categoryMap = new Map(); // slug -> original name (first seen) + const slugify = (str) => str.toLowerCase().replace(/[^\w\s-]/g, "").replace(/[\s_-]+/g, "-").replace(/^-+|-+$/g, ""); + + collectionApi.getAll().forEach((item) => { + if (item.data.category) { + const cats = Array.isArray(item.data.category) ? item.data.category : [item.data.category]; + cats.forEach((cat) => { + if (cat && typeof cat === 'string' && cat.trim()) { + const slug = slugify(cat.trim()); + if (slug && !categoryMap.has(slug)) { + categoryMap.set(slug, cat.trim()); + } + } + }); + } + }); + return [...categoryMap.values()].sort(); + }); + + // Recent posts for sidebar + eleventyConfig.addCollection("recentPosts", function (collectionApi) { + return collectionApi + .getFilteredByGlob("content/posts/**/*.md") + .sort((a, b) => b.date - a.date) + .slice(0, 5); + }); + + return { + dir: { + input: ".", + output: "_site", + includes: "_includes", + data: "_data", + }, + markdownTemplateEngine: false, // Disable to avoid Nunjucks interpreting {{ in content + htmlTemplateEngine: "njk", + }; +} diff --git a/feed-json.njk b/feed-json.njk new file mode 100644 index 0000000..c84e79c --- /dev/null +++ b/feed-json.njk @@ -0,0 +1,34 @@ +--- +permalink: /feed.json +eleventyExcludeFromCollections: true +--- +{ + "version": "https://jsonfeed.org/version/1.1", + "title": "{{ site.name }}", + "home_page_url": "{{ site.url }}/", + "feed_url": "{{ site.url }}/feed.json", + "description": "{{ site.description }}", + "language": "{{ site.locale | default('en') }}", + "authors": [ + { + "name": "{{ site.author | default('Ricardo Mendes') }}", + "url": "{{ site.url }}/" + } + ], + "items": [ + {%- for post in collections.feed %} + {%- set absolutePostUrl = site.url + post.url %} + {%- set postImage = post.data.photo or post.data.image or (post.content | extractFirstImage) %} + { + "id": "{{ absolutePostUrl }}", + "url": "{{ absolutePostUrl }}", + "title": {{ post.data.title | default(post.content | striptags | truncate(80)) | jsonEncode | safe }}, + "content_html": {{ post.content | htmlToAbsoluteUrls(absolutePostUrl) | jsonEncode | safe }}, + "date_published": "{{ post.date | dateToRfc3339 }}" + {%- if postImage %}, + "image": "{{ postImage | url | absoluteUrl(site.url) }}" + {%- endif %} + }{% if not loop.last %},{% endif %} + {%- endfor %} + ] +} diff --git a/feed.njk b/feed.njk new file mode 100644 index 0000000..7582d2a --- /dev/null +++ b/feed.njk @@ -0,0 +1,31 @@ +--- +permalink: /feed.xml +eleventyExcludeFromCollections: true +--- + + + + {{ site.name }} + {{ site.url }}/ + {{ site.description }} + {{ site.locale | default('en') }} + + {{ collections.feed | getNewestCollectionItemDate | dateToRfc822 }} + {%- for post in collections.feed %} + {%- set absolutePostUrl = site.url + post.url %} + {%- set postImage = post.data.photo or post.data.image or (post.content | extractFirstImage) %} + + {{ post.data.title | default(post.content | striptags | truncate(80)) | escape }} + {{ absolutePostUrl }} + {{ absolutePostUrl }} + {{ post.date | dateToRfc822 }} + {{ post.content | htmlToAbsoluteUrls(absolutePostUrl) | escape }} + {%- if postImage %} + {%- set imageUrl = postImage | url | absoluteUrl(site.url) %} + + + {%- endif %} + + {%- endfor %} + + diff --git a/funkwhale.njk b/funkwhale.njk new file mode 100644 index 0000000..2a121b4 --- /dev/null +++ b/funkwhale.njk @@ -0,0 +1,268 @@ +--- +layout: layouts/base.njk +title: Funkwhale Listening Activity +permalink: /funkwhale/ +withSidebar: true +--- +

+
+

Listening Activity

+

+ What I've been listening to on + + Funkwhale + +

+
+ + {# Now Playing / Recently Played Hero #} + {% if funkwhaleActivity.nowPlaying and funkwhaleActivity.nowPlaying.status %} +
+
+
+ {% if funkwhaleActivity.nowPlaying.coverUrl %} + + {% else %} +
+ + + +
+ {% endif %} + +
+
+ {% if funkwhaleActivity.nowPlaying.status == 'now-playing' %} + + + + + + + Now Playing + + {% else %} + + + Recently Played + + {% endif %} +
+ +

+ {% if funkwhaleActivity.nowPlaying.trackUrl %} + + {{ funkwhaleActivity.nowPlaying.track }} + + {% else %} + {{ funkwhaleActivity.nowPlaying.track }} + {% endif %} +

+

{{ funkwhaleActivity.nowPlaying.artist }}

+ {% if funkwhaleActivity.nowPlaying.album %} +

{{ funkwhaleActivity.nowPlaying.album }}

+ {% endif %} +

{{ funkwhaleActivity.nowPlaying.relativeTime }}

+
+
+
+
+ {% endif %} + + {# Stats Section with Tabs #} + {% if funkwhaleActivity.stats %} +
+

+ + + + Listening Statistics +

+ + {# Tab buttons #} +
+ + + + +
+ + {# All Time Tab #} +
+ {% set summary = funkwhaleActivity.stats.summary.all %} + {% set topArtists = funkwhaleActivity.stats.topArtists.all %} + {% set topAlbums = funkwhaleActivity.stats.topAlbums.all %} + {% include "components/funkwhale-stats-content.njk" %} +
+ + {# This Month Tab #} +
+ {% set summary = funkwhaleActivity.stats.summary.month %} + {% set topArtists = funkwhaleActivity.stats.topArtists.month %} + {% set topAlbums = funkwhaleActivity.stats.topAlbums.month %} + {% include "components/funkwhale-stats-content.njk" %} +
+ + {# This Week Tab #} +
+ {% set summary = funkwhaleActivity.stats.summary.week %} + {% set topArtists = funkwhaleActivity.stats.topArtists.week %} + {% set topAlbums = funkwhaleActivity.stats.topAlbums.week %} + {% include "components/funkwhale-stats-content.njk" %} +
+ + {# Trends Tab #} +
+ {% if funkwhaleActivity.stats.trends and funkwhaleActivity.stats.trends.length %} +
+

Daily Listening (Last 30 Days)

+
+ {% set maxCount = 1 %} + {% for day in funkwhaleActivity.stats.trends %} + {% if day.count > maxCount %} + {% set maxCount = day.count %} + {% endif %} + {% endfor %} + {% for day in funkwhaleActivity.stats.trends %} +
+ {% endfor %} +
+
+ {{ funkwhaleActivity.stats.trends[0].date }} + {{ funkwhaleActivity.stats.trends[funkwhaleActivity.stats.trends.length - 1].date }} +
+
+ {% else %} +

No trend data available yet.

+ {% endif %} +
+
+ {% endif %} + + {# Recent Listenings #} +
+

+ + + + Recent Listens +

+ + {% if funkwhaleActivity.listenings.length %} +
+ {% for listening in funkwhaleActivity.listenings | head(15) %} +
+ {% if listening.coverUrl %} + + {% else %} +
+ + + +
+ {% endif %} + +
+

+ {% if listening.trackUrl %} + + {{ listening.track }} + + {% else %} + {{ listening.track }} + {% endif %} +

+

{{ listening.artist }}

+
+ +
+ {{ listening.relativeTime }} + {% if listening.duration %} + {{ listening.duration }} + {% endif %} +
+
+ {% endfor %} +
+ {% else %} +

No recent listening history available.

+ {% endif %} +
+ + {# Favorites #} + {% if funkwhaleActivity.favorites.length %} +
+

+ + + + Favorite Tracks +

+ +
+ {% for favorite in funkwhaleActivity.favorites | head(10) %} +
+ {% if favorite.coverUrl %} + + {% else %} +
+ + + +
+ {% endif %} + +
+

+ {% if favorite.trackUrl %} + + {{ favorite.track }} + + {% else %} + {{ favorite.track }} + {% endif %} +

+

{{ favorite.artist }}

+ {% if favorite.album %} +

{{ favorite.album }}

+ {% endif %} +
+
+ {% endfor %} +
+
+ {% endif %} +
diff --git a/github.njk b/github.njk new file mode 100644 index 0000000..5d68cca --- /dev/null +++ b/github.njk @@ -0,0 +1,266 @@ +--- +layout: layouts/base.njk +title: GitHub Activity +permalink: /github/ +withSidebar: true +--- +
+
+

GitHub Activity

+

+ My open source contributions and starred repositories. + + Follow me on GitHub + +

+
+ + {# Featured Projects Section #} + {% if githubActivity.featured.length %} +
+

+ + + + Featured Projects +

+ +
+ {% for repo in githubActivity.featured %} +
+
+

+ + {{ repo.fullName }} + +

+ {% if repo.isPrivate %} + Private + {% endif %} +
+ + {% if repo.description %} +

{{ repo.description }}

+ {% endif %} + +
+ {% if repo.language %} + + + {{ repo.language }} + + {% endif %} + + + + + {{ repo.stars }} + + {% if repo.forks > 0 %} + + + + + {{ repo.forks }} + + {% endif %} +
+ + {% if repo.commits and repo.commits.length %} +
+ + Recent commits ({{ repo.commits.length }}) + +
    + {% for commit in repo.commits %} +
  • + + {{ commit.sha }} + + {{ commit.message }} +
  • + {% endfor %} +
+
+ {% endif %} +
+ {% endfor %} +
+
+ {% endif %} + + {# Starred Repos Section #} +
+

+ + + + Starred Repositories +

+ + {% if githubActivity.stars.length %} +
+ {% for repo in githubActivity.stars | head(10) %} +
+

+ + {{ repo.name }} + +

+ + {% if repo.description %} +

{{ repo.description }}

+ {% endif %} + +
+ {% for topic in repo.topics %} + + {{ topic }} + + {% endfor %} +
+ +
+ {% if repo.language %} + + + {{ repo.language }} + + {% endif %} + + + + + {{ repo.stars }} + +
+
+ {% endfor %} +
+ {% else %} +

No starred repositories found.

+ {% endif %} +
+ + {# Recent Commits Section #} +
+

+ + + + Recent Commits +

+ + {% if githubActivity.commits.length %} +
+ {% for commit in githubActivity.commits %} +
+ + {{ commit.sha }} + +
+ + {{ commit.message }} + +

+ {{ commit.repo }} + · {{ commit.date | date("MMM d, yyyy") }} +

+
+
+ {% endfor %} +
+ {% else %} +

No recent commits found.

+ {% endif %} +
+ + {# Contributions Section #} + {% if githubActivity.contributions.length %} +
+

+ + + + Pull Requests & Issues +

+ +
+ {% for item in githubActivity.contributions %} +
+ {% if item.type == "pr" %} + PR + {% else %} + Issue + {% endif %} +
+ + {{ item.title }} + +

+ {{ item.repo }} + #{{ item.number }} + · {{ item.date | date("MMM d, yyyy") }} +

+
+
+ {% endfor %} +
+
+ {% endif %} + + {# My Repositories Section #} +
+

+ + + + My Repositories +

+ + {% if githubRepos.length %} +
+ {% for repo in githubRepos | head(6) %} +
+

+ + {{ repo.name }} + +

+ + {% if repo.description %} +

{{ repo.description | truncate(100) }}

+ {% endif %} + +
+ {% if repo.language %} + + + {{ repo.language }} + + {% endif %} + + + + + {{ repo.stargazers_count }} + + + + + + {{ repo.forks_count }} + +
+
+ {% endfor %} +
+ + + View all repositories → + + {% else %} +

No repositories found.

+ {% endif %} +
+
diff --git a/images/default-avatar.svg b/images/default-avatar.svg new file mode 100644 index 0000000..3b15f50 --- /dev/null +++ b/images/default-avatar.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/images/og-default.png b/images/og-default.png new file mode 100644 index 0000000..bfaee94 Binary files /dev/null and b/images/og-default.png differ diff --git a/images/rick.jpg b/images/rick.jpg new file mode 100644 index 0000000..f976d6d Binary files /dev/null and b/images/rick.jpg differ diff --git a/index.njk b/index.njk new file mode 100644 index 0000000..f02224e --- /dev/null +++ b/index.njk @@ -0,0 +1,4 @@ +--- +layout: layouts/home.njk +title: Home +--- diff --git a/interactions.njk b/interactions.njk new file mode 100644 index 0000000..9b4fe86 --- /dev/null +++ b/interactions.njk @@ -0,0 +1,105 @@ +--- +layout: layouts/base.njk +title: Interactions +permalink: /interactions/ +--- + + + + +
+

About IndieWeb Interactions

+

+ These pages show different types of IndieWeb interactions I've made. Each type uses specific microformat properties + to indicate the relationship to the original content. +

+
    +
  • Likes use u-like-of
  • +
  • Replies use u-in-reply-to
  • +
  • Bookmarks use u-bookmark-of
  • +
  • Reposts use u-repost-of
  • +
+
diff --git a/likes.njk b/likes.njk new file mode 100644 index 0000000..03df191 --- /dev/null +++ b/likes.njk @@ -0,0 +1,47 @@ +--- +layout: layouts/base.njk +title: Likes +permalink: /likes/ +--- + + +{% if collections.likes.length > 0 %} + +{% else %} +

No likes yet.

+{% endif %} diff --git a/notes.njk b/notes.njk new file mode 100644 index 0000000..c9ad0e6 --- /dev/null +++ b/notes.njk @@ -0,0 +1,89 @@ +--- +layout: layouts/base.njk +title: Notes +withSidebar: true +pagination: + data: collections.notes + size: 20 + alias: paginatedNotes +permalink: "notes/{% if pagination.pageNumber > 0 %}page/{{ pagination.pageNumber + 1 }}/{% endif %}" +--- +
+

Notes

+

+ Short thoughts, updates, and quick posts. + ({{ collections.notes.length }} total) +

+ + {% if paginatedNotes.length > 0 %} +
    + {% for post in paginatedNotes %} +
  • +
    + + + + {% if post.data.category %} + + {% if post.data.category is string %} + {{ post.data.category }} + {% else %} + {% for cat in post.data.category %} + {{ cat }} + {% endfor %} + {% endif %} + + {% endif %} +
    +
    + {{ post.templateContent | safe }} +
    + +
  • + {% endfor %} +
+ + {# Pagination controls #} + {% if pagination.pages.length > 1 %} + + {% endif %} + + {% else %} +

No notes yet.

+ {% endif %} +
diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7aca266 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4514 @@ +{ + "name": "rmendes-eleventy-site", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "rmendes-eleventy-site", + "version": "1.0.0", + "dependencies": { + "@11ty/eleventy": "^3.0.0", + "@11ty/eleventy-fetch": "^4.0.1", + "@11ty/eleventy-img": "^6.0.0", + "@11ty/eleventy-plugin-rss": "^2.0.2", + "@atproto/api": "^0.12.0", + "@chrisburnell/eleventy-cache-webmentions": "^2.2.7", + "@quasibit/eleventy-plugin-sitemap": "^2.2.0", + "eleventy-plugin-embed-everything": "^1.21.0", + "html-minifier-terser": "^7.0.0", + "markdown-it": "^14.0.0", + "rss-parser": "^3.13.0" + }, + "devDependencies": { + "@tailwindcss/typography": "^0.5.0", + "autoprefixer": "^10.4.0", + "postcss": "^8.4.0", + "postcss-cli": "^11.0.0", + "tailwindcss": "^3.4.0" + } + }, + "node_modules/@11ty/dependency-tree": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-4.0.2.tgz", + "integrity": "sha512-RTF6VTZHatYf7fSZBUN3RKwiUeJh5dhWV61gDPrHhQF2/gzruAkYz8yXuvGLx3w3ZBKreGrR+MfYpSVkdbdbLA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.1" + } + }, + "node_modules/@11ty/dependency-tree-esm": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree-esm/-/dependency-tree-esm-2.0.4.tgz", + "integrity": "sha512-MYKC0Ac77ILr1HnRJalzKDlb9Z8To3kXQCltx299pUXXUFtJ1RIONtULlknknqW8cLe19DLVgmxVCtjEFm7h0A==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.7", + "acorn": "^8.15.0", + "dependency-graph": "^1.0.0", + "normalize-path": "^3.0.0" + } + }, + "node_modules/@11ty/eleventy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-3.1.2.tgz", + "integrity": "sha512-IcsDlbXnBf8cHzbM1YBv3JcTyLB35EK88QexmVyFdVJVgUU6bh9g687rpxryJirHzo06PuwnYaEEdVZQfIgRGg==", + "license": "MIT", + "dependencies": { + "@11ty/dependency-tree": "^4.0.0", + "@11ty/dependency-tree-esm": "^2.0.0", + "@11ty/eleventy-dev-server": "^2.0.8", + "@11ty/eleventy-plugin-bundle": "^3.0.6", + "@11ty/eleventy-utils": "^2.0.7", + "@11ty/lodash-custom": "^4.17.21", + "@11ty/posthtml-urls": "^1.0.1", + "@11ty/recursive-copy": "^4.0.2", + "@sindresorhus/slugify": "^2.2.1", + "bcp-47-normalize": "^2.3.0", + "chokidar": "^3.6.0", + "debug": "^4.4.1", + "dependency-graph": "^1.0.0", + "entities": "^6.0.1", + "filesize": "^10.1.6", + "gray-matter": "^4.0.3", + "iso-639-1": "^3.1.5", + "js-yaml": "^4.1.0", + "kleur": "^4.1.5", + "liquidjs": "^10.21.1", + "luxon": "^3.6.1", + "markdown-it": "^14.1.0", + "minimist": "^1.2.8", + "moo": "^0.5.2", + "node-retrieve-globals": "^6.0.1", + "nunjucks": "^3.2.4", + "picomatch": "^4.0.2", + "please-upgrade-node": "^3.2.0", + "posthtml": "^0.16.6", + "posthtml-match-helper": "^2.0.3", + "semver": "^7.7.2", + "slugify": "^1.6.6", + "tinyglobby": "^0.2.14" + }, + "bin": { + "eleventy": "cmd.cjs" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-dev-server": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-dev-server/-/eleventy-dev-server-2.0.8.tgz", + "integrity": "sha512-15oC5M1DQlCaOMUq4limKRYmWiGecDaGwryr7fTE/oM9Ix8siqMvWi+I8VjsfrGr+iViDvWcH/TVI6D12d93mA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.1", + "chokidar": "^3.6.0", + "debug": "^4.4.0", + "finalhandler": "^1.3.1", + "mime": "^3.0.0", + "minimist": "^1.2.8", + "morphdom": "^2.7.4", + "please-upgrade-node": "^3.2.0", + "send": "^1.1.0", + "ssri": "^11.0.0", + "urlpattern-polyfill": "^10.0.0", + "ws": "^8.18.1" + }, + "bin": { + "eleventy-dev-server": "cmd.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-fetch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-fetch/-/eleventy-fetch-4.0.1.tgz", + "integrity": "sha512-yIiLM5ziBmg86i4TlXpBdcIygJHvh/GgPJyAiFOckO9H4y9cQDM8eIcJCUQ4Mum0NEVui/OjhEut2R08xw0vlQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "flat-cache": "^3.0.4", + "node-fetch": "^2.6.7", + "p-queue": "^6.6.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-img": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-img/-/eleventy-img-6.0.4.tgz", + "integrity": "sha512-jSy9BmubVs0mN76dcXWfSYDgRU+1+/rq/SxUR3MgIvTUAJRDop5pFW+Z1f56CDcOlEHaiPqHgnfOlqRmJvXl7g==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-fetch": "^5.1.0", + "@11ty/eleventy-utils": "^2.0.7", + "brotli-size": "^4.0.0", + "debug": "^4.4.0", + "entities": "^6.0.0", + "image-size": "^1.2.1", + "p-queue": "^6.6.2", + "sharp": "^0.33.5" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-img/node_modules/@11ty/eleventy-fetch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-fetch/-/eleventy-fetch-5.1.1.tgz", + "integrity": "sha512-/xFJLCrqKlcnRKIfO9Qjd1QOs4IpvypljXET955+EgdRPFA+h8Or6bDnZBbcwr6KS7yeUuzp5k1DhXgbentSTA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.7", + "@rgrove/parse-xml": "^4.2.0", + "debug": "^4.4.3", + "flatted": "^3.3.3", + "p-queue": "6.6.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-plugin-bundle": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-bundle/-/eleventy-plugin-bundle-3.0.7.tgz", + "integrity": "sha512-QK1tRFBhQdZASnYU8GMzpTdsMMFLVAkuU0gVVILqNyp09xJJZb81kAS3AFrNrwBCsgLxTdWHJ8N64+OTTsoKkA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.2", + "debug": "^4.4.0", + "posthtml-match-helper": "^2.0.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-plugin-rss": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-rss/-/eleventy-plugin-rss-2.0.4.tgz", + "integrity": "sha512-LF60sGVlxGTryQe3hTifuzrwF8R7XbrNsM2xfcDcNMSliLN4kmB+7zvoLRySRx0AQDjqhPTAeeeT0ra6/9zHUQ==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.0", + "@11ty/posthtml-urls": "^1.0.1", + "debug": "^4.4.0", + "posthtml": "^0.16.6" + }, + "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", + "integrity": "sha512-6QE+duqSQ0GY9rENXYb4iPR4AYGdrFpqnmi59tFp9VrleOl0QSh8VlBr2yd6dlhkdtj7904poZW5PvGr9cMiJQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/lodash-custom": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@11ty/lodash-custom/-/lodash-custom-4.17.21.tgz", + "integrity": "sha512-Mqt6im1xpb1Ykn3nbcCovWXK3ggywRJa+IXIdoz4wIIK+cvozADH63lexcuPpGS/gJ6/m2JxyyXDyupkMr5DHw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/posthtml-urls": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@11ty/posthtml-urls/-/posthtml-urls-1.0.2.tgz", + "integrity": "sha512-0vaV3Wt0surZ+oS1VdKKe0axeeupuM+l7W/Z866WFQwF+dGg2Tc/nmhk/5l74/Y55P8KyImnLN9CdygNw2huHg==", + "license": "MIT", + "dependencies": { + "evaluate-value": "^2.0.0", + "http-equiv-refresh": "^2.0.1", + "list-to-array": "^1.1.0", + "parse-srcset": "^1.0.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@11ty/recursive-copy": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@11ty/recursive-copy/-/recursive-copy-4.0.3.tgz", + "integrity": "sha512-SX48BTLEGX8T/OsKWORsHAAeiDsbFl79Oa/0Wg/mv/d27b7trCVZs7fMHvpSgDvZz/fZqx5rDk8+nx5oyT7xBw==", + "license": "ISC", + "dependencies": { + "errno": "^1.0.0", + "junk": "^3.1.0", + "maximatch": "^0.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@atproto/api": { + "version": "0.12.29", + "resolved": "https://registry.npmjs.org/@atproto/api/-/api-0.12.29.tgz", + "integrity": "sha512-PyzPLjGWR0qNOMrmj3Nt3N5NuuANSgOk/33Bu3j+rFjjPrHvk9CI6iQPU6zuDaDCoyOTRJRafw8X/aMQw+ilgw==", + "license": "MIT", + "dependencies": { + "@atproto/common-web": "^0.3.0", + "@atproto/lexicon": "^0.4.0", + "@atproto/syntax": "^0.3.0", + "@atproto/xrpc": "^0.5.0", + "await-lock": "^2.2.2", + "multiformats": "^9.9.0", + "tlds": "^1.234.0" + } + }, + "node_modules/@atproto/common-web": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@atproto/common-web/-/common-web-0.3.2.tgz", + "integrity": "sha512-Vx0JtL1/CssJbFAb0UOdvTrkbUautsDfHNOXNTcX2vyPIxH9xOameSqLLunM1hZnOQbJwyjmQCt6TV+bhnanDg==", + "license": "MIT", + "dependencies": { + "graphemer": "^1.4.0", + "multiformats": "^9.9.0", + "uint8arrays": "3.0.0", + "zod": "^3.23.8" + } + }, + "node_modules/@atproto/lex-data": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@atproto/lex-data/-/lex-data-0.0.8.tgz", + "integrity": "sha512-1Y5tz7BkS7380QuLNXaE8GW8Xba+mRWugt8BKM4BUFYjjUZdmirU8lr72iM4XlEBrzRu8Cfvj+MbsbYaZv+IgA==", + "license": "MIT", + "dependencies": { + "@atproto/syntax": "0.4.2", + "multiformats": "^9.9.0", + "tslib": "^2.8.1", + "uint8arrays": "3.0.0", + "unicode-segmenter": "^0.14.0" + } + }, + "node_modules/@atproto/lex-data/node_modules/@atproto/syntax": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.2.tgz", + "integrity": "sha512-X9XSRPinBy/0VQ677j8VXlBsYSsUXaiqxWVpGGxJYsAhugdQRb0jqaVKJFtm6RskeNkV6y9xclSUi9UYG/COrA==", + "license": "MIT" + }, + "node_modules/@atproto/lex-json": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@atproto/lex-json/-/lex-json-0.0.8.tgz", + "integrity": "sha512-w1Qmkae1QhmNz+i1Zm3xr3jp0UPPRENmdlpU0qIrdxWDo9W4Mzkeyc3eSoa+Zs+zN8xkRSQw7RLZte/B7Ipdwg==", + "license": "MIT", + "dependencies": { + "@atproto/lex-data": "0.0.8", + "tslib": "^2.8.1" + } + }, + "node_modules/@atproto/lexicon": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.4.14.tgz", + "integrity": "sha512-jiKpmH1QER3Gvc7JVY5brwrfo+etFoe57tKPQX/SmPwjvUsFnJAow5xLIryuBaJgFAhnTZViXKs41t//pahGHQ==", + "license": "MIT", + "dependencies": { + "@atproto/common-web": "^0.4.2", + "@atproto/syntax": "^0.4.0", + "iso-datestring-validator": "^2.2.2", + "multiformats": "^9.9.0", + "zod": "^3.23.8" + } + }, + "node_modules/@atproto/lexicon/node_modules/@atproto/common-web": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/@atproto/common-web/-/common-web-0.4.12.tgz", + "integrity": "sha512-3aCJemqM/fkHQrVPbTCHCdiVstKFI+2LkFLvUhO6XZP0EqUZa/rg/CIZBKTFUWu9I5iYiaEiXL9VwcDRpEevSw==", + "license": "MIT", + "dependencies": { + "@atproto/lex-data": "0.0.8", + "@atproto/lex-json": "0.0.8", + "zod": "^3.23.8" + } + }, + "node_modules/@atproto/lexicon/node_modules/@atproto/syntax": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.2.tgz", + "integrity": "sha512-X9XSRPinBy/0VQ677j8VXlBsYSsUXaiqxWVpGGxJYsAhugdQRb0jqaVKJFtm6RskeNkV6y9xclSUi9UYG/COrA==", + "license": "MIT" + }, + "node_modules/@atproto/syntax": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.3.4.tgz", + "integrity": "sha512-8CNmi5DipOLaVeSMPggMe7FCksVag0aO6XZy9WflbduTKM4dFZVCs4686UeMLfGRXX+X966XgwECHoLYrovMMg==", + "license": "MIT" + }, + "node_modules/@atproto/xrpc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@atproto/xrpc/-/xrpc-0.5.0.tgz", + "integrity": "sha512-swu+wyOLvYW4l3n+VAuJbHcPcES+tin2Lsrp8Bw5aIXIICiuFn1YMFlwK9JwVUzTH21Py1s1nHEjr4CJeElJog==", + "license": "MIT", + "dependencies": { + "@atproto/lexicon": "^0.4.0", + "zod": "^3.21.4" + } + }, + "node_modules/@chrisburnell/eleventy-cache-webmentions": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@chrisburnell/eleventy-cache-webmentions/-/eleventy-cache-webmentions-2.2.7.tgz", + "integrity": "sha512-9Z4fD5MdTBvOprzcNcRGOyyaVo0ETyoQEiotNgV/eFFJiSidV3VRcab69yybJCkrq7L+aqWRrCdrx7ilL8YKTg==", + "funding": [ + { + "type": "buymeacoffee", + "url": "https://buymeacoffee.com/chrisburnell" + }, + { + "type": "github", + "url": "https://github.com/sponsors/chrisburnell" + } + ], + "license": "MIT", + "dependencies": { + "@11ty/eleventy-fetch": "^5.1.1", + "sanitize-html": "^2.17.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@chrisburnell/eleventy-cache-webmentions/node_modules/@11ty/eleventy-fetch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-fetch/-/eleventy-fetch-5.1.1.tgz", + "integrity": "sha512-/xFJLCrqKlcnRKIfO9Qjd1QOs4IpvypljXET955+EgdRPFA+h8Or6bDnZBbcwr6KS7yeUuzp5k1DhXgbentSTA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.7", + "@rgrove/parse-xml": "^4.2.0", + "debug": "^4.4.3", + "flatted": "^3.3.3", + "p-queue": "6.6.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@quasibit/eleventy-plugin-sitemap": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@quasibit/eleventy-plugin-sitemap/-/eleventy-plugin-sitemap-2.2.0.tgz", + "integrity": "sha512-7YoU4jjipLjifBhZwttLWbAAkImmBfeMQ0+1ST6mJO45z2mFLHZcgnfHwGF2joNk74wiYNsNOB1ennouzQFZIQ==", + "license": "MIT", + "dependencies": { + "array-flat-polyfill": "^1.0.1", + "sitemap": "^6.3.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@rgrove/parse-xml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rgrove/parse-xml/-/parse-xml-4.2.0.tgz", + "integrity": "sha512-UuBOt7BOsKVOkFXRe4Ypd/lADuNIfqJXv8GvHqtXaTYXPPKkj2nS2zPllVsrtRjcomDhIJVBnZwfmlI222WH8g==", + "license": "ISC", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@sindresorhus/slugify": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", + "integrity": "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/transliterate": "^1.0.0", + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/transliterate": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-1.6.0.tgz", + "integrity": "sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz", + "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" + } + }, + "node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flat-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-flat-polyfill/-/array-flat-polyfill-1.0.1.tgz", + "integrity": "sha512-hfJmKupmQN0lwi0xG6FQ5U8Rd97RnIERplymOv/qpq8AoNKPPAnxJadjFA23FNWm88wykh9HmpLJUUwUtNU/iw==", + "license": "CC0-1.0", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/await-lock": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", + "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.17", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.17.tgz", + "integrity": "sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/bcp-47": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-normalize": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bcp-47-normalize/-/bcp-47-normalize-2.3.0.tgz", + "integrity": "sha512-8I/wfzqQvttUFz7HVJgIZ7+dj3vUaIyIxYXaTRP1YWoSDfzt6TUmxaKZeuXR62qBmYr+nvuWINFRl6pZ5DlN4Q==", + "license": "MIT", + "dependencies": { + "bcp-47": "^2.0.0", + "bcp-47-match": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brotli-size": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/brotli-size/-/brotli-size-4.0.0.tgz", + "integrity": "sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==", + "license": "MIT", + "dependencies": { + "duplexer": "0.1.1" + }, + "engines": { + "node": ">= 10.16.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001766", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", + "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.277", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.277.tgz", + "integrity": "sha512-wKXFZw4erWmmOz5N/grBoJ2XrNJGDFMu2+W5ACHza5rHtvsqrK4gb6rnLC7XxKB9WlJ+RmyQatuEXmtm86xbnw==", + "dev": true, + "license": "ISC" + }, + "node_modules/eleventy-plugin-embed-bluesky": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/eleventy-plugin-embed-bluesky/-/eleventy-plugin-embed-bluesky-1.0.1.tgz", + "integrity": "sha512-6+0A92TIiJ5MJaJhcMshX5a2R4pdAJjAYz7EvDOk7T2zyr59Tyq9bRm9lEx2IRdZ5fx6CiRNMgLb+KXkzlLd2A==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-fetch": "^5.1.0", + "string-replace-async": "^3.0.2" + } + }, + "node_modules/eleventy-plugin-embed-bluesky/node_modules/@11ty/eleventy-fetch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-fetch/-/eleventy-fetch-5.1.1.tgz", + "integrity": "sha512-/xFJLCrqKlcnRKIfO9Qjd1QOs4IpvypljXET955+EgdRPFA+h8Or6bDnZBbcwr6KS7yeUuzp5k1DhXgbentSTA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.7", + "@rgrove/parse-xml": "^4.2.0", + "debug": "^4.4.3", + "flatted": "^3.3.3", + "p-queue": "6.6.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/eleventy-plugin-embed-everything": { + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/eleventy-plugin-embed-everything/-/eleventy-plugin-embed-everything-1.21.1.tgz", + "integrity": "sha512-Ucr27//kAkmpAKGvzSYbtlSCTVu+F7iJF5Smw+81PxAaofouiHhusJUQA6GJkJ1A7WgTDuwHWJjZ5mAXJWNtuA==", + "license": "MIT", + "dependencies": { + "deepmerge": "^4.3.1", + "eleventy-plugin-embed-bluesky": "^1.0.1", + "eleventy-plugin-embed-instagram": "^1.3.0", + "eleventy-plugin-embed-mastodon": "^1.0.2", + "eleventy-plugin-embed-openstreetmap": "^1.1.0", + "eleventy-plugin-embed-soundcloud": "^1.2.10", + "eleventy-plugin-embed-spotify": "^1.3.0", + "eleventy-plugin-embed-ted": "^1.0.1", + "eleventy-plugin-embed-tiktok": "^1.1.8", + "eleventy-plugin-embed-twitch": "^1.2.8", + "eleventy-plugin-embed-twitter": "^1.4.3", + "eleventy-plugin-vimeo-embed": "^1.4.0", + "eleventy-plugin-youtube-embed": "^1.13.1" + } + }, + "node_modules/eleventy-plugin-embed-instagram": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eleventy-plugin-embed-instagram/-/eleventy-plugin-embed-instagram-1.3.0.tgz", + "integrity": "sha512-uF63snWEViwLQzr85ZAbKRXlWcLdPwepxuy7gERQVPzTNYWiPU1ruyf8H40qmznWPo7kWHa9Nnb5p4tM2Ilcjg==", + "license": "MIT" + }, + "node_modules/eleventy-plugin-embed-mastodon": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/eleventy-plugin-embed-mastodon/-/eleventy-plugin-embed-mastodon-1.0.2.tgz", + "integrity": "sha512-JPDUcec2UouQ+tP1087ENMzfo0j8t0JXIYGfTjt+7HxF3cVUmPk+ZZhqX367OJmK2XSbeM5ZfPDORJ4Lhep8uQ==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-fetch": "^5.1.0", + "deepmerge": "^4.3.1", + "regex": "^6.0.1", + "string-replace-async": "^3.0.2" + } + }, + "node_modules/eleventy-plugin-embed-mastodon/node_modules/@11ty/eleventy-fetch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-fetch/-/eleventy-fetch-5.1.1.tgz", + "integrity": "sha512-/xFJLCrqKlcnRKIfO9Qjd1QOs4IpvypljXET955+EgdRPFA+h8Or6bDnZBbcwr6KS7yeUuzp5k1DhXgbentSTA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.7", + "@rgrove/parse-xml": "^4.2.0", + "debug": "^4.4.3", + "flatted": "^3.3.3", + "p-queue": "6.6.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/eleventy-plugin-embed-openstreetmap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eleventy-plugin-embed-openstreetmap/-/eleventy-plugin-embed-openstreetmap-1.1.0.tgz", + "integrity": "sha512-XKwEziI7feVZCkJXGSzgAlXR3ee9HeQ/WuTLS6KJKBQ+qGjOQHoi1seoTzsxeC/qt5V0pzgSD1xCgypQUlJ6Bw==", + "license": "MIT", + "dependencies": { + "deepmerge": "^4.3.1" + } + }, + "node_modules/eleventy-plugin-embed-soundcloud": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/eleventy-plugin-embed-soundcloud/-/eleventy-plugin-embed-soundcloud-1.2.10.tgz", + "integrity": "sha512-4G8z4rmbPJDGi43kJG6K9pRWyVxWCo+CdFpWDUlkvUX5XyKfEzVNbO/8ML0ci4WU79U9FyjLtF1yKlGPEAO2lg==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-fetch": "^5.1.0" + } + }, + "node_modules/eleventy-plugin-embed-soundcloud/node_modules/@11ty/eleventy-fetch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-fetch/-/eleventy-fetch-5.1.1.tgz", + "integrity": "sha512-/xFJLCrqKlcnRKIfO9Qjd1QOs4IpvypljXET955+EgdRPFA+h8Or6bDnZBbcwr6KS7yeUuzp5k1DhXgbentSTA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.7", + "@rgrove/parse-xml": "^4.2.0", + "debug": "^4.4.3", + "flatted": "^3.3.3", + "p-queue": "6.6.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/eleventy-plugin-embed-spotify": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eleventy-plugin-embed-spotify/-/eleventy-plugin-embed-spotify-1.3.0.tgz", + "integrity": "sha512-waVUtW5PO9aKYQEjnvHG4P5bPyKj+SSUBuDtqfF2K+j7dGItmEDD4DP7CmBz6lkn/LlJGmJ7uT4Mr6L4jAP4bg==", + "license": "MIT" + }, + "node_modules/eleventy-plugin-embed-ted": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/eleventy-plugin-embed-ted/-/eleventy-plugin-embed-ted-1.0.1.tgz", + "integrity": "sha512-F1CayKC05sGDAcdEgaZUP3Cs/71mwLT717sIUUiZWu+Gjd1Lp7m2gqL1R/uKnHN/CFxKYTpAA6ZNN/LCjg0ufw==", + "license": "MIT" + }, + "node_modules/eleventy-plugin-embed-tiktok": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/eleventy-plugin-embed-tiktok/-/eleventy-plugin-embed-tiktok-1.1.8.tgz", + "integrity": "sha512-U0J7LV0lXmRbEt05E0NzbXiPw8V0Rr5eEQSyFwzAMrdrsxhoCSYFuE2L6+b7SXbV8ZzFjbPX07n1c4hgLfvfrQ==", + "license": "MIT", + "dependencies": { + "deepmerge": "^4.3.1", + "regex": "^6.0.1" + } + }, + "node_modules/eleventy-plugin-embed-twitch": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/eleventy-plugin-embed-twitch/-/eleventy-plugin-embed-twitch-1.2.8.tgz", + "integrity": "sha512-ScjROm5sOwcClyE0DvZQ+6qF67lV4Yycsvb8p189QyJz3/wFw+9SQhyToY1FINRmUURIFRfLgp7AUXb3xAHmfg==", + "license": "MIT" + }, + "node_modules/eleventy-plugin-embed-twitter": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eleventy-plugin-embed-twitter/-/eleventy-plugin-embed-twitter-1.4.3.tgz", + "integrity": "sha512-gHpoz7OFfpw/8QuK+m1ENQuzOdLAdGiP4R0cfAdMBAJMjMpB0moW6L3CDfG6Ai7R/Y8KwnTwnmLEznLv5v68BA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-fetch": "^5.1.0", + "deepmerge": "^4.3.1" + } + }, + "node_modules/eleventy-plugin-embed-twitter/node_modules/@11ty/eleventy-fetch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-fetch/-/eleventy-fetch-5.1.1.tgz", + "integrity": "sha512-/xFJLCrqKlcnRKIfO9Qjd1QOs4IpvypljXET955+EgdRPFA+h8Or6bDnZBbcwr6KS7yeUuzp5k1DhXgbentSTA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.7", + "@rgrove/parse-xml": "^4.2.0", + "debug": "^4.4.3", + "flatted": "^3.3.3", + "p-queue": "6.6.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/eleventy-plugin-vimeo-embed": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eleventy-plugin-vimeo-embed/-/eleventy-plugin-vimeo-embed-1.4.0.tgz", + "integrity": "sha512-GaDCi3b4gFx+TSzTEPjHlcGPqDBc8tQwJIQqkFMfkFBEnwMpC8fYLh8x31DLJ9C7R7Qh1FGVrb+A6qgKt//IqA==", + "license": "MIT" + }, + "node_modules/eleventy-plugin-youtube-embed": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/eleventy-plugin-youtube-embed/-/eleventy-plugin-youtube-embed-1.13.1.tgz", + "integrity": "sha512-JfmPyNan5x9FC08RjLQIeBexpo1u+g06FCnEuQMkRbORh4dy/6LILJGcsPkrAHP6fw7ZnD/bogfTTuW5lCyukA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-fetch": "^5.1.0", + "deepmerge": "^4.3.1", + "lite-youtube-embed": "^0.3.4", + "string-replace-async": "^3.0.2" + } + }, + "node_modules/eleventy-plugin-youtube-embed/node_modules/@11ty/eleventy-fetch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-fetch/-/eleventy-fetch-5.1.1.tgz", + "integrity": "sha512-/xFJLCrqKlcnRKIfO9Qjd1QOs4IpvypljXET955+EgdRPFA+h8Or6bDnZBbcwr6KS7yeUuzp5k1DhXgbentSTA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.7", + "@rgrove/parse-xml": "^4.2.0", + "debug": "^4.4.3", + "flatted": "^3.3.3", + "p-queue": "6.6.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/errno/-/errno-1.0.0.tgz", + "integrity": "sha512-3zV5mFS1E8/1bPxt/B0xxzI1snsg3uSCIh6Zo1qKg6iMw93hzPANk9oBFzSFBFrwuVoQuE3rLoouAUfwOAj1wQ==", + "license": "MIT", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esm-import-transformer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/esm-import-transformer/-/esm-import-transformer-3.0.5.tgz", + "integrity": "sha512-1GKLvfuMnnpI75l8c6sHoz0L3Z872xL5akGuBudgqTDPv4Vy6f2Ec7jEMKTxlqWl/3kSvNbHELeimJtnqgYniw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/evaluate-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/evaluate-value/-/evaluate-value-2.0.0.tgz", + "integrity": "sha512-VonfiuDJc0z4sOO7W0Pd130VLsXN6vmBWZlrog1mCb/o7o/Nl5Lr25+Kj/nkCCAhG+zqeeGjxhkK9oHpkgTHhQ==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/filesize": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", + "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 10.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "license": "ISC" + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "license": "MIT" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-equiv-refresh": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-equiv-refresh/-/http-equiv-refresh-2.0.1.tgz", + "integrity": "sha512-XJpDL/MLkV3dKwLzHwr2dY05dYNfBNlyPu4STQ8WvKCFdc6vC5tPXuq28of663+gHVg03C+16pHHs/+FmmDjcw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/image-size": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-json": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", + "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", + "license": "ISC" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/iso-639-1": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/iso-639-1/-/iso-639-1-3.1.5.tgz", + "integrity": "sha512-gXkz5+KN7HrG0Q5UGqSMO2qB9AsbEeyLP54kF1YrMsIxmu+g4BdB7rflReZTSTZGpfj8wywu6pfPBCylPIzGQA==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/iso-datestring-validator": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/iso-datestring-validator/-/iso-datestring-validator-2.2.2.tgz", + "integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==", + "license": "MIT" + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/liquidjs": { + "version": "10.24.0", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.24.0.tgz", + "integrity": "sha512-TAUNAdgwaAXjjcUFuYVJm9kOVH7zc0mTKxsG9t9Lu4qdWjB2BEblyVIYpjWcmJLMGgiYqnGNJjpNMHx0gp/46A==", + "license": "MIT", + "dependencies": { + "commander": "^10.0.0" + }, + "bin": { + "liquid": "bin/liquid.js", + "liquidjs": "bin/liquid.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/liquidjs" + } + }, + "node_modules/list-to-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/list-to-array/-/list-to-array-1.1.0.tgz", + "integrity": "sha512-+dAZZ2mM+/m+vY9ezfoueVvrgnHIGi5FvgSymbIgJOFwiznWyA59mav95L+Mc6xPtL3s9gm5eNTlNtxJLbNM1g==", + "license": "MIT" + }, + "node_modules/lite-youtube-embed": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/lite-youtube-embed/-/lite-youtube-embed-0.3.4.tgz", + "integrity": "sha512-aXgxpwK7AIW58GEbRzA8EYaY4LWvF3FKak6B9OtSJmuNyLhX2ouD4cMTxz/yR5HFInhknaYd2jLWOTRTvT8oAw==", + "license": "Apache-2.0" + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/maximatch": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz", + "integrity": "sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A==", + "license": "MIT", + "dependencies": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", + "license": "BSD-3-Clause" + }, + "node_modules/morphdom": { + "version": "2.7.8", + "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.8.tgz", + "integrity": "sha512-D/fR4xgGUyVRbdMGU6Nejea1RFzYxYtyurG4Fbv2Fi/daKlWKuXGLOdXtl+3eIwL110cI2hz1ZojGICjjFLgTg==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-retrieve-globals": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/node-retrieve-globals/-/node-retrieve-globals-6.0.1.tgz", + "integrity": "sha512-j0DeFuZ/Wg3VlklfbxUgZF/mdHMTEiEipBb3q0SpMMbHaV3AVfoUQF8UGxh1s/yjqO0TgRZd4Pi/x2yRqoQ4Eg==", + "license": "MIT", + "dependencies": { + "acorn": "^8.14.1", + "acorn-walk": "^8.3.4", + "esm-import-transformer": "^3.0.3" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "license": "BSD-2-Clause", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/nunjucks/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "license": "MIT", + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-cli": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.1.tgz", + "integrity": "sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.3.0", + "dependency-graph": "^1.0.0", + "fs-extra": "^11.0.0", + "picocolors": "^1.0.0", + "postcss-load-config": "^5.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^5.0.0", + "tinyglobby": "^0.2.12", + "yargs": "^17.0.0" + }, + "bin": { + "postcss": "index.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-cli/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", + "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1", + "yaml": "^2.4.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-reporter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", + "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "thenby": "^1.3.4" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/posthtml": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.7.tgz", + "integrity": "sha512-7Hc+IvlQ7hlaIfQFZnxlRl0jnpWq2qwibORBhQYIb0QbNtuicc5ZxvKkVT71HJ4Py1wSZ/3VR1r8LfkCtoCzhw==", + "license": "MIT", + "dependencies": { + "posthtml-parser": "^0.11.0", + "posthtml-render": "^3.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/posthtml-match-helper": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/posthtml-match-helper/-/posthtml-match-helper-2.0.3.tgz", + "integrity": "sha512-p9oJgTdMF2dyd7WE54QI1LvpBIkNkbSiiECKezNnDVYhGhD1AaOnAkw0Uh0y5TW+OHO8iBdSqnd8Wkpb6iUqmw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "posthtml": "^0.16.6" + } + }, + "node_modules/posthtml-parser": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", + "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", + "license": "MIT", + "dependencies": { + "htmlparser2": "^7.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/posthtml-render": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", + "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", + "license": "MIT", + "dependencies": { + "is-json": "^2.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "license": "MIT" + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rss-parser": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.13.0.tgz", + "integrity": "sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==", + "license": "MIT", + "dependencies": { + "entities": "^2.0.3", + "xml2js": "^0.5.0" + } + }, + "node_modules/rss-parser/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sanitize-html": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.17.0.tgz", + "integrity": "sha512-dLAADUSS8rBwhaevT12yCezvioCA+bmUTPH/u57xKPT8d++voeYE6HeluA/bPbQ15TwDBG2ii+QZIEmYx8VdxA==", + "license": "MIT", + "dependencies": { + "deepmerge": "^4.2.2", + "escape-string-regexp": "^4.0.0", + "htmlparser2": "^8.0.0", + "is-plain-object": "^5.0.0", + "parse-srcset": "^1.0.2", + "postcss": "^8.3.11" + } + }, + "node_modules/sanitize-html/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sanitize-html/node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/sax": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", + "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "license": "MIT" + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sitemap": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-6.4.0.tgz", + "integrity": "sha512-DoPKNc2/apQZTUnfiOONWctwq7s6dZVspxAZe2VPMNtoqNq7HgXRvlRnbIpKjf+8+piQdWncwcy+YhhTGY5USQ==", + "license": "MIT", + "dependencies": { + "@types/node": "^14.14.28", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=10.3.0", + "npm": ">=5.6.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/ssri": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-11.0.0.tgz", + "integrity": "sha512-aZpUoMN/Jj2MqA4vMCeiKGnc/8SuSyHbGSBdgFbZxP8OJGF/lFkIuElzPxsN0q8TQQ+prw3P4EDfB3TBHHgfXw==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string-replace-async": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/string-replace-async/-/string-replace-async-3.0.2.tgz", + "integrity": "sha512-s6hDtXJ7FKyRap/amefqrOMpkEQvxUDueyvJygQeHxCK5Za90dOMgdibCCrPdfdAYAkr8imrZ1PPXW7DOf0RzQ==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/terser": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tlds": { + "version": "1.261.0", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.261.0.tgz", + "integrity": "sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==", + "license": "MIT", + "bin": { + "tlds": "bin.js" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, + "node_modules/uint8arrays": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.0.0.tgz", + "integrity": "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==", + "license": "MIT", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/unicode-segmenter": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/unicode-segmenter/-/unicode-segmenter-0.14.5.tgz", + "integrity": "sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d4f693a --- /dev/null +++ b/package.json @@ -0,0 +1,31 @@ +{ + "name": "rmendes-eleventy-site", + "version": "1.0.0", + "description": "Personal website powered by Indiekit and Eleventy", + "type": "module", + "scripts": { + "build": "eleventy", + "dev": "eleventy --serve --watch", + "build:css": "postcss css/tailwind.css -o css/style.css" + }, + "dependencies": { + "@11ty/eleventy": "^3.0.0", + "html-minifier-terser": "^7.0.0", + "markdown-it": "^14.0.0", + "@11ty/eleventy-fetch": "^4.0.1", + "@11ty/eleventy-img": "^6.0.0", + "@11ty/eleventy-plugin-rss": "^2.0.2", + "@chrisburnell/eleventy-cache-webmentions": "^2.2.7", + "@quasibit/eleventy-plugin-sitemap": "^2.2.0", + "@atproto/api": "^0.12.0", + "eleventy-plugin-embed-everything": "^1.21.0", + "rss-parser": "^3.13.0" + }, + "devDependencies": { + "tailwindcss": "^3.4.0", + "postcss": "^8.4.0", + "postcss-cli": "^11.0.0", + "autoprefixer": "^10.4.0", + "@tailwindcss/typography": "^0.5.0" + } +} diff --git a/photos.njk b/photos.njk new file mode 100644 index 0000000..3a686e8 --- /dev/null +++ b/photos.njk @@ -0,0 +1,23 @@ +--- +layout: layouts/base.njk +title: Photos +permalink: /photos/ +--- +

Photos

+ +{% if collections.photos.length > 0 %} + +{% else %} +

No photos yet.

+{% endif %} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/replies.njk b/replies.njk new file mode 100644 index 0000000..f0af02c --- /dev/null +++ b/replies.njk @@ -0,0 +1,51 @@ +--- +layout: layouts/base.njk +title: Replies +permalink: /replies/ +--- + + +{% if collections.replies.length > 0 %} + +{% else %} +

No replies yet.

+{% endif %} diff --git a/reposts.njk b/reposts.njk new file mode 100644 index 0000000..b2dd622 --- /dev/null +++ b/reposts.njk @@ -0,0 +1,53 @@ +--- +layout: layouts/base.njk +title: Reposts +permalink: /reposts/ +--- + + +{% if collections.reposts.length > 0 %} + +{% else %} +

No reposts yet.

+{% endif %} diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..5449496 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,79 @@ +import typography from "@tailwindcss/typography"; + +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./**/*.njk", + "./**/*.md", + "./_includes/**/*.njk", + "./content/**/*.md", + ], + darkMode: "class", + theme: { + extend: { + colors: { + primary: { + 50: "#eff6ff", + 100: "#dbeafe", + 200: "#bfdbfe", + 300: "#93c5fd", + 400: "#60a5fa", + 500: "#3b82f6", + 600: "#2563eb", + 700: "#1d4ed8", + 800: "#1e40af", + 900: "#1e3a8a", + 950: "#172554", + }, + surface: { + 50: "#fafafa", + 100: "#f4f4f5", + 200: "#e4e4e7", + 300: "#d4d4d8", + 400: "#a1a1aa", + 500: "#71717a", + 600: "#52525b", + 700: "#3f3f46", + 800: "#27272a", + 900: "#18181b", + 950: "#09090b", + }, + }, + fontFamily: { + sans: [ + "system-ui", + "-apple-system", + "BlinkMacSystemFont", + "Segoe UI", + "Roboto", + "sans-serif", + ], + mono: [ + "ui-monospace", + "SF Mono", + "Monaco", + "Cascadia Code", + "monospace", + ], + }, + maxWidth: { + content: "720px", + wide: "1200px", + }, + typography: (theme) => ({ + DEFAULT: { + css: { + "--tw-prose-links": theme("colors.primary.600"), + maxWidth: "none", + }, + }, + invert: { + css: { + "--tw-prose-links": theme("colors.primary.400"), + }, + }, + }), + }, + }, + plugins: [typography], +}; diff --git a/youtube.njk b/youtube.njk new file mode 100644 index 0000000..1c3db17 --- /dev/null +++ b/youtube.njk @@ -0,0 +1,262 @@ +--- +layout: layouts/base.njk +title: YouTube Channels +permalink: /youtube/ +withSidebar: true +--- +
+
+

YouTube Channels

+

+ Latest videos and live streams from my YouTube channels. +

+
+ + {# Multi-channel tabs #} + {% if youtubeChannel.isMultiChannel and youtubeChannel.channels.length > 1 %} +
+
+ {% for channel in youtubeChannel.channels %} + + {% endfor %} +
+
+ {% endif %} + + {# Channel sections #} + {% for channel in youtubeChannel.channels %} +
+ {# Channel Header #} +
+
+ {% if channel.thumbnail %} + + {% else %} +
+ + + +
+ {% endif %} + +
+

+ + {{ channel.title }} + +

+ {% if channel.customUrl %} +

{{ channel.customUrl }}

+ {% endif %} +
+ + + + + {{ channel.subscriberCountFormatted }} subscribers + + + + + + {{ channel.videoCountFormatted }} videos + + + + + + + {{ channel.viewCountFormatted }} views + +
+
+ + {# Live Status Badge for this channel #} + {% set channelLiveStatus = youtubeChannel.liveStatuses | selectattr("channelConfigName", "equalto", channel.configName) | first %} +
+ {% if channelLiveStatus and channelLiveStatus.isLive %} + + + LIVE + + {% elif channelLiveStatus and channelLiveStatus.isUpcoming %} + + + + + Upcoming + + {% else %} + + Offline + + {% endif %} +
+
+
+ + {# Live Stream Section for this channel #} + {% set channelLiveStatus = youtubeChannel.liveStatuses | selectattr("channelConfigName", "equalto", channel.configName) | first %} + {% if channelLiveStatus and channelLiveStatus.stream and (channelLiveStatus.isLive or channelLiveStatus.isUpcoming) %} +
+

+ {% if channelLiveStatus.isLive %} + + + Live Now + + {% else %} + + + + Upcoming Stream + {% endif %} +

+ + +
+ {% if channelLiveStatus.stream.thumbnail %} + + {% endif %} +
+
+

+ {{ channelLiveStatus.stream.title }} +

+

+ + + + Watch Now +

+
+
+ {% if channelLiveStatus.isLive %} +
+ + + LIVE + +
+ {% endif %} +
+
+
+ {% endif %} + + {# Videos Grid for this channel #} +
+

+ + + + Latest Videos +

+ + {% set channelName = channel.configName or channel.title %} + {% set channelVideos = youtubeChannel.videosByChannel[channelName] %} + {% if channelVideos and channelVideos.length %} + + + + {% else %} +

No videos available yet.

+ {% endif %} +
+
+ {% endfor %} + + {# Fallback for no channels #} + {% if not youtubeChannel.channels.length %} +

No YouTube channels configured.

+ {% endif %} +