From 73f8d67ee3f4f0ece6a48a49263910439bb3e6ba Mon Sep 17 00:00:00 2001
From: mahdahar <89adham@gmail.com>
Date: Tue, 7 Apr 2026 14:18:51 +0700
Subject: [PATCH] feat: add TinyLink docs section and Mermaid diagram support
Wire TinyLink into Eleventy collections, homepage highlights, and project navigation so the new integration design page is discoverable.
Enable Mermaid code fence handling in markdown and client-side rendering in the base layout, and normalize the TinyLink diagram syntax for compatibility.
---
.eleventy.js | 25 ++++++-
package-lock.json | 110 +++++++++++++++++++++++++---
package.json | 6 +-
src/_layouts/base.njk | 18 ++++-
src/index.njk | 33 +++++++++
src/projects/tinylink/001-design.md | 84 +++++++++++++++++++++
6 files changed, 262 insertions(+), 14 deletions(-)
create mode 100644 src/projects/tinylink/001-design.md
diff --git a/.eleventy.js b/.eleventy.js
index 32d9149..f06484a 100644
--- a/.eleventy.js
+++ b/.eleventy.js
@@ -1,3 +1,6 @@
+const markdownIt = require("markdown-it");
+const markdownItMermaid = require("markdown-it-mermaid");
+
module.exports = function (eleventyConfig) {
// Passthrough copy for static assets
eleventyConfig.addPassthroughCopy("src/assets");
@@ -54,6 +57,16 @@ module.exports = function (eleventyConfig) {
return array.slice(0, n);
});
+ // Markdown: enable Mermaid diagrams
+ const mermaidPlugin = markdownItMermaid.default || markdownItMermaid;
+ const markdownLib = markdownIt({
+ html: true,
+ breaks: false,
+ linkify: true
+ }).use(mermaidPlugin);
+
+ eleventyConfig.setLibrary("md", markdownLib);
+
// Collections
// Blog posts / Proposals collection
eleventyConfig.addCollection("posts", function (collectionApi) {
@@ -62,12 +75,13 @@ module.exports = function (eleventyConfig) {
});
});
- // Projects collection (blog posts + CLQMS projects)
+ // Projects collection (blog posts + CLQMS + TinyLink)
eleventyConfig.addCollection("projects", function (collectionApi) {
const blogPosts = collectionApi.getFilteredByGlob("src/blog/**/*.md");
const clqmsPosts = collectionApi.getFilteredByTag("clqms");
+ const tinylinkPosts = collectionApi.getFilteredByTag("tinylink");
- const allProjects = [...blogPosts, ...clqmsPosts].sort((a, b) => {
+ const allProjects = [...blogPosts, ...clqmsPosts, ...tinylinkPosts].sort((a, b) => {
return new Date(b.date) - new Date(a.date);
});
@@ -81,6 +95,13 @@ module.exports = function (eleventyConfig) {
});
});
+ // TinyLink collection sorted by order
+ eleventyConfig.addCollection("tinylink", function (collectionApi) {
+ return collectionApi.getFilteredByTag("tinylink").sort((a, b) => {
+ return (Number(a.data.order) ?? 99) - (Number(b.data.order) ?? 99);
+ });
+ });
+
return {
dir: {
input: "src",
diff --git a/package-lock.json b/package-lock.json
index 876299b..373128c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,6 +8,10 @@
"name": "5panda.11ty",
"version": "1.0.0",
"license": "MIT",
+ "dependencies": {
+ "markdown-it": "^14.1.1",
+ "markdown-it-mermaid": "^0.2.5"
+ },
"devDependencies": {
"@11ty/eleventy": "^3.1.2",
"@tailwindcss/postcss": "^4.1.18",
@@ -659,7 +663,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true,
"license": "Python-2.0"
},
"node_modules/array-buffer-byte-length": {
@@ -1072,6 +1075,34 @@
"semver": "bin/semver"
}
},
+ "node_modules/d3": {
+ "version": "3.5.17",
+ "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz",
+ "integrity": "sha512-yFk/2idb8OHPKkbAL8QaOaqENNoMhIaSHZerk3oQsECwkObkCpJyjYwCe+OHiq6UEdhe1m8ZGARRRO3ljFjlKg==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/dagre-d3-renderer": {
+ "version": "0.4.26",
+ "resolved": "https://registry.npmjs.org/dagre-d3-renderer/-/dagre-d3-renderer-0.4.26.tgz",
+ "integrity": "sha512-vOWj1uA4/APTrfDyfHaH/xpfXhPh9rszW+HOaEwPCeA6Afl06Lobfh7OpESuVMQW2QGuY4UQ7pte/p0WhdDs7w==",
+ "license": "MIT",
+ "dependencies": {
+ "d3": "3.5.17",
+ "dagre-layout": "^0.8.0",
+ "graphlib": "^2.1.1",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/dagre-layout": {
+ "version": "0.8.8",
+ "resolved": "https://registry.npmjs.org/dagre-layout/-/dagre-layout-0.8.8.tgz",
+ "integrity": "sha512-ZNV15T9za7X+fV8Z07IZquUKugCxm5owoiPPxfEx6OJRD331nkiIaF3vSt0JEY5FkrY0KfRQxcpQ3SpXB7pLPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "graphlibrary": "^2.2.0",
+ "lodash": "^4.17.5"
+ }
+ },
"node_modules/data-view-buffer": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
@@ -1892,6 +1923,24 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/graphlib": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz",
+ "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.15"
+ }
+ },
+ "node_modules/graphlibrary": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/graphlibrary/-/graphlibrary-2.2.0.tgz",
+ "integrity": "sha512-XTcvT55L8u4MBZrM37zXoUxsgxs/7sow7YSygd9CIwfWTVO8RVu7AYXhhCiTuFEf+APKgx6Jk4SuQbYR0vYKmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.5"
+ }
+ },
"node_modules/gray-matter": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz",
@@ -2026,6 +2075,15 @@
"node": ">= 0.4"
}
},
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "license": "MIT",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
"node_modules/hosted-git-info": {
"version": "2.8.9",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
@@ -2970,7 +3028,6 @@
"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==",
- "dev": true,
"license": "MIT",
"dependencies": {
"uc.micro": "^2.0.0"
@@ -3030,6 +3087,12 @@
"node": ">=4"
}
},
+ "node_modules/lodash": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
+ "license": "MIT"
+ },
"node_modules/luxon": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz",
@@ -3051,10 +3114,9 @@
}
},
"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==",
- "dev": true,
+ "version": "14.1.1",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz",
+ "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==",
"license": "MIT",
"dependencies": {
"argparse": "^2.0.1",
@@ -3068,11 +3130,19 @@
"markdown-it": "bin/markdown-it.mjs"
}
},
+ "node_modules/markdown-it-mermaid": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/markdown-it-mermaid/-/markdown-it-mermaid-0.2.5.tgz",
+ "integrity": "sha512-ZUTFRX+cXEtWmn/9LMlpVklPJiDrHPWyHE/wamC2wm0Ojh1qOcuKWfWW3BqP83+7w6C59rS7M3OrGTs/u9mQTA==",
+ "license": "MIT",
+ "dependencies": {
+ "mermaid": "^7.1.2"
+ }
+ },
"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==",
- "dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.12"
@@ -3111,7 +3181,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
"integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==",
- "dev": true,
"license": "MIT"
},
"node_modules/memorystream": {
@@ -3123,6 +3192,20 @@
"node": ">= 0.10.0"
}
},
+ "node_modules/mermaid": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-7.1.2.tgz",
+ "integrity": "sha512-bDLu3fQuf3/R0fNkNzB0GTaF7+6SxnZpfTs9DVQF1ougsuP23MBzvEIGfL0ML8zeyg7+J2D+0AaoLVhskW5ulw==",
+ "license": "MIT",
+ "dependencies": {
+ "d3": "3.5.17",
+ "dagre-d3-renderer": "^0.4.25",
+ "dagre-layout": "^0.8.0",
+ "he": "^1.1.1",
+ "lodash": "^4.17.4",
+ "moment": "^2.20.1"
+ }
+ },
"node_modules/mime": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
@@ -3196,6 +3279,15 @@
"node": ">=16 || 14 >=14.17"
}
},
+ "node_modules/moment": {
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
+ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/moo": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz",
@@ -3801,7 +3893,6 @@
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
"integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -4639,7 +4730,6 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
"integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
- "dev": true,
"license": "MIT"
},
"node_modules/unbox-primitive": {
diff --git a/package.json b/package.json
index 12e3351..f935035 100644
--- a/package.json
+++ b/package.json
@@ -26,5 +26,9 @@
"postcss": "^8.5.6",
"postcss-cli": "^11.0.1",
"tailwindcss": "^4.1.18"
+ },
+ "dependencies": {
+ "markdown-it": "^14.1.1",
+ "markdown-it-mermaid": "^0.2.5"
}
-}
\ No newline at end of file
+}
diff --git a/src/_layouts/base.njk b/src/_layouts/base.njk
index 832a1a6..9deea34 100644
--- a/src/_layouts/base.njk
+++ b/src/_layouts/base.njk
@@ -52,6 +52,7 @@
© {% year %} 5Panda. Built with 11ty & Tailwind CSS.
+ +