@smbcloud / fatapp-web / commits / 0f53fd9

initial commit

Seto committed Oct 18, 2025 at 18:36 UTC 0f53fd9a579e77b5a7187012203c4741857dfafb
90 files changed +10444
.github/dependabot.yml new
+30
@@ -0,0 +1,30 @@
1 +version: 2
2 +updates:
3 + # Enable npm (pnpm) dependency updates
4 + - package-ecosystem: 'npm'
5 + directory: '/'
6 + schedule:
7 + # Check for updates every Monday at 09:00 (Asia/Shanghai)
8 + interval: 'weekly'
9 + day: 'monday'
10 + time: '09:00'
11 + timezone: 'Asia/Shanghai'
12 + # Limit the number of open PRs created by Dependabot
13 + open-pull-requests-limit: 10
14 + commit-message:
15 + # Use 'chore' as the commit message prefix
16 + prefix: 'chore'
17 + include: 'scope'
18 + # Labels to add to Dependabot PRs
19 + labels:
20 + - 'dependencies'
21 + - 'automated'
22 + ignore:
23 + # Ignore major version updates (breaking changes)
24 + - dependency-name: '*'
25 + update-types: ['version-update:semver-major']
26 + allow:
27 + # Allow updates for development dependencies
28 + - dependency-type: 'development'
29 + # Allow updates for direct dependencies
30 + - dependency-type: 'direct'
.github/workflows/ci.yml new
+56
@@ -0,0 +1,56 @@
1 +name: CI
2 +
3 +on:
4 + push:
5 + branches: [main, master]
6 + pull_request:
7 + branches: [main, master]
8 +
9 +jobs:
10 + # Validate dependencies and build
11 + validate:
12 + runs-on: ubuntu-latest
13 + steps:
14 + - name: Checkout code
15 + uses: actions/checkout@v4
16 +
17 + - name: Setup pnpm
18 + uses: pnpm/action-setup@v4
19 + with:
20 + version: latest
21 +
22 + - name: Setup Node.js
23 + uses: actions/setup-node@v4
24 + with:
25 + node-version: 'latest'
26 + cache: 'pnpm'
27 +
28 + - name: Install dependencies
29 + run: pnpm install --frozen-lockfile
30 +
31 + - name: Run linting
32 + run: pnpm lint
33 +
34 + - name: Build project
35 + run: pnpm build
36 +
37 + # Auto-merge Dependabot PRs
38 + auto-merge:
39 + if: |
40 + github.event_name == 'pull_request' &&
41 + github.actor == 'dependabot[bot]' &&
42 + contains(github.event.pull_request.labels.*.name, 'dependencies')
43 + needs: validate
44 + runs-on: ubuntu-latest
45 + permissions:
46 + contents: write
47 + pull-requests: write
48 + steps:
49 + - name: Checkout code
50 + uses: actions/checkout@v4
51 +
52 + - name: Enable auto-merge for Dependabot PRs
53 + run: |
54 + gh pr merge --auto --squash "${{ github.event.pull_request.number }}"
55 + env:
56 + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
.gitignore new
+26
@@ -0,0 +1,26 @@
1 +# Build output
2 +dist/
3 +.output/
4 +
5 +# Generated types
6 +.astro/
7 +
8 +# Dependencies
9 +node_modules/
10 +
11 +# Logs
12 +npm-debug.log*
13 +yarn-debug.log*
14 +yarn-error.log*
15 +pnpm-debug.log*
16 +
17 +# Environment variables
18 +.env
19 +.env.production
20 +
21 +# macOS-specific files
22 +.DS_Store
23 +
24 +# IDE settings
25 +.idea/
26 +
.prettierignore new
+40
@@ -0,0 +1,40 @@
1 +# Build output
2 +dist/
3 +.output/
4 +
5 +# Dependencies
6 +node_modules/
7 +
8 +# Package manager files
9 +package-lock.json
10 +yarn.lock
11 +pnpm-lock.yaml
12 +
13 +# Log files
14 +*.log
15 +
16 +# Environment variables
17 +.env
18 +.env.*
19 +
20 +# Cache directories
21 +.cache/
22 +.astro/
23 +
24 +# Others
25 +.DS_Store
26 +coverage/
27 +
28 +# Media files
29 +*.png
30 +*.jpg
31 +*.jpeg
32 +*.gif
33 +*.svg
34 +*.ico
35 +*.webp
36 +*.mp4
37 +*.webm
38 +*.mp3
39 +*.wav
40 +*.pdf
\ No newline at end of file
.prettierrc new
+8
@@ -0,0 +1,8 @@
1 +{
2 + "plugins": ["prettier-plugin-astro"],
3 + "semi": false,
4 + "singleQuote": true,
5 + "trailingComma": "none",
6 + "printWidth": 100,
7 + "tabWidth": 2
8 +}
.smb/config.toml new
+11
@@ -0,0 +1,11 @@
1 +
2 +name = "pepakbasajawaweb"
3 +description = "pepakbasajawaweb"
4 +[project]
5 +id = 25
6 +name = "pepakbasajawaweb"
7 +runner = 0
8 +repository = "pepakbasajawaweb"
9 +description = "pepakbasajawaweb"
10 +created_at = "2025-07-12T09:52:43.117655+00:00"
11 +updated_at = "2025-07-12T09:52:43.117655+00:00"
.vscode/extensions.json new
+4
@@ -0,0 +1,4 @@
1 +{
2 + "recommendations": ["astro-build.astro-vscode", "unifiedjs.vscode-mdx"],
3 + "unwantedRecommendations": []
4 +}
.vscode/launch.json new
+11
@@ -0,0 +1,11 @@
1 +{
2 + "version": "0.2.0",
3 + "configurations": [
4 + {
5 + "command": "./node_modules/.bin/astro dev",
6 + "name": "Development server",
7 + "request": "launch",
8 + "type": "node-terminal"
9 + }
10 + ]
11 +}
LICENSE new
+21
@@ -0,0 +1,21 @@
1 +MIT License
2 +
3 +Copyright (c) 2025 FatApp
4 +
5 +Permission is hereby granted, free of charge, to any person obtaining a copy
6 +of this software and associated documentation files (the "Software"), to deal
7 +in the Software without restriction, including without limitation the rights
8 +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 +copies of the Software, and to permit persons to whom the Software is
10 +furnished to do so, subject to the following conditions:
11 +
12 +The above copyright notice and this permission notice shall be included in all
13 +copies or substantial portions of the Software.
14 +
15 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 +SOFTWARE.
README.md new
+11
@@ -0,0 +1,11 @@
1 +# FatApp
2 +
3 +4.5+ Star Restaurants.
4 +
5 +## Deploy on smbCloud
6 +
7 +[![Deploy to smbCloud](https://github.com/smbcloudXYZ/smbcloud-cli/blob/development/deploy.svg)](https://smbcloud.xyz)
8 +
9 +## License
10 +
11 +MIT
astro.config.ts new
+65
@@ -0,0 +1,65 @@
1 +import { defineConfig } from 'astro/config'
2 +import mdx from '@astrojs/mdx'
3 +import sitemap from '@astrojs/sitemap'
4 +import remarkMath from 'remark-math'
5 +import remarkDirective from 'remark-directive'
6 +import rehypeKatex from 'rehype-katex'
7 +import remarkEmbeddedMedia from './src/plugins/remark-embedded-media.mjs'
8 +import remarkReadingTime from './src/plugins/remark-reading-time.mjs'
9 +import rehypeCleanup from './src/plugins/rehype-cleanup.mjs'
10 +import rehypeImageProcessor from './src/plugins/rehype-image-processor.mjs'
11 +import rehypeCopyCode from './src/plugins/rehype-copy-code.mjs'
12 +import remarkTOC from './src/plugins/remark-toc.mjs'
13 +import { SITE } from './src/config'
14 +import path from 'path'
15 +
16 +import tailwindcss from '@tailwindcss/vite';
17 +
18 +export default defineConfig({
19 + site: SITE.website,
20 + devToolbar: {
21 + enabled: false
22 + },
23 + output: 'static',
24 + build: {
25 + inlineStylesheets: 'auto'
26 + },
27 + image: {
28 + service: {
29 + entrypoint: 'astro/assets/services/sharp'
30 + }
31 + },
32 + markdown: {
33 + shikiConfig: {
34 + theme: 'css-variables',
35 + wrap: false
36 + },
37 + remarkPlugins: [remarkMath, remarkDirective, remarkEmbeddedMedia, remarkReadingTime, remarkTOC],
38 + rehypePlugins: [rehypeKatex, rehypeCleanup, rehypeImageProcessor, rehypeCopyCode]
39 + },
40 + integrations: [mdx(), sitemap()],
41 + vite: {
42 + resolve: {
43 + alias: {
44 + '@': path.resolve('./src')
45 + }
46 + },
47 +
48 + build: {
49 + rollupOptions: {
50 + output: {
51 + manualChunks: {
52 + 'vendor-katex': ['katex'],
53 + 'vendor-utils': ['reading-time', 'mdast-util-to-string']
54 + }
55 + }
56 + }
57 + },
58 +
59 + optimizeDeps: {
60 + include: ['katex', 'reading-time']
61 + },
62 +
63 + plugins: [tailwindcss()]
64 + }
65 +})
\ No newline at end of file
eslint.config.js new
+41
@@ -0,0 +1,41 @@
1 +import eslint from '@eslint/js'
2 +import globals from 'globals'
3 +import tseslint from 'typescript-eslint'
4 +import prettier from 'eslint-config-prettier'
5 +import eslintPluginAstro from 'eslint-plugin-astro'
6 +
7 +export default [
8 + eslint.configs.recommended,
9 + ...tseslint.configs.recommended,
10 + ...eslintPluginAstro.configs.recommended,
11 + {
12 + languageOptions: {
13 + globals: {
14 + ...globals.browser,
15 + ...globals.node
16 + }
17 + }
18 + },
19 + {
20 + rules: {
21 + 'no-console': ['warn', { allow: ['warn', 'error'] }],
22 + '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }],
23 + '@typescript-eslint/no-explicit-any': 'warn',
24 + 'astro/no-set-html-directive': 'off'
25 + }
26 + },
27 + prettier,
28 + {
29 + ignores: [
30 + 'dist/**',
31 + '.output/**',
32 + 'node_modules/**',
33 + '*.log',
34 + '.env*',
35 + '.cache/**',
36 + '.astro/**',
37 + '.DS_Store',
38 + 'coverage/**'
39 + ]
40 + }
41 +]
package.json new
+48
@@ -0,0 +1,48 @@
1 +{
2 + "name": "pepakbasajawa-web",
3 + "type": "module",
4 + "version": "0.5.0",
5 + "license": "MIT",
6 + "scripts": {
7 + "dev": "astro dev",
8 + "build": "astro build",
9 + "preview": "astro preview",
10 + "astro": "astro",
11 + "lint": "eslint .",
12 + "lint:fix": "eslint . --fix",
13 + "format": "prettier --write .",
14 + "format:check": "prettier --check .",
15 + "new": "tsx scripts/new-post.ts",
16 + "update-theme": "tsx scripts/update-theme.ts",
17 + "start-pepakbasajawaweb": "astro start -p 5002"
18 + },
19 + "dependencies": {
20 + "@astrojs/mdx": "^4.3.7",
21 + "@astrojs/sitemap": "^3.6.0",
22 + "@tailwindcss/vite": "^4.1.14",
23 + "astro": "^5.14.6",
24 + "katex": "^0.16.25",
25 + "mdast-util-to-string": "^4.0.0",
26 + "reading-time": "^1.5.0",
27 + "rehype-katex": "^7.0.1",
28 + "remark-directive": "^4.0.0",
29 + "remark-math": "^6.0.0",
30 + "sharp": "^0.34.4",
31 + "tailwindcss": "^4.1.14",
32 + "unist-util-visit": "^5.0.0"
33 + },
34 + "devDependencies": {
35 + "@eslint/js": "^9.38.0",
36 + "@typescript-eslint/eslint-plugin": "^8.46.1",
37 + "@typescript-eslint/parser": "^8.46.1",
38 + "eslint": "^9.38.0",
39 + "eslint-config-prettier": "^10.1.8",
40 + "eslint-plugin-astro": "^1.3.1",
41 + "globals": "^16.4.0",
42 + "prettier": "^3.6.2",
43 + "prettier-plugin-astro": "^0.14.1",
44 + "tsx": "^4.20.6",
45 + "typescript": "^5.9.3",
46 + "typescript-eslint": "^8.46.1"
47 + }
48 +}
pnpm-lock.yaml new
+5305
@@ -0,0 +1,5305 @@
1 +lockfileVersion: '9.0'
2 +
3 +settings:
4 + autoInstallPeers: true
5 + excludeLinksFromLockfile: false
6 +
7 +importers:
8 +
9 + .:
10 + dependencies:
11 + '@astrojs/mdx':
12 + specifier: ^4.3.7
13 + version: 4.3.7(astro@5.14.6(@types/node@24.8.1)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.52.5)(tsx@4.20.6)(typescript@5.9.3))
14 + '@astrojs/sitemap':
15 + specifier: ^3.6.0
16 + version: 3.6.0
17 + '@tailwindcss/vite':
18 + specifier: ^4.1.14
19 + version: 4.1.14(vite@6.4.0(@types/node@24.8.1)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.6))
20 + astro:
21 + specifier: ^5.14.6
22 + version: 5.14.6(@types/node@24.8.1)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.52.5)(tsx@4.20.6)(typescript@5.9.3)
23 + katex:
24 + specifier: ^0.16.25
25 + version: 0.16.25
26 + mdast-util-to-string:
27 + specifier: ^4.0.0
28 + version: 4.0.0
29 + reading-time:
30 + specifier: ^1.5.0
31 + version: 1.5.0
32 + rehype-katex:
33 + specifier: ^7.0.1
34 + version: 7.0.1
35 + remark-directive:
36 + specifier: ^4.0.0
37 + version: 4.0.0
38 + remark-math:
39 + specifier: ^6.0.0
40 + version: 6.0.0
41 + sharp:
42 + specifier: ^0.34.4
43 + version: 0.34.4
44 + tailwindcss:
45 + specifier: ^4.1.14
46 + version: 4.1.14
47 + unist-util-visit:
48 + specifier: ^5.0.0
49 + version: 5.0.0
50 + devDependencies:
51 + '@eslint/js':
52 + specifier: ^9.38.0
53 + version: 9.38.0
54 + '@typescript-eslint/eslint-plugin':
55 + specifier: ^8.46.1
56 + version: 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)
57 + '@typescript-eslint/parser':
58 + specifier: ^8.46.1
59 + version: 8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)
60 + eslint:
61 + specifier: ^9.38.0
62 + version: 9.38.0(jiti@2.6.1)
63 + eslint-config-prettier:
64 + specifier: ^10.1.8
65 + version: 10.1.8(eslint@9.38.0(jiti@2.6.1))
66 + eslint-plugin-astro:
67 + specifier: ^1.3.1
68 + version: 1.3.1(eslint@9.38.0(jiti@2.6.1))
69 + globals:
70 + specifier: ^16.4.0
71 + version: 16.4.0
72 + prettier:
73 + specifier: ^3.6.2
74 + version: 3.6.2
75 + prettier-plugin-astro:
76 + specifier: ^0.14.1
77 + version: 0.14.1
78 + tsx:
79 + specifier: ^4.20.6
80 + version: 4.20.6
81 + typescript:
82 + specifier: ^5.9.3
83 + version: 5.9.3
84 + typescript-eslint:
85 + specifier: ^8.46.1
86 + version: 8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)
87 +
88 +packages:
89 +
90 + '@astrojs/compiler@2.13.0':
91 + resolution: {integrity: sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==}
92 +
93 + '@astrojs/internal-helpers@0.7.4':
94 + resolution: {integrity: sha512-lDA9MqE8WGi7T/t2BMi+EAXhs4Vcvr94Gqx3q15cFEz8oFZMO4/SFBqYr/UcmNlvW+35alowkVj+w9VhLvs5Cw==}
95 +
96 + '@astrojs/markdown-remark@6.3.8':
97 + resolution: {integrity: sha512-uFNyFWadnULWK2cOw4n0hLKeu+xaVWeuECdP10cQ3K2fkybtTlhb7J7TcScdjmS8Yps7oje9S/ehYMfZrhrgCg==}
98 +
99 + '@astrojs/mdx@4.3.7':
100 + resolution: {integrity: sha512-5SRmvMyT/UMWaU2eoD+htnXtE2mUZZEH2K/nEzhuEy+iCsOSuS/DUry59WuKUJRQETi1mgJFdNR4dZLJHYVuRA==}
101 + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0}
102 + peerDependencies:
103 + astro: ^5.0.0
104 +
105 + '@astrojs/prism@3.3.0':
106 + resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==}
107 + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0}
108 +
109 + '@astrojs/sitemap@3.6.0':
110 + resolution: {integrity: sha512-4aHkvcOZBWJigRmMIAJwRQXBS+ayoP5z40OklTXYXhUDhwusz+DyDl+nSshY6y9DvkVEavwNcFO8FD81iGhXjg==}
111 +
112 + '@astrojs/telemetry@3.3.0':
113 + resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==}
114 + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0}
115 +
116 + '@babel/helper-string-parser@7.27.1':
117 + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
118 + engines: {node: '>=6.9.0'}
119 +
120 + '@babel/helper-validator-identifier@7.27.1':
121 + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
122 + engines: {node: '>=6.9.0'}
123 +
124 + '@babel/parser@7.28.4':
125 + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==}
126 + engines: {node: '>=6.0.0'}
127 + hasBin: true
128 +
129 + '@babel/types@7.28.4':
130 + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==}
131 + engines: {node: '>=6.9.0'}
132 +
133 + '@capsizecss/unpack@3.0.0':
134 + resolution: {integrity: sha512-+ntATQe1AlL7nTOYjwjj6w3299CgRot48wL761TUGYpYgAou3AaONZazp0PKZyCyWhudWsjhq1nvRHOvbMzhTA==}
135 + engines: {node: '>=18'}
136 +
137 + '@emnapi/runtime@1.5.0':
138 + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==}
139 +
140 + '@esbuild/aix-ppc64@0.25.11':
141 + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==}
142 + engines: {node: '>=18'}
143 + cpu: [ppc64]
144 + os: [aix]
145 +
146 + '@esbuild/android-arm64@0.25.11':
147 + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==}
148 + engines: {node: '>=18'}
149 + cpu: [arm64]
150 + os: [android]
151 +
152 + '@esbuild/android-arm@0.25.11':
153 + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==}
154 + engines: {node: '>=18'}
155 + cpu: [arm]
156 + os: [android]
157 +
158 + '@esbuild/android-x64@0.25.11':
159 + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==}
160 + engines: {node: '>=18'}
161 + cpu: [x64]
162 + os: [android]
163 +
164 + '@esbuild/darwin-arm64@0.25.11':
165 + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==}
166 + engines: {node: '>=18'}
167 + cpu: [arm64]
168 + os: [darwin]
169 +
170 + '@esbuild/darwin-x64@0.25.11':
171 + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==}
172 + engines: {node: '>=18'}
173 + cpu: [x64]
174 + os: [darwin]
175 +
176 + '@esbuild/freebsd-arm64@0.25.11':
177 + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==}
178 + engines: {node: '>=18'}
179 + cpu: [arm64]
180 + os: [freebsd]
181 +
182 + '@esbuild/freebsd-x64@0.25.11':
183 + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==}
184 + engines: {node: '>=18'}
185 + cpu: [x64]
186 + os: [freebsd]
187 +
188 + '@esbuild/linux-arm64@0.25.11':
189 + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==}
190 + engines: {node: '>=18'}
191 + cpu: [arm64]
192 + os: [linux]
193 +
194 + '@esbuild/linux-arm@0.25.11':
195 + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==}
196 + engines: {node: '>=18'}
197 + cpu: [arm]
198 + os: [linux]
199 +
200 + '@esbuild/linux-ia32@0.25.11':
201 + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==}
202 + engines: {node: '>=18'}
203 + cpu: [ia32]
204 + os: [linux]
205 +
206 + '@esbuild/linux-loong64@0.25.11':
207 + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==}
208 + engines: {node: '>=18'}
209 + cpu: [loong64]
210 + os: [linux]
211 +
212 + '@esbuild/linux-mips64el@0.25.11':
213 + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==}
214 + engines: {node: '>=18'}
215 + cpu: [mips64el]
216 + os: [linux]
217 +
218 + '@esbuild/linux-ppc64@0.25.11':
219 + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==}
220 + engines: {node: '>=18'}
221 + cpu: [ppc64]
222 + os: [linux]
223 +
224 + '@esbuild/linux-riscv64@0.25.11':
225 + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==}
226 + engines: {node: '>=18'}
227 + cpu: [riscv64]
228 + os: [linux]
229 +
230 + '@esbuild/linux-s390x@0.25.11':
231 + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==}
232 + engines: {node: '>=18'}
233 + cpu: [s390x]
234 + os: [linux]
235 +
236 + '@esbuild/linux-x64@0.25.11':
237 + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==}
238 + engines: {node: '>=18'}
239 + cpu: [x64]
240 + os: [linux]
241 +
242 + '@esbuild/netbsd-arm64@0.25.11':
243 + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==}
244 + engines: {node: '>=18'}
245 + cpu: [arm64]
246 + os: [netbsd]
247 +
248 + '@esbuild/netbsd-x64@0.25.11':
249 + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==}
250 + engines: {node: '>=18'}
251 + cpu: [x64]
252 + os: [netbsd]
253 +
254 + '@esbuild/openbsd-arm64@0.25.11':
255 + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==}
256 + engines: {node: '>=18'}
257 + cpu: [arm64]
258 + os: [openbsd]
259 +
260 + '@esbuild/openbsd-x64@0.25.11':
261 + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==}
262 + engines: {node: '>=18'}
263 + cpu: [x64]
264 + os: [openbsd]
265 +
266 + '@esbuild/openharmony-arm64@0.25.11':
267 + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==}
268 + engines: {node: '>=18'}
269 + cpu: [arm64]
270 + os: [openharmony]
271 +
272 + '@esbuild/sunos-x64@0.25.11':
273 + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==}
274 + engines: {node: '>=18'}
275 + cpu: [x64]
276 + os: [sunos]
277 +
278 + '@esbuild/win32-arm64@0.25.11':
279 + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==}
280 + engines: {node: '>=18'}
281 + cpu: [arm64]
282 + os: [win32]
283 +
284 + '@esbuild/win32-ia32@0.25.11':
285 + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==}
286 + engines: {node: '>=18'}
287 + cpu: [ia32]
288 + os: [win32]
289 +
290 + '@esbuild/win32-x64@0.25.11':
291 + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==}
292 + engines: {node: '>=18'}
293 + cpu: [x64]
294 + os: [win32]
295 +
296 + '@eslint-community/eslint-utils@4.9.0':
297 + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==}
298 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
299 + peerDependencies:
300 + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
301 +
302 + '@eslint-community/regexpp@4.12.1':
303 + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
304 + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
305 +
306 + '@eslint/config-array@0.21.1':
307 + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==}
308 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
309 +
310 + '@eslint/config-helpers@0.4.1':
311 + resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==}
312 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
313 +
314 + '@eslint/core@0.16.0':
315 + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==}
316 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
317 +
318 + '@eslint/eslintrc@3.3.1':
319 + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
320 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
321 +
322 + '@eslint/js@9.38.0':
323 + resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==}
324 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
325 +
326 + '@eslint/object-schema@2.1.7':
327 + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==}
328 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
329 +
330 + '@eslint/plugin-kit@0.4.0':
331 + resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==}
332 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
333 +
334 + '@humanfs/core@0.19.1':
335 + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
336 + engines: {node: '>=18.18.0'}
337 +
338 + '@humanfs/node@0.16.7':
339 + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==}
340 + engines: {node: '>=18.18.0'}
341 +
342 + '@humanwhocodes/module-importer@1.0.1':
343 + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
344 + engines: {node: '>=12.22'}
345 +
346 + '@humanwhocodes/retry@0.4.3':
347 + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
348 + engines: {node: '>=18.18'}
349 +
350 + '@img/colour@1.0.0':
351 + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==}
352 + engines: {node: '>=18'}
353 +
354 + '@img/sharp-darwin-arm64@0.34.4':
355 + resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==}
356 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
357 + cpu: [arm64]
358 + os: [darwin]
359 +
360 + '@img/sharp-darwin-x64@0.34.4':
361 + resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==}
362 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
363 + cpu: [x64]
364 + os: [darwin]
365 +
366 + '@img/sharp-libvips-darwin-arm64@1.2.3':
367 + resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==}
368 + cpu: [arm64]
369 + os: [darwin]
370 +
371 + '@img/sharp-libvips-darwin-x64@1.2.3':
372 + resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==}
373 + cpu: [x64]
374 + os: [darwin]
375 +
376 + '@img/sharp-libvips-linux-arm64@1.2.3':
377 + resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==}
378 + cpu: [arm64]
379 + os: [linux]
380 +
381 + '@img/sharp-libvips-linux-arm@1.2.3':
382 + resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==}
383 + cpu: [arm]
384 + os: [linux]
385 +
386 + '@img/sharp-libvips-linux-ppc64@1.2.3':
387 + resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==}
388 + cpu: [ppc64]
389 + os: [linux]
390 +
391 + '@img/sharp-libvips-linux-s390x@1.2.3':
392 + resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==}
393 + cpu: [s390x]
394 + os: [linux]
395 +
396 + '@img/sharp-libvips-linux-x64@1.2.3':
397 + resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==}
398 + cpu: [x64]
399 + os: [linux]
400 +
401 + '@img/sharp-libvips-linuxmusl-arm64@1.2.3':
402 + resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==}
403 + cpu: [arm64]
404 + os: [linux]
405 +
406 + '@img/sharp-libvips-linuxmusl-x64@1.2.3':
407 + resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==}
408 + cpu: [x64]
409 + os: [linux]
410 +
411 + '@img/sharp-linux-arm64@0.34.4':
412 + resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==}
413 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
414 + cpu: [arm64]
415 + os: [linux]
416 +
417 + '@img/sharp-linux-arm@0.34.4':
418 + resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==}
419 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
420 + cpu: [arm]
421 + os: [linux]
422 +
423 + '@img/sharp-linux-ppc64@0.34.4':
424 + resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==}
425 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
426 + cpu: [ppc64]
427 + os: [linux]
428 +
429 + '@img/sharp-linux-s390x@0.34.4':
430 + resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==}
431 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
432 + cpu: [s390x]
433 + os: [linux]
434 +
435 + '@img/sharp-linux-x64@0.34.4':
436 + resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==}
437 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
438 + cpu: [x64]
439 + os: [linux]
440 +
441 + '@img/sharp-linuxmusl-arm64@0.34.4':
442 + resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==}
443 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
444 + cpu: [arm64]
445 + os: [linux]
446 +
447 + '@img/sharp-linuxmusl-x64@0.34.4':
448 + resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==}
449 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
450 + cpu: [x64]
451 + os: [linux]
452 +
453 + '@img/sharp-wasm32@0.34.4':
454 + resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==}
455 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
456 + cpu: [wasm32]
457 +
458 + '@img/sharp-win32-arm64@0.34.4':
459 + resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==}
460 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
461 + cpu: [arm64]
462 + os: [win32]
463 +
464 + '@img/sharp-win32-ia32@0.34.4':
465 + resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==}
466 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
467 + cpu: [ia32]
468 + os: [win32]
469 +
470 + '@img/sharp-win32-x64@0.34.4':
471 + resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==}
472 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
473 + cpu: [x64]
474 + os: [win32]
475 +
476 + '@isaacs/fs-minipass@4.0.1':
477 + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
478 + engines: {node: '>=18.0.0'}
479 +
480 + '@jridgewell/gen-mapping@0.3.13':
481 + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
482 +
483 + '@jridgewell/remapping@2.3.5':
484 + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
485 +
486 + '@jridgewell/resolve-uri@3.1.2':
487 + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
488 + engines: {node: '>=6.0.0'}
489 +
490 + '@jridgewell/sourcemap-codec@1.5.5':
491 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
492 +
493 + '@jridgewell/trace-mapping@0.3.31':
494 + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
495 +
496 + '@mdx-js/mdx@3.1.1':
497 + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==}
498 +
499 + '@nodelib/fs.scandir@2.1.5':
500 + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
501 + engines: {node: '>= 8'}
502 +
503 + '@nodelib/fs.stat@2.0.5':
504 + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
505 + engines: {node: '>= 8'}
506 +
507 + '@nodelib/fs.walk@1.2.8':
508 + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
509 + engines: {node: '>= 8'}
510 +
511 + '@oslojs/encoding@1.1.0':
512 + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==}
513 +
514 + '@pkgr/core@0.2.9':
515 + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==}
516 + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
517 +
518 + '@rollup/pluginutils@5.3.0':
519 + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==}
520 + engines: {node: '>=14.0.0'}
521 + peerDependencies:
522 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
523 + peerDependenciesMeta:
524 + rollup:
525 + optional: true
526 +
527 + '@rollup/rollup-android-arm-eabi@4.52.5':
528 + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==}
529 + cpu: [arm]
530 + os: [android]
531 +
532 + '@rollup/rollup-android-arm64@4.52.5':
533 + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==}
534 + cpu: [arm64]
535 + os: [android]
536 +
537 + '@rollup/rollup-darwin-arm64@4.52.5':
538 + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==}
539 + cpu: [arm64]
540 + os: [darwin]
541 +
542 + '@rollup/rollup-darwin-x64@4.52.5':
543 + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==}
544 + cpu: [x64]
545 + os: [darwin]
546 +
547 + '@rollup/rollup-freebsd-arm64@4.52.5':
548 + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==}
549 + cpu: [arm64]
550 + os: [freebsd]
551 +
552 + '@rollup/rollup-freebsd-x64@4.52.5':
553 + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==}
554 + cpu: [x64]
555 + os: [freebsd]
556 +
557 + '@rollup/rollup-linux-arm-gnueabihf@4.52.5':
558 + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==}
559 + cpu: [arm]
560 + os: [linux]
561 +
562 + '@rollup/rollup-linux-arm-musleabihf@4.52.5':
563 + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==}
564 + cpu: [arm]
565 + os: [linux]
566 +
567 + '@rollup/rollup-linux-arm64-gnu@4.52.5':
568 + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==}
569 + cpu: [arm64]
570 + os: [linux]
571 +
572 + '@rollup/rollup-linux-arm64-musl@4.52.5':
573 + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==}
574 + cpu: [arm64]
575 + os: [linux]
576 +
577 + '@rollup/rollup-linux-loong64-gnu@4.52.5':
578 + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==}
579 + cpu: [loong64]
580 + os: [linux]
581 +
582 + '@rollup/rollup-linux-ppc64-gnu@4.52.5':
583 + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==}
584 + cpu: [ppc64]
585 + os: [linux]
586 +
587 + '@rollup/rollup-linux-riscv64-gnu@4.52.5':
588 + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==}
589 + cpu: [riscv64]
590 + os: [linux]
591 +
592 + '@rollup/rollup-linux-riscv64-musl@4.52.5':
593 + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==}
594 + cpu: [riscv64]
595 + os: [linux]
596 +
597 + '@rollup/rollup-linux-s390x-gnu@4.52.5':
598 + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==}
599 + cpu: [s390x]
600 + os: [linux]
601 +
602 + '@rollup/rollup-linux-x64-gnu@4.52.5':
603 + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==}
604 + cpu: [x64]
605 + os: [linux]
606 +
607 + '@rollup/rollup-linux-x64-musl@4.52.5':
608 + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==}
609 + cpu: [x64]
610 + os: [linux]
611 +
612 + '@rollup/rollup-openharmony-arm64@4.52.5':
613 + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==}
614 + cpu: [arm64]
615 + os: [openharmony]
616 +
617 + '@rollup/rollup-win32-arm64-msvc@4.52.5':
618 + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==}
619 + cpu: [arm64]
620 + os: [win32]
621 +
622 + '@rollup/rollup-win32-ia32-msvc@4.52.5':
623 + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==}
624 + cpu: [ia32]
625 + os: [win32]
626 +
627 + '@rollup/rollup-win32-x64-gnu@4.52.5':
628 + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==}
629 + cpu: [x64]
630 + os: [win32]
631 +
632 + '@rollup/rollup-win32-x64-msvc@4.52.5':
633 + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==}
634 + cpu: [x64]
635 + os: [win32]
636 +
637 + '@shikijs/core@3.13.0':
638 + resolution: {integrity: sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA==}
639 +
640 + '@shikijs/engine-javascript@3.13.0':
641 + resolution: {integrity: sha512-Ty7xv32XCp8u0eQt8rItpMs6rU9Ki6LJ1dQOW3V/56PKDcpvfHPnYFbsx5FFUP2Yim34m/UkazidamMNVR4vKg==}
642 +
643 + '@shikijs/engine-oniguruma@3.13.0':
644 + resolution: {integrity: sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==}
645 +
646 + '@shikijs/langs@3.13.0':
647 + resolution: {integrity: sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==}
648 +
649 + '@shikijs/themes@3.13.0':
650 + resolution: {integrity: sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==}
651 +
652 + '@shikijs/types@3.13.0':
653 + resolution: {integrity: sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==}
654 +
655 + '@shikijs/vscode-textmate@10.0.2':
656 + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
657 +
658 + '@swc/helpers@0.5.17':
659 + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==}
660 +
661 + '@tailwindcss/node@4.1.14':
662 + resolution: {integrity: sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==}
663 +
664 + '@tailwindcss/oxide-android-arm64@4.1.14':
665 + resolution: {integrity: sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==}
666 + engines: {node: '>= 10'}
667 + cpu: [arm64]
668 + os: [android]
669 +
670 + '@tailwindcss/oxide-darwin-arm64@4.1.14':
671 + resolution: {integrity: sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==}
672 + engines: {node: '>= 10'}
673 + cpu: [arm64]
674 + os: [darwin]
675 +
676 + '@tailwindcss/oxide-darwin-x64@4.1.14':
677 + resolution: {integrity: sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==}
678 + engines: {node: '>= 10'}
679 + cpu: [x64]
680 + os: [darwin]
681 +
682 + '@tailwindcss/oxide-freebsd-x64@4.1.14':
683 + resolution: {integrity: sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==}
684 + engines: {node: '>= 10'}
685 + cpu: [x64]
686 + os: [freebsd]
687 +
688 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14':
689 + resolution: {integrity: sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==}
690 + engines: {node: '>= 10'}
691 + cpu: [arm]
692 + os: [linux]
693 +
694 + '@tailwindcss/oxide-linux-arm64-gnu@4.1.14':
695 + resolution: {integrity: sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==}
696 + engines: {node: '>= 10'}
697 + cpu: [arm64]
698 + os: [linux]
699 +
700 + '@tailwindcss/oxide-linux-arm64-musl@4.1.14':
701 + resolution: {integrity: sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==}
702 + engines: {node: '>= 10'}
703 + cpu: [arm64]
704 + os: [linux]
705 +
706 + '@tailwindcss/oxide-linux-x64-gnu@4.1.14':
707 + resolution: {integrity: sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==}
708 + engines: {node: '>= 10'}
709 + cpu: [x64]
710 + os: [linux]
711 +
712 + '@tailwindcss/oxide-linux-x64-musl@4.1.14':
713 + resolution: {integrity: sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==}
714 + engines: {node: '>= 10'}
715 + cpu: [x64]
716 + os: [linux]
717 +
718 + '@tailwindcss/oxide-wasm32-wasi@4.1.14':
719 + resolution: {integrity: sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==}
720 + engines: {node: '>=14.0.0'}
721 + cpu: [wasm32]
722 + bundledDependencies:
723 + - '@napi-rs/wasm-runtime'
724 + - '@emnapi/core'
725 + - '@emnapi/runtime'
726 + - '@tybys/wasm-util'
727 + - '@emnapi/wasi-threads'
728 + - tslib
729 +
730 + '@tailwindcss/oxide-win32-arm64-msvc@4.1.14':
731 + resolution: {integrity: sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==}
732 + engines: {node: '>= 10'}
733 + cpu: [arm64]
734 + os: [win32]
735 +
736 + '@tailwindcss/oxide-win32-x64-msvc@4.1.14':
737 + resolution: {integrity: sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==}
738 + engines: {node: '>= 10'}
739 + cpu: [x64]
740 + os: [win32]
741 +
742 + '@tailwindcss/oxide@4.1.14':
743 + resolution: {integrity: sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==}
744 + engines: {node: '>= 10'}
745 +
746 + '@tailwindcss/vite@4.1.14':
747 + resolution: {integrity: sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA==}
748 + peerDependencies:
749 + vite: ^5.2.0 || ^6 || ^7
750 +
751 + '@types/debug@4.1.12':
752 + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
753 +
754 + '@types/estree-jsx@1.0.5':
755 + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
756 +
757 + '@types/estree@1.0.8':
758 + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
759 +
760 + '@types/fontkit@2.0.8':
761 + resolution: {integrity: sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==}
762 +
763 + '@types/hast@3.0.4':
764 + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
765 +
766 + '@types/json-schema@7.0.15':
767 + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
768 +
769 + '@types/katex@0.16.7':
770 + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==}
771 +
772 + '@types/mdast@4.0.4':
773 + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
774 +
775 + '@types/mdx@2.0.13':
776 + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==}
777 +
778 + '@types/ms@2.1.0':
779 + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
780 +
781 + '@types/nlcst@2.0.3':
782 + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==}
783 +
784 + '@types/node@17.0.45':
785 + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
786 +
787 + '@types/node@24.8.1':
788 + resolution: {integrity: sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==}
789 +
790 + '@types/sax@1.2.7':
791 + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
792 +
793 + '@types/unist@2.0.11':
794 + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
795 +
796 + '@types/unist@3.0.3':
797 + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
798 +
799 + '@typescript-eslint/eslint-plugin@8.46.1':
800 + resolution: {integrity: sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==}
801 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
802 + peerDependencies:
803 + '@typescript-eslint/parser': ^8.46.1
804 + eslint: ^8.57.0 || ^9.0.0
805 + typescript: '>=4.8.4 <6.0.0'
806 +
807 + '@typescript-eslint/parser@8.46.1':
808 + resolution: {integrity: sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==}
809 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
810 + peerDependencies:
811 + eslint: ^8.57.0 || ^9.0.0
812 + typescript: '>=4.8.4 <6.0.0'
813 +
814 + '@typescript-eslint/project-service@8.46.1':
815 + resolution: {integrity: sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==}
816 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
817 + peerDependencies:
818 + typescript: '>=4.8.4 <6.0.0'
819 +
820 + '@typescript-eslint/scope-manager@8.46.1':
821 + resolution: {integrity: sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==}
822 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
823 +
824 + '@typescript-eslint/tsconfig-utils@8.46.1':
825 + resolution: {integrity: sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==}
826 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
827 + peerDependencies:
828 + typescript: '>=4.8.4 <6.0.0'
829 +
830 + '@typescript-eslint/type-utils@8.46.1':
831 + resolution: {integrity: sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==}
832 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
833 + peerDependencies:
834 + eslint: ^8.57.0 || ^9.0.0
835 + typescript: '>=4.8.4 <6.0.0'
836 +
837 + '@typescript-eslint/types@8.46.1':
838 + resolution: {integrity: sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==}
839 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
840 +
841 + '@typescript-eslint/typescript-estree@8.46.1':
842 + resolution: {integrity: sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==}
843 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
844 + peerDependencies:
845 + typescript: '>=4.8.4 <6.0.0'
846 +
847 + '@typescript-eslint/utils@8.46.1':
848 + resolution: {integrity: sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==}
849 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
850 + peerDependencies:
851 + eslint: ^8.57.0 || ^9.0.0
852 + typescript: '>=4.8.4 <6.0.0'
853 +
854 + '@typescript-eslint/visitor-keys@8.46.1':
855 + resolution: {integrity: sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==}
856 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
857 +
858 + '@ungap/structured-clone@1.3.0':
859 + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
860 +
861 + acorn-jsx@5.3.2:
862 + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
863 + peerDependencies:
864 + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
865 +
866 + acorn@8.15.0:
867 + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
868 + engines: {node: '>=0.4.0'}
869 + hasBin: true
870 +
871 + ajv@6.12.6:
872 + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
873 +
874 + ansi-align@3.0.1:
875 + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
876 +
877 + ansi-regex@5.0.1:
878 + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
879 + engines: {node: '>=8'}
880 +
881 + ansi-regex@6.2.2:
882 + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
883 + engines: {node: '>=12'}
884 +
885 + ansi-styles@4.3.0:
886 + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
887 + engines: {node: '>=8'}
888 +
889 + ansi-styles@6.2.3:
890 + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
891 + engines: {node: '>=12'}
892 +
893 + anymatch@3.1.3:
894 + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
895 + engines: {node: '>= 8'}
896 +
897 + arg@5.0.2:
898 + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
899 +
900 + argparse@2.0.1:
901 + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
902 +
903 + aria-query@5.3.2:
904 + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
905 + engines: {node: '>= 0.4'}
906 +
907 + array-iterate@2.0.1:
908 + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==}
909 +
910 + astring@1.9.0:
911 + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
912 + hasBin: true
913 +
914 + astro-eslint-parser@1.2.2:
915 + resolution: {integrity: sha512-JepyLROIad6f44uyqMF6HKE2QbunNzp3mYKRcPoDGt0QkxXmH222FAFC64WTyQu2Kg8NNEXHTN/sWuUId9sSxw==}
916 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
917 +
918 + astro@5.14.6:
919 + resolution: {integrity: sha512-MSdjKt2W2a56x868DqDWgbfw4D689/8EGhHG4465h7eivTI237u1aBx4iJvgI6WfgdUE61+coAvMjUkEvOWbpA==}
920 + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'}
921 + hasBin: true
922 +
923 + astrojs-compiler-sync@1.1.1:
924 + resolution: {integrity: sha512-0mKvB9sDQRIZPsEJadw6OaFbGJ92cJPPR++ICca9XEyiUAZqgVuk25jNmzHPT0KF80rI94trSZrUR5iHFXGGOQ==}
925 + engines: {node: ^18.18.0 || >=20.9.0}
926 + peerDependencies:
927 + '@astrojs/compiler': '>=0.27.0'
928 +
929 + axobject-query@4.1.0:
930 + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
931 + engines: {node: '>= 0.4'}
932 +
933 + bail@2.0.2:
934 + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
935 +
936 + balanced-match@1.0.2:
937 + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
938 +
939 + base-64@1.0.0:
940 + resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==}
941 +
942 + base64-js@1.5.1:
943 + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
944 +
945 + boxen@8.0.1:
946 + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==}
947 + engines: {node: '>=18'}
948 +
949 + brace-expansion@1.1.12:
950 + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
951 +
952 + brace-expansion@2.0.2:
953 + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
954 +
955 + braces@3.0.3:
956 + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
957 + engines: {node: '>=8'}
958 +
959 + brotli@1.3.3:
960 + resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==}
961 +
962 + callsites@3.1.0:
963 + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
964 + engines: {node: '>=6'}
965 +
966 + camelcase@8.0.0:
967 + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==}
968 + engines: {node: '>=16'}
969 +
970 + ccount@2.0.1:
971 + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
972 +
973 + chalk@4.1.2:
974 + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
975 + engines: {node: '>=10'}
976 +
977 + chalk@5.6.2:
978 + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
979 + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
980 +
981 + character-entities-html4@2.1.0:
982 + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
983 +
984 + character-entities-legacy@3.0.0:
985 + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
986 +
987 + character-entities@2.0.2:
988 + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
989 +
990 + character-reference-invalid@2.0.1:
991 + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
992 +
993 + chokidar@4.0.3:
994 + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
995 + engines: {node: '>= 14.16.0'}
996 +
997 + chownr@3.0.0:
998 + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
999 + engines: {node: '>=18'}
1000 +
1001 + ci-info@4.3.1:
1002 + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==}
1003 + engines: {node: '>=8'}
1004 +
1005 + cli-boxes@3.0.0:
1006 + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
1007 + engines: {node: '>=10'}
1008 +
1009 + clone@2.1.2:
1010 + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
1011 + engines: {node: '>=0.8'}
1012 +
1013 + clsx@2.1.1:
1014 + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
1015 + engines: {node: '>=6'}
1016 +
1017 + collapse-white-space@2.1.0:
1018 + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==}
1019 +
1020 + color-convert@2.0.1:
1021 + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
1022 + engines: {node: '>=7.0.0'}
1023 +
1024 + color-name@1.1.4:
1025 + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
1026 +
1027 + comma-separated-tokens@2.0.3:
1028 + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
1029 +
1030 + commander@8.3.0:
1031 + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
1032 + engines: {node: '>= 12'}
1033 +
1034 + common-ancestor-path@1.0.1:
1035 + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==}
1036 +
1037 + concat-map@0.0.1:
1038 + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
1039 +
1040 + cookie-es@1.2.2:
1041 + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==}
1042 +
1043 + cookie@1.0.2:
1044 + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==}
1045 + engines: {node: '>=18'}
1046 +
1047 + cross-spawn@7.0.6:
1048 + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
1049 + engines: {node: '>= 8'}
1050 +
1051 + crossws@0.3.5:
1052 + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==}
1053 +
1054 + css-tree@3.1.0:
1055 + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==}
1056 + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
1057 +
1058 + cssesc@3.0.0:
1059 + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
1060 + engines: {node: '>=4'}
1061 + hasBin: true
1062 +
1063 + debug@4.4.3:
1064 + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
1065 + engines: {node: '>=6.0'}
1066 + peerDependencies:
1067 + supports-color: '*'
1068 + peerDependenciesMeta:
1069 + supports-color:
1070 + optional: true
1071 +
1072 + decode-named-character-reference@1.2.0:
1073 + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==}
1074 +
1075 + deep-is@0.1.4:
1076 + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
1077 +
1078 + defu@6.1.4:
1079 + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
1080 +
1081 + dequal@2.0.3:
1082 + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
1083 + engines: {node: '>=6'}
1084 +
1085 + destr@2.0.5:
1086 + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
1087 +
1088 + detect-libc@2.1.2:
1089 + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
1090 + engines: {node: '>=8'}
1091 +
1092 + deterministic-object-hash@2.0.2:
1093 + resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==}
1094 + engines: {node: '>=18'}
1095 +
1096 + devalue@5.4.1:
1097 + resolution: {integrity: sha512-YtoaOfsqjbZQKGIMRYDWKjUmSB4VJ/RElB+bXZawQAQYAo4xu08GKTMVlsZDTF6R2MbAgjcAQRPI5eIyRAT2OQ==}
1098 +
1099 + devlop@1.1.0:
1100 + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
1101 +
1102 + dfa@1.2.0:
1103 + resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==}
1104 +
1105 + diff@5.2.0:
1106 + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
1107 + engines: {node: '>=0.3.1'}
1108 +
1109 + dlv@1.1.3:
1110 + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
1111 +
1112 + dset@3.1.4:
1113 + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==}
1114 + engines: {node: '>=4'}
1115 +
1116 + emoji-regex@10.6.0:
1117 + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
1118 +
1119 + emoji-regex@8.0.0:
1120 + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
1121 +
1122 + enhanced-resolve@5.18.3:
1123 + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==}
1124 + engines: {node: '>=10.13.0'}
1125 +
1126 + entities@6.0.1:
1127 + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
1128 + engines: {node: '>=0.12'}
1129 +
1130 + es-module-lexer@1.7.0:
1131 + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
1132 +
1133 + esast-util-from-estree@2.0.0:
1134 + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==}
1135 +
1136 + esast-util-from-js@2.0.1:
1137 + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==}
1138 +
1139 + esbuild@0.25.11:
1140 + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==}
1141 + engines: {node: '>=18'}
1142 + hasBin: true
1143 +
1144 + escape-string-regexp@4.0.0:
1145 + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
1146 + engines: {node: '>=10'}
1147 +
1148 + escape-string-regexp@5.0.0:
1149 + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
1150 + engines: {node: '>=12'}
1151 +
1152 + eslint-compat-utils@0.6.5:
1153 + resolution: {integrity: sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==}
1154 + engines: {node: '>=12'}
1155 + peerDependencies:
1156 + eslint: '>=6.0.0'
1157 +
1158 + eslint-config-prettier@10.1.8:
1159 + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==}
1160 + hasBin: true
1161 + peerDependencies:
1162 + eslint: '>=7.0.0'
1163 +
1164 + eslint-plugin-astro@1.3.1:
1165 + resolution: {integrity: sha512-2XaLCMQm8htW1UvJvy1Zcmg8l0ziskitiUfJTn/w1Mk7r4Mxj0fZeNpN6UTNrm64XBIXSa5h8UCGrg8mdu47+g==}
1166 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1167 + peerDependencies:
1168 + eslint: '>=8.57.0'
1169 +
1170 + eslint-scope@8.4.0:
1171 + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
1172 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1173 +
1174 + eslint-visitor-keys@3.4.3:
1175 + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
1176 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1177 +
1178 + eslint-visitor-keys@4.2.1:
1179 + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
1180 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1181 +
1182 + eslint@9.38.0:
1183 + resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==}
1184 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1185 + hasBin: true
1186 + peerDependencies:
1187 + jiti: '*'
1188 + peerDependenciesMeta:
1189 + jiti:
1190 + optional: true
1191 +
1192 + espree@10.4.0:
1193 + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
1194 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1195 +
1196 + esquery@1.6.0:
1197 + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
1198 + engines: {node: '>=0.10'}
1199 +
1200 + esrecurse@4.3.0:
1201 + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
1202 + engines: {node: '>=4.0'}
1203 +
1204 + estraverse@5.3.0:
1205 + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
1206 + engines: {node: '>=4.0'}
1207 +
1208 + estree-util-attach-comments@3.0.0:
1209 + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==}
1210 +
1211 + estree-util-build-jsx@3.0.1:
1212 + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==}
1213 +
1214 + estree-util-is-identifier-name@3.0.0:
1215 + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==}
1216 +
1217 + estree-util-scope@1.0.0:
1218 + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==}
1219 +
1220 + estree-util-to-js@2.0.0:
1221 + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==}
1222 +
1223 + estree-util-visit@2.0.0:
1224 + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==}
1225 +
1226 + estree-walker@2.0.2:
1227 + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
1228 +
1229 + estree-walker@3.0.3:
1230 + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
1231 +
1232 + esutils@2.0.3:
1233 + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
1234 + engines: {node: '>=0.10.0'}
1235 +
1236 + eventemitter3@5.0.1:
1237 + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
1238 +
1239 + extend@3.0.2:
1240 + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
1241 +
1242 + fast-deep-equal@3.1.3:
1243 + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
1244 +
1245 + fast-glob@3.3.3:
1246 + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
1247 + engines: {node: '>=8.6.0'}
1248 +
1249 + fast-json-stable-stringify@2.1.0:
1250 + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
1251 +
1252 + fast-levenshtein@2.0.6:
1253 + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
1254 +
1255 + fastq@1.19.1:
1256 + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
1257 +
1258 + fdir@6.5.0:
1259 + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
1260 + engines: {node: '>=12.0.0'}
1261 + peerDependencies:
1262 + picomatch: ^3 || ^4
1263 + peerDependenciesMeta:
1264 + picomatch:
1265 + optional: true
1266 +
1267 + file-entry-cache@8.0.0:
1268 + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
1269 + engines: {node: '>=16.0.0'}
1270 +
1271 + fill-range@7.1.1:
1272 + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
1273 + engines: {node: '>=8'}
1274 +
1275 + find-up@5.0.0:
1276 + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
1277 + engines: {node: '>=10'}
1278 +
1279 + flat-cache@4.0.1:
1280 + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
1281 + engines: {node: '>=16'}
1282 +
1283 + flatted@3.3.3:
1284 + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
1285 +
1286 + flattie@1.1.1:
1287 + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==}
1288 + engines: {node: '>=8'}
1289 +
1290 + fontace@0.3.1:
1291 + resolution: {integrity: sha512-9f5g4feWT1jWT8+SbL85aLIRLIXUaDygaM2xPXRmzPYxrOMNok79Lr3FGJoKVNKibE0WCunNiEVG2mwuE+2qEg==}
1292 +
1293 + fontkit@2.0.4:
1294 + resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==}
1295 +
1296 + fsevents@2.3.3:
1297 + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
1298 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
1299 + os: [darwin]
1300 +
1301 + get-east-asian-width@1.4.0:
1302 + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==}
1303 + engines: {node: '>=18'}
1304 +
1305 + get-tsconfig@4.12.0:
1306 + resolution: {integrity: sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==}
1307 +
1308 + github-slugger@2.0.0:
1309 + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==}
1310 +
1311 + glob-parent@5.1.2:
1312 + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
1313 + engines: {node: '>= 6'}
1314 +
1315 + glob-parent@6.0.2:
1316 + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
1317 + engines: {node: '>=10.13.0'}
1318 +
1319 + globals@14.0.0:
1320 + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
1321 + engines: {node: '>=18'}
1322 +
1323 + globals@15.15.0:
1324 + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
1325 + engines: {node: '>=18'}
1326 +
1327 + globals@16.4.0:
1328 + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==}
1329 + engines: {node: '>=18'}
1330 +
1331 + graceful-fs@4.2.11:
1332 + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
1333 +
1334 + graphemer@1.4.0:
1335 + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
1336 +
1337 + h3@1.15.4:
1338 + resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==}
1339 +
1340 + has-flag@4.0.0:
1341 + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
1342 + engines: {node: '>=8'}
1343 +
1344 + hast-util-from-dom@5.0.1:
1345 + resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==}
1346 +
1347 + hast-util-from-html-isomorphic@2.0.0:
1348 + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==}
1349 +
1350 + hast-util-from-html@2.0.3:
1351 + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==}
1352 +
1353 + hast-util-from-parse5@8.0.3:
1354 + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==}
1355 +
1356 + hast-util-is-element@3.0.0:
1357 + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==}
1358 +
1359 + hast-util-parse-selector@4.0.0:
1360 + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
1361 +
1362 + hast-util-raw@9.1.0:
1363 + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==}
1364 +
1365 + hast-util-to-estree@3.1.3:
1366 + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==}
1367 +
1368 + hast-util-to-html@9.0.5:
1369 + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==}
1370 +
1371 + hast-util-to-jsx-runtime@2.3.6:
1372 + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==}
1373 +
1374 + hast-util-to-parse5@8.0.0:
1375 + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==}
1376 +
1377 + hast-util-to-text@4.0.2:
1378 + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==}
1379 +
1380 + hast-util-whitespace@3.0.0:
1381 + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
1382 +
1383 + hastscript@9.0.1:
1384 + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==}
1385 +
1386 + html-escaper@3.0.3:
1387 + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
1388 +
1389 + html-void-elements@3.0.0:
1390 + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
1391 +
1392 + http-cache-semantics@4.2.0:
1393 + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
1394 +
1395 + ignore@5.3.2:
1396 + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
1397 + engines: {node: '>= 4'}
1398 +
1399 + ignore@7.0.5:
1400 + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
1401 + engines: {node: '>= 4'}
1402 +
1403 + import-fresh@3.3.1:
1404 + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
1405 + engines: {node: '>=6'}
1406 +
1407 + import-meta-resolve@4.2.0:
1408 + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==}
1409 +
1410 + imurmurhash@0.1.4:
1411 + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
1412 + engines: {node: '>=0.8.19'}
1413 +
1414 + inline-style-parser@0.2.4:
1415 + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==}
1416 +
1417 + iron-webcrypto@1.2.1:
1418 + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==}
1419 +
1420 + is-alphabetical@2.0.1:
1421 + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
1422 +
1423 + is-alphanumerical@2.0.1:
1424 + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
1425 +
1426 + is-decimal@2.0.1:
1427 + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
1428 +
1429 + is-docker@3.0.0:
1430 + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
1431 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
1432 + hasBin: true
1433 +
1434 + is-extglob@2.1.1:
1435 + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
1436 + engines: {node: '>=0.10.0'}
1437 +
1438 + is-fullwidth-code-point@3.0.0:
1439 + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
1440 + engines: {node: '>=8'}
1441 +
1442 + is-glob@4.0.3:
1443 + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
1444 + engines: {node: '>=0.10.0'}
1445 +
1446 + is-hexadecimal@2.0.1:
1447 + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
1448 +
1449 + is-inside-container@1.0.0:
1450 + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
1451 + engines: {node: '>=14.16'}
1452 + hasBin: true
1453 +
1454 + is-number@7.0.0:
1455 + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
1456 + engines: {node: '>=0.12.0'}
1457 +
1458 + is-plain-obj@4.1.0:
1459 + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
1460 + engines: {node: '>=12'}
1461 +
1462 + is-wsl@3.1.0:
1463 + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
1464 + engines: {node: '>=16'}
1465 +
1466 + isexe@2.0.0:
1467 + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
1468 +
1469 + jiti@2.6.1:
1470 + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
1471 + hasBin: true
1472 +
1473 + js-yaml@4.1.0:
1474 + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
1475 + hasBin: true
1476 +
1477 + json-buffer@3.0.1:
1478 + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
1479 +
1480 + json-schema-traverse@0.4.1:
1481 + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
1482 +
1483 + json-stable-stringify-without-jsonify@1.0.1:
1484 + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
1485 +
1486 + katex@0.16.25:
1487 + resolution: {integrity: sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q==}
1488 + hasBin: true
1489 +
1490 + keyv@4.5.4:
1491 + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
1492 +
1493 + kleur@3.0.3:
1494 + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
1495 + engines: {node: '>=6'}
1496 +
1497 + kleur@4.1.5:
1498 + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
1499 + engines: {node: '>=6'}
1500 +
1501 + levn@0.4.1:
1502 + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
1503 + engines: {node: '>= 0.8.0'}
1504 +
1505 + lightningcss-darwin-arm64@1.30.1:
1506 + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==}
1507 + engines: {node: '>= 12.0.0'}
1508 + cpu: [arm64]
1509 + os: [darwin]
1510 +
1511 + lightningcss-darwin-x64@1.30.1:
1512 + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==}
1513 + engines: {node: '>= 12.0.0'}
1514 + cpu: [x64]
1515 + os: [darwin]
1516 +
1517 + lightningcss-freebsd-x64@1.30.1:
1518 + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==}
1519 + engines: {node: '>= 12.0.0'}
1520 + cpu: [x64]
1521 + os: [freebsd]
1522 +
1523 + lightningcss-linux-arm-gnueabihf@1.30.1:
1524 + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==}
1525 + engines: {node: '>= 12.0.0'}
1526 + cpu: [arm]
1527 + os: [linux]
1528 +
1529 + lightningcss-linux-arm64-gnu@1.30.1:
1530 + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==}
1531 + engines: {node: '>= 12.0.0'}
1532 + cpu: [arm64]
1533 + os: [linux]
1534 +
1535 + lightningcss-linux-arm64-musl@1.30.1:
1536 + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==}
1537 + engines: {node: '>= 12.0.0'}
1538 + cpu: [arm64]
1539 + os: [linux]
1540 +
1541 + lightningcss-linux-x64-gnu@1.30.1:
1542 + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==}
1543 + engines: {node: '>= 12.0.0'}
1544 + cpu: [x64]
1545 + os: [linux]
1546 +
1547 + lightningcss-linux-x64-musl@1.30.1:
1548 + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==}
1549 + engines: {node: '>= 12.0.0'}
1550 + cpu: [x64]
1551 + os: [linux]
1552 +
1553 + lightningcss-win32-arm64-msvc@1.30.1:
1554 + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==}
1555 + engines: {node: '>= 12.0.0'}
1556 + cpu: [arm64]
1557 + os: [win32]
1558 +
1559 + lightningcss-win32-x64-msvc@1.30.1:
1560 + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==}
1561 + engines: {node: '>= 12.0.0'}
1562 + cpu: [x64]
1563 + os: [win32]
1564 +
1565 + lightningcss@1.30.1:
1566 + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==}
1567 + engines: {node: '>= 12.0.0'}
1568 +
1569 + locate-path@6.0.0:
1570 + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
1571 + engines: {node: '>=10'}
1572 +
1573 + lodash.merge@4.6.2:
1574 + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
1575 +
1576 + longest-streak@3.1.0:
1577 + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
1578 +
1579 + lru-cache@10.4.3:
1580 + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
1581 +
1582 + magic-string@0.30.19:
1583 + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==}
1584 +
1585 + magicast@0.3.5:
1586 + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
1587 +
1588 + markdown-extensions@2.0.0:
1589 + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==}
1590 + engines: {node: '>=16'}
1591 +
1592 + markdown-table@3.0.4:
1593 + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
1594 +
1595 + mdast-util-definitions@6.0.0:
1596 + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==}
1597 +
1598 + mdast-util-directive@3.1.0:
1599 + resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==}
1600 +
1601 + mdast-util-find-and-replace@3.0.2:
1602 + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==}
1603 +
1604 + mdast-util-from-markdown@2.0.2:
1605 + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==}
1606 +
1607 + mdast-util-gfm-autolink-literal@2.0.1:
1608 + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
1609 +
1610 + mdast-util-gfm-footnote@2.1.0:
1611 + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==}
1612 +
1613 + mdast-util-gfm-strikethrough@2.0.0:
1614 + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
1615 +
1616 + mdast-util-gfm-table@2.0.0:
1617 + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
1618 +
1619 + mdast-util-gfm-task-list-item@2.0.0:
1620 + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
1621 +
1622 + mdast-util-gfm@3.1.0:
1623 + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==}
1624 +
1625 + mdast-util-math@3.0.0:
1626 + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==}
1627 +
1628 + mdast-util-mdx-expression@2.0.1:
1629 + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==}
1630 +
1631 + mdast-util-mdx-jsx@3.2.0:
1632 + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==}
1633 +
1634 + mdast-util-mdx@3.0.0:
1635 + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==}
1636 +
1637 + mdast-util-mdxjs-esm@2.0.1:
1638 + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==}
1639 +
1640 + mdast-util-phrasing@4.1.0:
1641 + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
1642 +
1643 + mdast-util-to-hast@13.2.0:
1644 + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==}
1645 +
1646 + mdast-util-to-markdown@2.1.2:
1647 + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==}
1648 +
1649 + mdast-util-to-string@4.0.0:
1650 + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
1651 +
1652 + mdn-data@2.12.2:
1653 + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==}
1654 +
1655 + merge2@1.4.1:
1656 + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
1657 + engines: {node: '>= 8'}
1658 +
1659 + micromark-core-commonmark@2.0.3:
1660 + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
1661 +
1662 + micromark-extension-directive@4.0.0:
1663 + resolution: {integrity: sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==}
1664 +
1665 + micromark-extension-gfm-autolink-literal@2.1.0:
1666 + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
1667 +
1668 + micromark-extension-gfm-footnote@2.1.0:
1669 + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==}
1670 +
1671 + micromark-extension-gfm-strikethrough@2.1.0:
1672 + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
1673 +
1674 + micromark-extension-gfm-table@2.1.1:
1675 + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==}
1676 +
1677 + micromark-extension-gfm-tagfilter@2.0.0:
1678 + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
1679 +
1680 + micromark-extension-gfm-task-list-item@2.1.0:
1681 + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==}
1682 +
1683 + micromark-extension-gfm@3.0.0:
1684 + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
1685 +
1686 + micromark-extension-math@3.1.0:
1687 + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==}
1688 +
1689 + micromark-extension-mdx-expression@3.0.1:
1690 + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==}
1691 +
1692 + micromark-extension-mdx-jsx@3.0.2:
1693 + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==}
1694 +
1695 + micromark-extension-mdx-md@2.0.0:
1696 + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==}
1697 +
1698 + micromark-extension-mdxjs-esm@3.0.0:
1699 + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==}
1700 +
1701 + micromark-extension-mdxjs@3.0.0:
1702 + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==}
1703 +
1704 + micromark-factory-destination@2.0.1:
1705 + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
1706 +
1707 + micromark-factory-label@2.0.1:
1708 + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==}
1709 +
1710 + micromark-factory-mdx-expression@2.0.3:
1711 + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==}
1712 +
1713 + micromark-factory-space@2.0.1:
1714 + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==}
1715 +
1716 + micromark-factory-title@2.0.1:
1717 + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==}
1718 +
1719 + micromark-factory-whitespace@2.0.1:
1720 + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==}
1721 +
1722 + micromark-util-character@2.1.1:
1723 + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
1724 +
1725 + micromark-util-chunked@2.0.1:
1726 + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==}
1727 +
1728 + micromark-util-classify-character@2.0.1:
1729 + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==}
1730 +
1731 + micromark-util-combine-extensions@2.0.1:
1732 + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==}
1733 +
1734 + micromark-util-decode-numeric-character-reference@2.0.2:
1735 + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==}
1736 +
1737 + micromark-util-decode-string@2.0.1:
1738 + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==}
1739 +
1740 + micromark-util-encode@2.0.1:
1741 + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
1742 +
1743 + micromark-util-events-to-acorn@2.0.3:
1744 + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==}
1745 +
1746 + micromark-util-html-tag-name@2.0.1:
1747 + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==}
1748 +
1749 + micromark-util-normalize-identifier@2.0.1:
1750 + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==}
1751 +
1752 + micromark-util-resolve-all@2.0.1:
1753 + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==}
1754 +
1755 + micromark-util-sanitize-uri@2.0.1:
1756 + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
1757 +
1758 + micromark-util-subtokenize@2.1.0:
1759 + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==}
1760 +
1761 + micromark-util-symbol@2.0.1:
1762 + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
1763 +
1764 + micromark-util-types@2.0.2:
1765 + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==}
1766 +
1767 + micromark@4.0.2:
1768 + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==}
1769 +
1770 + micromatch@4.0.8:
1771 + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
1772 + engines: {node: '>=8.6'}
1773 +
1774 + minimatch@3.1.2:
1775 + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1776 +
1777 + minimatch@9.0.5:
1778 + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
1779 + engines: {node: '>=16 || 14 >=14.17'}
1780 +
1781 + minipass@7.1.2:
1782 + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
1783 + engines: {node: '>=16 || 14 >=14.17'}
1784 +
1785 + minizlib@3.1.0:
1786 + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
1787 + engines: {node: '>= 18'}
1788 +
1789 + mrmime@2.0.1:
1790 + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
1791 + engines: {node: '>=10'}
1792 +
1793 + ms@2.1.3:
1794 + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
1795 +
1796 + nanoid@3.3.11:
1797 + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
1798 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
1799 + hasBin: true
1800 +
1801 + natural-compare@1.4.0:
1802 + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
1803 +
1804 + neotraverse@0.6.18:
1805 + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==}
1806 + engines: {node: '>= 10'}
1807 +
1808 + nlcst-to-string@4.0.0:
1809 + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==}
1810 +
1811 + node-fetch-native@1.6.7:
1812 + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
1813 +
1814 + node-mock-http@1.0.3:
1815 + resolution: {integrity: sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==}
1816 +
1817 + normalize-path@3.0.0:
1818 + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
1819 + engines: {node: '>=0.10.0'}
1820 +
1821 + ofetch@1.4.1:
1822 + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==}
1823 +
1824 + ohash@2.0.11:
1825 + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
1826 +
1827 + oniguruma-parser@0.12.1:
1828 + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==}
1829 +
1830 + oniguruma-to-es@4.3.3:
1831 + resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==}
1832 +
1833 + optionator@0.9.4:
1834 + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
1835 + engines: {node: '>= 0.8.0'}
1836 +
1837 + p-limit@3.1.0:
1838 + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
1839 + engines: {node: '>=10'}
1840 +
1841 + p-limit@6.2.0:
1842 + resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==}
1843 + engines: {node: '>=18'}
1844 +
1845 + p-locate@5.0.0:
1846 + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
1847 + engines: {node: '>=10'}
1848 +
1849 + p-queue@8.1.1:
1850 + resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==}
1851 + engines: {node: '>=18'}
1852 +
1853 + p-timeout@6.1.4:
1854 + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==}
1855 + engines: {node: '>=14.16'}
1856 +
1857 + package-manager-detector@1.4.1:
1858 + resolution: {integrity: sha512-dSMiVLBEA4XaNJ0PRb4N5cV/SEP4BWrWZKBmfF+OUm2pQTiZ6DDkKeWaltwu3JRhLoy59ayIkJ00cx9K9CaYTg==}
1859 +
1860 + pako@0.2.9:
1861 + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==}
1862 +
1863 + parent-module@1.0.1:
1864 + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
1865 + engines: {node: '>=6'}
1866 +
1867 + parse-entities@4.0.2:
1868 + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==}
1869 +
1870 + parse-latin@7.0.0:
1871 + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==}
1872 +
1873 + parse5@7.3.0:
1874 + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
1875 +
1876 + path-exists@4.0.0:
1877 + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
1878 + engines: {node: '>=8'}
1879 +
1880 + path-key@3.1.1:
1881 + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
1882 + engines: {node: '>=8'}
1883 +
1884 + picocolors@1.1.1:
1885 + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
1886 +
1887 + picomatch@2.3.1:
1888 + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
1889 + engines: {node: '>=8.6'}
1890 +
1891 + picomatch@4.0.3:
1892 + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
1893 + engines: {node: '>=12'}
1894 +
1895 + postcss-selector-parser@7.1.0:
1896 + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==}
1897 + engines: {node: '>=4'}
1898 +
1899 + postcss@8.5.6:
1900 + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
1901 + engines: {node: ^10 || ^12 || >=14}
1902 +
1903 + prelude-ls@1.2.1:
1904 + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
1905 + engines: {node: '>= 0.8.0'}
1906 +
1907 + prettier-plugin-astro@0.14.1:
1908 + resolution: {integrity: sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==}
1909 + engines: {node: ^14.15.0 || >=16.0.0}
1910 +
1911 + prettier@3.6.2:
1912 + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
1913 + engines: {node: '>=14'}
1914 + hasBin: true
1915 +
1916 + prismjs@1.30.0:
1917 + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
1918 + engines: {node: '>=6'}
1919 +
1920 + prompts@2.4.2:
1921 + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
1922 + engines: {node: '>= 6'}
1923 +
1924 + property-information@6.5.0:
1925 + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==}
1926 +
1927 + property-information@7.1.0:
1928 + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==}
1929 +
1930 + punycode@2.3.1:
1931 + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
1932 + engines: {node: '>=6'}
1933 +
1934 + queue-microtask@1.2.3:
1935 + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
1936 +
1937 + radix3@1.1.2:
1938 + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==}
1939 +
1940 + readdirp@4.1.2:
1941 + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
1942 + engines: {node: '>= 14.18.0'}
1943 +
1944 + reading-time@1.5.0:
1945 + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==}
1946 +
1947 + recma-build-jsx@1.0.0:
1948 + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==}
1949 +
1950 + recma-jsx@1.0.1:
1951 + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==}
1952 + peerDependencies:
1953 + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
1954 +
1955 + recma-parse@1.0.0:
1956 + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==}
1957 +
1958 + recma-stringify@1.0.0:
1959 + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==}
1960 +
1961 + regex-recursion@6.0.2:
1962 + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==}
1963 +
1964 + regex-utilities@2.3.0:
1965 + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==}
1966 +
1967 + regex@6.0.1:
1968 + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==}
1969 +
1970 + rehype-katex@7.0.1:
1971 + resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==}
1972 +
1973 + rehype-parse@9.0.1:
1974 + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==}
1975 +
1976 + rehype-raw@7.0.0:
1977 + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==}
1978 +
1979 + rehype-recma@1.0.0:
1980 + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==}
1981 +
1982 + rehype-stringify@10.0.1:
1983 + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==}
1984 +
1985 + rehype@13.0.2:
1986 + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==}
1987 +
1988 + remark-directive@4.0.0:
1989 + resolution: {integrity: sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==}
1990 +
1991 + remark-gfm@4.0.1:
1992 + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==}
1993 +
1994 + remark-math@6.0.0:
1995 + resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==}
1996 +
1997 + remark-mdx@3.1.1:
1998 + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==}
1999 +
2000 + remark-parse@11.0.0:
2001 + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
2002 +
2003 + remark-rehype@11.1.2:
2004 + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==}
2005 +
2006 + remark-smartypants@3.0.2:
2007 + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==}
2008 + engines: {node: '>=16.0.0'}
2009 +
2010 + remark-stringify@11.0.0:
2011 + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
2012 +
2013 + resolve-from@4.0.0:
2014 + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
2015 + engines: {node: '>=4'}
2016 +
2017 + resolve-pkg-maps@1.0.0:
2018 + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
2019 +
2020 + restructure@3.0.2:
2021 + resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==}
2022 +
2023 + retext-latin@4.0.0:
2024 + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==}
2025 +
2026 + retext-smartypants@6.2.0:
2027 + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==}
2028 +
2029 + retext-stringify@4.0.0:
2030 + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==}
2031 +
2032 + retext@9.0.0:
2033 + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==}
2034 +
2035 + reusify@1.1.0:
2036 + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
2037 + engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
2038 +
2039 + rollup@4.52.5:
2040 + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==}
2041 + engines: {node: '>=18.0.0', npm: '>=8.0.0'}
2042 + hasBin: true
2043 +
2044 + run-parallel@1.2.0:
2045 + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
2046 +
2047 + s.color@0.0.15:
2048 + resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==}
2049 +
2050 + sass-formatter@0.7.9:
2051 + resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==}
2052 +
2053 + sax@1.4.1:
2054 + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
2055 +
2056 + semver@7.7.3:
2057 + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
2058 + engines: {node: '>=10'}
2059 + hasBin: true
2060 +
2061 + sharp@0.34.4:
2062 + resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==}
2063 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
2064 +
2065 + shebang-command@2.0.0:
2066 + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
2067 + engines: {node: '>=8'}
2068 +
2069 + shebang-regex@3.0.0:
2070 + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
2071 + engines: {node: '>=8'}
2072 +
2073 + shiki@3.13.0:
2074 + resolution: {integrity: sha512-aZW4l8Og16CokuCLf8CF8kq+KK2yOygapU5m3+hoGw0Mdosc6fPitjM+ujYarppj5ZIKGyPDPP1vqmQhr+5/0g==}
2075 +
2076 + sisteransi@1.0.5:
2077 + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
2078 +
2079 + sitemap@8.0.0:
2080 + resolution: {integrity: sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==}
2081 + engines: {node: '>=14.0.0', npm: '>=6.0.0'}
2082 + hasBin: true
2083 +
2084 + smol-toml@1.4.2:
2085 + resolution: {integrity: sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g==}
2086 + engines: {node: '>= 18'}
2087 +
2088 + source-map-js@1.2.1:
2089 + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
2090 + engines: {node: '>=0.10.0'}
2091 +
2092 + source-map@0.7.6:
2093 + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
2094 + engines: {node: '>= 12'}
2095 +
2096 + space-separated-tokens@2.0.2:
2097 + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
2098 +
2099 + stream-replace-string@2.0.0:
2100 + resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==}
2101 +
2102 + string-width@4.2.3:
2103 + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
2104 + engines: {node: '>=8'}
2105 +
2106 + string-width@7.2.0:
2107 + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
2108 + engines: {node: '>=18'}
2109 +
2110 + stringify-entities@4.0.4:
2111 + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
2112 +
2113 + strip-ansi@6.0.1:
2114 + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
2115 + engines: {node: '>=8'}
2116 +
2117 + strip-ansi@7.1.2:
2118 + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==}
2119 + engines: {node: '>=12'}
2120 +
2121 + strip-json-comments@3.1.1:
2122 + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
2123 + engines: {node: '>=8'}
2124 +
2125 + style-to-js@1.1.18:
2126 + resolution: {integrity: sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg==}
2127 +
2128 + style-to-object@1.0.11:
2129 + resolution: {integrity: sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow==}
2130 +
2131 + suf-log@2.5.3:
2132 + resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==}
2133 +
2134 + supports-color@7.2.0:
2135 + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
2136 + engines: {node: '>=8'}
2137 +
2138 + synckit@0.11.11:
2139 + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==}
2140 + engines: {node: ^14.18.0 || >=16.0.0}
2141 +
2142 + tailwindcss@4.1.14:
2143 + resolution: {integrity: sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==}
2144 +
2145 + tapable@2.3.0:
2146 + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
2147 + engines: {node: '>=6'}
2148 +
2149 + tar@7.5.1:
2150 + resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==}
2151 + engines: {node: '>=18'}
2152 +
2153 + tiny-inflate@1.0.3:
2154 + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==}
2155 +
2156 + tinyexec@1.0.1:
2157 + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==}
2158 +
2159 + tinyglobby@0.2.15:
2160 + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
2161 + engines: {node: '>=12.0.0'}
2162 +
2163 + to-regex-range@5.0.1:
2164 + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
2165 + engines: {node: '>=8.0'}
2166 +
2167 + trim-lines@3.0.1:
2168 + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
2169 +
2170 + trough@2.2.0:
2171 + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
2172 +
2173 + ts-api-utils@2.1.0:
2174 + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==}
2175 + engines: {node: '>=18.12'}
2176 + peerDependencies:
2177 + typescript: '>=4.8.4'
2178 +
2179 + tsconfck@3.1.6:
2180 + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==}
2181 + engines: {node: ^18 || >=20}
2182 + hasBin: true
2183 + peerDependencies:
2184 + typescript: ^5.0.0
2185 + peerDependenciesMeta:
2186 + typescript:
2187 + optional: true
2188 +
2189 + tslib@2.8.1:
2190 + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
2191 +
2192 + tsx@4.20.6:
2193 + resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==}
2194 + engines: {node: '>=18.0.0'}
2195 + hasBin: true
2196 +
2197 + type-check@0.4.0:
2198 + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
2199 + engines: {node: '>= 0.8.0'}
2200 +
2201 + type-fest@4.41.0:
2202 + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==}
2203 + engines: {node: '>=16'}
2204 +
2205 + typescript-eslint@8.46.1:
2206 + resolution: {integrity: sha512-VHgijW803JafdSsDO8I761r3SHrgk4T00IdyQ+/UsthtgPRsBWQLqoSxOolxTpxRKi1kGXK0bSz4CoAc9ObqJA==}
2207 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
2208 + peerDependencies:
2209 + eslint: ^8.57.0 || ^9.0.0
2210 + typescript: '>=4.8.4 <6.0.0'
2211 +
2212 + typescript@5.9.3:
2213 + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
2214 + engines: {node: '>=14.17'}
2215 + hasBin: true
2216 +
2217 + ufo@1.6.1:
2218 + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
2219 +
2220 + ultrahtml@1.6.0:
2221 + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==}
2222 +
2223 + uncrypto@0.1.3:
2224 + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
2225 +
2226 + undici-types@7.14.0:
2227 + resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==}
2228 +
2229 + unicode-properties@1.4.1:
2230 + resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==}
2231 +
2232 + unicode-trie@2.0.0:
2233 + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==}
2234 +
2235 + unified@11.0.5:
2236 + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
2237 +
2238 + unifont@0.6.0:
2239 + resolution: {integrity: sha512-5Fx50fFQMQL5aeHyWnZX9122sSLckcDvcfFiBf3QYeHa7a1MKJooUy52b67moi2MJYkrfo/TWY+CoLdr/w0tTA==}
2240 +
2241 + unist-util-find-after@5.0.0:
2242 + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==}
2243 +
2244 + unist-util-is@6.0.1:
2245 + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==}
2246 +
2247 + unist-util-modify-children@4.0.0:
2248 + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==}
2249 +
2250 + unist-util-position-from-estree@2.0.0:
2251 + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==}
2252 +
2253 + unist-util-position@5.0.0:
2254 + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
2255 +
2256 + unist-util-remove-position@5.0.0:
2257 + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==}
2258 +
2259 + unist-util-stringify-position@4.0.0:
2260 + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
2261 +
2262 + unist-util-visit-children@3.0.0:
2263 + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==}
2264 +
2265 + unist-util-visit-parents@6.0.2:
2266 + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==}
2267 +
2268 + unist-util-visit@5.0.0:
2269 + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
2270 +
2271 + unstorage@1.17.1:
2272 + resolution: {integrity: sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==}
2273 + peerDependencies:
2274 + '@azure/app-configuration': ^1.8.0
2275 + '@azure/cosmos': ^4.2.0
2276 + '@azure/data-tables': ^13.3.0
2277 + '@azure/identity': ^4.6.0
2278 + '@azure/keyvault-secrets': ^4.9.0
2279 + '@azure/storage-blob': ^12.26.0
2280 + '@capacitor/preferences': ^6.0.3 || ^7.0.0
2281 + '@deno/kv': '>=0.9.0'
2282 + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0
2283 + '@planetscale/database': ^1.19.0
2284 + '@upstash/redis': ^1.34.3
2285 + '@vercel/blob': '>=0.27.1'
2286 + '@vercel/functions': ^2.2.12 || ^3.0.0
2287 + '@vercel/kv': ^1.0.1
2288 + aws4fetch: ^1.0.20
2289 + db0: '>=0.2.1'
2290 + idb-keyval: ^6.2.1
2291 + ioredis: ^5.4.2
2292 + uploadthing: ^7.4.4
2293 + peerDependenciesMeta:
2294 + '@azure/app-configuration':
2295 + optional: true
2296 + '@azure/cosmos':
2297 + optional: true
2298 + '@azure/data-tables':
2299 + optional: true
2300 + '@azure/identity':
2301 + optional: true
2302 + '@azure/keyvault-secrets':
2303 + optional: true
2304 + '@azure/storage-blob':
2305 + optional: true
2306 + '@capacitor/preferences':
2307 + optional: true
2308 + '@deno/kv':
2309 + optional: true
2310 + '@netlify/blobs':
2311 + optional: true
2312 + '@planetscale/database':
2313 + optional: true
2314 + '@upstash/redis':
2315 + optional: true
2316 + '@vercel/blob':
2317 + optional: true
2318 + '@vercel/functions':
2319 + optional: true
2320 + '@vercel/kv':
2321 + optional: true
2322 + aws4fetch:
2323 + optional: true
2324 + db0:
2325 + optional: true
2326 + idb-keyval:
2327 + optional: true
2328 + ioredis:
2329 + optional: true
2330 + uploadthing:
2331 + optional: true
2332 +
2333 + uri-js@4.4.1:
2334 + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
2335 +
2336 + util-deprecate@1.0.2:
2337 + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
2338 +
2339 + vfile-location@5.0.3:
2340 + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
2341 +
2342 + vfile-message@4.0.3:
2343 + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==}
2344 +
2345 + vfile@6.0.3:
2346 + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
2347 +
2348 + vite@6.4.0:
2349 + resolution: {integrity: sha512-oLnWs9Hak/LOlKjeSpOwD6JMks8BeICEdYMJBf6P4Lac/pO9tKiv/XhXnAM7nNfSkZahjlCZu9sS50zL8fSnsw==}
2350 + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
2351 + hasBin: true
2352 + peerDependencies:
2353 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
2354 + jiti: '>=1.21.0'
2355 + less: '*'
2356 + lightningcss: ^1.21.0
2357 + sass: '*'
2358 + sass-embedded: '*'
2359 + stylus: '*'
2360 + sugarss: '*'
2361 + terser: ^5.16.0
2362 + tsx: ^4.8.1
2363 + yaml: ^2.4.2
2364 + peerDependenciesMeta:
2365 + '@types/node':
2366 + optional: true
2367 + jiti:
2368 + optional: true
2369 + less:
2370 + optional: true
2371 + lightningcss:
2372 + optional: true
2373 + sass:
2374 + optional: true
2375 + sass-embedded:
2376 + optional: true
2377 + stylus:
2378 + optional: true
2379 + sugarss:
2380 + optional: true
2381 + terser:
2382 + optional: true
2383 + tsx:
2384 + optional: true
2385 + yaml:
2386 + optional: true
2387 +
2388 + vitefu@1.1.1:
2389 + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==}
2390 + peerDependencies:
2391 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0
2392 + peerDependenciesMeta:
2393 + vite:
2394 + optional: true
2395 +
2396 + web-namespaces@2.0.1:
2397 + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
2398 +
2399 + which-pm-runs@1.1.0:
2400 + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==}
2401 + engines: {node: '>=4'}
2402 +
2403 + which@2.0.2:
2404 + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
2405 + engines: {node: '>= 8'}
2406 + hasBin: true
2407 +
2408 + widest-line@5.0.0:
2409 + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==}
2410 + engines: {node: '>=18'}
2411 +
2412 + word-wrap@1.2.5:
2413 + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
2414 + engines: {node: '>=0.10.0'}
2415 +
2416 + wrap-ansi@9.0.2:
2417 + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
2418 + engines: {node: '>=18'}
2419 +
2420 + xxhash-wasm@1.1.0:
2421 + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==}
2422 +
2423 + yallist@5.0.0:
2424 + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
2425 + engines: {node: '>=18'}
2426 +
2427 + yargs-parser@21.1.1:
2428 + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
2429 + engines: {node: '>=12'}
2430 +
2431 + yocto-queue@0.1.0:
2432 + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
2433 + engines: {node: '>=10'}
2434 +
2435 + yocto-queue@1.2.1:
2436 + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==}
2437 + engines: {node: '>=12.20'}
2438 +
2439 + yocto-spinner@0.2.3:
2440 + resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==}
2441 + engines: {node: '>=18.19'}
2442 +
2443 + yoctocolors@2.1.2:
2444 + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==}
2445 + engines: {node: '>=18'}
2446 +
2447 + zod-to-json-schema@3.24.6:
2448 + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==}
2449 + peerDependencies:
2450 + zod: ^3.24.1
2451 +
2452 + zod-to-ts@1.2.0:
2453 + resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==}
2454 + peerDependencies:
2455 + typescript: ^4.9.4 || ^5.0.2
2456 + zod: ^3
2457 +
2458 + zod@3.25.76:
2459 + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
2460 +
2461 + zwitch@2.0.4:
2462 + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
2463 +
2464 +snapshots:
2465 +
2466 + '@astrojs/compiler@2.13.0': {}
2467 +
2468 + '@astrojs/internal-helpers@0.7.4': {}
2469 +
2470 + '@astrojs/markdown-remark@6.3.8':
2471 + dependencies:
2472 + '@astrojs/internal-helpers': 0.7.4
2473 + '@astrojs/prism': 3.3.0
2474 + github-slugger: 2.0.0
2475 + hast-util-from-html: 2.0.3
2476 + hast-util-to-text: 4.0.2
2477 + import-meta-resolve: 4.2.0
2478 + js-yaml: 4.1.0
2479 + mdast-util-definitions: 6.0.0
2480 + rehype-raw: 7.0.0
2481 + rehype-stringify: 10.0.1
2482 + remark-gfm: 4.0.1
2483 + remark-parse: 11.0.0
2484 + remark-rehype: 11.1.2
2485 + remark-smartypants: 3.0.2
2486 + shiki: 3.13.0
2487 + smol-toml: 1.4.2
2488 + unified: 11.0.5
2489 + unist-util-remove-position: 5.0.0
2490 + unist-util-visit: 5.0.0
2491 + unist-util-visit-parents: 6.0.2
2492 + vfile: 6.0.3
2493 + transitivePeerDependencies:
2494 + - supports-color
2495 +
2496 + '@astrojs/mdx@4.3.7(astro@5.14.6(@types/node@24.8.1)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.52.5)(tsx@4.20.6)(typescript@5.9.3))':
2497 + dependencies:
2498 + '@astrojs/markdown-remark': 6.3.8
2499 + '@mdx-js/mdx': 3.1.1
2500 + acorn: 8.15.0
2501 + astro: 5.14.6(@types/node@24.8.1)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.52.5)(tsx@4.20.6)(typescript@5.9.3)
2502 + es-module-lexer: 1.7.0
2503 + estree-util-visit: 2.0.0
2504 + hast-util-to-html: 9.0.5
2505 + kleur: 4.1.5
2506 + rehype-raw: 7.0.0
2507 + remark-gfm: 4.0.1
2508 + remark-smartypants: 3.0.2
2509 + source-map: 0.7.6
2510 + unist-util-visit: 5.0.0
2511 + vfile: 6.0.3
2512 + transitivePeerDependencies:
2513 + - supports-color
2514 +
2515 + '@astrojs/prism@3.3.0':
2516 + dependencies:
2517 + prismjs: 1.30.0
2518 +
2519 + '@astrojs/sitemap@3.6.0':
2520 + dependencies:
2521 + sitemap: 8.0.0
2522 + stream-replace-string: 2.0.0
2523 + zod: 3.25.76
2524 +
2525 + '@astrojs/telemetry@3.3.0':
2526 + dependencies:
2527 + ci-info: 4.3.1
2528 + debug: 4.4.3
2529 + dlv: 1.1.3
2530 + dset: 3.1.4
2531 + is-docker: 3.0.0
2532 + is-wsl: 3.1.0
2533 + which-pm-runs: 1.1.0
2534 + transitivePeerDependencies:
2535 + - supports-color
2536 +
2537 + '@babel/helper-string-parser@7.27.1': {}
2538 +
2539 + '@babel/helper-validator-identifier@7.27.1': {}
2540 +
2541 + '@babel/parser@7.28.4':
2542 + dependencies:
2543 + '@babel/types': 7.28.4
2544 +
2545 + '@babel/types@7.28.4':
2546 + dependencies:
2547 + '@babel/helper-string-parser': 7.27.1
2548 + '@babel/helper-validator-identifier': 7.27.1
2549 +
2550 + '@capsizecss/unpack@3.0.0':
2551 + dependencies:
2552 + fontkit: 2.0.4
2553 +
2554 + '@emnapi/runtime@1.5.0':
2555 + dependencies:
2556 + tslib: 2.8.1
2557 + optional: true
2558 +
2559 + '@esbuild/aix-ppc64@0.25.11':
2560 + optional: true
2561 +
2562 + '@esbuild/android-arm64@0.25.11':
2563 + optional: true
2564 +
2565 + '@esbuild/android-arm@0.25.11':
2566 + optional: true
2567 +
2568 + '@esbuild/android-x64@0.25.11':
2569 + optional: true
2570 +
2571 + '@esbuild/darwin-arm64@0.25.11':
2572 + optional: true
2573 +
2574 + '@esbuild/darwin-x64@0.25.11':
2575 + optional: true
2576 +
2577 + '@esbuild/freebsd-arm64@0.25.11':
2578 + optional: true
2579 +
2580 + '@esbuild/freebsd-x64@0.25.11':
2581 + optional: true
2582 +
2583 + '@esbuild/linux-arm64@0.25.11':
2584 + optional: true
2585 +
2586 + '@esbuild/linux-arm@0.25.11':
2587 + optional: true
2588 +
2589 + '@esbuild/linux-ia32@0.25.11':
2590 + optional: true
2591 +
2592 + '@esbuild/linux-loong64@0.25.11':
2593 + optional: true
2594 +
2595 + '@esbuild/linux-mips64el@0.25.11':
2596 + optional: true
2597 +
2598 + '@esbuild/linux-ppc64@0.25.11':
2599 + optional: true
2600 +
2601 + '@esbuild/linux-riscv64@0.25.11':
2602 + optional: true
2603 +
2604 + '@esbuild/linux-s390x@0.25.11':
2605 + optional: true
2606 +
2607 + '@esbuild/linux-x64@0.25.11':
2608 + optional: true
2609 +
2610 + '@esbuild/netbsd-arm64@0.25.11':
2611 + optional: true
2612 +
2613 + '@esbuild/netbsd-x64@0.25.11':
2614 + optional: true
2615 +
2616 + '@esbuild/openbsd-arm64@0.25.11':
2617 + optional: true
2618 +
2619 + '@esbuild/openbsd-x64@0.25.11':
2620 + optional: true
2621 +
2622 + '@esbuild/openharmony-arm64@0.25.11':
2623 + optional: true
2624 +
2625 + '@esbuild/sunos-x64@0.25.11':
2626 + optional: true
2627 +
2628 + '@esbuild/win32-arm64@0.25.11':
2629 + optional: true
2630 +
2631 + '@esbuild/win32-ia32@0.25.11':
2632 + optional: true
2633 +
2634 + '@esbuild/win32-x64@0.25.11':
2635 + optional: true
2636 +
2637 + '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0(jiti@2.6.1))':
2638 + dependencies:
2639 + eslint: 9.38.0(jiti@2.6.1)
2640 + eslint-visitor-keys: 3.4.3
2641 +
2642 + '@eslint-community/regexpp@4.12.1': {}
2643 +
2644 + '@eslint/config-array@0.21.1':
2645 + dependencies:
2646 + '@eslint/object-schema': 2.1.7
2647 + debug: 4.4.3
2648 + minimatch: 3.1.2
2649 + transitivePeerDependencies:
2650 + - supports-color
2651 +
2652 + '@eslint/config-helpers@0.4.1':
2653 + dependencies:
2654 + '@eslint/core': 0.16.0
2655 +
2656 + '@eslint/core@0.16.0':
2657 + dependencies:
2658 + '@types/json-schema': 7.0.15
2659 +
2660 + '@eslint/eslintrc@3.3.1':
2661 + dependencies:
2662 + ajv: 6.12.6
2663 + debug: 4.4.3
2664 + espree: 10.4.0
2665 + globals: 14.0.0
2666 + ignore: 5.3.2
2667 + import-fresh: 3.3.1
2668 + js-yaml: 4.1.0
2669 + minimatch: 3.1.2
2670 + strip-json-comments: 3.1.1
2671 + transitivePeerDependencies:
2672 + - supports-color
2673 +
2674 + '@eslint/js@9.38.0': {}
2675 +
2676 + '@eslint/object-schema@2.1.7': {}
2677 +
2678 + '@eslint/plugin-kit@0.4.0':
2679 + dependencies:
2680 + '@eslint/core': 0.16.0
2681 + levn: 0.4.1
2682 +
2683 + '@humanfs/core@0.19.1': {}
2684 +
2685 + '@humanfs/node@0.16.7':
2686 + dependencies:
2687 + '@humanfs/core': 0.19.1
2688 + '@humanwhocodes/retry': 0.4.3
2689 +
2690 + '@humanwhocodes/module-importer@1.0.1': {}
2691 +
2692 + '@humanwhocodes/retry@0.4.3': {}
2693 +
2694 + '@img/colour@1.0.0': {}
2695 +
2696 + '@img/sharp-darwin-arm64@0.34.4':
2697 + optionalDependencies:
2698 + '@img/sharp-libvips-darwin-arm64': 1.2.3
2699 + optional: true
2700 +
2701 + '@img/sharp-darwin-x64@0.34.4':
2702 + optionalDependencies:
2703 + '@img/sharp-libvips-darwin-x64': 1.2.3
2704 + optional: true
2705 +
2706 + '@img/sharp-libvips-darwin-arm64@1.2.3':
2707 + optional: true
2708 +
2709 + '@img/sharp-libvips-darwin-x64@1.2.3':
2710 + optional: true
2711 +
2712 + '@img/sharp-libvips-linux-arm64@1.2.3':
2713 + optional: true
2714 +
2715 + '@img/sharp-libvips-linux-arm@1.2.3':
2716 + optional: true
2717 +
2718 + '@img/sharp-libvips-linux-ppc64@1.2.3':
2719 + optional: true
2720 +
2721 + '@img/sharp-libvips-linux-s390x@1.2.3':
2722 + optional: true
2723 +
2724 + '@img/sharp-libvips-linux-x64@1.2.3':
2725 + optional: true
2726 +
2727 + '@img/sharp-libvips-linuxmusl-arm64@1.2.3':
2728 + optional: true
2729 +
2730 + '@img/sharp-libvips-linuxmusl-x64@1.2.3':
2731 + optional: true
2732 +
2733 + '@img/sharp-linux-arm64@0.34.4':
2734 + optionalDependencies:
2735 + '@img/sharp-libvips-linux-arm64': 1.2.3
2736 + optional: true
2737 +
2738 + '@img/sharp-linux-arm@0.34.4':
2739 + optionalDependencies:
2740 + '@img/sharp-libvips-linux-arm': 1.2.3
2741 + optional: true
2742 +
2743 + '@img/sharp-linux-ppc64@0.34.4':
2744 + optionalDependencies:
2745 + '@img/sharp-libvips-linux-ppc64': 1.2.3
2746 + optional: true
2747 +
2748 + '@img/sharp-linux-s390x@0.34.4':
2749 + optionalDependencies:
2750 + '@img/sharp-libvips-linux-s390x': 1.2.3
2751 + optional: true
2752 +
2753 + '@img/sharp-linux-x64@0.34.4':
2754 + optionalDependencies:
2755 + '@img/sharp-libvips-linux-x64': 1.2.3
2756 + optional: true
2757 +
2758 + '@img/sharp-linuxmusl-arm64@0.34.4':
2759 + optionalDependencies:
2760 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3
2761 + optional: true
2762 +
2763 + '@img/sharp-linuxmusl-x64@0.34.4':
2764 + optionalDependencies:
2765 + '@img/sharp-libvips-linuxmusl-x64': 1.2.3
2766 + optional: true
2767 +
2768 + '@img/sharp-wasm32@0.34.4':
2769 + dependencies:
2770 + '@emnapi/runtime': 1.5.0
2771 + optional: true
2772 +
2773 + '@img/sharp-win32-arm64@0.34.4':
2774 + optional: true
2775 +
2776 + '@img/sharp-win32-ia32@0.34.4':
2777 + optional: true
2778 +
2779 + '@img/sharp-win32-x64@0.34.4':
2780 + optional: true
2781 +
2782 + '@isaacs/fs-minipass@4.0.1':
2783 + dependencies:
2784 + minipass: 7.1.2
2785 +
2786 + '@jridgewell/gen-mapping@0.3.13':
2787 + dependencies:
2788 + '@jridgewell/sourcemap-codec': 1.5.5
2789 + '@jridgewell/trace-mapping': 0.3.31
2790 +
2791 + '@jridgewell/remapping@2.3.5':
2792 + dependencies:
2793 + '@jridgewell/gen-mapping': 0.3.13
2794 + '@jridgewell/trace-mapping': 0.3.31
2795 +
2796 + '@jridgewell/resolve-uri@3.1.2': {}
2797 +
2798 + '@jridgewell/sourcemap-codec@1.5.5': {}
2799 +
2800 + '@jridgewell/trace-mapping@0.3.31':
2801 + dependencies:
2802 + '@jridgewell/resolve-uri': 3.1.2
2803 + '@jridgewell/sourcemap-codec': 1.5.5
2804 +
2805 + '@mdx-js/mdx@3.1.1':
2806 + dependencies:
2807 + '@types/estree': 1.0.8
2808 + '@types/estree-jsx': 1.0.5
2809 + '@types/hast': 3.0.4
2810 + '@types/mdx': 2.0.13
2811 + acorn: 8.15.0
2812 + collapse-white-space: 2.1.0
2813 + devlop: 1.1.0
2814 + estree-util-is-identifier-name: 3.0.0
2815 + estree-util-scope: 1.0.0
2816 + estree-walker: 3.0.3
2817 + hast-util-to-jsx-runtime: 2.3.6
2818 + markdown-extensions: 2.0.0
2819 + recma-build-jsx: 1.0.0
2820 + recma-jsx: 1.0.1(acorn@8.15.0)
2821 + recma-stringify: 1.0.0
2822 + rehype-recma: 1.0.0
2823 + remark-mdx: 3.1.1
2824 + remark-parse: 11.0.0
2825 + remark-rehype: 11.1.2
2826 + source-map: 0.7.6
2827 + unified: 11.0.5
2828 + unist-util-position-from-estree: 2.0.0
2829 + unist-util-stringify-position: 4.0.0
2830 + unist-util-visit: 5.0.0
2831 + vfile: 6.0.3
2832 + transitivePeerDependencies:
2833 + - supports-color
2834 +
2835 + '@nodelib/fs.scandir@2.1.5':
2836 + dependencies:
2837 + '@nodelib/fs.stat': 2.0.5
2838 + run-parallel: 1.2.0
2839 +
2840 + '@nodelib/fs.stat@2.0.5': {}
2841 +
2842 + '@nodelib/fs.walk@1.2.8':
2843 + dependencies:
2844 + '@nodelib/fs.scandir': 2.1.5
2845 + fastq: 1.19.1
2846 +
2847 + '@oslojs/encoding@1.1.0': {}
2848 +
2849 + '@pkgr/core@0.2.9': {}
2850 +
2851 + '@rollup/pluginutils@5.3.0(rollup@4.52.5)':
2852 + dependencies:
2853 + '@types/estree': 1.0.8
2854 + estree-walker: 2.0.2
2855 + picomatch: 4.0.3
2856 + optionalDependencies:
2857 + rollup: 4.52.5
2858 +
2859 + '@rollup/rollup-android-arm-eabi@4.52.5':
2860 + optional: true
2861 +
2862 + '@rollup/rollup-android-arm64@4.52.5':
2863 + optional: true
2864 +
2865 + '@rollup/rollup-darwin-arm64@4.52.5':
2866 + optional: true
2867 +
2868 + '@rollup/rollup-darwin-x64@4.52.5':
2869 + optional: true
2870 +
2871 + '@rollup/rollup-freebsd-arm64@4.52.5':
2872 + optional: true
2873 +
2874 + '@rollup/rollup-freebsd-x64@4.52.5':
2875 + optional: true
2876 +
2877 + '@rollup/rollup-linux-arm-gnueabihf@4.52.5':
2878 + optional: true
2879 +
2880 + '@rollup/rollup-linux-arm-musleabihf@4.52.5':
2881 + optional: true
2882 +
2883 + '@rollup/rollup-linux-arm64-gnu@4.52.5':
2884 + optional: true
2885 +
2886 + '@rollup/rollup-linux-arm64-musl@4.52.5':
2887 + optional: true
2888 +
2889 + '@rollup/rollup-linux-loong64-gnu@4.52.5':
2890 + optional: true
2891 +
2892 + '@rollup/rollup-linux-ppc64-gnu@4.52.5':
2893 + optional: true
2894 +
2895 + '@rollup/rollup-linux-riscv64-gnu@4.52.5':
2896 + optional: true
2897 +
2898 + '@rollup/rollup-linux-riscv64-musl@4.52.5':
2899 + optional: true
2900 +
2901 + '@rollup/rollup-linux-s390x-gnu@4.52.5':
2902 + optional: true
2903 +
2904 + '@rollup/rollup-linux-x64-gnu@4.52.5':
2905 + optional: true
2906 +
2907 + '@rollup/rollup-linux-x64-musl@4.52.5':
2908 + optional: true
2909 +
2910 + '@rollup/rollup-openharmony-arm64@4.52.5':
2911 + optional: true
2912 +
2913 + '@rollup/rollup-win32-arm64-msvc@4.52.5':
2914 + optional: true
2915 +
2916 + '@rollup/rollup-win32-ia32-msvc@4.52.5':
2917 + optional: true
2918 +
2919 + '@rollup/rollup-win32-x64-gnu@4.52.5':
2920 + optional: true
2921 +
2922 + '@rollup/rollup-win32-x64-msvc@4.52.5':
2923 + optional: true
2924 +
2925 + '@shikijs/core@3.13.0':
2926 + dependencies:
2927 + '@shikijs/types': 3.13.0
2928 + '@shikijs/vscode-textmate': 10.0.2
2929 + '@types/hast': 3.0.4
2930 + hast-util-to-html: 9.0.5
2931 +
2932 + '@shikijs/engine-javascript@3.13.0':
2933 + dependencies:
2934 + '@shikijs/types': 3.13.0
2935 + '@shikijs/vscode-textmate': 10.0.2
2936 + oniguruma-to-es: 4.3.3
2937 +
2938 + '@shikijs/engine-oniguruma@3.13.0':
2939 + dependencies:
2940 + '@shikijs/types': 3.13.0
2941 + '@shikijs/vscode-textmate': 10.0.2
2942 +
2943 + '@shikijs/langs@3.13.0':
2944 + dependencies:
2945 + '@shikijs/types': 3.13.0
2946 +
2947 + '@shikijs/themes@3.13.0':
2948 + dependencies:
2949 + '@shikijs/types': 3.13.0
2950 +
2951 + '@shikijs/types@3.13.0':
2952 + dependencies:
2953 + '@shikijs/vscode-textmate': 10.0.2
2954 + '@types/hast': 3.0.4
2955 +
2956 + '@shikijs/vscode-textmate@10.0.2': {}
2957 +
2958 + '@swc/helpers@0.5.17':
2959 + dependencies:
2960 + tslib: 2.8.1
2961 +
2962 + '@tailwindcss/node@4.1.14':
2963 + dependencies:
2964 + '@jridgewell/remapping': 2.3.5
2965 + enhanced-resolve: 5.18.3
2966 + jiti: 2.6.1
2967 + lightningcss: 1.30.1
2968 + magic-string: 0.30.19
2969 + source-map-js: 1.2.1
2970 + tailwindcss: 4.1.14
2971 +
2972 + '@tailwindcss/oxide-android-arm64@4.1.14':
2973 + optional: true
2974 +
2975 + '@tailwindcss/oxide-darwin-arm64@4.1.14':
2976 + optional: true
2977 +
2978 + '@tailwindcss/oxide-darwin-x64@4.1.14':
2979 + optional: true
2980 +
2981 + '@tailwindcss/oxide-freebsd-x64@4.1.14':
2982 + optional: true
2983 +
2984 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14':
2985 + optional: true
2986 +
2987 + '@tailwindcss/oxide-linux-arm64-gnu@4.1.14':
2988 + optional: true
2989 +
2990 + '@tailwindcss/oxide-linux-arm64-musl@4.1.14':
2991 + optional: true
2992 +
2993 + '@tailwindcss/oxide-linux-x64-gnu@4.1.14':
2994 + optional: true
2995 +
2996 + '@tailwindcss/oxide-linux-x64-musl@4.1.14':
2997 + optional: true
2998 +
2999 + '@tailwindcss/oxide-wasm32-wasi@4.1.14':
3000 + optional: true
3001 +
3002 + '@tailwindcss/oxide-win32-arm64-msvc@4.1.14':
3003 + optional: true
3004 +
3005 + '@tailwindcss/oxide-win32-x64-msvc@4.1.14':
3006 + optional: true
3007 +
3008 + '@tailwindcss/oxide@4.1.14':
3009 + dependencies:
3010 + detect-libc: 2.1.2
3011 + tar: 7.5.1
3012 + optionalDependencies:
3013 + '@tailwindcss/oxide-android-arm64': 4.1.14
3014 + '@tailwindcss/oxide-darwin-arm64': 4.1.14
3015 + '@tailwindcss/oxide-darwin-x64': 4.1.14
3016 + '@tailwindcss/oxide-freebsd-x64': 4.1.14
3017 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.14
3018 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.14
3019 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.14
3020 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.14
3021 + '@tailwindcss/oxide-linux-x64-musl': 4.1.14
3022 + '@tailwindcss/oxide-wasm32-wasi': 4.1.14
3023 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.14
3024 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.14
3025 +
3026 + '@tailwindcss/vite@4.1.14(vite@6.4.0(@types/node@24.8.1)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.6))':
3027 + dependencies:
3028 + '@tailwindcss/node': 4.1.14
3029 + '@tailwindcss/oxide': 4.1.14
3030 + tailwindcss: 4.1.14
3031 + vite: 6.4.0(@types/node@24.8.1)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.6)
3032 +
3033 + '@types/debug@4.1.12':
3034 + dependencies:
3035 + '@types/ms': 2.1.0
3036 +
3037 + '@types/estree-jsx@1.0.5':
3038 + dependencies:
3039 + '@types/estree': 1.0.8
3040 +
3041 + '@types/estree@1.0.8': {}
3042 +
3043 + '@types/fontkit@2.0.8':
3044 + dependencies:
3045 + '@types/node': 24.8.1
3046 +
3047 + '@types/hast@3.0.4':
3048 + dependencies:
3049 + '@types/unist': 3.0.3
3050 +
3051 + '@types/json-schema@7.0.15': {}
3052 +
3053 + '@types/katex@0.16.7': {}
3054 +
3055 + '@types/mdast@4.0.4':
3056 + dependencies:
3057 + '@types/unist': 3.0.3
3058 +
3059 + '@types/mdx@2.0.13': {}
3060 +
3061 + '@types/ms@2.1.0': {}
3062 +
3063 + '@types/nlcst@2.0.3':
3064 + dependencies:
3065 + '@types/unist': 3.0.3
3066 +
3067 + '@types/node@17.0.45': {}
3068 +
3069 + '@types/node@24.8.1':
3070 + dependencies:
3071 + undici-types: 7.14.0
3072 +
3073 + '@types/sax@1.2.7':
3074 + dependencies:
3075 + '@types/node': 17.0.45
3076 +
3077 + '@types/unist@2.0.11': {}
3078 +
3079 + '@types/unist@3.0.3': {}
3080 +
3081 + '@typescript-eslint/eslint-plugin@8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)':
3082 + dependencies:
3083 + '@eslint-community/regexpp': 4.12.1
3084 + '@typescript-eslint/parser': 8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)
3085 + '@typescript-eslint/scope-manager': 8.46.1
3086 + '@typescript-eslint/type-utils': 8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)
3087 + '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)
3088 + '@typescript-eslint/visitor-keys': 8.46.1
3089 + eslint: 9.38.0(jiti@2.6.1)
3090 + graphemer: 1.4.0
3091 + ignore: 7.0.5
3092 + natural-compare: 1.4.0
3093 + ts-api-utils: 2.1.0(typescript@5.9.3)
3094 + typescript: 5.9.3
3095 + transitivePeerDependencies:
3096 + - supports-color
3097 +
3098 + '@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)':
3099 + dependencies:
3100 + '@typescript-eslint/scope-manager': 8.46.1
3101 + '@typescript-eslint/types': 8.46.1
3102 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3)
3103 + '@typescript-eslint/visitor-keys': 8.46.1
3104 + debug: 4.4.3
3105 + eslint: 9.38.0(jiti@2.6.1)
3106 + typescript: 5.9.3
3107 + transitivePeerDependencies:
3108 + - supports-color
3109 +
3110 + '@typescript-eslint/project-service@8.46.1(typescript@5.9.3)':
3111 + dependencies:
3112 + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3)
3113 + '@typescript-eslint/types': 8.46.1
3114 + debug: 4.4.3
3115 + typescript: 5.9.3
3116 + transitivePeerDependencies:
3117 + - supports-color
3118 +
3119 + '@typescript-eslint/scope-manager@8.46.1':
3120 + dependencies:
3121 + '@typescript-eslint/types': 8.46.1
3122 + '@typescript-eslint/visitor-keys': 8.46.1
3123 +
3124 + '@typescript-eslint/tsconfig-utils@8.46.1(typescript@5.9.3)':
3125 + dependencies:
3126 + typescript: 5.9.3
3127 +
3128 + '@typescript-eslint/type-utils@8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)':
3129 + dependencies:
3130 + '@typescript-eslint/types': 8.46.1
3131 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3)
3132 + '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)
3133 + debug: 4.4.3
3134 + eslint: 9.38.0(jiti@2.6.1)
3135 + ts-api-utils: 2.1.0(typescript@5.9.3)
3136 + typescript: 5.9.3
3137 + transitivePeerDependencies:
3138 + - supports-color
3139 +
3140 + '@typescript-eslint/types@8.46.1': {}
3141 +
3142 + '@typescript-eslint/typescript-estree@8.46.1(typescript@5.9.3)':
3143 + dependencies:
3144 + '@typescript-eslint/project-service': 8.46.1(typescript@5.9.3)
3145 + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3)
3146 + '@typescript-eslint/types': 8.46.1
3147 + '@typescript-eslint/visitor-keys': 8.46.1
3148 + debug: 4.4.3
3149 + fast-glob: 3.3.3
3150 + is-glob: 4.0.3
3151 + minimatch: 9.0.5
3152 + semver: 7.7.3
3153 + ts-api-utils: 2.1.0(typescript@5.9.3)
3154 + typescript: 5.9.3
3155 + transitivePeerDependencies:
3156 + - supports-color
3157 +
3158 + '@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)':
3159 + dependencies:
3160 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1))
3161 + '@typescript-eslint/scope-manager': 8.46.1
3162 + '@typescript-eslint/types': 8.46.1
3163 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3)
3164 + eslint: 9.38.0(jiti@2.6.1)
3165 + typescript: 5.9.3
3166 + transitivePeerDependencies:
3167 + - supports-color
3168 +
3169 + '@typescript-eslint/visitor-keys@8.46.1':
3170 + dependencies:
3171 + '@typescript-eslint/types': 8.46.1
3172 + eslint-visitor-keys: 4.2.1
3173 +
3174 + '@ungap/structured-clone@1.3.0': {}
3175 +
3176 + acorn-jsx@5.3.2(acorn@8.15.0):
3177 + dependencies:
3178 + acorn: 8.15.0
3179 +
3180 + acorn@8.15.0: {}
3181 +
3182 + ajv@6.12.6:
3183 + dependencies:
3184 + fast-deep-equal: 3.1.3
3185 + fast-json-stable-stringify: 2.1.0
3186 + json-schema-traverse: 0.4.1
3187 + uri-js: 4.4.1
3188 +
3189 + ansi-align@3.0.1:
3190 + dependencies:
3191 + string-width: 4.2.3
3192 +
3193 + ansi-regex@5.0.1: {}
3194 +
3195 + ansi-regex@6.2.2: {}
3196 +
3197 + ansi-styles@4.3.0:
3198 + dependencies:
3199 + color-convert: 2.0.1
3200 +
3201 + ansi-styles@6.2.3: {}
3202 +
3203 + anymatch@3.1.3:
3204 + dependencies:
3205 + normalize-path: 3.0.0
3206 + picomatch: 2.3.1
3207 +
3208 + arg@5.0.2: {}
3209 +
3210 + argparse@2.0.1: {}
3211 +
3212 + aria-query@5.3.2: {}
3213 +
3214 + array-iterate@2.0.1: {}
3215 +
3216 + astring@1.9.0: {}
3217 +
3218 + astro-eslint-parser@1.2.2:
3219 + dependencies:
3220 + '@astrojs/compiler': 2.13.0
3221 + '@typescript-eslint/scope-manager': 8.46.1
3222 + '@typescript-eslint/types': 8.46.1
3223 + astrojs-compiler-sync: 1.1.1(@astrojs/compiler@2.13.0)
3224 + debug: 4.4.3
3225 + entities: 6.0.1
3226 + eslint-scope: 8.4.0
3227 + eslint-visitor-keys: 4.2.1
3228 + espree: 10.4.0
3229 + fast-glob: 3.3.3
3230 + is-glob: 4.0.3
3231 + semver: 7.7.3
3232 + transitivePeerDependencies:
3233 + - supports-color
3234 +
3235 + astro@5.14.6(@types/node@24.8.1)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.52.5)(tsx@4.20.6)(typescript@5.9.3):
3236 + dependencies:
3237 + '@astrojs/compiler': 2.13.0
3238 + '@astrojs/internal-helpers': 0.7.4
3239 + '@astrojs/markdown-remark': 6.3.8
3240 + '@astrojs/telemetry': 3.3.0
3241 + '@capsizecss/unpack': 3.0.0
3242 + '@oslojs/encoding': 1.1.0
3243 + '@rollup/pluginutils': 5.3.0(rollup@4.52.5)
3244 + acorn: 8.15.0
3245 + aria-query: 5.3.2
3246 + axobject-query: 4.1.0
3247 + boxen: 8.0.1
3248 + ci-info: 4.3.1
3249 + clsx: 2.1.1
3250 + common-ancestor-path: 1.0.1
3251 + cookie: 1.0.2
3252 + cssesc: 3.0.0
3253 + debug: 4.4.3
3254 + deterministic-object-hash: 2.0.2
3255 + devalue: 5.4.1
3256 + diff: 5.2.0
3257 + dlv: 1.1.3
3258 + dset: 3.1.4
3259 + es-module-lexer: 1.7.0
3260 + esbuild: 0.25.11
3261 + estree-walker: 3.0.3
3262 + flattie: 1.1.1
3263 + fontace: 0.3.1
3264 + github-slugger: 2.0.0
3265 + html-escaper: 3.0.3
3266 + http-cache-semantics: 4.2.0
3267 + import-meta-resolve: 4.2.0
3268 + js-yaml: 4.1.0
3269 + kleur: 4.1.5
3270 + magic-string: 0.30.19
3271 + magicast: 0.3.5
3272 + mrmime: 2.0.1
3273 + neotraverse: 0.6.18
3274 + p-limit: 6.2.0
3275 + p-queue: 8.1.1
3276 + package-manager-detector: 1.4.1
3277 + picomatch: 4.0.3
3278 + prompts: 2.4.2
3279 + rehype: 13.0.2
3280 + semver: 7.7.3
3281 + shiki: 3.13.0
3282 + smol-toml: 1.4.2
3283 + tinyexec: 1.0.1
3284 + tinyglobby: 0.2.15
3285 + tsconfck: 3.1.6(typescript@5.9.3)
3286 + ultrahtml: 1.6.0
3287 + unifont: 0.6.0
3288 + unist-util-visit: 5.0.0
3289 + unstorage: 1.17.1
3290 + vfile: 6.0.3
3291 + vite: 6.4.0(@types/node@24.8.1)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.6)
3292 + vitefu: 1.1.1(vite@6.4.0(@types/node@24.8.1)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.6))
3293 + xxhash-wasm: 1.1.0
3294 + yargs-parser: 21.1.1
3295 + yocto-spinner: 0.2.3
3296 + zod: 3.25.76
3297 + zod-to-json-schema: 3.24.6(zod@3.25.76)
3298 + zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76)
3299 + optionalDependencies:
3300 + sharp: 0.34.4
3301 + transitivePeerDependencies:
3302 + - '@azure/app-configuration'
3303 + - '@azure/cosmos'
3304 + - '@azure/data-tables'
3305 + - '@azure/identity'
3306 + - '@azure/keyvault-secrets'
3307 + - '@azure/storage-blob'
3308 + - '@capacitor/preferences'
3309 + - '@deno/kv'
3310 + - '@netlify/blobs'
3311 + - '@planetscale/database'
3312 + - '@types/node'
3313 + - '@upstash/redis'
3314 + - '@vercel/blob'
3315 + - '@vercel/functions'
3316 + - '@vercel/kv'
3317 + - aws4fetch
3318 + - db0
3319 + - idb-keyval
3320 + - ioredis
3321 + - jiti
3322 + - less
3323 + - lightningcss
3324 + - rollup
3325 + - sass
3326 + - sass-embedded
3327 + - stylus
3328 + - sugarss
3329 + - supports-color
3330 + - terser
3331 + - tsx
3332 + - typescript
3333 + - uploadthing
3334 + - yaml
3335 +
3336 + astrojs-compiler-sync@1.1.1(@astrojs/compiler@2.13.0):
3337 + dependencies:
3338 + '@astrojs/compiler': 2.13.0
3339 + synckit: 0.11.11
3340 +
3341 + axobject-query@4.1.0: {}
3342 +
3343 + bail@2.0.2: {}
3344 +
3345 + balanced-match@1.0.2: {}
3346 +
3347 + base-64@1.0.0: {}
3348 +
3349 + base64-js@1.5.1: {}
3350 +
3351 + boxen@8.0.1:
3352 + dependencies:
3353 + ansi-align: 3.0.1
3354 + camelcase: 8.0.0
3355 + chalk: 5.6.2
3356 + cli-boxes: 3.0.0
3357 + string-width: 7.2.0
3358 + type-fest: 4.41.0
3359 + widest-line: 5.0.0
3360 + wrap-ansi: 9.0.2
3361 +
3362 + brace-expansion@1.1.12:
3363 + dependencies:
3364 + balanced-match: 1.0.2
3365 + concat-map: 0.0.1
3366 +
3367 + brace-expansion@2.0.2:
3368 + dependencies:
3369 + balanced-match: 1.0.2
3370 +
3371 + braces@3.0.3:
3372 + dependencies:
3373 + fill-range: 7.1.1
3374 +
3375 + brotli@1.3.3:
3376 + dependencies:
3377 + base64-js: 1.5.1
3378 +
3379 + callsites@3.1.0: {}
3380 +
3381 + camelcase@8.0.0: {}
3382 +
3383 + ccount@2.0.1: {}
3384 +
3385 + chalk@4.1.2:
3386 + dependencies:
3387 + ansi-styles: 4.3.0
3388 + supports-color: 7.2.0
3389 +
3390 + chalk@5.6.2: {}
3391 +
3392 + character-entities-html4@2.1.0: {}
3393 +
3394 + character-entities-legacy@3.0.0: {}
3395 +
3396 + character-entities@2.0.2: {}
3397 +
3398 + character-reference-invalid@2.0.1: {}
3399 +
3400 + chokidar@4.0.3:
3401 + dependencies:
3402 + readdirp: 4.1.2
3403 +
3404 + chownr@3.0.0: {}
3405 +
3406 + ci-info@4.3.1: {}
3407 +
3408 + cli-boxes@3.0.0: {}
3409 +
3410 + clone@2.1.2: {}
3411 +
3412 + clsx@2.1.1: {}
3413 +
3414 + collapse-white-space@2.1.0: {}
3415 +
3416 + color-convert@2.0.1:
3417 + dependencies:
3418 + color-name: 1.1.4
3419 +
3420 + color-name@1.1.4: {}
3421 +
3422 + comma-separated-tokens@2.0.3: {}
3423 +
3424 + commander@8.3.0: {}
3425 +
3426 + common-ancestor-path@1.0.1: {}
3427 +
3428 + concat-map@0.0.1: {}
3429 +
3430 + cookie-es@1.2.2: {}
3431 +
3432 + cookie@1.0.2: {}
3433 +
3434 + cross-spawn@7.0.6:
3435 + dependencies:
3436 + path-key: 3.1.1
3437 + shebang-command: 2.0.0
3438 + which: 2.0.2
3439 +
3440 + crossws@0.3.5:
3441 + dependencies:
3442 + uncrypto: 0.1.3
3443 +
3444 + css-tree@3.1.0:
3445 + dependencies:
3446 + mdn-data: 2.12.2
3447 + source-map-js: 1.2.1
3448 +
3449 + cssesc@3.0.0: {}
3450 +
3451 + debug@4.4.3:
3452 + dependencies:
3453 + ms: 2.1.3
3454 +
3455 + decode-named-character-reference@1.2.0:
3456 + dependencies:
3457 + character-entities: 2.0.2
3458 +
3459 + deep-is@0.1.4: {}
3460 +
3461 + defu@6.1.4: {}
3462 +
3463 + dequal@2.0.3: {}
3464 +
3465 + destr@2.0.5: {}
3466 +
3467 + detect-libc@2.1.2: {}
3468 +
3469 + deterministic-object-hash@2.0.2:
3470 + dependencies:
3471 + base-64: 1.0.0
3472 +
3473 + devalue@5.4.1: {}
3474 +
3475 + devlop@1.1.0:
3476 + dependencies:
3477 + dequal: 2.0.3
3478 +
3479 + dfa@1.2.0: {}
3480 +
3481 + diff@5.2.0: {}
3482 +
3483 + dlv@1.1.3: {}
3484 +
3485 + dset@3.1.4: {}
3486 +
3487 + emoji-regex@10.6.0: {}
3488 +
3489 + emoji-regex@8.0.0: {}
3490 +
3491 + enhanced-resolve@5.18.3:
3492 + dependencies:
3493 + graceful-fs: 4.2.11
3494 + tapable: 2.3.0
3495 +
3496 + entities@6.0.1: {}
3497 +
3498 + es-module-lexer@1.7.0: {}
3499 +
3500 + esast-util-from-estree@2.0.0:
3501 + dependencies:
3502 + '@types/estree-jsx': 1.0.5
3503 + devlop: 1.1.0
3504 + estree-util-visit: 2.0.0
3505 + unist-util-position-from-estree: 2.0.0
3506 +
3507 + esast-util-from-js@2.0.1:
3508 + dependencies:
3509 + '@types/estree-jsx': 1.0.5
3510 + acorn: 8.15.0
3511 + esast-util-from-estree: 2.0.0
3512 + vfile-message: 4.0.3
3513 +
3514 + esbuild@0.25.11:
3515 + optionalDependencies:
3516 + '@esbuild/aix-ppc64': 0.25.11
3517 + '@esbuild/android-arm': 0.25.11
3518 + '@esbuild/android-arm64': 0.25.11
3519 + '@esbuild/android-x64': 0.25.11
3520 + '@esbuild/darwin-arm64': 0.25.11
3521 + '@esbuild/darwin-x64': 0.25.11
3522 + '@esbuild/freebsd-arm64': 0.25.11
3523 + '@esbuild/freebsd-x64': 0.25.11
3524 + '@esbuild/linux-arm': 0.25.11
3525 + '@esbuild/linux-arm64': 0.25.11
3526 + '@esbuild/linux-ia32': 0.25.11
3527 + '@esbuild/linux-loong64': 0.25.11
3528 + '@esbuild/linux-mips64el': 0.25.11
3529 + '@esbuild/linux-ppc64': 0.25.11
3530 + '@esbuild/linux-riscv64': 0.25.11
3531 + '@esbuild/linux-s390x': 0.25.11
3532 + '@esbuild/linux-x64': 0.25.11
3533 + '@esbuild/netbsd-arm64': 0.25.11
3534 + '@esbuild/netbsd-x64': 0.25.11
3535 + '@esbuild/openbsd-arm64': 0.25.11
3536 + '@esbuild/openbsd-x64': 0.25.11
3537 + '@esbuild/openharmony-arm64': 0.25.11
3538 + '@esbuild/sunos-x64': 0.25.11
3539 + '@esbuild/win32-arm64': 0.25.11
3540 + '@esbuild/win32-ia32': 0.25.11
3541 + '@esbuild/win32-x64': 0.25.11
3542 +
3543 + escape-string-regexp@4.0.0: {}
3544 +
3545 + escape-string-regexp@5.0.0: {}
3546 +
3547 + eslint-compat-utils@0.6.5(eslint@9.38.0(jiti@2.6.1)):
3548 + dependencies:
3549 + eslint: 9.38.0(jiti@2.6.1)
3550 + semver: 7.7.3
3551 +
3552 + eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.1)):
3553 + dependencies:
3554 + eslint: 9.38.0(jiti@2.6.1)
3555 +
3556 + eslint-plugin-astro@1.3.1(eslint@9.38.0(jiti@2.6.1)):
3557 + dependencies:
3558 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1))
3559 + '@jridgewell/sourcemap-codec': 1.5.5
3560 + '@typescript-eslint/types': 8.46.1
3561 + astro-eslint-parser: 1.2.2
3562 + eslint: 9.38.0(jiti@2.6.1)
3563 + eslint-compat-utils: 0.6.5(eslint@9.38.0(jiti@2.6.1))
3564 + globals: 15.15.0
3565 + postcss: 8.5.6
3566 + postcss-selector-parser: 7.1.0
3567 + transitivePeerDependencies:
3568 + - supports-color
3569 +
3570 + eslint-scope@8.4.0:
3571 + dependencies:
3572 + esrecurse: 4.3.0
3573 + estraverse: 5.3.0
3574 +
3575 + eslint-visitor-keys@3.4.3: {}
3576 +
3577 + eslint-visitor-keys@4.2.1: {}
3578 +
3579 + eslint@9.38.0(jiti@2.6.1):
3580 + dependencies:
3581 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1))
3582 + '@eslint-community/regexpp': 4.12.1
3583 + '@eslint/config-array': 0.21.1
3584 + '@eslint/config-helpers': 0.4.1
3585 + '@eslint/core': 0.16.0
3586 + '@eslint/eslintrc': 3.3.1
3587 + '@eslint/js': 9.38.0
3588 + '@eslint/plugin-kit': 0.4.0
3589 + '@humanfs/node': 0.16.7
3590 + '@humanwhocodes/module-importer': 1.0.1
3591 + '@humanwhocodes/retry': 0.4.3
3592 + '@types/estree': 1.0.8
3593 + ajv: 6.12.6
3594 + chalk: 4.1.2
3595 + cross-spawn: 7.0.6
3596 + debug: 4.4.3
3597 + escape-string-regexp: 4.0.0
3598 + eslint-scope: 8.4.0
3599 + eslint-visitor-keys: 4.2.1
3600 + espree: 10.4.0
3601 + esquery: 1.6.0
3602 + esutils: 2.0.3
3603 + fast-deep-equal: 3.1.3
3604 + file-entry-cache: 8.0.0
3605 + find-up: 5.0.0
3606 + glob-parent: 6.0.2
3607 + ignore: 5.3.2
3608 + imurmurhash: 0.1.4
3609 + is-glob: 4.0.3
3610 + json-stable-stringify-without-jsonify: 1.0.1
3611 + lodash.merge: 4.6.2
3612 + minimatch: 3.1.2
3613 + natural-compare: 1.4.0
3614 + optionator: 0.9.4
3615 + optionalDependencies:
3616 + jiti: 2.6.1
3617 + transitivePeerDependencies:
3618 + - supports-color
3619 +
3620 + espree@10.4.0:
3621 + dependencies:
3622 + acorn: 8.15.0
3623 + acorn-jsx: 5.3.2(acorn@8.15.0)
3624 + eslint-visitor-keys: 4.2.1
3625 +
3626 + esquery@1.6.0:
3627 + dependencies:
3628 + estraverse: 5.3.0
3629 +
3630 + esrecurse@4.3.0:
3631 + dependencies:
3632 + estraverse: 5.3.0
3633 +
3634 + estraverse@5.3.0: {}
3635 +
3636 + estree-util-attach-comments@3.0.0:
3637 + dependencies:
3638 + '@types/estree': 1.0.8
3639 +
3640 + estree-util-build-jsx@3.0.1:
3641 + dependencies:
3642 + '@types/estree-jsx': 1.0.5
3643 + devlop: 1.1.0
3644 + estree-util-is-identifier-name: 3.0.0
3645 + estree-walker: 3.0.3
3646 +
3647 + estree-util-is-identifier-name@3.0.0: {}
3648 +
3649 + estree-util-scope@1.0.0:
3650 + dependencies:
3651 + '@types/estree': 1.0.8
3652 + devlop: 1.1.0
3653 +
3654 + estree-util-to-js@2.0.0:
3655 + dependencies:
3656 + '@types/estree-jsx': 1.0.5
3657 + astring: 1.9.0
3658 + source-map: 0.7.6
3659 +
3660 + estree-util-visit@2.0.0:
3661 + dependencies:
3662 + '@types/estree-jsx': 1.0.5
3663 + '@types/unist': 3.0.3
3664 +
3665 + estree-walker@2.0.2: {}
3666 +
3667 + estree-walker@3.0.3:
3668 + dependencies:
3669 + '@types/estree': 1.0.8
3670 +
3671 + esutils@2.0.3: {}
3672 +
3673 + eventemitter3@5.0.1: {}
3674 +
3675 + extend@3.0.2: {}
3676 +
3677 + fast-deep-equal@3.1.3: {}
3678 +
3679 + fast-glob@3.3.3:
3680 + dependencies:
3681 + '@nodelib/fs.stat': 2.0.5
3682 + '@nodelib/fs.walk': 1.2.8
3683 + glob-parent: 5.1.2
3684 + merge2: 1.4.1
3685 + micromatch: 4.0.8
3686 +
3687 + fast-json-stable-stringify@2.1.0: {}
3688 +
3689 + fast-levenshtein@2.0.6: {}
3690 +
3691 + fastq@1.19.1:
3692 + dependencies:
3693 + reusify: 1.1.0
3694 +
3695 + fdir@6.5.0(picomatch@4.0.3):
3696 + optionalDependencies:
3697 + picomatch: 4.0.3
3698 +
3699 + file-entry-cache@8.0.0:
3700 + dependencies:
3701 + flat-cache: 4.0.1
3702 +
3703 + fill-range@7.1.1:
3704 + dependencies:
3705 + to-regex-range: 5.0.1
3706 +
3707 + find-up@5.0.0:
3708 + dependencies:
3709 + locate-path: 6.0.0
3710 + path-exists: 4.0.0
3711 +
3712 + flat-cache@4.0.1:
3713 + dependencies:
3714 + flatted: 3.3.3
3715 + keyv: 4.5.4
3716 +
3717 + flatted@3.3.3: {}
3718 +
3719 + flattie@1.1.1: {}
3720 +
3721 + fontace@0.3.1:
3722 + dependencies:
3723 + '@types/fontkit': 2.0.8
3724 + fontkit: 2.0.4
3725 +
3726 + fontkit@2.0.4:
3727 + dependencies:
3728 + '@swc/helpers': 0.5.17
3729 + brotli: 1.3.3
3730 + clone: 2.1.2
3731 + dfa: 1.2.0
3732 + fast-deep-equal: 3.1.3
3733 + restructure: 3.0.2
3734 + tiny-inflate: 1.0.3
3735 + unicode-properties: 1.4.1
3736 + unicode-trie: 2.0.0
3737 +
3738 + fsevents@2.3.3:
3739 + optional: true
3740 +
3741 + get-east-asian-width@1.4.0: {}
3742 +
3743 + get-tsconfig@4.12.0:
3744 + dependencies:
3745 + resolve-pkg-maps: 1.0.0
3746 +
3747 + github-slugger@2.0.0: {}
3748 +
3749 + glob-parent@5.1.2:
3750 + dependencies:
3751 + is-glob: 4.0.3
3752 +
3753 + glob-parent@6.0.2:
3754 + dependencies:
3755 + is-glob: 4.0.3
3756 +
3757 + globals@14.0.0: {}
3758 +
3759 + globals@15.15.0: {}
3760 +
3761 + globals@16.4.0: {}
3762 +
3763 + graceful-fs@4.2.11: {}
3764 +
3765 + graphemer@1.4.0: {}
3766 +
3767 + h3@1.15.4:
3768 + dependencies:
3769 + cookie-es: 1.2.2
3770 + crossws: 0.3.5
3771 + defu: 6.1.4
3772 + destr: 2.0.5
3773 + iron-webcrypto: 1.2.1
3774 + node-mock-http: 1.0.3
3775 + radix3: 1.1.2
3776 + ufo: 1.6.1
3777 + uncrypto: 0.1.3
3778 +
3779 + has-flag@4.0.0: {}
3780 +
3781 + hast-util-from-dom@5.0.1:
3782 + dependencies:
3783 + '@types/hast': 3.0.4
3784 + hastscript: 9.0.1
3785 + web-namespaces: 2.0.1
3786 +
3787 + hast-util-from-html-isomorphic@2.0.0:
3788 + dependencies:
3789 + '@types/hast': 3.0.4
3790 + hast-util-from-dom: 5.0.1
3791 + hast-util-from-html: 2.0.3
3792 + unist-util-remove-position: 5.0.0
3793 +
3794 + hast-util-from-html@2.0.3:
3795 + dependencies:
3796 + '@types/hast': 3.0.4
3797 + devlop: 1.1.0
3798 + hast-util-from-parse5: 8.0.3
3799 + parse5: 7.3.0
3800 + vfile: 6.0.3
3801 + vfile-message: 4.0.3
3802 +
3803 + hast-util-from-parse5@8.0.3:
3804 + dependencies:
3805 + '@types/hast': 3.0.4
3806 + '@types/unist': 3.0.3
3807 + devlop: 1.1.0
3808 + hastscript: 9.0.1
3809 + property-information: 7.1.0
3810 + vfile: 6.0.3
3811 + vfile-location: 5.0.3
3812 + web-namespaces: 2.0.1
3813 +
3814 + hast-util-is-element@3.0.0:
3815 + dependencies:
3816 + '@types/hast': 3.0.4
3817 +
3818 + hast-util-parse-selector@4.0.0:
3819 + dependencies:
3820 + '@types/hast': 3.0.4
3821 +
3822 + hast-util-raw@9.1.0:
3823 + dependencies:
3824 + '@types/hast': 3.0.4
3825 + '@types/unist': 3.0.3
3826 + '@ungap/structured-clone': 1.3.0
3827 + hast-util-from-parse5: 8.0.3
3828 + hast-util-to-parse5: 8.0.0
3829 + html-void-elements: 3.0.0
3830 + mdast-util-to-hast: 13.2.0
3831 + parse5: 7.3.0
3832 + unist-util-position: 5.0.0
3833 + unist-util-visit: 5.0.0
3834 + vfile: 6.0.3
3835 + web-namespaces: 2.0.1
3836 + zwitch: 2.0.4
3837 +
3838 + hast-util-to-estree@3.1.3:
3839 + dependencies:
3840 + '@types/estree': 1.0.8
3841 + '@types/estree-jsx': 1.0.5
3842 + '@types/hast': 3.0.4
3843 + comma-separated-tokens: 2.0.3
3844 + devlop: 1.1.0
3845 + estree-util-attach-comments: 3.0.0
3846 + estree-util-is-identifier-name: 3.0.0
3847 + hast-util-whitespace: 3.0.0
3848 + mdast-util-mdx-expression: 2.0.1
3849 + mdast-util-mdx-jsx: 3.2.0
3850 + mdast-util-mdxjs-esm: 2.0.1
3851 + property-information: 7.1.0
3852 + space-separated-tokens: 2.0.2
3853 + style-to-js: 1.1.18
3854 + unist-util-position: 5.0.0
3855 + zwitch: 2.0.4
3856 + transitivePeerDependencies:
3857 + - supports-color
3858 +
3859 + hast-util-to-html@9.0.5:
3860 + dependencies:
3861 + '@types/hast': 3.0.4
3862 + '@types/unist': 3.0.3
3863 + ccount: 2.0.1
3864 + comma-separated-tokens: 2.0.3
3865 + hast-util-whitespace: 3.0.0
3866 + html-void-elements: 3.0.0
3867 + mdast-util-to-hast: 13.2.0
3868 + property-information: 7.1.0
3869 + space-separated-tokens: 2.0.2
3870 + stringify-entities: 4.0.4
3871 + zwitch: 2.0.4
3872 +
3873 + hast-util-to-jsx-runtime@2.3.6:
3874 + dependencies:
3875 + '@types/estree': 1.0.8
3876 + '@types/hast': 3.0.4
3877 + '@types/unist': 3.0.3
3878 + comma-separated-tokens: 2.0.3
3879 + devlop: 1.1.0
3880 + estree-util-is-identifier-name: 3.0.0
3881 + hast-util-whitespace: 3.0.0
3882 + mdast-util-mdx-expression: 2.0.1
3883 + mdast-util-mdx-jsx: 3.2.0
3884 + mdast-util-mdxjs-esm: 2.0.1
3885 + property-information: 7.1.0
3886 + space-separated-tokens: 2.0.2
3887 + style-to-js: 1.1.18
3888 + unist-util-position: 5.0.0
3889 + vfile-message: 4.0.3
3890 + transitivePeerDependencies:
3891 + - supports-color
3892 +
3893 + hast-util-to-parse5@8.0.0:
3894 + dependencies:
3895 + '@types/hast': 3.0.4
3896 + comma-separated-tokens: 2.0.3
3897 + devlop: 1.1.0
3898 + property-information: 6.5.0
3899 + space-separated-tokens: 2.0.2
3900 + web-namespaces: 2.0.1
3901 + zwitch: 2.0.4
3902 +
3903 + hast-util-to-text@4.0.2:
3904 + dependencies:
3905 + '@types/hast': 3.0.4
3906 + '@types/unist': 3.0.3
3907 + hast-util-is-element: 3.0.0
3908 + unist-util-find-after: 5.0.0
3909 +
3910 + hast-util-whitespace@3.0.0:
3911 + dependencies:
3912 + '@types/hast': 3.0.4
3913 +
3914 + hastscript@9.0.1:
3915 + dependencies:
3916 + '@types/hast': 3.0.4
3917 + comma-separated-tokens: 2.0.3
3918 + hast-util-parse-selector: 4.0.0
3919 + property-information: 7.1.0
3920 + space-separated-tokens: 2.0.2
3921 +
3922 + html-escaper@3.0.3: {}
3923 +
3924 + html-void-elements@3.0.0: {}
3925 +
3926 + http-cache-semantics@4.2.0: {}
3927 +
3928 + ignore@5.3.2: {}
3929 +
3930 + ignore@7.0.5: {}
3931 +
3932 + import-fresh@3.3.1:
3933 + dependencies:
3934 + parent-module: 1.0.1
3935 + resolve-from: 4.0.0
3936 +
3937 + import-meta-resolve@4.2.0: {}
3938 +
3939 + imurmurhash@0.1.4: {}
3940 +
3941 + inline-style-parser@0.2.4: {}
3942 +
3943 + iron-webcrypto@1.2.1: {}
3944 +
3945 + is-alphabetical@2.0.1: {}
3946 +
3947 + is-alphanumerical@2.0.1:
3948 + dependencies:
3949 + is-alphabetical: 2.0.1
3950 + is-decimal: 2.0.1
3951 +
3952 + is-decimal@2.0.1: {}
3953 +
3954 + is-docker@3.0.0: {}
3955 +
3956 + is-extglob@2.1.1: {}
3957 +
3958 + is-fullwidth-code-point@3.0.0: {}
3959 +
3960 + is-glob@4.0.3:
3961 + dependencies:
3962 + is-extglob: 2.1.1
3963 +
3964 + is-hexadecimal@2.0.1: {}
3965 +
3966 + is-inside-container@1.0.0:
3967 + dependencies:
3968 + is-docker: 3.0.0
3969 +
3970 + is-number@7.0.0: {}
3971 +
3972 + is-plain-obj@4.1.0: {}
3973 +
3974 + is-wsl@3.1.0:
3975 + dependencies:
3976 + is-inside-container: 1.0.0
3977 +
3978 + isexe@2.0.0: {}
3979 +
3980 + jiti@2.6.1: {}
3981 +
3982 + js-yaml@4.1.0:
3983 + dependencies:
3984 + argparse: 2.0.1
3985 +
3986 + json-buffer@3.0.1: {}
3987 +
3988 + json-schema-traverse@0.4.1: {}
3989 +
3990 + json-stable-stringify-without-jsonify@1.0.1: {}
3991 +
3992 + katex@0.16.25:
3993 + dependencies:
3994 + commander: 8.3.0
3995 +
3996 + keyv@4.5.4:
3997 + dependencies:
3998 + json-buffer: 3.0.1
3999 +
4000 + kleur@3.0.3: {}
4001 +
4002 + kleur@4.1.5: {}
4003 +
4004 + levn@0.4.1:
4005 + dependencies:
4006 + prelude-ls: 1.2.1
4007 + type-check: 0.4.0
4008 +
4009 + lightningcss-darwin-arm64@1.30.1:
4010 + optional: true
4011 +
4012 + lightningcss-darwin-x64@1.30.1:
4013 + optional: true
4014 +
4015 + lightningcss-freebsd-x64@1.30.1:
4016 + optional: true
4017 +
4018 + lightningcss-linux-arm-gnueabihf@1.30.1:
4019 + optional: true
4020 +
4021 + lightningcss-linux-arm64-gnu@1.30.1:
4022 + optional: true
4023 +
4024 + lightningcss-linux-arm64-musl@1.30.1:
4025 + optional: true
4026 +
4027 + lightningcss-linux-x64-gnu@1.30.1:
4028 + optional: true
4029 +
4030 + lightningcss-linux-x64-musl@1.30.1:
4031 + optional: true
4032 +
4033 + lightningcss-win32-arm64-msvc@1.30.1:
4034 + optional: true
4035 +
4036 + lightningcss-win32-x64-msvc@1.30.1:
4037 + optional: true
4038 +
4039 + lightningcss@1.30.1:
4040 + dependencies:
4041 + detect-libc: 2.1.2
4042 + optionalDependencies:
4043 + lightningcss-darwin-arm64: 1.30.1
4044 + lightningcss-darwin-x64: 1.30.1
4045 + lightningcss-freebsd-x64: 1.30.1
4046 + lightningcss-linux-arm-gnueabihf: 1.30.1
4047 + lightningcss-linux-arm64-gnu: 1.30.1
4048 + lightningcss-linux-arm64-musl: 1.30.1
4049 + lightningcss-linux-x64-gnu: 1.30.1
4050 + lightningcss-linux-x64-musl: 1.30.1
4051 + lightningcss-win32-arm64-msvc: 1.30.1
4052 + lightningcss-win32-x64-msvc: 1.30.1
4053 +
4054 + locate-path@6.0.0:
4055 + dependencies:
4056 + p-locate: 5.0.0
4057 +
4058 + lodash.merge@4.6.2: {}
4059 +
4060 + longest-streak@3.1.0: {}
4061 +
4062 + lru-cache@10.4.3: {}
4063 +
4064 + magic-string@0.30.19:
4065 + dependencies:
4066 + '@jridgewell/sourcemap-codec': 1.5.5
4067 +
4068 + magicast@0.3.5:
4069 + dependencies:
4070 + '@babel/parser': 7.28.4
4071 + '@babel/types': 7.28.4
4072 + source-map-js: 1.2.1
4073 +
4074 + markdown-extensions@2.0.0: {}
4075 +
4076 + markdown-table@3.0.4: {}
4077 +
4078 + mdast-util-definitions@6.0.0:
4079 + dependencies:
4080 + '@types/mdast': 4.0.4
4081 + '@types/unist': 3.0.3
4082 + unist-util-visit: 5.0.0
4083 +
4084 + mdast-util-directive@3.1.0:
4085 + dependencies:
4086 + '@types/mdast': 4.0.4
4087 + '@types/unist': 3.0.3
4088 + ccount: 2.0.1
4089 + devlop: 1.1.0
4090 + mdast-util-from-markdown: 2.0.2
4091 + mdast-util-to-markdown: 2.1.2
4092 + parse-entities: 4.0.2
4093 + stringify-entities: 4.0.4
4094 + unist-util-visit-parents: 6.0.2
4095 + transitivePeerDependencies:
4096 + - supports-color
4097 +
4098 + mdast-util-find-and-replace@3.0.2:
4099 + dependencies:
4100 + '@types/mdast': 4.0.4
4101 + escape-string-regexp: 5.0.0
4102 + unist-util-is: 6.0.1
4103 + unist-util-visit-parents: 6.0.2
4104 +
4105 + mdast-util-from-markdown@2.0.2:
4106 + dependencies:
4107 + '@types/mdast': 4.0.4
4108 + '@types/unist': 3.0.3
4109 + decode-named-character-reference: 1.2.0
4110 + devlop: 1.1.0
4111 + mdast-util-to-string: 4.0.0
4112 + micromark: 4.0.2
4113 + micromark-util-decode-numeric-character-reference: 2.0.2
4114 + micromark-util-decode-string: 2.0.1
4115 + micromark-util-normalize-identifier: 2.0.1
4116 + micromark-util-symbol: 2.0.1
4117 + micromark-util-types: 2.0.2
4118 + unist-util-stringify-position: 4.0.0
4119 + transitivePeerDependencies:
4120 + - supports-color
4121 +
4122 + mdast-util-gfm-autolink-literal@2.0.1:
4123 + dependencies:
4124 + '@types/mdast': 4.0.4
4125 + ccount: 2.0.1
4126 + devlop: 1.1.0
4127 + mdast-util-find-and-replace: 3.0.2
4128 + micromark-util-character: 2.1.1
4129 +
4130 + mdast-util-gfm-footnote@2.1.0:
4131 + dependencies:
4132 + '@types/mdast': 4.0.4
4133 + devlop: 1.1.0
4134 + mdast-util-from-markdown: 2.0.2
4135 + mdast-util-to-markdown: 2.1.2
4136 + micromark-util-normalize-identifier: 2.0.1
4137 + transitivePeerDependencies:
4138 + - supports-color
4139 +
4140 + mdast-util-gfm-strikethrough@2.0.0:
4141 + dependencies:
4142 + '@types/mdast': 4.0.4
4143 + mdast-util-from-markdown: 2.0.2
4144 + mdast-util-to-markdown: 2.1.2
4145 + transitivePeerDependencies:
4146 + - supports-color
4147 +
4148 + mdast-util-gfm-table@2.0.0:
4149 + dependencies:
4150 + '@types/mdast': 4.0.4
4151 + devlop: 1.1.0
4152 + markdown-table: 3.0.4
4153 + mdast-util-from-markdown: 2.0.2
4154 + mdast-util-to-markdown: 2.1.2
4155 + transitivePeerDependencies:
4156 + - supports-color
4157 +
4158 + mdast-util-gfm-task-list-item@2.0.0:
4159 + dependencies:
4160 + '@types/mdast': 4.0.4
4161 + devlop: 1.1.0
4162 + mdast-util-from-markdown: 2.0.2
4163 + mdast-util-to-markdown: 2.1.2
4164 + transitivePeerDependencies:
4165 + - supports-color
4166 +
4167 + mdast-util-gfm@3.1.0:
4168 + dependencies:
4169 + mdast-util-from-markdown: 2.0.2
4170 + mdast-util-gfm-autolink-literal: 2.0.1
4171 + mdast-util-gfm-footnote: 2.1.0
4172 + mdast-util-gfm-strikethrough: 2.0.0
4173 + mdast-util-gfm-table: 2.0.0
4174 + mdast-util-gfm-task-list-item: 2.0.0
4175 + mdast-util-to-markdown: 2.1.2
4176 + transitivePeerDependencies:
4177 + - supports-color
4178 +
4179 + mdast-util-math@3.0.0:
4180 + dependencies:
4181 + '@types/hast': 3.0.4
4182 + '@types/mdast': 4.0.4
4183 + devlop: 1.1.0
4184 + longest-streak: 3.1.0
4185 + mdast-util-from-markdown: 2.0.2
4186 + mdast-util-to-markdown: 2.1.2
4187 + unist-util-remove-position: 5.0.0
4188 + transitivePeerDependencies:
4189 + - supports-color
4190 +
4191 + mdast-util-mdx-expression@2.0.1:
4192 + dependencies:
4193 + '@types/estree-jsx': 1.0.5
4194 + '@types/hast': 3.0.4
4195 + '@types/mdast': 4.0.4
4196 + devlop: 1.1.0
4197 + mdast-util-from-markdown: 2.0.2
4198 + mdast-util-to-markdown: 2.1.2
4199 + transitivePeerDependencies:
4200 + - supports-color
4201 +
4202 + mdast-util-mdx-jsx@3.2.0:
4203 + dependencies:
4204 + '@types/estree-jsx': 1.0.5
4205 + '@types/hast': 3.0.4
4206 + '@types/mdast': 4.0.4
4207 + '@types/unist': 3.0.3
4208 + ccount: 2.0.1
4209 + devlop: 1.1.0
4210 + mdast-util-from-markdown: 2.0.2
4211 + mdast-util-to-markdown: 2.1.2
4212 + parse-entities: 4.0.2
4213 + stringify-entities: 4.0.4
4214 + unist-util-stringify-position: 4.0.0
4215 + vfile-message: 4.0.3
4216 + transitivePeerDependencies:
4217 + - supports-color
4218 +
4219 + mdast-util-mdx@3.0.0:
4220 + dependencies:
4221 + mdast-util-from-markdown: 2.0.2
4222 + mdast-util-mdx-expression: 2.0.1
4223 + mdast-util-mdx-jsx: 3.2.0
4224 + mdast-util-mdxjs-esm: 2.0.1
4225 + mdast-util-to-markdown: 2.1.2
4226 + transitivePeerDependencies:
4227 + - supports-color
4228 +
4229 + mdast-util-mdxjs-esm@2.0.1:
4230 + dependencies:
4231 + '@types/estree-jsx': 1.0.5
4232 + '@types/hast': 3.0.4
4233 + '@types/mdast': 4.0.4
4234 + devlop: 1.1.0
4235 + mdast-util-from-markdown: 2.0.2
4236 + mdast-util-to-markdown: 2.1.2
4237 + transitivePeerDependencies:
4238 + - supports-color
4239 +
4240 + mdast-util-phrasing@4.1.0:
4241 + dependencies:
4242 + '@types/mdast': 4.0.4
4243 + unist-util-is: 6.0.1
4244 +
4245 + mdast-util-to-hast@13.2.0:
4246 + dependencies:
4247 + '@types/hast': 3.0.4
4248 + '@types/mdast': 4.0.4
4249 + '@ungap/structured-clone': 1.3.0
4250 + devlop: 1.1.0
4251 + micromark-util-sanitize-uri: 2.0.1
4252 + trim-lines: 3.0.1
4253 + unist-util-position: 5.0.0
4254 + unist-util-visit: 5.0.0
4255 + vfile: 6.0.3
4256 +
4257 + mdast-util-to-markdown@2.1.2:
4258 + dependencies:
4259 + '@types/mdast': 4.0.4
4260 + '@types/unist': 3.0.3
4261 + longest-streak: 3.1.0
4262 + mdast-util-phrasing: 4.1.0
4263 + mdast-util-to-string: 4.0.0
4264 + micromark-util-classify-character: 2.0.1
4265 + micromark-util-decode-string: 2.0.1
4266 + unist-util-visit: 5.0.0
4267 + zwitch: 2.0.4
4268 +
4269 + mdast-util-to-string@4.0.0:
4270 + dependencies:
4271 + '@types/mdast': 4.0.4
4272 +
4273 + mdn-data@2.12.2: {}
4274 +
4275 + merge2@1.4.1: {}
4276 +
4277 + micromark-core-commonmark@2.0.3:
4278 + dependencies:
4279 + decode-named-character-reference: 1.2.0
4280 + devlop: 1.1.0
4281 + micromark-factory-destination: 2.0.1
4282 + micromark-factory-label: 2.0.1
4283 + micromark-factory-space: 2.0.1
4284 + micromark-factory-title: 2.0.1
4285 + micromark-factory-whitespace: 2.0.1
4286 + micromark-util-character: 2.1.1
4287 + micromark-util-chunked: 2.0.1
4288 + micromark-util-classify-character: 2.0.1
4289 + micromark-util-html-tag-name: 2.0.1
4290 + micromark-util-normalize-identifier: 2.0.1
4291 + micromark-util-resolve-all: 2.0.1
4292 + micromark-util-subtokenize: 2.1.0
4293 + micromark-util-symbol: 2.0.1
4294 + micromark-util-types: 2.0.2
4295 +
4296 + micromark-extension-directive@4.0.0:
4297 + dependencies:
4298 + devlop: 1.1.0
4299 + micromark-factory-space: 2.0.1
4300 + micromark-factory-whitespace: 2.0.1
4301 + micromark-util-character: 2.1.1
4302 + micromark-util-symbol: 2.0.1
4303 + micromark-util-types: 2.0.2
4304 + parse-entities: 4.0.2
4305 +
4306 + micromark-extension-gfm-autolink-literal@2.1.0:
4307 + dependencies:
4308 + micromark-util-character: 2.1.1
4309 + micromark-util-sanitize-uri: 2.0.1
4310 + micromark-util-symbol: 2.0.1
4311 + micromark-util-types: 2.0.2
4312 +
4313 + micromark-extension-gfm-footnote@2.1.0:
4314 + dependencies:
4315 + devlop: 1.1.0
4316 + micromark-core-commonmark: 2.0.3
4317 + micromark-factory-space: 2.0.1
4318 + micromark-util-character: 2.1.1
4319 + micromark-util-normalize-identifier: 2.0.1
4320 + micromark-util-sanitize-uri: 2.0.1
4321 + micromark-util-symbol: 2.0.1
4322 + micromark-util-types: 2.0.2
4323 +
4324 + micromark-extension-gfm-strikethrough@2.1.0:
4325 + dependencies:
4326 + devlop: 1.1.0
4327 + micromark-util-chunked: 2.0.1
4328 + micromark-util-classify-character: 2.0.1
4329 + micromark-util-resolve-all: 2.0.1
4330 + micromark-util-symbol: 2.0.1
4331 + micromark-util-types: 2.0.2
4332 +
4333 + micromark-extension-gfm-table@2.1.1:
4334 + dependencies:
4335 + devlop: 1.1.0
4336 + micromark-factory-space: 2.0.1
4337 + micromark-util-character: 2.1.1
4338 + micromark-util-symbol: 2.0.1
4339 + micromark-util-types: 2.0.2
4340 +
4341 + micromark-extension-gfm-tagfilter@2.0.0:
4342 + dependencies:
4343 + micromark-util-types: 2.0.2
4344 +
4345 + micromark-extension-gfm-task-list-item@2.1.0:
4346 + dependencies:
4347 + devlop: 1.1.0
4348 + micromark-factory-space: 2.0.1
4349 + micromark-util-character: 2.1.1
4350 + micromark-util-symbol: 2.0.1
4351 + micromark-util-types: 2.0.2
4352 +
4353 + micromark-extension-gfm@3.0.0:
4354 + dependencies:
4355 + micromark-extension-gfm-autolink-literal: 2.1.0
4356 + micromark-extension-gfm-footnote: 2.1.0
4357 + micromark-extension-gfm-strikethrough: 2.1.0
4358 + micromark-extension-gfm-table: 2.1.1
4359 + micromark-extension-gfm-tagfilter: 2.0.0
4360 + micromark-extension-gfm-task-list-item: 2.1.0
4361 + micromark-util-combine-extensions: 2.0.1
4362 + micromark-util-types: 2.0.2
4363 +
4364 + micromark-extension-math@3.1.0:
4365 + dependencies:
4366 + '@types/katex': 0.16.7
4367 + devlop: 1.1.0
4368 + katex: 0.16.25
4369 + micromark-factory-space: 2.0.1
4370 + micromark-util-character: 2.1.1
4371 + micromark-util-symbol: 2.0.1
4372 + micromark-util-types: 2.0.2
4373 +
4374 + micromark-extension-mdx-expression@3.0.1:
4375 + dependencies:
4376 + '@types/estree': 1.0.8
4377 + devlop: 1.1.0
4378 + micromark-factory-mdx-expression: 2.0.3
4379 + micromark-factory-space: 2.0.1
4380 + micromark-util-character: 2.1.1
4381 + micromark-util-events-to-acorn: 2.0.3
4382 + micromark-util-symbol: 2.0.1
4383 + micromark-util-types: 2.0.2
4384 +
4385 + micromark-extension-mdx-jsx@3.0.2:
4386 + dependencies:
4387 + '@types/estree': 1.0.8
4388 + devlop: 1.1.0
4389 + estree-util-is-identifier-name: 3.0.0
4390 + micromark-factory-mdx-expression: 2.0.3
4391 + micromark-factory-space: 2.0.1
4392 + micromark-util-character: 2.1.1
4393 + micromark-util-events-to-acorn: 2.0.3
4394 + micromark-util-symbol: 2.0.1
4395 + micromark-util-types: 2.0.2
4396 + vfile-message: 4.0.3
4397 +
4398 + micromark-extension-mdx-md@2.0.0:
4399 + dependencies:
4400 + micromark-util-types: 2.0.2
4401 +
4402 + micromark-extension-mdxjs-esm@3.0.0:
4403 + dependencies:
4404 + '@types/estree': 1.0.8
4405 + devlop: 1.1.0
4406 + micromark-core-commonmark: 2.0.3
4407 + micromark-util-character: 2.1.1
4408 + micromark-util-events-to-acorn: 2.0.3
4409 + micromark-util-symbol: 2.0.1
4410 + micromark-util-types: 2.0.2
4411 + unist-util-position-from-estree: 2.0.0
4412 + vfile-message: 4.0.3
4413 +
4414 + micromark-extension-mdxjs@3.0.0:
4415 + dependencies:
4416 + acorn: 8.15.0
4417 + acorn-jsx: 5.3.2(acorn@8.15.0)
4418 + micromark-extension-mdx-expression: 3.0.1
4419 + micromark-extension-mdx-jsx: 3.0.2
4420 + micromark-extension-mdx-md: 2.0.0
4421 + micromark-extension-mdxjs-esm: 3.0.0
4422 + micromark-util-combine-extensions: 2.0.1
4423 + micromark-util-types: 2.0.2
4424 +
4425 + micromark-factory-destination@2.0.1:
4426 + dependencies:
4427 + micromark-util-character: 2.1.1
4428 + micromark-util-symbol: 2.0.1
4429 + micromark-util-types: 2.0.2
4430 +
4431 + micromark-factory-label@2.0.1:
4432 + dependencies:
4433 + devlop: 1.1.0
4434 + micromark-util-character: 2.1.1
4435 + micromark-util-symbol: 2.0.1
4436 + micromark-util-types: 2.0.2
4437 +
4438 + micromark-factory-mdx-expression@2.0.3:
4439 + dependencies:
4440 + '@types/estree': 1.0.8
4441 + devlop: 1.1.0
4442 + micromark-factory-space: 2.0.1
4443 + micromark-util-character: 2.1.1
4444 + micromark-util-events-to-acorn: 2.0.3
4445 + micromark-util-symbol: 2.0.1
4446 + micromark-util-types: 2.0.2
4447 + unist-util-position-from-estree: 2.0.0
4448 + vfile-message: 4.0.3
4449 +
4450 + micromark-factory-space@2.0.1:
4451 + dependencies:
4452 + micromark-util-character: 2.1.1
4453 + micromark-util-types: 2.0.2
4454 +
4455 + micromark-factory-title@2.0.1:
4456 + dependencies:
4457 + micromark-factory-space: 2.0.1
4458 + micromark-util-character: 2.1.1
4459 + micromark-util-symbol: 2.0.1
4460 + micromark-util-types: 2.0.2
4461 +
4462 + micromark-factory-whitespace@2.0.1:
4463 + dependencies:
4464 + micromark-factory-space: 2.0.1
4465 + micromark-util-character: 2.1.1
4466 + micromark-util-symbol: 2.0.1
4467 + micromark-util-types: 2.0.2
4468 +
4469 + micromark-util-character@2.1.1:
4470 + dependencies:
4471 + micromark-util-symbol: 2.0.1
4472 + micromark-util-types: 2.0.2
4473 +
4474 + micromark-util-chunked@2.0.1:
4475 + dependencies:
4476 + micromark-util-symbol: 2.0.1
4477 +
4478 + micromark-util-classify-character@2.0.1:
4479 + dependencies:
4480 + micromark-util-character: 2.1.1
4481 + micromark-util-symbol: 2.0.1
4482 + micromark-util-types: 2.0.2
4483 +
4484 + micromark-util-combine-extensions@2.0.1:
4485 + dependencies:
4486 + micromark-util-chunked: 2.0.1
4487 + micromark-util-types: 2.0.2
4488 +
4489 + micromark-util-decode-numeric-character-reference@2.0.2:
4490 + dependencies:
4491 + micromark-util-symbol: 2.0.1
4492 +
4493 + micromark-util-decode-string@2.0.1:
4494 + dependencies:
4495 + decode-named-character-reference: 1.2.0
4496 + micromark-util-character: 2.1.1
4497 + micromark-util-decode-numeric-character-reference: 2.0.2
4498 + micromark-util-symbol: 2.0.1
4499 +
4500 + micromark-util-encode@2.0.1: {}
4501 +
4502 + micromark-util-events-to-acorn@2.0.3:
4503 + dependencies:
4504 + '@types/estree': 1.0.8
4505 + '@types/unist': 3.0.3
4506 + devlop: 1.1.0
4507 + estree-util-visit: 2.0.0
4508 + micromark-util-symbol: 2.0.1
4509 + micromark-util-types: 2.0.2
4510 + vfile-message: 4.0.3
4511 +
4512 + micromark-util-html-tag-name@2.0.1: {}
4513 +
4514 + micromark-util-normalize-identifier@2.0.1:
4515 + dependencies:
4516 + micromark-util-symbol: 2.0.1
4517 +
4518 + micromark-util-resolve-all@2.0.1:
4519 + dependencies:
4520 + micromark-util-types: 2.0.2
4521 +
4522 + micromark-util-sanitize-uri@2.0.1:
4523 + dependencies:
4524 + micromark-util-character: 2.1.1
4525 + micromark-util-encode: 2.0.1
4526 + micromark-util-symbol: 2.0.1
4527 +
4528 + micromark-util-subtokenize@2.1.0:
4529 + dependencies:
4530 + devlop: 1.1.0
4531 + micromark-util-chunked: 2.0.1
4532 + micromark-util-symbol: 2.0.1
4533 + micromark-util-types: 2.0.2
4534 +
4535 + micromark-util-symbol@2.0.1: {}
4536 +
4537 + micromark-util-types@2.0.2: {}
4538 +
4539 + micromark@4.0.2:
4540 + dependencies:
4541 + '@types/debug': 4.1.12
4542 + debug: 4.4.3
4543 + decode-named-character-reference: 1.2.0
4544 + devlop: 1.1.0
4545 + micromark-core-commonmark: 2.0.3
4546 + micromark-factory-space: 2.0.1
4547 + micromark-util-character: 2.1.1
4548 + micromark-util-chunked: 2.0.1
4549 + micromark-util-combine-extensions: 2.0.1
4550 + micromark-util-decode-numeric-character-reference: 2.0.2
4551 + micromark-util-encode: 2.0.1
4552 + micromark-util-normalize-identifier: 2.0.1
4553 + micromark-util-resolve-all: 2.0.1
4554 + micromark-util-sanitize-uri: 2.0.1
4555 + micromark-util-subtokenize: 2.1.0
4556 + micromark-util-symbol: 2.0.1
4557 + micromark-util-types: 2.0.2
4558 + transitivePeerDependencies:
4559 + - supports-color
4560 +
4561 + micromatch@4.0.8:
4562 + dependencies:
4563 + braces: 3.0.3
4564 + picomatch: 2.3.1
4565 +
4566 + minimatch@3.1.2:
4567 + dependencies:
4568 + brace-expansion: 1.1.12
4569 +
4570 + minimatch@9.0.5:
4571 + dependencies:
4572 + brace-expansion: 2.0.2
4573 +
4574 + minipass@7.1.2: {}
4575 +
4576 + minizlib@3.1.0:
4577 + dependencies:
4578 + minipass: 7.1.2
4579 +
4580 + mrmime@2.0.1: {}
4581 +
4582 + ms@2.1.3: {}
4583 +
4584 + nanoid@3.3.11: {}
4585 +
4586 + natural-compare@1.4.0: {}
4587 +
4588 + neotraverse@0.6.18: {}
4589 +
4590 + nlcst-to-string@4.0.0:
4591 + dependencies:
4592 + '@types/nlcst': 2.0.3
4593 +
4594 + node-fetch-native@1.6.7: {}
4595 +
4596 + node-mock-http@1.0.3: {}
4597 +
4598 + normalize-path@3.0.0: {}
4599 +
4600 + ofetch@1.4.1:
4601 + dependencies:
4602 + destr: 2.0.5
4603 + node-fetch-native: 1.6.7
4604 + ufo: 1.6.1
4605 +
4606 + ohash@2.0.11: {}
4607 +
4608 + oniguruma-parser@0.12.1: {}
4609 +
4610 + oniguruma-to-es@4.3.3:
4611 + dependencies:
4612 + oniguruma-parser: 0.12.1
4613 + regex: 6.0.1
4614 + regex-recursion: 6.0.2
4615 +
4616 + optionator@0.9.4:
4617 + dependencies:
4618 + deep-is: 0.1.4
4619 + fast-levenshtein: 2.0.6
4620 + levn: 0.4.1
4621 + prelude-ls: 1.2.1
4622 + type-check: 0.4.0
4623 + word-wrap: 1.2.5
4624 +
4625 + p-limit@3.1.0:
4626 + dependencies:
4627 + yocto-queue: 0.1.0
4628 +
4629 + p-limit@6.2.0:
4630 + dependencies:
4631 + yocto-queue: 1.2.1
4632 +
4633 + p-locate@5.0.0:
4634 + dependencies:
4635 + p-limit: 3.1.0
4636 +
4637 + p-queue@8.1.1:
4638 + dependencies:
4639 + eventemitter3: 5.0.1
4640 + p-timeout: 6.1.4
4641 +
4642 + p-timeout@6.1.4: {}
4643 +
4644 + package-manager-detector@1.4.1: {}
4645 +
4646 + pako@0.2.9: {}
4647 +
4648 + parent-module@1.0.1:
4649 + dependencies:
4650 + callsites: 3.1.0
4651 +
4652 + parse-entities@4.0.2:
4653 + dependencies:
4654 + '@types/unist': 2.0.11
4655 + character-entities-legacy: 3.0.0
4656 + character-reference-invalid: 2.0.1
4657 + decode-named-character-reference: 1.2.0
4658 + is-alphanumerical: 2.0.1
4659 + is-decimal: 2.0.1
4660 + is-hexadecimal: 2.0.1
4661 +
4662 + parse-latin@7.0.0:
4663 + dependencies:
4664 + '@types/nlcst': 2.0.3
4665 + '@types/unist': 3.0.3
4666 + nlcst-to-string: 4.0.0
4667 + unist-util-modify-children: 4.0.0
4668 + unist-util-visit-children: 3.0.0
4669 + vfile: 6.0.3
4670 +
4671 + parse5@7.3.0:
4672 + dependencies:
4673 + entities: 6.0.1
4674 +
4675 + path-exists@4.0.0: {}
4676 +
4677 + path-key@3.1.1: {}
4678 +
4679 + picocolors@1.1.1: {}
4680 +
4681 + picomatch@2.3.1: {}
4682 +
4683 + picomatch@4.0.3: {}
4684 +
4685 + postcss-selector-parser@7.1.0:
4686 + dependencies:
4687 + cssesc: 3.0.0
4688 + util-deprecate: 1.0.2
4689 +
4690 + postcss@8.5.6:
4691 + dependencies:
4692 + nanoid: 3.3.11
4693 + picocolors: 1.1.1
4694 + source-map-js: 1.2.1
4695 +
4696 + prelude-ls@1.2.1: {}
4697 +
4698 + prettier-plugin-astro@0.14.1:
4699 + dependencies:
4700 + '@astrojs/compiler': 2.13.0
4701 + prettier: 3.6.2
4702 + sass-formatter: 0.7.9
4703 +
4704 + prettier@3.6.2: {}
4705 +
4706 + prismjs@1.30.0: {}
4707 +
4708 + prompts@2.4.2:
4709 + dependencies:
4710 + kleur: 3.0.3
4711 + sisteransi: 1.0.5
4712 +
4713 + property-information@6.5.0: {}
4714 +
4715 + property-information@7.1.0: {}
4716 +
4717 + punycode@2.3.1: {}
4718 +
4719 + queue-microtask@1.2.3: {}
4720 +
4721 + radix3@1.1.2: {}
4722 +
4723 + readdirp@4.1.2: {}
4724 +
4725 + reading-time@1.5.0: {}
4726 +
4727 + recma-build-jsx@1.0.0:
4728 + dependencies:
4729 + '@types/estree': 1.0.8
4730 + estree-util-build-jsx: 3.0.1
4731 + vfile: 6.0.3
4732 +
4733 + recma-jsx@1.0.1(acorn@8.15.0):
4734 + dependencies:
4735 + acorn: 8.15.0
4736 + acorn-jsx: 5.3.2(acorn@8.15.0)
4737 + estree-util-to-js: 2.0.0
4738 + recma-parse: 1.0.0
4739 + recma-stringify: 1.0.0
4740 + unified: 11.0.5
4741 +
4742 + recma-parse@1.0.0:
4743 + dependencies:
4744 + '@types/estree': 1.0.8
4745 + esast-util-from-js: 2.0.1
4746 + unified: 11.0.5
4747 + vfile: 6.0.3
4748 +
4749 + recma-stringify@1.0.0:
4750 + dependencies:
4751 + '@types/estree': 1.0.8
4752 + estree-util-to-js: 2.0.0
4753 + unified: 11.0.5
4754 + vfile: 6.0.3
4755 +
4756 + regex-recursion@6.0.2:
4757 + dependencies:
4758 + regex-utilities: 2.3.0
4759 +
4760 + regex-utilities@2.3.0: {}
4761 +
4762 + regex@6.0.1:
4763 + dependencies:
4764 + regex-utilities: 2.3.0
4765 +
4766 + rehype-katex@7.0.1:
4767 + dependencies:
4768 + '@types/hast': 3.0.4
4769 + '@types/katex': 0.16.7
4770 + hast-util-from-html-isomorphic: 2.0.0
4771 + hast-util-to-text: 4.0.2
4772 + katex: 0.16.25
4773 + unist-util-visit-parents: 6.0.2
4774 + vfile: 6.0.3
4775 +
4776 + rehype-parse@9.0.1:
4777 + dependencies:
4778 + '@types/hast': 3.0.4
4779 + hast-util-from-html: 2.0.3
4780 + unified: 11.0.5
4781 +
4782 + rehype-raw@7.0.0:
4783 + dependencies:
4784 + '@types/hast': 3.0.4
4785 + hast-util-raw: 9.1.0
4786 + vfile: 6.0.3
4787 +
4788 + rehype-recma@1.0.0:
4789 + dependencies:
4790 + '@types/estree': 1.0.8
4791 + '@types/hast': 3.0.4
4792 + hast-util-to-estree: 3.1.3
4793 + transitivePeerDependencies:
4794 + - supports-color
4795 +
4796 + rehype-stringify@10.0.1:
4797 + dependencies:
4798 + '@types/hast': 3.0.4
4799 + hast-util-to-html: 9.0.5
4800 + unified: 11.0.5
4801 +
4802 + rehype@13.0.2:
4803 + dependencies:
4804 + '@types/hast': 3.0.4
4805 + rehype-parse: 9.0.1
4806 + rehype-stringify: 10.0.1
4807 + unified: 11.0.5
4808 +
4809 + remark-directive@4.0.0:
4810 + dependencies:
4811 + '@types/mdast': 4.0.4
4812 + mdast-util-directive: 3.1.0
4813 + micromark-extension-directive: 4.0.0
4814 + unified: 11.0.5
4815 + transitivePeerDependencies:
4816 + - supports-color
4817 +
4818 + remark-gfm@4.0.1:
4819 + dependencies:
4820 + '@types/mdast': 4.0.4
4821 + mdast-util-gfm: 3.1.0
4822 + micromark-extension-gfm: 3.0.0
4823 + remark-parse: 11.0.0
4824 + remark-stringify: 11.0.0
4825 + unified: 11.0.5
4826 + transitivePeerDependencies:
4827 + - supports-color
4828 +
4829 + remark-math@6.0.0:
4830 + dependencies:
4831 + '@types/mdast': 4.0.4
4832 + mdast-util-math: 3.0.0
4833 + micromark-extension-math: 3.1.0
4834 + unified: 11.0.5
4835 + transitivePeerDependencies:
4836 + - supports-color
4837 +
4838 + remark-mdx@3.1.1:
4839 + dependencies:
4840 + mdast-util-mdx: 3.0.0
4841 + micromark-extension-mdxjs: 3.0.0
4842 + transitivePeerDependencies:
4843 + - supports-color
4844 +
4845 + remark-parse@11.0.0:
4846 + dependencies:
4847 + '@types/mdast': 4.0.4
4848 + mdast-util-from-markdown: 2.0.2
4849 + micromark-util-types: 2.0.2
4850 + unified: 11.0.5
4851 + transitivePeerDependencies:
4852 + - supports-color
4853 +
4854 + remark-rehype@11.1.2:
4855 + dependencies:
4856 + '@types/hast': 3.0.4
4857 + '@types/mdast': 4.0.4
4858 + mdast-util-to-hast: 13.2.0
4859 + unified: 11.0.5
4860 + vfile: 6.0.3
4861 +
4862 + remark-smartypants@3.0.2:
4863 + dependencies:
4864 + retext: 9.0.0
4865 + retext-smartypants: 6.2.0
4866 + unified: 11.0.5
4867 + unist-util-visit: 5.0.0
4868 +
4869 + remark-stringify@11.0.0:
4870 + dependencies:
4871 + '@types/mdast': 4.0.4
4872 + mdast-util-to-markdown: 2.1.2
4873 + unified: 11.0.5
4874 +
4875 + resolve-from@4.0.0: {}
4876 +
4877 + resolve-pkg-maps@1.0.0: {}
4878 +
4879 + restructure@3.0.2: {}
4880 +
4881 + retext-latin@4.0.0:
4882 + dependencies:
4883 + '@types/nlcst': 2.0.3
4884 + parse-latin: 7.0.0
4885 + unified: 11.0.5
4886 +
4887 + retext-smartypants@6.2.0:
4888 + dependencies:
4889 + '@types/nlcst': 2.0.3
4890 + nlcst-to-string: 4.0.0
4891 + unist-util-visit: 5.0.0
4892 +
4893 + retext-stringify@4.0.0:
4894 + dependencies:
4895 + '@types/nlcst': 2.0.3
4896 + nlcst-to-string: 4.0.0
4897 + unified: 11.0.5
4898 +
4899 + retext@9.0.0:
4900 + dependencies:
4901 + '@types/nlcst': 2.0.3
4902 + retext-latin: 4.0.0
4903 + retext-stringify: 4.0.0
4904 + unified: 11.0.5
4905 +
4906 + reusify@1.1.0: {}
4907 +
4908 + rollup@4.52.5:
4909 + dependencies:
4910 + '@types/estree': 1.0.8
4911 + optionalDependencies:
4912 + '@rollup/rollup-android-arm-eabi': 4.52.5
4913 + '@rollup/rollup-android-arm64': 4.52.5
4914 + '@rollup/rollup-darwin-arm64': 4.52.5
4915 + '@rollup/rollup-darwin-x64': 4.52.5
4916 + '@rollup/rollup-freebsd-arm64': 4.52.5
4917 + '@rollup/rollup-freebsd-x64': 4.52.5
4918 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5
4919 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5
4920 + '@rollup/rollup-linux-arm64-gnu': 4.52.5
4921 + '@rollup/rollup-linux-arm64-musl': 4.52.5
4922 + '@rollup/rollup-linux-loong64-gnu': 4.52.5
4923 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5
4924 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5
4925 + '@rollup/rollup-linux-riscv64-musl': 4.52.5
4926 + '@rollup/rollup-linux-s390x-gnu': 4.52.5
4927 + '@rollup/rollup-linux-x64-gnu': 4.52.5
4928 + '@rollup/rollup-linux-x64-musl': 4.52.5
4929 + '@rollup/rollup-openharmony-arm64': 4.52.5
4930 + '@rollup/rollup-win32-arm64-msvc': 4.52.5
4931 + '@rollup/rollup-win32-ia32-msvc': 4.52.5
4932 + '@rollup/rollup-win32-x64-gnu': 4.52.5
4933 + '@rollup/rollup-win32-x64-msvc': 4.52.5
4934 + fsevents: 2.3.3
4935 +
4936 + run-parallel@1.2.0:
4937 + dependencies:
4938 + queue-microtask: 1.2.3
4939 +
4940 + s.color@0.0.15: {}
4941 +
4942 + sass-formatter@0.7.9:
4943 + dependencies:
4944 + suf-log: 2.5.3
4945 +
4946 + sax@1.4.1: {}
4947 +
4948 + semver@7.7.3: {}
4949 +
4950 + sharp@0.34.4:
4951 + dependencies:
4952 + '@img/colour': 1.0.0
4953 + detect-libc: 2.1.2
4954 + semver: 7.7.3
4955 + optionalDependencies:
4956 + '@img/sharp-darwin-arm64': 0.34.4
4957 + '@img/sharp-darwin-x64': 0.34.4
4958 + '@img/sharp-libvips-darwin-arm64': 1.2.3
4959 + '@img/sharp-libvips-darwin-x64': 1.2.3
4960 + '@img/sharp-libvips-linux-arm': 1.2.3
4961 + '@img/sharp-libvips-linux-arm64': 1.2.3
4962 + '@img/sharp-libvips-linux-ppc64': 1.2.3
4963 + '@img/sharp-libvips-linux-s390x': 1.2.3
4964 + '@img/sharp-libvips-linux-x64': 1.2.3
4965 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3
4966 + '@img/sharp-libvips-linuxmusl-x64': 1.2.3
4967 + '@img/sharp-linux-arm': 0.34.4
4968 + '@img/sharp-linux-arm64': 0.34.4
4969 + '@img/sharp-linux-ppc64': 0.34.4
4970 + '@img/sharp-linux-s390x': 0.34.4
4971 + '@img/sharp-linux-x64': 0.34.4
4972 + '@img/sharp-linuxmusl-arm64': 0.34.4
4973 + '@img/sharp-linuxmusl-x64': 0.34.4
4974 + '@img/sharp-wasm32': 0.34.4
4975 + '@img/sharp-win32-arm64': 0.34.4
4976 + '@img/sharp-win32-ia32': 0.34.4
4977 + '@img/sharp-win32-x64': 0.34.4
4978 +
4979 + shebang-command@2.0.0:
4980 + dependencies:
4981 + shebang-regex: 3.0.0
4982 +
4983 + shebang-regex@3.0.0: {}
4984 +
4985 + shiki@3.13.0:
4986 + dependencies:
4987 + '@shikijs/core': 3.13.0
4988 + '@shikijs/engine-javascript': 3.13.0
4989 + '@shikijs/engine-oniguruma': 3.13.0
4990 + '@shikijs/langs': 3.13.0
4991 + '@shikijs/themes': 3.13.0
4992 + '@shikijs/types': 3.13.0
4993 + '@shikijs/vscode-textmate': 10.0.2
4994 + '@types/hast': 3.0.4
4995 +
4996 + sisteransi@1.0.5: {}
4997 +
4998 + sitemap@8.0.0:
4999 + dependencies:

This file is too large to show in full.

pnpm-workspace.yaml new
+4
@@ -0,0 +1,4 @@
1 +onlyBuiltDependencies:
2 + - '@tailwindcss/oxide'
3 + - esbuild
4 + - sharp
public/apple-touch-icon.png
Binary files /dev/null and b/public/apple-touch-icon.png differ
public/favicon-96x96.png
Binary files /dev/null and b/public/favicon-96x96.png differ
public/favicon.ico
Binary files /dev/null and b/public/favicon.ico differ
public/favicon.svg new
+3
@@ -0,0 +1,3 @@
1 +<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="1024" height="1024" viewBox="0 0 1024 1024"><image width="1024" height="1024" xlink:href="data:image/jpeg;base64,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"></image><style>@media (prefers-color-scheme: light) { :root { filter: none; } }
2 +@media (prefers-color-scheme: dark) { :root { filter: none; } }
3 +</style></svg>
\ No newline at end of file
public/fonts/Besley-Italic.woff2
Binary files /dev/null and b/public/fonts/Besley-Italic.woff2 differ
public/fonts/Inter.woff2
Binary files /dev/null and b/public/fonts/Inter.woff2 differ
public/images/Download_on_the_App_Store_Badge_US-UK_RGB_blk_092917.svg new
+46
@@ -0,0 +1,46 @@
1 +<svg id="livetype" xmlns="http://www.w3.org/2000/svg" width="119.66407" height="40" viewBox="0 0 119.66407 40">
2 + <title>Download_on_the_App_Store_Badge_US-UK_RGB_blk_4SVG_092917</title>
3 + <g>
4 + <g>
5 + <g>
6 + <path d="M110.13477,0H9.53468c-.3667,0-.729,0-1.09473.002-.30615.002-.60986.00781-.91895.0127A13.21476,13.21476,0,0,0,5.5171.19141a6.66509,6.66509,0,0,0-1.90088.627A6.43779,6.43779,0,0,0,1.99757,1.99707,6.25844,6.25844,0,0,0,.81935,3.61816a6.60119,6.60119,0,0,0-.625,1.90332,12.993,12.993,0,0,0-.1792,2.002C.00587,7.83008.00489,8.1377,0,8.44434V31.5586c.00489.3105.00587.6113.01515.9219a12.99232,12.99232,0,0,0,.1792,2.0019,6.58756,6.58756,0,0,0,.625,1.9043A6.20778,6.20778,0,0,0,1.99757,38.001a6.27445,6.27445,0,0,0,1.61865,1.1787,6.70082,6.70082,0,0,0,1.90088.6308,13.45514,13.45514,0,0,0,2.0039.1768c.30909.0068.6128.0107.91895.0107C8.80567,40,9.168,40,9.53468,40H110.13477c.3594,0,.7246,0,1.084-.002.3047,0,.6172-.0039.9219-.0107a13.279,13.279,0,0,0,2-.1768,6.80432,6.80432,0,0,0,1.9082-.6308,6.27742,6.27742,0,0,0,1.6172-1.1787,6.39482,6.39482,0,0,0,1.1816-1.6143,6.60413,6.60413,0,0,0,.6191-1.9043,13.50643,13.50643,0,0,0,.1856-2.0019c.0039-.3106.0039-.6114.0039-.9219.0078-.3633.0078-.7246.0078-1.0938V9.53613c0-.36621,0-.72949-.0078-1.09179,0-.30664,0-.61426-.0039-.9209a13.5071,13.5071,0,0,0-.1856-2.002,6.6177,6.6177,0,0,0-.6191-1.90332,6.46619,6.46619,0,0,0-2.7988-2.7998,6.76754,6.76754,0,0,0-1.9082-.627,13.04394,13.04394,0,0,0-2-.17676c-.3047-.00488-.6172-.01074-.9219-.01269-.3594-.002-.7246-.002-1.084-.002Z" style="fill: #a6a6a6"/>
7 + <path d="M8.44483,39.125c-.30468,0-.602-.0039-.90429-.0107a12.68714,12.68714,0,0,1-1.86914-.1631,5.88381,5.88381,0,0,1-1.65674-.5479,5.40573,5.40573,0,0,1-1.397-1.0166,5.32082,5.32082,0,0,1-1.02051-1.3965,5.72186,5.72186,0,0,1-.543-1.6572,12.41351,12.41351,0,0,1-.1665-1.875c-.00634-.2109-.01464-.9131-.01464-.9131V8.44434S.88185,7.75293.8877,7.5498a12.37039,12.37039,0,0,1,.16553-1.87207,5.7555,5.7555,0,0,1,.54346-1.6621A5.37349,5.37349,0,0,1,2.61183,2.61768,5.56543,5.56543,0,0,1,4.01417,1.59521a5.82309,5.82309,0,0,1,1.65332-.54394A12.58589,12.58589,0,0,1,7.543.88721L8.44532.875H111.21387l.9131.0127a12.38493,12.38493,0,0,1,1.8584.16259,5.93833,5.93833,0,0,1,1.6709.54785,5.59374,5.59374,0,0,1,2.415,2.41993,5.76267,5.76267,0,0,1,.5352,1.64892,12.995,12.995,0,0,1,.1738,1.88721c.0029.2832.0029.5874.0029.89014.0079.375.0079.73193.0079,1.09179V30.4648c0,.3633,0,.7178-.0079,1.0752,0,.3252,0,.6231-.0039.9297a12.73126,12.73126,0,0,1-.1709,1.8535,5.739,5.739,0,0,1-.54,1.67,5.48029,5.48029,0,0,1-1.0156,1.3857,5.4129,5.4129,0,0,1-1.3994,1.0225,5.86168,5.86168,0,0,1-1.668.5498,12.54218,12.54218,0,0,1-1.8692.1631c-.2929.0068-.5996.0107-.8974.0107l-1.084.002Z"/>
8 + </g>
9 + <g id="_Group_" data-name="&lt;Group&gt;">
10 + <g id="_Group_2" data-name="&lt;Group&gt;">
11 + <g id="_Group_3" data-name="&lt;Group&gt;">
12 + <path id="_Path_" data-name="&lt;Path&gt;" d="M24.76888,20.30068a4.94881,4.94881,0,0,1,2.35656-4.15206,5.06566,5.06566,0,0,0-3.99116-2.15768c-1.67924-.17626-3.30719,1.00483-4.1629,1.00483-.87227,0-2.18977-.98733-3.6085-.95814a5.31529,5.31529,0,0,0-4.47292,2.72787c-1.934,3.34842-.49141,8.26947,1.3612,10.97608.9269,1.32535,2.01018,2.8058,3.42763,2.7533,1.38706-.05753,1.9051-.88448,3.5794-.88448,1.65876,0,2.14479.88448,3.591.8511,1.48838-.02416,2.42613-1.33124,3.32051-2.66914a10.962,10.962,0,0,0,1.51842-3.09251A4.78205,4.78205,0,0,1,24.76888,20.30068Z" style="fill: #fff"/>
13 + <path id="_Path_2" data-name="&lt;Path&gt;" d="M22.03725,12.21089a4.87248,4.87248,0,0,0,1.11452-3.49062,4.95746,4.95746,0,0,0-3.20758,1.65961,4.63634,4.63634,0,0,0-1.14371,3.36139A4.09905,4.09905,0,0,0,22.03725,12.21089Z" style="fill: #fff"/>
14 + </g>
15 + </g>
16 + <g>
17 + <path d="M42.30227,27.13965h-4.7334l-1.13672,3.35645H34.42727l4.4834-12.418h2.083l4.4834,12.418H43.438ZM38.0591,25.59082h3.752l-1.84961-5.44727h-.05176Z" style="fill: #fff"/>
18 + <path d="M55.15969,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H48.4302v1.50586h.03418a3.21162,3.21162,0,0,1,2.88281-1.60059C53.645,21.34766,55.15969,23.16406,55.15969,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C52.30227,29.01563,53.24953,27.81934,53.24953,25.96973Z" style="fill: #fff"/>
19 + <path d="M65.12453,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H58.395v1.50586h.03418A3.21162,3.21162,0,0,1,61.312,21.34766C63.60988,21.34766,65.12453,23.16406,65.12453,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C62.26711,29.01563,63.21438,27.81934,63.21438,25.96973Z" style="fill: #fff"/>
20 + <path d="M71.71047,27.03613c.1377,1.23145,1.334,2.04,2.96875,2.04,1.56641,0,2.69336-.80859,2.69336-1.91895,0-.96387-.67969-1.541-2.28906-1.93652l-1.60937-.3877c-2.28027-.55078-3.33887-1.61719-3.33887-3.34766,0-2.14258,1.86719-3.61426,4.51855-3.61426,2.624,0,4.42285,1.47168,4.4834,3.61426h-1.876c-.1123-1.23926-1.13672-1.9873-2.63379-1.9873s-2.52148.75684-2.52148,1.8584c0,.87793.6543,1.39453,2.25488,1.79l1.36816.33594c2.54785.60254,3.60645,1.626,3.60645,3.44238,0,2.32324-1.85059,3.77832-4.79395,3.77832-2.75391,0-4.61328-1.4209-4.7334-3.667Z" style="fill: #fff"/>
21 + <path d="M83.34621,19.2998v2.14258h1.72168v1.47168H83.34621v4.99121c0,.77539.34473,1.13672,1.10156,1.13672a5.80752,5.80752,0,0,0,.61133-.043v1.46289a5.10351,5.10351,0,0,1-1.03223.08594c-1.833,0-2.54785-.68848-2.54785-2.44434V22.91406H80.16262V21.44238H81.479V19.2998Z" style="fill: #fff"/>
22 + <path d="M86.065,25.96973c0-2.84863,1.67773-4.63867,4.29395-4.63867,2.625,0,4.29492,1.79,4.29492,4.63867,0,2.85645-1.66113,4.63867-4.29492,4.63867C87.72609,30.6084,86.065,28.82617,86.065,25.96973Zm6.69531,0c0-1.9541-.89551-3.10742-2.40137-3.10742s-2.40039,1.16211-2.40039,3.10742c0,1.96191.89453,3.10645,2.40039,3.10645S92.76027,27.93164,92.76027,25.96973Z" style="fill: #fff"/>
23 + <path d="M96.18606,21.44238h1.77246v1.541h.043a2.1594,2.1594,0,0,1,2.17773-1.63574,2.86616,2.86616,0,0,1,.63672.06934v1.73828a2.59794,2.59794,0,0,0-.835-.1123,1.87264,1.87264,0,0,0-1.93652,2.083v5.37012h-1.8584Z" style="fill: #fff"/>
24 + <path d="M109.3843,27.83691c-.25,1.64355-1.85059,2.77148-3.89844,2.77148-2.63379,0-4.26855-1.76465-4.26855-4.5957,0-2.83984,1.64355-4.68164,4.19043-4.68164,2.50488,0,4.08008,1.7207,4.08008,4.46582v.63672h-6.39453v.1123a2.358,2.358,0,0,0,2.43555,2.56445,2.04834,2.04834,0,0,0,2.09082-1.27344Zm-6.28223-2.70215h4.52637a2.1773,2.1773,0,0,0-2.2207-2.29785A2.292,2.292,0,0,0,103.10207,25.13477Z" style="fill: #fff"/>
25 + </g>
26 + </g>
27 + </g>
28 + <g id="_Group_4" data-name="&lt;Group&gt;">
29 + <g>
30 + <path d="M37.82619,8.731a2.63964,2.63964,0,0,1,2.80762,2.96484c0,1.90625-1.03027,3.002-2.80762,3.002H35.67092V8.731Zm-1.22852,5.123h1.125a1.87588,1.87588,0,0,0,1.96777-2.146,1.881,1.881,0,0,0-1.96777-2.13379h-1.125Z" style="fill: #fff"/>
31 + <path d="M41.68068,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C44.57522,13.99463,45.01369,13.42432,45.01369,12.44434Z" style="fill: #fff"/>
32 + <path d="M51.57326,14.69775h-.92187l-.93066-3.31641h-.07031l-.92676,3.31641h-.91309l-1.24121-4.50293h.90137l.80664,3.436h.06641l.92578-3.436h.85254l.92578,3.436h.07031l.80273-3.436h.88867Z" style="fill: #fff"/>
33 + <path d="M53.85354,10.19482H54.709v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915h-.88867V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z" style="fill: #fff"/>
34 + <path d="M59.09377,8.437h.88867v6.26074h-.88867Z" style="fill: #fff"/>
35 + <path d="M61.21779,12.44434a2.13346,2.13346,0,1,1,4.24756,0,2.1338,2.1338,0,1,1-4.24756,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C64.11232,13.99463,64.5508,13.42432,64.5508,12.44434Z" style="fill: #fff"/>
36 + <path d="M66.4009,13.42432c0-.81055.60352-1.27783,1.6748-1.34424l1.21973-.07031v-.38867c0-.47559-.31445-.74414-.92187-.74414-.49609,0-.83984.18213-.93848.50049h-.86035c.09082-.77344.81836-1.26953,1.83984-1.26953,1.12891,0,1.76563.562,1.76563,1.51318v3.07666h-.85547v-.63281h-.07031a1.515,1.515,0,0,1-1.35254.707A1.36026,1.36026,0,0,1,66.4009,13.42432Zm2.89453-.38477v-.37646l-1.09961.07031c-.62012.0415-.90137.25244-.90137.64941,0,.40527.35156.64111.835.64111A1.0615,1.0615,0,0,0,69.29543,13.03955Z" style="fill: #fff"/>
37 + <path d="M71.34816,12.44434c0-1.42285.73145-2.32422,1.86914-2.32422a1.484,1.484,0,0,1,1.38086.79h.06641V8.437h.88867v6.26074h-.85156v-.71143h-.07031a1.56284,1.56284,0,0,1-1.41406.78564C72.0718,14.772,71.34816,13.87061,71.34816,12.44434Zm.918,0c0,.95508.4502,1.52979,1.20313,1.52979.749,0,1.21191-.583,1.21191-1.52588,0-.93848-.46777-1.52979-1.21191-1.52979C72.72121,10.91846,72.26613,11.49707,72.26613,12.44434Z" style="fill: #fff"/>
38 + <path d="M79.23,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C82.12453,13.99463,82.563,13.42432,82.563,12.44434Z" style="fill: #fff"/>
39 + <path d="M84.66945,10.19482h.85547v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915H87.605V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z" style="fill: #fff"/>
40 + <path d="M93.51516,9.07373v1.1416h.97559v.74854h-.97559V13.2793c0,.47168.19434.67822.63672.67822a2.96657,2.96657,0,0,0,.33887-.02051v.74023a2.9155,2.9155,0,0,1-.4834.04541c-.98828,0-1.38184-.34766-1.38184-1.21582v-2.543h-.71484v-.74854h.71484V9.07373Z" style="fill: #fff"/>
41 + <path d="M95.70461,8.437h.88086v2.48145h.07031a1.3856,1.3856,0,0,1,1.373-.80664,1.48339,1.48339,0,0,1,1.55078,1.67871v2.90723H98.69v-2.688c0-.71924-.335-1.0835-.96289-1.0835a1.05194,1.05194,0,0,0-1.13379,1.1416v2.62988h-.88867Z" style="fill: #fff"/>
42 + <path d="M104.76125,13.48193a1.828,1.828,0,0,1-1.95117,1.30273A2.04531,2.04531,0,0,1,100.73,12.46045a2.07685,2.07685,0,0,1,2.07617-2.35254c1.25293,0,2.00879.856,2.00879,2.27V12.688h-3.17969v.0498a1.1902,1.1902,0,0,0,1.19922,1.29,1.07934,1.07934,0,0,0,1.07129-.5459Zm-3.126-1.45117h2.27441a1.08647,1.08647,0,0,0-1.1084-1.1665A1.15162,1.15162,0,0,0,101.63527,12.03076Z" style="fill: #fff"/>
43 + </g>
44 + </g>
45 + </g>
46 +</svg>
public/images/GetItOnGooglePlay_Badge_Web_color_English.png
Binary files /dev/null and b/public/images/GetItOnGooglePlay_Badge_Web_color_English.png differ
public/site.webmanifest new
+21
@@ -0,0 +1,21 @@
1 +{
2 + "name": "MyWebSite",
3 + "short_name": "MySite",
4 + "icons": [
5 + {
6 + "src": "/web-app-manifest-192x192.png",
7 + "sizes": "192x192",
8 + "type": "image/png",
9 + "purpose": "maskable"
10 + },
11 + {
12 + "src": "/web-app-manifest-512x512.png",
13 + "sizes": "512x512",
14 + "type": "image/png",
15 + "purpose": "maskable"
16 + }
17 + ],
18 + "theme_color": "#ffffff",
19 + "background_color": "#ffffff",
20 + "display": "standalone"
21 +}
\ No newline at end of file
public/web-app-manifest-192x192.png
Binary files /dev/null and b/public/web-app-manifest-192x192.png differ
public/web-app-manifest-512x512.png
Binary files /dev/null and b/public/web-app-manifest-512x512.png differ
scripts/new-post.ts new
+55
@@ -0,0 +1,55 @@
1 +/**
2 + * Create a new post with frontmatter
3 + * Usage: pnpm new <title>
4 + */
5 +
6 +import { existsSync, mkdirSync, writeFileSync } from 'node:fs'
7 +import { dirname, join } from 'node:path'
8 +import process from 'node:process'
9 +
10 +// Process title from all arguments
11 +const titleArgs: string[] = process.argv.slice(2)
12 +const rawTitle: string = titleArgs.length > 0 ? titleArgs.join(' ') : 'new-post'
13 +
14 +// Check if title starts with underscore (draft post)
15 +const isDraft: boolean = rawTitle.startsWith('_')
16 +const displayTitle: string = isDraft ? rawTitle.slice(1) : rawTitle
17 +
18 +const fileName: string = rawTitle
19 + .toLowerCase()
20 + .replace(/[^a-z0-9\s-_]/g, '') // Remove special characters but keep underscore and hyphen
21 + .replace(/\s+/g, '-') // Replace spaces with hyphens
22 + .replace(/-+/g, '-') // Replace multiple hyphens with single
23 + .replace(/^-|-$/g, '') // Remove leading/trailing hyphens
24 +const targetFile: string = `${fileName}.md`
25 +const fullPath: string = join('src/content/posts', targetFile)
26 +
27 +// Check if the target file already exists
28 +if (existsSync(fullPath)) {
29 + console.error(`😇 File already exists: ${fullPath}`)
30 + process.exit(1)
31 +}
32 +
33 +// Ensure the directory structure exists
34 +mkdirSync(dirname(fullPath), { recursive: true })
35 +
36 +// Generate frontmatter with current date
37 +const content: string = `---
38 +title: ${displayTitle}
39 +pubDate: '${new Date().toISOString().split('T')[0]}'
40 +---
41 +
42 +`
43 +
44 +// Write the new post file
45 +try {
46 + writeFileSync(fullPath, content)
47 + if (isDraft) {
48 + console.log(`📝 Draft created: ${fullPath}`)
49 + } else {
50 + console.log(`✅ Post created: ${fullPath}`)
51 + }
52 +} catch (error) {
53 + console.error('⚠️ Failed to create post:', error)
54 + process.exit(1)
55 +}
scripts/update-theme.ts new
+46
@@ -0,0 +1,46 @@
1 +#!/usr/bin/env tsx
2 +
3 +/**
4 + * Update theme from upstream repository
5 + * Usage: pnpm update-theme
6 + */
7 +
8 +import { execSync } from 'node:child_process'
9 +import fs from 'node:fs'
10 +import path from 'node:path'
11 +import process from 'node:process'
12 +
13 +// Check and set up the upstream remote repository
14 +try {
15 + execSync('git remote get-url upstream', { stdio: 'ignore' })
16 +} catch {
17 + execSync('git remote add upstream https://github.com/the3ash/astro-chiri.git', {
18 + stdio: 'inherit'
19 + })
20 +}
21 +
22 +// Update theme from upstream repository
23 +try {
24 + execSync('git fetch upstream', { stdio: 'inherit' })
25 +
26 + const currentCommit = execSync('git rev-parse HEAD', { encoding: 'utf8' }).trim()
27 + execSync('git merge upstream/main --allow-unrelated-histories', { stdio: 'inherit' })
28 + const newCommit = execSync('git rev-parse HEAD', { encoding: 'utf8' }).trim()
29 +
30 + if (currentCommit === newCommit) {
31 + console.log('🤗 No updates available, already up to date')
32 + } else {
33 + console.log('✅ Theme updated')
34 + }
35 +} catch (error) {
36 + // Check if there's a merge conflict
37 + const gitDirectory = execSync('git rev-parse --git-dir', { encoding: 'utf8' }).trim()
38 + const mergeHeadFile = path.join(gitDirectory, 'MERGE_HEAD')
39 +
40 + if (fs.existsSync(mergeHeadFile)) {
41 + console.log('⚠️ Update fetched with merge conflicts. Please resolve manually')
42 + } else {
43 + console.error('❌ Update failed:', error)
44 + process.exit(1)
45 + }
46 +}
src/components/examples/Callout.astro new
+53
@@ -0,0 +1,53 @@
1 +<div class="callout-card">
2 + <div class="callout-container">
3 + <div class="callout">
4 + <span class="callout-icon">🙊</span>
5 + <span class="callout-text">Ape shall never kill ape.</span>
6 + </div>
7 + </div>
8 +</div>
9 +
10 +<style>
11 + .callout-card {
12 + border: 1px solid var(--border);
13 + width: 100%;
14 + height: 12rem;
15 + display: flex;
16 + align-items: center;
17 + justify-content: center;
18 + border-radius: 10px;
19 + }
20 +
21 + .callout-container {
22 + display: flex;
23 + justify-content: center;
24 + align-items: center;
25 + width: 100%;
26 + padding: 0 4rem;
27 + }
28 +
29 + .callout {
30 + background-color: var(--astro-code-background);
31 + border: 1px solid var(--code-bg);
32 + border-radius: 10px;
33 + padding: 1rem;
34 + display: flex;
35 + align-items: center;
36 + gap: 0.5rem;
37 + width: 100%;
38 + min-width: 13rem;
39 + }
40 +
41 + .callout-icon {
42 + padding-right: 0.5rem;
43 + font-size: 1.25rem;
44 + line-height: 1;
45 + display: flex;
46 + align-items: center;
47 + }
48 +
49 + .callout-text {
50 + color: var(--text-primary);
51 + line-height: 1.5;
52 + }
53 +</style>
src/components/examples/CounterButton.astro new
+55
@@ -0,0 +1,55 @@
1 +<div class="counter-card">
2 + <div class="counter-container">
3 + <button id="counter-btn" class="counter-button">
4 + Click me (<span id="counter-value">0</span>)
5 + </button>
6 + </div>
7 +</div>
8 +
9 +<style>
10 + .counter-card {
11 + border: 1px solid var(--border);
12 + width: 100%;
13 + height: 12rem;
14 + display: flex;
15 + align-items: center;
16 + justify-content: center;
17 + border-radius: 10px;
18 + }
19 +
20 + .counter-container {
21 + display: flex;
22 + justify-content: center;
23 + align-items: center;
24 + }
25 +
26 + .counter-button {
27 + background-color: var(--text-primary);
28 + color: var(--bg);
29 + border: none;
30 + font-family: var(--font-mono);
31 + font-size: var(--font-size-s);
32 + border-radius: 12px;
33 + cursor: pointer;
34 + width: 160px;
35 + height: 44px;
36 + transition: all 0.15s ease-in-out;
37 + }
38 +
39 + .counter-button:hover {
40 + opacity: 0.9;
41 + }
42 +</style>
43 +
44 +<script>
45 + let count = 0
46 + const button = document.getElementById('counter-btn')
47 + const valueSpan = document.getElementById('counter-value')
48 +
49 + if (button && valueSpan) {
50 + button.addEventListener('click', () => {
51 + count++
52 + valueSpan.textContent = count.toString()
53 + })
54 + }
55 +</script>
src/components/examples/Tag.astro new
+465
@@ -0,0 +1,465 @@
1 +<div class="tag-card">
2 + <div class="tag-container">
3 + <div id="tag-component" class="tag-component">
4 + <button id="add-button" class="add-button">
5 + <svg
6 + class="add-icon"
7 + xmlns="http://www.w3.org/2000/svg"
8 + viewBox="0 0 16 16"
9 + width="16"
10 + height="16"
11 + >
12 + <path
13 + d="M7.75 2a.75.75 0 0 1 .75.75V7h4.25a.75.75 0 0 1 0 1.5H8.5v4.25a.75.75 0 0 1-1.5 0V8.5H2.75a.75.75 0 0 1 0-1.5H7V2.75A.75.75 0 0 1 7.75 2Z"
14 + ></path>
15 + </svg>
16 + </button>
17 +
18 + <div id="input-state" class="input-state">
19 + <input id="tag-input" type="text" placeholder="Tag Name" class="tag-input" />
20 + <button id="confirm-button" class="confirm-button disabled">
21 + <svg
22 + class="confirm-icon"
23 + xmlns="http://www.w3.org/2000/svg"
24 + viewBox="0 0 16 16"
25 + width="16"
26 + height="16"
27 + >
28 + <path
29 + d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"
30 + ></path>
31 + </svg>
32 + </button>
33 + <button id="cancel-button" class="cancel-button">
34 + <svg
35 + class="cancel-icon"
36 + xmlns="http://www.w3.org/2000/svg"
37 + viewBox="0 0 16 16"
38 + width="16"
39 + height="16"
40 + >
41 + <path
42 + d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"
43 + ></path>
44 + </svg>
45 + </button>
46 + </div>
47 +
48 + <div id="tag-display" class="tag-display">
49 + <span id="tag-text" class="tag-text"></span>
50 + <button id="delete-button" class="delete-button">
51 + <svg
52 + class="delete-icon"
53 + xmlns="http://www.w3.org/2000/svg"
54 + viewBox="0 0 16 16"
55 + width="16"
56 + height="16"
57 + >
58 + <path
59 + d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75ZM4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.748 1.748 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15ZM6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25Z"
60 + ></path>
61 + </svg>
62 + </button>
63 + </div>
64 + </div>
65 + </div>
66 +</div>
67 +
68 +<script>
69 + let currentState = 'add' // 'add', 'input', 'display'
70 + let tagValue = ''
71 +
72 + const addButton = document.getElementById('add-button') as HTMLButtonElement
73 + const inputState = document.getElementById('input-state') as HTMLDivElement
74 + const tagDisplay = document.getElementById('tag-display') as HTMLDivElement
75 + const tagInput = document.getElementById('tag-input') as HTMLInputElement
76 + const confirmButton = document.getElementById('confirm-button') as HTMLButtonElement
77 + const cancelButton = document.getElementById('cancel-button') as HTMLButtonElement
78 + const deleteButton = document.getElementById('delete-button') as HTMLButtonElement
79 + const tagText = document.getElementById('tag-text') as HTMLSpanElement
80 +
81 + // Switch to input state
82 + function switchToInput() {
83 + currentState = 'input'
84 + addButton?.classList.add('hidden')
85 +
86 + setTimeout(() => {
87 + inputState?.classList.add('active')
88 + tagInput?.focus()
89 + }, 100)
90 + }
91 +
92 + // Switch to display state
93 + function switchToDisplay() {
94 + currentState = 'display'
95 +
96 + inputState?.classList.remove('active')
97 +
98 + setTimeout(() => {
99 + tagDisplay?.classList.add('active')
100 + if (tagText) tagText.textContent = truncateText(tagValue)
101 + }, 300)
102 + }
103 +
104 + // Return to add state
105 + function switchToAdd() {
106 + if (currentState === 'display') {
107 + tagDisplay?.classList.remove('active')
108 + } else if (currentState === 'input') {
109 + inputState?.classList.remove('active')
110 + }
111 +
112 + currentState = 'add'
113 +
114 + setTimeout(() => {
115 + addButton?.classList.remove('hidden')
116 + tagValue = ''
117 + if (tagInput) tagInput.value = ''
118 + updateConfirmButton()
119 + }, 250)
120 + }
121 +
122 + // Update confirm button state
123 + function updateConfirmButton() {
124 + if (tagInput?.value.trim()) {
125 + confirmButton?.classList.remove('disabled')
126 + } else {
127 + confirmButton?.classList.add('disabled')
128 + }
129 + }
130 +
131 + // Truncate text to max 24 characters
132 + function truncateText(text: string, maxLength: number = 24): string {
133 + if (text.length <= maxLength) {
134 + return text
135 + }
136 + return text.substring(0, maxLength) + '...'
137 + }
138 +
139 + addButton?.addEventListener('click', switchToInput)
140 +
141 + tagInput?.addEventListener('input', (e) => {
142 + const target = e.target as HTMLInputElement
143 + const inputValue = target.value
144 +
145 + // Limit input to 24 characters
146 + if (inputValue.length > 24) {
147 + target.value = inputValue.substring(0, 24)
148 + tagValue = inputValue // Keep original value for display truncation
149 + } else {
150 + tagValue = inputValue
151 + }
152 +
153 + updateConfirmButton()
154 + })
155 +
156 + tagInput?.addEventListener('keydown', (e) => {
157 + if (e.key === 'Enter' && tagValue.trim()) {
158 + switchToDisplay()
159 + } else if (e.key === 'Escape') {
160 + switchToAdd()
161 + }
162 + })
163 +
164 + confirmButton?.addEventListener('click', () => {
165 + if (tagValue.trim()) {
166 + switchToDisplay()
167 + }
168 + })
169 +
170 + cancelButton?.addEventListener('click', switchToAdd)
171 +
172 + deleteButton?.addEventListener('click', switchToAdd)
173 +</script>
174 +
175 +<style>
176 + .tag-card {
177 + border: 1px solid var(--border);
178 + width: 100%;
179 + height: 12rem;
180 + display: flex;
181 + align-items: center;
182 + justify-content: center;
183 + border-radius: 10px;
184 + }
185 +
186 + .tag-container {
187 + display: flex;
188 + justify-content: center;
189 + align-items: center;
190 + width: 100%;
191 + padding: 0 2rem;
192 + overflow: hidden;
193 + }
194 +
195 + .tag-component {
196 + display: flex;
197 + align-items: center;
198 + justify-content: center;
199 + gap: 0.5rem;
200 + position: relative;
201 + width: 100%;
202 + min-height: 40px;
203 + }
204 +
205 + .add-button {
206 + background-color: var(--text-primary);
207 + color: var(--bg);
208 + border: none;
209 + border-radius: 50%;
210 + width: 36px;
211 + height: 36px;
212 + cursor: pointer;
213 + display: flex;
214 + align-items: center;
215 + justify-content: center;
216 + transition:
217 + all 0.3s ease,
218 + visibility 0s;
219 + position: absolute;
220 + top: 50%;
221 + left: 50%;
222 + transform: translate(-50%, -50%) scale(1);
223 + z-index: 1;
224 + opacity: 1;
225 + visibility: visible;
226 + overflow: visible;
227 + will-change: transform;
228 + -webkit-transform: translate(-50%, -50%) scale(1);
229 + box-sizing: border-box;
230 + padding: 0;
231 + margin: 0;
232 + }
233 +
234 + .add-button.hidden {
235 + opacity: 0;
236 + transform: translate(-50%, -50%) scale(0.8);
237 + pointer-events: none;
238 + visibility: hidden;
239 + transition:
240 + all 0.3s ease,
241 + visibility 0s 0.2s;
242 + }
243 +
244 + .add-icon,
245 + .confirm-icon,
246 + .cancel-icon,
247 + .delete-icon {
248 + fill: currentColor;
249 + width: 1rem;
250 + height: 1rem;
251 + position: relative;
252 + display: block;
253 + transform: translateZ(0);
254 + }
255 +
256 + .add-button:hover {
257 + opacity: 0.9;
258 + transform: translate(-50%, -50%) scale(1);
259 + -webkit-transform: translate(-50%, -50%) scale(1);
260 + }
261 +
262 + .input-state {
263 + display: flex;
264 + align-items: center;
265 + gap: 0.125rem;
266 + background-color: var(--astro-code-background);
267 + border: 1px solid var(--code-bg);
268 + border-radius: 18px;
269 + padding: 0.28125rem 0.375rem;
270 + width: 40px;
271 + max-width: 40px;
272 + opacity: 0;
273 + overflow: hidden;
274 + transition: all 0.3s ease;
275 + position: relative;
276 + z-index: 2;
277 + pointer-events: none;
278 + }
279 +
280 + .input-state.active {
281 + width: 10rem;
282 + max-width: 10rem;
283 + opacity: 1;
284 + pointer-events: all;
285 + }
286 +
287 + .tag-input {
288 + background: transparent;
289 + border: none;
290 + outline: none;
291 + color: var(--text-primary);
292 + font-size: 0.9rem;
293 + font-family: var(--font-mono);
294 + min-width: 4rem;
295 + padding: 0.25rem 0.5rem;
296 + opacity: 0;
297 + transform: translateX(-8px);
298 + transition:
299 + opacity 0.2s ease 0.15s,
300 + transform 0.2s ease 0.15s;
301 + }
302 +
303 + .input-state.active .tag-input {
304 + opacity: 1;
305 + transform: translateX(0);
306 + }
307 +
308 + .tag-input::placeholder {
309 + color: var(--text-tertiary);
310 + }
311 +
312 + .confirm-button,
313 + .cancel-button {
314 + background: none;
315 + border: none;
316 + border-radius: 50%;
317 + width: 24px;
318 + height: 24px;
319 + cursor: pointer;
320 + display: flex;
321 + align-items: center;
322 + justify-content: center;
323 + font-size: 0.8rem;
324 + opacity: 0;
325 + transform: scale(0.8);
326 + transition: all 0.2s ease;
327 + position: relative;
328 + min-width: 24px;
329 + min-height: 24px;
330 + }
331 +
332 + .confirm-button::before,
333 + .cancel-button::before {
334 + content: '';
335 + position: absolute;
336 + top: 50%;
337 + left: 50%;
338 + transform: translate(-50%, -50%);
339 + border-radius: 50%;
340 + background-color: var(--code-bg);
341 + opacity: 0;
342 + transition: opacity 0.2s ease;
343 + z-index: -1;
344 + width: 28px;
345 + height: 28px;
346 + }
347 +
348 + .confirm-button:hover::before,
349 + .cancel-button:hover::before {
350 + opacity: 1;
351 + }
352 +
353 + .input-state.active .confirm-button,
354 + .input-state.active .cancel-button {
355 + transform: scale(1);
356 + }
357 +
358 + .confirm-button {
359 + color: var(--text-primary);
360 + opacity: 0.6;
361 + }
362 +
363 + .confirm-button.disabled {
364 + opacity: 0.3;
365 + cursor: not-allowed;
366 + }
367 +
368 + .confirm-button:not(.disabled):hover {
369 + opacity: 1;
370 + }
371 +
372 + .confirm-button.disabled:hover::before {
373 + opacity: 0;
374 + }
375 +
376 + .cancel-button {
377 + color: var(--text-primary);
378 + opacity: 0.6;
379 + }
380 +
381 + .cancel-button:hover {
382 + opacity: 1;
383 + }
384 +
385 + .tag-display {
386 + display: flex;
387 + align-items: center;
388 + gap: 0.25rem;
389 + background-color: var(--astro-code-background);
390 + border: 1px solid var(--code-bg);
391 + border-radius: 18px;
392 + padding: 0.28125rem 0.325rem 0.28125rem 0.75rem;
393 + position: absolute;
394 + top: 50%;
395 + left: 50%;
396 + transform: translate(-50%, -50%);
397 + z-index: 3;
398 + opacity: 0;
399 + pointer-events: none;
400 + transition: all 0.25s ease-out;
401 + will-change: transform, opacity;
402 + }
403 +
404 + .tag-display > * {
405 + margin-right: 0.125rem;
406 + }
407 +
408 + .tag-display > *:last-child {
409 + margin-right: 0;
410 + }
411 +
412 + .tag-display.active {
413 + opacity: 1;
414 + transform: translate(-50%, -50%);
415 + pointer-events: all;
416 + }
417 +
418 + .tag-text {
419 + color: var(--text-primary);
420 + font-size: 0.9rem;
421 + font-family: var(--font-mono);
422 + }
423 +
424 + .delete-button {
425 + background: none;
426 + border: none;
427 + border-radius: 50%;
428 + width: 24px;
429 + height: 24px;
430 + cursor: pointer;
431 + display: flex;
432 + align-items: center;
433 + justify-content: center;
434 + font-size: 0.8rem;
435 + color: var(--text-primary);
436 + opacity: 0.6;
437 + transition: all 0.2s ease;
438 + position: relative;
439 + min-width: 24px;
440 + min-height: 24px;
441 + }
442 +
443 + .delete-button::before {
444 + content: '';
445 + position: absolute;
446 + top: 50%;
447 + left: 50%;
448 + transform: translate(-50%, -50%);
449 + border-radius: 50%;
450 + background-color: var(--code-bg);
451 + opacity: 0;
452 + transition: opacity 0.2s ease;
453 + z-index: -1;
454 + width: 28px;
455 + height: 28px;
456 + }
457 +
458 + .delete-button:hover {
459 + opacity: 1;
460 + }
461 +
462 + .delete-button:hover::before {
463 + opacity: 1;
464 + }
465 +</style>
src/components/features/FootnoteScroll.astro new
+33
@@ -0,0 +1,33 @@
1 +<script>
2 + function bindFootnoteEvents() {
3 + const footnoteLinks = document.querySelectorAll('[data-footnote-ref], [data-footnote-backref]')
4 +
5 + footnoteLinks.forEach((link) => {
6 + link.addEventListener('click', (e) => {
7 + e.preventDefault()
8 + const href = link.getAttribute('href')
9 + if (!href) return
10 +
11 + const target = document.querySelector(href)
12 + if (!target) return
13 +
14 + // Use fixed offset of 128px
15 + const offset = 128
16 +
17 + const targetPosition = target.getBoundingClientRect().top + window.scrollY - offset
18 +
19 + window.scrollTo({
20 + top: targetPosition
21 + })
22 + })
23 + })
24 + }
25 +
26 + document.addEventListener('astro:page-load', () => {
27 + bindFootnoteEvents()
28 + })
29 +
30 + document.addEventListener('DOMContentLoaded', () => {
31 + bindFootnoteEvents()
32 + })
33 +</script>
src/components/features/FormattedDate.astro new
+29
@@ -0,0 +1,29 @@
1 +---
2 +import { formatDate } from '@/utils/date'
3 +import { SITE } from '@/config'
4 +
5 +interface Props {
6 + date: Date
7 + format?: string
8 +}
9 +
10 +const { date, format } = Astro.props
11 +---
12 +
13 +<time
14 + datetime={date.toISOString()}
15 + class={!SITE.dateOnRight &&
16 + (SITE.dateFormat === 'MONTH DAY YYYY' || SITE.dateFormat === 'DAY MONTH YYYY')
17 + ? 'date-left'
18 + : ''}
19 +>
20 + <Fragment set:html={formatDate(date, format)} />
21 +</time>
22 +
23 +<style>
24 + .date-left {
25 + display: inline-block;
26 + min-width: 86px;
27 + text-align: right;
28 + }
29 +</style>
src/components/features/PostList.astro new
+105
@@ -0,0 +1,105 @@
1 +---
2 +import FormattedDate from '@/components/features/FormattedDate.astro'
3 +import type { CollectionEntry } from 'astro:content'
4 +import { SITE } from '@/config'
5 +
6 +interface Props {
7 + posts: CollectionEntry<'posts'>[]
8 +}
9 +
10 +const { posts } = Astro.props
11 +---
12 +
13 +<ul>
14 + {
15 + posts.map((post) => (
16 + <li>
17 + <a href={`/${post.id}/`}>
18 + <div class={`post-item ${!SITE.dateOnRight ? 'date-left' : ''}`}>
19 + {!SITE.dateOnRight && (
20 + <p class="date font-features">
21 + <FormattedDate date={post.data.pubDate} />
22 + </p>
23 + )}
24 + <p class="title">{post.data.title}</p>
25 + {SITE.dateOnRight && <div class="divider" />}
26 + {SITE.dateOnRight && (
27 + <p class="date font-features">
28 + <FormattedDate date={post.data.pubDate} />
29 + </p>
30 + )}
31 + </div>
32 + </a>
33 + </li>
34 + ))
35 + }
36 +</ul>
37 +<div class="placeholder"></div>
38 +
39 +<style>
40 + ul {
41 + padding: 0;
42 + margin: 0;
43 + list-style-type: none;
44 + display: flex;
45 + flex-direction: column;
46 + gap: 0;
47 + }
48 +
49 + a {
50 + color: var(--text-primary);
51 + display: block;
52 + text-decoration: none;
53 + transition: opacity 0.15s ease-out;
54 + }
55 +
56 + ul:hover a {
57 + opacity: 0.4;
58 + }
59 +
60 + ul:hover a:hover {
61 + opacity: 1;
62 + }
63 +
64 + .post-item {
65 + height: 2.75rem;
66 + display: flex;
67 + justify-content: space-between;
68 + align-items: center;
69 + gap: 1rem;
70 + }
71 +
72 + .post-item.date-left {
73 + justify-content: flex-start;
74 + }
75 +
76 + .post-item.date-left .title {
77 + flex: 1 1 auto;
78 + min-width: 0;
79 + }
80 +
81 + .title {
82 + margin: 0;
83 + white-space: nowrap;
84 + overflow: hidden;
85 + text-overflow: ellipsis;
86 + }
87 +
88 + .date {
89 + margin: 0;
90 + color: var(--text-secondary);
91 + letter-spacing: var(--spacing-s);
92 + flex-shrink: 0;
93 + }
94 +
95 + .divider {
96 + flex: 1;
97 + min-width: 24px;
98 + height: 0.5px;
99 + background-color: var(--border);
100 + }
101 +
102 + .placeholder {
103 + height: 3rem;
104 + }
105 +</style>
src/components/layout/BaseHead.astro new
+95
@@ -0,0 +1,95 @@
1 +---
2 +// Import the global.css file here so that it is included on
3 +// all pages through the use of the <BaseHead /> component.
4 +import { SITE } from '@/config'
5 +import type { BaseHeadProps } from '@/types/component.types'
6 +import 'katex/dist/katex.min.css'
7 +
8 +const canonicalURL = new URL(Astro.url.pathname, Astro.site)
9 +
10 +const { title, description } = Astro.props as BaseHeadProps
11 +---
12 +
13 +<!-- Global Metadata -->
14 +<meta charset="utf-8" />
15 +<meta name="viewport" content="width=device-width,initial-scale=1" />
16 +{SITE.fadeAnimation && <meta name="view-transition" content="same-origin" />}
17 +<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
18 +<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
19 +<link rel="preload" href="/fonts/Inter.woff2" as="font" type="font/woff2" crossorigin="anonymous" />
20 +<link
21 + rel="preload"
22 + href="/fonts/Besley-Italic.woff2"
23 + as="font"
24 + type="font/woff2"
25 + crossorigin="anonymous"
26 +/>
27 +<link rel="sitemap" href="/sitemap-index.xml" />
28 +<link
29 + rel="alternate"
30 + type="application/rss+xml"
31 + title={SITE.title}
32 + href={new URL('rss.xml', Astro.site)}
33 +/>
34 +<meta name="generator" content={Astro.generator} />
35 +
36 +<!-- Canonical URL -->
37 +<link rel="canonical" href={canonicalURL} />
38 +
39 +<!-- Primary Meta Tags -->
40 +<title>
41 + {title || SITE.title}
42 +</title>
43 +<meta name="title" content={title} />
44 +<meta name="description" content={description} />
45 +
46 +<!-- Open Graph / Facebook -->
47 +<meta property="og:type" content="website" />
48 +<meta property="og:url" content={Astro.url} />
49 +<meta property="og:title" content={title} />
50 +<meta property="og:description" content={description} />
51 +<meta property="og:image" content={new URL('/chiri-og.png', Astro.url)} />
52 +
53 +<!-- Twitter -->
54 +<meta property="twitter:card" content="summary_large_image" />
55 +<meta property="twitter:url" content={Astro.url} />
56 +<meta property="twitter:title" content={title} />
57 +<meta property="twitter:description" content={description} />
58 +<meta property="twitter:image" content={new URL('/chiri-og.png', Astro.url)} />
59 +
60 +<!-- Transitions Initialization -->
61 +<script is:inline define:vars={{ fadeAnimation: SITE.fadeAnimation }}>
62 + function initMotionPref(doc = document) {
63 + const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches
64 + const supportsViewTransitions = 'startViewTransition' in document
65 +
66 + doc.documentElement.classList.toggle('reduce-motion', prefersReducedMotion)
67 +
68 + doc.documentElement.classList.toggle(
69 + 'disable-transitions',
70 + !fadeAnimation || !supportsViewTransitions
71 + )
72 +
73 + doc.documentElement.classList.add('js')
74 + }
75 +
76 + initMotionPref()
77 +
78 + document.addEventListener('astro:before-swap', ({ newDocument }) => {
79 + initMotionPref(newDocument)
80 + })
81 +
82 + document.addEventListener('astro:page-load', () => {
83 + initMotionPref()
84 + })
85 +
86 + document.addEventListener('visibilitychange', () => {
87 + if (document.visibilityState === 'visible') {
88 + initMotionPref()
89 + }
90 + })
91 +
92 + window.addEventListener('pageshow', () => {
93 + initMotionPref()
94 + })
95 +</script>
src/components/layout/Footer.astro new
+54
@@ -0,0 +1,54 @@
1 +---
2 +import { SITE } from '@/config'
3 +const today = new Date()
4 +---
5 +
6 +<footer class="mt-16 text-s font-light leading-[1.75] text-text-secondary font-sans w-full">
7 + <div class="flex flex-col gap-6 w-full">
8 + <div class="pb-4 border-b border-border">
9 + <nav class="flex gap-6 justify-center flex-wrap">
10 + <a
11 + href="/contact"
12 + class="text-text-secondary px-1 py-0.5 rounded transition-all duration-200 hover:text-text-primary hover:bg-code-bg no-underline"
13 + >Contact</a
14 + >
15 + <a
16 + href="/privacy-policy"
17 + class="text-text-secondary px-1 py-0.5 rounded transition-all duration-200 hover:text-text-primary hover:bg-code-bg no-underline"
18 + >Privacy Policy</a
19 + >
20 + <a
21 + href="/terms-of-use"
22 + class="text-text-secondary px-1 py-0.5 rounded transition-all duration-200 hover:text-text-primary hover:bg-code-bg no-underline"
23 + >Terms of Use</a
24 + >
25 + </nav>
26 + </div>
27 + <div
28 + class="flex justify-between items-center flex-nowrap w-full md:flex-row md:text-left text-center flex-col gap-3"
29 + >
30 + <div class="whitespace-nowrap">
31 + <span class="date">&copy; {today.getFullYear()}</span>
32 + <a
33 + href="https://5mb.app"
34 + target="__blank"
35 + class="ml-1 text-text-secondary hover:text-text-primary transition-colors"
36 + >{SITE.author}</a
37 + >
38 + </div>
39 + <div class="whitespace-nowrap">
40 + Powered by{' '}
41 + <a
42 + href="https://smbcloud.xyz"
43 + target="__blank"
44 + class="text-text-secondary hover:text-text-primary transition-colors">smbCloud</a
45 + > |{' '}
46 + <a
47 + href="https://github.com/smbcloudXYZ/pepakbasajawa-web"
48 + target="__blank"
49 + class="text-text-secondary hover:text-text-primary transition-colors">Source</a
50 + >
51 + </div>
52 + </div>
53 + </div>
54 +</footer>
src/components/layout/Header.astro new
+43
@@ -0,0 +1,43 @@
1 +---
2 +import { SITE } from '@/config'
3 +import ThemeToggle from '@/components/ui/ThemeToggle.astro'
4 +import { Image } from 'astro:assets'
5 +---
6 +
7 +<header class="mb-7">
8 + <nav class="flex justify-between items-center">
9 + <div class="relative flex items-center gap-2">
10 + {
11 + SITE.favicon && (
12 + <img src="/favicon.svg" alt="favicon" class="absolute w-4.5 h-4.5 -bottom-14 left-0" />
13 + )
14 + }
15 + <a
16 + href="/"
17 + class="font-bold text-food-orange text-xl font-sans no-underline min-w-[3rem] inline-block"
18 + >{SITE.title}</a
19 + >
20 + </div>
21 + <div class="flex items-center gap-4">
22 + <div class="flex flex-col gap-2 md:flex-row">
23 + <a href="https://apps.apple.com/se/app/pepak-basa-jawa-komplit/id6752241812">
24 + <Image
25 + src="/images/Download_on_the_App_Store_Badge_US-UK_RGB_blk_092917.svg"
26 + alt="FatApp Apple AppStore page"
27 + width="150"
28 + height="50"
29 + />
30 + </a>
31 + <a href="https://play.google.com/store/apps/details?id=com.theblangkon.pepakbasajawa">
32 + <Image
33 + src="/images/GetItOnGooglePlay_Badge_Web_color_English.png"
34 + alt="FatApp Google PlayStore page"
35 + width="150"
36 + height="50"
37 + />
38 + </a>
39 + </div>
40 + <ThemeToggle />
41 + </div>
42 + </nav>
43 +</header>
src/components/layout/TransitionWrapper.astro new
+89
@@ -0,0 +1,89 @@
1 +---
2 +import { SITE } from '@/config'
3 +import type { TransitionProps } from '@/types'
4 +
5 +type Props = TransitionProps
6 +
7 +const { type, class: className = '' } = Astro.props
8 +const transitionName = type === 'post' ? 'post-content' : 'page-content'
9 +---
10 +
11 +{
12 + SITE.fadeAnimation ? (
13 + <div transition:name={transitionName} transition:animate="initial" class={className}>
14 + <slot />
15 + </div>
16 + ) : (
17 + <div class={className}>
18 + <slot />
19 + </div>
20 + )
21 +}
22 +
23 +<style is:global>
24 + @supports (view-transition-name: none) {
25 + @media not (prefers-reduced-motion: reduce) {
26 + ::view-transition-old(post-content),
27 + ::view-transition-old(page-content) {
28 + animation: fade-out 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards;
29 + }
30 +
31 + ::view-transition-new(post-content),
32 + ::view-transition-new(page-content) {
33 + opacity: 0;
34 + animation: fade-in 0.4s ease 0.2s forwards;
35 + }
36 + }
37 + }
38 +
39 + @keyframes fade-out {
40 + 0% {
41 + opacity: 1;
42 + }
43 + 100% {
44 + opacity: 0;
45 + }
46 + }
47 +
48 + @keyframes fade-in {
49 + 0% {
50 + opacity: 0;
51 + filter: blur(8px);
52 + }
53 + 30% {
54 + opacity: 0.5;
55 + filter: blur(4px);
56 + }
57 + 100% {
58 + opacity: 1;
59 + filter: blur(0);
60 + }
61 + }
62 +
63 + .no-fade ::view-transition-old(post-content),
64 + .no-fade ::view-transition-new(post-content),
65 + .no-fade ::view-transition-old(page-content),
66 + .no-fade ::view-transition-new(page-content),
67 + .disable-transitions ::view-transition-old(post-content),
68 + .disable-transitions ::view-transition-new(post-content),
69 + .disable-transitions ::view-transition-old(page-content),
70 + .disable-transitions ::view-transition-new(page-content) {
71 + animation: none !important;
72 + }
73 +
74 + .reduce-motion ::view-transition-old(post-content),
75 + .reduce-motion ::view-transition-new(post-content),
76 + .reduce-motion ::view-transition-old(page-content),
77 + .reduce-motion ::view-transition-new(page-content) {
78 + animation: none !important;
79 + }
80 +
81 + @media (prefers-reduced-motion: reduce) {
82 + * {
83 + animation-duration: 0.01ms !important;
84 + transition-duration: 0.01ms !important;
85 + animation-iteration-count: 1 !important;
86 + scroll-behavior: auto !important;
87 + }
88 + }
89 +</style>
src/components/pages/About.astro new
+25
@@ -0,0 +1,25 @@
1 +---
2 +import { getEntry } from 'astro:content'
3 +import { render } from 'astro:content'
4 +
5 +const aboutEntry = await getEntry('about', 'about')
6 +// Check if there is actual content (excluding comments)
7 +const hasContent = aboutEntry?.body
8 + ? aboutEntry.body.replace(/<!--[\s\S]*?-->/g, '').trim().length > 0
9 + : false
10 +const { Content } = hasContent && aboutEntry ? await render(aboutEntry) : { Content: null }
11 +---
12 +
13 +{
14 + hasContent && Content && (
15 + <div class="about prose mb-5 font-sans text-m text-food-brown">
16 + <Content />
17 + </div>
18 + )
19 +}
20 +
21 +<style>
22 + .about:not(:empty) {
23 + /* margin-bottom: 1.25rem; */
24 + }
25 +</style>
src/components/ui/BackButton.astro new
+81
@@ -0,0 +1,81 @@
1 +---
2 +import { SITE } from '@/config'
3 +---
4 +
5 +<a
6 + href="/"
7 + class="inline-flex items-center gap-1 font-serif text-m italic leading-[1.75] text-food-brown hover:text-food-orange transition-colors w-32 mb-10 px-0 py-0 bg-transparent border-none no-underline"
8 +>
9 + <svg
10 + width="16"
11 + height="16"
12 + viewBox="0 0 16 16"
13 + fill="none"
14 + xmlns="http://www.w3.org/2000/svg"
15 + class="w-3 h-3 flex-shrink-0"
16 + >
17 + <path
18 + d="M2.5 6.5H9.5C11.1569 6.5 12.5 7.84315 12.5 9.5V9.5C12.5 11.1569 11.1569 12.5 9.5 12.5H7.5M2.5 6.5L5.5 9.5M2.5 6.5L5.5 3.5"
19 + stroke="currentColor"
20 + stroke-width="1.25"
21 + stroke-linecap="round"
22 + stroke-linejoin="round"></path>
23 + </svg>
24 + index
25 +</a>
26 +
27 +<script
28 + is:inline
29 + define:vars={{
30 + contentWidth: SITE.contentWidth,
31 + centeredLayout: SITE.centeredLayout,
32 + toc: SITE.toc
33 + }}
34 +>
35 + ;(function () {
36 + // Adjust back button position based on layout and screen size
37 + function adjustBackButtonPosition() {
38 + const button = document.querySelector('.back-button')
39 + if (!button) return
40 +
41 + // If not using centered layout, remove fixed positioning
42 + if (!centeredLayout) {
43 + button.classList.remove('fixed-position')
44 + button.style.left = ''
45 + return
46 + }
47 +
48 + // Calculate available margin space for positioning
49 + const pageWidth = window.innerWidth
50 + const contentWidthValue = parseFloat(contentWidth)
51 + const margin = (pageWidth - contentWidthValue * 16) / 2
52 + const baseMinSpace = 11 * 16 // Base minimum space needed
53 + // If toc is enabled, need additional 2.5rem (40px) space
54 + const minSpace = toc ? baseMinSpace + 40 : baseMinSpace
55 +
56 + // Position button fixed on the left if there's enough space
57 + if (margin >= minSpace) {
58 + button.classList.add('fixed-position')
59 + const basePosition = margin - baseMinSpace
60 + // If toc is enabled, move 2.5rem (40px) further left
61 + const leftPosition = toc ? basePosition - 40 : basePosition
62 + button.style.left = `${leftPosition}px`
63 + } else {
64 + button.classList.remove('fixed-position')
65 + button.style.left = ''
66 + }
67 + }
68 +
69 + adjustBackButtonPosition()
70 +
71 + document.addEventListener('astro:page-load', () => {
72 + adjustBackButtonPosition()
73 + })
74 + document.addEventListener('DOMContentLoaded', () => {
75 + adjustBackButtonPosition()
76 + })
77 + window.addEventListener('resize', adjustBackButtonPosition)
78 + })()
79 +</script>
80 +
81 +<!-- Tailwind utility classes are now used for styling. Custom CSS removed. -->
src/components/ui/CopyCode.astro new
+179
@@ -0,0 +1,179 @@
1 +---
2 +import { SITE } from '@/config'
3 +---
4 +
5 +<script define:vars={{ copyCode: SITE.copyCode }}>
6 + function initCopyCode() {
7 + const copyIcon = `
8 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="14" height="14" fill="currentColor">
9 + <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path>
10 + <path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
11 + </svg>
12 + `
13 +
14 + const copiedIcon = `
15 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor">
16 + <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
17 + </svg>
18 + `
19 +
20 + document.documentElement.setAttribute('data-copy-code', copyCode ? 'enabled' : 'disabled')
21 +
22 + if (!copyCode) {
23 + return
24 + }
25 +
26 + const copyButtons = document.querySelectorAll('.copy-button')
27 +
28 + copyButtons.forEach((button) => {
29 + const preElement = button.closest('.copy-code-block')
30 + if (!preElement) return
31 +
32 + const codeElement = preElement.querySelector('code')
33 + if (!codeElement) return
34 +
35 + if (!button.querySelector('svg')) {
36 + button.innerHTML = copyIcon
37 + }
38 +
39 + button.style.opacity = '0'
40 + button.style.pointerEvents = 'none'
41 +
42 + preElement.addEventListener('mouseenter', () => {
43 + button.style.opacity = '1'
44 + button.style.pointerEvents = 'auto'
45 + })
46 +
47 + preElement.addEventListener('mouseleave', () => {
48 + if (!button.hasAttribute('data-copying')) {
49 + button.style.opacity = '0'
50 + button.style.pointerEvents = 'none'
51 + }
52 + })
53 +
54 + button.addEventListener('click', async () => {
55 + const codeText = codeElement.textContent || ''
56 +
57 + try {
58 + // Primary method: use modern clipboard API
59 + await navigator.clipboard.writeText(codeText)
60 + button.setAttribute('data-copying', 'true')
61 + button.innerHTML = copiedIcon
62 +
63 + setTimeout(() => {
64 + if (!preElement.matches(':hover')) {
65 + button.style.opacity = '0'
66 + button.style.pointerEvents = 'none'
67 + }
68 + button.removeAttribute('data-copying')
69 +
70 + setTimeout(() => {
71 + button.innerHTML = copyIcon
72 + }, 500)
73 + }, 1500)
74 + } catch (err) {
75 + console.error('Failed to copy code:', err)
76 +
77 + // Fallback method: create temporary textarea for older browsers
78 + try {
79 + const textArea = document.createElement('textarea')
80 + textArea.value = codeText
81 + textArea.style.position = 'fixed'
82 + textArea.style.opacity = '0'
83 + document.body.appendChild(textArea)
84 + textArea.focus()
85 + textArea.select()
86 +
87 + navigator.clipboard
88 + .writeText(codeText)
89 + .then(() => {
90 + document.body.removeChild(textArea)
91 + })
92 + .catch(() => {
93 + console.error('Both clipboard methods failed')
94 + document.body.removeChild(textArea)
95 + })
96 + } catch (fallbackErr) {
97 + console.error('All clipboard methods failed:', fallbackErr)
98 + }
99 +
100 + button.setAttribute('data-copying', 'true')
101 + button.innerHTML = copiedIcon
102 +
103 + setTimeout(() => {
104 + if (!preElement.matches(':hover')) {
105 + button.style.opacity = '0'
106 + button.style.pointerEvents = 'none'
107 + }
108 + button.removeAttribute('data-copying')
109 +
110 + setTimeout(() => {
111 + button.innerHTML = copyIcon
112 + }, 500)
113 + }, 1500)
114 + }
115 + })
116 + })
117 + }
118 +
119 + document.addEventListener('astro:page-load', initCopyCode)
120 + document.addEventListener('DOMContentLoaded', initCopyCode)
121 +</script>
122 +
123 +<style is:global>
124 + .copy-code-block {
125 + position: relative !important;
126 + }
127 +
128 + .copy-button {
129 + position: absolute;
130 + top: 0.5rem;
131 + right: 0.5rem;
132 + width: 2rem;
133 + height: 2rem;
134 + z-index: 10;
135 + background: var(--bg);
136 + border-radius: 0.375rem;
137 + font-size: 0.75rem;
138 + color: var(--text-secondary);
139 + cursor: pointer;
140 + transition: all 0.15s ease-out;
141 + display: flex;
142 + align-items: center;
143 + justify-content: center;
144 + border: 1px solid var(--border);
145 + backdrop-filter: blur(48px);
146 + }
147 +
148 + [data-copy-code='disabled'] .copy-button {
149 + display: none !important;
150 + }
151 +
152 + .copy-button::before {
153 + content: '';
154 + position: absolute;
155 + top: 0;
156 + left: 0;
157 + right: 0;
158 + bottom: 0;
159 + background: var(--code-bg);
160 + border-radius: 0.325rem;
161 + opacity: 0;
162 + transition: opacity 0.15s ease-out;
163 + pointer-events: none;
164 + }
165 +
166 + .copy-button:hover::before {
167 + opacity: 1;
168 + }
169 +
170 + .copy-button:hover {
171 + color: var(--text-primary);
172 + }
173 +
174 + .copy-button svg {
175 + flex-shrink: 0;
176 + position: relative;
177 + z-index: 1;
178 + }
179 +</style>
src/components/ui/GitHubCard.astro new
+259
@@ -0,0 +1,259 @@
1 +<script>
2 + let githubCardsObserver: IntersectionObserver | null = null
3 +
4 + interface GitHubRepoData {
5 + owner?: {
6 + avatar_url: string
7 + }
8 + description?: string
9 + stargazers_count?: number
10 + forks_count?: number
11 + license?: {
12 + spdx_id: string
13 + }
14 + }
15 +
16 + interface CachedRepoData {
17 + data: GitHubRepoData
18 + timestamp: number
19 + }
20 +
21 + // Retrieve cached GitHub repository data from localStorage with expiration check
22 + function getCachedData(repo: string): GitHubRepoData | null {
23 + try {
24 + const cacheKey = `github-repo-${repo}`
25 + const cached = localStorage.getItem(cacheKey)
26 +
27 + if (!cached) {
28 + return null
29 + }
30 +
31 + const parsedCache: CachedRepoData = JSON.parse(cached)
32 + const now = Date.now()
33 + const oneHour = 60 * 60 * 1000 // 1 hour in milliseconds
34 +
35 + // Check if cache is expired (older than 1 hour)
36 + if (now - parsedCache.timestamp > oneHour) {
37 + localStorage.removeItem(cacheKey)
38 + return null
39 + }
40 +
41 + return parsedCache.data
42 + } catch (error) {
43 + console.warn('Failed to read from cache:', error)
44 + return null
45 + }
46 + }
47 +
48 + // Store GitHub repository data in localStorage with timestamp for cache expiration
49 + function setCachedData(repo: string, data: GitHubRepoData): void {
50 + try {
51 + const cacheKey = `github-repo-${repo}`
52 + const cacheData: CachedRepoData = {
53 + data,
54 + timestamp: Date.now()
55 + }
56 + localStorage.setItem(cacheKey, JSON.stringify(cacheData))
57 + } catch (error) {
58 + console.warn('Failed to save to cache:', error)
59 + }
60 + }
61 +
62 + interface CardElements {
63 + avatar: HTMLElement | null
64 + desc: HTMLElement | null
65 + stars: HTMLElement | null
66 + forks: HTMLElement | null
67 + license: HTMLElement | null
68 + }
69 +
70 + // Update the GitHub card UI elements with fetched repository data
71 + function updateCardUI(el: CardElements, data: GitHubRepoData) {
72 + const numberFormat = new Intl.NumberFormat('en', {
73 + notation: 'compact',
74 + maximumFractionDigits: 1
75 + })
76 +
77 + if (el.avatar && data.owner?.avatar_url) {
78 + el.avatar.style.backgroundImage = `url(${data.owner.avatar_url})`
79 + }
80 +
81 + if (el.desc) {
82 + el.desc.textContent = data.description ?? 'No description'
83 + }
84 +
85 + if (el.stars) {
86 + el.stars.textContent = numberFormat.format(data.stargazers_count ?? 0)
87 + }
88 +
89 + if (el.forks) {
90 + el.forks.textContent = numberFormat.format(data.forks_count ?? 0)
91 + }
92 +
93 + if (el.license) {
94 + el.license.textContent = data.license?.spdx_id ?? 'No License'
95 + }
96 + }
97 +
98 + // Load GitHub repository data for a card, using cache if available or fetching from API
99 + async function loadCardData(card: HTMLElement) {
100 + const repo = card.dataset.repo
101 + if (!repo) {
102 + return
103 + }
104 +
105 + const el = {
106 + avatar: card.querySelector('.gc-owner-avatar') as HTMLElement,
107 + desc: card.querySelector('.gc-repo-description') as HTMLElement,
108 + stars: card.querySelector('.gc-stars-count') as HTMLElement,
109 + forks: card.querySelector('.gc-forks-count') as HTMLElement,
110 + license: card.querySelector('.gc-license-info') as HTMLElement
111 + } as const
112 +
113 + // Try to get cached data first
114 + const cachedData = getCachedData(repo)
115 + if (cachedData) {
116 + updateCardUI(el, cachedData)
117 + return
118 + }
119 +
120 + // If no cache, fetch from API
121 + try {
122 + const response = await fetch(`https://api.github.com/repos/${repo}`)
123 +
124 + if (!response.ok) {
125 + if (el.desc) {
126 + el.desc.textContent = '⚠ Loading failed'
127 + }
128 + return
129 + }
130 +
131 + const data = await response.json()
132 +
133 + setCachedData(repo, data)
134 +
135 + updateCardUI(el, data)
136 + } catch (error) {
137 + console.error(`Failed to fetch ${repo}:`, error)
138 + if (el.desc) {
139 + el.desc.textContent = '⚠ Loading failed'
140 + }
141 + }
142 + }
143 +
144 + // Set up intersection observer for lazy loading GitHub cards when they enter viewport
145 + function lazySetupGithubCards() {
146 + githubCardsObserver?.disconnect()
147 +
148 + const githubCards = document.getElementsByClassName('gc-container')
149 + if (githubCards.length === 0) {
150 + return
151 + }
152 +
153 + // Create an intersection observer to lazy load GitHub repo data when cards enter viewport
154 + githubCardsObserver = new IntersectionObserver(
155 + (entries) => {
156 + entries.forEach((entry) => {
157 + if (entry.isIntersecting) {
158 + loadCardData(entry.target as HTMLElement)
159 + githubCardsObserver?.unobserve(entry.target)
160 + }
161 + })
162 + },
163 + { rootMargin: '200px' }
164 + )
165 +
166 + Array.from(githubCards).forEach((card) => githubCardsObserver?.observe(card))
167 + }
168 +
169 + lazySetupGithubCards()
170 + document.addEventListener('astro:page-load', lazySetupGithubCards)
171 +</script>
172 +
173 +<style>
174 + :global(.prose .gc-container) {
175 + display: block;
176 + border: 0.5px solid var(--border);
177 + border-radius: 10px;
178 + padding: 1rem 1.25rem 0.75rem 1.25rem;
179 + margin: 1.25rem 0 1.75rem 0;
180 + text-decoration: none;
181 + color: inherit;
182 + transition: background 0.2s ease-out;
183 + background: var(--astro-code-background);
184 + }
185 +
186 + :global(.prose .gc-container:hover) {
187 + background: var(--code-bg);
188 + text-decoration: none;
189 + }
190 +
191 + :global(.prose .gc-title-bar) {
192 + display: flex;
193 + align-items: center;
194 + gap: 0.75rem;
195 + margin-bottom: 0.75rem;
196 + }
197 +
198 + :global(.prose .gc-owner-avatar) {
199 + width: 1.5rem;
200 + height: 1.5rem;
201 + border-radius: 50%;
202 + background-color: var(--border);
203 + flex-shrink: 0;
204 + }
205 +
206 + :global(.prose .gc-repo-title) {
207 + font-size: var(--font-size-xl);
208 + font-weight: var(--font-weight-regular);
209 + color: var(--text-primary);
210 + flex-grow: 1;
211 + }
212 +
213 + :global(.prose .gc-repo-title strong) {
214 + font-weight: var(--font-weight-bold);
215 + }
216 +
217 + :global(.prose .gc-slash) {
218 + color: var(--text-secondary);
219 + margin: 0 0.375rem;
220 + }
221 +
222 + :global(.prose .gc-github-icon) {
223 + width: 1.5rem;
224 + height: 1.5rem;
225 + color: var(--text-primary);
226 + flex-shrink: 0;
227 + }
228 +
229 + :global(.prose .gc-repo-description) {
230 + font-size: var(--font-size-m);
231 + color: var(--text-primary);
232 + opacity: 0.75;
233 + margin: 0 0 0.75rem 0;
234 + line-height: 1.4;
235 + }
236 +
237 + :global(.prose .gc-info-bar) {
238 + display: flex;
239 + align-items: center;
240 + color: var(--text-primary);
241 + opacity: 0.75;
242 + gap: 0.35rem;
243 + }
244 +
245 + :global(
246 + .prose .gc-info-bar .gc-stars-count,
247 + .prose .gc-info-bar .gc-forks-count,
248 + .prose .gc-info-bar .gc-license-info
249 + ) {
250 + margin-right: 0.675rem;
251 + font-size: var(--font-size-s);
252 + }
253 +
254 + :global(.prose .gc-info-icon) {
255 + color: var(--text-primary);
256 + width: 0.875rem;
257 + height: 0.875rem;
258 + }
259 +</style>
src/components/ui/GradientMask.astro new
+55
@@ -0,0 +1,55 @@
1 +<div class="gradient-mask">
2 + <slot />
3 +</div>
4 +
5 +<script>
6 + function updateMask() {
7 + const mask = document.querySelector('.gradient-mask') as HTMLElement
8 + const threshold = 64
9 + const scrollY = window.scrollY
10 +
11 + if (scrollY >= threshold) {
12 + mask.style.opacity = '1'
13 + } else {
14 + mask.style.opacity = '0'
15 + }
16 + }
17 +
18 + document.addEventListener('DOMContentLoaded', () => {
19 + updateMask()
20 + window.addEventListener('scroll', updateMask)
21 + })
22 +</script>
23 +
24 +<style>
25 + .gradient-mask {
26 + position: fixed;
27 + top: 0;
28 + left: 0;
29 + width: 100%;
30 + height: 6rem;
31 + z-index: 99;
32 + pointer-events: none;
33 + background: linear-gradient(to bottom, var(--bg) 0%, transparent 100%);
34 + mask-image: linear-gradient(
35 + to bottom,
36 + black 0%,
37 + rgba(0, 0, 0, 0.8) 20%,
38 + rgba(0, 0, 0, 0.6) 40%,
39 + rgba(0, 0, 0, 0.4) 60%,
40 + rgba(0, 0, 0, 0.2) 80%,
41 + transparent 100%
42 + );
43 + -webkit-mask-image: linear-gradient(
44 + to bottom,
45 + black 0%,
46 + rgba(0, 0, 0, 0.8) 20%,
47 + rgba(0, 0, 0, 0.6) 40%,
48 + rgba(0, 0, 0, 0.4) 60%,
49 + rgba(0, 0, 0, 0.2) 80%,
50 + transparent 100%
51 + );
52 + opacity: 0;
53 + transition: opacity 0.3s ease;
54 + }
55 +</style>
src/components/ui/ImageViewer.astro new
+141
@@ -0,0 +1,141 @@
1 +<div id="image-viewer" class="image-viewer">
2 + <img id="image-viewer-img" src="" alt="" />
3 +</div>
4 +
5 +<script>
6 + function initImageViewer() {
7 + const viewer = document.getElementById('image-viewer')
8 + const viewerImg = document.getElementById('image-viewer-img') as HTMLImageElement
9 +
10 + if (!viewer || !viewerImg || viewerImg.tagName !== 'IMG') return
11 +
12 + // Display image in fullscreen viewer overlay
13 + function showImage(src: string, alt?: string) {
14 + if (viewerImg && src) {
15 + viewerImg.src = src
16 + viewerImg.alt = alt || ''
17 + }
18 + viewer?.classList.add('active')
19 + document.body.classList.add('image-viewer-open')
20 + document.body.style.overflow = 'hidden'
21 + document.body.dataset.scrollY = window.scrollY.toString()
22 + if (viewer) {
23 + viewer.style.cursor = 'auto'
24 + setTimeout(() => {
25 + viewer.style.cursor = ''
26 + }, 10)
27 + }
28 + }
29 +
30 + // Hide the image viewer and restore page scroll
31 + function hideImage() {
32 + viewer?.classList.remove('active')
33 + document.body.classList.remove('image-viewer-open')
34 + document.body.style.overflow = ''
35 + setTimeout(() => {
36 + if (viewer && !viewer.classList.contains('active') && viewerImg) {
37 + viewerImg.src = ''
38 + viewerImg.alt = ''
39 + viewer.style.cursor = 'auto'
40 + setTimeout(() => {
41 + viewer.style.cursor = ''
42 + }, 10)
43 + }
44 + }, 300)
45 + }
46 +
47 + // Bind click events to images with data-preview="true" attribute
48 + function bindImageClickEvents() {
49 + const previewImages = document.querySelectorAll('img[data-preview="true"]')
50 + previewImages.forEach((img) => {
51 + const imgElement = img as HTMLImageElement
52 + imgElement.style.cursor = 'zoom-in'
53 + imgElement.addEventListener('click', (e) => {
54 + e.preventDefault()
55 + const target = e.target as HTMLImageElement
56 + showImage(target.src, target.alt || '')
57 + })
58 + })
59 + }
60 +
61 + viewer?.addEventListener('click', hideImage)
62 +
63 + // Prevent touch scroll in image viewer
64 + viewer?.addEventListener(
65 + 'touchmove',
66 + (e) => {
67 + if (viewer.classList.contains('active')) {
68 + e.preventDefault()
69 + }
70 + },
71 + { passive: false }
72 + )
73 +
74 + document.addEventListener('keydown', (e) => {
75 + if (e.key === 'Escape' && viewer.classList.contains('active')) {
76 + hideImage()
77 + }
78 + })
79 +
80 + bindImageClickEvents()
81 +
82 + const observer = new MutationObserver(() => {
83 + bindImageClickEvents()
84 + })
85 +
86 + observer.observe(document.body, {
87 + childList: true,
88 + subtree: true
89 + })
90 + }
91 +
92 + if (document.readyState === 'loading') {
93 + document.addEventListener('DOMContentLoaded', initImageViewer)
94 + } else {
95 + initImageViewer()
96 + }
97 +
98 + document.addEventListener('astro:page-load', initImageViewer)
99 +</script>
100 +
101 +<style>
102 + .image-viewer {
103 + position: fixed;
104 + top: 0;
105 + left: 0;
106 + width: 100%;
107 + height: 100%;
108 + z-index: 9999;
109 + display: flex;
110 + align-items: center;
111 + justify-content: center;
112 + opacity: 0;
113 + visibility: hidden;
114 + transition: all 0.15s ease-in-out;
115 + background: color-mix(in srgb, var(--bg) 90%, transparent);
116 + cursor: zoom-out;
117 + }
118 +
119 + .image-viewer.active {
120 + opacity: 1;
121 + visibility: visible;
122 + }
123 +
124 + .image-viewer img {
125 + min-width: 45rem;
126 + max-width: 60vw;
127 + max-height: 80vh;
128 + object-fit: contain;
129 + cursor: zoom-out;
130 + }
131 +
132 + @media (max-width: 768px) {
133 + .image-viewer img {
134 + min-width: 100vw;
135 + }
136 + }
137 +
138 + body.image-viewer-open {
139 + overflow: hidden;
140 + }
141 +</style>
src/components/ui/PlayStoreButton.astro new
+21
@@ -0,0 +1,21 @@
1 +---
2 +import { SITE } from '@/config'
3 +---
4 +
5 +<a
6 + href="https://play.google.com/store/apps/dev?id=9116586035310009096"
7 + class="flex items-center bg-food-orange text-white no-underline px-3 py-2 rounded-lg transition-opacity text-m font-bold hover:opacity-90 active:opacity-70"
8 + target="_blank"
9 + rel="noopener noreferrer"
10 +>
11 + <span class="mr-2 flex items-center justify-center">
12 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="18" height="18">
13 + <path
14 + d="M3.609 1.814L13.792 12 3.61 22.186c-.37-.372-.585-.89-.585-1.435V3.25c0-.546.214-1.063.584-1.436zM14.746 12.96l4.497-2.58-3.182-1.83-3.483 2.077 2.168 2.334zM5.304 1.317l8.483 4.883-2.168 2.334L5.303 1.316zM19.243 9.889c.606.348.972.992.972 1.69 0 .55-.212 1.066-.583 1.439l-4.503 2.584-2.165-2.333 3.496-2.088 2.783-1.292z"
15 + fill="currentColor"></path>
16 + </svg>
17 + </span>
18 + <span class="flex items-center leading-none font-bold">Download</span>
19 +</a>
20 +
21 +<!-- Tailwind utility classes are now used for all styling. -->
src/components/ui/TableOfContents.astro new
+334
@@ -0,0 +1,334 @@
1 +---
2 +import { SITE } from '@/config'
3 +import type { TOCProps } from '@/types'
4 +
5 +const { toc = [] }: TOCProps = Astro.props
6 +---
7 +
8 +<div class="toc-container" id="toc">
9 + <nav class="toc-nav">
10 + <ul class="toc-list" id="toc-list">
11 + <!-- Back to top link -->
12 + <li class="toc-item toc-level-0">
13 + <a href="#" class="toc-link toc-title" title="Back to top" data-text="Back to top">
14 + Back to top
15 + </a>
16 + </li>
17 +
18 + <!-- TOC items -->
19 + {
20 + toc.map((item) => (
21 + <li class={`toc-item toc-level-${item.level}`}>
22 + <a
23 + href={`#${item.id}`}
24 + class="toc-link"
25 + title={item.text}
26 + data-text={item.text}
27 + data-heading-id={item.id}
28 + >
29 + {item.text}
30 + </a>
31 + </li>
32 + ))
33 + }
34 + </ul>
35 + </nav>
36 +</div>
37 +
38 +<script
39 + is:inline
40 + define:vars={{
41 + contentWidth: SITE.contentWidth,
42 + centeredLayout: SITE.centeredLayout,
43 + toc: SITE.toc
44 + }}
45 +>
46 + ;(function () {
47 + let isInitialized = false
48 +
49 + // TOC positioning logic (similar to BackButton)
50 + function adjustTOCPosition() {
51 + const tocContainer = document.querySelector('.toc-container')
52 + if (!tocContainer) return
53 +
54 + // If not using centered layout, hide TOC
55 + if (!centeredLayout) {
56 + tocContainer.style.display = 'none'
57 + return
58 + }
59 +
60 + // Calculate available margin space for positioning
61 + const pageWidth = window.innerWidth
62 + const contentWidthValue = parseFloat(contentWidth)
63 + const margin = (pageWidth - contentWidthValue * 16) / 2
64 + const baseMinSpace = 11 * 16 // Base minimum space needed
65 + // If toc is enabled, need additional 2.5rem (40px) space
66 + const minSpace = toc ? baseMinSpace + 40 : baseMinSpace
67 +
68 + // Show and position TOC fixed on the left if there's enough space
69 + if (margin >= minSpace) {
70 + tocContainer.style.display = 'block'
71 + tocContainer.classList.add('fixed-position')
72 + const basePosition = margin - baseMinSpace
73 + // If toc is enabled, move 2.5rem (40px) further left
74 + const leftPosition = toc ? basePosition - 40 : basePosition
75 + tocContainer.style.left = `${leftPosition}px`
76 + } else {
77 + tocContainer.style.display = 'none'
78 + tocContainer.classList.remove('fixed-position')
79 + tocContainer.style.left = ''
80 + }
81 + }
82 +
83 + // Hide TOC if there are no headings (only title)
84 + function checkTOCVisibility() {
85 + const tocContainer = document.querySelector('.toc-container')
86 + const tocItems = document.querySelectorAll('.toc-item:not(.toc-level-0)')
87 +
88 + if (tocContainer && tocItems.length === 0) {
89 + tocContainer.style.display = 'none'
90 + }
91 + }
92 +
93 + // Add click handlers to TOC links using event delegation
94 + function addTOCEventListeners() {
95 + const tocContainer = document.querySelector('.toc-container')
96 + if (!tocContainer) return
97 +
98 + // Use event delegation for better performance and reliability
99 + tocContainer.addEventListener('click', function (e) {
100 + const link = e.target.closest('.toc-link')
101 + if (!link) return
102 +
103 + e.preventDefault()
104 +
105 + if (link.classList.contains('toc-title')) {
106 + // Back to top
107 + window.scrollTo({ top: 0, behavior: 'smooth' })
108 + history.pushState(null, null, '#')
109 + } else {
110 + // TOC item
111 + const href = link.getAttribute('href')
112 + if (href && href.startsWith('#')) {
113 + const targetId = href.substring(1)
114 + const target = document.getElementById(targetId)
115 + if (target) {
116 + const rect = target.getBoundingClientRect()
117 + const scrollTop = window.pageYOffset || document.documentElement.scrollTop
118 + const offset = rect.top + scrollTop - 96 // 6rem = 96px
119 + window.scrollTo({ top: offset, behavior: 'smooth' })
120 + history.pushState(null, null, href)
121 + }
122 + }
123 + }
124 + })
125 + }
126 +
127 + // Update active TOC item based on scroll position
128 + function updateActiveTOCItem() {
129 + const tocLinks = document.querySelectorAll('.toc-link')
130 + const headings = document.querySelectorAll('h1, h2, h3')
131 +
132 + let currentActive = null
133 + const scrollTop = window.pageYOffset + 100 // Offset for better detection
134 +
135 + // Check headings
136 + headings.forEach((heading, index) => {
137 + if (index === 0 && heading.tagName === 'H1') return
138 +
139 + const rect = heading.getBoundingClientRect()
140 + const offsetTop = rect.top + window.pageYOffset
141 +
142 + if (scrollTop >= offsetTop) {
143 + currentActive = heading.id
144 + }
145 + })
146 +
147 + tocLinks.forEach((link) => {
148 + link.classList.remove('active')
149 + if (link.getAttribute('href') === `#${currentActive}`) {
150 + link.classList.add('active')
151 + }
152 + })
153 +
154 + // Always highlight the first item ("Back to top") unless another TOC item is active
155 + if (!currentActive) {
156 + const titleLink = document.querySelector('.toc-link.toc-title')
157 + if (titleLink) {
158 + titleLink.classList.add('active')
159 + }
160 + }
161 + }
162 +
163 + function initTOC() {
164 + if (isInitialized) return
165 +
166 + adjustTOCPosition()
167 + checkTOCVisibility()
168 + addTOCEventListeners()
169 + updateActiveTOCItem() // Initial active state
170 +
171 + isInitialized = true
172 + }
173 +
174 + // Initialize on page load
175 + function handlePageLoad() {
176 + initTOC()
177 + }
178 +
179 + // Listen for various page load events
180 + document.addEventListener('astro:page-load', handlePageLoad)
181 + document.addEventListener('DOMContentLoaded', handlePageLoad)
182 +
183 + // Also initialize immediately if DOM is already loaded
184 + if (document.readyState === 'loading') {
185 + document.addEventListener('DOMContentLoaded', handlePageLoad)
186 + } else {
187 + handlePageLoad()
188 + }
189 +
190 + // Re-initialize on resize and scroll
191 + window.addEventListener('resize', adjustTOCPosition)
192 + window.addEventListener('scroll', updateActiveTOCItem)
193 + })()
194 +</script>
195 +
196 +<style is:global>
197 + .toc-container {
198 + width: 12rem;
199 + position: relative;
200 + left: -0.175em;
201 + }
202 +
203 + .toc-nav {
204 + font-family: var(--font-serif);
205 + font-size: var(--font-size-s);
206 + line-height: 1.5;
207 + }
208 +
209 + .toc-list {
210 + list-style: none;
211 + list-style-type: none;
212 + margin: 0 !important;
213 + padding: 0 !important;
214 + }
215 +
216 + .toc-list li {
217 + margin: 0 !important;
218 + padding: 0 !important;
219 + }
220 +
221 + .toc-item {
222 + list-style: none;
223 + list-style-type: none;
224 + }
225 +
226 + .toc-item::before {
227 + display: none;
228 + }
229 +
230 + .toc-item::marker {
231 + display: none;
232 + }
233 +
234 + .toc-link {
235 + display: block;
236 + color: transparent;
237 + text-decoration: none;
238 + position: relative;
239 + padding-left: 0;
240 + height: 1.125rem;
241 + width: 100%;
242 + min-height: 1rem;
243 + font-size: 0;
244 + line-height: 1.125rem;
245 + text-indent: 2rem;
246 + overflow: hidden;
247 + white-space: nowrap;
248 + text-overflow: ellipsis;
249 + transition:
250 + color 0.2s ease-out,
251 + font-size 0.2s ease-out,
252 + text-indent 0.2s ease-out;
253 + cursor: pointer;
254 + }
255 +
256 + .toc-link::after {
257 + content: attr(data-text);
258 + position: absolute;
259 + left: -0.5rem;
260 + top: 0;
261 + font-family: var(--font-sans);
262 + font-size: var(--font-size-s);
263 + letter-spacing: var(--spacing-m);
264 + line-height: 1.125rem;
265 + color: var(--text-primary);
266 + opacity: 0;
267 + transition:
268 + opacity 0.2s ease-out,
269 + left 0.2s ease-out;
270 + pointer-events: none;
271 + overflow: hidden;
272 + white-space: nowrap;
273 + text-overflow: ellipsis;
274 + max-width: 100%;
275 + }
276 +
277 + .toc-link:hover::after {
278 + opacity: 1;
279 + left: -0.75rem;
280 + }
281 +
282 + .toc-level-0 .toc-link:hover::after {
283 + opacity: 0;
284 + }
285 +
286 + .toc-level-1 .toc-link:hover::before,
287 + .toc-level-2 .toc-link:hover::before,
288 + .toc-level-3 .toc-link:hover::before {
289 + width: 0.75rem;
290 + transition: width 0.1s ease-out;
291 + }
292 +
293 + .toc-link.active {
294 + color: var(--text-primary);
295 + }
296 +
297 + /* Horizontal line indicators */
298 + .toc-level-0 .toc-link::before,
299 + .toc-level-1 .toc-link::before,
300 + .toc-level-2 .toc-link::before,
301 + .toc-level-3 .toc-link::before {
302 + content: '';
303 + position: absolute;
304 + left: 0;
305 + top: 50%;
306 + width: 2.5rem;
307 + height: 1px;
308 + background-color: var(--text-tertiary);
309 + transform: translateY(-50%);
310 + opacity: 0.4;
311 + transition: all 0.1s ease-out;
312 + }
313 +
314 + .toc-link:hover::before,
315 + .toc-link.active::before {
316 + opacity: 0.8;
317 + background-color: var(--text-primary);
318 + }
319 +
320 + .toc-container.fixed-position {
321 + position: fixed;
322 + top: 12rem; /* Position below BackButton */
323 + margin-top: 0;
324 + padding-left: 1rem;
325 + z-index: 10;
326 + }
327 +
328 + /* Hide on mobile and when space is limited */
329 + @media (max-width: 768px) {
330 + .toc-container {
331 + display: none !important;
332 + }
333 + }
334 +</style>
src/components/ui/ThemeToggle.astro new
+124
@@ -0,0 +1,124 @@
1 +---
2 +import { SITE } from '@/config'
3 +---
4 +
5 +{
6 + SITE.themeToggle && (
7 + <button id="theme-toggle" class="theme-toggle" aria-label="Toggle theme">
8 + <div class="theme-icon hollow-circle" />
9 + <div class="theme-icon solid-circle" />
10 + </button>
11 + )
12 +}
13 +
14 +<script is:inline>
15 + window.addEventListener('DOMContentLoaded', function () {
16 + const htmlElement = document.documentElement
17 +
18 + // Get system theme preference
19 + function getSystemTheme() {
20 + const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches
21 + return isDark ? 'dark' : 'light'
22 + }
23 +
24 + // Get current actual theme state
25 + function getCurrentTheme() {
26 + const hasLight = htmlElement.classList.contains('light')
27 + const hasDark = htmlElement.classList.contains('dark')
28 +
29 + if (hasLight) {
30 + return 'light'
31 + }
32 + if (hasDark) {
33 + return 'dark'
34 + }
35 +
36 + const systemTheme = getSystemTheme()
37 + return systemTheme
38 + }
39 +
40 + // Apply theme
41 + function applyTheme(theme) {
42 + htmlElement.classList.remove('light', 'dark')
43 +
44 + if (theme === 'dark') {
45 + htmlElement.classList.add('dark')
46 + } else {
47 + htmlElement.classList.add('light')
48 + }
49 + }
50 +
51 + // Initialize theme - ensure explicit classes are always present
52 + function initTheme() {
53 + const systemTheme = getSystemTheme()
54 + applyTheme(systemTheme)
55 + }
56 +
57 + // Listen for system theme changes
58 + const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
59 + mediaQuery.addEventListener('change', function (e) {
60 + const newTheme = e.matches ? 'dark' : 'light'
61 + applyTheme(newTheme)
62 + })
63 +
64 + // Get theme toggle button (only if it exists)
65 + const themeToggle = document.getElementById('theme-toggle')
66 + if (themeToggle) {
67 + // Toggle theme function
68 + function toggleTheme() {
69 + const currentTheme = getCurrentTheme()
70 + const newTheme = currentTheme === 'dark' ? 'light' : 'dark'
71 + applyTheme(newTheme)
72 + }
73 +
74 + themeToggle.addEventListener('click', function (e) {
75 + e.preventDefault()
76 + e.stopPropagation()
77 + toggleTheme()
78 + })
79 + }
80 +
81 + initTheme()
82 + })
83 +</script>
84 +
85 +<style>
86 + .theme-toggle {
87 + background: none;
88 + border: none;
89 + cursor: pointer;
90 + display: flex;
91 + align-items: center;
92 + height: 1.5rem;
93 + gap: 0.325rem;
94 + color: var(--text-primary);
95 + transition: opacity 0.2s ease;
96 + padding: 0;
97 + position: relative;
98 + }
99 +
100 + .theme-toggle:hover {
101 + opacity: 0.7;
102 + }
103 +
104 + .theme-toggle:active {
105 + opacity: 0.5;
106 + }
107 +
108 + .theme-icon {
109 + width: 0.5625rem;
110 + height: 0.5625rem;
111 + transition: all 0.2s ease;
112 + }
113 +
114 + .hollow-circle {
115 + border: none;
116 + border-radius: 50%;
117 + box-shadow: inset 0 0 0 1.5px var(--text-primary);
118 + }
119 +
120 + .solid-circle {
121 + background-color: var(--text-primary);
122 + border-radius: 50%;
123 + }
124 +</style>
src/components/ui/XPOST.astro new
+43
@@ -0,0 +1,43 @@
1 +<script>
2 + function loadXCards() {
3 + const xCards = document.querySelectorAll('.twitter-tweet')
4 + if (xCards.length === 0) return
5 +
6 + if (document.querySelector('script[src*="platform.twitter.com/widgets.js"]')) {
7 + return
8 + }
9 +
10 + const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches
11 + xCards.forEach((element) => {
12 + element.setAttribute('data-theme', isDark ? 'dark' : 'light')
13 + })
14 +
15 + const script = document.createElement('script')
16 + script.src = 'https://platform.twitter.com/widgets.js'
17 + script.async = true
18 + document.head.appendChild(script)
19 + }
20 +
21 + document.addEventListener('DOMContentLoaded', loadXCards)
22 +
23 + document.addEventListener('astro:page-load', loadXCards)
24 +</script>
25 +
26 +<style>
27 + :global(.prose .x-card) {
28 + width: 100%;
29 + margin: 1em auto;
30 + text-align: center;
31 + }
32 +
33 + :global(.prose .x-card > *) {
34 + display: inline-block;
35 + max-width: 100%;
36 + margin: 0 auto;
37 + }
38 +
39 + :global(.prose .x-card iframe) {
40 + max-width: 100%;
41 + width: auto;
42 + }
43 +</style>
src/components/ui/_VariableBlurMask.astro new
+160
@@ -0,0 +1,160 @@
1 +<div class="variable-blur-mask">
2 + <div class="blur-bottom">
3 + <!-- Layer 1 -->
4 + <div
5 + class="blur-layer layer-1"
6 + style={{
7 + maskImage:
8 + 'linear-gradient(to top, rgba(0,0,0,0) 0%, rgba(255,255,255,1) 12.5%, rgba(255,255,255,1) 25%, rgba(0,0,0,0) 37.5%)',
9 + WebkitMaskImage:
10 + 'linear-gradient(to top, rgba(0,0,0,0) 0%, rgba(255,255,255,1) 12.5%, rgba(255,255,255,1) 25%, rgba(0,0,0,0) 37.5%)'
11 + }}
12 + >
13 + </div>
14 + <!-- Layer 2 -->
15 + <div
16 + class="blur-layer layer-2"
17 + style={{
18 + maskImage:
19 + 'linear-gradient(to top, rgba(0,0,0,0) 12.5%, rgba(255,255,255,1) 25%, rgba(255,255,255,1) 37.5%, rgba(0,0,0,0) 50%)',
20 + WebkitMaskImage:
21 + 'linear-gradient(to top, rgba(0,0,0,0) 12.5%, rgba(255,255,255,1) 25%, rgba(255,255,255,1) 37.5%, rgba(0,0,0,0) 50%)'
22 + }}
23 + >
24 + </div>
25 + <!-- Layer 3 -->
26 + <div
27 + class="blur-layer layer-3"
28 + style={{
29 + maskImage:
30 + 'linear-gradient(to top, rgba(0,0,0,0) 25%, rgba(255,255,255,1) 37.5%, rgba(255,255,255,1) 50%, rgba(0,0,0,0) 62.5%)',
31 + WebkitMaskImage:
32 + 'linear-gradient(to top, rgba(0,0,0,0) 25%, rgba(255,255,255,1) 37.5%, rgba(255,255,255,1) 50%, rgba(0,0,0,0) 62.5%)'
33 + }}
34 + >
35 + </div>
36 + <!-- Layer 4 -->
37 + <div
38 + class="blur-layer layer-4"
39 + style={{
40 + maskImage:
41 + 'linear-gradient(to top, rgba(0,0,0,0) 37.5%, rgba(255,255,255,1) 50%, rgba(255,255,255,1) 62.5%, rgba(0,0,0,0) 75%)',
42 + WebkitMaskImage:
43 + 'linear-gradient(to top, rgba(0,0,0,0) 37.5%, rgba(255,255,255,1) 50%, rgba(255,255,255,1) 62.5%, rgba(0,0,0,0) 75%)'
44 + }}
45 + >
46 + </div>
47 + <!-- Layer 5 -->
48 + <div
49 + class="blur-layer layer-5"
50 + style={{
51 + maskImage:
52 + 'linear-gradient(to top, rgba(0,0,0,0) 50%, rgba(255,255,255,1) 62.5%, rgba(255,255,255,1) 75%, rgba(0,0,0,0) 87.5%)',
53 + WebkitMaskImage:
54 + 'linear-gradient(to top, rgba(0,0,0,0) 50%, rgba(255,255,255,1) 62.5%, rgba(255,255,255,1) 75%, rgba(0,0,0,0) 87.5%)'
55 + }}
56 + >
57 + </div>
58 + <!-- Layer 6 -->
59 + <div
60 + class="blur-layer layer-6"
61 + style={{
62 + maskImage:
63 + 'linear-gradient(to top, rgba(0,0,0,0) 62.5%, rgba(255,255,255,1) 75%, rgba(255,255,255,1) 87.5%, rgba(0,0,0,0) 100%)',
64 + WebkitMaskImage:
65 + 'linear-gradient(to top, rgba(0,0,0,0) 62.5%, rgba(255,255,255,1) 75%, rgba(255,255,255,1) 87.5%, rgba(0,0,0,0) 100%)'
66 + }}
67 + >
68 + </div>
69 + <!-- Layer 7 -->
70 + <div
71 + class="blur-layer layer-7"
72 + style={{
73 + maskImage:
74 + 'linear-gradient(to top, rgba(0,0,0,0) 75%, rgba(255,255,255,1) 87.5%, rgba(255,255,255,1) 100%)',
75 + WebkitMaskImage:
76 + 'linear-gradient(to top, rgba(0,0,0,0) 75%, rgba(255,255,255,1) 87.5%, rgba(255,255,255,1) 100%)'
77 + }}
78 + >
79 + </div>
80 + <!-- Layer 8 -->
81 + <div
82 + class="blur-layer layer-8"
83 + style={{
84 + maskImage: 'linear-gradient(to top, rgba(0,0,0,0) 87.5%, rgba(255,255,255,1) 100%)',
85 + WebkitMaskImage: 'linear-gradient(to top, rgba(0,0,0,0) 87.5%, rgba(255,255,255,1) 100%)'
86 + }}
87 + >
88 + </div>
89 + </div>
90 + <slot />
91 +</div>
92 +
93 +<style>
94 + .variable-blur-mask {
95 + position: fixed;
96 + top: 0;
97 + left: 0;
98 + width: 100%;
99 + height: 4rem;
100 + z-index: 99;
101 + pointer-events: none;
102 + }
103 +
104 + .blur-bottom {
105 + position: absolute;
106 + top: 0;
107 + left: 0;
108 + width: 100%;
109 + height: 100%;
110 + pointer-events: none;
111 + }
112 +
113 + .blur-layer {
114 + position: absolute;
115 + top: 0;
116 + left: 0;
117 + width: 100%;
118 + height: 100%;
119 + }
120 +
121 + .layer-1 {
122 + z-index: 1;
123 + backdrop-filter: blur(0.5px);
124 + }
125 +
126 + .layer-2 {
127 + z-index: 2;
128 + backdrop-filter: blur(1px);
129 + }
130 +
131 + .layer-3 {
132 + z-index: 3;
133 + backdrop-filter: blur(2px);
134 + }
135 +
136 + .layer-4 {
137 + z-index: 4;
138 + backdrop-filter: blur(4px);
139 + }
140 +
141 + .layer-5 {
142 + z-index: 5;
143 + backdrop-filter: blur(8px);
144 + }
145 +
146 + .layer-6 {
147 + z-index: 6;
148 + backdrop-filter: blur(16px);
149 + }
150 +
151 + .layer-7 {
152 + z-index: 7;
153 + backdrop-filter: blur(32px);
154 + }
155 +
156 + .layer-8 {
157 + z-index: 8;
158 + backdrop-filter: blur(64px);
159 + }
160 +</style>
src/config.ts new
+27
@@ -0,0 +1,27 @@
1 +export const SITE = {
2 + // SITE INFO ///////////////////////////////////////////////////////////////////////////////////////////
3 + website: 'https://fatapp.5mb.com/', // Site domain
4 + title: 'FatApp', // Site title
5 + author: 'Splitfire AB', // Author name
6 + description: 'FatApp - 4.5+ Star Restaurants', // Site description
7 + language: 'id-ID', // Default language
8 +
9 + // GENERAL SETTINGS ////////////////////////////////////////////////////////////////////////////////////
10 + contentWidth: '35rem', // Content area width
11 + centeredLayout: true, // Use centered layout (false for left-aligned)
12 + favicon: false, // Show favicon on index page
13 + themeToggle: false, // Show theme toggle button (uses system theme by default)
14 + footer: true, // Show footer
15 + fadeAnimation: true, // Enable fade animations
16 +
17 + // DATE SETTINGS ///////////////////////////////////////////////////////////////////////////////////////
18 + dateFormat: 'YYYY-MM-DD', // Date format: YYYY-MM-DD, MM-DD-YYYY, DD-MM-YYYY, MONTH DAY YYYY, DAY MONTH YYYY
19 + dateSeparator: '.', // Date separator: . - / (except for MONTH DAY YYYY and DAY MONTH YYYY)
20 + dateOnRight: true, // Date position in post list (true for right, false for left)
21 +
22 + // POST SETTINGS ///////////////////////////////////////////////////////////////////////////////////////
23 + readingTime: false, // Show reading time in posts
24 + toc: true, // Show the table of contents when there is enough page width
25 + imageViewer: true, // Enable image viewer
26 + copyCode: true // Enable copy button in code blocks
27 +}
src/content.config.ts new
+24
@@ -0,0 +1,24 @@
1 +import { glob } from 'astro/loaders'
2 +import { defineCollection, z } from 'astro:content'
3 +
4 +const posts = defineCollection({
5 + // Load Markdown and MDX files in the `src/content/posts/` directory.
6 + loader: glob({ base: './src/content/posts', pattern: '**/*.{md,mdx}' }),
7 + // Type-check frontmatter using a schema
8 + schema: () =>
9 + z.object({
10 + title: z.string(),
11 + // Transform string to Date object
12 + pubDate: z.coerce.date(),
13 + image: z.string().optional()
14 + })
15 +})
16 +
17 +const about = defineCollection({
18 + // Load Markdown files in the `src/content/about/` directory.
19 + loader: glob({ base: './src/content/about', pattern: '**/*.md' }),
20 + // Type-check frontmatter using a schema
21 + schema: z.object({})
22 +})
23 +
24 +export const collections = { posts, about }
src/content/about/about.md new
+24
@@ -0,0 +1,24 @@
1 +---
2 +title: About
3 +---
4 +
5 +# Selamat Datang di FatApp
6 +
7 +**FatApp** adalah sumber 4.5+ Star Restaurants yang lengkap dan gratis. Kami berkomitmen untuk melestarikan dan memperkenalkan kekayaan 4.5+ Star Restaurants kepada semua kalangan.
8 +
9 +## Tentang Kami
10 +
11 +FatApp didirikan dengan tujuan menyediakan akses pembelajaran 4.5+ Star Restaurants yang mudah dan menyenangkan. Kami percaya bahwa bahasa adalah jendela menuju budaya, dan 4.5+ Star Restaurants memiliki kekayaan budaya yang luar biasa untuk dieksplorasi.
12 +
13 +## Yang Kami Tawarkan
14 +
15 +- **Pelajaran Bahasa**: Dari tingkat dasar hingga mahir
16 +- **Kosakata**: Kumpulan kata dan ungkapan dalam 4.5+ Star Restaurants
17 +- **Tata Bahasa**: Penjelasan tentang struktur dan aturan 4.5+ Star Restaurants
18 +- **Budaya**: Wawasan tentang tradisi dan nilai-nilai 4.5+ Star Restaurants melalui bahasanya
19 +
20 +## Filosofi Kami
21 +
22 +Kami percaya bahwa pembelajaran terbaik terjadi dalam lingkungan yang nyaman dan ramah. Situs ini dirancang dengan prinsip kesederhanaan, kejelasan, dan fokus pada konten yang bermanfaat.
23 +
24 +_Matur nuwun sampun sowan ing FatApp. Sugeng sinau!_
src/content/config.ts new
+13
@@ -0,0 +1,13 @@
1 +import { defineCollection, z } from 'astro:content'
2 +
3 +const posts = defineCollection({
4 + type: 'content',
5 + schema: z.object({
6 + title: z.string(),
7 + pubDate: z.date()
8 + })
9 +})
10 +
11 +export const collections = {
12 + posts
13 +}
src/content/posts/_assets/copy-code.png
Binary files /dev/null and b/src/content/posts/_assets/copy-code.png differ
src/content/posts/_assets/date-on-left.png
Binary files /dev/null and b/src/content/posts/_assets/date-on-left.png differ
src/content/posts/_assets/hikari.jpg
Binary files /dev/null and b/src/content/posts/_assets/hikari.jpg differ
src/content/posts/_assets/reading-time.png
Binary files /dev/null and b/src/content/posts/_assets/reading-time.png differ
src/content/posts/_assets/theme-toggle.png
Binary files /dev/null and b/src/content/posts/_assets/theme-toggle.png differ
src/content/posts/_assets/toc.png
Binary files /dev/null and b/src/content/posts/_assets/toc.png differ
src/content/posts/_assets/tr-808.png
Binary files /dev/null and b/src/content/posts/_assets/tr-808.png differ
src/content/posts/privacy-policy.md new
+66
@@ -0,0 +1,66 @@
1 +---
2 +title: Privacy Policy
3 +pubDate: '2025-07-12'
4 +---
5 +
6 +# Kebijakan Privasi FatApp
7 +
8 +*Terakhir diperbarui: 12 Juli 2023*
9 +
10 +## Pendahuluan
11 +
12 +Selamat datang di FatApp Kami menghargai kepercayaan Anda dan berkomitmen untuk melindungi privasi Anda. Kebijakan Privasi ini menjelaskan bagaimana kami mengumpulkan, menggunakan, dan melindungi informasi yang Anda berikan saat menggunakan situs web kami.
13 +
14 +## Tidak Ada Pengumpulan Data
15 +
16 +FatApp tidak mengumpulkan, menyimpan, atau melacak data pengguna apa pun. Kami berkomitmen pada privasi pengguna, dan situs kami didesain untuk berfungsi tanpa perlu mengumpulkan informasi pribadi.
17 +
18 +Kami tidak menggunakan:
19 +- Cookies pelacakan
20 +- Analytics
21 +- Pengumpulan data pengguna
22 +- Sistem login yang memerlukan informasi pribadi
23 +- Teknologi pengumpulan data otomatis lainnya
24 +
25 +## Komitmen Kami Terhadap Privasi
26 +
27 +Kami berkomitmen untuk menyediakan layanan pembelajaran 4.5+ Star Restaurants tanpa mengumpulkan data pribadi pengguna. Ini berarti:
28 +- Anda dapat 4.5+ Star Restaurants tanpa khawatir tentang pelacakan atau pengumpulan data
29 +- Kami tidak menganalisis perilaku pengguna atau membuat profil penggunaan
30 +- Tidak ada data yang perlu kami lindungi karena kami tidak mengumpulkannya
31 +
32 +## Tidak Ada Cookies atau Teknologi Pelacakan
33 +
34 +FatApp tidak menggunakan cookies, pixel, atau teknologi pelacakan lainnya. Situs kami dirancang untuk memberikan pengalaman 4.5+ Star Restaurants tanpa menyimpan informasi pada perangkat Anda atau melacak aktivitas Anda.
35 +
36 +## Tidak Ada Berbagi Informasi
37 +
38 +Karena kami tidak mengumpulkan informasi pribadi, kami tidak memiliki data pengguna yang dapat dibagikan dengan pihak ketiga manapun.
39 +
40 +## Keamanan
41 +
42 +Meskipun kami tidak mengumpulkan data pengguna, kami tetap memperhatikan keamanan situs kami untuk memastikan pengalaman yang aman bagi semua pengunjung.
43 +
44 +## Hak Privasi Anda
45 +
46 +Karena kami tidak mengumpulkan data pribadi apa pun, Anda tidak perlu khawatir tentang pengelolaan atau penghapusan data Anda dari sistem kami. Privasi Anda terjamin sepenuhnya karena tidak ada data yang perlu diakses, dikoreksi, atau dihapus.
47 +
48 +## Situs yang Aman untuk Semua Usia
49 +
50 +Situs kami aman untuk pengunjung dari segala usia, termasuk anak-anak, karena kami tidak mengumpulkan informasi pribadi dari siapa pun. Konten kami berfokus pada pembelajaran 4.5+ Star Restaurants dan tersedia untuk semua orang tanpa perlu memberikan data apa pun.
51 +
52 +## Perubahan pada Kebijakan Privasi Ini
53 +
54 +Kami dapat memperbarui Kebijakan Privasi ini dari waktu ke waktu. Kami akan memberi tahu Anda tentang perubahan apa pun dengan memposting Kebijakan Privasi baru di halaman ini dan memperbarui tanggal "Terakhir diperbarui" di bagian atas.
55 +
56 +## Kontak Kami
57 +
58 +Jika Anda memiliki pertanyaan tentang Kebijakan Privasi ini atau praktik kami, silakan hubungi kami di:
59 +
60 +Email: [info@fatapp.5mb.com](mailto:info@fatapp.5mb.com)
61 +
62 +Situs web: [https://fatapp.5mb.com/](https://fatapp.5mb.com/)
63 +
64 +---
65 +
66 +*FatApp - 4.5+ Star Restaurants tanpa khawatir tentang privasi Anda.*
src/content/posts/terms-of-use.md new
+81
@@ -0,0 +1,81 @@
1 +---
2 +title: Terms of Use
3 +pubDate: '2025-07-12'
4 +---
5 +
6 +# Ketentuan Penggunaan FatApp
7 +
8 +*Terakhir diperbarui: 12 Juli 2023*
9 +
10 +## 1. Penerimaan Ketentuan
11 +
12 +Dengan mengakses dan menggunakan situs web FatApp ("Situs"), Anda menyetujui untuk terikat oleh Ketentuan Penggunaan ini. Jika Anda tidak menyetujui ketentuan ini, Anda tidak diperkenankan menggunakan Situs ini.
13 +
14 +## 2. Perubahan Ketentuan
15 +
16 +FatApp berhak untuk mengubah Ketentuan Penggunaan ini kapan saja. Perubahan akan segera berlaku setelah diposting di Situs. Penggunaan Situs secara berkelanjutan oleh Anda setelah perubahan tersebut merupakan persetujuan Anda terhadap perubahan tersebut.
17 +
18 +## 3. Penggunaan Situs
19 +
20 +### 3.1 Izin Penggunaan
21 +Anda diizinkan untuk mengakses dan menggunakan Situs ini hanya untuk tujuan pembelajaran 4.5+ Star Restaurants dan tujuan non-komersial lainnya yang sah.
22 +
23 +### 3.2 Larangan
24 +Anda dilarang untuk:
25 +- Menggunakan Situs dengan cara yang melanggar hukum atau peraturan yang berlaku
26 +- Menggunakan Situs untuk mengirim iklan atau materi promosi yang tidak diminta
27 +- Mengganggu keamanan atau fungsionalitas Situs
28 +- Mengumpulkan informasi pengguna tanpa izin
29 +- Menggunakan konten Situs untuk tujuan komersial tanpa izin tertulis dari FatApp
30 +
31 +## 4. Kekayaan Intelektual
32 +
33 +### 4.1 Hak Cipta
34 +Semua konten yang tersedia di Situs ini, termasuk tetapi tidak terbatas pada teks, grafik, logo, ikon, gambar, klip audio, unduhan digital, dan kompilasi data, adalah milik PepakBasaJawa atau pemberi lisensinya dan dilindungi oleh hukum hak cipta Indonesia dan internasional.
35 +
36 +### 4.2 Lisensi Penggunaan
37 +FatApp memberikan Anda lisensi terbatas, non-eksklusif, tidak dapat dialihkan, dan dapat dibatalkan untuk mengakses dan menggunakan konten Situs untuk tujuan pribadi dan non-komersial. Anda tidak boleh mereproduksi, mendistribusikan, memodifikasi, atau membuat karya turunan dari konten Situs tanpa izin tertulis dari FatApp.
38 +
39 +## 5. Tautan ke Situs Lain
40 +
41 +Situs ini mungkin berisi tautan ke situs web pihak ketiga. Tautan ini disediakan hanya untuk kenyamanan Anda. FatApp tidak mendukung atau bertanggung jawab atas konten, produk, layanan, atau kebijakan privasi situs web pihak ketiga tersebut.
42 +
43 +## 6. Penafian Jaminan
44 +
45 +### 6.1 Layanan "Sebagaimana Adanya"
46 +Situs ini disediakan dengan basis "sebagaimana adanya" dan "sebagaimana tersedia" tanpa jaminan apa pun, baik tersurat maupun tersirat.
47 +
48 +### 6.2 Tidak Ada Jaminan
49 +FatApp tidak menjamin bahwa Situs akan bebas dari kesalahan, tidak terganggu, bebas dari virus atau komponen berbahaya lainnya, atau bahwa kerusakan pada sistem komputer Anda tidak akan terjadi dari penggunaan Situs.
50 +
51 +## 7. Batasan Tanggung Jawab
52 +
53 +FatApp tidak bertanggung jawab atas kerugian langsung, tidak langsung, insidental, konsekuensial, atau khusus yang timbul dari atau terkait dengan penggunaan atau ketidakmampuan menggunakan Situs ini.
54 +
55 +## 8. Ganti Rugi
56 +
57 +Anda setuju untuk mengganti rugi dan membebaskan FatApp, afiliasinya, dan masing-masing direktur, petugas, karyawan, dan agennya dari dan terhadap klaim, tuntutan, kewajiban, kerusakan, kerugian, dan pengeluaran apa pun yang timbul dari penggunaan Situs oleh Anda atau pelanggaran Ketentuan Penggunaan ini.
58 +
59 +## 9. Hukum yang Berlaku
60 +
61 +Ketentuan Penggunaan ini diatur oleh dan ditafsirkan sesuai dengan hukum Republik Indonesia. Setiap sengketa yang timbul dari atau sehubungan dengan Ketentuan Penggunaan ini akan diselesaikan melalui musyawarah atau melalui forum hukum yang berwenang di Indonesia.
62 +
63 +## 10. Keterpisahan
64 +
65 +Jika ada ketentuan dalam Ketentuan Penggunaan ini yang dianggap tidak sah, tidak berlaku, atau tidak dapat dilaksanakan oleh pengadilan yang berwenang, ketentuan tersebut akan dipisahkan dan ketentuan lainnya akan tetap berlaku sepenuhnya.
66 +
67 +## 11. Penghentian
68 +
69 +FatApp berhak, atas kebijakannya sendiri, untuk menghentikan akses Anda ke Situs kapan saja dan untuk alasan apa pun tanpa pemberitahuan.
70 +
71 +## 12. Hubungi Kami
72 +
73 +Jika Anda memiliki pertanyaan tentang Ketentuan Penggunaan ini, silakan hubungi kami di:
74 +
75 +Email: [info@fatapp.5mb.com](mailto:info@fatapp.5mb.com)
76 +
77 +Situs web: [https://fatapp.5mb.com/](https://fatapp.5mb.com/)
78 +
79 +---
80 +
81 +*Dengan menggunakan FatApp, Anda mengakui bahwa Anda telah membaca, memahami, dan menyetujui Ketentuan Penggunaan ini.*
src/env.d.ts new
+12
@@ -0,0 +1,12 @@
1 +/// <reference types="astro/client" />
2 +/// <reference types="astro/content" />
3 +
4 +declare module 'astro:content' {
5 + interface Render {
6 + '.md': Promise<{
7 + Content: import('astro').MarkdownInstance<Record<string, unknown>>['Content']
8 + headings: import('astro').MarkdownHeading[]
9 + remarkPluginFrontmatter: Record<string, unknown>
10 + }>
11 + }
12 +}
src/layouts/BaseLayout.astro new
+74
@@ -0,0 +1,74 @@
1 +---
2 +import { SITE } from '@/config'
3 +import TransitionWrapper from '@/components/layout/TransitionWrapper.astro'
4 +import type { LayoutProps } from '@/types'
5 +
6 +type Props = LayoutProps
7 +
8 +const { type = 'page' } = Astro.props
9 +const contentWidth = SITE.contentWidth
10 +const widthValue = Math.min(parseFloat(contentWidth), 50)
11 +const shouldUseCustomWidth = widthValue > 25
12 +const finalWidth = shouldUseCustomWidth ? `${widthValue}rem` : '25rem'
13 +
14 +const language = SITE.language || 'en-US'
15 +---
16 +
17 +<html
18 + lang={language}
19 + class={SITE.fadeAnimation ? 'view-transitions-enabled' : 'view-transitions-disabled'}
20 + {...SITE.fadeAnimation ? { 'transition:animate': 'initial' } : {}}
21 +>
22 + <head>
23 + <slot name="head" />
24 + <script is:inline>
25 + // Initialize theme based on system preference
26 + function initTheme() {
27 + const htmlElement = document.documentElement
28 + const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches
29 +
30 + // Remove any existing theme classes
31 + htmlElement.classList.remove('light', 'dark')
32 +
33 + // Apply the appropriate theme class
34 + htmlElement.classList.add(isDark ? 'dark' : 'light')
35 + }
36 +
37 + // Run on initial load
38 + initTheme()
39 +
40 + // Listen for system theme changes
41 + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function (e) {
42 + const htmlElement = document.documentElement
43 + htmlElement.classList.remove('light', 'dark')
44 + htmlElement.classList.add(e.matches ? 'dark' : 'light')
45 + })
46 + </script>
47 + </head>
48 + <body
49 + data-centered={SITE.centeredLayout}
50 + class={!SITE.fadeAnimation ? 'no-fade' : ''}
51 + style={`
52 + max-width: ${finalWidth};
53 + ${shouldUseCustomWidth ? `--content-width: ${widthValue}rem;` : ''}
54 + `}
55 + >
56 + <TransitionWrapper type={type} class="layout-wrapper">
57 + <slot />
58 + </TransitionWrapper>
59 + </body>
60 +</html>
61 +
62 +<style is:global>
63 + .layout-wrapper {
64 + display: flex;
65 + flex-direction: column;
66 + min-height: calc(100vh - 7.5rem);
67 + }
68 +
69 + @media (max-width: 768px) {
70 + .layout-wrapper {
71 + min-height: calc(100vh - 5.5rem);
72 + }
73 + }
74 +</style>
src/layouts/IndexLayout.astro new
+43
@@ -0,0 +1,43 @@
1 +---
2 +import '@/styles/global.css'
3 +import BaseHead from '@/components/layout/BaseHead.astro'
4 +import Header from '@/components/layout/Header.astro'
5 +import Footer from '@/components/layout/Footer.astro'
6 +import BaseLayout from '@/layouts/BaseLayout.astro'
7 +import GradientMask from '@/components/ui/GradientMask.astro'
8 +import { SITE } from '@/config'
9 +
10 +const { title, description } = Astro.props
11 +---
12 +
13 +<BaseLayout title={title} description={description} type="page">
14 + <BaseHead title={title} description={description} slot="head" />
15 + <div class="page-content">
16 + <GradientMask />
17 + <div>
18 + <Header />
19 + </div>
20 + <main>
21 + <slot />
22 + </main>
23 + {
24 + SITE.footer && (
25 + <div>
26 + <Footer />
27 + </div>
28 + )
29 + }
30 + </div>
31 +</BaseLayout>
32 +
33 +<style is:global>
34 + .page-content {
35 + flex: 1;
36 + display: flex;
37 + flex-direction: column;
38 + }
39 +
40 + .page-content main {
41 + flex: 1;
42 + }
43 +</style>
src/layouts/PostLayout.astro new
+66
@@ -0,0 +1,66 @@
1 +---
2 +import '@/styles/global.css'
3 +import type { PostLayoutProps } from '@/types'
4 +import FormattedDate from '@/components/features/FormattedDate.astro'
5 +import FootnoteScroll from '@/components/features/FootnoteScroll.astro'
6 +import BaseHead from '@/components/layout/BaseHead.astro'
7 +import Footer from '@/components/layout/Footer.astro'
8 +import BackButton from '@/components/ui/BackButton.astro'
9 +import TableOfContents from '@/components/ui/TableOfContents.astro'
10 +import GradientMask from '@/components/ui/GradientMask.astro'
11 +import ImageViewer from '@/components/ui/ImageViewer.astro'
12 +import GitHubCard from '@/components/ui/GitHubCard.astro'
13 +import XPOST from '@/components/ui/XPOST.astro'
14 +import CopyCode from '@/components/ui/CopyCode.astro'
15 +import BaseLayout from '@/layouts/BaseLayout.astro'
16 +
17 +import { SITE } from '@/config'
18 +
19 +const { title, pubDate, readingTime, toc } = Astro.props as PostLayoutProps
20 +---
21 +
22 +<BaseLayout title={`${title} · ${SITE.title}`} description={SITE.description} type="post">
23 + <BaseHead title={`${title} · ${SITE.title}`} description={SITE.description} slot="head" />
24 + <div class="post-container">
25 + <main>
26 + <div class="prose">
27 + <GradientMask />
28 + <BackButton />
29 + {SITE.toc && <TableOfContents toc={toc} />}
30 + <div class="title">
31 + <h1>{title}</h1>
32 + <div class="date">
33 + <FormattedDate date={pubDate} />
34 + {
35 + SITE.readingTime && readingTime && (
36 + <span class="reading-time">
37 + <span class="separator">·</span>
38 + {readingTime.text}
39 + </span>
40 + )
41 + }
42 + </div>
43 + </div>
44 + <slot />
45 + </div>
46 + </main>
47 + <FootnoteScroll />
48 + <CopyCode />
49 + <GitHubCard />
50 + <XPOST />
51 + {SITE.imageViewer && <ImageViewer />}
52 + {SITE.footer && <Footer />}
53 + </div>
54 +</BaseLayout>
55 +
56 +<style>
57 + .post-container {
58 + display: flex;
59 + flex-direction: column;
60 + flex: 1;
61 + }
62 +
63 + .post-container main {
64 + flex: 1;
65 + }
66 +</style>
src/pages/404.astro new
+13
@@ -0,0 +1,13 @@
1 +---
2 +import IndexLayout from '@/layouts/IndexLayout.astro'
3 +import { SITE } from '@/config'
4 +---
5 +
6 +<IndexLayout title={`404 - ${SITE.title}`} description="Not Found">
7 + <style>
8 + .error-container {
9 + color: var(--text-secondary);
10 + }
11 + </style>
12 + <p class="error-container">Page Not Found...</p>
13 +</IndexLayout>
src/pages/[...slug].astro new
+26
@@ -0,0 +1,26 @@
1 +---
2 +import { type CollectionEntry, getCollection } from 'astro:content'
3 +import PostLayout from '@/layouts/PostLayout.astro'
4 +import { render } from 'astro:content'
5 +
6 +export async function getStaticPaths() {
7 + const posts = await getCollection('posts')
8 + return posts
9 + .filter((post) => !post.id.startsWith('_'))
10 + .map((post) => ({
11 + params: { slug: post.id },
12 + props: post
13 + }))
14 +}
15 +type Props = CollectionEntry<'posts'>
16 +
17 +const post = Astro.props
18 +const { Content, remarkPluginFrontmatter } = await render(post)
19 +
20 +const readingTime = remarkPluginFrontmatter.readingTime
21 +const toc = remarkPluginFrontmatter.toc || []
22 +---
23 +
24 +<PostLayout {...post.data} readingTime={readingTime} toc={toc}>
25 + <Content />
26 +</PostLayout>
src/pages/atom.xml.ts new
+6
@@ -0,0 +1,6 @@
1 +import type { APIContext } from 'astro'
2 +import { generateAtom } from '@/utils/feed'
3 +
4 +export async function GET(context: APIContext) {
5 + return generateAtom(context)
6 +}
src/pages/contact.astro new
+93
@@ -0,0 +1,93 @@
1 +---
2 +import IndexLayout from '@/layouts/IndexLayout.astro'
3 +import { SITE } from '@/config'
4 +---
5 +
6 +<IndexLayout title={`Contact - ${SITE.title}`} description="Get in touch with FatApp">
7 + <div class="contact-page prose">
8 + <h1>Contact Us</h1>
9 +
10 + <p>
11 + Have questions about learning Javanese language? Want to contribute to our content? We'd love
12 + to hear from you!
13 + </p>
14 +
15 + <div class="contact-info">
16 + <h2>Get in Touch</h2>
17 + <p>Feel free to reach out to us via email:</p>
18 +
19 + <div class="email-section">
20 + <a href="mailto:splitfire@setoelkahfi.se" class="email-link"> splitfire@setoelkahfi.se </a>
21 + </div>
22 +
23 + <p>We'll do our best to respond to your inquiry as soon as possible.</p>
24 + </div>
25 +
26 + <div class="topics">
27 + <h2>What can you contact us about?</h2>
28 + <ul>
29 + <li>Questions about Javanese language learning materials</li>
30 + <li>Suggestions for new content or improvements</li>
31 + <li>Technical issues with the website</li>
32 + <li>Collaboration opportunities</li>
33 + <li>General feedback about FatApp</li>
34 + </ul>
35 + </div>
36 + </div>
37 +</IndexLayout>
38 +
39 +<style>
40 + .contact-page {
41 + max-width: 100%;
42 + margin: 0 auto;
43 + padding: 2rem 0;
44 + }
45 +
46 + .contact-info {
47 + margin: 2rem 0;
48 + }
49 +
50 + .email-section {
51 + margin: 1.5rem 0;
52 + padding: 1rem;
53 + background: var(--code-bg);
54 + border-radius: 8px;
55 + border-left: 4px solid var(--accent);
56 + }
57 +
58 + .email-link {
59 + font-size: 1.25rem;
60 + font-weight: 600;
61 + color: var(--accent);
62 + text-decoration: none;
63 + word-break: break-all;
64 + }
65 +
66 + .email-link:hover {
67 + text-decoration: underline;
68 + }
69 +
70 + .topics {
71 + margin: 2rem 0;
72 + }
73 +
74 + .topics ul {
75 + list-style-type: disc;
76 + margin-left: 1.5rem;
77 + }
78 +
79 + .topics li {
80 + margin: 0.5rem 0;
81 + line-height: 1.6;
82 + }
83 +
84 + @media (max-width: 768px) {
85 + .contact-page {
86 + padding: 1rem 0;
87 + }
88 +
89 + .email-link {
90 + font-size: 1.1rem;
91 + }
92 + }
93 +</style>
src/pages/index.astro new
+16
@@ -0,0 +1,16 @@
1 +---
2 +import IndexLayout from '@/layouts/IndexLayout.astro'
3 +import About from '@/components/pages/About.astro'
4 +import PostList from '@/components/features/PostList.astro'
5 +import { SITE } from '@/config'
6 +import { getSortedFilteredPosts } from '@/utils/draft'
7 +
8 +const posts = await getSortedFilteredPosts()
9 +---
10 +
11 +<IndexLayout title={SITE.title} description={SITE.description}>
12 + <About />
13 + <main>
14 + <PostList posts={posts} />
15 + </main>
16 +</IndexLayout>
src/pages/rss.xml.ts new
+6
@@ -0,0 +1,6 @@
1 +import type { APIContext } from 'astro'
2 +import { generateRSS } from '@/utils/feed'
3 +
4 +export async function GET(context: APIContext) {
5 + return generateRSS(context)
6 +}
src/plugins/rehype-cleanup.mjs new
+35
@@ -0,0 +1,35 @@
1 +import { visit } from 'unist-util-visit'
2 +
3 +/**
4 + * Rehype plugin to cleanup and extract raw figure elements from paragraph nodes
5 + */
6 +export default function rehypeCleanup() {
7 + return (tree) => {
8 + visit(tree, 'element', (node, index, parent) => {
9 + if (node.tagName !== 'p') {
10 + return
11 + }
12 + if (!node.children?.length) {
13 + return
14 + }
15 + if (!parent) {
16 + return
17 + }
18 +
19 + const rawFigureNodes = []
20 +
21 + for (const child of node.children) {
22 + if (child.type === 'raw' && child.value && child.value.trim().startsWith('<figure')) {
23 + rawFigureNodes.push(child)
24 + } else if (child.type !== 'text' || child.value.trim() !== '') {
25 + return
26 + }
27 + }
28 +
29 + if (rawFigureNodes.length > 0) {
30 + parent.children.splice(index, 1, ...rawFigureNodes)
31 + return index
32 + }
33 + })
34 + }
35 +}
src/plugins/rehype-copy-code.mjs new
+38
@@ -0,0 +1,38 @@
1 +import { visit } from 'unist-util-visit'
2 +
3 +/**
4 + * Rehype plugin that adds copy button to code blocks for easy code copying functionality
5 + */
6 +export default function rehypeCopyCode() {
7 + return (tree) => {
8 + visit(tree, 'element', (node) => {
9 + if (node.tagName === 'pre') {
10 + if (!node.children || node.children.length === 0) {
11 + return
12 + }
13 +
14 + const codeElement = node.children.find((child) => child.tagName === 'code')
15 + if (!codeElement) {
16 + return
17 + }
18 +
19 + node.properties = node.properties || {}
20 + node.properties.className = node.properties.className || []
21 + node.properties.className.push('copy-code-block')
22 +
23 + const copyButton = {
24 + type: 'element',
25 + tagName: 'button',
26 + properties: {
27 + className: ['copy-button'],
28 + type: 'button',
29 + 'aria-label': 'Copy code'
30 + },
31 + children: []
32 + }
33 +
34 + node.children.unshift(copyButton)
35 + }
36 + })
37 + }
38 +}
src/plugins/rehype-image-processor.mjs new
+83
@@ -0,0 +1,83 @@
1 +import { visit } from 'unist-util-visit'
2 +import { SITE } from '../config.ts'
3 +
4 +/**
5 + * Rehype plugin that processes images in markdown content:
6 + * - Wraps images with alt text in figure/figcaption elements
7 + * - Adds data-preview attribute for image viewer functionality
8 + * - Handles multiple images in a single paragraph
9 + */
10 +export default function rehypeImageProcessor() {
11 + return (tree) => {
12 + visit(tree, 'element', (node, index, parent) => {
13 + if (node.tagName !== 'p') {
14 + return
15 + }
16 + if (!parent || typeof index !== 'number') {
17 + return
18 + }
19 +
20 + const imgNodes = []
21 + let hasNonImageContent = false
22 +
23 + for (const child of node.children) {
24 + if (child.type === 'element' && child.tagName === 'img') {
25 + imgNodes.push(child)
26 + } else if (child.type !== 'text' || child.value.trim() !== '') {
27 + hasNonImageContent = true
28 + }
29 + }
30 +
31 + if (hasNonImageContent || imgNodes.length === 0) {
32 + return
33 + }
34 +
35 + const newNodes = []
36 +
37 + for (const imgNode of imgNodes) {
38 + const alt = imgNode.properties?.alt?.trim()
39 +
40 + imgNode.properties = {
41 + ...imgNode.properties,
42 + 'data-preview': SITE.imageViewer ? 'true' : 'false'
43 + }
44 +
45 + if (!alt || alt.includes('_')) {
46 + newNodes.push(imgNode)
47 + continue
48 + }
49 +
50 + const figure = {
51 + type: 'element',
52 + tagName: 'figure',
53 + properties: {
54 + className: ['image-caption-wrapper']
55 + },
56 + children: [
57 + imgNode,
58 + {
59 + type: 'element',
60 + tagName: 'figcaption',
61 + properties: {
62 + className: ['img-caption']
63 + },
64 + children: [
65 + {
66 + type: 'text',
67 + value: alt
68 + }
69 + ]
70 + }
71 + ]
72 + }
73 +
74 + newNodes.push(figure)
75 + }
76 +
77 + if (newNodes.length > 0) {
78 + parent.children.splice(index, 1, ...newNodes)
79 + return index + newNodes.length - 1
80 + }
81 + })
82 + }
83 +}
src/plugins/remark-embedded-media.mjs new
+187
@@ -0,0 +1,187 @@
1 +import { visit } from 'unist-util-visit'
2 +
3 +/**
4 + * A remark plugin that converts custom directives to embedded media HTML elements
5 + */
6 +const embedHandlers = {
7 + // Spotify
8 + spotify: (node) => {
9 + const url = node.attributes?.url ?? ''
10 + if (!url) {
11 + return false
12 + }
13 + if (!/^https:\/\/open\.spotify\.com\//.test(url)) {
14 + return false
15 + }
16 + let embedUrl = url.replace('open.spotify.com/', 'open.spotify.com/embed/')
17 + if (!embedUrl.includes('utm_source=')) {
18 + embedUrl += (embedUrl.includes('?') ? '&' : '?') + 'utm_source=generator'
19 + }
20 +
21 + let height = '152'
22 + if (
23 + url.includes('/album/') ||
24 + url.includes('/playlist/') ||
25 + url.includes('/artist/') ||
26 + url.includes('/show/')
27 + ) {
28 + height = '352'
29 + }
30 +
31 + return `
32 + <figure>
33 + <iframe
34 + style="border-radius:12px"
35 + src="${embedUrl}"
36 + width="100%"
37 + height="${height}"
38 + frameBorder="0"
39 + allowfullscreen=""
40 + allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture"
41 + loading="lazy"
42 + ></iframe>
43 + </figure>
44 + `
45 + },
46 +
47 + // Youtube
48 + youtube: (node) => {
49 + let videoId = node.attributes?.id ?? ''
50 + const url = node.attributes?.url ?? ''
51 +
52 + if (!videoId && url) {
53 + const match = url.match(/(?:v=|\/embed\/|youtu\.be\/)([\w-]{11})/)
54 + if (match) videoId = match[1]
55 + }
56 +
57 + if (!videoId) {
58 + return false
59 + }
60 +
61 + return `
62 + <figure>
63 + <iframe
64 + src="https://www.youtube.com/embed/${videoId}"
65 + title="YouTube video player"
66 + loading="lazy"
67 + frameborder="0"
68 + allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
69 + allowfullscreen
70 + ></iframe>
71 + </figure>
72 + `
73 + },
74 +
75 + // Bilibili
76 + bilibili: (node) => {
77 + let bvid = node.attributes?.id ?? ''
78 + const url = node.attributes?.url ?? ''
79 + if (!bvid && url) {
80 + const match = url.match(/\/BV([\w]+)/)
81 + if (match) bvid = 'BV' + match[1]
82 + }
83 + if (!bvid) {
84 + return false
85 + }
86 +
87 + return `
88 + <figure>
89 + <iframe
90 + src="//player.bilibili.com/player.html?isOutside=true&bvid=${bvid}&p=1&autoplay=0&muted=0"
91 + title="Bilibili video player"
92 + loading="lazy"
93 + scrolling="no"
94 + border="0"
95 + frameborder="no"
96 + framespacing="0"
97 + allowfullscreen="true"
98 + ></iframe>
99 + </figure>
100 + `
101 + },
102 +
103 + // X Post Card
104 + x: (node) => {
105 + const xUrl = node.attributes?.url ?? ''
106 + if (!xUrl) {
107 + return false
108 + }
109 +
110 + const twitterUrl = xUrl.replace(/(\w+:\/\/)?x\.com\//g, '$1twitter.com/')
111 + const uniqueId = `x-card-${Math.random().toString(36).slice(2, 11)}`
112 +
113 + return `
114 + <figure class="x-card">
115 + <blockquote class="twitter-tweet" data-dnt="true" id="${uniqueId}">
116 + <a href="${twitterUrl}"></a>
117 + </blockquote>
118 + </figure>
119 + `
120 + },
121 +
122 + // Github Repository Card
123 + github: (node) => {
124 + const repo = node.attributes?.repo ?? ''
125 + if (!repo) {
126 + console.warn(`Missing GitHub repository`)
127 + return false
128 + }
129 +
130 + const [owner, name] = repo.split('/')
131 + if (!owner || !name) {
132 + console.warn(`Invalid GitHub repository format: "${repo}"`)
133 + return false
134 + }
135 +
136 + return `
137 + <a href="https://github.com/${repo}" class="gc-container" target="_blank" rel="noopener noreferrer" data-repo="${repo}">
138 + <div class="gc-title-bar">
139 + <div class="gc-owner-avatar" style="background-size: cover; background-position: center;" aria-hidden="true"></div>
140 + <span class="gc-repo-title">
141 + <span>${owner}<span class="gc-slash" aria-hidden="true">/</span><strong>${name}</strong></span>
142 + </span>
143 + <svg class="gc-github-icon" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
144 + <path d="M12 1C5.9225 1 1 5.9225 1 12C1 16.8675 4.14875 20.9787 8.52125 22.4362C9.07125 22.5325 9.2775 22.2025 9.2775 21.9137C9.2775 21.6525 9.26375 20.7862 9.26375 19.865C6.5 20.3737 5.785 19.1912 5.565 18.5725C5.44125 18.2562 4.905 17.28 4.4375 17.0187C4.0525 16.8125 3.5025 16.3037 4.42375 16.29C5.29 16.2762 5.90875 17.0875 6.115 17.4175C7.105 19.0812 8.68625 18.6137 9.31875 18.325C9.415 17.61 9.70375 17.1287 10.02 16.8537C7.5725 16.5787 5.015 15.63 5.015 11.4225C5.015 10.2262 5.44125 9.23625 6.1425 8.46625C6.0325 8.19125 5.6475 7.06375 6.2525 5.55125C6.2525 5.55125 7.17375 5.2625 9.2775 6.67875C10.1575 6.43125 11.0925 6.3075 12.0275 6.3075C12.9625 6.3075 13.8975 6.43125 14.7775 6.67875C16.8813 5.24875 17.8025 5.55125 17.8025 5.55125C18.4075 7.06375 18.0225 8.19125 17.9125 8.46625C18.6138 9.23625 19.04 10.2125 19.04 11.4225C19.04 15.6437 16.4688 16.5787 14.0213 16.8537C14.42 17.1975 14.7638 17.8575 14.7638 18.8887C14.7638 20.36 14.75 21.5425 14.75 21.9137C14.75 22.2025 14.9563 22.5462 15.5063 22.4362C19.8513 20.9787 23 16.8537 23 12C23 5.9225 18.0775 1 12 1Z"></path>
145 + </svg>
146 + </div>
147 + <p class="gc-repo-description">Loading repository data...</p>
148 + <div class="gc-info-bar">
149 + <svg class="gc-info-icon" height="16" width="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true">
150 + <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path>
151 + </svg>
152 + <span class="gc-stars-count" aria-label="Stars count">--</span>
153 + <svg class="gc-info-icon" height="16" width="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true">
154 + <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path>
155 + </svg>
156 + <span class="gc-forks-count" aria-label="Forks count">--</span>
157 + <svg class="gc-info-icon" height="16" width="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true">
158 + <path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path>
159 + </svg>
160 + <span class="gc-license-info" aria-label="License">--</span>
161 + </div>
162 + </a>
163 + `
164 + }
165 +}
166 +
167 +export default function remarkEmbeddedMedia() {
168 + return (tree) => {
169 + visit(tree, ['leafDirective', 'containerDirective', 'textDirective'], (node) => {
170 + const handler = embedHandlers[node.name]
171 + if (!handler) {
172 + return
173 + }
174 +
175 + const htmlContent = handler(node)
176 + if (!htmlContent) {
177 + return
178 + }
179 +
180 + node.type = 'html'
181 + node.value = htmlContent
182 + delete node.name
183 + delete node.attributes
184 + delete node.children
185 + })
186 + }
187 +}
src/plugins/remark-reading-time.mjs new
+21
@@ -0,0 +1,21 @@
1 +import { toString } from 'mdast-util-to-string'
2 +import getReadingTime from 'reading-time'
3 +
4 +/**
5 + * Remark plugin to calculate and add reading time information to markdown frontmatter
6 + */
7 +export default function remarkReadingTime() {
8 + return function (tree, file) {
9 + const textOnPage = toString(tree)
10 + const readingTime = getReadingTime(textOnPage)
11 +
12 + const minutes = Math.max(1, Math.round(readingTime.minutes))
13 + file.data.astro.frontmatter.minutesRead = `${minutes}min`
14 + file.data.astro.frontmatter.readingTime = {
15 + text: `${minutes}min`,
16 + minutes: minutes,
17 + time: readingTime.time,
18 + words: readingTime.words
19 + }
20 + }
21 +}
src/plugins/remark-toc.mjs new
+89
@@ -0,0 +1,89 @@
1 +import { visit } from 'unist-util-visit'
2 +
3 +export default function remarkTOC() {
4 + return function (tree, file) {
5 + const headings = []
6 + let headingIndex = 0
7 + const usedSlugs = new Set()
8 +
9 + // Extract headings from AST
10 + visit(tree, 'heading', (node) => {
11 + const level = node.depth
12 +
13 + // Only process h1, h2, h3
14 + if (level > 3) return
15 +
16 + // Skip the first h1
17 + if (level === 1 && headingIndex === 0) {
18 + headingIndex++
19 + return
20 + }
21 +
22 + const text = extractTextContent(node)
23 + if (!text) return
24 +
25 + // Generate unique slug from text
26 + const slug = generateUniqueSlug(text, usedSlugs)
27 + const id = slug
28 +
29 + if (!node.data) node.data = {}
30 + if (!node.data.hProperties) node.data.hProperties = {}
31 + node.data.hProperties.id = id
32 +
33 + headings.push({
34 + level,
35 + text,
36 + id,
37 + index: headingIndex
38 + })
39 +
40 + headingIndex++
41 + })
42 +
43 + // Store TOC data in file.data.astro.frontmatter
44 + if (!file.data.astro) file.data.astro = {}
45 + if (!file.data.astro.frontmatter) file.data.astro.frontmatter = {}
46 + file.data.astro.frontmatter.toc = headings
47 + }
48 +}
49 +
50 +function extractTextContent(node) {
51 + let text = ''
52 +
53 + visit(node, 'text', (textNode) => {
54 + text += textNode.value
55 + })
56 +
57 + return text.trim()
58 +}
59 +
60 +// Generate a slug from text
61 +function generateSlug(text) {
62 + return (
63 + text
64 + .toLowerCase()
65 + // Keep Chinese characters, English letters, numbers, spaces and hyphens
66 + .replace(/[^\u4e00-\u9fa5a-z0-9\s-]/g, '')
67 + // Replace spaces with hyphens
68 + .replace(/\s+/g, '-')
69 + // Replace multiple hyphens with single hyphen
70 + .replace(/-+/g, '-')
71 + // Remove leading and trailing hyphens
72 + .replace(/^-|-$/g, '')
73 + )
74 +}
75 +
76 +// Generate a unique slug from text
77 +function generateUniqueSlug(text, usedSlugs) {
78 + let slug = generateSlug(text)
79 + let counter = 1
80 + let uniqueSlug = slug
81 +
82 + while (usedSlugs.has(uniqueSlug)) {
83 + uniqueSlug = `${slug}-${counter}`
84 + counter++
85 + }
86 +
87 + usedSlugs.add(uniqueSlug)
88 + return uniqueSlug
89 +}
src/styles/fonts.css new
+21
@@ -0,0 +1,21 @@
1 +@font-face {
2 + font-family: 'Inter';
3 + font-style: normal;
4 + font-weight: 100 900;
5 + font-display: swap;
6 + src: url('/fonts/Inter.woff2') format('woff2');
7 + unicode-range:
8 + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074,
9 + U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
10 +}
11 +
12 +@font-face {
13 + font-family: 'Besley';
14 + font-style: italic;
15 + font-weight: 400;
16 + font-display: swap;
17 + src: url('/fonts/Besley-Italic.woff2') format('woff2');
18 + unicode-range:
19 + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074,
20 + U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
21 +}
src/styles/global.css new
+220
@@ -0,0 +1,220 @@
1 +@import 'tailwindcss';
2 +@import './fonts.css';
3 +@import './post.css';
4 +
5 +:root {
6 + /* Min Content Width */
7 + --content-width: 25rem;
8 +
9 + /* Typography */
10 + --font-sans:
11 + Inter, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell,
12 + Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
13 + --font-serif: Besley, Baskerville, Georgia, Cambria, 'Times New Roman', Times, serif;
14 + --font-mono: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
15 +
16 + --font-size-s: 0.8125rem;
17 + --font-size-m: 0.9375rem;
18 + --font-size-l: 1.0625rem;
19 +
20 + --font-weight-light: 350;
21 + --font-weight-regular: 400;
22 + --font-weight-bold: 500;
23 +
24 + --spacing-s: -0.08em;
25 + --spacing-m: -0.02em;
26 +
27 + /* Light Mode Colors (Default) */
28 + --bg: #ffffff;
29 + --text-primary: rgba(0, 0, 0, 0.85);
30 + --text-secondary: rgba(0, 0, 0, 0.4);
31 + --text-tertiary: rgba(0, 0, 0, 0.24);
32 + --border: rgba(0, 0, 0, 0.1);
33 + --accent: #c5d932;
34 + --selection: rgba(197, 217, 50, 0.2);
35 + --code-bg: rgba(0, 0, 0, 0.06);
36 + --mark: rgba(197, 217, 50, 0.3);
37 +
38 + /* Syntax Theme */
39 + --astro-code-foreground: rgba(0, 0, 0, 0.85);
40 + --astro-code-background: rgba(0, 0, 0, 0.03);
41 + --astro-code-token-constant: rgba(0, 0, 0, 0.85);
42 + --astro-code-token-string: rgba(0, 0, 0, 0.85);
43 + --astro-code-token-comment: rgba(0, 0, 0, 0.35);
44 + --astro-code-token-keyword: rgba(0, 0, 0, 0.55);
45 + --astro-code-token-parameter: rgba(0, 0, 0, 0.85);
46 + --astro-code-token-function: rgba(0, 0, 0, 0.85);
47 + --astro-code-token-string-expression: rgba(0, 0, 0, 0.55);
48 + --astro-code-token-punctuation: rgba(0, 0, 0, 0.55);
49 + --astro-code-token-link: rgba(0, 0, 0, 0.55);
50 +}
51 +
52 +/* Light Mode (Explicit) */
53 +html.light {
54 + --bg: #ffffff;
55 + --text-primary: rgba(0, 0, 0, 0.85);
56 + --text-secondary: rgba(0, 0, 0, 0.4);
57 + --text-tertiary: rgba(0, 0, 0, 0.24);
58 + --border: rgba(0, 0, 0, 0.1);
59 + --accent: #c5d932;
60 + --selection: rgba(197, 217, 50, 0.2);
61 + --code-bg: rgba(0, 0, 0, 0.06);
62 + --mark: rgba(197, 217, 50, 0.3);
63 +
64 + /* Syntax Theme */
65 + --astro-code-foreground: rgba(0, 0, 0, 0.85);
66 + --astro-code-background: rgba(0, 0, 0, 0.03);
67 + --astro-code-token-constant: rgba(0, 0, 0, 0.85);
68 + --astro-code-token-string: rgba(0, 0, 0, 0.85);
69 + --astro-code-token-comment: rgba(0, 0, 0, 0.35);
70 + --astro-code-token-keyword: rgba(0, 0, 0, 0.5);
71 + --astro-code-token-parameter: rgba(0, 0, 0, 0.85);
72 + --astro-code-token-function: rgba(0, 0, 0, 0.85);
73 + --astro-code-token-string-expression: rgba(0, 0, 0, 0.55);
74 + --astro-code-token-punctuation: rgba(0, 0, 0, 0.55);
75 + --astro-code-token-link: rgba(0, 0, 0, 0.55);
76 +}
77 +
78 +/* Dark Mode (Explicit) */
79 +html.dark {
80 + --bg: #060d0c;
81 + --text-primary: rgba(255, 255, 255, 0.9);
82 + --text-secondary: rgba(255, 255, 255, 0.4);
83 + --text-tertiary: rgba(255, 255, 255, 0.24);
84 + --border: rgba(255, 255, 255, 0.1);
85 + --accent: #c5d932;
86 + --selection: rgba(197, 217, 50, 0.15);
87 + --code-bg: rgba(255, 255, 255, 0.06);
88 + --mark: rgba(197, 217, 50, 0.2);
89 +
90 + /* Syntax Theme */
91 + --astro-code-foreground: rgba(255, 255, 255, 0.9);
92 + --astro-code-background: rgba(255, 255, 255, 0.03);
93 + --astro-code-token-constant: rgba(255, 255, 255, 0.9);
94 + --astro-code-token-string: rgba(255, 255, 255, 0.9);
95 + --astro-code-token-comment: rgba(255, 255, 255, 0.35);
96 + --astro-code-token-keyword: rgba(255, 255, 255, 0.55);
97 + --astro-code-token-parameter: rgba(255, 255, 255, 0.9);
98 + --astro-code-token-function: rgba(255, 255, 255, 0.9);
99 + --astro-code-token-string-expression: rgba(255, 255, 255, 0.55);
100 + --astro-code-token-punctuation: rgba(255, 255, 255, 0.55);
101 + --astro-code-token-link: rgba(255, 255, 255, 0.55);
102 +}
103 +
104 +body {
105 + background-color: var(--bg);
106 + font-family: var(--font-sans);
107 + font-size: var(--font-size-m);
108 + line-height: 1.75;
109 + color: var(--text-primary);
110 + font-display: swap;
111 + word-wrap: break-word;
112 + overflow-wrap: break-word;
113 + margin: 0;
114 + min-height: 100vh;
115 + display: flex;
116 + flex-direction: column;
117 + box-sizing: border-box;
118 + letter-spacing: var(--spacing-m);
119 + padding: 6rem 1.5rem 1.5rem 1.5rem;
120 + overscroll-behavior-y: contain;
121 + transition: background-color 0.2s ease-out;
122 +}
123 +
124 +@media (max-width: 768px) {
125 + body {
126 + padding: 4rem 1.25rem 1.25rem 1.25rem;
127 + }
128 +}
129 +
130 +html {
131 + overscroll-behavior-y: contain;
132 + -webkit-overflow-scrolling: touch;
133 + scroll-behavior: smooth;
134 +}
135 +
136 +html.view-transitions-enabled {
137 + view-transition-name: enabled;
138 +}
139 +
140 +@view-transition {
141 + navigation: auto;
142 +}
143 +
144 +html.view-transitions-disabled {
145 + view-transition-name: none;
146 +}
147 +
148 +@media (prefers-reduced-motion: reduce) {
149 + @view-transition {
150 + navigation: none;
151 + }
152 +}
153 +
154 +::selection {
155 + background-color: var(--selection);
156 +}
157 +
158 +:focus {
159 + outline: 2px solid var(--accent);
160 + outline-offset: 2px;
161 +}
162 +
163 +:focus:not(:focus-visible) {
164 + outline: none;
165 +}
166 +
167 +:focus-visible {
168 + outline: 2px solid var(--accent);
169 + outline-offset: 2px;
170 +}
171 +
172 +body[data-width] {
173 + max-width: var(--content-width);
174 +}
175 +
176 +body[data-centered='true'] {
177 + margin: 0 auto;
178 +}
179 +
180 +main {
181 + flex: 1;
182 + display: flex;
183 + flex-direction: column;
184 + box-sizing: border-box;
185 +}
186 +
187 +.date {
188 + margin: 0;
189 + font-weight: var(--font-weight-light);
190 + color: var(--text-secondary);
191 + flex-shrink: 0;
192 + letter-spacing: var(--spacing-s);
193 + font-variant-numeric: tabular-nums;
194 + font-feature-settings:
195 + 'tnum' 1,
196 + 'zero' 0,
197 + 'cv01' 1,
198 + 'cv02' 1,
199 + 'calt' 1,
200 + 'ss03' 1,
201 + 'ordn' 1;
202 +}
203 +
204 +.date .month {
205 + letter-spacing: var(--spacing-m);
206 +}
207 +
208 +.sr-only {
209 + border: 0;
210 + padding: 0;
211 + margin: 0;
212 + position: absolute !important;
213 + height: 1px;
214 + width: 1px;
215 + overflow: hidden;
216 + clip: rect(1px 1px 1px 1px);
217 + clip: rect(1px, 1px, 1px, 1px);
218 + clip-path: inset(50%);
219 + white-space: nowrap;
220 +}
src/styles/post.css new
+532
@@ -0,0 +1,532 @@
1 +/* Base styles for all elements */
2 +.prose * {
3 + margin: 0;
4 + padding: 0;
5 + font-size: var(--font-size-m);
6 +}
7 +
8 +/* Main content container */
9 +.prose {
10 + margin-bottom: 8rem;
11 +}
12 +
13 +/* Post title section */
14 +.prose .title {
15 + margin-bottom: 2.5em;
16 +}
17 +
18 +.prose .title h1 {
19 + margin: 0 0 0.25rem 0;
20 +}
21 +
22 +/* Headings (h1-h5) */
23 +.prose h1,
24 +.prose h2,
25 +.prose h3,
26 +.prose h4,
27 +.prose h5 {
28 + font-size: var(--font-size-m);
29 + font-weight: var(--font-weight-bold);
30 + line-height: 1.75;
31 + margin: 3.25em 0 1em 0;
32 +}
33 +
34 +/* Bold text */
35 +.prose strong,
36 +.prose b {
37 + font-weight: var(--font-weight-bold);
38 +}
39 +
40 +/* Italic text */
41 +.prose em {
42 + font-family: var(--font-serif);
43 + font-style: italic;
44 + letter-spacing: 0;
45 +}
46 +
47 +/* Links */
48 +.prose a {
49 + color: var(--accent);
50 + text-decoration: underline;
51 + text-decoration-color: var(--text-tertiary);
52 + transition: text-decoration-color 0.2s ease-out;
53 +}
54 +
55 +.prose a:hover {
56 + color: var(--accent);
57 + text-decoration-color: var(--accent);
58 +}
59 +
60 +/* Paragraphs */
61 +.prose p {
62 + line-height: 1.75;
63 + margin-bottom: 1.25em;
64 +}
65 +
66 +/* Tables */
67 +.prose table {
68 + table-layout: fixed;
69 + width: 100%;
70 + border-collapse: separate;
71 + border-spacing: 0;
72 + margin: 1.25em 0;
73 + font-size: var(--font-size-m);
74 + border: 1px solid var(--border);
75 + border-radius: 8px;
76 + overflow: hidden;
77 +}
78 +
79 +/* Table cells */
80 +.prose th,
81 +.prose td {
82 + border: none;
83 + border-right: 1px solid var(--border);
84 + border-bottom: 1px solid var(--border);
85 + padding: 0.5em 1em;
86 + text-align: left;
87 +}
88 +
89 +.prose th:last-child,
90 +.prose td:last-child {
91 + border-right: none;
92 +}
93 +
94 +.prose tr:last-child td {
95 + border-bottom: none;
96 +}
97 +
98 +.prose th {
99 + background: var(--astro-code-background);
100 + font-weight: var(--font-weight-bold);
101 +}
102 +
103 +/* Images */
104 +.prose img {
105 + max-width: 100%;
106 + height: auto;
107 + display: block;
108 + margin: 1.25em 0;
109 +}
110 +
111 +.prose figure {
112 + margin-bottom: 1.25em;
113 + text-align: center;
114 +}
115 +
116 +.prose figure img {
117 + margin-bottom: 0.75em;
118 +}
119 +
120 +.prose figure figcaption {
121 + color: var(--text-secondary);
122 + font-size: var(--font-size-s);
123 + text-align: center;
124 +}
125 +
126 +.prose p > img {
127 + position: relative;
128 + margin-bottom: 1.25em;
129 +}
130 +
131 +.prose p > img::after {
132 + content: attr(alt);
133 + display: block;
134 + position: absolute;
135 + left: 0;
136 + width: 100%;
137 + text-align: center;
138 + color: var(--text-secondary);
139 + font-size: var(--font-size-s);
140 + margin-top: 0.75em;
141 +}
142 +
143 +.prose .img-caption {
144 + display: block;
145 + text-align: center;
146 + color: var(--text-secondary);
147 + font-size: var(--font-size-s);
148 + margin-bottom: 1.25em;
149 +}
150 +
151 +/* Inline code */
152 +.prose code {
153 + padding: 3px 4px;
154 + border-radius: 5px;
155 + background-color: var(--code-bg);
156 + font-family: var(--font-mono);
157 + font-size: 0.9em;
158 + font-feature-settings:
159 + 'liga' 0,
160 + 'calt' 0;
161 + -webkit-font-feature-settings:
162 + 'liga' 0,
163 + 'calt' 0;
164 +}
165 +
166 +/* Blockquotes */
167 +.prose blockquote {
168 + border-left: 1.5px solid var(--border);
169 + margin: 0 0 1.25em 0;
170 + padding: 0 0 0 1.25em;
171 + text-align: left;
172 +}
173 +
174 +.prose blockquote p {
175 + margin: 0;
176 +}
177 +
178 +.prose blockquote cite {
179 + display: inline-block;
180 + margin-top: 0.5em;
181 +}
182 +
183 +/* Unordered lists */
184 +.prose ul {
185 + list-style-type: none;
186 + padding-left: 0;
187 + margin-left: 1rem;
188 + margin-bottom: 1.25em;
189 + line-height: 1.75;
190 +}
191 +
192 +.prose ul ul {
193 + margin-left: 0.75rem;
194 + margin-top: 0.5em;
195 + margin-bottom: 0.5em;
196 +}
197 +
198 +.prose ul li {
199 + position: relative;
200 + padding-left: 0.25rem;
201 + margin-bottom: 0.5em;
202 +}
203 +
204 +.prose ul li:last-child {
205 + margin-bottom: 0;
206 +}
207 +
208 +.prose ul li > ul {
209 + margin-top: 0.5em;
210 + margin-bottom: 0.5em;
211 +}
212 +
213 +.prose ul li::before {
214 + content: '•';
215 + position: absolute;
216 + left: -1.375rem;
217 + top: -0.05em;
218 + width: 1.5rem;
219 + text-align: center;
220 + color: var(--text-tertiary);
221 +}
222 +
223 +/* Ordered lists */
224 +.prose ol {
225 + list-style-position: outside;
226 + padding-left: 0;
227 + margin-left: 1.25rem;
228 + margin-bottom: 1.25em;
229 + counter-reset: item;
230 +}
231 +
232 +.prose ol li {
233 + display: block;
234 + position: relative;
235 + margin-bottom: 0.5em;
236 +}
237 +
238 +.prose ol li:last-child {
239 + margin-bottom: 0;
240 +}
241 +
242 +.prose ol li::before {
243 + content: counter(item) '.';
244 + counter-increment: item;
245 + position: absolute;
246 + left: -1.15rem;
247 + width: 1.5rem;
248 + text-align: left;
249 + color: var(--text-secondary);
250 + font-variant-numeric: tabular-nums;
251 + font-feature-settings:
252 + 'tnum' 1,
253 + 'zero' 0,
254 + 'cv01' 1,
255 + 'cv02' 1,
256 + 'calt' 1,
257 + 'ss03' 1,
258 + 'liga' 1,
259 + 'ordn' 1;
260 +}
261 +
262 +/* Task lists */
263 +.prose ul.contains-task-list {
264 + list-style: none;
265 + margin-left: 0;
266 + white-space: nowrap;
267 +}
268 +
269 +.prose ul.contains-task-list li::before {
270 + content: none;
271 +}
272 +
273 +.prose ul.contains-task-list li.task-list-item {
274 + padding-left: 0.125em;
275 + margin-bottom: 0.5em;
276 +}
277 +
278 +.prose ul.contains-task-list li.task-list-item:last-child {
279 + margin-bottom: 0;
280 +}
281 +
282 +/* Task list checkboxes */
283 +.prose ul.contains-task-list li.task-list-item input[type='checkbox'] {
284 + margin-right: 0.375em;
285 + position: relative;
286 + top: 0.175em;
287 + width: 1em;
288 + height: 1em;
289 + border: 1.35px solid var(--text-tertiary);
290 + border-radius: 4px;
291 + background: transparent;
292 + appearance: none;
293 + -webkit-appearance: none;
294 +}
295 +
296 +.prose ul.contains-task-list li.task-list-item input[type='checkbox']:checked {
297 + position: relative;
298 + background: var(--code-bg);
299 + border: 1.35px solid var(--text-tertiary);
300 + opacity: 0.75;
301 +}
302 +
303 +.prose ul.contains-task-list li.task-list-item input[type='checkbox']:checked::before {
304 + content: '✓';
305 + font-family: var(--font-sans);
306 + color: var(--text-primary);
307 + opacity: 0.75;
308 + font-weight: var(--font-weight-bold);
309 + position: absolute;
310 + left: 0.15em;
311 + top: 0.05em;
312 + font-size: 0.75em;
313 + line-height: 1;
314 +}
315 +
316 +.prose ul.contains-task-list li.task-list-item input[type='checkbox'] + * {
317 + display: inline;
318 + margin-left: 0;
319 + line-height: 1.75;
320 + white-space: nowrap;
321 +}
322 +
323 +/* .prose ul.contains-task-list li.task-list-item:has(input[type='checkbox']:checked) {
324 + text-decoration: line-through;
325 +} */
326 +
327 +/* Subscript and superscript */
328 +.prose sup,
329 +.prose sub,
330 +.prose sup a {
331 + margin: 0 0.125em;
332 + font-size: 0.875em;
333 + line-height: 1;
334 +}
335 +
336 +/* Horizontal rule */
337 +.prose hr {
338 + margin: 2.5em 0;
339 + height: auto;
340 + border: none;
341 + background: none;
342 + text-align: center;
343 + position: relative;
344 +}
345 +
346 +.prose hr::before {
347 + content: '***';
348 + font-family: var(--font-mono);
349 + color: var(--text-tertiary);
350 + font-size: 0.875em;
351 + letter-spacing: 0.25em;
352 +}
353 +
354 +/* Keyboard input */
355 +.prose kbd {
356 + font-family: var(--font-mono);
357 + font-size: var(--font-size-s);
358 + border: 1px solid var(--text-tertiary);
359 + padding: 1px 4px;
360 + border-radius: 5px;
361 + min-width: 1.75em;
362 + display: inline-block;
363 + text-align: center;
364 + /* box-shadow: inset 0 -2.5px 0 var(--border); */
365 +}
366 +
367 +/* Highlighted text */
368 +.prose mark {
369 + background-color: var(--mark);
370 + color: var(--text-primary);
371 + padding: 3px 1px;
372 +}
373 +
374 +/* Footnotes */
375 +.prose .footnotes {
376 + margin-top: 4rem;
377 + padding-top: 1.75rem;
378 + position: relative;
379 +}
380 +
381 +.prose .footnotes::before {
382 + content: '';
383 + position: absolute;
384 + top: 0;
385 + left: 0;
386 + width: 4rem;
387 + height: 1px;
388 + background-color: var(--border);
389 +}
390 +
391 +.prose cite {
392 + font-style: normal;
393 +}
394 +
395 +/* Footnote references */
396 +.prose [data-footnote-backref] {
397 + position: relative;
398 + font-family: var(--font-mono);
399 + font-size: var(--font-size-l);
400 + top: -0.05em;
401 +}
402 +
403 +.prose [data-footnote-ref] {
404 + font-size: 1em;
405 + font-variant-numeric: tabular-nums;
406 + font-feature-settings:
407 + 'tnum' 1,
408 + 'zero' 0,
409 + 'cv01' 1,
410 + 'cv02' 1,
411 + 'calt' 1,
412 + 'ss03' 1,
413 + 'liga' 1,
414 + 'ordn' 1;
415 +}
416 +
417 +.prose [data-footnote-ref],
418 +.prose [data-footnote-backref] {
419 + color: var(--text-secondary);
420 + text-decoration: none;
421 + transition: color 0.2s ease-out;
422 + padding-right: 0.5em;
423 +}
424 +
425 +.prose [data-footnote-ref]:hover,
426 +.prose [data-footnote-backref]:hover {
427 + color: var(--text-primary);
428 +}
429 +
430 +/* Code blocks */
431 +.prose pre {
432 + background-color: var(--astro-code-background);
433 + border-radius: 8px;
434 + padding: 1.25em 1.5em;
435 + margin: 1.25em 0;
436 + overflow-x: auto;
437 +}
438 +
439 +@media (max-width: 768px) {
440 + .prose pre {
441 + padding: 1em 1.25em;
442 + }
443 +}
444 +
445 +.prose pre > code {
446 + font-family: var(--font-mono);
447 + font-feature-settings:
448 + 'liga' 0,
449 + 'calt' 0;
450 + display: block;
451 + white-space: pre-wrap;
452 + word-break: break-word;
453 + overflow-wrap: anywhere;
454 + padding: 0;
455 + margin: 0;
456 + background: none;
457 + border: none;
458 + line-height: 1.5;
459 + border-radius: 0;
460 +}
461 +
462 +.prose pre > code * {
463 + font-size: var(--font-size-s);
464 +}
465 +
466 +/* KaTeX Math Rendering */
467 +
468 +/* Hide MathML fallback to prevent duplication */
469 +.katex-mathml {
470 + display: none !important;
471 +}
472 +
473 +/* Ensure display math is centered */
474 +.katex-display {
475 + text-align: center;
476 + margin: 1.5em 0;
477 +}
478 +
479 +/* Reset any conflicting styles that might interfere with KaTeX */
480 +.katex * {
481 + box-sizing: content-box;
482 +}
483 +
484 +/* Ensure KaTeX elements inherit color properly */
485 +.katex,
486 +.katex * {
487 + color: inherit;
488 +}
489 +
490 +/* Specific fixes for common CSS framework conflicts */
491 +.katex .base,
492 +.katex .strut,
493 +.katex .mathit,
494 +.katex .mathrm,
495 +.katex .mathbf,
496 +.katex .mathsf,
497 +.katex .mathtt {
498 + line-height: initial;
499 + vertical-align: baseline;
500 +}
501 +
502 +/* Dark mode support */
503 +@media (prefers-color-scheme: dark) {
504 + .katex,
505 + .katex * {
506 + color: inherit;
507 + }
508 +}
509 +
510 +/* Reading Time */
511 +.reading-time {
512 + color: var(--text-secondary);
513 + letter-spacing: -0.025em;
514 +}
515 +
516 +.reading-time .separator {
517 + margin: 0 0.25em;
518 +}
519 +
520 +/* Video */
521 +.prose iframe {
522 + width: 100%;
523 + aspect-ratio: 16/9;
524 + border: none;
525 + border-radius: 6px;
526 + margin: 0.25em 0 0 0;
527 +}
528 +
529 +/* Spotify */
530 +.prose iframe[src*='spotify.com'] {
531 + aspect-ratio: auto;
532 +}
src/types/component.types.ts new
+33
@@ -0,0 +1,33 @@
1 +import type { TOCItem, ReadingTime } from './content.types'
2 +
3 +// TOC component props interface
4 +export interface TOCProps {
5 + toc?: TOCItem[]
6 +}
7 +
8 +// Post layout props interface (generic, not tied to specific data source)
9 +export interface PostLayoutProps {
10 + title: string
11 + pubDate: Date
12 + image?: string
13 + readingTime?: ReadingTime
14 + toc?: TOCItem[]
15 +}
16 +
17 +// Transition props interface
18 +export interface TransitionProps {
19 + type: 'post' | 'page'
20 + class?: string
21 +}
22 +
23 +// Layout props interface
24 +export interface LayoutProps extends TransitionProps {
25 + title?: string
26 + description?: string
27 +}
28 +
29 +// BaseHead component props interface
30 +export interface BaseHeadProps {
31 + title: string
32 + description: string
33 +}
src/types/config.types.ts new
+26
@@ -0,0 +1,26 @@
1 +// Date format types
2 +export type DateFormat =
3 + | 'YYYY-MM-DD'
4 + | 'MM-DD-YYYY'
5 + | 'DD-MM-YYYY'
6 + | 'MONTH DAY YYYY'
7 + | 'DAY MONTH YYYY'
8 +
9 +// Site configuration type
10 +export interface SiteConfig {
11 + website: string
12 + title: string
13 + author: string
14 + description: string
15 + language: string
16 + contentWidth: string
17 + centeredLayout: boolean
18 + favicon: boolean
19 + footer: boolean
20 + fadeAnimation: boolean
21 + dateFormat: DateFormat
22 + dateSeparator: string
23 + readingTime: boolean
24 + imageViewer: boolean
25 + copyCode: boolean
26 +}
src/types/content.types.ts new
+15
@@ -0,0 +1,15 @@
1 +// Reading time interface
2 +export interface ReadingTime {
3 + text: string
4 + minutes: number
5 + time: number
6 + words: number
7 +}
8 +
9 +// TOC item interface
10 +export interface TOCItem {
11 + level: number
12 + text: string
13 + id: string
14 + index: number
15 +}
src/types/index.ts new
+8
@@ -0,0 +1,8 @@
1 +// Configuration types
2 +export * from './config.types'
3 +
4 +// Content types
5 +export * from './content.types'
6 +
7 +// Component types
8 +export * from './component.types'
src/utils/date.ts new
+67
@@ -0,0 +1,67 @@
1 +import { SITE } from '@/config'
2 +
3 +const MONTHS_EN = [
4 + 'Jan',
5 + 'Feb',
6 + 'Mar',
7 + 'Apr',
8 + 'May',
9 + 'Jun',
10 + 'Jul',
11 + 'Aug',
12 + 'Sep',
13 + 'Oct',
14 + 'Nov',
15 + 'Dec'
16 +]
17 +
18 +const VALID_SEPARATORS = ['.', '-', '/']
19 +
20 +/**
21 + * @param date
22 + * @param format
23 + * @returns
24 + */
25 +export function formatDate(date: Date, format?: string): string {
26 + const formatStr = (format || SITE.dateFormat).trim()
27 + const configSeparator = SITE.dateSeparator || '-'
28 +
29 + const separator = VALID_SEPARATORS.includes(configSeparator.trim()) ? configSeparator.trim() : '.'
30 +
31 + const year = date.getFullYear()
32 + const month = date.getMonth() + 1
33 + const day = date.getDate()
34 + const monthName = MONTHS_EN[date.getMonth()]
35 +
36 + const pad = (num: number) => String(num).padStart(2, '0')
37 +
38 + switch (formatStr) {
39 + case 'YYYY-MM-DD':
40 + return `${year}${separator}${pad(month)}${separator}${pad(day)}`
41 +
42 + case 'MM-DD-YYYY':
43 + return `${pad(month)}${separator}${pad(day)}${separator}${year}`
44 +
45 + case 'DD-MM-YYYY':
46 + return `${pad(day)}${separator}${pad(month)}${separator}${year}`
47 +
48 + case 'MONTH DAY YYYY':
49 + return `<span class="month">${monthName}</span> ${day} ${year}`
50 +
51 + case 'DAY MONTH YYYY':
52 + return `${day} <span class="month">${monthName}</span> ${year}`
53 +
54 + default:
55 + return `${year}${separator}${pad(month)}${separator}${pad(day)}`
56 + }
57 +}
58 +
59 +export const SUPPORTED_DATE_FORMATS = [
60 + 'YYYY-MM-DD',
61 + 'MM-DD-YYYY',
62 + 'DD-MM-YYYY',
63 + 'MONTH DAY YYYY',
64 + 'DAY MONTH YYYY'
65 +] as const
66 +
67 +export type DateFormat = (typeof SUPPORTED_DATE_FORMATS)[number]
src/utils/draft.ts new
+21
@@ -0,0 +1,21 @@
1 +import { getCollection, type CollectionEntry } from 'astro:content'
2 +
3 +/**
4 + * Get all posts, filtering out posts whose filenames start with _ and static pages
5 + */
6 +export async function getFilteredPosts() {
7 + const posts = await getCollection('posts')
8 + const staticPages = ['privacy-policy', 'terms-of-use']
9 + return posts.filter((post) => !post.id.startsWith('_') && !staticPages.includes(post.id))
10 +}
11 +
12 +/**
13 + * Get all posts sorted by publication date, filtering out posts whose filenames start with _
14 + */
15 +export async function getSortedFilteredPosts() {
16 + const posts = await getFilteredPosts()
17 + return posts.sort(
18 + (a: CollectionEntry<'posts'>, b: CollectionEntry<'posts'>) =>
19 + b.data.pubDate.valueOf() - a.data.pubDate.valueOf()
20 + )
21 +}
src/utils/feed.ts new
+72
@@ -0,0 +1,72 @@
1 +import type { CollectionEntry } from 'astro:content'
2 +import { SITE } from '@/config'
3 +import type { APIContext } from 'astro'
4 +import { getSortedFilteredPosts } from '@/utils/draft'
5 +
6 +export async function generateRSS(context: APIContext) {
7 + const sortedPosts = await getSortedFilteredPosts()
8 +
9 + const rss = `<?xml version="1.0" encoding="UTF-8" ?>
10 +<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
11 + <channel>
12 + <title>${SITE.title}</title>
13 + <link>${context.site}</link>
14 + <description>${SITE.description}</description>
15 + <language>zh-CN</language>
16 + <lastBuildDate>${new Date().toUTCString()}</lastBuildDate>
17 + <atom:link href="${context.site}/rss.xml" rel="self" type="application/rss+xml" />
18 + ${sortedPosts
19 + .map(
20 + (post: CollectionEntry<'posts'>) => `
21 + <item>
22 + <title><![CDATA[${post.data.title}]]></title>
23 + <link>${context.site}/${post.id}/</link>
24 + <guid>${context.site}/${post.id}/</guid>
25 + <pubDate>${post.data.pubDate.toUTCString()}</pubDate>
26 + <content:encoded><![CDATA[${post.body}]]></content:encoded>
27 + </item>
28 + `
29 + )
30 + .join('')}
31 + </channel>
32 +</rss>`
33 +
34 + return new Response(rss, {
35 + headers: {
36 + 'Content-Type': 'application/xml; charset=utf-8'
37 + }
38 + })
39 +}
40 +
41 +export async function generateAtom(context: APIContext) {
42 + const sortedPosts = await getSortedFilteredPosts()
43 +
44 + const atom = `<?xml version="1.0" encoding="utf-8"?>
45 +<feed xmlns="http://www.w3.org/2005/Atom">
46 + <title>${SITE.title}</title>
47 + <subtitle>${SITE.description}</subtitle>
48 + <link href="${context.site}/atom.xml" rel="self" type="application/atom+xml" />
49 + <link href="${context.site}" />
50 + <id>${context.site}</id>
51 + <updated>${new Date().toISOString()}</updated>
52 + ${sortedPosts
53 + .map(
54 + (post: CollectionEntry<'posts'>) => `
55 + <entry>
56 + <title>${post.data.title}</title>
57 + <link href="${context.site}/${post.id}/" />
58 + <id>${context.site}/${post.id}/</id>
59 + <published>${post.data.pubDate.toISOString()}</published>
60 + <content type="html"><![CDATA[${post.body}]]></content>
61 + </entry>
62 + `
63 + )
64 + .join('')}
65 +</feed>`
66 +
67 + return new Response(atom, {
68 + headers: {
69 + 'Content-Type': 'application/xml; charset=utf-8'
70 + }
71 + })
72 +}
tailwind.config.js new
+79
@@ -0,0 +1,79 @@
1 +/** @type {import('tailwindcss').Config} */
2 +export default {
3 + content: ['./index.html', './src/**/*.{js,jsx,ts,tsx,astro,mdx}'],
4 + theme: {
5 + extend: {
6 + colors: {
7 + 'food-orange': '#FF6B35',
8 + 'food-red': '#DC2626',
9 + 'food-yellow': '#F59E0B',
10 + 'food-brown': '#78350F',
11 + 'food-cream': '#FEF3C7'
12 + },
13 + fontFamily: {
14 + sans: [
15 + 'Inter',
16 + '-apple-system',
17 + 'BlinkMacSystemFont',
18 + 'Segoe UI',
19 + 'Roboto',
20 + 'Oxygen',
21 + 'Ubuntu',
22 + 'Cantarell',
23 + 'Fira Sans',
24 + 'Droid Sans',
25 + 'Helvetica Neue',
26 + 'sans-serif'
27 + ],
28 + serif: [
29 + 'Besley',
30 + 'Baskerville',
31 + 'Georgia',
32 + 'Cambria',
33 + "'Times New Roman'",
34 + 'Times',
35 + 'serif'
36 + ],
37 + mono: [
38 + 'SFMono-Regular',
39 + 'Menlo',
40 + 'Monaco',
41 + 'Consolas',
42 + "'Liberation Mono'",
43 + "'Courier New'",
44 + 'monospace'
45 + ]
46 + },
47 + fontSize: {
48 + s: '0.8125rem',
49 + m: '0.9375rem',
50 + l: '1.0625rem',
51 + xs: '0.75rem',
52 + sm: '0.875rem',
53 + base: '1rem',
54 + lg: '1.125rem',
55 + xl: '1.25rem',
56 + '2xl': '1.5rem',
57 + '3xl': '1.875rem',
58 + '4xl': '2.25rem',
59 + '5xl': '3rem'
60 + },
61 + fontWeight: {
62 + light: '350',
63 + normal: '400',
64 + bold: '500'
65 + },
66 + letterSpacing: {
67 + s: '-0.08em',
68 + m: '-0.02em',
69 + tighter: '-0.05em',
70 + tight: '-0.025em',
71 + normal: '0em',
72 + wide: '0.025em',
73 + wider: '0.05em',
74 + widest: '0.1em'
75 + }
76 + }
77 + },
78 + plugins: []
79 +}
tsconfig.json new
+12
@@ -0,0 +1,12 @@
1 +{
2 + "extends": "astro/tsconfigs/strict",
3 + "include": [".astro/types.d.ts", "**/*"],
4 + "exclude": ["dist"],
5 + "compilerOptions": {
6 + "strictNullChecks": true,
7 + "baseUrl": ".",
8 + "paths": {
9 + "@/*": ["src/*"]
10 + }
11 + }
12 +}