Compare commits
21 Commits
6f3c61270a
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 47b971f5e3 | |||
| 83d45e161f | |||
| 796d236d79 | |||
| 63e2336c3b | |||
| 39c87726a2 | |||
| 7dbb374360 | |||
| 403e3310af | |||
| 8deac0dbec | |||
| 3e078d5344 | |||
| 35f152632e | |||
| f0bcaf45d0 | |||
| e46cd9a6b1 | |||
| 7992c211b5 | |||
| b399e31349 | |||
| 272321b19f | |||
| fda6206766 | |||
| f5445ece43 | |||
| 402ab0fbbb | |||
| fd5dc46b97 | |||
| b08ce97042 | |||
| 23b6490532 |
@@ -1,12 +1,12 @@
|
|||||||
// @ts-check
|
|
||||||
import { defineConfig } from 'astro/config';
|
import { defineConfig } from 'astro/config';
|
||||||
|
|
||||||
import tailwindcss from '@tailwindcss/vite';
|
import tailwindcss from '@tailwindcss/vite';
|
||||||
|
import icon from 'astro-icon';
|
||||||
|
|
||||||
// https://astro.build/config
|
// https://astro.build/config
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
site: process.env.ASTRO_SITE_URL || 'http://localhost:4321',
|
site: process.env.ASTRO_SITE_URL || 'http://localhost:4321',
|
||||||
base: process.env.ASTRO_BASE_PATH || '/',
|
base: process.env.ASTRO_BASE_PATH || '/',
|
||||||
|
integrations: [icon()],
|
||||||
vite: {
|
vite: {
|
||||||
plugins: [tailwindcss()]
|
plugins: [tailwindcss()]
|
||||||
}
|
}
|
||||||
|
|||||||
614
package-lock.json
generated
614
package-lock.json
generated
@@ -8,8 +8,10 @@
|
|||||||
"name": "iten.pro",
|
"name": "iten.pro",
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@iconify-json/tabler": "^1.2.33",
|
||||||
"@tailwindcss/vite": "^4.2.2",
|
"@tailwindcss/vite": "^4.2.2",
|
||||||
"astro": "^6.1.2",
|
"astro": "^6.1.2",
|
||||||
|
"astro-icon": "^1.1.5",
|
||||||
"tailwindcss": "^4.2.2"
|
"tailwindcss": "^4.2.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -19,6 +21,28 @@
|
|||||||
"node": ">=22.12.0"
|
"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": {
|
"node_modules/@astrojs/compiler": {
|
||||||
"version": "3.0.1",
|
"version": "3.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-3.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-3.0.1.tgz",
|
||||||
@@ -596,6 +620,107 @@
|
|||||||
"node": ">=18"
|
"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": {
|
"node_modules/@img/colour": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
|
||||||
@@ -1062,6 +1187,18 @@
|
|||||||
"url": "https://opencollective.com/libvips"
|
"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": {
|
"node_modules/@jridgewell/gen-mapping": {
|
||||||
"version": "0.3.13",
|
"version": "0.3.13",
|
||||||
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
|
||||||
@@ -1878,18 +2015,50 @@
|
|||||||
"@types/unist": "*"
|
"@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": {
|
"node_modules/@types/unist": {
|
||||||
"version": "3.0.3",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
|
||||||
"integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
|
"integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
|
||||||
"license": "MIT"
|
"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": {
|
"node_modules/@ungap/structured-clone": {
|
||||||
"version": "1.3.0",
|
"version": "1.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
|
||||||
"integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
|
"integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
|
||||||
"license": "ISC"
|
"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": {
|
"node_modules/anymatch": {
|
||||||
"version": "3.1.3",
|
"version": "3.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
|
||||||
@@ -2018,6 +2187,17 @@
|
|||||||
"sharp": "^0.34.0"
|
"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": {
|
"node_modules/axobject-query": {
|
||||||
"version": "4.1.0",
|
"version": "4.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
|
||||||
@@ -2043,6 +2223,15 @@
|
|||||||
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
|
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
|
||||||
"license": "ISC"
|
"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": {
|
"node_modules/ccount": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
|
||||||
@@ -2083,6 +2272,48 @@
|
|||||||
"url": "https://github.com/sponsors/wooorm"
|
"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": {
|
"node_modules/chokidar": {
|
||||||
"version": "5.0.0",
|
"version": "5.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
|
||||||
@@ -2098,6 +2329,15 @@
|
|||||||
"url": "https://paulmillr.com/funding/"
|
"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": {
|
"node_modules/ci-info": {
|
||||||
"version": "4.4.0",
|
"version": "4.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz",
|
||||||
@@ -2150,6 +2390,12 @@
|
|||||||
"node": ">= 18"
|
"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": {
|
"node_modules/cookie": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
|
||||||
@@ -2435,6 +2681,28 @@
|
|||||||
"node": ">=4"
|
"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": {
|
"node_modules/enhanced-resolve": {
|
||||||
"version": "5.20.1",
|
"version": "5.20.1",
|
||||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz",
|
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz",
|
||||||
@@ -2531,12 +2799,47 @@
|
|||||||
"integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
|
"integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
|
||||||
"license": "MIT"
|
"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": {
|
"node_modules/extend": {
|
||||||
"version": "3.0.2",
|
"version": "3.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
|
||||||
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
|
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
|
||||||
"license": "MIT"
|
"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": {
|
"node_modules/fdir": {
|
||||||
"version": "6.5.0",
|
"version": "6.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
|
||||||
@@ -2598,12 +2901,39 @@
|
|||||||
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
"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": {
|
"node_modules/github-slugger": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
|
||||||
"integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==",
|
"integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==",
|
||||||
"license": "ISC"
|
"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": {
|
"node_modules/graceful-fs": {
|
||||||
"version": "4.2.11",
|
"version": "4.2.11",
|
||||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
||||||
@@ -2820,12 +3150,55 @@
|
|||||||
"url": "https://github.com/sponsors/wooorm"
|
"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": {
|
"node_modules/http-cache-semantics": {
|
||||||
"version": "4.2.0",
|
"version": "4.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
|
||||||
"integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
|
"integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
|
||||||
"license": "BSD-2-Clause"
|
"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": {
|
"node_modules/iron-webcrypto": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz",
|
||||||
@@ -2916,6 +3289,12 @@
|
|||||||
"js-yaml": "bin/js-yaml.js"
|
"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": {
|
"node_modules/lightningcss": {
|
||||||
"version": "1.32.0",
|
"version": "1.32.0",
|
||||||
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
|
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
|
||||||
@@ -3165,6 +3544,23 @@
|
|||||||
"url": "https://opencollective.com/parcel"
|
"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": {
|
"node_modules/longest-streak": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
|
||||||
@@ -4008,6 +4404,56 @@
|
|||||||
],
|
],
|
||||||
"license": "MIT"
|
"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": {
|
"node_modules/mrmime": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
|
||||||
@@ -4123,6 +4569,15 @@
|
|||||||
"integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==",
|
"integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==",
|
||||||
"license": "MIT"
|
"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": {
|
"node_modules/oniguruma-parser": {
|
||||||
"version": "0.12.1",
|
"version": "0.12.1",
|
||||||
"resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz",
|
"resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz",
|
||||||
@@ -4219,6 +4674,43 @@
|
|||||||
"url": "https://github.com/inikulin/parse5?sponsor=1"
|
"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": {
|
"node_modules/piccolore": {
|
||||||
"version": "0.1.3",
|
"version": "0.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz",
|
||||||
@@ -4243,6 +4735,17 @@
|
|||||||
"url": "https://github.com/sponsors/jonschlinkert"
|
"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": {
|
"node_modules/postcss": {
|
||||||
"version": "8.5.8",
|
"version": "8.5.8",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
|
||||||
@@ -4304,6 +4807,32 @@
|
|||||||
"url": "https://github.com/sponsors/wooorm"
|
"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": {
|
"node_modules/radix3": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz",
|
||||||
@@ -4594,6 +5123,12 @@
|
|||||||
"fsevents": "~2.3.2"
|
"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": {
|
"node_modules/sax": {
|
||||||
"version": "1.6.0",
|
"version": "1.6.0",
|
||||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz",
|
||||||
@@ -4774,6 +5309,22 @@
|
|||||||
"url": "https://opencollective.com/webpack"
|
"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": {
|
"node_modules/tiny-inflate": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
|
||||||
@@ -4879,6 +5430,22 @@
|
|||||||
"integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==",
|
"integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==",
|
||||||
"license": "MIT"
|
"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": {
|
"node_modules/unified": {
|
||||||
"version": "11.0.5",
|
"version": "11.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
|
||||||
@@ -5280,6 +5847,28 @@
|
|||||||
"url": "https://github.com/sponsors/wooorm"
|
"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": {
|
"node_modules/which-pm-runs": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz",
|
||||||
@@ -5289,12 +5878,27 @@
|
|||||||
"node": ">=4"
|
"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": {
|
"node_modules/xxhash-wasm": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz",
|
||||||
"integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==",
|
"integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==",
|
||||||
"license": "MIT"
|
"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": {
|
"node_modules/yargs-parser": {
|
||||||
"version": "22.0.0",
|
"version": "22.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
|
||||||
@@ -5304,6 +5908,16 @@
|
|||||||
"node": "^20.19.0 || ^22.12.0 || >=23"
|
"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": {
|
"node_modules/yocto-queue": {
|
||||||
"version": "1.2.2",
|
"version": "1.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
|
||||||
|
|||||||
@@ -12,8 +12,10 @@
|
|||||||
"astro": "astro"
|
"astro": "astro"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@iconify-json/tabler": "^1.2.33",
|
||||||
"@tailwindcss/vite": "^4.2.2",
|
"@tailwindcss/vite": "^4.2.2",
|
||||||
"astro": "^6.1.2",
|
"astro": "^6.1.2",
|
||||||
|
"astro-icon": "^1.1.5",
|
||||||
"tailwindcss": "^4.2.2"
|
"tailwindcss": "^4.2.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
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>
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
---
|
---
|
||||||
// src/components/Footer.astro
|
// src/components/Footer.astro
|
||||||
|
import { getPath } from '../utils/paths';
|
||||||
|
|
||||||
const currentYear = new Date().getFullYear();
|
const currentYear = new Date().getFullYear();
|
||||||
const startYear = 2026;
|
const startYear = 2026;
|
||||||
const displayYear = currentYear > startYear ? `${startYear}–${currentYear}` : startYear;
|
const displayYear = currentYear > startYear ? `${startYear}–${currentYear}` : startYear;
|
||||||
import { getPath } from '../utils/paths';
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<footer class="main-footer">
|
<footer class="main-footer">
|
||||||
@@ -20,3 +21,32 @@ import { getPath } from '../utils/paths';
|
|||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</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>
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
---
|
---
|
||||||
import Logo from './Logo.astro';
|
// src/components/Header.astro
|
||||||
|
import Logo from "./Logo.astro";
|
||||||
|
import { getPath } from "../utils/paths";
|
||||||
|
|
||||||
const pathname = new URL(Astro.request.url).pathname;
|
const pathname = new URL(Astro.request.url).pathname;
|
||||||
const currentPath = pathname.slice(1);
|
const currentPath = pathname.slice(1);
|
||||||
@@ -7,10 +9,10 @@ const currentPath = pathname.slice(1);
|
|||||||
|
|
||||||
<header class="main-header">
|
<header class="main-header">
|
||||||
<div class="header-container">
|
<div class="header-container">
|
||||||
<a href="/" class="group flex items-center gap-2">
|
<a href={getPath("/")} class="group flex items-center gap-2">
|
||||||
<Logo class="h-6 w-auto transition-colors" />
|
<Logo class="h-6 w-auto transition-colors" />
|
||||||
</a>
|
</a>
|
||||||
<!--
|
<!--
|
||||||
<nav>
|
<nav>
|
||||||
<ul class="nav-list">
|
<ul class="nav-list">
|
||||||
<li>
|
<li>
|
||||||
@@ -32,3 +34,24 @@ const currentPath = pathname.slice(1);
|
|||||||
</nav> -->
|
</nav> -->
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</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>
|
||||||
|
|||||||
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>
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
// src/layouts/MainLayout.astro
|
// src/layouts/MainLayout.astro
|
||||||
import Header from "../components/Header.astro";
|
import Header from "../components/Header.astro";
|
||||||
import Footer from "../components/Footer.astro";
|
import Footer from "../components/Footer.astro";
|
||||||
import '../styles/global.css';
|
import "../styles/global.css";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
title?: string;
|
title?: string;
|
||||||
@@ -26,7 +26,7 @@ const {
|
|||||||
<body class="flex flex-col min-h-screen">
|
<body class="flex flex-col min-h-screen">
|
||||||
<Header />
|
<Header />
|
||||||
|
|
||||||
<main class="flex-grow container mx-auto px-6 py-12">
|
<main class="flex-grow w-full">
|
||||||
<slot />
|
<slot />
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
---
|
---
|
||||||
import MainLayout from './MainLayout.astro';
|
import MainLayout from './MainLayout.astro';
|
||||||
import '../styles/global.css';
|
|
||||||
const { frontmatter } = Astro.props;
|
const { frontmatter } = Astro.props;
|
||||||
---
|
---
|
||||||
<MainLayout title={frontmatter.title}>
|
<MainLayout title={frontmatter.title}>
|
||||||
<article class="prose prose-slate mx-auto ">
|
<article class="prose prose-slate mx-auto bg-white p-4 mt-6 mb-16 shadow-lg">
|
||||||
<h1 class="text-3xl font-bold mb-8">{frontmatter.title}</h1>
|
<h1>{frontmatter.title}</h1>
|
||||||
<slot />
|
<slot />
|
||||||
</article>
|
</article>
|
||||||
</MainLayout>
|
</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>
|
||||||
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>
|
||||||
@@ -3,21 +3,25 @@ import MainLayout from "../layouts/MainLayout.astro";
|
|||||||
---
|
---
|
||||||
|
|
||||||
<MainLayout title="Home | iten.pro">
|
<MainLayout title="Home | iten.pro">
|
||||||
<div class="flex flex-col items-center justify-center">
|
<div class="flex flex-col items-center justify-center min-h-[70vh] px-6">
|
||||||
<div class="width-md">
|
<div class="max-w-2xl">
|
||||||
<h1 class="text-4xl font-bold text-center mb-4">Error 404: Motivation Not Found</h1>
|
<h1 class="text-4xl font-bold font-mono mb-4">
|
||||||
<p class="font-md text-lg">
|
Error 404: Motivation Not Found
|
||||||
|
</h1>
|
||||||
|
<p class="text-lg leading-relaxed font-mono">
|
||||||
Das theoretische Konzept für diese Website ist absolut
|
Das theoretische Konzept für diese Website ist absolut
|
||||||
fehlerfrei und auf dem Papier bereits ein Meisterwerk. Leider
|
fehlerfrei und auf dem Papier bereits ein Meisterwerk. Leider
|
||||||
hat die Umsetzung in der Praxis einige unerwartete
|
hat die Umsetzung in der Praxis einige unerwartete
|
||||||
Herausforderungen mit sich gebracht, die zu diesem bedauerlichen
|
Herausforderungen mit sich gebracht, die zu diesem bedauerlichen
|
||||||
Ergebnis geführt haben. Es scheint, als ob die Motivation, die
|
Ergebnis geführt haben.
|
||||||
für die Entwicklung dieser Seite erforderlich ist, auf
|
<br class="mb-3" />
|
||||||
mysteriöse Weise verschwunden ist. Trotz aller Bemühungen, sie
|
Es scheint, als ob die Motivation, die für die Entwicklung dieser
|
||||||
wiederzufinden, bleibt sie unauffindbar. Wir entschuldigen uns
|
Seite erforderlich ist, auf mysteriöse Weise verschwunden ist. Trotz
|
||||||
aufrichtig für diese Unannehmlichkeit und hoffen, dass wir in
|
aller Bemühungen, sie wiederzufinden, bleibt sie unauffindbar.
|
||||||
Zukunft eine Lösung finden können, um die Motivation
|
<br class="mb-3" />
|
||||||
zurückzubringen und diese Website zum Leben zu erwecken.
|
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>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
@plugin "@tailwindcss/typography";
|
@plugin "@tailwindcss/typography";
|
||||||
|
|
||||||
@theme {
|
@theme {
|
||||||
--color-header-bg: var(--color-slate-200);
|
--color-header-bg: var(--color-slate-300);
|
||||||
--color-nav-text: var(--color-slate-400);
|
--color-nav-text: var(--color-slate-400);
|
||||||
--color-nav-hover: var(--color-blue-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);
|
--shadow-top: 0 -4px 6px -1px rgb(0 0 0 / 0.1), 0 -2px 4px -2px rgb(0 0 0 / 0.1);
|
||||||
@@ -15,43 +15,4 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
@layer components {
|
@layer components {
|
||||||
|
|
||||||
/* Der Container des Headers */
|
|
||||||
.main-header {
|
|
||||||
@apply sticky top-0 z-50 w-full bg-linear-to-b from-white to-header-bg 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
.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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user