feat: nextcloud sync

This commit is contained in:
2026-01-20 18:39:07 +01:00
parent 16c277c50c
commit ff2a2fee48
18 changed files with 647 additions and 80 deletions
+12
View File
@@ -0,0 +1,12 @@
{
"$schema": "https://raw.githubusercontent.com/google-gemini/gemini-cli/main/schemas/settings.schema.json",
"mcpServers": {
"svelte": {
"command": "npx",
"args": [
"-y",
"@sveltejs/mcp"
]
}
}
}
+62
View File
@@ -0,0 +1,62 @@
# Project Context: Schreifuchs.ch
## Overview
This project is a personal portfolio website for "Schreifuchs", featuring sections for Photography (Fotos), Informatics (Informatik), Music (Musig), and Video. It is currently being transitioned from a static site to a dynamic Node.js site powered by Nextcloud via WebDAV.
- [Nextcloud Integration Plan](./TODO_NEXTCLOUD.md)
## Tech Stack
- **Framework:** Svelte 5 (using Runes) & SvelteKit
- **Language:** TypeScript
- **Styling:** Tailwind CSS (with custom text-shadow plugin)
- **Bundler:** Vite
- **Adapter:** `@sveltejs/adapter-static` (SSG)
- **Markdown:** `@ts-stack/markdown` for content rendering
## Directory Structure
- `src/routes/`: File-based routing.
- `src/routes/fotos`, `informatik`, `musig`, `video`: Feature-specific pages.
- `src/lib/`: Shared utilities and components.
- `src/lib/components/`: Reusable UI components (`ImageTile`, `ImageLinkTile`, `Markdown`).
- `src/lib/images/`: Local image assets imported in components.
- `static/`: Static assets served as-is.
- Contains Markdown content files (`Fotos.md`, etc.) and their associated attachments.
## Key Conventions
- **Svelte 5:** Use Runes (`$state`, `$derived`, `$props`, etc.) for reactivity.
- **Styling:** Use Tailwind utility classes. The font family is configured to 'Outfit'.
- **Content:** Content is largely driven by Markdown files located in `static/` which are fetched and parsed.
- **Static Generation:** The site is built as a static site outputting to the `build/` directory.
## Development Scripts
- `npm run dev`: Start development server.
- `npm run build`: Build for production.
- `npm run check`: Run Svelte and TypeScript checks.
---
# Agent Instructions (Svelte MCP)
You are able to use the Svelte MCP server, where you have access to comprehensive Svelte 5 and SvelteKit documentation. Here's how to use the available tools effectively:
## Available MCP Tools:
### 1. list-sections
Use this FIRST to discover all available documentation sections. Returns a structured list with titles, use_cases, and paths.
When asked about Svelte or SvelteKit topics, ALWAYS use this tool at the start of the chat to find relevant sections.
### 2. get-documentation
Retrieves full documentation content for specific sections. Accepts single or multiple sections.
After calling the list-sections tool, you MUST analyze the returned documentation sections (especially the use_cases field) and then use the get-documentation tool to fetch ALL documentation sections that are relevant for the user's task.
### 3. svelte-autofixer
Analyzes Svelte code and returns issues and suggestions.
You MUST use this tool whenever writing Svelte code before sending it to the user. Keep calling it until no issues or suggestions are returned.
### 4. playground-link
Generates a Svelte Playground link with the provided code.
After completing the code, ask the user if they want a playground link. Only call this tool after user confirmation and NEVER if code was written to files in their project.
+36
View File
@@ -0,0 +1,36 @@
# Plan: Nextcloud WebDAV Integration
Transition from static file hosting to a dynamic SvelteKit (Node.js) application that fetches content directly from Nextcloud.
## 1. Infrastructure Shift
- [ ] Replace `@sveltejs/adapter-static` with `@sveltejs/adapter-node`.
- [ ] Update `svelte.config.js` to use the Node adapter.
- [ ] Remove `fallback: undefined` and other static-specific configurations.
## 2. Dependencies
- [ ] Install `webdav` client library.
- [ ] Install `dotenv` (if not already handled by SvelteKit's built-in env support).
## 3. Secure Configuration
- [ ] Set up `.env` with:
- `NEXTCLOUD_URL`
- `NEXTCLOUD_USER`
- `NEXTCLOUD_PASSWORD`
- [ ] Use `$env/dynamic/private` to access these in server-side code only.
## 4. Server-Side Data Fetching
- [ ] Create `src/lib/server/nextcloud.ts` to initialize and export the WebDAV client.
- [ ] Implement `+page.server.ts` for each content route:
- Fetch Markdown content from Nextcloud.
- Return the raw string to the frontend.
- [ ] Update `Markdown.svelte` to receive and render raw strings instead of fetching from a URL on the client.
## 5. Asset Proxying
- [ ] Create a catch-all server route (e.g., `src/routes/assets/[...path]/+server.ts`).
- [ ] This route will:
- Authenticate with WebDAV.
- Stream images/files from Nextcloud directly to the browser.
- [ ] Update Markdown rendering logic to rewrite image URLs to point to this proxy route.
## 6. Optimization (Optional but Recommended)
- [ ] Implement server-side caching (e.g., using a simple TTL cache or Redis) to avoid hitting Nextcloud on every single request.
+6 -2
View File
@@ -11,9 +11,11 @@
},
"devDependencies": {
"@sveltejs/adapter-auto": "^3.0.0",
"@sveltejs/adapter-static": "^3.0.2",
"@sveltejs/adapter-node": "^5.5.1",
"@sveltejs/kit": "^2.5.27",
"@sveltejs/vite-plugin-svelte": "^4.0.0",
"@types/mime-types": "^3.0.1",
"@types/node": "^25.0.9",
"autoprefixer": "^10.4.19",
"postcss": "^8.4.38",
"svelte": "^5.0.0",
@@ -26,6 +28,8 @@
"dependencies": {
"@fontsource/outfit": "^5.0.13",
"@ts-stack/markdown": "^1.5.0",
"svelte-preprocess": "^6.0.2"
"mime-types": "^3.0.2",
"svelte-preprocess": "^6.0.2",
"webdav": "^5.8.0"
}
}
+365 -31
View File
@@ -14,22 +14,34 @@ importers:
'@ts-stack/markdown':
specifier: ^1.5.0
version: 1.5.0
mime-types:
specifier: ^3.0.2
version: 3.0.2
svelte-preprocess:
specifier: ^6.0.2
version: 6.0.2(postcss-load-config@4.0.2(postcss@8.4.38))(postcss@8.4.38)(svelte@5.47.0)(typescript@5.9.3)
webdav:
specifier: ^5.8.0
version: 5.8.0
devDependencies:
'@sveltejs/adapter-auto':
specifier: ^3.0.0
version: 3.2.0(@sveltejs/kit@2.50.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21))(svelte@5.47.0)(typescript@5.9.3)(vite@5.4.21))
'@sveltejs/adapter-static':
specifier: ^3.0.2
version: 3.0.2(@sveltejs/kit@2.50.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21))(svelte@5.47.0)(typescript@5.9.3)(vite@5.4.21))
version: 3.2.0(@sveltejs/kit@2.50.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21(@types/node@25.0.9)))(svelte@5.47.0)(typescript@5.9.3)(vite@5.4.21(@types/node@25.0.9)))
'@sveltejs/adapter-node':
specifier: ^5.5.1
version: 5.5.1(@sveltejs/kit@2.50.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21(@types/node@25.0.9)))(svelte@5.47.0)(typescript@5.9.3)(vite@5.4.21(@types/node@25.0.9)))
'@sveltejs/kit':
specifier: ^2.5.27
version: 2.50.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21))(svelte@5.47.0)(typescript@5.9.3)(vite@5.4.21)
version: 2.50.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21(@types/node@25.0.9)))(svelte@5.47.0)(typescript@5.9.3)(vite@5.4.21(@types/node@25.0.9))
'@sveltejs/vite-plugin-svelte':
specifier: ^4.0.0
version: 4.0.4(svelte@5.47.0)(vite@5.4.21)
version: 4.0.4(svelte@5.47.0)(vite@5.4.21(@types/node@25.0.9))
'@types/mime-types':
specifier: ^3.0.1
version: 3.0.1
'@types/node':
specifier: ^25.0.9
version: 25.0.9
autoprefixer:
specifier: ^10.4.19
version: 10.4.19(postcss@8.4.38)
@@ -41,7 +53,7 @@ importers:
version: 5.47.0
svelte-check:
specifier: ^4.0.0
version: 4.3.5(svelte@5.47.0)(typescript@5.9.3)
version: 4.3.5(picomatch@4.0.3)(svelte@5.47.0)(typescript@5.9.3)
tailwindcss:
specifier: ^3.4.3
version: 3.4.3
@@ -50,7 +62,7 @@ importers:
version: 5.9.3
vite:
specifier: ^5.4.4
version: 5.4.21
version: 5.4.21(@types/node@25.0.9)
packages:
@@ -58,6 +70,9 @@ packages:
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
'@buttercup/fetch@0.2.1':
resolution: {integrity: sha512-sCgECOx8wiqY8NN1xN22BqqKzXYIG2AicNLlakOAI4f0WgyLVUbAigMf8CZhBtJxdudTcB1gD5lciqi44jwJvg==}
'@esbuild/aix-ppc64@0.21.5':
resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
engines: {node: '>=12'}
@@ -246,6 +261,42 @@ packages:
'@polka/url@1.0.0-next.25':
resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==}
'@rollup/plugin-commonjs@28.0.9':
resolution: {integrity: sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==}
engines: {node: '>=16.0.0 || 14 >= 14.17'}
peerDependencies:
rollup: ^2.68.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
'@rollup/plugin-json@6.1.0':
resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
'@rollup/plugin-node-resolve@16.0.3':
resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^2.78.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
'@rollup/pluginutils@5.3.0':
resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
'@rollup/rollup-android-arm-eabi@4.55.2':
resolution: {integrity: sha512-21J6xzayjy3O6NdnlO6aXi/urvSRjm6nCI6+nF6ra2YofKruGixN9kfT+dt55HVNwfDmpDHJcaS3JuP/boNnlA==}
cpu: [arm]
@@ -384,10 +435,10 @@ packages:
peerDependencies:
'@sveltejs/kit': ^2.0.0
'@sveltejs/adapter-static@3.0.2':
resolution: {integrity: sha512-/EBFydZDwfwFfFEuF1vzUseBoRziwKP7AoHAwv+Ot3M084sE/HTVBHf9mCmXfdM9ijprY5YEugZjleflncX5fQ==}
'@sveltejs/adapter-node@5.5.1':
resolution: {integrity: sha512-VpZdPNRPQuZRtgfAMETPWWKpZx9JwXmUUsgz/+eSpw/Oh7+2O1uZHlsQTuyfxydJHPrRzjfu/ItcJjY4oscCiQ==}
peerDependencies:
'@sveltejs/kit': ^2.0.0
'@sveltejs/kit': ^2.4.0
'@sveltejs/kit@2.50.0':
resolution: {integrity: sha512-Hj8sR8O27p2zshFEIJzsvfhLzxga/hWw6tRLnBjMYw70m1aS9BSYCqAUtzDBjRREtX1EvLMYgaC0mYE3Hz4KWA==}
@@ -432,6 +483,15 @@ packages:
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
'@types/mime-types@3.0.1':
resolution: {integrity: sha512-xRMsfuQbnRq1Ef+C+RKaENOxXX87Ygl38W1vDfPHRku02TgQr+Qd8iivLtAMcR0KF5/29xlnFihkTlbqFrGOVQ==}
'@types/node@25.0.9':
resolution: {integrity: sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw==}
'@types/resolve@1.20.2':
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
acorn@8.15.0:
resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
engines: {node: '>=0.4.0'}
@@ -481,6 +541,9 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
base-64@1.0.0:
resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==}
binary-extensions@2.3.0:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'}
@@ -497,6 +560,9 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
byte-length@1.0.2:
resolution: {integrity: sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==}
camelcase-css@2.0.1:
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
engines: {node: '>= 6'}
@@ -504,6 +570,9 @@ packages:
caniuse-lite@1.0.30001617:
resolution: {integrity: sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==}
charenc@0.0.2:
resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==}
chokidar@3.6.0:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
@@ -527,6 +596,9 @@ packages:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
commondir@1.0.1:
resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
cookie@0.6.0:
resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
engines: {node: '>= 0.6'}
@@ -535,11 +607,18 @@ packages:
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
engines: {node: '>= 8'}
crypt@0.0.2:
resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==}
cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
engines: {node: '>=4'}
hasBin: true
data-uri-to-buffer@4.0.1:
resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
engines: {node: '>= 12'}
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
engines: {node: '>=6.0'}
@@ -574,6 +653,10 @@ packages:
emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
entities@6.0.1:
resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
engines: {node: '>=0.12'}
esbuild@0.21.5:
resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
engines: {node: '>=12'}
@@ -589,10 +672,17 @@ packages:
esrap@2.2.1:
resolution: {integrity: sha512-GiYWG34AN/4CUyaWAgunGt0Rxvr1PTMlGC0vvEov/uOQYWne2bpN03Um+k8jT+q3op33mKouP2zeJ6OlM+qeUg==}
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
fast-glob@3.3.2:
resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
engines: {node: '>=8.6.0'}
fast-xml-parser@4.5.3:
resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==}
hasBin: true
fastq@1.17.1:
resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
@@ -605,6 +695,10 @@ packages:
picomatch:
optional: true
fetch-blob@3.2.0:
resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
engines: {node: ^12.20 || >= 14.13}
fill-range@7.0.1:
resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
engines: {node: '>=8'}
@@ -613,6 +707,10 @@ packages:
resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==}
engines: {node: '>=14'}
formdata-polyfill@4.0.10:
resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
engines: {node: '>=12.20.0'}
fraction.js@4.3.7:
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
@@ -641,6 +739,9 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
hot-patcher@2.0.1:
resolution: {integrity: sha512-ECg1JFG0YzehicQaogenlcs2qg6WsXQsxtnbr1i696u5tLUjtJdQAh0u2g0Q5YV45f263Ta1GnUJsc8WIfJf4Q==}
import-meta-resolve@4.1.0:
resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==}
@@ -648,6 +749,9 @@ packages:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
is-buffer@1.1.6:
resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
is-core-module@2.13.1:
resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
@@ -663,10 +767,16 @@ packages:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
is-module@1.0.0:
resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
is-reference@1.2.1:
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
is-reference@3.0.3:
resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==}
@@ -685,6 +795,9 @@ packages:
resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
engines: {node: '>=6'}
layerr@3.0.0:
resolution: {integrity: sha512-tv754Ki2dXpPVApOrjTyRo4/QegVb9eVFq4mjqp4+NM5NaX7syQvN5BBNfV/ZpAHCEHV24XdUVrBAoka4jt3pA==}
lilconfig@2.1.0:
resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
engines: {node: '>=10'}
@@ -709,6 +822,9 @@ packages:
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
md5@2.3.0:
resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==}
merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
@@ -717,10 +833,22 @@ packages:
resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
engines: {node: '>=8.6'}
mime-db@1.54.0:
resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
engines: {node: '>= 0.6'}
mime-types@3.0.2:
resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==}
engines: {node: '>=18'}
minimatch@9.0.4:
resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==}
engines: {node: '>=16 || 14 >=14.17'}
minimatch@9.0.5:
resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
engines: {node: '>=16 || 14 >=14.17'}
minipass@7.1.1:
resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==}
engines: {node: '>=16 || 14 >=14.17'}
@@ -749,6 +877,18 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
nested-property@4.0.0:
resolution: {integrity: sha512-yFehXNWRs4cM0+dz7QxCd06hTbWbSkV0ISsqBfkntU6TOY4Qm3Q88fRRLOddkGh2Qq6dZvnKVAahfhjcUvLnyA==}
node-domexception@1.0.0:
resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
engines: {node: '>=10.5.0'}
deprecated: Use your platform's native DOMException instead
node-fetch@3.3.2:
resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
node-releases@2.0.14:
resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
@@ -775,6 +915,9 @@ packages:
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
path-posix@1.0.0:
resolution: {integrity: sha512-1gJ0WpNIiYcQydgg3Ed8KzvIqTsDpNwq+cjBCssvBtuTWjEqY1AW+i+OepiEMqDCzyro9B2sLAe4RBPajMYFiA==}
path-scurry@1.11.0:
resolution: {integrity: sha512-LNHTaVkzaYaLGlO+0u3rQTz7QrHTFOuKyba9JMTQutkmtNew8dw8wOD7mTU/5fCPZzCWpfW0XnQKzY61P0aTaw==}
engines: {node: '>=16 || 14 >=14.17'}
@@ -789,6 +932,10 @@ packages:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
picomatch@4.0.3:
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
engines: {node: '>=12'}
pify@2.3.0:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'}
@@ -842,6 +989,9 @@ packages:
resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14}
querystringify@2.2.0:
resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
@@ -856,6 +1006,9 @@ packages:
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
engines: {node: '>= 14.18.0'}
requires-port@1.0.0:
resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
resolve@1.22.8:
resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
hasBin: true
@@ -919,6 +1072,9 @@ packages:
resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
engines: {node: '>=12'}
strnum@1.1.2:
resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==}
sucrase@3.35.0:
resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
engines: {node: '>=16 || 14 >=14.17'}
@@ -1008,12 +1164,22 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
undici-types@7.16.0:
resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
update-browserslist-db@1.0.15:
resolution: {integrity: sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
url-join@5.0.0:
resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
url-parse@1.5.10:
resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -1056,6 +1222,14 @@ packages:
vite:
optional: true
web-streams-polyfill@3.3.3:
resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
engines: {node: '>= 8'}
webdav@5.8.0:
resolution: {integrity: sha512-iuFG7NamJ41Oshg4930iQgfIpRrUiatPWIekeznYgEf2EOraTRcDPTjy7gIOMtkdpKTaqPk1E68NO5PAGtJahA==}
engines: {node: '>=14'}
which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'}
@@ -1081,6 +1255,10 @@ snapshots:
'@alloc/quick-lru@5.2.0': {}
'@buttercup/fetch@0.2.1':
optionalDependencies:
node-fetch: 3.3.2
'@esbuild/aix-ppc64@0.21.5':
optional: true
@@ -1202,6 +1380,42 @@ snapshots:
'@polka/url@1.0.0-next.25': {}
'@rollup/plugin-commonjs@28.0.9(rollup@4.55.2)':
dependencies:
'@rollup/pluginutils': 5.3.0(rollup@4.55.2)
commondir: 1.0.1
estree-walker: 2.0.2
fdir: 6.5.0(picomatch@4.0.3)
is-reference: 1.2.1
magic-string: 0.30.21
picomatch: 4.0.3
optionalDependencies:
rollup: 4.55.2
'@rollup/plugin-json@6.1.0(rollup@4.55.2)':
dependencies:
'@rollup/pluginutils': 5.3.0(rollup@4.55.2)
optionalDependencies:
rollup: 4.55.2
'@rollup/plugin-node-resolve@16.0.3(rollup@4.55.2)':
dependencies:
'@rollup/pluginutils': 5.3.0(rollup@4.55.2)
'@types/resolve': 1.20.2
deepmerge: 4.3.1
is-module: 1.0.0
resolve: 1.22.8
optionalDependencies:
rollup: 4.55.2
'@rollup/pluginutils@5.3.0(rollup@4.55.2)':
dependencies:
'@types/estree': 1.0.8
estree-walker: 2.0.2
picomatch: 4.0.3
optionalDependencies:
rollup: 4.55.2
'@rollup/rollup-android-arm-eabi@4.55.2':
optional: true
@@ -1283,20 +1497,24 @@ snapshots:
dependencies:
acorn: 8.15.0
'@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.50.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21))(svelte@5.47.0)(typescript@5.9.3)(vite@5.4.21))':
'@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.50.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21(@types/node@25.0.9)))(svelte@5.47.0)(typescript@5.9.3)(vite@5.4.21(@types/node@25.0.9)))':
dependencies:
'@sveltejs/kit': 2.50.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21))(svelte@5.47.0)(typescript@5.9.3)(vite@5.4.21)
'@sveltejs/kit': 2.50.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21(@types/node@25.0.9)))(svelte@5.47.0)(typescript@5.9.3)(vite@5.4.21(@types/node@25.0.9))
import-meta-resolve: 4.1.0
'@sveltejs/adapter-static@3.0.2(@sveltejs/kit@2.50.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21))(svelte@5.47.0)(typescript@5.9.3)(vite@5.4.21))':
'@sveltejs/adapter-node@5.5.1(@sveltejs/kit@2.50.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21(@types/node@25.0.9)))(svelte@5.47.0)(typescript@5.9.3)(vite@5.4.21(@types/node@25.0.9)))':
dependencies:
'@sveltejs/kit': 2.50.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21))(svelte@5.47.0)(typescript@5.9.3)(vite@5.4.21)
'@rollup/plugin-commonjs': 28.0.9(rollup@4.55.2)
'@rollup/plugin-json': 6.1.0(rollup@4.55.2)
'@rollup/plugin-node-resolve': 16.0.3(rollup@4.55.2)
'@sveltejs/kit': 2.50.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21(@types/node@25.0.9)))(svelte@5.47.0)(typescript@5.9.3)(vite@5.4.21(@types/node@25.0.9))
rollup: 4.55.2
'@sveltejs/kit@2.50.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21))(svelte@5.47.0)(typescript@5.9.3)(vite@5.4.21)':
'@sveltejs/kit@2.50.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21(@types/node@25.0.9)))(svelte@5.47.0)(typescript@5.9.3)(vite@5.4.21(@types/node@25.0.9))':
dependencies:
'@standard-schema/spec': 1.1.0
'@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0)
'@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.47.0)(vite@5.4.21)
'@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.47.0)(vite@5.4.21(@types/node@25.0.9))
'@types/cookie': 0.6.0
acorn: 8.15.0
cookie: 0.6.0
@@ -1309,29 +1527,29 @@ snapshots:
set-cookie-parser: 2.6.0
sirv: 3.0.2
svelte: 5.47.0
vite: 5.4.21
vite: 5.4.21(@types/node@25.0.9)
optionalDependencies:
typescript: 5.9.3
'@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21))(svelte@5.47.0)(vite@5.4.21)':
'@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21(@types/node@25.0.9)))(svelte@5.47.0)(vite@5.4.21(@types/node@25.0.9))':
dependencies:
'@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.47.0)(vite@5.4.21)
'@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.47.0)(vite@5.4.21(@types/node@25.0.9))
debug: 4.4.3
svelte: 5.47.0
vite: 5.4.21
vite: 5.4.21(@types/node@25.0.9)
transitivePeerDependencies:
- supports-color
'@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21)':
'@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21(@types/node@25.0.9))':
dependencies:
'@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21))(svelte@5.47.0)(vite@5.4.21)
'@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.47.0)(vite@5.4.21(@types/node@25.0.9)))(svelte@5.47.0)(vite@5.4.21(@types/node@25.0.9))
debug: 4.4.3
deepmerge: 4.3.1
kleur: 4.1.5
magic-string: 0.30.21
svelte: 5.47.0
vite: 5.4.21
vitefu: 1.1.1(vite@5.4.21)
vite: 5.4.21(@types/node@25.0.9)
vitefu: 1.1.1(vite@5.4.21(@types/node@25.0.9))
transitivePeerDependencies:
- supports-color
@@ -1345,6 +1563,14 @@ snapshots:
'@types/estree@1.0.8': {}
'@types/mime-types@3.0.1': {}
'@types/node@25.0.9':
dependencies:
undici-types: 7.16.0
'@types/resolve@1.20.2': {}
acorn@8.15.0: {}
ansi-regex@5.0.1: {}
@@ -1382,6 +1608,8 @@ snapshots:
balanced-match@1.0.2: {}
base-64@1.0.0: {}
binary-extensions@2.3.0: {}
brace-expansion@2.0.1:
@@ -1399,10 +1627,14 @@ snapshots:
node-releases: 2.0.14
update-browserslist-db: 1.0.15(browserslist@4.23.0)
byte-length@1.0.2: {}
camelcase-css@2.0.1: {}
caniuse-lite@1.0.30001617: {}
charenc@0.0.2: {}
chokidar@3.6.0:
dependencies:
anymatch: 3.1.3
@@ -1429,6 +1661,8 @@ snapshots:
commander@4.1.1: {}
commondir@1.0.1: {}
cookie@0.6.0: {}
cross-spawn@7.0.3:
@@ -1437,8 +1671,12 @@ snapshots:
shebang-command: 2.0.0
which: 2.0.2
crypt@0.0.2: {}
cssesc@3.0.0: {}
data-uri-to-buffer@4.0.1: {}
debug@4.4.3:
dependencies:
ms: 2.1.3
@@ -1459,6 +1697,8 @@ snapshots:
emoji-regex@9.2.2: {}
entities@6.0.1: {}
esbuild@0.21.5:
optionalDependencies:
'@esbuild/aix-ppc64': 0.21.5
@@ -1493,6 +1733,8 @@ snapshots:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
estree-walker@2.0.2: {}
fast-glob@3.3.2:
dependencies:
'@nodelib/fs.stat': 2.0.5
@@ -1501,11 +1743,22 @@ snapshots:
merge2: 1.4.1
micromatch: 4.0.5
fast-xml-parser@4.5.3:
dependencies:
strnum: 1.1.2
fastq@1.17.1:
dependencies:
reusify: 1.0.4
fdir@6.5.0: {}
fdir@6.5.0(picomatch@4.0.3):
optionalDependencies:
picomatch: 4.0.3
fetch-blob@3.2.0:
dependencies:
node-domexception: 1.0.0
web-streams-polyfill: 3.3.3
fill-range@7.0.1:
dependencies:
@@ -1516,6 +1769,10 @@ snapshots:
cross-spawn: 7.0.3
signal-exit: 4.1.0
formdata-polyfill@4.0.10:
dependencies:
fetch-blob: 3.2.0
fraction.js@4.3.7: {}
fsevents@2.3.3:
@@ -1543,12 +1800,16 @@ snapshots:
dependencies:
function-bind: 1.1.2
hot-patcher@2.0.1: {}
import-meta-resolve@4.1.0: {}
is-binary-path@2.1.0:
dependencies:
binary-extensions: 2.3.0
is-buffer@1.1.6: {}
is-core-module@2.13.1:
dependencies:
hasown: 2.0.2
@@ -1561,8 +1822,14 @@ snapshots:
dependencies:
is-extglob: 2.1.1
is-module@1.0.0: {}
is-number@7.0.0: {}
is-reference@1.2.1:
dependencies:
'@types/estree': 1.0.8
is-reference@3.0.3:
dependencies:
'@types/estree': 1.0.8
@@ -1579,6 +1846,8 @@ snapshots:
kleur@4.1.5: {}
layerr@3.0.0: {}
lilconfig@2.1.0: {}
lilconfig@3.1.1: {}
@@ -1597,6 +1866,12 @@ snapshots:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
md5@2.3.0:
dependencies:
charenc: 0.0.2
crypt: 0.0.2
is-buffer: 1.1.6
merge2@1.4.1: {}
micromatch@4.0.5:
@@ -1604,10 +1879,20 @@ snapshots:
braces: 3.0.2
picomatch: 2.3.1
mime-db@1.54.0: {}
mime-types@3.0.2:
dependencies:
mime-db: 1.54.0
minimatch@9.0.4:
dependencies:
brace-expansion: 2.0.1
minimatch@9.0.5:
dependencies:
brace-expansion: 2.0.1
minipass@7.1.1: {}
mri@1.2.0: {}
@@ -1626,6 +1911,16 @@ snapshots:
nanoid@3.3.7: {}
nested-property@4.0.0: {}
node-domexception@1.0.0: {}
node-fetch@3.3.2:
dependencies:
data-uri-to-buffer: 4.0.1
fetch-blob: 3.2.0
formdata-polyfill: 4.0.10
node-releases@2.0.14: {}
normalize-path@3.0.0: {}
@@ -1640,6 +1935,8 @@ snapshots:
path-parse@1.0.7: {}
path-posix@1.0.0: {}
path-scurry@1.11.0:
dependencies:
lru-cache: 10.2.2
@@ -1651,6 +1948,8 @@ snapshots:
picomatch@2.3.1: {}
picomatch@4.0.3: {}
pify@2.3.0: {}
pirates@4.0.6: {}
@@ -1698,6 +1997,8 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
querystringify@2.2.0: {}
queue-microtask@1.2.3: {}
read-cache@1.0.0:
@@ -1710,6 +2011,8 @@ snapshots:
readdirp@4.1.2: {}
requires-port@1.0.0: {}
resolve@1.22.8:
dependencies:
is-core-module: 2.13.1
@@ -1797,6 +2100,8 @@ snapshots:
dependencies:
ansi-regex: 6.0.1
strnum@1.1.2: {}
sucrase@3.35.0:
dependencies:
'@jridgewell/gen-mapping': 0.3.5
@@ -1809,11 +2114,11 @@ snapshots:
supports-preserve-symlinks-flag@1.0.0: {}
svelte-check@4.3.5(svelte@5.47.0)(typescript@5.9.3):
svelte-check@4.3.5(picomatch@4.0.3)(svelte@5.47.0)(typescript@5.9.3):
dependencies:
'@jridgewell/trace-mapping': 0.3.25
chokidar: 4.0.3
fdir: 6.5.0
fdir: 6.5.0(picomatch@4.0.3)
picocolors: 1.0.0
sade: 1.8.1
svelte: 5.47.0
@@ -1894,25 +2199,54 @@ snapshots:
typescript@5.9.3: {}
undici-types@7.16.0: {}
update-browserslist-db@1.0.15(browserslist@4.23.0):
dependencies:
browserslist: 4.23.0
escalade: 3.1.2
picocolors: 1.0.0
url-join@5.0.0: {}
url-parse@1.5.10:
dependencies:
querystringify: 2.2.0
requires-port: 1.0.0
util-deprecate@1.0.2: {}
vite@5.4.21:
vite@5.4.21(@types/node@25.0.9):
dependencies:
esbuild: 0.21.5
postcss: 8.5.6
rollup: 4.55.2
optionalDependencies:
'@types/node': 25.0.9
fsevents: 2.3.3
vitefu@1.1.1(vite@5.4.21):
vitefu@1.1.1(vite@5.4.21(@types/node@25.0.9)):
optionalDependencies:
vite: 5.4.21
vite: 5.4.21(@types/node@25.0.9)
web-streams-polyfill@3.3.3: {}
webdav@5.8.0:
dependencies:
'@buttercup/fetch': 0.2.1
base-64: 1.0.0
byte-length: 1.0.2
entities: 6.0.1
fast-xml-parser: 4.5.3
hot-patcher: 2.0.1
layerr: 3.0.0
md5: 2.3.0
minimatch: 9.0.5
nested-property: 4.0.0
node-fetch: 3.3.2
path-posix: 1.0.0
url-join: 5.0.0
url-parse: 1.5.10
which@2.0.2:
dependencies:
+2
View File
@@ -0,0 +1,2 @@
onlyBuiltDependencies:
- esbuild
+29 -30
View File
@@ -1,9 +1,33 @@
<script lang="ts">
import { Marked, Renderer } from "@ts-stack/markdown";
import { onMount } from "svelte";
Marked.setOptions({
renderer: new Renderer(),
interface Props {
content?: string;
basePath?: string;
}
let { content = "", basePath = "" }: Props = $props();
const renderer = new Renderer();
// Custom image renderer to proxy through /assets/
renderer.image = (href, title, text) => {
let src = href;
if (href && !href.startsWith('http')) {
// Ensure basePath starts with / if provided
const normalizedBasePath = basePath.startsWith('/') ? basePath : `/${basePath}`;
// If href starts with /, it's relative to root. Otherwise, relative to basePath.
if (!href.startsWith('/')) {
src = `${normalizedBasePath}/${href}`.replace(/\/+/g, '/');
}
src = `/assets${src}`;
}
return `<img src="${src}" alt="${text}" title="${title || ''}" />`;
};
let html = $derived(
Marked.parse(content || "__nothing to see here__", {
renderer,
gfm: true,
tables: true,
breaks: false,
@@ -11,37 +35,12 @@
sanitize: false,
smartLists: true,
smartypants: false,
});
interface Props {
src: string;
}
let { src }: Props = $props();
let content: Element[] = $state([]);
onMount(async () => {
const DOM_PARSER = new DOMParser();
const markdown = await (await fetch(src)).text();
const parsedMarkdown = DOM_PARSER.parseFromString(
Marked.parse(markdown ? markdown : "__nothing to see here__"),
"text/html",
})
);
content = [...parsedMarkdown.body.children];
// content.forEach((element) => console.log(element.nodeName));
});
//have to impelment correct relative img path's
</script>
<div class="markdown">
{#if content != null}
{#each content as element, i}
{@html element.outerHTML}
{/each}
{/if}
{@html html}
</div>
<style global>
+21
View File
@@ -0,0 +1,21 @@
import { createClient } from "webdav";
import { env } from "$env/dynamic/private";
if (!env.NEXTCLOUD_URL || !env.NEXTCLOUD_USER || !env.NEXTCLOUD_PASSWORD) {
console.warn("Nextcloud environment variables are not fully set. WebDAV client might not work correctly.");
}
// Construct the standard Nextcloud WebDAV URL: https://example.com/remote.php/dav/files/USERNAME/
const getWebdavUrl = () => {
if (!env.NEXTCLOUD_URL) return "";
const base = env.NEXTCLOUD_URL.endsWith("/") ? env.NEXTCLOUD_URL : `${env.NEXTCLOUD_URL}/`;
return `${base}remote.php/dav/files/${env.NEXTCLOUD_USER}/`;
};
export const client = createClient(
getWebdavUrl(),
{
username: env.NEXTCLOUD_USER || "",
password: env.NEXTCLOUD_PASSWORD || ""
}
);
+29
View File
@@ -0,0 +1,29 @@
import { client } from "$lib/server/nextcloud";
import { error } from "@sveltejs/kit";
import type { RequestHandler } from "./$types";
import mime from "mime-types";
export const GET: RequestHandler = async ({ params }) => {
const { path } = params;
if (!path) {
throw error(400, "Path is required");
}
try {
// Fetch from Nextcloud. We assume the path is relative to the root or a specific folder.
// If your files are in a specific folder, e.g., "Schreifuchs", prepend it here.
const buffer = await client.getFileContents("/" + path);
const contentType = mime.lookup(path) || "application/octet-stream";
return new Response(buffer as any, {
headers: {
"Content-Type": contentType,
"Cache-Control": "public, max-age=3600" // Cache for 1 hour
}
});
} catch (e) {
console.error(`Error fetching asset from Nextcloud: ${path}`, e);
throw error(404, "Asset not found");
}
};
+16
View File
@@ -0,0 +1,16 @@
import { client } from "$lib/server/nextcloud";
import type { PageServerLoad } from "./$types";
export const load: PageServerLoad = async () => {
try {
const content = await client.getFileContents("/fotos/Fotos.md", { format: "text" });
return {
content: content as string
};
} catch (e) {
console.error("Error fetching Fotos.md from Nextcloud", e);
return {
content: "Failed to load content from Nextcloud."
};
}
};
+4 -1
View File
@@ -2,6 +2,9 @@
import ImageTile from "$lib/components/ImageTile.svelte";
import Markdown from "$lib/components/Markdown.svelte";
import HeadImage from "$lib/images/fotos/sunne_untergang.webp";
import type { PageData } from "./$types";
let { data }: { data: PageData } = $props();
</script>
<ImageTile src={HeadImage}>
@@ -13,6 +16,6 @@
</ImageTile>
<main class="flex items-center justify-center pt-8 bg-black min-h-screen px-12">
<section class="max-w-screen-md">
<Markdown src="/fotos/Fotos.md" />
<Markdown content={data.content} basePath="/fotos" />
</section>
</main>
+16
View File
@@ -0,0 +1,16 @@
import { client } from "$lib/server/nextcloud";
import type { PageServerLoad } from "./$types";
export const load: PageServerLoad = async () => {
try {
const content = await client.getFileContents("/informatik/Informatik.md", { format: "text" });
return {
content: content as string
};
} catch (e) {
console.error("Error fetching Informatik.md from Nextcloud", e);
return {
content: "Failed to load content from Nextcloud."
};
}
};
+4 -1
View File
@@ -2,6 +2,9 @@
import ImageTile from "$lib/components/ImageTile.svelte";
import Markdown from "$lib/components/Markdown.svelte";
import HeadImage from "$lib/images/informatik/monitor.webp";
import type { PageData } from "./$types";
let { data }: { data: PageData } = $props();
</script>
<ImageTile src={HeadImage}>
@@ -13,6 +16,6 @@
</ImageTile>
<main class="flex items-center justify-center pt-8 bg-black min-h-screen px-12">
<section class="max-w-screen-md">
<Markdown src="/informatik/Informatik.md" />
<Markdown content={data.content} basePath="/informatik" />
</section>
</main>
+16
View File
@@ -0,0 +1,16 @@
import { client } from "$lib/server/nextcloud";
import type { PageServerLoad } from "./$types";
export const load: PageServerLoad = async () => {
try {
const content = await client.getFileContents("/musig/Musig.md", { format: "text" });
return {
content: content as string
};
} catch (e) {
console.error("Error fetching Musig.md from Nextcloud", e);
return {
content: "Failed to load content from Nextcloud."
};
}
};
+4 -1
View File
@@ -2,6 +2,9 @@
import ImageTile from "$lib/components/ImageTile.svelte";
import Markdown from "$lib/components/Markdown.svelte";
import HeadImage from "$lib/images/musig/plattespiler.webp";
import type { PageData } from "./$types";
let { data }: { data: PageData } = $props();
</script>
<ImageTile src={HeadImage}>
@@ -13,6 +16,6 @@
</ImageTile>
<main class="flex items-center justify-center pt-8 bg-black min-h-screen px-12">
<section class="max-w-screen-md">
<Markdown src="/musig/Musig.md" />
<Markdown content={data.content} basePath="/musig" />
</section>
</main>
+16
View File
@@ -0,0 +1,16 @@
import { client } from "$lib/server/nextcloud";
import type { PageServerLoad } from "./$types";
export const load: PageServerLoad = async () => {
try {
const content = await client.getFileContents("/video/Video.md", { format: "text" });
return {
content: content as string
};
} catch (e) {
console.error("Error fetching Video.md from Nextcloud", e);
return {
content: "Failed to load content from Nextcloud."
};
}
};
+4 -1
View File
@@ -2,6 +2,9 @@
import ImageTile from "$lib/components/ImageTile.svelte";
import Markdown from "$lib/components/Markdown.svelte";
import HeadImage from "$lib/images/video/jochen.webp";
import type { PageData } from "./$types";
let { data }: { data: PageData } = $props();
</script>
<ImageTile src={HeadImage}>
@@ -13,6 +16,6 @@
</ImageTile>
<main class="flex items-center justify-center pt-8 bg-black min-h-screen px-12">
<section class="max-w-screen-md">
<Markdown src="/video/Video.md" />
<Markdown content={data.content} basePath="/video" />
</section>
</main>
+2 -10
View File
@@ -1,18 +1,10 @@
import adapter from '@sveltejs/adapter-static';
import adapter from '@sveltejs/adapter-node';
import { sveltePreprocess } from 'svelte-preprocess';
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
/** @type {import('@sveltejs/kit').Config} */
const config = {
kit: {
adapter: adapter({
// default options are shown. On some platforms
// these options are set automatically — see below
pages: 'build',
assets: 'build',
fallback: undefined,
precompress: false,
strict: true
})
adapter: adapter()
},
preprocess: [vitePreprocess(), sveltePreprocess({})]
};