diff --git a/.gitignore b/.gitignore index 5ef6a52..22270e6 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,6 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +# local editor settings +.vscode/ diff --git a/README.md b/README.md index e215bc4..516b805 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,71 @@ -This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). +# Learn - Site de sujets populaires -## Getting Started +Application Next.js orientee SEO qui publie des pages de contenu autour de sujets populaires. -First, run the development server: +Site en ligne: https://learn.arthurp.fr + +## Objectif + +- Publier des pages categories optimisees SEO +- Gerer une base de sujets via un fichier JSON +- Proposer une structure simple a maintenir et deployee facilement + +## Stack technique + +- Next.js 16 (App Router) +- React 19 +- TypeScript +- Tailwind CSS 4 + +## Structure principale + +- src/app: pages et routes +- src/components: composants reutilisables (SEO, etc.) +- src/data/sujets.json: donnees de contenu +- public/images: images statiques +- scripts/ajouterSujet.js: script utilitaire pour ajouter un sujet + +## Lancer en local + +Prerequis: + +- Node.js 20+ +- npm + +Installation et lancement: ```bash +npm install npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev ``` -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. +Application disponible sur http://localhost:3000 -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. +## Scripts utiles -This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. +- npm run dev: demarrage en mode developpement +- npm run build: build de production +- npm run start: lancement de la build +- npm run lint: verification ESLint -## Learn More +## Deploiement -To learn more about Next.js, take a look at the following resources: +Build de verification avant publication: -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. +```bash +npm run lint +npm run build +``` -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! +Ensuite, pousser sur GitHub puis deployer sur la plateforme cible. -## Deploy on Vercel +## SEO et backlinks -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. +- URL principale: https://learn.arthurp.fr +- Ce depot documente le projet public pour renforcer le maillage vers le site principal. -Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. +## Securite avant push + +- Les fichiers d'environnement (.env*) sont ignores +- Les fichiers locaux VS Code (.vscode/) sont ignores +- Verifier qu'aucune cle API ou secret n'est commite avant publication diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..ff15fe8 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,10 @@ +services: + nextjs-app: + image: node:20 + working_dir: /app + volumes: + - ./:/app + command: sh -c "npm install && npm run build && npm run start" + ports: + - "3003:3000" + restart: unless-stopped \ No newline at end of file diff --git a/next-sitemap.config.js b/next-sitemap.config.js new file mode 100644 index 0000000..3b8705a --- /dev/null +++ b/next-sitemap.config.js @@ -0,0 +1,3 @@ +// Ce fichier est généré automatiquement pour Next.js SSG SEO + +export {}; diff --git a/package-lock.json b/package-lock.json index 32ee64a..76de246 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,9 @@ "dependencies": { "next": "16.1.6", "react": "19.2.3", - "react-dom": "19.2.3" + "react-dom": "19.2.3", + "react-markdown": "^10.1.0", + "ts-node": "^10.9.2" }, "devDependencies": { "@tailwindcss/postcss": "^4", @@ -20,7 +22,7 @@ "eslint": "^9", "eslint-config-next": "16.1.6", "tailwindcss": "^4", - "typescript": "^5" + "typescript": "^5.9.3" } }, "node_modules/@alloc/quick-lru": { @@ -277,6 +279,28 @@ "node": ">=6.9.0" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@emnapi/core": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", @@ -998,7 +1022,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1008,7 +1031,6 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -1514,6 +1536,30 @@ "tailwindcss": "4.1.18" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "license": "MIT" + }, "node_modules/@tybys/wasm-util": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", @@ -1525,13 +1571,39 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, "license": "MIT" }, + "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/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -1546,12 +1618,27 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, "node_modules/@types/node": { "version": "20.19.30", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.30.tgz", "integrity": "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==", - "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -1560,7 +1647,6 @@ "version": "19.2.10", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.10.tgz", "integrity": "sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==", - "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -1577,6 +1663,12 @@ "@types/react": "^19.2.0" } }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.54.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", @@ -1847,6 +1939,12 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", @@ -2120,7 +2218,6 @@ "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, "license": "MIT", "peer": true, "bin": { @@ -2140,6 +2237,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2173,6 +2282,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "license": "MIT" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2403,6 +2518,16 @@ "node": ">= 0.4" } }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2558,6 +2683,16 @@ ], "license": "CC-BY-4.0" }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2575,6 +2710,46 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "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/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -2601,6 +2776,16 @@ "dev": true, "license": "MIT" }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2615,6 +2800,12 @@ "dev": true, "license": "MIT" }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2634,7 +2825,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, "license": "MIT" }, "node_modules/damerau-levenshtein": { @@ -2702,7 +2892,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2716,6 +2905,19 @@ } } }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2759,6 +2961,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -2769,6 +2980,28 @@ "node": ">=8" } }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -3217,6 +3450,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -3440,6 +3674,16 @@ "node": ">=4.0" } }, + "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/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -3450,6 +3694,12 @@ "node": ">=0.10.0" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3879,6 +4129,46 @@ "node": ">= 0.4" } }, + "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-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hermes-estree": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", @@ -3896,6 +4186,16 @@ "hermes-estree": "0.25.1" } }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3933,6 +4233,12 @@ "node": ">=0.8.19" } }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -3948,6 +4254,30 @@ "node": ">= 0.4" } }, + "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-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-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -4106,6 +4436,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-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4165,6 +4505,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-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -4218,6 +4568,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -4816,6 +5178,16 @@ "dev": true, "license": "MIT" }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -4849,6 +5221,12 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "license": "ISC" + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -4859,6 +5237,159 @@ "node": ">= 0.4" } }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.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-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-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-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -4869,6 +5400,448 @@ "node": ">= 8" } }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.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", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "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", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -4910,7 +5883,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -5246,6 +6218,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/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5353,6 +6350,16 @@ "react-is": "^16.13.1" } }, + "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/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -5414,6 +6421,33 @@ "dev": true, "license": "MIT" }, + "node_modules/react-markdown": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", + "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -5458,6 +6492,39 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -5820,6 +6887,16 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/stable-hash": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", @@ -5954,6 +7031,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -5977,6 +7068,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, "node_modules/styled-jsx": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", @@ -6109,6 +7218,26 @@ "node": ">=8.0" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-api-utils": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", @@ -6122,6 +7251,49 @@ "typescript": ">=4.8.4" } }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -6249,7 +7421,6 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, "license": "Apache-2.0", "peer": true, "bin": { @@ -6307,9 +7478,95 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, "license": "MIT" }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unrs-resolver": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", @@ -6386,6 +7643,40 @@ "punycode": "^2.1.0" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "license": "MIT" + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -6508,6 +7799,15 @@ "dev": true, "license": "ISC" }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -6544,6 +7844,16 @@ "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index cdb79d0..2ff395c 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,9 @@ "dependencies": { "next": "16.1.6", "react": "19.2.3", - "react-dom": "19.2.3" + "react-dom": "19.2.3", + "react-markdown": "^10.1.0", + "ts-node": "^10.9.2" }, "devDependencies": { "@tailwindcss/postcss": "^4", @@ -21,6 +23,6 @@ "eslint": "^9", "eslint-config-next": "16.1.6", "tailwindcss": "^4", - "typescript": "^5" + "typescript": "^5.9.3" } } diff --git a/public/file.svg b/public/file.svg deleted file mode 100644 index 004145c..0000000 --- a/public/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg deleted file mode 100644 index 567f17b..0000000 --- a/public/globe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/crypto-bitcoin.webp b/public/images/crypto-bitcoin.webp new file mode 100644 index 0000000..e932de3 Binary files /dev/null and b/public/images/crypto-bitcoin.webp differ diff --git a/public/images/crypto-blockchain.webp b/public/images/crypto-blockchain.webp new file mode 100644 index 0000000..7d9f002 Binary files /dev/null and b/public/images/crypto-blockchain.webp differ diff --git a/public/images/energie-eolienne.webp b/public/images/energie-eolienne.webp new file mode 100644 index 0000000..797ea39 Binary files /dev/null and b/public/images/energie-eolienne.webp differ diff --git a/public/images/energie-solaire.webp b/public/images/energie-solaire.webp new file mode 100644 index 0000000..a7d24cd Binary files /dev/null and b/public/images/energie-solaire.webp differ diff --git a/public/images/ia-robot-main.webp b/public/images/ia-robot-main.webp new file mode 100644 index 0000000..0ff0995 Binary files /dev/null and b/public/images/ia-robot-main.webp differ diff --git a/public/images/japon-temple.webp b/public/images/japon-temple.webp new file mode 100644 index 0000000..822e6fc Binary files /dev/null and b/public/images/japon-temple.webp differ diff --git a/public/images/japon-tokyo.webp b/public/images/japon-tokyo.webp new file mode 100644 index 0000000..7c8be69 Binary files /dev/null and b/public/images/japon-tokyo.webp differ diff --git a/public/next.svg b/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..50760ca --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Allow: / +Sitemap: https://learn.arthurp.fr/sitemap.xml diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index 7705396..0000000 --- a/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/window.svg b/public/window.svg deleted file mode 100644 index b2b2a44..0000000 --- a/public/window.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/scripts/ajouterSujet.js b/scripts/ajouterSujet.js new file mode 100644 index 0000000..85ff041 --- /dev/null +++ b/scripts/ajouterSujet.js @@ -0,0 +1,24 @@ +import fs from 'fs'; + +/** + * Ajoute un nouveau sujet au fichier sujets.json + * @param {object} sujet - Objet sujet à ajouter + */ +export function ajouterSujet(sujet) { + const filePath = './src/data/sujets.json'; + const data = JSON.parse(fs.readFileSync(filePath, 'utf-8')); + data.push(sujet); + fs.writeFileSync(filePath, JSON.stringify(data, null, 2)); +} + +/** + * Exemple d’utilisation : + * ajouterSujet({ + * slug: 'nouveau-sujet', + * title: 'Titre', + * description: 'Description', + * image1: { src: '/images/xxx.jpg', alt: '...' }, + * image2: { src: '/images/yyy.jpg', alt: '...' }, + * sections: [ ... ] + * }); + */ diff --git a/src/app/[slug]/page.tsx b/src/app/[slug]/page.tsx new file mode 100644 index 0000000..c6f96db --- /dev/null +++ b/src/app/[slug]/page.tsx @@ -0,0 +1,81 @@ +import { notFound } from 'next/navigation'; +import SEO from '@/components/SEO'; +import sujets from '@/data/sujets.json'; +import Image from 'next/image'; +import React from 'react'; +import ReactMarkdown from 'react-markdown'; + +export const dynamicParams = false; // SSG only + +export async function generateStaticParams() { + return sujets.map((sujet) => ({ slug: sujet.slug })); +} + + +// Correction Next.js 14+ : params peut être une Promise +export async function generateMetadata({ params }: { params: { slug: string } } | { params: Promise<{ slug: string }> }) { + const { slug } = await params; + const sujet = sujets.find((s) => s.slug === slug); + if (!sujet) return {}; + return { + title: sujet.title, + description: sujet.description, + openGraph: { + title: sujet.title, + description: sujet.description, + images: [sujet.image1.src], + url: `/${sujet.slug}`, + type: 'article', + }, + }; +} + + // Next.js 14+ : params peut être un Promise +export default async function SujetPage({ params }: { params: { slug: string } } | { params: Promise<{ slug: string }> }) { + const { slug } = await params; + const sujet = sujets.find((s) => s.slug === slug); + if (!sujet) return notFound(); + type Section = { + h2: string; + content: string; + h3?: string; + }; + const sections: Section[] = Array.isArray(sujet.sections) ? sujet.sections : []; + + return ( + <> + +
+

{sujet.title}

+
+ {sujet.image1.alt} + {sujet.image2 && ( + {sujet.image2.alt} + )} +
+ {sections.map((section, idx) => ( + +
+

{section.h2}

+ {section.h3 &&

{section.h3}

} +
+ {section.content} +
+
+ {/* Emplacement pub entre sections (après la première section) */} + {idx === 0 && ( +
+
[Publicité In-Page 336x280]
+
+ )} +
+ ))} +
+ + ); +} \ No newline at end of file diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx new file mode 100644 index 0000000..b079a56 --- /dev/null +++ b/src/app/contact/page.tsx @@ -0,0 +1,9 @@ +export default function Contact() { + return ( +
+

Contact

+

Pour toute question ou demande, contactez-nous à l’adresse suivante :

+ contact@sujets-populaires.fr +
+ ); +} diff --git a/src/app/error.tsx b/src/app/error.tsx new file mode 100644 index 0000000..0555edf --- /dev/null +++ b/src/app/error.tsx @@ -0,0 +1,12 @@ +"use client"; + +export default function GlobalError({ error, reset }: { error: Error; reset: () => void }) { + return ( +
+

Erreur

+

Une erreur est survenue

+

{error.message}

+ +
+ ); +} diff --git a/src/app/favicon.ico b/src/app/favicon.ico deleted file mode 100644 index 718d6fe..0000000 Binary files a/src/app/favicon.ico and /dev/null differ diff --git a/src/app/globals.css b/src/app/globals.css index a2dc41e..119ae16 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -12,12 +12,7 @@ --font-mono: var(--font-geist-mono); } -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - } -} + body { background: var(--background); diff --git a/src/app/layout.tsx b/src/app/layout.tsx index f7fa87e..9ecfdcc 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,6 +1,8 @@ import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; +import Link from 'next/link'; +import sujets from '@/data/sujets.json'; const geistSans = Geist({ variable: "--font-geist-sans", @@ -13,8 +15,8 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "Sujets Populaires", + description: "Articles originaux sur des sujets populaires.", }; export default function RootLayout({ @@ -23,11 +25,47 @@ export default function RootLayout({ children: React.ReactNode; }>) { return ( - - - {children} + + +
+ {/* Emplacement pub header */} +
+ {/* AdSense : remplacer par le script réel */} +
[Publicité Header 728x90]
+
+ +
+
+ {/* Sidebar pub desktop */} + +
{children}
+
+ ); diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx new file mode 100644 index 0000000..92f0c18 --- /dev/null +++ b/src/app/not-found.tsx @@ -0,0 +1,12 @@ +import Link from 'next/link'; + +export default function NotFound() { + return ( +
+

404

+

Page non trouvée

+

La page que vous cherchez n’existe pas ou a été déplacée.

+ Retour à l’accueil +
+ ); +} diff --git a/src/app/page.tsx b/src/app/page.tsx index 295f8fd..75d77c4 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,65 +1,48 @@ -import Image from "next/image"; +import Link from 'next/link'; +import Image from 'next/image'; +import SEO from '@/components/SEO'; +import sujetsData from '@/data/sujets.json'; + +type Sujet = { + slug: string; + title: string; + description: string; + image1: { + src: string; + alt: string; + }; +}; + +const sujets = sujetsData as Sujet[]; export default function Home() { return ( -
-
- Next.js logo -
-

- To get started, edit the page.tsx file. -

-

- Looking for a starting point or more instructions? Head over to{" "} - - Templates - {" "} - or the{" "} - - Learning - {" "} - center. -

-
-
- - Vercel logomark - Deploy Now - - - Documentation - -
+ <> + +
+

Sujets Populaires

+
    + {sujets.map((sujet) => ( +
  • + + {sujet.image1.alt} +

    {sujet.title}

    +

    {sujet.description}

    + +
  • + ))} +
-
+ ); } diff --git a/src/app/politique-confidentialite/page.tsx b/src/app/politique-confidentialite/page.tsx new file mode 100644 index 0000000..fc9fc60 --- /dev/null +++ b/src/app/politique-confidentialite/page.tsx @@ -0,0 +1,8 @@ +export default function PolitiqueConfidentialite() { + return ( +
+

Politique de confidentialité

+

Nous respectons votre vie privée. Aucune donnée personnelle n’est collectée sans votre consentement explicite. Pour toute question, contactez-nous.

+
+ ); +} diff --git a/src/app/sitemap.xml/route.ts b/src/app/sitemap.xml/route.ts new file mode 100644 index 0000000..e416c02 --- /dev/null +++ b/src/app/sitemap.xml/route.ts @@ -0,0 +1,31 @@ +import { NextResponse } from 'next/server'; +import sujets from '@/data/sujets.json'; + +export async function GET() { + const baseUrl = 'https://learn.arthurp.fr'; // À personnaliser + const staticPages = [ + '', + '/contact', + '/politique-confidentialite', + ]; + const sujetPages = sujets.map((s) => `/${s.slug}`); + const allPages = [...staticPages, ...sujetPages]; + + const xml = ` + + ${allPages + .map( + (url) => ` + + ${baseUrl}${url} + ` + ) + .join('')} +`; + + return new NextResponse(xml, { + headers: { + 'Content-Type': 'application/xml', + }, + }); +} diff --git a/src/components/SEO.tsx b/src/components/SEO.tsx new file mode 100644 index 0000000..21f2b1a --- /dev/null +++ b/src/components/SEO.tsx @@ -0,0 +1,40 @@ +import Head from 'next/head'; + +export type SEOProps = { + title: string; + description: string; + image?: string; + url?: string; + type?: string; + publishedTime?: string; + updatedTime?: string; + author?: string; +}; + +export default function SEO({ + title, + description, + image = '', + url = '', + type = 'article', + publishedTime, + updatedTime, + author, +}: SEOProps) { + return ( + + {title} + + + + {image && } + {url && } + + {publishedTime && } + {updatedTime && } + {author && } + + {image && } + + ); +} diff --git a/src/data/sujets.json b/src/data/sujets.json new file mode 100644 index 0000000..d51bb9e --- /dev/null +++ b/src/data/sujets.json @@ -0,0 +1,256 @@ +[ + { + "slug": "intelligence-artificielle-revolution-enjeux", + "title": "L’Intelligence Artificielle : Révolution Technologique, Enjeux, Usages et Avenir", + "description": "Guide complet sur l’intelligence artificielle : définition, fonctionnement, applications concrètes, avantages, risques, enjeux éthiques et impact sur l’avenir de la société.", + "image1": { + "src": "/images/ia-robot-main.webp", + "alt": "Robot humanoïde et intelligence artificielle symbolisant la révolution technologique" + }, + "sections": [ + { + "h2": "Qu’est-ce que l’intelligence artificielle ?", + "content": "L’intelligence artificielle, souvent abrégée IA, désigne l’ensemble des technologies capables de simuler des comportements humains tels que l’apprentissage, le raisonnement, la perception ou la prise de décision. Elle repose sur des algorithmes, des modèles mathématiques et de grandes quantités de données. Contrairement aux programmes classiques, l’IA peut évoluer, s’adapter et améliorer ses performances au fil du temps." + }, + { + "h2": "Comment fonctionne l’intelligence artificielle", + "content": "Le fonctionnement de l’IA repose principalement sur le machine learning et le deep learning. Les algorithmes analysent d’immenses volumes de données afin d’identifier des motifs et de produire des prédictions ou des décisions. Les réseaux de neurones artificiels, inspirés du cerveau humain, sont au cœur des systèmes les plus avancés, notamment pour la reconnaissance d’images, la compréhension du langage ou la génération de contenus." + }, + { + "h2": "Les grandes catégories d’intelligence artificielle", + "content": "On distingue généralement l’IA faible, conçue pour accomplir une tâche spécifique comme un assistant vocal, et l’IA forte, encore théorique, qui serait capable de raisonner comme un être humain. Aujourd’hui, la majorité des applications reposent sur une IA spécialisée, extrêmement performante dans un domaine précis mais limitée hors de son cadre." + }, + { + "h2": "Applications concrètes de l’intelligence artificielle", + "content": "L’intelligence artificielle est déjà omniprésente dans notre quotidien. Elle alimente les moteurs de recommandation des plateformes de streaming, améliore la navigation GPS, optimise les résultats des moteurs de recherche et permet la reconnaissance faciale. Dans le secteur médical, elle aide au diagnostic, à l’analyse d’images médicales et à la recherche de nouveaux traitements. Dans l’industrie, elle optimise la production, la maintenance et la logistique." + }, + { + "h2": "L’intelligence artificielle dans le monde du travail", + "content": "L’IA transforme profondément le marché de l’emploi. Certaines tâches répétitives sont automatisées, tandis que de nouveaux métiers émergent, notamment dans la data, le développement et l’analyse des systèmes intelligents. L’enjeu principal réside dans l’adaptation des compétences et la formation continue afin d’accompagner cette transformation technologique." + }, + { + "h2": "Avantages et opportunités de l’intelligence artificielle", + "content": "L’intelligence artificielle permet des gains de productivité considérables, une réduction des erreurs humaines et une meilleure prise de décision grâce à l’analyse de données complexes. Elle ouvre également la voie à des innovations majeures dans la recherche scientifique, la médecine personnalisée, la transition énergétique et l’éducation." + }, + { + "h2": "Limites et risques de l’intelligence artificielle", + "content": "Malgré ses avantages, l’IA présente des limites importantes. Les biais présents dans les données peuvent conduire à des décisions injustes ou discriminatoires. La dépendance excessive aux systèmes automatisés pose des questions de fiabilité et de responsabilité. La sécurité des données et la protection de la vie privée sont également des enjeux majeurs." + }, + { + "h2": "Enjeux éthiques et sociétaux de l’IA", + "content": "Le développement de l’intelligence artificielle soulève de nombreuses questions éthiques. Qui est responsable en cas d’erreur d’un système autonome ? Comment garantir la transparence des algorithmes ? L’utilisation de l’IA dans la surveillance, la reconnaissance faciale ou les décisions judiciaires nécessite un encadrement strict pour préserver les libertés individuelles." + }, + { + "h2": "Intelligence artificielle et créativité", + "content": "L’IA est désormais capable de générer des images, de la musique, des textes et même des vidéos. Cette capacité remet en question la notion de créativité et soulève des débats sur le droit d’auteur, la propriété intellectuelle et la place de l’humain dans les processus créatifs." + }, + { + "h2": "L’avenir de l’intelligence artificielle", + "content": "L’avenir de l’IA s’annonce riche en évolutions. Les recherches portent sur des systèmes plus transparents, plus économes en énergie et mieux alignés avec les valeurs humaines. L’intelligence artificielle pourrait jouer un rôle clé dans la résolution de grands défis mondiaux, comme le changement climatique, la santé globale et la gestion des ressources." + }, + { + "h2": "Faut-il avoir peur de l’intelligence artificielle ?", + "content": "La peur de l’IA est souvent alimentée par la méconnaissance et la science-fiction. En réalité, l’enjeu n’est pas de craindre la technologie, mais de l’encadrer intelligemment. Une réglementation adaptée, une éducation numérique renforcée et une utilisation responsable permettent de tirer le meilleur parti de l’intelligence artificielle." + }, + { + "h2": "FAQ – Intelligence artificielle", + "content": "L’intelligence artificielle va-t-elle remplacer les humains ? Elle remplacera certaines tâches, mais créera aussi de nouvelles opportunités. L’IA est-elle dangereuse ? Elle peut l’être si elle est mal utilisée, d’où l’importance de règles claires. Peut-on faire confiance à l’IA ? La confiance dépend de la transparence, de la qualité des données et du contrôle humain." + } + ] + }, + { + "slug": "voyage-japon", + "title": "Voyager au Japon : Guide Complet 2026, Itinéraires, Budget, Culture et Conseils", + "description": "Guide ultime pour voyager au Japon : itinéraires détaillés, budget, transports, culture, gastronomie, saisons, conseils pratiques et erreurs à éviter pour un séjour réussi.", + "image1": { + "src": "/images/japon-tokyo.webp", + "alt": "Vue panoramique de Tokyo avec le Mont Fuji au coucher du soleil" + }, + "image2": { + "src": "/images/japon-temple.webp", + "alt": "Temple japonais traditionnel entouré de cerisiers en fleurs au printemps" + }, + "sections": [ + { + "h2": "Pourquoi voyager au Japon est une expérience unique", + "content": "Voyager au Japon, c’est découvrir un pays où le respect, l’harmonie et l’innovation coexistent parfaitement. Le Japon séduit par son incroyable diversité : métropoles ultra-modernes, villages traditionnels, montagnes sacrées, plages tropicales et campagnes paisibles. La propreté, la sécurité et l’efficacité des transports rendent le voyage simple, même pour un premier séjour en Asie. Chaque détail du quotidien reflète une culture profondément ancrée dans les traditions, tout en étant tournée vers l’avenir." + }, + { + "h2": "Les grandes villes incontournables du Japon", + "h3": "Tokyo, Kyoto, Osaka, Hiroshima et Nagoya", + "content": "Tokyo est une mégalopole fascinante composée de quartiers aux identités très marquées : Shinjuku et ses gratte-ciel, Shibuya et son célèbre carrefour, Akihabara pour la culture geek, Asakusa pour le Japon traditionnel. Kyoto est le cœur historique du pays avec ses temples, ses sanctuaires shinto et ses jardins zen. Osaka est réputée pour sa gastronomie, son château et son ambiance conviviale. Hiroshima offre une visite chargée d’émotion avec le Parc du Mémorial de la Paix. Nagoya est une ville dynamique souvent sous-estimée, idéale pour découvrir un Japon plus local." + }, + { + "h2": "Découvrir le Japon hors des sentiers battus", + "content": "Au-delà des grandes villes, le Japon regorge de régions méconnues mais exceptionnelles. Les Alpes japonaises offrent des paysages montagneux spectaculaires et des villages traditionnels comme Shirakawa-go. L’île de Kyushu est réputée pour ses volcans actifs et ses sources chaudes naturelles. Hokkaido séduit par sa nature sauvage et ses hivers enneigés. Okinawa propose une ambiance totalement différente avec ses plages paradisiaques et sa culture unique." + }, + { + "h2": "Quand partir au Japon ? Climat et saisons", + "content": "Le Japon se visite toute l’année, mais chaque saison offre une expérience différente. Le printemps est très populaire grâce à la floraison des cerisiers, un événement culturel majeur. L’été est animé par de nombreux festivals traditionnels, bien que la chaleur et l’humidité puissent être élevées. L’automne est idéal pour les randonnées et les paysages colorés. L’hiver est parfait pour le ski, les onsen et les paysages enneigés, notamment dans le nord du pays." + }, + { + "h2": "Itinéraires recommandés pour un premier voyage au Japon", + "content": "Pour un premier séjour de 10 à 14 jours, un itinéraire classique inclut Tokyo, Kyoto et Osaka. Il est possible d’ajouter Hiroshima ou Nara pour enrichir l’expérience. Pour un voyage plus long, intégrer Hokkaido ou Kyushu permet de découvrir une autre facette du Japon. Les voyageurs expérimentés pourront privilégier des itinéraires plus ruraux, axés sur la nature et la culture locale." + }, + { + "h2": "Budget voyage au Japon : combien ça coûte ?", + "content": "Contrairement aux idées reçues, le Japon n’est pas forcément une destination hors de prix. Les repas peuvent coûter entre 7 et 15 € dans des restaurants locaux. Les transports sont très efficaces mais représentent un poste important du budget. Le JR Pass est souvent rentable pour les longs trajets. Les hébergements vont des auberges économiques aux ryokans traditionnels plus coûteux, offrant une expérience culturelle unique." + }, + { + "h2": "Se déplacer au Japon : trains, métro et pass", + "content": "Le réseau ferroviaire japonais est reconnu comme l’un des meilleurs au monde. Les trains à grande vitesse Shinkansen relient rapidement les principales villes. Les cartes IC comme Suica ou Pasmo facilitent les déplacements urbains. La ponctualité et la clarté des indications rendent les déplacements simples, même sans parler japonais." + }, + { + "h2": "Hébergements au Japon : où dormir ?", + "content": "Le Japon propose une grande variété d’hébergements. Les hôtels classiques offrent un confort standard, tandis que les hôtels capsules sont une expérience insolite et économique. Les ryokans permettent de dormir sur des tatamis et de goûter à la cuisine traditionnelle. Les logements chez l’habitant et les auberges de jeunesse sont idéaux pour les budgets serrés." + }, + { + "h2": "Culture japonaise et règles de savoir-vivre", + "content": "Le respect des règles sociales est fondamental au Japon. Il est important d’enlever ses chaussures à l’intérieur, d’éviter de parler fort dans les transports et de respecter les files d’attente. Les Japonais apprécient les efforts des visiteurs pour comprendre leur culture, même de manière basique." + }, + { + "h2": "Gastronomie japonaise : bien plus que des sushis", + "content": "La cuisine japonaise est variée et régionale. Les ramen diffèrent selon les villes, les okonomiyaki sont populaires à Osaka et Hiroshima, et les bentos offrent des repas complets à petit prix. La qualité des ingrédients est exceptionnelle, même dans les restaurants les plus simples." + }, + { + "h2": "Conseils pratiques avant de partir au Japon", + "content": "Avant de partir, il est recommandé de vérifier les formalités d’entrée, de souscrire une assurance voyage et de prévoir un adaptateur électrique. Avoir un peu d’argent liquide est essentiel, car certains commerces n’acceptent pas les cartes bancaires. Une connexion internet via une carte SIM ou un pocket Wi-Fi facilite grandement le séjour." + }, + { + "h2": "Erreurs à éviter lors d’un voyage au Japon", + "content": "Parmi les erreurs fréquentes : sous-estimer les distances, vouloir trop en faire en peu de temps, négliger les règles de politesse ou voyager sans planification minimale. Prendre le temps de découvrir chaque lieu rend le voyage bien plus agréable." + }, + { + "h2": "FAQ – Tout savoir avant de voyager au Japon", + "content": "Le Japon est-il sûr pour les voyageurs ? Oui, c’est l’un des pays les plus sûrs au monde. Faut-il parler japonais ? Ce n’est pas obligatoire, mais apprendre quelques mots est apprécié. Peut-on voyager seul au Japon ? Absolument, le pays est idéal pour les voyageurs en solo." + } + ] + }, + { + "slug": "energie-renouvelable", + "title": "Énergies Renouvelables : Définition, Types, Avantages, Défis et Avenir de la Transition Énergétique", + "description": "Guide complet sur les énergies renouvelables : définition, types, avantages environnementaux et économiques, défis technologiques et rôle clé dans la transition énergétique mondiale.", + "image1": { + "src": "/images/energie-eolienne.webp", + "alt": "Parc éolien produisant de l’énergie renouvelable respectueuse de l’environnement" + }, + "image2": { + "src": "/images/energie-solaire.webp", + "alt": "Panneaux solaires photovoltaïques produisant de l’électricité verte" + }, + "sections": [ + { + "h2": "Qu’est-ce qu’une énergie renouvelable ?", + "content": "Les énergies renouvelables sont des sources d’énergie issues de phénomènes naturels capables de se reconstituer rapidement à l’échelle humaine. Contrairement aux énergies fossiles comme le pétrole, le charbon ou le gaz, elles ne s’épuisent pas et génèrent peu ou pas d’émissions de gaz à effet de serre. Elles constituent un pilier essentiel de la transition énergétique et de la lutte contre le changement climatique." + }, + { + "h2": "Pourquoi les énergies renouvelables sont essentielles aujourd’hui", + "content": "Face au réchauffement climatique, à la raréfaction des ressources fossiles et à la dépendance énergétique, les énergies renouvelables apparaissent comme une solution durable. Elles permettent de produire de l’électricité, de la chaleur et des carburants tout en limitant l’impact environnemental. Leur développement est devenu une priorité stratégique pour de nombreux pays." + }, + { + "h2": "Les principaux types d’énergies renouvelables", + "content": "Les énergies renouvelables se déclinent en plusieurs catégories. L’énergie solaire exploite le rayonnement du soleil via des panneaux photovoltaïques ou thermiques. L’énergie éolienne utilise la force du vent pour produire de l’électricité. L’énergie hydraulique repose sur la puissance de l’eau, notamment grâce aux barrages. La biomasse transforme des matières organiques en énergie. La géothermie exploite la chaleur naturelle du sous-sol terrestre." + }, + { + "h2": "L’énergie solaire : une ressource abondante", + "content": "L’énergie solaire est l’une des sources les plus prometteuses. Elle est disponible partout sur la planète et peut être exploitée à petite ou grande échelle. Les coûts des panneaux solaires ont fortement diminué ces dernières années, rendant cette technologie de plus en plus accessible aux particuliers comme aux entreprises." + }, + { + "h2": "L’énergie éolienne : produire grâce au vent", + "content": "L’énergie éolienne est aujourd’hui l’une des principales sources d’électricité renouvelable. Les éoliennes terrestres et offshore permettent de produire de grandes quantités d’énergie. Leur intégration dans les paysages et leur acceptabilité sociale restent toutefois des enjeux importants." + }, + { + "h2": "L’énergie hydraulique : une technologie mature", + "content": "L’hydroélectricité est la plus ancienne des énergies renouvelables modernes. Elle offre une production stable et pilotable, capable de répondre aux pics de demande. Cependant, la construction de barrages peut avoir des impacts écologiques importants, nécessitant une gestion responsable." + }, + { + "h2": "La biomasse et la géothermie", + "content": "La biomasse permet de valoriser les déchets organiques pour produire de l’énergie, contribuant ainsi à l’économie circulaire. La géothermie exploite la chaleur interne de la Terre pour le chauffage et la production d’électricité. Ces deux sources offrent un fort potentiel local et durable." + }, + { + "h2": "Avantages environnementaux des énergies renouvelables", + "content": "Les énergies renouvelables réduisent considérablement les émissions de CO2 et la pollution atmosphérique. Elles limitent l’impact sur les écosystèmes à long terme et contribuent à préserver les ressources naturelles. Leur utilisation est essentielle pour atteindre les objectifs climatiques internationaux." + }, + { + "h2": "Avantages économiques et sociaux", + "content": "Le développement des énergies renouvelables crée de nombreux emplois locaux dans la construction, la maintenance et la recherche. Il renforce l’indépendance énergétique des pays et stabilise les coûts de l’énergie sur le long terme. Pour les consommateurs, elles représentent une opportunité de réduire les factures énergétiques." + }, + { + "h2": "Les défis des énergies renouvelables", + "content": "Malgré leurs avantages, les énergies renouvelables font face à plusieurs défis. L’intermittence de certaines sources, comme le solaire et l’éolien, nécessite des solutions de stockage efficaces. Les infrastructures doivent être modernisées pour intégrer ces nouvelles productions. L’acceptation sociale et l’impact environnemental local doivent également être pris en compte." + }, + { + "h2": "Le rôle du stockage de l’énergie", + "content": "Le stockage de l’énergie est un élément clé de la transition énergétique. Batteries, stations de pompage hydraulique et hydrogène vert permettent de stocker l’énergie produite en excès et de la restituer en période de forte demande. Les progrès technologiques dans ce domaine sont déterminants pour l’avenir." + }, + { + "h2": "Avenir des énergies renouvelables", + "content": "L’avenir des énergies renouvelables est prometteur. Les innovations technologiques, la baisse des coûts et les politiques publiques favorables accélèrent leur déploiement. À long terme, elles pourraient devenir la principale source d’énergie mondiale et transformer profondément nos modes de production et de consommation." + }, + { + "h2": "FAQ – Énergies renouvelables", + "content": "Les énergies renouvelables peuvent-elles remplacer les énergies fossiles ? À terme, oui, avec un mix énergétique adapté. Sont-elles vraiment écologiques ? Leur impact est bien inférieur aux énergies fossiles. Peut-on produire sa propre énergie ? Oui, notamment grâce au solaire et à l’éolien domestique." + } + ] + }, + { + "slug": "cryptomonnaies-avenir", + "title": "Cryptomonnaies : Révolution, Risques, Applications et Futur de la Finance", + "description": "Analyse complète et approfondie des cryptomonnaies : définition, fonctionnement, avantages, risques, adoption mondiale, régulation, impact sur l’économie et la société, et perspectives futures.", + "image1": { "src": "/images/crypto-bitcoin.webp", "alt": "Pièce de Bitcoin sur fond numérique représentant les cryptomonnaies" }, + "image2": { "src": "/images/crypto-blockchain.webp", "alt": "Chaîne de blocs blockchain stylisée symbolisant la technologie des cryptomonnaies" }, + "sections": [ + { + "h2": "Qu’est-ce qu’une cryptomonnaie ?", + "content": "Une cryptomonnaie est une monnaie numérique décentralisée utilisant la technologie blockchain pour sécuriser et authentifier les transactions. Contrairement aux monnaies traditionnelles, elles ne dépendent pas d’une banque centrale. Chaque transaction est validée par un réseau d’ordinateurs (nodes), assurant transparence et sécurité. Les cryptomonnaies permettent d’effectuer des paiements rapides, de transférer des fonds à l’international sans intermédiaire et d’investir dans des actifs numériques innovants." + }, + { + "h2": "Comment fonctionne la blockchain ?", + "content": "La blockchain est un registre public distribué et immuable qui enregistre toutes les transactions effectuées avec une cryptomonnaie. Chaque bloc contient un ensemble de transactions et un hash unique qui le relie au bloc précédent. Ce mécanisme garantit que les données ne peuvent pas être modifiées rétroactivement. Les blockchains peuvent être publiques (Bitcoin, Ethereum) ou privées (entreprises, banques). La blockchain est également utilisée pour les smart contracts, la finance décentralisée (DeFi) et les NFT." + }, + { + "h2": "Les principales cryptomonnaies et leurs spécificités", + "content": "Il existe des milliers de cryptomonnaies, mais certaines se démarquent :\n- **Bitcoin (BTC)** : première crypto, réserve de valeur numérique, forte sécurité.\n- **Ethereum (ETH)** : plateforme pour smart contracts et applications décentralisées.\n- **Cardano (ADA)** : approche scientifique et sécurité élevée.\n- **Solana (SOL)** : rapidité et faible coût de transaction.\n- **Stablecoins (USDT, USDC)** : cryptos indexées sur des monnaies fiduciaires, moins volatiles.\n- **Altcoins** : cryptos alternatives spécialisées (DeFi, gaming, NFT)." + }, + { + "h2": "Avantages des cryptomonnaies", + "h3": "Liberté financière, rapidité, innovation", + "content": "Les cryptomonnaies offrent :\n- **Autonomie** : possibilité de gérer ses fonds sans banque.\n- **Transactions rapides** : surtout pour les transferts internationaux.\n- **Accessibilité** : ouvertes à tous avec Internet.\n- **Transparence** : chaque transaction est visible sur la blockchain.\n- **Innovation financière** : DeFi, staking, yield farming, smart contracts, NFT." + }, + { + "h2": "Risques et limites", + "h3": "Volatilité, sécurité et régulation", + "content": "Malgré leurs avantages, les cryptomonnaies présentent des risques :\n- **Volatilité extrême** : certains actifs peuvent perdre 50% de leur valeur en quelques jours.\n- **Sécurité** : les erreurs humaines ou le phishing peuvent provoquer des pertes.\n- **Régulation incertaine** : interdictions ou limitations possibles selon les pays.\n- **Fraudes et scams** : ICO frauduleuses, rug pulls, faux wallets.\n- **Impact environnemental** : certaines cryptos consomment beaucoup d’énergie (Proof of Work)." + }, + { + "h2": "Comment sécuriser ses cryptomonnaies", + "content": "Pour réduire les risques :\n- **Wallets sécurisés** : hardware wallets (Ledger, Trezor) ou software wallets fiables.\n- **Authentification à deux facteurs** : sur plateformes d’échange.\n- **Ne jamais partager ses clés privées**.\n- **Diversifier ses investissements**.\n- **S’informer avant d’investir** sur chaque projet ou token." + }, + { + "h2": "Applications concrètes des cryptomonnaies", + "content": "Les cryptomonnaies ne servent pas qu’à spéculer :\n- **Paiements** : achats en ligne, transferts internationaux.\n- **Finance décentralisée (DeFi)** : prêts, emprunts et rendements sans banques.\n- **NFT et gaming** : création, vente et échange d’actifs numériques.\n- **Supply chain et traçabilité** : suivi transparent de produits.\n- **Dons et crowdfunding** : financements globaux sans intermédiaires." + }, + { + "h2": "Adoption mondiale et régulation", + "content": "L’adoption des cryptomonnaies varie selon les pays :\n- **Pays favorables** : El Salvador (BTC légal), Suisse, Singapour.\n- **Pays prudents** : Union Européenne, États-Unis (régulation en cours).\n- **Pays hostiles** : Chine (interdiction totale).\nLes régulations futures influenceront fortement la sécurité, la fiscalité et l’adoption globale." + }, + { + "h2": "Cryptomonnaies et économie", + "content": "Les cryptos impactent plusieurs secteurs :\n- **Investissements** : nouveaux actifs numériques.\n- **Banques et finance** : adaptation des services financiers.\n- **Entreprises** : acceptation de paiements en cryptos.\n- **Gouvernements** : monnaies numériques de banque centrale (CBDC).\n- **Innovation technologique** : blockchain appliquée aux contrats, assurances et identité numérique." + }, + { + "h2": "Perspectives et futur", + "content": "Le futur des cryptomonnaies dépendra de :\n- **Innovation technologique** : Proof of Stake, réduction consommation énergétique.\n- **Adoption grand public** : interfaces simples et sécurisées.\n- **Régulation équilibrée** : sécurité + innovation.\n- **Intégration avec l’économie traditionnelle** : banques, paiements, assurances.\n- **Cas d’usage réels** : supply chain, santé, identité, IoT." + }, + { + "h2": "Investir dans les cryptomonnaies", + "content": "Conseils pour investir intelligemment :\n- Commencer par de petites sommes.\n- Étudier le projet, la communauté et la technologie.\n- Diversifier entre BTC, ETH, altcoins.\n- Ne jamais investir l’argent dont on a besoin.\n- Se former continuellement sur le marché et les tendances." + }, + { + "h2": "FAQ – Cryptomonnaies", + "content": "Peut-on perdre tout son argent ? Oui, le risque est élevé.\nFaut-il être expert en informatique ? Non, mais comprendre les bases et sécuriser ses wallets est crucial.\nLes cryptos remplaceront-elles les monnaies traditionnelles ? Probablement pas à court terme, mais elles coexisteront comme alternative.\nQuelle crypto acheter ? Bitcoin reste la référence, Ethereum et certains altcoins présentent de l’innovation.\nPeut-on utiliser les cryptos pour les paiements quotidiens ? Oui, de plus en plus de commerçants et services acceptent BTC et stablecoins." + } + ] +} + +]