diff --git a/astro.config.mjs b/astro.config.mjs index a1b91b79d..c907fe6de 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,3 +1,4 @@ +import mdx from '@astrojs/mdx'; import { defineConfig } from 'astro/config'; import sitemap from '@astrojs/sitemap'; @@ -5,16 +6,24 @@ import sitemap from '@astrojs/sitemap'; // https://astro.build/config export default defineConfig({ site: 'https://mh-photography.com', + i18n: { + locales: ['de', 'en', 'es', 'fr'], + defaultLocale: 'en', + routing: { + prefixDefaultLocale: false, + }, + }, integrations: [ + mdx({}), sitemap({ i18n: { - defaultLocale: 'en', // All urls that don't contain `es` or `fr` after `https://stargazers.club/` will be treated as default locale, i.e. `en` locales: { de: 'de', en: 'en', // The `defaultLocale` value must present in `locales` keys es: 'es', fr: 'fr', }, + defaultLocale: 'en', }, filter: (url) => { return !url.startsWith('https://mh-photography.com/en/'); diff --git a/package-lock.json b/package-lock.json index 82950e252..5217cc95d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "2.8.0", "license": "LICENSE", "dependencies": { + "@astrojs/mdx": "^4.3.0", "@astrojs/sitemap": "^3.4.0", "@fontsource-variable/noto-serif-display": "^5.2.7", "@fontsource/caveat": "^5.2.5", @@ -111,6 +112,42 @@ "vfile": "^6.0.3" } }, + "node_modules/@astrojs/mdx": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.0.tgz", + "integrity": "sha512-OGX2KvPeBzjSSKhkCqrUoDMyzFcjKt5nTE5SFw3RdoLf0nrhyCXBQcCyclzWy1+P+XpOamn+p+hm1EhpCRyPxw==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.2", + "@mdx-js/mdx": "^3.1.0", + "acorn": "^8.14.1", + "es-module-lexer": "^1.6.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "kleur": "^4.1.5", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.4", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@astrojs/mdx/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, "node_modules/@astrojs/prism": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz", @@ -6209,6 +6246,60 @@ "dev": true, "optional": true }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", + "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@mdx-js/mdx/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7767,6 +7858,12 @@ "@types/unist": "*" } }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, "node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", @@ -8254,7 +8351,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -8526,6 +8622,15 @@ "node": ">=4" } }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, "node_modules/astro": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/astro/-/astro-5.8.0.tgz", @@ -9779,6 +9884,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -10196,6 +10311,16 @@ "node": ">=6" } }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -11581,6 +11706,56 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==" }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-estree/node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js/node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/esbuild": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", @@ -12063,6 +12238,124 @@ "node": ">=4.0" } }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx/node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js/node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/estree-util-to-js/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit/node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -13161,6 +13454,53 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree/node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/hast-util-to-estree/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/hast-util-to-html": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", @@ -13194,6 +13534,43 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/hast-util-to-parse5": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", @@ -13763,6 +14140,12 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, "node_modules/into-stream": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz", @@ -13828,16 +14211,40 @@ "url": "https://github.com/sponsors/brc-dd" } }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "devOptional": true + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "devOptional": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "optional": true, "dependencies": { @@ -13889,6 +14296,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-docker": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", @@ -13933,6 +14350,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-inside-container": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", @@ -15051,6 +15478,18 @@ "node": ">=6" } }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/markdown-table": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", @@ -15265,6 +15704,110 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression/node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm/node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/mdast-util-phrasing": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", @@ -15588,6 +16131,108 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/micromark-factory-destination": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", @@ -15631,6 +16276,33 @@ "micromark-util-types": "^2.0.0" } }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, "node_modules/micromark-factory-space": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", @@ -15830,6 +16502,31 @@ } ] }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", @@ -20261,6 +20958,31 @@ "node": ">=6" } }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -22396,6 +23118,70 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.0.tgz", + "integrity": "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -22541,6 +23327,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/rehype-stringify": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", @@ -22573,6 +23374,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-mdx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.0.tgz", + "integrity": "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-parse": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", @@ -24081,6 +24896,24 @@ "url": "https://github.com/sponsors/Borewit" } }, + "node_modules/style-to-js": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz", + "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.8" + } + }, + "node_modules/style-to-object": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, "node_modules/stylehacks": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.5.tgz", @@ -25059,6 +25892,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-remove-position": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", diff --git a/package.json b/package.json index 0c82fff94..9939f661a 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "git:pre-push": "npm run build && npm run test" }, "dependencies": { + "@astrojs/mdx": "^4.3.0", "@astrojs/sitemap": "^3.4.0", "@fontsource-variable/noto-serif-display": "^5.2.7", "@fontsource/caveat": "^5.2.5", diff --git a/public/assets/awards/bodas-award.png b/public/assets/awards/bodas-award.png new file mode 100644 index 000000000..9d0842556 Binary files /dev/null and b/public/assets/awards/bodas-award.png differ diff --git a/public/assets/awards/wezoree.png b/public/assets/awards/wezoree.png new file mode 100644 index 000000000..f8b6a2ad8 Binary files /dev/null and b/public/assets/awards/wezoree.png differ diff --git a/public/assets/partners/casa-miralles.png b/public/assets/partners/casa-miralles.png new file mode 100644 index 000000000..d53c04c4e Binary files /dev/null and b/public/assets/partners/casa-miralles.png differ diff --git a/public/assets/partners/isla-de-gracia.png b/public/assets/partners/isla-de-gracia.png new file mode 100644 index 000000000..3f027f313 Binary files /dev/null and b/public/assets/partners/isla-de-gracia.png differ diff --git a/public/assets/partners/maison-blanche.png b/public/assets/partners/maison-blanche.png new file mode 100644 index 000000000..f8162bacc Binary files /dev/null and b/public/assets/partners/maison-blanche.png differ diff --git a/public/assets/partners/maison-visavis.png b/public/assets/partners/maison-visavis.png new file mode 100644 index 000000000..bc559f0bf Binary files /dev/null and b/public/assets/partners/maison-visavis.png differ diff --git a/public/assets/partners/ps.png b/public/assets/partners/ps.png new file mode 100644 index 000000000..c9b6f9ed4 Binary files /dev/null and b/public/assets/partners/ps.png differ diff --git a/src/components/LazyYouTube.astro b/src/components/LazyYouTube.astro new file mode 100644 index 000000000..51eae4104 --- /dev/null +++ b/src/components/LazyYouTube.astro @@ -0,0 +1,66 @@ +--- +const { id, title } = Astro.props; + +// Extract video ID from full YouTube share link or just use the ID +function getVideoId(input) { + if (!input) return ''; + // If input is a full URL, extract the ID + const match = input.match(/(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=))([\w-]{11})/); + return match ? match[1] : input; +} +const videoId = getVideoId(id); +--- + +
+ + + + {`Thumbnail + + +
+ + diff --git a/src/components/Navigation.astro b/src/components/Navigation.astro index d7423f6bb..2db3fd6bd 100644 --- a/src/components/Navigation.astro +++ b/src/components/Navigation.astro @@ -14,14 +14,14 @@ const translatePath = useTranslatedPath(lang); diff --git a/src/content.config.ts b/src/content.config.ts new file mode 100644 index 000000000..526d28939 --- /dev/null +++ b/src/content.config.ts @@ -0,0 +1,11 @@ +// 1. Import utilities from `astro:content` +import { defineCollection, z } from 'astro:content'; + +// 2. Import loader(s) +import { glob } from 'astro/loaders'; + +// 3. Define your collection(s) +const pages = defineCollection({ loader: glob({ pattern: '**/*.mdx', base: './src/content/pages' }) }); + +// 4. Export a single `collections` object to register your collection(s) +export const collections = { pages }; diff --git a/src/content/pages/about.mdx b/src/content/pages/about.mdx new file mode 100644 index 000000000..5533f0455 --- /dev/null +++ b/src/content/pages/about.mdx @@ -0,0 +1,28 @@ + + + + + Manual Hamel, photographer + + +# Hi, I'm Manuel + +A passionate wedding, event, family, portrait, and editorial photographer and videographer. + +Each photograph is much more to me than just pressing a button and capturing an image. It is an art that allows me to capture emotions, immortalize stories, and create authentic connections. + +I want you to feel comfortable in front of the camera and enjoy every moment we share. Because not only will I be your photographer, but when we work together, I will also be the friend who brings out your best side. For that, we will create a safe and trusting space in which you not only have fun and be yourself in front of the camera, but I will also guide you to a relaxed and pressure-free atmosphere. + +You don't need to be a professional model to look amazing in your photos; I will be behind the lens to highlight the best in you. I believe that trust and empathy are key to achieving natural and authentic photographs. That's why each photo session is unique, just like you and the people who accompany you. I love getting to know each client, listening to their stories, and capturing the essence of who they are. + +I will not only be attentive to the most important shots but also to those small details and gestures that make that moment unique. I know how valuable memories are and the power that photographs have to evoke emotions and transport us in time. That's why I put all my heart and talent into every image I take. If you are looking for a photographer who captures real and authentic moments, I invite you to explore my portfolio and discover my style. + +I am looking forward to being a part of your story and creating amazing photos together. Don't hesitate to contact me to discuss your ideas, answer your questions, or book your photo session or event. + +I hope to meet you soon and have the opportunity to work with you. diff --git a/src/content/pages/contact.mdx b/src/content/pages/contact.mdx new file mode 100644 index 000000000..03ffb2f6a --- /dev/null +++ b/src/content/pages/contact.mdx @@ -0,0 +1,3 @@ +import Contact from '../../components/Contact.astro'; + + diff --git a/src/content/pages/de/contact.mdx b/src/content/pages/de/contact.mdx new file mode 100644 index 000000000..f7d0705c7 --- /dev/null +++ b/src/content/pages/de/contact.mdx @@ -0,0 +1,3 @@ +import Contact from '../../../components/Contact.astro'; + + diff --git a/src/content/pages/de/index.mdx b/src/content/pages/de/index.mdx new file mode 100644 index 000000000..46cb1e66f --- /dev/null +++ b/src/content/pages/de/index.mdx @@ -0,0 +1,38 @@ +# Ein bisschen über mich + +
+ + + + Manual Hamel, photographer + +
+ I really believe there are things nobody would see if I didn't photograph themDiane Arbus +
+
+ +Ein leidenschaftlicher Fotograf und Videograf für Hochzeiten, Veranstaltungen, Familien, Porträts und Editorials. + +Jedes Foto bedeutet für mich viel mehr als einfach nur auf einen Knopf zu drücken und ein Bild aufzunehmen. Es ist die Kunst, Emotionen einzufangen, Geschichten unsterblich zu machen und authentische Verbindungen zu schaffen. + +Ich möchte, dass Sie sich vor der Kamera wohl fühlen und jeden Moment, den wir teilen, genießen. Denn ich werde nicht nur Ihr Fotograf sein, sondern wenn wir zusammenarbeiten, werde ich auch der Freund sein, der Ihre beste Seite zum Vorschein bringt. Dafür schaffen wir einen sicheren und vertrauensvollen Raum, in dem Sie nicht nur Spaß haben und vor der Kamera Sie selbst sein können, sondern ich werde Sie auch dabei unterstützen, eine entspannte und druckfreie Atmosphäre zu schaffen. + +Sie müssen kein professionelles Model sein, um auf Ihren Fotos großartig auszusehen; ich werde hinter der Linse stehen, um das Beste in Ihnen hervorzuheben. Ich glaube, dass Vertrauen und Empathie der Schlüssel sind, um natürliche und authentische Fotografien zu erreichen. + +Deshalb ist jede Fotosession einzigartig, genauso wie Sie und die Menschen, die Sie begleiten. Ich liebe es, jeden Kunden kennenzulernen, ihre Geschichten zu hören und die Essenz dessen einzufangen, wer sie sind. Ich werde nicht nur auf die wichtigsten Aufnahmen achten, sondern auch auf die kleinen Details und Gesten, die diesen Moment einzigartig machen. Ich weiß, wie wertvoll Erinnerungen sind und welche Kraft Fotos haben, um Emotionen zu wecken und uns in die Vergangenheit zu versetzen. Deshalb stecke ich mein ganzes Herz und Talent in jedes Bild, das ich aufnehme. Wenn Sie einen Fotografen suchen, der echte und authentische Momente einfängt, lade ich Sie ein, mein Portfolio zu erkunden und meinen Stil zu entdecken. + +Ich freue mich darauf, ein Teil Ihrer Geschichte zu sein und gemeinsam erstaunliche Fotos zu kreieren. Zögern Sie nicht, mich zu kontaktieren, um Ihre Ideen zu besprechen, Ihre Fragen zu beantworten oder Ihre Fotosession oder Veranstaltung zu buchen. + +Ich hoffe, Sie bald kennenzulernen und die Gelegenheit zu haben, mit Ihnen zusammenzuarbeiten. + +## Suchen Sie einen Fotografen? Dann möchte ich Sie kennenlernen. + + + Ich möchte, dass du mein Fotograf bist, Manu. + diff --git a/src/content/pages/de/photos.mdx b/src/content/pages/de/photos.mdx new file mode 100644 index 000000000..d44f0922d --- /dev/null +++ b/src/content/pages/de/photos.mdx @@ -0,0 +1,67 @@ +
+

Fotos

+ +

Hochzeiten

+ + + + + +
+ +

Menschen

+ + + + + +
+ +

Familien

+ + + + + +
+ +

Business

+ + + + + +
+ +

Reisen

+ + + + + +
+
diff --git a/src/content/pages/de/videos.mdx b/src/content/pages/de/videos.mdx new file mode 100644 index 000000000..2ce439dc5 --- /dev/null +++ b/src/content/pages/de/videos.mdx @@ -0,0 +1,112 @@ +
+

Love in Motion: Hochzeitsvideografie enthüllt

+

+ Erkunde die Kunst, geliebte Momente unsterblich zu machen. Mein Ziel ist es, jede Emotion und jedes Detail + einzufangen und deinen besonderen Tag in ein zeitloses filmisches Meisterwerk zu verwandeln. Ich glaube an mehr als + nur das Aufzeichnen von Ereignissen - wir gestalten filmische Geschichten, die die Essenz deiner Liebe einfangen, + und widmen uns der Bewahrung der Emotionen, des Lachens und der Tränen, die deinen Tag wirklich einzigartig machen. + So kannst du die Magie immer wieder erleben, wenn du auf Play drückst. +

+ {/* add param `?rel=0` to src to avoid related content at the end of the video (https://developers.google.com/youtube/player_parameters#rel) */} +
+ + + + + + + + + +
+
diff --git a/src/content/pages/es/contact.mdx b/src/content/pages/es/contact.mdx new file mode 100644 index 000000000..f7d0705c7 --- /dev/null +++ b/src/content/pages/es/contact.mdx @@ -0,0 +1,3 @@ +import Contact from '../../../components/Contact.astro'; + + diff --git a/src/content/pages/es/index.mdx b/src/content/pages/es/index.mdx new file mode 100644 index 000000000..93d19a99d --- /dev/null +++ b/src/content/pages/es/index.mdx @@ -0,0 +1,38 @@ +# Un poco sobre mí + +
+ + + + Manual Hamel, photographer + +
+ I really believe there are things nobody would see if I didn't photograph themDiane Arbus +
+
+ +Un apasionado fotógrafo y videógrafo de bodas, eventos, familias, retratos y editoriales. + +Cada fotografía es para mí mucho más que presionar un botón y capturar una imagen. Es el arte que permite captar emociones, inmortalizar historias y crear conexiones auténticas. + +Quiero que sientas comodidad al estar frente a la cámara y disfrutes de cada momento que compartimos. Porque no solo voy a ser tu fotógrafo, cuando trabajemos juntos, seré también el amigo, que te saca tu mejor lado. Para eso crearemos un espacio seguro y de confianza en el que no solo te diviertas y serás tú mismo frente a la cámara, te guiaré para que sea un ambiente relajado y sin presión. No hace falta que seas un modelo profesional para que te veas increíble en tus fotos, yo estaré detrás del lente para resaltar lo mejor de ti. Creo que la confianza y la empatía son clave para lograr fotografías naturales y auténticas. + +Por eso cada sesión fotográfica es única, como tú y las personas que te acompañan. Me encanta conocer a cada cliente, escuchar sus historias y capturar la esencia de quienes son. No solo estaré atento para las tomas más importantes, sino también a esos pequeños detalles y gestos que hacen de ese momento único. Sé lo valioso que son los recuerdos y el poder que tienen las fotografías para despertar emociones y transportarnos en el tiempo. Por eso, pongo todo mi corazón y mi talento en cada imagen que tomo. + +Si buscas un fotógrafo que capture momentos reales y auténticos, te invito a explorar mi portafolio y descubrir mi estilo. Estoy deseando ser parte de tu historia y crear fotos increíbles juntos. + +No dudes en contactarme para hablar de tus ideas, resolver tus dudas o reservar tu sesión fotográfica o tu evento. + +Espero conocerte pronto y tener la oportunidad de trabajar contigo. + +## ¿Buscas fotógrafo? Te quiero conocer. + + + Quiero que seas mi fotógrafo Manu. + diff --git a/src/content/pages/es/photos.mdx b/src/content/pages/es/photos.mdx new file mode 100644 index 000000000..605401717 --- /dev/null +++ b/src/content/pages/es/photos.mdx @@ -0,0 +1,67 @@ +
+

Fotos

+ +

Bodas

+ + + + + +
+ +

Personas

+ + + + + +
+ +

Familias

+ + + + + +
+ +

Negocios

+ + + + + +
+ +

Viajes

+ + + + + +
+
diff --git a/src/content/pages/es/videos.mdx b/src/content/pages/es/videos.mdx new file mode 100644 index 000000000..c1e160a9b --- /dev/null +++ b/src/content/pages/es/videos.mdx @@ -0,0 +1,111 @@ +
+

Love in Motion: Desvelando la Videografía de Bodas

+

+ Explora el arte de inmortalizar momentos queridos. Mi objetivo es capturar cada emoción y detalle, transformando tu + día especial en una obra maestra cinematográfica atemporal. Creo en más que simplemente grabar eventos: creamos + historias cinematográficas que capturan la esencia de tu amor, dedicados a preservar las emociones, risas y lágrimas + que hacen que tu día sea verdaderamente único, permitiéndote revivir la magia cada vez que le das al play. +

+ {/* add param `?rel=0` to src to avoid related content at the end of the video (https://developers.google.com/youtube/player_parameters#rel) */} +
+ + + + + + + + + +
+
diff --git a/src/content/pages/fr/contact.mdx b/src/content/pages/fr/contact.mdx new file mode 100644 index 000000000..f7d0705c7 --- /dev/null +++ b/src/content/pages/fr/contact.mdx @@ -0,0 +1,3 @@ +import Contact from '../../../components/Contact.astro'; + + diff --git a/src/content/pages/fr/index.mdx b/src/content/pages/fr/index.mdx new file mode 100644 index 000000000..520979937 --- /dev/null +++ b/src/content/pages/fr/index.mdx @@ -0,0 +1,38 @@ +# Quelques mots à mon sujet + +
+ + + + Manual Hamel, photographer + +
+ I really believe there are things nobody would see if I didn't photograph themDiane Arbus +
+
+ +Un photographe et vidéaste passionné de mariages, d'événements, de familles, de portraits et d'éditoriaux. + +Chaque photographie est bien plus pour moi que simplement appuyer sur un bouton et capturer une image. C'est un art qui me permet de saisir des émotions, d'immortaliser des histoires et de créer des connexions authentiques. + +Je veux que vous vous sentiez à l'aise devant la caméra et que vous profitiez de chaque moment que nous partageons. Parce que je ne serai pas seulement votre photographe, mais lorsque nous travaillerons ensemble, je serai également l'ami qui fera ressortir votre meilleur côté. Pour cela, nous créerons un espace sûr et de confiance où vous vous amuserez et serez vous-même face à la caméra, et je vous guiderai pour que l'ambiance soit détendue et sans pression. + +Vous n'avez pas besoin d'être un modèle professionnel pour être magnifique sur vos photos ; je serai derrière l'objectif pour mettre en valeur le meilleur de vous. Je pense que la confiance et l'empathie sont essentielles pour obtenir des photographies naturelles et authentiques. + +C'est pourquoi chaque séance photo est unique, tout comme vous et les personnes qui vous accompagnent. J'adore rencontrer chaque client, écouter leurs histoires et capturer l'essence de ce qu'ils sont. Je serai attentif non seulement aux prises de vue les plus importantes, mais aussi à ces petits détails et gestes qui rendent ce moment unique. Je sais combien les souvenirs sont précieux et le pouvoir que les photographies ont d'éveiller des émotions et de nous transporter dans le temps. C'est pourquoi je mets tout mon cœur et mon talent dans chaque image que je prends. + +Si vous cherchez un photographe qui capture des moments réels et authentiques, je vous invite à explorer mon portfolio et à découvrir mon style. + +Je suis impatient de faire partie de votre histoire et de créer ensemble d'incroyables photos. N'hésitez pas à me contacter pour discuter de vos idées, répondre à vos questions ou réserver votre séance photo ou votre événement. J'espère vous rencontrer bientôt et avoir l'opportunité de travailler avec vous. + +## Vous recherchez un photographe? Je veux faire votre connaissance + + + Je veux que tu sois mon photographe, Manu. + diff --git a/src/content/pages/fr/photos.mdx b/src/content/pages/fr/photos.mdx new file mode 100644 index 000000000..80a90d065 --- /dev/null +++ b/src/content/pages/fr/photos.mdx @@ -0,0 +1,67 @@ +
+

Photos

+ +

Mariages

+ + + + + +
+ +

People

+ + + + + +
+ +

Familles

+ + + + + +
+ +

Business

+ + + + + +
+ +

Travel

+ + + + + +
+
diff --git a/src/content/pages/fr/videos.mdx b/src/content/pages/fr/videos.mdx new file mode 100644 index 000000000..5796da4d8 --- /dev/null +++ b/src/content/pages/fr/videos.mdx @@ -0,0 +1,114 @@ +
+

Love in Motion: Révélation de la Vidéographie de Mariage

+

+ Explorez l'art d'immortaliser les moments chéris. Mon but est de capturer chaque émotion et détail, transformant + votre journée spéciale en un chef-d'œuvre cinématographique intemporel. Je crois en plus que simplement enregistrer + des événements - nous créons des histoires cinématographiques qui capturent l'essence de votre amour, dédiées à + préserver les émotions, les rires et les larmes qui rendent votre journée vraiment unique, vous permettant de + revivre la magie à chaque fois que vous appuyez sur play. +

+ {/* add param `?rel=0` to src to avoid related content at the end of the video (https://developers.google.com/youtube/player_parameters#rel) */} +
+ + + + + + + + + + +
+ +
diff --git a/src/content/pages/index.mdx b/src/content/pages/index.mdx new file mode 100644 index 000000000..e6f47a5ba --- /dev/null +++ b/src/content/pages/index.mdx @@ -0,0 +1,50 @@ +# Manuel Hamel Photography + +
+ + + + + Manuel Hamel, photographer + +

Hi, I'm Manuel

Love Storyteller

+
+ +## Awards + +Selected TOP 5 Wedding Photographers in Barcelona by WEZOREE + +Wezoree logo + +bodas.net wedding awards 2024 + +## Are you looking for a photographer? I want to get to know you. + + + I want you to be my photographer, Manu. + + +## Partners + + + Isla de Gracia Eventos + + + + Casa Miralles + + + Maison Visavis + + + La Maison Blanche + + + Pixan Stories + diff --git a/src/content/pages/photos.mdx b/src/content/pages/photos.mdx new file mode 100644 index 000000000..33b5d1064 --- /dev/null +++ b/src/content/pages/photos.mdx @@ -0,0 +1,67 @@ +
+

Photos

+ +

Weddings

+ + + + + +
+ +

People

+ + + + + +
+ +

Families

+ + + + + +
+ +

Business

+ + + + + +
+ +

Travel

+ + + + + +
+
diff --git a/src/content/pages/videos.mdx b/src/content/pages/videos.mdx new file mode 100644 index 000000000..4b0c276ed --- /dev/null +++ b/src/content/pages/videos.mdx @@ -0,0 +1,21 @@ +import LazyYouTube from '../../components/LazyYouTube.astro'; + +
+

Love in Motion: Wedding Videography Unveiled

+

+ Explore the art of immortalizing cherished moments. My goal is to capture every emotion and detail, transforming + your special day into a timeless cinematic masterpiece. I believe in more than just recording events – we craft + cinematic stories that capture the essence of your love, dedicated to preserving the emotions, laughter, and tears + that make your day truly unique, allowing you to relive the magic whenever you hit play. +

+ {/* Only pass video ID or share link and title to the component */} + + + + + + + + + +
diff --git a/src/content/pages/weddings.mdx b/src/content/pages/weddings.mdx new file mode 100644 index 000000000..ba669443d --- /dev/null +++ b/src/content/pages/weddings.mdx @@ -0,0 +1,48 @@ +# Are you looking for a photographer for your big day? Then you are in the right place. + + + + + + + A man and a woman kissing looking each other in the eyes and hugging on their wedding day + + +I know that your wedding is a unique and unforgettable day, and I want to capture every moment, every emotion, and every detail with my camera. I am Manuel, and I have had the privilege of immortalising a lot of weddings all around Europe. + +Let me tell you about my way of working so you can get to know me better. I adapt to your style and preferences. It's your day, and we want to capture the love, magic, and essence of it all. I will be discreetly attentive to the most important and spontaneous moments during your celebration.`, + +In the photos you will receive, you will see everything from loving glances, tender kisses, to the most sincere laughter. I assure you that I will accompany you in those moments and capture them with the artistic and authentic style that characterises my shots. My work goes beyond just taking thousands of photos; it's about creating a pleasant and enjoyable experience for you and your guests on that day and helping you tell that story for a lifetime.`, + +I know what it feels like to be in front of the camera, which is why I strive to build a personal connection with you and your loved ones. My goal is to make you relax and fully enjoy your day while I take care of creating the most beautiful memories.', + +By choosing me as your photographer, you are choosing someone committed and with a trained eye for details. My objective is to exceed your expectations and deliver a visual treasure that will last forever.', + +I am excited to meet you and help you preserve this part of your love story. I invite you to take a look at my portfolio and discover my style.', + +[I want to see your work](https://bodas.mh-photography.com/portfolio/) + +[Packages for your big +day](https://bodas.mh-photography.com/pack-de-bodas/) + +[Book the date for my wedding](mailto:manuel@mh-photography.com) diff --git a/src/pages/[...lang].astro b/src/pages/[...lang].astro deleted file mode 100644 index b99ae78ec..000000000 --- a/src/pages/[...lang].astro +++ /dev/null @@ -1,37 +0,0 @@ ---- -import Layout from '../layouts/Layout.astro'; -import Header from '../components/Header.astro'; -import Navigation from '../components/Navigation.astro'; -import Photos from '../components/Photos.astro'; -import Videos from '../components/Videos.astro'; -import Weddings from '../components/Weddings.astro'; -import About from '../components/About.astro'; -import Footer from '../components/Footer.astro'; -import Contact from '../components/Contact.astro'; - -export function getStaticPaths () { - return [ - {params: {lang: 'de'}}, - {params: {lang: 'en'}}, - {params: {lang: 'es'}}, - {params: {lang: 'fr'}}, - {params: {lang: undefined}}, - ]; -} - -const { lang } = Astro.params; - ---- - - -
- - -
- - - - - -
-