my website at ewancroft.uk
6
fork

Configure Feed

Select the types of activity you want to include in your feed.

improvements?

Ewan Croft f642b9cc 9162d1a0

+483 -6
+3
.cspell.json
··· 11 11 "Batarong", 12 12 "bradlc", 13 13 "bsky", 14 + "Caligraphic", 14 15 "CASL", 15 16 "Centralised", 16 17 "colour", ··· 36 37 "greenwolf", 37 38 "gwicbkc", 38 39 "Instgrm", 40 + "katex", 39 41 "kohler", 40 42 "Licence", 41 43 "linkat", ··· 64 66 "shapeshifting", 65 67 "slnt", 66 68 "svelte", 69 + "Varepsilon", 67 70 "vercelignore", 68 71 "wght", 69 72 "whitebreeze",
+443
package-lock.json
··· 11 11 "@resvg/resvg-js": "^2.6.2", 12 12 "@tailwindcss/nesting": "^0.0.0-insiders.565cd3e", 13 13 "postcss-import": "^16.1.1", 14 + "rehype-autolink-headings": "^7.1.0", 15 + "rehype-highlight": "^7.0.2", 16 + "rehype-katex": "^7.0.1", 14 17 "rehype-raw": "^7.0.0", 15 18 "rehype-sanitize": "^6.0.0", 19 + "rehype-slug": "^6.0.0", 16 20 "rehype-stringify": "^10.0.1", 17 21 "remark": "^15.0.1", 22 + "remark-breaks": "^4.0.0", 23 + "remark-emoji": "^5.0.1", 18 24 "remark-gfm": "^4.0.0", 25 + "remark-math": "^6.0.0", 19 26 "remark-rehype": "^11.1.1", 20 27 "sanitize-html": "^2.13.1", 21 28 "satori": "^0.12.2", ··· 1365 1372 "node": ">= 8.0.0" 1366 1373 } 1367 1374 }, 1375 + "node_modules/@sindresorhus/is": { 1376 + "version": "4.6.0", 1377 + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", 1378 + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", 1379 + "license": "MIT", 1380 + "engines": { 1381 + "node": ">=10" 1382 + }, 1383 + "funding": { 1384 + "url": "https://github.com/sindresorhus/is?sponsor=1" 1385 + } 1386 + }, 1368 1387 "node_modules/@sveltejs/acorn-typescript": { 1369 1388 "version": "1.0.5", 1370 1389 "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.5.tgz", ··· 2004 2023 "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 2005 2024 "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 2006 2025 "dev": true, 2026 + "license": "MIT" 2027 + }, 2028 + "node_modules/@types/katex": { 2029 + "version": "0.16.7", 2030 + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", 2031 + "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==", 2007 2032 "license": "MIT" 2008 2033 }, 2009 2034 "node_modules/@types/mdast": { ··· 2709 2734 "url": "https://github.com/chalk/chalk?sponsor=1" 2710 2735 } 2711 2736 }, 2737 + "node_modules/char-regex": { 2738 + "version": "1.0.2", 2739 + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", 2740 + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", 2741 + "license": "MIT", 2742 + "engines": { 2743 + "node": ">=10" 2744 + } 2745 + }, 2712 2746 "node_modules/character-entities": { 2713 2747 "version": "2.0.2", 2714 2748 "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", ··· 3083 3117 "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 3084 3118 "dev": true, 3085 3119 "license": "MIT" 3120 + }, 3121 + "node_modules/emojilib": { 3122 + "version": "2.4.0", 3123 + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", 3124 + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", 3125 + "license": "MIT" 3126 + }, 3127 + "node_modules/emoticon": { 3128 + "version": "4.1.0", 3129 + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", 3130 + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", 3131 + "license": "MIT", 3132 + "funding": { 3133 + "type": "github", 3134 + "url": "https://github.com/sponsors/wooorm" 3135 + } 3086 3136 }, 3087 3137 "node_modules/entities": { 3088 3138 "version": "4.5.0", ··· 3605 3655 "funding": { 3606 3656 "url": "https://github.com/sponsors/ljharb" 3607 3657 } 3658 + }, 3659 + "node_modules/github-slugger": { 3660 + "version": "2.0.0", 3661 + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", 3662 + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", 3663 + "license": "ISC" 3608 3664 }, 3609 3665 "node_modules/glob": { 3610 3666 "version": "10.4.5", ··· 3715 3771 "node": ">= 0.4" 3716 3772 } 3717 3773 }, 3774 + "node_modules/hast-util-from-dom": { 3775 + "version": "5.0.1", 3776 + "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz", 3777 + "integrity": "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==", 3778 + "license": "ISC", 3779 + "dependencies": { 3780 + "@types/hast": "^3.0.0", 3781 + "hastscript": "^9.0.0", 3782 + "web-namespaces": "^2.0.0" 3783 + }, 3784 + "funding": { 3785 + "type": "opencollective", 3786 + "url": "https://opencollective.com/unified" 3787 + } 3788 + }, 3789 + "node_modules/hast-util-from-html": { 3790 + "version": "2.0.3", 3791 + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", 3792 + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", 3793 + "license": "MIT", 3794 + "dependencies": { 3795 + "@types/hast": "^3.0.0", 3796 + "devlop": "^1.1.0", 3797 + "hast-util-from-parse5": "^8.0.0", 3798 + "parse5": "^7.0.0", 3799 + "vfile": "^6.0.0", 3800 + "vfile-message": "^4.0.0" 3801 + }, 3802 + "funding": { 3803 + "type": "opencollective", 3804 + "url": "https://opencollective.com/unified" 3805 + } 3806 + }, 3807 + "node_modules/hast-util-from-html-isomorphic": { 3808 + "version": "2.0.0", 3809 + "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz", 3810 + "integrity": "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==", 3811 + "license": "MIT", 3812 + "dependencies": { 3813 + "@types/hast": "^3.0.0", 3814 + "hast-util-from-dom": "^5.0.0", 3815 + "hast-util-from-html": "^2.0.0", 3816 + "unist-util-remove-position": "^5.0.0" 3817 + }, 3818 + "funding": { 3819 + "type": "opencollective", 3820 + "url": "https://opencollective.com/unified" 3821 + } 3822 + }, 3718 3823 "node_modules/hast-util-from-parse5": { 3719 3824 "version": "8.0.2", 3720 3825 "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.2.tgz", ··· 3735 3840 "url": "https://opencollective.com/unified" 3736 3841 } 3737 3842 }, 3843 + "node_modules/hast-util-heading-rank": { 3844 + "version": "3.0.0", 3845 + "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz", 3846 + "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==", 3847 + "license": "MIT", 3848 + "dependencies": { 3849 + "@types/hast": "^3.0.0" 3850 + }, 3851 + "funding": { 3852 + "type": "opencollective", 3853 + "url": "https://opencollective.com/unified" 3854 + } 3855 + }, 3856 + "node_modules/hast-util-is-element": { 3857 + "version": "3.0.0", 3858 + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", 3859 + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", 3860 + "license": "MIT", 3861 + "dependencies": { 3862 + "@types/hast": "^3.0.0" 3863 + }, 3864 + "funding": { 3865 + "type": "opencollective", 3866 + "url": "https://opencollective.com/unified" 3867 + } 3868 + }, 3738 3869 "node_modules/hast-util-parse-selector": { 3739 3870 "version": "4.0.0", 3740 3871 "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", ··· 3830 3961 "url": "https://opencollective.com/unified" 3831 3962 } 3832 3963 }, 3964 + "node_modules/hast-util-to-string": { 3965 + "version": "3.0.1", 3966 + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", 3967 + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", 3968 + "license": "MIT", 3969 + "dependencies": { 3970 + "@types/hast": "^3.0.0" 3971 + }, 3972 + "funding": { 3973 + "type": "opencollective", 3974 + "url": "https://opencollective.com/unified" 3975 + } 3976 + }, 3977 + "node_modules/hast-util-to-text": { 3978 + "version": "4.0.2", 3979 + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", 3980 + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", 3981 + "license": "MIT", 3982 + "dependencies": { 3983 + "@types/hast": "^3.0.0", 3984 + "@types/unist": "^3.0.0", 3985 + "hast-util-is-element": "^3.0.0", 3986 + "unist-util-find-after": "^5.0.0" 3987 + }, 3988 + "funding": { 3989 + "type": "opencollective", 3990 + "url": "https://opencollective.com/unified" 3991 + } 3992 + }, 3833 3993 "node_modules/hast-util-whitespace": { 3834 3994 "version": "3.0.0", 3835 3995 "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", ··· 3872 4032 "url": "https://github.com/sponsors/sindresorhus" 3873 4033 } 3874 4034 }, 4035 + "node_modules/highlight.js": { 4036 + "version": "11.11.1", 4037 + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", 4038 + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", 4039 + "license": "BSD-3-Clause", 4040 + "engines": { 4041 + "node": ">=12.0.0" 4042 + } 4043 + }, 3875 4044 "node_modules/html-void-elements": { 3876 4045 "version": "3.0.0", 3877 4046 "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", ··· 4121 4290 "dev": true, 4122 4291 "license": "MIT" 4123 4292 }, 4293 + "node_modules/katex": { 4294 + "version": "0.16.22", 4295 + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", 4296 + "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", 4297 + "funding": [ 4298 + "https://opencollective.com/katex", 4299 + "https://github.com/sponsors/katex" 4300 + ], 4301 + "license": "MIT", 4302 + "dependencies": { 4303 + "commander": "^8.3.0" 4304 + }, 4305 + "bin": { 4306 + "katex": "cli.js" 4307 + } 4308 + }, 4309 + "node_modules/katex/node_modules/commander": { 4310 + "version": "8.3.0", 4311 + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", 4312 + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", 4313 + "license": "MIT", 4314 + "engines": { 4315 + "node": ">= 12" 4316 + } 4317 + }, 4124 4318 "node_modules/keyv": { 4125 4319 "version": "4.5.4", 4126 4320 "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", ··· 4243 4437 "url": "https://github.com/sponsors/wooorm" 4244 4438 } 4245 4439 }, 4440 + "node_modules/lowlight": { 4441 + "version": "3.3.0", 4442 + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-3.3.0.tgz", 4443 + "integrity": "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==", 4444 + "license": "MIT", 4445 + "dependencies": { 4446 + "@types/hast": "^3.0.0", 4447 + "devlop": "^1.0.0", 4448 + "highlight.js": "~11.11.0" 4449 + }, 4450 + "funding": { 4451 + "type": "github", 4452 + "url": "https://github.com/sponsors/wooorm" 4453 + } 4454 + }, 4246 4455 "node_modules/lru-cache": { 4247 4456 "version": "10.4.3", 4248 4457 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", ··· 4423 4632 "url": "https://opencollective.com/unified" 4424 4633 } 4425 4634 }, 4635 + "node_modules/mdast-util-math": { 4636 + "version": "3.0.0", 4637 + "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-3.0.0.tgz", 4638 + "integrity": "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==", 4639 + "license": "MIT", 4640 + "dependencies": { 4641 + "@types/hast": "^3.0.0", 4642 + "@types/mdast": "^4.0.0", 4643 + "devlop": "^1.0.0", 4644 + "longest-streak": "^3.0.0", 4645 + "mdast-util-from-markdown": "^2.0.0", 4646 + "mdast-util-to-markdown": "^2.1.0", 4647 + "unist-util-remove-position": "^5.0.0" 4648 + }, 4649 + "funding": { 4650 + "type": "opencollective", 4651 + "url": "https://opencollective.com/unified" 4652 + } 4653 + }, 4654 + "node_modules/mdast-util-newline-to-break": { 4655 + "version": "2.0.0", 4656 + "resolved": "https://registry.npmjs.org/mdast-util-newline-to-break/-/mdast-util-newline-to-break-2.0.0.tgz", 4657 + "integrity": "sha512-MbgeFca0hLYIEx/2zGsszCSEJJ1JSCdiY5xQxRcLDDGa8EPvlLPupJ4DSajbMPAnC0je8jfb9TiUATnxxrHUog==", 4658 + "license": "MIT", 4659 + "dependencies": { 4660 + "@types/mdast": "^4.0.0", 4661 + "mdast-util-find-and-replace": "^3.0.0" 4662 + }, 4663 + "funding": { 4664 + "type": "opencollective", 4665 + "url": "https://opencollective.com/unified" 4666 + } 4667 + }, 4426 4668 "node_modules/mdast-util-phrasing": { 4427 4669 "version": "4.1.0", 4428 4670 "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", ··· 4692 4934 "url": "https://opencollective.com/unified" 4693 4935 } 4694 4936 }, 4937 + "node_modules/micromark-extension-math": { 4938 + "version": "3.1.0", 4939 + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", 4940 + "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", 4941 + "license": "MIT", 4942 + "dependencies": { 4943 + "@types/katex": "^0.16.0", 4944 + "devlop": "^1.0.0", 4945 + "katex": "^0.16.0", 4946 + "micromark-factory-space": "^2.0.0", 4947 + "micromark-util-character": "^2.0.0", 4948 + "micromark-util-symbol": "^2.0.0", 4949 + "micromark-util-types": "^2.0.0" 4950 + }, 4951 + "funding": { 4952 + "type": "opencollective", 4953 + "url": "https://opencollective.com/unified" 4954 + } 4955 + }, 4695 4956 "node_modules/micromark-factory-destination": { 4696 4957 "version": "2.0.1", 4697 4958 "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", ··· 5217 5478 "dev": true, 5218 5479 "license": "MIT" 5219 5480 }, 5481 + "node_modules/node-emoji": { 5482 + "version": "2.2.0", 5483 + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", 5484 + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", 5485 + "license": "MIT", 5486 + "dependencies": { 5487 + "@sindresorhus/is": "^4.6.0", 5488 + "char-regex": "^1.0.2", 5489 + "emojilib": "^2.4.0", 5490 + "skin-tone": "^2.0.0" 5491 + }, 5492 + "engines": { 5493 + "node": ">=18" 5494 + } 5495 + }, 5220 5496 "node_modules/node-fetch": { 5221 5497 "version": "2.7.0", 5222 5498 "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", ··· 5756 6032 "url": "https://paulmillr.com/funding/" 5757 6033 } 5758 6034 }, 6035 + "node_modules/rehype-autolink-headings": { 6036 + "version": "7.1.0", 6037 + "resolved": "https://registry.npmjs.org/rehype-autolink-headings/-/rehype-autolink-headings-7.1.0.tgz", 6038 + "integrity": "sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==", 6039 + "license": "MIT", 6040 + "dependencies": { 6041 + "@types/hast": "^3.0.0", 6042 + "@ungap/structured-clone": "^1.0.0", 6043 + "hast-util-heading-rank": "^3.0.0", 6044 + "hast-util-is-element": "^3.0.0", 6045 + "unified": "^11.0.0", 6046 + "unist-util-visit": "^5.0.0" 6047 + }, 6048 + "funding": { 6049 + "type": "opencollective", 6050 + "url": "https://opencollective.com/unified" 6051 + } 6052 + }, 6053 + "node_modules/rehype-highlight": { 6054 + "version": "7.0.2", 6055 + "resolved": "https://registry.npmjs.org/rehype-highlight/-/rehype-highlight-7.0.2.tgz", 6056 + "integrity": "sha512-k158pK7wdC2qL3M5NcZROZ2tR/l7zOzjxXd5VGdcfIyoijjQqpHd3JKtYSBDpDZ38UI2WJWuFAtkMDxmx5kstA==", 6057 + "license": "MIT", 6058 + "dependencies": { 6059 + "@types/hast": "^3.0.0", 6060 + "hast-util-to-text": "^4.0.0", 6061 + "lowlight": "^3.0.0", 6062 + "unist-util-visit": "^5.0.0", 6063 + "vfile": "^6.0.0" 6064 + }, 6065 + "funding": { 6066 + "type": "opencollective", 6067 + "url": "https://opencollective.com/unified" 6068 + } 6069 + }, 6070 + "node_modules/rehype-katex": { 6071 + "version": "7.0.1", 6072 + "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-7.0.1.tgz", 6073 + "integrity": "sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==", 6074 + "license": "MIT", 6075 + "dependencies": { 6076 + "@types/hast": "^3.0.0", 6077 + "@types/katex": "^0.16.0", 6078 + "hast-util-from-html-isomorphic": "^2.0.0", 6079 + "hast-util-to-text": "^4.0.0", 6080 + "katex": "^0.16.0", 6081 + "unist-util-visit-parents": "^6.0.0", 6082 + "vfile": "^6.0.0" 6083 + }, 6084 + "funding": { 6085 + "type": "opencollective", 6086 + "url": "https://opencollective.com/unified" 6087 + } 6088 + }, 5759 6089 "node_modules/rehype-raw": { 5760 6090 "version": "7.0.0", 5761 6091 "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", ··· 5785 6115 "url": "https://opencollective.com/unified" 5786 6116 } 5787 6117 }, 6118 + "node_modules/rehype-slug": { 6119 + "version": "6.0.0", 6120 + "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz", 6121 + "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==", 6122 + "license": "MIT", 6123 + "dependencies": { 6124 + "@types/hast": "^3.0.0", 6125 + "github-slugger": "^2.0.0", 6126 + "hast-util-heading-rank": "^3.0.0", 6127 + "hast-util-to-string": "^3.0.0", 6128 + "unist-util-visit": "^5.0.0" 6129 + }, 6130 + "funding": { 6131 + "type": "opencollective", 6132 + "url": "https://opencollective.com/unified" 6133 + } 6134 + }, 5788 6135 "node_modules/rehype-stringify": { 5789 6136 "version": "10.0.1", 5790 6137 "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", ··· 5816 6163 "url": "https://opencollective.com/unified" 5817 6164 } 5818 6165 }, 6166 + "node_modules/remark-breaks": { 6167 + "version": "4.0.0", 6168 + "resolved": "https://registry.npmjs.org/remark-breaks/-/remark-breaks-4.0.0.tgz", 6169 + "integrity": "sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==", 6170 + "license": "MIT", 6171 + "dependencies": { 6172 + "@types/mdast": "^4.0.0", 6173 + "mdast-util-newline-to-break": "^2.0.0", 6174 + "unified": "^11.0.0" 6175 + }, 6176 + "funding": { 6177 + "type": "opencollective", 6178 + "url": "https://opencollective.com/unified" 6179 + } 6180 + }, 6181 + "node_modules/remark-emoji": { 6182 + "version": "5.0.1", 6183 + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-5.0.1.tgz", 6184 + "integrity": "sha512-QCqTSvcZ65Ym+P+VyBKd4JfJfh7icMl7cIOGVmPMzWkDtdD8pQ0nQG7yxGolVIiMzSx90EZ7SwNiVpYpfTxn7w==", 6185 + "license": "MIT", 6186 + "dependencies": { 6187 + "@types/mdast": "^4.0.4", 6188 + "emoticon": "^4.0.1", 6189 + "mdast-util-find-and-replace": "^3.0.1", 6190 + "node-emoji": "^2.1.3", 6191 + "unified": "^11.0.4" 6192 + }, 6193 + "engines": { 6194 + "node": ">=18" 6195 + } 6196 + }, 5819 6197 "node_modules/remark-gfm": { 5820 6198 "version": "4.0.0", 5821 6199 "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", ··· 5827 6205 "micromark-extension-gfm": "^3.0.0", 5828 6206 "remark-parse": "^11.0.0", 5829 6207 "remark-stringify": "^11.0.0", 6208 + "unified": "^11.0.0" 6209 + }, 6210 + "funding": { 6211 + "type": "opencollective", 6212 + "url": "https://opencollective.com/unified" 6213 + } 6214 + }, 6215 + "node_modules/remark-math": { 6216 + "version": "6.0.0", 6217 + "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-6.0.0.tgz", 6218 + "integrity": "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==", 6219 + "license": "MIT", 6220 + "dependencies": { 6221 + "@types/mdast": "^4.0.0", 6222 + "mdast-util-math": "^3.0.0", 6223 + "micromark-extension-math": "^3.0.0", 5830 6224 "unified": "^11.0.0" 5831 6225 }, 5832 6226 "funding": { ··· 6106 6500 }, 6107 6501 "engines": { 6108 6502 "node": ">=18" 6503 + } 6504 + }, 6505 + "node_modules/skin-tone": { 6506 + "version": "2.0.0", 6507 + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", 6508 + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", 6509 + "license": "MIT", 6510 + "dependencies": { 6511 + "unicode-emoji-modifier-base": "^1.0.0" 6512 + }, 6513 + "engines": { 6514 + "node": ">=8" 6109 6515 } 6110 6516 }, 6111 6517 "node_modules/source-map-js": { ··· 6798 7204 "dev": true, 6799 7205 "license": "MIT" 6800 7206 }, 7207 + "node_modules/unicode-emoji-modifier-base": { 7208 + "version": "1.0.0", 7209 + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", 7210 + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", 7211 + "license": "MIT", 7212 + "engines": { 7213 + "node": ">=4" 7214 + } 7215 + }, 6801 7216 "node_modules/unicode-trie": { 6802 7217 "version": "2.0.0", 6803 7218 "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", ··· 6827 7242 "url": "https://opencollective.com/unified" 6828 7243 } 6829 7244 }, 7245 + "node_modules/unist-util-find-after": { 7246 + "version": "5.0.0", 7247 + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", 7248 + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", 7249 + "license": "MIT", 7250 + "dependencies": { 7251 + "@types/unist": "^3.0.0", 7252 + "unist-util-is": "^6.0.0" 7253 + }, 7254 + "funding": { 7255 + "type": "opencollective", 7256 + "url": "https://opencollective.com/unified" 7257 + } 7258 + }, 6830 7259 "node_modules/unist-util-is": { 6831 7260 "version": "6.0.0", 6832 7261 "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", ··· 6847 7276 "license": "MIT", 6848 7277 "dependencies": { 6849 7278 "@types/unist": "^3.0.0" 7279 + }, 7280 + "funding": { 7281 + "type": "opencollective", 7282 + "url": "https://opencollective.com/unified" 7283 + } 7284 + }, 7285 + "node_modules/unist-util-remove-position": { 7286 + "version": "5.0.0", 7287 + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", 7288 + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", 7289 + "license": "MIT", 7290 + "dependencies": { 7291 + "@types/unist": "^3.0.0", 7292 + "unist-util-visit": "^5.0.0" 6850 7293 }, 6851 7294 "funding": { 6852 7295 "type": "opencollective",
+7
package.json
··· 34 34 "@resvg/resvg-js": "^2.6.2", 35 35 "@tailwindcss/nesting": "^0.0.0-insiders.565cd3e", 36 36 "postcss-import": "^16.1.1", 37 + "rehype-autolink-headings": "^7.1.0", 38 + "rehype-highlight": "^7.0.2", 39 + "rehype-katex": "^7.0.1", 37 40 "rehype-raw": "^7.0.0", 38 41 "rehype-sanitize": "^6.0.0", 42 + "rehype-slug": "^6.0.0", 39 43 "rehype-stringify": "^10.0.1", 40 44 "remark": "^15.0.1", 45 + "remark-breaks": "^4.0.0", 46 + "remark-emoji": "^5.0.1", 41 47 "remark-gfm": "^4.0.0", 48 + "remark-math": "^6.0.0", 42 49 "remark-rehype": "^11.1.1", 43 50 "sanitize-html": "^2.13.1", 44 51 "satori": "^0.12.2",
+10
src/lib/css/app.css
··· 1 1 @import "$css/variables.css"; 2 2 @import "$css/animations.css"; 3 3 4 + /* KaTeX CSS for rendering mathematical expressions */ 5 + @import url('https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css'); 6 + 4 7 /* Minimalist flat styles with gentle dark pastel green theme */ 5 8 @tailwind base; 6 9 @tailwind components; ··· 45 48 font-family: "Recursive", sans-serif; 46 49 font-variation-settings: "MONO" 0, "CASL" 0, "wght" 300, "slnt" 0, 47 50 "CRSV" 0.5; 51 + } 52 + 53 + /* This is to ensure KaTeX renders correctly. 54 + It overrides the 'Recursive' font and forces the use of KaTeX's specific fonts for math elements. 55 + */ 56 + .katex { 57 + font-family: 'KaTeX_Main', 'KaTeX_Math', 'KaTeX_AMS', 'KaTeX_Typewriter', 'KaTeX_Caligraphic', 'KaTeX_Fraktur', 'KaTeX_SansSerif', 'KaTeX_Script', 'KaTeX_Size1', 'KaTeX_Size2', 'KaTeX_Size3', 'KaTeX_Size4', 'KaTeX_Varepsilon'; 48 58 } 49 59 50 60 h1 {
+20 -6
src/lib/parser/processor.ts
··· 8 8 import { customSchema } from "./schema"; 9 9 import { rehypeUpgradeImage } from "./plugins"; 10 10 import type { Schema } from "./types"; 11 + import remarkBreaks from "remark-breaks"; 12 + import remarkEmoji from "remark-emoji"; 13 + import remarkMath from "remark-math"; 14 + import rehypeKatex from "rehype-katex"; 15 + import rehypeHighlight from "rehype-highlight"; 16 + import rehypeSlug from "rehype-slug"; 17 + import rehypeAutolinkHeadings from "rehype-autolink-headings"; 11 18 12 19 export const createMarkdownProcessor = () => { 13 20 return unified() 14 - .use(remarkParse, { fragment: true }) // Parse the MD 15 - .use(remarkGfm) // Parse GH specific MD 16 - .use(remarkRehype, { allowDangerousHtml: true }) // Convert to HTML 17 - .use(rehypeRaw) // Parse HTML that exists as raw text leftover from MD parse 21 + .use(remarkParse, { fragment: true }) 22 + .use(remarkGfm) 23 + .use(remarkBreaks) // Support for hard line breaks 24 + .use(remarkEmoji) // Convert shortcodes like :heart: to emojis 25 + .use(remarkMath) // Parse math syntax 26 + .use(remarkRehype, { allowDangerousHtml: true }) 27 + .use(rehypeRaw) 28 + .use(rehypeKatex) // Convert math to KaTeX HTML 29 + .use(rehypeHighlight, { detect: true }) // Syntax highlighting for code blocks 30 + .use(rehypeSlug) // Add IDs to headings 31 + .use(rehypeAutolinkHeadings) // Add links to headings 18 32 .use(rehypeUpgradeImage) 19 - .use(rehypeSanitize, customSchema as Schema) // Sanitize the HTML 20 - .use(rehypeStringify); // Stringify 33 + .use(rehypeSanitize, customSchema as Schema) 34 + .use(rehypeStringify); 21 35 };