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
+[](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="<Group>">
10
+ <g id="_Group_2" data-name="<Group>">
11
+ <g id="_Group_3" data-name="<Group>">
12
+ <path id="_Path_" data-name="<Path>" 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="<Path>" 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="<Group>">
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">© {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
+}