From c0dad3c3a88996ae42c01f7b981294afe6ad5ae6 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Fri, 9 Feb 2024 20:12:34 +0300 Subject: [PATCH 001/101] added all pages --- notes.md | 34 + package-lock.json | 5124 +++++++++++++++++ pages/_meta.json | 8 +- pages/advanced.mdx | 3 - pages/another.mdx | 31 - pages/courses/_meta.json | 3 + .../{advanced/satori.mdx => courses/next.mdx} | 0 pages/programming-tutorials/_meta.json | 6 + .../html-and-css/_meta.json | 12 + .../html-and-css/assignments.mdx | 0 .../html-and-css/css-fundamentals.mdx | 0 .../html-and-css/deploying.mdx | 0 .../html-and-css/github.mdx | 0 .../html-and-css/html-css-advanced.mdx | 0 .../html-and-css/html-css-projects.mdx | 0 .../html-and-css/html-fundamentals.mdx | 0 .../html-and-css/index.mdx | 0 .../html-and-css/intro-to-web.mdx.mdx | 0 .../html-and-css/layouts-responsive.mdx | 0 .../html-and-css/sass.mdx | 0 pages/programming-tutorials/index.mdx | 1 + pages/programming-tutorials/js/_meta.json | 9 + .../programming-tutorials/js/assignments.mdx | 0 pages/programming-tutorials/js/js-arrays.mdx | 0 pages/programming-tutorials/js/js-async.mdx | 0 pages/programming-tutorials/js/js-basics.mdx | 0 pages/programming-tutorials/js/js-dom.mdx | 0 pages/programming-tutorials/js/js-es6.mdx | 0 pages/programming-tutorials/js/js-intro.mdx | 0 .../programming-tutorials/js/js-projects.mdx | 0 pages/programming-tutorials/nextjs/_meta.json | 16 + .../nextjs/assignments.mdx | 0 .../nextjs/next-actions.mdx | 0 .../programming-tutorials/nextjs/next-api.mdx | 0 .../nextjs/next-auth.mdx | 0 .../nextjs/next-data-fetching.mdx | 0 .../nextjs/next-deploy.mdx | 0 .../nextjs/next-forms.mdx | 0 .../nextjs/next-intro.mdx | 0 .../nextjs/next-mongo.mdx | 0 .../nextjs/next-projects.mdx | 0 .../nextjs/next-routing.mdx | 0 .../programming-tutorials/nextjs/next-seo.mdx | 0 .../nextjs/next-state.mdx | 0 .../nextjs/next-typescript.mdx | 0 theme.config.tsx | 18 +- 46 files changed, 5220 insertions(+), 45 deletions(-) create mode 100644 notes.md create mode 100644 package-lock.json delete mode 100644 pages/advanced.mdx delete mode 100644 pages/another.mdx create mode 100644 pages/courses/_meta.json rename pages/{advanced/satori.mdx => courses/next.mdx} (100%) create mode 100644 pages/programming-tutorials/_meta.json create mode 100644 pages/programming-tutorials/html-and-css/_meta.json create mode 100644 pages/programming-tutorials/html-and-css/assignments.mdx create mode 100644 pages/programming-tutorials/html-and-css/css-fundamentals.mdx create mode 100644 pages/programming-tutorials/html-and-css/deploying.mdx create mode 100644 pages/programming-tutorials/html-and-css/github.mdx create mode 100644 pages/programming-tutorials/html-and-css/html-css-advanced.mdx create mode 100644 pages/programming-tutorials/html-and-css/html-css-projects.mdx create mode 100644 pages/programming-tutorials/html-and-css/html-fundamentals.mdx create mode 100644 pages/programming-tutorials/html-and-css/index.mdx create mode 100644 pages/programming-tutorials/html-and-css/intro-to-web.mdx.mdx create mode 100644 pages/programming-tutorials/html-and-css/layouts-responsive.mdx create mode 100644 pages/programming-tutorials/html-and-css/sass.mdx create mode 100644 pages/programming-tutorials/index.mdx create mode 100644 pages/programming-tutorials/js/_meta.json create mode 100644 pages/programming-tutorials/js/assignments.mdx create mode 100644 pages/programming-tutorials/js/js-arrays.mdx create mode 100644 pages/programming-tutorials/js/js-async.mdx create mode 100644 pages/programming-tutorials/js/js-basics.mdx create mode 100644 pages/programming-tutorials/js/js-dom.mdx create mode 100644 pages/programming-tutorials/js/js-es6.mdx create mode 100644 pages/programming-tutorials/js/js-intro.mdx create mode 100644 pages/programming-tutorials/js/js-projects.mdx create mode 100644 pages/programming-tutorials/nextjs/_meta.json create mode 100644 pages/programming-tutorials/nextjs/assignments.mdx create mode 100644 pages/programming-tutorials/nextjs/next-actions.mdx create mode 100644 pages/programming-tutorials/nextjs/next-api.mdx create mode 100644 pages/programming-tutorials/nextjs/next-auth.mdx create mode 100644 pages/programming-tutorials/nextjs/next-data-fetching.mdx create mode 100644 pages/programming-tutorials/nextjs/next-deploy.mdx create mode 100644 pages/programming-tutorials/nextjs/next-forms.mdx create mode 100644 pages/programming-tutorials/nextjs/next-intro.mdx create mode 100644 pages/programming-tutorials/nextjs/next-mongo.mdx create mode 100644 pages/programming-tutorials/nextjs/next-projects.mdx create mode 100644 pages/programming-tutorials/nextjs/next-routing.mdx create mode 100644 pages/programming-tutorials/nextjs/next-seo.mdx create mode 100644 pages/programming-tutorials/nextjs/next-state.mdx create mode 100644 pages/programming-tutorials/nextjs/next-typescript.mdx diff --git a/notes.md b/notes.md new file mode 100644 index 00000000..d52c3413 --- /dev/null +++ b/notes.md @@ -0,0 +1,34 @@ +pages/ +|-- index.js (Homepage) +|-- programming-tutorials/ +| |-- index.js (Programming Tutorials Landing Page) +| |-- html-css-tailwind/ +| | |-- index.js (HTML, CSS, Tailwind Tutorial Page) +| | |-- tutorial-1.js (Individual Tutorial Page) +| | |-- tutorial-2.js (Individual Tutorial Page) +| | |-- ... +| |-- next-js/ +| | |-- index.js (Next.js Tutorial Page) +| | |-- tutorial-1.js (Individual Tutorial Page) +| | |-- tutorial-2.js (Individual Tutorial Page) +| | |-- ... +| |-- node-js/ +| |-- index.js (Node.js Tutorial Page) +| |-- tutorial-1.js (Individual Tutorial Page) +| |-- tutorial-2.js (Individual Tutorial Page) +| |-- ... +|-- youtube-video-tutorials/ +| |-- index.js (YouTube Video Tutorials Landing Page) +| |-- video-1.js (Individual Video Tutorial Page) +| |-- video-2.js (Individual Video Tutorial Page) +| |-- ... +|-- website-templates/ +| |-- index.js (Website Templates Landing Page) +| |-- template-1.js (Individual Website Template Documentation Page) +| |-- template-2.js (Individual Website Template Documentation Page) +| |-- ... +|-- course-projects/ +|-- index.js (Course Projects Landing Page) +|-- project-1.js (Individual Course Project Documentation Page) +|-- project-2.js (Individual Course Project Documentation Page) +|-- ... diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..788993a3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5124 @@ +{ + "name": "nextra-docs-template", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "nextra-docs-template", + "version": "0.0.1", + "license": "MIT", + "dependencies": { + "next": "^13.0.6", + "nextra": "latest", + "nextra-theme-docs": "latest", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/node": "18.11.10", + "typescript": "^4.9.3" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", + "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==" + }, + "node_modules/@headlessui/react": { + "version": "1.7.18", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.18.tgz", + "integrity": "sha512-4i5DOrzwN4qSgNsL4Si61VMkUcWbcSKueUV7sFhpHzQcSShdlHENE5+QBntMSRvHt8NyoFO2AGG8si9lq+w4zQ==", + "dependencies": { + "@tanstack/react-virtual": "^3.0.0-beta.60", + "client-only": "^0.0.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, + "node_modules/@mdx-js/mdx": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.3.0.tgz", + "integrity": "sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/mdx": "^2.0.0", + "estree-util-build-jsx": "^2.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "estree-util-to-js": "^1.1.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^2.0.0", + "markdown-extensions": "^1.0.0", + "periscopic": "^3.0.0", + "remark-mdx": "^2.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "unified": "^10.0.0", + "unist-util-position-from-estree": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.3.0.tgz", + "integrity": "sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==", + "dependencies": { + "@types/mdx": "^2.0.0", + "@types/react": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "react": ">=16" + } + }, + "node_modules/@napi-rs/simple-git": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git/-/simple-git-0.1.16.tgz", + "integrity": "sha512-C5wRPw9waqL2jk3jEDeJv+f7ScuO3N0a39HVdyFLkwKxHH4Sya4ZbzZsu2JLi6eEqe7RuHipHL6mC7B2OfYZZw==", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@napi-rs/simple-git-android-arm-eabi": "0.1.16", + "@napi-rs/simple-git-android-arm64": "0.1.16", + "@napi-rs/simple-git-darwin-arm64": "0.1.16", + "@napi-rs/simple-git-darwin-x64": "0.1.16", + "@napi-rs/simple-git-linux-arm-gnueabihf": "0.1.16", + "@napi-rs/simple-git-linux-arm64-gnu": "0.1.16", + "@napi-rs/simple-git-linux-arm64-musl": "0.1.16", + "@napi-rs/simple-git-linux-x64-gnu": "0.1.16", + "@napi-rs/simple-git-linux-x64-musl": "0.1.16", + "@napi-rs/simple-git-win32-arm64-msvc": "0.1.16", + "@napi-rs/simple-git-win32-x64-msvc": "0.1.16" + } + }, + "node_modules/@napi-rs/simple-git-android-arm-eabi": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.16.tgz", + "integrity": "sha512-dbrCL0Pl5KZG7x7tXdtVsA5CO6At5ohDX3myf5xIYn9kN4jDFxsocl8bNt6Vb/hZQoJd8fI+k5VlJt+rFhbdVw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-android-arm64": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.16.tgz", + "integrity": "sha512-xYz+TW5J09iK8SuTAKK2D5MMIsBUXVSs8nYp7HcMi8q6FCRO7yJj96YfP9PvKsc/k64hOyqGmL5DhCzY9Cu1FQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-darwin-arm64": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.16.tgz", + "integrity": "sha512-XfgsYqxhUE022MJobeiX563TJqyQyX4FmYCnqrtJwAfivESVeAJiH6bQIum8dDEYMHXCsG7nL8Ok0Dp8k2m42g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-darwin-x64": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.16.tgz", + "integrity": "sha512-tkEVBhD6vgRCbeWsaAQqM3bTfpIVGeitamPPRVSbsq8qgzJ5Dx6ZedH27R7KSsA/uao7mZ3dsrNLXbu1Wy5MzA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-arm-gnueabihf": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.16.tgz", + "integrity": "sha512-R6VAyNnp/yRaT7DV1Ao3r67SqTWDa+fNq2LrNy0Z8gXk2wB9ZKlrxFtLPE1WSpWknWtyRDLpRlsorh7Evk7+7w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-arm64-gnu": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.16.tgz", + "integrity": "sha512-LAGI0opFKw/HBMCV2qIBK3uWSEW9h4xd2ireZKLJy8DBPymX6NrWIamuxYNyCuACnFdPRxR4LaRFy4J5ZwuMdw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-arm64-musl": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.16.tgz", + "integrity": "sha512-I57Ph0F0Yn2KW93ep+V1EzKhACqX0x49vvSiapqIsdDA2PifdEWLc1LJarBolmK7NKoPqKmf6lAKKO9lhiZzkg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-x64-gnu": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.16.tgz", + "integrity": "sha512-AZYYFY2V7hlcQASPEOWyOa3e1skzTct9QPzz0LiDM3f/hCFY/wBaU2M6NC5iG3d2Kr38heuyFS/+JqxLm5WaKA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-x64-musl": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.16.tgz", + "integrity": "sha512-9TyMcYSBJwjT8jwjY9m24BZbu7ozyWTjsmYBYNtK3B0Um1Ov6jthSNneLVvouQ6x+k3Ow+00TiFh6bvmT00r8g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-win32-arm64-msvc": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.16.tgz", + "integrity": "sha512-uslJ1WuAHCYJWui6xjsyT47SjX6KOHDtClmNO8hqKz1pmDSNY7AjyUY8HxvD1lK9bDnWwc4JYhikS9cxCqHybw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-win32-x64-msvc": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.16.tgz", + "integrity": "sha512-SoEaVeCZCDF1MP+M9bMSXsZWgEjk4On9GWADO5JOulvzR1bKjk0s9PMHwe/YztR9F0sJzrCxwtvBZowhSJsQPg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/env": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.6.tgz", + "integrity": "sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.6.tgz", + "integrity": "sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.6.tgz", + "integrity": "sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.6.tgz", + "integrity": "sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.6.tgz", + "integrity": "sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.6.tgz", + "integrity": "sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.6.tgz", + "integrity": "sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.6.tgz", + "integrity": "sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.6.tgz", + "integrity": "sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.6.tgz", + "integrity": "sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", + "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tanstack/react-virtual": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.0.4.tgz", + "integrity": "sha512-tiqKW/e2MJVCr7/pRUXulpkyxllaOclkHNfhKTo4pmHjJIqnhMfwIjc1Q1R0Un3PI3kQywywu/791c8z9u0qeA==", + "dependencies": { + "@tanstack/virtual-core": "3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.0.0.tgz", + "integrity": "sha512-SYXOBTjJb05rXa2vl55TTwO40A6wKu0R5i1qQwhJYNDIqaIGF7D0HsLw+pJAyi2OvntlEIVusx3xtbbgSUi6zg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@theguild/remark-mermaid": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@theguild/remark-mermaid/-/remark-mermaid-0.0.5.tgz", + "integrity": "sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw==", + "dependencies": { + "mermaid": "^10.2.2", + "unist-util-visit": "^5.0.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/@theguild/remark-npm2yarn": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@theguild/remark-npm2yarn/-/remark-npm2yarn-0.2.1.tgz", + "integrity": "sha512-jUTFWwDxtLEFtGZh/TW/w30ySaDJ8atKWH8dq2/IiQF61dPrGfETpl0WxD0VdBfuLOeU14/kop466oBSRO/5CA==", + "dependencies": { + "npm-to-yarn": "^2.1.0", + "unist-util-visit": "^5.0.0" + } + }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", + "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==" + }, + "node_modules/@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + }, + "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==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.4.tgz", + "integrity": "sha512-5idy3hvI9lAMqsyilBM+N+boaCf1MgoefbDxN6KEO5aK17TOHwFAYT9sjxzeKAiIWRUBgLxmZ9mPcnzZXtTcRQ==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==" + }, + "node_modules/@types/katex": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", + "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==" + }, + "node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.11.tgz", + "integrity": "sha512-HM5bwOaIQJIQbAYfax35HCKxx7a3KrK3nBtIqJgSOitivTD1y3oW9P3rxY9RkXYPUk7y/AjAohfHKmFpGE79zw==" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/node": { + "version": "18.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", + "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + }, + "node_modules/@types/react": { + "version": "18.2.55", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.55.tgz", + "integrity": "sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + }, + "node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==" + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/arg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-1.0.0.tgz", + "integrity": "sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/astring": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", + "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001585", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001585.tgz", + "integrity": "sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dependencies": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "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==", + "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==", + "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==", + "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==", + "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", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/clipboardy": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.2.tgz", + "integrity": "sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==", + "dependencies": { + "arch": "^2.1.0", + "execa": "^0.8.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz", + "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==" + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/cytoscape": { + "version": "3.28.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.28.1.tgz", + "integrity": "sha512-xyItz4O/4zp9/239wCcH8ZcFuuZooEeF8KHRmzjDfGdXsj3OG9MFSMA0pJE0uX3uCN/ygof6hHf4L7lst+JaDg==", + "dependencies": { + "heap": "^0.2.6", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/d3": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", + "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", + "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", + "dependencies": { + "d3": "^7.8.2", + "lodash-es": "^4.17.21" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "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==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dompurify": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.8.tgz", + "integrity": "sha512-b7uwreMYL2eZhrSCRC4ahLTeZcPZxSmYfmcQGXGkXiZSNW1X85v+SDM5KsWcpivIiUBH47Ji7NtyUdpLeF5JZQ==" + }, + "node_modules/elkjs": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.1.tgz", + "integrity": "sha512-JWKDyqAdltuUcyxaECtYG6H4sqysXSLeoXuGUBfRNESMTkj+w+qdb0jya8Z/WI0jVd03WQtCGhS6FOFtlhD5FQ==" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz", + "integrity": "sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz", + "integrity": "sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz", + "integrity": "sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz", + "integrity": "sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-1.3.0.tgz", + "integrity": "sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==", + "dependencies": { + "is-plain-obj": "^3.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/estree-util-visit": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.1.tgz", + "integrity": "sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flexsearch": { + "version": "0.7.43", + "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.43.tgz", + "integrity": "sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==" + }, + "node_modules/focus-visible": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/focus-visible/-/focus-visible-5.2.0.tgz", + "integrity": "sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==" + }, + "node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/git-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" + } + }, + "node_modules/git-url-parse": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.1.tgz", + "integrity": "sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==", + "dependencies": { + "git-up": "^7.0.0" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-obj": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hash-obj/-/hash-obj-4.0.0.tgz", + "integrity": "sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==", + "dependencies": { + "is-obj": "^3.0.0", + "sort-keys": "^5.0.0", + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hast-util-from-dom": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.0.tgz", + "integrity": "sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==", + "dependencies": { + "@types/hast": "^3.0.0", + "hastscript": "^8.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-dom/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==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz", + "integrity": "sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html-isomorphic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz", + "integrity": "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-dom": "^5.0.0", + "hast-util-from-html": "^2.0.0", + "unist-util-remove-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html-isomorphic/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==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-from-html/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==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-from-html/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/hast-util-from-html/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==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/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==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-from-parse5/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/hast-util-from-parse5/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==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element/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==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector/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==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-raw": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz", + "integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/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==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-raw/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/hast-util-raw/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==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/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==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz", + "integrity": "sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "estree-util-attach-comments": "^2.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "mdast-util-mdx-expression": "^1.0.0", + "mdast-util-mdxjs-esm": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.1", + "unist-util-position": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/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==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.0.tgz", + "integrity": "sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text/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==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-to-text/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript/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==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/intersection-observer": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.12.2.tgz", + "integrity": "sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==" + }, + "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==", + "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==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-3.0.0.tgz", + "integrity": "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-ssh": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "dependencies": { + "protocols": "^2.0.1" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==" + }, + "node_modules/katex": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.9.tgz", + "integrity": "sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "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==", + "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", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/markdown-extensions": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-1.1.1.tgz", + "integrity": "sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/match-sorter": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz", + "integrity": "sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==", + "dependencies": { + "@babel/runtime": "^7.23.8", + "remove-accents": "0.5.0" + } + }, + "node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-math": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-2.0.2.tgz", + "integrity": "sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz", + "integrity": "sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==", + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-mdx-expression": "^1.0.0", + "mdast-util-mdx-jsx": "^2.0.0", + "mdast-util-mdxjs-esm": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz", + "integrity": "sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.4.tgz", + "integrity": "sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "ccount": "^2.0.0", + "mdast-util-from-markdown": "^1.1.0", + "mdast-util-to-markdown": "^1.3.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^4.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-remove-position": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz", + "integrity": "sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz", + "integrity": "sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", + "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "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-hast/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==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-to-hast/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-to-hast/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-to-hast/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-to-hast/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-to-hast/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-to-hast/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-to-hast/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==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/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==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.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-to-markdown": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mermaid": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.8.0.tgz", + "integrity": "sha512-9CzfSreRjdDJxX796+jW4zjEq0DVw5xVF0nWsqff8OTbrt+ml0TZ5PyYUjjUZJa2NYxYJZZXewEquxGiM8qZEA==", + "dependencies": { + "@braintree/sanitize-url": "^6.0.1", + "@types/d3-scale": "^4.0.3", + "@types/d3-scale-chromatic": "^3.0.0", + "cytoscape": "^3.28.1", + "cytoscape-cose-bilkent": "^4.1.0", + "d3": "^7.4.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.10", + "dayjs": "^1.11.7", + "dompurify": "^3.0.5", + "elkjs": "^0.9.0", + "khroma": "^2.0.0", + "lodash-es": "^4.17.21", + "mdast-util-from-markdown": "^1.3.0", + "non-layered-tidy-tree-layout": "^2.0.2", + "stylis": "^4.1.3", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.0", + "web-worker": "^1.2.0" + } + }, + "node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "dependencies": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-2.1.2.tgz", + "integrity": "sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==", + "dependencies": { + "@types/katex": "^0.16.0", + "katex": "^0.16.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz", + "integrity": "sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.5.tgz", + "integrity": "sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.1.tgz", + "integrity": "sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==", + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.1.tgz", + "integrity": "sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^1.0.0", + "micromark-extension-mdx-jsx": "^1.0.0", + "micromark-extension-mdx-md": "^1.0.0", + "micromark-extension-mdxjs-esm": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.5.tgz", + "integrity": "sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==", + "dependencies": { + "@types/estree": "^1.0.0", + "micromark-core-commonmark": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.1.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.9.tgz", + "integrity": "sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.3.tgz", + "integrity": "sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^2.0.0", + "estree-util-visit": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/next/-/next-13.5.6.tgz", + "integrity": "sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==", + "dependencies": { + "@next/env": "13.5.6", + "@swc/helpers": "0.5.2", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.31", + "styled-jsx": "5.1.1", + "watchpack": "2.4.0" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=16.14.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "13.5.6", + "@next/swc-darwin-x64": "13.5.6", + "@next/swc-linux-arm64-gnu": "13.5.6", + "@next/swc-linux-arm64-musl": "13.5.6", + "@next/swc-linux-x64-gnu": "13.5.6", + "@next/swc-linux-x64-musl": "13.5.6", + "@next/swc-win32-arm64-msvc": "13.5.6", + "@next/swc-win32-ia32-msvc": "13.5.6", + "@next/swc-win32-x64-msvc": "13.5.6" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-mdx-remote": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/next-mdx-remote/-/next-mdx-remote-4.4.1.tgz", + "integrity": "sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==", + "dependencies": { + "@mdx-js/mdx": "^2.2.1", + "@mdx-js/react": "^2.2.1", + "vfile": "^5.3.0", + "vfile-matter": "^3.0.1" + }, + "engines": { + "node": ">=14", + "npm": ">=7" + }, + "peerDependencies": { + "react": ">=16.x <=18.x", + "react-dom": ">=16.x <=18.x" + } + }, + "node_modules/next-seo": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/next-seo/-/next-seo-6.4.0.tgz", + "integrity": "sha512-XQFxkOL2hw0YE+P100HbI3EAvcludlHPxuzMgaIjKb7kPK0CvjGvLFjd9hszZFEDc5oiQkGFA8+cuWcnip7eYA==", + "peerDependencies": { + "next": "^8.1.1-canary.54 || >=9.0.0", + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/next-themes": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz", + "integrity": "sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==", + "peerDependencies": { + "next": "*", + "react": "*", + "react-dom": "*" + } + }, + "node_modules/nextra": { + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/nextra/-/nextra-2.13.3.tgz", + "integrity": "sha512-OBVuyQKh+oqrbVt0AosgNYnuReWuNrtJVEN7q18b/oEg2wEpuiq3UJfmIvGgOdNYc3zv3OYrzbcq7IhwtdHHEw==", + "dependencies": { + "@headlessui/react": "^1.7.17", + "@mdx-js/mdx": "^2.3.0", + "@mdx-js/react": "^2.3.0", + "@napi-rs/simple-git": "^0.1.9", + "@theguild/remark-mermaid": "^0.0.5", + "@theguild/remark-npm2yarn": "^0.2.0", + "clsx": "^2.0.0", + "github-slugger": "^2.0.0", + "graceful-fs": "^4.2.11", + "gray-matter": "^4.0.3", + "katex": "^0.16.9", + "lodash.get": "^4.4.2", + "next-mdx-remote": "^4.2.1", + "p-limit": "^3.1.0", + "rehype-katex": "^7.0.0", + "rehype-pretty-code": "0.9.11", + "rehype-raw": "^7.0.0", + "remark-gfm": "^3.0.1", + "remark-math": "^5.1.1", + "remark-reading-time": "^2.0.1", + "shiki": "^0.14.3", + "slash": "^3.0.0", + "title": "^3.5.3", + "unist-util-remove": "^4.0.0", + "unist-util-visit": "^5.0.0", + "zod": "^3.22.3" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "next": ">=9.5.3", + "react": ">=16.13.1", + "react-dom": ">=16.13.1" + } + }, + "node_modules/nextra-theme-docs": { + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/nextra-theme-docs/-/nextra-theme-docs-2.13.3.tgz", + "integrity": "sha512-B6xrnR86Gg4GzV56AomSwtmvSyAvnJz1xKOGGav1XKxkwvC8QeI17jdt/CqiKyIObJ+5bLqSFiKhaAZ5DYQP3g==", + "dependencies": { + "@headlessui/react": "^1.7.17", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "escape-string-regexp": "^5.0.0", + "flexsearch": "^0.7.31", + "focus-visible": "^5.2.0", + "git-url-parse": "^13.1.0", + "intersection-observer": "^0.12.2", + "match-sorter": "^6.3.1", + "next-seo": "^6.0.0", + "next-themes": "^0.2.1", + "scroll-into-view-if-needed": "^3.1.0", + "zod": "^3.22.3" + }, + "peerDependencies": { + "next": ">=9.5.3", + "nextra": "2.13.3", + "react": ">=16.13.1", + "react-dom": ">=16.13.1" + } + }, + "node_modules/non-layered-tidy-tree-layout": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", + "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-to-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/npm-to-yarn/-/npm-to-yarn-2.1.0.tgz", + "integrity": "sha512-2C1IgJLdJngq1bSER7K7CGFszRr9s2rijEwvENPEgI0eK9xlD3tNwDc0UJnRj7FIT2aydWm72jB88uVswAhXHA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/nebrelbug/npm-to-yarn?sponsor=1" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^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-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "node_modules/parse-path": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", + "dependencies": { + "protocols": "^2.0.0" + } + }, + "node_modules/parse-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "dependencies": { + "parse-path": "^7.0.0" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/property-information": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", + "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/protocols": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/rehype-katex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-7.0.0.tgz", + "integrity": "sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/katex": "^0.16.0", + "hast-util-from-html-isomorphic": "^2.0.0", + "hast-util-to-text": "^4.0.0", + "katex": "^0.16.0", + "unist-util-visit-parents": "^6.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-katex/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==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/rehype-katex/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/rehype-katex/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==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-katex/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-pretty-code": { + "version": "0.9.11", + "resolved": "https://registry.npmjs.org/rehype-pretty-code/-/rehype-pretty-code-0.9.11.tgz", + "integrity": "sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA==", + "workspaces": [ + "./word-highlighter-playground" + ], + "dependencies": { + "@types/hast": "^2.0.0", + "hash-obj": "^4.0.0", + "parse-numeric-range": "^1.3.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "shiki": "*" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw/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==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/rehype-raw/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/rehype-raw/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==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-math": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-5.1.1.tgz", + "integrity": "sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-math": "^2.0.0", + "micromark-extension-math": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.3.0.tgz", + "integrity": "sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==", + "dependencies": { + "mdast-util-mdx": "^2.0.0", + "micromark-extension-mdxjs": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-reading-time": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remark-reading-time/-/remark-reading-time-2.0.1.tgz", + "integrity": "sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==", + "dependencies": { + "estree-util-is-identifier-name": "^2.0.0", + "estree-util-value-to-estree": "^1.3.0", + "reading-time": "^1.3.0", + "unist-util-visit": "^3.1.0" + } + }, + "node_modules/remark-reading-time/node_modules/unist-util-visit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-3.1.0.tgz", + "integrity": "sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-reading-time/node_modules/unist-util-visit-parents": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz", + "integrity": "sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype/node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remove-accents": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==" + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shiki": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz", + "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==", + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/sort-keys": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-5.0.0.tgz", + "integrity": "sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==", + "dependencies": { + "is-plain-obj": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sort-keys/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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "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-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/stylis": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz", + "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==" + }, + "node_modules/supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==", + "dependencies": { + "has-flag": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/title": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/title/-/title-3.5.3.tgz", + "integrity": "sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==", + "dependencies": { + "arg": "1.0.0", + "chalk": "2.3.0", + "clipboardy": "1.2.2", + "titleize": "1.0.0" + }, + "bin": { + "title": "bin/title.js" + } + }, + "node_modules/titleize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-1.0.0.tgz", + "integrity": "sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==", + "engines": { + "node": ">=0.10.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==", + "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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-find-after/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/unist-util-find-after/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz", + "integrity": "sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-4.0.0.tgz", + "integrity": "sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==", + "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-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/unist-util-remove/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/unist-util-remove/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "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.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/unist-util-visit-parents/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/unist-util-visit/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", + "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/vfile-location/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==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-matter": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile-matter/-/vfile-matter-3.0.1.tgz", + "integrity": "sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==", + "dependencies": { + "@types/js-yaml": "^4.0.0", + "is-buffer": "^2.0.0", + "js-yaml": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-matter/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/vfile-matter/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/vfile-message/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==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==" + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==" + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/web-worker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", + "integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==" + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/pages/_meta.json b/pages/_meta.json index 164927dd..a28cc929 100644 --- a/pages/_meta.json +++ b/pages/_meta.json @@ -1,7 +1,11 @@ { "index": "Introduction", - "another": "Another Page", - "advanced": "Advanced (A Folder)", + "programming-tutorials": "Desishub Lessons", + "youtube": "YouTube Video Tutorials", + "website": "Website Templates Guides", + "course-guides": "Course Guides", + "courses": "Desishub Courses", + "how-to": "How to Guides", "about": { "title": "About", "type": "page" diff --git a/pages/advanced.mdx b/pages/advanced.mdx deleted file mode 100644 index a1a5148e..00000000 --- a/pages/advanced.mdx +++ /dev/null @@ -1,3 +0,0 @@ -# Advanced - -This is the index page for the Advanced folder! diff --git a/pages/another.mdx b/pages/another.mdx deleted file mode 100644 index 7fb6a023..00000000 --- a/pages/another.mdx +++ /dev/null @@ -1,31 +0,0 @@ -# Another Page - -```js filename="demo.js" {3} copy -let a = 1; - -console.log(a); -``` - -## Component - -import { useState } from 'react' - -{/* Import CSS modules */} -import styles from '../components/counters.module.css' - -export const Counter = () => { - const [count, setCount] = useState(0); - return ( -
- -
- ); -}; - - - -## External Component - -import Counters from '../components/counters' - - diff --git a/pages/courses/_meta.json b/pages/courses/_meta.json new file mode 100644 index 00000000..8609acf5 --- /dev/null +++ b/pages/courses/_meta.json @@ -0,0 +1,3 @@ +{ + "next": "Next JS Fullstack Course" +} diff --git a/pages/advanced/satori.mdx b/pages/courses/next.mdx similarity index 100% rename from pages/advanced/satori.mdx rename to pages/courses/next.mdx diff --git a/pages/programming-tutorials/_meta.json b/pages/programming-tutorials/_meta.json new file mode 100644 index 00000000..9f434e50 --- /dev/null +++ b/pages/programming-tutorials/_meta.json @@ -0,0 +1,6 @@ +{ + "index": "Introduction", + "html-and-css": "Html and Css Tutorial", + "js": "Javascript Tutorial", + "nextjs": "Next JS and TypeScript" +} diff --git a/pages/programming-tutorials/html-and-css/_meta.json b/pages/programming-tutorials/html-and-css/_meta.json new file mode 100644 index 00000000..a63bbcda --- /dev/null +++ b/pages/programming-tutorials/html-and-css/_meta.json @@ -0,0 +1,12 @@ +{ + "index": "Introduction and IDE setup", + "html-fundamentals": "Html Fundamentals", + "css-fundamentals": "Css Fundamentals", + "github": "Github and Git Desktop", + "deploying": "Deployment and Hosting", + "html-css-advanced": "Html and Css Advanced Techniques", + "layouts-responsive": "Css Layouts and Responsive design", + "sass": "Sass - Css with Superpowers", + "assignments": "Html and Css Assignment", + "html-css-projects": "Building projects with Html and Css" +} diff --git a/pages/programming-tutorials/html-and-css/assignments.mdx b/pages/programming-tutorials/html-and-css/assignments.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/html-and-css/css-fundamentals.mdx b/pages/programming-tutorials/html-and-css/css-fundamentals.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/html-and-css/deploying.mdx b/pages/programming-tutorials/html-and-css/deploying.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/html-and-css/github.mdx b/pages/programming-tutorials/html-and-css/github.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/html-and-css/html-css-advanced.mdx b/pages/programming-tutorials/html-and-css/html-css-advanced.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/html-and-css/html-css-projects.mdx b/pages/programming-tutorials/html-and-css/html-css-projects.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/html-and-css/html-fundamentals.mdx b/pages/programming-tutorials/html-and-css/html-fundamentals.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/html-and-css/index.mdx b/pages/programming-tutorials/html-and-css/index.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/html-and-css/intro-to-web.mdx.mdx b/pages/programming-tutorials/html-and-css/intro-to-web.mdx.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/html-and-css/layouts-responsive.mdx b/pages/programming-tutorials/html-and-css/layouts-responsive.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/html-and-css/sass.mdx b/pages/programming-tutorials/html-and-css/sass.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/index.mdx b/pages/programming-tutorials/index.mdx new file mode 100644 index 00000000..d82ccd40 --- /dev/null +++ b/pages/programming-tutorials/index.mdx @@ -0,0 +1 @@ +# Programming Tutorials Landing Page diff --git a/pages/programming-tutorials/js/_meta.json b/pages/programming-tutorials/js/_meta.json new file mode 100644 index 00000000..ab513eac --- /dev/null +++ b/pages/programming-tutorials/js/_meta.json @@ -0,0 +1,9 @@ +{ + "js-intro": "Introduction to Javascript", + "js-basics": "JavaScript Basics", + "js-dom": "DOM Manipulation with JavaScript", + "js-async": "Asynchronous JavaScript", + "js-es6": "JavaScript ES6+ Features", + "assignments": "JavaScript Assignments", + "js-projects": "Building projects with JavaScript" +} diff --git a/pages/programming-tutorials/js/assignments.mdx b/pages/programming-tutorials/js/assignments.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/js/js-arrays.mdx b/pages/programming-tutorials/js/js-arrays.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/js/js-async.mdx b/pages/programming-tutorials/js/js-async.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/js/js-basics.mdx b/pages/programming-tutorials/js/js-basics.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/js/js-dom.mdx b/pages/programming-tutorials/js/js-dom.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/js/js-es6.mdx b/pages/programming-tutorials/js/js-es6.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/js/js-intro.mdx b/pages/programming-tutorials/js/js-intro.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/js/js-projects.mdx b/pages/programming-tutorials/js/js-projects.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/nextjs/_meta.json b/pages/programming-tutorials/nextjs/_meta.json new file mode 100644 index 00000000..adb87041 --- /dev/null +++ b/pages/programming-tutorials/nextjs/_meta.json @@ -0,0 +1,16 @@ +{ + "next-intro": "Introduction to Next.js ", + "next-routing": "Routing in Next.js", + "next-state": "State Management in Next.js", + "next-data-fetching": "Asynchronous JavaScript", + "next-seo": "SEO in Next JS", + "next-deploy": "Deploying a Next Js Project", + "next-typescript": "TypeScript in Next JS", + "next-forms": "Handling Forms in Next.js", + "next-api": "API Routes in Next.js", + "next-actions": "Next JS Server Actions", + "next-mongo": "Integrating with Prisma and MongoDB", + "next-auth": "Authentication and Authorization", + "assignments": "Next JS Assignments", + "js-projects": "Building projects with JavaScript" +} diff --git a/pages/programming-tutorials/nextjs/assignments.mdx b/pages/programming-tutorials/nextjs/assignments.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/nextjs/next-actions.mdx b/pages/programming-tutorials/nextjs/next-actions.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/nextjs/next-api.mdx b/pages/programming-tutorials/nextjs/next-api.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/nextjs/next-auth.mdx b/pages/programming-tutorials/nextjs/next-auth.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/nextjs/next-data-fetching.mdx b/pages/programming-tutorials/nextjs/next-data-fetching.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/nextjs/next-deploy.mdx b/pages/programming-tutorials/nextjs/next-deploy.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/nextjs/next-forms.mdx b/pages/programming-tutorials/nextjs/next-forms.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/nextjs/next-intro.mdx b/pages/programming-tutorials/nextjs/next-intro.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/nextjs/next-mongo.mdx b/pages/programming-tutorials/nextjs/next-mongo.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/nextjs/next-projects.mdx b/pages/programming-tutorials/nextjs/next-projects.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/nextjs/next-routing.mdx b/pages/programming-tutorials/nextjs/next-routing.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/nextjs/next-seo.mdx b/pages/programming-tutorials/nextjs/next-seo.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/nextjs/next-state.mdx b/pages/programming-tutorials/nextjs/next-state.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/nextjs/next-typescript.mdx b/pages/programming-tutorials/nextjs/next-typescript.mdx new file mode 100644 index 00000000..e69de29b diff --git a/theme.config.tsx b/theme.config.tsx index 88b8e2b1..7c49a4b7 100644 --- a/theme.config.tsx +++ b/theme.config.tsx @@ -1,18 +1,18 @@ -import React from 'react' -import { DocsThemeConfig } from 'nextra-theme-docs' +import React from "react"; +import { DocsThemeConfig } from "nextra-theme-docs"; const config: DocsThemeConfig = { - logo: My Project, + logo: Desishub, project: { - link: 'https://github.com/shuding/nextra-docs-template', + link: "https://github.com/shuding/nextra-docs-template", }, chat: { - link: 'https://discord.com', + link: "https://discord.com", }, - docsRepositoryBase: 'https://github.com/shuding/nextra-docs-template', + docsRepositoryBase: "https://github.com/shuding/nextra-docs-template", footer: { - text: 'Nextra Docs Template', + text: "Nextra Docs Template", }, -} +}; -export default config +export default config; From 5262c147c146f8d4af2056b139c174268f5ebe76 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Tue, 20 Feb 2024 20:52:12 +0300 Subject: [PATCH 002/101] added home page --- components/Hero.jsx | 74 + package-lock.json | 1536 ++++++++++++++++- package.json | 3 + pages/_app.js | 6 + pages/_meta.json | 13 +- pages/how-to/code-snipetts.mdx | 1 + pages/index.mdx | 12 +- pages/interviews/best-practices.mdx | 0 pages/interviews/questions.mdx | 0 pages/programming-tutorials/nextjs/_meta.json | 2 + .../nextjs/get-staretd.mdx | 0 .../nextjs/next-intro.mdx | 124 ++ .../nextjs/next-packages.mdx | 206 +++ pages/roadmaps/_meta.json | 4 + pages/roadmaps/role-based/_meta.json | 20 + pages/roadmaps/role-based/ai-data.mdx | 0 pages/roadmaps/role-based/android.mdx | 0 pages/roadmaps/role-based/backend.mdx | 0 pages/roadmaps/role-based/blockchain.mdx | 0 pages/roadmaps/role-based/cyber-security.mdx | 0 pages/roadmaps/role-based/devops.mdx | 0 pages/roadmaps/role-based/flutter.mdx | 0 pages/roadmaps/role-based/frontend.mdx | 0 pages/roadmaps/role-based/fullstack.mdx | 0 pages/roadmaps/role-based/game-dev.mdx | 0 pages/roadmaps/role-based/index.mdx | 3 + pages/roadmaps/role-based/react-native.mdx | 0 pages/roadmaps/skill-based/_meta.json | 20 + pages/roadmaps/skill-based/angular.mdx | 0 pages/roadmaps/skill-based/aws.mdx | 0 .../roadmaps/skill-based/computer-science.mdx | 0 pages/roadmaps/skill-based/docker.mdx | 0 pages/roadmaps/skill-based/golang.mdx | 0 pages/roadmaps/skill-based/javascript.mdx | 0 pages/roadmaps/skill-based/kubernettes.mdx | 0 pages/roadmaps/skill-based/mongo.mdx | 0 pages/roadmaps/skill-based/node.mdx | 0 .../skill-based/prompt-engineering.mdx | 0 pages/roadmaps/skill-based/python.mdx | 0 pages/roadmaps/skill-based/react.mdx | 0 pages/roadmaps/skill-based/sql.mdx | 0 pages/roadmaps/skill-based/typescript.mdx | 0 pages/roadmaps/skill-based/vue.mdx | 0 postcss.config.js | 6 + styles/global.css | 3 + tailwind.config.js | 15 + theme.config.tsx | 28 +- 47 files changed, 2026 insertions(+), 50 deletions(-) create mode 100644 components/Hero.jsx create mode 100644 pages/_app.js create mode 100644 pages/how-to/code-snipetts.mdx create mode 100644 pages/interviews/best-practices.mdx create mode 100644 pages/interviews/questions.mdx create mode 100644 pages/programming-tutorials/nextjs/get-staretd.mdx create mode 100644 pages/programming-tutorials/nextjs/next-packages.mdx create mode 100644 pages/roadmaps/_meta.json create mode 100644 pages/roadmaps/role-based/_meta.json create mode 100644 pages/roadmaps/role-based/ai-data.mdx create mode 100644 pages/roadmaps/role-based/android.mdx create mode 100644 pages/roadmaps/role-based/backend.mdx create mode 100644 pages/roadmaps/role-based/blockchain.mdx create mode 100644 pages/roadmaps/role-based/cyber-security.mdx create mode 100644 pages/roadmaps/role-based/devops.mdx create mode 100644 pages/roadmaps/role-based/flutter.mdx create mode 100644 pages/roadmaps/role-based/frontend.mdx create mode 100644 pages/roadmaps/role-based/fullstack.mdx create mode 100644 pages/roadmaps/role-based/game-dev.mdx create mode 100644 pages/roadmaps/role-based/index.mdx create mode 100644 pages/roadmaps/role-based/react-native.mdx create mode 100644 pages/roadmaps/skill-based/_meta.json create mode 100644 pages/roadmaps/skill-based/angular.mdx create mode 100644 pages/roadmaps/skill-based/aws.mdx create mode 100644 pages/roadmaps/skill-based/computer-science.mdx create mode 100644 pages/roadmaps/skill-based/docker.mdx create mode 100644 pages/roadmaps/skill-based/golang.mdx create mode 100644 pages/roadmaps/skill-based/javascript.mdx create mode 100644 pages/roadmaps/skill-based/kubernettes.mdx create mode 100644 pages/roadmaps/skill-based/mongo.mdx create mode 100644 pages/roadmaps/skill-based/node.mdx create mode 100644 pages/roadmaps/skill-based/prompt-engineering.mdx create mode 100644 pages/roadmaps/skill-based/python.mdx create mode 100644 pages/roadmaps/skill-based/react.mdx create mode 100644 pages/roadmaps/skill-based/sql.mdx create mode 100644 pages/roadmaps/skill-based/typescript.mdx create mode 100644 pages/roadmaps/skill-based/vue.mdx create mode 100644 postcss.config.js create mode 100644 styles/global.css create mode 100644 tailwind.config.js diff --git a/components/Hero.jsx b/components/Hero.jsx new file mode 100644 index 00000000..d63b2c09 --- /dev/null +++ b/components/Hero.jsx @@ -0,0 +1,74 @@ +import Link from "next/link"; +import React from "react"; + +export default function Hero() { + const links = [ + { title: "Roadmaps Must see", path: "/roadmaps" }, + { title: "Desishub Lessons", path: "/desishub-lessons" }, + { title: "YouTube Video Tutorials", path: "/youtube-tutorials" }, + { title: "Website Templates Guides", path: "/website-templates" }, + { title: "Course Guides", path: "/course-guides" }, + { title: "Desishub Courses", path: "/desishub-courses" }, + { title: "How to Guides", path: "/how-to-guides" }, + ]; + + return ( +
+
+
+

+ + + New + + + Announcing new road maps for teams + Learn more + + + Announcing roadmap for teams + + +

+ + Developer Roadmaps + +

+ roadmap.sh + is a community effort to create roadmaps, guides and other + educational content to help guide developers in picking up a path + and guide their learnings. +

+

+ Community created roadmaps, guides and articles to help developers + grow in their career. +

+
+
+
+
+

+ Role based Roadmap +

+
    + {links.map((item, i) => { + return ( +
  • + + {item.title} + +
  • + ); + })} +
+
+
+
+ ); +} diff --git a/package-lock.json b/package-lock.json index 788993a3..4e7c80b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,9 +17,24 @@ }, "devDependencies": { "@types/node": "18.11.10", + "autoprefixer": "^10.4.17", + "postcss": "^8.4.35", + "tailwindcss": "^3.4.1", "typescript": "^4.9.3" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@babel/runtime": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", @@ -52,6 +67,71 @@ "react-dom": "^16 || ^17 || ^18" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@mdx-js/mdx": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.3.0.tgz", @@ -449,6 +529,51 @@ "node": ">= 10" } }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -650,6 +775,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/ansi-sequence-parser": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", @@ -666,6 +803,25 @@ "node": ">=4" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", @@ -706,6 +862,43 @@ "astring": "bin/astring" } }, + "node_modules/autoprefixer": { + "version": "10.4.17", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", + "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.22.2", + "caniuse-lite": "^1.0.30001578", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -715,6 +908,74 @@ "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", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -726,6 +987,15 @@ "node": ">=10.16.0" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001585", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001585.tgz", @@ -811,6 +1081,42 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -889,6 +1195,18 @@ "which": "^1.2.9" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -1400,6 +1718,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, "node_modules/diff": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", @@ -1408,16 +1732,40 @@ "node": ">=0.3.1" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "node_modules/dompurify": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.8.tgz", "integrity": "sha512-b7uwreMYL2eZhrSCRC4ahLTeZcPZxSmYfmcQGXGkXiZSNW1X85v+SDM5KsWcpivIiUBH47Ji7NtyUdpLeF5JZQ==" }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.665", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.665.tgz", + "integrity": "sha512-UpyCWObBoD+nSZgOC2ToaIdZB0r9GhqT2WahPKiSki6ckkSuKhQNso8V2PrFcHBMleI/eqbKgVQgVC4Wni4ilw==", + "dev": true + }, "node_modules/elkjs": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.1.tgz", "integrity": "sha512-JWKDyqAdltuUcyxaECtYG6H4sqysXSLeoXuGUBfRNESMTkj+w+qdb0jya8Z/WI0jVd03WQtCGhS6FOFtlhD5FQ==" }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -1429,6 +1777,15 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -1566,6 +1923,55 @@ "node": ">=0.10.0" } }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/flexsearch": { "version": "0.7.43", "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.43.tgz", @@ -1576,38 +1982,195 @@ "resolved": "https://registry.npmjs.org/focus-visible/-/focus-visible-5.2.0.tgz", "integrity": "sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==" }, - "node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, "engines": { - "node": ">=4" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "node_modules/foreground-child/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/git-url-parse": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.1.tgz", - "integrity": "sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==", - "dependencies": { - "git-up": "^7.0.0" + "node_modules/foreground-child/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/github-slugger": { + "node_modules/foreground-child/node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/git-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" + } + }, + "node_modules/git-url-parse": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.1.tgz", + "integrity": "sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==", + "dependencies": { + "git-up": "^7.0.0" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, @@ -1654,6 +2217,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hast-util-from-dom": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.0.tgz", @@ -2106,6 +2681,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", @@ -2128,6 +2715,18 @@ "node": ">=4" } }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "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", @@ -2145,6 +2744,36 @@ "node": ">=0.10.0" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "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", @@ -2154,6 +2783,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-3.0.0.tgz", @@ -2205,6 +2843,33 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2268,6 +2933,21 @@ "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -2890,6 +3570,15 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/mermaid": { "version": "10.8.0", "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.8.0.tgz", @@ -3668,6 +4357,43 @@ } ] }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -3681,6 +4407,17 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -3782,6 +4519,33 @@ "react-dom": "*" } }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/nextra": { "version": "2.13.3", "resolved": "https://registry.npmjs.org/nextra/-/nextra-2.13.3.tgz", @@ -3849,11 +4613,35 @@ "react-dom": ">=16.13.1" } }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, "node_modules/non-layered-tidy-tree-layout": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -3876,6 +4664,24 @@ "url": "https://github.com/nebrelbug/npm-to-yarn?sponsor=1" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -3957,25 +4763,87 @@ "node": ">=4" } }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, "funding": [ { "type": "opencollective", @@ -3991,7 +4859,7 @@ } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -3999,6 +4867,124 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, "node_modules/property-information": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", @@ -4018,6 +5004,26 @@ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -4041,6 +5047,27 @@ "react": "^18.2.0" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/reading-time": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", @@ -4341,11 +5368,61 @@ "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==" }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/robust-predicates": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", @@ -4501,6 +5578,65 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/stringify-entities": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", @@ -4514,6 +5650,43 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", @@ -4565,6 +5738,37 @@ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz", "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==" }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/supports-color": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", @@ -4576,6 +5780,82 @@ "node": ">=4" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", + "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/title": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/title/-/title-3.5.3.tgz", @@ -4598,6 +5878,18 @@ "node": ">=0.10.0" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -4624,6 +5916,12 @@ "node": ">=6.10" } }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -4879,6 +6177,42 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, "node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -5087,11 +6421,141 @@ "which": "bin/which" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 0a47d272..9034ac4c 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,9 @@ }, "devDependencies": { "@types/node": "18.11.10", + "autoprefixer": "^10.4.17", + "postcss": "^8.4.35", + "tailwindcss": "^3.4.1", "typescript": "^4.9.3" } } diff --git a/pages/_app.js b/pages/_app.js new file mode 100644 index 00000000..17a7e022 --- /dev/null +++ b/pages/_app.js @@ -0,0 +1,6 @@ +import "../styles/global.css"; + +// This default export is required in a new `pages/_app.js` file. +export default function MyApp({ Component, pageProps }) { + return ; +} diff --git a/pages/_meta.json b/pages/_meta.json index a28cc929..a35ce404 100644 --- a/pages/_meta.json +++ b/pages/_meta.json @@ -1,5 +1,16 @@ { - "index": "Introduction", + "index": { + "title": "Introduction", + "theme": { + "layout": "full", + "breadcrumb": false, + "footer": true, + "sidebar": true, + "toc": true, + "pagination": false + } + }, + "roadmaps": "Roadmaps Must see", "programming-tutorials": "Desishub Lessons", "youtube": "YouTube Video Tutorials", "website": "Website Templates Guides", diff --git a/pages/how-to/code-snipetts.mdx b/pages/how-to/code-snipetts.mdx new file mode 100644 index 00000000..afeb18d7 --- /dev/null +++ b/pages/how-to/code-snipetts.mdx @@ -0,0 +1 @@ +https://www.30secondsofcode.org/ diff --git a/pages/index.mdx b/pages/index.mdx index 058465cb..2e590bbd 100644 --- a/pages/index.mdx +++ b/pages/index.mdx @@ -1,11 +1,3 @@ -# Introduction - -Welcome to Nextra! This is a basic docs template. You can use it as a starting point for your own project :) +import Hero from "../components/Hero"; -## What is Nextra? - -A **simple**, **powerful** and **flexible** site generation framework with everything you love from Next.js. - -## Documentation - -The documentation is available at [https://nextra.site](https://nextra.site). + diff --git a/pages/interviews/best-practices.mdx b/pages/interviews/best-practices.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/interviews/questions.mdx b/pages/interviews/questions.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/nextjs/_meta.json b/pages/programming-tutorials/nextjs/_meta.json index adb87041..188f6b12 100644 --- a/pages/programming-tutorials/nextjs/_meta.json +++ b/pages/programming-tutorials/nextjs/_meta.json @@ -1,5 +1,6 @@ { "next-intro": "Introduction to Next.js ", + "get-started": "Get Started with Next Js", "next-routing": "Routing in Next.js", "next-state": "State Management in Next.js", "next-data-fetching": "Asynchronous JavaScript", @@ -11,6 +12,7 @@ "next-actions": "Next JS Server Actions", "next-mongo": "Integrating with Prisma and MongoDB", "next-auth": "Authentication and Authorization", + "next-packages": "Next JS Commonly used Resources", "assignments": "Next JS Assignments", "js-projects": "Building projects with JavaScript" } diff --git a/pages/programming-tutorials/nextjs/get-staretd.mdx b/pages/programming-tutorials/nextjs/get-staretd.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/programming-tutorials/nextjs/next-intro.mdx b/pages/programming-tutorials/nextjs/next-intro.mdx index e69de29b..30ab1d33 100644 --- a/pages/programming-tutorials/nextjs/next-intro.mdx +++ b/pages/programming-tutorials/nextjs/next-intro.mdx @@ -0,0 +1,124 @@ +# Next.js vs React: The Difference and Which Framework to Choose + +### Introduction: + +The JavaScript ecosystem is vibrant and constantly evolving, with new tools and frameworks emerging regularly. Among these, React has established itself as a leading library for building user interfaces, thanks to its innovative features and ease of use. However, Next.js, built on top of React, offers additional functionality and advantages. In this article, we'll delve into the distinctions between React and Next.js, exploring their respective strengths and weaknesses. + +### What is React? + +React, developed by Meta, is a powerful UI library designed to create reactive web applications. Unlike traditional approaches that necessitate full page reloads upon data changes, React enables dynamic updates through its virtual DOM and component-based architecture. JSX, a JavaScript syntax extension, simplifies the creation of React elements, enhancing developer productivity. React's one-way data binding ensures efficient data flow and enhances code maintainability. + +### Advantages of React: + +- Easy to Learn: Abundant learning resources and a supportive community make React accessible to developers of all skill levels. +- Reusable Components: React's component-based architecture promotes code reusability and modularity, facilitating the creation of scalable applications. +- Performance Enhancement: Utilizing a virtual DOM, React optimizes rendering efficiency, resulting in faster and more responsive applications. +- SEO Friendliness: React's server-side rendering capabilities enhance SEO by ensuring content visibility to search engines. +- Unit Testing: React's modular structure simplifies unit testing, enabling developers to ensure code quality and reliability. + +### Disadvantages of React: + +- Fast-paced Development: React's rapid evolution may pose challenges for developers in keeping up with updates and changes. +- Complex Documentation: Navigating React's extensive documentation can be daunting, especially for beginners, due to its size and complexity. +- Re-rendering: React's component lifecycle may lead to unnecessary re-renders, impacting performance and efficiency. + +## What Is Next.js? + +Next.js is a light framework built on top of React that makes it easy to create fast, server-rendered websites. It was created by the team at Vercel and has been open-source from the beginning. + +Next.js is used by some of the biggest names in the tech industry, including Airbnb, Twitter, and Uber. One of Next.js's key features is its ability to automatically code-split your application, meaning that each page only loads the necessary JavaScript for that page view. This results in faster page loads and an improved user experience. + +Another key feature is its seamless integration with React Hooks, allowing you to use stateful components without extra configuration. + +### Features of Next.js + +The following features make Nextjs a cutting-edge tool for developers: + +- File system routing +- Server Side rendering +- Static site generator +- Image optimization +- Automatic code splitting +- Type script support +- API route +- Server Actions + +### File System Routing + +Next.js is a JavaScript framework that makes creating routes for your web app easy. + +When you add a file to the page’s directory, it is automatically available as a route. This makes it very easy to create complex web apps with many different pages. + +In addition, Next.js provides a number of features that make it easy to manage your routes. For example, you can easily specify the order in which your routes are displayed, and you can also specify how your routes are displayed on mobile devices. + +As a result, Next.js is an ideal choice for creating web apps with many different pages. + +### Server-Side Rendering + +Next.js supports the rendering of pages on user requests on the server-side by generating a non-interactive HTML, while React uses JSON data and JavaScript instruction to make the page interactive on the client-side. + +### Static Site Generator + +Statically generated web pages are said to be SEO optimized because of their speed, which can make Google rank that page higher. With Next.js supporting static page generation makes it stands out against React. + +### Image Optimization + +The HTML `` tag has been evolved by the Next.js team with built-in performance to help with picture optimization. To use this feature, the next/image component is imported. With this feature, images automatically resize to the screen size seamlessly, even images from a remote location. This new feature provides developers with an easy way to optimize their images for performance without having to manually resize or compress them. + +In addition, the Next.js team has also added a built-in loading spinner that will be displayed while an image is loading, further improving the user experience. With these new features, the Next.js framework continues to be an excellent choice for building high-performance web applications. + +### Automatic Code Splitting + +As your Next.js applications grow bigger, the size of a third-party library, CSS, and JavaScript files or bundles increases. Instead of downloading a large file on page load, these code/scripts can be split into smaller units, and for every feature required, these scripts are downloaded immediately, thereby increasing performance. + +What is so intriguing about this is that Next.js does this automatically. + +### Typescript Support + +Typescript is a superset of JavaScript that adds type checking and other features that can help to improve the quality of code. While Typescript is not required for Next.js, it can be a valuable tool for developers looking to improve the quality of their code. + +### API Route + +Next.js provides a built-in way to create your own APIs, called API routes. With API routes, you can create your own endpoints and handle incoming requests however you want. You can use API routes to create a custom backend for your Next.js application or to expose data from your database to the front end. Either way, API routes give you a lot of flexibility in how you build your Next.js application. + +## Advantages of Next.js + +What reasons are there to use Next.js for your next project or even considering to learn it? + +#### Speed + +Next.js supports static site generation and server-side rendering. Static generation is fast because all web application pages have been pre-rendered, cached, and served over a CDN. + +Server-side rendering is fast as the server handling the request, but on request, these pages are already built on the server rather than being built on the client side. + +#### Less Setup + +In Next.js, most features you get come with zero configuration as they are inbuilt. For example, the page routing is where you do not need to write any code to create a route in your app. + +#### Easily Create Your Own Back-End + +Easily create your custom back-end functionalities to power your own front-end. This does not affect the size bundle of your client-side application. + +#### Built-In CSS Support + +One of the key features of Next.js is its built-in CSS support. This means that developers can include CSS Stylesheets within their Next.js projects without needing to use any additional libraries or tooling. This can be particularly useful for small projects where adding a CSS preprocessor would add unnecessary complexity. + +In addition, the built-in CSS support means that developers can take advantage of features such as server-side rendering and code splitting without having to worry about whether their CSS will be properly processed. + +## WHAT CAN YOU BUILD WITH NEXT.JS? + +With Next.js you can build a number of digital products and interfaces such as: + +- Web Platform +- Jamstack websites +- MVP (Minimum Viable Product) +- Static websites +- Single web pages +- SaaS products +- eCommerce and retail websites +- Dashboards +- Complex and demanding web applications +- Interactive user interfaces + And i love to use it in various projects since it gives us so many possibilities. + +Get Inspired by Seeing Websites built in next js here is their [showcase Page](https://nextjs.org/showcase) : diff --git a/pages/programming-tutorials/nextjs/next-packages.mdx b/pages/programming-tutorials/nextjs/next-packages.mdx new file mode 100644 index 00000000..94afdcba --- /dev/null +++ b/pages/programming-tutorials/nextjs/next-packages.mdx @@ -0,0 +1,206 @@ +{/* https://github.com/officialrajdeepsingh/awesome-nextjs?tab=readme-ov-file */} + +# Awesome Nextjs[[Awesome](https://awesome.re/badge.svg)](https://awesome.re) + +I have compiled a list of NPM libraries that can be used to develop small and large-scale applications with Next.js. The list is based on my experience as a front-end developer, and I have used 80% of the packages mentioned. + +As I discover more packages in the future, I will add them to the current list to help other front-end developers build applications with Next.js more efficiently. + +To stay updated, Subscribe to my [YouTube Channel](https://www.youtube.com/@JBWEBDEVELOPER). + +## Contents + +- [Officially for Nextjs](#officially-for-nextjs) +- [Specifically for Nextjs](#specifically-for-nextjs) +- [Documentation](#documentation) +- [Blogging](#blogging) +- [Nextjs boilerplate](#nextjs-boilerplate) +- [Headless CMS](#headless-cms) +- [Database](#database) +- [Authentication and User Management](#authentication-and-user-management) +- [State Management](#state-management) +- [React UI Library](#react-ui-library) +- [Icons Library](#icons-library) +- [Static Search library](#static-search-library) +- [Nextjs based Template](#nextjs-based-template) +- [Ready-Made Reactjs Hooks](#ready-made-reactjs-hooks) +- [Tailwind CSS](#tailwind-css) +- [Development Tool](#development-tool) +- [Error Handling](#error-handling) +- [VS Code Extensions](#vs-code-extensions) +- [Chrome Extension](#chrome-extension) +- [Utility (Others)](#utility-others) + +## Officially for Nextjs + +- [Turborepo](https://turbo.build/repo) - Turborepo is a high-performance build system for JavaScript and TypeScript codebases. +- [Turbopack](https://turbo.build/pack) - Turbopack is an incremental bundler optimized for JavaScript and TypeScript, written in Rust. +- [Swr](https://github.com/vercel/swr) - React Hooks for Data Fetching. +- [Satori](https://github.com/vercel/satori) - Enlightened library to convert HTML and CSS to SVG. +- [React tweet](https://github.com/vercel/react-tweet) - Embed tweets in your React application. + +## specifically for Nextjs + +- [Next SEO](https://www.npmjs.com/package/next-seo) - Next SEO is a plugin that helps manage the SEO in Next.js. +- [Next sitemap](https://www.npmjs.com/package/next-sitemap) - The next sitemap library helps you create a sitemap file in your nextjs application. +- [Next auth](https://www.npmjs.com/package/next-auth) - Next auth library provides authorization functionality for your app. +- [Next PWA](https://www.npmjs.com/package/next-pwa) - Next PWA library helps to enable your application's progressive Web Apps functionality. +- [Content layer](https://www.npmjs.com/package/contentlayer) - The content layer works with nextjs and markdown and helps build the blog application. +- [Nextjs progress bar](https://www.npmjs.com/package/nextjs-progressbar) - Nextjs progress bar shows the loading indicator in nextjs. +- [Nextjs Google Analytics](https://www.npmjs.com/package/nextjs-google-analytics) - Add Google Analytics to your nextjs app. +- [Next-themes](https://www.npmjs.com/package/next-themes) - You can enable the dark-to-light theme toggle with next-themes in your Next.js app. +- [Create t3-app](https://create.t3.gg/) - Build the full-stack application with TypeScript, Prisma, tRPC, NextAuth, Tailwind CSS, and Next.js app. +- [Tina CMS](https://tina.io/) - Tina CMS is a new nextjs-based CMS, an open-source, Git-backed headless CMS you can use with Markdown, MDX, and JSON. + +## Documentation + +- [Next MDX](https://www.npmjs.com/package/@next/mdx) - MDX library combines the JSX and markdown content. +- [Nextra](https://nextra.site/) - Nextra is a simple, powerful, and flexible site generation framework to build blogs and documents with Next.js and MDX. +- [Markdoc](https://markdoc.dev/) - Markdoc is a powerful, flexible, Markdown-based authoring framework. +- [Outstatic](https://outstatic.com) - Outstatic is a new static site content management system(CMS) built with Next.js. Special built for Next.js. It works with a page and app router. + +## Blogging + +- [Section blog theme](https://github.com/frontendweb3/section-theme-blog) - The section blog theme is nextra-based MDX theme. + +## Nextjs boilerplate + +- [Next.js Enterprise Boilerplate](https://github.com/Blazity/next-enterprise) - Next.js Enterprise Boilerplate, an open-source template, builds a high-performance, maintainable, and enjoyable application. +- [Refine](https://refine.dev/) - Refine, an open-source Open-source Retool for Enterprise Build React-based internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. +- [Create t3 App](https://github.com/t3-oss/create-t3-app) - Interactive CLI to start a full-stack, type-safe new Next.js application. +- [Nextjs Boilerplate](https://github.com/ixartz/Next-js-Boilerplate) - Start new projects with App Router and Page Router support, Tailwind CSS and TypeScript, and many more. +- [Superplate](https://github.com/pankod/superplate) - Superplate is well-structured and production-ready and comes with Typescript, Popular UI Kits and +30 plugins. +- [Next.js + Tailwind CSS + TypeScript Starter and Boilerplate](https://github.com/theodorusclarence/ts-nextjs-tailwind-starter) - Combination of Next.js, Tailwind CSS, and TypeScript. + +## Headless CMS + +- [WordPress](https://wordpress.org/) - WordPress is an open-source CMS ready for production. Using the built-in REST API, WordPress can power any website. +- [Strapi](https://strapi.io/) - Strapi is a powerful open-source node js-based Content Management System (CMS) perfect for small to large-scale websites. +- [Ghost](https://ghost.org/) - Ghost is a popular open-source CMS perfect for creating blogs. It offers a simple, user-friendly API interface that makes creating and publishing articles easy. +- [Netlify CMS](https://github.com/decaporg/decap-cms) - Decap CMS(Netlify CMS) work with all type of static site generators. It permits users to edit, update, and delete content on any site built with a static generator. You can use Decap CMS without any technical knowledge. +- [Forestry](https://forestry.io/) - Forestry is a headless CMS easy-to-customizable, configurable and integrated with all types of static site generators. +- [Craft CMS](https://craftcms.com/) - Craft CMS is a flexible, user-friendly CMS for creating the web. +- [Payload CMS](https://payloadcms.com) - Build a modern backend admin UI with payload CMS. No black magic, all TypeScript, and fully open-source, Payload is both an app framework and a headless CMS. + +## Database + +- [Supabase](https://supabase.com) - Supabase is an open source Firebase alternative. +- [PlanetScale](https://planetscale.com/) - PlanetScale is the worlds most advanced MySQL platform. +- [MongoDB](https://www.mongodb.com/) - MongoDB helps to built small and large platform. + +## Authentication and User Management + +- [Clerk](https://clerk.com/) - Clerk is more than a "sign-in box" and integrates complete user management UIs and APIs, purpose-built for React, Next.js, and the Modern Web. +- [Mojo Auth](https://mojoauth.com/) - Mojo Auth is a secure and delightful passwordless login solution. +- [Auth kit](https://www.authkit.com/) - MojoAuth offers a passwordless authentication solution for any web and mobile application. +- [Kinde](https://kinde.com) - Simple, robust authentication built for developers. +- [Stytch](https://stytch.com) - Stytch is enterprise-ready authentication and authorization. + +## State Management + +- [Zustand](https://github.com/pmndrs/zustand) - Zustand is a fast and scalable state management tool built by developers for React.js. +- [Redux](https://redux.js.org/) - Redux is an open-source JavaScript library for state managing tools. It is most commonly used with libraries such as React or Angular and helps build application user interfaces. +- [Recoil](https://recoiljs.org/) - Recoil is a state management library for React built by meta. +- [Jotai](https://jotai.org/) - Jotai is a primitive and flexible state management library for Reactjs. +- [React context](https://react.dev/learn/passing-data-deeply-with-context) - React.createContext() is a React API allowing you to pass or share between react components. + +## React UI Library + +- [Tail Spark](https://tailspark.co) - Tail Spark is lightning, fast, beautifully designed and ready for production. Tail Spark comes with 300+ Tailwind CSS Components, All the components come with copy and paste code. +- [Radix UI](https://www.radix-ui.com/) - An open-source component library optimized for fast development, easy maintenance, and accessibility. +- [Shadcn UI](https://ui.shadcn.com/) - Beautifully designed components that you can copy and paste into your apps. Accessible. Customizable. Open Source. +- [MUI](https://mui.com/) - Material UI provides a simple, customizable, accessible library of React components. +- [Primer React](https://primer.style/react/) - Primer React is built with Primer CSS and ReactJs by GitHub. +- [React bootstrap](https://react-bootstrap.github.io/) - React bootstrap is made based on React and bootstrap. +- [Ant Design](https://ant.design/) - Ant Design UI is a high-quality React components library that helps designers/developers build beautiful products. +- [Chakra UI](https://chakra-ui.com/) - With the help of Chakra UI, you can quickly design a simple to complex site. It gives you the building blocks to build your React applications. +- [Kuma UI](https://www.kuma-ui.com/) - Empower Your Web with Ultimate Performance and Flexibility. +- [Aceternity UI](https://ui.aceternity.com/) - Beautiful Tailwind CSS and Framer Motion Components, built with Next.js and TypeScript. + +## Icons Library + +- [React icons](https://react-icons.github.io/react-icons/) - Use the popular SVG icons in your React projects easily with react-icons. +- [MUI Icons](https://mui.com/material-ui/material-icons/) - Material icons are ready to use with React, officially designed and maintained by the MUI team. +- [Icon Buddy](https://iconbuddy.app/) - Icon Buddy comes for downloads, customizations, edits, and personalized. Icon Buddy has over 180k open-source icons. +- [Flowbite Icon](https://flowbite.com/icons/) - Flowbite Icons is a 487+ free and open-source SVG icon library. it is compatible with Flowbite and Tailwind CSS based on solid and outline styles with React (JSX) and Figma support. +- [Hero Icons](https://heroicons.com/) - Beautiful hand-crafted SVG icons, by the makers of Tailwind CSS. +- [Lucide](https://lucide.dev/) - Beautiful & consistent icons Made by the community. +- [Eva Icons](https://akveo.github.io/eva-icons) - Eva Icons is a pack of over 480 beautifully crafted Open Source icons for common use. +- [Icon Monstr](https://iconmonstr.com/) - Icon Monstr is a free, monstrously big, and continuously growing icon library. +- [Icon SVG](https://iconsvg.xyz/) - ICONSVG is a tool to simplify finding and generating common icons for your project. +- [Iconoir](https://iconoir.com/) - Iconoir is an open-source library with 1300+ unique SVG icons, designed on a 24x24 pixels grid. No premium icons, no email sign-up, no newsletters. +- [Icons download](https://icons.download/) - Open-source free universal icons. + +## Static Search library + +- [Fusejs](https://fusejs.io/) - Fusejs is a popular, powerful, lightweight search library for creating search functionality for sites. +- [Flex Search](https://github.com/nextapps-de/flexsearch) - Next-Generation full-text search library for Browser and Node.js. +- [Orama](https://docs.oramasearch.com/) - Orama is a powerful full-text search engine that works both on client and server. + +## Nextjs based Template + +- [Minimalist](https://github.com/frontendweb3/minimalist) - Minimalist blog template built with nextjs and tailwind CSS. +- [Open Blog](https://github.com/frontendweb3/open-blog) - Open blog is a blogging template built with nextjs, tailwind CSS and markdown. +- [Blogify](https://github.com/frontendweb3/blogify) - Blogify is an open-source nextjs blog template design with tailwind CSS. + +## Ready-Made Reactjs Hooks + +- [usehooks-ts](https://usehooks-ts.com) - React hook library, ready to use, written in Typescript. +- [Mantine Hooks](https://mantine.dev/getting-started) - Mantine Hooks provide Inbuilt readymade reactjs hooks for handling state and UI management. +- [usehooks](https://usehooks.com) - A collection of built-in modern, server-side React hooks. +- [React Custom Hooks](https://github.com/sergeyleschev/react-custom-hooks) - Supercharge Your Projects with ready-made custom hooks. + +## Tailwind CSS + +- [Flowbite](https://flowbite.com/) - Flowbite is a popular library built with tailwind CSS and provides inbuilt tailwind CSS components for developers. +- [Preline](https://preline.co/docs/index.html) - Preline is a popular library built with tailwind CSS and provides inbuilt tailwind CSS components for developers. +- [Material Tailwind](https://www.material-tailwind.com/) - Material Tailwind comes with ready-made components. You can design pure HTML and react website layouts using material tailwind components. +- [Meraki UI](https://merakiui.com/) - Meraki UI provides 144+ custom UI components built with tailwind CSS and Alpine JS. +- [Sailboat UI](https://sailboatui.com/) - Sailboat UI provides 150+ tailwind CSS components with tailwind CSS and alpine.js. +- [Kometa](https://kitwind.io/products/kometa/) - Kometa provides 130 inbuilt tailwinds CSS-based components, and Kometa is free. +- [Headless UI](https://headlessui.com) - Headless UI is a slight tailwind CSS-based component library only for React developers. +- [Daisy UI](https://daisyui.com/) - Daisy UI is an open-source UI based on tailwind CSS. The Big motivation is to use daisy UI in our project. +- [Hyper UI](https://www.hyperui.dev/) - Hyper UI is a free open-source tailwind CSS-based component for modern design. Hyper UI is a complete bundle of CSS and JavaScript. +- [Flowrift](https://flowrift.com/c/banner) - Flowrift is a free open-source tailwind CSS-based component library. It provides different category components for the website. +- [Tailwind UI kit](https://tailwinduikit.com/) - The tailwind UI kit offers an extensive list of inbuilt components. In the free plan tailwind, the UI kit provides only 250 components; in the paid plan, you access all components and templates for a lifetime. +- [Tailwind-kit](https://www.tailwind-kit.com/) - The tailwind kit provides access to over 250 free tailwinds CSS-based components. +- [Wickedblocks](https://wickedblocks.dev/) - Wickedblocks provides a free 120 fully responsive tailwind CSS-based component, and all components come ready to copy and paste into your Tailwind projects. +- [Tailus](https://tailus.io/) - Tailus provides a list of UI components and templates built on tailwind CSS. Tailus components offer a rich and modern UI experience. +- [Tailgrids](https://tailgrids.com/) - Tailgrids provides a variety of 500+ components, blocks, sections, and templates built on tailwind CSS. +- [Kutty](https://kutty.netlify.app/) - Kutty is based on reusable tailwind CSS components and adds component interaction with alpine.js. +- [Windmill UI](https://windmillui.com/) - Windmill UI is a free react base UI component library design with tailwind CSS. +- [Myna UI](https://mynaui.com/) - Myna UI is open source tailwind CSS-based component library. It provides few components as compared to other libraries. +- [Tailwind Starter Kit](https://www.creative-tim.com/learning-lab/tailwind-starter-kit/presentation) - Tailwind Starter Kit is a Free and Open Source library. The Tailwind Starter Kit is based on Tailwind CSS. +- [Tailblocks](https://tailblocks.cc/) - Tailblocks is a small library based on tailwind CSS. Tailblocks provide 60+ inbuilt components. +- [Tailwind toolbox](https://www.tailwindtoolbox.com/) - A tailwind toolbox site is where you find other people's projects on tailwind CSS. All the project is free, and you copy and paste code into your project. +- [Next UI](https://nextui.org) - Beautiful, fast, and modern React UI library. +- [Lang UI](https://www.langui.dev/) - Beautifully crafted Tailwind components for your GPT projects. + +## Development Tool + +- [Typescript](https://www.typescriptlang.org/) - Typescript helps to write type-safe JavaScript for production. +- [@next/eslint-plugin-next](https://www.npmjs.com/package/@next/eslint-plugin-next) - Next/eslint-plugin help to resolve the error. +- [@next/bundle-analyzer](https://www.npmjs.com/package/@next/bundle-analyzer) - Analyzer your nextjs bundle size using a webpack bundle analyzer. + +## Error Handling + +- [React Error Boundary](https://www.npmjs.com/package/react-error-boundary?activeTab=readme) - The react error boundary package is a reusable React error boundary component. You can wrap your application with an Error Boundary component around other React components to catch errors and render a fallback UI. +- [Use error boundary](https://www.npmjs.com/package/use-error-boundary) - The use-error-boundary is a react hook, it is built to handle error boundaries in your react functional components. + +## VS Code Extensions + +- [Next.Nav](https://marketplace.visualstudio.com/items?itemName=NextNav.NextNav) - Using the VS Code extension, navigate and create routes easily in your Next.js application. +- [Nextjs snippets](https://marketplace.visualstudio.com/items?itemName=PulkitGangwar.nextjs-snippets) - Ready-made snippets for Next.js. +- [Front Matter CMS](https://marketplace.visualstudio.com/items?itemName=eliostruyf.vscode-front-matter) - Front Matter CMS gives you the power, flexibility, and control to work with Markdown. +- [React and Next.js Snippets](https://marketplace.visualstudio.com/items?itemName=AvneeshAgarwal.react-nextjs-snippets) - A VSCode extension packed with the latest React and Next.js snippets. + +## Chrome Extension + +- [Gimli](https://gimli.app/) - Gimli Chrome extension is an innovative visual tool for front-end developers to build with tailwind CSS. +- [NextJS Utilities Extension](https://chrome.google.com/webstore/detail/nextjs-utilities-extensio/ffcogmoganomoabikgmcmckdgojnpldo) - Next.js Utilities Extension shows you the size of Next.js static data without installing of any additional stuff. +- [GitHub Web IDE](https://chromewebstore.google.com/detail/github-web-ide/adjiklnjodbiaioggfpbpkhbfcnhgkfe) - Open Any GitHub repositories in online web (cloud) IDE like VS Code, GitHub Dev, Code Sandbox, Repl.it, Gitpod, etc. + +## Blogs + +- [Demo posts for markdown](https://github.com/frontendweb3/Demo-markdown-posts) - Demo markdown posts are used to design your new blog base template. You do not write markdown demo posts. You can use demo markdown posts with any static site generator which supports markdown. for example, next.js, gatsby, lume, fresh, etc. Demo markdown posts are written with Lorem Ipsum. I can use bold, italic, code block, inline code, links, images, and quotes in markdown posts. +- [18 GREAT EXAMPLES OF NEXT.JS WEBSITES](https://pagepro.co/blog/nextjs-websites-examples) - Demo markdown posts are used to design your new blog base template. diff --git a/pages/roadmaps/_meta.json b/pages/roadmaps/_meta.json new file mode 100644 index 00000000..9b5f5ac7 --- /dev/null +++ b/pages/roadmaps/_meta.json @@ -0,0 +1,4 @@ +{ + "role-based": "Role Based Roadmaps", + "skill-based": "Skill based Roadmaps" +} diff --git a/pages/roadmaps/role-based/_meta.json b/pages/roadmaps/role-based/_meta.json new file mode 100644 index 00000000..fb2e3680 --- /dev/null +++ b/pages/roadmaps/role-based/_meta.json @@ -0,0 +1,20 @@ +{ + "index": "Introduction", + "roadmaps": "Roadmaps Must see", + "programming-tutorials": "Desishub Lessons", + "youtube": "YouTube Video Tutorials", + "website": "Website Templates Guides", + "course-guides": "Course Guides", + "courses": "Desishub Courses", + "how-to": "How to Guides", + "about": { + "title": "About", + "type": "page" + }, + "contact": { + "title": "Contact ↗", + "type": "page", + "href": "https://twitter.com/shuding_", + "newWindow": true + } +} diff --git a/pages/roadmaps/role-based/ai-data.mdx b/pages/roadmaps/role-based/ai-data.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/role-based/android.mdx b/pages/roadmaps/role-based/android.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/role-based/backend.mdx b/pages/roadmaps/role-based/backend.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/role-based/blockchain.mdx b/pages/roadmaps/role-based/blockchain.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/role-based/cyber-security.mdx b/pages/roadmaps/role-based/cyber-security.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/role-based/devops.mdx b/pages/roadmaps/role-based/devops.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/role-based/flutter.mdx b/pages/roadmaps/role-based/flutter.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/role-based/frontend.mdx b/pages/roadmaps/role-based/frontend.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/role-based/fullstack.mdx b/pages/roadmaps/role-based/fullstack.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/role-based/game-dev.mdx b/pages/roadmaps/role-based/game-dev.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/role-based/index.mdx b/pages/roadmaps/role-based/index.mdx new file mode 100644 index 00000000..a199dc32 --- /dev/null +++ b/pages/roadmaps/role-based/index.mdx @@ -0,0 +1,3 @@ +https://roadmap.sh/ +https://roadmap.sh/best-practices +https://roadmap.sh/questions diff --git a/pages/roadmaps/role-based/react-native.mdx b/pages/roadmaps/role-based/react-native.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/skill-based/_meta.json b/pages/roadmaps/skill-based/_meta.json new file mode 100644 index 00000000..fb2e3680 --- /dev/null +++ b/pages/roadmaps/skill-based/_meta.json @@ -0,0 +1,20 @@ +{ + "index": "Introduction", + "roadmaps": "Roadmaps Must see", + "programming-tutorials": "Desishub Lessons", + "youtube": "YouTube Video Tutorials", + "website": "Website Templates Guides", + "course-guides": "Course Guides", + "courses": "Desishub Courses", + "how-to": "How to Guides", + "about": { + "title": "About", + "type": "page" + }, + "contact": { + "title": "Contact ↗", + "type": "page", + "href": "https://twitter.com/shuding_", + "newWindow": true + } +} diff --git a/pages/roadmaps/skill-based/angular.mdx b/pages/roadmaps/skill-based/angular.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/skill-based/aws.mdx b/pages/roadmaps/skill-based/aws.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/skill-based/computer-science.mdx b/pages/roadmaps/skill-based/computer-science.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/skill-based/docker.mdx b/pages/roadmaps/skill-based/docker.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/skill-based/golang.mdx b/pages/roadmaps/skill-based/golang.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/skill-based/javascript.mdx b/pages/roadmaps/skill-based/javascript.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/skill-based/kubernettes.mdx b/pages/roadmaps/skill-based/kubernettes.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/skill-based/mongo.mdx b/pages/roadmaps/skill-based/mongo.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/skill-based/node.mdx b/pages/roadmaps/skill-based/node.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/skill-based/prompt-engineering.mdx b/pages/roadmaps/skill-based/prompt-engineering.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/skill-based/python.mdx b/pages/roadmaps/skill-based/python.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/skill-based/react.mdx b/pages/roadmaps/skill-based/react.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/skill-based/sql.mdx b/pages/roadmaps/skill-based/sql.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/skill-based/typescript.mdx b/pages/roadmaps/skill-based/typescript.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/roadmaps/skill-based/vue.mdx b/pages/roadmaps/skill-based/vue.mdx new file mode 100644 index 00000000..e69de29b diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 00000000..33ad091d --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/styles/global.css b/styles/global.css new file mode 100644 index 00000000..b5c61c95 --- /dev/null +++ b/styles/global.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 00000000..d8b45668 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,15 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./app/**/*.{js,ts,jsx,tsx,mdx}", + "./pages/**/*.{js,ts,jsx,tsx,mdx}", + "./components/**/*.{js,ts,jsx,tsx,mdx}", + + // Or if using `src` directory: + "./src/**/*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: {}, + }, + plugins: [], +}; diff --git a/theme.config.tsx b/theme.config.tsx index 7c49a4b7..4612dc26 100644 --- a/theme.config.tsx +++ b/theme.config.tsx @@ -4,14 +4,36 @@ import { DocsThemeConfig } from "nextra-theme-docs"; const config: DocsThemeConfig = { logo: Desishub, project: { - link: "https://github.com/shuding/nextra-docs-template", + link: "https://github.com/MUKE-coder", }, chat: { - link: "https://discord.com", + link: "https://www.youtube.com/@JBWEBDEVELOPER", + icon: ( + + + + + + ), }, docsRepositoryBase: "https://github.com/shuding/nextra-docs-template", footer: { - text: "Nextra Docs Template", + text: "Developed with ❤️ By JB Web Developer", }, }; From 24a1741132fec99cafd0f7f602e6a44bbae57c82 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Wed, 21 Feb 2024 09:00:58 +0300 Subject: [PATCH 003/101] added typescript --- components/Hero.jsx | 4 + .../nextjs/next-typescript.mdx | 605 ++++++++++++++++++ 2 files changed, 609 insertions(+) diff --git a/components/Hero.jsx b/components/Hero.jsx index d63b2c09..5b657125 100644 --- a/components/Hero.jsx +++ b/components/Hero.jsx @@ -3,6 +3,10 @@ import React from "react"; export default function Hero() { const links = [ + { + title: "Typescript in Next Js", + path: "/programming-tutorials/nextjs/next-typescript", + }, { title: "Roadmaps Must see", path: "/roadmaps" }, { title: "Desishub Lessons", path: "/desishub-lessons" }, { title: "YouTube Video Tutorials", path: "/youtube-tutorials" }, diff --git a/pages/programming-tutorials/nextjs/next-typescript.mdx b/pages/programming-tutorials/nextjs/next-typescript.mdx index e69de29b..dc505568 100644 --- a/pages/programming-tutorials/nextjs/next-typescript.mdx +++ b/pages/programming-tutorials/nextjs/next-typescript.mdx @@ -0,0 +1,605 @@ +import { Callout } from "nextra/components"; + +# TypeScript in Next.js: A Comprehensive Guide for Beginners + +This serves as a guide for Next.js developers interested in incorporating TypeScript into their projects. We'll explore key concepts, installation steps, and code examples to illustrate their practical application. + +## What is TypeScript? + +TypeScript is a superset of JavaScript that adds optional static typing. This means you can define data types for variables, functions, and other constructs, improving code clarity, maintainability, and catching errors early. + +## Benefits of TypeScript in Next.js: + +- Catch errors early: Identify potential issues during development, preventing runtime bugs. +- Improved code navigation: IDEs leverage types for better autocompletion, refactoring, and code understanding. +- Larger projects, better structure: Enforces SOLID principles and promotes maintainability in complex applications. +- Better documentation: Types serve as documentation directly within code, aiding team collaboration. + +## Why use TypeScript in Next.js in 2024? + +- Growing popularity: TypeScript adoption is skyrocketing across JavaScript frameworks, including Next.js. +- Enhanced Next.js development: Next.js offers built-in support and type definitions for its features. +- Future-proof development: Static typing aligns with modern development trends and best practices. + +## Installing TypeScript in a Next.js Project + +- Next.js provides a TypeScript-first development experience for building your React application. +- It comes with built-in TypeScript support for automatically installing the necessary packages and configuring the proper settings. + + Next.js now ships with TypeScript, ESLint, and Tailwind CSS configuration by + default. - You can optionally use a src directory in the root of your + project to separate your application's code from configuration files. + + +I recommend starting a new Next.js app using `create-next-app`, which sets up everything automatically for you. To create a project, run: + +```js filename=">_ Terminal" copy + npx create-next-app@latest +``` + +On installation, you'll see the following prompts: + +```js filename=">_ Terminal" lineNumbers + What is your project named? my-app + Would you like to use TypeScript? No / Yes + Would you like to use ESLint? No / Yes + Would you like to use Tailwind CSS? No / Yes + Would you like to use `src/` directory? No / Yes + Would you like to use App Router? (recommended) No / Yes +``` + +### TypeScript Inference Explained + +TypeScript, as a superset of JavaScript, offers optional static typing. This means it can automatically deduce the type of variables, functions, and other constructs based on their usage, a process known as TypeScript inference. While you can explicitly define types through annotations, inference helps make your code more concise and readable. + +Here's a breakdown of key points about TypeScript inference: + +### What can be inferred? + +- **Variable initialization:** When assigning a value to a variable, TypeScript infers its type based on the value's type, e.g., `let age = 30; // age is inferred as number.` +- **Default parameter values:** The type of a function parameter with a default value is inferred based on the value's type. +- **Function return types:** If a function doesn't have an explicit return type annotation, TypeScript attempts to infer it based on the return statements within the function. +- **Arrays and objects:** The inferred type of arrays and objects reflects the types of their elements and properties. + +**Example:** + +```typescript copy +let name = "John"; // Inferred type: string +const age = 30; // Inferred type: number +function double(num: number): number { + // Inferred return type: number + return num * 2; +} +const numbers = [1, 2, 3]; // Inferred type: number[] +const person = { name: "Jane", age: 25 }; // Inferred type: { name: string, age: number } +``` + +### Benefits of inference: + +- Reduced boilerplate: Saves time and effort by avoiding unnecessary type annotations. +- Improved readability: Cleaner code, focusing on logic rather than verbose type details. +- Automatic error detection: Catches type mismatches early, improving code quality. + +### Limitations of inference: + +- Not always perfect: In complex scenarios, TypeScript might not infer the correct type, requiring manual annotations. +- Reduced flexibility: Over-reliance on inference can limit code flexibility and maintainability. + +### Best practices: + +- Use inference effectively while understanding its limitations. +- Annotate types in complex scenarios for clarity and accuracy. +- Balance conciseness with readability and maintainability. + +## Typescript Basic Types + +### Boolean + +- Represents truth values: true or false. + -Used for conditional checks, flags, and logical operations. + +```js copy +let isDone: boolean = false; +let isLoggedIn: boolean = true; +let showError: boolean = false; +``` + +### Numbers + +Represents numeric values, including integers and floating-point numbers. +Used for calculations, measurements, and numerical operations. + +```ts copy +let age: number = 30; +let temperature: number = 25.5; +``` + +### Strings + +- Represents sequences of text characters. +- Used for user input, display text, and string manipulation. + +```ts copy +let name: string = "John Doe"; +let message: string = "Hello, world!"; +``` + +### Arrays: + +- Represent an ordered collection of elements of the same or compatible types. + -Defined using square brackets [] with the element type inside. + +```ts copy +// Array of numbers +let numbers: number[] = [1, 2, 3]; +// Error: Type 'string' is not assignable to type 'number' +numbers.push("hello"); // Compiler error +// Array of strings +let names: string[] = ["Alice", "Bob", "Charlie"]; +``` + +### Tuples + +- Fixed-length arrays with specific element types at each position. +- Type annotation: [type1, type2, ...] + +```ts copy +// Correct usage +let person: [string, number] = ["John", 30]; +// Error: Type 'number' is not assignable to type 'string' +person = [25, "Doe"]; // Compiler error +``` + +### Functions + +- Defined using the function keyword, specifying input and output types. +- Type annotation: (parameters: types) => returnType + +```ts copy +function add(x: number, y: number): number { + return x + y; +} + +// Error: Argument of type 'string' is not assignable to parameter of type 'number' +add("5", 10); // Compiler error +``` + +### Void + +- Represents the absence of a value, often used for functions that don't return anything. +- Type annotation: void + +```ts copy +function logMessage(message: string): void { + console.log(message); +} +``` + +### Enum + +- An enum is a special "class" that represents a group of constants (unchangeable variables). +- Enums come in two flavors string and numeric. Lets start with numeric. + **Numeric Enums - Default** + By default, enums will initialize the first value to 0 and add 1 to each additional value: + +```ts copy +enum CardinalDirections { + North, + East, + South, + West, +} +let currentDirection = CardinalDirections.North; +// logs 0 +console.log(currentDirection); +// throws error as 'North' is not a valid enum +currentDirection = "North"; // Error: "North" is not assignable to type 'CardinalDirections'. +``` + +**Numeric Enums - Initialized** +You can set the value of the first numeric enum and have it auto increment from that: + +```ts copy +enum CardinalDirections { + North = 1, + East, + South, + West, +} +// logs 1 +console.log(CardinalDirections.North); +// logs 4 +console.log(CardinalDirections.West); +``` + +**Numeric Enums - Fully Initialized** +You can assign unique number values for each enum value. Then the values will not incremented automatically: + +```ts copy +enum StatusCodes { + NotFound = 404, + Success = 200, + Accepted = 202, + BadRequest = 400, +} +// logs 404 +console.log(StatusCodes.NotFound); +// logs 200 +console.log(StatusCodes.Success); +``` + +**String Enums** +Enums can also contain strings. This is more common than numeric enums, because of their readability and intent. + +```ts copy +enum CardinalDirections { + North = "North", + East = "East", + South = "South", + West = "West", +} +// logs "North" +console.log(CardinalDirections.North); +// logs "West" +console.log(CardinalDirections.West); +``` + +### Object Type: + +- Represents a collection of key-value pairs, where keys are strings and values can be of any type. +- Used to model complex data structures and real-world entities. + +```ts copy +const car: { type: string; model: string; year: number } = { + type: "Toyota", + model: "Corolla", + year: 2009, +}; +``` + +**Type Inference** +TypeScript can infer the types of properties based on their values. + +```ts copy +const car = { + type: "Toyota", +}; +car.type = "Ford"; // no error +car.type = 2; // Error: Type 'number' is not assignable to type 'string'. +``` + +**Optional Properties** +Optional properties are properties that don't have to be defined in the object definition. +Example without optional properties + +```ts copy +const car: { type: string; mileage: number } = { + // Error: Property 'mileage' is missing in type '{ type: string; }' but required in type '{ type: string; mileage: number; }'. + type: "Toyota", +}; +car.mileage = 2000; +``` + +Example with Optional properties + +```ts copy +const car: { type: string; mileage?: number } = { + // no error + type: "Toyota", +}; +car.mileage = 2000; +``` + +### The 'Any' Type + +- TypeScript defaults to the any type if no type is specified, allowing any value. This basically means writing in normal javascript +- The any type in TypeScript is a workaround for cases when you don't know what type a value might be. It allows you to assign a variable or function parameter to be of literally any type. +- This can lead to runtime errors and reduced type safety. + +```js copy +function greet(name: any) { + console.log(`Hello, ${name}!`); +} +greet("John"); // Outputs: Hello, John! +greet(123); // Outputs: Hello, 123! +``` + +any lets you do extremely dangerous things in TypeScript. By marking a variable as any + +```js copy +const user: any = { + name: "John", + age: 30, +}; + +user.roles.push("admin"); // Runtime error! +``` + +In the example above, we're trying to push a new value to the roles array, but the roles property doesn't exist on the user object. This will cause a runtime error, but TypeScript won't warn us about it because we've marked the user variable as any. + +### Any VS Unknown + +The unknown type is a type-safe counterpart of any, which requires you to perform a type check before using the variable. Unlike any, unknown can help prevent runtime errors by forcing you to narrow down the type of the variable before using it in your code. + +Here's an example of using unknown in a function argument: + +```js copy +function greet(name: unknown) { + if (typeof name === "string") { + console.log(`Hello, ${name}!`); + } +} + +greet("John"); // Outputs: Hello, John! +greet(123); // No output +``` + +Overall, the any type can be useful in situations where you need more flexibility, but it comes with the cost of losing type safety. It's best to use it sparingly and with caution. + +### TypeScript Union Types + +- Union types are used when a value can be more than a single type. +- Allow a variable to hold values of different types. +- Type annotation: type1 | type2 | ... +- Such as when a property would be string or number. + **Union | (OR)** +- Using the | we are saying our parameter is a string or number: + +```ts copy +let value: string | number = "hello"; + +// Error: Object is of type 'object', not assignable to 'string | number' +value = {}; // Compiler error + +function printStatusCode(code: string | number) { + console.log(`My status code is ${code}.`); +} +printStatusCode(404); +printStatusCode("404"); +``` + +### Type aliases + +A type alias is a name for any type, you can actually use a type alias to give a name to any type at all, not just an object type. + +```ts copy +// primitive +type SanitizedString = string; +// Type alias for a string with maximum length of 10 +type Email = string & { length: 10 }; + +// Union type for numbers or strings +type ID = number | string; + +// tuple +type Data = [number, string]; + +// function +type SetPoint = (x: number, y: number) => void; + +// object +type User = { + id: number; + name: string; + isVerified?: boolean; + handler: () => void; +}; +``` + +### Interfaces + +- Interfaces are similar to type aliases, except they only apply to object types. +- An interface may only be used to declare the shapes of objects, not rename primitives. Being concerned only with the structure and capabilities of types is why we call TypeScript a structurally typed type system. + +```ts copy +interface Rectangle { + height: number; + width: number; +} + +const rectangle: Rectangle = { + height: 20, + width: 10, +}; +``` + +**Extending Interfaces** + +- Interfaces can extend each other's definition. +- Extending an interface means you are creating a new interface with the same properties as the original, plus something new. + +```ts copy +interface Rectangle { + height: number; + width: number; +} + +interface ColoredRectangle extends Rectangle { + color: string; +} + +const coloredRectangle: ColoredRectangle = { + height: 20, + width: 10, + color: "red", +}; +``` + +#### Type vs Interface: Which Should You Use? + +**Differences Between Type Aliases and Interfaces** +Type aliases and interfaces are very similar, and in many cases you can choose between them freely. Almost all features of an interface are available in type, the key distinction is that a type cannot be re-opened to add new properties vs an interface which is always extendable. +**Extending an interface** + +```ts copy +interface Animal { + name: string; +} + +interface Bear extends Animal { + honey: boolean; +} + +const bear = getBear(); +bear.name; +bear.honey; +``` + +**Extending a type via intersections** + +```ts copy +type Animal = { + name: string; +}; + +type Bear = Animal & { + honey: boolean; +}; + +const bear = getBear(); +bear.name; +bear.honey; +``` + +For the most part, you can choose based on personal preference, and TypeScript will tell you if it needs something to be the other kind of declaration. If you would like a heuristic, use interface until you need to use features from type. (From typescript team) + +- the word "heuristic" refers to a rule of thumb or a general guideline that helps you decide when to use interfaces or types in TypeScript. It's not a precise rule, but rather a helpful suggestion to aid in your decision-making process. +- You should use types by default until you need a specific feature of interfaces, like 'extends'.(Other devs say) +- We will keep interchanging and we will notice which one best suits you (My suggestion) +- Interfaces can't express unions, mapped types, or conditional types. Type aliases can express any type. +- Interfaces can use extends, types can't. +- When you're working with objects that inherit from each other, use interfaces. extends makes TypeScript's type checker run slightly faster than using &. + +### TypeScript Casting + +- There are times when working with types where it's necessary to override the type of a variable, such as when incorrect types are provided by a library. +- Casting is the process of overriding a type. + +**Casting with as** +A straightforward way to cast a variable is using the as keyword, which will directly change the type of the given variable. + +```ts copy +let x: unknown = "hello"; +console.log((x as string).length); +``` + +Casting doesn't actually change the type of the data within the variable, for example the following code will not work as expected since the variable x is still holds a number. + +```ts copy +let x: unknown = 4; +console.log((x as string).length); // prints undefined since numbers don't have a length +``` + +TypeScript will still attempt to typecheck casts to prevent casts that don't seem correct, for example the following will throw a type error since TypeScript knows casting a string to a number doesn't makes sense without converting the data: + +```ts copy +console.log((4 as string).length); // Error: Conversion of type 'number' to type 'string' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first. +``` + +### TypeScript Generics – Use Case and Examples + +To understand What TypeScript Generics are lets look at the Use cases +**Use Case for Generics** +Let's start with a simple example, where you want to print the value of an argument passed: + +```ts copy +function printData(data: number) { + console.log("data: ", data); +} + +printData(2); +``` + +Now, let's suppose you want to make printData a more generic function, where you can pass any type of argument to it like: number/ string/ boolean. So, you might think to follow an approach like below: + +```ts copy +function printData(data: number | string | boolean) { + console.log("data: ", data); +} + +printData(2); +printData("hello"); +printData(true); +``` + +But in the future, you might want to print an array of numbers using the same function. In that case the types will increase and it will become cumbersome to maintain all those different types. + +This is when Generics come into the picture. + +#### How Generics Work in TS + +Generics are like variables – to be precise, type variables – that store the type (for example number, string, boolean) as a value. + +So, you can solve the problem we discussed above with generics as shown below: + +```ts copy +function printData(data: T) { + console.log("data: ", data); +} + +printData(2); +printData("hello"); +printData(true); +``` + +In the above example printData-generics.ts, there is a slight difference in syntax: + +You use a type variable inside angular brackets after the function name `` +You then assign the type variable to the parameter data: T +Let's explore these differences a bit more. + +To use generics, you need to use angular brackets and then specify a type variable inside them. Developers generally use T, X and Y. But it can be anything depending upon your preference. + +You can then assign the same variable name as the type to the parameter of the function. + +Now, whatever argument you pass to the function, it gets inferred and there's no need to hardcode the type anywhere. + +Even if you pass an array of numbers or an object to the printData function, everything will be displayed properly without TS complaining: + +```ts copy +function printData(data: T) { + console.log("data: ", data); +} + +printData(2); +printData("hello"); +printData(true); +printData([1, 2, 3, 4, 5, 6]); +printData([1, 2, 3, "hi"]); +printData({ name: "Ram", rollNo: 1 }); +``` + +Let's see another example: + +```ts copy +function printData(data1: X, data2: Y) { + console.log("Output is: ", data1, data2); +} + +printData("Hello", "World"); +printData(123, ["Hi", 123]); +``` + +In above example, we passed 2 arguments to printData and used X and Y to denote the types for both the parameters. X refers to 1st value of the argument and Y refers to 2nd value of the argument. + +Here as well, the types of data1 and data2 are not specified explicitly because TypeScript handles the type inference with the help of generics. + +#### How to Use Generics with Interfaces + +You can even use generics with interfaces. Let's see how that works with the help of a code snippet: + +```ts copy +interface UserData { + name: X; + rollNo: Y; +} + +const user: UserData = { + name: "Ram", + rollNo: 1, +}; +``` + +In above snippet, `` are passed to the interface UserData. In this way, UserData becomes a reusable interface in which any data type can be assigned depending upon the use case. + +Here in this example, name and rollNo will always be string and number, respectively. But this example was to showcase how you can use generics with interfaces in TS. From 80fd205316cbfdce2af849a1c98ed941a6c44830 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Wed, 21 Feb 2024 09:27:19 +0300 Subject: [PATCH 004/101] removed pnpm --- pnpm-lock.yaml | 2172 ------------------------------------------------ 1 file changed, 2172 deletions(-) delete mode 100644 pnpm-lock.yaml diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index afa36b4e..00000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,2172 +0,0 @@ -lockfileVersion: 5.3 - -specifiers: - '@types/node': 18.11.10 - next: ^13.0.6 - nextra: latest - nextra-theme-docs: latest - react: ^18.2.0 - react-dom: ^18.2.0 - typescript: ^4.9.3 - -dependencies: - next: 13.0.6_react-dom@18.2.0+react@18.2.0 - nextra: 2.2.14_f26ff3bd08f1cd28b0f73422c76f5ffd - nextra-theme-docs: 2.2.14_d8d66b9d2170cddb63c39dddec8541b9 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - -devDependencies: - '@types/node': 18.11.10 - typescript: 4.9.3 - -packages: - - /@babel/runtime/7.20.6: - resolution: {integrity: sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.13.11 - dev: false - - /@headlessui/react/1.7.10_react-dom@18.2.0+react@18.2.0: - resolution: {integrity: sha512-1m66h/5eayTEZVT2PI13/2PG3EVC7a9XalmUtVSC8X76pcyKYMuyX1XAL2RUtCr8WhoMa/KrDEyoeU5v+kSQOw==} - engines: {node: '>=10'} - peerDependencies: - react: ^16 || ^17 || ^18 - react-dom: ^16 || ^17 || ^18 - dependencies: - client-only: 0.0.1 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - dev: false - - /@mdx-js/mdx/2.2.1: - resolution: {integrity: sha512-hZ3ex7exYLJn6FfReq8yTvA6TE53uW9UHJQM9IlSauOuS55J9y8RtA7W+dzp6Yrzr00/U1sd7q+Wf61q6SfiTQ==} - dependencies: - '@types/estree-jsx': 1.0.0 - '@types/mdx': 2.0.3 - estree-util-build-jsx: 2.2.0 - estree-util-is-identifier-name: 2.0.1 - estree-util-to-js: 1.1.0 - estree-walker: 3.0.1 - hast-util-to-estree: 2.1.0 - markdown-extensions: 1.1.1 - periscopic: 3.0.4 - remark-mdx: 2.1.5 - remark-parse: 10.0.1 - remark-rehype: 10.1.0 - unified: 10.1.2 - unist-util-position-from-estree: 1.1.1 - unist-util-stringify-position: 3.0.2 - unist-util-visit: 4.1.1 - vfile: 5.3.6 - transitivePeerDependencies: - - supports-color - dev: false - - /@mdx-js/react/2.2.1_react@18.2.0: - resolution: {integrity: sha512-YdXcMcEnqZhzql98RNrqYo9cEhTTesBiCclEtoiQUbJwx87q9453GTapYU6kJ8ZZ2ek1Vp25SiAXEFy5O/eAPw==} - peerDependencies: - react: '>=16' - dependencies: - '@types/mdx': 2.0.3 - '@types/react': 18.0.25 - react: 18.2.0 - dev: false - - /@napi-rs/simple-git-android-arm-eabi/0.1.8: - resolution: {integrity: sha512-JJCejHBB1G6O8nxjQLT4quWCcvLpC3oRdJJ9G3MFYSCoYS8i1bWCWeU+K7Br+xT+D6s1t9q8kNJAwJv9Ygpi0g==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-android-arm64/0.1.8: - resolution: {integrity: sha512-mraHzwWBw3tdRetNOS5KnFSjvdAbNBnjFLA8I4PwTCPJj3Q4txrigcPp2d59cJ0TC51xpnPXnZjYdNwwSI9g6g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-darwin-arm64/0.1.8: - resolution: {integrity: sha512-ufy/36eI/j4UskEuvqSH7uXtp3oXeLDmjQCfKJz3u5Vx98KmOMKrqAm2H81AB2WOtCo5mqS6PbBeUXR8BJX8lQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-darwin-x64/0.1.8: - resolution: {integrity: sha512-Vb21U+v3tPJNl+8JtIHHT8HGe6WZ8o1Tq3f6p+Jx9Cz71zEbcIiB9FCEMY1knS/jwQEOuhhlI9Qk7d4HY+rprA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-linux-arm-gnueabihf/0.1.8: - resolution: {integrity: sha512-6BPTJ7CzpSm2t54mRLVaUr3S7ORJfVJoCk2rQ8v8oDg0XAMKvmQQxOsAgqKBo9gYNHJnqrOx3AEuEgvB586BuQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-linux-arm64-gnu/0.1.8: - resolution: {integrity: sha512-qfESqUCAA/XoQpRXHptSQ8gIFnETCQt1zY9VOkplx6tgYk9PCeaX4B1Xuzrh3eZamSCMJFn+1YB9Ut8NwyGgAA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-linux-arm64-musl/0.1.8: - resolution: {integrity: sha512-G80BQPpaRmQpn8dJGHp4I2/YVhWDUNJwcCrJAtAdbKFDCMyCHJBln2ERL/+IEUlIAT05zK/c1Z5WEprvXEdXow==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-linux-x64-gnu/0.1.8: - resolution: {integrity: sha512-NI6o1sZYEf6vPtNWJAm9w8BxJt+LlSFW0liSjYe3lc3e4dhMfV240f0ALeqlwdIldRPaDFwZSJX5/QbS7nMzhw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-linux-x64-musl/0.1.8: - resolution: {integrity: sha512-wljGAEOW41er45VTiU8kXJmO480pQKzsgRCvPlJJSCaEVBbmo6XXbFIXnZy1a2J3Zyy2IOsRB4PVkUZaNuPkZQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-win32-arm64-msvc/0.1.8: - resolution: {integrity: sha512-QuV4QILyKPfbWHoQKrhXqjiCClx0SxbCTVogkR89BwivekqJMd9UlMxZdoCmwLWutRx4z9KmzQqokvYI5QeepA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git-win32-x64-msvc/0.1.8: - resolution: {integrity: sha512-UzNS4JtjhZhZ5hRLq7BIUq+4JOwt1ThIKv11CsF1ag2l99f0123XvfEpjczKTaa94nHtjXYc2Mv9TjccBqYOew==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@napi-rs/simple-git/0.1.8: - resolution: {integrity: sha512-BvOMdkkofTz6lEE35itJ/laUokPhr/5ToMGlOH25YnhLD2yN1KpRAT4blW9tT8281/1aZjW3xyi73bs//IrDKA==} - engines: {node: '>= 10'} - optionalDependencies: - '@napi-rs/simple-git-android-arm-eabi': 0.1.8 - '@napi-rs/simple-git-android-arm64': 0.1.8 - '@napi-rs/simple-git-darwin-arm64': 0.1.8 - '@napi-rs/simple-git-darwin-x64': 0.1.8 - '@napi-rs/simple-git-linux-arm-gnueabihf': 0.1.8 - '@napi-rs/simple-git-linux-arm64-gnu': 0.1.8 - '@napi-rs/simple-git-linux-arm64-musl': 0.1.8 - '@napi-rs/simple-git-linux-x64-gnu': 0.1.8 - '@napi-rs/simple-git-linux-x64-musl': 0.1.8 - '@napi-rs/simple-git-win32-arm64-msvc': 0.1.8 - '@napi-rs/simple-git-win32-x64-msvc': 0.1.8 - dev: false - - /@next/env/13.0.6: - resolution: {integrity: sha512-yceT6DCHKqPRS1cAm8DHvDvK74DLIkDQdm5iV+GnIts8h0QbdHvkUIkdOvQoOODgpr6018skbmSQp12z5OWIQQ==} - dev: false - - /@next/swc-android-arm-eabi/13.0.6: - resolution: {integrity: sha512-FGFSj3v2Bluw8fD/X+1eXIEB0PhoJE0zfutsAauRhmNpjjZshLDgoXMWm1jTRL/04K/o9gwwO2+A8+sPVCH1uw==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@next/swc-android-arm64/13.0.6: - resolution: {integrity: sha512-7MgbtU7kimxuovVsd7jSJWMkIHBDBUsNLmmlkrBRHTvgzx5nDBXogP0hzZm7EImdOPwVMPpUHRQMBP9mbsiJYQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@next/swc-darwin-arm64/13.0.6: - resolution: {integrity: sha512-AUVEpVTxbP/fxdFsjVI9d5a0CFn6NVV7A/RXOb0Y+pXKIIZ1V5rFjPwpYfIfyOo2lrqgehMNQcyMRoTrhq04xg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@next/swc-darwin-x64/13.0.6: - resolution: {integrity: sha512-SasCDJlshglsPnbzhWaIF6VEGkQy2NECcAOxPwaPr0cwbbt4aUlZ7QmskNzgolr5eAjFS/xTr7CEeKJtZpAAtQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@next/swc-freebsd-x64/13.0.6: - resolution: {integrity: sha512-6Lbxd9gAdXneTkwHyYW/qtX1Tdw7ND9UbiGsGz/SP43ZInNWnW6q0au4hEVPZ9bOWWRKzcVoeTBdoMpQk9Hx9w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-arm-gnueabihf/13.0.6: - resolution: {integrity: sha512-wNdi5A519e1P+ozEuYOhWPzzE6m1y7mkO6NFwn6watUwO0X9nZs7fT9THmnekvmFQpaZ6U+xf2MQ9poQoCh6jQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-arm64-gnu/13.0.6: - resolution: {integrity: sha512-e8KTRnleQY1KLk5PwGV5hrmvKksCc74QRpHl5ffWnEEAtL2FE0ave5aIkXqErsPdXkiKuA/owp3LjQrP+/AH7Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-arm64-musl/13.0.6: - resolution: {integrity: sha512-/7RF03C3mhjYpHN+pqOolgME3guiHU5T3TsejuyteqyEyzdEyLHod+jcYH6ft7UZ71a6TdOewvmbLOtzHW2O8A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-x64-gnu/13.0.6: - resolution: {integrity: sha512-kxyEXnYHpOEkFnmrlwB1QlzJtjC6sAJytKcceIyFUHbCaD3W/Qb5tnclcnHKTaFccizZRePXvV25Ok/eUSpKTw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-x64-musl/13.0.6: - resolution: {integrity: sha512-N0c6gubS3WW1oYYgo02xzZnNatfVQP/CiJq2ax+DJ55ePV62IACbRCU99TZNXXg+Kos6vNW4k+/qgvkvpGDeyA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-arm64-msvc/13.0.6: - resolution: {integrity: sha512-QjeMB2EBqBFPb/ac0CYr7GytbhUkrG4EwFWbcE0vsRp4H8grt25kYpFQckL4Jak3SUrp7vKfDwZ/SwO7QdO8vw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-ia32-msvc/13.0.6: - resolution: {integrity: sha512-EQzXtdqRTcmhT/tCq81rIwE36Y3fNHPInaCuJzM/kftdXfa0F+64y7FAoMO13npX8EG1+SamXgp/emSusKrCXg==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-x64-msvc/13.0.6: - resolution: {integrity: sha512-pSkqZ//UP/f2sS9T7IvHLfEWDPTX0vRyXJnAUNisKvO3eF3e1xdhDX7dix/X3Z3lnN4UjSwOzclAI87JFbOwmQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@popperjs/core/2.11.6: - resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} - dev: false - - /@swc/helpers/0.4.14: - resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} - dependencies: - tslib: 2.4.1 - dev: false - - /@types/acorn/4.0.6: - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} - dependencies: - '@types/estree': 1.0.0 - dev: false - - /@types/debug/4.1.7: - resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} - dependencies: - '@types/ms': 0.7.31 - dev: false - - /@types/estree-jsx/1.0.0: - resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} - dependencies: - '@types/estree': 1.0.0 - dev: false - - /@types/estree/1.0.0: - resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} - dev: false - - /@types/hast/2.3.4: - resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} - dependencies: - '@types/unist': 2.0.6 - dev: false - - /@types/js-yaml/4.0.5: - resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} - dev: false - - /@types/katex/0.11.1: - resolution: {integrity: sha512-DUlIj2nk0YnJdlWgsFuVKcX27MLW0KbKmGVoUHmFr+74FYYNUDAaj9ZqTADvsbE8rfxuVmSFc7KczYn5Y09ozg==} - dev: false - - /@types/mdast/3.0.10: - resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} - dependencies: - '@types/unist': 2.0.6 - dev: false - - /@types/mdx/2.0.3: - resolution: {integrity: sha512-IgHxcT3RC8LzFLhKwP3gbMPeaK7BM9eBH46OdapPA7yvuIUJ8H6zHZV53J8hGZcTSnt95jANt+rTBNUUc22ACQ==} - dev: false - - /@types/ms/0.7.31: - resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} - dev: false - - /@types/node/18.11.10: - resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} - dev: true - - /@types/prop-types/15.7.5: - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - dev: false - - /@types/react/18.0.25: - resolution: {integrity: sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==} - dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.2 - csstype: 3.1.1 - dev: false - - /@types/scheduler/0.16.2: - resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} - dev: false - - /@types/unist/2.0.6: - resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} - dev: false - - /acorn-jsx/5.3.2_acorn@8.8.1: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.8.1 - dev: false - - /acorn/8.8.1: - resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false - - /ansi-styles/3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: false - - /arch/2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - dev: false - - /arg/1.0.0: - resolution: {integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==} - dev: false - - /argparse/1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: false - - /argparse/2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: false - - /astring/1.8.3: - resolution: {integrity: sha512-sRpyiNrx2dEYIMmUXprS8nlpRg2Drs8m9ElX9vVEXaCB4XEAJhKfs7IcX0IwShjuOAjLR6wzIrgoptz1n19i1A==} - hasBin: true - dev: false - - /bail/2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: false - - /caniuse-lite/1.0.30001435: - resolution: {integrity: sha512-kdCkUTjR+v4YAJelyiDTqiu82BDr4W4CP5sgTA0ZBmqn30XfS2ZghPLMowik9TPhS+psWJiUNxsqLyurDbmutA==} - dev: false - - /ccount/2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - dev: false - - /chalk/2.3.0: - resolution: {integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 4.5.0 - dev: false - - /character-entities-html4/2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - dev: false - - /character-entities-legacy/3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - dev: false - - /character-entities/2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - dev: false - - /character-reference-invalid/2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - dev: false - - /client-only/0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - dev: false - - /clipboardy/1.2.2: - resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} - engines: {node: '>=4'} - dependencies: - arch: 2.2.0 - execa: 0.8.0 - dev: false - - /clsx/1.2.1: - resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} - engines: {node: '>=6'} - dev: false - - /color-convert/1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: false - - /color-name/1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: false - - /comma-separated-tokens/2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: false - - /commander/8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - dev: false - - /compute-scroll-into-view/2.0.4: - resolution: {integrity: sha512-y/ZA3BGnxoM/QHHQ2Uy49CLtnWPbt4tTPpEEZiEmmiWBFKjej7nEyH8Ryz54jH0MLXflUYA3Er2zUxPSJu5R+g==} - dev: false - - /cross-spawn/5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - dev: false - - /csstype/3.1.1: - resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} - dev: false - - /debug/4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: false - - /decode-named-character-reference/1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - dependencies: - character-entities: 2.0.2 - dev: false - - /dequal/2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: false - - /diff/5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - dev: false - - /escape-string-regexp/1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: false - - /escape-string-regexp/5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - dev: false - - /esprima/4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: false - - /estree-util-attach-comments/2.1.0: - resolution: {integrity: sha512-rJz6I4L0GaXYtHpoMScgDIwM0/Vwbu5shbMeER596rB2D1EWF6+Gj0e0UKzJPZrpoOc87+Q2kgVFHfjAymIqmw==} - dependencies: - '@types/estree': 1.0.0 - dev: false - - /estree-util-build-jsx/2.2.0: - resolution: {integrity: sha512-apsfRxF9uLrqosApvHVtYZjISPvTJ+lBiIydpC+9wE6cF6ssbhnjyQLqaIjgzGxvC2Hbmec1M7g91PoBayYoQQ==} - dependencies: - '@types/estree-jsx': 1.0.0 - estree-util-is-identifier-name: 2.0.1 - estree-walker: 3.0.1 - dev: false - - /estree-util-is-identifier-name/2.0.1: - resolution: {integrity: sha512-rxZj1GkQhY4x1j/CSnybK9cGuMFQYFPLq0iNyopqf14aOVLFtMv7Esika+ObJWPWiOHuMOAHz3YkWoLYYRnzWQ==} - dev: false - - /estree-util-to-js/1.1.0: - resolution: {integrity: sha512-490lbfCcpLk+ofK6HCgqDfYs4KAfq6QVvDw3+Bm1YoKRgiOjKiKYGAVQE1uwh7zVxBgWhqp4FDtp5SqunpUk1A==} - dependencies: - '@types/estree-jsx': 1.0.0 - astring: 1.8.3 - source-map: 0.7.4 - dev: false - - /estree-util-value-to-estree/1.3.0: - resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} - engines: {node: '>=12.0.0'} - dependencies: - is-plain-obj: 3.0.0 - dev: false - - /estree-util-visit/1.2.0: - resolution: {integrity: sha512-wdsoqhWueuJKsh5hqLw3j8lwFqNStm92VcwtAOAny8g/KS/l5Y8RISjR4k5W6skCj3Nirag/WUCMS0Nfy3sgsg==} - dependencies: - '@types/estree-jsx': 1.0.0 - '@types/unist': 2.0.6 - dev: false - - /estree-walker/3.0.1: - resolution: {integrity: sha512-woY0RUD87WzMBUiZLx8NsYr23N5BKsOMZHhu2hoNRVh6NXGfoiT1KOL8G3UHlJAnEDGmfa5ubNA/AacfG+Kb0g==} - dev: false - - /execa/0.8.0: - resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} - engines: {node: '>=4'} - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - dev: false - - /extend-shallow/2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - dependencies: - is-extendable: 0.1.1 - dev: false - - /extend/3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: false - - /flexsearch/0.7.31: - resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} - dev: false - - /focus-visible/5.2.0: - resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} - dev: false - - /get-stream/3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - dev: false - - /git-up/7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} - dependencies: - is-ssh: 1.4.0 - parse-url: 8.1.0 - dev: false - - /git-url-parse/13.1.0: - resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} - dependencies: - git-up: 7.0.0 - dev: false - - /github-slugger/2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - dev: false - - /graceful-fs/4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - dev: false - - /gray-matter/4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} - dependencies: - js-yaml: 3.14.1 - kind-of: 6.0.3 - section-matter: 1.0.0 - strip-bom-string: 1.0.0 - dev: false - - /has-flag/2.0.0: - resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} - engines: {node: '>=0.10.0'} - dev: false - - /hash-obj/4.0.0: - resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} - engines: {node: '>=12'} - dependencies: - is-obj: 3.0.0 - sort-keys: 5.0.0 - type-fest: 1.4.0 - dev: false - - /hast-util-from-parse5/7.1.1: - resolution: {integrity: sha512-R6PoNcUs89ZxLJmMWsVbwSWuz95/9OriyQZ3e2ybwqGsRXzhA6gv49rgGmQvLbZuSNDv9fCg7vV7gXUsvtUFaA==} - dependencies: - '@types/hast': 2.3.4 - '@types/unist': 2.0.6 - hastscript: 7.2.0 - property-information: 6.2.0 - vfile: 5.3.6 - vfile-location: 4.0.1 - web-namespaces: 2.0.1 - dev: false - - /hast-util-is-element/2.1.3: - resolution: {integrity: sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==} - dependencies: - '@types/hast': 2.3.4 - '@types/unist': 2.0.6 - dev: false - - /hast-util-parse-selector/3.1.1: - resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} - dependencies: - '@types/hast': 2.3.4 - dev: false - - /hast-util-to-estree/2.1.0: - resolution: {integrity: sha512-Vwch1etMRmm89xGgz+voWXvVHba2iiMdGMKmaMfYt35rbVtFDq8JNwwAIvi8zHMkO6Gvqo9oTMwJTmzVRfXh4g==} - dependencies: - '@types/estree': 1.0.0 - '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.4 - '@types/unist': 2.0.6 - comma-separated-tokens: 2.0.3 - estree-util-attach-comments: 2.1.0 - estree-util-is-identifier-name: 2.0.1 - hast-util-whitespace: 2.0.0 - mdast-util-mdx-expression: 1.3.1 - mdast-util-mdxjs-esm: 1.3.0 - property-information: 6.2.0 - space-separated-tokens: 2.0.2 - style-to-object: 0.3.0 - unist-util-position: 4.0.3 - zwitch: 2.0.4 - transitivePeerDependencies: - - supports-color - dev: false - - /hast-util-to-text/3.1.2: - resolution: {integrity: sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw==} - dependencies: - '@types/hast': 2.3.4 - '@types/unist': 2.0.6 - hast-util-is-element: 2.1.3 - unist-util-find-after: 4.0.1 - dev: false - - /hast-util-whitespace/2.0.0: - resolution: {integrity: sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==} - dev: false - - /hastscript/7.2.0: - resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} - dependencies: - '@types/hast': 2.3.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 3.1.1 - property-information: 6.2.0 - space-separated-tokens: 2.0.2 - dev: false - - /inline-style-parser/0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - dev: false - - /intersection-observer/0.12.2: - resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} - dev: false - - /is-alphabetical/2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - dev: false - - /is-alphanumerical/2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - dependencies: - is-alphabetical: 2.0.1 - is-decimal: 2.0.1 - dev: false - - /is-buffer/2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: false - - /is-decimal/2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - dev: false - - /is-extendable/0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - dev: false - - /is-hexadecimal/2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - dev: false - - /is-obj/3.0.0: - resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} - engines: {node: '>=12'} - dev: false - - /is-plain-obj/3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - dev: false - - /is-plain-obj/4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - dev: false - - /is-reference/3.0.0: - resolution: {integrity: sha512-Eo1W3wUoHWoCoVM4GVl/a+K0IgiqE5aIo4kJABFyMum1ZORlPkC+UC357sSQUL5w5QCE5kCC9upl75b7+7CY/Q==} - dependencies: - '@types/estree': 1.0.0 - dev: false - - /is-ssh/1.4.0: - resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} - dependencies: - protocols: 2.0.1 - dev: false - - /is-stream/1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: false - - /isexe/2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: false - - /js-tokens/4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: false - - /js-yaml/3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: false - - /js-yaml/4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: false - - /jsonc-parser/3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: false - - /katex/0.13.24: - resolution: {integrity: sha512-jZxYuKCma3VS5UuxOx/rFV1QyGSl3Uy/i0kTJF3HgQ5xMinCQVF8Zd4bMY/9aI9b9A2pjIBOsjSSm68ykTAr8w==} - hasBin: true - dependencies: - commander: 8.3.0 - dev: false - - /katex/0.15.6: - resolution: {integrity: sha512-UpzJy4yrnqnhXvRPhjEuLA4lcPn6eRngixW7Q3TJErjg3Aw2PuLFBzTkdUb89UtumxjhHTqL3a5GDGETMSwgJA==} - hasBin: true - dependencies: - commander: 8.3.0 - dev: false - - /katex/0.16.4: - resolution: {integrity: sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw==} - hasBin: true - dependencies: - commander: 8.3.0 - dev: false - - /kind-of/6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: false - - /kleur/4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: false - - /lodash.get/4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: false - - /longest-streak/3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - dev: false - - /loose-envify/1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - dependencies: - js-tokens: 4.0.0 - dev: false - - /lru-cache/4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - dev: false - - /markdown-extensions/1.1.1: - resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} - engines: {node: '>=0.10.0'} - dev: false - - /markdown-table/3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - dev: false - - /match-sorter/6.3.1: - resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} - dependencies: - '@babel/runtime': 7.20.6 - remove-accents: 0.4.2 - dev: false - - /mdast-util-definitions/5.1.1: - resolution: {integrity: sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ==} - dependencies: - '@types/mdast': 3.0.10 - '@types/unist': 2.0.6 - unist-util-visit: 4.1.1 - dev: false - - /mdast-util-find-and-replace/2.2.1: - resolution: {integrity: sha512-SobxkQXFAdd4b5WmEakmkVoh18icjQRxGy5OWTCzgsLRm1Fu/KCtwD1HIQSsmq5ZRjVH0Ehwg6/Fn3xIUk+nKw==} - dependencies: - escape-string-regexp: 5.0.0 - unist-util-is: 5.1.1 - unist-util-visit-parents: 5.1.1 - dev: false - - /mdast-util-from-markdown/1.2.0: - resolution: {integrity: sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==} - dependencies: - '@types/mdast': 3.0.10 - '@types/unist': 2.0.6 - decode-named-character-reference: 1.0.2 - mdast-util-to-string: 3.1.0 - micromark: 3.1.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-decode-string: 1.0.2 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - unist-util-stringify-position: 3.0.2 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-autolink-literal/1.0.2: - resolution: {integrity: sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg==} - dependencies: - '@types/mdast': 3.0.10 - ccount: 2.0.1 - mdast-util-find-and-replace: 2.2.1 - micromark-util-character: 1.1.0 - dev: false - - /mdast-util-gfm-footnote/1.0.1: - resolution: {integrity: sha512-p+PrYlkw9DeCRkTVw1duWqPRHX6Ywh2BNKJQcZbCwAuP/59B0Lk9kakuAd7KbQprVO4GzdW8eS5++A9PUSqIyw==} - dependencies: - '@types/mdast': 3.0.10 - mdast-util-to-markdown: 1.3.0 - micromark-util-normalize-identifier: 1.0.0 - dev: false - - /mdast-util-gfm-strikethrough/1.0.2: - resolution: {integrity: sha512-T/4DVHXcujH6jx1yqpcAYYwd+z5lAYMw4Ls6yhTfbMMtCt0PHY4gEfhW9+lKsLBtyhUGKRIzcUA2FATVqnvPDA==} - dependencies: - '@types/mdast': 3.0.10 - mdast-util-to-markdown: 1.3.0 - dev: false - - /mdast-util-gfm-table/1.0.6: - resolution: {integrity: sha512-uHR+fqFq3IvB3Rd4+kzXW8dmpxUhvgCQZep6KdjsLK4O6meK5dYZEayLtIxNus1XO3gfjfcIFe8a7L0HZRGgag==} - dependencies: - '@types/mdast': 3.0.10 - markdown-table: 3.0.3 - mdast-util-from-markdown: 1.2.0 - mdast-util-to-markdown: 1.3.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-task-list-item/1.0.1: - resolution: {integrity: sha512-KZ4KLmPdABXOsfnM6JHUIjxEvcx2ulk656Z/4Balw071/5qgnhz+H1uGtf2zIGnrnvDC8xR4Fj9uKbjAFGNIeA==} - dependencies: - '@types/mdast': 3.0.10 - mdast-util-to-markdown: 1.3.0 - dev: false - - /mdast-util-gfm/2.0.1: - resolution: {integrity: sha512-42yHBbfWIFisaAfV1eixlabbsa6q7vHeSPY+cg+BBjX51M8xhgMacqH9g6TftB/9+YkcI0ooV4ncfrJslzm/RQ==} - dependencies: - mdast-util-from-markdown: 1.2.0 - mdast-util-gfm-autolink-literal: 1.0.2 - mdast-util-gfm-footnote: 1.0.1 - mdast-util-gfm-strikethrough: 1.0.2 - mdast-util-gfm-table: 1.0.6 - mdast-util-gfm-task-list-item: 1.0.1 - mdast-util-to-markdown: 1.3.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-math/2.0.2: - resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} - dependencies: - '@types/mdast': 3.0.10 - longest-streak: 3.1.0 - mdast-util-to-markdown: 1.3.0 - dev: false - - /mdast-util-mdx-expression/1.3.1: - resolution: {integrity: sha512-TTb6cKyTA1RD+1su1iStZ5PAv3rFfOUKcoU5EstUpv/IZo63uDX03R8+jXjMEhcobXnNOiG6/ccekvVl4eV1zQ==} - dependencies: - '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.4 - '@types/mdast': 3.0.10 - mdast-util-from-markdown: 1.2.0 - mdast-util-to-markdown: 1.3.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-mdx-jsx/2.1.0: - resolution: {integrity: sha512-KzgzfWMhdteDkrY4mQtyvTU5bc/W4ppxhe9SzelO6QUUiwLAM+Et2Dnjjprik74a336kHdo0zKm7Tp+n6FFeRg==} - dependencies: - '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.4 - '@types/mdast': 3.0.10 - ccount: 2.0.1 - mdast-util-to-markdown: 1.3.0 - parse-entities: 4.0.0 - stringify-entities: 4.0.3 - unist-util-remove-position: 4.0.1 - unist-util-stringify-position: 3.0.2 - vfile-message: 3.1.3 - dev: false - - /mdast-util-mdx/2.0.0: - resolution: {integrity: sha512-M09lW0CcBT1VrJUaF/PYxemxxHa7SLDHdSn94Q9FhxjCQfuW7nMAWKWimTmA3OyDMSTH981NN1csW1X+HPSluw==} - dependencies: - mdast-util-mdx-expression: 1.3.1 - mdast-util-mdx-jsx: 2.1.0 - mdast-util-mdxjs-esm: 1.3.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-mdxjs-esm/1.3.0: - resolution: {integrity: sha512-7N5ihsOkAEGjFotIX9p/YPdl4TqUoMxL4ajNz7PbT89BqsdWJuBC9rvgt6wpbwTZqWWR0jKWqQbwsOWDBUZv4g==} - dependencies: - '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.4 - '@types/mdast': 3.0.10 - mdast-util-from-markdown: 1.2.0 - mdast-util-to-markdown: 1.3.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-to-hast/12.2.4: - resolution: {integrity: sha512-a21xoxSef1l8VhHxS1Dnyioz6grrJkoaCUgGzMD/7dWHvboYX3VW53esRUfB5tgTyz4Yos1n25SPcj35dJqmAg==} - dependencies: - '@types/hast': 2.3.4 - '@types/mdast': 3.0.10 - mdast-util-definitions: 5.1.1 - micromark-util-sanitize-uri: 1.1.0 - trim-lines: 3.0.1 - unist-builder: 3.0.0 - unist-util-generated: 2.0.0 - unist-util-position: 4.0.3 - unist-util-visit: 4.1.1 - dev: false - - /mdast-util-to-markdown/1.3.0: - resolution: {integrity: sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==} - dependencies: - '@types/mdast': 3.0.10 - '@types/unist': 2.0.6 - longest-streak: 3.1.0 - mdast-util-to-string: 3.1.0 - micromark-util-decode-string: 1.0.2 - unist-util-visit: 4.1.1 - zwitch: 2.0.4 - dev: false - - /mdast-util-to-string/3.1.0: - resolution: {integrity: sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==} - dev: false - - /micromark-core-commonmark/1.0.6: - resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-factory-destination: 1.0.0 - micromark-factory-label: 1.0.2 - micromark-factory-space: 1.0.0 - micromark-factory-title: 1.0.2 - micromark-factory-whitespace: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-chunked: 1.0.0 - micromark-util-classify-character: 1.0.0 - micromark-util-html-tag-name: 1.1.0 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-resolve-all: 1.0.0 - micromark-util-subtokenize: 1.0.2 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-autolink-literal/1.0.3: - resolution: {integrity: sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-sanitize-uri: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-footnote/1.0.4: - resolution: {integrity: sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg==} - dependencies: - micromark-core-commonmark: 1.0.6 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-sanitize-uri: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-strikethrough/1.0.4: - resolution: {integrity: sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==} - dependencies: - micromark-util-chunked: 1.0.0 - micromark-util-classify-character: 1.0.0 - micromark-util-resolve-all: 1.0.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-table/1.0.5: - resolution: {integrity: sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==} - dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-tagfilter/1.0.1: - resolution: {integrity: sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==} - dependencies: - micromark-util-types: 1.0.2 - dev: false - - /micromark-extension-gfm-task-list-item/1.0.3: - resolution: {integrity: sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==} - dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm/2.0.1: - resolution: {integrity: sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==} - dependencies: - micromark-extension-gfm-autolink-literal: 1.0.3 - micromark-extension-gfm-footnote: 1.0.4 - micromark-extension-gfm-strikethrough: 1.0.4 - micromark-extension-gfm-table: 1.0.5 - micromark-extension-gfm-tagfilter: 1.0.1 - micromark-extension-gfm-task-list-item: 1.0.3 - micromark-util-combine-extensions: 1.0.0 - micromark-util-types: 1.0.2 - dev: false - - /micromark-extension-math/2.0.2: - resolution: {integrity: sha512-cFv2B/E4pFPBBFuGgLHkkNiFAIQv08iDgPH2HCuR2z3AUgMLecES5Cq7AVtwOtZeRrbA80QgMUk8VVW0Z+D2FA==} - dependencies: - '@types/katex': 0.11.1 - katex: 0.13.24 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-mdx-expression/1.0.3: - resolution: {integrity: sha512-TjYtjEMszWze51NJCZmhv7MEBcgYRgb3tJeMAJ+HQCAaZHHRBaDCccqQzGizR/H4ODefP44wRTgOn2vE5I6nZA==} - dependencies: - micromark-factory-mdx-expression: 1.0.6 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-events-to-acorn: 1.2.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-extension-mdx-jsx/1.0.3: - resolution: {integrity: sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==} - dependencies: - '@types/acorn': 4.0.6 - estree-util-is-identifier-name: 2.0.1 - micromark-factory-mdx-expression: 1.0.6 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - vfile-message: 3.1.3 - dev: false - - /micromark-extension-mdx-md/1.0.0: - resolution: {integrity: sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==} - dependencies: - micromark-util-types: 1.0.2 - dev: false - - /micromark-extension-mdxjs-esm/1.0.3: - resolution: {integrity: sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A==} - dependencies: - micromark-core-commonmark: 1.0.6 - micromark-util-character: 1.1.0 - micromark-util-events-to-acorn: 1.2.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - unist-util-position-from-estree: 1.1.1 - uvu: 0.5.6 - vfile-message: 3.1.3 - dev: false - - /micromark-extension-mdxjs/1.0.0: - resolution: {integrity: sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==} - dependencies: - acorn: 8.8.1 - acorn-jsx: 5.3.2_acorn@8.8.1 - micromark-extension-mdx-expression: 1.0.3 - micromark-extension-mdx-jsx: 1.0.3 - micromark-extension-mdx-md: 1.0.0 - micromark-extension-mdxjs-esm: 1.0.3 - micromark-util-combine-extensions: 1.0.0 - micromark-util-types: 1.0.2 - dev: false - - /micromark-factory-destination/1.0.0: - resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - dev: false - - /micromark-factory-label/1.0.2: - resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-factory-mdx-expression/1.0.6: - resolution: {integrity: sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA==} - dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-events-to-acorn: 1.2.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - unist-util-position-from-estree: 1.1.1 - uvu: 0.5.6 - vfile-message: 3.1.3 - dev: false - - /micromark-factory-space/1.0.0: - resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-types: 1.0.2 - dev: false - - /micromark-factory-title/1.0.2: - resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==} - dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-factory-whitespace/1.0.0: - resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==} - dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - dev: false - - /micromark-util-character/1.1.0: - resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==} - dependencies: - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - dev: false - - /micromark-util-chunked/1.0.0: - resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} - dependencies: - micromark-util-symbol: 1.0.1 - dev: false - - /micromark-util-classify-character/1.0.0: - resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - dev: false - - /micromark-util-combine-extensions/1.0.0: - resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==} - dependencies: - micromark-util-chunked: 1.0.0 - micromark-util-types: 1.0.2 - dev: false - - /micromark-util-decode-numeric-character-reference/1.0.0: - resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==} - dependencies: - micromark-util-symbol: 1.0.1 - dev: false - - /micromark-util-decode-string/1.0.2: - resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-symbol: 1.0.1 - dev: false - - /micromark-util-encode/1.0.1: - resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} - dev: false - - /micromark-util-events-to-acorn/1.2.0: - resolution: {integrity: sha512-WWp3bf7xT9MppNuw3yPjpnOxa8cj5ACivEzXJKu0WwnjBYfzaBvIAT9KfeyI0Qkll+bfQtfftSwdgTH6QhTOKw==} - dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.0 - estree-util-visit: 1.2.0 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - vfile-location: 4.0.1 - vfile-message: 3.1.3 - dev: false - - /micromark-util-html-tag-name/1.1.0: - resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==} - dev: false - - /micromark-util-normalize-identifier/1.0.0: - resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==} - dependencies: - micromark-util-symbol: 1.0.1 - dev: false - - /micromark-util-resolve-all/1.0.0: - resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==} - dependencies: - micromark-util-types: 1.0.2 - dev: false - - /micromark-util-sanitize-uri/1.1.0: - resolution: {integrity: sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-encode: 1.0.1 - micromark-util-symbol: 1.0.1 - dev: false - - /micromark-util-subtokenize/1.0.2: - resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==} - dependencies: - micromark-util-chunked: 1.0.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: false - - /micromark-util-symbol/1.0.1: - resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} - dev: false - - /micromark-util-types/1.0.2: - resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} - dev: false - - /micromark/3.1.0: - resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==} - dependencies: - '@types/debug': 4.1.7 - debug: 4.3.4 - decode-named-character-reference: 1.0.2 - micromark-core-commonmark: 1.0.6 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-chunked: 1.0.0 - micromark-util-combine-extensions: 1.0.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-encode: 1.0.1 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-resolve-all: 1.0.0 - micromark-util-sanitize-uri: 1.1.0 - micromark-util-subtokenize: 1.0.2 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: false - - /mri/1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: false - - /ms/2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: false - - /nanoid/3.3.4: - resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: false - - /nanoid/4.0.1: - resolution: {integrity: sha512-udKGtCCUafD3nQtJg9wBhRP3KMbPglUsgV5JVsXhvyBs/oefqb4sqMEhKBBgqZncYowu58p1prsZQBYvAj/Gww==} - engines: {node: ^14 || ^16 || >=18} - hasBin: true - dev: false - - /next-mdx-remote/4.3.0_react-dom@18.2.0+react@18.2.0: - resolution: {integrity: sha512-fbxkY03pM2Wx5bDNTVKpYD5Hx3QVZGH+6xDtVIxlxXz4HTifP1yI2DrkDvxXbTz0SYGIbluRMIW81IOOa8pigA==} - engines: {node: '>=14', npm: '>=7'} - peerDependencies: - react: '>=16.x <=18.x' - react-dom: '>=16.x <=18.x' - dependencies: - '@mdx-js/mdx': 2.2.1 - '@mdx-js/react': 2.2.1_react@18.2.0 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - vfile: 5.3.6 - vfile-matter: 3.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /next-seo/5.14.1_f26ff3bd08f1cd28b0f73422c76f5ffd: - resolution: {integrity: sha512-NiJeQbxYP3z+EMp52q8k3Q+OfX2+Yv2WehERDj98r2wjXxL+woKpRBdsSVYolTD0Hm8IWs42SzaISE93RoQdOw==} - peerDependencies: - next: ^8.1.1-canary.54 || >=9.0.0 - react: '>=16.0.0' - react-dom: '>=16.0.0' - dependencies: - next: 13.0.6_react-dom@18.2.0+react@18.2.0 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - dev: false - - /next-themes/0.2.1_f26ff3bd08f1cd28b0f73422c76f5ffd: - resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} - peerDependencies: - next: '*' - react: '*' - react-dom: '*' - dependencies: - next: 13.0.6_react-dom@18.2.0+react@18.2.0 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - dev: false - - /next/13.0.6_react-dom@18.2.0+react@18.2.0: - resolution: {integrity: sha512-COvigvms2LRt1rrzfBQcMQ2GZd86Mvk1z+LOLY5pniFtL4VrTmhZ9salrbKfSiXbhsD01TrDdD68ec3ABDyscA==} - engines: {node: '>=14.6.0'} - hasBin: true - peerDependencies: - fibers: '>= 3.1.0' - node-sass: ^6.0.0 || ^7.0.0 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - fibers: - optional: true - node-sass: - optional: true - sass: - optional: true - dependencies: - '@next/env': 13.0.6 - '@swc/helpers': 0.4.14 - caniuse-lite: 1.0.30001435 - postcss: 8.4.14 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - styled-jsx: 5.1.0_react@18.2.0 - optionalDependencies: - '@next/swc-android-arm-eabi': 13.0.6 - '@next/swc-android-arm64': 13.0.6 - '@next/swc-darwin-arm64': 13.0.6 - '@next/swc-darwin-x64': 13.0.6 - '@next/swc-freebsd-x64': 13.0.6 - '@next/swc-linux-arm-gnueabihf': 13.0.6 - '@next/swc-linux-arm64-gnu': 13.0.6 - '@next/swc-linux-arm64-musl': 13.0.6 - '@next/swc-linux-x64-gnu': 13.0.6 - '@next/swc-linux-x64-musl': 13.0.6 - '@next/swc-win32-arm64-msvc': 13.0.6 - '@next/swc-win32-ia32-msvc': 13.0.6 - '@next/swc-win32-x64-msvc': 13.0.6 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - dev: false - - /nextra-theme-docs/2.2.14_d8d66b9d2170cddb63c39dddec8541b9: - resolution: {integrity: sha512-QQcHOcAXSfrpbSX3FqXgcQ2favKLnBAczqKWbSDVEtgHiUG6s7pVpxclpKm5F1c/fP47v19USRq3BL/SZ4JEIQ==} - peerDependencies: - next: '>=9.5.3' - nextra: 2.2.14 - react: '>=16.13.1' - react-dom: '>=16.13.1' - dependencies: - '@headlessui/react': 1.7.10_react-dom@18.2.0+react@18.2.0 - '@popperjs/core': 2.11.6 - clsx: 1.2.1 - flexsearch: 0.7.31 - focus-visible: 5.2.0 - git-url-parse: 13.1.0 - intersection-observer: 0.12.2 - match-sorter: 6.3.1 - next: 13.0.6_react-dom@18.2.0+react@18.2.0 - next-seo: 5.14.1_f26ff3bd08f1cd28b0f73422c76f5ffd - next-themes: 0.2.1_f26ff3bd08f1cd28b0f73422c76f5ffd - nextra: 2.2.14_f26ff3bd08f1cd28b0f73422c76f5ffd - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - scroll-into-view-if-needed: 3.0.4 - zod: 3.20.2 - dev: false - - /nextra/2.2.14_f26ff3bd08f1cd28b0f73422c76f5ffd: - resolution: {integrity: sha512-kToTiTiE4qrQsQ9snFRqCGLLSjKSFgFV/BJm3yp/SRmkmCr1WaWrlmUTAuXlxM7PREbNaZouNSOJ0hGS92rM8A==} - peerDependencies: - next: '>=9.5.3' - react: '>=16.13.1' - react-dom: '>=16.13.1' - dependencies: - '@mdx-js/mdx': 2.2.1 - '@mdx-js/react': 2.2.1_react@18.2.0 - '@napi-rs/simple-git': 0.1.8 - github-slugger: 2.0.0 - graceful-fs: 4.2.10 - gray-matter: 4.0.3 - katex: 0.16.4 - lodash.get: 4.4.2 - next: 13.0.6_react-dom@18.2.0+react@18.2.0 - next-mdx-remote: 4.3.0_react-dom@18.2.0+react@18.2.0 - p-limit: 3.1.0 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - rehype-katex: 6.0.2 - rehype-pretty-code: 0.9.2_shiki@0.12.1 - remark-gfm: 3.0.1 - remark-math: 5.1.1 - remark-reading-time: 2.0.1 - shiki: 0.12.1 - slash: 3.0.0 - title: 3.5.3 - unist-util-remove: 3.1.1 - unist-util-visit: 4.1.1 - transitivePeerDependencies: - - supports-color - dev: false - - /npm-run-path/2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - dependencies: - path-key: 2.0.1 - dev: false - - /p-finally/1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: false - - /p-limit/3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: false - - /parse-entities/4.0.0: - resolution: {integrity: sha512-5nk9Fn03x3rEhGaX1FU6IDwG/k+GxLXlFAkgrbM1asuAFl3BhdQWvASaIsmwWypRNcZKHPYnIuOSfIWEyEQnPQ==} - dependencies: - '@types/unist': 2.0.6 - character-entities: 2.0.2 - character-entities-legacy: 3.0.0 - character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.0.2 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - is-hexadecimal: 2.0.1 - dev: false - - /parse-numeric-range/1.3.0: - resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} - dev: false - - /parse-path/7.0.0: - resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} - dependencies: - protocols: 2.0.1 - dev: false - - /parse-url/8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} - dependencies: - parse-path: 7.0.0 - dev: false - - /parse5/6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: false - - /path-key/2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: false - - /periscopic/3.0.4: - resolution: {integrity: sha512-SFx68DxCv0Iyo6APZuw/AKewkkThGwssmU0QWtTlvov3VAtPX+QJ4CadwSaz8nrT5jPIuxdvJWB4PnD2KNDxQg==} - dependencies: - estree-walker: 3.0.1 - is-reference: 3.0.0 - dev: false - - /picocolors/1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: false - - /postcss/8.4.14: - resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.4 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: false - - /property-information/6.2.0: - resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} - dev: false - - /protocols/2.0.1: - resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} - dev: false - - /pseudomap/1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: false - - /react-dom/18.2.0_react@18.2.0: - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 - dev: false - - /react/18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - dependencies: - loose-envify: 1.4.0 - dev: false - - /reading-time/1.5.0: - resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} - dev: false - - /regenerator-runtime/0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: false - - /rehype-katex/6.0.2: - resolution: {integrity: sha512-C4gDAlS1+l0hJqctyiU64f9CvT00S03qV1T6HiMzbSuLBgWUtcqydWHY9OpKrm0SpkK16FNd62CDKyWLwV2ppg==} - dependencies: - '@types/hast': 2.3.4 - '@types/katex': 0.11.1 - hast-util-to-text: 3.1.2 - katex: 0.15.6 - rehype-parse: 8.0.4 - unified: 10.1.2 - unist-util-remove-position: 4.0.1 - unist-util-visit: 4.1.1 - dev: false - - /rehype-parse/8.0.4: - resolution: {integrity: sha512-MJJKONunHjoTh4kc3dsM1v3C9kGrrxvA3U8PxZlP2SjH8RNUSrb+lF7Y0KVaUDnGH2QZ5vAn7ulkiajM9ifuqg==} - dependencies: - '@types/hast': 2.3.4 - hast-util-from-parse5: 7.1.1 - parse5: 6.0.1 - unified: 10.1.2 - dev: false - - /rehype-pretty-code/0.9.2_shiki@0.12.1: - resolution: {integrity: sha512-l369pvBK6ihBEuy2+VDpHU+zbbY8I+Z4LiyIOunHAt3xyw6selaOFKc/DnX94jI5OJb3+NgjbOxXx2yaAypjZw==} - engines: {node: ^12.16.0 || >=13.2.0} - peerDependencies: - shiki: '*' - dependencies: - hash-obj: 4.0.0 - nanoid: 4.0.1 - parse-numeric-range: 1.3.0 - shiki: 0.12.1 - dev: false - - /remark-gfm/3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} - dependencies: - '@types/mdast': 3.0.10 - mdast-util-gfm: 2.0.1 - micromark-extension-gfm: 2.0.1 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /remark-math/5.1.1: - resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} - dependencies: - '@types/mdast': 3.0.10 - mdast-util-math: 2.0.2 - micromark-extension-math: 2.0.2 - unified: 10.1.2 - dev: false - - /remark-mdx/2.1.5: - resolution: {integrity: sha512-A8vw5s+BgOa968Irt8BO7DfWJTE0Fe7Ge3hX8zzDB1DnwMZTNdK6qF2IcFao+/7nzk1vSysKcFp+3ku4vhMpaQ==} - dependencies: - mdast-util-mdx: 2.0.0 - micromark-extension-mdxjs: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /remark-parse/10.0.1: - resolution: {integrity: sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==} - dependencies: - '@types/mdast': 3.0.10 - mdast-util-from-markdown: 1.2.0 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /remark-reading-time/2.0.1: - resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} - dependencies: - estree-util-is-identifier-name: 2.0.1 - estree-util-value-to-estree: 1.3.0 - reading-time: 1.5.0 - unist-util-visit: 3.1.0 - dev: false - - /remark-rehype/10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} - dependencies: - '@types/hast': 2.3.4 - '@types/mdast': 3.0.10 - mdast-util-to-hast: 12.2.4 - unified: 10.1.2 - dev: false - - /remove-accents/0.4.2: - resolution: {integrity: sha1-CkPTqq4egNuRngeuJUsoXZ4ce7U=} - dev: false - - /sade/1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - dependencies: - mri: 1.2.0 - dev: false - - /scheduler/0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} - dependencies: - loose-envify: 1.4.0 - dev: false - - /scroll-into-view-if-needed/3.0.4: - resolution: {integrity: sha512-s+/F50jwTOUt+u5oEIAzum9MN2lUQNvWBe/zfEsVQcbaERjGkKLq1s+2wCHkahMLC8nMLbzMVKivx9JhunXaZg==} - dependencies: - compute-scroll-into-view: 2.0.4 - dev: false - - /section-matter/1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} - dependencies: - extend-shallow: 2.0.1 - kind-of: 6.0.3 - dev: false - - /shebang-command/1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - dependencies: - shebang-regex: 1.0.0 - dev: false - - /shebang-regex/1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: false - - /shiki/0.12.1: - resolution: {integrity: sha512-aieaV1m349rZINEBkjxh2QbBvFFQOlgqYTNtCal82hHj4dDZ76oMlQIX+C7ryerBTDiga3e5NfH6smjdJ02BbQ==} - dependencies: - jsonc-parser: 3.2.0 - vscode-oniguruma: 1.7.0 - vscode-textmate: 8.0.0 - dev: false - - /signal-exit/3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: false - - /slash/3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: false - - /sort-keys/5.0.0: - resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} - engines: {node: '>=12'} - dependencies: - is-plain-obj: 4.1.0 - dev: false - - /source-map-js/1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: false - - /source-map/0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: false - - /space-separated-tokens/2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: false - - /sprintf-js/1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: false - - /stringify-entities/4.0.3: - resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - dev: false - - /strip-bom-string/1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} - dev: false - - /strip-eof/1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - dev: false - - /style-to-object/0.3.0: - resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} - dependencies: - inline-style-parser: 0.1.1 - dev: false - - /styled-jsx/5.1.0_react@18.2.0: - resolution: {integrity: sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - dependencies: - client-only: 0.0.1 - react: 18.2.0 - dev: false - - /supports-color/4.5.0: - resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} - engines: {node: '>=4'} - dependencies: - has-flag: 2.0.0 - dev: false - - /title/3.5.3: - resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} - hasBin: true - dependencies: - arg: 1.0.0 - chalk: 2.3.0 - clipboardy: 1.2.2 - titleize: 1.0.0 - dev: false - - /titleize/1.0.0: - resolution: {integrity: sha1-fTUHIgYYMLpmF2MeDP0+oIOY2Vo=} - engines: {node: '>=0.10.0'} - dev: false - - /trim-lines/3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: false - - /trough/2.1.0: - resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - dev: false - - /tslib/2.4.1: - resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} - dev: false - - /type-fest/1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - dev: false - - /typescript/4.9.3: - resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - - /unified/10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - dependencies: - '@types/unist': 2.0.6 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.1.0 - vfile: 5.3.6 - dev: false - - /unist-builder/3.0.0: - resolution: {integrity: sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==} - dependencies: - '@types/unist': 2.0.6 - dev: false - - /unist-util-find-after/4.0.1: - resolution: {integrity: sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==} - dependencies: - '@types/unist': 2.0.6 - unist-util-is: 5.1.1 - dev: false - - /unist-util-generated/2.0.0: - resolution: {integrity: sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==} - dev: false - - /unist-util-is/5.1.1: - resolution: {integrity: sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==} - dev: false - - /unist-util-position-from-estree/1.1.1: - resolution: {integrity: sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw==} - dependencies: - '@types/unist': 2.0.6 - dev: false - - /unist-util-position/4.0.3: - resolution: {integrity: sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==} - dependencies: - '@types/unist': 2.0.6 - dev: false - - /unist-util-remove-position/4.0.1: - resolution: {integrity: sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ==} - dependencies: - '@types/unist': 2.0.6 - unist-util-visit: 4.1.1 - dev: false - - /unist-util-remove/3.1.1: - resolution: {integrity: sha512-kfCqZK5YVY5yEa89tvpl7KnBBHu2c6CzMkqHUrlOqaRgGOMp0sMvwWOVrbAtj03KhovQB7i96Gda72v/EFE0vw==} - dependencies: - '@types/unist': 2.0.6 - unist-util-is: 5.1.1 - unist-util-visit-parents: 5.1.1 - dev: false - - /unist-util-stringify-position/3.0.2: - resolution: {integrity: sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==} - dependencies: - '@types/unist': 2.0.6 - dev: false - - /unist-util-visit-parents/4.1.1: - resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} - dependencies: - '@types/unist': 2.0.6 - unist-util-is: 5.1.1 - dev: false - - /unist-util-visit-parents/5.1.1: - resolution: {integrity: sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==} - dependencies: - '@types/unist': 2.0.6 - unist-util-is: 5.1.1 - dev: false - - /unist-util-visit/3.1.0: - resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} - dependencies: - '@types/unist': 2.0.6 - unist-util-is: 5.1.1 - unist-util-visit-parents: 4.1.1 - dev: false - - /unist-util-visit/4.1.1: - resolution: {integrity: sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==} - dependencies: - '@types/unist': 2.0.6 - unist-util-is: 5.1.1 - unist-util-visit-parents: 5.1.1 - dev: false - - /uvu/0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true - dependencies: - dequal: 2.0.3 - diff: 5.1.0 - kleur: 4.1.5 - sade: 1.8.1 - dev: false - - /vfile-location/4.0.1: - resolution: {integrity: sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==} - dependencies: - '@types/unist': 2.0.6 - vfile: 5.3.6 - dev: false - - /vfile-matter/3.0.1: - resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} - dependencies: - '@types/js-yaml': 4.0.5 - is-buffer: 2.0.5 - js-yaml: 4.1.0 - dev: false - - /vfile-message/3.1.3: - resolution: {integrity: sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==} - dependencies: - '@types/unist': 2.0.6 - unist-util-stringify-position: 3.0.2 - dev: false - - /vfile/5.3.6: - resolution: {integrity: sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA==} - dependencies: - '@types/unist': 2.0.6 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.2 - vfile-message: 3.1.3 - dev: false - - /vscode-oniguruma/1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - dev: false - - /vscode-textmate/8.0.0: - resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - dev: false - - /web-namespaces/2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - dev: false - - /which/1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: false - - /yallist/2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: false - - /yocto-queue/0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: false - - /zod/3.20.2: - resolution: {integrity: sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ==} - dev: false - - /zwitch/2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - dev: false From da29526b05eb12e609a10f18c961f6a9cd43899d Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Wed, 21 Feb 2024 10:11:23 +0300 Subject: [PATCH 005/101] added cards --- components/Hero.jsx | 26 +++++++++++++------------- package-lock.json | 9 +++++++++ package.json | 1 + pages/roadmaps/_meta.json | 1 + pages/roadmaps/index.mdx | 15 +++++++++++++++ 5 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 pages/roadmaps/index.mdx diff --git a/components/Hero.jsx b/components/Hero.jsx index 5b657125..0bb471c0 100644 --- a/components/Hero.jsx +++ b/components/Hero.jsx @@ -22,40 +22,40 @@ export default function Hero() {

- New + Welcome - Announcing new road maps for teams - Learn more + to Our new Desishub Docs + By JB Web Developer - Announcing roadmap for teams + Welcome to Our new Desishub Docs by JB

- Developer Roadmaps + All in One Developer's Handbook

- roadmap.sh - is a community effort to create roadmaps, guides and other - educational content to help guide developers in picking up a path - and guide their learnings. + Master any dev challenge with Desishub's all-in-one handbook. From + roadmaps to video tutorials, conquer frontend, backend, and design + with ease. This guide empowers you with everything you need to + become a top developer.

- Community created roadmaps, guides and articles to help developers - grow in their career. + Desishub's all-in-one handbook. From roadmaps to video tutorials, + conquer frontend, backend, and design with ease.

- Role based Roadmap + Popular Bookmarks

    {links.map((item, i) => { diff --git a/package-lock.json b/package-lock.json index 4e7c80b8..baf685d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.1", "license": "MIT", "dependencies": { + "lucide-react": "^0.335.0", "next": "^13.0.6", "nextra": "latest", "nextra-theme-docs": "latest", @@ -2992,6 +2993,14 @@ "yallist": "^2.1.2" } }, + "node_modules/lucide-react": { + "version": "0.335.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.335.0.tgz", + "integrity": "sha512-FNmIG4JLdvpK86ZFJjrT0SnFEa95KhsiNokVicA5mWEf1oe+ujP2C/bTr0PVQzr/wzvZpzgxaOySq0O79q2oMA==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/markdown-extensions": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-1.1.1.tgz", diff --git a/package.json b/package.json index 9034ac4c..22a61c52 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ }, "homepage": "https://github.com/shuding/nextra-docs-template#readme", "dependencies": { + "lucide-react": "^0.335.0", "next": "^13.0.6", "nextra": "latest", "nextra-theme-docs": "latest", diff --git a/pages/roadmaps/_meta.json b/pages/roadmaps/_meta.json index 9b5f5ac7..347cea40 100644 --- a/pages/roadmaps/_meta.json +++ b/pages/roadmaps/_meta.json @@ -1,4 +1,5 @@ { + "index": "Introduction", "role-based": "Role Based Roadmaps", "skill-based": "Skill based Roadmaps" } diff --git a/pages/roadmaps/index.mdx b/pages/roadmaps/index.mdx new file mode 100644 index 00000000..619b2afd --- /dev/null +++ b/pages/roadmaps/index.mdx @@ -0,0 +1,15 @@ +import { Cards, Card } from "nextra/components"; +import { GitPullRequest, Milestone } from "lucide-react"; + + + } + title="Role Based Roadmaps" + href="/roadmaps/role-based" + /> + } + title="Skill based Roadmaps" + href="/roadmaps/skill-based" + /> + From 9fca9465153129e13503c839024ac2bf6ce20d75 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Thu, 22 Feb 2024 04:13:46 +0300 Subject: [PATCH 006/101] added more typescript --- components/Hero.jsx | 13 +- notes.md | 3 + .../nextjs/next-typescript.mdx | 218 +++++++++++++++++- pages/roadmaps/index.mdx | 1 + 4 files changed, 224 insertions(+), 11 deletions(-) diff --git a/components/Hero.jsx b/components/Hero.jsx index 0bb471c0..ae732c6a 100644 --- a/components/Hero.jsx +++ b/components/Hero.jsx @@ -1,6 +1,5 @@ import Link from "next/link"; import React from "react"; - export default function Hero() { const links = [ { @@ -8,12 +7,12 @@ export default function Hero() { path: "/programming-tutorials/nextjs/next-typescript", }, { title: "Roadmaps Must see", path: "/roadmaps" }, - { title: "Desishub Lessons", path: "/desishub-lessons" }, - { title: "YouTube Video Tutorials", path: "/youtube-tutorials" }, - { title: "Website Templates Guides", path: "/website-templates" }, - { title: "Course Guides", path: "/course-guides" }, - { title: "Desishub Courses", path: "/desishub-courses" }, - { title: "How to Guides", path: "/how-to-guides" }, + { title: "Desishub Lessons", path: "/programming-tutorials" }, + { title: "YouTube Video Tutorials", path: "#" }, + { title: "Website Templates Guides", path: "#" }, + { title: "Course Guides", path: "#" }, + { title: "Desishub Courses", path: "#" }, + { title: "How to Guides", path: "#" }, ]; return ( diff --git a/notes.md b/notes.md index d52c3413..6cace39b 100644 --- a/notes.md +++ b/notes.md @@ -1,3 +1,6 @@ +https://www.telerik.com/blogs/getting-started-typescript-react +https://blog.bitsrc.io/react-typescript-cheetsheet-2b6fa2cecfe2 +https://ultimatecourses.com/courses/html-css pages/ |-- index.js (Homepage) |-- programming-tutorials/ diff --git a/pages/programming-tutorials/nextjs/next-typescript.mdx b/pages/programming-tutorials/nextjs/next-typescript.mdx index dc505568..75df59e2 100644 --- a/pages/programming-tutorials/nextjs/next-typescript.mdx +++ b/pages/programming-tutorials/nextjs/next-typescript.mdx @@ -461,11 +461,14 @@ bear.name; bear.honey; ``` -For the most part, you can choose based on personal preference, and TypeScript will tell you if it needs something to be the other kind of declaration. If you would like a heuristic, use interface until you need to use features from type. (From typescript team) +For the most part, you can choose based on personal preference, and TypeScript will tell you if it needs something to be the other kind of declaration. Use Interface until You Need Type. (From typescript team) + +Here's a helpful rule of thumb: + +- Always use interface for public API's definition when authoring a library or 3rd party ambient type definitions, as this allows a consumer to extend them via declaration merging if some definitions are missing. + +- Consider using type for your React Component Props and State, for consistency and because it is more constrained. -- the word "heuristic" refers to a rule of thumb or a general guideline that helps you decide when to use interfaces or types in TypeScript. It's not a precise rule, but rather a helpful suggestion to aid in your decision-making process. -- You should use types by default until you need a specific feature of interfaces, like 'extends'.(Other devs say) -- We will keep interchanging and we will notice which one best suits you (My suggestion) - Interfaces can't express unions, mapped types, or conditional types. Type aliases can express any type. - Interfaces can use extends, types can't. - When you're working with objects that inherit from each other, use interfaces. extends makes TypeScript's type checker run slightly faster than using &. @@ -496,6 +499,32 @@ TypeScript will still attempt to typecheck casts to prevent casts that don't see console.log((4 as string).length); // Error: Conversion of type 'number' to type 'string' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first. ``` +### TypeScript Type Guards + +Type guards are special checks you can perform on a variable to narrow down its possible types within a specific block of code. Think of them like filters that refine your understanding of a variable's type based on some condition. This allows you to access properties and methods that wouldn't be available on the wider, less specific type. +**Built-in type guards:** +typeof operator: Checks the type of a variable against basic types like string, number, etc. `(typeof x === "string")`. +instanceof operator: Checks if an object belongs to a specific class `(object instanceof MyClass)`. +in operator: Checks if a property exists on an object `("name" in object)`. + +```ts copy +type alphanumeric = string | number; + +function add(a: alphanumeric, b: alphanumeric) { + if (typeof a === "number" && typeof b === "number") { + return a + b; + } + + if (typeof a === "string" && typeof b === "string") { + return a.concat(b); + } + + throw new Error( + "Invalid arguments. Both arguments must be either numbers or strings." + ); +} +``` + ### TypeScript Generics – Use Case and Examples To understand What TypeScript Generics are lets look at the Use cases @@ -603,3 +632,184 @@ const user: UserData = { In above snippet, `` are passed to the interface UserData. In this way, UserData becomes a reusable interface in which any data type can be assigned depending upon the use case. Here in this example, name and rollNo will always be string and number, respectively. But this example was to showcase how you can use generics with interfaces in TS. + +## Typescript in Next JS and React + +### TypeScript with React Components + +Every file containing JSX must use the .tsx file extension. This is a TypeScript-specific extension that tells TypeScript that this file contains JSX. + +Writing TypeScript with React is very similar to writing JavaScript with React. The key difference when working with a component is that you can provide types for your component’s props. These types can be used for correctness checking and providing inline documentation in editors. + +```ts copy +function MyButton({ title }: { title: string }) { + return ; +} + +export default function MyApp() { + return ( +
    +

    Welcome to my app

    + +
    + ); +} +``` + +This inline syntax is the simplest way to provide types for a component, though once you start to have a few fields to describe it can become unwieldy. Instead, you can use an interface or type to describe the component’s props: + +```ts copy +interface MyButtonProps { + /** The text to display inside the button */ + title: string; + /** Whether the button can be interacted with */ + disabled: boolean; +} + +function MyButton({ title, disabled }: MyButtonProps) { + return ; +} + +export default function MyApp() { + return ( +
    +

    Welcome to my app

    + +
    + ); +} +``` + +### React Hooks + +The type definitions from `@types/react` include types for the built-in Hooks, so you can use them in your components without any additional setup. They are built to take into account the code you write in your component, so you will get inferred types a lot of the time and ideally do not need to handle the minutiae of providing the types. + +However, we can look at a few examples of how to provide types for Hooks. + +#### useState + +The useState Hook will re-use the value passed in as the initial state to determine what the type of the value should be. For example: + +```ts copy +// Infer the type as "boolean" +const [enabled, setEnabled] = useState(false); +``` + +Will assign the type of boolean to enabled, and setEnabled will be a function accepting either a boolean argument, or a function that returns a boolean. If you want to explicitly provide a type for the state, you can do so by providing a type argument to the useState call: + +```ts copy +// Explicitly set the type to "boolean" +const [enabled, setEnabled] = useState(false); +``` + +This is not very useful in this case, but a common case where you may want to provide a type is when you have a union type. For example, status here can be one of a few different strings: + +```ts copy +type Status = "idle" | "loading" | "success" | "error"; + +const [status, setStatus] = useState("idle"); +``` + +Also in many cases hooks are initialized with null-ish default values, and you may wonder how to provide types. Explicitly declare the type, and use a union type: + +```ts copy +const [user, setUser] = useState(null); + +// later... +setUser(newUser); +``` + +### useReducer + +You can use Discriminated Unions for reducer actions. Don't forget to define the return type of reducer, otherwise TypeScript will infer it. + +```ts copy +import { useReducer } from "react"; + +const initialState = { count: 0 }; + +type ACTIONTYPE = + | { type: "increment"; payload: number } + | { type: "decrement"; payload: string }; + +function reducer(state: typeof initialState, action: ACTIONTYPE) { + switch (action.type) { + case "increment": + return { count: state.count + action.payload }; + case "decrement": + return { count: state.count - Number(action.payload) }; + default: + throw new Error(); + } +} + +function Counter() { + const [state, dispatch] = useReducer(reducer, initialState); + return ( + <> + Count: {state.count} + + + + ); +} +``` + +### useRef + +In TypeScript, useRef returns a reference that is either read-only or mutable, depends on whether your type argument fully covers the initial value or not. Choose one that suits your use case. +**Option 1: DOM element ref** +To access a DOM element: provide only the element type as argument, and use null as initial value. In this case, the returned reference will have a read-only .current that is managed by React. TypeScript expects you to give this ref to an element's ref prop: + +```ts copy +function Foo() { + // - If possible, prefer as specific as possible. For example, HTMLDivElement + // is better than HTMLElement and way better than Element. + // - Technical-wise, this returns RefObject + const divRef = useRef(null); + + useEffect(() => { + // Note that ref.current may be null. This is expected, because you may + // conditionally render the ref-ed element, or you may forget to assign it + if (!divRef.current) throw Error("divRef is not assigned"); + + // Now divRef.current is sure to be HTMLDivElement + doSomethingWith(divRef.current); + }); + + // Give the ref to an element so React can manage it for you + return
    etc
    ; +} +``` + +If you are sure that divRef.current will never be null, it is also possible to use the non-null assertion operator !: + +```ts copy +const divRef = useRef(null!); +// Later... No need to check if it is null +doSomethingWith(divRef.current); +``` + +### Useful React Prop Type Examples + +Relevant for components that accept other React components as props. + +```ts copy +export declare interface AppProps { + children?: React.ReactNode; // best, accepts everything React can render + childrenElement: React.JSX.Element; // A single React element + style?: React.CSSProperties; // to pass through style props + onChange?: React.FormEventHandler; // form events! the generic parameter is the type of event.target + // more info: https://react-typescript-cheatsheet.netlify.app/docs/advanced/patterns_by_usecase/#wrappingmirroring + props: Props & React.ComponentPropsWithoutRef<"button">; // to impersonate all the props of a button element and explicitly not forwarding its ref + props2: Props & React.ComponentPropsWithRef; // to impersonate all the props of MyButtonForwardedRef and explicitly forwarding its ref +} +``` + +### Redux with Typescript Coming Up SOON! + +{/* https://bluelight.co/blog/redux-toolkit-with-typescript */} diff --git a/pages/roadmaps/index.mdx b/pages/roadmaps/index.mdx index 619b2afd..02ac95fa 100644 --- a/pages/roadmaps/index.mdx +++ b/pages/roadmaps/index.mdx @@ -1,3 +1,4 @@ +{/* https://nextra.site/docs/guide/built-ins/cards#usage */} import { Cards, Card } from "nextra/components"; import { GitPullRequest, Milestone } from "lucide-react"; From 22e23a529f9d44d00d783730eda50ac269aa3726 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Sat, 24 Feb 2024 07:49:37 +0300 Subject: [PATCH 007/101] added next with typecript --- components/User.jsx | 1 + .../nextjs/next-typescript.mdx | 403 +++++++++++++++++- 2 files changed, 391 insertions(+), 13 deletions(-) create mode 100644 components/User.jsx diff --git a/components/User.jsx b/components/User.jsx new file mode 100644 index 00000000..6542df53 --- /dev/null +++ b/components/User.jsx @@ -0,0 +1 @@ +import React from "react"; diff --git a/pages/programming-tutorials/nextjs/next-typescript.mdx b/pages/programming-tutorials/nextjs/next-typescript.mdx index 75df59e2..0cb8d95f 100644 --- a/pages/programming-tutorials/nextjs/next-typescript.mdx +++ b/pages/programming-tutorials/nextjs/next-typescript.mdx @@ -635,7 +635,7 @@ Here in this example, name and rollNo will always be string and number, respecti ## Typescript in Next JS and React -### TypeScript with React Components +### TypeScript with React Components props Every file containing JSX must use the .tsx file extension. This is a TypeScript-specific extension that tells TypeScript that this file contains JSX. @@ -656,27 +656,147 @@ export default function MyApp() { } ``` -This inline syntax is the simplest way to provide types for a component, though once you start to have a few fields to describe it can become unwieldy. Instead, you can use an interface or type to describe the component’s props: - ```ts copy -interface MyButtonProps { - /** The text to display inside the button */ +type Product = { + title: string; + price: number; + rating: number; +}; +interface IProduct { title: string; - /** Whether the button can be interacted with */ - disabled: boolean; + price: number; + rating: number; } - -function MyButton({ title, disabled }: MyButtonProps) { - return ; +export default function Product({ title, price, rating }: Product) { + return ( +
    +

    {title}

    +

    {price}

    +

    {rating}

    +
    + ); } +``` -export default function MyApp() { +** Components with Children Props** + +```ts copy +import React, { ReactNode } from 'react'; + +type FormCardWrapperProps = { + children: ReactNode; +}; + +const FormCardWrapper({ children }:FormCardWrapperProps) => { + return ( +
    + {children} +
    + ); +}; + +export default FormCardWrapper; + +import React from 'react'; +import FormCardWrapper from './FormCardWrapper'; + +const MyForm: React.FC = () => { + return ( + +
    + {/* Form inputs go here */} + + + +
    +
    + ); +}; + +export default MyForm; + +``` + +### Alternative ways to Annotate props types + +```ts copy +import { FC } from "react"; + +type Shape = { + name: string; + age: number; +}; + +const User: FC = ({ name, age }) => { return (
    -

    Welcome to my app

    - +

    {name}

    +

    {age}

    ); +}; + +export default User; +``` + +#### Types for Dynamic Routes + +For example, a blog could include the following route app/blog/`[slug]/page.js where [slug] `is the Dynamic Segment for blog posts. + +```ts app/blog/[slug]/page.tsx copy +export default function Page({ + params: { slug }, +}: { + params: { slug: string }; +}) { + return
    My Post: {slug}
    ; +} +///Alternatively +type Shape = { + params: { id: number }; +}; +export default function User({ params: { id } }: Shape) { + return
    User id: {id}
    ; +} +``` + +#### Re-Usable Types + +Using types to reuse types + +```ts copy +type User = { + id: string; + username: string; + email: string; + password: string; +}; + +type Admin = User & { + isAdmin: boolean; +}; + +type ServiceProvider = User & { + serviceType: string; +}; +``` + +Using Interfaces to reuse types + +```ts ccopy +type User = { + id: string; + username: string; + email: string; + password: string; +}; + +interface Admin extends User { + isAdmin: boolean; +} + +interface ServiceProvider extends User { + serviceType: string; } ``` @@ -719,6 +839,263 @@ const [user, setUser] = useState(null); setUser(newUser); ``` +### Refs and Events Types + +```ts copy +import React, { useRef, useState } from "react"; + +// Define User type +type User = { + name: string; + email: string; + password: string; +}; + +const FormExample = () => { + // State to store submitted data + const [submittedData, setSubmittedData] = useState(null); + + // Refs for form fields + const nameRef = useRef(null); + const emailRef = useRef(null); + const passwordRef = useRef(null); + + // Function to handle form submission + const handleSubmit = (event: FormEvent) => { + event.preventDefault(); // Prevent default form submission behavior + + // Get form field values using refs + const name = nameRef.current!.value; + // const name = nameRef.current?.value || ""; + const email = emailRef.current?.value || ""; + const password = passwordRef.current?.value || ""; + + // Create user object + const newUser: User = { name, email, password }; + + // Push user object into an array (For demonstration, you might use state or other state management tools) + const users: User[] = []; + users.push(newUser); + + // Update submitted data state + setSubmittedData(newUser); + }; + + return ( +
    +

    Registration Form

    +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    + + {/* Display submitted data */} + {submittedData && ( +
    +

    Submitted Data:

    +

    Name: {submittedData.name}

    +

    Email: {submittedData.email}

    +

    Password: {submittedData.password}

    +
    + )} +
    + ); +}; + +export default FormExample; +``` + +### Element Wrapper + +```ts copy +import React from "react"; + +type ElementWrapperProps = { + elementType: "div" | "h1" | "button" | "section"; + children: React.ReactNode; + className?: string; + onClick?: () => void; +}; + +const ElementWrapper: React.FC = ({ + elementType, + children, + className, + onClick, +}) => { + // Type assertion to ensure elementType is a valid JSX intrinsic element + const Element = elementType as keyof JSX.IntrinsicElements; + + return ( + + {children} + + ); +}; + +export default ElementWrapper; +``` + +In this component: + +ElementWrapper is a functional component that accepts props of type ElementWrapperProps. +elementType prop accepts a union type `('div' | 'h1' | 'button' | 'section')` representing valid HTML elements. +children prop represents the content inside the element. +className prop is optional and represents the CSS class for styling. +onClick prop is optional and represents the click event handler. +Inside the component, Element is declared using type assertion `(as keyof JSX.IntrinsicElements)` to ensure elementType is a valid JSX intrinsic element. +We use Element to render the appropriate JSX element with provided props. +Here's how you can use the ElementWrapper component: + +```ts copy +// import React from "react"; +// import ElementWrapper from "./ElementWrapper"; + +// const App = () => { +// return ( +//
    +// {/* Example usage of ElementWrapper */} +// console.log("Button clicked")} +// > +// Click me +// +// +// Hello, World! +// +// +//

    This is a paragraph inside a div.

    +//
    +// +//

    Section Title

    +//

    This is a paragraph inside a section.

    +//
    +//
    +// ); +// }; + +// export default App; +``` + +### Creating a Custome Button Element + +```ts copy +import { ReactNode, FC } from "react"; + +type ButtonProps = { + variant?: "default" | "primary" | "secondary" | "linkButton"; + href?: string; // Only applicable for linkButton variant + icon?: ReactNode; + onClick?: () => void; + className?: string; // Optional additional class name +}; + +const Button: FC = ({ + variant = "default", + href, + icon, + onClick, + className = "", + children, +}) => { + let baseClassName = + "inline-flex items-center justify-center border font-medium rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2"; + let styleClassName = ""; + + switch (variant) { + case "primary": + styleClassName = + "bg-blue-600 text-white border-transparent hover:bg-blue-700"; + break; + case "secondary": + styleClassName = + "bg-gray-300 text-gray-700 border-gray-300 hover:bg-gray-400"; + break; + case "linkButton": + styleClassName = "text-blue-600 border-transparent hover:text-blue-700"; + break; + default: + styleClassName = + "bg-white text-gray-700 border-gray-300 hover:bg-gray-100"; + } + + const combinedClassName = `${baseClassName} ${styleClassName} ${className}`; + + return ( + <> + {href ? ( + + {icon && {icon}} + {children} + + ) : ( + + )} + + ); +}; + +export default Button; +``` + +In this component: + +We define a Button component that accepts props such as variant, href, icon, and onClick. +The variant prop is optional and can be one of 'default', 'primary', 'secondary', or 'linkButton'. +Based on the variant provided, we add Tailwind CSS classes to style the button accordingly. +If href is provided `(applicable only for the 'linkButton' variant)`, we render an `` tag; otherwise, we render a ` + + + + + +
+ ); +}; + +export default App; +``` + +{/* https://www.youtube.com/watch?v=iS1K64X_eXg */} +{/* https://gemini.google.com/app/6d3d58e6394d2185 */} +{/* https://chat.openai.com/c/7706348d-38c0-4c9d-89d7-79614b14207c */} + +### Context API Coming Soon + ### useReducer You can use Discriminated Unions for reducer actions. Don't forget to define the return type of reducer, otherwise TypeScript will infer it. From df476bbb9a27bcc362395c460aa336c830094444 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Mon, 26 Feb 2024 21:09:05 +0300 Subject: [PATCH 008/101] added zod --- .../nextjs/next-typescript.mdx | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/pages/programming-tutorials/nextjs/next-typescript.mdx b/pages/programming-tutorials/nextjs/next-typescript.mdx index 0cb8d95f..0ca000b0 100644 --- a/pages/programming-tutorials/nextjs/next-typescript.mdx +++ b/pages/programming-tutorials/nextjs/next-typescript.mdx @@ -1094,6 +1094,95 @@ export default App; {/* https://gemini.google.com/app/6d3d58e6394d2185 */} {/* https://chat.openai.com/c/7706348d-38c0-4c9d-89d7-79614b14207c */} +### How to Use Zod and React Hook form + +Form validation is a fundamental aspect of building robust web applications. It ensures that the data submitted by users conforms to the expected format and business rules. + +#### Zod + +Zod is a TypeScript-first schema declaration and validation library. It simplifies type definition and data validation in TypeScript by allowing developers to declare validators once, with automatic type deduction. + +#### React Hook Form + +React Hook Form is a lightweight, high-performance library for managing forms in React applications. It uses React hooks to simplify form logic, providing a fluid and efficient development experience. + +It is a very complex task to handle validation. But with the help of React-hook-form and Zod, we can validate form in any real-world application so easily. Here are the steps: + +#### Install packages + +```ts copy +npm install react-hook-form @hookform/resolvers zod +``` + +#### create a schema using Zod + +```ts copy +import { z } from "zod"; + +export const signinSchema = z.object({ + email: z + .string({ + required_error: "Email is required", + }) + .email({ + message: "Not a valid email", + }), + password: z + .string({ + required_error: "Password is required", + }) + .min(6, { + message: "Password too short - should be 6 chars minimum", + }), +}); +``` + +#### add useForm hook + +```ts copy +"use client"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; + +const { + register, + handleSubmit, + reset, + formState: { errors }, +} = useForm({ + resolver: zodResolver(signinSchema), +}); +``` + +#### Give every input a different name + +```ts copy + +``` + +#### Create a function that will be called on form submit + +```ts copy +const handleSignin = () => { + //write all the logics +}; + +
; +``` + +#### handling errors + +```ts copy +{ + errors.email?.message && ( +

+ {" "} + *{errors.email?.message}{" "} +

+ ); +} +``` + ### Context API Coming Soon ### useReducer From 7ea2cee17b53ad7f7647054a254ec629701ae6bf Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Tue, 27 Feb 2024 05:03:04 +0300 Subject: [PATCH 009/101] added zod and react hook form --- .../nextjs/next-typescript.mdx | 77 ++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/pages/programming-tutorials/nextjs/next-typescript.mdx b/pages/programming-tutorials/nextjs/next-typescript.mdx index 0ca000b0..dbafa710 100644 --- a/pages/programming-tutorials/nextjs/next-typescript.mdx +++ b/pages/programming-tutorials/nextjs/next-typescript.mdx @@ -1100,7 +1100,7 @@ Form validation is a fundamental aspect of building robust web applications. It #### Zod -Zod is a TypeScript-first schema declaration and validation library. It simplifies type definition and data validation in TypeScript by allowing developers to declare validators once, with automatic type deduction. +Zod is a TypeScript-first schema declaration and validation library. It simplifies type definition and data validation in TypeScript by allowing developers to declare validators once, with automatic type deduction. Visit the the Documenntation [here](https://zod.dev/?id=strings) #### React Hook Form @@ -1117,6 +1117,7 @@ npm install react-hook-form @hookform/resolvers zod #### create a schema using Zod ```ts copy +//schemas/schema.ts import { z } from "zod"; export const signinSchema = z.object({ @@ -1183,6 +1184,80 @@ const handleSignin = () => { } ``` +#### Some other Common Validations + +Its a good practice to create a schema folder in the root + +```ts copy +// src/schemas/schema.ts + +import { z } from "zod"; + +export const formSchema = z.object({}); +``` + +First and Last Name — We can use `z.string()` do define strings and chain a `.min() `check to apply a minimum length and add a custom error message. You can trim trailing whitespaces with `.trim().` + +```ts copy +export const formSchema = z.object({ + // ... + firstName: z + .string() + .trim() + .min(2, { message: "First name must be more than 1 character" }), + lastName: z + .string() + .trim() + .min(2, { message: "Last name must be more than 1 character" }), + // ... +}); +``` + +Email and Website — Zod has some useful built-in validators for common string patterns. + +```ts copy +export const formSchema = z.object({ + // ... + email: z.string().trim().email(), + website: z.string().trim().url(), + // ... +}); +``` + +Password — Again, another string refinement but with an added test to check if Password and Confirm Password are the same. To compare two fields to one another, we need to run the refinement on the entire schema object. In this case, if the passwords do not match, it might be nice to show the non-matching error as an error that belongs to the Confirm Password field. We can use .`superRefine()` to gain access to the schema context and define highly customized errors. + +```ts copy +export const formSchema = z + .object({ + // ... + password: z + .string() + .refine( + (val) => + /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/.test( + val + ), + { + message: + "Password must be at least 8 characters long and contain at least one uppercase character, one lowercase character, and one special symbol", + } + ), + confirmPassword: z.string(), + // ... + }) + .superRefine((val, ctx) => { + if (val.password !== val.confirmPassword) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + path: ["confirmPassword"], + message: "Passwords do not match", + }); + } + }); +``` + +Visit the the Documenntation [here](https://zod.dev/?id=strings) + ### Context API Coming Soon ### useReducer From 5927ce315f918faea7134c40d042c49d7603e5a8 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Wed, 28 Feb 2024 09:16:35 +0300 Subject: [PATCH 010/101] adding server actions --- .../nextjs/next-actions.mdx | 19 ++++++++++++++++++ public/server-actions.png | Bin 0 -> 256343 bytes 2 files changed, 19 insertions(+) create mode 100644 public/server-actions.png diff --git a/pages/programming-tutorials/nextjs/next-actions.mdx b/pages/programming-tutorials/nextjs/next-actions.mdx index e69de29b..6d1850b4 100644 --- a/pages/programming-tutorials/nextjs/next-actions.mdx +++ b/pages/programming-tutorials/nextjs/next-actions.mdx @@ -0,0 +1,19 @@ +# How to use react-hook-form with Next.js Server Actions and Zod Input validation + +![Hello](/server-actions.png) + +If you've worked with more forms within Next.js (or React in general), chances are you've used react-hook-form, a "performant, flexible and extensible forms with easy-to-use validation" (as per their website). + +I've used react-hook-form for a long time now and with the recent announcement of Server Actions becoming stable in Next.js 14 I've gotten curious about how to use these tools together. + +### Prerequisites + +For this guide, we assume you've got a Next.js 14 installation. Additionally, we need react-hook-form and, as a bonus, we're gonna use Zod for advanced input validation: + +### Install Dependencies + +```bash copy +npm install react-hook-form zod @hookform/resolvers +``` + +It's important to note that server actions are still pretty new and some libraries, like react-hook-form, will certainly improve support of them in the future. For this guide, I'm using react-hook-form v7.48. diff --git a/public/server-actions.png b/public/server-actions.png new file mode 100644 index 0000000000000000000000000000000000000000..34d5f4256306018e231ffd566faa112e3d8dcdda GIT binary patch literal 256343 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

Ht@9o^9jJIw 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 =Ds)6x7;bLh=e!T-Sucg0Vc=0NGNL@TJ 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

@|Ac?A;R=3(x!XdQe4Rc!7$j9hDG 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 literal 0 HcmV?d00001 From b242ed14b21eea5ac09723993cc603126a81cc43 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Mon, 11 Mar 2024 04:33:33 +0300 Subject: [PATCH 011/101] added doctor app docs --- pages/youtube/_meta.json | 4 + pages/youtube/medical-app.mdx | 141 ++++++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+) create mode 100644 pages/youtube/_meta.json create mode 100644 pages/youtube/medical-app.mdx diff --git a/pages/youtube/_meta.json b/pages/youtube/_meta.json new file mode 100644 index 00000000..65567532 --- /dev/null +++ b/pages/youtube/_meta.json @@ -0,0 +1,4 @@ +{ + "medical-app": "Medical App Docs " + +} diff --git a/pages/youtube/medical-app.mdx b/pages/youtube/medical-app.mdx new file mode 100644 index 00000000..e54966d2 --- /dev/null +++ b/pages/youtube/medical-app.mdx @@ -0,0 +1,141 @@ +## Adding Multi-step Carousel + +Both the Telehealth and Inperson Visit Uses Carousel. +We will use mult- + +## Single Category List Component + +```js copy +import Link from "next/link"; +import React from "react"; +import CategoryCarousel from "./CategoryCarousel"; + +export default function CategoryList({ category }) { + return ( +

+
+

{category.title}

+ + See All + +
+
+ +
+
+ ); +} +``` + +### Here is the Category Carousel + +It Uses React Multi-Carousel + +```js copy +"use client"; +import { BaggageClaim } from "lucide-react"; +import Image from "next/image"; +import Link from "next/link"; +import React from "react"; +import Carousel from "react-multi-carousel"; +import "react-multi-carousel/lib/styles.css"; +import Product from "./Product"; +export default function CategoryCarousel({ products }) { + const responsive = { + desktop: { + breakpoint: { max: 3000, min: 1024 }, + items: 4, + slidesToSlide: 3, // optional, default to 1. + }, + tablet: { + breakpoint: { max: 1024, min: 464 }, + items: 3, + slidesToSlide: 2, // optional, default to 1. + }, + mobile: { + breakpoint: { max: 464, min: 0 }, + items: 2, + slidesToSlide: 1, // optional, default to 1. + }, + }; + return ( + + {products.map((product, i) => { + return ; + })} + + ); +} +``` + +## Here is the Product Component + +```js copy +"use client"; +import { addToCart } from "@/redux/slices/cartSlice"; +import { BaggageClaim } from "lucide-react"; +import Image from "next/image"; +import Link from "next/link"; +import React from "react"; +import toast from "react-hot-toast"; +import { useDispatch } from "react-redux"; + +export default function Product({ product }) { + const dispatch = useDispatch(); + function handleAddToCart() { + // Dispatch the reducer + dispatch(addToCart(product)); + toast.success("Item added Successfully"); + } + return ( +
+ + {product.title} + +
+ +

+ {product.title} +

+ +
+

UGX {product.salePrice}

+ +
+
+
+ ); +} +``` From 49a1b0c66360ad682197b784e7687cda1550218b Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Tue, 12 Mar 2024 04:54:04 +0300 Subject: [PATCH 012/101] added medical app --- pages/youtube/_meta.json | 1 - pages/youtube/medical-app.mdx | 141 ----------- pages/youtube/medical-app/_meta.json | 3 + pages/youtube/medical-app/intro.mdx | 343 +++++++++++++++++++++++++++ 4 files changed, 346 insertions(+), 142 deletions(-) delete mode 100644 pages/youtube/medical-app.mdx create mode 100644 pages/youtube/medical-app/_meta.json create mode 100644 pages/youtube/medical-app/intro.mdx diff --git a/pages/youtube/_meta.json b/pages/youtube/_meta.json index 65567532..99ae2da5 100644 --- a/pages/youtube/_meta.json +++ b/pages/youtube/_meta.json @@ -1,4 +1,3 @@ { "medical-app": "Medical App Docs " - } diff --git a/pages/youtube/medical-app.mdx b/pages/youtube/medical-app.mdx deleted file mode 100644 index e54966d2..00000000 --- a/pages/youtube/medical-app.mdx +++ /dev/null @@ -1,141 +0,0 @@ -## Adding Multi-step Carousel - -Both the Telehealth and Inperson Visit Uses Carousel. -We will use mult- - -## Single Category List Component - -```js copy -import Link from "next/link"; -import React from "react"; -import CategoryCarousel from "./CategoryCarousel"; - -export default function CategoryList({ category }) { - return ( -
-
-

{category.title}

- - See All - -
-
- -
-
- ); -} -``` - -### Here is the Category Carousel - -It Uses React Multi-Carousel - -```js copy -"use client"; -import { BaggageClaim } from "lucide-react"; -import Image from "next/image"; -import Link from "next/link"; -import React from "react"; -import Carousel from "react-multi-carousel"; -import "react-multi-carousel/lib/styles.css"; -import Product from "./Product"; -export default function CategoryCarousel({ products }) { - const responsive = { - desktop: { - breakpoint: { max: 3000, min: 1024 }, - items: 4, - slidesToSlide: 3, // optional, default to 1. - }, - tablet: { - breakpoint: { max: 1024, min: 464 }, - items: 3, - slidesToSlide: 2, // optional, default to 1. - }, - mobile: { - breakpoint: { max: 464, min: 0 }, - items: 2, - slidesToSlide: 1, // optional, default to 1. - }, - }; - return ( - - {products.map((product, i) => { - return ; - })} - - ); -} -``` - -## Here is the Product Component - -```js copy -"use client"; -import { addToCart } from "@/redux/slices/cartSlice"; -import { BaggageClaim } from "lucide-react"; -import Image from "next/image"; -import Link from "next/link"; -import React from "react"; -import toast from "react-hot-toast"; -import { useDispatch } from "react-redux"; - -export default function Product({ product }) { - const dispatch = useDispatch(); - function handleAddToCart() { - // Dispatch the reducer - dispatch(addToCart(product)); - toast.success("Item added Successfully"); - } - return ( -
- - {product.title} - -
- -

- {product.title} -

- -
-

UGX {product.salePrice}

- -
-
-
- ); -} -``` diff --git a/pages/youtube/medical-app/_meta.json b/pages/youtube/medical-app/_meta.json new file mode 100644 index 00000000..65564f62 --- /dev/null +++ b/pages/youtube/medical-app/_meta.json @@ -0,0 +1,3 @@ +{ + "intro": "Building Medical App " +} diff --git a/pages/youtube/medical-app/intro.mdx b/pages/youtube/medical-app/intro.mdx new file mode 100644 index 00000000..9af9ffee --- /dev/null +++ b/pages/youtube/medical-app/intro.mdx @@ -0,0 +1,343 @@ +## Adding Multi-step Carousel + +Both the Telehealth and Inperson Visit Uses Carousel. +We will use mult- + +## Single Category List Component + +```js copy +import Link from "next/link"; +import React from "react"; +import CategoryCarousel from "./CategoryCarousel"; + +export default function CategoryList({ category }) { + return ( +
+
+

{category.title}

+ + See All + +
+
+ +
+
+ ); +} +``` + +### Here is the Category Carousel + +It Uses React Multi-Carousel + +```js copy +"use client"; +import { BaggageClaim } from "lucide-react"; +import Image from "next/image"; +import Link from "next/link"; +import React from "react"; +import Carousel from "react-multi-carousel"; +import "react-multi-carousel/lib/styles.css"; +import Product from "./Product"; +export default function CategoryCarousel({ products }) { + const responsive = { + desktop: { + breakpoint: { max: 3000, min: 1024 }, + items: 4, + slidesToSlide: 3, // optional, default to 1. + }, + tablet: { + breakpoint: { max: 1024, min: 464 }, + items: 3, + slidesToSlide: 2, // optional, default to 1. + }, + mobile: { + breakpoint: { max: 464, min: 0 }, + items: 2, + slidesToSlide: 1, // optional, default to 1. + }, + }; + return ( + + {products.map((product, i) => { + return ; + })} + + ); +} +``` + +## Here is the Product Component + +```js copy +"use client"; +import { addToCart } from "@/redux/slices/cartSlice"; +import { BaggageClaim } from "lucide-react"; +import Image from "next/image"; +import Link from "next/link"; +import React from "react"; +import toast from "react-hot-toast"; +import { useDispatch } from "react-redux"; + +export default function Product({ product }) { + const dispatch = useDispatch(); + function handleAddToCart() { + // Dispatch the reducer + dispatch(addToCart(product)); + toast.success("Item added Successfully"); + } + return ( +
+ + {product.title} + +
+ +

+ {product.title} +

+ +
+

UGX {product.salePrice}

+ +
+
+
+ ); +} +``` + +## Dashboard Navbar (You need to Install flowbite react) + +```ts copy +"use client"; + +import React from "react"; +import Image from "next/image"; +import { Avatar, Dropdown } from "flowbite-react"; +import { User } from "next-auth"; +import { signOut } from "next-auth/react"; +import { useRouter } from "next/navigation"; +import { AlignJustify, Bell, Mail, Search } from "lucide-react"; + +export default function Navbar({ user }: { user: User }) { + const router = useRouter(); + async function handleLogout() { + await signOut(); + router.push("/"); + } + return ( +
+
+
+
+ +
+ +
+
+ + +
+
+ +
+ +
+
+ +
+ + +
+
+ +
+
+ + + {" "} + 2{" "} + +
+ +
+ +
+ + + } + > + + {user?.name} + + {user.email} + + + Dashboard + Settings + Earnings + + Sign out + +
+
+
+
+ ); +} +``` + +## Sidebar Component + +```ts copy +import { BarChart, Folder, Grid2X2, Home, Settings } from "lucide-react"; +import Link from "next/link"; +import React from "react"; +import { Button } from "@/components/ui/button"; +import LogoutButton from "./LogoutButton"; +import { getCategories } from "@/actions/categories"; + +export default async function Sidebar() { + const categories = (await getCategories()) || []; + return ( +
+
+
+
+
+ +
+
+

+ Analytics +

+ +
+
+ +
+ +
+
+
+
+ ); +} +``` From c69d376c203d70535b9069c023e533cfc9467a7e Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Tue, 12 Mar 2024 05:05:26 +0300 Subject: [PATCH 013/101] changed order n medical --- pages/youtube/_meta.json | 1 + pages/youtube/index.mdx | 8 + pages/youtube/medical-app/_meta.json | 1 + pages/youtube/medical-app/index.mdx | 343 +++++++++++++++++++++++++++ pages/youtube/medical-app/intro.mdx | 343 --------------------------- 5 files changed, 353 insertions(+), 343 deletions(-) create mode 100644 pages/youtube/index.mdx create mode 100644 pages/youtube/medical-app/index.mdx diff --git a/pages/youtube/_meta.json b/pages/youtube/_meta.json index 99ae2da5..18015fc8 100644 --- a/pages/youtube/_meta.json +++ b/pages/youtube/_meta.json @@ -1,3 +1,4 @@ { + "index": "Introduction", "medical-app": "Medical App Docs " } diff --git a/pages/youtube/index.mdx b/pages/youtube/index.mdx new file mode 100644 index 00000000..2b852b68 --- /dev/null +++ b/pages/youtube/index.mdx @@ -0,0 +1,8 @@ +{/* https://nextra.site/docs/guide/built-ins/cards#usage */} +import { Cards, Card } from "nextra/components"; +import { GitPullRequest, Milestone } from "lucide-react"; + + + } title="Youtube" href="/roadmaps/role-based" /> + } title="Medical App" href="/roadmaps/skill-based" /> + diff --git a/pages/youtube/medical-app/_meta.json b/pages/youtube/medical-app/_meta.json index 65564f62..e64c62d0 100644 --- a/pages/youtube/medical-app/_meta.json +++ b/pages/youtube/medical-app/_meta.json @@ -1,3 +1,4 @@ { + "index": "Introduction", "intro": "Building Medical App " } diff --git a/pages/youtube/medical-app/index.mdx b/pages/youtube/medical-app/index.mdx new file mode 100644 index 00000000..9af9ffee --- /dev/null +++ b/pages/youtube/medical-app/index.mdx @@ -0,0 +1,343 @@ +## Adding Multi-step Carousel + +Both the Telehealth and Inperson Visit Uses Carousel. +We will use mult- + +## Single Category List Component + +```js copy +import Link from "next/link"; +import React from "react"; +import CategoryCarousel from "./CategoryCarousel"; + +export default function CategoryList({ category }) { + return ( +
+
+

{category.title}

+ + See All + +
+
+ +
+
+ ); +} +``` + +### Here is the Category Carousel + +It Uses React Multi-Carousel + +```js copy +"use client"; +import { BaggageClaim } from "lucide-react"; +import Image from "next/image"; +import Link from "next/link"; +import React from "react"; +import Carousel from "react-multi-carousel"; +import "react-multi-carousel/lib/styles.css"; +import Product from "./Product"; +export default function CategoryCarousel({ products }) { + const responsive = { + desktop: { + breakpoint: { max: 3000, min: 1024 }, + items: 4, + slidesToSlide: 3, // optional, default to 1. + }, + tablet: { + breakpoint: { max: 1024, min: 464 }, + items: 3, + slidesToSlide: 2, // optional, default to 1. + }, + mobile: { + breakpoint: { max: 464, min: 0 }, + items: 2, + slidesToSlide: 1, // optional, default to 1. + }, + }; + return ( + + {products.map((product, i) => { + return ; + })} + + ); +} +``` + +## Here is the Product Component + +```js copy +"use client"; +import { addToCart } from "@/redux/slices/cartSlice"; +import { BaggageClaim } from "lucide-react"; +import Image from "next/image"; +import Link from "next/link"; +import React from "react"; +import toast from "react-hot-toast"; +import { useDispatch } from "react-redux"; + +export default function Product({ product }) { + const dispatch = useDispatch(); + function handleAddToCart() { + // Dispatch the reducer + dispatch(addToCart(product)); + toast.success("Item added Successfully"); + } + return ( +
+ + {product.title} + +
+ +

+ {product.title} +

+ +
+

UGX {product.salePrice}

+ +
+
+
+ ); +} +``` + +## Dashboard Navbar (You need to Install flowbite react) + +```ts copy +"use client"; + +import React from "react"; +import Image from "next/image"; +import { Avatar, Dropdown } from "flowbite-react"; +import { User } from "next-auth"; +import { signOut } from "next-auth/react"; +import { useRouter } from "next/navigation"; +import { AlignJustify, Bell, Mail, Search } from "lucide-react"; + +export default function Navbar({ user }: { user: User }) { + const router = useRouter(); + async function handleLogout() { + await signOut(); + router.push("/"); + } + return ( +
+
+
+
+ +
+ +
+
+ + +
+
+ +
+ +
+
+ +
+ + +
+
+ +
+
+ + + {" "} + 2{" "} + +
+ +
+ +
+ + + } + > + + {user?.name} + + {user.email} + + + Dashboard + Settings + Earnings + + Sign out + +
+
+
+
+ ); +} +``` + +## Sidebar Component + +```ts copy +import { BarChart, Folder, Grid2X2, Home, Settings } from "lucide-react"; +import Link from "next/link"; +import React from "react"; +import { Button } from "@/components/ui/button"; +import LogoutButton from "./LogoutButton"; +import { getCategories } from "@/actions/categories"; + +export default async function Sidebar() { + const categories = (await getCategories()) || []; + return ( +
+
+
+
+
+ +
+
+

+ Analytics +

+ +
+
+ +
+ +
+
+
+
+ ); +} +``` diff --git a/pages/youtube/medical-app/intro.mdx b/pages/youtube/medical-app/intro.mdx index 9af9ffee..e69de29b 100644 --- a/pages/youtube/medical-app/intro.mdx +++ b/pages/youtube/medical-app/intro.mdx @@ -1,343 +0,0 @@ -## Adding Multi-step Carousel - -Both the Telehealth and Inperson Visit Uses Carousel. -We will use mult- - -## Single Category List Component - -```js copy -import Link from "next/link"; -import React from "react"; -import CategoryCarousel from "./CategoryCarousel"; - -export default function CategoryList({ category }) { - return ( -
-
-

{category.title}

- - See All - -
-
- -
-
- ); -} -``` - -### Here is the Category Carousel - -It Uses React Multi-Carousel - -```js copy -"use client"; -import { BaggageClaim } from "lucide-react"; -import Image from "next/image"; -import Link from "next/link"; -import React from "react"; -import Carousel from "react-multi-carousel"; -import "react-multi-carousel/lib/styles.css"; -import Product from "./Product"; -export default function CategoryCarousel({ products }) { - const responsive = { - desktop: { - breakpoint: { max: 3000, min: 1024 }, - items: 4, - slidesToSlide: 3, // optional, default to 1. - }, - tablet: { - breakpoint: { max: 1024, min: 464 }, - items: 3, - slidesToSlide: 2, // optional, default to 1. - }, - mobile: { - breakpoint: { max: 464, min: 0 }, - items: 2, - slidesToSlide: 1, // optional, default to 1. - }, - }; - return ( - - {products.map((product, i) => { - return ; - })} - - ); -} -``` - -## Here is the Product Component - -```js copy -"use client"; -import { addToCart } from "@/redux/slices/cartSlice"; -import { BaggageClaim } from "lucide-react"; -import Image from "next/image"; -import Link from "next/link"; -import React from "react"; -import toast from "react-hot-toast"; -import { useDispatch } from "react-redux"; - -export default function Product({ product }) { - const dispatch = useDispatch(); - function handleAddToCart() { - // Dispatch the reducer - dispatch(addToCart(product)); - toast.success("Item added Successfully"); - } - return ( -
- - {product.title} - -
- -

- {product.title} -

- -
-

UGX {product.salePrice}

- -
-
-
- ); -} -``` - -## Dashboard Navbar (You need to Install flowbite react) - -```ts copy -"use client"; - -import React from "react"; -import Image from "next/image"; -import { Avatar, Dropdown } from "flowbite-react"; -import { User } from "next-auth"; -import { signOut } from "next-auth/react"; -import { useRouter } from "next/navigation"; -import { AlignJustify, Bell, Mail, Search } from "lucide-react"; - -export default function Navbar({ user }: { user: User }) { - const router = useRouter(); - async function handleLogout() { - await signOut(); - router.push("/"); - } - return ( -
-
-
-
- -
- -
-
- - -
-
- -
- -
-
- -
- - -
-
- -
-
- - - {" "} - 2{" "} - -
- -
- -
- - - } - > - - {user?.name} - - {user.email} - - - Dashboard - Settings - Earnings - - Sign out - -
-
-
-
- ); -} -``` - -## Sidebar Component - -```ts copy -import { BarChart, Folder, Grid2X2, Home, Settings } from "lucide-react"; -import Link from "next/link"; -import React from "react"; -import { Button } from "@/components/ui/button"; -import LogoutButton from "./LogoutButton"; -import { getCategories } from "@/actions/categories"; - -export default async function Sidebar() { - const categories = (await getCategories()) || []; - return ( -
-
-
-
-
- -
-
-

- Analytics -

- -
-
- -
- -
-
-
-
- ); -} -``` From dc86fa96ad4362d7e3e097fb3aa406a182042926 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Tue, 12 Mar 2024 05:14:14 +0300 Subject: [PATCH 014/101] added content in next folder --- .../nextjs/next-projects.mdx | 343 ++++++++++++++++++ 1 file changed, 343 insertions(+) diff --git a/pages/programming-tutorials/nextjs/next-projects.mdx b/pages/programming-tutorials/nextjs/next-projects.mdx index e69de29b..9af9ffee 100644 --- a/pages/programming-tutorials/nextjs/next-projects.mdx +++ b/pages/programming-tutorials/nextjs/next-projects.mdx @@ -0,0 +1,343 @@ +## Adding Multi-step Carousel + +Both the Telehealth and Inperson Visit Uses Carousel. +We will use mult- + +## Single Category List Component + +```js copy +import Link from "next/link"; +import React from "react"; +import CategoryCarousel from "./CategoryCarousel"; + +export default function CategoryList({ category }) { + return ( +
+
+

{category.title}

+ + See All + +
+
+ +
+
+ ); +} +``` + +### Here is the Category Carousel + +It Uses React Multi-Carousel + +```js copy +"use client"; +import { BaggageClaim } from "lucide-react"; +import Image from "next/image"; +import Link from "next/link"; +import React from "react"; +import Carousel from "react-multi-carousel"; +import "react-multi-carousel/lib/styles.css"; +import Product from "./Product"; +export default function CategoryCarousel({ products }) { + const responsive = { + desktop: { + breakpoint: { max: 3000, min: 1024 }, + items: 4, + slidesToSlide: 3, // optional, default to 1. + }, + tablet: { + breakpoint: { max: 1024, min: 464 }, + items: 3, + slidesToSlide: 2, // optional, default to 1. + }, + mobile: { + breakpoint: { max: 464, min: 0 }, + items: 2, + slidesToSlide: 1, // optional, default to 1. + }, + }; + return ( + + {products.map((product, i) => { + return ; + })} + + ); +} +``` + +## Here is the Product Component + +```js copy +"use client"; +import { addToCart } from "@/redux/slices/cartSlice"; +import { BaggageClaim } from "lucide-react"; +import Image from "next/image"; +import Link from "next/link"; +import React from "react"; +import toast from "react-hot-toast"; +import { useDispatch } from "react-redux"; + +export default function Product({ product }) { + const dispatch = useDispatch(); + function handleAddToCart() { + // Dispatch the reducer + dispatch(addToCart(product)); + toast.success("Item added Successfully"); + } + return ( +
+ + {product.title} + +
+ +

+ {product.title} +

+ +
+

UGX {product.salePrice}

+ +
+
+
+ ); +} +``` + +## Dashboard Navbar (You need to Install flowbite react) + +```ts copy +"use client"; + +import React from "react"; +import Image from "next/image"; +import { Avatar, Dropdown } from "flowbite-react"; +import { User } from "next-auth"; +import { signOut } from "next-auth/react"; +import { useRouter } from "next/navigation"; +import { AlignJustify, Bell, Mail, Search } from "lucide-react"; + +export default function Navbar({ user }: { user: User }) { + const router = useRouter(); + async function handleLogout() { + await signOut(); + router.push("/"); + } + return ( +
+
+
+
+ +
+ +
+
+ + +
+
+ +
+ +
+
+ +
+ + +
+
+ +
+
+ + + {" "} + 2{" "} + +
+ +
+ +
+ + + } + > + + {user?.name} + + {user.email} + + + Dashboard + Settings + Earnings + + Sign out + +
+
+
+
+ ); +} +``` + +## Sidebar Component + +```ts copy +import { BarChart, Folder, Grid2X2, Home, Settings } from "lucide-react"; +import Link from "next/link"; +import React from "react"; +import { Button } from "@/components/ui/button"; +import LogoutButton from "./LogoutButton"; +import { getCategories } from "@/actions/categories"; + +export default async function Sidebar() { + const categories = (await getCategories()) || []; + return ( +
+
+
+
+
+ +
+
+

+ Analytics +

+ +
+
+ +
+ +
+
+
+
+ ); +} +``` From 97f30b798571ff7109f961542ea837e8fb357790 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Tue, 19 Mar 2024 07:18:24 +0300 Subject: [PATCH 015/101] added auth --- pages/course-guides/_meta.json | 4 + pages/course-guides/portifolio/_meta.json | 30 + pages/course-guides/portifolio/darkmode.mdx | 165 ++++ pages/course-guides/portifolio/index.mdx | 3 + pages/course-guides/portifolio/layout.mdx | 41 + .../portifolio/project-setup.mdx | 142 +++ .../nextjs/next-auth.mdx | 903 ++++++++++++++++++ 7 files changed, 1288 insertions(+) create mode 100644 pages/course-guides/_meta.json create mode 100644 pages/course-guides/portifolio/_meta.json create mode 100644 pages/course-guides/portifolio/darkmode.mdx create mode 100644 pages/course-guides/portifolio/index.mdx create mode 100644 pages/course-guides/portifolio/layout.mdx create mode 100644 pages/course-guides/portifolio/project-setup.mdx diff --git a/pages/course-guides/_meta.json b/pages/course-guides/_meta.json new file mode 100644 index 00000000..e7af39d0 --- /dev/null +++ b/pages/course-guides/_meta.json @@ -0,0 +1,4 @@ +{ + "portifolio": "Fullstack Portfolio", + "lms": "LMS" +} diff --git a/pages/course-guides/portifolio/_meta.json b/pages/course-guides/portifolio/_meta.json new file mode 100644 index 00000000..1d09aab8 --- /dev/null +++ b/pages/course-guides/portifolio/_meta.json @@ -0,0 +1,30 @@ +{ + "index": { + "title": "Introduction", + "theme": { + "layout": "full", + "breadcrumb": false, + "footer": true, + "sidebar": true, + "toc": true, + "pagination": false + } + }, + "project-setup": "Project Setup", + "darkmode": "Dark Mode setup", + "layout": "Multiple Layouts", + "website": "Website Templates Guides", + "course-guides": "Course Guides", + "courses": "Desishub Courses", + "how-to": "How to Guides", + "about": { + "title": "About", + "type": "page" + }, + "contact": { + "title": "Contact ↗", + "type": "page", + "href": "https://twitter.com/shuding_", + "newWindow": true + } +} diff --git a/pages/course-guides/portifolio/darkmode.mdx b/pages/course-guides/portifolio/darkmode.mdx new file mode 100644 index 00000000..528580f9 --- /dev/null +++ b/pages/course-guides/portifolio/darkmode.mdx @@ -0,0 +1,165 @@ +import { Steps } from "nextra/components"; + +## Adding Dark Mode and Shadcn to your Next JS application + +Install and configure Shadcn. + + +### Step 1 : Install Shadcn + +```js filename=">_ Terminal" copy +npx shadcn-ui@latest init +```` + +### Step 2: Configure components.json + +```js filename=">_ Terminal" lineNumbers copy +Would you like to use TypeScript (recommended)? no / yes +Which style would you like to use? › Default +Which color would you like to use as base color? › Slate +Where is your global CSS file? › › app/globals.css +Do you want to use CSS variables for colors? › no / yes +Are you using a custom tailwind prefix eg. tw-? (Leave blank if not) ... +Where is your tailwind.config.js located? › tailwind.config.js +Configure the import alias for components: › @/components +Configure the import alias for utils: › @/lib/utils +Are you using React Server Components? › no / yes + +``` + +### Step 3 : Its Now Installed, You can start adding any components + +``` +npx shadcn-ui@latest add button +``` + + + +## Dark mode + + + ### Install next-themes + + ```ts copy + npm install next-themes + ```` + ### Step 2 : Create a theme provider + +```ts filename="components/theme-provider.tsx" copy +"use client"; +import * as React from "react"; +import { ThemeProvider as NextThemesProvider } from "next-themes"; +import { type ThemeProviderProps } from "next-themes/dist/types"; + +export function ThemeProvider({ children, ...props }: ThemeProviderProps) { + return {children}; +} +``` + +### Wrap your root layout + +Add the ThemeProvider to your root layout. + +```ts copy +import { ThemeProvider } from "@/components/theme-provider"; + +export default function RootLayout({ children }: RootLayoutProps) { + return ( + <> + + + + + {children} + + + + + ); +} +``` + +### Install Dark Mode Toggle Button Dependencies + +```ts copy + npx shadcn-ui@latest add button dropdown-menu + npm i @radix-ui/react-icons + +``` + +### Create a mode toggle Button + +In the Components folder create: `ModeToggle.tsx` file and the following code + +```ts copy +"use client"; + +import * as React from "react"; +import { Moon, Sun } from "lucide-react"; +import { useTheme } from "next-themes"; + +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; + +export function ModeToggle() { + const { setTheme } = useTheme(); + + return ( + + + + + + setTheme("light")}> + Light + + setTheme("dark")}> + Dark + + setTheme("system")}> + System + + + + ); +} +``` + +### Use the Toggle Button in your App + +In Your `page.tsx` add the following code + +```ts copy +import { ModeToggle } from "@components/ModeToggle"; + +; +``` + + + +import { Callout } from 'nextra/components' + + + Push your Code to Github + + - Every After you make Some Changes to your code Go ahead and push your code to github using the following + +```ts filename=">_ Terminal" +git add . +git commit -m "featv- added darkmode " +git push +``` diff --git a/pages/course-guides/portifolio/index.mdx b/pages/course-guides/portifolio/index.mdx new file mode 100644 index 00000000..bd146a4e --- /dev/null +++ b/pages/course-guides/portifolio/index.mdx @@ -0,0 +1,3 @@ +import Hero from "../../../components/Hero"; + + diff --git a/pages/course-guides/portifolio/layout.mdx b/pages/course-guides/portifolio/layout.mdx new file mode 100644 index 00000000..cc9ca0ea --- /dev/null +++ b/pages/course-guides/portifolio/layout.mdx @@ -0,0 +1,41 @@ +import { FileTree } from "nextra/components"; + +# Adding Multiple Layouts for Front and Dasboard Pages + +When building projects with Next.js, we typically create an entire user interface by assembling isolated components. However, some parts of the interface require the same code snippets across multiple routes — for example, the navigation header, footer, and sidebar. + +To manage this, we use layouts to structure the interface in a way that contains shared code snippets. In this lesson, we’ll delve into managing layouts and nested layouts in Next.js using the App Router. + +Therefore the Layout helps to give a group of pages the same template which gives them a simillar look. + +Forxample in this app, we have the Portifolio front Pages which will be public to all visitors and there is also the dashboard pages which have a different look from the front pages. + +so we divide our pages into two groups: the front group => (front) and the admin group => (admin) + +so this means we will have 3 layouts + +- the main Layout (`layout.tsx `) sitted in the `app` directory directly (This layout controls the entire website) +- the admin Layout (`layout.tsx `) sitted in the `app/(admin)` directory (This layout controls the admin pages) +- the front Layout (`layout.tsx `) seated in the `app/(front)` directory (This layout controls the front pages of the site) + +so for Each Group will have its own layout, + +and here is the folder structure: + + + + + + + + + + + + + + + + + + diff --git a/pages/course-guides/portifolio/project-setup.mdx b/pages/course-guides/portifolio/project-setup.mdx new file mode 100644 index 00000000..e92a22bf --- /dev/null +++ b/pages/course-guides/portifolio/project-setup.mdx @@ -0,0 +1,142 @@ +import { Tabs } from "nextra/components"; + +# Project Set Up + +## System Requirements + + + + #### Download and Install Node Js + - Get the Latest Node Js for your operating + system on this Link [here](https://nodejs.org/en) + #### Check if you have Node Js and Npm +```js filename=">_ Terminal" copy + node -v + npm -v +``` + + +#### Download and Install Git + - Get the Latest git for your operating + system on this Link [here](https://git-scm.com/downloads) + #### Check if you have Git + +```js filename=">_ Terminal" copy +git - v; +``` + +#### Set your Email and Username Globall + +```js filename=">_ Terminal" copy +git config --global user.email "youreamil@address.com"; +git config --global user.name "yourusername"; +``` + + + + + +## Create a new Next JS Project + +I recommend starting a new Next.js app using `create-next-app`, which sets up everything automatically for you. To create a project, run: + +```js filename=">_ Terminal" copy + npx create-next-app@latest +``` + +On installation, you'll see the following prompts: + +```js filename=">_ Terminal" lineNumbers + What is your project named? my-app + Would you like to use TypeScript? No / Yes + Would you like to use ESLint? No / Yes + Would you like to use Tailwind CSS? No / Yes + Would you like to use `src/` directory? No / Yes + Would you like to use App Router? (recommended) No / Yes +``` + +## Host your Project + +I recommend that we host our project immediately before addding alot of components, depencies and complex concepts. Follow the following steps + +Midify Git Ignore: + +- To your .gitignore file in you root of your project +- Inside this file, add .env file to avoid leaking your secret credentials + +Initialize Git Repository: + +```js filename=">_ Terminal" copy + git init +``` + +Add Files to Staging Area: + +```js filename=">_ Terminal" copy + git add . +``` + +Commit Changes: + +```js filename=">_ Terminal" copy + git commit -m "initial commit" +``` + +Migrate to the main branch: + +```js filename=">_ Terminal" copy + git branch -M main +``` + +Create a New GitHub Repository: + +--Go to GitHub and log in to your account. Then, create a new repository by clicking on the "+" icon in the top right corner and selecting "New repository". Follow the prompts to create your repository. + +Add Remote Repository URL: +Once you've created the repository on GitHub, copy the repository URL provided. + +Link Local Repository to GitHub Repository: +Back in your terminal or command prompt, use the following command to link your local repository to the GitHub repository. Replace repository_url with the URL you copied in the previous step. + +```js filename=">_ Terminal" copy + git remote add origin repository_url +``` + +Push Changes to GitHub: +Finally, push your local repository's commits to the GitHub repository using the following command: + +```js filename=">_ Terminal" copy + git push -u origin main +``` + +## Common Git errors + +Fatal: Not a Git Repository (or any of the parent directories): + +```js filename=">_ Terminal" copy + git init +``` + +Author Identity Unknown, Please Tell Me Who You Are: + +```js filename=">_ Terminal" copy +git config --global user.name "Your Name" +git config --global user.email "your_email@example.com" + +``` + +Fatal: Remote Origin Already Exists: + +```js filename=">_ Terminal" copy +git remote rm origin +git remote add origin + +or Change the existing url +git remote set-url origin + +``` + +Host your Project on Vercel + +- Login tour vercel account, then add new Project from Github and then deploy +- High Chanches are, that it will deploy successfully diff --git a/pages/programming-tutorials/nextjs/next-auth.mdx b/pages/programming-tutorials/nextjs/next-auth.mdx index e69de29b..aa4453e9 100644 --- a/pages/programming-tutorials/nextjs/next-auth.mdx +++ b/pages/programming-tutorials/nextjs/next-auth.mdx @@ -0,0 +1,903 @@ +# Aunthentication with Next Auth and Prisma + +Lets start with Prisma + +## Install prisma and prisma client + +```ts filename=">_ Terminal" copy +npm install prisma @prisma/client +``` + +## Generate a prisma schema + +```ts filename=">_ Terminal" copy +npx prisma init --datasource-provider mongodb +``` + +After the Installation, + +## Add your Mongodb Database URL + +```ts copy +DATABASE_URL = + "mongodb+srv://test:test@cluster0.ns1yp.mongodb.net/myFirstDatabase"; +``` + +## Create a prisma Schema + +```ts copy + +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? +// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "mongodb" + url = env("DATABASE_URL") +} + +model Account { + id String @id @default(auto()) @map("_id") @db.ObjectId + userId String @db.ObjectId + type String + provider String + providerAccountId String + refresh_token String? @db.String + access_token String? @db.String + expires_at Int? + token_type String? + scope String? + id_token String? @db.String + session_state String? + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@unique([provider, providerAccountId]) +} + +model Session { + id String @id @default(auto()) @map("_id") @db.ObjectId + sessionToken String @unique + userId String @db.ObjectId + expires DateTime + user User @relation(fields: [userId], references: [id], onDelete: Cascade) +} + +enum UserRole { + USER + ADMIN + SERVICE_PROVIDER +} + +model User { + id String @id @default(auto()) @map("_id") @db.ObjectId + name String? + email String? @unique + emailVerified DateTime? + image String? + role UserRole @default(USER) + password String + accounts Account[] + sessions Session[] + isVerfied Boolean @default(false) + token Int + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + + + +model Category { + id String @id @default(auto()) @map("_id") @db.ObjectId + title String + slug String @unique + imageUrl String? + demoLink String? + description String? + products Product[] + + createdAt DateTime @default(now()) + updatedAt DateTime? @updatedAt +} + +model Product { + id String @id @default(auto()) @map("_id") @db.ObjectId + title String + slug String @unique + price Float? + qty Int? + imageUrl String? + productImages String[] + features String[] + description String? + categoryId String @db.ObjectId + category Category @relation(fields: [categoryId], references: [id], onDelete: Cascade, onUpdate: Cascade) + + createdAt DateTime @default(now()) + updatedAt DateTime? @updatedAt +} + +``` + +## Create a prisma Client Global Instance + +```ts copy +import { PrismaClient } from "@prisma/client"; + +declare global { + var prisma: PrismaClient | undefined; +} + +export const prismaClient = globalThis.prisma || new PrismaClient(); +if (process.env.NODE_ENV !== "production") globalThis.prisma = prismaClient; +``` + +## Registration of Users + +### Install Dependencies necessary for Registation + +```ts copy +npm install resend react-email @react-email/components -E +npm i bcrypt @types/bcrypt + +``` + +We will Use Credentials for Authentication + +here is the Registration Form + +### Registration Form + +```ts copy +"use client"; +import { Loader } from "lucide-react"; +import { signIn } from "next-auth/react"; +import Link from "next/link"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; +import { useForm } from "react-hook-form"; +import toast from "react-hot-toast"; +import { FaGithub, FaGoogle } from "react-icons/fa"; + +export default function RegisterForm() { + const router = useRouter(); + const { + register, + handleSubmit, + reset, + formState: { errors }, + } = useForm(); + const [loading, setLoading] = useState(false); + const [emailErr, setEmailErr] = useState(""); + async function onSubmit(data: any) { + try { + data.image = + "https://utfs.io/f/8b034fb4-1f45-425a-8c57-a7a68835311f-2558r.png"; + console.log(data); + setLoading(true); + const baseUrl = process.env.NEXT_PUBLIC_BASE_URL; + const response = await fetch(`${baseUrl}/api/users`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }); + + const responseData = await response.json(); + + if (response.ok) { + setLoading(false); + toast.success("User Created Successfully"); + reset(); + router.push(`/verify-account/${responseData.data.id}`); + console.log(responseData.data); + } else { + setLoading(false); + if (response.status === 409) { + setEmailErr("User with this Email already exists"); + toast.error("User with this Email already exists"); + } else { + // Handle other errors + console.error("Server Error:", responseData.message); + toast.error("Oops Something Went wrong"); + } + } + } catch (error) { + setLoading(false); + console.error("Network Error:", error); + toast.error("Something Went wrong, Please Try Again"); + } + } + + return ( +
+
+ + + {errors.name && ( + + This field is required + + )} +
+
+ + + {errors.email && ( + + This field is required + + )} + {emailErr} +
+
+ + + {errors.password && ( + + This field is required + + )} +
+ {loading ? ( + + ) : ( + + )} + +

+ Already have an account?{" "} + + Login + +

+
+ ); +} +``` + +### Registration API + +```ts copy +import { NextRequest, NextResponse } from "next/server"; +import bcrypt from "bcrypt"; +import { v4 as uuidv4 } from "uuid"; + +import { Resend } from "resend"; +import { prismaClient } from "@/prisma/db"; +import EmailTemplate from "@/components/Emails/EmailTemplate"; + +export async function POST(request: NextRequest) { + const resend = new Resend(process.env.RESEND_API_KEY); + try { + //extract the credentials + const { name, email, password, role = "USER" } = await request.json(); + //Check if the user Already exists in the db + const existingUser = await prismaClient.user.findUnique({ + where: { + email, + }, + }); + if (existingUser) { + return NextResponse.json( + { + data: null, + message: `User with this email ( ${email}) already exists in the Database`, + }, + { status: 409 } + ); + } + // Encrypt the Password =>bcrypt + const hashedPassword = await bcrypt.hash(password, 10); + //Generate Token + const generateToken = () => { + const min = 100000; // Minimum 6-figure number + const max = 999999; // Maximum 6-figure number + return Math.floor(Math.random() * (max - min + 1)) + min; + }; + const userToken = generateToken(); + const newUser = await prismaClient.user.create({ + data: { + name, + email, + password: hashedPassword, + role, + token: userToken, + }, + }); + + //Send an Email with the Token on the link as a search param + const token = newUser.token; + const userId = newUser.id; + const linkText = "Verify your Account "; + const message = + "Thank you for registering with Gecko. To complete your registration and verify your email address, please enter the following 6-digit verification code on our website :"; + const sendMail = await resend.emails.send({ + from: "Gecko ", + to: email, + subject: "Verify Your Email Address", + react: EmailTemplate({ name, token, linkText, message }), + }); + console.log(token); + console.log(sendMail); + console.log(newUser); + return NextResponse.json( + { + data: newUser, + message: "User Created Successfully", + }, + { status: 201 } + ); + } catch (error) { + console.log(error); + return NextResponse.json( + { + error, + message: "Server Error: Something went wrong", + }, + { status: 500 } + ); + } +} +``` + +### React Email Template + +```ts copy +import * as React from "react"; +import { + Body, + Button, + Container, + Head, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +interface EmailTemplateProps { + name?: string; + token: number; + linkText: string; + message: string; +} + +const baseUrl = process.env.NEXT_PUBLIC_BASE_URL; + +export const EmailTemplate = ({ + name = "", + token, + linkText, + message, +}: EmailTemplateProps) => ( + + + {linkText} + + + Claridy + + + @{name}, thank you for Joining Us + + +
+ + Hey {name}! + + {message} + + + + If you have any questions, feel free to reach out. + +
+ + Your security audit log ・{" "} + Contact support + + + + GitHub, Inc. ・88 Colin P Kelly Jr Street ・San Francisco, CA 94107 + +
+ + +); + +export default EmailTemplate; + +const main = { + backgroundColor: "#ffffff", + color: "#24292e", + fontFamily: + '-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"', +}; + +const container = { + width: "480px", + margin: "0 auto", + padding: "20px 0 48px", +}; + +const title = { + fontSize: "24px", + lineHeight: 1.25, +}; + +const section = { + padding: "24px", + border: "solid 1px #dedede", + borderRadius: "5px", + textAlign: "center" as const, +}; + +const text = { + margin: "0 0 10px 0", + textAlign: "left" as const, +}; + +const button = { + fontSize: "24px", + backgroundColor: "#28a745", + color: "#fff", + lineHeight: 1.5, + borderRadius: "0.5em", + padding: "0.75em 1.5em", +}; + +const links = { + textAlign: "center" as const, +}; + +const link = { + color: "#0366d6", + fontSize: "12px", +}; + +const footer = { + color: "#6a737d", + fontSize: "12px", + textAlign: "center" as const, + marginTop: "60px", +}; +``` + +## Next Auth and Login + +### Install Next Auth + +```ts copy +npm install next-auth@beta @auth/prisma-adapter + +``` + +### Create the catch-all route + +```ts copy +app / api / auth / [...nextauth] / route.ts; +``` + +and add this code + +```ts copy +import { authOptions } from "@/config/auth"; +import NextAuth from "next-auth"; + +const handler = NextAuth(authOptions); + +export { handler as GET, handler as POST }; +``` + +### Create the AuthOptions + +```ts copy +import { AuthOptions, NextAuthOptions } from "next-auth"; +// import { PrismaAdapter } from "@auth/prisma-adapter"; +import { PrismaAdapter } from "@auth/prisma-adapter"; +import { prismaClient } from "@/prisma/db"; + +import GoogleProvider from "next-auth/providers/google"; +import EmailProvider from "next-auth/providers/email"; +import type { Adapter } from "next-auth/adapters"; +import CredentialsProvider from "next-auth/providers/credentials"; +import { compare } from "bcrypt"; +// more providers at https://next-auth.js.org/providers +export const authOptions: NextAuthOptions = { + adapter: PrismaAdapter(prismaClient) as Adapter, + secret: process.env.NEXTAUTH_SECRET, + session: { + strategy: "jwt", + }, + pages: { + signIn: "/login", + }, + providers: [ + EmailProvider({ + server: process.env.GMAIL_EMAIL_SERVER || "", // any SMTP server will work + from: process.env.EMAIL_FROM || "", + // maxAge: 24 * 60 * 60, // How long email links are valid for (default 24h) + }), + GoogleProvider({ + //Checking if the role exista and if not add USER Bydefault + // profile(profile) { + // return { role: profile.role ?? "USER", ... } + // }, + clientId: process.env.GOOGLE_CLIENT_ID || "", + clientSecret: process.env.GOOGLE_CLIENT_SECRET || "", + }), + CredentialsProvider({ + name: "Credentials", + credentials: { + email: { label: "Email", type: "email", placeholder: "jb@gmail.com" }, + password: { label: "Password", type: "password" }, + }, + async authorize(credentials) { + try { + console.log( + "Authorize function called with credentials:", + credentials + ); + // Check if user credentials are Correct + if (!credentials?.email || !credentials?.password) { + throw { error: "No Inputs Found", status: 401 }; + } + console.log("Pass 1 checked "); + //Check if user exists + const existingUser = await prismaClient.user.findUnique({ + where: { email: credentials.email }, + }); + + if (!existingUser) { + console.log("No user found"); + throw { error: "No user found", status: 401 }; + } + + console.log("Pass 2 Checked"); + console.log(existingUser); + let passwordMatch: boolean = false; + //Check if Password is correct + if (existingUser && existingUser.password) { + // if user exists and password exists + passwordMatch = await compare( + credentials.password, + existingUser.password + ); + } + if (!passwordMatch) { + console.log("Password incorrect"); + throw { error: "Password Incorrect", status: 401 }; + } + console.log("Pass 3 Checked"); + const user = { + id: existingUser.id, + name: existingUser.name, + email: existingUser.email, + role: existingUser.role, + }; + // + console.log("User Compiled"); + console.log(user); + return user; + } catch (error) { + console.log("aLL Failed"); + console.log(error); + throw { error: "Something went wrong", status: 401 }; + } + }, + }), + ], + callbacks: { + async jwt({ token, user }) { + const dbUser = await prismaClient.user.findFirst({ + where: { email: token.email }, + }); + if (!dbUser) { + token.id = user!.id; + return token; + } + return { + id: dbUser.id, + name: dbUser.name, + email: dbUser.email, + role: dbUser.role, + picture: dbUser.image, + }; + }, + session({ session, token }) { + if (token && session.user) { + session.user.id = token.id; + session.user.name = token.name; + session.user.email = token.email; + session.user.image = token.picture; + session.user.role = token.role; + } + return session; + }, + }, +}; +``` + +### Create the Login Form + +```ts copy +"use client"; +import { signIn } from "next-auth/react"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; +import { useForm } from "react-hook-form"; +import toast from "react-hot-toast"; +import Link from "next/link"; +import { FaGoogle } from "react-icons/fa"; +import { FaGithub } from "react-icons/fa"; +import { useSearchParams } from "next/navigation"; +import { useEffect } from "react"; +import { Alert } from "flowbite-react"; +import { HiInformationCircle } from "react-icons/hi"; +export default function LoginForm() { + const router = useRouter(); + const [showNotification, setShowNotification] = useState(false); + const { + register, + handleSubmit, + reset, + formState: { errors }, + } = useForm(); + const [loading, setLoading] = useState(false); + async function onSubmit(data: any) { + console.log(data); + try { + setLoading(true); + console.log("Attempting to sign in with credentials:", data); + const loginData = await signIn("credentials", { + ...data, + redirect: false, + }); + console.log("SignIn response:", loginData); + if (loginData?.error) { + setLoading(false); + toast.error("Sign-in error: Check your credentials"); + setShowNotification(true); + } else { + // Sign-in was successful + setShowNotification(false); + reset(); + setLoading(false); + toast.success("Login Successful"); + router.push("/dashboard"); + } + } catch (error) { + setLoading(false); + console.error("Network Error:", error); + toast.error("Its seems something is wrong with your Network"); + } + } + + return ( +
+ {showNotification && ( + + Sign-in error! Please Check your + credentials + + )} +
+ + + {errors.email && ( + + This field is required + + )} +
+
+ + + {errors.password && ( + + This field is required + + )} +
+
+ {/* + Forgot Password + */} + {loading ? ( + + ) : ( + + )} +
+ {/*
+
+ or +
+
*/} + {/*
+ + +
*/} + +

+ Already have an account?{" "} + + Sign Up + +

+
+ ); +} +``` + +### Add Middleware to Protect the Dashboard Page + +```ts filename="middleware.ts" copy +import { withAuth } from "next-auth/middleware"; + +export default withAuth({ + // Matches the pages config in `[...nextauth]` + pages: { + signIn: "/login", + // error: '/error', + }, +}); +export const config = { + matcher: ["/dashboard/:path*"], +}; +``` + +### Your .env + +```ts copy + +DATABASE_URL="mongodb+srv://gmukejohnbaptist:SPxtXF6wTr7rwGfT@cluster0.rtxthsv.mongodb.net/smartBox?retryWrites=true&w=majority" + +# NextAuth Configuration +NEXTAUTH_URL="http://localhost:3000" +NEXTAUTH_SECRET="3cc9d3166430d0605de2ede088934d4e72085ed6" +NEXT_PUBLIC_BASE_URL="http://localhost:3000" +# ANALYZE=true +# RESEND_API_KEY="" +RESEND_API_KEY="" + +UPLOADTHING_SECRET= +UPLOADTHING_APP_ID= +``` From f9e7a154fcd297e83a087e14af949f08f5e9a773 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Wed, 20 Mar 2024 04:30:51 +0300 Subject: [PATCH 016/101] added the verify component --- .../nextjs/next-auth.mdx | 170 +++++++++++++++++- 1 file changed, 169 insertions(+), 1 deletion(-) diff --git a/pages/programming-tutorials/nextjs/next-auth.mdx b/pages/programming-tutorials/nextjs/next-auth.mdx index aa4453e9..64d2346c 100644 --- a/pages/programming-tutorials/nextjs/next-auth.mdx +++ b/pages/programming-tutorials/nextjs/next-auth.mdx @@ -528,6 +528,174 @@ const footer = { }; ``` +## Create Verify Account Dynamic Page + +Lets Create a page in front called `/verify-account/[id]/page.tsx` +and add the following Code + +```ts copy +import { getUserById } from "@/actions/users"; +import VerifyTokenForm from "@/components/VerifyTokenForm"; + +export default async function VerifyAccount({ + params: { id }, +}: { + params: { id: string }; +}) { + //Get a User + const user = await getUserById(id); + const userToken = user?.token; + return ( +
+
+
+
+

+ Verify Account +

+ +
+
+
+
+ ); +} +``` + +### Create Verify TokenForm Component + +The VerifyToken Component requires you to Install the following dependencies + +```ts filename=">_ Terminal" copy +npm i zod @hookform/resolvers react-icons +npx shadcn-ui@latest add form input-otp +``` + +### Create the Component + +Add the following Code + +```ts copy +"use client"; + +import { zodResolver } from "@hookform/resolvers/zod"; +import { z } from "zod"; +import { HiInformationCircle } from "react-icons/hi"; +import { Alert } from "flowbite-react"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; +import { useForm } from "react-hook-form"; +import toast from "react-hot-toast"; +import { Loader } from "lucide-react"; +import { updateUserById } from "@/actions/users"; +import { Button } from "@/components/ui/button"; +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { + InputOTP, + InputOTPGroup, + InputOTPSeparator, + InputOTPSlot, +} from "@/components/ui/input-otp"; + +const FormSchema = z.object({ + token: z.string().min(6, { + message: "Your one-time password must be 6 characters.", + }), +}); + +export default function VerifyTokenForm({ + userToken, + id, +}: { + userToken: any; + id: string; +}) { + const [loading, setLoading] = useState(false); + const [showNotification, setShowNotification] = useState(false); + const router = useRouter(); + const form = useForm>({ + resolver: zodResolver(FormSchema), + defaultValues: { + token: "", + }, + }); + + async function onSubmit(data: z.infer) { + setLoading(true); + const userInputToken = parseInt(data.token); + if (userInputToken === userToken) { + setShowNotification(false); + //Update User + try { + await updateUserById(id); + setLoading(false); + // reset(); + toast.success("Account Verified"); + router.push("/login"); + } catch (error) { + setLoading(false); + console.log(error); + } + } else { + setShowNotification(true); + setLoading(false); + } + console.log(data); + } + + return ( +
+ + {showNotification && ( + + Wrong Token! Please Check the + token and Enter again + + )} + ( + + Enter Token Here + + + + + + + + + + + + + + + + + Please enter the 6-figure pass code sent to your email. + + + + )} + /> + + + + + ); +} +``` + ## Next Auth and Login ### Install Next Auth @@ -888,7 +1056,7 @@ export const config = { ```ts copy -DATABASE_URL="mongodb+srv://gmukejohnbaptist:SPxtXF6wTr7rwGfT@cluster0.rtxthsv.mongodb.net/smartBox?retryWrites=true&w=majority" +DATABASE_URL="" # NextAuth Configuration NEXTAUTH_URL="http://localhost:3000" From 2c2b08805b2e46f9a5461f4a5308c11af15e487c Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Wed, 20 Mar 2024 05:54:33 +0300 Subject: [PATCH 017/101] added types --- .../nextjs/next-auth.mdx | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/pages/programming-tutorials/nextjs/next-auth.mdx b/pages/programming-tutorials/nextjs/next-auth.mdx index 64d2346c..b0021223 100644 --- a/pages/programming-tutorials/nextjs/next-auth.mdx +++ b/pages/programming-tutorials/nextjs/next-auth.mdx @@ -851,6 +851,35 @@ export const authOptions: NextAuthOptions = { }; ``` +### Update the Next AUTH Types for token and session + +```ts filename="next-auth.d.ts" copy +import NextAuth from "next-auth"; +import { UserRole } from "@prisma/client"; +import type { User } from "next-auth"; +import "next-auth/jwt"; +type UserId = string; + +declare module "next-auth/jwt" { + interface JWT { + id: UserId; + role: UserRole; + } +} + +declare module "next-auth" { + /** + * Returned by `useSession`, `getSession` and received as a prop on the `SessionProvider` React Context + */ + interface Session { + user: User & { + id: UserId; + role: UserRole; + }; + } +} +``` + ### Create the Login Form ```ts copy From 8fafcbede38a63f1d12f4cd002e07ade3a45b773 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Wed, 20 Mar 2024 15:34:05 +0300 Subject: [PATCH 018/101] updated auth --- notes.md | 2 + .../nextjs/next-auth.mdx | 510 +++++++----------- .../programming-tutorials/nextjs/next-seo.mdx | 156 ++++++ 3 files changed, 360 insertions(+), 308 deletions(-) diff --git a/notes.md b/notes.md index 6cace39b..4aadb8d6 100644 --- a/notes.md +++ b/notes.md @@ -35,3 +35,5 @@ pages/ |-- project-1.js (Individual Course Project Documentation Page) |-- project-2.js (Individual Course Project Documentation Page) |-- ... + +https://www.youtube.com/watch?v=wTGVHLyV09M diff --git a/pages/programming-tutorials/nextjs/next-auth.mdx b/pages/programming-tutorials/nextjs/next-auth.mdx index b0021223..3dd84e41 100644 --- a/pages/programming-tutorials/nextjs/next-auth.mdx +++ b/pages/programming-tutorials/nextjs/next-auth.mdx @@ -156,194 +156,138 @@ here is the Registration Form ```ts copy "use client"; -import { Loader } from "lucide-react"; -import { signIn } from "next-auth/react"; +import { type RegisterInputProps } from "@/types/types"; import Link from "next/link"; -import { useRouter } from "next/navigation"; -import { useState } from "react"; import { useForm } from "react-hook-form"; +import TextInput from "../FormInputs/TextInput"; +import SubmitButton from "../FormInputs/SubmitButton"; +import { useState } from "react"; +import { createUser } from "@/actions/users"; +import { UserRole } from "@prisma/client"; import toast from "react-hot-toast"; -import { FaGithub, FaGoogle } from "react-icons/fa"; -export default function RegisterForm() { - const router = useRouter(); +export default function RegisterForm({ role = "USER" }: { role?: UserRole }) { + const [isLoading, setIsLoading] = useState(false); const { register, handleSubmit, reset, formState: { errors }, - } = useForm(); - const [loading, setLoading] = useState(false); - const [emailErr, setEmailErr] = useState(""); - async function onSubmit(data: any) { - try { - data.image = - "https://utfs.io/f/8b034fb4-1f45-425a-8c57-a7a68835311f-2558r.png"; - console.log(data); - setLoading(true); - const baseUrl = process.env.NEXT_PUBLIC_BASE_URL; - const response = await fetch(`${baseUrl}/api/users`, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(data), - }); - - const responseData = await response.json(); + } = useForm(); + async function onSubmit(data: RegisterInputProps) { + // console.log(data); + setIsLoading(true); - if (response.ok) { - setLoading(false); - toast.success("User Created Successfully"); + data.role = role; + try { + const user = await createUser(data); + if (user && user.status === 200) { + console.log("User Created successfully"); reset(); - router.push(`/verify-account/${responseData.data.id}`); - console.log(responseData.data); + setIsLoading(false); + toast.success("User Created successfully"); + console.log(user.data); } else { - setLoading(false); - if (response.status === 409) { - setEmailErr("User with this Email already exists"); - toast.error("User with this Email already exists"); - } else { - // Handle other errors - console.error("Server Error:", responseData.message); - toast.error("Oops Something Went wrong"); - } + console.log(user.error); } } catch (error) { - setLoading(false); - console.error("Network Error:", error); - toast.error("Something Went wrong, Please Try Again"); + console.log(error); } } - return ( -
-
- {/*
-
- or -
-
*/} - {/*
- - -
*/} - -

- Already have an account?{" "} - - Sign Up - -

- +
- - +
+ Your Company - {errors.name && ( - - This field is required - - )} -
-
- - - {errors.email && ( - - This field is required - - )} - {emailErr} +

+ Create new account +

-
- - - {errors.password && ( - - This field is required - - )} + +
+ + + + + + + + +
+ +
+ + +

+ Already have Account?{" "} + + Login + +

- {loading ? ( - - ) : ( - - )} - -

- Already have an account?{" "} - - Login - -

- +
); } ``` -### Registration API +### Registration Server Actions ```ts copy -import { NextRequest, NextResponse } from "next/server"; -import bcrypt from "bcrypt"; -import { v4 as uuidv4 } from "uuid"; +"use server"; +import EmailTemplate from "@/components/Emails/email-template"; +import { prismaClient } from "@/lib/db"; +import { RegisterInputProps } from "@/types/types"; +import bcrypt from "bcrypt"; import { Resend } from "resend"; -import { prismaClient } from "@/prisma/db"; -import EmailTemplate from "@/components/Emails/EmailTemplate"; - -export async function POST(request: NextRequest) { +export async function createUser(formData: RegisterInputProps) { const resend = new Resend(process.env.RESEND_API_KEY); + const { fullName, email, role, phone, password } = formData; try { - //extract the credentials - const { name, email, password, role = "USER" } = await request.json(); - //Check if the user Already exists in the db const existingUser = await prismaClient.user.findUnique({ where: { email, }, }); if (existingUser) { - return NextResponse.json( - { - data: null, - message: `User with this email ( ${email}) already exists in the Database`, - }, - { status: 409 } - ); + return { + data: null, + error: `User with this email ( ${email}) already exists in the Database`, + status: 409, + }; } // Encrypt the Password =>bcrypt const hashedPassword = await bcrypt.hash(password, 10); @@ -356,45 +300,40 @@ export async function POST(request: NextRequest) { const userToken = generateToken(); const newUser = await prismaClient.user.create({ data: { - name, + name: fullName, email, + phone, password: hashedPassword, role, token: userToken, }, }); - //Send an Email with the Token on the link as a search param const token = newUser.token; const userId = newUser.id; + const firstName = newUser.name.split(" ")[0]; const linkText = "Verify your Account "; const message = "Thank you for registering with Gecko. To complete your registration and verify your email address, please enter the following 6-digit verification code on our website :"; const sendMail = await resend.emails.send({ - from: "Gecko ", + from: "Medical App ", to: email, subject: "Verify Your Email Address", - react: EmailTemplate({ name, token, linkText, message }), + react: EmailTemplate({ firstName, token, linkText, message }), }); console.log(token); console.log(sendMail); console.log(newUser); - return NextResponse.json( - { - data: newUser, - message: "User Created Successfully", - }, - { status: 201 } - ); + return { + data: newUser, + error: null, + status: 200, + }; } catch (error) { console.log(error); - return NextResponse.json( - { - error, - message: "Server Error: Something went wrong", - }, - { status: 500 } - ); + return { + error: "Something went wrong", + }; } } ``` @@ -701,7 +640,7 @@ export default function VerifyTokenForm({ ### Install Next Auth ```ts copy -npm install next-auth@beta @auth/prisma-adapter +npm install next-auth @auth/prisma-adapter ``` @@ -823,7 +762,7 @@ export const authOptions: NextAuthOptions = { callbacks: { async jwt({ token, user }) { const dbUser = await prismaClient.user.findFirst({ - where: { email: token.email }, + where: { email: token?.email ?? "" }, }); if (!dbUser) { token.id = user!.id; @@ -884,32 +823,30 @@ declare module "next-auth" { ```ts copy "use client"; -import { signIn } from "next-auth/react"; -import { useRouter } from "next/navigation"; +import Link from "next/link"; +import TextInput from "../FormInputs/TextInput"; import { useState } from "react"; import { useForm } from "react-hook-form"; +import { LoginInputProps } from "@/types/types"; +import SubmitButton from "../FormInputs/SubmitButton"; import toast from "react-hot-toast"; -import Link from "next/link"; -import { FaGoogle } from "react-icons/fa"; -import { FaGithub } from "react-icons/fa"; -import { useSearchParams } from "next/navigation"; -import { useEffect } from "react"; +import { useRouter } from "next/navigation"; +import { signIn } from "next-auth/react"; import { Alert } from "flowbite-react"; import { HiInformationCircle } from "react-icons/hi"; export default function LoginForm() { - const router = useRouter(); + const [isLoading, setIsLoading] = useState(false); const [showNotification, setShowNotification] = useState(false); + const router = useRouter(); const { register, handleSubmit, reset, formState: { errors }, - } = useForm(); - const [loading, setLoading] = useState(false); - async function onSubmit(data: any) { - console.log(data); + } = useForm(); + async function onSubmit(data: LoginInputProps) { try { - setLoading(true); + setIsLoading(true); console.log("Attempting to sign in with credentials:", data); const loginData = await signIn("credentials", { ...data, @@ -917,149 +854,106 @@ export default function LoginForm() { }); console.log("SignIn response:", loginData); if (loginData?.error) { - setLoading(false); + setIsLoading(false); toast.error("Sign-in error: Check your credentials"); setShowNotification(true); } else { // Sign-in was successful setShowNotification(false); reset(); - setLoading(false); + setIsLoading(false); toast.success("Login Successful"); router.push("/dashboard"); } } catch (error) { - setLoading(false); + setIsLoading(false); console.error("Network Error:", error); toast.error("Its seems something is wrong with your Network"); } } - return ( -
- {showNotification && ( - - Sign-in error! Please Check your - credentials - - )} - + +
+ +
+ + +

+ Don't have Account?{" "} + - Login - - )} + Register + +

); } ``` diff --git a/pages/programming-tutorials/nextjs/next-seo.mdx b/pages/programming-tutorials/nextjs/next-seo.mdx index e69de29b..2e598d98 100644 --- a/pages/programming-tutorials/nextjs/next-seo.mdx +++ b/pages/programming-tutorials/nextjs/next-seo.mdx @@ -0,0 +1,156 @@ +# SEO in Next JS 14 - The Ultimate Guide (MediaMetadata,Sitemap,Robots , Google search Console, Caching) + +Here is the List you should check + +## Add Favicon in the app directory + +- The favicon file conventions allow you to set icons for your application. +- Favicon is useful for adding app icons that appear in places like web browser tabs, phone home screens, and search engine results. +- Add a favicon.ico image file to the root `/app` route segment. + +You can Gnerate the favicon from your logo from online favicon generators. forexample this one [**Here →**](https://realfavicongenerator.net/) + +## Add the Open Graph Image (OG Image) and twitter-image in the app dir + +- They are useful for setting the images that appear on social networks and messaging apps when a user shares a link to your site. +- The recommended Image Size is `1200 x 630px ` +- Use an image file to set a route segment's shared image by placing an opengraph-image or twitter-image image file in the segment. +- You can set different images for different page groups but for simplicity add your images to `/app` directory to set them to be used throught out the entire site +- To create these images you can use [**canva.com**](https://canva.com/) or any other photo editing software +- Inother words create 4 files og imageConfigDefault, twitter image , og alt text and twitter image alt text and place them in the app directory + +** Open graph image** + +- Add an opengraph-image.(jpg|jpeg|png|gif) image file to any route segment. + +** Twitter Image ** + +- Add a twitter-image.(jpg|jpeg|png|gif) image file to any route segment. + +** OG Image Alt text ** + +- Add an accompanying opengraph-image.alt.txt file in the same route segment as the opengraph-image.(jpg|jpeg|png|gif) image it's alt text. + ** Twitter Image Alt text ** +- Add an accompanying twitter-image.alt.txt file in the same route segment as the twitter-image.(jpg|jpeg|png|gif) image it's alt text. + +## Set Basic Metadata in your app Layout.tsx + +There are two types of Metadata : static and dynamic +Lets start with global static Meta data in the layout +To define static metadata, export a Metadata object from a layout.js or static page.js file. + +```ts copy +import type { Metadata } from "next"; + +export const metadata: Metadata = { + title: { + default: "My Awesome Blog", + template: "%s - My Awesome Blog", + }, + description: "Come and read my awesome articles", + twitter: { + card: "summary_large_image", + }, +}; + +export default function Layout() {} +``` + +## Set Basic Metadata in Other static Page + +In other pages Just add only titles + +```ts copy +import type { Metadata } from "next"; + +export const metadata: Metadata = { + title: "About Page", +}; + +export default function Page() {} +``` + +## Check your social media share previews + +You can check your social previews using online tools and here are some + +- [**socialsharepreview.com**](https://socialsharepreview.com/) +- [**opengraph.xyz**](https://www.opengraph.xyz//) +- [**Add extension**](https://chromewebstore.google.com/detail/social-share-preview/ggnikicjfklimmffbkhknndafpdlabib) + +- For apps on Localhost you can use [**docs.srv.us**](https://docs.srv.us/) to generate a link you can use online temperalliy or Just use an extension like[Seo meta in 1 click](https://chromewebstore.google.com/detail/seo-meta-in-1-click/bjogjfinolnhfhkbipphpdlldadpnmhc) + +## Quick Tips + +- ** Use Next/Font ** - Make sure in your layout your usung font loaded from "next/font" + avoid using the google font links used in css. This will ensure that the loaded and hosted locally on our website + +- ** Use Next Image ** - Using Next Image Optimises all your images, such as loading different Image Variations for different Screen sizes + +- ** Use Next Link ** - To Cache all the Pages + +## Dynamic Metadata + +These are for dynamic Pages (eg `products/[slug]/page.tsx`) +Here is how its done + +```ts filename="app/products/[id]/page.ts" copy +import type { Metadata, ResolvingMetadata } from "next"; + +type Props = { + params: { id: string }; + searchParams: { [key: string]: string | string[] | undefined }; +}; + +export async function generateMetadata( + { params, searchParams }: Props, + parent: ResolvingMetadata +): Promise { + // read route params + const id = params.id; + + // fetch data + const product = await fetch(`https://.../${id}`).then((res) => res.json()); + + // optionally access and extend (rather than replace) parent metadata + const previousImages = (await parent).openGraph?.images || []; + + return { + title: product.title, + description: product.description, + openGraph: { + images: [ + { + url: product.imageUrl, + }, + ], + }, + }; +} + +export default function Page({ params, searchParams }: Props) {} +``` + +## Other Usefull concepts on Dyanmic Metadata + +## generateStaticParams + +The generateStaticParams function can be used in combination with dynamic route segments to statically generate routes at build time instead of on-demand at request time. + +```js filename="app/blog/[slug]/page.js" copy +// Return a list of `params` to populate the [slug] dynamic segment +export async function generateStaticParams() { + const posts = await fetch("https://.../posts").then((res) => res.json()); + + return posts.map((post) => ({ + slug: post.slug, + })); +} + +// Multiple versions of this page will be statically generated +// using the `params` returned by `generateStaticParams` +export default function Page({ params }) { + const { slug } = params; + // ... +} +``` From eebb2b5148f7ca150f35ed3834c4762bec6a1ef9 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Wed, 27 Mar 2024 09:15:50 +0300 Subject: [PATCH 019/101] added charts --- pages/programming-tutorials/nextjs/_meta.json | 1 + pages/programming-tutorials/nextjs/charts.mdx | 447 ++++++++++++++++++ 2 files changed, 448 insertions(+) create mode 100644 pages/programming-tutorials/nextjs/charts.mdx diff --git a/pages/programming-tutorials/nextjs/_meta.json b/pages/programming-tutorials/nextjs/_meta.json index 188f6b12..9dd21a63 100644 --- a/pages/programming-tutorials/nextjs/_meta.json +++ b/pages/programming-tutorials/nextjs/_meta.json @@ -1,6 +1,7 @@ { "next-intro": "Introduction to Next.js ", "get-started": "Get Started with Next Js", + "charts": "Charts", "next-routing": "Routing in Next.js", "next-state": "State Management in Next.js", "next-data-fetching": "Asynchronous JavaScript", diff --git a/pages/programming-tutorials/nextjs/charts.mdx b/pages/programming-tutorials/nextjs/charts.mdx new file mode 100644 index 00000000..ea08328b --- /dev/null +++ b/pages/programming-tutorials/nextjs/charts.mdx @@ -0,0 +1,447 @@ +# Ultimate Guide: Creating Dynamic Charts in Next.js with Recharts + +In this comprehensive guide, we'll explore how to leverage the power of Recharts, a popular React charting library, to create stunning and interactive charts within your Next.js applications. Whether you're a seasoned developer or just starting with React and Next.js, this tutorial will walk you through the process step-by-step, from setting up your Next.js project to creating various types of charts and customizing them to suit your needs. + +### Key Topics Covered: + +- Introduction to Recharts and its features +- Setting up a Next.js project for charting +- Installing Recharts and adding it to your Next.js application +- Creating basic charts such as line charts, bar charts, and pie charts +- Rendering dynamic data in charts using React state or fetching data from APIs +- Customizing the appearance of charts with different colors, styles, and labels +- Implementing interactivity in charts with tooltips, legends, and responsive design +- Advanced charting techniques including animations, axis configuration, and data transformations +- Best practices for optimizing chart performance and accessibility in Next.js applications +- Real-world examples and use cases of Recharts in Next.js projects +- By the end of this guide, you'll have a solid understanding of how to integrate Recharts seamlessly into your Next.js applications, enabling you to visualize data in a visually appealing and informative manner. Whether you're building a dashboard, analytics platform, or data visualization tool, Recharts in combination with Next.js will empower you to create professional-grade charts with ease. + +For Full Infor Read the Docs (https://recharts.org/en-US/guide)[here] + +### Install Dependencies + +```bash copy + npm install recharts +``` + +## Sample Dataset + +```ts copy +// Interface for product data +interface Product { + category: string; + sales: number; +} + +// Interface for traffic and sales data +interface TrafficSales { + month: string; + traffic: number; + sales: number; +} + +// Interface for customer acquisition data +interface AcquisitionChannel { + channel: string; + newCustomers: number; +} + +// Interface for inventory data +interface InventoryItem { + product: string; + stock: number; +} +const pieChartData = [ + { name: "Group A", value: 400 }, + { name: "Group B", value: 300 }, + { name: "Group C", value: 300 }, + { name: "Group D", value: 200 }, +]; + +const COLORS = ["#0088FE", "#00C49F", "#FFBB28", "#FF8042"]; +// Example data (replace with your actual data) +const productData: Product[] = [ + { category: "Shirts", sales: 200 }, + { category: "Pants", sales: 150 }, + { category: "Dresses", sales: 180 }, + { category: "Shoes", sales: 120 }, + { category: "Accessories", sales: 80 }, +]; + +const trafficSalesData: TrafficSales[] = [ + { month: "Jan", traffic: 10000, sales: 800 }, + { month: "Feb", traffic: 12000, sales: 1000 }, + { month: "Mar", traffic: 15000, sales: 1200 }, + { month: "Apr", traffic: 8000, sales: 700 }, + { month: "May", traffic: 9000, sales: 850 }, +]; + +const acquisitionData: AcquisitionChannel[] = [ + { channel: "Organic Search", newCustomers: 50 }, + { channel: "Email Marketing", newCustomers: 30 }, + { channel: "Social Media", newCustomers: 20 }, + { channel: "Paid Advertising", newCustomers: 15 }, +]; + +const inventoryData: InventoryItem[] = [ + { product: "Shirt A", stock: 50 }, + { product: "Shirt B", stock: 30 }, + { product: "Pants", stock: 25 }, + { product: "Dress", stock: 10 }, +]; +``` + +## Creating Re-Usable Components + +### Creating Re-Usable Barchart Component + +```ts filename="ReUsableBarChart.ts" copy +"use client"; + +import { + Bar, + BarChart, + ResponsiveContainer, + Tooltip, + XAxis, + YAxis, +} from "recharts"; + +const productsData = [ + { category: "Shirts", sales: 200 }, + { category: "Pants", sales: 150 }, + { category: "Dresses", sales: 180 }, + { category: "Shoes", sales: 120 }, + { category: "Accessories", sales: 80 }, +]; + +export function ReUsableBarChart({ + data, + XAxisDataKey, + BarDataKey, + BarChartColor = "#ffc107", + title, +}: { + title: string; + data: any; + XAxisDataKey: string; + BarDataKey: string; + BarChartColor?: string; +}) { + return ( +
+

+ {title} +

+ + + + `$${value}`} + /> + + + + +
+ ); +} +``` + +### Creating Re-Usable LineGraph Component + +```ts filename="ReUsableLineGraph.ts" copy +import React from "react"; +import { + LineChart, + Line, + XAxis, + YAxis, + Tooltip, + ResponsiveContainer, +} from "recharts"; + +const ReUsableLineGraph = ({ + data, + XAxisDataKey, + LineOneDataKey, + LineTwoStroke, + LineOneStroke = "#387044", + LineTwoDataKey = "#ffc107", + title, +}: { + title: string; + data: any; + XAxisDataKey: string; + LineOneDataKey: string; + LineTwoDataKey: string; + LineTwoStroke?: string; + LineOneStroke?: string; +}) => { + const trafficSalesData = [ + { month: "Jan", traffic: 10000, sales: 800 }, + { month: "Feb", traffic: 12000, sales: 1000 }, + { month: "Mar", traffic: 15000, sales: 1200 }, + { month: "Apr", traffic: 8000, sales: 700 }, + { month: "May", traffic: 9000, sales: 850 }, + ]; + return ( +
+

+ {title} +

+ + + + + + + + + +
+ ); +}; + +export default ReUsableLineGraph; +``` + +### Creating Re-Usable Piechart Component + +```ts filename="ReUsablePieChart.ts" copy +"use client"; +import React from "react"; +import { + PieChart, + Pie, + Sector, + Cell, + ResponsiveContainer, + Tooltip, +} from "recharts"; + +const ReUsablePieChart = ({ + title, + data, + colors, +}: { + title: string; + data: any; + colors: string[]; +}) => { + const RADIAN = Math.PI / 180; + const renderCustomizedLabel = ({ + cx, + cy, + midAngle, + innerRadius, + outerRadius, + percent, + index, + }: any) => { + const radius = innerRadius + (outerRadius - innerRadius) * 0.5; + const x = cx + radius * Math.cos(-midAngle * RADIAN); + const y = cy + radius * Math.sin(-midAngle * RADIAN); + + return ( + cx ? "start" : "end"} + dominantBaseline="central" + > + {`${(percent * 100).toFixed(0)}%`} + + ); + }; + + return ( +
+

+ {title} +

+ + + + {data.map((entry: any, index: any) => ( + + ))} + + + + +
+ ); +}; + +export default ReUsablePieChart; +``` + +### Create the Analyticts Page + +```ts filename="analyticts" copy +"use client"; +import { ReUsableBarChart } from "@/components/ReUsableBarChart"; +import ReUsableLineGraph from "@/components/ReUsableLineGraph"; +import ReUsablePieChart from "@/components/ReUsablePieChart"; +// analytics.tsx +import React from "react"; +import { + BarChart, + Bar, + LineChart, + Line, + XAxis, + YAxis, + Tooltip, +} from "recharts"; + +// Interface for product data +interface Product { + category: string; + sales: number; +} + +// Interface for traffic and sales data +interface TrafficSales { + month: string; + traffic: number; + sales: number; +} + +// Interface for customer acquisition data +interface AcquisitionChannel { + channel: string; + newCustomers: number; +} + +// Interface for inventory data +interface InventoryItem { + product: string; + stock: number; +} +const pieChartData = [ + { name: "Group A", value: 400 }, + { name: "Group B", value: 300 }, + { name: "Group C", value: 300 }, + { name: "Group D", value: 200 }, +]; + +const COLORS = ["#0088FE", "#00C49F", "#FFBB28", "#FF8042"]; +// Example data (replace with your actual data) +const productData: Product[] = [ + { category: "Shirts", sales: 200 }, + { category: "Pants", sales: 150 }, + { category: "Dresses", sales: 180 }, + { category: "Shoes", sales: 120 }, + { category: "Accessories", sales: 80 }, +]; + +const trafficSalesData: TrafficSales[] = [ + { month: "Jan", traffic: 10000, sales: 800 }, + { month: "Feb", traffic: 12000, sales: 1000 }, + { month: "Mar", traffic: 15000, sales: 1200 }, + { month: "Apr", traffic: 8000, sales: 700 }, + { month: "May", traffic: 9000, sales: 850 }, +]; + +const acquisitionData: AcquisitionChannel[] = [ + { channel: "Organic Search", newCustomers: 50 }, + { channel: "Email Marketing", newCustomers: 30 }, + { channel: "Social Media", newCustomers: 20 }, + { channel: "Paid Advertising", newCustomers: 15 }, +]; + +const inventoryData: InventoryItem[] = [ + { product: "Shirt A", stock: 50 }, + { product: "Shirt B", stock: 30 }, + { product: "Pants", stock: 25 }, + { product: "Dress", stock: 10 }, +]; + +const AnalyticsPage = () => { + return ( +
+

+ E-commerce Analytics +

+ {/* Product Performance */} +
+ + + + + + +
+
+ ); +}; + +export default AnalyticsPage; +``` From 1c537fb598fd85e75a4cb9706e21d2ff0cb2e509 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Wed, 27 Mar 2024 09:24:52 +0300 Subject: [PATCH 020/101] added charts --- pages/programming-tutorials/nextjs/_meta.json | 2 +- .../nextjs/get-staretd.mdx | 447 ++++++++++++++++++ 2 files changed, 448 insertions(+), 1 deletion(-) diff --git a/pages/programming-tutorials/nextjs/_meta.json b/pages/programming-tutorials/nextjs/_meta.json index 9dd21a63..6eb68285 100644 --- a/pages/programming-tutorials/nextjs/_meta.json +++ b/pages/programming-tutorials/nextjs/_meta.json @@ -1,6 +1,6 @@ { "next-intro": "Introduction to Next.js ", - "get-started": "Get Started with Next Js", + "get-started": "Get Started with Charts in Next Js ", "charts": "Charts", "next-routing": "Routing in Next.js", "next-state": "State Management in Next.js", diff --git a/pages/programming-tutorials/nextjs/get-staretd.mdx b/pages/programming-tutorials/nextjs/get-staretd.mdx index e69de29b..ea08328b 100644 --- a/pages/programming-tutorials/nextjs/get-staretd.mdx +++ b/pages/programming-tutorials/nextjs/get-staretd.mdx @@ -0,0 +1,447 @@ +# Ultimate Guide: Creating Dynamic Charts in Next.js with Recharts + +In this comprehensive guide, we'll explore how to leverage the power of Recharts, a popular React charting library, to create stunning and interactive charts within your Next.js applications. Whether you're a seasoned developer or just starting with React and Next.js, this tutorial will walk you through the process step-by-step, from setting up your Next.js project to creating various types of charts and customizing them to suit your needs. + +### Key Topics Covered: + +- Introduction to Recharts and its features +- Setting up a Next.js project for charting +- Installing Recharts and adding it to your Next.js application +- Creating basic charts such as line charts, bar charts, and pie charts +- Rendering dynamic data in charts using React state or fetching data from APIs +- Customizing the appearance of charts with different colors, styles, and labels +- Implementing interactivity in charts with tooltips, legends, and responsive design +- Advanced charting techniques including animations, axis configuration, and data transformations +- Best practices for optimizing chart performance and accessibility in Next.js applications +- Real-world examples and use cases of Recharts in Next.js projects +- By the end of this guide, you'll have a solid understanding of how to integrate Recharts seamlessly into your Next.js applications, enabling you to visualize data in a visually appealing and informative manner. Whether you're building a dashboard, analytics platform, or data visualization tool, Recharts in combination with Next.js will empower you to create professional-grade charts with ease. + +For Full Infor Read the Docs (https://recharts.org/en-US/guide)[here] + +### Install Dependencies + +```bash copy + npm install recharts +``` + +## Sample Dataset + +```ts copy +// Interface for product data +interface Product { + category: string; + sales: number; +} + +// Interface for traffic and sales data +interface TrafficSales { + month: string; + traffic: number; + sales: number; +} + +// Interface for customer acquisition data +interface AcquisitionChannel { + channel: string; + newCustomers: number; +} + +// Interface for inventory data +interface InventoryItem { + product: string; + stock: number; +} +const pieChartData = [ + { name: "Group A", value: 400 }, + { name: "Group B", value: 300 }, + { name: "Group C", value: 300 }, + { name: "Group D", value: 200 }, +]; + +const COLORS = ["#0088FE", "#00C49F", "#FFBB28", "#FF8042"]; +// Example data (replace with your actual data) +const productData: Product[] = [ + { category: "Shirts", sales: 200 }, + { category: "Pants", sales: 150 }, + { category: "Dresses", sales: 180 }, + { category: "Shoes", sales: 120 }, + { category: "Accessories", sales: 80 }, +]; + +const trafficSalesData: TrafficSales[] = [ + { month: "Jan", traffic: 10000, sales: 800 }, + { month: "Feb", traffic: 12000, sales: 1000 }, + { month: "Mar", traffic: 15000, sales: 1200 }, + { month: "Apr", traffic: 8000, sales: 700 }, + { month: "May", traffic: 9000, sales: 850 }, +]; + +const acquisitionData: AcquisitionChannel[] = [ + { channel: "Organic Search", newCustomers: 50 }, + { channel: "Email Marketing", newCustomers: 30 }, + { channel: "Social Media", newCustomers: 20 }, + { channel: "Paid Advertising", newCustomers: 15 }, +]; + +const inventoryData: InventoryItem[] = [ + { product: "Shirt A", stock: 50 }, + { product: "Shirt B", stock: 30 }, + { product: "Pants", stock: 25 }, + { product: "Dress", stock: 10 }, +]; +``` + +## Creating Re-Usable Components + +### Creating Re-Usable Barchart Component + +```ts filename="ReUsableBarChart.ts" copy +"use client"; + +import { + Bar, + BarChart, + ResponsiveContainer, + Tooltip, + XAxis, + YAxis, +} from "recharts"; + +const productsData = [ + { category: "Shirts", sales: 200 }, + { category: "Pants", sales: 150 }, + { category: "Dresses", sales: 180 }, + { category: "Shoes", sales: 120 }, + { category: "Accessories", sales: 80 }, +]; + +export function ReUsableBarChart({ + data, + XAxisDataKey, + BarDataKey, + BarChartColor = "#ffc107", + title, +}: { + title: string; + data: any; + XAxisDataKey: string; + BarDataKey: string; + BarChartColor?: string; +}) { + return ( +
+

+ {title} +

+ + + + `$${value}`} + /> + + + + +
+ ); +} +``` + +### Creating Re-Usable LineGraph Component + +```ts filename="ReUsableLineGraph.ts" copy +import React from "react"; +import { + LineChart, + Line, + XAxis, + YAxis, + Tooltip, + ResponsiveContainer, +} from "recharts"; + +const ReUsableLineGraph = ({ + data, + XAxisDataKey, + LineOneDataKey, + LineTwoStroke, + LineOneStroke = "#387044", + LineTwoDataKey = "#ffc107", + title, +}: { + title: string; + data: any; + XAxisDataKey: string; + LineOneDataKey: string; + LineTwoDataKey: string; + LineTwoStroke?: string; + LineOneStroke?: string; +}) => { + const trafficSalesData = [ + { month: "Jan", traffic: 10000, sales: 800 }, + { month: "Feb", traffic: 12000, sales: 1000 }, + { month: "Mar", traffic: 15000, sales: 1200 }, + { month: "Apr", traffic: 8000, sales: 700 }, + { month: "May", traffic: 9000, sales: 850 }, + ]; + return ( +
+

+ {title} +

+ + + + + + + + + +
+ ); +}; + +export default ReUsableLineGraph; +``` + +### Creating Re-Usable Piechart Component + +```ts filename="ReUsablePieChart.ts" copy +"use client"; +import React from "react"; +import { + PieChart, + Pie, + Sector, + Cell, + ResponsiveContainer, + Tooltip, +} from "recharts"; + +const ReUsablePieChart = ({ + title, + data, + colors, +}: { + title: string; + data: any; + colors: string[]; +}) => { + const RADIAN = Math.PI / 180; + const renderCustomizedLabel = ({ + cx, + cy, + midAngle, + innerRadius, + outerRadius, + percent, + index, + }: any) => { + const radius = innerRadius + (outerRadius - innerRadius) * 0.5; + const x = cx + radius * Math.cos(-midAngle * RADIAN); + const y = cy + radius * Math.sin(-midAngle * RADIAN); + + return ( + cx ? "start" : "end"} + dominantBaseline="central" + > + {`${(percent * 100).toFixed(0)}%`} + + ); + }; + + return ( +
+

+ {title} +

+ + + + {data.map((entry: any, index: any) => ( + + ))} + + + + +
+ ); +}; + +export default ReUsablePieChart; +``` + +### Create the Analyticts Page + +```ts filename="analyticts" copy +"use client"; +import { ReUsableBarChart } from "@/components/ReUsableBarChart"; +import ReUsableLineGraph from "@/components/ReUsableLineGraph"; +import ReUsablePieChart from "@/components/ReUsablePieChart"; +// analytics.tsx +import React from "react"; +import { + BarChart, + Bar, + LineChart, + Line, + XAxis, + YAxis, + Tooltip, +} from "recharts"; + +// Interface for product data +interface Product { + category: string; + sales: number; +} + +// Interface for traffic and sales data +interface TrafficSales { + month: string; + traffic: number; + sales: number; +} + +// Interface for customer acquisition data +interface AcquisitionChannel { + channel: string; + newCustomers: number; +} + +// Interface for inventory data +interface InventoryItem { + product: string; + stock: number; +} +const pieChartData = [ + { name: "Group A", value: 400 }, + { name: "Group B", value: 300 }, + { name: "Group C", value: 300 }, + { name: "Group D", value: 200 }, +]; + +const COLORS = ["#0088FE", "#00C49F", "#FFBB28", "#FF8042"]; +// Example data (replace with your actual data) +const productData: Product[] = [ + { category: "Shirts", sales: 200 }, + { category: "Pants", sales: 150 }, + { category: "Dresses", sales: 180 }, + { category: "Shoes", sales: 120 }, + { category: "Accessories", sales: 80 }, +]; + +const trafficSalesData: TrafficSales[] = [ + { month: "Jan", traffic: 10000, sales: 800 }, + { month: "Feb", traffic: 12000, sales: 1000 }, + { month: "Mar", traffic: 15000, sales: 1200 }, + { month: "Apr", traffic: 8000, sales: 700 }, + { month: "May", traffic: 9000, sales: 850 }, +]; + +const acquisitionData: AcquisitionChannel[] = [ + { channel: "Organic Search", newCustomers: 50 }, + { channel: "Email Marketing", newCustomers: 30 }, + { channel: "Social Media", newCustomers: 20 }, + { channel: "Paid Advertising", newCustomers: 15 }, +]; + +const inventoryData: InventoryItem[] = [ + { product: "Shirt A", stock: 50 }, + { product: "Shirt B", stock: 30 }, + { product: "Pants", stock: 25 }, + { product: "Dress", stock: 10 }, +]; + +const AnalyticsPage = () => { + return ( +
+

+ E-commerce Analytics +

+ {/* Product Performance */} +
+ + + + + + +
+
+ ); +}; + +export default AnalyticsPage; +``` From d1dabe07cf88788c37fa71f2b5636264242275cc Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Wed, 27 Mar 2024 09:35:57 +0300 Subject: [PATCH 021/101] added charts --- pages/programming-tutorials/nextjs/_meta.json | 2 +- pages/programming-tutorials/nextjs/charts.mdx | 2 +- .../nextjs/get-staretd.mdx | 448 +----------------- 3 files changed, 3 insertions(+), 449 deletions(-) diff --git a/pages/programming-tutorials/nextjs/_meta.json b/pages/programming-tutorials/nextjs/_meta.json index 6eb68285..808bbbbb 100644 --- a/pages/programming-tutorials/nextjs/_meta.json +++ b/pages/programming-tutorials/nextjs/_meta.json @@ -1,6 +1,6 @@ { "next-intro": "Introduction to Next.js ", - "get-started": "Get Started with Charts in Next Js ", + "get-started": "Get Started with Next Js ", "charts": "Charts", "next-routing": "Routing in Next.js", "next-state": "State Management in Next.js", diff --git a/pages/programming-tutorials/nextjs/charts.mdx b/pages/programming-tutorials/nextjs/charts.mdx index ea08328b..7c402e05 100644 --- a/pages/programming-tutorials/nextjs/charts.mdx +++ b/pages/programming-tutorials/nextjs/charts.mdx @@ -16,7 +16,7 @@ In this comprehensive guide, we'll explore how to leverage the power of Recharts - Real-world examples and use cases of Recharts in Next.js projects - By the end of this guide, you'll have a solid understanding of how to integrate Recharts seamlessly into your Next.js applications, enabling you to visualize data in a visually appealing and informative manner. Whether you're building a dashboard, analytics platform, or data visualization tool, Recharts in combination with Next.js will empower you to create professional-grade charts with ease. -For Full Infor Read the Docs (https://recharts.org/en-US/guide)[here] +For Full Infor Read the Docs [Here](https://recharts.org/en-US/guide) ### Install Dependencies diff --git a/pages/programming-tutorials/nextjs/get-staretd.mdx b/pages/programming-tutorials/nextjs/get-staretd.mdx index ea08328b..ce941f84 100644 --- a/pages/programming-tutorials/nextjs/get-staretd.mdx +++ b/pages/programming-tutorials/nextjs/get-staretd.mdx @@ -1,447 +1 @@ -# Ultimate Guide: Creating Dynamic Charts in Next.js with Recharts - -In this comprehensive guide, we'll explore how to leverage the power of Recharts, a popular React charting library, to create stunning and interactive charts within your Next.js applications. Whether you're a seasoned developer or just starting with React and Next.js, this tutorial will walk you through the process step-by-step, from setting up your Next.js project to creating various types of charts and customizing them to suit your needs. - -### Key Topics Covered: - -- Introduction to Recharts and its features -- Setting up a Next.js project for charting -- Installing Recharts and adding it to your Next.js application -- Creating basic charts such as line charts, bar charts, and pie charts -- Rendering dynamic data in charts using React state or fetching data from APIs -- Customizing the appearance of charts with different colors, styles, and labels -- Implementing interactivity in charts with tooltips, legends, and responsive design -- Advanced charting techniques including animations, axis configuration, and data transformations -- Best practices for optimizing chart performance and accessibility in Next.js applications -- Real-world examples and use cases of Recharts in Next.js projects -- By the end of this guide, you'll have a solid understanding of how to integrate Recharts seamlessly into your Next.js applications, enabling you to visualize data in a visually appealing and informative manner. Whether you're building a dashboard, analytics platform, or data visualization tool, Recharts in combination with Next.js will empower you to create professional-grade charts with ease. - -For Full Infor Read the Docs (https://recharts.org/en-US/guide)[here] - -### Install Dependencies - -```bash copy - npm install recharts -``` - -## Sample Dataset - -```ts copy -// Interface for product data -interface Product { - category: string; - sales: number; -} - -// Interface for traffic and sales data -interface TrafficSales { - month: string; - traffic: number; - sales: number; -} - -// Interface for customer acquisition data -interface AcquisitionChannel { - channel: string; - newCustomers: number; -} - -// Interface for inventory data -interface InventoryItem { - product: string; - stock: number; -} -const pieChartData = [ - { name: "Group A", value: 400 }, - { name: "Group B", value: 300 }, - { name: "Group C", value: 300 }, - { name: "Group D", value: 200 }, -]; - -const COLORS = ["#0088FE", "#00C49F", "#FFBB28", "#FF8042"]; -// Example data (replace with your actual data) -const productData: Product[] = [ - { category: "Shirts", sales: 200 }, - { category: "Pants", sales: 150 }, - { category: "Dresses", sales: 180 }, - { category: "Shoes", sales: 120 }, - { category: "Accessories", sales: 80 }, -]; - -const trafficSalesData: TrafficSales[] = [ - { month: "Jan", traffic: 10000, sales: 800 }, - { month: "Feb", traffic: 12000, sales: 1000 }, - { month: "Mar", traffic: 15000, sales: 1200 }, - { month: "Apr", traffic: 8000, sales: 700 }, - { month: "May", traffic: 9000, sales: 850 }, -]; - -const acquisitionData: AcquisitionChannel[] = [ - { channel: "Organic Search", newCustomers: 50 }, - { channel: "Email Marketing", newCustomers: 30 }, - { channel: "Social Media", newCustomers: 20 }, - { channel: "Paid Advertising", newCustomers: 15 }, -]; - -const inventoryData: InventoryItem[] = [ - { product: "Shirt A", stock: 50 }, - { product: "Shirt B", stock: 30 }, - { product: "Pants", stock: 25 }, - { product: "Dress", stock: 10 }, -]; -``` - -## Creating Re-Usable Components - -### Creating Re-Usable Barchart Component - -```ts filename="ReUsableBarChart.ts" copy -"use client"; - -import { - Bar, - BarChart, - ResponsiveContainer, - Tooltip, - XAxis, - YAxis, -} from "recharts"; - -const productsData = [ - { category: "Shirts", sales: 200 }, - { category: "Pants", sales: 150 }, - { category: "Dresses", sales: 180 }, - { category: "Shoes", sales: 120 }, - { category: "Accessories", sales: 80 }, -]; - -export function ReUsableBarChart({ - data, - XAxisDataKey, - BarDataKey, - BarChartColor = "#ffc107", - title, -}: { - title: string; - data: any; - XAxisDataKey: string; - BarDataKey: string; - BarChartColor?: string; -}) { - return ( -
-

- {title} -

- - - - `$${value}`} - /> - - - - -
- ); -} -``` - -### Creating Re-Usable LineGraph Component - -```ts filename="ReUsableLineGraph.ts" copy -import React from "react"; -import { - LineChart, - Line, - XAxis, - YAxis, - Tooltip, - ResponsiveContainer, -} from "recharts"; - -const ReUsableLineGraph = ({ - data, - XAxisDataKey, - LineOneDataKey, - LineTwoStroke, - LineOneStroke = "#387044", - LineTwoDataKey = "#ffc107", - title, -}: { - title: string; - data: any; - XAxisDataKey: string; - LineOneDataKey: string; - LineTwoDataKey: string; - LineTwoStroke?: string; - LineOneStroke?: string; -}) => { - const trafficSalesData = [ - { month: "Jan", traffic: 10000, sales: 800 }, - { month: "Feb", traffic: 12000, sales: 1000 }, - { month: "Mar", traffic: 15000, sales: 1200 }, - { month: "Apr", traffic: 8000, sales: 700 }, - { month: "May", traffic: 9000, sales: 850 }, - ]; - return ( -
-

- {title} -

- - - - - - - - - -
- ); -}; - -export default ReUsableLineGraph; -``` - -### Creating Re-Usable Piechart Component - -```ts filename="ReUsablePieChart.ts" copy -"use client"; -import React from "react"; -import { - PieChart, - Pie, - Sector, - Cell, - ResponsiveContainer, - Tooltip, -} from "recharts"; - -const ReUsablePieChart = ({ - title, - data, - colors, -}: { - title: string; - data: any; - colors: string[]; -}) => { - const RADIAN = Math.PI / 180; - const renderCustomizedLabel = ({ - cx, - cy, - midAngle, - innerRadius, - outerRadius, - percent, - index, - }: any) => { - const radius = innerRadius + (outerRadius - innerRadius) * 0.5; - const x = cx + radius * Math.cos(-midAngle * RADIAN); - const y = cy + radius * Math.sin(-midAngle * RADIAN); - - return ( - cx ? "start" : "end"} - dominantBaseline="central" - > - {`${(percent * 100).toFixed(0)}%`} - - ); - }; - - return ( -
-

- {title} -

- - - - {data.map((entry: any, index: any) => ( - - ))} - - - - -
- ); -}; - -export default ReUsablePieChart; -``` - -### Create the Analyticts Page - -```ts filename="analyticts" copy -"use client"; -import { ReUsableBarChart } from "@/components/ReUsableBarChart"; -import ReUsableLineGraph from "@/components/ReUsableLineGraph"; -import ReUsablePieChart from "@/components/ReUsablePieChart"; -// analytics.tsx -import React from "react"; -import { - BarChart, - Bar, - LineChart, - Line, - XAxis, - YAxis, - Tooltip, -} from "recharts"; - -// Interface for product data -interface Product { - category: string; - sales: number; -} - -// Interface for traffic and sales data -interface TrafficSales { - month: string; - traffic: number; - sales: number; -} - -// Interface for customer acquisition data -interface AcquisitionChannel { - channel: string; - newCustomers: number; -} - -// Interface for inventory data -interface InventoryItem { - product: string; - stock: number; -} -const pieChartData = [ - { name: "Group A", value: 400 }, - { name: "Group B", value: 300 }, - { name: "Group C", value: 300 }, - { name: "Group D", value: 200 }, -]; - -const COLORS = ["#0088FE", "#00C49F", "#FFBB28", "#FF8042"]; -// Example data (replace with your actual data) -const productData: Product[] = [ - { category: "Shirts", sales: 200 }, - { category: "Pants", sales: 150 }, - { category: "Dresses", sales: 180 }, - { category: "Shoes", sales: 120 }, - { category: "Accessories", sales: 80 }, -]; - -const trafficSalesData: TrafficSales[] = [ - { month: "Jan", traffic: 10000, sales: 800 }, - { month: "Feb", traffic: 12000, sales: 1000 }, - { month: "Mar", traffic: 15000, sales: 1200 }, - { month: "Apr", traffic: 8000, sales: 700 }, - { month: "May", traffic: 9000, sales: 850 }, -]; - -const acquisitionData: AcquisitionChannel[] = [ - { channel: "Organic Search", newCustomers: 50 }, - { channel: "Email Marketing", newCustomers: 30 }, - { channel: "Social Media", newCustomers: 20 }, - { channel: "Paid Advertising", newCustomers: 15 }, -]; - -const inventoryData: InventoryItem[] = [ - { product: "Shirt A", stock: 50 }, - { product: "Shirt B", stock: 30 }, - { product: "Pants", stock: 25 }, - { product: "Dress", stock: 10 }, -]; - -const AnalyticsPage = () => { - return ( -
-

- E-commerce Analytics -

- {/* Product Performance */} -
- - - - - - -
-
- ); -}; - -export default AnalyticsPage; -``` +# Get Satrted with Next From ecbddc44b84b555bbd6bb0baf366f43cc264e625 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Thu, 28 Mar 2024 04:27:56 +0300 Subject: [PATCH 022/101] added recharts --- pages/programming-tutorials/nextjs/charts.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/programming-tutorials/nextjs/charts.mdx b/pages/programming-tutorials/nextjs/charts.mdx index 7c402e05..ed56dd6b 100644 --- a/pages/programming-tutorials/nextjs/charts.mdx +++ b/pages/programming-tutorials/nextjs/charts.mdx @@ -2,7 +2,7 @@ In this comprehensive guide, we'll explore how to leverage the power of Recharts, a popular React charting library, to create stunning and interactive charts within your Next.js applications. Whether you're a seasoned developer or just starting with React and Next.js, this tutorial will walk you through the process step-by-step, from setting up your Next.js project to creating various types of charts and customizing them to suit your needs. -### Key Topics Covered: +### Key Topics Covered - Introduction to Recharts and its features - Setting up a Next.js project for charting From 1708340bd5215ab75710b11245d5c8997e4086ea Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Tue, 7 May 2024 09:40:46 +0300 Subject: [PATCH 023/101] added datatables --- pages/programming-tutorials/nextjs/_meta.json | 1 + pages/programming-tutorials/nextjs/datatable.mdx | 1 + 2 files changed, 2 insertions(+) create mode 100644 pages/programming-tutorials/nextjs/datatable.mdx diff --git a/pages/programming-tutorials/nextjs/_meta.json b/pages/programming-tutorials/nextjs/_meta.json index 808bbbbb..3489efc9 100644 --- a/pages/programming-tutorials/nextjs/_meta.json +++ b/pages/programming-tutorials/nextjs/_meta.json @@ -2,6 +2,7 @@ "next-intro": "Introduction to Next.js ", "get-started": "Get Started with Next Js ", "charts": "Charts", + "datatable": "Data Table", "next-routing": "Routing in Next.js", "next-state": "State Management in Next.js", "next-data-fetching": "Asynchronous JavaScript", diff --git a/pages/programming-tutorials/nextjs/datatable.mdx b/pages/programming-tutorials/nextjs/datatable.mdx new file mode 100644 index 00000000..856c963a --- /dev/null +++ b/pages/programming-tutorials/nextjs/datatable.mdx @@ -0,0 +1 @@ +# Data Tables From 36d335581ffe555c6f6183a7f3ccf2b5e91a6b8f Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Tue, 7 May 2024 11:30:29 +0300 Subject: [PATCH 024/101] added datatables --- .../nextjs/datatable.mdx | 663 ++++++++++++++++++ 1 file changed, 663 insertions(+) diff --git a/pages/programming-tutorials/nextjs/datatable.mdx b/pages/programming-tutorials/nextjs/datatable.mdx index 856c963a..7918ee1e 100644 --- a/pages/programming-tutorials/nextjs/datatable.mdx +++ b/pages/programming-tutorials/nextjs/datatable.mdx @@ -1 +1,664 @@ +import { FileTree } from "nextra/components"; + # Data Tables + +## Install Dependencies + +You will needto Add the `` component to your project: + +```bash copy + npx shadcn-ui@latest add table +``` + +and Also Add tanstack/react-table dependency: + +```bash copy + npm install @tanstack/react-table +``` + +## Folder Structure For the Route + +Lets take an example i have this route called dashboard/inventory/categories + + + + + + + + + + + +So go ahead and Create the route and add those files + +## Folder Structure For the Components + + + + + + + + + + + + + + + + + + +So go ahead and Create these Components + +- columns.tsx `(client component)` will contain our column definitions. +- data-table.tsx `(client component)` will contain our `` component. +- page.tsx (server component) is where we'll fetch data and render our table. + +## Create the Page.tsx in the categories + +in the Page we fetch the Data and also we need to send the Coumns and the Data to the DataTable + +```ts copy +import { getCategories } from "@/actions/categories"; +import PageHeader from "@/components/Dashboard/PageHeader"; +import DataTable from "@/components/data-table-components/DataTable"; +import React from "react"; +import { columns } from "./columns"; +import { CategoryFormProps } from "@/types/types"; +import { Category } from "@prisma/client"; + +export default async function page() { + const categories: Category[] = (await getCategories()) || []; + return ( +
+ +
+ +
+
+ ); +} +``` + +## Create the Columns.tsx + +Make sure to Install all the missing shad components + +```ts copy +"use client"; + +import Image from "next/image"; +import { ArrowUpDown, MoreHorizontal } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import DateColumn from "@/components/DataTableColumns/DateColumn"; +import ImageColumn from "@/components/DataTableColumns/ImageColumn"; +import SortableColumn from "@/components/DataTableColumns/SortableColumn"; +// import ActionColumn from "@/components/DataTableColumns/ActionColumn"; +import CategoryForm from "@/components/Dashboard/Forms/CategoryForm"; +import { CategoryFormProps } from "@/types/types"; +import { ColumnDef } from "@tanstack/react-table"; +import ActionColumn from "@/components/DataTableColumns/ActionColumn"; +export const columns: ColumnDef[] = [ + { + id: "select", + header: ({ table }) => ( + table.toggleAllPageRowsSelected(!!value)} + aria-label="Select all" + /> + ), + cell: ({ row }) => ( + row.toggleSelected(!!value)} + aria-label="Select row" + /> + ), + enableSorting: false, + enableHiding: false, + }, + { + accessorKey: "title", + header: ({ column }) => , + }, + // { + // accessorKey: "imageUrl", + // header: "Category Image", + // cell: ({ row }) => , + // }, + + { + accessorKey: "createdAt", + header: "Date Created", + cell: ({ row }) => , + }, + { + id: "actions", + cell: ({ row }) => { + const category = row.original; + return ( + + ); + }, + }, +]; +``` + +## Create the Components in the DataTableComponents Folder + +### ActionColumn.tsx + +```ts copy +import React from "react"; +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { MoreHorizontal } from "lucide-react"; +import DeleteBtn from "../Actions/DeleteBtn"; +import EditBtn from "../Actions/EditBtn"; +type ActionColumnProps = { + row: any; + title: string; + editEndpoint: string; + id: string | undefined; +}; +export default function ActionColumn({ + row, + title, + editEndpoint, + id, +}: ActionColumnProps) { + const isActive = row.isActive; + return ( + + + + + + Actions + + + + + + + + + + ); +} +``` + +### DateColumn.tsx + +```ts copy +import React from "react"; + +export default function DateColumn({ + row, + accessorKey, +}: { + row: any; + accessorKey: any; +}) { + const createdAt = row.getValue(`${accessorKey}`); + const originalDate = new Date(createdAt); + + const day = originalDate.getDate(); + const month = originalDate.toLocaleString("default", { month: "short" }); + const year = originalDate.getFullYear(); + + const formatted = `${day}th ${month} ${year}`; + // console.log(imageUrl); + return
{formatted}
; +} +``` + +### ImageColumn.tsx + +```ts copy +import Image from "next/image"; +import React from "react"; + +export default function ImageColumn({ + row, + accessorKey, +}: { + row: any; + accessorKey: any; +}) { + const imageUrl = row.getValue(`${accessorKey}`); + // const thum = row.getValue(`${accessorKey}`); + // console.log(imageUrl); + return ( +
+ +
+ ); +} +``` + +### SortableColumn.tsx + +```ts copy +import React from "react"; +import { Button } from "@/components/ui/button"; +import { ArrowUpDown } from "lucide-react"; +export default function SortableColumn({ + column, + title, +}: { + column: any; + title: string; +}) { + return ( + + ); +} +``` + +## Create the DataTable components + +### DataTable.tsx + +```ts copy +"use client"; + +import * as React from "react"; +import { + ColumnDef, + ColumnFiltersState, + SortingState, + VisibilityState, + flexRender, + getCoreRowModel, + getFacetedRowModel, + getFacetedUniqueValues, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, + useReactTable, +} from "@tanstack/react-table"; + +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import { useState } from "react"; +import { DataTablePagination } from "./DataTablePagination"; +import { DataTableToolbar } from "./DataTableToolbar"; +interface DataTableProps { + columns: ColumnDef[]; + data: TData[]; + filterKeys?: any; +} +export default function DataTable({ + columns, + data, + filterKeys = ["title"], +}: DataTableProps) { + const [rowSelection, setRowSelection] = useState({}); + const [columnVisibility, setColumnVisibility] = useState({}); + const [columnFilters, setColumnFilters] = React.useState( + [] + ); + const [sorting, setSorting] = React.useState([]); + + const table = useReactTable({ + data, + columns, + state: { + sorting, + columnVisibility, + rowSelection, + columnFilters, + }, + enableRowSelection: true, + onRowSelectionChange: setRowSelection, + onSortingChange: setSorting, + onColumnFiltersChange: setColumnFilters, + onColumnVisibilityChange: setColumnVisibility, + getCoreRowModel: getCoreRowModel(), + getFilteredRowModel: getFilteredRowModel(), + getPaginationRowModel: getPaginationRowModel(), + getSortedRowModel: getSortedRowModel(), + getFacetedRowModel: getFacetedRowModel(), + getFacetedUniqueValues: getFacetedUniqueValues(), + }); + + return ( +
+ +
+
+ + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => { + return ( + + {header.isPlaceholder + ? null + : flexRender( + header.column.columnDef.header, + header.getContext() + )} + + ); + })} + + ))} + + + {table.getRowModel().rows?.length ? ( + table.getRowModel().rows.map((row) => ( + + {row.getVisibleCells().map((cell) => ( + + {flexRender( + cell.column.columnDef.cell, + cell.getContext() + )} + + ))} + + )) + ) : ( + + + No results. + + + )} + +
+ + + + ); +} +``` + +### DataTablePagination.tsx + +```ts copy +"use client"; +import { + ChevronLeftIcon, + ChevronRightIcon, + DoubleArrowLeftIcon, + DoubleArrowRightIcon, +} from "@radix-ui/react-icons"; +import { Table } from "@tanstack/react-table"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; + +interface DataTablePaginationProps { + table: Table; +} +import { Button } from "@/components/ui/button"; + +export function DataTablePagination({ + table, +}: DataTablePaginationProps) { + return ( +
+
+ {table.getFilteredSelectedRowModel().rows.length} of{" "} + {table.getFilteredRowModel().rows.length} row(s) selected. +
+
+
+

Rows per page

+ +
+
+ Page {table.getState().pagination.pageIndex + 1} of{" "} + {table.getPageCount()} +
+
+ + + + +
+
+
+ ); +} +``` + +### DataTableToolbar.tsx + +```ts copy +"use client"; + +import { Cross2Icon } from "@radix-ui/react-icons"; +import { Table } from "@tanstack/react-table"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { DataTableViewOptions } from "./DataTableViewOptions"; + +export function DataTableToolbar({ + table, + filterKeys, +}: { + table: any; + filterKeys: any; +}) { + //IF any of the keys have a value + const isFiltered = filterKeys.some( + (key: any) => table.getState().columnFilters[key]?.length > 0 + ); + + const handleInputChange = (key: any, value: any) => { + table.getColumn(key)?.setFilterValue(value); + }; + + const handleResetClick = () => { + filterKeys.forEach((key: any) => { + table.getColumn(key)?.setFilterValue(""); + }); + }; + + return ( +
+
+ {filterKeys.map((key: any) => ( + handleInputChange(key, event.target.value)} + className="h-8 w-[150px] lg:w-[250px]" + /> + ))} + + {isFiltered && ( + + )} +
+ +
+ ); +} +``` + +### DataTableViewOptions.tsx + +```ts copy +"use client"; + +import { DropdownMenuTrigger } from "@radix-ui/react-dropdown-menu"; +import { MixerHorizontalIcon } from "@radix-ui/react-icons"; +import { Table } from "@tanstack/react-table"; + +import { Button } from "@/components/ui/button"; + +import { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuLabel, + DropdownMenuSeparator, +} from "@/components/ui/dropdown-menu"; +interface DataTablePaginationProps { + table: Table; +} +export function DataTableViewOptions({ + table, +}: DataTablePaginationProps) { + return ( + + + + + + Toggle columns + + {table + .getAllColumns() + .filter( + (column) => + typeof column.accessorFn !== "undefined" && column.getCanHide() + ) + .map((column) => { + return ( + column.toggleVisibility(!!value)} + > + {column.id} + + ); + })} + + + ); +} +``` From be1f5743bbed45a2d402dc886340678b5a010a0f Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Wed, 8 May 2024 04:49:29 +0300 Subject: [PATCH 025/101] added excel --- pages/programming-tutorials/nextjs/_meta.json | 1 + pages/programming-tutorials/nextjs/excel.mdx | 270 ++++++++++++++++++ 2 files changed, 271 insertions(+) create mode 100644 pages/programming-tutorials/nextjs/excel.mdx diff --git a/pages/programming-tutorials/nextjs/_meta.json b/pages/programming-tutorials/nextjs/_meta.json index 3489efc9..71ea0c20 100644 --- a/pages/programming-tutorials/nextjs/_meta.json +++ b/pages/programming-tutorials/nextjs/_meta.json @@ -2,6 +2,7 @@ "next-intro": "Introduction to Next.js ", "get-started": "Get Started with Next Js ", "charts": "Charts", + "excel": "Import Data from Excel", "datatable": "Data Table", "next-routing": "Routing in Next.js", "next-state": "State Management in Next.js", diff --git a/pages/programming-tutorials/nextjs/excel.mdx b/pages/programming-tutorials/nextjs/excel.mdx new file mode 100644 index 00000000..eea08947 --- /dev/null +++ b/pages/programming-tutorials/nextjs/excel.mdx @@ -0,0 +1,270 @@ +import { FileTree } from "nextra/components"; + +# Import Data from Excel + +## Install Dependencies + +You will need to install the xlsx Package + +```bash copy + npm i xlsx +``` + +## Create Page.tsx + +This Page is where you fetch and render the table + +```ts cop +import { getUsers } from "@/actions/users"; +import UsersTable from "@/components/UsersTable"; +import React from "react"; + +export default async function page() { + const users = (await getUsers()) || []; + return ( +
+ +
+ ); +} +``` + +## Create Server Action for Handling Creating new Item + +```ts copy +"use server"; +import { prisma } from "@/lib/db"; +import { revalidatePath } from "next/cache"; +export type UserProps = { + Name: string; + Age: number; + City: string; +}; +export async function getUsers() { + try { + const users = await prisma.user.findMany(); + return users; + } catch (error) { + console.log(error); + } +} +export async function createUser(data: UserProps) { + try { + const user = await prisma.user.create({ + data: { + name: data.Name, + age: data.Age, + city: data.City, + }, + }); + revalidatePath("/"); + return user; + } catch (error) { + console.log(error); + } +} +export async function createBulkUsers(users: UserProps[]) { + try { + for (const user of users) { + await createUser(user); + } + } catch (error) { + console.log(error); + } +} +export async function deleteUsers() { + try { + await prisma.user.deleteMany(); + revalidatePath("/"); + } catch (error) { + console.log(error); + } +} +``` + +## Create the Table with Import Button + +```ts copy +"use client"; +import { UserProps, createBulkUsers, deleteUsers } from "@/actions/users"; +import { User } from "@prisma/client"; +import React, { useState } from "react"; +import * as XLSX from "xlsx"; +export default function UsersTable({ users }: { users: User[] }) { + // file + const [file, setFile] = useState(null); + const [loading, setLoading] = useState(false); + const [jsonData, setJsonData] = useState(""); + console.log(file); + // json stringified (purpose of previewing) + function previewData() { + if (file) { + const reader = new FileReader(); + reader.onload = (e) => { + const data = e.target?.result; + if (data) { + const workbook = XLSX.read(data, { type: "binary" }); + // SheetName + const sheetName = workbook.SheetNames[0]; + // Worksheet + const workSheet = workbook.Sheets[sheetName]; + // Json + const json = XLSX.utils.sheet_to_json(workSheet); + setJsonData(JSON.stringify(json, null, 2)); + } + }; + reader.readAsBinaryString(file); + } + } + function saveData() { + if (file) { + setLoading(true); + const reader = new FileReader(); + reader.onload = async (e) => { + const data = e.target?.result; + if (data) { + const workbook = XLSX.read(data, { type: "binary" }); + // SheetName + const sheetName = workbook.SheetNames[0]; + // Worksheet + const workSheet = workbook.Sheets[sheetName]; + // Json + const json: UserProps[] = XLSX.utils.sheet_to_json(workSheet); + //Save to the DB + try { + // console.log(json); + await createBulkUsers(json); + setLoading(false); + } catch (error) { + console.log(error); + } + } + }; + reader.readAsBinaryString(file); + } + } + async function clearData() { + try { + await deleteUsers(); + } catch (error) { + console.log(error); + } + } + return ( +
+ {/* BUTTONS */} + {/* upload input, preview btn , save btn , clear Data */} +
+
+ + setFile(e.target.files ? e.target.files[0] : null)} + /> +
+ + + +
+
{jsonData}
+ {loading ? ( +

Saving Data please wait...

+ ) : ( +
+ {users && users.length > 0 && ( + + + + + + + + + + {users.map((user) => { + return ( + + + + + + ); + })} + +
+ Name + + Age + + City +
+ {user.name} + {user.age}{user.city}
+ )} +
+ )} + + {/* Table */} +
+ ); +} +``` + +## Export Back to Excel + +```ts copy +import * as XLSX from "xlsx"; + +function convertArrayToExcel(data: any[], filename: string) { + // Create a new workbook + const workbook = XLSX.utils.book_new(); + + // Convert the array of objects to a worksheet + const worksheet = XLSX.utils.json_to_sheet(data); + + // Add the worksheet to the workbook + XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1"); + + // Write the workbook to a file + XLSX.writeFile(workbook, filename); +} + +export default convertArrayToExcel; + +const data = [ + { name: "John", age: 30, city: "New York" }, + { name: "Alice", age: 25, city: "Los Angeles" }, + { name: "Bob", age: 35, city: "Chicago" }, +]; + +convertArrayToExcel(data, "example.xlsx"); +``` From d2ce737b3812ff36d339c3dc6d43d9f8d803c30c Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Wed, 8 May 2024 04:57:26 +0300 Subject: [PATCH 026/101] corrected errors --- pages/programming-tutorials/nextjs/excel.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/programming-tutorials/nextjs/excel.mdx b/pages/programming-tutorials/nextjs/excel.mdx index eea08947..eae69e4a 100644 --- a/pages/programming-tutorials/nextjs/excel.mdx +++ b/pages/programming-tutorials/nextjs/excel.mdx @@ -14,7 +14,7 @@ You will need to install the xlsx Package This Page is where you fetch and render the table -```ts cop +```ts copy import { getUsers } from "@/actions/users"; import UsersTable from "@/components/UsersTable"; import React from "react"; From 88d0a2602d54fb2fb380d01ed3b78859c783f268 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Mon, 27 May 2024 05:46:50 +0300 Subject: [PATCH 027/101] added redux toolkit --- pages/programming-tutorials/nextjs/_meta.json | 2 + pages/programming-tutorials/nextjs/redux.mdx | 532 ++++++++++++++++++ pages/programming-tutorials/nextjs/stripe.mdx | 50 ++ 3 files changed, 584 insertions(+) create mode 100644 pages/programming-tutorials/nextjs/redux.mdx create mode 100644 pages/programming-tutorials/nextjs/stripe.mdx diff --git a/pages/programming-tutorials/nextjs/_meta.json b/pages/programming-tutorials/nextjs/_meta.json index 71ea0c20..9cb96988 100644 --- a/pages/programming-tutorials/nextjs/_meta.json +++ b/pages/programming-tutorials/nextjs/_meta.json @@ -2,8 +2,10 @@ "next-intro": "Introduction to Next.js ", "get-started": "Get Started with Next Js ", "charts": "Charts", + "redux": "Redux Toolkit", "excel": "Import Data from Excel", "datatable": "Data Table", + "stripe": "Stripe Complete Guide", "next-routing": "Routing in Next.js", "next-state": "State Management in Next.js", "next-data-fetching": "Asynchronous JavaScript", diff --git a/pages/programming-tutorials/nextjs/redux.mdx b/pages/programming-tutorials/nextjs/redux.mdx new file mode 100644 index 00000000..0601a7f8 --- /dev/null +++ b/pages/programming-tutorials/nextjs/redux.mdx @@ -0,0 +1,532 @@ +import { Steps } from "nextra/components"; + +# Complete Redux Toolkit in Next Js with Typescript + +## Introduction + +In this tutorial, we will learn how to integrate Redux and LocalStorage into a Next.js 14 application using TypeScript. We will start by defining key Redux terminologies, and then we will build practical examples to solidify our understanding. + +## Setting Up Next.js 14 with TypeScript and Install redux toolkit + +First, let's set up a new Next.js project with TypeScript. + +```bash copy +npx create-next-app@latest nextjs-redux-ts --typescript +cd nextjs-redux-ts +npm install @reduxjs/toolkit react-redux + +``` + +## Defining Redux Terminologies + +- Slice: A slice is a collection of Redux reducer logic and actions for a single feature of the application. It is created using the createSlice function from Redux Toolkit. + +- Action: Actions are plain objects with a type property that indicates the type of action being performed. They can also contain additional data. + +- Dispatch: The dispatch function is used to send actions to the Redux store. + +- Reducers: Reducers are functions that take the current state and an action as arguments and return a new state. + +- Provider: The Provider component makes the Redux store available to any nested components that need to access the Redux state. + +## Implementing Redux with a Counter Example + + +### Setting Up the Store: +Create a store.ts file in the src/store directory. + +```ts copy +// store/store.ts +import { configureStore } from "@reduxjs/toolkit"; +import counterReducer from "./counterSlice"; + +const store = configureStore({ + reducer: { + counter: counterReducer, + }, +}); + +export type RootState = ReturnType; +export type AppDispatch = typeof store.dispatch; + +export default store; +``` + +### Creating a Counter Slice: + +Create a counterSlice.ts file in the store/slices directory. + +```ts copy +// store/slices/counterSlice.ts +import { createSlice } from "@reduxjs/toolkit"; + +interface CounterState { + value: number; +} + +const initialState: CounterState = { + value: 0, +}; + +const counterSlice = createSlice({ + name: "counter", + initialState, + reducers: { + increment: (state) => { + state.value += 1; + }, + decrement: (state) => { + state.value -= 1; + }, + }, +}); + +export const { increment, decrement } = counterSlice.actions; +export default counterSlice.reducer; +``` + +### Integrating Provider in layout.tsx: + +Create a provider in the Providers folder and the Integrate it into the layout + +```ts copy +// providers +import { Provider } from "react-redux"; +import store from "../store/store"; + +function Providers({ children }: { children: ReactNode }) { + return {children}; +} + +export default Providers; +``` + +### Creating the Counter Component: + +Create a Counter component in the src/components directory. + +```ts copy +// src/components/Counter.tsx +import React from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { RootState } from "../store/store"; +import { increment, decrement } from "../store/counterSlice"; + +const Counter: React.FC = () => { + const dispatch = useDispatch(); + const count = useSelector((state: RootState) => state.counter.value); + + return ( +
+

Counter: {count}

+ + +
+ ); +}; + +export default Counter; +``` + +### Define Typed Hooks + +While it's possible to import the RootState and AppDispatch types into each component, it's better to create typed versions of the useDispatch and useSelector hooks for usage in your application. This is important for a couple reasons: + +For useSelector, it saves you the need to type (state: RootState) every time +For useDispatch, the default Dispatch type does not know about thunks. In order to correctly dispatch thunks, you need to use the specific customized AppDispatch type from the store that includes the thunk middleware types, and use that with useDispatch. Adding a pre-typed useDispatch hook keeps you from forgetting to import AppDispatch where it's needed. + +```ts copy +import { useDispatch, useSelector } from "react-redux"; +import type { RootState, AppDispatch } from "./store"; + +// Use throughout your app instead of plain `useDispatch` and `useSelector` +export const useAppDispatch = useDispatch.withTypes(); +export const useAppSelector = useSelector.withTypes(); +``` + +### Using the Counter Component: + +Add the Counter component to the page.tsx page. + +```ts copy +// src/pages/index.tsx +import Counter from "../components/Counter"; + +const Home = () => { + return ( +
+

Redux Counter Example

+ +
+ ); +}; + +export default Home; +``` + +
+ +## Implementing Redux with an Add to Cart Example + + + ### Setting Up Product Slice: +Create a productSlice.ts file in the src/store directory. + +```ts copy +// src/store/productSlice.ts +import { createSlice, PayloadAction } from "@reduxjs/toolkit"; + +interface Product { + id: number; + name: string; + price: number; +} + +interface CartState { + products: Product[]; +} + +const initialState: CartState = { + products: [], +}; + +const productSlice = createSlice({ + name: "products", + initialState, + reducers: { + addProduct: (state, action: PayloadAction) => { + state.products.push(action.payload); + }, + removeProduct: (state, action: PayloadAction) => { + state.products = state.products.filter( + (product) => product.id !== action.payload + ); + }, + }, +}); + +export const { addProduct, removeProduct } = productSlice.actions; +export default productSlice.reducer; +``` + +### Updating the Store: + +Update store.ts to include the product reducer. + +```ts copy +// src/store/store.ts +import { configureStore } from "@reduxjs/toolkit"; +import counterReducer from "./counterSlice"; +import productReducer from "./productSlice"; + +const store = configureStore({ + reducer: { + counter: counterReducer, + products: productReducer, + }, +}); + +export type RootState = ReturnType; +export type AppDispatch = typeof store.dispatch; + +export default store; +``` + +### Fetching Products and Displaying Them: + +Create a Products component in the src/components directory. + +```ts copy +// src/components/Products.tsx +import React, { useEffect, useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { RootState } from "../store/store"; +import { addProduct, removeProduct } from "../store/productSlice"; + +interface Product { + id: number; + name: string; + price: number; +} + +const Products: React.FC = () => { + const [products, setProducts] = useState([]); + const dispatch = useDispatch(); + const cartProducts = useSelector( + (state: RootState) => state.products.products + ); + + useEffect(() => { + // Fetch products from an API or local data + const fetchProducts = async () => { + const response = await fetch("/api/products"); + const data = await response.json(); + setProducts(data); + }; + + fetchProducts(); + }, []); + + const handleAddToCart = (product: Product) => { + dispatch(addProduct(product)); + localStorage.setItem("cart", JSON.stringify([...cartProducts, product])); + }; + + const handleRemoveFromCart = (productId: number) => { + dispatch(removeProduct(productId)); + localStorage.setItem( + "cart", + JSON.stringify(cartProducts.filter((product) => product.id !== productId)) + ); + }; + + return ( +
+

Products

+
    + {products.map((product) => ( +
  • + {product.name} - ${product.price} + + +
  • + ))} +
+

Cart

+
    + {cartProducts.map((product) => ( +
  • + {product.name} - ${product.price} + +
  • + ))} +
+
+ ); +}; + +export default Products; +``` + +### Using the Products Component: + +Add the Products component to the index.tsx page. + +```ts copy +// src/pages/index.tsx +import Counter from "../components/Counter"; +import Products from "../components/Products"; + +const Home = () => { + return ( +
+

Redux Counter and Add to Cart Example

+ + +
+ ); +}; + +export default Home; +``` + +
+ +## Implementing a Multi-Step Form with React Hook Form + + +### Installing Dependencies: Install React Hook Form. + +```bash copy +npm i react-hook-form +``` + +### Creating a Form Slice: + +Create a formSlice.ts file in the src/store directory to manage the form state. + +```ts copy +// src/store/formSlice.ts +import { createSlice, PayloadAction } from "@reduxjs/toolkit"; + +interface FormState { + firstName: string; + lastName: string; + email: string; + phone: string; + step: number; +} + +const initialState: FormState = { + firstName: "", + lastName: "", + email: "", + phone: "", + step: 1, +}; + +const formSlice = createSlice({ + name: "form", + initialState, + reducers: { + updateForm: (state, action: PayloadAction>) => { + return { ...state, ...action.payload }; + }, + nextStep: (state) => { + state.step += 1; + }, + previousStep: (state) => { + state.step -= 1; + }, + }, +}); + +export const { updateForm, nextStep, previousStep } = formSlice.actions; +export default formSlice.reducer; +``` + +### Updating the Store: + +Include the form reducer in store.ts. + +```ts copy +// src/store/store.ts +import { configureStore } from "@reduxjs/toolkit"; +import counterReducer from "./counterSlice"; +import productReducer from "./productSlice"; +import formReducer from "./formSlice"; + +const store = configureStore({ + reducer: { + counter: counterReducer, + products: productReducer, + form: formReducer, + }, +}); + +export type RootState = ReturnType; +export type AppDispatch = typeof store.dispatch; + +export default store; +``` + +### Creating the Multi-Step Form Component: + +Update the MultiStepForm component to use Redux for managing form state. + +```ts copy +// src/components/MultiStepForm.tsx +import React from "react"; +import { useForm, SubmitHandler } from "react-hook-form"; +import { useDispatch, useSelector } from "react-redux"; +import { RootState } from "../store/store"; +import { updateForm, nextStep, previousStep } from "../store/formSlice"; + +interface FormData { + firstName: string; + lastName: string; + email: string; + phone: string; +} + +const MultiStepForm: React.FC = () => { + const dispatch = useDispatch(); + const { firstName, lastName, email, phone, step } = useSelector( + (state: RootState) => state.form + ); + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ + defaultValues: { firstName, lastName, email, phone }, + }); + + const onSubmit: SubmitHandler = (data) => { + dispatch(updateForm(data)); + console.log(data); + }; + + return ( +
+
+ {step === 1 && ( +
+
+ + + {errors.firstName && This field is required} +
+
+ + + {errors.lastName && This field is required} +
+ +
+ )} + {step === 2 && ( +
+
+ + + {errors.email && This field is required} +
+
+ + + {errors.phone && This field is required} +
+ + +
+ )} +
+
+ ); +}; + +export default MultiStepForm; +``` + +### Using the Updated Multi-Step Form Component: + +Add the updated MultiStepForm component to the index.tsx page. + +```ts copy +// src/pages/index.tsx +import Counter from "../components/Counter"; +import Products from "../components/Products"; +import MultiStepForm from "../components/MultiStepForm"; + +const Home = () => { + return ( +
+

Redux Counter, Add to Cart, and Multi-Step Form Example

+ + + +
+ ); +}; + +export default Home; +``` + +
diff --git a/pages/programming-tutorials/nextjs/stripe.mdx b/pages/programming-tutorials/nextjs/stripe.mdx new file mode 100644 index 00000000..289c3fdd --- /dev/null +++ b/pages/programming-tutorials/nextjs/stripe.mdx @@ -0,0 +1,50 @@ +# Complete Stripe Guide in Next Js + +## Getting started with Next.js, TypeScript, and Stripe Checkout + +### Step 1: Setting Up a TypeScript Project with Next.js + +Setting up a TypeScript project with Next.js is very convenient, as it automatically generates the tsconfig.json configuration file for you. + +```bash copy + npx create-next-app@latest +``` + +Follow the Prompts and add typescript + +### Managing API Keys with Next.js & Vercel + +#### Create .env file and add the Keys + +``` +# Stripe keys +NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_12345 +STRIPE_SECRET_KEY=sk_12345 +``` + +Most developers will agree that integrating payments into a Next.js application is a complex task that often results in frustrating bugs and setbacks. + +## Stripe Checkout for Next.js Applications + +Stripe Checkout is a pre-built payment page that allows you to securely collect customer payment information in your Next.js application. It offers a seamless integration with Stripe's payment processing infrastructure to handle payments with just a few lines of code. + +Checkout is useful for Next.js developers as it: + +- Speeds up implementation of payments by handling complex logic behind the scenes +- Provides automatic localization and optimization for mobile +- Allows custom styling to match your brand identity +- Includes built-in security and compliance + +To add Checkout to a Next.js app, you'll need to: + +### Set up a Stripe account + +First, [sign up for a Stripe account](https://stripe.com/signup). Stripe offers test data and API keys to build out your integration during development. + +#### Install the Stripe SDK + +```bash copy + npm install @stripe/stripe-js +``` + +This installs the official Stripe JS SDK. From 4493fd3002e51b31b9778a488cea132e96b264a2 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Tue, 4 Jun 2024 07:14:55 +0300 Subject: [PATCH 028/101] added drag-n-drop --- pages/programming-tutorials/nextjs/_meta.json | 1 + .../nextjs/drag-n-drop.mdx | 187 ++++++++++++++++++ 2 files changed, 188 insertions(+) create mode 100644 pages/programming-tutorials/nextjs/drag-n-drop.mdx diff --git a/pages/programming-tutorials/nextjs/_meta.json b/pages/programming-tutorials/nextjs/_meta.json index 9cb96988..ebd45429 100644 --- a/pages/programming-tutorials/nextjs/_meta.json +++ b/pages/programming-tutorials/nextjs/_meta.json @@ -5,6 +5,7 @@ "redux": "Redux Toolkit", "excel": "Import Data from Excel", "datatable": "Data Table", + "drag-n-drop": "Drag and Drop", "stripe": "Stripe Complete Guide", "next-routing": "Routing in Next.js", "next-state": "State Management in Next.js", diff --git a/pages/programming-tutorials/nextjs/drag-n-drop.mdx b/pages/programming-tutorials/nextjs/drag-n-drop.mdx new file mode 100644 index 00000000..1c26b577 --- /dev/null +++ b/pages/programming-tutorials/nextjs/drag-n-drop.mdx @@ -0,0 +1,187 @@ +# Implementing Drag and Drop with `dnd-kit` in a Next.js Project + +This guide will take you through the process of implementing a sortable list using `dnd-kit` in a Next.js project. We'll start by creating a list of users, then build the necessary components, and finally implement the drag and drop functionality. + +## Prerequisites + +Make sure you have Node.js and npm installed. Also, have a basic understanding of React and Next.js. + +## Step 1: Setting Up the Next.js Project + +First, create a new Next.js project if you don't already have one: + +```bash copy +npx create-next-app@latest dnd-kit-demo +cd dnd-kit-demo +``` + +## Install the required packages + +```bash copy +npm install @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities + +``` + +## Step 2: Creating the List of Users + +- Create a file named data.ts in the data folder (create the folder if it doesn't exist): +- Note the List Must have the id property, its necessary for the dnd + +```ts copy +// data/users.ts +export interface User { + id: number; + name: string; + initials: string; +} + +export const users: User[] = [ + { id: 1, name: "Alice Johnson", initials: "AJ" }, + { id: 2, name: "Bob Smith", initials: "BS" }, + { id: 3, name: "Charlie Brown", initials: "CB" }, + { id: 4, name: "David Wilson", initials: "DW" }, + { id: 5, name: "Eva Davis", initials: "ED" }, + { id: 6, name: "Frank Miller", initials: "FM" }, + { id: 7, name: "Grace Lee", initials: "GL" }, + { id: 8, name: "Hannah White", initials: "HW" }, + { id: 9, name: "Ian Green", initials: "IG" }, + { id: 10, name: "Jack Black", initials: "JB" }, +]; +``` + +## Step 3: Creating the Components + +### 3.1 Home Page Component + +Create a Home component that will render the UserList component. + +```ts copy +// app/page.tsx +import UserList from "@/components/UserList"; +import React from "react"; + +export default function Home() { + return ( +
+ +
+ ); +} +``` + +### 3.2 User List Component + +Create the UserList component to render the sortable list of users. + +```ts copy +// components/UserList.tsx +"use client"; +import { User, users } from "@/data/users"; +import { + DndContext, + DragEndEvent, + KeyboardSensor, + PointerSensor, + TouchSensor, + closestCenter, + useSensor, + useSensors, +} from "@dnd-kit/core"; +import { + SortableContext, + arrayMove, + sortableKeyboardCoordinates, + verticalListSortingStrategy, +} from "@dnd-kit/sortable"; +import React, { useState } from "react"; +import { SortableUser } from "./SortableUser"; + +export default function UserList() { + const [usersList, setUsersList] = useState(users); + + function onDragEnd(event: DragEndEvent) { + const { active, over } = event; + if (active.id === over?.id) { + return; + } + setUsersList((users) => { + const oldIndex = users.findIndex((user) => user.id === active.id); + const newIndex = users.findIndex((user) => user.id === over?.id); + return arrayMove(users, oldIndex, newIndex); + }); + } + + const sensors = useSensors( + useSensor(PointerSensor), + useSensor(TouchSensor), + useSensor(KeyboardSensor, { + coordinateGetter: sortableKeyboardCoordinates, + }) + ); + + return ( +
+

User List

+
    + + + {usersList.map((user: User) => ( + + ))} + + +
+
+ ); +} +``` + +### 3.3 Sortable User Component + +Create the SortableUser component to handle each user item in the list. + +```ts copy +// components/SortableUser.tsx +import { User } from "@/data/users"; +import { useSortable } from "@dnd-kit/sortable"; +import { CSS } from "@dnd-kit/utilities"; + +export function SortableUser({ user }: { user: User }) { + const { attributes, listeners, setNodeRef, transform, transition } = + useSortable({ id: user.id }); + + const style = { + transition, + transform: CSS.Transform.toString(transform), + }; + + return ( +
  • +
    + {user.initials} +
    +
    {user.name}
    +
  • + ); +} +``` + +### Explanation + +DndContext: The DndContext component from dnd-kit provides the context for drag and drop functionality. It handles events and sensors. +SortableContext: The SortableContext component wraps the list of items that should be sortable. It uses a strategy to define how the items should be sorted. +useSortable: The useSortable hook provides the necessary props and refs to make an item sortable. It returns attributes, listeners, and styling properties. +arrayMove: The arrayMove utility from dnd-kit helps in reordering the array when an item is dragged and dropped. From 9c9746dce89acb7d0a4f6b0be96520ad9e6c1e58 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Tue, 4 Jun 2024 07:22:49 +0300 Subject: [PATCH 029/101] added drag-n-drop --- pages/programming-tutorials/nextjs/drag-n-drop.mdx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pages/programming-tutorials/nextjs/drag-n-drop.mdx b/pages/programming-tutorials/nextjs/drag-n-drop.mdx index 1c26b577..34330d57 100644 --- a/pages/programming-tutorials/nextjs/drag-n-drop.mdx +++ b/pages/programming-tutorials/nextjs/drag-n-drop.mdx @@ -185,3 +185,9 @@ DndContext: The DndContext component from dnd-kit provides the context for drag SortableContext: The SortableContext component wraps the list of items that should be sortable. It uses a strategy to define how the items should be sorted. useSortable: The useSortable hook provides the necessary props and refs to make an item sortable. It returns attributes, listeners, and styling properties. arrayMove: The arrayMove utility from dnd-kit helps in reordering the array when an item is dragged and dropped. + +- setNoderef : This option specifies which component should be moved when dragging occurs. +- setActivatorNodeRef : This option indicates which element should be used as a reference to detect if the user is initiating a drag action. +- listeners : This option specifies which element should be able to listen to events such as clicks and drags. +- transform : This option is used to set up the necessary styles when an element is being moved due to the drag action. +- transition : This option is used to set up any animations that occur while the element is being moved. From 06fe4da3ec475c35aec45d94fb6e86f9c664861a Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Tue, 4 Jun 2024 08:03:58 +0300 Subject: [PATCH 030/101] added dnd kit --- pages/programming-tutorials/nextjs/drag-n-drop.mdx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/pages/programming-tutorials/nextjs/drag-n-drop.mdx b/pages/programming-tutorials/nextjs/drag-n-drop.mdx index 34330d57..6612ae53 100644 --- a/pages/programming-tutorials/nextjs/drag-n-drop.mdx +++ b/pages/programming-tutorials/nextjs/drag-n-drop.mdx @@ -179,6 +179,19 @@ export function SortableUser({ user }: { user: User }) { } ``` +### 3.4 Add CSS Custom Class to Sortable item + +```css copy +/* styles/globals.css */ +@tailwind base; +@tailwind components; +@tailwind utilities; + +.touch-action-none { + touch-action: none; +} +``` + ### Explanation DndContext: The DndContext component from dnd-kit provides the context for drag and drop functionality. It handles events and sensors. From e5896f895f8cac84feacc299b5dcf1280a42681f Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Thu, 6 Jun 2024 06:00:31 +0300 Subject: [PATCH 031/101] updated with cart --- pages/programming-tutorials/nextjs/redux.mdx | 197 +++++++++---------- 1 file changed, 89 insertions(+), 108 deletions(-) diff --git a/pages/programming-tutorials/nextjs/redux.mdx b/pages/programming-tutorials/nextjs/redux.mdx index 0601a7f8..25baa53b 100644 --- a/pages/programming-tutorials/nextjs/redux.mdx +++ b/pages/programming-tutorials/nextjs/redux.mdx @@ -173,40 +173,55 @@ export default Home; Create a productSlice.ts file in the src/store directory. ```ts copy +// src/store/cartSlice.ts // src/store/productSlice.ts import { createSlice, PayloadAction } from "@reduxjs/toolkit"; -interface Product { +interface CartItem { id: number; name: string; price: number; + image: string; } interface CartState { - products: Product[]; + cartItems: CartItem[]; } +// Safely retrieve cart items from localStorage +const getInitialCartItems = (): CartItem[] => { + try { + const storedCart = localStorage.getItem("cart"); + if (storedCart) { + return JSON.parse(storedCart); + } + } catch (error) { + console.error("Failed to parse cart items from localStorage", error); + } + return []; +}; + const initialState: CartState = { - products: [], + cartItems: getInitialCartItems(), }; -const productSlice = createSlice({ - name: "products", +const cartSlice = createSlice({ + name: "cart", initialState, reducers: { - addProduct: (state, action: PayloadAction) => { - state.products.push(action.payload); + addProductToCart: (state, action: PayloadAction) => { + state.cartItems.push(action.payload); }, - removeProduct: (state, action: PayloadAction) => { - state.products = state.products.filter( - (product) => product.id !== action.payload + removeProductFromCart: (state, action: PayloadAction) => { + state.cartItems = state.cartItems.filter( + (item) => item.id !== action.payload ); }, }, }); -export const { addProduct, removeProduct } = productSlice.actions; -export default productSlice.reducer; +export const { addProductToCart, removeProductFromCart } = cartSlice.actions; +export default cartSlice.reducer; ``` ### Updating the Store: @@ -216,13 +231,13 @@ Update store.ts to include the product reducer. ```ts copy // src/store/store.ts import { configureStore } from "@reduxjs/toolkit"; -import counterReducer from "./counterSlice"; -import productReducer from "./productSlice"; +import counterSlice from "./slices/counterSlice"; +import cartSlice from "./slices/cartSlice"; const store = configureStore({ reducer: { - counter: counterReducer, - products: productReducer, + counter: counterSlice, + cart: cartSlice, }, }); @@ -232,108 +247,74 @@ export type AppDispatch = typeof store.dispatch; export default store; ``` -### Fetching Products and Displaying Them: +### Fetching Cart Items and displaying them: -Create a Products component in the src/components directory. +In the Cart Page ```ts copy -// src/components/Products.tsx -import React, { useEffect, useState } from "react"; -import { useDispatch, useSelector } from "react-redux"; -import { RootState } from "../store/store"; -import { addProduct, removeProduct } from "../store/productSlice"; - -interface Product { - id: number; - name: string; - price: number; -} - -const Products: React.FC = () => { - const [products, setProducts] = useState([]); - const dispatch = useDispatch(); - const cartProducts = useSelector( - (state: RootState) => state.products.products - ); - - useEffect(() => { - // Fetch products from an API or local data - const fetchProducts = async () => { - const response = await fetch("/api/products"); - const data = await response.json(); - setProducts(data); - }; - - fetchProducts(); - }, []); - - const handleAddToCart = (product: Product) => { - dispatch(addProduct(product)); - localStorage.setItem("cart", JSON.stringify([...cartProducts, product])); - }; +// app/cart +"use client"; +import { Button } from "@/components/ui/button"; +import { useAppDispatch, useAppSelector } from "@/store/hooks/hooks"; +import { removeProductFromCart } from "@/store/slices/cartSlice"; +import { Trash } from "lucide-react"; +import Image from "next/image"; +import React from "react"; - const handleRemoveFromCart = (productId: number) => { - dispatch(removeProduct(productId)); +export default function page() { + const cartItems = useAppSelector((state) => state.cart.cartItems); + console.log(cartItems); + const dispatch = useAppDispatch(); + function handleRemove(id: number) { + dispatch(removeProductFromCart(id)); localStorage.setItem( "cart", - JSON.stringify(cartProducts.filter((product) => product.id !== productId)) + JSON.stringify(cartItems.filter((product) => product.id !== id)) ); - }; - - return ( -
    -

    Products

    -
      - {products.map((product) => ( -
    • - {product.name} - ${product.price} - - -
    • - ))} -
    -

    Cart

    -
      - {cartProducts.map((product) => ( -
    • - {product.name} - ${product.price} - -
    • - ))} -
    -
    - ); -}; - -export default Products; -``` - -### Using the Products Component: - -Add the Products component to the index.tsx page. - -```ts copy -// src/pages/index.tsx -import Counter from "../components/Counter"; -import Products from "../components/Products"; - -const Home = () => { + } return ( -
    -

    Redux Counter and Add to Cart Example

    - - +
    +
    +

    Shopping Cart ({cartItems.length})

    + {cartItems.length > 0 ? ( +
    + {cartItems.map((product) => { + return ( +
    +
    + calcium +

    {product.name}

    +

    + ${product.price} +

    +
    + +
    + ); + })} +
    + ) : ( +
    +

    No Items in Cart

    +
    + )} +
    ); -}; - -export default Home; +} ``` From 96f8c1bdbc2f7368851827a9519e3bd6dd24962a Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Thu, 6 Jun 2024 06:09:39 +0300 Subject: [PATCH 032/101] updated with cart --- pages/programming-tutorials/nextjs/redux.mdx | 81 +++++++++++++++++++- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git a/pages/programming-tutorials/nextjs/redux.mdx b/pages/programming-tutorials/nextjs/redux.mdx index 25baa53b..a3253a35 100644 --- a/pages/programming-tutorials/nextjs/redux.mdx +++ b/pages/programming-tutorials/nextjs/redux.mdx @@ -169,12 +169,11 @@ export default Home; ## Implementing Redux with an Add to Cart Example - ### Setting Up Product Slice: -Create a productSlice.ts file in the src/store directory. + ### Setting Up Cart Slice: +Create a cartSlice.ts file in the /store directory. ```ts copy // src/store/cartSlice.ts -// src/store/productSlice.ts import { createSlice, PayloadAction } from "@reduxjs/toolkit"; interface CartItem { @@ -247,6 +246,82 @@ export type AppDispatch = typeof store.dispatch; export default store; ``` +### Adding Item to CART in the Product Component + +```ts copy +"use client"; +import Image from "next/image"; +import React, { useEffect, useState } from "react"; +import { Button } from "./ui/button"; +import { ShoppingBag } from "lucide-react"; +import { IProduct, type Product } from "@/types/types"; +import { useAppDispatch, useAppSelector } from "@/store/hooks/hooks"; +import { + addProductToCart, + removeProductFromCart, +} from "@/store/slices/cartSlice"; +import toast from "react-hot-toast"; + +export default function Product({ product }: { product: IProduct }) { + const [existing, setExisting] = useState(false); + const cartItems = useAppSelector((state) => state.cart.cartItems); + + useEffect(() => { + // Check if the product already exists in the cart + const isExisting = cartItems.some((item) => item.id === product.id); + setExisting(isExisting); + }, [cartItems, product.id]); + + const dispatch = useAppDispatch(); + function handleAdd() { + const newCartItem = { + id: product.id, + image: product.images[0], + name: product.title, + price: product.price, + }; + dispatch(addProductToCart(newCartItem)); + localStorage.setItem("cart", JSON.stringify([...cartItems, newCartItem])); + toast.success("Item added successfully"); + } + const handleRemove = (productId: number) => { + dispatch(removeProductFromCart(productId)); + localStorage.setItem( + "cart", + JSON.stringify(cartItems.filter((product) => product.id !== productId)) + ); + }; + return ( +
    + calcium +

    {product.title}

    +

    ${product.price}

    + + {existing ? ( + + ) : ( + + )} +
    + ); +} +``` + ### Fetching Cart Items and displaying them: In the Cart Page From f1c7b44d27bc2e5062c735ac1e9d3c0eb8daaf1b Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Mon, 17 Jun 2024 05:29:57 +0300 Subject: [PATCH 033/101] added nuka --- pages/programming-tutorials/nextjs/_meta.json | 1 + pages/programming-tutorials/nextjs/addons.mdx | 66 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 pages/programming-tutorials/nextjs/addons.mdx diff --git a/pages/programming-tutorials/nextjs/_meta.json b/pages/programming-tutorials/nextjs/_meta.json index ebd45429..353f6526 100644 --- a/pages/programming-tutorials/nextjs/_meta.json +++ b/pages/programming-tutorials/nextjs/_meta.json @@ -1,6 +1,7 @@ { "next-intro": "Introduction to Next.js ", "get-started": "Get Started with Next Js ", + "addons": "Useful Addons in Next Js", "charts": "Charts", "redux": "Redux Toolkit", "excel": "Import Data from Excel", diff --git a/pages/programming-tutorials/nextjs/addons.mdx b/pages/programming-tutorials/nextjs/addons.mdx new file mode 100644 index 00000000..9d64563d --- /dev/null +++ b/pages/programming-tutorials/nextjs/addons.mdx @@ -0,0 +1,66 @@ +## Nuka Carousel + +## Installation + +```bash copy + npm install nuka-carousel + +``` + +## Basic usage + +```ts copy +import { Carousel } from "nuka-carousel"; + +const App = () => { + return ( + +
    Slide 1
    +
    Slide 2
    +
    Slide 3
    +
    + ); +}; +``` + +## Configure Nuka Component + +```ts copy +"use client"; +import { ChevronLeft, ChevronRight } from "lucide-react"; +import Image from "next/image"; +import Link from "next/link"; +import Carousel from "nuka-carousel"; + +export default function HeroCarousel({ banners }) { + const config = { + nextButtonClassName: "rounded-full", + nextButtonText: , + pagingDotsClassName: "me-2 w-4 h-4", + prevButtonClassName: "rounded-full", + prevButtonText: , + }; + return ( + + {banners.map((banner, i) => { + return ( + + {banner.title} + + ); + })} + + ); +} +``` From 08c4663ae14f70d2fed7338f8640f3da7623c557 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Mon, 17 Jun 2024 05:40:47 +0300 Subject: [PATCH 034/101] added nuka --- pages/programming-tutorials/nextjs/addons.mdx | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) diff --git a/pages/programming-tutorials/nextjs/addons.mdx b/pages/programming-tutorials/nextjs/addons.mdx index 9d64563d..0f6e3b90 100644 --- a/pages/programming-tutorials/nextjs/addons.mdx +++ b/pages/programming-tutorials/nextjs/addons.mdx @@ -64,3 +64,149 @@ export default function HeroCarousel({ banners }) { ); } ``` + +## React Multi Carousel + +### Installation + +```bash copy +npm i react-multi-carousel +``` + +## The Ovaerall Component + +```ts copy +import Link from "next/link"; +import React from "react"; +import CategoryCarousel from "./CategoryCarousel"; + +export default function CategoryList({ category, isMarketPage }) { + return ( +
    +
    +

    {category.title}

    + + See All + +
    +
    + +
    +
    + ); +} +``` + +### The Carouse Component + +```ts copy +"use client"; +import { BaggageClaim } from "lucide-react"; +import Image from "next/image"; +import Link from "next/link"; +import React from "react"; +import Carousel from "react-multi-carousel"; +import "react-multi-carousel/lib/styles.css"; +import Product from "./Product"; +export default function CategoryCarousel({ products, isMarketPage = false }) { + const responsive = { + desktop: { + breakpoint: { max: 3000, min: 1024 }, + items: isMarketPage ? 3 : 4, + slidesToSlide: 3, // optional, default to 1. + }, + tablet: { + breakpoint: { max: 1024, min: 464 }, + items: isMarketPage ? 2 : 3, + slidesToSlide: 2, // optional, default to 1. + }, + mobile: { + breakpoint: { max: 464, min: 0 }, + items: 2, + slidesToSlide: 1, // optional, default to 1. + }, + }; + return ( + + {products.map((product, i) => { + return ; + })} + + ); +} +``` + +### The Product Component + +```ts copy +"use client"; +import { addToCart } from "@/redux/slices/cartSlice"; +import { BaggageClaim } from "lucide-react"; +import Image from "next/image"; +import Link from "next/link"; +import React from "react"; +import toast from "react-hot-toast"; +import { useDispatch } from "react-redux"; + +export default function Product({ product }) { + const dispatch = useDispatch(); + function handleAddToCart() { + // Dispatch the reducer + dispatch(addToCart(product)); + toast.success("Item added Successfully"); + } + return ( +
    + + {product.title} + +
    + +

    + {product.title} +

    + +
    +

    UGX {product.salePrice}

    + +
    +
    +
    + ); +} +``` From 38a8a24b6e5bf20f26fc7174e76e50247fe048bd Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Tue, 18 Jun 2024 07:47:29 +0300 Subject: [PATCH 035/101] modified nuka v --- pages/programming-tutorials/nextjs/addons.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pages/programming-tutorials/nextjs/addons.mdx b/pages/programming-tutorials/nextjs/addons.mdx index 0f6e3b90..b68a2ea0 100644 --- a/pages/programming-tutorials/nextjs/addons.mdx +++ b/pages/programming-tutorials/nextjs/addons.mdx @@ -3,8 +3,7 @@ ## Installation ```bash copy - npm install nuka-carousel - + npm i nuka-carousel@7.0.0 ``` ## Basic usage From fec65e5e169e115d07f0f825d717437840038f2e Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Wed, 19 Jun 2024 14:03:14 +0300 Subject: [PATCH 036/101] added stripe --- pages/programming-tutorials/nextjs/stripe.mdx | 388 +++++++++++++++++- 1 file changed, 378 insertions(+), 10 deletions(-) diff --git a/pages/programming-tutorials/nextjs/stripe.mdx b/pages/programming-tutorials/nextjs/stripe.mdx index 289c3fdd..b6d3c98a 100644 --- a/pages/programming-tutorials/nextjs/stripe.mdx +++ b/pages/programming-tutorials/nextjs/stripe.mdx @@ -1,24 +1,23 @@ -# Complete Stripe Guide in Next Js +# Quick Stripe Guide in Next Js Ecommerce ## Getting started with Next.js, TypeScript, and Stripe Checkout -### Step 1: Setting Up a TypeScript Project with Next.js +### Step 1: Clone Git Repository -Setting up a TypeScript project with Next.js is very convenient, as it automatically generates the tsconfig.json configuration file for you. +Start by clone this git repository to simplify the product set up in the store. In the starter Code already have the Cart Functionality with redux. ```bash copy - npx create-next-app@latest +git clone https://github.com/MUKE-coder/nextjs-ecom-redux-starter.git ``` Follow the Prompts and add typescript -### Managing API Keys with Next.js & Vercel +### ADD STRIPE SECRET KEY TO YOUR APP -#### Create .env file and add the Keys +Create .env file and add the secret Key ``` # Stripe keys -NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_12345 STRIPE_SECRET_KEY=sk_12345 ``` @@ -41,10 +40,379 @@ To add Checkout to a Next.js app, you'll need to: First, [sign up for a Stripe account](https://stripe.com/signup). Stripe offers test data and API keys to build out your integration during development. -#### Install the Stripe SDK +#### Install Stripe ```bash copy - npm install @stripe/stripe-js + npm install stripe ``` -This installs the official Stripe JS SDK. +## Create 2 Important Components + +- Create the Cart Page or Cart Modal or Checkout Page , this is page where the checkout session will be initiated . In my case i am initiating from Cart page + +### Cart Component + +```ts copy +"use client"; +import { Button } from "@/components/ui/button"; + +import { + Sheet, + SheetClose, + SheetContent, + SheetDescription, + SheetFooter, + SheetHeader, + SheetTitle, + SheetTrigger, +} from "@/components/ui/sheet"; +import { useAppDispatch, useAppSelector } from "@/store/hooks/hooks"; +import { + removeAllProductsFromCart, + removeProductFromCart, +} from "@/store/slices/cartSlice"; +import { url } from "inspector"; +import { + Headset, + HelpCircle, + Loader2, + LogOut, + Mail, + MessageSquareMore, + Minus, + PhoneCall, + Plus, + Presentation, + Settings, + ShoppingCart, + Trash, + User, + UserRound, +} from "lucide-react"; +import Image from "next/image"; +import Link from "next/link"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; + +export function CartMenu() { + const router = useRouter(); + const [loading, setLoading] = useState(false); + async function checkout() { + const baseUrl = process.env.NEXT_PUBLIC_BASE_URL; + setLoading(true); + try { + const response = await fetch(`${baseUrl}/api/checkout`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ products: cartItems }), + }); + + const data = await response.json(); + console.log(data); + + if (data?.url) { + // console.log(response.url); + const url = data?.url; + setLoading(false); + console.log(url); + dispatch(removeAllProductsFromCart()); + window.location.href = url; + // router.replace(url); + } + } catch (error) { + console.error("Error:", error); + setLoading(false); + } + } + const cartItems = useAppSelector((state) => state.cart.cartItems); + console.log(cartItems); + const dispatch = useAppDispatch(); + function handleRemove(id: number) { + dispatch(removeProductFromCart(id)); + } + const totalSum = cartItems.reduce( + (sum, item) => sum + item.price * item.qty, + 0 + ); + return ( + + + + + {cartItems && cartItems.length > 0 ? ( + + +

    + Shopping Cart ({cartItems.length}) +

    +
    + {/* CONTENT HWRE */} +
    + {cartItems.map((item, i) => { + return ( +
    + cart image +
    +

    {item.name}

    + +
    +
    +

    ${item.price}

    +
    + + +

    1

    + +
    +
    +
    + ); + })} + +
    +
    +

    Total

    +

    ${totalSum.toFixed(2)}

    +
    +
    +
    + + {!loading && ( + + + + )} + {loading ? ( + + ) : ( + + )} + +
    + ) : ( + + +

    + Empty Cart +

    +
    + {/* CONTENT HWRE */} +
    + empty cart +

    Your Cart Empty

    + + + +
    +
    + )} +
    + ); +} +``` + +- Create the checkout api route, that will handle the Checkout request by the client + +### The Checkout Api Route + +````ts copy +import { CheckoutProductProps } from "@/types/types"; +import { NextRequest, NextResponse } from "next/server"; +const stripe = require("stripe")(process.env.STRIPE_SECRET_KEY); + +async function getActiveProducts() { + const stripeProducts = await stripe.products.list(); + const activeProducts = stripeProducts.data.filter( + (item: any) => item.active === true + ); + return activeProducts; +} +export async function POST(request: NextRequest) { + try { + const { products } = await request.json(); + const checkoutProducts: CheckoutProductProps[] = products; + // Creating Stripe Non existing Stripe Products + let activeProducts = await getActiveProducts(); + try { + for (const product of checkoutProducts) { + const stripeProduct = activeProducts?.find( + (stripeProduct: any) => + stripeProduct?.name?.toLowerCase() === product?.name?.toLowerCase() + ); + + if (stripeProduct === undefined) { + const unitAmount = Math.round(product.price * 100); + + const prod = await stripe.products.create({ + name: product.name, + default_price_data: { + unit_amount: unitAmount, + currency: "usd", + }, + images: [product.image], + }); + console.log(`Product created: ${prod.name}`); + } else { + console.log("Product already exists"); + } + } + } catch (error) { + console.error("Error creating products:", error); + } + + //Creating Checkout Stripe Items + activeProducts = await getActiveProducts(); + let checkoutStripeProducts: any = []; + for (const product of checkoutProducts) { + const stripeProduct = activeProducts?.find( + (stripeProduct: any) => + stripeProduct?.name?.toLowerCase() === product?.name?.toLowerCase() + ); + + if (stripeProduct) { + checkoutStripeProducts.push({ + price: stripeProduct?.default_price, + quantity: product.qty, + }); + } + } + + //Creating Checkout Session + const baseUrl = process.env.NEXT_PUBLIC_BASE_URL; + console.log(checkoutStripeProducts); + const session = await stripe.checkout.sessions.create({ + line_items: checkoutStripeProducts, + mode: "payment", + success_url: `${baseUrl}/success`, + cancel_url: `${baseUrl}/cancel`, + }); + console.log(session?.url); + return NextResponse.json({ + url: session?.url, + }); + } catch (error) { + console.log(error); + } +} +```ts copy + +### The Cancel Page + +```` + +import React from "react"; + +export default function page() { + return ( +
    +
    +
    + + + +
    +

    + Order Cancelled +

    +

    Your order has been cancelled.

    + +
    +
    + ); +} + +```` + +### The success Page + +```ts copy +import React from "react"; + +export default function page() { + return ( +
    +
    +
    + + + +
    +

    + Order Successful +

    +

    Thank you so much for your order.

    + +
    +
    + ); +} + +```` From 9940cf71032159b77d03533798a43863810744fe Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Wed, 19 Jun 2024 15:47:06 +0300 Subject: [PATCH 037/101] added stripe --- pages/programming-tutorials/nextjs/stripe.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/programming-tutorials/nextjs/stripe.mdx b/pages/programming-tutorials/nextjs/stripe.mdx index b6d3c98a..3edba6b8 100644 --- a/pages/programming-tutorials/nextjs/stripe.mdx +++ b/pages/programming-tutorials/nextjs/stripe.mdx @@ -336,11 +336,12 @@ export async function POST(request: NextRequest) { console.log(error); } } + ```ts copy ### The Cancel Page -```` +```ts copy import React from "react"; @@ -414,5 +415,4 @@ export default function page() {
    ); } - -```` +``` From 298c251419fb182880e9ade8a493aa6c53d5a720 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Thu, 27 Jun 2024 09:04:25 +0300 Subject: [PATCH 038/101] added novel --- pages/programming-tutorials/nextjs/_meta.json | 1 + pages/programming-tutorials/nextjs/novel.mdx | 183 ++++++++++++++++++ 2 files changed, 184 insertions(+) create mode 100644 pages/programming-tutorials/nextjs/novel.mdx diff --git a/pages/programming-tutorials/nextjs/_meta.json b/pages/programming-tutorials/nextjs/_meta.json index 353f6526..30da8e3e 100644 --- a/pages/programming-tutorials/nextjs/_meta.json +++ b/pages/programming-tutorials/nextjs/_meta.json @@ -9,6 +9,7 @@ "drag-n-drop": "Drag and Drop", "stripe": "Stripe Complete Guide", "next-routing": "Routing in Next.js", + "novel": "Novel Editor", "next-state": "State Management in Next.js", "next-data-fetching": "Asynchronous JavaScript", "next-seo": "SEO in Next JS", diff --git a/pages/programming-tutorials/nextjs/novel.mdx b/pages/programming-tutorials/nextjs/novel.mdx new file mode 100644 index 00000000..e1745592 --- /dev/null +++ b/pages/programming-tutorials/nextjs/novel.mdx @@ -0,0 +1,183 @@ +# Novel Editor v1 Setup + +[Novel](https://github.com/steven-tey/novel) is a Notion-style WYSIWYG editor with AI-powered autocompletion. Built with [Tiptap](https://tiptap.dev/) + [Vercel AI SDK](https://sdk.vercel.ai/docs). + +### Installation + +Novel has been updated to newer versions but to follow along install the "novel": "^0.1.22", version: +Checkout the documentation for the latest version : +[Novel docs](https://novel.sh/docs/introduction) + +```bash copy +npm i novel@0.1.22 +``` + +### Basic Usage + +```ts copy +import { Editor } from "novel"; + +export default function App() { + return ; +} +``` + +### Advanced Usage + +#### Create a component to dispay the editor + +```ts copy +import NovelEditor from "@/components/global/FormInputs/NovelEditor"; + +export default function App() { + const [content, setContent] = useState(initialContent); + return ( +
    + +
    + ); +} +``` + +#### Create the NovelEditor Component + +```ts copy +import React from "react"; +import { Editor } from "novel"; +import { type Editor as TipTapEditor } from "@tiptap/core"; +import { Card, CardContent } from "@/components/ui/card"; + +type NovelEditorProps = { + setContent: any; + title: string; + content: string | undefined; +}; +export default function NovelEditor({ + setContent, + content, + title, +}: NovelEditorProps) { + return ( + + +

    {title}

    + { + setContent(editor?.getHTML()); + }} + disableLocalStorage={true} + className="rounded-md border shadow-none" + /> +
    +
    + ); +} +``` + +#### Render the HTML + +```bash copy +npm i html-react-parser + +``` + +### Create the Component to render the parsed html + +```ts copy +"use client"; +import React from "react"; +import parse from "html-react-parser"; +export default function ProductContent({ + codeString, +}: { + codeString: string | null | undefined; +}) { + return
    {parse(`${codeString}`)}
    ; +} +``` + +### Add the Styles to rendered html + +```css copy +.parsed-html h1 { + @apply text-2xl font-bold my-4; +} + +.parsed-html h2 { + @apply text-xl font-bold my-4; +} + +.parsed-html h3 { + @apply text-lg font-bold my-4; +} + +.parsed-html h4 { + @apply text-base font-bold my-4; +} + +.parsed-html p { + @apply text-base leading-relaxed my-2; +} + +.parsed-html img { + @apply max-w-full h-auto my-4 block; +} + +.parsed-html code { + @apply bg-gray-100 px-2 py-1 rounded font-mono; +} + +.parsed-html ul { + @apply list-disc my-4 pl-8; +} + +.parsed-html ul li { + @apply my-2; +} + +.parsed-html ol { + @apply list-decimal my-4 pl-8; +} + +.parsed-html ol li { + @apply my-2; +} + +.parsed-html blockquote { + @apply border-l-4 border-gray-300 pl-4 my-4 text-gray-600 italic; +} + +.parsed-html pre { + @apply bg-gray-100 p-4 rounded overflow-x-auto font-mono; +} + +.parsed-html a { + @apply text-blue-600 no-underline hover:underline; +} + +.parsed-html table { + @apply border-collapse w-full my-4; +} + +.parsed-html th, +.parsed-html td { + @apply border border-gray-300 px-2 py-1 text-left; +} + +.parsed-html th { + @apply bg-gray-100 font-bold; +} + +/* .novel-list-disc { + list-style: circle; +} */ +``` From 2909e083bc3d161200168eb98b384e15c6352751 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Fri, 28 Jun 2024 05:14:04 +0300 Subject: [PATCH 039/101] added pagination --- pages/programming-tutorials/nextjs/_meta.json | 1 + .../nextjs/ecommerce.mdx | 106 ++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 pages/programming-tutorials/nextjs/ecommerce.mdx diff --git a/pages/programming-tutorials/nextjs/_meta.json b/pages/programming-tutorials/nextjs/_meta.json index 30da8e3e..58b50928 100644 --- a/pages/programming-tutorials/nextjs/_meta.json +++ b/pages/programming-tutorials/nextjs/_meta.json @@ -10,6 +10,7 @@ "stripe": "Stripe Complete Guide", "next-routing": "Routing in Next.js", "novel": "Novel Editor", + "ecommerce": "Ecommerce Snippets", "next-state": "State Management in Next.js", "next-data-fetching": "Asynchronous JavaScript", "next-seo": "SEO in Next JS", diff --git a/pages/programming-tutorials/nextjs/ecommerce.mdx b/pages/programming-tutorials/nextjs/ecommerce.mdx new file mode 100644 index 00000000..b8797cbe --- /dev/null +++ b/pages/programming-tutorials/nextjs/ecommerce.mdx @@ -0,0 +1,106 @@ +# Ecommerce Pagination + +Am using Shads Pagination component: [here in docs](https://ui.shadcn.com/docs/components/pagination) + +### Pagination Componet + +```ts copy +"use client"; + +import React from "react"; +import { + Pagination, + PaginationContent, + PaginationEllipsis, + PaginationItem, + PaginationLink, + PaginationNext, + PaginationPrevious, +} from "@/components/ui/pagination"; +import { useSearchParams } from "next/navigation"; + +export default function Paginate({ totalPages }) { + const searchParams = useSearchParams(); + const sort = searchParams.get("sort") || "asc"; + const min = searchParams.get("min") || 0; + const max = searchParams.get("max") || ""; + const currentPage = parseInt(searchParams.get("page")) || 1; + + return ( + + + + + + {totalPages <= 3 ? ( + Array.from({ length: totalPages }, (_, index) => ( + + + {index + 1} + + + )) + ) : ( + <> + {Array.from({ length: 3 }, (_, index) => ( + + + {index + 1} + + + ))} + + + + + )} + + + + + + ); +} +``` From 4443eed0e248506a8d687887d4ac319a3951a031 Mon Sep 17 00:00:00 2001 From: MUKE-coder Date: Wed, 10 Jul 2024 07:07:47 +0300 Subject: [PATCH 040/101] added resusable comps --- pages/programming-tutorials/nextjs/_meta.json | 1 + .../nextjs/reuseable.mdx | 1143 +++++++++++++++++ 2 files changed, 1144 insertions(+) create mode 100644 pages/programming-tutorials/nextjs/reuseable.mdx diff --git a/pages/programming-tutorials/nextjs/_meta.json b/pages/programming-tutorials/nextjs/_meta.json index 58b50928..10a48e4c 100644 --- a/pages/programming-tutorials/nextjs/_meta.json +++ b/pages/programming-tutorials/nextjs/_meta.json @@ -2,6 +2,7 @@ "next-intro": "Introduction to Next.js ", "get-started": "Get Started with Next Js ", "addons": "Useful Addons in Next Js", + "reuseable": "Re-Useable Components", "charts": "Charts", "redux": "Redux Toolkit", "excel": "Import Data from Excel", diff --git a/pages/programming-tutorials/nextjs/reuseable.mdx b/pages/programming-tutorials/nextjs/reuseable.mdx new file mode 100644 index 00000000..334a4c24 --- /dev/null +++ b/pages/programming-tutorials/nextjs/reuseable.mdx @@ -0,0 +1,1143 @@ +import { Tabs } from "nextra/components"; + +## Re-Usable Componensts + +These are some of my re-usable components + +## General Installation + +Install shadcn and Darkmode + +```bash copy + npx shadcn-ui@latest init + npm i lucide-react +``` + +Install Dark Mode here : [Shadcn Guide](https://ui.shadcn.com/docs/dark-mode/next) + +## React Quill Editor + + + + ```bash copy + npm i react-quill + ``` + + + ```ts copy + "use client"; + import React from "react"; + import ReactQuill from "react-quill"; + import "react-quill/dist/quill.snow.css"; + export default function QuillEditor({ + label, + className = "sm:col-span-2", + value, + onChange, + }: { + label: string; + className: string; + value: any; + onChange: any; + }) { + const modules = { + toolbar: [ + [{ header: [1, 2, false] }], + ["bold", "italic", "underline", "strike", "blockquote"], + [{ list: "ordered" }, { list: "bullet" }], + ["link", "color", "image"], + [{ "code-block": true }], + ["clean"], + ], + }; + const formats = [ + "header", + "bold", + "italic", + "underline", + "strike", + "blockquote", + "list", + "bullet", + "link", + "indent", + "image", + "code-block", + "color", + ]; + return ( +
    + + +
    + ); + } +``` + +
    + + ```ts copy + import dynamic from "next/dynamic"; + const QuillEditor = dynamic( + () => import("@/components/FormInputs/QuillEditor"), + { + ssr: false, + } + ); + const [content, setContent] = useState(initialContent); + +``` + + +
    + +## Form Select Input + + + + ```bash copy + npm i react-tailwindcss-select + ``` + + + ```ts copy +"use client"; +import AddNewButton from "@/components/AddNewButton"; +import React, { useState } from "react"; +import Select from "react-tailwindcss-select"; +import { Option, Options } from "react-tailwindcss-select/dist/components/type"; +type FormSelectInputProps = { + options: Options; + label: string; + option: Option; + setOption: any; + href?: string; + labelShown?: boolean; + toolTipText?: string; +}; +export default function FormSelectInput({ + options, + label, + option, + setOption, + href, + toolTipText, + labelShown = true, +}: FormSelectInputProps) { + return ( +
    + {labelShown && ( +

    + Select {label} +

    + )} +
    + + {unit && ( +

    + {unit} +

    + )} +
    + {errors[`${name}`] && ( + {label} is required + )} +
    + + ); +} +``` +
    + + ```ts copy +
    + +
    + ``` + +
    +
    + +## Textarea + + + Install Tailwind forms Plugin + + ```ts copy + import { cn } from "@/lib/utils"; +import React from "react"; +type TextAreaProps = { + register: any; + errors: any; + label: string; + name: string; + helperText?: string; +}; +export default function TextArea({ + register, + errors, + label, + name, + helperText = "", +}: TextAreaProps) { + return ( +
    + +
    + + +``` + +```bash copy filename="Css" +textarea { + width: 100%; + padding: 10px; + margin: 5px 0 20px 0; + display: inline-block; + border: 1px solid #ccc; + border-radius: 4px; + box-sizing: border-box; +} +``` + +#### 4) Checkbox + +Used for selecting one or more options + +```bash copy filename="Html" + + + + + +``` + +#### 5) Radio Button + +Used for selecting one option from a set. + +```bash copy filename="Html" + + + + + + + +``` + +#### 6) Select Dropdown + +Used for selecting one option from a dropdown list + +```bash copy filename="Html" + + + +``` + +```bash copy filename="Css" + +select { + width: 100%; + padding: 10px; + margin: 5px 0 20px 0; + display: inline-block; + border: 1px solid #ccc; + border-radius: 4px; + box-sizing: border-box; +} + + +``` + +#### 7) Button + +Used for submitting forms or triggering actions + +```bash copy filename="Html" + + + +``` + +```bash copy filename="Css" + +button { + background-color: #4CAF50; + color: white; + padding: 15px 20px; + margin: 5px 0; + border: none; + border-radius: 4px; + cursor: pointer; +} + +button:hover { + background-color: #45a049; +} + + +``` + +** Form Example** + +```bash copy filename="Html" + + + + + +``` + + + Styling forms with CSS enhances the user experience by making forms more + visually appealing and easier to use. By understanding and applying various + CSS properties, you can create beautiful and responsive forms that fit + seamlessly into your web design + diff --git a/pages/programming-tutorials/html-and-css/css-fundamentals.mdx b/pages/programming-tutorials/html-and-css/css-fundamentals.mdx index cc4eb0ca..7f6d5dfa 100644 --- a/pages/programming-tutorials/html-and-css/css-fundamentals.mdx +++ b/pages/programming-tutorials/html-and-css/css-fundamentals.mdx @@ -15,7 +15,7 @@ CSS rules are composed of selectors and declaration blocks. The selector points **Declaration Block:** Contains one or more declarations separated by semicolons -```bash copy +```bash copy filename="Css" p { color: blue; font-size: 16px; @@ -31,7 +31,7 @@ When learning CSS, it's important to understand the three main ways to apply sty Description: Inline CSS involves adding style directly within an HTML element using the style attribute. This method is useful for applying unique styles to a single element. - ```bash copy + ```bash copy filename="Html"

    This is an inline styled paragraph.

    @@ -44,7 +44,7 @@ other parts of the document Description: Internal CSS involves placing CSS rules within the style tag inside the head section of an HTML document. This method allows you to style the entire document without creating an external file - ```bash copy + ```bash copy filename="Html & Css"