mirror of
https://github.com/anotherhadi/blog.git
synced 2026-05-20 21:42:33 +02:00
Compare commits
37 Commits
v1.0.0
..
a74f6b91d4
| Author | SHA1 | Date | |
|---|---|---|---|
| a74f6b91d4 | |||
| 35ac328d5e | |||
| 5ad26be352 | |||
| fac0a2fff6 | |||
| d2424e0a17 | |||
| 3b17b01d86 | |||
| 0e83788a15 | |||
| eea8c3e9be | |||
| 761e8a20cb | |||
| 1025d5bfa1 | |||
| f00515e4c3 | |||
| 5472ac3449 | |||
| e3f0fc5735 | |||
| 294c4e3acd | |||
| 97bdfd9a6e | |||
| e332a5732b | |||
| 0a8c04fccb | |||
| 8a50890037 | |||
| 8eadd0ec01 | |||
| 327eababc4 | |||
| ac6efa7496 | |||
| 163471bc2f | |||
| 9d928c6218 | |||
| 18837d814d | |||
| 7f7cef31f9 | |||
| 43fae70be1 | |||
| cd93b16618 | |||
| ae278a84ee | |||
| cca9b472fe | |||
| 120f50335b | |||
| 7105f2a5b2 | |||
| a12b3ae671 | |||
| ac552902df | |||
| 385e46ecdf | |||
| 0fcad18a60 | |||
| 90d1d22738 | |||
| d8f9c68061 |
Binary file not shown.
|
After Width: | Height: | Size: 140 KiB |
@@ -22,3 +22,5 @@ pnpm-debug.log*
|
|||||||
|
|
||||||
# jetbrains setting folder
|
# jetbrains setting folder
|
||||||
.idea/
|
.idea/
|
||||||
|
|
||||||
|
.claude/
|
||||||
|
|||||||
@@ -11,10 +11,12 @@
|
|||||||
# Another Hadi's Blog
|
# Another Hadi's Blog
|
||||||
|
|
||||||
My personal portfolio & blog; built with **Astro**, **Tailwind CSS** and **DaisyUI**.
|
My personal portfolio & blog; built with **Astro**, **Tailwind CSS** and **DaisyUI**.
|
||||||
Live at [hadi.icu](https://hadi.icu).
|
Live at [hadi.icu](https://hadi.icu/?utm_source=github&utm_medium=readme).
|
||||||
|
|
||||||
Started from [bloomfolio](https://github.com/lauroguedes/bloomfolio), thanks for this great project!
|
Started from [bloomfolio](https://github.com/lauroguedes/bloomfolio), thanks for this great project!
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
A fast, static personal website featuring:
|
A fast, static personal website featuring:
|
||||||
@@ -43,3 +45,11 @@ bun install
|
|||||||
```bash
|
```bash
|
||||||
bun run dev
|
bun run dev
|
||||||
```
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<a href="https://github.com/anotherhadi/blog">github</a> |
|
||||||
|
<a href="https://gitlab.com/anotherhadi_mirror/blog">gitlab (mirror)</a> |
|
||||||
|
<a href="https://git.hadi.icu/anotherhadi/blog">gitea (mirror)</a>
|
||||||
|
</div
|
||||||
|
|||||||
+8
-2
@@ -3,6 +3,8 @@ import { defineConfig } from 'astro/config';
|
|||||||
|
|
||||||
import tailwindcss from '@tailwindcss/vite';
|
import tailwindcss from '@tailwindcss/vite';
|
||||||
import mdx from '@astrojs/mdx';
|
import mdx from '@astrojs/mdx';
|
||||||
|
import sitemap from '@astrojs/sitemap';
|
||||||
|
import svelte from '@astrojs/svelte';
|
||||||
|
|
||||||
// https://astro.build/config
|
// https://astro.build/config
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
@@ -11,8 +13,12 @@ export default defineConfig({
|
|||||||
},
|
},
|
||||||
site: "https://hadi.icu",
|
site: "https://hadi.icu",
|
||||||
output: 'static',
|
output: 'static',
|
||||||
integrations: [mdx()],
|
integrations: [mdx(), sitemap(), svelte()],
|
||||||
vite: {
|
vite: {
|
||||||
plugins: [tailwindcss()]
|
plugins: [tailwindcss()]
|
||||||
}
|
},
|
||||||
|
prefetch: {
|
||||||
|
prefetchAll: false,
|
||||||
|
defaultStrategy: 'tap'
|
||||||
|
},
|
||||||
});
|
});
|
||||||
@@ -5,96 +5,131 @@
|
|||||||
"": {
|
"": {
|
||||||
"name": "bloomfolio",
|
"name": "bloomfolio",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/mdx": "^4.3.9",
|
"@astrojs/mdx": "5.0.4",
|
||||||
"@astrojs/rss": "^4.0.17",
|
"@astrojs/rss": "^4.0.18",
|
||||||
|
"@astrojs/sitemap": "^3.7.2",
|
||||||
|
"@astrojs/svelte": "^8.1.0",
|
||||||
"@lucide/astro": "^0.552.0",
|
"@lucide/astro": "^0.552.0",
|
||||||
"@tailwindcss/vite": "^4.1.16",
|
"@tailwindcss/vite": "^4.2.4",
|
||||||
"astro": "^5.15.2",
|
"@types/bun": "^1.3.13",
|
||||||
"daisyui": "^5.3.10",
|
"astro": "6.1.9",
|
||||||
"lucide-astro": "^0.556.0",
|
"daisyui": "^5.5.19",
|
||||||
"node-html-parser": "^7.0.1",
|
"node-html-parser": "^7.1.0",
|
||||||
"tailwindcss": "^4.1.16",
|
"svelte": "^5.55.5",
|
||||||
|
"tailwindcss": "^4.2.4",
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@astrojs/check": "^0.9.8",
|
||||||
|
"typescript": "^6.0.3",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"packages": {
|
"packages": {
|
||||||
"@astrojs/compiler": ["@astrojs/compiler@2.13.0", "", {}, "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw=="],
|
"@astrojs/check": ["@astrojs/check@0.9.8", "", { "dependencies": { "@astrojs/language-server": "^2.16.5", "chokidar": "^4.0.3", "kleur": "^4.1.5", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": "^5.0.0" }, "bin": { "astro-check": "bin/astro-check.js" } }, "sha512-LDng8446QLS5ToKjRHd3bgUdirvemVVExV7nRyJfW2wV36xuv7vDxwy5NWN9zqeSEDgg0Tv84sP+T3yEq+Zlkw=="],
|
||||||
|
|
||||||
"@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.5", "", {}, "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA=="],
|
"@astrojs/compiler": ["@astrojs/compiler@3.0.1", "", {}, "sha512-z97oYbdebO5aoWzuJ/8q5hLK232+17KcLZ7cJ8BCWk6+qNzVxn/gftC0KzMBUTD8WAaBkPpNSQK6PXLnNrZ0CA=="],
|
||||||
|
|
||||||
"@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.10", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.5", "@astrojs/prism": "3.3.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "shiki": "^3.19.0", "smol-toml": "^1.5.2", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A=="],
|
"@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.9.0", "", { "dependencies": { "picomatch": "^4.0.4" } }, "sha512-GdYkzR26re8izmyYlBqf4z2s7zNngmWLFuxw0UKiPNqHraZGS6GKWIwSHgS22RDlu2ePFJ8bzmpBcUszut/SDg=="],
|
||||||
|
|
||||||
"@astrojs/mdx": ["@astrojs/mdx@4.3.13", "", { "dependencies": { "@astrojs/markdown-remark": "6.3.10", "@mdx-js/mdx": "^3.1.1", "acorn": "^8.15.0", "es-module-lexer": "^1.7.0", "estree-util-visit": "^2.0.0", "hast-util-to-html": "^9.0.5", "piccolore": "^0.1.3", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "remark-smartypants": "^3.0.2", "source-map": "^0.7.6", "unist-util-visit": "^5.0.0", "vfile": "^6.0.3" }, "peerDependencies": { "astro": "^5.0.0" } }, "sha512-IHDHVKz0JfKBy3//52JSiyWv089b7GVSChIXLrlUOoTLWowG3wr2/8hkaEgEyd/vysvNQvGk+QhysXpJW5ve6Q=="],
|
"@astrojs/language-server": ["@astrojs/language-server@2.16.6", "", { "dependencies": { "@astrojs/compiler": "^2.13.1", "@astrojs/yaml2ts": "^0.2.3", "@jridgewell/sourcemap-codec": "^1.5.5", "@volar/kit": "~2.4.28", "@volar/language-core": "~2.4.28", "@volar/language-server": "~2.4.28", "@volar/language-service": "~2.4.28", "muggle-string": "^0.4.1", "tinyglobby": "^0.2.15", "volar-service-css": "0.0.70", "volar-service-emmet": "0.0.70", "volar-service-html": "0.0.70", "volar-service-prettier": "0.0.70", "volar-service-typescript": "0.0.70", "volar-service-typescript-twoslash-queries": "0.0.70", "volar-service-yaml": "0.0.70", "vscode-html-languageservice": "^5.6.2", "vscode-uri": "^3.1.0" }, "peerDependencies": { "prettier": "^3.0.0", "prettier-plugin-astro": ">=0.11.0" }, "optionalPeers": ["prettier", "prettier-plugin-astro"], "bin": { "astro-ls": "bin/nodeServer.js" } }, "sha512-N990lu+HSFiG57owR0XBkr02BYMgiLCshLf+4QG4v6jjSWkBeQGnzqi+E1L08xFPPJ7eEeXnxPXGLaVv5pa4Ug=="],
|
||||||
|
|
||||||
"@astrojs/prism": ["@astrojs/prism@3.3.0", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="],
|
"@astrojs/markdown-remark": ["@astrojs/markdown-remark@7.1.1", "", { "dependencies": { "@astrojs/internal-helpers": "0.9.0", "@astrojs/prism": "4.0.1", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "js-yaml": "^4.1.1", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "retext-smartypants": "^6.2.0", "shiki": "^4.0.0", "smol-toml": "^1.6.0", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.1.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-C6e9BnLGlbdv6bV8MYGeHpHxsUHrCrB4OuRLqi5LI7oiBVcBcqfUN06zpwFQdHgV48QCCrMmLpyqBr7VqC+swA=="],
|
||||||
|
|
||||||
"@astrojs/rss": ["@astrojs/rss@4.0.17", "", { "dependencies": { "fast-xml-parser": "5.4.1", "piccolore": "^0.1.3", "zod": "^4.3.6" } }, "sha512-eV+wdMbeVKC9+sPaV0LN8JL1LGo9YAh3GKl4Ou4nzMNLmXM/aswYpSGxVEAuHilgBZ6/++/Pv08ICmuOqX107w=="],
|
"@astrojs/mdx": ["@astrojs/mdx@5.0.4", "", { "dependencies": { "@astrojs/markdown-remark": "7.1.1", "@mdx-js/mdx": "^3.1.1", "acorn": "^8.16.0", "es-module-lexer": "^2.0.0", "estree-util-visit": "^2.0.0", "hast-util-to-html": "^9.0.5", "piccolore": "^0.1.3", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "remark-smartypants": "^3.0.2", "source-map": "^0.7.6", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3" }, "peerDependencies": { "astro": "^6.0.0" } }, "sha512-tSbuuYueNODiFAFaME7pjHY5lOLoxBYJi1cKd6scw9+a4ZO7C7UGdafEoVAQvOV2eO8a6RaHSAJYGVPL1w8BPA=="],
|
||||||
|
|
||||||
"@astrojs/telemetry": ["@astrojs/telemetry@3.3.0", "", { "dependencies": { "ci-info": "^4.2.0", "debug": "^4.4.0", "dlv": "^1.1.3", "dset": "^3.1.4", "is-docker": "^3.0.0", "is-wsl": "^3.1.0", "which-pm-runs": "^1.1.0" } }, "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ=="],
|
"@astrojs/prism": ["@astrojs/prism@4.0.1", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-nksZQVjlferuWzhPsBpQ1JE5XuKAf1id1/9Hj4a9KG4+ofrlzxUUwX4YGQF/SuDiuiGKEnzopGOt38F3AnVWsQ=="],
|
||||||
|
|
||||||
|
"@astrojs/rss": ["@astrojs/rss@4.0.18", "", { "dependencies": { "fast-xml-parser": "^5.5.7", "piccolore": "^0.1.3", "zod": "^4.3.6" } }, "sha512-wc5DwKlbTEdgVAWnHy8krFTeQ42t1v/DJqeq5HtulYK3FYHE4krtRGjoyhS3eXXgfdV6Raoz2RU3wrMTFAitRg=="],
|
||||||
|
|
||||||
|
"@astrojs/sitemap": ["@astrojs/sitemap@3.7.2", "", { "dependencies": { "sitemap": "^9.0.0", "stream-replace-string": "^2.0.0", "zod": "^4.3.6" } }, "sha512-PqkzkcZTb5ICiyIR8VoKbIAP/laNRXi5tw616N1Ckk+40oNB8Can1AzVV56lrbC5GKSZFCyJYUVYqVivMisvpA=="],
|
||||||
|
|
||||||
|
"@astrojs/svelte": ["@astrojs/svelte@8.1.0", "", { "dependencies": { "@sveltejs/vite-plugin-svelte": "^6.2.4", "svelte2tsx": "^0.7.52", "vite": "^7.3.2", "vitefu": "^1.1.2" }, "peerDependencies": { "astro": "^6.0.0", "svelte": "^5.43.6", "typescript": "^5.3.3" } }, "sha512-yZrHRFOxDJeo2hr9rGAMou6/6OL3agEaUCvWNWrea8YhZultsERTYZthfKNC58onAtZs76xNklOYV+G2Dp10kw=="],
|
||||||
|
|
||||||
|
"@astrojs/telemetry": ["@astrojs/telemetry@3.3.1", "", { "dependencies": { "ci-info": "^4.4.0", "dlv": "^1.1.3", "dset": "^3.1.4", "is-docker": "^4.0.0", "is-wsl": "^3.1.1", "which-pm-runs": "^1.1.0" } }, "sha512-7fcIxXS9J4ls5tr8b3ww9rbAIz2+HrhNJYZdkAhhB4za/I5IZ/60g+Bs8q7zwG0tOIZfNB4JWhVJ1Qkl/OrNCw=="],
|
||||||
|
|
||||||
|
"@astrojs/yaml2ts": ["@astrojs/yaml2ts@0.2.3", "", { "dependencies": { "yaml": "^2.8.2" } }, "sha512-PJzRmgQzUxI2uwpdX2lXSHtP4G8ocp24/t+bZyf5Fy0SZLSF9f9KXZoMlFM/XCGue+B0nH/2IZ7FpBYQATBsCg=="],
|
||||||
|
|
||||||
"@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
|
"@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
|
||||||
|
|
||||||
"@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="],
|
"@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="],
|
||||||
|
|
||||||
"@babel/parser": ["@babel/parser@7.28.5", "", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": "./bin/babel-parser.js" }, "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="],
|
"@babel/parser": ["@babel/parser@7.29.2", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA=="],
|
||||||
|
|
||||||
"@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="],
|
"@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="],
|
||||||
|
|
||||||
"@capsizecss/unpack": ["@capsizecss/unpack@3.0.1", "", { "dependencies": { "fontkit": "^2.0.2" } }, "sha512-8XqW8xGn++Eqqbz3e9wKuK7mxryeRjs4LOHLxbh2lwKeSbuNR4NFifDZT4KzvjU6HMOPbiNTsWpniK5EJfTWkg=="],
|
"@capsizecss/unpack": ["@capsizecss/unpack@4.0.0", "", { "dependencies": { "fontkitten": "^1.0.0" } }, "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA=="],
|
||||||
|
|
||||||
|
"@clack/core": ["@clack/core@1.2.0", "", { "dependencies": { "fast-wrap-ansi": "^0.1.3", "sisteransi": "^1.0.5" } }, "sha512-qfxof/3T3t9DPU/Rj3OmcFyZInceqj/NVtO9rwIuJqCUgh32gwPjpFQQp/ben07qKlhpwq7GzfWpST4qdJ5Drg=="],
|
||||||
|
|
||||||
|
"@clack/prompts": ["@clack/prompts@1.2.0", "", { "dependencies": { "@clack/core": "1.2.0", "fast-string-width": "^1.1.0", "fast-wrap-ansi": "^0.1.3", "sisteransi": "^1.0.5" } }, "sha512-4jmztR9fMqPMjz6H/UZXj0zEmE43ha1euENwkckKKel4XpSfokExPo5AiVStdHSAlHekz4d0CA/r45Ok1E4D3w=="],
|
||||||
|
|
||||||
|
"@emmetio/abbreviation": ["@emmetio/abbreviation@2.3.3", "", { "dependencies": { "@emmetio/scanner": "^1.0.4" } }, "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA=="],
|
||||||
|
|
||||||
|
"@emmetio/css-abbreviation": ["@emmetio/css-abbreviation@2.1.8", "", { "dependencies": { "@emmetio/scanner": "^1.0.4" } }, "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw=="],
|
||||||
|
|
||||||
|
"@emmetio/css-parser": ["@emmetio/css-parser@0.4.1", "", { "dependencies": { "@emmetio/stream-reader": "^2.2.0", "@emmetio/stream-reader-utils": "^0.1.0" } }, "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ=="],
|
||||||
|
|
||||||
|
"@emmetio/html-matcher": ["@emmetio/html-matcher@1.3.0", "", { "dependencies": { "@emmetio/scanner": "^1.0.0" } }, "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ=="],
|
||||||
|
|
||||||
|
"@emmetio/scanner": ["@emmetio/scanner@1.0.4", "", {}, "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA=="],
|
||||||
|
|
||||||
|
"@emmetio/stream-reader": ["@emmetio/stream-reader@2.2.0", "", {}, "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw=="],
|
||||||
|
|
||||||
|
"@emmetio/stream-reader-utils": ["@emmetio/stream-reader-utils@0.1.0", "", {}, "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A=="],
|
||||||
|
|
||||||
"@emnapi/runtime": ["@emnapi/runtime@1.7.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA=="],
|
"@emnapi/runtime": ["@emnapi/runtime@1.7.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA=="],
|
||||||
|
|
||||||
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
|
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q=="],
|
||||||
|
|
||||||
"@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="],
|
"@esbuild/android-arm": ["@esbuild/android-arm@0.27.4", "", { "os": "android", "cpu": "arm" }, "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ=="],
|
||||||
|
|
||||||
"@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="],
|
"@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.4", "", { "os": "android", "cpu": "arm64" }, "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw=="],
|
||||||
|
|
||||||
"@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="],
|
"@esbuild/android-x64": ["@esbuild/android-x64@0.27.4", "", { "os": "android", "cpu": "x64" }, "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw=="],
|
||||||
|
|
||||||
"@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="],
|
"@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ=="],
|
||||||
|
|
||||||
"@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="],
|
"@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw=="],
|
||||||
|
|
||||||
"@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="],
|
"@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw=="],
|
||||||
|
|
||||||
"@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="],
|
"@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ=="],
|
||||||
|
|
||||||
"@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="],
|
"@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.4", "", { "os": "linux", "cpu": "arm" }, "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg=="],
|
||||||
|
|
||||||
"@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="],
|
"@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA=="],
|
||||||
|
|
||||||
"@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="],
|
"@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA=="],
|
||||||
|
|
||||||
"@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="],
|
"@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA=="],
|
||||||
|
|
||||||
"@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="],
|
"@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw=="],
|
||||||
|
|
||||||
"@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="],
|
"@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA=="],
|
||||||
|
|
||||||
"@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="],
|
"@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw=="],
|
||||||
|
|
||||||
"@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="],
|
"@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA=="],
|
||||||
|
|
||||||
"@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="],
|
"@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.4", "", { "os": "linux", "cpu": "x64" }, "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA=="],
|
||||||
|
|
||||||
"@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="],
|
"@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.4", "", { "os": "none", "cpu": "arm64" }, "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q=="],
|
||||||
|
|
||||||
"@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="],
|
"@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.4", "", { "os": "none", "cpu": "x64" }, "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg=="],
|
||||||
|
|
||||||
"@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="],
|
"@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow=="],
|
||||||
|
|
||||||
"@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="],
|
"@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ=="],
|
||||||
|
|
||||||
"@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="],
|
"@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.4", "", { "os": "none", "cpu": "arm64" }, "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg=="],
|
||||||
|
|
||||||
"@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="],
|
"@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g=="],
|
||||||
|
|
||||||
"@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="],
|
"@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg=="],
|
||||||
|
|
||||||
"@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="],
|
"@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw=="],
|
||||||
|
|
||||||
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="],
|
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.4", "", { "os": "win32", "cpu": "x64" }, "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg=="],
|
||||||
|
|
||||||
"@img/colour": ["@img/colour@1.0.0", "", {}, "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw=="],
|
"@img/colour": ["@img/colour@1.0.0", "", {}, "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw=="],
|
||||||
|
|
||||||
@@ -208,51 +243,59 @@
|
|||||||
|
|
||||||
"@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.54.0", "", { "os": "win32", "cpu": "x64" }, "sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg=="],
|
"@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.54.0", "", { "os": "win32", "cpu": "x64" }, "sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg=="],
|
||||||
|
|
||||||
"@shikijs/core": ["@shikijs/core@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g=="],
|
"@shikijs/core": ["@shikijs/core@4.0.2", "", { "dependencies": { "@shikijs/primitive": "4.0.2", "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw=="],
|
||||||
|
|
||||||
"@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-OFx8fHAZuk7I42Z9YAdZ95To6jDePQ9Rnfbw9uSRTSbBhYBp1kEOKv/3jOimcj3VRUKusDYM6DswLauwfhboLg=="],
|
"@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag=="],
|
||||||
|
|
||||||
"@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ=="],
|
"@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg=="],
|
||||||
|
|
||||||
"@shikijs/langs": ["@shikijs/langs@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0" } }, "sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA=="],
|
"@shikijs/langs": ["@shikijs/langs@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2" } }, "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg=="],
|
||||||
|
|
||||||
"@shikijs/themes": ["@shikijs/themes@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0" } }, "sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ=="],
|
"@shikijs/primitive": ["@shikijs/primitive@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw=="],
|
||||||
|
|
||||||
"@shikijs/types": ["@shikijs/types@3.20.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw=="],
|
"@shikijs/themes": ["@shikijs/themes@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2" } }, "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA=="],
|
||||||
|
|
||||||
|
"@shikijs/types": ["@shikijs/types@4.0.2", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg=="],
|
||||||
|
|
||||||
"@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
|
"@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
|
||||||
|
|
||||||
"@swc/helpers": ["@swc/helpers@0.5.18", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ=="],
|
"@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.9", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA=="],
|
||||||
|
|
||||||
"@tailwindcss/node": ["@tailwindcss/node@4.1.18", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.6.1", "lightningcss": "1.30.2", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.1.18" } }, "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ=="],
|
"@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@6.2.4", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", "deepmerge": "^4.3.1", "magic-string": "^0.30.21", "obug": "^2.1.0", "vitefu": "^1.1.1" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.18", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.18", "@tailwindcss/oxide-darwin-arm64": "4.1.18", "@tailwindcss/oxide-darwin-x64": "4.1.18", "@tailwindcss/oxide-freebsd-x64": "4.1.18", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", "@tailwindcss/oxide-linux-x64-musl": "4.1.18", "@tailwindcss/oxide-wasm32-wasi": "4.1.18", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" } }, "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A=="],
|
"@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@5.0.2", "", { "dependencies": { "obug": "^2.1.0" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.18", "", { "os": "android", "cpu": "arm64" }, "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q=="],
|
"@tailwindcss/node": ["@tailwindcss/node@4.2.4", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.4" } }, "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.18", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A=="],
|
"@tailwindcss/oxide": ["@tailwindcss/oxide@4.2.4", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.2.4", "@tailwindcss/oxide-darwin-arm64": "4.2.4", "@tailwindcss/oxide-darwin-x64": "4.2.4", "@tailwindcss/oxide-freebsd-x64": "4.2.4", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4", "@tailwindcss/oxide-linux-arm64-gnu": "4.2.4", "@tailwindcss/oxide-linux-arm64-musl": "4.2.4", "@tailwindcss/oxide-linux-x64-gnu": "4.2.4", "@tailwindcss/oxide-linux-x64-musl": "4.2.4", "@tailwindcss/oxide-wasm32-wasi": "4.2.4", "@tailwindcss/oxide-win32-arm64-msvc": "4.2.4", "@tailwindcss/oxide-win32-x64-msvc": "4.2.4" } }, "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.18", "", { "os": "darwin", "cpu": "x64" }, "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw=="],
|
"@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.2.4", "", { "os": "android", "cpu": "arm64" }, "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.18", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA=="],
|
"@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18", "", { "os": "linux", "cpu": "arm" }, "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA=="],
|
"@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw=="],
|
"@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.2.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg=="],
|
"@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.18", "", { "os": "linux", "cpu": "x64" }, "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g=="],
|
"@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.18", "", { "os": "linux", "cpu": "x64" }, "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ=="],
|
"@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.18", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.0", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.4.0" }, "cpu": "none" }, "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA=="],
|
"@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.18", "", { "os": "win32", "cpu": "arm64" }, "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA=="],
|
"@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.18", "", { "os": "win32", "cpu": "x64" }, "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q=="],
|
"@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.2.4", "", { "dependencies": { "@emnapi/core": "^1.8.1", "@emnapi/runtime": "^1.8.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.1", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw=="],
|
||||||
|
|
||||||
"@tailwindcss/vite": ["@tailwindcss/vite@4.1.18", "", { "dependencies": { "@tailwindcss/node": "4.1.18", "@tailwindcss/oxide": "4.1.18", "tailwindcss": "4.1.18" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA=="],
|
"@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.2.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.4", "", { "os": "win32", "cpu": "x64" }, "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw=="],
|
||||||
|
|
||||||
|
"@tailwindcss/vite": ["@tailwindcss/vite@4.2.4", "", { "dependencies": { "@tailwindcss/node": "4.2.4", "@tailwindcss/oxide": "4.2.4", "tailwindcss": "4.2.4" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-pCvohwOCspk3ZFn6eJzrrX3g4n2JY73H6MmYC87XfGPyTty4YsCjYTMArRZm/zOI8dIt3+EcrLHAFPe5A4bgtw=="],
|
||||||
|
|
||||||
|
"@types/bun": ["@types/bun@1.3.13", "", { "dependencies": { "bun-types": "1.3.13" } }, "sha512-9fqXWk5YIHGGnUau9TEi+qdlTYDAnOj+xLCmSTwXfAIqXr2x4tytJb43E9uCvt09zJURKXwAtkoH4nLQfzeTXw=="],
|
||||||
|
|
||||||
"@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="],
|
"@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="],
|
||||||
|
|
||||||
@@ -260,8 +303,6 @@
|
|||||||
|
|
||||||
"@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="],
|
"@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="],
|
||||||
|
|
||||||
"@types/fontkit": ["@types/fontkit@2.0.8", "", { "dependencies": { "@types/node": "*" } }, "sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew=="],
|
|
||||||
|
|
||||||
"@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
|
"@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
|
||||||
|
|
||||||
"@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="],
|
"@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="],
|
||||||
@@ -272,24 +313,48 @@
|
|||||||
|
|
||||||
"@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="],
|
"@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="],
|
||||||
|
|
||||||
"@types/node": ["@types/node@25.0.3", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA=="],
|
"@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="],
|
||||||
|
|
||||||
|
"@types/sax": ["@types/sax@1.2.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A=="],
|
||||||
|
|
||||||
|
"@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="],
|
||||||
|
|
||||||
"@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
|
"@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
|
||||||
|
|
||||||
"@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
|
"@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
|
||||||
|
|
||||||
"acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
|
"@volar/kit": ["@volar/kit@2.4.28", "", { "dependencies": { "@volar/language-service": "2.4.28", "@volar/typescript": "2.4.28", "typesafe-path": "^0.2.2", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "typescript": "*" } }, "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg=="],
|
||||||
|
|
||||||
|
"@volar/language-core": ["@volar/language-core@2.4.28", "", { "dependencies": { "@volar/source-map": "2.4.28" } }, "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ=="],
|
||||||
|
|
||||||
|
"@volar/language-server": ["@volar/language-server@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "@volar/language-service": "2.4.28", "@volar/typescript": "2.4.28", "path-browserify": "^1.0.1", "request-light": "^0.7.0", "vscode-languageserver": "^9.0.1", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw=="],
|
||||||
|
|
||||||
|
"@volar/language-service": ["@volar/language-service@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw=="],
|
||||||
|
|
||||||
|
"@volar/source-map": ["@volar/source-map@2.4.28", "", {}, "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ=="],
|
||||||
|
|
||||||
|
"@volar/typescript": ["@volar/typescript@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw=="],
|
||||||
|
|
||||||
|
"@vscode/emmet-helper": ["@vscode/emmet-helper@2.11.0", "", { "dependencies": { "emmet": "^2.4.3", "jsonc-parser": "^2.3.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.15.1", "vscode-uri": "^3.0.8" } }, "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw=="],
|
||||||
|
|
||||||
|
"@vscode/l10n": ["@vscode/l10n@0.0.18", "", {}, "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ=="],
|
||||||
|
|
||||||
|
"acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
|
||||||
|
|
||||||
"acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
|
"acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
|
||||||
|
|
||||||
"ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="],
|
"ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="],
|
||||||
|
|
||||||
"ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
|
"ajv-draft-04": ["ajv-draft-04@1.0.0", "", { "peerDependencies": { "ajv": "^8.5.0" }, "optionalPeers": ["ajv"] }, "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw=="],
|
||||||
|
|
||||||
"ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
|
"ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||||
|
|
||||||
|
"ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||||
|
|
||||||
"anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
|
"anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
|
||||||
|
|
||||||
|
"arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="],
|
||||||
|
|
||||||
"argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
|
"argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
|
||||||
|
|
||||||
"aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
|
"aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
|
||||||
@@ -298,28 +363,18 @@
|
|||||||
|
|
||||||
"astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="],
|
"astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="],
|
||||||
|
|
||||||
"astro": ["astro@5.16.6", "", { "dependencies": { "@astrojs/compiler": "^2.13.0", "@astrojs/internal-helpers": "0.7.5", "@astrojs/markdown-remark": "6.3.10", "@astrojs/telemetry": "3.3.0", "@capsizecss/unpack": "^3.0.1", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "acorn": "^8.15.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.3.1", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^1.0.2", "cssesc": "^3.0.0", "debug": "^4.4.3", "deterministic-object-hash": "^2.0.2", "devalue": "^5.5.0", "diff": "^5.2.0", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.7.0", "esbuild": "^0.25.0", "estree-walker": "^3.0.3", "flattie": "^1.1.1", "fontace": "~0.3.1", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "magic-string": "^0.30.21", "magicast": "^0.5.1", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "p-limit": "^6.2.0", "p-queue": "^8.1.1", "package-manager-detector": "^1.5.0", "piccolore": "^0.1.3", "picomatch": "^4.0.3", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.3", "shiki": "^3.15.0", "smol-toml": "^1.5.2", "svgo": "^4.0.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tsconfck": "^3.1.6", "ultrahtml": "^1.6.0", "unifont": "~0.6.0", "unist-util-visit": "^5.0.0", "unstorage": "^1.17.3", "vfile": "^6.0.3", "vite": "^6.4.1", "vitefu": "^1.1.1", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "yocto-spinner": "^0.2.3", "zod": "^3.25.76", "zod-to-json-schema": "^3.25.0", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.34.0" }, "bin": { "astro": "astro.js" } }, "sha512-6mF/YrvwwRxLTu+aMEa5pwzKUNl5ZetWbTyZCs9Um0F12HUmxUiF5UHiZPy4rifzU3gtpM3xP2DfdmkNX9eZRg=="],
|
"astro": ["astro@6.1.9", "", { "dependencies": { "@astrojs/compiler": "^3.0.1", "@astrojs/internal-helpers": "0.9.0", "@astrojs/markdown-remark": "7.1.1", "@astrojs/telemetry": "3.3.1", "@capsizecss/unpack": "^4.0.0", "@clack/prompts": "^1.1.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "ci-info": "^4.4.0", "clsx": "^2.1.1", "common-ancestor-path": "^2.0.0", "cookie": "^1.1.1", "devalue": "^5.6.3", "diff": "^8.0.3", "dset": "^3.1.4", "es-module-lexer": "^2.0.0", "esbuild": "^0.27.3", "flattie": "^1.1.1", "fontace": "~0.4.1", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "js-yaml": "^4.1.1", "magic-string": "^0.30.21", "magicast": "^0.5.2", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "obug": "^2.1.1", "p-limit": "^7.3.0", "p-queue": "^9.1.0", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.4", "rehype": "^13.0.2", "semver": "^7.7.4", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "svgo": "^4.0.1", "tinyclip": "^0.1.12", "tinyexec": "^1.0.4", "tinyglobby": "^0.2.15", "tsconfck": "^3.1.6", "ultrahtml": "^1.6.0", "unifont": "~0.7.4", "unist-util-visit": "^5.1.0", "unstorage": "^1.17.5", "vfile": "^6.0.3", "vite": "^7.3.2", "vitefu": "^1.1.2", "xxhash-wasm": "^1.1.0", "yargs-parser": "^22.0.0", "zod": "^4.3.6" }, "optionalDependencies": { "sharp": "^0.34.0" }, "bin": { "astro": "bin/astro.mjs" } }, "sha512-NsAHzMzpznB281g2aM5qnBt2QjfH6ttKiZ3hSZw52If8JJ+62kbnBKbyKhR2glQcJLl7Jfe4GSl0DihFZ36rRQ=="],
|
||||||
|
|
||||||
"axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
|
"axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
|
||||||
|
|
||||||
"bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="],
|
"bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="],
|
||||||
|
|
||||||
"base-64": ["base-64@1.0.0", "", {}, "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="],
|
|
||||||
|
|
||||||
"base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
|
|
||||||
|
|
||||||
"boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="],
|
"boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="],
|
||||||
|
|
||||||
"boxen": ["boxen@8.0.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^8.0.0", "chalk": "^5.3.0", "cli-boxes": "^3.0.0", "string-width": "^7.2.0", "type-fest": "^4.21.0", "widest-line": "^5.0.0", "wrap-ansi": "^9.0.0" } }, "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw=="],
|
"bun-types": ["bun-types@1.3.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-QXKeHLlOLqQX9LgYaHJfzdBaV21T63HhFJnvuRCcjZiaUDpbs5ED1MgxbMra71CsryN/1dAoXuJJJwIv/2drVA=="],
|
||||||
|
|
||||||
"brotli": ["brotli@1.3.3", "", { "dependencies": { "base64-js": "^1.1.2" } }, "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg=="],
|
|
||||||
|
|
||||||
"camelcase": ["camelcase@8.0.0", "", {}, "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA=="],
|
|
||||||
|
|
||||||
"ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
|
"ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
|
||||||
|
|
||||||
"chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
|
|
||||||
|
|
||||||
"character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="],
|
"character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="],
|
||||||
|
|
||||||
"character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="],
|
"character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="],
|
||||||
@@ -330,21 +385,23 @@
|
|||||||
|
|
||||||
"chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
|
"chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
|
||||||
|
|
||||||
"ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="],
|
"ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="],
|
||||||
|
|
||||||
"cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="],
|
"cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
|
||||||
|
|
||||||
"clone": ["clone@2.1.2", "", {}, "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="],
|
|
||||||
|
|
||||||
"clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
|
"clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
|
||||||
|
|
||||||
"collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="],
|
"collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="],
|
||||||
|
|
||||||
|
"color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
|
||||||
|
|
||||||
|
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
|
||||||
|
|
||||||
"comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
|
"comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
|
||||||
|
|
||||||
"commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
|
"commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
|
||||||
|
|
||||||
"common-ancestor-path": ["common-ancestor-path@1.0.1", "", {}, "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="],
|
"common-ancestor-path": ["common-ancestor-path@2.0.0", "", {}, "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng=="],
|
||||||
|
|
||||||
"cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
|
"cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
|
||||||
|
|
||||||
@@ -358,16 +415,18 @@
|
|||||||
|
|
||||||
"css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="],
|
"css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="],
|
||||||
|
|
||||||
"cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
|
|
||||||
|
|
||||||
"csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="],
|
"csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="],
|
||||||
|
|
||||||
"daisyui": ["daisyui@5.5.14", "", {}, "sha512-L47rvw7I7hK68TA97VB8Ee0woHew+/ohR6Lx6Ah/krfISOqcG4My7poNpX5Mo5/ytMxiR40fEaz6njzDi7cuSg=="],
|
"daisyui": ["daisyui@5.5.19", "", {}, "sha512-pbFAkl1VCEh/MPCeclKL61I/MqRIFFhNU7yiXoDDRapXN4/qNCoMxeCCswyxEEhqL5eiTTfwHvucFtOE71C9sA=="],
|
||||||
|
|
||||||
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
|
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
|
||||||
|
|
||||||
"decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="],
|
"decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="],
|
||||||
|
|
||||||
|
"dedent-js": ["dedent-js@1.0.1", "", {}, "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ=="],
|
||||||
|
|
||||||
|
"deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
|
||||||
|
|
||||||
"defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="],
|
"defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="],
|
||||||
|
|
||||||
"dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
|
"dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
|
||||||
@@ -376,15 +435,11 @@
|
|||||||
|
|
||||||
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
|
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
|
||||||
|
|
||||||
"deterministic-object-hash": ["deterministic-object-hash@2.0.2", "", { "dependencies": { "base-64": "^1.0.0" } }, "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="],
|
"devalue": ["devalue@5.6.4", "", {}, "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA=="],
|
||||||
|
|
||||||
"devalue": ["devalue@5.6.1", "", {}, "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A=="],
|
|
||||||
|
|
||||||
"devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
|
"devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
|
||||||
|
|
||||||
"dfa": ["dfa@1.2.0", "", {}, "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q=="],
|
"diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="],
|
||||||
|
|
||||||
"diff": ["diff@5.2.0", "", {}, "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A=="],
|
|
||||||
|
|
||||||
"dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="],
|
"dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="],
|
||||||
|
|
||||||
@@ -398,22 +453,30 @@
|
|||||||
|
|
||||||
"dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="],
|
"dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="],
|
||||||
|
|
||||||
"emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
|
"emmet": ["emmet@2.4.11", "", { "dependencies": { "@emmetio/abbreviation": "^2.3.3", "@emmetio/css-abbreviation": "^2.1.8" } }, "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ=="],
|
||||||
|
|
||||||
"enhanced-resolve": ["enhanced-resolve@5.18.4", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q=="],
|
"emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
||||||
|
|
||||||
|
"enhanced-resolve": ["enhanced-resolve@5.20.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA=="],
|
||||||
|
|
||||||
"entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
|
"entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
|
||||||
|
|
||||||
"es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="],
|
"es-module-lexer": ["es-module-lexer@2.0.0", "", {}, "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw=="],
|
||||||
|
|
||||||
"esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="],
|
"esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="],
|
||||||
|
|
||||||
"esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="],
|
"esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="],
|
||||||
|
|
||||||
"esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
|
"esbuild": ["esbuild@0.27.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.4", "@esbuild/android-arm": "0.27.4", "@esbuild/android-arm64": "0.27.4", "@esbuild/android-x64": "0.27.4", "@esbuild/darwin-arm64": "0.27.4", "@esbuild/darwin-x64": "0.27.4", "@esbuild/freebsd-arm64": "0.27.4", "@esbuild/freebsd-x64": "0.27.4", "@esbuild/linux-arm": "0.27.4", "@esbuild/linux-arm64": "0.27.4", "@esbuild/linux-ia32": "0.27.4", "@esbuild/linux-loong64": "0.27.4", "@esbuild/linux-mips64el": "0.27.4", "@esbuild/linux-ppc64": "0.27.4", "@esbuild/linux-riscv64": "0.27.4", "@esbuild/linux-s390x": "0.27.4", "@esbuild/linux-x64": "0.27.4", "@esbuild/netbsd-arm64": "0.27.4", "@esbuild/netbsd-x64": "0.27.4", "@esbuild/openbsd-arm64": "0.27.4", "@esbuild/openbsd-x64": "0.27.4", "@esbuild/openharmony-arm64": "0.27.4", "@esbuild/sunos-x64": "0.27.4", "@esbuild/win32-arm64": "0.27.4", "@esbuild/win32-ia32": "0.27.4", "@esbuild/win32-x64": "0.27.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ=="],
|
||||||
|
|
||||||
|
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
|
||||||
|
|
||||||
"escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
|
"escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
|
||||||
|
|
||||||
|
"esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="],
|
||||||
|
|
||||||
|
"esrap": ["esrap@2.2.5", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, "peerDependencies": { "@typescript-eslint/types": "^8.2.0" }, "optionalPeers": ["@typescript-eslint/types"] }, "sha512-/yLB1538mag+dn0wsePTe8C0rDIjUOaJpMs2McodSzmM2msWcZsBSdRtg6HOBt0A/r82BN+Md3pgwSc/uWt2Ig=="],
|
||||||
|
|
||||||
"estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="],
|
"estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="],
|
||||||
|
|
||||||
"estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="],
|
"estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="],
|
||||||
@@ -434,27 +497,35 @@
|
|||||||
|
|
||||||
"fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
|
"fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
|
||||||
|
|
||||||
|
"fast-string-truncated-width": ["fast-string-truncated-width@1.2.1", "", {}, "sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow=="],
|
||||||
|
|
||||||
|
"fast-string-width": ["fast-string-width@1.1.0", "", { "dependencies": { "fast-string-truncated-width": "^1.2.0" } }, "sha512-O3fwIVIH5gKB38QNbdg+3760ZmGz0SZMgvwJbA1b2TGXceKE6A2cOlfogh1iw8lr049zPyd7YADHy+B7U4W9bQ=="],
|
||||||
|
|
||||||
|
"fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="],
|
||||||
|
|
||||||
|
"fast-wrap-ansi": ["fast-wrap-ansi@0.1.6", "", { "dependencies": { "fast-string-width": "^1.1.0" } }, "sha512-HlUwET7a5gqjURj70D5jl7aC3Zmy4weA1SHUfM0JFI0Ptq987NH2TwbBFLoERhfwk+E+eaq4EK3jXoT+R3yp3w=="],
|
||||||
|
|
||||||
"fast-xml-builder": ["fast-xml-builder@1.1.4", "", { "dependencies": { "path-expression-matcher": "^1.1.3" } }, "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg=="],
|
"fast-xml-builder": ["fast-xml-builder@1.1.4", "", { "dependencies": { "path-expression-matcher": "^1.1.3" } }, "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg=="],
|
||||||
|
|
||||||
"fast-xml-parser": ["fast-xml-parser@5.4.1", "", { "dependencies": { "fast-xml-builder": "^1.0.0", "strnum": "^2.1.2" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A=="],
|
"fast-xml-parser": ["fast-xml-parser@5.5.9", "", { "dependencies": { "fast-xml-builder": "^1.1.4", "path-expression-matcher": "^1.2.0", "strnum": "^2.2.2" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-jldvxr1MC6rtiZKgrFnDSvT8xuH+eJqxqOBThUVjYrxssYTo1avZLGql5l0a0BAERR01CadYzZ83kVEkbyDg+g=="],
|
||||||
|
|
||||||
"fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
|
"fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
|
||||||
|
|
||||||
"flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="],
|
"flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="],
|
||||||
|
|
||||||
"fontace": ["fontace@0.3.1", "", { "dependencies": { "@types/fontkit": "^2.0.8", "fontkit": "^2.0.4" } }, "sha512-9f5g4feWT1jWT8+SbL85aLIRLIXUaDygaM2xPXRmzPYxrOMNok79Lr3FGJoKVNKibE0WCunNiEVG2mwuE+2qEg=="],
|
"fontace": ["fontace@0.4.1", "", { "dependencies": { "fontkitten": "^1.0.2" } }, "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw=="],
|
||||||
|
|
||||||
"fontkit": ["fontkit@2.0.4", "", { "dependencies": { "@swc/helpers": "^0.5.12", "brotli": "^1.3.2", "clone": "^2.1.2", "dfa": "^1.2.0", "fast-deep-equal": "^3.1.3", "restructure": "^3.0.0", "tiny-inflate": "^1.0.3", "unicode-properties": "^1.4.0", "unicode-trie": "^2.0.0" } }, "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g=="],
|
"fontkitten": ["fontkitten@1.0.3", "", { "dependencies": { "tiny-inflate": "^1.0.3" } }, "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw=="],
|
||||||
|
|
||||||
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
|
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
|
||||||
|
|
||||||
"get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="],
|
"get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
|
||||||
|
|
||||||
"github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="],
|
"github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="],
|
||||||
|
|
||||||
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
|
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
|
||||||
|
|
||||||
"h3": ["h3@1.15.4", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.5", "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.2", "radix3": "^1.1.2", "ufo": "^1.6.1", "uncrypto": "^0.1.3" } }, "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ=="],
|
"h3": ["h3@1.15.10", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.5", "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-YzJeWSkDZxAhvmp8dexjRK5hxziRO7I9m0N53WhvYL5NiWfkUkzssVzY9jvGu0HBoLFW6+duYmNSn6MaZBCCtg=="],
|
||||||
|
|
||||||
"hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="],
|
"hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="],
|
||||||
|
|
||||||
@@ -488,8 +559,6 @@
|
|||||||
|
|
||||||
"http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="],
|
"http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="],
|
||||||
|
|
||||||
"import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="],
|
|
||||||
|
|
||||||
"inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="],
|
"inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="],
|
||||||
|
|
||||||
"iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="],
|
"iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="],
|
||||||
@@ -500,7 +569,7 @@
|
|||||||
|
|
||||||
"is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="],
|
"is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="],
|
||||||
|
|
||||||
"is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
|
"is-docker": ["is-docker@4.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA=="],
|
||||||
|
|
||||||
"is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
|
"is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
|
||||||
|
|
||||||
@@ -510,47 +579,53 @@
|
|||||||
|
|
||||||
"is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
|
"is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
|
||||||
|
|
||||||
"is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="],
|
"is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="],
|
||||||
|
|
||||||
|
"is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="],
|
||||||
|
|
||||||
"jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
|
"jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
|
||||||
|
|
||||||
"js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
|
"js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
|
||||||
|
|
||||||
"kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
|
"json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
|
||||||
|
|
||||||
"lightningcss": ["lightningcss@1.30.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.30.2", "lightningcss-darwin-arm64": "1.30.2", "lightningcss-darwin-x64": "1.30.2", "lightningcss-freebsd-x64": "1.30.2", "lightningcss-linux-arm-gnueabihf": "1.30.2", "lightningcss-linux-arm64-gnu": "1.30.2", "lightningcss-linux-arm64-musl": "1.30.2", "lightningcss-linux-x64-gnu": "1.30.2", "lightningcss-linux-x64-musl": "1.30.2", "lightningcss-win32-arm64-msvc": "1.30.2", "lightningcss-win32-x64-msvc": "1.30.2" } }, "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="],
|
"jsonc-parser": ["jsonc-parser@2.3.1", "", {}, "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg=="],
|
||||||
|
|
||||||
"lightningcss-android-arm64": ["lightningcss-android-arm64@1.30.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="],
|
"kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
|
||||||
|
|
||||||
"lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA=="],
|
"lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
|
||||||
|
|
||||||
"lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ=="],
|
"lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="],
|
||||||
|
|
||||||
"lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA=="],
|
"lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="],
|
||||||
|
|
||||||
"lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.2", "", { "os": "linux", "cpu": "arm" }, "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA=="],
|
"lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="],
|
||||||
|
|
||||||
"lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A=="],
|
"lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="],
|
||||||
|
|
||||||
"lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA=="],
|
"lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="],
|
||||||
|
|
||||||
"lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w=="],
|
"lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="],
|
||||||
|
|
||||||
"lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA=="],
|
"lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="],
|
||||||
|
|
||||||
"lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ=="],
|
"lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="],
|
||||||
|
|
||||||
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw=="],
|
"lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="],
|
||||||
|
|
||||||
|
"lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="],
|
||||||
|
|
||||||
|
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="],
|
||||||
|
|
||||||
|
"locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="],
|
||||||
|
|
||||||
"longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
|
"longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
|
||||||
|
|
||||||
"lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
|
"lru-cache": ["lru-cache@11.2.7", "", {}, "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA=="],
|
||||||
|
|
||||||
"lucide-astro": ["lucide-astro@0.556.0", "", { "peerDependencies": { "astro": ">=2.7.1" } }, "sha512-ugMjPb45AMfkLCaduNSbyy5NQEKvB1TxVVMmUS4S6L807PMESnX0Qp+DIKHjbyjJmPXOyLRbrzvR3YikTK7brg=="],
|
|
||||||
|
|
||||||
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
|
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
|
||||||
|
|
||||||
"magicast": ["magicast@0.5.1", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "source-map-js": "^1.2.1" } }, "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw=="],
|
"magicast": ["magicast@0.5.2", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ=="],
|
||||||
|
|
||||||
"markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="],
|
"markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="],
|
||||||
|
|
||||||
@@ -666,6 +741,8 @@
|
|||||||
|
|
||||||
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||||
|
|
||||||
|
"muggle-string": ["muggle-string@0.4.1", "", {}, "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="],
|
||||||
|
|
||||||
"nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
|
"nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
|
||||||
|
|
||||||
"neotraverse": ["neotraverse@0.6.18", "", {}, "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="],
|
"neotraverse": ["neotraverse@0.6.18", "", {}, "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="],
|
||||||
@@ -674,7 +751,7 @@
|
|||||||
|
|
||||||
"node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="],
|
"node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="],
|
||||||
|
|
||||||
"node-html-parser": ["node-html-parser@7.0.1", "", { "dependencies": { "css-select": "^5.1.0", "he": "1.2.0" } }, "sha512-KGtmPY2kS0thCWGK0VuPyOS+pBKhhe8gXztzA2ilAOhbUbxa9homF1bOyKvhGzMLXUoRds9IOmr/v5lr/lqNmA=="],
|
"node-html-parser": ["node-html-parser@7.1.0", "", { "dependencies": { "css-select": "^5.1.0", "he": "1.2.0" } }, "sha512-iJo8b2uYGT40Y8BTyy5ufL6IVbN8rbm/1QK2xffXU/1a/v3AAa0d1YAoqBNYqaS4R/HajkWIpIfdE6KcyFh1AQ=="],
|
||||||
|
|
||||||
"node-mock-http": ["node-mock-http@1.0.4", "", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="],
|
"node-mock-http": ["node-mock-http@1.0.4", "", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="],
|
||||||
|
|
||||||
@@ -682,6 +759,8 @@
|
|||||||
|
|
||||||
"nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="],
|
"nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="],
|
||||||
|
|
||||||
|
"obug": ["obug@2.1.1", "", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="],
|
||||||
|
|
||||||
"ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="],
|
"ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="],
|
||||||
|
|
||||||
"ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="],
|
"ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="],
|
||||||
@@ -690,35 +769,35 @@
|
|||||||
|
|
||||||
"oniguruma-to-es": ["oniguruma-to-es@4.3.4", "", { "dependencies": { "oniguruma-parser": "^0.12.1", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA=="],
|
"oniguruma-to-es": ["oniguruma-to-es@4.3.4", "", { "dependencies": { "oniguruma-parser": "^0.12.1", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA=="],
|
||||||
|
|
||||||
"p-limit": ["p-limit@6.2.0", "", { "dependencies": { "yocto-queue": "^1.1.1" } }, "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA=="],
|
"p-limit": ["p-limit@7.3.0", "", { "dependencies": { "yocto-queue": "^1.2.1" } }, "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw=="],
|
||||||
|
|
||||||
"p-queue": ["p-queue@8.1.1", "", { "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^6.1.2" } }, "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ=="],
|
"p-queue": ["p-queue@9.1.2", "", { "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^7.0.0" } }, "sha512-ktsDOALzTYTWWF1PbkNVg2rOt+HaOaMWJMUnt7T3qf5tvZ1L8dBW3tObzprBcXNMKkwj+yFSLqHso0x+UFcJXw=="],
|
||||||
|
|
||||||
"p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="],
|
"p-timeout": ["p-timeout@7.0.1", "", {}, "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg=="],
|
||||||
|
|
||||||
"package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
|
"package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
|
||||||
|
|
||||||
"pako": ["pako@0.2.9", "", {}, "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="],
|
|
||||||
|
|
||||||
"parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="],
|
"parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="],
|
||||||
|
|
||||||
"parse-latin": ["parse-latin@7.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "@types/unist": "^3.0.0", "nlcst-to-string": "^4.0.0", "unist-util-modify-children": "^4.0.0", "unist-util-visit-children": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ=="],
|
"parse-latin": ["parse-latin@7.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "@types/unist": "^3.0.0", "nlcst-to-string": "^4.0.0", "unist-util-modify-children": "^4.0.0", "unist-util-visit-children": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ=="],
|
||||||
|
|
||||||
"parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],
|
"parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],
|
||||||
|
|
||||||
|
"path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
|
||||||
|
|
||||||
"path-expression-matcher": ["path-expression-matcher@1.2.0", "", {}, "sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ=="],
|
"path-expression-matcher": ["path-expression-matcher@1.2.0", "", {}, "sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ=="],
|
||||||
|
|
||||||
"piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="],
|
"piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="],
|
||||||
|
|
||||||
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
|
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
|
||||||
|
|
||||||
"picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
|
"picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
|
||||||
|
|
||||||
"postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
|
"postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
|
||||||
|
|
||||||
"prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="],
|
"prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="],
|
||||||
|
|
||||||
"prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
|
"prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="],
|
||||||
|
|
||||||
"property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
|
"property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
|
||||||
|
|
||||||
@@ -762,7 +841,11 @@
|
|||||||
|
|
||||||
"remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="],
|
"remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="],
|
||||||
|
|
||||||
"restructure": ["restructure@3.0.2", "", {}, "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw=="],
|
"request-light": ["request-light@0.7.0", "", {}, "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q=="],
|
||||||
|
|
||||||
|
"require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="],
|
||||||
|
|
||||||
|
"require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
|
||||||
|
|
||||||
"retext": ["retext@9.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", "retext-stringify": "^4.0.0", "unified": "^11.0.0" } }, "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA=="],
|
"retext": ["retext@9.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", "retext-stringify": "^4.0.0", "unified": "^11.0.0" } }, "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA=="],
|
||||||
|
|
||||||
@@ -776,14 +859,18 @@
|
|||||||
|
|
||||||
"sax": ["sax@1.4.3", "", {}, "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ=="],
|
"sax": ["sax@1.4.3", "", {}, "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ=="],
|
||||||
|
|
||||||
"semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
|
"scule": ["scule@1.3.0", "", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="],
|
||||||
|
|
||||||
|
"semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
|
||||||
|
|
||||||
"sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="],
|
"sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="],
|
||||||
|
|
||||||
"shiki": ["shiki@3.20.0", "", { "dependencies": { "@shikijs/core": "3.20.0", "@shikijs/engine-javascript": "3.20.0", "@shikijs/engine-oniguruma": "3.20.0", "@shikijs/langs": "3.20.0", "@shikijs/themes": "3.20.0", "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-kgCOlsnyWb+p0WU+01RjkCH+eBVsjL1jOwUYWv0YDWkM2/A46+LDKVs5yZCUXjJG6bj4ndFoAg5iLIIue6dulg=="],
|
"shiki": ["shiki@4.0.2", "", { "dependencies": { "@shikijs/core": "4.0.2", "@shikijs/engine-javascript": "4.0.2", "@shikijs/engine-oniguruma": "4.0.2", "@shikijs/langs": "4.0.2", "@shikijs/themes": "4.0.2", "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ=="],
|
||||||
|
|
||||||
"sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
|
"sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
|
||||||
|
|
||||||
|
"sitemap": ["sitemap@9.0.1", "", { "dependencies": { "@types/node": "^24.9.2", "@types/sax": "^1.2.1", "arg": "^5.0.0", "sax": "^1.4.1" }, "bin": { "sitemap": "dist/esm/cli.js" } }, "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ=="],
|
||||||
|
|
||||||
"smol-toml": ["smol-toml@1.6.0", "", {}, "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw=="],
|
"smol-toml": ["smol-toml@1.6.0", "", {}, "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw=="],
|
||||||
|
|
||||||
"source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
|
"source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
|
||||||
@@ -792,27 +879,35 @@
|
|||||||
|
|
||||||
"space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
|
"space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
|
||||||
|
|
||||||
"string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
|
"stream-replace-string": ["stream-replace-string@2.0.0", "", {}, "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w=="],
|
||||||
|
|
||||||
|
"string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
||||||
|
|
||||||
"stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
|
"stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
|
||||||
|
|
||||||
"strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
|
"strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||||
|
|
||||||
"strnum": ["strnum@2.2.1", "", {}, "sha512-BwRvNd5/QoAtyW1na1y1LsJGQNvRlkde6Q/ipqqEaivoMdV+B1OMOTVdwR+N/cwVUcIt9PYyHmV8HyexCZSupg=="],
|
"strnum": ["strnum@2.2.2", "", {}, "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA=="],
|
||||||
|
|
||||||
"style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="],
|
"style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="],
|
||||||
|
|
||||||
"style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="],
|
"style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="],
|
||||||
|
|
||||||
"svgo": ["svgo@4.0.0", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^5.1.0", "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "^1.4.1" }, "bin": "./bin/svgo.js" }, "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw=="],
|
"svelte": ["svelte@5.55.5", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.4", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-2uCs/LZ9us+AktdzYJM8OcxQ8qnPS1kpaO7syGT/MgO+6Qr1Ybl+TqPq+97u7PHqmmMlye5ZkoyXONy5mjjAbw=="],
|
||||||
|
|
||||||
"tailwindcss": ["tailwindcss@4.1.18", "", {}, "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw=="],
|
"svelte2tsx": ["svelte2tsx@0.7.53", "", { "dependencies": { "dedent-js": "^1.0.1", "scule": "^1.3.0" }, "peerDependencies": { "svelte": "^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0", "typescript": "^4.9.4 || ^5.0.0" } }, "sha512-ljVSwmnYRDHRm8+7ICP6QoAN7U7vgOFfPBLN6T745YWNYqRRSzHxlrzUVqMjYls2Un8MzJissfziy/38e6Deeg=="],
|
||||||
|
|
||||||
|
"svgo": ["svgo@4.0.1", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^5.1.0", "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "^1.5.0" }, "bin": "./bin/svgo.js" }, "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w=="],
|
||||||
|
|
||||||
|
"tailwindcss": ["tailwindcss@4.2.4", "", {}, "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA=="],
|
||||||
|
|
||||||
"tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="],
|
"tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="],
|
||||||
|
|
||||||
"tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="],
|
"tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="],
|
||||||
|
|
||||||
"tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="],
|
"tinyclip": ["tinyclip@0.1.12", "", {}, "sha512-Ae3OVUqifDw0wBriIBS7yVaW44Dp6eSHQcyq4Igc7eN2TJH/2YsicswaW+J/OuMvhpDPOKEgpAZCjkb4hpoyeA=="],
|
||||||
|
|
||||||
|
"tinyexec": ["tinyexec@1.1.1", "", {}, "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg=="],
|
||||||
|
|
||||||
"tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
|
"tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
|
||||||
|
|
||||||
@@ -824,11 +919,13 @@
|
|||||||
|
|
||||||
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
||||||
|
|
||||||
"type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
|
"typesafe-path": ["typesafe-path@0.2.2", "", {}, "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA=="],
|
||||||
|
|
||||||
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
"typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
|
||||||
|
|
||||||
"ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="],
|
"typescript-auto-import-cache": ["typescript-auto-import-cache@0.3.6", "", { "dependencies": { "semver": "^7.3.8" } }, "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ=="],
|
||||||
|
|
||||||
|
"ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="],
|
||||||
|
|
||||||
"ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="],
|
"ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="],
|
||||||
|
|
||||||
@@ -836,13 +933,9 @@
|
|||||||
|
|
||||||
"undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
|
"undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
|
||||||
|
|
||||||
"unicode-properties": ["unicode-properties@1.4.1", "", { "dependencies": { "base64-js": "^1.3.0", "unicode-trie": "^2.0.0" } }, "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg=="],
|
|
||||||
|
|
||||||
"unicode-trie": ["unicode-trie@2.0.0", "", { "dependencies": { "pako": "^0.2.5", "tiny-inflate": "^1.0.0" } }, "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ=="],
|
|
||||||
|
|
||||||
"unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="],
|
"unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="],
|
||||||
|
|
||||||
"unifont": ["unifont@0.6.0", "", { "dependencies": { "css-tree": "^3.0.0", "ofetch": "^1.4.1", "ohash": "^2.0.0" } }, "sha512-5Fx50fFQMQL5aeHyWnZX9122sSLckcDvcfFiBf3QYeHa7a1MKJooUy52b67moi2MJYkrfo/TWY+CoLdr/w0tTA=="],
|
"unifont": ["unifont@0.7.4", "", { "dependencies": { "css-tree": "^3.1.0", "ofetch": "^1.5.1", "ohash": "^2.0.11" } }, "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg=="],
|
||||||
|
|
||||||
"unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="],
|
"unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="],
|
||||||
|
|
||||||
@@ -858,13 +951,13 @@
|
|||||||
|
|
||||||
"unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
|
"unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
|
||||||
|
|
||||||
"unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="],
|
"unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="],
|
||||||
|
|
||||||
"unist-util-visit-children": ["unist-util-visit-children@3.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA=="],
|
"unist-util-visit-children": ["unist-util-visit-children@3.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA=="],
|
||||||
|
|
||||||
"unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="],
|
"unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="],
|
||||||
|
|
||||||
"unstorage": ["unstorage@1.17.3", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", "destr": "^2.0.5", "h3": "^1.15.4", "lru-cache": "^10.4.3", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.1" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6.0.3 || ^7.0.0", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1.0.1", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-i+JYyy0DoKmQ3FximTHbGadmIYb8JEpq7lxUjnjeB702bCPum0vzo6oy5Mfu0lpqISw7hCyMW2yj4nWC8bqJ3Q=="],
|
"unstorage": ["unstorage@1.17.5", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.10", "lru-cache": "^11.2.7", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg=="],
|
||||||
|
|
||||||
"vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
|
"vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
|
||||||
|
|
||||||
@@ -872,70 +965,150 @@
|
|||||||
|
|
||||||
"vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
|
"vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
|
||||||
|
|
||||||
"vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="],
|
"vite": ["vite@7.3.2", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg=="],
|
||||||
|
|
||||||
"vitefu": ["vitefu@1.1.1", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" }, "optionalPeers": ["vite"] }, "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ=="],
|
"vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="],
|
||||||
|
|
||||||
|
"volar-service-css": ["volar-service-css@0.0.70", "", { "dependencies": { "vscode-css-languageservice": "^6.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-K1qyOvBpE3rzdAv3e4/6Rv5yizrYPy5R/ne3IWCAzLBuMO4qBMV3kSqWzj6KUVe6S0AnN6wxF7cRkiaKfYMYJw=="],
|
||||||
|
|
||||||
|
"volar-service-emmet": ["volar-service-emmet@0.0.70", "", { "dependencies": { "@emmetio/css-parser": "^0.4.1", "@emmetio/html-matcher": "^1.3.0", "@vscode/emmet-helper": "^2.9.3", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-xi5bC4m/VyE3zy/n2CXspKeDZs3qA41tHLTw275/7dNWM/RqE2z3BnDICQybHIVp/6G1iOQj5c1qXMgQC08TNg=="],
|
||||||
|
|
||||||
|
"volar-service-html": ["volar-service-html@0.0.70", "", { "dependencies": { "vscode-html-languageservice": "^5.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-eR6vCgMdmYAo4n+gcT7DSyBQbwB8S3HZZvSagTf0sxNaD4WppMCFfpqWnkrlGStPKMZvMiejRRVmqsX9dYcTvQ=="],
|
||||||
|
|
||||||
|
"volar-service-prettier": ["volar-service-prettier@0.0.70", "", { "dependencies": { "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0", "prettier": "^2.2 || ^3.0" }, "optionalPeers": ["@volar/language-service", "prettier"] }, "sha512-Z6BCFSpGVCd8BPAsZ785Kce1BGlWd5ODqmqZGVuB14MJvrR4+CYz6cDy4F+igmE1gMifqfvMhdgT8Aud4M5ngg=="],
|
||||||
|
|
||||||
|
"volar-service-typescript": ["volar-service-typescript@0.0.70", "", { "dependencies": { "path-browserify": "^1.0.1", "semver": "^7.6.2", "typescript-auto-import-cache": "^0.3.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-nls": "^5.2.0", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-l46Bx4cokkUedTd74ojO5H/zqHZJ8SUuyZ0IB8JN4jfRqUM3bQFBHoOwlZCyZmOeO0A3RQNkMnFclxO4c++gsg=="],
|
||||||
|
|
||||||
|
"volar-service-typescript-twoslash-queries": ["volar-service-typescript-twoslash-queries@0.0.70", "", { "dependencies": { "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-IdD13Z9N2Bu8EM6CM0fDV1E69olEYGHDU25X51YXmq8Y0CmJ2LNj6gOiBJgpS5JGUqFzECVhMNBW7R0sPdRTMQ=="],
|
||||||
|
|
||||||
|
"volar-service-yaml": ["volar-service-yaml@0.0.70", "", { "dependencies": { "vscode-uri": "^3.0.8", "yaml-language-server": "~1.20.0" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-0c8bXDBeoATF9F6iPIlOuYTuZAC4c+yi0siQo920u7eiBJk8oQmUmg9cDUbR4+Gl++bvGP4plj3fErbJuPqdcQ=="],
|
||||||
|
|
||||||
|
"vscode-css-languageservice": ["vscode-css-languageservice@6.3.10", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA=="],
|
||||||
|
|
||||||
|
"vscode-html-languageservice": ["vscode-html-languageservice@5.6.2", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "^3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg=="],
|
||||||
|
|
||||||
|
"vscode-json-languageservice": ["vscode-json-languageservice@4.1.8", "", { "dependencies": { "jsonc-parser": "^3.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.16.0", "vscode-nls": "^5.0.0", "vscode-uri": "^3.0.2" } }, "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg=="],
|
||||||
|
|
||||||
|
"vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="],
|
||||||
|
|
||||||
|
"vscode-languageserver": ["vscode-languageserver@9.0.1", "", { "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g=="],
|
||||||
|
|
||||||
|
"vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.17.5", "", { "dependencies": { "vscode-jsonrpc": "8.2.0", "vscode-languageserver-types": "3.17.5" } }, "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg=="],
|
||||||
|
|
||||||
|
"vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="],
|
||||||
|
|
||||||
|
"vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="],
|
||||||
|
|
||||||
|
"vscode-nls": ["vscode-nls@5.2.0", "", {}, "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng=="],
|
||||||
|
|
||||||
|
"vscode-uri": ["vscode-uri@3.1.0", "", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="],
|
||||||
|
|
||||||
"web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
|
"web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
|
||||||
|
|
||||||
"which-pm-runs": ["which-pm-runs@1.1.0", "", {}, "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="],
|
"which-pm-runs": ["which-pm-runs@1.1.0", "", {}, "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="],
|
||||||
|
|
||||||
"widest-line": ["widest-line@5.0.0", "", { "dependencies": { "string-width": "^7.0.0" } }, "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA=="],
|
"wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
|
||||||
|
|
||||||
"wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="],
|
|
||||||
|
|
||||||
"xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="],
|
"xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="],
|
||||||
|
|
||||||
"yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
|
"y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
|
||||||
|
|
||||||
|
"yaml": ["yaml@2.8.3", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg=="],
|
||||||
|
|
||||||
|
"yaml-language-server": ["yaml-language-server@1.20.0", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "prettier": "^3.5.0", "request-light": "^0.5.7", "vscode-json-languageservice": "4.1.8", "vscode-languageserver": "^9.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.16.0", "vscode-uri": "^3.0.2", "yaml": "2.7.1" }, "bin": { "yaml-language-server": "bin/yaml-language-server" } }, "sha512-qhjK/bzSRZ6HtTvgeFvjNPJGWdZ0+x5NREV/9XZWFjIGezew2b4r5JPy66IfOhd5OA7KeFwk1JfmEbnTvev0cA=="],
|
||||||
|
|
||||||
|
"yargs": ["yargs@17.7.2", "", { "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" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
|
||||||
|
|
||||||
|
"yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="],
|
||||||
|
|
||||||
"yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="],
|
"yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="],
|
||||||
|
|
||||||
"yocto-spinner": ["yocto-spinner@0.2.3", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ=="],
|
"zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="],
|
||||||
|
|
||||||
"yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="],
|
|
||||||
|
|
||||||
"zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
|
"zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
|
||||||
|
|
||||||
"zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="],
|
|
||||||
|
|
||||||
"zod-to-ts": ["zod-to-ts@1.2.0", "", { "peerDependencies": { "typescript": "^4.9.4 || ^5.0.2", "zod": "^3" } }, "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA=="],
|
|
||||||
|
|
||||||
"zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
|
"zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
|
||||||
|
|
||||||
|
"@astrojs/language-server/@astrojs/compiler": ["@astrojs/compiler@2.13.1", "", {}, "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg=="],
|
||||||
|
|
||||||
|
"@mdx-js/mdx/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
|
||||||
|
|
||||||
|
"@mdx-js/mdx/unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="],
|
||||||
|
|
||||||
"@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
|
"@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.7.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg=="],
|
"@rollup/pluginutils/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.7.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA=="],
|
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.9.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="],
|
"@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.9.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.0", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA=="],
|
"@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.2", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
|
"@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
"@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
||||||
|
|
||||||
"ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
"@types/sax/@types/node": ["@types/node@25.0.3", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA=="],
|
||||||
|
|
||||||
"anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
"anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
||||||
|
|
||||||
"astro/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
|
"bun-types/@types/node": ["@types/node@25.0.3", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA=="],
|
||||||
|
|
||||||
"csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="],
|
"csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="],
|
||||||
|
|
||||||
"dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
|
"dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
|
||||||
|
|
||||||
|
"esast-util-from-js/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
|
||||||
|
|
||||||
|
"hast-util-raw/unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="],
|
||||||
|
|
||||||
|
"is-inside-container/is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
|
||||||
|
|
||||||
|
"mdast-util-definitions/unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="],
|
||||||
|
|
||||||
|
"mdast-util-to-hast/unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="],
|
||||||
|
|
||||||
|
"mdast-util-to-markdown/unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="],
|
||||||
|
|
||||||
|
"micromark-extension-mdxjs/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
|
||||||
|
|
||||||
|
"ofetch/ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="],
|
||||||
|
|
||||||
"parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
|
"parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
|
||||||
|
|
||||||
"zod-to-ts/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
|
"remark-smartypants/unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="],
|
||||||
|
|
||||||
"ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
"retext-smartypants/unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="],
|
||||||
|
|
||||||
"ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
"sharp/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
|
||||||
|
|
||||||
|
"svelte/aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="],
|
||||||
|
|
||||||
|
"svgo/sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="],
|
||||||
|
|
||||||
|
"tinyglobby/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
|
||||||
|
|
||||||
|
"typescript-auto-import-cache/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
|
||||||
|
|
||||||
|
"unist-util-remove-position/unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="],
|
||||||
|
|
||||||
|
"unstorage/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
|
||||||
|
|
||||||
|
"volar-service-typescript/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
|
||||||
|
|
||||||
|
"vscode-json-languageservice/jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="],
|
||||||
|
|
||||||
|
"yaml-language-server/request-light": ["request-light@0.5.8", "", {}, "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg=="],
|
||||||
|
|
||||||
|
"yaml-language-server/yaml": ["yaml@2.7.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ=="],
|
||||||
|
|
||||||
|
"yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
|
||||||
|
|
||||||
"csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="],
|
"csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="],
|
||||||
|
|
||||||
"ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
"unstorage/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+3
-3
@@ -59,11 +59,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1774106199,
|
"lastModified": 1776548001,
|
||||||
"narHash": "sha256-US5Tda2sKmjrg2lNHQL3jRQ6p96cgfWh3J1QBliQ8Ws=",
|
"narHash": "sha256-ZSK0NL4a1BwVbbTBoSnWgbJy9HeZFXLYQizjb2DPF24=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "6c9a78c09ff4d6c21d0319114873508a6ec01655",
|
"rev": "b12141ef619e0a9c1c84dc8c684040326f27cdcc",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|||||||
+17
-9
@@ -8,17 +8,25 @@
|
|||||||
"dev": "astro dev",
|
"dev": "astro dev",
|
||||||
"build": "astro build",
|
"build": "astro build",
|
||||||
"preview": "astro preview",
|
"preview": "astro preview",
|
||||||
"astro": "astro"
|
"astro": "astro",
|
||||||
|
"fetch-data": "bun run scripts/fetch-repos.ts"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/mdx": "^4.3.9",
|
"@astrojs/mdx": "5.0.4",
|
||||||
"@astrojs/rss": "^4.0.17",
|
"@astrojs/rss": "^4.0.18",
|
||||||
|
"@astrojs/sitemap": "^3.7.2",
|
||||||
|
"@astrojs/svelte": "^8.1.0",
|
||||||
"@lucide/astro": "^0.552.0",
|
"@lucide/astro": "^0.552.0",
|
||||||
"@tailwindcss/vite": "^4.1.16",
|
"@tailwindcss/vite": "^4.2.4",
|
||||||
"astro": "^5.15.2",
|
"@types/bun": "^1.3.13",
|
||||||
"daisyui": "^5.3.10",
|
"astro": "6.1.9",
|
||||||
"lucide-astro": "^0.556.0",
|
"daisyui": "^5.5.19",
|
||||||
"node-html-parser": "^7.0.1",
|
"node-html-parser": "^7.1.0",
|
||||||
"tailwindcss": "^4.1.16"
|
"svelte": "^5.55.5",
|
||||||
|
"tailwindcss": "^4.2.4"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@astrojs/check": "^0.9.8",
|
||||||
|
"typescript": "^6.0.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 58 KiB |
@@ -0,0 +1,4 @@
|
|||||||
|
User-agent: *
|
||||||
|
Allow: /
|
||||||
|
|
||||||
|
Sitemap: https://hadi.icu/sitemap-index.xml
|
||||||
+104
-204
@@ -1,27 +1,11 @@
|
|||||||
// oneko.js: https://github.com/adryd325/oneko.js
|
// oneko.js — navbar wanderer (based on https://github.com/adryd325/oneko.js)
|
||||||
|
|
||||||
(function oneko() {
|
(function oneko() {
|
||||||
const isReducedMotion =
|
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
|
||||||
window.matchMedia(`(prefers-reduced-motion: reduce)`) === true ||
|
|
||||||
window.matchMedia(`(prefers-reduced-motion: reduce)`).matches === true;
|
|
||||||
|
|
||||||
if (isReducedMotion) return;
|
const SIZE = 32;
|
||||||
|
const SPEED = 10;
|
||||||
|
|
||||||
const nekoEl = document.createElement("div");
|
|
||||||
let persistPosition = true;
|
|
||||||
|
|
||||||
let nekoPosX = 32;
|
|
||||||
let nekoPosY = 32;
|
|
||||||
|
|
||||||
let mousePosX = 0;
|
|
||||||
let mousePosY = 0;
|
|
||||||
|
|
||||||
let frameCount = 0;
|
|
||||||
let idleTime = 0;
|
|
||||||
let idleAnimation = null;
|
|
||||||
let idleAnimationFrame = 0;
|
|
||||||
|
|
||||||
const nekoSpeed = 10;
|
|
||||||
const spriteSets = {
|
const spriteSets = {
|
||||||
idle: [[-3, -3]],
|
idle: [[-3, -3]],
|
||||||
alert: [[-7, -3]],
|
alert: [[-7, -3]],
|
||||||
@@ -30,14 +14,6 @@
|
|||||||
[-6, 0],
|
[-6, 0],
|
||||||
[-7, 0],
|
[-7, 0],
|
||||||
],
|
],
|
||||||
scratchWallN: [
|
|
||||||
[0, 0],
|
|
||||||
[0, -1],
|
|
||||||
],
|
|
||||||
scratchWallS: [
|
|
||||||
[-7, -1],
|
|
||||||
[-6, -2],
|
|
||||||
],
|
|
||||||
scratchWallE: [
|
scratchWallE: [
|
||||||
[-2, -2],
|
[-2, -2],
|
||||||
[-2, -3],
|
[-2, -3],
|
||||||
@@ -51,234 +27,158 @@
|
|||||||
[-2, 0],
|
[-2, 0],
|
||||||
[-2, -1],
|
[-2, -1],
|
||||||
],
|
],
|
||||||
N: [
|
|
||||||
[-1, -2],
|
|
||||||
[-1, -3],
|
|
||||||
],
|
|
||||||
NE: [
|
|
||||||
[0, -2],
|
|
||||||
[0, -3],
|
|
||||||
],
|
|
||||||
E: [
|
E: [
|
||||||
[-3, 0],
|
[-3, 0],
|
||||||
[-3, -1],
|
[-3, -1],
|
||||||
],
|
],
|
||||||
SE: [
|
|
||||||
[-5, -1],
|
|
||||||
[-5, -2],
|
|
||||||
],
|
|
||||||
S: [
|
|
||||||
[-6, -3],
|
|
||||||
[-7, -2],
|
|
||||||
],
|
|
||||||
SW: [
|
|
||||||
[-5, -3],
|
|
||||||
[-6, -1],
|
|
||||||
],
|
|
||||||
W: [
|
W: [
|
||||||
[-4, -2],
|
[-4, -2],
|
||||||
[-4, -3],
|
[-4, -3],
|
||||||
],
|
],
|
||||||
NW: [
|
|
||||||
[-1, 0],
|
|
||||||
[-1, -1],
|
|
||||||
],
|
|
||||||
};
|
};
|
||||||
|
|
||||||
function init() {
|
const track = document.getElementById("oneko-track");
|
||||||
let nekoFile = "/oneko.gif";
|
if (!track) return;
|
||||||
const curScript = document.currentScript;
|
|
||||||
if (curScript && curScript.dataset.cat) {
|
|
||||||
nekoFile = curScript.dataset.cat;
|
|
||||||
}
|
|
||||||
if (curScript && curScript.dataset.persistPosition) {
|
|
||||||
if (curScript.dataset.persistPosition === "") {
|
|
||||||
persistPosition = true;
|
|
||||||
} else {
|
|
||||||
persistPosition = JSON.parse(
|
|
||||||
curScript.dataset.persistPosition.toLowerCase(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (persistPosition) {
|
const el = document.createElement("div");
|
||||||
let storedNeko = JSON.parse(window.localStorage.getItem("oneko"));
|
el.id = "oneko";
|
||||||
if (storedNeko !== null) {
|
el.ariaHidden = "true";
|
||||||
nekoPosX = storedNeko.nekoPosX;
|
el.style.width = `${SIZE}px`;
|
||||||
nekoPosY = storedNeko.nekoPosY;
|
el.style.height = `${SIZE}px`;
|
||||||
mousePosX = storedNeko.mousePosX;
|
el.style.position = "absolute";
|
||||||
mousePosY = storedNeko.mousePosY;
|
el.style.bottom = "0";
|
||||||
frameCount = storedNeko.frameCount;
|
el.style.pointerEvents = "none";
|
||||||
idleTime = storedNeko.idleTime;
|
el.style.imageRendering = "pixelated";
|
||||||
idleAnimation = storedNeko.idleAnimation;
|
el.style.zIndex = "2147483647";
|
||||||
idleAnimationFrame = storedNeko.idleAnimationFrame;
|
el.style.backgroundImage = "url(/oneko.gif)";
|
||||||
nekoEl.style.backgroundPosition = storedNeko.bgPos;
|
track.appendChild(el);
|
||||||
|
|
||||||
|
function maxX() {
|
||||||
|
return track.offsetWidth - SIZE;
|
||||||
}
|
}
|
||||||
|
function clamp(v, lo, hi) {
|
||||||
|
return Math.max(lo, Math.min(hi, v));
|
||||||
}
|
}
|
||||||
|
function randomTarget() {
|
||||||
nekoEl.id = "oneko";
|
return Math.random() * maxX();
|
||||||
nekoEl.ariaHidden = true;
|
|
||||||
nekoEl.style.width = "32px";
|
|
||||||
nekoEl.style.height = "32px";
|
|
||||||
nekoEl.style.position = "fixed";
|
|
||||||
nekoEl.style.pointerEvents = "none";
|
|
||||||
nekoEl.style.imageRendering = "pixelated";
|
|
||||||
nekoEl.style.left = `${nekoPosX - 16}px`;
|
|
||||||
nekoEl.style.top = `${nekoPosY - 16}px`;
|
|
||||||
nekoEl.style.zIndex = 2147483647;
|
|
||||||
|
|
||||||
nekoEl.style.backgroundImage = `url(${nekoFile})`;
|
|
||||||
|
|
||||||
document.body.appendChild(nekoEl);
|
|
||||||
|
|
||||||
document.addEventListener("mousemove", function (event) {
|
|
||||||
mousePosX = event.clientX;
|
|
||||||
mousePosY = event.clientY;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (persistPosition) {
|
|
||||||
window.addEventListener("beforeunload", function (event) {
|
|
||||||
window.localStorage.setItem(
|
|
||||||
"oneko",
|
|
||||||
JSON.stringify({
|
|
||||||
nekoPosX: nekoPosX,
|
|
||||||
nekoPosY: nekoPosY,
|
|
||||||
mousePosX: mousePosX,
|
|
||||||
mousePosY: mousePosY,
|
|
||||||
frameCount: frameCount,
|
|
||||||
idleTime: idleTime,
|
|
||||||
idleAnimation: idleAnimation,
|
|
||||||
idleAnimationFrame: idleAnimationFrame,
|
|
||||||
bgPos: nekoEl.style.backgroundPosition,
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
window.requestAnimationFrame(onAnimationFrame);
|
|
||||||
}
|
|
||||||
|
|
||||||
let lastFrameTimestamp;
|
|
||||||
|
|
||||||
function onAnimationFrame(timestamp) {
|
|
||||||
// Stops execution if the neko element is removed from DOM
|
|
||||||
if (!nekoEl.isConnected) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!lastFrameTimestamp) {
|
|
||||||
lastFrameTimestamp = timestamp;
|
|
||||||
}
|
|
||||||
if (timestamp - lastFrameTimestamp > 100) {
|
|
||||||
lastFrameTimestamp = timestamp;
|
|
||||||
frame();
|
|
||||||
}
|
|
||||||
window.requestAnimationFrame(onAnimationFrame);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function setSprite(name, frame) {
|
function setSprite(name, frame) {
|
||||||
const sprite = spriteSets[name][frame % spriteSets[name].length];
|
const s = spriteSets[name][frame % spriteSets[name].length];
|
||||||
nekoEl.style.backgroundPosition = `${sprite[0] * 32}px ${sprite[1] * 32}px`;
|
el.style.backgroundPosition = `${s[0] * SIZE}px ${s[1] * SIZE}px`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function resetIdleAnimation() {
|
let posX = randomTarget();
|
||||||
idleAnimation = null;
|
let targetX = posX;
|
||||||
idleAnimationFrame = 0;
|
el.style.left = `${posX}px`;
|
||||||
|
|
||||||
|
let frameCount = 0;
|
||||||
|
let idleTime = 0;
|
||||||
|
let idleAnim = null;
|
||||||
|
let idleAnimFrame = 0;
|
||||||
|
let lastTs = null;
|
||||||
|
|
||||||
|
function resetIdle() {
|
||||||
|
idleAnim = null;
|
||||||
|
idleAnimFrame = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function idle() {
|
function idle() {
|
||||||
idleTime += 1;
|
idleTime++;
|
||||||
|
|
||||||
|
if (idleTime > 40 && Math.floor(Math.random() * 120) === 0) {
|
||||||
|
targetX = randomTarget();
|
||||||
|
idleTime = 0;
|
||||||
|
resetIdle();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// every ~ 20 seconds
|
|
||||||
if (
|
if (
|
||||||
idleTime > 10 &&
|
idleTime > 15 &&
|
||||||
Math.floor(Math.random() * 200) == 0 &&
|
idleAnim == null &&
|
||||||
idleAnimation == null
|
Math.floor(Math.random() * 180) === 0
|
||||||
) {
|
) {
|
||||||
let avalibleIdleAnimations = ["sleeping", "scratchSelf"];
|
const opts = ["sleeping", "scratchSelf"];
|
||||||
if (nekoPosX < 32) {
|
if (posX <= SIZE) opts.push("scratchWallW");
|
||||||
avalibleIdleAnimations.push("scratchWallW");
|
if (posX >= maxX() - SIZE) opts.push("scratchWallE");
|
||||||
}
|
idleAnim = opts[Math.floor(Math.random() * opts.length)];
|
||||||
if (nekoPosY < 32) {
|
|
||||||
avalibleIdleAnimations.push("scratchWallN");
|
|
||||||
}
|
|
||||||
if (nekoPosX > window.innerWidth - 32) {
|
|
||||||
avalibleIdleAnimations.push("scratchWallE");
|
|
||||||
}
|
|
||||||
if (nekoPosY > window.innerHeight - 32) {
|
|
||||||
avalibleIdleAnimations.push("scratchWallS");
|
|
||||||
}
|
|
||||||
idleAnimation =
|
|
||||||
avalibleIdleAnimations[
|
|
||||||
Math.floor(Math.random() * avalibleIdleAnimations.length)
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (idleAnimation) {
|
switch (idleAnim) {
|
||||||
case "sleeping":
|
case "sleeping":
|
||||||
if (idleAnimationFrame < 8) {
|
if (idleAnimFrame < 8) {
|
||||||
setSprite("tired", 0);
|
setSprite("tired", 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
setSprite("sleeping", Math.floor(idleAnimationFrame / 4));
|
setSprite("sleeping", Math.floor(idleAnimFrame / 4));
|
||||||
if (idleAnimationFrame > 192) {
|
if (idleAnimFrame > 192) resetIdle();
|
||||||
resetIdleAnimation();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case "scratchWallN":
|
|
||||||
case "scratchWallS":
|
|
||||||
case "scratchWallE":
|
case "scratchWallE":
|
||||||
case "scratchWallW":
|
case "scratchWallW":
|
||||||
case "scratchSelf":
|
case "scratchSelf":
|
||||||
setSprite(idleAnimation, idleAnimationFrame);
|
setSprite(idleAnim, idleAnimFrame);
|
||||||
if (idleAnimationFrame > 9) {
|
if (idleAnimFrame > 9) resetIdle();
|
||||||
resetIdleAnimation();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
setSprite("idle", 0);
|
setSprite("idle", 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
idleAnimationFrame += 1;
|
idleAnimFrame++;
|
||||||
}
|
}
|
||||||
|
|
||||||
function frame() {
|
function frame() {
|
||||||
frameCount += 1;
|
frameCount++;
|
||||||
const diffX = nekoPosX - mousePosX;
|
const diff = targetX - posX;
|
||||||
const diffY = nekoPosY - mousePosY;
|
const dist = Math.abs(diff);
|
||||||
const distance = Math.sqrt(diffX ** 2 + diffY ** 2);
|
|
||||||
|
|
||||||
if (distance < nekoSpeed || distance < 48) {
|
if (dist < SPEED) {
|
||||||
|
posX = targetX;
|
||||||
idle();
|
idle();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
idleAnimation = null;
|
resetIdle();
|
||||||
idleAnimationFrame = 0;
|
|
||||||
|
|
||||||
if (idleTime > 1) {
|
if (idleTime > 5) {
|
||||||
setSprite("alert", 0);
|
setSprite("alert", 0);
|
||||||
// count down after being alerted before moving
|
idleTime = Math.min(idleTime, 7) - 1;
|
||||||
idleTime = Math.min(idleTime, 7);
|
|
||||||
idleTime -= 1;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
idleTime = 0;
|
||||||
|
|
||||||
let direction;
|
setSprite(diff > 0 ? "E" : "W", frameCount);
|
||||||
direction = diffY / distance > 0.5 ? "N" : "";
|
posX = clamp(posX + (diff > 0 ? SPEED : -SPEED), 0, maxX());
|
||||||
direction += diffY / distance < -0.5 ? "S" : "";
|
el.style.left = `${posX}px`;
|
||||||
direction += diffX / distance > 0.5 ? "W" : "";
|
|
||||||
direction += diffX / distance < -0.5 ? "E" : "";
|
|
||||||
setSprite(direction, frameCount);
|
|
||||||
|
|
||||||
nekoPosX -= (diffX / distance) * nekoSpeed;
|
|
||||||
nekoPosY -= (diffY / distance) * nekoSpeed;
|
|
||||||
|
|
||||||
nekoPosX = Math.min(Math.max(16, nekoPosX), window.innerWidth - 16);
|
|
||||||
nekoPosY = Math.min(Math.max(16, nekoPosY), window.innerHeight - 16);
|
|
||||||
|
|
||||||
nekoEl.style.left = `${nekoPosX - 16}px`;
|
|
||||||
nekoEl.style.top = `${nekoPosY - 16}px`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
init();
|
function loop(ts) {
|
||||||
|
if (!el.isConnected) return;
|
||||||
|
if (!lastTs) lastTs = ts;
|
||||||
|
if (ts - lastTs > 100) {
|
||||||
|
lastTs = ts;
|
||||||
|
frame();
|
||||||
|
}
|
||||||
|
window.requestAnimationFrame(loop);
|
||||||
|
}
|
||||||
|
|
||||||
|
let lastTrackWidth = track.offsetWidth;
|
||||||
|
window.addEventListener("resize", () => {
|
||||||
|
const newWidth = track.offsetWidth;
|
||||||
|
if (lastTrackWidth > 0) {
|
||||||
|
const ratio = newWidth / lastTrackWidth;
|
||||||
|
posX = clamp(posX * ratio, 0, maxX());
|
||||||
|
targetX = clamp(targetX * ratio, 0, maxX());
|
||||||
|
el.style.left = `${posX}px`;
|
||||||
|
}
|
||||||
|
lastTrackWidth = newWidth;
|
||||||
|
});
|
||||||
|
|
||||||
|
setTimeout(
|
||||||
|
() => {
|
||||||
|
targetX = randomTarget();
|
||||||
|
},
|
||||||
|
800 + Math.random() * 1500,
|
||||||
|
);
|
||||||
|
|
||||||
|
window.requestAnimationFrame(loop);
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -0,0 +1,103 @@
|
|||||||
|
/// <reference types="bun-types" />
|
||||||
|
import { mkdir } from "node:fs/promises";
|
||||||
|
import { join } from "node:path";
|
||||||
|
|
||||||
|
export interface GiteaRepo {
|
||||||
|
id: number;
|
||||||
|
name: string;
|
||||||
|
full_name: string;
|
||||||
|
description: string;
|
||||||
|
html_url: string;
|
||||||
|
updated_at: string;
|
||||||
|
topics: string[];
|
||||||
|
stars_count: number;
|
||||||
|
language: string | null;
|
||||||
|
fork: boolean;
|
||||||
|
private: boolean;
|
||||||
|
website: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface RepoMirrors {
|
||||||
|
github?: string;
|
||||||
|
gitlab?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface GiteaRepoWithMirrors extends GiteaRepo {
|
||||||
|
mirrors: RepoMirrors;
|
||||||
|
}
|
||||||
|
|
||||||
|
const GITEA_BASE = "https://git.hadi.icu";
|
||||||
|
const GITEA_USER = "anotherhadi";
|
||||||
|
const GITHUB_USER = "anotherhadi";
|
||||||
|
const GITLAB_USER = "anotherhadi_mirror";
|
||||||
|
const SKIP_REPOS = ["anotherhadi"];
|
||||||
|
|
||||||
|
async function checkMirrors(repoName: string): Promise<RepoMirrors> {
|
||||||
|
const mirrors: RepoMirrors = {};
|
||||||
|
|
||||||
|
const [githubRes, gitlabRes] = await Promise.allSettled([
|
||||||
|
fetch(`https://github.com/${GITHUB_USER}/${repoName}`, { method: "HEAD" }),
|
||||||
|
fetch(`https://gitlab.com/${GITLAB_USER}/${repoName}`, { method: "HEAD" }),
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (githubRes.status === "fulfilled" && githubRes.value.ok) {
|
||||||
|
mirrors.github = `https://github.com/${GITHUB_USER}/${repoName}`;
|
||||||
|
}
|
||||||
|
if (gitlabRes.status === "fulfilled" && gitlabRes.value.ok) {
|
||||||
|
mirrors.gitlab = `https://gitlab.com/${GITLAB_USER}/${repoName}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return mirrors;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function fetchGiteaRepos(): Promise<GiteaRepoWithMirrors[]> {
|
||||||
|
try {
|
||||||
|
const res = await fetch(
|
||||||
|
`${GITEA_BASE}/api/v1/users/${GITEA_USER}/repos?limit=50&page=1`,
|
||||||
|
);
|
||||||
|
if (!res.ok) throw new Error(`Gitea API: ${res.status}`);
|
||||||
|
|
||||||
|
const repos: GiteaRepo[] = await res.json();
|
||||||
|
|
||||||
|
const filtered = repos
|
||||||
|
.filter((r) => !r.fork && !r.private && !SKIP_REPOS.includes(r.name))
|
||||||
|
.sort(
|
||||||
|
(a, b) =>
|
||||||
|
new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime(),
|
||||||
|
);
|
||||||
|
|
||||||
|
const reposWithMirrors = await Promise.all(
|
||||||
|
filtered.map(async (repo) => ({
|
||||||
|
...repo,
|
||||||
|
mirrors: await checkMirrors(repo.name),
|
||||||
|
})),
|
||||||
|
);
|
||||||
|
|
||||||
|
return reposWithMirrors;
|
||||||
|
} catch (e) {
|
||||||
|
console.error("Failed to fetch Gitea repos:", e);
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getBannerUrl(repo: GiteaRepo): string {
|
||||||
|
return `${GITEA_BASE}/${repo.full_name}/raw/branch/main/.github/assets/banner.png`;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
console.log("Fetching repos from Gitea...");
|
||||||
|
const rawRepos = await fetchGiteaRepos();
|
||||||
|
const repos = rawRepos.map((repo) => ({
|
||||||
|
...repo,
|
||||||
|
banner_url: `${GITEA_BASE}/${repo.full_name}/raw/branch/main/.github/assets/banner.png`,
|
||||||
|
}));
|
||||||
|
|
||||||
|
const dataDir = join(process.cwd(), "src/data");
|
||||||
|
await mkdir(dataDir, { recursive: true });
|
||||||
|
|
||||||
|
await Bun.write(join(dataDir, "repos.json"), JSON.stringify(repos, null, 2));
|
||||||
|
|
||||||
|
console.log(`Saved ${repos.length} repos to src/data/repos.json`);
|
||||||
|
}
|
||||||
|
|
||||||
|
main().catch(console.error);
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
import { Image } from "astro:assets";
|
||||||
|
const avatar = "/avatar.jpg";
|
||||||
|
const username = "anotherhadi";
|
||||||
|
const bio = "Infosec engineer.";
|
||||||
|
---
|
||||||
|
|
||||||
|
<div class="flex flex-wrap gap-3 justify-start">
|
||||||
|
<div
|
||||||
|
class="ring-base-300 ring-offset-base-100 rounded-full ring-2 ring-offset-2 flex justify-center items-center"
|
||||||
|
>
|
||||||
|
<Image
|
||||||
|
src={avatar}
|
||||||
|
alt="anotherhadi avatar"
|
||||||
|
class="rounded-full m-auto"
|
||||||
|
width={36}
|
||||||
|
height={36}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<p class="text-sm font-semibold">
|
||||||
|
<a href="/"><span class="text-base-content/40">@</span>{username}</a>
|
||||||
|
</p>
|
||||||
|
<p class="text-xs text-base-content/60">{bio}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
import { ArrowUp } from "lucide-astro";
|
import { ArrowUp } from "@lucide/astro";
|
||||||
---
|
---
|
||||||
|
|
||||||
<button
|
<button
|
||||||
|
|||||||
@@ -2,21 +2,13 @@
|
|||||||
import type { CollectionEntry } from "astro:content";
|
import type { CollectionEntry } from "astro:content";
|
||||||
import TagBadge from "./TagBadge.astro";
|
import TagBadge from "./TagBadge.astro";
|
||||||
import { Image } from "astro:assets";
|
import { Image } from "astro:assets";
|
||||||
|
import { formatDate } from "../utils/notes";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
post: CollectionEntry<"blog">;
|
post: CollectionEntry<"blog">;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { post } = Astro.props;
|
const { post } = Astro.props;
|
||||||
|
|
||||||
function formatDate(date: Date) {
|
|
||||||
const options: Intl.DateTimeFormatOptions = {
|
|
||||||
month: "long",
|
|
||||||
day: "numeric",
|
|
||||||
year: "numeric",
|
|
||||||
};
|
|
||||||
return date.toLocaleDateString("en-US", options);
|
|
||||||
}
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<article
|
<article
|
||||||
|
|||||||
@@ -4,11 +4,8 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
function message() {
|
function message() {
|
||||||
const url = window.location.href;
|
|
||||||
console.log(
|
console.log(
|
||||||
"Hey!\nWant to chat? Send me a dm on bsky (hadi1842.bsky.social) or a mail to anotherhadi.clapped234[at]passmail.net and I'll respond whenever I can.\nUse my gpg key (" +
|
"Hey!\nWant to chat? Send me a mail to anotherhadi.clapped234[at]passmail.net and I'll respond whenever I can.\nUse my gpg key (https://hadi.icu/anotherhadi.asc) for secure communication.",
|
||||||
url +
|
|
||||||
"anotherhadi.asc) for secure communication.",
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
message();
|
message();
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
import { Send } from "@lucide/astro";
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<section id="contact" class="py-20 px-4">
|
<section id="contact" class="py-20 px-4">
|
||||||
|
|||||||
@@ -0,0 +1,119 @@
|
|||||||
|
---
|
||||||
|
import { ExternalLink, ChevronDown } from "@lucide/astro";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
repo: {
|
||||||
|
name: string;
|
||||||
|
description: string;
|
||||||
|
html_url: string;
|
||||||
|
website: string;
|
||||||
|
topics: string[];
|
||||||
|
banner_url: string;
|
||||||
|
mirrors: {
|
||||||
|
github?: string;
|
||||||
|
gitlab?: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const { repo } = Astro.props;
|
||||||
|
|
||||||
|
const platforms = [
|
||||||
|
...(repo.mirrors.github
|
||||||
|
? [{ label: "GitHub", url: repo.mirrors.github }]
|
||||||
|
: []),
|
||||||
|
...(repo.mirrors.gitlab
|
||||||
|
? [{ label: "GitLab", url: repo.mirrors.gitlab }]
|
||||||
|
: []),
|
||||||
|
{ label: "Gitea", url: repo.html_url },
|
||||||
|
];
|
||||||
|
|
||||||
|
const hasMultiplePlatforms = platforms.length > 1;
|
||||||
|
---
|
||||||
|
|
||||||
|
<article
|
||||||
|
class="card bg-base-100 shadow-xl border border-base-200 rounded-lg hover:shadow-2xl transition-shadow"
|
||||||
|
>
|
||||||
|
<figure class="aspect-video bg-base-200 overflow-hidden">
|
||||||
|
<img
|
||||||
|
src={repo.banner_url}
|
||||||
|
alt={repo.name}
|
||||||
|
class="w-full h-full object-cover"
|
||||||
|
onerror="this.parentElement.style.display='none'"
|
||||||
|
/>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
<h2 class="card-title hover:text-primary transition-colors">
|
||||||
|
<a href={repo.html_url} target="_blank" rel="noopener noreferrer">
|
||||||
|
{repo.name}
|
||||||
|
</a>
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
{repo.description && <p class="text-base-content/80">{repo.description}</p>}
|
||||||
|
|
||||||
|
<div class="flex flex-wrap gap-2 mt-2">
|
||||||
|
{
|
||||||
|
repo.topics.map((topic) => (
|
||||||
|
<span class="badge badge-sm rounded-sm badge-soft badge-accent">
|
||||||
|
{topic}
|
||||||
|
</span>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-actions justify-end mt-4 gap-2">
|
||||||
|
{
|
||||||
|
repo.website && (
|
||||||
|
<a
|
||||||
|
href={repo.website}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
class="btn btn-soft btn-sm gap-1"
|
||||||
|
>
|
||||||
|
<ExternalLink class="size-4" />
|
||||||
|
Website
|
||||||
|
</a>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
hasMultiplePlatforms ? (
|
||||||
|
<div class="dropdown dropdown-end">
|
||||||
|
<div
|
||||||
|
tabindex="0"
|
||||||
|
role="button"
|
||||||
|
class="btn btn-primary btn-sm gap-1"
|
||||||
|
>
|
||||||
|
<ExternalLink class="size-4" />
|
||||||
|
View Source
|
||||||
|
<ChevronDown class="size-3" />
|
||||||
|
</div>
|
||||||
|
<ul
|
||||||
|
tabindex="0"
|
||||||
|
class="dropdown-content menu bg-base-100 rounded-xl z-10 w-36 p-1.5 shadow border border-base-200 text-sm"
|
||||||
|
>
|
||||||
|
{platforms.map(({ label, url }) => (
|
||||||
|
<li>
|
||||||
|
<a href={url} target="_blank" rel="noopener noreferrer">
|
||||||
|
{label}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<a
|
||||||
|
href={repo.html_url}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
class="btn btn-primary btn-sm gap-1"
|
||||||
|
>
|
||||||
|
<ExternalLink class="size-4" />
|
||||||
|
View on Gitea
|
||||||
|
</a>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
+84
-20
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
import { ArrowRight, Coffee, FolderCode, Key, Newspaper } from "@lucide/astro";
|
import { ArrowRight, FolderCode, Key, Rss } from "@lucide/astro";
|
||||||
import { Image } from "astro:assets";
|
import { Image } from "astro:assets";
|
||||||
|
import type { SocialLinks } from "../config";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
name: string;
|
name: string;
|
||||||
@@ -8,22 +9,21 @@ interface Props {
|
|||||||
description: string;
|
description: string;
|
||||||
avatar: any;
|
avatar: any;
|
||||||
location?: string;
|
location?: string;
|
||||||
socialLinks?: {
|
socialLinks?: SocialLinks;
|
||||||
github?: string;
|
|
||||||
linkedin?: string;
|
|
||||||
twitter?: string;
|
|
||||||
bluesky?: string;
|
|
||||||
instagram?: string;
|
|
||||||
youTube?: string;
|
|
||||||
medium?: string;
|
|
||||||
kofi?: string;
|
|
||||||
codetips?: string;
|
|
||||||
};
|
|
||||||
gpgKey?: string;
|
gpgKey?: string;
|
||||||
|
rssFeed?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { name, title, description, avatar, location, socialLinks, gpgKey } =
|
const {
|
||||||
Astro.props;
|
name,
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
avatar,
|
||||||
|
location,
|
||||||
|
socialLinks,
|
||||||
|
gpgKey,
|
||||||
|
rssFeed,
|
||||||
|
} = Astro.props;
|
||||||
---
|
---
|
||||||
|
|
||||||
<section class="hero min-h-[65vh]">
|
<section class="hero min-h-[65vh]">
|
||||||
@@ -46,7 +46,7 @@ const { name, title, description, avatar, location, socialLinks, gpgKey } =
|
|||||||
</p>
|
</p>
|
||||||
{
|
{
|
||||||
socialLinks && (
|
socialLinks && (
|
||||||
<div class="flex gap-4">
|
<div class="flex flex-wrap gap-4">
|
||||||
{socialLinks.github && (
|
{socialLinks.github && (
|
||||||
<div class="tooltip" data-tip="Github">
|
<div class="tooltip" data-tip="Github">
|
||||||
<a
|
<a
|
||||||
@@ -68,6 +68,50 @@ const { name, title, description, avatar, location, socialLinks, gpgKey } =
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
{socialLinks.gitlab && (
|
||||||
|
<div class="tooltip" data-tip="Gitlab">
|
||||||
|
<a
|
||||||
|
href={socialLinks.gitlab}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
class="btn btn-circle btn-ghost"
|
||||||
|
aria-label="Gitlab"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
fill="currentColor"
|
||||||
|
role="img"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path d="m23.6004 9.5927-.0337-.0862L20.3.9814a.851.851 0 0 0-.3362-.405.8748.8748 0 0 0-.9997.0539.8748.8748 0 0 0-.29.4399l-2.2055 6.748H7.5375l-2.2057-6.748a.8573.8573 0 0 0-.29-.4412.8748.8748 0 0 0-.9997-.0537.8585.8585 0 0 0-.3362.4049L.4332 9.5015l-.0325.0862a6.0657 6.0657 0 0 0 2.0119 7.0105l.0113.0087.03.0213 4.976 3.7264 2.462 1.8633 1.4995 1.1321a1.0085 1.0085 0 0 0 1.2197 0l1.4995-1.1321 2.4619-1.8633 5.006-3.7489.0125-.01a6.0682 6.0682 0 0 0 2.0094-7.003z" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{socialLinks.gitea && (
|
||||||
|
<div class="tooltip" data-tip="Gitea">
|
||||||
|
<a
|
||||||
|
href={socialLinks.gitea}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
class="btn btn-circle btn-ghost"
|
||||||
|
aria-label="Gitea"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
fill="currentColor"
|
||||||
|
role="img"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path d="M4.209 4.603c-.247 0-.525.02-.84.088-.333.07-1.28.283-2.054 1.027C-.403 7.25.035 9.685.089 10.052c.065.446.263 1.687 1.21 2.768 1.749 2.141 5.513 2.092 5.513 2.092s.462 1.103 1.168 2.119c.955 1.263 1.936 2.248 2.89 2.367 2.406 0 7.212-.004 7.212-.004s.458.004 1.08-.394c.535-.324 1.013-.893 1.013-.893s.492-.527 1.18-1.73c.21-.37.385-.729.538-1.068 0 0 2.107-4.471 2.107-8.823-.042-1.318-.367-1.55-.443-1.627-.156-.156-.366-.153-.366-.153s-4.475.252-6.792.306c-.508.011-1.012.023-1.512.027v4.474l-.634-.301c0-1.39-.004-4.17-.004-4.17-1.107.016-3.405-.084-3.405-.084s-5.399-.27-5.987-.324c-.187-.011-.401-.032-.648-.032zm.354 1.832h.111s.271 2.269.6 3.597C5.549 11.147 6.22 13 6.22 13s-.996-.119-1.641-.348c-.99-.324-1.409-.714-1.409-.714s-.73-.511-1.096-1.52C1.444 8.73 2.021 7.7 2.021 7.7s.32-.859 1.47-1.145c.395-.106.863-.12 1.072-.12zm8.33 2.554c.26.003.509.127.509.127l.868.422-.529 1.075a.686.686 0 0 0-.614.359.685.685 0 0 0 .072.756l-.939 1.924a.69.69 0 0 0-.66.527.687.687 0 0 0 .347.763.686.686 0 0 0 .867-.206.688.688 0 0 0-.069-.882l.916-1.874a.667.667 0 0 0 .237-.02.657.657 0 0 0 .271-.137 8.826 8.826 0 0 1 1.016.512.761.761 0 0 1 .286.282c.073.21-.073.569-.073.569-.087.29-.702 1.55-.702 1.55a.692.692 0 0 0-.676.477.681.681 0 1 0 1.157-.252c.073-.141.141-.282.214-.431.19-.397.515-1.16.515-1.16.035-.066.218-.394.103-.814-.095-.435-.48-.638-.48-.638-.467-.301-1.116-.58-1.116-.58s0-.156-.042-.27a.688.688 0 0 0-.148-.241l.516-1.062 2.89 1.401s.48.218.583.619c.073.282-.019.534-.069.657-.24.587-2.1 4.317-2.1 4.317s-.232.554-.748.588a1.065 1.065 0 0 1-.393-.045l-.202-.08-4.31-2.1s-.417-.218-.49-.596c-.083-.31.104-.691.104-.691l2.073-4.272s.183-.37.466-.497a.855.855 0 0 1 .35-.077z" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
{socialLinks.linkedin && (
|
{socialLinks.linkedin && (
|
||||||
<div class="tooltip" data-tip="Linkedin">
|
<div class="tooltip" data-tip="Linkedin">
|
||||||
<a
|
<a
|
||||||
@@ -150,10 +194,10 @@ const { name, title, description, avatar, location, socialLinks, gpgKey } =
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{socialLinks.youTube && (
|
{socialLinks.youtube && (
|
||||||
<div class="tooltip" data-tip="Youtube">
|
<div class="tooltip" data-tip="Youtube">
|
||||||
<a
|
<a
|
||||||
href={socialLinks.youTube}
|
href={socialLinks.youtube}
|
||||||
class="btn btn-circle btn-ghost"
|
class="btn btn-circle btn-ghost"
|
||||||
aria-label="YouTube"
|
aria-label="YouTube"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
@@ -212,7 +256,7 @@ const { name, title, description, avatar, location, socialLinks, gpgKey } =
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{socialLinks.kofi && (
|
{socialLinks.kofi && (
|
||||||
<div class="tooltip" data-tip="Ko-fi">
|
<div class="tooltip" data-tip="Ko-fi - Support me">
|
||||||
<a
|
<a
|
||||||
href={socialLinks.kofi}
|
href={socialLinks.kofi}
|
||||||
class="btn btn-circle btn-ghost"
|
class="btn btn-circle btn-ghost"
|
||||||
@@ -276,19 +320,39 @@ const { name, title, description, avatar, location, socialLinks, gpgKey } =
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
{rssFeed && (
|
||||||
|
<div class="tooltip" data-tip="RSS Feed">
|
||||||
|
<a
|
||||||
|
href={rssFeed}
|
||||||
|
class="btn btn-circle btn-ghost"
|
||||||
|
aria-label="RSS Feed"
|
||||||
|
target="_blank"
|
||||||
|
>
|
||||||
|
<Rss class="size-6" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="mt-12 flex gap-5">
|
<div class="mt-12 flex flex-wrap gap-5">
|
||||||
<a href="/blog" class="btn btn-ghost gap-2">
|
<a href="/blog" class="btn btn-ghost gap-2">
|
||||||
Blog
|
Blog Posts
|
||||||
<ArrowRight class="size-4" />
|
<ArrowRight class="size-4" />
|
||||||
</a>
|
</a>
|
||||||
<a href="/projects" class="btn btn-ghost gap-2">
|
<a href="/projects" class="btn btn-ghost gap-2">
|
||||||
Projects
|
Projects
|
||||||
<ArrowRight class="size-4" />
|
<ArrowRight class="size-4" />
|
||||||
</a>
|
</a>
|
||||||
|
<a href="/notes" class="btn btn-ghost gap-2">
|
||||||
|
Infosec Notes
|
||||||
|
<ArrowRight class="size-4" />
|
||||||
|
</a>
|
||||||
|
<a href="/#contact" class="btn btn-ghost gap-2">
|
||||||
|
Contact Me
|
||||||
|
<ArrowRight class="size-4" />
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,142 @@
|
|||||||
|
---
|
||||||
|
const pathname = Astro.url.pathname;
|
||||||
|
|
||||||
|
const links = [
|
||||||
|
{ href: "/", label: "home" },
|
||||||
|
{ href: "/blog", label: "blog" },
|
||||||
|
{ href: "/notes", label: "infosec notes" },
|
||||||
|
{ href: "/projects", label: "projects" },
|
||||||
|
];
|
||||||
|
|
||||||
|
function isActive(href: string) {
|
||||||
|
if (href === "/") return pathname === "/";
|
||||||
|
return pathname.startsWith(href);
|
||||||
|
}
|
||||||
|
---
|
||||||
|
|
||||||
|
<header
|
||||||
|
class="fixed top-0 left-0 right-0 z-[60] h-12 flex items-center px-5"
|
||||||
|
style="background: oklch(0% 0 0 / 0.85); backdrop-filter: blur(12px); border-bottom: 1px solid oklch(22% 0 0);"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="flex items-center justify-between w-full max-w-screen-2xl mx-auto"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
href="/"
|
||||||
|
class="font-mono text-sm text-base-content/40 hover:text-primary transition-colors duration-200 tracking-tight"
|
||||||
|
>
|
||||||
|
~/hadi
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div
|
||||||
|
id="oneko-track"
|
||||||
|
transition:persist
|
||||||
|
class="flex-1 relative h-12 pointer-events-none"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<nav class="hidden md:flex items-center">
|
||||||
|
{
|
||||||
|
links.map((link) => (
|
||||||
|
<a
|
||||||
|
href={link.href}
|
||||||
|
class:list={[
|
||||||
|
"font-mono text-xs px-3 py-1.5 transition-colors duration-150",
|
||||||
|
isActive(link.href)
|
||||||
|
? "text-primary"
|
||||||
|
: "text-base-content/40 hover:text-base-content/80",
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
{isActive(link.href) ? (
|
||||||
|
<span class="flex items-center gap-1">
|
||||||
|
<span class="inline-block w-1 h-1 rounded-full bg-primary" />
|
||||||
|
{link.label}
|
||||||
|
</span>
|
||||||
|
) : (
|
||||||
|
link.label
|
||||||
|
)}
|
||||||
|
</a>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<button
|
||||||
|
id="hamburger"
|
||||||
|
class="md:hidden flex flex-col gap-1 p-2 text-base-content/40 hover:text-base-content/70 transition-colors"
|
||||||
|
aria-label="Toggle menu"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="hamburger-line block w-4 h-px bg-current transition-all duration-200"
|
||||||
|
></span>
|
||||||
|
<span
|
||||||
|
class="hamburger-line block w-4 h-px bg-current transition-all duration-200"
|
||||||
|
></span>
|
||||||
|
<span
|
||||||
|
class="hamburger-line block w-4 h-px bg-current transition-all duration-200"
|
||||||
|
></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div
|
||||||
|
id="mobile-menu"
|
||||||
|
class="hidden fixed inset-x-0 top-12 z-[59] md:hidden border-b border-base-300/60 py-2"
|
||||||
|
style="background: oklch(2% 0 0 / 0.97); backdrop-filter: blur(12px);"
|
||||||
|
>
|
||||||
|
{
|
||||||
|
links.map((link) => (
|
||||||
|
<a
|
||||||
|
href={link.href}
|
||||||
|
class:list={[
|
||||||
|
"flex items-center gap-2 font-mono text-sm px-5 py-2.5 transition-colors",
|
||||||
|
isActive(link.href)
|
||||||
|
? "text-primary"
|
||||||
|
: "text-base-content/45 hover:text-base-content/80",
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
{isActive(link.href) && (
|
||||||
|
<span class="inline-block w-1 h-1 rounded-full bg-primary shrink-0" />
|
||||||
|
)}
|
||||||
|
{link.label}
|
||||||
|
</a>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function init() {
|
||||||
|
const btn = document.getElementById("hamburger");
|
||||||
|
const menu = document.getElementById("mobile-menu");
|
||||||
|
if (!btn || !menu) return;
|
||||||
|
const lines = btn.querySelectorAll<HTMLElement>(".hamburger-line");
|
||||||
|
let open = false;
|
||||||
|
menu.style.display = "none";
|
||||||
|
lines[0].style.transform = "";
|
||||||
|
lines[1].style.opacity = "";
|
||||||
|
lines[2].style.transform = "";
|
||||||
|
|
||||||
|
btn.addEventListener("click", () => {
|
||||||
|
open = !open;
|
||||||
|
menu.style.display = open ? "block" : "none";
|
||||||
|
lines[0].style.transform = open ? "translateY(5px) rotate(45deg)" : "";
|
||||||
|
lines[1].style.opacity = open ? "0" : "";
|
||||||
|
lines[2].style.transform = open ? "translateY(-5px) rotate(-45deg)" : "";
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener("click", (e) => {
|
||||||
|
if (
|
||||||
|
open &&
|
||||||
|
!btn.contains(e.target as Node) &&
|
||||||
|
!menu.contains(e.target as Node)
|
||||||
|
) {
|
||||||
|
open = false;
|
||||||
|
menu.style.display = "none";
|
||||||
|
lines[0].style.transform = "";
|
||||||
|
lines[1].style.opacity = "";
|
||||||
|
lines[2].style.transform = "";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener("astro:page-load", init);
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,278 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { onMount } from "svelte";
|
||||||
|
|
||||||
|
interface GNode {
|
||||||
|
id: string;
|
||||||
|
title: string;
|
||||||
|
current: boolean;
|
||||||
|
}
|
||||||
|
interface GEdge {
|
||||||
|
from: string;
|
||||||
|
to: string;
|
||||||
|
}
|
||||||
|
interface Props {
|
||||||
|
nodes?: GNode[];
|
||||||
|
edges?: GEdge[];
|
||||||
|
}
|
||||||
|
|
||||||
|
const { nodes = [], edges = [] }: Props = $props();
|
||||||
|
|
||||||
|
const PRIMARY = "oklch(71% 0.0863 296.59)";
|
||||||
|
|
||||||
|
let canvas: HTMLCanvasElement;
|
||||||
|
|
||||||
|
function startAnimation(): () => void {
|
||||||
|
if (!canvas || nodes.length === 0) return () => {};
|
||||||
|
|
||||||
|
const W = (canvas.width = canvas.offsetWidth);
|
||||||
|
const H = (canvas.height = 190);
|
||||||
|
const ctx = canvas.getContext("2d")!;
|
||||||
|
|
||||||
|
type SimNode = GNode & { x: number; y: number; vx: number; vy: number };
|
||||||
|
|
||||||
|
const simNodes: SimNode[] = nodes.map((n) => ({
|
||||||
|
...n,
|
||||||
|
x: n.current ? W / 2 : W / 2 + (Math.random() - 0.5) * 80,
|
||||||
|
y: n.current ? H / 2 : H / 2 + (Math.random() - 0.5) * 80,
|
||||||
|
vx: 0,
|
||||||
|
vy: 0,
|
||||||
|
}));
|
||||||
|
|
||||||
|
let dragging: SimNode | null = null;
|
||||||
|
let hovered: SimNode | null = null;
|
||||||
|
|
||||||
|
function nodeAt(x: number, y: number): SimNode | null {
|
||||||
|
return (
|
||||||
|
simNodes.find((n) => {
|
||||||
|
const dx = n.x - x,
|
||||||
|
dy = n.y - y;
|
||||||
|
return Math.sqrt(dx * dx + dy * dy) < (n.current ? 10 : 8);
|
||||||
|
}) ?? null
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function tick() {
|
||||||
|
for (let i = 0; i < simNodes.length; i++) {
|
||||||
|
for (let j = i + 1; j < simNodes.length; j++) {
|
||||||
|
const a = simNodes[i],
|
||||||
|
b = simNodes[j];
|
||||||
|
const dx = b.x - a.x,
|
||||||
|
dy = b.y - a.y;
|
||||||
|
const d = Math.sqrt(dx * dx + dy * dy) || 1;
|
||||||
|
const f = 900 / (d * d);
|
||||||
|
a.vx -= (dx / d) * f;
|
||||||
|
a.vy -= (dy / d) * f;
|
||||||
|
b.vx += (dx / d) * f;
|
||||||
|
b.vy += (dy / d) * f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (const e of edges) {
|
||||||
|
const a = simNodes.find((n) => n.id === e.from);
|
||||||
|
const b = simNodes.find((n) => n.id === e.to);
|
||||||
|
if (!a || !b) continue;
|
||||||
|
const dx = b.x - a.x,
|
||||||
|
dy = b.y - a.y;
|
||||||
|
const d = Math.sqrt(dx * dx + dy * dy) || 1;
|
||||||
|
const f = (d - 75) * 0.04;
|
||||||
|
a.vx += (dx / d) * f;
|
||||||
|
a.vy += (dy / d) * f;
|
||||||
|
b.vx -= (dx / d) * f;
|
||||||
|
b.vy -= (dy / d) * f;
|
||||||
|
}
|
||||||
|
for (const n of simNodes) {
|
||||||
|
n.vx += (W / 2 - n.x) * 0.025;
|
||||||
|
n.vy += (H / 2 - n.y) * 0.025;
|
||||||
|
}
|
||||||
|
for (const n of simNodes) {
|
||||||
|
if (n === dragging) continue;
|
||||||
|
n.vx *= 0.78;
|
||||||
|
n.vy *= 0.78;
|
||||||
|
n.x = Math.max(16, Math.min(W - 16, n.x + n.vx));
|
||||||
|
n.y = Math.max(16, Math.min(H - 16, n.y + n.vy));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function draw() {
|
||||||
|
ctx.clearRect(0, 0, W, H);
|
||||||
|
ctx.fillStyle = "oklch(2% 0 0)";
|
||||||
|
ctx.fillRect(0, 0, W, H);
|
||||||
|
|
||||||
|
const connected = new Set<string>();
|
||||||
|
if (hovered) {
|
||||||
|
for (const e of edges) {
|
||||||
|
if (e.from === hovered.id) connected.add(e.to);
|
||||||
|
if (e.to === hovered.id) connected.add(e.from);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const e of edges) {
|
||||||
|
const a = simNodes.find((n) => n.id === e.from);
|
||||||
|
const b = simNodes.find((n) => n.id === e.to);
|
||||||
|
if (!a || !b) continue;
|
||||||
|
const lit =
|
||||||
|
hovered && (e.from === hovered.id || e.to === hovered.id);
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.moveTo(a.x, a.y);
|
||||||
|
ctx.lineTo(b.x, b.y);
|
||||||
|
ctx.strokeStyle = lit ? "oklch(55% 0 0)" : "oklch(27% 0 0)";
|
||||||
|
ctx.lineWidth = lit ? 1.5 : 1;
|
||||||
|
ctx.stroke();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const n of simNodes) {
|
||||||
|
const isHov = hovered?.id === n.id;
|
||||||
|
const isCon = connected.has(n.id);
|
||||||
|
const r = n.current ? 7 : isHov ? 6 : 4.5;
|
||||||
|
|
||||||
|
if (isHov && !n.current) {
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.arc(n.x, n.y, r + 5, 0, Math.PI * 2);
|
||||||
|
ctx.fillStyle = "oklch(71% 0.0863 296.59 / 0.15)";
|
||||||
|
ctx.fill();
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.arc(n.x, n.y, r, 0, Math.PI * 2);
|
||||||
|
ctx.fillStyle = n.current
|
||||||
|
? PRIMARY
|
||||||
|
: isHov
|
||||||
|
? "oklch(78% 0.05 296.59)"
|
||||||
|
: isCon
|
||||||
|
? "oklch(58% 0.03 296.59)"
|
||||||
|
: "oklch(40% 0 0)";
|
||||||
|
ctx.fill();
|
||||||
|
|
||||||
|
if (n.current || isHov || isCon) {
|
||||||
|
ctx.font = `${n.current ? "10px" : "9px"} monospace`;
|
||||||
|
ctx.textAlign = "center";
|
||||||
|
ctx.fillStyle = n.current ? "oklch(87% 0 0)" : "oklch(62% 0 0)";
|
||||||
|
const label =
|
||||||
|
n.title.length > 14 ? n.title.slice(0, 13) + "…" : n.title;
|
||||||
|
ctx.fillText(label, n.x, n.y + r + 9);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let animId: number;
|
||||||
|
function loop() {
|
||||||
|
tick();
|
||||||
|
draw();
|
||||||
|
animId = requestAnimationFrame(loop);
|
||||||
|
}
|
||||||
|
animId = requestAnimationFrame(loop);
|
||||||
|
|
||||||
|
const onMousedown = (e: MouseEvent) => {
|
||||||
|
const r = canvas.getBoundingClientRect();
|
||||||
|
const sx = W / canvas.offsetWidth;
|
||||||
|
dragging = nodeAt(
|
||||||
|
(e.clientX - r.left) * sx,
|
||||||
|
(e.clientY - r.top) * (H / canvas.offsetHeight),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
const onMousemove = (e: MouseEvent) => {
|
||||||
|
const r = canvas.getBoundingClientRect();
|
||||||
|
const sx = W / canvas.offsetWidth;
|
||||||
|
const x = (e.clientX - r.left) * sx;
|
||||||
|
const y = (e.clientY - r.top) * (H / canvas.offsetHeight);
|
||||||
|
if (dragging) {
|
||||||
|
dragging.x = x;
|
||||||
|
dragging.y = y;
|
||||||
|
dragging.vx = 0;
|
||||||
|
dragging.vy = 0;
|
||||||
|
}
|
||||||
|
hovered = nodeAt(x, y);
|
||||||
|
canvas.style.cursor =
|
||||||
|
hovered && !hovered.current ? "pointer" : "default";
|
||||||
|
};
|
||||||
|
const onMouseup = () => {
|
||||||
|
dragging = null;
|
||||||
|
};
|
||||||
|
const onMouseleave = () => {
|
||||||
|
dragging = null;
|
||||||
|
hovered = null;
|
||||||
|
};
|
||||||
|
const onClick = (e: MouseEvent) => {
|
||||||
|
const r = canvas.getBoundingClientRect();
|
||||||
|
const sx = W / canvas.offsetWidth;
|
||||||
|
const n = nodeAt(
|
||||||
|
(e.clientX - r.left) * sx,
|
||||||
|
(e.clientY - r.top) * (H / canvas.offsetHeight),
|
||||||
|
);
|
||||||
|
if (n && !n.current) window.location.href = `/notes/${n.id}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
canvas.addEventListener("mousedown", onMousedown);
|
||||||
|
canvas.addEventListener("mousemove", onMousemove);
|
||||||
|
canvas.addEventListener("mouseup", onMouseup);
|
||||||
|
canvas.addEventListener("mouseleave", onMouseleave);
|
||||||
|
canvas.addEventListener("click", onClick);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
cancelAnimationFrame(animId);
|
||||||
|
canvas.removeEventListener("mousedown", onMousedown);
|
||||||
|
canvas.removeEventListener("mousemove", onMousemove);
|
||||||
|
canvas.removeEventListener("mouseup", onMouseup);
|
||||||
|
canvas.removeEventListener("mouseleave", onMouseleave);
|
||||||
|
canvas.removeEventListener("click", onClick);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
const drawer = document.getElementById(
|
||||||
|
"graph-drawer",
|
||||||
|
) as HTMLInputElement | null;
|
||||||
|
const outerDrawer =
|
||||||
|
drawer?.closest<HTMLElement>(".drawer.drawer-end") ?? null;
|
||||||
|
|
||||||
|
let stopFn: (() => void) | null = null;
|
||||||
|
|
||||||
|
function isVisible() {
|
||||||
|
return (
|
||||||
|
(drawer?.checked ?? false) ||
|
||||||
|
(outerDrawer?.classList.contains("xl:drawer-open") ?? false)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function start() {
|
||||||
|
if (stopFn) return;
|
||||||
|
stopFn = startAnimation();
|
||||||
|
}
|
||||||
|
|
||||||
|
function stop() {
|
||||||
|
stopFn?.();
|
||||||
|
stopFn = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isVisible()) start();
|
||||||
|
|
||||||
|
const onDrawerChange = () => {
|
||||||
|
isVisible() ? start() : stop();
|
||||||
|
};
|
||||||
|
drawer?.addEventListener("change", onDrawerChange);
|
||||||
|
|
||||||
|
// Watch for xl:drawer-open class toggled by the graph button script
|
||||||
|
const observer = new MutationObserver(() => {
|
||||||
|
isVisible() ? start() : stop();
|
||||||
|
});
|
||||||
|
if (outerDrawer) {
|
||||||
|
observer.observe(outerDrawer, {
|
||||||
|
attributes: true,
|
||||||
|
attributeFilter: ["class"],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
stop();
|
||||||
|
drawer?.removeEventListener("change", onDrawerChange);
|
||||||
|
observer.disconnect();
|
||||||
|
};
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<canvas
|
||||||
|
bind:this={canvas}
|
||||||
|
height="190"
|
||||||
|
role="img"
|
||||||
|
aria-label="Graph of linked notes"
|
||||||
|
style="width:100%; display:block; background: oklch(2% 0 0); cursor:default;"
|
||||||
|
></canvas>
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
---
|
||||||
|
import NoteGraph from "./NoteGraph.svelte";
|
||||||
|
import Author from "./Author.astro";
|
||||||
|
import { formatDate } from "../utils/notes";
|
||||||
|
import type { CollectionEntry } from "astro:content";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
entry: CollectionEntry<"notes">;
|
||||||
|
graphNodes: { id: string; title: string; current: boolean }[];
|
||||||
|
graphEdges: { from: string; to: string }[];
|
||||||
|
forwardLinks: CollectionEntry<"notes">[];
|
||||||
|
backlinks: CollectionEntry<"notes">[];
|
||||||
|
}
|
||||||
|
|
||||||
|
const { entry, graphNodes, graphEdges, forwardLinks, backlinks } = Astro.props;
|
||||||
|
---
|
||||||
|
|
||||||
|
<aside
|
||||||
|
id="right-sidebar"
|
||||||
|
class="w-52 flex flex-col border-l border-base-300/60 h-full overflow-y-auto"
|
||||||
|
style="background: oklch(4% 0 0);"
|
||||||
|
>
|
||||||
|
<div class="border-b border-base-300/40">
|
||||||
|
<p
|
||||||
|
class="font-mono text-[10px] text-base-content/25 uppercase tracking-widest px-3 pt-3 pb-2"
|
||||||
|
>
|
||||||
|
graph
|
||||||
|
</p>
|
||||||
|
<NoteGraph client:visible nodes={graphNodes} edges={graphEdges} />
|
||||||
|
{
|
||||||
|
graphNodes.length < 2 && (
|
||||||
|
<p class="font-mono text-[9px] text-base-content/20 text-center py-2">
|
||||||
|
no connections yet
|
||||||
|
</p>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{
|
||||||
|
forwardLinks.length > 0 && (
|
||||||
|
<div class="p-3 border-b border-base-300/40">
|
||||||
|
<p class="font-mono text-[10px] text-base-content/25 uppercase tracking-widest mb-2">
|
||||||
|
links
|
||||||
|
</p>
|
||||||
|
<ul class="space-y-1">
|
||||||
|
{forwardLinks.map((n) => (
|
||||||
|
<li>
|
||||||
|
<a
|
||||||
|
href={`/notes/${n.id}`}
|
||||||
|
class="font-mono text-xs text-base-content/45 hover:text-primary/80 transition-colors block truncate"
|
||||||
|
>
|
||||||
|
→ {n.data.title}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
backlinks.length > 0 && (
|
||||||
|
<div class="p-3">
|
||||||
|
<p class="font-mono text-[10px] text-base-content/25 uppercase tracking-widest mb-2">
|
||||||
|
backlinks
|
||||||
|
</p>
|
||||||
|
<ul class="space-y-1">
|
||||||
|
{backlinks.map((n) => (
|
||||||
|
<li>
|
||||||
|
<a
|
||||||
|
href={`/notes/${n.id}`}
|
||||||
|
class="font-mono text-xs text-base-content/45 hover:text-primary/80 transition-colors block truncate"
|
||||||
|
>
|
||||||
|
← {n.data.title}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
forwardLinks.length === 0 && backlinks.length === 0 && (
|
||||||
|
<div class="p-3">
|
||||||
|
<p class="font-mono text-[9px] text-base-content/20">
|
||||||
|
no linked notes
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
<div class="px-4 pt-4 pb-1 border-t border-base-300/40 mt-auto">
|
||||||
|
<time
|
||||||
|
datetime={entry.data.publishDate.toISOString()}
|
||||||
|
class="font-mono text-[10px] text-base-content/30 uppercase tracking-widest"
|
||||||
|
>
|
||||||
|
{formatDate(entry.data.publishDate)}
|
||||||
|
</time>
|
||||||
|
</div>
|
||||||
|
<div class="px-4 py-4">
|
||||||
|
<Author />
|
||||||
|
</div>
|
||||||
|
</aside>
|
||||||
@@ -0,0 +1,173 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { slide } from "svelte/transition";
|
||||||
|
import { untrack } from "svelte";
|
||||||
|
|
||||||
|
interface Note {
|
||||||
|
id: string;
|
||||||
|
data: { title: string; tags: string[]; category?: string };
|
||||||
|
body?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
notes: Note[];
|
||||||
|
currentEntry?: Note;
|
||||||
|
currentCategory?: string;
|
||||||
|
categories: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
const { notes, currentEntry, currentCategory, categories }: Props = $props();
|
||||||
|
|
||||||
|
let search = $state("");
|
||||||
|
|
||||||
|
function getCategory(n: Note): string {
|
||||||
|
if (n.data.category) return n.data.category;
|
||||||
|
const parts = n.id.split("/");
|
||||||
|
return parts.length > 1 ? parts[0] : "General";
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractInlineHashtags(body: string): string[] {
|
||||||
|
const re = /#(\w+)/g;
|
||||||
|
const tags: string[] = [];
|
||||||
|
let m;
|
||||||
|
while ((m = re.exec(body)) !== null) tags.push(m[1].toLowerCase());
|
||||||
|
return [...new Set(tags)];
|
||||||
|
}
|
||||||
|
|
||||||
|
function matchesSearch(note: Note): boolean {
|
||||||
|
const raw = search.toLowerCase().trim();
|
||||||
|
if (!raw) return true;
|
||||||
|
const isTag = raw.startsWith("#");
|
||||||
|
const term = isTag ? raw.slice(1) : raw;
|
||||||
|
const title = note.data.title.toLowerCase();
|
||||||
|
const tags = [
|
||||||
|
...note.data.tags,
|
||||||
|
...extractInlineHashtags(note.body ?? ""),
|
||||||
|
].map((t) => t.toLowerCase());
|
||||||
|
return isTag
|
||||||
|
? tags.some((t) => t.includes(term))
|
||||||
|
: title.includes(term) || tags.join(",").includes(term);
|
||||||
|
}
|
||||||
|
|
||||||
|
const activeCategory = $derived(
|
||||||
|
currentCategory ?? (currentEntry ? getCategory(currentEntry) : null),
|
||||||
|
);
|
||||||
|
|
||||||
|
let openCategories = $state<string[]>(
|
||||||
|
untrack(() => categories.filter((c) => c === activeCategory)),
|
||||||
|
);
|
||||||
|
|
||||||
|
function toggle(cat: string) {
|
||||||
|
if (openCategories.includes(cat)) {
|
||||||
|
openCategories = openCategories.filter((c) => c !== cat);
|
||||||
|
} else {
|
||||||
|
openCategories = [...openCategories, cat];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<aside
|
||||||
|
class="w-56 shrink-0 flex flex-col border-r border-base-300/60 h-[calc(100vh-3rem)]"
|
||||||
|
style="background: oklch(4% 0 0);"
|
||||||
|
>
|
||||||
|
<!-- Mobile close bar -->
|
||||||
|
<div class="lg:hidden flex items-center justify-between px-3 py-2 border-b border-base-300/40 shrink-0">
|
||||||
|
<span class="font-mono text-[10px] text-base-content/30 uppercase tracking-widest">nav</span>
|
||||||
|
<label
|
||||||
|
for="nav-drawer"
|
||||||
|
class="cursor-pointer text-base-content/30 hover:text-base-content/70 transition-colors p-1"
|
||||||
|
aria-label="close sidebar"
|
||||||
|
>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M18 6 6 18M6 6l12 12"/>
|
||||||
|
</svg>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Search -->
|
||||||
|
<div class="px-3 py-3 border-b border-base-300/40 shrink-0">
|
||||||
|
<div
|
||||||
|
class="flex items-center gap-1.5 px-2 py-1.5 rounded-md bg-base-200/50 border border-base-300/40 focus-within:border-base-300/70 transition-colors"
|
||||||
|
>
|
||||||
|
<span class="text-base-content/30 font-mono text-xs shrink-0">›</span>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
placeholder="search..."
|
||||||
|
bind:value={search}
|
||||||
|
class="flex-1 min-w-0 bg-transparent text-xs font-mono text-base-content/70 placeholder:text-base-content/25 outline-none"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Nav -->
|
||||||
|
<nav class="flex-1 min-h-0 overflow-y-auto overflow-x-hidden px-2 py-2 space-y-px">
|
||||||
|
{#each categories as cat}
|
||||||
|
{@const catNotes = notes.filter(
|
||||||
|
(n) => getCategory(n) === cat && matchesSearch(n),
|
||||||
|
)}
|
||||||
|
{#if catNotes.length > 0 || !search}
|
||||||
|
{@const isFolder = notes.some((n) => n.id.includes("/") && getCategory(n) === cat)}
|
||||||
|
<div>
|
||||||
|
<!-- Category header -->
|
||||||
|
<div class="flex items-center w-full">
|
||||||
|
<button
|
||||||
|
onclick={() => toggle(cat)}
|
||||||
|
class="flex items-center gap-1.5 px-2 py-1 rounded-md hover:bg-base-200/40 transition-colors duration-150 shrink-0"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
class="w-3 h-3 text-base-content/35 shrink-0 transition-transform duration-200"
|
||||||
|
class:rotate-90={openCategories.includes(cat)}
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2.5"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
>
|
||||||
|
<path d="m9 18 6-6-6-6" />
|
||||||
|
</svg>
|
||||||
|
<span class="text-primary/50 font-mono text-xs shrink-0">/</span>
|
||||||
|
</button>
|
||||||
|
{#if isFolder}
|
||||||
|
<a
|
||||||
|
href={`/notes/${cat}`}
|
||||||
|
class="flex-1 min-w-0 px-1 py-1 rounded-md hover:bg-base-200/40 transition-colors duration-150 font-bold tracking-tight text-sm truncate text-base-content/80 hover:text-base-content"
|
||||||
|
>
|
||||||
|
{cat}
|
||||||
|
</a>
|
||||||
|
{:else}
|
||||||
|
<span class="flex-1 min-w-0 px-1 py-1 font-bold tracking-tight text-sm truncate text-base-content/80">
|
||||||
|
{cat}
|
||||||
|
</span>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Notes list -->
|
||||||
|
{#if openCategories.includes(cat)}
|
||||||
|
<ul
|
||||||
|
class="ml-4 mt-0.5 pb-1 space-y-px"
|
||||||
|
transition:slide={{ duration: 180 }}
|
||||||
|
>
|
||||||
|
{#each catNotes as note}
|
||||||
|
<li class="tooltip tooltip-right w-full" data-tip={note.data.title}>
|
||||||
|
<a
|
||||||
|
href={`/notes/${note.id}`}
|
||||||
|
class="flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-mono truncate transition-colors duration-150
|
||||||
|
{currentEntry && note.id === currentEntry.id
|
||||||
|
? 'text-primary/90 bg-primary/10'
|
||||||
|
: 'text-base-content/45 hover:text-base-content/80 hover:bg-base-200/40'}"
|
||||||
|
>
|
||||||
|
<span class="shrink-0 font-mono text-base-content/20">
|
||||||
|
{currentEntry && note.id === currentEntry.id ? "▸" : "–"}
|
||||||
|
</span>
|
||||||
|
<span class="truncate">{note.data.title}</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{/each}
|
||||||
|
</ul>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
</nav>
|
||||||
|
</aside>
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
interface Props {
|
||||||
|
headings: { depth: number; text: string; id: string }[];
|
||||||
|
}
|
||||||
|
|
||||||
|
const { headings } = Astro.props;
|
||||||
|
---
|
||||||
|
|
||||||
|
{
|
||||||
|
headings.length > 0 && (
|
||||||
|
<div
|
||||||
|
class="collapse collapse-arrow mb-8 border border-base-300/40"
|
||||||
|
style="background: oklch(4% 0 0);"
|
||||||
|
>
|
||||||
|
<input type="checkbox" />
|
||||||
|
<div class="collapse-title font-mono text-xs text-base-content/35 flex items-center gap-2 py-2 px-3 min-h-0">
|
||||||
|
<span class="text-primary/40">§</span>
|
||||||
|
table of contents
|
||||||
|
</div>
|
||||||
|
<div class="collapse-content px-0 pb-0">
|
||||||
|
<nav class="px-3 pb-3 pt-1 border-t border-base-300/30 space-y-0.5">
|
||||||
|
{headings.map((h) => (
|
||||||
|
<a
|
||||||
|
href={`#${h.id}`}
|
||||||
|
class:list={[
|
||||||
|
"block text-xs text-base-content/45 hover:text-base-content/80 transition-colors py-0.5",
|
||||||
|
h.depth === 3 ? "pl-4" : h.depth === 4 ? "pl-8" : "",
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<span class="font-mono text-primary/25 mr-1.5">
|
||||||
|
{"#".repeat(h.depth)}
|
||||||
|
</span>
|
||||||
|
{h.text}
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { onMount } from "svelte";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
vars: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
const { vars }: Props = $props();
|
||||||
|
|
||||||
|
let values = $state<Record<string, string>>(
|
||||||
|
Object.fromEntries(vars.map((v) => [v, ""])),
|
||||||
|
);
|
||||||
|
let open = $state(false);
|
||||||
|
let applied = $state(false);
|
||||||
|
|
||||||
|
const originals = new Map<Text, string>();
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
const content = document.querySelector(".note-content");
|
||||||
|
if (!content) return;
|
||||||
|
const walker = document.createTreeWalker(content, NodeFilter.SHOW_TEXT);
|
||||||
|
let node: Text | null;
|
||||||
|
while ((node = walker.nextNode() as Text | null)) {
|
||||||
|
if (/\$[a-zA-Z_][a-zA-Z0-9_]*/.test(node.nodeValue ?? "")) {
|
||||||
|
originals.set(node, node.nodeValue!);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function applyVars() {
|
||||||
|
const sorted = [...vars].sort((a, b) => b.length - a.length);
|
||||||
|
for (const [node, original] of originals) {
|
||||||
|
let text = original;
|
||||||
|
for (const name of sorted) {
|
||||||
|
const val = values[name];
|
||||||
|
if (val) {
|
||||||
|
text = text.replace(
|
||||||
|
new RegExp(`\\$${name}(?![a-zA-Z0-9_])`, "g"),
|
||||||
|
val,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
node.nodeValue = text;
|
||||||
|
}
|
||||||
|
applied = true;
|
||||||
|
setTimeout(() => (applied = false), 1800);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if vars.length > 0}
|
||||||
|
<button
|
||||||
|
onclick={() => (open = true)}
|
||||||
|
class="btn btn-ghost btn-xs font-mono text-base-content/40 hover:text-base-content/70 border border-base-300/50"
|
||||||
|
>
|
||||||
|
<span class="font-mono text-[10px] leading-none">$</span>
|
||||||
|
vars
|
||||||
|
</button>
|
||||||
|
|
||||||
|
{#if open}
|
||||||
|
<dialog class="modal modal-open">
|
||||||
|
<div
|
||||||
|
class="modal-box max-w-sm"
|
||||||
|
style="background: oklch(10% 0 0); border: 1px solid oklch(71% 0.0863 296.59 / 0.5);"
|
||||||
|
>
|
||||||
|
<h3
|
||||||
|
class="font-mono text-[10px] text-base-content/40 uppercase tracking-widest mb-4"
|
||||||
|
>
|
||||||
|
variables
|
||||||
|
</h3>
|
||||||
|
<div class="space-y-2.5">
|
||||||
|
{#each vars as v}
|
||||||
|
<div class="flex items-center gap-3">
|
||||||
|
<label
|
||||||
|
class="font-mono text-xs text-primary/70 w-36 shrink-0 truncate"
|
||||||
|
title={`$${v}`}
|
||||||
|
>
|
||||||
|
${v}
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
bind:value={values[v]}
|
||||||
|
placeholder={`$${v}`}
|
||||||
|
class="input input-sm flex-1 min-w-0 font-mono text-xs bg-base-300/20 border-base-300/60 text-base-content/80 placeholder:text-base-content/25 focus:border-primary/60"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
<div class="mt-5 flex items-center justify-between">
|
||||||
|
<span
|
||||||
|
class="font-mono text-[10px] text-primary/60 transition-opacity duration-300"
|
||||||
|
class:opacity-0={!applied}
|
||||||
|
>
|
||||||
|
✓ applied
|
||||||
|
</span>
|
||||||
|
<div class="flex gap-2">
|
||||||
|
<button
|
||||||
|
onclick={applyVars}
|
||||||
|
class="btn btn-ghost btn-xs font-mono text-primary/60 hover:text-primary border border-primary/30"
|
||||||
|
>
|
||||||
|
apply
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
onclick={() => (open = false)}
|
||||||
|
class="btn btn-ghost btn-xs font-mono text-base-content/40 hover:text-base-content/70 border border-base-300/50"
|
||||||
|
>
|
||||||
|
close
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
onclick={() => (open = false)}
|
||||||
|
class="modal-backdrop"
|
||||||
|
aria-label="close"
|
||||||
|
></button>
|
||||||
|
</dialog>
|
||||||
|
{/if}
|
||||||
|
{/if}
|
||||||
@@ -0,0 +1,150 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { onMount } from "svelte";
|
||||||
|
|
||||||
|
interface NoteItem {
|
||||||
|
id: string;
|
||||||
|
title: string;
|
||||||
|
description: string;
|
||||||
|
tags: string[];
|
||||||
|
category: string;
|
||||||
|
searchText: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
notes: NoteItem[];
|
||||||
|
}
|
||||||
|
|
||||||
|
const { notes }: Props = $props();
|
||||||
|
|
||||||
|
let inputValue = $state("");
|
||||||
|
const query = $derived(inputValue.toLowerCase().trim());
|
||||||
|
|
||||||
|
const categories = $derived([
|
||||||
|
...new Set(notes.map((n) => n.category)),
|
||||||
|
].sort());
|
||||||
|
|
||||||
|
const filtered = $derived.by(() => {
|
||||||
|
if (!query) return notes;
|
||||||
|
const isTag = query.startsWith("#");
|
||||||
|
const q = isTag ? query.slice(1) : query;
|
||||||
|
return notes.filter((n) =>
|
||||||
|
isTag
|
||||||
|
? n.tags.some((t) => t.includes(q)) || n.searchText.includes(`#${q}`)
|
||||||
|
: n.searchText.includes(q),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
const visibleCount = $derived(filtered.length);
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
const urlTag = new URLSearchParams(window.location.search).get("tag");
|
||||||
|
if (urlTag) inputValue = `#${urlTag}`;
|
||||||
|
});
|
||||||
|
|
||||||
|
$effect(() => {
|
||||||
|
const url = new URL(window.location.href);
|
||||||
|
if (query.startsWith("#") && query.length > 1) {
|
||||||
|
url.searchParams.set("tag", query.slice(1));
|
||||||
|
} else {
|
||||||
|
url.searchParams.delete("tag");
|
||||||
|
}
|
||||||
|
history.replaceState(null, "", url.toString());
|
||||||
|
});
|
||||||
|
|
||||||
|
function filteredByCategory(cat: string) {
|
||||||
|
return filtered.filter((n) => n.category === cat);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="mb-12 max-w-sm mx-auto">
|
||||||
|
<label class="input w-full">
|
||||||
|
<span class="text-base-content/25">›</span>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
placeholder="search or #tag..."
|
||||||
|
bind:value={inputValue}
|
||||||
|
/>
|
||||||
|
</label>
|
||||||
|
<p class="font-mono text-[10px] text-base-content/20 mt-1.5 text-center">
|
||||||
|
use #tag to filter by tag
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-12">
|
||||||
|
{#each categories as cat}
|
||||||
|
{@const catNotes = filteredByCategory(cat)}
|
||||||
|
{#if catNotes.length > 0}
|
||||||
|
<section>
|
||||||
|
<div class="flex items-baseline gap-3 mb-4">
|
||||||
|
<h2 class="text-xl font-bold tracking-tight">
|
||||||
|
<span class="text-primary/50 font-mono mr-1">/</span>{cat}
|
||||||
|
</h2>
|
||||||
|
<span class="font-mono text-xs text-base-content/25">
|
||||||
|
{catNotes.length} note{catNotes.length !== 1 ? "s" : ""}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="border-t border-base-300/40 mb-1"></div>
|
||||||
|
<ul class="divide-y divide-base-300/20">
|
||||||
|
{#each catNotes as n}
|
||||||
|
<li>
|
||||||
|
<a
|
||||||
|
href={`/notes/${n.id}`}
|
||||||
|
class="group flex items-center gap-4 py-3 hover:bg-base-200/30 px-2 -mx-2 transition-colors"
|
||||||
|
>
|
||||||
|
<div class="flex-1 min-w-0">
|
||||||
|
<div class="flex flex-col mb-0.5">
|
||||||
|
<span
|
||||||
|
class="font-semibold text-sm group-hover:text-primary transition-colors"
|
||||||
|
>
|
||||||
|
{n.title}
|
||||||
|
</span>
|
||||||
|
{#if n.description}
|
||||||
|
<span class="text-xs text-base-content/35 truncate">
|
||||||
|
{n.description}
|
||||||
|
</span>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
{#if n.tags.length > 0}
|
||||||
|
<div class="flex flex-wrap gap-1 mt-1">
|
||||||
|
{#each n.tags as tag}
|
||||||
|
<span
|
||||||
|
class="badge badge-ghost badge-xs font-mono text-base-content/30"
|
||||||
|
>
|
||||||
|
{tag}
|
||||||
|
</span>
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="14"
|
||||||
|
height="14"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
class="text-base-content/20 group-hover:text-primary/50 shrink-0 transition-colors"
|
||||||
|
>
|
||||||
|
<path d="m9 18 6-6-6-6" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{/each}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{#if visibleCount === 0}
|
||||||
|
<div class="text-center py-20 font-mono text-sm text-base-content/25">
|
||||||
|
no results.
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
<p class="text-center font-mono text-xs text-base-content/20 mt-16">
|
||||||
|
{visibleCount} note{visibleCount !== 1 ? "s" : ""} total
|
||||||
|
</p>
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
---
|
|
||||||
import { Image } from "astro:assets";
|
|
||||||
import TagBadge from "./TagBadge.astro";
|
|
||||||
import { ExternalLink, Eye } from "@lucide/astro";
|
|
||||||
import type { CollectionEntry } from "astro:content";
|
|
||||||
|
|
||||||
interface Props {
|
|
||||||
project: CollectionEntry<"projects">;
|
|
||||||
}
|
|
||||||
|
|
||||||
const { project } = Astro.props;
|
|
||||||
---
|
|
||||||
|
|
||||||
<article
|
|
||||||
class="card bg-base-100 shadow-xl border border-base-200 rounded-lg hover:shadow-2xl transition-shadow"
|
|
||||||
>
|
|
||||||
<figure class="aspect-video">
|
|
||||||
<Image
|
|
||||||
src={project.data.image}
|
|
||||||
alt={project.data.title}
|
|
||||||
class="w-full h-full object-cover"
|
|
||||||
width={600}
|
|
||||||
height={400}
|
|
||||||
/>
|
|
||||||
</figure>
|
|
||||||
<div class="card-body">
|
|
||||||
<h2 class="card-title hover:text-primary transition-colors">
|
|
||||||
<a href={`/projects/${project.id}`}>{project.data.title}</a>
|
|
||||||
</h2>
|
|
||||||
<p class="text-base-content/80">{project.data.description}</p>
|
|
||||||
{
|
|
||||||
project.data.tags && project.data.tags.length > 0 && (
|
|
||||||
<div class="flex flex-wrap gap-2 mt-2">
|
|
||||||
{project.data.tags.map((tag) => (
|
|
||||||
<TagBadge tag={tag} />
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
<div class="card-actions justify-end mt-4 gap-2">
|
|
||||||
{
|
|
||||||
project.data.demoLink && (
|
|
||||||
<a
|
|
||||||
href={project.data.demoLink}
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
class="btn btn-sm btn-ghost gap-1"
|
|
||||||
>
|
|
||||||
<ExternalLink class="size-4" />
|
|
||||||
Demo
|
|
||||||
</a>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
{
|
|
||||||
project.data.url && (
|
|
||||||
<a
|
|
||||||
href={project.data.url}
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
class="btn btn-sm btn-ghost gap-1"
|
|
||||||
>
|
|
||||||
<ExternalLink class="size-4" />
|
|
||||||
Website
|
|
||||||
</a>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
{
|
|
||||||
project.data.sourceLink && (
|
|
||||||
<a
|
|
||||||
href={project.data.sourceLink}
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
class="btn btn-sm btn-ghost gap-1"
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
width="18"
|
|
||||||
height="18"
|
|
||||||
viewBox="0 0 32 32"
|
|
||||||
fill="currentColor"
|
|
||||||
>
|
|
||||||
<path d="M16,2.345c7.735,0,14,6.265,14,14-.002,6.015-3.839,11.359-9.537,13.282-.7,.14-.963-.298-.963-.665,0-.473,.018-1.978,.018-3.85,0-1.312-.437-2.152-.945-2.59,3.115-.35,6.388-1.54,6.388-6.912,0-1.54-.543-2.783-1.435-3.762,.14-.35,.63-1.785-.14-3.71,0,0-1.173-.385-3.85,1.435-1.12-.315-2.31-.472-3.5-.472s-2.38,.157-3.5,.472c-2.677-1.802-3.85-1.435-3.85-1.435-.77,1.925-.28,3.36-.14,3.71-.892,.98-1.435,2.24-1.435,3.762,0,5.355,3.255,6.563,6.37,6.913-.403,.35-.77,.963-.893,1.872-.805,.368-2.818,.963-4.077-1.155-.263-.42-1.05-1.452-2.152-1.435-1.173,.018-.472,.665,.017,.927,.595,.332,1.277,1.575,1.435,1.978,.28,.787,1.19,2.293,4.707,1.645,0,1.173,.018,2.275,.018,2.607,0,.368-.263,.787-.963,.665-5.719-1.904-9.576-7.255-9.573-13.283,0-7.735,6.265-14,14-14Z" />
|
|
||||||
</svg>
|
|
||||||
Source
|
|
||||||
</a>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
<div class="tooltip" data-tip="View project details">
|
|
||||||
<a href={`/projects/${project.id}`} class="btn btn-sm btn-primary">
|
|
||||||
<Eye class="size-4" />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
---
|
---
|
||||||
import { getCollection } from "astro:content";
|
import GiteaProjectCard from "./GiteaProjectCard.astro";
|
||||||
import ProjectCard from "./ProjectCard.astro";
|
|
||||||
import { ArrowRight } from "@lucide/astro";
|
import { ArrowRight } from "@lucide/astro";
|
||||||
|
import repos from "../data/repos.json";
|
||||||
|
|
||||||
const projectEntries = await getCollection("projects");
|
const latestRepos = repos.slice(0, 3);
|
||||||
---
|
---
|
||||||
|
|
||||||
<section id="projects" class="py-20 px-4">
|
<section id="projects" class="py-20 px-4">
|
||||||
@@ -12,21 +12,16 @@ const projectEntries = await getCollection("projects");
|
|||||||
<h2 class="text-4xl font-bold mb-4">Check out my latest work</h2>
|
<h2 class="text-4xl font-bold mb-4">Check out my latest work</h2>
|
||||||
<p class="text-lg text-base-content/70">
|
<p class="text-lg text-base-content/70">
|
||||||
I enjoy the challenge of reimagining existing programs & scripts in my
|
I enjoy the challenge of reimagining existing programs & scripts in my
|
||||||
own unique way. By creating these projects from scratch, I can ensure
|
own unique way.
|
||||||
complete control over every aspect of their design and functionality.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||||
{projectEntries.map((project) => <ProjectCard project={project} />)}
|
{latestRepos.map((repo) => <GiteaProjectCard repo={repo} />)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="text-center mt-12">
|
<div class="text-center mt-12">
|
||||||
<a
|
<a href="/projects" class="btn btn-ghost gap-2">
|
||||||
href="https://github.com/anotherhadi"
|
|
||||||
target="_blank"
|
|
||||||
class="btn btn-ghost gap-2"
|
|
||||||
>
|
|
||||||
View All Projects
|
View All Projects
|
||||||
<ArrowRight class="size-4" />
|
<ArrowRight class="size-4" />
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
+8
-2
@@ -3,11 +3,13 @@
|
|||||||
*/
|
*/
|
||||||
export interface SocialLinks {
|
export interface SocialLinks {
|
||||||
github?: string;
|
github?: string;
|
||||||
|
gitlab?: string;
|
||||||
|
gitea?: string;
|
||||||
linkedin?: string;
|
linkedin?: string;
|
||||||
twitter?: string;
|
twitter?: string;
|
||||||
bluesky?: string;
|
bluesky?: string;
|
||||||
instagram?: string;
|
instagram?: string;
|
||||||
youTube?: string;
|
youtube?: string;
|
||||||
codetips?: string;
|
codetips?: string;
|
||||||
kofi?: string;
|
kofi?: string;
|
||||||
medium?: string;
|
medium?: string;
|
||||||
@@ -24,6 +26,7 @@ export interface SiteConfig {
|
|||||||
location: string;
|
location: string;
|
||||||
socialLinks: SocialLinks;
|
socialLinks: SocialLinks;
|
||||||
gpgKey?: string;
|
gpgKey?: string;
|
||||||
|
rssFeed?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -32,17 +35,20 @@ export interface SiteConfig {
|
|||||||
*/
|
*/
|
||||||
export const siteConfig: SiteConfig = {
|
export const siteConfig: SiteConfig = {
|
||||||
name: "Hadi",
|
name: "Hadi",
|
||||||
title: "Infosec engineer.",
|
title: "@anotherhadi - Infosec engineer.",
|
||||||
description:
|
description:
|
||||||
"Infosec engineer passionate about Linux/NixOS, blockchains, OSINT & FOSS. Hacking with Go, exploring open tech, and contributing whenever I can 🐧",
|
"Infosec engineer passionate about Linux/NixOS, blockchains, OSINT & FOSS. Hacking with Go, exploring open tech, and contributing whenever I can 🐧",
|
||||||
avatar: "/avatar.png",
|
avatar: "/avatar.png",
|
||||||
location: "🇫🇷 France",
|
location: "🇫🇷 France",
|
||||||
socialLinks: {
|
socialLinks: {
|
||||||
github: "https://github.com/anotherhadi",
|
github: "https://github.com/anotherhadi",
|
||||||
|
gitlab: "https://gitlab.com/anotherhadi_mirror",
|
||||||
|
gitea: "https://git.hadi.icu",
|
||||||
twitter: "",
|
twitter: "",
|
||||||
bluesky: "",
|
bluesky: "",
|
||||||
kofi: "https://ko-fi.com/anotherhadi",
|
kofi: "https://ko-fi.com/anotherhadi",
|
||||||
medium: "https://medium.com/@anotherhadi",
|
medium: "https://medium.com/@anotherhadi",
|
||||||
},
|
},
|
||||||
gpgKey: "/anotherhadi.asc",
|
gpgKey: "/anotherhadi.asc",
|
||||||
|
rssFeed: "https://hadi.icu/rss.xml",
|
||||||
};
|
};
|
||||||
|
|||||||
+12
-15
@@ -1,20 +1,6 @@
|
|||||||
import { defineCollection, z } from "astro:content";
|
import { defineCollection, z } from "astro:content";
|
||||||
import { glob } from "astro/loaders";
|
import { glob } from "astro/loaders";
|
||||||
|
|
||||||
const projects = defineCollection({
|
|
||||||
loader: glob({ pattern: "**/*.md", base: "./src/content/projects" }),
|
|
||||||
schema: ({ image }) =>
|
|
||||||
z.object({
|
|
||||||
title: z.string(),
|
|
||||||
description: z.string(),
|
|
||||||
image: image(),
|
|
||||||
tags: z.array(z.string()),
|
|
||||||
demoLink: z.string().url().optional(),
|
|
||||||
url: z.string().url().optional(),
|
|
||||||
sourceLink: z.string().url().optional(),
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
|
|
||||||
const blog = defineCollection({
|
const blog = defineCollection({
|
||||||
loader: glob({ pattern: "**/*.{md,mdx}", base: "./src/content/blog" }),
|
loader: glob({ pattern: "**/*.{md,mdx}", base: "./src/content/blog" }),
|
||||||
schema: ({ image }) =>
|
schema: ({ image }) =>
|
||||||
@@ -28,7 +14,18 @@ const blog = defineCollection({
|
|||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const notes = defineCollection({
|
||||||
|
loader: glob({ pattern: "**/*.{md,mdx}", base: "./src/content/notes" }),
|
||||||
|
schema: z.object({
|
||||||
|
title: z.string(),
|
||||||
|
description: z.string(),
|
||||||
|
category: z.string().optional(),
|
||||||
|
tags: z.array(z.string()).default([]),
|
||||||
|
publishDate: z.coerce.date(),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
export const collections = {
|
export const collections = {
|
||||||
projects,
|
|
||||||
blog,
|
blog,
|
||||||
|
notes,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
---
|
||||||
|
title: "FTP"
|
||||||
|
description: "Enumeration, exploitation and post-exploitation techniques for FTP servers."
|
||||||
|
tags: ["ftp", "network", "service"]
|
||||||
|
publishDate: 2026-04-29
|
||||||
|
---
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
FTP runs on **port 21** (control) and uses a secondary data channel (port 20 for active, ephemeral port for passive).
|
||||||
|
Common implementations: vsftpd, ProFTPD, Pure-FTPd, FileZilla Server, IIS FTP.
|
||||||
|
|
||||||
|
## Enumeration
|
||||||
|
|
||||||
|
### Banner grabbing
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nc -nv $IP 21
|
||||||
|
ftp $IP
|
||||||
|
```
|
||||||
|
|
||||||
|
The banner often reveals the software version: cross-reference with CVE databases.
|
||||||
|
|
||||||
|
### Nmap
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nmap -sV -p 21 $IP
|
||||||
|
nmap -p 21 --script ftp-* $IP
|
||||||
|
```
|
||||||
|
|
||||||
|
Key scripts:
|
||||||
|
|
||||||
|
- `ftp-anon`: checks anonymous login
|
||||||
|
- `ftp-bounce`: tests for FTP bounce attack
|
||||||
|
- `ftp-brute`: brute-force credentials
|
||||||
|
- `ftp-syst`: retrieves system info
|
||||||
|
|
||||||
|
## Anonymous Login
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ftp $IP
|
||||||
|
# Username: anonymous
|
||||||
|
# Password: <empty> or anonymous@
|
||||||
|
```
|
||||||
|
|
||||||
|
If allowed, list and download everything:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ls -la
|
||||||
|
mget *
|
||||||
|
```
|
||||||
|
|
||||||
|
Check for writable directories: you may be able to upload a webshell if FTP root overlaps with a web root.
|
||||||
|
|
||||||
|
## Brute Force
|
||||||
|
|
||||||
|
```bash
|
||||||
|
hydra -l $user -P /usr/share/wordlists/rockyou.txt ftp://$IP
|
||||||
|
medusa -h $IP -u $user -P /usr/share/wordlists/rockyou.txt -M ftp
|
||||||
|
```
|
||||||
|
|
||||||
|
Try default credentials first: `admin:admin`, `ftp:ftp`, `user:password`.
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
---
|
||||||
|
title: "Bluesky"
|
||||||
|
description: "Enumeration, search operators, API endpoints and tools for investigating Bluesky accounts."
|
||||||
|
tags: ["osint", "bluesky", "social-media", "enumeration"]
|
||||||
|
publishDate: 2026-04-29
|
||||||
|
---
|
||||||
|
|
||||||
|
## Key Concepts
|
||||||
|
|
||||||
|
Bluesky is built on the **AT Protocol**. Every account has two identifiers:
|
||||||
|
|
||||||
|
- **Handle**: `user.bsky.social` or a custom domain (can change)
|
||||||
|
- **DID**: `did:plc:ewvi7nxzyoun6zhxrhs64oiz` (permanent, survives handle changes)
|
||||||
|
|
||||||
|
All public content is accessible **without an account**. Follower/following lists are also public by default.
|
||||||
|
|
||||||
|
## Account Enumeration
|
||||||
|
|
||||||
|
### Resolve handle → DID
|
||||||
|
|
||||||
|
```
|
||||||
|
https://bsky.social/xrpc/com.atproto.identity.resolveHandle?handle=$HANDLE
|
||||||
|
```
|
||||||
|
|
||||||
|
### Resolve DID → history (all past handles, keys, creation date)
|
||||||
|
|
||||||
|
```
|
||||||
|
https://plc.directory/$DID
|
||||||
|
```
|
||||||
|
|
||||||
|
### Get profile metadata
|
||||||
|
|
||||||
|
```
|
||||||
|
https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=$HANDLE
|
||||||
|
```
|
||||||
|
|
||||||
|
Returns: DID, display name, description, follower/following count, creation date, avatar URL.
|
||||||
|
|
||||||
|
### Followers / following
|
||||||
|
|
||||||
|
```
|
||||||
|
https://public.api.bsky.app/xrpc/app.bsky.graph.getFollowers?actor=$HANDLE&limit=100
|
||||||
|
https://public.api.bsky.app/xrpc/app.bsky.graph.getFollows?actor=$HANDLE&limit=100
|
||||||
|
```
|
||||||
|
|
||||||
|
Paginate with the `cursor` field from the response.
|
||||||
|
|
||||||
|
## Search Operators
|
||||||
|
|
||||||
|
Bluesky's full-text search supports these operators (combinable):
|
||||||
|
|
||||||
|
| Operator | Example | Effect |
|
||||||
|
| ----------- | ----------------------------- | ----------------------------- |
|
||||||
|
| `"..."` | `"exact phrase"` | Exact match |
|
||||||
|
| `from:` | `from:handle.bsky.social` | Posts by user |
|
||||||
|
| `mentions:` | `mentions:handle.bsky.social` | Posts mentioning user |
|
||||||
|
| `since:` | `since:2024-01-01` | After date (UTC, YYYY-MM-DD) |
|
||||||
|
| `until:` | `until:2024-06-30` | Before date (UTC, YYYY-MM-DD) |
|
||||||
|
| `lang:` | `lang:fr` | Language (ISO 639-1) |
|
||||||
|
| `domain:` | `domain:github.com` | Posts linking to domain |
|
||||||
|
| `#tag` | `#osint` | Hashtag |
|
||||||
|
|
||||||
|
#### API equivalent
|
||||||
|
|
||||||
|
```
|
||||||
|
https://public.api.bsky.app/xrpc/app.bsky.feed.searchPosts?q={QUERY}&author={HANDLE}&since=2024-01-01&until=2024-12-31&lang=en&limit=25
|
||||||
|
```
|
||||||
|
|
||||||
|
## Google Dorks
|
||||||
|
|
||||||
|
Bluesky is heavily indexed by Google. Useful for finding profiles and posts without touching the platform:
|
||||||
|
|
||||||
|
```
|
||||||
|
site:bsky.app "$TARGET_NAME"
|
||||||
|
site:bsky.app "$TARGET_NAME" inurl:profile
|
||||||
|
site:bsky.app "$KEYWORD" since:2024-01-01
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tools
|
||||||
|
|
||||||
|
### BlueSkyNet
|
||||||
|
|
||||||
|
Web app for searching and exporting Bluesky data to CSV. Wraps the public API with a UI for advanced search filters.
|
||||||
|
|
||||||
|
- [github.com/jakecreps/blueskynet](https://github.com/jakecreps/blueskynet)
|
||||||
|
|
||||||
|
### ClearSky
|
||||||
|
|
||||||
|
Shows block lists, blocking history, and who blocked a given account. Useful for mapping relationships and adversarial clusters.
|
||||||
|
|
||||||
|
- [clearsky.app](https://clearsky.app)
|
||||||
|
|
||||||
|
### plc.directory
|
||||||
|
|
||||||
|
Official DID PLC directory. Lookup a DID to get full account history: creation date, all past handles, key rotations.
|
||||||
|
|
||||||
|
- [plc.directory](https://plc.directory)
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
---
|
||||||
|
title: "X / Twitter"
|
||||||
|
description: "Enumeration, search operators, deleted content recovery and tools for investigating X accounts."
|
||||||
|
tags: ["osint", "twitter", "x", "social-media", "enumeration"]
|
||||||
|
publishDate: 2026-04-29
|
||||||
|
---
|
||||||
|
|
||||||
|
## Key Concepts
|
||||||
|
|
||||||
|
Every account has two identifiers:
|
||||||
|
|
||||||
|
- **Handle**: `@username` (can change)
|
||||||
|
- **User ID**: numeric, permanent (survives handle changes and suspensions)
|
||||||
|
|
||||||
|
Unlike [Bluesky](/notes/osint/bluesky), X now requires a login to browse most content in the browser. The free API tier (v2) is severely limited. Most open-source scraping tools that bypassed the API (Twint, snscrape, GetOldTweets3) are broken since the 2023 API lockdown.
|
||||||
|
|
||||||
|
## Account Enumeration
|
||||||
|
|
||||||
|
### Handle to User ID
|
||||||
|
|
||||||
|
The user ID stays constant when someone changes their handle or gets suspended. Several web tools resolve it:
|
||||||
|
|
||||||
|
- [tweeterid.com](https://tweeterid.com/)
|
||||||
|
- [commentpicker.com/twitter-id.php](https://commentpicker.com/twitter-id.php)
|
||||||
|
|
||||||
|
Or via the profile page source: look for `"id_str"` in the page JSON.
|
||||||
|
|
||||||
|
### Banner last update time
|
||||||
|
|
||||||
|
The profile banner URL contains a Unix timestamp indicating when the banner was last changed:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://pbs.twimg.com/profile_banners/{user_id}/{unix_timestamp}/600x200
|
||||||
|
```
|
||||||
|
|
||||||
|
Right-click the banner image and copy the URL, or inspect the page source. Convert the timestamp at [unixtimestamp.com](https://www.unixtimestamp.com/).
|
||||||
|
|
||||||
|
### Timestamp from ID (Snowflake)
|
||||||
|
|
||||||
|
Twitter IDs are Snowflake IDs: the numeric value encodes the exact creation time of a tweet or account. Extract it with:
|
||||||
|
|
||||||
|
```python
|
||||||
|
tweet_id = 1234567890123456789
|
||||||
|
timestamp_ms = (tweet_id >> 22) + 1288834974657
|
||||||
|
```
|
||||||
|
|
||||||
|
`1288834974657` is Twitter's custom epoch (Nov 4, 2010). Works on both tweet IDs and user IDs — useful to confirm account creation date without needing profile metadata.
|
||||||
|
|
||||||
|
Several online converters exist if you don't want to do it manually — search "snowflake id decoder".
|
||||||
|
|
||||||
|
### Direct profile URL by ID
|
||||||
|
|
||||||
|
Old tweet/profile URLs using numeric IDs still resolve even after handle changes:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://x.com/i/user/$USER_ID
|
||||||
|
```
|
||||||
|
|
||||||
|
## Search Operators
|
||||||
|
|
||||||
|
Accessible at `x.com/search`. Operators are combinable.
|
||||||
|
|
||||||
|
| Operator | Example | Effect |
|
||||||
|
| ----------------- | -------------------------- | ------------------------ |
|
||||||
|
| `"..."` | `"exact phrase"` | Exact match |
|
||||||
|
| `from:` | `from:handle` | Posts by user |
|
||||||
|
| `to:` | `to:handle` | Posts directed at user |
|
||||||
|
| `since:` | `since:2024-01-01` | After date (YYYY-MM-DD) |
|
||||||
|
| `until:` | `until:2024-06-30` | Before date (YYYY-MM-DD) |
|
||||||
|
| `lang:` | `lang:fr` | Language (ISO 639-1) |
|
||||||
|
| `near:` | `near:"Paris" within:10km` | Geo (web only, not API) |
|
||||||
|
| `geocode:` | `geocode:48.85,2.35,5km` | Geo by coordinates |
|
||||||
|
| `filter:images` | | Posts with images |
|
||||||
|
| `filter:videos` | | Posts with videos |
|
||||||
|
| `filter:links` | | Posts with URLs |
|
||||||
|
| `filter:verified` | | Verified accounts only |
|
||||||
|
| `-filter:replies` | | Exclude replies |
|
||||||
|
| `min_retweets:` | `min_retweets:100` | Engagement threshold |
|
||||||
|
| `min_faves:` | `min_faves:500` | Engagement threshold |
|
||||||
|
| `#tag` | `#osint` | Hashtag |
|
||||||
|
| `-term` | `-spam` | Exclude term |
|
||||||
|
|
||||||
|
Boolean: spaces imply AND, use uppercase `OR` for alternatives, parentheses for grouping.
|
||||||
|
|
||||||
|
#### Direct search URL
|
||||||
|
|
||||||
|
```
|
||||||
|
https://x.com/search?q=from%3A$HANDLE+since%3A2024-01-01&f=live
|
||||||
|
```
|
||||||
|
|
||||||
|
`f=live` returns chronological results instead of relevance-ranked.
|
||||||
|
|
||||||
|
## Google Dorks
|
||||||
|
|
||||||
|
```
|
||||||
|
site:x.com "$TARGET"
|
||||||
|
site:twitter.com "$TARGET"
|
||||||
|
site:x.com/i/status "$KEYWORD"
|
||||||
|
"twitter.com/$HANDLE" OR "x.com/$HANDLE"
|
||||||
|
```
|
||||||
|
|
||||||
|
Old `twitter.com` URLs are still indexed separately from `x.com`, search both.
|
||||||
|
|
||||||
|
## Deleted and Archived Content
|
||||||
|
|
||||||
|
### Wayback Machine
|
||||||
|
|
||||||
|
```
|
||||||
|
https://web.archive.org/web/*/twitter.com/$HANDLE/status/*
|
||||||
|
https://web.archive.org/web/*/x.com/$HANDLE/status/*
|
||||||
|
```
|
||||||
|
|
||||||
|
Manually browse snapshots, or use [waybacktweets](https://github.com/claromes/waybacktweets) to batch-retrieve CDX data:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install waybacktweets
|
||||||
|
waybacktweets $HANDLE
|
||||||
|
```
|
||||||
|
|
||||||
|
Outputs CSV/JSON with archived tweet URLs. Useful for deleted posts and suspended accounts.
|
||||||
|
|
||||||
|
### Twayback
|
||||||
|
|
||||||
|
Web tool wrapping the same Wayback CDX API with a UI:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://twayback.space/
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: only works if the tweet was crawled before deletion.
|
||||||
|
|
||||||
|
### Profile history
|
||||||
|
|
||||||
|
The Wayback Machine also archives profile pages: past bios, display names, profile photos, header images. Check snapshots at:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://web.archive.org/web/*/twitter.com/$HANDLE
|
||||||
|
```
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Default-Creds"
|
|
||||||
description: "Default Creds is a centralized, community-driven repository of factory-set credentials. Designed for pentesters and security researchers, it helps identify weak access points during engagement phases or audit internal infrastructure before they become a security liability."
|
|
||||||
image: "../../../public/images/projects/default-creds.png"
|
|
||||||
tags: ["default-password", "cybersecurity"]
|
|
||||||
demoLink: "https://default-creds.hadi.icu"
|
|
||||||
sourceLink: "https://github.com/anotherhadi/default-creds"
|
|
||||||
---
|
|
||||||
|
|
||||||
<a href="https://github.com/anotherhadi/default-creds/stargazers">
|
|
||||||
<img src="https://img.shields.io/github/stars/anotherhadi/default-creds?color=8FD0CB&labelColor=0b0b0b&style=for-the-badge&logo=starship&logoColor=8FD0CB">
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/anotherhadi/default-creds/">
|
|
||||||
<img src="https://img.shields.io/github/repo-size/anotherhadi/default-creds?color=8FD0CB&labelColor=0b0b0b&style=for-the-badge&logo=github&logoColor=8FD0CB">
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/anotherhadi/default-creds/tree/main/src/data">
|
|
||||||
<img src="https://img.shields.io/badge/dynamic/json?url=https://api.github.com/repos/anotherhadi/default-creds/contents/src/data&query=%24.length&label=Manufacturers&style=for-the-badge&color=8FD0CB&labelColor=0b0b0b&logo=github&logoColor=8FD0CB">
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/anotherhadi/default-creds/blob/main/LICENSE">
|
|
||||||
<img src="https://img.shields.io/static/v1.svg?style=for-the-badge&label=License&message=MIT&colorA=0b0b0b&colorB=8FD0CB&logo=unlicense&logoColor=8FD0CB"/>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
**Default Creds** is a centralized, community-driven repository of factory-set credentials. Designed for pentesters and security researchers, it helps identify weak access points during engagement phases or audit internal infrastructure before they become a security liability.
|
|
||||||
|
|
||||||
**Live Instance:** [default-creds.hadi.icu](https://default-creds.hadi.icu)
|
|
||||||
|
|
||||||
**API Documentation:** [default-creds.hadi.icu/api-docs](https://default-creds.hadi.icu/api-docs)
|
|
||||||
|
|
||||||
## 🎯 The Mission
|
|
||||||
|
|
||||||
In the world of cybersecurity, "low-hanging fruit" often comes in the form of unchanged default passwords. Our mission is to provide a fast, reliable, and searchable database of these credentials to help security professionals secure systems before attackers exploit them.
|
|
||||||
|
|
||||||
## ⚙️ How it Works
|
|
||||||
|
|
||||||
This application is built with **Astro** and **Svelte 5** for maximum performance. It operates as a "Flat-File Database":
|
|
||||||
|
|
||||||
1. **YAML Powered:** All credentials are stored as structured `.yaml` files in the `src/data/` directory.
|
|
||||||
2. **Real-time Search:** The API parses these files on-the-fly (or via build cache) to provide instant results based on service names, versions, or tags.
|
|
||||||
3. **Developer Friendly:** A public API is available to integrate these credentials into your own automated scanning tools.
|
|
||||||
|
|
||||||
## 🤝 Community Driven & Contributing
|
|
||||||
|
|
||||||
Security is a collective effort. This project only grows as the community discovers and adds new default configurations.
|
|
||||||
|
|
||||||
- **Want to add an app?** Just create a new YAML file in `src/data/`.
|
|
||||||
- **Found a mistake?** Submit a Pull Request to update existing entries.
|
|
||||||
|
|
||||||
Before contributing, please read our [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines on how to format your YAML files.
|
|
||||||
|
|
||||||
## 💻 Local Development
|
|
||||||
|
|
||||||
### Prerequisites
|
|
||||||
|
|
||||||
- Bun (or nix, just `nix develop`)
|
|
||||||
|
|
||||||
### Installation
|
|
||||||
|
|
||||||
1. **Clone the repo:**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git clone https://github.com/anotherhadi/default-creds.git
|
|
||||||
cd default-creds
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Start the dev server:**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
bun dev
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Add your data:**
|
|
||||||
Drop a `.yaml` file into `src/data/` and it will appear in the search results instantly!
|
|
||||||
|
|
||||||
### 🛠️ Tech Stack
|
|
||||||
|
|
||||||
- **Framework:** [Astro](https://astro.build/)
|
|
||||||
- **UI Logic:** [Svelte 5 (Runes)](https://svelte.dev/)
|
|
||||||
- **Styling:** [Tailwind CSS](https://tailwindcss.com/) + [DaisyUI](https://daisyui.com/)
|
|
||||||
|
|
||||||
## ⚠️ Legal Disclaimer
|
|
||||||
|
|
||||||
Usage of **Default Creds** for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state, and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program.
|
|
||||||
@@ -1,223 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Github Recon"
|
|
||||||
description: "Retrieves and aggregates public OSINT data about a GitHub user using Go and the GitHub API. Finds hidden emails in commit history, previous usernames, friends, other GitHub accounts, and more."
|
|
||||||
image: "../../../public/images/projects/github-recon.png"
|
|
||||||
tags: ["osint", "github", "cybersecurity"]
|
|
||||||
sourceLink: "https://github.com/anotherhadi/github-recon"
|
|
||||||
---
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="https://github.com/anotherhadi/github-recon/releases"><img src="https://img.shields.io/github/release/anotherhadi/github-recon.svg" alt="Latest Release"></a>
|
|
||||||
<a href="https://pkg.go.dev/github.com/anotherhadi/github-recon?tab=doc"><img src="https://godoc.org/github.com/anotherhadi/github-recon?status.svg" alt="GoDoc"></a>
|
|
||||||
<a href="https://goreportcard.com/report/github.com/anotherhadi/github-recon"><img src="https://goreportcard.com/badge/github.com/anotherhadi/github-recon" alt="GoReportCard"></a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
- [🧾 Project Overview](#-project-overview)
|
|
||||||
- [🚀 Features](#-features)
|
|
||||||
- [⚠️ Disclaimer](#%EF%B8%8F-disclaimer)
|
|
||||||
- [📦 Installation](#-installation)
|
|
||||||
- [With Go](#with-go)
|
|
||||||
- [With Nix/NixOS](#with-nixnixos)
|
|
||||||
- [🧪 Usage](#-usage)
|
|
||||||
- [Flags](#flags)
|
|
||||||
- [Token](#token)
|
|
||||||
- [How does the email spoofing work?](#how-does-the-email-spoofing-work)
|
|
||||||
- [💡 Examples](#-examples)
|
|
||||||
- [🕵️♂️ Cover your tracks](#%EF%B8%8F%EF%B8%8F-cover-your-tracks)
|
|
||||||
- [🤝 Contributing](#-contributing)
|
|
||||||
- [🙏 Credits](#-credits)
|
|
||||||
|
|
||||||
## 🧾 Project Overview
|
|
||||||
|
|
||||||
Retrieves and aggregates public OSINT data about a GitHub user using Go and the
|
|
||||||
GitHub API. Finds hidden emails in commit history, previous usernames, friends,
|
|
||||||
other GitHub accounts, and more.
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Screenshot</summary>
|
|
||||||
<img src="https://raw.githubusercontent.com/anotherhadi/github-recon/main/.github/assets/example.png" alt="example screenshot">
|
|
||||||
</details>
|
|
||||||
|
|
||||||
## 🚀 Features
|
|
||||||
|
|
||||||
- Export results to JSON
|
|
||||||
|
|
||||||
**From usernames:**
|
|
||||||
|
|
||||||
- Retrieve basic user profile information (username, ID, avatar, bio, creation
|
|
||||||
date)
|
|
||||||
- Display avatars directly in the terminal
|
|
||||||
- List organizations and roles
|
|
||||||
- Fetch SSH and GPG keys
|
|
||||||
- Enumerate social accounts
|
|
||||||
- Extract unique commit authors (name + email)
|
|
||||||
- Find close friends
|
|
||||||
- Deep scan option (clone repositories, run regex searches, analyze licenses,
|
|
||||||
etc.)
|
|
||||||
- Use Levenshtein distance for matching usernames and emails
|
|
||||||
- TruffleHog integration to find secrets
|
|
||||||
|
|
||||||
**From emails:**
|
|
||||||
|
|
||||||
- Search for a specific email across all GitHub commits
|
|
||||||
- Spoof an email to discover the associated user account
|
|
||||||
|
|
||||||
## ⚠️ Disclaimer
|
|
||||||
|
|
||||||
This tool is intended for educational purposes only. Use responsibly and ensure
|
|
||||||
you have permission to access the data you are querying.
|
|
||||||
|
|
||||||
## 📦 Installation
|
|
||||||
|
|
||||||
### With Go
|
|
||||||
|
|
||||||
```bash
|
|
||||||
go install github.com/anotherhadi/github-recon@latest
|
|
||||||
```
|
|
||||||
|
|
||||||
### With Nix/NixOS
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Click to expand</summary>
|
|
||||||
|
|
||||||
**From anywhere (using the repo URL):**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
nix run github:anotherhadi/github-recon -- [--flags value] target_username_or_email
|
|
||||||
```
|
|
||||||
|
|
||||||
**Permanent Installation:**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# add the flake to your flake.nix
|
|
||||||
{
|
|
||||||
inputs = {
|
|
||||||
github-recon.url = "github:anotherhadi/github-recon";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
# then add it to your packages
|
|
||||||
environment.systemPackages = with pkgs; [ # or home.packages
|
|
||||||
inputs.github-recon.defaultPackage.${pkgs.system}
|
|
||||||
];
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
## 🧪 Usage
|
|
||||||
|
|
||||||
```bash
|
|
||||||
github-recon [--flags value] target_username_or_email
|
|
||||||
```
|
|
||||||
|
|
||||||
### Flags
|
|
||||||
|
|
||||||
```txt
|
|
||||||
-t, --token string Github personal access token (e.g. ghp_aaa...). Can also be set via GITHUB_RECON_TOKEN environment variable. You also need to set the token in $HOME/.config/github-recon/env file if you want to use this tool without passing the token every time. (default "null")
|
|
||||||
-d, --deepscan Enable deep scan (clone repos, regex search, analyse licenses, etc.)
|
|
||||||
--max-size int Limit the size of repositories to scan (in MB) (only for deep scan) (default 150)
|
|
||||||
-e, --exclude-repo strings Exclude repos from deep scan (comma-separated list, only for deep scan)
|
|
||||||
-r, --refresh Refresh the cache (only for deep scan)
|
|
||||||
-s, --show-source Show where the information (authors, emails, etc) were found (only for deep scan)
|
|
||||||
-m, --max-distance int Maximum Levenshtein distance for matching usernames & emails (only for deep scan) (default 20)
|
|
||||||
--trufflehog Run trufflehog on cloned repositories (only for deep scan) (default true)
|
|
||||||
-S, --silent Suppress all non-essential output
|
|
||||||
--spoof-email Spoof email (only for email mode) (default true)
|
|
||||||
-a, --print-avatar Show the avatar in the output
|
|
||||||
-j, --json string Write results to specified JSON file
|
|
||||||
```
|
|
||||||
|
|
||||||
### Token
|
|
||||||
|
|
||||||
For the best experience, provide a **GitHub Personal Access Token**. Without a
|
|
||||||
token, you will quickly hit the **rate limit** and have to wait.
|
|
||||||
|
|
||||||
- For **basic usage**, you can create a token **without any permissions**.
|
|
||||||
- For the **email spoofing feature**, you need to add the **`repo`** and
|
|
||||||
**`delete_repo`** permissions.
|
|
||||||
|
|
||||||
You can set the token in multiple ways:
|
|
||||||
|
|
||||||
- **Command-line flag**:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
github-recon -t "ghp_xxx..."
|
|
||||||
```
|
|
||||||
|
|
||||||
- **Environment variable**:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
export GITHUB_RECON_TOKEN=ghp_xxx...
|
|
||||||
```
|
|
||||||
|
|
||||||
- **Config file**: Create the file `~/.config/github-recon/env` and add:
|
|
||||||
|
|
||||||
```env
|
|
||||||
GITHUB_RECON_TOKEN=ghp_xxx...
|
|
||||||
```
|
|
||||||
|
|
||||||
> For safety, it is recommended to create the Personal Access Token on a
|
|
||||||
> **separate GitHub account** rather than your main account. This way, if
|
|
||||||
> anything goes wrong, your primary account remains safe.
|
|
||||||
|
|
||||||
### How does the email spoofing work?
|
|
||||||
|
|
||||||
Here’s the process:
|
|
||||||
|
|
||||||
1. Create a new repository.
|
|
||||||
2. Make a commit using the **target's email** as the author.
|
|
||||||
3. Push the commit to GitHub.
|
|
||||||
4. Observe which GitHub account the commit is linked to. This method **always
|
|
||||||
works**, but it only reveals the account if the email is set as the user’s
|
|
||||||
**primary email**.
|
|
||||||
|
|
||||||
All of these steps are handled **automatically by the tool**, so you just need
|
|
||||||
to provide the target email.
|
|
||||||
|
|
||||||
## 💡 Examples
|
|
||||||
|
|
||||||
```bash
|
|
||||||
github-recon anotherhadi --token ghp_ABC123...
|
|
||||||
github-recon myemail@gmail.com # Find github accounts by email
|
|
||||||
github-recon anotherhadi --json output.json --deepscan # Clone the repo and search for leaked email
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🕵️♂️ Cover your tracks
|
|
||||||
|
|
||||||
Understanding what information about you is publicly visible is the first step
|
|
||||||
to managing your online presence. github-recon can help you identify your own
|
|
||||||
publicly available data on GitHub. Here’s how you can take steps to protect your
|
|
||||||
privacy and security:
|
|
||||||
|
|
||||||
- **Review your public profile**: Regularly check your GitHub profile and
|
|
||||||
repositories to ensure that you are not unintentionally exposing sensitive
|
|
||||||
information.
|
|
||||||
- **Manage email exposure**: Use GitHub's settings to control which email
|
|
||||||
addresses are visible on your profile and in commit history. You can also use
|
|
||||||
a no-reply email address for commits, and an
|
|
||||||
[alias email](https://proton.me/support/addresses-and-aliases) for your
|
|
||||||
account. Delete/modify any sensitive information in your commit history.
|
|
||||||
- **Be Mindful of Repository Content**: Avoid including sensitive information in
|
|
||||||
your repositories, such as API keys, passwords, emails or personal data. Use
|
|
||||||
`.gitignore` to exclude files that contain sensitive information.
|
|
||||||
|
|
||||||
You can also use a tool like [TruffleHog](github.com/trufflesecurity/trufflehog)
|
|
||||||
to scan your repositories specifically for exposed secrets and tokens.
|
|
||||||
|
|
||||||
**Useful links:**
|
|
||||||
|
|
||||||
- [Blocking command line pushes that expose your personal email address](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/blocking-command-line-pushes-that-expose-your-personal-email-address)
|
|
||||||
- [No-reply email address](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address)
|
|
||||||
|
|
||||||
## 🤝 Contributing
|
|
||||||
|
|
||||||
Feel free to contribute! See [CONTRIBUTING.md](https://github.com/anotherhadi/github-recon/blob/main/CONTRIBUTING.md) for details.
|
|
||||||
|
|
||||||
## 🙏 Credits
|
|
||||||
|
|
||||||
Some features and ideas in this project were inspired by the following tools:
|
|
||||||
|
|
||||||
- [gitrecon](https://github.com/GONZOsint/gitrecon) by GONZOsint
|
|
||||||
- [gitfive](https://github.com/mxrch/gitfive) by mxrch
|
|
||||||
|
|
||||||
Big thanks to their authors for sharing their work with the community.
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Nix 4 cyber"
|
|
||||||
description: "A modular, open‑source toolkit & knowledge-base for cyber‑security professionals built with nix & markdown, for CTF, OSINT or Pentest."
|
|
||||||
image: "../../../public/images/projects/n4c.png"
|
|
||||||
tags: ["nix", "ctf", "cybersecurity", "cheatsheets"]
|
|
||||||
url: "https://n4c.hadi.icu"
|
|
||||||
sourceLink: "https://github.com/nix4cyber/n4c"
|
|
||||||
---
|
|
||||||
|
|
||||||
A modular, open‑source toolkit for cyber‑security professionals built with nix & markdown
|
|
||||||
|
|
||||||

|
|
||||||

|
|
||||||
[](https://app.netlify.com/projects/nix4cyber/deploys)
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
N4C (**nix4cyber**) is a personal knowledge-base and toolbox for CTF (capture the flag) & OSINT
|
|
||||||
|
|
||||||
It combines three core components:
|
|
||||||
|
|
||||||
- [Nix-based shells](https://n4c.hadi.icu/shells): pre-configured environments for specific security domains (web, cracking, networking, forensic, ...).
|
|
||||||
- [Cheat‑sheets](https://n4c.hadi.icu/cheatsheets/cheatsheets): quick reference guides organized by category.
|
|
||||||
- [CTF write‑ups](https://n4c.hadi.icu/writeups): markdown-formatted reports of challenges we've solved.
|
|
||||||
|
|
||||||
All content is served through a static website built with [Hugo](https://gohugo.io/) and the [Doks](https://github.com/DELIGHT-LABS/hugo-theme-doks) (<3) theme, hosted on Netlify. The project is fully open‑source under the MIT license and lives on GitHub.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
To use nix4cyber, you need to have [Nix](https://nixos.org/) installed on your system.
|
|
||||||
You can then start a shell with the following command:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
nix develop github:nix4cyber/n4c#<toolkit>
|
|
||||||
```
|
|
||||||
|
|
||||||
You could also install the alias `n4c` ([see here](https://n4c.hadi.icu/shells#alias)) and only type `n4c <toolkit>`
|
|
||||||
|
|
||||||
More informations about shells & toolkits [here](https://n4c.hadi.icu/shells)
|
|
||||||
|
|
||||||
### Example
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# Example: Launch the web pentesting toolkit
|
|
||||||
nix develop github:nix4cyber/n4c#web
|
|
||||||
|
|
||||||
# Inside the shell
|
|
||||||
nmap -A target.com
|
|
||||||
```
|
|
||||||
|
|
||||||
## Disclaimer
|
|
||||||
|
|
||||||
Nix4cyber is intended solely for lawful, ethical, and educational purposes.
|
|
||||||
It is designed to assist cybersecurity professionals, researchers, and students in conducting authorized security assessments, penetration testing, and digital forensics within environments where they have explicit permission to operate.
|
|
||||||
|
|
||||||
By using this project, you agree to comply with all applicable laws and regulations. The maintainers of Nix 4 Cyber are not responsible for any misuse of the tools or scripts provided. Unauthorized or malicious use of this project is strictly prohibited and may violate local, national, or international laws.
|
|
||||||
|
|
||||||
Use responsibly. Always obtain proper authorization before conducting any security testing.
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
Contributions are welcome!
|
|
||||||
Feel free to open issues, propose new toolkits, or share CTF write-ups via pull requests.
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Nixy"
|
|
||||||
description: "Nixy simplifies and unifies the Hyprland ecosystem with a modular, easily customizable setup. It provides a structured way to manage your system configuration and dotfiles with minimal effort."
|
|
||||||
image: "../../../public/images/projects/nixy.png"
|
|
||||||
tags: ["dotfiles", "nixos", "hyprland", "rice"]
|
|
||||||
demoLink: "https://github.com/anotherhadi/nixy#screenshots"
|
|
||||||
sourceLink: "https://github.com/anotherhadi/nixy"
|
|
||||||
---
|
|
||||||
|
|
||||||
<a href="https://github.com/anotherhadi/nixy/stargazers">
|
|
||||||
<img src="https://img.shields.io/github/stars/anotherhadi/nixy?color=A89AD1&labelColor=0b0b0b&style=for-the-badge&logo=starship&logoColor=A89AD1">
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/anotherhadi/nixy/">
|
|
||||||
<img src="https://img.shields.io/github/repo-size/anotherhadi/nixy?color=A89AD1&labelColor=0b0b0b&style=for-the-badge&logo=github&logoColor=A89AD1">
|
|
||||||
</a>
|
|
||||||
<a href="https://nixos.org">
|
|
||||||
<img src="https://img.shields.io/badge/NixOS-unstable-blue.svg?style=for-the-badge&labelColor=0b0b0b&logo=NixOS&logoColor=A89AD1&color=A89AD1">
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/anotherhadi/nixy/blob/main/LICENSE">
|
|
||||||
<img src="https://img.shields.io/static/v1.svg?style=for-the-badge&label=License&message=MIT&colorA=0b0b0b&colorB=A89AD1&logo=unlicense&logoColor=A89AD1"/>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
**Nixy simplifies and unifies** the Hyprland ecosystem with a modular, easily
|
|
||||||
customizable setup. It provides a structured way to manage your system
|
|
||||||
configuration and dotfiles with minimal effort. It includes _home-manager_,
|
|
||||||
_secrets_, and _custom theming_ all in one place.
|
|
||||||
|
|
||||||
**Features:**
|
|
||||||
|
|
||||||
- 💻 Hyprland & Caelestia: Preconfigured Hyprland ecosystem with Caelestia-shell (Ty to both projects!)
|
|
||||||
- 🎨 Consistent Theming: Base16 & Stylix-powered themes
|
|
||||||
- ⌨️ Vim-like Everywhere: Unified keybindings (Hyprland, nvim, vimium, etc.)
|
|
||||||
|
|
||||||
## Table of Content
|
|
||||||
|
|
||||||
- [Table of Content](#table-of-content)
|
|
||||||
- [Installation](#installation)
|
|
||||||
- [Documentation](#documentation)
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
1. [Fork](https://github.com/anotherhadi/nixy/fork) this repo and clone it to
|
|
||||||
your system:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
git clone https://github.com/anotherhadi/nixy ~/.config/nixos
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Copy the `hosts/laptop` folder, rename it to match your system’s hostname,
|
|
||||||
and update `variables.nix` with your machine’s settings.
|
|
||||||
3. Copy your `hardware-configuration.nix` into your new host's folder to ensure
|
|
||||||
proper hardware support.
|
|
||||||
4. Register your new host in `flake.nix` by adding it under nixosConfigurations.
|
|
||||||
|
|
||||||
> `# CHANGEME` comments are placed throughout the config to
|
|
||||||
> indicate necessary modifications. Use the following command to quickly locate
|
|
||||||
> them:
|
|
||||||
>
|
|
||||||
> ```sh
|
|
||||||
> rg "CHANGEME" ~/.config/nixos
|
|
||||||
> ```
|
|
||||||
|
|
||||||
> When you add new files, don't forget to run `git add .` to add them to the git
|
|
||||||
> repository
|
|
||||||
|
|
||||||
5. Build the system
|
|
||||||
|
|
||||||
```sh
|
|
||||||
sudo nixos-rebuild switch --flake ~/.config/nixos#yourhostname
|
|
||||||
```
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
- [SERVER](https://github.com/anotherhadi/nixy/blob/main/docs/SERVER.md): Check out the server documentation
|
|
||||||
- [THEMES](https://github.com/anotherhadi/nixy/blob/main/docs/THEMES.md): How themes work and how to create your own
|
|
||||||
- [WALLPAPERS](https://github.com/anotherhadi/awesome-wallpapers): An awesome
|
|
||||||
collection of wallpapers
|
|
||||||
|
|
||||||
- [CONTRIBUTING](https://github.com/anotherhadi/nixy/blob/main/docs/CONTRIBUTING.md): How to contribute
|
|
||||||
- [LICENSE](https://github.com/anotherhadi/nixy/blob/main/LICENSE): MIT License
|
|
||||||
@@ -0,0 +1,524 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"owner": {
|
||||||
|
"id": 1,
|
||||||
|
"login": "anotherhadi",
|
||||||
|
"login_name": "",
|
||||||
|
"source_id": 0,
|
||||||
|
"full_name": "Hadi",
|
||||||
|
"email": "anotherhadi@noreply.git.hadi.icu",
|
||||||
|
"avatar_url": "https://git.hadi.icu/avatars/a6f9dd8586f079ec7619ade21789a3c5dad02d7869f74a3cca0c976c81b8c9ae",
|
||||||
|
"html_url": "https://git.hadi.icu/anotherhadi",
|
||||||
|
"language": "",
|
||||||
|
"is_admin": false,
|
||||||
|
"last_login": "0001-01-01T00:00:00Z",
|
||||||
|
"created": "2026-03-30T17:21:50+02:00",
|
||||||
|
"restricted": false,
|
||||||
|
"active": false,
|
||||||
|
"prohibit_login": false,
|
||||||
|
"location": "127.0.0.1",
|
||||||
|
"website": "https://hadi.icu",
|
||||||
|
"description": "Infosec engineer passionate about Linux/NixOS, blockchains, OSINT & FOSS. Hacking with Go, exploring open tech, and contributing whenever I can 🐧\r\n\r\n[Github](https://github.com/anotherhadi) | [Gitlab (mirror)](https://gitlab.com/anotherhadi_mirror)",
|
||||||
|
"visibility": "public",
|
||||||
|
"followers_count": 0,
|
||||||
|
"following_count": 0,
|
||||||
|
"starred_repos_count": 0,
|
||||||
|
"username": "anotherhadi"
|
||||||
|
},
|
||||||
|
"name": "nixy",
|
||||||
|
"full_name": "anotherhadi/nixy",
|
||||||
|
"description": "Nixy simplifies and unifies the Hyprland ecosystem with a modular, easily customizable setup. It provides a structured way to manage your system configuration and dotfiles with minimal effort.",
|
||||||
|
"empty": false,
|
||||||
|
"private": false,
|
||||||
|
"fork": false,
|
||||||
|
"template": false,
|
||||||
|
"mirror": true,
|
||||||
|
"size": 429945,
|
||||||
|
"language": "Nix",
|
||||||
|
"languages_url": "https://git.hadi.icu/api/v1/repos/anotherhadi/nixy/languages",
|
||||||
|
"html_url": "https://git.hadi.icu/anotherhadi/nixy",
|
||||||
|
"url": "https://git.hadi.icu/api/v1/repos/anotherhadi/nixy",
|
||||||
|
"link": "",
|
||||||
|
"ssh_url": "gitea@git.hadi.icu:anotherhadi/nixy.git",
|
||||||
|
"clone_url": "https://git.hadi.icu/anotherhadi/nixy.git",
|
||||||
|
"original_url": "https://github.com/anotherhadi/nixy",
|
||||||
|
"website": "",
|
||||||
|
"stars_count": 0,
|
||||||
|
"forks_count": 0,
|
||||||
|
"watchers_count": 1,
|
||||||
|
"open_issues_count": 0,
|
||||||
|
"open_pr_counter": 0,
|
||||||
|
"release_counter": 0,
|
||||||
|
"default_branch": "main",
|
||||||
|
"archived": false,
|
||||||
|
"created_at": "2026-03-30T17:31:04+02:00",
|
||||||
|
"updated_at": "2026-04-23T09:52:11+02:00",
|
||||||
|
"archived_at": "1970-01-01T01:00:00+01:00",
|
||||||
|
"permissions": {
|
||||||
|
"admin": false,
|
||||||
|
"push": false,
|
||||||
|
"pull": true
|
||||||
|
},
|
||||||
|
"has_code": true,
|
||||||
|
"has_issues": true,
|
||||||
|
"internal_tracker": {
|
||||||
|
"enable_time_tracker": true,
|
||||||
|
"allow_only_contributors_to_track_time": true,
|
||||||
|
"enable_issue_dependencies": true
|
||||||
|
},
|
||||||
|
"has_wiki": true,
|
||||||
|
"has_pull_requests": false,
|
||||||
|
"has_projects": true,
|
||||||
|
"projects_mode": "all",
|
||||||
|
"has_releases": true,
|
||||||
|
"has_packages": true,
|
||||||
|
"has_actions": false,
|
||||||
|
"ignore_whitespace_conflicts": false,
|
||||||
|
"allow_merge_commits": false,
|
||||||
|
"allow_rebase": false,
|
||||||
|
"allow_rebase_explicit": false,
|
||||||
|
"allow_squash_merge": false,
|
||||||
|
"allow_fast_forward_only_merge": false,
|
||||||
|
"allow_rebase_update": false,
|
||||||
|
"allow_manual_merge": true,
|
||||||
|
"autodetect_manual_merge": false,
|
||||||
|
"default_delete_branch_after_merge": false,
|
||||||
|
"default_merge_style": "merge",
|
||||||
|
"default_allow_maintainer_edit": false,
|
||||||
|
"avatar_url": "https://git.hadi.icu/repo-avatars/b232b4486d5397e743db2fe6b581d2fa4eb4d41d5bbe2c8f1dbafd6021b352b0",
|
||||||
|
"internal": false,
|
||||||
|
"mirror_interval": "8h0m0s",
|
||||||
|
"object_format_name": "sha1",
|
||||||
|
"mirror_updated": "2026-04-23T11:17:25+02:00",
|
||||||
|
"topics": [
|
||||||
|
"dotfiles",
|
||||||
|
"hyprland",
|
||||||
|
"nixos",
|
||||||
|
"nixos-configuration"
|
||||||
|
],
|
||||||
|
"licenses": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"mirrors": {
|
||||||
|
"github": "https://github.com/anotherhadi/nixy",
|
||||||
|
"gitlab": "https://gitlab.com/anotherhadi_mirror/nixy"
|
||||||
|
},
|
||||||
|
"banner_url": "https://git.hadi.icu/anotherhadi/nixy/raw/branch/main/.github/assets/banner.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"owner": {
|
||||||
|
"id": 1,
|
||||||
|
"login": "anotherhadi",
|
||||||
|
"login_name": "",
|
||||||
|
"source_id": 0,
|
||||||
|
"full_name": "Hadi",
|
||||||
|
"email": "anotherhadi@noreply.git.hadi.icu",
|
||||||
|
"avatar_url": "https://git.hadi.icu/avatars/a6f9dd8586f079ec7619ade21789a3c5dad02d7869f74a3cca0c976c81b8c9ae",
|
||||||
|
"html_url": "https://git.hadi.icu/anotherhadi",
|
||||||
|
"language": "",
|
||||||
|
"is_admin": false,
|
||||||
|
"last_login": "0001-01-01T00:00:00Z",
|
||||||
|
"created": "2026-03-30T17:21:50+02:00",
|
||||||
|
"restricted": false,
|
||||||
|
"active": false,
|
||||||
|
"prohibit_login": false,
|
||||||
|
"location": "127.0.0.1",
|
||||||
|
"website": "https://hadi.icu",
|
||||||
|
"description": "Infosec engineer passionate about Linux/NixOS, blockchains, OSINT & FOSS. Hacking with Go, exploring open tech, and contributing whenever I can 🐧\r\n\r\n[Github](https://github.com/anotherhadi) | [Gitlab (mirror)](https://gitlab.com/anotherhadi_mirror)",
|
||||||
|
"visibility": "public",
|
||||||
|
"followers_count": 0,
|
||||||
|
"following_count": 0,
|
||||||
|
"starred_repos_count": 0,
|
||||||
|
"username": "anotherhadi"
|
||||||
|
},
|
||||||
|
"name": "iknowyou",
|
||||||
|
"full_name": "anotherhadi/iknowyou",
|
||||||
|
"description": "Self-hosted OSINT aggregation platform: Run dozens of open-source intelligence tools against a single target in parallel; all from one clean web interface.",
|
||||||
|
"empty": false,
|
||||||
|
"private": false,
|
||||||
|
"fork": false,
|
||||||
|
"template": false,
|
||||||
|
"mirror": true,
|
||||||
|
"size": 676,
|
||||||
|
"language": "Svelte",
|
||||||
|
"languages_url": "https://git.hadi.icu/api/v1/repos/anotherhadi/iknowyou/languages",
|
||||||
|
"html_url": "https://git.hadi.icu/anotherhadi/iknowyou",
|
||||||
|
"url": "https://git.hadi.icu/api/v1/repos/anotherhadi/iknowyou",
|
||||||
|
"link": "",
|
||||||
|
"ssh_url": "gitea@git.hadi.icu:anotherhadi/iknowyou.git",
|
||||||
|
"clone_url": "https://git.hadi.icu/anotherhadi/iknowyou.git",
|
||||||
|
"original_url": "https://github.com/anotherhadi/iknowyou",
|
||||||
|
"website": "https://iknowyou.hadi.icu",
|
||||||
|
"stars_count": 0,
|
||||||
|
"forks_count": 0,
|
||||||
|
"watchers_count": 1,
|
||||||
|
"open_issues_count": 0,
|
||||||
|
"open_pr_counter": 0,
|
||||||
|
"release_counter": 0,
|
||||||
|
"default_branch": "main",
|
||||||
|
"archived": false,
|
||||||
|
"created_at": "2026-04-11T00:15:52+02:00",
|
||||||
|
"updated_at": "2026-04-22T00:40:03+02:00",
|
||||||
|
"archived_at": "1970-01-01T01:00:00+01:00",
|
||||||
|
"permissions": {
|
||||||
|
"admin": false,
|
||||||
|
"push": false,
|
||||||
|
"pull": true
|
||||||
|
},
|
||||||
|
"has_code": true,
|
||||||
|
"has_issues": true,
|
||||||
|
"internal_tracker": {
|
||||||
|
"enable_time_tracker": true,
|
||||||
|
"allow_only_contributors_to_track_time": true,
|
||||||
|
"enable_issue_dependencies": true
|
||||||
|
},
|
||||||
|
"has_wiki": true,
|
||||||
|
"has_pull_requests": false,
|
||||||
|
"has_projects": true,
|
||||||
|
"projects_mode": "all",
|
||||||
|
"has_releases": true,
|
||||||
|
"has_packages": true,
|
||||||
|
"has_actions": false,
|
||||||
|
"ignore_whitespace_conflicts": false,
|
||||||
|
"allow_merge_commits": false,
|
||||||
|
"allow_rebase": false,
|
||||||
|
"allow_rebase_explicit": false,
|
||||||
|
"allow_squash_merge": false,
|
||||||
|
"allow_fast_forward_only_merge": false,
|
||||||
|
"allow_rebase_update": false,
|
||||||
|
"allow_manual_merge": true,
|
||||||
|
"autodetect_manual_merge": false,
|
||||||
|
"default_delete_branch_after_merge": false,
|
||||||
|
"default_merge_style": "merge",
|
||||||
|
"default_allow_maintainer_edit": false,
|
||||||
|
"avatar_url": "https://git.hadi.icu/repo-avatars/438ce6639ec02a276f8d7b3c404e964dcf2b5269eb6da0c8fbfbb06ed8dc5a86",
|
||||||
|
"internal": false,
|
||||||
|
"mirror_interval": "8h0m0s",
|
||||||
|
"object_format_name": "sha1",
|
||||||
|
"mirror_updated": "2026-04-23T14:17:25+02:00",
|
||||||
|
"topics": [
|
||||||
|
"osint",
|
||||||
|
"osint-tool"
|
||||||
|
],
|
||||||
|
"licenses": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"mirrors": {
|
||||||
|
"github": "https://github.com/anotherhadi/iknowyou",
|
||||||
|
"gitlab": "https://gitlab.com/anotherhadi_mirror/iknowyou"
|
||||||
|
},
|
||||||
|
"banner_url": "https://git.hadi.icu/anotherhadi/iknowyou/raw/branch/main/.github/assets/banner.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"owner": {
|
||||||
|
"id": 1,
|
||||||
|
"login": "anotherhadi",
|
||||||
|
"login_name": "",
|
||||||
|
"source_id": 0,
|
||||||
|
"full_name": "Hadi",
|
||||||
|
"email": "anotherhadi@noreply.git.hadi.icu",
|
||||||
|
"avatar_url": "https://git.hadi.icu/avatars/a6f9dd8586f079ec7619ade21789a3c5dad02d7869f74a3cca0c976c81b8c9ae",
|
||||||
|
"html_url": "https://git.hadi.icu/anotherhadi",
|
||||||
|
"language": "",
|
||||||
|
"is_admin": false,
|
||||||
|
"last_login": "0001-01-01T00:00:00Z",
|
||||||
|
"created": "2026-03-30T17:21:50+02:00",
|
||||||
|
"restricted": false,
|
||||||
|
"active": false,
|
||||||
|
"prohibit_login": false,
|
||||||
|
"location": "127.0.0.1",
|
||||||
|
"website": "https://hadi.icu",
|
||||||
|
"description": "Infosec engineer passionate about Linux/NixOS, blockchains, OSINT & FOSS. Hacking with Go, exploring open tech, and contributing whenever I can 🐧\r\n\r\n[Github](https://github.com/anotherhadi) | [Gitlab (mirror)](https://gitlab.com/anotherhadi_mirror)",
|
||||||
|
"visibility": "public",
|
||||||
|
"followers_count": 0,
|
||||||
|
"following_count": 0,
|
||||||
|
"starred_repos_count": 0,
|
||||||
|
"username": "anotherhadi"
|
||||||
|
},
|
||||||
|
"name": "blog",
|
||||||
|
"full_name": "anotherhadi/blog",
|
||||||
|
"description": "Thoughts, insights, and tutorials on cybersecurity, OSINT, and technology.",
|
||||||
|
"empty": false,
|
||||||
|
"private": false,
|
||||||
|
"fork": false,
|
||||||
|
"template": false,
|
||||||
|
"mirror": true,
|
||||||
|
"size": 3009,
|
||||||
|
"language": "Nix",
|
||||||
|
"languages_url": "https://git.hadi.icu/api/v1/repos/anotherhadi/blog/languages",
|
||||||
|
"html_url": "https://git.hadi.icu/anotherhadi/blog",
|
||||||
|
"url": "https://git.hadi.icu/api/v1/repos/anotherhadi/blog",
|
||||||
|
"link": "",
|
||||||
|
"ssh_url": "gitea@git.hadi.icu:anotherhadi/blog.git",
|
||||||
|
"clone_url": "https://git.hadi.icu/anotherhadi/blog.git",
|
||||||
|
"original_url": "https://github.com/anotherhadi/blog",
|
||||||
|
"website": "https://hadi.icu",
|
||||||
|
"stars_count": 0,
|
||||||
|
"forks_count": 0,
|
||||||
|
"watchers_count": 1,
|
||||||
|
"open_issues_count": 0,
|
||||||
|
"open_pr_counter": 0,
|
||||||
|
"release_counter": 0,
|
||||||
|
"default_branch": "main",
|
||||||
|
"archived": false,
|
||||||
|
"created_at": "2026-03-30T17:39:47+02:00",
|
||||||
|
"updated_at": "2026-04-11T17:35:02+02:00",
|
||||||
|
"archived_at": "1970-01-01T01:00:00+01:00",
|
||||||
|
"permissions": {
|
||||||
|
"admin": false,
|
||||||
|
"push": false,
|
||||||
|
"pull": true
|
||||||
|
},
|
||||||
|
"has_code": true,
|
||||||
|
"has_issues": true,
|
||||||
|
"internal_tracker": {
|
||||||
|
"enable_time_tracker": true,
|
||||||
|
"allow_only_contributors_to_track_time": true,
|
||||||
|
"enable_issue_dependencies": true
|
||||||
|
},
|
||||||
|
"has_wiki": true,
|
||||||
|
"has_pull_requests": false,
|
||||||
|
"has_projects": true,
|
||||||
|
"projects_mode": "all",
|
||||||
|
"has_releases": true,
|
||||||
|
"has_packages": true,
|
||||||
|
"has_actions": false,
|
||||||
|
"ignore_whitespace_conflicts": false,
|
||||||
|
"allow_merge_commits": false,
|
||||||
|
"allow_rebase": false,
|
||||||
|
"allow_rebase_explicit": false,
|
||||||
|
"allow_squash_merge": false,
|
||||||
|
"allow_fast_forward_only_merge": false,
|
||||||
|
"allow_rebase_update": false,
|
||||||
|
"allow_manual_merge": true,
|
||||||
|
"autodetect_manual_merge": false,
|
||||||
|
"default_delete_branch_after_merge": false,
|
||||||
|
"default_merge_style": "merge",
|
||||||
|
"default_allow_maintainer_edit": false,
|
||||||
|
"avatar_url": "https://git.hadi.icu/repo-avatars/527f936266a33d3ccfe22013ef2ca0f61e20a4941912b16e4b4e9dcb14bf4e30",
|
||||||
|
"internal": false,
|
||||||
|
"mirror_interval": "8h0m0s",
|
||||||
|
"object_format_name": "sha1",
|
||||||
|
"mirror_updated": "2026-04-23T11:17:26+02:00",
|
||||||
|
"topics": [
|
||||||
|
"blog",
|
||||||
|
"cybersecurity",
|
||||||
|
"portfolio"
|
||||||
|
],
|
||||||
|
"licenses": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"mirrors": {
|
||||||
|
"github": "https://github.com/anotherhadi/blog",
|
||||||
|
"gitlab": "https://gitlab.com/anotherhadi_mirror/blog"
|
||||||
|
},
|
||||||
|
"banner_url": "https://git.hadi.icu/anotherhadi/blog/raw/branch/main/.github/assets/banner.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"owner": {
|
||||||
|
"id": 1,
|
||||||
|
"login": "anotherhadi",
|
||||||
|
"login_name": "",
|
||||||
|
"source_id": 0,
|
||||||
|
"full_name": "Hadi",
|
||||||
|
"email": "anotherhadi@noreply.git.hadi.icu",
|
||||||
|
"avatar_url": "https://git.hadi.icu/avatars/a6f9dd8586f079ec7619ade21789a3c5dad02d7869f74a3cca0c976c81b8c9ae",
|
||||||
|
"html_url": "https://git.hadi.icu/anotherhadi",
|
||||||
|
"language": "",
|
||||||
|
"is_admin": false,
|
||||||
|
"last_login": "0001-01-01T00:00:00Z",
|
||||||
|
"created": "2026-03-30T17:21:50+02:00",
|
||||||
|
"restricted": false,
|
||||||
|
"active": false,
|
||||||
|
"prohibit_login": false,
|
||||||
|
"location": "127.0.0.1",
|
||||||
|
"website": "https://hadi.icu",
|
||||||
|
"description": "Infosec engineer passionate about Linux/NixOS, blockchains, OSINT & FOSS. Hacking with Go, exploring open tech, and contributing whenever I can 🐧\r\n\r\n[Github](https://github.com/anotherhadi) | [Gitlab (mirror)](https://gitlab.com/anotherhadi_mirror)",
|
||||||
|
"visibility": "public",
|
||||||
|
"followers_count": 0,
|
||||||
|
"following_count": 0,
|
||||||
|
"starred_repos_count": 0,
|
||||||
|
"username": "anotherhadi"
|
||||||
|
},
|
||||||
|
"name": "default-creds",
|
||||||
|
"full_name": "anotherhadi/default-creds",
|
||||||
|
"description": "Default Creds is a centralized, community-driven repository of factory-set credentials. Designed for pentesters and security researchers, it helps identify weak access points during engagement phases or audit internal infrastructure before they become a security liability.",
|
||||||
|
"empty": false,
|
||||||
|
"private": false,
|
||||||
|
"fork": false,
|
||||||
|
"template": false,
|
||||||
|
"mirror": true,
|
||||||
|
"size": 530,
|
||||||
|
"language": "Nix",
|
||||||
|
"languages_url": "https://git.hadi.icu/api/v1/repos/anotherhadi/default-creds/languages",
|
||||||
|
"html_url": "https://git.hadi.icu/anotherhadi/default-creds",
|
||||||
|
"url": "https://git.hadi.icu/api/v1/repos/anotherhadi/default-creds",
|
||||||
|
"link": "",
|
||||||
|
"ssh_url": "gitea@git.hadi.icu:anotherhadi/default-creds.git",
|
||||||
|
"clone_url": "https://git.hadi.icu/anotherhadi/default-creds.git",
|
||||||
|
"original_url": "https://github.com/anotherhadi/default-creds",
|
||||||
|
"website": "https://default-creds.hadi.icu",
|
||||||
|
"stars_count": 0,
|
||||||
|
"forks_count": 0,
|
||||||
|
"watchers_count": 1,
|
||||||
|
"open_issues_count": 0,
|
||||||
|
"open_pr_counter": 0,
|
||||||
|
"release_counter": 0,
|
||||||
|
"default_branch": "main",
|
||||||
|
"archived": false,
|
||||||
|
"created_at": "2026-03-30T17:33:14+02:00",
|
||||||
|
"updated_at": "2026-04-03T20:44:00+02:00",
|
||||||
|
"archived_at": "1970-01-01T01:00:00+01:00",
|
||||||
|
"permissions": {
|
||||||
|
"admin": false,
|
||||||
|
"push": false,
|
||||||
|
"pull": true
|
||||||
|
},
|
||||||
|
"has_code": true,
|
||||||
|
"has_issues": true,
|
||||||
|
"internal_tracker": {
|
||||||
|
"enable_time_tracker": true,
|
||||||
|
"allow_only_contributors_to_track_time": true,
|
||||||
|
"enable_issue_dependencies": true
|
||||||
|
},
|
||||||
|
"has_wiki": true,
|
||||||
|
"has_pull_requests": false,
|
||||||
|
"has_projects": true,
|
||||||
|
"projects_mode": "all",
|
||||||
|
"has_releases": true,
|
||||||
|
"has_packages": true,
|
||||||
|
"has_actions": false,
|
||||||
|
"ignore_whitespace_conflicts": false,
|
||||||
|
"allow_merge_commits": false,
|
||||||
|
"allow_rebase": false,
|
||||||
|
"allow_rebase_explicit": false,
|
||||||
|
"allow_squash_merge": false,
|
||||||
|
"allow_fast_forward_only_merge": false,
|
||||||
|
"allow_rebase_update": false,
|
||||||
|
"allow_manual_merge": true,
|
||||||
|
"autodetect_manual_merge": false,
|
||||||
|
"default_delete_branch_after_merge": false,
|
||||||
|
"default_merge_style": "merge",
|
||||||
|
"default_allow_maintainer_edit": false,
|
||||||
|
"avatar_url": "https://git.hadi.icu/repo-avatars/ca9c61caff75a89dcc15461d13c6ce6aa5289366a8aae70d12a64987b29a88c8",
|
||||||
|
"internal": false,
|
||||||
|
"mirror_interval": "8h0m0s",
|
||||||
|
"object_format_name": "sha1",
|
||||||
|
"mirror_updated": "2026-04-23T11:17:25+02:00",
|
||||||
|
"topics": [
|
||||||
|
"cybersecurity",
|
||||||
|
"cybersecurity-tools",
|
||||||
|
"default-password",
|
||||||
|
"pentesting"
|
||||||
|
],
|
||||||
|
"licenses": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"mirrors": {
|
||||||
|
"github": "https://github.com/anotherhadi/default-creds",
|
||||||
|
"gitlab": "https://gitlab.com/anotherhadi_mirror/default-creds"
|
||||||
|
},
|
||||||
|
"banner_url": "https://git.hadi.icu/anotherhadi/default-creds/raw/branch/main/.github/assets/banner.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"owner": {
|
||||||
|
"id": 1,
|
||||||
|
"login": "anotherhadi",
|
||||||
|
"login_name": "",
|
||||||
|
"source_id": 0,
|
||||||
|
"full_name": "Hadi",
|
||||||
|
"email": "anotherhadi@noreply.git.hadi.icu",
|
||||||
|
"avatar_url": "https://git.hadi.icu/avatars/a6f9dd8586f079ec7619ade21789a3c5dad02d7869f74a3cca0c976c81b8c9ae",
|
||||||
|
"html_url": "https://git.hadi.icu/anotherhadi",
|
||||||
|
"language": "",
|
||||||
|
"is_admin": false,
|
||||||
|
"last_login": "0001-01-01T00:00:00Z",
|
||||||
|
"created": "2026-03-30T17:21:50+02:00",
|
||||||
|
"restricted": false,
|
||||||
|
"active": false,
|
||||||
|
"prohibit_login": false,
|
||||||
|
"location": "127.0.0.1",
|
||||||
|
"website": "https://hadi.icu",
|
||||||
|
"description": "Infosec engineer passionate about Linux/NixOS, blockchains, OSINT & FOSS. Hacking with Go, exploring open tech, and contributing whenever I can 🐧\r\n\r\n[Github](https://github.com/anotherhadi) | [Gitlab (mirror)](https://gitlab.com/anotherhadi_mirror)",
|
||||||
|
"visibility": "public",
|
||||||
|
"followers_count": 0,
|
||||||
|
"following_count": 0,
|
||||||
|
"starred_repos_count": 0,
|
||||||
|
"username": "anotherhadi"
|
||||||
|
},
|
||||||
|
"name": "eleakxir",
|
||||||
|
"full_name": "anotherhadi/eleakxir",
|
||||||
|
"description": "Self-hosted search engine for leaked data. An OSINT tool that lets you connect to your own private and secure server, and visualize results in a clean, modern web interface.",
|
||||||
|
"empty": false,
|
||||||
|
"private": false,
|
||||||
|
"fork": false,
|
||||||
|
"template": false,
|
||||||
|
"mirror": false,
|
||||||
|
"size": 664,
|
||||||
|
"language": "Svelte",
|
||||||
|
"languages_url": "https://git.hadi.icu/api/v1/repos/anotherhadi/eleakxir/languages",
|
||||||
|
"html_url": "https://git.hadi.icu/anotherhadi/eleakxir",
|
||||||
|
"url": "https://git.hadi.icu/api/v1/repos/anotherhadi/eleakxir",
|
||||||
|
"link": "",
|
||||||
|
"ssh_url": "gitea@git.hadi.icu:anotherhadi/eleakxir.git",
|
||||||
|
"clone_url": "https://git.hadi.icu/anotherhadi/eleakxir.git",
|
||||||
|
"original_url": "",
|
||||||
|
"website": "https://eleakxir.hadi.icu",
|
||||||
|
"stars_count": 0,
|
||||||
|
"forks_count": 0,
|
||||||
|
"watchers_count": 1,
|
||||||
|
"open_issues_count": 0,
|
||||||
|
"open_pr_counter": 0,
|
||||||
|
"release_counter": 0,
|
||||||
|
"default_branch": "main",
|
||||||
|
"archived": false,
|
||||||
|
"created_at": "2026-03-30T17:42:13+02:00",
|
||||||
|
"updated_at": "2026-03-30T17:45:56+02:00",
|
||||||
|
"archived_at": "1970-01-01T01:00:00+01:00",
|
||||||
|
"permissions": {
|
||||||
|
"admin": false,
|
||||||
|
"push": false,
|
||||||
|
"pull": true
|
||||||
|
},
|
||||||
|
"has_code": true,
|
||||||
|
"has_issues": true,
|
||||||
|
"internal_tracker": {
|
||||||
|
"enable_time_tracker": true,
|
||||||
|
"allow_only_contributors_to_track_time": true,
|
||||||
|
"enable_issue_dependencies": true
|
||||||
|
},
|
||||||
|
"has_wiki": true,
|
||||||
|
"has_pull_requests": true,
|
||||||
|
"has_projects": true,
|
||||||
|
"projects_mode": "all",
|
||||||
|
"has_releases": true,
|
||||||
|
"has_packages": true,
|
||||||
|
"has_actions": true,
|
||||||
|
"ignore_whitespace_conflicts": false,
|
||||||
|
"allow_merge_commits": true,
|
||||||
|
"allow_rebase": true,
|
||||||
|
"allow_rebase_explicit": true,
|
||||||
|
"allow_squash_merge": true,
|
||||||
|
"allow_fast_forward_only_merge": true,
|
||||||
|
"allow_rebase_update": true,
|
||||||
|
"allow_manual_merge": false,
|
||||||
|
"autodetect_manual_merge": false,
|
||||||
|
"default_delete_branch_after_merge": false,
|
||||||
|
"default_merge_style": "merge",
|
||||||
|
"default_allow_maintainer_edit": false,
|
||||||
|
"avatar_url": "https://git.hadi.icu/repo-avatars/fe3f6d37cea3ee37b7dbb9fb6bfadc59fdb6b8f7a357b4245ec6d35ef6a84b3d",
|
||||||
|
"internal": false,
|
||||||
|
"mirror_interval": "",
|
||||||
|
"object_format_name": "sha1",
|
||||||
|
"mirror_updated": "0001-01-01T00:00:00Z",
|
||||||
|
"topics": [],
|
||||||
|
"licenses": [],
|
||||||
|
"mirrors": {},
|
||||||
|
"banner_url": "https://git.hadi.icu/anotherhadi/eleakxir/raw/branch/main/.github/assets/banner.png"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -5,6 +5,8 @@ import TagBadge from "../components/TagBadge.astro";
|
|||||||
import BackToTop from "../components/BackToTop.astro";
|
import BackToTop from "../components/BackToTop.astro";
|
||||||
import { ChevronLeft } from "@lucide/astro";
|
import { ChevronLeft } from "@lucide/astro";
|
||||||
import { parse } from "node-html-parser";
|
import { parse } from "node-html-parser";
|
||||||
|
import Author from "../components/Author.astro";
|
||||||
|
import { formatDate } from "../utils/notes";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
title: string;
|
title: string;
|
||||||
@@ -18,18 +20,9 @@ interface Props {
|
|||||||
const { title, description, publishDate, updatedDate, image, tags } =
|
const { title, description, publishDate, updatedDate, image, tags } =
|
||||||
Astro.props;
|
Astro.props;
|
||||||
|
|
||||||
function formatDate(date: Date) {
|
|
||||||
return date.toLocaleDateString("en-US", {
|
|
||||||
month: "long",
|
|
||||||
day: "numeric",
|
|
||||||
year: "numeric",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate reading time (rough estimate based on word count)
|
|
||||||
const content = await Astro.slots.render("default");
|
const content = await Astro.slots.render("default");
|
||||||
const wordCount = content.split(/\s+/).length;
|
const wordCount = content.split(/\s+/).length;
|
||||||
const readingTime = Math.ceil(wordCount / 200); // Average reading speed: 200 words/min
|
const readingTime = Math.ceil(wordCount / 200);
|
||||||
|
|
||||||
const root = parse(content);
|
const root = parse(content);
|
||||||
const headers = root.querySelectorAll("h1, h2, h3");
|
const headers = root.querySelectorAll("h1, h2, h3");
|
||||||
@@ -37,14 +30,14 @@ const headers = root.querySelectorAll("h1, h2, h3");
|
|||||||
const toc = headers.map((header) => ({
|
const toc = headers.map((header) => ({
|
||||||
depth: parseInt(header.tagName.replace("H", "")),
|
depth: parseInt(header.tagName.replace("H", "")),
|
||||||
text: header.innerText.trim(),
|
text: header.innerText.trim(),
|
||||||
slug: header.getAttribute("id"), // Astro génère l'id automatiquement
|
slug: header.getAttribute("id"),
|
||||||
}));
|
}));
|
||||||
---
|
---
|
||||||
|
|
||||||
<Layout title={`${title} - Another Hadi`} description={description}>
|
<Layout title={`${title} - Another Hadi`} description={description}>
|
||||||
<article class="max-w-4xl mx-auto px-4 py-20">
|
<article class="max-w-4xl mx-auto px-4 py-20">
|
||||||
<BackToTop />
|
<BackToTop />
|
||||||
<!-- Back button -->
|
|
||||||
<div class="mb-8">
|
<div class="mb-8">
|
||||||
<a href="/blog" class="btn btn-ghost btn-sm">
|
<a href="/blog" class="btn btn-ghost btn-sm">
|
||||||
<ChevronLeft size={18} />
|
<ChevronLeft size={18} />
|
||||||
@@ -52,7 +45,6 @@ const toc = headers.map((header) => ({
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Featured Image -->
|
|
||||||
{
|
{
|
||||||
image && (
|
image && (
|
||||||
<figure class="mb-8 rounded-2xl overflow-hidden">
|
<figure class="mb-8 rounded-2xl overflow-hidden">
|
||||||
@@ -67,13 +59,12 @@ const toc = headers.map((header) => ({
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
<!-- Post Header -->
|
|
||||||
<header class="mb-8">
|
<header class="mb-8">
|
||||||
<h1 class="text-5xl font-bold mb-4">{title}</h1>
|
<h1 class="text-5xl font-bold mb-4">{title}</h1>
|
||||||
<p class="text-xl text-base-content/70 mb-4">{description}</p>
|
<p class="text-xl text-base-content/70 mb-4">{description}</p>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
class="flex flex-wrap items-center gap-4 text-sm text-base-content/60"
|
class="flex flex-wrap items-center gap-4 text-sm text-base-content/60 mb-4"
|
||||||
>
|
>
|
||||||
<time datetime={publishDate.toISOString()}>
|
<time datetime={publishDate.toISOString()}>
|
||||||
{formatDate(publishDate)}
|
{formatDate(publishDate)}
|
||||||
@@ -92,24 +83,23 @@ const toc = headers.map((header) => ({
|
|||||||
|
|
||||||
{
|
{
|
||||||
tags && tags.length > 0 && (
|
tags && tags.length > 0 && (
|
||||||
<div class="flex flex-wrap gap-2 mt-4">
|
<div class="flex flex-wrap gap-2 mb-4">
|
||||||
{tags.map((tag) => (
|
{tags.map((tag) => (
|
||||||
<TagBadge tag={tag} />
|
<TagBadge tag={tag} />
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<Author />
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<!-- Divider -->
|
|
||||||
<div class="divider"></div>
|
<div class="divider"></div>
|
||||||
|
|
||||||
<!-- TOC -->
|
|
||||||
{
|
{
|
||||||
toc.length > 0 && (
|
toc.length > 0 && (
|
||||||
<div class="collapse bg-base-200/50 rounded-xl mb-8 border border-base-300">
|
<div class="collapse bg-base-200/50 rounded-xl mb-8 border border-base-300">
|
||||||
<input type="checkbox" />
|
<input type="checkbox" />
|
||||||
|
|
||||||
<p class="collapse-title font-bold uppercase text-xs tracking-widest opacity-60">
|
<p class="collapse-title font-bold uppercase text-xs tracking-widest opacity-60">
|
||||||
Table of Contents
|
Table of Contents
|
||||||
</p>
|
</p>
|
||||||
@@ -131,12 +121,9 @@ const toc = headers.map((header) => ({
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<nav class="bg-base-200/50 ">
|
|
||||||
</nav>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
<!-- Post Content -->
|
|
||||||
<div
|
<div
|
||||||
class="max-w-none leading-7
|
class="max-w-none leading-7
|
||||||
[&_h1]:text-4xl [&_h1]:font-bold [&_h1]:mt-8 [&_h1]:mb-4
|
[&_h1]:text-4xl [&_h1]:font-bold [&_h1]:mt-8 [&_h1]:mb-4
|
||||||
@@ -160,17 +147,17 @@ const toc = headers.map((header) => ({
|
|||||||
<slot />
|
<slot />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Divider -->
|
|
||||||
<div class="divider mt-12"></div>
|
<div class="divider mt-12"></div>
|
||||||
|
|
||||||
<!-- Back to blog link -->
|
|
||||||
<div class="flex justify-center gap-2 mt-12">
|
<div class="flex justify-center gap-2 mt-12">
|
||||||
<div class="flex gap-3 justify-center flex-wrap text-sm">
|
<div class="flex gap-3 justify-center flex-wrap text-sm">
|
||||||
<a href="/blog" class="link link-hover">View All Posts</a>
|
<a href="/blog" class="link link-hover">View All Posts</a>
|
||||||
<span class="text-base-content/30">•</span>
|
<span class="text-base-content/30">•</span>
|
||||||
<a href="/#contact" class="link link-hover">Contact me</a>
|
<a href="/#contact" class="link link-hover">Contact me</a>
|
||||||
<span class="text-base-content/30">•</span>
|
<span class="text-base-content/30">•</span>
|
||||||
<a href="https://ko-fi.com/anotherhadi" class="link link-hover">Support me</a>
|
<a href="https://ko-fi.com/anotherhadi" class="link link-hover"
|
||||||
|
>Support me</a
|
||||||
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
|
|||||||
+14
-29
@@ -3,6 +3,7 @@ import "../styles/global.css";
|
|||||||
import { ClientRouter } from "astro:transitions";
|
import { ClientRouter } from "astro:transitions";
|
||||||
import Oneko from "../components/Oneko.astro";
|
import Oneko from "../components/Oneko.astro";
|
||||||
import Console from "../components/Console.astro";
|
import Console from "../components/Console.astro";
|
||||||
|
import Navbar from "../components/Navbar.astro";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
title?: string;
|
title?: string;
|
||||||
@@ -14,26 +15,11 @@ const {
|
|||||||
description = "Infosec engineer passionate about Linux/NixOS, blockchains, OSINT & FOSS. Hacking with Go, exploring open tech, and contributing whenever I can 🐧",
|
description = "Infosec engineer passionate about Linux/NixOS, blockchains, OSINT & FOSS. Hacking with Go, exploring open tech, and contributing whenever I can 🐧",
|
||||||
} = Astro.props;
|
} = Astro.props;
|
||||||
|
|
||||||
// Custom blur-fade animation configuration
|
const anim = {
|
||||||
const blurFadeAnimation = {
|
old: { name: "blurFadeOut", duration: "0.1s", easing: "ease-in-out", fillMode: "forwards" },
|
||||||
old: {
|
new: { name: "blurFadeIn", duration: "0.1s", easing: "ease-in-out", fillMode: "backwards" },
|
||||||
name: "blurFadeOut",
|
|
||||||
duration: "0.1s",
|
|
||||||
easing: "ease-in-out",
|
|
||||||
fillMode: "forwards",
|
|
||||||
},
|
|
||||||
new: {
|
|
||||||
name: "blurFadeIn",
|
|
||||||
duration: "0.1s",
|
|
||||||
easing: "ease-in-out",
|
|
||||||
fillMode: "backwards",
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const pageTransition = {
|
|
||||||
forwards: blurFadeAnimation,
|
|
||||||
backwards: blurFadeAnimation,
|
|
||||||
};
|
};
|
||||||
|
const pageTransition = { forwards: anim, backwards: anim };
|
||||||
|
|
||||||
const origin = Astro.url.origin;
|
const origin = Astro.url.origin;
|
||||||
---
|
---
|
||||||
@@ -48,23 +34,19 @@ const origin = Astro.url.origin;
|
|||||||
<meta name="generator" content={Astro.generator} />
|
<meta name="generator" content={Astro.generator} />
|
||||||
<title>{title}</title>
|
<title>{title}</title>
|
||||||
|
|
||||||
<!-- View Transitions -->
|
|
||||||
<ClientRouter />
|
<ClientRouter />
|
||||||
|
|
||||||
<!-- Open Graph / Social Media -->
|
|
||||||
<meta property="og:title" content={title} />
|
<meta property="og:title" content={title} />
|
||||||
<meta property="og:description" content={description} />
|
<meta property="og:description" content={description} />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content={origin} />
|
<meta property="og:url" content={origin} />
|
||||||
<meta property="og:image" content={`${origin}/images/og_home.png`} />
|
<meta property="og:image" content={`${origin}/images/og_home.png`} />
|
||||||
|
|
||||||
<!-- Twitter -->
|
|
||||||
<meta name="twitter:card" content="summary_large_image" />
|
<meta name="twitter:card" content="summary_large_image" />
|
||||||
<meta name="twitter:title" content={title} />
|
<meta name="twitter:title" content={title} />
|
||||||
<meta name="twitter:description" content={description} />
|
<meta name="twitter:description" content={description} />
|
||||||
<meta name="twitter:image" content={`${origin}/images/og_home.png`} />
|
<meta name="twitter:image" content={`${origin}/images/og_home.png`} />
|
||||||
|
|
||||||
<!-- RSS Feed -->
|
|
||||||
<link
|
<link
|
||||||
rel="alternate"
|
rel="alternate"
|
||||||
type="application/rss+xml"
|
type="application/rss+xml"
|
||||||
@@ -72,21 +54,25 @@ const origin = Astro.url.origin;
|
|||||||
href="/rss.xml"
|
href="/rss.xml"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<script defer src="https://umami.hadi.icu/script.js" data-website-id="91b0c3a1-130a-4974-be47-078bc092cec8"></script>
|
<script
|
||||||
|
is:inline
|
||||||
|
defer
|
||||||
|
src="https://umami.hadi.icu/script.js"
|
||||||
|
data-website-id="91b0c3a1-130a-4974-be47-078bc092cec8"
|
||||||
|
data-domains="hadi.icu,www.hadi.icu"></script>
|
||||||
</head>
|
</head>
|
||||||
<body class="min-h-screen">
|
<body class="min-h-screen pt-12">
|
||||||
|
<Navbar />
|
||||||
<slot />
|
<slot />
|
||||||
|
|
||||||
<Oneko />
|
<Oneko />
|
||||||
<Console />
|
<Console />
|
||||||
|
|
||||||
<!-- Smooth Scroll -->
|
|
||||||
<style is:global>
|
<style is:global>
|
||||||
html {
|
html {
|
||||||
scroll-behavior: smooth;
|
scroll-behavior: smooth;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initial Page Load Blur-Fade Animation */
|
|
||||||
@keyframes pageLoadBlurFade {
|
@keyframes pageLoadBlurFade {
|
||||||
0% {
|
0% {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
@@ -99,11 +85,10 @@ const origin = Astro.url.origin;
|
|||||||
}
|
}
|
||||||
|
|
||||||
html {
|
html {
|
||||||
animation: pageLoadBlurFade 0.3s ease-in-out;
|
animation: pageLoadBlurFade 0.1s ease-in-out;
|
||||||
animation-fill-mode: both;
|
animation-fill-mode: both;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Blur Fade View Transitions (for page-to-page navigation) */
|
|
||||||
@keyframes blurFadeIn {
|
@keyframes blurFadeIn {
|
||||||
0% {
|
0% {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
|
|||||||
@@ -1,231 +0,0 @@
|
|||||||
---
|
|
||||||
import Layout from "./Layout.astro";
|
|
||||||
import { Image } from "astro:assets";
|
|
||||||
import TagBadge from "../components/TagBadge.astro";
|
|
||||||
import { ChevronLeft, ExternalLink } from "@lucide/astro";
|
|
||||||
|
|
||||||
interface Props {
|
|
||||||
title: string;
|
|
||||||
description: string;
|
|
||||||
image: any;
|
|
||||||
tags: string[];
|
|
||||||
demoLink?: string;
|
|
||||||
url?: string;
|
|
||||||
sourceLink?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
const { title, description, image, tags, demoLink, url, sourceLink } =
|
|
||||||
Astro.props;
|
|
||||||
---
|
|
||||||
|
|
||||||
<Layout title={`${title} - Another Hadi`} description={description}>
|
|
||||||
<article class="max-w-4xl mx-auto px-4 py-20">
|
|
||||||
<!-- Back button -->
|
|
||||||
<div class="mb-8">
|
|
||||||
<a href="/projects" class="btn btn-ghost btn-sm">
|
|
||||||
<ChevronLeft size={18} />
|
|
||||||
Back to Projects
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Featured Image -->
|
|
||||||
<!-- TODO: Future Enhancement - Support multiple images/project gallery -->
|
|
||||||
{
|
|
||||||
image && (
|
|
||||||
<figure class="mb-8 rounded-2xl overflow-hidden">
|
|
||||||
<Image
|
|
||||||
src={image}
|
|
||||||
alt={title}
|
|
||||||
class="w-full aspect-video object-cover"
|
|
||||||
width={1200}
|
|
||||||
height={630}
|
|
||||||
/>
|
|
||||||
</figure>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
<!-- Project Header -->
|
|
||||||
<header class="mb-8">
|
|
||||||
<h1 class="text-5xl font-bold mb-4">{title}</h1>
|
|
||||||
<p class="text-xl text-base-content/70 mb-6">{description}</p>
|
|
||||||
|
|
||||||
<!-- Prominent Action Buttons -->
|
|
||||||
{
|
|
||||||
(demoLink || sourceLink) && (
|
|
||||||
<div class="flex flex-wrap gap-3 mb-6">
|
|
||||||
{demoLink && (
|
|
||||||
<a
|
|
||||||
href={demoLink}
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
class="btn btn-primary gap-2"
|
|
||||||
>
|
|
||||||
<ExternalLink class="size-5" />
|
|
||||||
Live Demo
|
|
||||||
</a>
|
|
||||||
)}
|
|
||||||
{url && (
|
|
||||||
<a
|
|
||||||
href={url}
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
class="btn btn-soft gap-2"
|
|
||||||
>
|
|
||||||
<ExternalLink class="size-4" />
|
|
||||||
Website
|
|
||||||
</a>
|
|
||||||
)}
|
|
||||||
{sourceLink && (
|
|
||||||
<a
|
|
||||||
href={sourceLink}
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
class="btn btn-soft gap-2"
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
width="24"
|
|
||||||
height="24"
|
|
||||||
viewBox="0 0 32 32"
|
|
||||||
fill="currentColor"
|
|
||||||
>
|
|
||||||
<path d="M16,2.345c7.735,0,14,6.265,14,14-.002,6.015-3.839,11.359-9.537,13.282-.7,.14-.963-.298-.963-.665,0-.473,.018-1.978,.018-3.85,0-1.312-.437-2.152-.945-2.59,3.115-.35,6.388-1.54,6.388-6.912,0-1.54-.543-2.783-1.435-3.762,.14-.35,.63-1.785-.14-3.71,0,0-1.173-.385-3.85,1.435-1.12-.315-2.31-.472-3.5-.472s-2.38,.157-3.5,.472c-2.677-1.802-3.85-1.435-3.85-1.435-.77,1.925-.28,3.36-.14,3.71-.892,.98-1.435,2.24-1.435,3.762,0,5.355,3.255,6.563,6.37,6.913-.403,.35-.77,.963-.893,1.872-.805,.368-2.818,.963-4.077-1.155-.263-.42-1.05-1.452-2.152-1.435-1.173,.018-.472,.665,.017,.927,.595,.332,1.277,1.575,1.435,1.978,.28,.787,1.19,2.293,4.707,1.645,0,1.173,.018,2.275,.018,2.607,0,.368-.263,.787-.963,.665-5.719-1.904-9.576-7.255-9.573-13.283,0-7.735,6.265-14,14-14Z" />
|
|
||||||
</svg>
|
|
||||||
View Source
|
|
||||||
</a>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<!-- Tags -->
|
|
||||||
{
|
|
||||||
tags && tags.length > 0 && (
|
|
||||||
<div class="flex flex-wrap gap-2 mt-4">
|
|
||||||
{tags.map((tag) => (
|
|
||||||
<TagBadge tag={tag} />
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
<!-- Divider -->
|
|
||||||
<div class="divider"></div>
|
|
||||||
|
|
||||||
<!-- Project Content -->
|
|
||||||
<div class="prose-content max-w-none">
|
|
||||||
<slot />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Divider -->
|
|
||||||
<div class="divider mt-12"></div>
|
|
||||||
|
|
||||||
<!-- Back to projects link -->
|
|
||||||
<div class="flex justify-center gap-2 mt-12">
|
|
||||||
<div class="flex gap-3 justify-center flex-wrap text-sm">
|
|
||||||
<a href="https://github.com/anotherhadi" class="link link-hover"
|
|
||||||
>View All Projects</a
|
|
||||||
>
|
|
||||||
<span class="text-base-content/30">•</span>
|
|
||||||
<a href="/#contact" class="link link-hover">Contact me</a>
|
|
||||||
<span class="text-base-content/30">•</span>
|
|
||||||
<a href="https://ko-fi.com/anotherhadi" class="link link-hover"
|
|
||||||
>Support me</a
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
<style is:global>
|
|
||||||
.prose-content {
|
|
||||||
color: inherit;
|
|
||||||
line-height: 1.75;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prose-content h1,
|
|
||||||
.prose-content h2,
|
|
||||||
.prose-content h3,
|
|
||||||
.prose-content h4,
|
|
||||||
.prose-content h5,
|
|
||||||
.prose-content h6 {
|
|
||||||
font-weight: 700;
|
|
||||||
margin-top: 2rem;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prose-content h1 {
|
|
||||||
font-size: 2.25rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prose-content h2 {
|
|
||||||
font-size: 1.875rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prose-content h3 {
|
|
||||||
font-size: 1.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prose-content p {
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prose-content a {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prose-content ul,
|
|
||||||
.prose-content ol {
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
margin-left: 1.5rem;
|
|
||||||
list-style-position: outside;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prose-content ul {
|
|
||||||
list-style-type: disc;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prose-content ol {
|
|
||||||
list-style-type: decimal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prose-content li {
|
|
||||||
margin-bottom: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prose-content code {
|
|
||||||
padding: 0.125rem 0.375rem;
|
|
||||||
border-radius: 0.25rem;
|
|
||||||
font-size: 0.875rem;
|
|
||||||
font-family: ui-monospace, monospace;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prose-content pre {
|
|
||||||
padding: 1rem;
|
|
||||||
border-radius: 0.5rem;
|
|
||||||
overflow-x: auto;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prose-content pre code {
|
|
||||||
background: transparent;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prose-content blockquote {
|
|
||||||
border-left-width: 4px;
|
|
||||||
padding-left: 1rem;
|
|
||||||
font-style: italic;
|
|
||||||
margin: 1rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prose-content img {
|
|
||||||
border-radius: 0.5rem;
|
|
||||||
margin: 1.5rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prose-content strong {
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
+3
-5
@@ -30,10 +30,6 @@ import { House, FolderOpen } from "@lucide/astro";
|
|||||||
<House class="size-5" />
|
<House class="size-5" />
|
||||||
Go Home
|
Go Home
|
||||||
</a>
|
</a>
|
||||||
<a href="/#projects" class="btn btn-outline gap-2">
|
|
||||||
<FolderOpen class="size-5" />
|
|
||||||
View Projects
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Helpful Links -->
|
<!-- Helpful Links -->
|
||||||
@@ -44,7 +40,9 @@ import { House, FolderOpen } from "@lucide/astro";
|
|||||||
<div class="flex gap-3 justify-center flex-wrap text-sm">
|
<div class="flex gap-3 justify-center flex-wrap text-sm">
|
||||||
<a href="/blog" class="link link-hover">Blog</a>
|
<a href="/blog" class="link link-hover">Blog</a>
|
||||||
<span class="text-base-content/30">•</span>
|
<span class="text-base-content/30">•</span>
|
||||||
<a href="/#about" class="link link-hover">About</a>
|
<a href="/projects" class="link link-hover">Projects</a>
|
||||||
|
<span class="text-base-content/30">•</span>
|
||||||
|
<a href="/notes" class="link link-hover">Infosec Notes</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+3
-5
@@ -30,10 +30,6 @@ import { House, FolderOpen } from "@lucide/astro";
|
|||||||
<House class="size-5" />
|
<House class="size-5" />
|
||||||
Go Home
|
Go Home
|
||||||
</a>
|
</a>
|
||||||
<a href="/#projects" class="btn btn-outline gap-2">
|
|
||||||
<FolderOpen class="size-5" />
|
|
||||||
View Projects
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Helpful Links -->
|
<!-- Helpful Links -->
|
||||||
@@ -44,7 +40,9 @@ import { House, FolderOpen } from "@lucide/astro";
|
|||||||
<div class="flex gap-3 justify-center flex-wrap text-sm">
|
<div class="flex gap-3 justify-center flex-wrap text-sm">
|
||||||
<a href="/blog" class="link link-hover">Blog</a>
|
<a href="/blog" class="link link-hover">Blog</a>
|
||||||
<span class="text-base-content/30">•</span>
|
<span class="text-base-content/30">•</span>
|
||||||
<a href="/#about" class="link link-hover">About</a>
|
<a href="/projects" class="link link-hover">Projects</a>
|
||||||
|
<span class="text-base-content/30">•</span>
|
||||||
|
<a href="/notes" class="link link-hover">Infosec Notes</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -68,6 +68,12 @@ if (error instanceof Error) {
|
|||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
class="link link-hover">Report Issue</a
|
class="link link-hover">Report Issue</a
|
||||||
>
|
>
|
||||||
|
<span class="text-base-content/30">•</span>
|
||||||
|
<a href="/blog" class="link link-hover">Blog</a>
|
||||||
|
<span class="text-base-content/30">•</span>
|
||||||
|
<a href="/projects" class="link link-hover">Projects</a>
|
||||||
|
<span class="text-base-content/30">•</span>
|
||||||
|
<a href="/notes" class="link link-hover">Infosec Notes</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -68,6 +68,12 @@ if (error instanceof Error) {
|
|||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
class="link link-hover">Report Issue</a
|
class="link link-hover">Report Issue</a
|
||||||
>
|
>
|
||||||
|
<span class="text-base-content/30">•</span>
|
||||||
|
<a href="/blog" class="link link-hover">Blog</a>
|
||||||
|
<span class="text-base-content/30">•</span>
|
||||||
|
<a href="/projects" class="link link-hover">Projects</a>
|
||||||
|
<span class="text-base-content/30">•</span>
|
||||||
|
<a href="/notes" class="link link-hover">Infosec Notes</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
---
|
---
|
||||||
import Layout from "../../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
import { getCollection } from "astro:content";
|
import { getCollection } from "astro:content";
|
||||||
import { Image } from "astro:assets";
|
|
||||||
import TagBadge from "../../components/TagBadge.astro";
|
|
||||||
import { ChevronLeft } from "@lucide/astro";
|
import { ChevronLeft } from "@lucide/astro";
|
||||||
import BlogCard from "../../components/BlogCard.astro";
|
import BlogCard from "../../components/BlogCard.astro";
|
||||||
|
|
||||||
@@ -12,14 +10,6 @@ const blogPosts = await getCollection("blog");
|
|||||||
const sortedPosts = blogPosts.sort(
|
const sortedPosts = blogPosts.sort(
|
||||||
(a, b) => b.data.publishDate.getTime() - a.data.publishDate.getTime(),
|
(a, b) => b.data.publishDate.getTime() - a.data.publishDate.getTime(),
|
||||||
);
|
);
|
||||||
|
|
||||||
function formatDate(date: Date) {
|
|
||||||
return date.toLocaleDateString("en-US", {
|
|
||||||
month: "long",
|
|
||||||
day: "numeric",
|
|
||||||
year: "numeric",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<Layout
|
<Layout
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import avatar from "../../public/avatar.jpg";
|
|||||||
location={siteConfig.location}
|
location={siteConfig.location}
|
||||||
socialLinks={siteConfig.socialLinks}
|
socialLinks={siteConfig.socialLinks}
|
||||||
gpgKey={siteConfig.gpgKey}
|
gpgKey={siteConfig.gpgKey}
|
||||||
|
rssFeed={siteConfig.rssFeed}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Blog />
|
<Blog />
|
||||||
|
|||||||
@@ -0,0 +1,338 @@
|
|||||||
|
---
|
||||||
|
import { getCollection, render } from "astro:content";
|
||||||
|
import Layout from "../../layouts/Layout.astro";
|
||||||
|
import { List, PanelRight } from "@lucide/astro";
|
||||||
|
import NoteTOC from "../../components/NoteTOC.astro";
|
||||||
|
import NoteNavSidebar from "../../components/NoteNavSidebar.svelte";
|
||||||
|
import NoteGraphSidebar from "../../components/NoteGraphSidebar.astro";
|
||||||
|
import NoteVars from "../../components/NoteVars.svelte";
|
||||||
|
import { getCategory, extractLinks, extractHeadings } from "../../utils/notes";
|
||||||
|
|
||||||
|
export async function getStaticPaths() {
|
||||||
|
const notes = await getCollection("notes");
|
||||||
|
return notes.map((entry) => ({
|
||||||
|
params: { slug: entry.id },
|
||||||
|
props: { entry },
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
const { entry } = Astro.props;
|
||||||
|
const { Content } = await render(entry);
|
||||||
|
|
||||||
|
const allNotes = await getCollection("notes");
|
||||||
|
const sortedNotes = allNotes.sort((a, b) =>
|
||||||
|
a.data.title.localeCompare(b.data.title),
|
||||||
|
);
|
||||||
|
const categories = [...new Set(allNotes.map(getCategory))].sort();
|
||||||
|
|
||||||
|
const allLinks = Object.fromEntries(
|
||||||
|
allNotes.map((n) => [n.id, extractLinks(n.body ?? "")]),
|
||||||
|
);
|
||||||
|
const forwardLinks = (allLinks[entry.id] ?? [])
|
||||||
|
.map((id) => allNotes.find((n) => n.id === id))
|
||||||
|
.filter(Boolean) as typeof allNotes;
|
||||||
|
const backlinks = allNotes.filter(
|
||||||
|
(n) => n.id !== entry.id && (allLinks[n.id] ?? []).includes(entry.id),
|
||||||
|
);
|
||||||
|
|
||||||
|
const graphNodes = [
|
||||||
|
{ id: entry.id, title: entry.data.title, current: true },
|
||||||
|
...forwardLinks.map((n) => ({
|
||||||
|
id: n.id,
|
||||||
|
title: n.data.title,
|
||||||
|
current: false,
|
||||||
|
})),
|
||||||
|
...backlinks
|
||||||
|
.filter((n) => !forwardLinks.some((f) => f.id === n.id))
|
||||||
|
.map((n) => ({ id: n.id, title: n.data.title, current: false })),
|
||||||
|
];
|
||||||
|
const graphEdges = [
|
||||||
|
...forwardLinks.map((n) => ({ from: entry.id, to: n.id })),
|
||||||
|
...backlinks.map((n) => ({ from: n.id, to: entry.id })),
|
||||||
|
];
|
||||||
|
|
||||||
|
const noteVars = [
|
||||||
|
...new Set(
|
||||||
|
Array.from(
|
||||||
|
(entry.body ?? "").matchAll(/\$([a-zA-Z_][a-zA-Z0-9_]*)/g),
|
||||||
|
(m) => m[1],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
];
|
||||||
|
|
||||||
|
const headings = extractHeadings(entry.body ?? "");
|
||||||
|
---
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.drawer.lg\:drawer-open > .drawer-side,
|
||||||
|
.drawer.xl\:drawer-open > .drawer-side {
|
||||||
|
top: 3rem;
|
||||||
|
height: calc(100vh - 3rem);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<Layout
|
||||||
|
title={`${entry.data.title} - Infosec Notes`}
|
||||||
|
description={entry.data.description}
|
||||||
|
>
|
||||||
|
<main class="max-w-screen-2xl mx-auto">
|
||||||
|
<div class="drawer drawer-end xl:drawer-open min-h-[calc(100vh-3rem)]">
|
||||||
|
<input id="graph-drawer" type="checkbox" class="drawer-toggle" />
|
||||||
|
|
||||||
|
<div class="drawer-content flex min-h-[calc(100vh-3rem)]">
|
||||||
|
<div class="drawer lg:drawer-open w-full">
|
||||||
|
<input id="nav-drawer" type="checkbox" class="drawer-toggle" />
|
||||||
|
|
||||||
|
<div class="drawer-content flex flex-col min-w-0">
|
||||||
|
<main class="flex-1 px-4 sm:px-6 lg:px-10 py-6 lg:py-10 min-w-0">
|
||||||
|
<div class="max-w-3xl mx-auto lg:mx-0">
|
||||||
|
<div class="flex items-center justify-between mb-6">
|
||||||
|
<div
|
||||||
|
class="breadcrumbs text-xs font-mono text-base-content/35 p-0"
|
||||||
|
>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="/notes" class="hover:text-base-content/70"
|
||||||
|
>notes</a
|
||||||
|
>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
{
|
||||||
|
entry.id.includes("/") ? (
|
||||||
|
<a
|
||||||
|
href={`/notes/${getCategory(entry)}`}
|
||||||
|
class="hover:text-base-content/70"
|
||||||
|
>
|
||||||
|
{getCategory(entry)}
|
||||||
|
</a>
|
||||||
|
) : (
|
||||||
|
getCategory(entry)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center gap-2">
|
||||||
|
<label
|
||||||
|
for="nav-drawer"
|
||||||
|
class="btn btn-ghost btn-xs lg:hidden font-mono text-base-content/40 hover:text-base-content/70 border border-base-300/50"
|
||||||
|
>
|
||||||
|
<List size={11} />
|
||||||
|
nav
|
||||||
|
</label>
|
||||||
|
<NoteVars client:load vars={noteVars} />
|
||||||
|
<label
|
||||||
|
for="graph-drawer"
|
||||||
|
id="graph-toggle"
|
||||||
|
class="btn btn-ghost btn-xs font-mono text-base-content/40 hover:text-base-content/70 border border-base-300/50"
|
||||||
|
title="Toggle graph"
|
||||||
|
>
|
||||||
|
<PanelRight size={11} />
|
||||||
|
graph
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<header class="mb-8">
|
||||||
|
<h1
|
||||||
|
class="text-4xl sm:text-5xl font-bold tracking-tight mb-3"
|
||||||
|
>
|
||||||
|
{entry.data.title}
|
||||||
|
</h1>
|
||||||
|
<p class="text-base-content/50 mb-4">
|
||||||
|
{entry.data.description}
|
||||||
|
</p>
|
||||||
|
{
|
||||||
|
entry.data.tags.length > 0 && (
|
||||||
|
<div class="flex flex-wrap gap-1 mb-4">
|
||||||
|
{entry.data.tags.map((tag) => (
|
||||||
|
<a
|
||||||
|
href={`/notes?tag=${tag}`}
|
||||||
|
class="badge badge-ghost badge-xs font-mono text-base-content/30 hover:text-primary/70 transition-colors"
|
||||||
|
>
|
||||||
|
{tag}
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<NoteTOC headings={headings} />
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="note-content text-sm leading-relaxed text-base-content/80
|
||||||
|
[&_h2]:text-lg [&_h2]:font-bold [&_h2]:mt-8 [&_h2]:mb-3 [&_h2]:text-base-content [&_h2]:tracking-tight [&_h2]:pb-1.5 [&_h2]:border-b [&_h2]:border-base-300/30
|
||||||
|
[&_h3]:text-base [&_h3]:font-semibold [&_h3]:mt-6 [&_h3]:mb-2 [&_h3]:text-base-content/90
|
||||||
|
[&_h4]:text-sm [&_h4]:font-semibold [&_h4]:mt-4 [&_h4]:mb-2 [&_h4]:text-base-content/80
|
||||||
|
[&_p]:mb-4 [&_p]:leading-relaxed
|
||||||
|
[&_a]:text-primary/80 [&_a]:underline [&_a]:underline-offset-2 [&_a]:hover:text-primary [&_a]:transition-colors
|
||||||
|
[&_ul]:mb-4 [&_ul]:ml-5 [&_ul]:list-none [&_ul]:space-y-1
|
||||||
|
[&_ul_li]:before:content-['–'] [&_ul_li]:before:text-base-content/25 [&_ul_li]:before:mr-2 [&_ul_li]:before:font-mono
|
||||||
|
[&_ol]:mb-4 [&_ol]:ml-5 [&_ol]:list-decimal [&_ol]:space-y-1
|
||||||
|
[&_li]:text-base-content/75
|
||||||
|
[&_code]:px-1.5 [&_code]:py-0.5 [&_code]:rounded-field [&_code]:font-mono [&_code]:text-xs [&_code]:bg-base-200 [&_code]:text-primary/80 [&_code]:border [&_code]:border-base-300/50
|
||||||
|
[&_pre]:p-4 [&_pre]:overflow-x-auto [&_pre]:mb-4 [&_pre]:rounded-box [&_pre]:bg-base-200/60 [&_pre]:border [&_pre]:border-base-300/50 [&_pre]:text-xs
|
||||||
|
[&_pre_code]:bg-transparent [&_pre_code]:border-0 [&_pre_code]:p-0 [&_pre_code]:text-base-content/80
|
||||||
|
[&_blockquote]:border-l-2 [&_blockquote]:border-primary/25 [&_blockquote]:pl-4 [&_blockquote]:italic [&_blockquote]:my-4 [&_blockquote]:text-base-content/50
|
||||||
|
[&_table]:w-full [&_table]:mb-6 [&_table]:text-xs [&_table]:border-collapse
|
||||||
|
[&_th]:text-left [&_th]:px-3 [&_th]:py-2 [&_th]:border [&_th]:border-base-300/50 [&_th]:bg-base-200/60 [&_th]:font-mono [&_th]:text-[10px] [&_th]:uppercase [&_th]:tracking-widest [&_th]:text-base-content/50
|
||||||
|
[&_td]:px-3 [&_td]:py-2 [&_td]:border [&_td]:border-base-300/40 [&_td]:font-mono [&_td]:text-xs [&_td]:text-base-content/70
|
||||||
|
[&_tr:nth-child(even)_td]:bg-base-200/20
|
||||||
|
[&_hr]:border-t [&_hr]:border-base-300/30 [&_hr]:my-8"
|
||||||
|
>
|
||||||
|
<Content />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="border-t border-base-300/30 mt-12 pt-6 flex items-center justify-between font-mono text-[10px] text-base-content/25"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
href="/notes"
|
||||||
|
class="hover:text-base-content/50 transition-colors"
|
||||||
|
>
|
||||||
|
← all notes
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="/"
|
||||||
|
class="hover:text-base-content/50 transition-colors"
|
||||||
|
>
|
||||||
|
~/hadi
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="drawer-side z-50">
|
||||||
|
<label
|
||||||
|
for="nav-drawer"
|
||||||
|
aria-label="close sidebar"
|
||||||
|
class="drawer-overlay"></label>
|
||||||
|
<NoteNavSidebar
|
||||||
|
client:load
|
||||||
|
notes={sortedNotes}
|
||||||
|
currentEntry={entry}
|
||||||
|
categories={categories}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="drawer-side z-40">
|
||||||
|
<label
|
||||||
|
for="graph-drawer"
|
||||||
|
aria-label="close sidebar"
|
||||||
|
class="drawer-overlay xl:hidden"></label>
|
||||||
|
<NoteGraphSidebar
|
||||||
|
entry={entry}
|
||||||
|
graphNodes={graphNodes}
|
||||||
|
graphEdges={graphEdges}
|
||||||
|
forwardLinks={forwardLinks}
|
||||||
|
backlinks={backlinks}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</Layout>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function injectHeadingAnchors() {
|
||||||
|
if (!document.getElementById("heading-anchor-styles")) {
|
||||||
|
const s = document.createElement("style");
|
||||||
|
s.id = "heading-anchor-styles";
|
||||||
|
s.textContent = `
|
||||||
|
.note-content h2, .note-content h3, .note-content h4 {
|
||||||
|
display: flex !important;
|
||||||
|
align-items: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 0;
|
||||||
|
}
|
||||||
|
.heading-anchor {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
flex-shrink: 0;
|
||||||
|
margin-left: 0.4em;
|
||||||
|
color: oklch(38% 0 0);
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 120ms, color 120ms;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.note-content h2:hover .heading-anchor,
|
||||||
|
.note-content h3:hover .heading-anchor,
|
||||||
|
.note-content h4:hover .heading-anchor { opacity: 1; }
|
||||||
|
.heading-anchor:hover, .heading-anchor.copied { color: oklch(71% 0.0863 296.59); opacity: 1; }
|
||||||
|
`;
|
||||||
|
document.head.appendChild(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
document
|
||||||
|
.querySelectorAll(".note-content h2, .note-content h3, .note-content h4")
|
||||||
|
.forEach((heading) => {
|
||||||
|
if (!heading.id || heading.querySelector(".heading-anchor")) return;
|
||||||
|
const anchor = document.createElement("a");
|
||||||
|
anchor.href = `#${heading.id}`;
|
||||||
|
anchor.className = "heading-anchor";
|
||||||
|
anchor.setAttribute("aria-label", "Copy link to section");
|
||||||
|
anchor.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg>`;
|
||||||
|
anchor.addEventListener("click", (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
const url = `${location.origin}${location.pathname}#${heading.id}`;
|
||||||
|
navigator.clipboard.writeText(url).then(() => {
|
||||||
|
anchor.classList.add("copied");
|
||||||
|
setTimeout(() => anchor.classList.remove("copied"), 1800);
|
||||||
|
});
|
||||||
|
history.pushState(null, "", `#${heading.id}`);
|
||||||
|
});
|
||||||
|
heading.appendChild(anchor);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function initXlGraphToggle() {
|
||||||
|
const graphDrawer = document.getElementById(
|
||||||
|
"graph-drawer",
|
||||||
|
) as HTMLInputElement | null;
|
||||||
|
if (!graphDrawer) return;
|
||||||
|
|
||||||
|
const outerDrawer = graphDrawer.closest<HTMLElement>(".drawer.drawer-end");
|
||||||
|
const xlQuery = window.matchMedia("(min-width: 1280px)");
|
||||||
|
const STORAGE_KEY = "notes-graph-sidebar";
|
||||||
|
|
||||||
|
function setXlSidebar(open: boolean) {
|
||||||
|
if (!outerDrawer) return;
|
||||||
|
if (open) {
|
||||||
|
outerDrawer.classList.add("xl:drawer-open");
|
||||||
|
} else {
|
||||||
|
outerDrawer.classList.remove("xl:drawer-open");
|
||||||
|
}
|
||||||
|
localStorage.setItem(STORAGE_KEY, open ? "1" : "0");
|
||||||
|
}
|
||||||
|
|
||||||
|
const graphToggle = document.getElementById("graph-toggle");
|
||||||
|
graphToggle?.addEventListener("click", (e) => {
|
||||||
|
if (!xlQuery.matches) return;
|
||||||
|
e.preventDefault();
|
||||||
|
setXlSidebar(!outerDrawer?.classList.contains("xl:drawer-open"));
|
||||||
|
});
|
||||||
|
|
||||||
|
if (xlQuery.matches) {
|
||||||
|
const saved = localStorage.getItem(STORAGE_KEY);
|
||||||
|
// Open by default unless user explicitly closed it
|
||||||
|
setXlSidebar(saved !== "0");
|
||||||
|
}
|
||||||
|
|
||||||
|
xlQuery.addEventListener("change", (e) => {
|
||||||
|
if (!e.matches) {
|
||||||
|
outerDrawer?.classList.remove("xl:drawer-open");
|
||||||
|
} else {
|
||||||
|
const saved = localStorage.getItem(STORAGE_KEY);
|
||||||
|
setXlSidebar(saved !== "0");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener("astro:page-load", () => {
|
||||||
|
injectHeadingAnchors();
|
||||||
|
initXlGraphToggle();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
---
|
||||||
|
import { getCollection } from "astro:content";
|
||||||
|
import Layout from "../../layouts/Layout.astro";
|
||||||
|
import NoteNavSidebar from "../../components/NoteNavSidebar.svelte";
|
||||||
|
import { getCategory } from "../../utils/notes";
|
||||||
|
import { List } from "@lucide/astro";
|
||||||
|
|
||||||
|
export async function getStaticPaths() {
|
||||||
|
const notes = await getCollection("notes");
|
||||||
|
|
||||||
|
const folderCategories = [
|
||||||
|
...new Set(
|
||||||
|
notes.filter((n) => n.id.includes("/")).map((n) => getCategory(n)),
|
||||||
|
),
|
||||||
|
];
|
||||||
|
|
||||||
|
return folderCategories.map((category) => {
|
||||||
|
const allNotes = notes.sort((a, b) =>
|
||||||
|
a.data.title.localeCompare(b.data.title),
|
||||||
|
);
|
||||||
|
const categories = [...new Set(notes.map(getCategory))].sort();
|
||||||
|
return {
|
||||||
|
params: { category },
|
||||||
|
props: {
|
||||||
|
category,
|
||||||
|
categoryNotes: notes
|
||||||
|
.filter((n) => getCategory(n) === category)
|
||||||
|
.sort((a, b) => a.data.title.localeCompare(b.data.title)),
|
||||||
|
allNotes,
|
||||||
|
categories,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const { category, categoryNotes, allNotes, categories } = Astro.props;
|
||||||
|
|
||||||
|
if (!categoryNotes) {
|
||||||
|
return new Response(null, { status: 404, statusText: "Not found" });
|
||||||
|
}
|
||||||
|
---
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.drawer.lg\:drawer-open > .drawer-side {
|
||||||
|
top: 3rem;
|
||||||
|
height: calc(100vh - 3rem);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<Layout
|
||||||
|
title={`${category} - Infosec Notes`}
|
||||||
|
description={`Notes on ${category}.`}
|
||||||
|
>
|
||||||
|
<main class="max-w-screen-2xl mx-auto">
|
||||||
|
<div class="drawer lg:drawer-open min-h-[calc(100vh-3rem)]">
|
||||||
|
<input id="nav-drawer" type="checkbox" class="drawer-toggle" />
|
||||||
|
|
||||||
|
<div class="drawer-content flex flex-col min-w-0">
|
||||||
|
<main class="flex-1 px-4 sm:px-6 lg:px-10 py-6 lg:py-10 min-w-0">
|
||||||
|
<div class="max-w-3xl mx-auto lg:mx-0">
|
||||||
|
<div class="flex items-center justify-between mb-10">
|
||||||
|
<div
|
||||||
|
class="breadcrumbs text-xs font-mono text-base-content/35 p-0"
|
||||||
|
>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="/notes" class="hover:text-base-content/70">notes</a
|
||||||
|
>
|
||||||
|
</li>
|
||||||
|
<li class="text-base-content/60">{category}</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<label
|
||||||
|
for="nav-drawer"
|
||||||
|
class="btn btn-ghost btn-xs lg:hidden font-mono text-base-content/40 hover:text-base-content/70 border border-base-300/50"
|
||||||
|
>
|
||||||
|
<List size={11} />
|
||||||
|
nav
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-10">
|
||||||
|
<div class="flex items-baseline gap-3 mb-1">
|
||||||
|
<h1 class="text-4xl sm:text-5xl font-bold">
|
||||||
|
<span class="text-primary/40 font-mono mr-1">/</span>{
|
||||||
|
category
|
||||||
|
}
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
<p class="font-mono text-xs text-base-content/25 ml-8">
|
||||||
|
{categoryNotes.length} note{
|
||||||
|
categoryNotes.length !== 1 ? "s" : ""
|
||||||
|
}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="border-t border-base-300/40 mb-1"></div>
|
||||||
|
<ul class="divide-y divide-base-300/20">
|
||||||
|
{
|
||||||
|
categoryNotes.map((note) => (
|
||||||
|
<li>
|
||||||
|
<a
|
||||||
|
href={`/notes/${note.id}`}
|
||||||
|
class="group flex items-center gap-4 py-3 hover:bg-base-200/30 px-2 -mx-2 transition-colors"
|
||||||
|
>
|
||||||
|
<div class="flex-1 min-w-0">
|
||||||
|
<div class="flex flex-col mb-0.5">
|
||||||
|
<span class="font-semibold text-sm group-hover:text-primary transition-colors">
|
||||||
|
{note.data.title}
|
||||||
|
</span>
|
||||||
|
{note.data.description && (
|
||||||
|
<span class="text-xs text-base-content/35 truncate">
|
||||||
|
{note.data.description}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
{note.data.tags.length > 0 && (
|
||||||
|
<div class="flex flex-wrap gap-1 mt-1">
|
||||||
|
{note.data.tags.map((tag) => (
|
||||||
|
<span class="badge badge-ghost badge-xs font-mono text-base-content/30">
|
||||||
|
{tag}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="14"
|
||||||
|
height="14"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
class="text-base-content/20 group-hover:text-primary/50 shrink-0 transition-colors"
|
||||||
|
>
|
||||||
|
<path d="m9 18 6-6-6-6" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="border-t border-base-300/30 mt-12 pt-6 flex items-center justify-between font-mono text-[10px] text-base-content/25"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
href="/notes"
|
||||||
|
class="hover:text-base-content/50 transition-colors"
|
||||||
|
>
|
||||||
|
← all notes
|
||||||
|
</a>
|
||||||
|
<a href="/" class="hover:text-base-content/50 transition-colors">
|
||||||
|
~/hadi
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="drawer-side z-50">
|
||||||
|
<label
|
||||||
|
for="nav-drawer"
|
||||||
|
aria-label="close sidebar"
|
||||||
|
class="drawer-overlay"></label>
|
||||||
|
<NoteNavSidebar
|
||||||
|
client:load
|
||||||
|
notes={allNotes}
|
||||||
|
currentCategory={category}
|
||||||
|
categories={categories}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</Layout>
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
---
|
||||||
|
import Layout from "../../layouts/Layout.astro";
|
||||||
|
import { getCollection } from "astro:content";
|
||||||
|
import { getCategory } from "../../utils/notes";
|
||||||
|
import NotesSearch from "../../components/NotesSearch.svelte";
|
||||||
|
|
||||||
|
const notes = await getCollection("notes");
|
||||||
|
const sortedNotes = notes.sort(
|
||||||
|
(a, b) => b.data.publishDate.getTime() - a.data.publishDate.getTime(),
|
||||||
|
);
|
||||||
|
|
||||||
|
const searchNotes = sortedNotes.map((n) => ({
|
||||||
|
id: n.id,
|
||||||
|
title: n.data.title,
|
||||||
|
description: n.data.description,
|
||||||
|
tags: n.data.tags,
|
||||||
|
category: getCategory(n),
|
||||||
|
searchText: [n.data.title, n.data.description, n.body ?? ""]
|
||||||
|
.join(" ")
|
||||||
|
.toLowerCase(),
|
||||||
|
}));
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout
|
||||||
|
title="Infosec Notes - Another Hadi"
|
||||||
|
description="Cheatsheets on cybersecurity tools and techniques."
|
||||||
|
>
|
||||||
|
<main class="max-w-4xl mx-auto px-4 py-16 sm:py-20">
|
||||||
|
<div class="text-center mb-12">
|
||||||
|
<h1 class="text-4xl sm:text-5xl font-bold mb-4">Infosec Notes</h1>
|
||||||
|
<p class="text-xl text-base-content/70">
|
||||||
|
Cheat sheets on cybersecurity tools and techniques.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="text-xs font-mono text-base-content/25 border border-base-300/30 rounded-box px-4 py-3 mb-10 max-w-xl mx-auto text-center leading-relaxed"
|
||||||
|
>
|
||||||
|
All content is intended for educational purposes, CTF challenges, and
|
||||||
|
authorized penetration testing only. Do not use any of this against
|
||||||
|
systems you do not own or have explicit permission to test.
|
||||||
|
</div>
|
||||||
|
<NotesSearch client:load notes={searchNotes} />
|
||||||
|
</main>
|
||||||
|
</Layout>
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
---
|
|
||||||
import { getCollection, render } from "astro:content";
|
|
||||||
import ProjectLayout from "../../layouts/ProjectLayout.astro";
|
|
||||||
|
|
||||||
export async function getStaticPaths() {
|
|
||||||
const projectEntries = await getCollection("projects");
|
|
||||||
|
|
||||||
return projectEntries.map((entry) => ({
|
|
||||||
params: { slug: entry.id },
|
|
||||||
props: { entry },
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
const { entry } = Astro.props;
|
|
||||||
const { Content } = await render(entry);
|
|
||||||
---
|
|
||||||
|
|
||||||
<ProjectLayout
|
|
||||||
title={entry.data.title}
|
|
||||||
description={entry.data.description}
|
|
||||||
image={entry.data.image}
|
|
||||||
tags={entry.data.tags}
|
|
||||||
demoLink={entry.data.demoLink}
|
|
||||||
url={entry.data.url}
|
|
||||||
sourceLink={entry.data.sourceLink}
|
|
||||||
>
|
|
||||||
<Content />
|
|
||||||
</ProjectLayout>
|
|
||||||
@@ -1,11 +1,9 @@
|
|||||||
---
|
---
|
||||||
import Layout from "../../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
import { getCollection } from "astro:content";
|
import GiteaProjectCard from "../../components/GiteaProjectCard.astro";
|
||||||
import ProjectCard from "../../components/ProjectCard.astro";
|
|
||||||
import { ChevronLeft } from "@lucide/astro";
|
import { ChevronLeft } from "@lucide/astro";
|
||||||
import { ArrowRight } from "lucide-astro";
|
|
||||||
|
|
||||||
const projects = await getCollection("projects");
|
import repos from "../../data/repos.json";
|
||||||
---
|
---
|
||||||
|
|
||||||
<Layout
|
<Layout
|
||||||
@@ -13,17 +11,14 @@ const projects = await getCollection("projects");
|
|||||||
description="Explore my latest projects and work"
|
description="Explore my latest projects and work"
|
||||||
>
|
>
|
||||||
<main class="max-w-6xl mx-auto px-4 py-20">
|
<main class="max-w-6xl mx-auto px-4 py-20">
|
||||||
<!-- Header -->
|
|
||||||
<div class="text-center mb-16">
|
<div class="text-center mb-16">
|
||||||
<h1 class="text-5xl font-bold mb-4">Projects</h1>
|
<h1 class="text-5xl font-bold mb-4">Projects</h1>
|
||||||
<p class="text-xl text-base-content/70">
|
<p class="text-xl text-base-content/70">
|
||||||
I enjoy the challenge of reimagining existing programs & scripts in my
|
I enjoy the challenge of reimagining existing programs & scripts in my
|
||||||
own unique way. By creating these projects from scratch, I can ensure
|
own unique way.
|
||||||
complete control over every aspect of their design and functionality.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Back to Home -->
|
|
||||||
<div class="mb-8">
|
<div class="mb-8">
|
||||||
<a href="/" class="btn btn-ghost btn-sm">
|
<a href="/" class="btn btn-ghost btn-sm">
|
||||||
<ChevronLeft size={18} />
|
<ChevronLeft size={18} />
|
||||||
@@ -31,32 +26,20 @@ const projects = await getCollection("projects");
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Projects Grid -->
|
|
||||||
{
|
{
|
||||||
projects.length === 0 ? (
|
repos.length === 0 ? (
|
||||||
<div class="text-center py-20">
|
<div class="text-center py-20">
|
||||||
<p class="text-2xl text-base-content/60">
|
<p class="text-2xl text-base-content/60">
|
||||||
No projects yet. Check back soon!
|
No projects found. Check back soon!
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
|
||||||
{projects.map((project) => (
|
{repos.map((repo) => (
|
||||||
<ProjectCard project={project} />
|
<GiteaProjectCard repo={repo} />
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="text-center mt-12">
|
|
||||||
<a
|
|
||||||
href="https://github.com/anotherhadi"
|
|
||||||
target="_blank"
|
|
||||||
class="btn btn-ghost gap-2"
|
|
||||||
>
|
|
||||||
View All Projects
|
|
||||||
<ArrowRight class="size-4" />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</main>
|
</main>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
|||||||
+2
-15
@@ -4,7 +4,6 @@ import type { APIContext } from "astro";
|
|||||||
|
|
||||||
export async function GET(context: APIContext) {
|
export async function GET(context: APIContext) {
|
||||||
const blog = await getCollection("blog");
|
const blog = await getCollection("blog");
|
||||||
const projects = await getCollection("projects");
|
|
||||||
|
|
||||||
const blogItems = blog.map((post) => ({
|
const blogItems = blog.map((post) => ({
|
||||||
title: post.data.title,
|
title: post.data.title,
|
||||||
@@ -18,24 +17,12 @@ export async function GET(context: APIContext) {
|
|||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const projectItems = projects.map((project) => ({
|
const allItems = [...blogItems].sort(
|
||||||
title: `[Project] ${project.data.title}`,
|
|
||||||
pubDate: new Date(),
|
|
||||||
description: project.data.description,
|
|
||||||
link: `/projects/${project.id}/`,
|
|
||||||
enclosure: {
|
|
||||||
url: new URL(project.data.image.src, context.site).toString(),
|
|
||||||
length: 0,
|
|
||||||
type: "image/png",
|
|
||||||
},
|
|
||||||
}));
|
|
||||||
|
|
||||||
const allItems = [...blogItems, ...projectItems].sort(
|
|
||||||
(a, b) => b.pubDate.getTime() - a.pubDate.getTime(),
|
(a, b) => b.pubDate.getTime() - a.pubDate.getTime(),
|
||||||
);
|
);
|
||||||
|
|
||||||
return rss({
|
return rss({
|
||||||
title: "Another Hadi",
|
title: "Another Hadi - Blog posts",
|
||||||
description:
|
description:
|
||||||
"Thoughts, insights, and tutorials on cybersecurity, OSINT, and technology.",
|
"Thoughts, insights, and tutorials on cybersecurity, OSINT, and technology.",
|
||||||
site: context.site!,
|
site: context.site!,
|
||||||
|
|||||||
@@ -26,9 +26,9 @@
|
|||||||
--color-warning-content: oklch(19.359% 0.042 109.769);
|
--color-warning-content: oklch(19.359% 0.042 109.769);
|
||||||
--color-error: oklch(62.795% 0.257 29.233);
|
--color-error: oklch(62.795% 0.257 29.233);
|
||||||
--color-error-content: oklch(12.559% 0.051 29.233);
|
--color-error-content: oklch(12.559% 0.051 29.233);
|
||||||
--radius-selector: 0rem;
|
--radius-selector: 0.25rem;
|
||||||
--radius-field: 0rem;
|
--radius-field: 0.25rem;
|
||||||
--radius-box: 0rem;
|
--radius-box: 0.5rem;
|
||||||
--size-selector: 0.25rem;
|
--size-selector: 0.25rem;
|
||||||
--size-field: 0.25rem;
|
--size-field: 0.25rem;
|
||||||
--border: 1px;
|
--border: 1px;
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
export function getCategory(n: {
|
||||||
|
id: string;
|
||||||
|
data: { category?: string };
|
||||||
|
}): string {
|
||||||
|
if (n.data.category) return n.data.category;
|
||||||
|
const parts = n.id.split("/");
|
||||||
|
return parts.length > 1 ? parts[0] : "General";
|
||||||
|
}
|
||||||
|
|
||||||
|
function slugify(text: string): string {
|
||||||
|
return text
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/[^\p{L}\p{N}\s_-]/gu, "")
|
||||||
|
.trim()
|
||||||
|
.replace(/ +/g, "-");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function extractLinks(body: string): string[] {
|
||||||
|
const re = /\(\/notes\/([^)#\s]+)(?:#[^)\s]*)?\)/g;
|
||||||
|
const ids: string[] = [];
|
||||||
|
let m;
|
||||||
|
while ((m = re.exec(body)) !== null) ids.push(m[1]);
|
||||||
|
return [...new Set(ids)];
|
||||||
|
}
|
||||||
|
|
||||||
|
export function formatDate(date: Date): string {
|
||||||
|
return date.toLocaleDateString("en-US", {
|
||||||
|
month: "long",
|
||||||
|
day: "numeric",
|
||||||
|
year: "numeric",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function extractHeadings(
|
||||||
|
body: string,
|
||||||
|
): { depth: number; text: string; id: string }[] {
|
||||||
|
const headings: { depth: number; text: string; id: string }[] = [];
|
||||||
|
const re = /^(#{2,4}) (.+)$/gm;
|
||||||
|
let m;
|
||||||
|
while ((m = re.exec(body)) !== null) {
|
||||||
|
const raw = m[2]
|
||||||
|
.trim()
|
||||||
|
.replace(/`[^`]*`/g, "")
|
||||||
|
.replace(/\*\*(.*?)\*\*/g, "$1")
|
||||||
|
.replace(/(?<!\p{L}\p{N})__(.*?)__(?!\p{L}\p{N})/gu, "$1")
|
||||||
|
.replace(/\*(.*?)\*/g, "$1")
|
||||||
|
.replace(/(?<!\p{L}\p{N})_(.*?)_(?!\p{L}\p{N})/gu, "$1")
|
||||||
|
.replace(/[*]/g, "");
|
||||||
|
headings.push({ depth: m[1].length, text: raw, id: slugify(raw) });
|
||||||
|
}
|
||||||
|
return headings;
|
||||||
|
}
|
||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"extends": "astro/tsconfigs/strict",
|
"extends": "astro/tsconfigs/strict",
|
||||||
"include": [".astro/types.d.ts", "**/*"],
|
"include": [".astro/types.d.ts", "**/*"],
|
||||||
"exclude": ["dist"]
|
"exclude": ["dist", "result"]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user