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 #}
+
+
+{# Post Navigation Widget - Previous/Next #}
+{% if previousPost or nextPost %}
+
+{% endif %}
+
+{# Table of Contents Widget (for articles with headings) #}
+{% if toc and toc.length %}
+
+{% endif %}
+
+{# Categories for This Post #}
+{% if category %}
+
+{% endif %}
+
+{# Recent Posts Widget #}
+{% if collections.posts %}
+
+{% endif %}
+
+{# Webmentions Widget (if this post has any) #}
+{% if webmentions and webmentions.length %}
+
+{% endif %}
+
+{# Share Widget #}
+
+
+{# 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 #}
+
+
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 %}
+
+ {% if in_reply_to %}
+
+ {% endif %}
+
+ {% if like_of %}
+
+ {% endif %}
+
+ {% if repost_of %}
+
+
+
+
+
+ Reposted:
+
+
+ {{ repost_of }}
+
+
+ {% endif %}
+
+ {% if bookmark_of %}
+
+ {% endif %}
+
+{% 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 #}
+
+
+{# Social Feed Widget - Tabbed Bluesky/Mastodon #}
+{% if (blueskyFeed and blueskyFeed.length) or (mastodonFeed and mastodonFeed.length) %}
+
+{% endif %}
+
+{# GitHub Repos Widget #}
+{% if githubRepos and githubRepos.length %}
+
+{% endif %}
+
+{# Funkwhale Now Playing Widget #}
+{% if funkwhaleActivity and (funkwhaleActivity.nowPlaying or funkwhaleActivity.stats) %}
+
+{% endif %}
+
+{# Recent Posts Widget (for non-blog pages) #}
+{% if recentPosts and recentPosts.length %}
+
+{% endif %}
+
+{# Categories/Tags Widget #}
+{% if categories and categories.length %}
+
+{% 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 %}
+
+
+
+ {% endfor %}
+
+
+ {% endif %}
+
+ {# Reposts #}
+ {% set reposts = mentions | webmentionsByType('reposts') %}
+ {% if reposts.length %}
+
+
+ {{ reposts.length }} Repost{% if reposts.length != 1 %}s{% endif %}
+
+
+ {% for repost in reposts %}
+
+
+
+ {% endfor %}
+
+
+ {% endif %}
+
+ {# Replies #}
+ {% set replies = mentions | webmentionsByType('replies') %}
+ {% if replies.length %}
+
+
+ {{ replies.length }} Repl{% if replies.length != 1 %}ies{% else %}y{% endif %}
+
+
+ {% for reply in replies %}
+
+
+
+
+
+
+
+
+ {{ reply.content.html | safe if reply.content.html else reply.content.text }}
+
+
+
+
+ {% endfor %}
+
+
+ {% 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 #}
+
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 %}
+
+ {% elif withBlogSidebar %}
+
+ {% 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 #}
+
+
+ {# 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 %}
+
+
+
+ {{ job.startDate }} -
+ {% if job.endDate %}
+ {{ 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 %}
+
+
+
+ {{ date | dateDisplay }}
+
+ {% if category %}
+
+ {# Handle both string and array categories #}
+ {% if category is string %}
+ {{ category }}
+ {% else %}
+ {% for cat in category %}
+ {{ cat }}
+ {% endfor %}
+ {% endif %}
+
+ {% 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 %}
+ {{ 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 %}
+
+ Permalink
+
+ {# Author h-card for IndieWeb authorship #}
+
+ {{ site.author.name }}
+
+
+
+ {# 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.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.date | dateDisplay }}
+
+ {% 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 | 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.templateContent | striptags | truncate(250) }}
+
+
+ Read more →
+
+
+ {# Note without title #}
+ {% else %}
+
+
+ {{ 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:
+
+ Quill - Web-based
+ IndiePass - Mobile app
+ Micropublish - Web-based
+
+ {% 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 %}
+
+ {% for post in collections.bookmarks %}
+
+ {% if post.data.title %}
+
+ {% endif %}
+
+
+ {{ post.date | dateDisplay }}
+
+
+ {% if post.data.bookmark_of %}
+ {{ post.data.bookmark_of }}
+ {% endif %}
+ {{ post.templateContent | safe }}
+
+ {% endfor %}
+
+{% 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 %}
+
+ {% for post in categoryPosts %}
+
+
+
+
+ {{ post.date | dateDisplay }}
+
+ {% set postType = post.inputPath | replace("./content/", "") %}
+ {% set postType = postType.split("/")[0] %}
+ {{ postType }}
+
+
+ {{ post.templateContent | striptags | truncate(250) }}
+
+
+ View →
+
+
+ {% endfor %}
+
+ {% 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 `
VIDEO
`;
+ });
+
+ // 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
+---
+
+
+
+ {# 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
+
+
+ This Month
+
+
+ This Week
+
+
+ Trends
+
+
+
+ {# 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
+---
+
+
+
+ {# Featured Projects Section #}
+ {% if githubActivity.featured.length %}
+
+
+
+
+
+ Featured Projects
+
+
+
+ {% for repo in githubActivity.featured %}
+
+
+
+ {% 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) %}
+
+
+
+ {% 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 }}
+
+
+
+ {% 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 %}
+
+
+ {% endfor %}
+
+
+ {% endif %}
+
+ {# My Repositories Section #}
+
+
+
+
+
+ My Repositories
+
+
+ {% if githubRepos.length %}
+
+ {% for repo in githubRepos | head(6) %}
+
+
+
+ {% 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 %}
+
+ {% for post in collections.likes %}
+
+
+
+
+
+
+ {{ post.date | dateDisplay }}
+
+
+ {% if post.data.like_of %}
+
+
+ {{ post.data.like_of }}
+
+
+ {% endif %}
+ {% if post.templateContent %}
+
+ {{ post.templateContent | safe }}
+
+ {% endif %}
+
Permalink
+
+
+
+ {% endfor %}
+
+{% 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 %}
+
+
+
+ {{ 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 %}
+
+ {% for post in collections.photos %}
+
+
+
+ {{ post.date | dateDisplay }}
+
+
+ {{ post.templateContent | safe }}
+
+ {% endfor %}
+
+{% 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 %}
+
+ {% for post in collections.replies %}
+
+
+
+
+ {% if post.data.title %}
+
+ {% endif %}
+
+
+ {{ post.date | dateDisplay }}
+
+
+ {% if post.data.in_reply_to %}
+
+ In reply to:
+
+ {{ post.data.in_reply_to }}
+
+
+ {% endif %}
+
+ {{ post.templateContent | safe }}
+
+
Permalink
+
+
+
+ {% endfor %}
+
+{% 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 %}
+
+ {% for post in collections.reposts %}
+
+
+
+
+ {% if post.data.title %}
+
+ {% endif %}
+
+
+ {{ post.date | dateDisplay }}
+
+
+ {% if post.data.repost_of %}
+
+ Reposted:
+
+ {{ post.data.repost_of }}
+
+
+ {% endif %}
+ {% if post.templateContent %}
+
+ {{ post.templateContent | safe }}
+
+ {% endif %}
+
Permalink
+
+
+
+ {% endfor %}
+
+{% 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
+---
+
+
+
+ {# Multi-channel tabs #}
+ {% if youtubeChannel.isMultiChannel and youtubeChannel.channels.length > 1 %}
+
+
+ {% for channel in youtubeChannel.channels %}
+
+ {{ channel.configName or channel.title }}
+
+ {% endfor %}
+
+
+ {% endif %}
+
+ {# Channel sections #}
+ {% for channel in youtubeChannel.channels %}
+
+ {# Channel Header #}
+
+
+ {% if channel.thumbnail %}
+
+ {% else %}
+
+ {% endif %}
+
+
+
+ {% 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) %}
+
+ {% 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 %}
+