diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 0e26802f..b167fa76 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -4,18 +4,19 @@ on:
branches:
- main
workflow_dispatch:
-permissions:
- contents: read
- pages: write
- id-token: write
jobs:
build:
+ permissions:
+ contents: read
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
- - uses: withastro/action@v0
+ - uses: actions/checkout@v4
+ - uses: withastro/action@v2
deploy:
needs: build
+ permissions:
+ pages: write
+ id-token: write
runs-on: ubuntu-latest
environment:
name: github-pages
@@ -23,4 +24,4 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
- uses: actions/deploy-pages@v1
+ uses: actions/deploy-pages@v4
diff --git a/package-lock.json b/package-lock.json
index 937d39bf..3057a14b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,22 +6,22 @@
"": {
"devDependencies": {
"@astrojs/rss": "^4.0.5",
- "@astrojs/sitemap": "^3.1.1",
+ "@astrojs/sitemap": "^3.1.4",
"@astrojs/tailwind": "^5.1.0",
"@astrolib/seo": "1.0.0-beta.5",
"@tailwindcss/forms": "^0.5.7",
- "@tailwindcss/typography": "^0.5.10",
- "@typescript-eslint/parser": "^7.1.0",
- "astro": "^4.4.9",
+ "@tailwindcss/typography": "^0.5.12",
+ "@typescript-eslint/parser": "^7.7.0",
+ "astro": "^4.6.3",
"astro-iconify": "^1.2.0",
- "eslint-plugin-astro": "^0.31.4",
+ "eslint-plugin-astro": "^0.34.0",
"limax": "^4.1.0",
"reading-time": "^1.5.0",
"rehype-autolink-headings": "^7.1.0",
"rehype-slug": "^6.0.0",
"remark-custom-header-id": "^0.1.0",
- "tailwindcss": "^3.4.1",
- "typescript": "^5.3.3",
+ "tailwindcss": "^3.4.3",
+ "typescript": "^5.4.5",
"xo": "^0.58.0"
},
"engines": {
@@ -192,25 +192,27 @@
}
},
"node_modules/@astrojs/compiler": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.7.0.tgz",
- "integrity": "sha512-XpC8MAaWjD1ff6/IfkRq/5k1EFj6zhCNqXRd5J43SVJEBj/Bsmizkm8N0xOYscGcDFQkRgEw6/eKnI5x/1l6aA==",
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.7.1.tgz",
+ "integrity": "sha512-/POejAYuj8WEw7ZI0J8JBvevjfp9jQ9Wmu/Bg52RiNwGXkMV7JnYpsenVfHvvf1G7R5sXHGKlTcxlQWhoUTiGQ==",
"dev": true
},
"node_modules/@astrojs/internal-helpers": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.2.1.tgz",
- "integrity": "sha512-06DD2ZnItMwUnH81LBLco3tWjcZ1lGU9rLCCBaeUCGYe9cI0wKyY2W3kDyoW1I6GmcWgt1fu+D1CTvz+FIKf8A==",
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.4.0.tgz",
+ "integrity": "sha512-6B13lz5n6BrbTqCTwhXjJXuR1sqiX/H6rTxzlXx+lN1NnV4jgnq/KJldCQaUWJzPL5SiWahQyinxAbxQtwgPHA==",
"dev": true
},
"node_modules/@astrojs/markdown-remark": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-4.2.1.tgz",
- "integrity": "sha512-2RQBIwrq+2qPYtp99bH+eL5hfbK0BoxXla85lHsRpIX/IsGqFrPX6pXI2cbWPihBwGbKCdxS6uZNX2QerZWwpQ==",
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-5.1.0.tgz",
+ "integrity": "sha512-S6Z3K2hOB7MfjeDoHsotnP/q2UsnEDB8NlNAaCjMDsGBZfTUbWxyLW3CaphEWw08f6KLZi2ibK9yC3BaMhh2NQ==",
"dev": true,
"dependencies": {
- "@astrojs/prism": "^3.0.0",
+ "@astrojs/prism": "^3.1.0",
"github-slugger": "^2.0.0",
+ "hast-util-from-html": "^2.0.0",
+ "hast-util-to-text": "^4.0.0",
"import-meta-resolve": "^4.0.0",
"mdast-util-definitions": "^6.0.0",
"rehype-raw": "^7.0.0",
@@ -219,22 +221,24 @@
"remark-parse": "^11.0.0",
"remark-rehype": "^11.0.0",
"remark-smartypants": "^2.0.0",
- "shikiji": "^0.9.18",
+ "shiki": "^1.1.2",
"unified": "^11.0.4",
+ "unist-util-remove-position": "^5.0.0",
"unist-util-visit": "^5.0.0",
+ "unist-util-visit-parents": "^6.0.0",
"vfile": "^6.0.1"
}
},
"node_modules/@astrojs/prism": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.0.0.tgz",
- "integrity": "sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.1.0.tgz",
+ "integrity": "sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==",
"dev": true,
"dependencies": {
"prismjs": "^1.29.0"
},
"engines": {
- "node": ">=18.14.1"
+ "node": "^18.17.1 || ^20.3.0 || >=21.0.0"
}
},
"node_modules/@astrojs/rss": {
@@ -248,12 +252,13 @@
}
},
"node_modules/@astrojs/sitemap": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.1.1.tgz",
- "integrity": "sha512-qPgdBIcDUaea98mTtLfi5z9oXZpzSjEn/kes70/Ex8FOZZ+DIHVKRYOLOtvy8p+FTXr/9oc7BjmIbTYmYLLJVg==",
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.1.4.tgz",
+ "integrity": "sha512-po8CqDCK14O6phU1mB5C8SyVLyQEa+7pJM8oXxs1mVh8DgvxxaA5E7lak1vzOmBcyyyHBW32jakGqNYc66sBRw==",
"dev": true,
"dependencies": {
"sitemap": "^7.1.1",
+ "stream-replace-string": "^2.0.0",
"zod": "^3.22.4"
}
},
@@ -273,36 +278,21 @@
}
},
"node_modules/@astrojs/telemetry": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.0.4.tgz",
- "integrity": "sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.1.0.tgz",
+ "integrity": "sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==",
"dev": true,
"dependencies": {
- "ci-info": "^3.8.0",
+ "ci-info": "^4.0.0",
"debug": "^4.3.4",
"dlv": "^1.1.3",
- "dset": "^3.1.2",
+ "dset": "^3.1.3",
"is-docker": "^3.0.0",
"is-wsl": "^3.0.0",
"which-pm-runs": "^1.1.0"
},
"engines": {
- "node": ">=18.14.1"
- }
- },
- "node_modules/@astrojs/telemetry/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "engines": {
- "node": ">=8"
+ "node": "^18.17.1 || ^20.3.0 || >=21.0.0"
}
},
"node_modules/@astrolib/seo": {
@@ -315,13 +305,13 @@
}
},
"node_modules/@babel/code-frame": {
- "version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
- "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
+ "version": "7.24.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz",
+ "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==",
"dev": true,
"dependencies": {
- "@babel/highlight": "^7.23.4",
- "chalk": "^2.4.2"
+ "@babel/highlight": "^7.24.2",
+ "picocolors": "^1.0.0"
},
"engines": {
"node": ">=6.9.0"
@@ -337,20 +327,20 @@
}
},
"node_modules/@babel/core": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz",
- "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==",
+ "version": "7.24.4",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz",
+ "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==",
"dev": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.23.5",
- "@babel/generator": "^7.23.6",
+ "@babel/code-frame": "^7.24.2",
+ "@babel/generator": "^7.24.4",
"@babel/helper-compilation-targets": "^7.23.6",
"@babel/helper-module-transforms": "^7.23.3",
- "@babel/helpers": "^7.24.0",
- "@babel/parser": "^7.24.0",
+ "@babel/helpers": "^7.24.4",
+ "@babel/parser": "^7.24.4",
"@babel/template": "^7.24.0",
- "@babel/traverse": "^7.24.0",
+ "@babel/traverse": "^7.24.1",
"@babel/types": "^7.24.0",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
@@ -376,14 +366,14 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.23.6",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz",
- "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
+ "version": "7.24.4",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz",
+ "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.23.6",
- "@jridgewell/gen-mapping": "^0.3.2",
- "@jridgewell/trace-mapping": "^0.3.17",
+ "@babel/types": "^7.24.0",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
"jsesc": "^2.5.1"
},
"engines": {
@@ -553,13 +543,13 @@
}
},
"node_modules/@babel/helpers": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz",
- "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==",
+ "version": "7.24.4",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz",
+ "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==",
"dev": true,
"dependencies": {
"@babel/template": "^7.24.0",
- "@babel/traverse": "^7.24.0",
+ "@babel/traverse": "^7.24.1",
"@babel/types": "^7.24.0"
},
"engines": {
@@ -567,23 +557,24 @@
}
},
"node_modules/@babel/highlight": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
- "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+ "version": "7.24.2",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz",
+ "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==",
"dev": true,
"dependencies": {
"@babel/helper-validator-identifier": "^7.22.20",
"chalk": "^2.4.2",
- "js-tokens": "^4.0.0"
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz",
- "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==",
+ "version": "7.24.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz",
+ "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@@ -641,18 +632,18 @@
}
},
"node_modules/@babel/traverse": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz",
- "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==",
+ "version": "7.24.1",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz",
+ "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==",
"dev": true,
"dependencies": {
- "@babel/code-frame": "^7.23.5",
- "@babel/generator": "^7.23.6",
+ "@babel/code-frame": "^7.24.1",
+ "@babel/generator": "^7.24.1",
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-function-name": "^7.23.0",
"@babel/helper-hoist-variables": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/parser": "^7.24.0",
+ "@babel/parser": "^7.24.1",
"@babel/types": "^7.24.0",
"debug": "^4.3.1",
"globals": "^11.1.0"
@@ -1341,12 +1332,6 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
- "node_modules/@medv/finder": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/@medv/finder/-/finder-3.2.0.tgz",
- "integrity": "sha512-JmU7JIBwyL8RAzefvzALT4sP2M0biGk8i2invAgpQmma/QgfsaqoHIvJ7S0YC8n9hUVG8X3Leul2nGa06PvhbQ==",
- "dev": true
- },
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -1573,6 +1558,12 @@
"win32"
]
},
+ "node_modules/@shikijs/core": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.3.0.tgz",
+ "integrity": "sha512-7fedsBfuILDTBmrYZNFI8B6ATTxhQAasUHllHmjvSZPnoq4bULWoTpHwmuQvZ8Aq03/tAa2IGo6RXqWtHdWaCA==",
+ "dev": true
+ },
"node_modules/@sindresorhus/merge-streams": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz",
@@ -1598,9 +1589,9 @@
}
},
"node_modules/@tailwindcss/typography": {
- "version": "0.5.10",
- "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.10.tgz",
- "integrity": "sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==",
+ "version": "0.5.12",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.12.tgz",
+ "integrity": "sha512-CNwpBpconcP7ppxmuq3qvaCxiRWnbhANpY/ruH4L5qs2GCiVDJXde/pjj2HWPV1+Q4G9+V/etrwUYopdcjAlyg==",
"dev": true,
"dependencies": {
"lodash.castarray": "^4.4.0",
@@ -1662,6 +1653,12 @@
"@babel/types": "^7.20.7"
}
},
+ "node_modules/@types/cookie": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.4.tgz",
+ "integrity": "sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==",
+ "dev": true
+ },
"node_modules/@types/debug": {
"version": "4.1.12",
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
@@ -1841,19 +1838,19 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.1.tgz",
- "integrity": "sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ==",
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.0.tgz",
+ "integrity": "sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/scope-manager": "7.1.1",
- "@typescript-eslint/types": "7.1.1",
- "@typescript-eslint/typescript-estree": "7.1.1",
- "@typescript-eslint/visitor-keys": "7.1.1",
+ "@typescript-eslint/scope-manager": "7.7.0",
+ "@typescript-eslint/types": "7.7.0",
+ "@typescript-eslint/typescript-estree": "7.7.0",
+ "@typescript-eslint/visitor-keys": "7.7.0",
"debug": "^4.3.4"
},
"engines": {
- "node": "^16.0.0 || >=18.0.0"
+ "node": "^18.18.0 || >=20.0.0"
},
"funding": {
"type": "opencollective",
@@ -1868,6 +1865,96 @@
}
}
},
+ "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": {
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz",
+ "integrity": "sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "7.7.0",
+ "@typescript-eslint/visitor-keys": "7.7.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.0.tgz",
+ "integrity": "sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz",
+ "integrity": "sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "7.7.0",
+ "@typescript-eslint/visitor-keys": "7.7.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz",
+ "integrity": "sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "7.7.0",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/parser/node_modules/minimatch": {
+ "version": "9.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
+ "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/@typescript-eslint/scope-manager": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.1.tgz",
@@ -2552,23 +2639,23 @@
}
},
"node_modules/astro": {
- "version": "4.4.15",
- "resolved": "https://registry.npmjs.org/astro/-/astro-4.4.15.tgz",
- "integrity": "sha512-RTiAnlO8hDp6GqMVvaeJxyuCJhHNEho09lHshMNQBqgRabYPOJGW0HZZrbLRGNOqN9I14ivhZIunYGgAaGQpWw==",
+ "version": "4.6.3",
+ "resolved": "https://registry.npmjs.org/astro/-/astro-4.6.3.tgz",
+ "integrity": "sha512-p2zs1Gac+ysdc/yFCoc8pOXTZE5L9foAtmqUzUVL22WX68bYTRovd03GRs7J1MDpwzsl9kJtlK20ROpjyIFpNw==",
"dev": true,
"dependencies": {
- "@astrojs/compiler": "^2.5.3",
- "@astrojs/internal-helpers": "0.2.1",
- "@astrojs/markdown-remark": "4.2.1",
- "@astrojs/telemetry": "3.0.4",
- "@babel/core": "^7.23.3",
+ "@astrojs/compiler": "^2.7.1",
+ "@astrojs/internal-helpers": "0.4.0",
+ "@astrojs/markdown-remark": "5.1.0",
+ "@astrojs/telemetry": "3.1.0",
+ "@babel/core": "^7.24.3",
"@babel/generator": "^7.23.3",
"@babel/parser": "^7.23.3",
"@babel/plugin-transform-react-jsx": "^7.22.5",
"@babel/traverse": "^7.23.3",
"@babel/types": "^7.23.3",
- "@medv/finder": "^3.1.0",
"@types/babel__core": "^7.20.4",
+ "@types/cookie": "^0.5.4",
"acorn": "^8.11.2",
"aria-query": "^5.3.0",
"axobject-query": "^4.0.0",
@@ -2598,7 +2685,6 @@
"js-yaml": "^4.1.0",
"kleur": "^4.1.4",
"magic-string": "^0.30.3",
- "mdast-util-to-hast": "13.0.2",
"mime": "^3.0.0",
"ora": "^7.0.1",
"p-limit": "^5.0.0",
@@ -2609,8 +2695,7 @@
"rehype": "^13.0.1",
"resolve": "^1.22.4",
"semver": "^7.5.4",
- "shikiji": "^0.9.19",
- "shikiji-core": "^0.9.19",
+ "shiki": "^1.1.2",
"string-width": "^7.0.0",
"strip-ansi": "^7.1.0",
"tsconfck": "^3.0.0",
@@ -2620,33 +2705,38 @@
"vitefu": "^0.2.5",
"which-pm": "^2.1.1",
"yargs-parser": "^21.1.1",
- "zod": "^3.22.4"
+ "zod": "^3.22.4",
+ "zod-to-json-schema": "^3.22.4"
},
"bin": {
"astro": "astro.js"
},
"engines": {
- "node": ">=18.14.1",
- "npm": ">=6.14.0"
+ "node": "^18.17.1 || ^20.3.0 || >=21.0.0",
+ "npm": ">=9.6.5",
+ "pnpm": ">=7.1.0"
},
"optionalDependencies": {
"sharp": "^0.32.6"
}
},
"node_modules/astro-eslint-parser": {
- "version": "0.16.3",
- "resolved": "https://registry.npmjs.org/astro-eslint-parser/-/astro-eslint-parser-0.16.3.tgz",
- "integrity": "sha512-CGaBseNtunAV2DCpwBXqTKq8+9Tw65XZetMaC0FsMoZuLj0gxNIkbCf2QyKYScVrNOU7/ayfNdVw8ZCSHBiqCg==",
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/astro-eslint-parser/-/astro-eslint-parser-0.17.0.tgz",
+ "integrity": "sha512-yTgzioUI9MKgBF4LxP7YI+uuZLrnXgHDeW4dpa3VqCNbDmPzL7ix93tc0JJIwWGcskoSAAHZZVaBSp8bHyZZZA==",
"dev": true,
"dependencies": {
"@astrojs/compiler": "^2.0.0",
"@typescript-eslint/scope-manager": "^5.0.0",
"@typescript-eslint/types": "^5.0.0",
+ "@typescript-eslint/typescript-estree": "^5.0.0",
"astrojs-compiler-sync": "^0.3.0",
"debug": "^4.3.4",
"entities": "^4.5.0",
"eslint-visitor-keys": "^3.0.0",
"espree": "^9.0.0",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
"semver": "^7.3.8"
},
"engines": {
@@ -2686,6 +2776,33 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/astro-eslint-parser/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
+ "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
"node_modules/astro-eslint-parser/node_modules/@typescript-eslint/visitor-keys": {
"version": "5.62.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
@@ -4265,9 +4382,9 @@
}
},
"node_modules/eslint-compat-utils": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.4.1.tgz",
- "integrity": "sha512-5N7ZaJG5pZxUeNNJfUchurLVrunD1xJvyg5kYOIVF8kg1f3ajTikmAu/5fZ9w100omNPOoMjngRszh/Q/uFGMg==",
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz",
+ "integrity": "sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==",
"dev": true,
"dependencies": {
"semver": "^7.5.4"
@@ -4485,16 +4602,17 @@
}
},
"node_modules/eslint-plugin-astro": {
- "version": "0.31.4",
- "resolved": "https://registry.npmjs.org/eslint-plugin-astro/-/eslint-plugin-astro-0.31.4.tgz",
- "integrity": "sha512-aU1KYSo7TdnSTBenyAWuRFB07lVUe0/6u9cltC2ZCx0QgcfC+HP7e87OkmvoKh+RZuaSsVgLG4zCOI8LZ6nS/Q==",
+ "version": "0.34.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-astro/-/eslint-plugin-astro-0.34.0.tgz",
+ "integrity": "sha512-nzw2H4g7HPXPLsWVpGUxuJ/ViVPLI8lM/AaUCJ51qTLTWtaMhvlvoe2d7yIPMFc+7xeCzQdo1POK8eR7NFsdKQ==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@jridgewell/sourcemap-codec": "^1.4.14",
"@typescript-eslint/types": "^5.25.0",
- "astro-eslint-parser": "^0.16.3",
- "eslint-compat-utils": "^0.4.0",
+ "astro-eslint-parser": "^0.17.0",
+ "eslint-compat-utils": "^0.5.0",
+ "globals": "^13.0.0",
"postcss": "^8.4.14",
"postcss-selector-parser": "^6.0.10"
},
@@ -4521,6 +4639,33 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/eslint-plugin-astro/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-plugin-astro/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/eslint-plugin-ava": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-ava/-/eslint-plugin-ava-14.0.0.tgz",
@@ -6313,6 +6458,22 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/hast-util-to-text": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz",
+ "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==",
+ "dev": true,
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "hast-util-is-element": "^3.0.0",
+ "unist-util-find-after": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/hast-util-whitespace": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
@@ -8299,9 +8460,9 @@
}
},
"node_modules/micromark-util-subtokenize": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz",
- "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz",
+ "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==",
"dev": true,
"funding": [
{
@@ -11142,21 +11303,15 @@
"node": ">=8"
}
},
- "node_modules/shikiji": {
- "version": "0.9.19",
- "resolved": "https://registry.npmjs.org/shikiji/-/shikiji-0.9.19.tgz",
- "integrity": "sha512-Kw2NHWktdcdypCj1GkKpXH4o6Vxz8B8TykPlPuLHOGSV8VkhoCLcFOH4k19K4LXAQYRQmxg+0X/eM+m2sLhAkg==",
+ "node_modules/shiki": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.3.0.tgz",
+ "integrity": "sha512-9aNdQy/etMXctnPzsje1h1XIGm9YfRcSksKOGqZWXA/qP9G18/8fpz5Bjpma8bOgz3tqIpjERAd6/lLjFyzoww==",
"dev": true,
"dependencies": {
- "shikiji-core": "0.9.19"
+ "@shikijs/core": "1.3.0"
}
},
- "node_modules/shikiji-core": {
- "version": "0.9.19",
- "resolved": "https://registry.npmjs.org/shikiji-core/-/shikiji-core-0.9.19.tgz",
- "integrity": "sha512-AFJu/vcNT21t0e6YrfadZ+9q86gvPum6iywRyt1OtIPjPFe25RQnYJyxHQPMLKCCWA992TPxmEmbNcOZCAJclw==",
- "dev": true
- },
"node_modules/side-channel": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
@@ -11386,6 +11541,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/stream-replace-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz",
+ "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==",
+ "dev": true
+ },
"node_modules/streamx": {
"version": "2.16.1",
"resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz",
@@ -11786,9 +11947,9 @@
}
},
"node_modules/tailwindcss": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz",
- "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==",
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz",
+ "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==",
"dev": true,
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
@@ -11799,7 +11960,7 @@
"fast-glob": "^3.3.0",
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
- "jiti": "^1.19.1",
+ "jiti": "^1.21.0",
"lilconfig": "^2.1.0",
"micromatch": "^4.0.5",
"normalize-path": "^3.0.0",
@@ -12134,6 +12295,27 @@
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
"dev": true
},
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
+ "node_modules/tsutils/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
"node_modules/tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -12245,9 +12427,9 @@
}
},
"node_modules/typescript": {
- "version": "5.4.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz",
- "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==",
+ "version": "5.4.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
+ "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
@@ -12334,6 +12516,20 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/unist-util-find-after": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz",
+ "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/unist-util-is": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
@@ -12380,6 +12576,20 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/unist-util-remove-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz",
+ "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/unist-util-stringify-position": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
@@ -13257,6 +13467,15 @@
"url": "https://github.com/sponsors/colinhacks"
}
},
+ "node_modules/zod-to-json-schema": {
+ "version": "3.22.5",
+ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.22.5.tgz",
+ "integrity": "sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==",
+ "dev": true,
+ "peerDependencies": {
+ "zod": "^3.22.4"
+ }
+ },
"node_modules/zwitch": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
diff --git a/package.json b/package.json
index f1fd2917..7694345c 100644
--- a/package.json
+++ b/package.json
@@ -13,22 +13,22 @@
},
"devDependencies": {
"@astrojs/rss": "^4.0.5",
- "@astrojs/sitemap": "^3.1.1",
+ "@astrojs/sitemap": "^3.1.4",
"@astrojs/tailwind": "^5.1.0",
"@astrolib/seo": "1.0.0-beta.5",
"@tailwindcss/forms": "^0.5.7",
- "@tailwindcss/typography": "^0.5.10",
- "@typescript-eslint/parser": "^7.1.0",
- "astro": "^4.4.9",
+ "@tailwindcss/typography": "^0.5.12",
+ "@typescript-eslint/parser": "^7.7.0",
+ "astro": "^4.6.3",
"astro-iconify": "^1.2.0",
- "eslint-plugin-astro": "^0.31.4",
+ "eslint-plugin-astro": "^0.34.0",
"limax": "^4.1.0",
"reading-time": "^1.5.0",
"rehype-autolink-headings": "^7.1.0",
"rehype-slug": "^6.0.0",
"remark-custom-header-id": "^0.1.0",
- "tailwindcss": "^3.4.1",
- "typescript": "^5.3.3",
+ "tailwindcss": "^3.4.3",
+ "typescript": "^5.4.5",
"xo": "^0.58.0"
},
"xo": {
diff --git a/public/apps/aiko/screenshot2.jpg b/public/apps/aiko/screenshot2.jpg
index e5b9ceca..285e6a51 100644
Binary files a/public/apps/aiko/screenshot2.jpg and b/public/apps/aiko/screenshot2.jpg differ
diff --git a/public/apps/dato/screenshot2.jpg b/public/apps/dato/screenshot2.jpg
index 085a2816..400fc66b 100644
Binary files a/public/apps/dato/screenshot2.jpg and b/public/apps/dato/screenshot2.jpg differ
diff --git a/public/apps/dato/screenshot3.jpg b/public/apps/dato/screenshot3.jpg
index 50734194..085a2816 100644
Binary files a/public/apps/dato/screenshot3.jpg and b/public/apps/dato/screenshot3.jpg differ
diff --git a/public/apps/dato/screenshot4.jpg b/public/apps/dato/screenshot4.jpg
index 400fc66b..50734194 100644
Binary files a/public/apps/dato/screenshot4.jpg and b/public/apps/dato/screenshot4.jpg differ
diff --git a/public/apps/icon-preview/icon.png b/public/apps/icon-preview/icon.png
new file mode 100644
index 00000000..0996f9d8
Binary files /dev/null and b/public/apps/icon-preview/icon.png differ
diff --git a/public/apps/icon-preview/screenshot1.jpg b/public/apps/icon-preview/screenshot1.jpg
new file mode 100644
index 00000000..77ccf3c3
Binary files /dev/null and b/public/apps/icon-preview/screenshot1.jpg differ
diff --git a/public/apps/icon-preview/screenshot2.jpg b/public/apps/icon-preview/screenshot2.jpg
new file mode 100644
index 00000000..3aec3779
Binary files /dev/null and b/public/apps/icon-preview/screenshot2.jpg differ
diff --git a/public/assets/thanks/logto-logo-dark.svg b/public/assets/thanks/logto-logo-dark.svg
index a4fd832b..37f0f1eb 100644
--- a/public/assets/thanks/logto-logo-dark.svg
+++ b/public/assets/thanks/logto-logo-dark.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/public/assets/thanks/logto-logo-light.svg b/public/assets/thanks/logto-logo-light.svg
index 986d7475..677dacab 100644
--- a/public/assets/thanks/logto-logo-light.svg
+++ b/public/assets/thanks/logto-logo-light.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/public/assets/thanks/supatool-logo-dark.png b/public/assets/thanks/supatool-logo-dark.png
new file mode 100644
index 00000000..af21a03f
Binary files /dev/null and b/public/assets/thanks/supatool-logo-dark.png differ
diff --git a/public/assets/thanks/supatool-logo-light.png b/public/assets/thanks/supatool-logo-light.png
new file mode 100644
index 00000000..4a7d9b1b
Binary files /dev/null and b/public/assets/thanks/supatool-logo-light.png differ
diff --git a/source/content/apps/ai-actions.md b/source/content/apps/ai-actions.md
index 3a5d6b07..181f3881 100644
--- a/source/content/apps/ai-actions.md
+++ b/source/content/apps/ai-actions.md
@@ -29,7 +29,7 @@ Your API key is securely stored in your keychain, not in a shortcut.
### macOS version
-The macOS version is not yet available on the App Store because App Store review is being difficult. You can get it [here](https://www.dropbox.com/scl/fi/m169s1xwyk1o6bbnixeda/AI-Actions-1.0.4-1698250306-1701611261.zip?rlkey=0i8v79urwyude0lq3elov8s1x&raw=1) for now. (Requires macOS 13+)
+The macOS version is not yet available on the App Store because App Store review is being difficult. You can get it [here](https://www.dropbox.com/scl/fi/mhdewikkt8x2n18c7dhy8/AI-Actions-1.1.0-1713560712.zip?rlkey=el7rnf7j0p85u8dus27kr6lcy&raw=1) for now. (Requires macOS 14+)
### Frequently Asked Questions {#faq}
@@ -47,7 +47,7 @@ Apple prevents any app that includes AI-related functionality from being availab
#### How is this better than the “Ask ChatGPT” action provided by the official ChatGPT app?
-This one works on macOS too, supports longer text, has customizability options for power-users, supports DALL·E 2, and will support more AI APIs in the future.
+This one works on macOS too, supports longer text, has customizability options for power-users, supports DALL·E, and will support more AI APIs in the future.
#### How is this better than just calling the OpenAI API directly from Shortcuts?
diff --git a/source/content/apps/aiko.md b/source/content/apps/aiko.md
index 59954973..77b1a57b 100644
--- a/source/content/apps/aiko.md
+++ b/source/content/apps/aiko.md
@@ -256,8 +256,6 @@ The role of the operating system (iOS/macOS) is to effectively manage the system
If your device is experiencing overheating while using the app, it's important to understand that the issue likely originates either from the operating system's inability to manage resources effectively, or from an underlying hardware problem. In either case, the app itself is not responsible for the overheating.
-The good news is that Aiko will soon take better advantage of the GPU, so CPU usage should be reduced significantly.
-
#### Can I delete some of the languages to save space?
This is unfortunately not possible. The model has all the languages stored together in a way that makes it impossible to remove just some languages.
diff --git a/source/content/apps/dato.md b/source/content/apps/dato.md
index dd1a9307..01c1434a 100644
--- a/source/content/apps/dato.md
+++ b/source/content/apps/dato.md
@@ -1,6 +1,6 @@
---
title: Dato
-subtitle: Calendar events and world clocks in your menu bar
+subtitle: Menu bar calendar and world clocks, plus fullscreen meeting notifications
pubDate: 2019-07-13
platforms:
- macOS
@@ -18,8 +18,6 @@ olderMacOSVersions:
Dato gives you a local clock, date, and multiple world clocks in the menu bar. When you click Dato in the menu bar, you get a menu with a calendar, calendar events, and world clocks. All of this is highly customizable.
-Dato supports all the locales and languages that macOS supports for the menu bar text, dates, times, and calendar, but the menus and settings are English-only.
-
[MacStories review of Dato.](https://www.macstories.net/reviews/dato-review-calendar-events-and-time-zones-from-your-macs-menu-bar/)
If all you need is another clock in the menu bar, check out [Second Clock](/second-clock).
@@ -28,7 +26,7 @@ If all you need is another clock in the menu bar, check out [Second Clock](/seco
- Calendar, optionally with week numbers and event indicators.
- Your upcoming events for the next week (customizable) at a glance.
-- Fullscreen notifications.
+- Fullscreen meeting notifications.
- Reminders support.
- Time zones in the Dato menu, optionally with custom names.
- Show the upcoming event in the menu bar (like Fantastical, Meeter, and MeetingBar)
@@ -56,7 +54,7 @@ If all you need is another clock in the menu bar, check out [Second Clock](/seco
### Trial
-There's a fully functional trial available [here](https://www.dropbox.com/scl/fi/kgycr6w33wf67n2c82u2r/Dato-5.2.9-trial-1711559727.zip?rlkey=er3i1ix1tok9cbzo9rzip413f&raw=1). The only limitation is that it will prompt you to buy Dato every 12 hours and it will not receive automatic updates. If you decide to buy Dato on the App Store, all data and settings from the trial version will be preserved (they share the same storage).
+There's a fully functional trial available [here](https://www.dropbox.com/scl/fi/yquzze7p7jd26hmlohza5/Dato-5.2.10-trial-1713884168.zip?rlkey=yzlc28c4iushp6e2ebb801wra&raw=1). The only limitation is that it will prompt you to buy Dato every 12 hours and it will not receive automatic updates. If you decide to buy Dato on the App Store, all data and settings from the trial version will be preserved (they share the same storage).
You can also [try it on Setapp](https://go.setapp.com/stp181?refAppID=571&utm_medium=vendor_program&utm_content=button) for 7 days for free.
@@ -557,7 +555,7 @@ iStat Menus lets you show different kinds of info in the menu bar, like system s
#### How is it different from Itsycal?
-Dato is not just a calendar app, but also includes menu bar clock replacement, time zones, upcoming event in menu bar, and more. Try both (see the Dato trial) and see for yourself.
+Dato is not just a calendar app, but also includes menu bar clock replacement, time zones, upcoming event in menu bar, fullscreen notifications, and a lot more. Try both (see the [Dato trial](#trial)) and see for yourself.
#### Why the name “Dato”?
diff --git a/source/content/apps/folder-peek.md b/source/content/apps/folder-peek.md
index deec02f7..ca68a114 100644
--- a/source/content/apps/folder-peek.md
+++ b/source/content/apps/folder-peek.md
@@ -136,6 +136,16 @@ Folder Peek opens the default app that handles folders, which is Finder by defau
For other apps, follow [this guide](https://binarynights.com/manual#fileviewer), but replace `com.binarynights.ForkLift-3` with the bundle identifier of the app you want.
+#### How can I hide the `…` menu item?
+
+There is a hidden setting for it. Run the following command in the Terminal app:
+
+```sh
+defaults write com.sindresorhus.Folder-Peek showFolderMoreMenu -bool false
+```
+
+You can show the `…` menu item again by pressing the Option key.
+
#### How is this better than having [folders in the Dock](https://support.apple.com/guide/mac-help/use-folders-in-the-dock-mchl231f08fb/mac)? {#dock-folders}
- Slightly faster access, since most users have the Dock automatically hidden and the menu bar always shown.
diff --git a/source/content/apps/heic-converter.md b/source/content/apps/heic-converter.md
index 44f024b1..68d2269e 100644
--- a/source/content/apps/heic-converter.md
+++ b/source/content/apps/heic-converter.md
@@ -38,6 +38,17 @@ No. JPEG only supports 8-bit. PNG supports 8-bit and 16-bit, but macOS doesn't h
No. Only `.heic` is supported at the moment because macOS support for other variants is buggy.
+#### Can you support converting JPEG to HEIC?
+
+I don't have plans to support JPEG to HEIC conversion. While HEIC offers some benefits over JPEG, I believe [JPEG XL](https://en.wikipedia.org/wiki/JPEG_XL) is a more promising next-generation image format:
+
+- Lossless conversion from JPEG to JPEG XL
+- Superior compression compared to JPEG and HEIC
+- Support for HDR, wide color gamuts, and animation
+- Royalty-free, open standard
+
+I expect JPEG XL to gain more widespread support and become the preferred format in the coming years. At that point, I plan to add JPEG XL conversion capabilities here.
+
#### Why is this free without ads?
I just enjoy making apps. Consider leaving a nice review on the App Store.
diff --git a/source/content/apps/icon-preview.md b/source/content/apps/icon-preview.md
new file mode 100644
index 00000000..06ede7fe
--- /dev/null
+++ b/source/content/apps/icon-preview.md
@@ -0,0 +1,92 @@
+---
+title: Icon Preview
+subtitle: Preview your app icon and menu bar icon
+pubDate: 2024-04-22
+platforms:
+ - macOS
+isMenuBarApp: true
+appStoreId: 6480373509
+# olderMacOSVersions:
+# - '14'
+---
+
+Preview how your macOS app icon will look in the Dock and how your menu bar item icon will appear.
+
+The icon previews update automatically when the file changes.
+
+An essential tool for developers and designers to perfect the look of their macOS app icons.
+
+
+
+### Tips
+
+#### General
+
+- Drag and drop an image onto the Dock icon or menu bar icon to preview it there.
+- Click the Dock icon to pick an icon.
+- Right-click the Dock icon while the app is running for more actions.
+- In Finder, right-click an image file, and select “Open With › Icon Preview” to set it as the Dock icon.
+
+#### Preview multiple icons
+
+You can utilize the Shortcuts app to display various icons sequentially, each for three seconds. Add [this shortcut](https://www.icloud.com/shortcuts/8824dbd68a8f4dc9a38b850dccd9179e) for app icons or [this one](https://www.icloud.com/shortcuts/72dcea993b1e4b9686003c8e01133c1b) for menu bar icons. Then, navigate to Finder, select the desired icons, right-click, and select "Quick Actions › Preview App Icons". [Preview](https://twitter.com/sindresorhus/status/1783036121234165808)
+
+#### Sketch integration {#sketch}
+
+You can drag an artboard directly from Sketch onto the Dock icon. [Preview](https://twitter.com/sindresorhus/status/1783399434182955083)
+
+There is also a [Sketch plugin](https://github.com/sindresorhus/sketch-icon-preview) that updates the Dock icon automatically when you save.
+
+
+
+### Frequently Asked Questions {#faq}
+
+#### I have a feature request, bug report, or some feedback
+
+Click the feedback button in the app or [send it here](https://sindresorhus.com/feedback?product=Icon%20Preview&referrer=Website-FAQ).
+
+#### The app does not show up in the menu bar
+
+macOS hides menu bar apps when there is no space left in the menu bar. This is a common problem on MacBooks with a notch. Try quitting some other menu bar apps to free up space. If this does not solve it, try quitting Bartender if you have it installed.
+
+#### What image formats are supported for previewing icons?
+
+It supports all common image formats like PNG, SVG, PDF, ICNS, and TIFF.
+
+#### What are the specifications for designing an app icon?
+
+See Apple's [Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/app-icons).
+
+#### What are the specifications for designing a menu bar icon?
+
+See [this blog post](https://bjango.com/articles/designingmenubarextras/).
+
+#### Can you localize the app into my language?
+
+I do not plan to localize the app.
+
+#### Why is this free without ads?
+
+I just enjoy making apps. I earn money on other apps. Consider leaving a nice review on the App Store.
+
+#### Where can I find the changelog?
+
+Go [here](https://apps.apple.com/app/id6480373509) and click “Version History”.
+
+#### [More FAQs…](/apps/faq)
+
+
+
+
+
+### Non-App Store Version
+
+A special version for users that cannot access the App Store. It won't receive automatic updates. I will update it here once a year.
+
+[Download](https://www.dropbox.com/scl/fi/es1i81vkvj6kte8cfcg5r/Icon-Preview-1.0.1-1713811687.zip?rlkey=9i68vqe75upb87eod66nv5244&raw=1) *(1.0.1)*
+
+*Requires macOS 14 or later*
diff --git a/source/content/apps/menu-bar-calendar.md b/source/content/apps/menu-bar-calendar.md
index c74c6bb5..b871ec9c 100644
--- a/source/content/apps/menu-bar-calendar.md
+++ b/source/content/apps/menu-bar-calendar.md
@@ -26,6 +26,8 @@ The calendar displays dates and days in your language, but the rest of the app i
- **Close calendar window:** Press the esc key.
- **Open date in the Calendar app:** Click a date in the calendar.
- **Open week in the Calendar app:** Click a week number in the calendar.
+- **Create new event on a specific day:** Right-click the day the calendar.
+- **Copy the date for a day in the calendar:** Right-click the day the calendar.
diff --git a/source/pages/apps/faq.md b/source/pages/apps/faq.md
index 9b50627f..ce2ebf2c 100644
--- a/source/pages/apps/faq.md
+++ b/source/pages/apps/faq.md
@@ -87,6 +87,14 @@ No, I don't plan to localize my apps. Localization adds complexity and maintenan
I open source [some of my apps](https://github.com/search?q=user%3Asindresorhus+language%3Aswift+topic%3Aapp+archived%3Afalse), but not all, for a few key reasons. First, I use specialized tools (internal framework) to speed up app development, which are not suitable for sharing. Additionally, past experiences with open sourcing apps have led to clones of my apps appearing on the App Store, which is problematic. Also, community contributions, though well-intentioned, often don't match the high quality standards I set for my apps. As a compromise, I tend to open source the [reusable building blocks](https://github.com/search?q=user%3Asindresorhus+topic%3Aswift-package+archived%3Afalse), allowing community involvement while maintaining the quality and uniqueness of my apps.
+### How can I uninstall your app? {#uninstall-app}
+
+macOS: Ensure the app is not running. Open Finder, go to the “Go” menu, and select “Applications”. Find the app and drag it into the trash.
+
+iOS: Tap and hold the app on the Home Screen and select “Remove App”.
+
+*If you're uninstalling due to issues, please [contact me](/feedback) first; I resolve problems quickly.*
+
### I'm having a problem with your app {#app-problem}
Here are some things you could try:
diff --git a/source/pages/feedback.astro b/source/pages/feedback.astro
index 9db93e00..3162366e 100644
--- a/source/pages/feedback.astro
+++ b/source/pages/feedback.astro
@@ -25,7 +25,7 @@ const inputCSS = 'block p-2.5 w-full text-lg text-gray-900 bg-gray-50 rounded-lg