Compare commits
28 Commits
26e57cb95e
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
| 83d45e161f | |||
| 796d236d79 | |||
| 63e2336c3b | |||
| 39c87726a2 | |||
| 7dbb374360 | |||
| 403e3310af | |||
| 8deac0dbec | |||
| 3e078d5344 | |||
| 35f152632e | |||
| f0bcaf45d0 | |||
| e46cd9a6b1 | |||
| 7992c211b5 | |||
| b399e31349 | |||
| 272321b19f | |||
| fda6206766 | |||
| f5445ece43 | |||
| 402ab0fbbb | |||
| fd5dc46b97 | |||
| b08ce97042 | |||
| 23b6490532 | |||
| 6f3c61270a | |||
| df6a0fa504 | |||
| a44d1363cd | |||
| 561ceb6ed7 | |||
| 11a9227dd0 | |||
| 5e1428f812 | |||
| 51c58bdf28 | |||
| 7aa0d99db1 |
62
.gitea/workflows/deploy.yml
Normal file
62
.gitea/workflows/deploy.yml
Normal file
@@ -0,0 +1,62 @@
|
||||
name: Build and Deploy
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- dev
|
||||
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
runs-on: debian-latest
|
||||
|
||||
steps:
|
||||
- name: Repository auschecken
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Abhängigkeiten installieren
|
||||
run: npm ci
|
||||
|
||||
# --- BRANCH-SPEZIFISCHE VARIABLEN SETZEN ---
|
||||
|
||||
- name: Konfiguration für Produktiv (main)
|
||||
if: github.ref == 'refs/heads/main'
|
||||
run: |
|
||||
echo "ASTRO_SITE_URL=https://iten.pro" >> $GITHUB_ENV
|
||||
echo "ASTRO_BASE_PATH=/" >> $GITHUB_ENV
|
||||
echo "DEPLOY_HOST=ssh.netzone.ch" >> $GITHUB_ENV
|
||||
echo "TARGET_PATH=~/htdocs/" >> $GITHUB_ENV
|
||||
echo "DEPLOY_USER=${{ secrets.PROD_SSH_USERNAME }}" >> $GITHUB_ENV
|
||||
echo "DEPLOY_KEY<<EOF" >> $GITHUB_ENV
|
||||
echo "${{ secrets.PROD_SSH_PRIVATE_KEY }}" >> $GITHUB_ENV
|
||||
echo "EOF" >> $GITHUB_ENV
|
||||
|
||||
- name: Konfiguration für Test (dev)
|
||||
if: github.ref == 'refs/heads/dev'
|
||||
run: |
|
||||
echo "ASTRO_SITE_URL=https://home.iten.pro" >> $GITHUB_ENV
|
||||
echo "ASTRO_BASE_PATH=/test" >> $GITHUB_ENV
|
||||
echo "DEPLOY_HOST=10.0.10.107" >> $GITHUB_ENV
|
||||
echo "TARGET_PATH=/var/www/pages/test" >> $GITHUB_ENV
|
||||
echo "DEPLOY_USER=${{ secrets.DEV_SSH_USERNAME }}" >> $GITHUB_ENV
|
||||
echo "DEPLOY_KEY<<EOF" >> $GITHUB_ENV
|
||||
echo "${{ secrets.DEV_SSH_PRIVATE_KEY }}" >> $GITHUB_ENV
|
||||
echo "EOF" >> $GITHUB_ENV
|
||||
|
||||
# --- BUILD UND DEPLOYMENT ---
|
||||
|
||||
- name: Astro Build ausführen
|
||||
run: npm run build
|
||||
|
||||
- name: SSH-Umgebung vorbereiten
|
||||
run: |
|
||||
mkdir -p ~/.ssh
|
||||
echo "$DEPLOY_KEY" > ~/.ssh/deploy_key
|
||||
chmod 600 ~/.ssh/deploy_key
|
||||
# Nutzt nun die dynamische Host-Variable
|
||||
ssh-keyscan -H "$DEPLOY_HOST" >> ~/.ssh/known_hosts
|
||||
|
||||
- name: Deploy via rsync
|
||||
run: |
|
||||
# Nutzt DEPLOY_USER, DEPLOY_HOST und TARGET_PATH
|
||||
rsync -avz --delete -e "ssh -p 22 -i ~/.ssh/deploy_key" dist/ $DEPLOY_USER@$DEPLOY_HOST:$TARGET_PATH
|
||||
@@ -1,10 +1,12 @@
|
||||
// @ts-check
|
||||
import { defineConfig } from 'astro/config';
|
||||
|
||||
import tailwindcss from '@tailwindcss/vite';
|
||||
import icon from 'astro-icon';
|
||||
|
||||
// https://astro.build/config
|
||||
export default defineConfig({
|
||||
site: process.env.ASTRO_SITE_URL || 'http://localhost:4321',
|
||||
base: process.env.ASTRO_BASE_PATH || '/',
|
||||
integrations: [icon()],
|
||||
vite: {
|
||||
plugins: [tailwindcss()]
|
||||
}
|
||||
|
||||
664
package-lock.json
generated
664
package-lock.json
generated
@@ -8,14 +8,41 @@
|
||||
"name": "iten.pro",
|
||||
"version": "0.0.1",
|
||||
"dependencies": {
|
||||
"@iconify-json/tabler": "^1.2.33",
|
||||
"@tailwindcss/vite": "^4.2.2",
|
||||
"astro": "^6.1.2",
|
||||
"astro-icon": "^1.1.5",
|
||||
"tailwindcss": "^4.2.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/typography": "^0.5.19"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@antfu/install-pkg": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz",
|
||||
"integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"package-manager-detector": "^1.3.0",
|
||||
"tinyexec": "^1.0.1"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
}
|
||||
},
|
||||
"node_modules/@antfu/utils": {
|
||||
"version": "8.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz",
|
||||
"integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==",
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
}
|
||||
},
|
||||
"node_modules/@astrojs/compiler": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-3.0.1.tgz",
|
||||
@@ -593,6 +620,107 @@
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@iconify-json/tabler": {
|
||||
"version": "1.2.33",
|
||||
"resolved": "https://registry.npmjs.org/@iconify-json/tabler/-/tabler-1.2.33.tgz",
|
||||
"integrity": "sha512-q9nUQfE/cjIrGh5bAKHTphitAZpT0kX9SxDgZo3Sx8ofeDTsaHVdRwrn+CfKiJ5vQ1b1btqVwizXzIgz9KEPjA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@iconify/types": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@iconify/tools": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@iconify/tools/-/tools-4.2.0.tgz",
|
||||
"integrity": "sha512-WRxPva/ipxYkqZd1+CkEAQmd86dQmrwH0vwK89gmp2Kh2WyyVw57XbPng0NehP3x4V1LzLsXUneP1uMfTMZmUA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@iconify/types": "^2.0.0",
|
||||
"@iconify/utils": "^2.3.0",
|
||||
"cheerio": "^1.1.2",
|
||||
"domhandler": "^5.0.3",
|
||||
"extract-zip": "^2.0.1",
|
||||
"local-pkg": "^1.1.2",
|
||||
"pathe": "^2.0.3",
|
||||
"svgo": "^3.3.2",
|
||||
"tar": "^7.5.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@iconify/tools/node_modules/commander": {
|
||||
"version": "7.2.0",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
|
||||
"integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 10"
|
||||
}
|
||||
},
|
||||
"node_modules/@iconify/tools/node_modules/css-tree": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
|
||||
"integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"mdn-data": "2.0.30",
|
||||
"source-map-js": "^1.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@iconify/tools/node_modules/mdn-data": {
|
||||
"version": "2.0.30",
|
||||
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
|
||||
"integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
|
||||
"license": "CC0-1.0"
|
||||
},
|
||||
"node_modules/@iconify/tools/node_modules/svgo": {
|
||||
"version": "3.3.3",
|
||||
"resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz",
|
||||
"integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"commander": "^7.2.0",
|
||||
"css-select": "^5.1.0",
|
||||
"css-tree": "^2.3.1",
|
||||
"css-what": "^6.1.0",
|
||||
"csso": "^5.0.5",
|
||||
"picocolors": "^1.0.0",
|
||||
"sax": "^1.5.0"
|
||||
},
|
||||
"bin": {
|
||||
"svgo": "bin/svgo"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/svgo"
|
||||
}
|
||||
},
|
||||
"node_modules/@iconify/types": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
|
||||
"integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@iconify/utils": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz",
|
||||
"integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@antfu/install-pkg": "^1.0.0",
|
||||
"@antfu/utils": "^8.1.0",
|
||||
"@iconify/types": "^2.0.0",
|
||||
"debug": "^4.4.0",
|
||||
"globals": "^15.14.0",
|
||||
"kolorist": "^1.8.0",
|
||||
"local-pkg": "^1.0.0",
|
||||
"mlly": "^1.7.4"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/colour": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
|
||||
@@ -1059,6 +1187,18 @@
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@isaacs/fs-minipass": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
|
||||
"integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"minipass": "^7.0.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@jridgewell/gen-mapping": {
|
||||
"version": "0.3.13",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
|
||||
@@ -1800,6 +1940,19 @@
|
||||
"node": ">= 20"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/typography": {
|
||||
"version": "0.5.19",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz",
|
||||
"integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"postcss-selector-parser": "6.0.10"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/vite": {
|
||||
"version": "4.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz",
|
||||
@@ -1862,18 +2015,50 @@
|
||||
"@types/unist": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "25.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz",
|
||||
"integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"undici-types": "~7.18.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/unist": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
|
||||
"integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/yauzl": {
|
||||
"version": "2.10.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
|
||||
"integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@ungap/structured-clone": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
|
||||
"integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/acorn": {
|
||||
"version": "8.16.0",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
|
||||
"integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"acorn": "bin/acorn"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/anymatch": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
|
||||
@@ -2002,6 +2187,17 @@
|
||||
"sharp": "^0.34.0"
|
||||
}
|
||||
},
|
||||
"node_modules/astro-icon": {
|
||||
"version": "1.1.5",
|
||||
"resolved": "https://registry.npmjs.org/astro-icon/-/astro-icon-1.1.5.tgz",
|
||||
"integrity": "sha512-CJYS5nWOw9jz4RpGWmzNQY7D0y2ZZacH7atL2K9DeJXJVaz7/5WrxeyIxO8KASk1jCM96Q4LjRx/F3R+InjJrw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@iconify/tools": "^4.0.5",
|
||||
"@iconify/types": "^2.0.0",
|
||||
"@iconify/utils": "^2.1.30"
|
||||
}
|
||||
},
|
||||
"node_modules/axobject-query": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
|
||||
@@ -2027,6 +2223,15 @@
|
||||
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/buffer-crc32": {
|
||||
"version": "0.2.13",
|
||||
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
|
||||
"integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/ccount": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
|
||||
@@ -2067,6 +2272,48 @@
|
||||
"url": "https://github.com/sponsors/wooorm"
|
||||
}
|
||||
},
|
||||
"node_modules/cheerio": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz",
|
||||
"integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cheerio-select": "^2.1.0",
|
||||
"dom-serializer": "^2.0.0",
|
||||
"domhandler": "^5.0.3",
|
||||
"domutils": "^3.2.2",
|
||||
"encoding-sniffer": "^0.2.1",
|
||||
"htmlparser2": "^10.1.0",
|
||||
"parse5": "^7.3.0",
|
||||
"parse5-htmlparser2-tree-adapter": "^7.1.0",
|
||||
"parse5-parser-stream": "^7.1.2",
|
||||
"undici": "^7.19.0",
|
||||
"whatwg-mimetype": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20.18.1"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/cheeriojs/cheerio?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/cheerio-select": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
|
||||
"integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
|
||||
"license": "BSD-2-Clause",
|
||||
"dependencies": {
|
||||
"boolbase": "^1.0.0",
|
||||
"css-select": "^5.1.0",
|
||||
"css-what": "^6.1.0",
|
||||
"domelementtype": "^2.3.0",
|
||||
"domhandler": "^5.0.3",
|
||||
"domutils": "^3.0.1"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/fb55"
|
||||
}
|
||||
},
|
||||
"node_modules/chokidar": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
|
||||
@@ -2082,6 +2329,15 @@
|
||||
"url": "https://paulmillr.com/funding/"
|
||||
}
|
||||
},
|
||||
"node_modules/chownr": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
|
||||
"integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
|
||||
"license": "BlueOak-1.0.0",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/ci-info": {
|
||||
"version": "4.4.0",
|
||||
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz",
|
||||
@@ -2134,6 +2390,12 @@
|
||||
"node": ">= 18"
|
||||
}
|
||||
},
|
||||
"node_modules/confbox": {
|
||||
"version": "0.2.4",
|
||||
"resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz",
|
||||
"integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/cookie": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
|
||||
@@ -2203,6 +2465,19 @@
|
||||
"url": "https://github.com/sponsors/fb55"
|
||||
}
|
||||
},
|
||||
"node_modules/cssesc": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
|
||||
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"cssesc": "bin/cssesc"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/csso": {
|
||||
"version": "5.0.5",
|
||||
"resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
|
||||
@@ -2406,6 +2681,28 @@
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/encoding-sniffer": {
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz",
|
||||
"integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"iconv-lite": "^0.6.3",
|
||||
"whatwg-encoding": "^3.1.1"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/fb55/encoding-sniffer?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/end-of-stream": {
|
||||
"version": "1.4.5",
|
||||
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
|
||||
"integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"once": "^1.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/enhanced-resolve": {
|
||||
"version": "5.20.1",
|
||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz",
|
||||
@@ -2502,12 +2799,47 @@
|
||||
"integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/exsolve": {
|
||||
"version": "1.0.8",
|
||||
"resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz",
|
||||
"integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/extend": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
|
||||
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/extract-zip": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
|
||||
"integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
|
||||
"license": "BSD-2-Clause",
|
||||
"dependencies": {
|
||||
"debug": "^4.1.1",
|
||||
"get-stream": "^5.1.0",
|
||||
"yauzl": "^2.10.0"
|
||||
},
|
||||
"bin": {
|
||||
"extract-zip": "cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10.17.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@types/yauzl": "^2.9.1"
|
||||
}
|
||||
},
|
||||
"node_modules/fd-slicer": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
|
||||
"integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"pend": "~1.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/fdir": {
|
||||
"version": "6.5.0",
|
||||
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
|
||||
@@ -2569,12 +2901,39 @@
|
||||
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/get-stream": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
|
||||
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"pump": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/github-slugger": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
|
||||
"integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/globals": {
|
||||
"version": "15.15.0",
|
||||
"resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
|
||||
"integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/graceful-fs": {
|
||||
"version": "4.2.11",
|
||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
||||
@@ -2791,12 +3150,55 @@
|
||||
"url": "https://github.com/sponsors/wooorm"
|
||||
}
|
||||
},
|
||||
"node_modules/htmlparser2": {
|
||||
"version": "10.1.0",
|
||||
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz",
|
||||
"integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==",
|
||||
"funding": [
|
||||
"https://github.com/fb55/htmlparser2?sponsor=1",
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/fb55"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"domelementtype": "^2.3.0",
|
||||
"domhandler": "^5.0.3",
|
||||
"domutils": "^3.2.2",
|
||||
"entities": "^7.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/htmlparser2/node_modules/entities": {
|
||||
"version": "7.0.1",
|
||||
"resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
|
||||
"integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
|
||||
"license": "BSD-2-Clause",
|
||||
"engines": {
|
||||
"node": ">=0.12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/fb55/entities?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/http-cache-semantics": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
|
||||
"integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
|
||||
"license": "BSD-2-Clause"
|
||||
},
|
||||
"node_modules/iconv-lite": {
|
||||
"version": "0.6.3",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
|
||||
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"safer-buffer": ">= 2.1.2 < 3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/iron-webcrypto": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz",
|
||||
@@ -2887,6 +3289,12 @@
|
||||
"js-yaml": "bin/js-yaml.js"
|
||||
}
|
||||
},
|
||||
"node_modules/kolorist": {
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz",
|
||||
"integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lightningcss": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
|
||||
@@ -3136,6 +3544,23 @@
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/local-pkg": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz",
|
||||
"integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"mlly": "^1.7.4",
|
||||
"pkg-types": "^2.3.0",
|
||||
"quansync": "^0.2.11"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
}
|
||||
},
|
||||
"node_modules/longest-streak": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
|
||||
@@ -3979,6 +4404,56 @@
|
||||
],
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/minipass": {
|
||||
"version": "7.1.3",
|
||||
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
|
||||
"integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
|
||||
"license": "BlueOak-1.0.0",
|
||||
"engines": {
|
||||
"node": ">=16 || 14 >=14.17"
|
||||
}
|
||||
},
|
||||
"node_modules/minizlib": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
|
||||
"integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"minipass": "^7.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
}
|
||||
},
|
||||
"node_modules/mlly": {
|
||||
"version": "1.8.2",
|
||||
"resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz",
|
||||
"integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"acorn": "^8.16.0",
|
||||
"pathe": "^2.0.3",
|
||||
"pkg-types": "^1.3.1",
|
||||
"ufo": "^1.6.3"
|
||||
}
|
||||
},
|
||||
"node_modules/mlly/node_modules/confbox": {
|
||||
"version": "0.1.8",
|
||||
"resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
|
||||
"integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/mlly/node_modules/pkg-types": {
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
|
||||
"integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"confbox": "^0.1.8",
|
||||
"mlly": "^1.7.4",
|
||||
"pathe": "^2.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/mrmime": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
|
||||
@@ -4094,6 +4569,15 @@
|
||||
"integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"node_modules/oniguruma-parser": {
|
||||
"version": "0.12.1",
|
||||
"resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz",
|
||||
@@ -4190,6 +4674,43 @@
|
||||
"url": "https://github.com/inikulin/parse5?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/parse5-htmlparser2-tree-adapter": {
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz",
|
||||
"integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"domhandler": "^5.0.3",
|
||||
"parse5": "^7.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/inikulin/parse5?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/parse5-parser-stream": {
|
||||
"version": "7.1.2",
|
||||
"resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
|
||||
"integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"parse5": "^7.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/inikulin/parse5?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/pathe": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
|
||||
"integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/pend": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
|
||||
"integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/piccolore": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz",
|
||||
@@ -4214,6 +4735,17 @@
|
||||
"url": "https://github.com/sponsors/jonschlinkert"
|
||||
}
|
||||
},
|
||||
"node_modules/pkg-types": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz",
|
||||
"integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"confbox": "^0.2.2",
|
||||
"exsolve": "^1.0.7",
|
||||
"pathe": "^2.0.3"
|
||||
}
|
||||
},
|
||||
"node_modules/postcss": {
|
||||
"version": "8.5.8",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
|
||||
@@ -4242,6 +4774,20 @@
|
||||
"node": "^10 || ^12 || >=14"
|
||||
}
|
||||
},
|
||||
"node_modules/postcss-selector-parser": {
|
||||
"version": "6.0.10",
|
||||
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
|
||||
"integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cssesc": "^3.0.0",
|
||||
"util-deprecate": "^1.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/prismjs": {
|
||||
"version": "1.30.0",
|
||||
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
|
||||
@@ -4261,6 +4807,32 @@
|
||||
"url": "https://github.com/sponsors/wooorm"
|
||||
}
|
||||
},
|
||||
"node_modules/pump": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
|
||||
"integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"end-of-stream": "^1.1.0",
|
||||
"once": "^1.3.1"
|
||||
}
|
||||
},
|
||||
"node_modules/quansync": {
|
||||
"version": "0.2.11",
|
||||
"resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz",
|
||||
"integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "individual",
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
},
|
||||
{
|
||||
"type": "individual",
|
||||
"url": "https://github.com/sponsors/sxzz"
|
||||
}
|
||||
],
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/radix3": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz",
|
||||
@@ -4551,6 +5123,12 @@
|
||||
"fsevents": "~2.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/sax": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz",
|
||||
@@ -4731,6 +5309,22 @@
|
||||
"url": "https://opencollective.com/webpack"
|
||||
}
|
||||
},
|
||||
"node_modules/tar": {
|
||||
"version": "7.5.13",
|
||||
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz",
|
||||
"integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==",
|
||||
"license": "BlueOak-1.0.0",
|
||||
"dependencies": {
|
||||
"@isaacs/fs-minipass": "^4.0.0",
|
||||
"chownr": "^3.0.0",
|
||||
"minipass": "^7.1.2",
|
||||
"minizlib": "^3.1.0",
|
||||
"yallist": "^5.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/tiny-inflate": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
|
||||
@@ -4836,6 +5430,22 @@
|
||||
"integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/undici": {
|
||||
"version": "7.24.6",
|
||||
"resolved": "https://registry.npmjs.org/undici/-/undici-7.24.6.tgz",
|
||||
"integrity": "sha512-Xi4agocCbRzt0yYMZGMA6ApD7gvtUFaxm4ZmeacWI4cZxaF6C+8I8QfofC20NAePiB/IcvZmzkJ7XPa471AEtA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=20.18.1"
|
||||
}
|
||||
},
|
||||
"node_modules/undici-types": {
|
||||
"version": "7.18.2",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
|
||||
"integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/unified": {
|
||||
"version": "11.0.5",
|
||||
"resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
|
||||
@@ -5085,6 +5695,13 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/vfile": {
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
|
||||
@@ -5230,6 +5847,28 @@
|
||||
"url": "https://github.com/sponsors/wooorm"
|
||||
}
|
||||
},
|
||||
"node_modules/whatwg-encoding": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
|
||||
"integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
|
||||
"deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"iconv-lite": "0.6.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/whatwg-mimetype": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
|
||||
"integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/which-pm-runs": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz",
|
||||
@@ -5239,12 +5878,27 @@
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/wrappy": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/xxhash-wasm": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz",
|
||||
"integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/yallist": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
|
||||
"integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
|
||||
"license": "BlueOak-1.0.0",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/yargs-parser": {
|
||||
"version": "22.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
|
||||
@@ -5254,6 +5908,16 @@
|
||||
"node": "^20.19.0 || ^22.12.0 || >=23"
|
||||
}
|
||||
},
|
||||
"node_modules/yauzl": {
|
||||
"version": "2.10.0",
|
||||
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
|
||||
"integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"buffer-crc32": "~0.2.3",
|
||||
"fd-slicer": "~1.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/yocto-queue": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
|
||||
|
||||
@@ -12,8 +12,13 @@
|
||||
"astro": "astro"
|
||||
},
|
||||
"dependencies": {
|
||||
"@iconify-json/tabler": "^1.2.33",
|
||||
"@tailwindcss/vite": "^4.2.2",
|
||||
"astro": "^6.1.2",
|
||||
"astro-icon": "^1.1.5",
|
||||
"tailwindcss": "^4.2.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/typography": "^0.5.19"
|
||||
}
|
||||
}
|
||||
|
||||
10
public/.htaccess
Normal file
10
public/.htaccess
Normal file
@@ -0,0 +1,10 @@
|
||||
ErrorDocument 403 /403.html
|
||||
ErrorDocument 404 /404.html
|
||||
ErrorDocument 500 /500.html
|
||||
|
||||
RewriteEngine On
|
||||
|
||||
# Prüfen, ob die aufgerufene URL mit /index-test beginnt
|
||||
RewriteCond %{REQUEST_URI} ^/index-test(/.*)?$
|
||||
# Umleitung auf das PHP-Skript, Übergabe des originalen Pfads als Parameter
|
||||
RewriteRule ^(.*)$ /auth.php?route=$1 [QSA,L]
|
||||
121
public/auth.php
Normal file
121
public/auth.php
Normal file
@@ -0,0 +1,121 @@
|
||||
<?php
|
||||
session_start();
|
||||
|
||||
// --- Hilfsfunktion für Fehlerseiten ---
|
||||
function serve_error_page($http_code, $filename) {
|
||||
http_response_code($http_code);
|
||||
$filepath = realpath(__DIR__ . '/' . $filename);
|
||||
|
||||
if ($filepath && file_exists($filepath)) {
|
||||
header('Content-Type: text/html');
|
||||
readfile($filepath);
|
||||
} else {
|
||||
// Fallback, falls die HTML-Datei serverseitig gelöscht wurde
|
||||
echo "<h1>Fehler $http_code</h1>";
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
// --- OIDC Konfiguration ---
|
||||
$client_id = 'iten-pro';
|
||||
$client_secret = '1qd6v3kCwpkdRu48pgyYF7axT9dywipqEvwHqWM9OiB53bQC'; // Hier im Klartext eintragen
|
||||
$authelia_url = 'https://auth.iten.pro';
|
||||
$redirect_uri = 'https://iten.pro/auth.php'; // Muss exakt mit Authelia config übereinstimmen
|
||||
|
||||
// 1. OIDC Callback verarbeiten (Rückkehr von Authelia)
|
||||
if (isset($_GET['code']) && isset($_GET['state'])) {
|
||||
if ($_GET['state'] !== $_SESSION['oauth_state']) {
|
||||
die('Sicherheitsfehler: State Mismatch.');
|
||||
}
|
||||
|
||||
// Autorisierungscode gegen Token tauschen
|
||||
$ch = curl_init($authelia_url . '/api/oidc/token');
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_POST, true);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
|
||||
'grant_type' => 'authorization_code',
|
||||
'client_id' => $client_id,
|
||||
'client_secret' => $client_secret,
|
||||
'redirect_uri' => $redirect_uri,
|
||||
'code' => $_GET['code']
|
||||
]));
|
||||
|
||||
$response = curl_exec($ch);
|
||||
|
||||
if ($response === false) {
|
||||
$error_msg = curl_error($ch);
|
||||
curl_close($ch);
|
||||
die('Kritischer cURL-Netzwerkfehler: ' . $error_msg);
|
||||
}
|
||||
|
||||
curl_close($ch);
|
||||
$data = json_decode($response, true);
|
||||
|
||||
if (isset($data['access_token'])) {
|
||||
// Erfolgreich eingeloggt
|
||||
$_SESSION['authenticated'] = true;
|
||||
|
||||
// Zurück zur ursprünglich angeforderten Route umleiten
|
||||
$target = $_SESSION['auth_target_route'] ?? '/';
|
||||
header('Location: /' . ltrim($target, '/'));
|
||||
exit;
|
||||
} else {
|
||||
die('Fehler bei der Token-Generierung: ' . htmlspecialchars($response));
|
||||
}
|
||||
}
|
||||
|
||||
// 2. Authentifizierungsstatus prüfen
|
||||
$is_logged_in = isset($_SESSION['authenticated']) && $_SESSION['authenticated'] === true;
|
||||
|
||||
if (!$is_logged_in) {
|
||||
// Ursprüngliches Ziel speichern, um nach dem Login dorthin zurückzukehren
|
||||
$_SESSION['auth_target_route'] = $_GET['route'] ?? '';
|
||||
|
||||
// CSRF-Schutz generieren
|
||||
$_SESSION['oauth_state'] = bin2hex(random_bytes(16));
|
||||
|
||||
// Umleitung zur Authelia-Loginseite
|
||||
$auth_url = $authelia_url . '/api/oidc/authorization?' . http_build_query([
|
||||
'client_id' => $client_id,
|
||||
'response_type' => 'code',
|
||||
'redirect_uri' => $redirect_uri,
|
||||
'state' => $_SESSION['oauth_state'],
|
||||
'scope' => 'openid profile email'
|
||||
]);
|
||||
|
||||
header('Location: ' . $auth_url);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 3. Auslieferung der statischen Astro-Datei
|
||||
$route = $_GET['route'] ?? '';
|
||||
|
||||
// Wenn auth.php direkt aufgerufen wurde (z.B. nach Login-Callback ohne Ziel)
|
||||
if ($route === '') {
|
||||
header('Location: /');
|
||||
exit;
|
||||
}
|
||||
|
||||
$route = trim($route, '/');
|
||||
$base_dir = realpath(__DIR__);
|
||||
$target_file = $base_dir . '/' . $route;
|
||||
|
||||
if (is_dir($target_file)) {
|
||||
$target_file = rtrim($target_file, '/') . '/index.html';
|
||||
} elseif (!str_ends_with($target_file, '.html') && file_exists($target_file . '/index.html')) {
|
||||
$target_file .= '/index.html';
|
||||
} elseif (!str_ends_with($target_file, '.html')) {
|
||||
$target_file .= '.html';
|
||||
}
|
||||
|
||||
$real_target = realpath($target_file);
|
||||
|
||||
// Path Traversal verhindern
|
||||
if ($real_target && file_exists($real_target) && strpos($real_target, $base_dir) === 0) {
|
||||
header('Content-Type: text/html');
|
||||
readfile($real_target);
|
||||
exit;
|
||||
}
|
||||
|
||||
serve_error_page(404, '404.html');
|
||||
exit;
|
||||
55
src/components/ErrorComponent.astro
Normal file
55
src/components/ErrorComponent.astro
Normal file
@@ -0,0 +1,55 @@
|
||||
---
|
||||
// src/pages/404.astro
|
||||
import MainLayout from "../layouts/MainLayout.astro";
|
||||
import { getPath } from "../utils/paths";
|
||||
import { Icon } from "astro-icon/components";
|
||||
|
||||
interface props {
|
||||
title: string;
|
||||
}
|
||||
|
||||
const { title = "404" } = Astro.props;
|
||||
---
|
||||
|
||||
<div class="flex flex-col items-center justify-center min-h-[60vh] w-full py-12 error-component">
|
||||
<div
|
||||
class="w-full sm:max-w-lg -mx-4 sm:mx-0 bg-red-50 text-red-500 p-0 sm:rounded-lg sm:shadow border-y-2 sm:border-2 border-red-500 text-center"
|
||||
>
|
||||
<h1
|
||||
class="bg-red-500 text-white text-4xl font-bold py-2 px-4 font-mono flex items-center justify-center gap-3"
|
||||
>
|
||||
<span class="relative grid h-9 w-9">
|
||||
<Icon
|
||||
name="tabler:triangle-filled"
|
||||
class="col-start-1 row-start-1 size-9 animate-ping opacity-75 translate-x-[-0.25px] translate-y-[-1.5px] blur-[1px]"
|
||||
/>
|
||||
<Icon
|
||||
name="tabler:alert-triangle"
|
||||
class="col-start-1 row-start-1 size-9 relative"
|
||||
/>
|
||||
</span>
|
||||
Fehler {title}
|
||||
</h1>
|
||||
|
||||
<p class="mb-4 text-red-500 py-2 px-4 text-lg">
|
||||
<slot />
|
||||
<a
|
||||
href={getPath("/")}
|
||||
class="flex items-center justify-center gap-1 font-semibold text-red-500 hover:text-white hover:bg-red-500 rounded-full px-4 py-2 hover:drop-shadow transition-colors duration-300 mt-2"
|
||||
>
|
||||
<Icon name="tabler:arrow-big-left" class="size-5" />
|
||||
Zurück zur Startseite
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<style>
|
||||
@reference "../styles/global.css";
|
||||
.error-component :global(br) {
|
||||
@apply mb-3;
|
||||
}
|
||||
|
||||
.error-component .animate-ping {
|
||||
animation-duration: 2s;
|
||||
}
|
||||
</style>
|
||||
52
src/components/Footer.astro
Normal file
52
src/components/Footer.astro
Normal file
@@ -0,0 +1,52 @@
|
||||
---
|
||||
// src/components/Footer.astro
|
||||
import { getPath } from '../utils/paths';
|
||||
|
||||
const currentYear = new Date().getFullYear();
|
||||
const startYear = 2026;
|
||||
const displayYear = currentYear > startYear ? `${startYear}–${currentYear}` : startYear;
|
||||
---
|
||||
|
||||
<footer class="main-footer">
|
||||
<div class="footer-container">
|
||||
<div class="footer-copy">
|
||||
©{displayYear} Eduard Iten
|
||||
</div>
|
||||
|
||||
<nav>
|
||||
<ul class="footer-links">
|
||||
<li><a href={getPath("/impressum")} class="footer-link-item">Impressum</a></li>
|
||||
<li><a href={getPath("/datenschutz")} class="footer-link-item">Datenschutz</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<style>
|
||||
@reference "../styles/global.css";
|
||||
/* .main-footer {
|
||||
@apply fixed bottom-0 left-0 w-full z-50 py-2 shadow-top bg-linear-to-b from-white/80 to-header-bg/80 backdrop-blur-sm;
|
||||
|
||||
} */
|
||||
|
||||
.main-footer {
|
||||
@apply w-full bg-linear-to-b from-white to-header-bg py-2 mt-auto shadow-top;
|
||||
}
|
||||
|
||||
.footer-container {
|
||||
@apply container mx-auto px-6 flex flex-col md:flex-row justify-between items-center gap-4;
|
||||
}
|
||||
|
||||
.footer-copy {
|
||||
@apply text-xs text-slate-400 font-medium;
|
||||
}
|
||||
|
||||
.footer-links {
|
||||
@apply flex gap-6 text-xs text-slate-500;
|
||||
}
|
||||
|
||||
.footer-link-item {
|
||||
@apply hover:text-blue-500 transition-colors;
|
||||
}
|
||||
|
||||
</style>
|
||||
57
src/components/Header.astro
Normal file
57
src/components/Header.astro
Normal file
@@ -0,0 +1,57 @@
|
||||
---
|
||||
// src/components/Header.astro
|
||||
import Logo from "./Logo.astro";
|
||||
import { getPath } from "../utils/paths";
|
||||
|
||||
const pathname = new URL(Astro.request.url).pathname;
|
||||
const currentPath = pathname.slice(1);
|
||||
---
|
||||
|
||||
<header class="main-header">
|
||||
<div class="header-container">
|
||||
<a href={getPath("/")} class="group flex items-center gap-2">
|
||||
<Logo class="h-6 w-auto transition-colors" />
|
||||
</a>
|
||||
<!--
|
||||
<nav>
|
||||
<ul class="nav-list">
|
||||
<li>
|
||||
<a href="/projekte" class={`nav-item ${currentPath === 'projekte' ? 'nav-item-active' : ''}`}>
|
||||
Projekte
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/engineering" class={`nav-item ${currentPath === 'engineering' ? 'nav-item-active' : ''}`}>
|
||||
Engineering
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/kontakt" class={`nav-item ${currentPath === 'kontakt' ? 'nav-item-active' : ''}`}>
|
||||
Kontakt
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav> -->
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<style>
|
||||
@reference "../styles/global.css";
|
||||
.main-header {
|
||||
@apply sticky top-0 z-50 w-full bg-linear-to-b from-white/80 to-header-bg/80 backdrop-blur-md shadow-md;
|
||||
}
|
||||
|
||||
/* Innere Zentrierung */
|
||||
.header-container {
|
||||
@apply container mx-auto flex h-16 items-center justify-between px-6;
|
||||
}
|
||||
|
||||
/* Navigations-Links */
|
||||
.nav-list {
|
||||
@apply flex items-center gap-8;
|
||||
}
|
||||
|
||||
.nav-item {
|
||||
@apply text-sm font-medium text-nav-text transition-colors hover:text-nav-hover;
|
||||
}
|
||||
</style>
|
||||
18
src/components/Logo.astro
Normal file
18
src/components/Logo.astro
Normal file
File diff suppressed because one or more lines are too long
50
src/components/PatternCode.astro
Normal file
50
src/components/PatternCode.astro
Normal file
@@ -0,0 +1,50 @@
|
||||
---
|
||||
// src/components/CodePattern.astro
|
||||
interface Props {
|
||||
fillColor?: string;
|
||||
}
|
||||
const { fillColor = "text-white" } = Astro.props;
|
||||
|
||||
const codeLines = [
|
||||
"/* Zephyr RTOS Thread Init */",
|
||||
"K_THREAD_DEFINE(my_tid, STACKSIZE,",
|
||||
" my_entry_point, NULL, NULL, NULL,",
|
||||
" MY_PRIORITY, 0, K_NO_WAIT);",
|
||||
"void main(void) {",
|
||||
" printk(\"Booting iten.pro...\\n\");",
|
||||
"}"
|
||||
];
|
||||
---
|
||||
|
||||
<svg
|
||||
width="100%"
|
||||
height="100%"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class={`block ${fillColor}`}
|
||||
>
|
||||
<defs>
|
||||
<pattern
|
||||
id="codePattern"
|
||||
x="0"
|
||||
y="0"
|
||||
width="600"
|
||||
height="280"
|
||||
patternUnits="userSpaceOnUse"
|
||||
>
|
||||
<text
|
||||
x="0"
|
||||
y="30"
|
||||
font-family="monospace"
|
||||
font-weight="bold"
|
||||
font-size="20"
|
||||
fill="currentColor"
|
||||
>
|
||||
{codeLines.map((line, index) => (
|
||||
<tspan x="10" dy={index === 0 ? "0" : "1.5em"}>{line}</tspan>
|
||||
))}
|
||||
</text>
|
||||
</pattern>
|
||||
</defs>
|
||||
|
||||
<rect width="100%" height="100%" fill="url(#codePattern)" />
|
||||
</svg>
|
||||
21
src/components/PatternPCB.astro
Normal file
21
src/components/PatternPCB.astro
Normal file
File diff suppressed because one or more lines are too long
47
src/components/PatternSystem.astro
Normal file
47
src/components/PatternSystem.astro
Normal file
@@ -0,0 +1,47 @@
|
||||
---
|
||||
// src/components/PatternSystem.astro
|
||||
interface Props {
|
||||
fillColor?: string;
|
||||
}
|
||||
const { fillColor = "text-white" } = Astro.props;
|
||||
---
|
||||
|
||||
<svg
|
||||
viewBox="0 0 200 60"
|
||||
preserveAspectRatio="xMidYMid slice"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class={`w-full h-full block ${fillColor} fill-current`}
|
||||
>
|
||||
<g opacity="0.15">
|
||||
<path d="M 10,30 L 190,30" stroke="currentColor" stroke-width="1" />
|
||||
<path d="M 10,32 L 190,32" stroke="currentColor" stroke-width="0.5" stroke-dasharray="2 2" />
|
||||
</g>
|
||||
|
||||
<g opacity="0.25">
|
||||
|
||||
<rect x="20" y="20" width="25" height="20" rx="1" stroke="currentColor" stroke-width="0.5" fill="none" />
|
||||
<text x="23" y="28" font-family="monospace" font-size="3" fill="currentColor">SEN</text>
|
||||
<path d="M 32.5,30 L 32.5,40" stroke="currentColor" stroke-width="0.5" />
|
||||
<circle cx="32.5" cy="30" r="1" fill="currentColor" />
|
||||
|
||||
<rect x="65" y="15" width="30" height="30" rx="2" stroke="currentColor" stroke-width="1" fill="none" />
|
||||
<text x="70" y="25" font-family="monospace" font-size="4" font-weight="bold" fill="currentColor">MCU</text>
|
||||
<path d="M 65,30 L 95,30" stroke="currentColor" stroke-width="0.5" />
|
||||
<g opacity="0.5">
|
||||
<path d="M 70,30 L 70,15 M 75,30 L 75,15 M 80,30 L 80,15 M 85,30 L 85,15" stroke="currentColor" stroke-width="0.2" />
|
||||
<path d="M 70,30 L 70,45 M 75,30 L 75,45 M 80,30 L 80,45 M 85,30 L 85,45" stroke="currentColor" stroke-width="0.2" />
|
||||
</g>
|
||||
|
||||
<rect x="115" y="22" width="20" height="16" rx="1" stroke="currentColor" stroke-width="0.5" fill="none" />
|
||||
<text x="118" y="29" font-family="monospace" font-size="3" fill="currentColor">MEM</text>
|
||||
<path d="M 125,30 L 125,38" stroke="currentColor" stroke-width="0.5" />
|
||||
<circle cx="125" cy="30" r="1" fill="currentColor" />
|
||||
|
||||
<rect x="155" y="18" width="25" height="24" rx="1" stroke="currentColor" stroke-width="0.5" fill="none" />
|
||||
<path d="M 175,22 L 175,12 M 172,15 L 175,12 L 178,15 M 170,18 L 175,12 L 180,18" stroke="currentColor" stroke-width="0.5" fill="none" />
|
||||
<text x="158" y="26" font-family="monospace" font-size="3" fill="currentColor">RF/LoRa</text>
|
||||
<path d="M 167.5,30 L 167.5,42" stroke="currentColor" stroke-width="0.5" />
|
||||
<circle cx="167.5" cy="30" r="1" fill="currentColor" />
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
64
src/components/Section.astro
Normal file
64
src/components/Section.astro
Normal file
@@ -0,0 +1,64 @@
|
||||
---
|
||||
// src/components/Section.astro
|
||||
interface Props {
|
||||
title: string;
|
||||
subtitle?: string;
|
||||
themeColor?: string;
|
||||
highlightColor?: string;
|
||||
id?: string;
|
||||
}
|
||||
|
||||
const {
|
||||
title,
|
||||
subtitle,
|
||||
themeColor,
|
||||
highlightColor,
|
||||
id,
|
||||
} = Astro.props;
|
||||
|
||||
// Extrahiere den reinen Farbnamen für die CSS-Variable des Listen-Randes
|
||||
// Aus "bg-fuchsia-800" wird "fuchsia-800"
|
||||
const borderColorName = themeColor.replace("bg-", "");
|
||||
---
|
||||
|
||||
<div id={id} class="w-full" style={`--list-border-color: var(--color-${borderColorName});`}>
|
||||
<header class={`w-full py-8 lg:py-16 relative overflow-hidden ${themeColor}`}>
|
||||
<div class="absolute inset-0 pointer-events-none z-0">
|
||||
<div class="w-full h-full block">
|
||||
<slot name="background" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="container mx-auto px-6 relative z-10 max-w-6xl">
|
||||
<h2 class="text-5xl font-bold text-white mb-2 drop-shadow-lg">
|
||||
{title}
|
||||
</h2>
|
||||
{
|
||||
subtitle && (
|
||||
<p class={`text-2xl font-semibold ${highlightColor} drop-shadow-lg`}>
|
||||
{subtitle}
|
||||
</p>
|
||||
)
|
||||
}
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<article class="w-full">
|
||||
<div class="container mx-auto px-6 max-w-6xl pt-6 pb-12 section-content">
|
||||
<slot />
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
@reference "../styles/global.css";
|
||||
|
||||
.section-content :global(ul) {
|
||||
@apply grid md:grid-cols-2 gap-4 mt-6 list-none pl-0;
|
||||
}
|
||||
|
||||
.section-content :global(li) {
|
||||
@apply bg-slate-100 text-slate-800 px-4 py-2 rounded border-l-4 shadow-sm;
|
||||
border-left-color: var(--list-border-color);
|
||||
}
|
||||
</style>
|
||||
35
src/layouts/MainLayout.astro
Normal file
35
src/layouts/MainLayout.astro
Normal file
@@ -0,0 +1,35 @@
|
||||
---
|
||||
// src/layouts/MainLayout.astro
|
||||
import Header from "../components/Header.astro";
|
||||
import Footer from "../components/Footer.astro";
|
||||
import "../styles/global.css";
|
||||
|
||||
interface Props {
|
||||
title?: string;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
const {
|
||||
title = "iten.pro | Engineering",
|
||||
description = "Portfolio und Projekte",
|
||||
} = Astro.props;
|
||||
---
|
||||
|
||||
<!doctype html>
|
||||
<html lang="de" class="scroll-smooth">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>{title}</title>
|
||||
<meta name="description" content={description} />
|
||||
</head>
|
||||
<body class="flex flex-col min-h-screen">
|
||||
<Header />
|
||||
|
||||
<main class="flex-grow w-full">
|
||||
<slot />
|
||||
</main>
|
||||
|
||||
<Footer />
|
||||
</body>
|
||||
</html>
|
||||
10
src/layouts/PageLayout.astro
Normal file
10
src/layouts/PageLayout.astro
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
import MainLayout from './MainLayout.astro';
|
||||
const { frontmatter } = Astro.props;
|
||||
---
|
||||
<MainLayout title={frontmatter.title}>
|
||||
<article class="prose prose-slate mx-auto bg-white p-4 mt-6 mb-16 shadow-lg">
|
||||
<h1>{frontmatter.title}</h1>
|
||||
<slot />
|
||||
</article>
|
||||
</MainLayout>
|
||||
18
src/pages/403.astro
Normal file
18
src/pages/403.astro
Normal file
@@ -0,0 +1,18 @@
|
||||
---
|
||||
// src/pages/403.astro
|
||||
import MainLayout from "../layouts/MainLayout.astro";
|
||||
import ErrorComponent from "../components/ErrorComponent.astro";
|
||||
---
|
||||
|
||||
<MainLayout title={`Fehler 403 - Zugriff verweigert | iten.pro`}>
|
||||
<ErrorComponent title="403">
|
||||
<span class="font-semibold">
|
||||
Du hast keinen Zugriff auf diese Seite.
|
||||
</span>
|
||||
<br />
|
||||
Du kannst versuchen, dich anzumelden, um Zugriff zu erhalten, oder du hast
|
||||
vielleicht nicht die erforderlichen Berechtigungen, um diese Seite zu sehen.
|
||||
In jedem Fall tut es mir leid, dass du hier gelandet bist. Vielleicht findest
|
||||
du ja auf der Startseite, was du suchst?
|
||||
</ErrorComponent>
|
||||
</MainLayout>
|
||||
18
src/pages/404.astro
Normal file
18
src/pages/404.astro
Normal file
@@ -0,0 +1,18 @@
|
||||
---
|
||||
// src/pages/404.astro
|
||||
import MainLayout from "../layouts/MainLayout.astro";
|
||||
import ErrorComponent from "../components/ErrorComponent.astro";
|
||||
---
|
||||
|
||||
<MainLayout title={`Fehler 404 - Seite nicht gefunden | iten.pro`}>
|
||||
<ErrorComponent title="404">
|
||||
<span class="font-semibold"
|
||||
>Die angeforderte Seite konnte nicht gefunden werden.
|
||||
</span>
|
||||
<br />
|
||||
Das kann an einer Fehlprogrammierung meinerseits liegen oder an einem veralteten
|
||||
Link, der noch auf die alte Seite verweist. In jedem Fall tut es mir leid,
|
||||
dass du hier gelandet bist. Vielleicht findest du ja auf der Startseite, was
|
||||
du suchst?
|
||||
</ErrorComponent>
|
||||
</MainLayout>
|
||||
17
src/pages/500.astro
Normal file
17
src/pages/500.astro
Normal file
@@ -0,0 +1,17 @@
|
||||
---
|
||||
// src/pages/500.astro
|
||||
import MainLayout from "../layouts/MainLayout.astro";
|
||||
import ErrorComponent from "../components/ErrorComponent.astro";
|
||||
---
|
||||
|
||||
<MainLayout title={`Fehler 500 - Interner Serverfehler | iten.pro`}>
|
||||
<ErrorComponent title="500">
|
||||
<span class="font-semibold"
|
||||
>Es ist ein interner Serverfehler aufgetreten.
|
||||
</span>
|
||||
<br />
|
||||
Das kann an einer Fehlprogrammierung meinerseits liegen oder an einem vorübergehenden
|
||||
Problem auf dem Server. In jedem Fall tut es mir leid, dass du hier gelandet
|
||||
bist. Vielleicht findest du ja auf der Startseite, was du suchst?
|
||||
</ErrorComponent>
|
||||
</MainLayout>
|
||||
54
src/pages/datenschutz.md
Normal file
54
src/pages/datenschutz.md
Normal file
@@ -0,0 +1,54 @@
|
||||
---
|
||||
layout: ../layouts/PageLayout.astro
|
||||
title: "Datenschutzerklärung"
|
||||
---
|
||||
|
||||
Ich freue mich über Deinen Besuch auf meiner Internetseite iten.pro und dein Interesse an meinem Unternehmen.
|
||||
|
||||
Der Schutz Ihrer personenbezogenen Daten, wie z.B. Geburtsdatum, Name, Telefonnummer, Anschrift etc., ist uns ein wichtiges Anliegen. Der Zweck dieser Datenschutzerklärung besteht darin, Sie über die Bearbeitung Ihrer personenbezogenen Daten zu informieren, die wir bei einem Seitenbesuch von Ihnen sammeln.
|
||||
|
||||
## Inhaber
|
||||
Verantwortlicher für die Datenbearbeitung:
|
||||
|
||||
Eduard Iten\
|
||||
Haufen 234\
|
||||
9426 Lutzenberg\
|
||||
Schweiz\
|
||||
**E-Mail:** info@iten.pro\
|
||||
**Tel.:** +41 78 766 73 18
|
||||
|
||||
## Bereitstellung der Website und Erstellung von Logfiles
|
||||
Bei jedem Aufruf unserer Internetseite erfasst unser System automatisiert Daten und Informationen des jeweils abrufenden Gerätes.
|
||||
|
||||
**Folgende Daten werden erhoben:**
|
||||
* Informationen über den Browsertyp und die verwendete Version
|
||||
* Das Betriebssystem des Abrufgerätes
|
||||
* Hostname des zugreifenden Rechners
|
||||
* Die IP-Adresse des Abrufgerätes
|
||||
* Datum und Uhrzeit des Zugriffs
|
||||
* Websites und Ressourcen (Bilder, Dateien), die aufgerufen wurden
|
||||
* Referrer-Tracking (von welcher Seite Sie zu uns kamen)
|
||||
* Übertragene Datenmenge
|
||||
|
||||
Diese Daten werden in den Logfiles unseres Systems gespeichert. Eine Identifizierung einzelner Seitenbesucher findet nicht statt.
|
||||
|
||||
## Zweck der Datenbearbeitung
|
||||
Die vorübergehende Speicherung der Daten ist erforderlich, um eine Auslieferung der Website zu ermöglichen, die Kompatibilität sicherzustellen und zur Missbrauchsbekämpfung (z.B. Schutz vor Angriffen).
|
||||
|
||||
## Weitergabe an Dritte
|
||||
Wir behandeln Ihre Angaben vertraulich. Eine Weitergabe erfolgt nur an öffentliche Stellen oder Behörden, sofern gesetzliche Bestimmungen, gerichtliche Entscheidungen oder behördliche Anordnungen dies erfordern.
|
||||
|
||||
## Datensicherheit
|
||||
Ihre Daten werden durch technische und organisatorische Massnahmen vor dem Zugriff Dritter geschützt. Wir weisen darauf hin, dass bei der Kommunikation per E-Mail keine vollständige Datensicherheit gewährleistet werden kann.
|
||||
|
||||
## Ihre Rechte
|
||||
Sie haben im Rahmen des geltenden Datenschutzrechts (DSG) jederzeit folgende Rechte:
|
||||
* **Auskunft:** Sie können bestätigen lassen, ob wir Daten von Ihnen bearbeiten.
|
||||
* **Berichtigung:** Sie können die Korrektur unrichtiger Daten verlangen.
|
||||
* **Löschung:** Sie können die Löschung Ihrer Daten verlangen, sofern keine gesetzliche Aufbewahrungspflicht entgegensteht.
|
||||
* **Widerruf:** Erteilte Einwilligungen können Sie jederzeit widerrufen.
|
||||
|
||||
Bitte wenden Sie sich für die Ausübung Ihrer Rechte direkt an die oben genannte Kontaktadresse.
|
||||
|
||||
## Aufsichtsbehörde
|
||||
Wenn Sie glauben, dass die Bearbeitung Ihrer Daten gegen Datenschutzvorschriften verstösst, können Sie beim **Eidgenössischen Datenschutz- und Öffentlichkeitsbeauftragten (EDÖB)** eine Anzeige machen.
|
||||
17
src/pages/impressum.md
Normal file
17
src/pages/impressum.md
Normal file
@@ -0,0 +1,17 @@
|
||||
---
|
||||
layout: ../layouts/PageLayout.astro
|
||||
title: "Impressum"
|
||||
---
|
||||
|
||||
## Kontaktadresse
|
||||
Eduard Iten
|
||||
Haufen 234
|
||||
9426 Lutzenberg
|
||||
Schweiz
|
||||
**E-Mail:** info@iten.pro
|
||||
|
||||
## Vertretungsberechtigte Personen
|
||||
Eduard Iten, Inhaber
|
||||
|
||||
## Haftungsausschluss
|
||||
Der Autor übernimmt keinerlei Gewähr hinsichtlich der inhaltlichen Richtigkeit, Genauigkeit, Aktualität, Zuverlässigkeit und Vollständigkeit der Informationen...
|
||||
85
src/pages/index-test.astro
Normal file
85
src/pages/index-test.astro
Normal file
@@ -0,0 +1,85 @@
|
||||
---
|
||||
import MainLayout from "../layouts/MainLayout.astro";
|
||||
import Section from "../components/Section.astro";
|
||||
import PatternCode from "../components/PatternCode.astro";
|
||||
import PatternPCB from "../components/PatternPCB.astro";
|
||||
import PatternSystem from "../components/PatternSystem.astro";
|
||||
import { ACTION_QUERY_PARAMS } from "astro:actions";
|
||||
---
|
||||
|
||||
<MainLayout title="Engineering | iten.pro">
|
||||
<Section
|
||||
title="Hardware"
|
||||
subtitle="Low-Power Systeme, Embedded SoC & PCB-Design"
|
||||
themeColor="bg-lime-700"
|
||||
highlightColor="text-lime-200"
|
||||
>
|
||||
<div slot="background" class="w-full h-full">
|
||||
<PatternPCB fillColor="text-lime-800" />
|
||||
</div>
|
||||
<div class="prose prose-slate max-w-none">
|
||||
<p class="text-xl">
|
||||
Die physische Basis: Zuverlässige Hardware-Architekturen für intelligente und vernetzte Systeme.
|
||||
</p>
|
||||
<ul class="list-disc">
|
||||
<li>Design von Low-Power-<strong>Embedded-Systemen</strong> basierend auf <strong>ARM Cortex-M</strong> und <strong>RISC-V</strong> Architekturen.</li>
|
||||
<li><strong>PCB-Design</strong> (KiCad) mit Fokus auf kompakte IoT-Lösungen und EMV-gerechtes Layout.</li>
|
||||
<li>Rapid <strong>Prototyping</strong> und Evaluierung mit gängigen SoCs (STM32, RP2040, ESP32, Nordic nRF52).</li>
|
||||
<li><strong>Power Management</strong> & Ladeelektronik, inklusive Schutzbeschaltungen für Li-Ion-Akkusysteme.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</Section>
|
||||
|
||||
<Section
|
||||
title="Software"
|
||||
subtitle="Embedded Software & RTOS"
|
||||
themeColor="bg-indigo-800"
|
||||
highlightColor="text-indigo-200"
|
||||
>
|
||||
<div slot="background" class="w-full h-full">
|
||||
<PatternCode fillColor="text-indigo-700" />
|
||||
</div>
|
||||
<div class="prose prose-slate max-w-none">
|
||||
<p class="text-xl">
|
||||
Hardwarenahe Softwareentwicklung. Von der Bare-Metal-Firmware bis zur RTOS-Integration – optimiert auf Performance und minimalen Energieverbrauch.
|
||||
</p>
|
||||
<ul class="list-disc">
|
||||
<li><strong>Firmware-Entwicklung</strong> in C/C++ für ressourcenbeschränkte Mikrocontroller.</li>
|
||||
<li>Einsatz von <strong>Echtzeitbetriebssystemen (RTOS)</strong>, spezialisiert auf das Zephyr Project.</li>
|
||||
<li>Anbindung von Sensorik und Aktorik über gängige <strong>Kommunikationsbusse</strong> (SPI, I2C, UART, CAN, Ethernet).</li>
|
||||
<li>Systematisches <strong>Debugging</strong> und Profiling zur Engpassanalyse in Embedded-Systemen.</li>
|
||||
<li>Implementierung <strong>poweroptimierter Software-Architekturen</strong> für batteriebetriebene Endgeräte.</li>
|
||||
<li><strong>Drahtlose Kommunikation & IoT-Stacks:</strong> BLE, LoRaWAN, OpenThread, Zigbee, WiFi sowie IP-basierte Protokolle (MQTT, WebSockets).</li>
|
||||
</ul>
|
||||
</div>
|
||||
</Section>
|
||||
|
||||
<Section
|
||||
title="Systems"
|
||||
subtitle="End-to-End Solutions"
|
||||
themeColor="bg-fuchsia-800"
|
||||
highlightColor="text-fuchsia-200"
|
||||
id="systems"
|
||||
>
|
||||
<div slot="background" class="w-full h-full">
|
||||
<PatternSystem fillColor="text-fuchsia-600" />
|
||||
</div>
|
||||
|
||||
<div class="prose prose-slate max-w-none">
|
||||
<p class="text-xl">
|
||||
Integration von Hardware und Software zu skalierbaren Gesamtsystemen. Vom Sensor über das Edge-Gateway bis zur Visualisierung.
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>System-Architektur:</strong> Konzeption modularer, sicherer und wartbarer End-to-End Lösungen.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Connectivity & Routing:</strong> Zuverlässige Datenübertragung über LoRaWAN, IEEE 802.15.4, Feldbusse und MQTT-Broker.
|
||||
</li>
|
||||
<li>
|
||||
<strong>User Interfaces & Visualisierung:</strong> Entwicklung responsiver Dashboards und Web-UIs mit modernen Frameworks (Astro, Svelte).
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</Section>
|
||||
</MainLayout>
|
||||
@@ -1,33 +1,28 @@
|
||||
---
|
||||
import '../styles/global.css'
|
||||
import MainLayout from "../layouts/MainLayout.astro";
|
||||
---
|
||||
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>Engineering | Under Construction</title>
|
||||
</head>
|
||||
<body class="bg-gray-900 text-gray-200 h-screen flex flex-col items-center justify-center p-6 text-center font-mono">
|
||||
|
||||
<div class="max-w-3xl">
|
||||
<h1 class="text-4xl md:text-6xl font-bold mb-6 text-blue-400">
|
||||
Error 404: Motivation Not Found
|
||||
</h1>
|
||||
|
||||
<p class="text-lg md:text-2xl text-gray-400 mb-8 leading-relaxed">
|
||||
Das theoretische Konzept für diese Website ist absolut fehlerfrei und auf dem Papier bereits ein Meisterwerk. <br />
|
||||
<span class="text-gray-500 text-sm mt-4 block">
|
||||
// Status: Warte auf die praktische Umsetzung (voraussichtliche Dauer: NaN)
|
||||
</span>
|
||||
</p>
|
||||
|
||||
<div class="flex justify-center space-x-2 mt-8">
|
||||
<div class="w-3 h-3 bg-blue-500 rounded-full animate-bounce" style="animation-delay: 0s"></div>
|
||||
<div class="w-3 h-3 bg-blue-500 rounded-full animate-bounce" style="animation-delay: 0.2s"></div>
|
||||
<div class="w-3 h-3 bg-blue-500 rounded-full animate-bounce" style="animation-delay: 0.4s"></div>
|
||||
</div>
|
||||
<MainLayout title="Home | iten.pro">
|
||||
<div class="flex flex-col items-center justify-center min-h-[70vh] px-6">
|
||||
<div class="max-w-2xl">
|
||||
<h1 class="text-4xl font-bold font-mono mb-4">
|
||||
Error 404: Motivation Not Found
|
||||
</h1>
|
||||
<p class="text-lg leading-relaxed font-mono">
|
||||
Das theoretische Konzept für diese Website ist absolut
|
||||
fehlerfrei und auf dem Papier bereits ein Meisterwerk. Leider
|
||||
hat die Umsetzung in der Praxis einige unerwartete
|
||||
Herausforderungen mit sich gebracht, die zu diesem bedauerlichen
|
||||
Ergebnis geführt haben.
|
||||
<br class="mb-3" />
|
||||
Es scheint, als ob die Motivation, die für die Entwicklung dieser
|
||||
Seite erforderlich ist, auf mysteriöse Weise verschwunden ist. Trotz
|
||||
aller Bemühungen, sie wiederzufinden, bleibt sie unauffindbar.
|
||||
<br class="mb-3" />
|
||||
Ich entschuldige mich aufrichtig für diese Unannehmlichkeit und hoffe,
|
||||
dass ich in Zukunft eine Lösung finden kann, um die Motivation zurückzubringen
|
||||
und diese Website zum Leben zu erwecken.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</MainLayout>
|
||||
|
||||
@@ -1 +1,18 @@
|
||||
@import "tailwindcss";
|
||||
@import "tailwindcss";
|
||||
@plugin "@tailwindcss/typography";
|
||||
|
||||
@theme {
|
||||
--color-header-bg: var(--color-slate-300);
|
||||
--color-nav-text: var(--color-slate-400);
|
||||
--color-nav-hover: var(--color-blue-400);
|
||||
--shadow-top: 0 -4px 6px -1px rgb(0 0 0 / 0.1), 0 -2px 4px -2px rgb(0 0 0 / 0.1);
|
||||
}
|
||||
|
||||
@layer base {
|
||||
body {
|
||||
@apply bg-slate-50 text-slate-700 antialiased;
|
||||
}
|
||||
}
|
||||
|
||||
@layer components {
|
||||
}
|
||||
18
src/utils/paths.ts
Normal file
18
src/utils/paths.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
// src/utils/paths.ts
|
||||
|
||||
// Wir greifen auf die Umgebungsvariable von Astro zu
|
||||
const base = import.meta.env.BASE_URL;
|
||||
|
||||
/**
|
||||
* Erstellt einen korrekten Pfad unter Berücksichtigung der Astro 'base' Konfiguration.
|
||||
* Verhindert doppelte Slashes und funktioniert in Dev, Test und Prod.
|
||||
*/
|
||||
export function getPath(path: string): string {
|
||||
// Entfernt den Slash am Ende der Base, falls vorhanden
|
||||
const normalizedBase = base.replace(/\/$/, '');
|
||||
|
||||
// Stellt sicher, dass der Pfad mit einem Slash beginnt
|
||||
const normalizedPath = path.startsWith('/') ? path : `/${path}`;
|
||||
|
||||
return `${normalizedBase}${normalizedPath}`;
|
||||
}
|
||||
Reference in New Issue
Block a user