You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by la...@apache.org on 2025/03/27 16:28:06 UTC

(airavata) branch cybershuttle-dev updated: Initial research-framework portal

This is an automated email from the ASF dual-hosted git repository.

lahirujayathilake pushed a commit to branch cybershuttle-dev
in repository https://gitbox.apache.org/repos/asf/airavata.git


The following commit(s) were added to refs/heads/cybershuttle-dev by this push:
     new 4f2f07f112 Initial research-framework portal
4f2f07f112 is described below

commit 4f2f07f1120331dd386882769fbf0b57cc0a55dc
Author: Ganning Xu <ga...@gmail.com>
AuthorDate: Thu Mar 27 12:28:01 2025 -0400

    Initial research-framework portal
    
    * initial portal w/mock data
    
    * portal ui updates
---
 .gitignore                                         |    1 +
 portal/.gitignore                                  |   24 +
 portal/README.md                                   |   54 +
 portal/eslint.config.js                            |   28 +
 portal/index.html                                  |   13 +
 portal/package-lock.json                           | 3936 ++++++++++++++++++++
 portal/package.json                                |   40 +
 portal/public/vite.svg                             |    1 +
 portal/src/App.tsx                                 |   41 +
 portal/src/assets/airavata-logo.png                |  Bin 0 -> 14892 bytes
 portal/src/assets/react.svg                        |    1 +
 portal/src/components/GridContainer.tsx            |   17 +
 portal/src/components/Metadata.tsx                 |   66 +
 portal/src/components/NavBar.tsx                   |   58 +
 portal/src/components/PageHeader.tsx               |   28 +
 portal/src/components/datasets/DatasetCard.tsx     |   70 +
 portal/src/components/datasets/DatasetDetails.tsx  |   54 +
 portal/src/components/datasets/index.tsx           |   42 +
 portal/src/components/home/AddRepositoryButton.tsx |  125 +
 portal/src/components/home/AddZipButton.tsx        |  113 +
 portal/src/components/home/ButtonWithIcon.tsx      |   22 +
 portal/src/components/home/ProjectCard.tsx         |   84 +
 portal/src/components/home/ProjectsSection.tsx     |   28 +
 portal/src/components/home/SessionCard.tsx         |   71 +
 portal/src/components/home/SessionsSection.tsx     |   17 +
 portal/src/components/home/index.tsx               |   61 +
 portal/src/components/models/ModelCard.tsx         |   34 +
 portal/src/components/models/ModelDetails.tsx      |   96 +
 portal/src/components/models/index.tsx             |   40 +
 portal/src/components/notebooks/NotebookCard.tsx   |   64 +
 portal/src/components/notebooks/ProjectDetails.tsx |   98 +
 portal/src/components/notebooks/index.tsx          |   55 +
 .../src/components/repositories/RepositoryCard.tsx |   39 +
 portal/src/components/repositories/index.tsx       |   39 +
 portal/src/components/ui/color-mode.tsx            |  107 +
 portal/src/components/ui/input-group.tsx           |   53 +
 portal/src/components/ui/provider.tsx              |   12 +
 portal/src/data/MOCK_DATA.js                       |  555 +++
 portal/src/interfaces/AuthorType.tsx               |    5 +
 portal/src/interfaces/DatasetType.tsx              |    7 +
 portal/src/interfaces/MetadataType.tsx             |   14 +
 portal/src/interfaces/ModelType.tsx                |   10 +
 portal/src/interfaces/ProjectType.tsx              |    7 +
 portal/src/interfaces/SessionType.tsx              |   11 +
 portal/src/main.tsx                                |   12 +
 portal/src/vite-env.d.ts                           |    1 +
 portal/tsconfig.app.json                           |   29 +
 portal/tsconfig.json                               |    7 +
 portal/tsconfig.node.json                          |   24 +
 portal/vite.config.ts                              |    8 +
 50 files changed, 6322 insertions(+)

diff --git a/.gitignore b/.gitignore
index a350a1a60e..71baddad9a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -50,3 +50,4 @@ airavata-local-agent/renderer/.next
 airavata-local-agent/dist
 
 logs
+airavata-local-agent/build.sh
diff --git a/portal/.gitignore b/portal/.gitignore
new file mode 100644
index 0000000000..54f07af58b
--- /dev/null
+++ b/portal/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
\ No newline at end of file
diff --git a/portal/README.md b/portal/README.md
new file mode 100644
index 0000000000..40ede56ea6
--- /dev/null
+++ b/portal/README.md
@@ -0,0 +1,54 @@
+# React + TypeScript + Vite
+
+This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
+
+Currently, two official plugins are available:
+
+- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
+- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
+
+## Expanding the ESLint configuration
+
+If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
+
+```js
+export default tseslint.config({
+  extends: [
+    // Remove ...tseslint.configs.recommended and replace with this
+    ...tseslint.configs.recommendedTypeChecked,
+    // Alternatively, use this for stricter rules
+    ...tseslint.configs.strictTypeChecked,
+    // Optionally, add this for stylistic rules
+    ...tseslint.configs.stylisticTypeChecked,
+  ],
+  languageOptions: {
+    // other options...
+    parserOptions: {
+      project: ['./tsconfig.node.json', './tsconfig.app.json'],
+      tsconfigRootDir: import.meta.dirname,
+    },
+  },
+})
+```
+
+You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
+
+```js
+// eslint.config.js
+import reactX from 'eslint-plugin-react-x'
+import reactDom from 'eslint-plugin-react-dom'
+
+export default tseslint.config({
+  plugins: {
+    // Add the react-x and react-dom plugins
+    'react-x': reactX,
+    'react-dom': reactDom,
+  },
+  rules: {
+    // other rules...
+    // Enable its recommended typescript rules
+    ...reactX.configs['recommended-typescript'].rules,
+    ...reactDom.configs.recommended.rules,
+  },
+})
+```
diff --git a/portal/eslint.config.js b/portal/eslint.config.js
new file mode 100644
index 0000000000..092408a9f0
--- /dev/null
+++ b/portal/eslint.config.js
@@ -0,0 +1,28 @@
+import js from '@eslint/js'
+import globals from 'globals'
+import reactHooks from 'eslint-plugin-react-hooks'
+import reactRefresh from 'eslint-plugin-react-refresh'
+import tseslint from 'typescript-eslint'
+
+export default tseslint.config(
+  { ignores: ['dist'] },
+  {
+    extends: [js.configs.recommended, ...tseslint.configs.recommended],
+    files: ['**/*.{ts,tsx}'],
+    languageOptions: {
+      ecmaVersion: 2020,
+      globals: globals.browser,
+    },
+    plugins: {
+      'react-hooks': reactHooks,
+      'react-refresh': reactRefresh,
+    },
+    rules: {
+      ...reactHooks.configs.recommended.rules,
+      'react-refresh/only-export-components': [
+        'warn',
+        { allowConstantExport: true },
+      ],
+    },
+  },
+)
diff --git a/portal/index.html b/portal/index.html
new file mode 100644
index 0000000000..e4b78eae12
--- /dev/null
+++ b/portal/index.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>Vite + React + TS</title>
+  </head>
+  <body>
+    <div id="root"></div>
+    <script type="module" src="/src/main.tsx"></script>
+  </body>
+</html>
diff --git a/portal/package-lock.json b/portal/package-lock.json
new file mode 100644
index 0000000000..0ed7f7a5b0
--- /dev/null
+++ b/portal/package-lock.json
@@ -0,0 +1,3936 @@
+{
+  "name": "portal",
+  "version": "0.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@ampproject/remapping": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+      "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+      "dev": true,
+      "requires": {
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      }
+    },
+    "@ark-ui/react": {
+      "version": "4.9.2",
+      "resolved": "https://registry.npmjs.org/@ark-ui/react/-/react-4.9.2.tgz",
+      "integrity": "sha512-LJnz8nwXgGRszlkU2AiH3yLsAeXiXeQl4JBjMA7d8klZJBiBUp7URwLhBSWmoAIWRH7bW6fSPjhRAEkJLmD8gA==",
+      "requires": {
+        "@internationalized/date": "3.7.0",
+        "@zag-js/accordion": "0.82.2",
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/auto-resize": "0.82.2",
+        "@zag-js/avatar": "0.82.2",
+        "@zag-js/carousel": "0.82.2",
+        "@zag-js/checkbox": "0.82.2",
+        "@zag-js/clipboard": "0.82.2",
+        "@zag-js/collapsible": "0.82.2",
+        "@zag-js/collection": "0.82.2",
+        "@zag-js/color-picker": "0.82.2",
+        "@zag-js/color-utils": "0.82.2",
+        "@zag-js/combobox": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/date-picker": "0.82.2",
+        "@zag-js/date-utils": "0.82.2",
+        "@zag-js/dialog": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/editable": "0.82.2",
+        "@zag-js/file-upload": "0.82.2",
+        "@zag-js/file-utils": "0.82.2",
+        "@zag-js/focus-trap": "0.82.2",
+        "@zag-js/highlight-word": "0.82.2",
+        "@zag-js/hover-card": "0.82.2",
+        "@zag-js/i18n-utils": "0.82.2",
+        "@zag-js/menu": "0.82.2",
+        "@zag-js/number-input": "0.82.2",
+        "@zag-js/pagination": "0.82.2",
+        "@zag-js/pin-input": "0.82.2",
+        "@zag-js/popover": "0.82.2",
+        "@zag-js/presence": "0.82.2",
+        "@zag-js/progress": "0.82.2",
+        "@zag-js/qr-code": "0.82.2",
+        "@zag-js/radio-group": "0.82.2",
+        "@zag-js/rating-group": "0.82.2",
+        "@zag-js/react": "0.82.2",
+        "@zag-js/select": "0.82.2",
+        "@zag-js/signature-pad": "0.82.2",
+        "@zag-js/slider": "0.82.2",
+        "@zag-js/splitter": "0.82.2",
+        "@zag-js/steps": "0.82.2",
+        "@zag-js/switch": "0.82.2",
+        "@zag-js/tabs": "0.82.2",
+        "@zag-js/tags-input": "0.82.2",
+        "@zag-js/time-picker": "0.82.2",
+        "@zag-js/timer": "0.82.2",
+        "@zag-js/toast": "0.82.2",
+        "@zag-js/toggle-group": "0.82.2",
+        "@zag-js/tooltip": "0.82.2",
+        "@zag-js/tour": "0.82.2",
+        "@zag-js/tree-view": "0.82.2",
+        "@zag-js/types": "0.82.2"
+      }
+    },
+    "@babel/code-frame": {
+      "version": "7.26.2",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+      "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.25.9",
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.0.0"
+      }
+    },
+    "@babel/compat-data": {
+      "version": "7.26.8",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz",
+      "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==",
+      "dev": true
+    },
+    "@babel/core": {
+      "version": "7.26.10",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz",
+      "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==",
+      "dev": true,
+      "requires": {
+        "@ampproject/remapping": "^2.2.0",
+        "@babel/code-frame": "^7.26.2",
+        "@babel/generator": "^7.26.10",
+        "@babel/helper-compilation-targets": "^7.26.5",
+        "@babel/helper-module-transforms": "^7.26.0",
+        "@babel/helpers": "^7.26.10",
+        "@babel/parser": "^7.26.10",
+        "@babel/template": "^7.26.9",
+        "@babel/traverse": "^7.26.10",
+        "@babel/types": "^7.26.10",
+        "convert-source-map": "^2.0.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.2",
+        "json5": "^2.2.3",
+        "semver": "^6.3.1"
+      }
+    },
+    "@babel/generator": {
+      "version": "7.26.10",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz",
+      "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==",
+      "requires": {
+        "@babel/parser": "^7.26.10",
+        "@babel/types": "^7.26.10",
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.25",
+        "jsesc": "^3.0.2"
+      }
+    },
+    "@babel/helper-compilation-targets": {
+      "version": "7.26.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz",
+      "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==",
+      "dev": true,
+      "requires": {
+        "@babel/compat-data": "^7.26.5",
+        "@babel/helper-validator-option": "^7.25.9",
+        "browserslist": "^4.24.0",
+        "lru-cache": "^5.1.1",
+        "semver": "^6.3.1"
+      }
+    },
+    "@babel/helper-module-imports": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+      "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+      "requires": {
+        "@babel/traverse": "^7.25.9",
+        "@babel/types": "^7.25.9"
+      }
+    },
+    "@babel/helper-module-transforms": {
+      "version": "7.26.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+      "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.25.9",
+        "@babel/helper-validator-identifier": "^7.25.9",
+        "@babel/traverse": "^7.25.9"
+      }
+    },
+    "@babel/helper-plugin-utils": {
+      "version": "7.26.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
+      "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
+      "dev": true
+    },
+    "@babel/helper-string-parser": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+      "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="
+    },
+    "@babel/helper-validator-identifier": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+      "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="
+    },
+    "@babel/helper-validator-option": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+      "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+      "dev": true
+    },
+    "@babel/helpers": {
+      "version": "7.26.10",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz",
+      "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.26.9",
+        "@babel/types": "^7.26.10"
+      }
+    },
+    "@babel/parser": {
+      "version": "7.26.10",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz",
+      "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==",
+      "requires": {
+        "@babel/types": "^7.26.10"
+      }
+    },
+    "@babel/plugin-transform-react-jsx-self": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz",
+      "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.25.9"
+      }
+    },
+    "@babel/plugin-transform-react-jsx-source": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz",
+      "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.25.9"
+      }
+    },
+    "@babel/runtime": {
+      "version": "7.26.10",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz",
+      "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==",
+      "requires": {
+        "regenerator-runtime": "^0.14.0"
+      }
+    },
+    "@babel/template": {
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz",
+      "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==",
+      "requires": {
+        "@babel/code-frame": "^7.26.2",
+        "@babel/parser": "^7.26.9",
+        "@babel/types": "^7.26.9"
+      }
+    },
+    "@babel/traverse": {
+      "version": "7.26.10",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz",
+      "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==",
+      "requires": {
+        "@babel/code-frame": "^7.26.2",
+        "@babel/generator": "^7.26.10",
+        "@babel/parser": "^7.26.10",
+        "@babel/template": "^7.26.9",
+        "@babel/types": "^7.26.10",
+        "debug": "^4.3.1",
+        "globals": "^11.1.0"
+      },
+      "dependencies": {
+        "globals": {
+          "version": "11.12.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+          "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
+        }
+      }
+    },
+    "@babel/types": {
+      "version": "7.26.10",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz",
+      "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==",
+      "requires": {
+        "@babel/helper-string-parser": "^7.25.9",
+        "@babel/helper-validator-identifier": "^7.25.9"
+      }
+    },
+    "@chakra-ui/cli": {
+      "version": "3.12.0",
+      "resolved": "https://registry.npmjs.org/@chakra-ui/cli/-/cli-3.12.0.tgz",
+      "integrity": "sha512-/+gwIt+ZyGkdEwG5NcDSuD/nNKcUJ8axF2/usJD7kvyx2di9slytiw14WT5spieDG2hpPU/p2qIPoFVYkqhSyg==",
+      "dev": true,
+      "requires": {
+        "@clack/prompts": "0.10.0",
+        "@pandacss/is-valid-prop": "0.41.0",
+        "@types/cli-table": "^0.3.4",
+        "@types/debug": "^4.1.12",
+        "@visulima/boxen": "^1.0.23",
+        "bundle-n-require": "1.1.1",
+        "chokidar": "3.6.0",
+        "cli-table": "^0.3.11",
+        "commander": "12.1.0",
+        "debug": "^4.3.5",
+        "globby": "14.0.2",
+        "https-proxy-agent": "^7.0.5",
+        "look-it-up": "2.1.0",
+        "node-fetch": "3.3.2",
+        "package-manager-detector": "0.1.2",
+        "prettier": "3.3.3",
+        "scule": "1.3.0",
+        "sucrase": "^3.35.0",
+        "zod": "^3.23.8"
+      }
+    },
+    "@chakra-ui/icons": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/@chakra-ui/icons/-/icons-2.2.4.tgz",
+      "integrity": "sha512-l5QdBgwrAg3Sc2BRqtNkJpfuLw/pWRDwwT58J6c4PqQT6wzXxyNa8Q0PForu1ltB5qEiFb1kxr/F/HO1EwNa6g=="
+    },
+    "@chakra-ui/react": {
+      "version": "3.12.0",
+      "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-3.12.0.tgz",
+      "integrity": "sha512-/RsSVyc9FjVuysZnFW3jJ+SIikWo/DfFWICEPis2EBNiCMaQgtjROKthiH4JUX39pXTd45tzJUrRVEN2p0cjNw==",
+      "requires": {
+        "@ark-ui/react": "4.9.2",
+        "@emotion/is-prop-valid": "1.3.1",
+        "@emotion/serialize": "1.3.3",
+        "@emotion/use-insertion-effect-with-fallbacks": "1.2.0",
+        "@emotion/utils": "1.4.2",
+        "@pandacss/is-valid-prop": "0.41.0",
+        "csstype": "3.1.3",
+        "fast-safe-stringify": "2.1.1"
+      }
+    },
+    "@clack/core": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.4.1.tgz",
+      "integrity": "sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==",
+      "dev": true,
+      "requires": {
+        "picocolors": "^1.0.0",
+        "sisteransi": "^1.0.5"
+      }
+    },
+    "@clack/prompts": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.10.0.tgz",
+      "integrity": "sha512-H3rCl6CwW1NdQt9rE3n373t7o5cthPv7yUoxF2ytZvyvlJv89C5RYMJu83Hed8ODgys5vpBU0GKxIRG83jd8NQ==",
+      "dev": true,
+      "requires": {
+        "@clack/core": "0.4.1",
+        "picocolors": "^1.0.0",
+        "sisteransi": "^1.0.5"
+      }
+    },
+    "@emotion/babel-plugin": {
+      "version": "11.13.5",
+      "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz",
+      "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==",
+      "requires": {
+        "@babel/helper-module-imports": "^7.16.7",
+        "@babel/runtime": "^7.18.3",
+        "@emotion/hash": "^0.9.2",
+        "@emotion/memoize": "^0.9.0",
+        "@emotion/serialize": "^1.3.3",
+        "babel-plugin-macros": "^3.1.0",
+        "convert-source-map": "^1.5.0",
+        "escape-string-regexp": "^4.0.0",
+        "find-root": "^1.1.0",
+        "source-map": "^0.5.7",
+        "stylis": "4.2.0"
+      },
+      "dependencies": {
+        "convert-source-map": {
+          "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+          "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
+        }
+      }
+    },
+    "@emotion/cache": {
+      "version": "11.14.0",
+      "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz",
+      "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==",
+      "requires": {
+        "@emotion/memoize": "^0.9.0",
+        "@emotion/sheet": "^1.4.0",
+        "@emotion/utils": "^1.4.2",
+        "@emotion/weak-memoize": "^0.4.0",
+        "stylis": "4.2.0"
+      }
+    },
+    "@emotion/hash": {
+      "version": "0.9.2",
+      "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
+      "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g=="
+    },
+    "@emotion/is-prop-valid": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz",
+      "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==",
+      "requires": {
+        "@emotion/memoize": "^0.9.0"
+      }
+    },
+    "@emotion/memoize": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
+      "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="
+    },
+    "@emotion/react": {
+      "version": "11.14.0",
+      "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz",
+      "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==",
+      "requires": {
+        "@babel/runtime": "^7.18.3",
+        "@emotion/babel-plugin": "^11.13.5",
+        "@emotion/cache": "^11.14.0",
+        "@emotion/serialize": "^1.3.3",
+        "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
+        "@emotion/utils": "^1.4.2",
+        "@emotion/weak-memoize": "^0.4.0",
+        "hoist-non-react-statics": "^3.3.1"
+      }
+    },
+    "@emotion/serialize": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz",
+      "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==",
+      "requires": {
+        "@emotion/hash": "^0.9.2",
+        "@emotion/memoize": "^0.9.0",
+        "@emotion/unitless": "^0.10.0",
+        "@emotion/utils": "^1.4.2",
+        "csstype": "^3.0.2"
+      }
+    },
+    "@emotion/sheet": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
+      "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg=="
+    },
+    "@emotion/styled": {
+      "version": "11.14.0",
+      "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz",
+      "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==",
+      "requires": {
+        "@babel/runtime": "^7.18.3",
+        "@emotion/babel-plugin": "^11.13.5",
+        "@emotion/is-prop-valid": "^1.3.0",
+        "@emotion/serialize": "^1.3.3",
+        "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
+        "@emotion/utils": "^1.4.2"
+      }
+    },
+    "@emotion/unitless": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
+      "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg=="
+    },
+    "@emotion/use-insertion-effect-with-fallbacks": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz",
+      "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg=="
+    },
+    "@emotion/utils": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz",
+      "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA=="
+    },
+    "@emotion/weak-memoize": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz",
+      "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="
+    },
+    "@esbuild/aix-ppc64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz",
+      "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/android-arm": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz",
+      "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/android-arm64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz",
+      "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/android-x64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz",
+      "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/darwin-arm64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz",
+      "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/darwin-x64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz",
+      "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/freebsd-arm64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz",
+      "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/freebsd-x64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz",
+      "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-arm": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz",
+      "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-arm64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz",
+      "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-ia32": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz",
+      "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-loong64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz",
+      "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-mips64el": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz",
+      "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-ppc64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz",
+      "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-riscv64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz",
+      "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-s390x": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz",
+      "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-x64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz",
+      "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/netbsd-arm64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz",
+      "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/netbsd-x64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz",
+      "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/openbsd-arm64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz",
+      "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/openbsd-x64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz",
+      "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/sunos-x64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz",
+      "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-arm64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz",
+      "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-ia32": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz",
+      "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-x64": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz",
+      "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==",
+      "dev": true,
+      "optional": true
+    },
+    "@eslint-community/eslint-utils": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.0.tgz",
+      "integrity": "sha512-RoV8Xs9eNwiDvhv7M+xcL4PWyRyIXRY/FLp3buU4h1EYfdF7unWUy3dOjPqb3C7rMUewIcqwW850PgS8h1o1yg==",
+      "dev": true,
+      "requires": {
+        "eslint-visitor-keys": "^3.4.3"
+      },
+      "dependencies": {
+        "eslint-visitor-keys": {
+          "version": "3.4.3",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+          "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+          "dev": true
+        }
+      }
+    },
+    "@eslint-community/regexpp": {
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+      "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+      "dev": true
+    },
+    "@eslint/config-array": {
+      "version": "0.19.2",
+      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz",
+      "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==",
+      "dev": true,
+      "requires": {
+        "@eslint/object-schema": "^2.1.6",
+        "debug": "^4.3.1",
+        "minimatch": "^3.1.2"
+      }
+    },
+    "@eslint/config-helpers": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.1.0.tgz",
+      "integrity": "sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==",
+      "dev": true
+    },
+    "@eslint/core": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz",
+      "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==",
+      "dev": true,
+      "requires": {
+        "@types/json-schema": "^7.0.15"
+      }
+    },
+    "@eslint/eslintrc": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz",
+      "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.12.4",
+        "debug": "^4.3.2",
+        "espree": "^10.0.1",
+        "globals": "^14.0.0",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^4.1.0",
+        "minimatch": "^3.1.2",
+        "strip-json-comments": "^3.1.1"
+      },
+      "dependencies": {
+        "globals": {
+          "version": "14.0.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+          "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+          "dev": true
+        }
+      }
+    },
+    "@eslint/js": {
+      "version": "9.22.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.22.0.tgz",
+      "integrity": "sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==",
+      "dev": true
+    },
+    "@eslint/object-schema": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+      "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
+      "dev": true
+    },
+    "@eslint/plugin-kit": {
+      "version": "0.2.7",
+      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz",
+      "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==",
+      "dev": true,
+      "requires": {
+        "@eslint/core": "^0.12.0",
+        "levn": "^0.4.1"
+      }
+    },
+    "@floating-ui/core": {
+      "version": "1.6.9",
+      "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz",
+      "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==",
+      "requires": {
+        "@floating-ui/utils": "^0.2.9"
+      }
+    },
+    "@floating-ui/dom": {
+      "version": "1.6.13",
+      "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz",
+      "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==",
+      "requires": {
+        "@floating-ui/core": "^1.6.0",
+        "@floating-ui/utils": "^0.2.9"
+      }
+    },
+    "@floating-ui/utils": {
+      "version": "0.2.9",
+      "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz",
+      "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="
+    },
+    "@humanfs/core": {
+      "version": "0.19.1",
+      "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+      "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+      "dev": true
+    },
+    "@humanfs/node": {
+      "version": "0.16.6",
+      "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
+      "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
+      "dev": true,
+      "requires": {
+        "@humanfs/core": "^0.19.1",
+        "@humanwhocodes/retry": "^0.3.0"
+      },
+      "dependencies": {
+        "@humanwhocodes/retry": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
+          "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
+          "dev": true
+        }
+      }
+    },
+    "@humanwhocodes/module-importer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+      "dev": true
+    },
+    "@humanwhocodes/retry": {
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz",
+      "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==",
+      "dev": true
+    },
+    "@internationalized/date": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.7.0.tgz",
+      "integrity": "sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ==",
+      "requires": {
+        "@swc/helpers": "^0.5.0"
+      }
+    },
+    "@internationalized/number": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.0.tgz",
+      "integrity": "sha512-PtrRcJVy7nw++wn4W2OuePQQfTqDzfusSuY1QTtui4wa7r+rGVtR75pO8CyKvHvzyQYi3Q1uO5sY0AsB4e65Bw==",
+      "requires": {
+        "@swc/helpers": "^0.5.0"
+      }
+    },
+    "@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,
+      "requires": {
+        "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"
+      }
+    },
+    "@jridgewell/gen-mapping": {
+      "version": "0.3.8",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+      "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+      "requires": {
+        "@jridgewell/set-array": "^1.2.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      }
+    },
+    "@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="
+    },
+    "@jridgewell/set-array": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="
+    },
+    "@jridgewell/sourcemap-codec": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
+    },
+    "@jridgewell/trace-mapping": {
+      "version": "0.3.25",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+      "requires": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
+    "@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,
+      "requires": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      }
+    },
+    "@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
+    },
+    "@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,
+      "requires": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      }
+    },
+    "@pandacss/is-valid-prop": {
+      "version": "0.41.0",
+      "resolved": "https://registry.npmjs.org/@pandacss/is-valid-prop/-/is-valid-prop-0.41.0.tgz",
+      "integrity": "sha512-BE6h6CsJk14ugIRrsazJtN3fcg+KDFRat1Bs93YFKH6jd4DOb1yUyVvC70jKqPVvg70zEcV8acZ7VdcU5TLu+w=="
+    },
+    "@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
+    },
+    "@rollup/rollup-android-arm-eabi": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz",
+      "integrity": "sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-android-arm64": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz",
+      "integrity": "sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-darwin-arm64": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz",
+      "integrity": "sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-darwin-x64": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz",
+      "integrity": "sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-freebsd-arm64": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz",
+      "integrity": "sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-freebsd-x64": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz",
+      "integrity": "sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz",
+      "integrity": "sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz",
+      "integrity": "sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz",
+      "integrity": "sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-arm64-musl": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz",
+      "integrity": "sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-loongarch64-gnu": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz",
+      "integrity": "sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-powerpc64le-gnu": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz",
+      "integrity": "sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz",
+      "integrity": "sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz",
+      "integrity": "sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-x64-gnu": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz",
+      "integrity": "sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-x64-musl": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz",
+      "integrity": "sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz",
+      "integrity": "sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz",
+      "integrity": "sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-win32-x64-msvc": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz",
+      "integrity": "sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==",
+      "dev": true,
+      "optional": true
+    },
+    "@sindresorhus/merge-streams": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz",
+      "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==",
+      "dev": true
+    },
+    "@swc/helpers": {
+      "version": "0.5.15",
+      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
+      "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
+      "requires": {
+        "tslib": "^2.8.0"
+      }
+    },
+    "@types/babel__core": {
+      "version": "7.20.5",
+      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+      "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+      "dev": true,
+      "requires": {
+        "@babel/parser": "^7.20.7",
+        "@babel/types": "^7.20.7",
+        "@types/babel__generator": "*",
+        "@types/babel__template": "*",
+        "@types/babel__traverse": "*"
+      }
+    },
+    "@types/babel__generator": {
+      "version": "7.6.8",
+      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+      "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@types/babel__template": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+      "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+      "dev": true,
+      "requires": {
+        "@babel/parser": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@types/babel__traverse": {
+      "version": "7.20.6",
+      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
+      "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.20.7"
+      }
+    },
+    "@types/cli-table": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/@types/cli-table/-/cli-table-0.3.4.tgz",
+      "integrity": "sha512-GsALrTL69mlwbAw/MHF1IPTadSLZQnsxe7a80G8l4inN/iEXCOcVeT/S7aRc6hbhqzL9qZ314kHPDQnQ3ev+HA==",
+      "dev": true
+    },
+    "@types/cookie": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
+      "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="
+    },
+    "@types/debug": {
+      "version": "4.1.12",
+      "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+      "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+      "dev": true,
+      "requires": {
+        "@types/ms": "*"
+      }
+    },
+    "@types/estree": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+      "dev": true
+    },
+    "@types/json-schema": {
+      "version": "7.0.15",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+      "dev": true
+    },
+    "@types/ms": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+      "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+      "dev": true
+    },
+    "@types/parse-json": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
+      "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="
+    },
+    "@types/react": {
+      "version": "19.0.10",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz",
+      "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==",
+      "dev": true,
+      "requires": {
+        "csstype": "^3.0.2"
+      }
+    },
+    "@types/react-dom": {
+      "version": "19.0.4",
+      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz",
+      "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==",
+      "dev": true
+    },
+    "@typescript-eslint/eslint-plugin": {
+      "version": "8.26.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.1.tgz",
+      "integrity": "sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==",
+      "dev": true,
+      "requires": {
+        "@eslint-community/regexpp": "^4.10.0",
+        "@typescript-eslint/scope-manager": "8.26.1",
+        "@typescript-eslint/type-utils": "8.26.1",
+        "@typescript-eslint/utils": "8.26.1",
+        "@typescript-eslint/visitor-keys": "8.26.1",
+        "graphemer": "^1.4.0",
+        "ignore": "^5.3.1",
+        "natural-compare": "^1.4.0",
+        "ts-api-utils": "^2.0.1"
+      }
+    },
+    "@typescript-eslint/parser": {
+      "version": "8.26.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.26.1.tgz",
+      "integrity": "sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/scope-manager": "8.26.1",
+        "@typescript-eslint/types": "8.26.1",
+        "@typescript-eslint/typescript-estree": "8.26.1",
+        "@typescript-eslint/visitor-keys": "8.26.1",
+        "debug": "^4.3.4"
+      }
+    },
+    "@typescript-eslint/scope-manager": {
+      "version": "8.26.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.26.1.tgz",
+      "integrity": "sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "8.26.1",
+        "@typescript-eslint/visitor-keys": "8.26.1"
+      }
+    },
+    "@typescript-eslint/type-utils": {
+      "version": "8.26.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.26.1.tgz",
+      "integrity": "sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/typescript-estree": "8.26.1",
+        "@typescript-eslint/utils": "8.26.1",
+        "debug": "^4.3.4",
+        "ts-api-utils": "^2.0.1"
+      }
+    },
+    "@typescript-eslint/types": {
+      "version": "8.26.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.1.tgz",
+      "integrity": "sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==",
+      "dev": true
+    },
+    "@typescript-eslint/typescript-estree": {
+      "version": "8.26.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.1.tgz",
+      "integrity": "sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "8.26.1",
+        "@typescript-eslint/visitor-keys": "8.26.1",
+        "debug": "^4.3.4",
+        "fast-glob": "^3.3.2",
+        "is-glob": "^4.0.3",
+        "minimatch": "^9.0.4",
+        "semver": "^7.6.0",
+        "ts-api-utils": "^2.0.1"
+      },
+      "dependencies": {
+        "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,
+          "requires": {
+            "balanced-match": "^1.0.0"
+          }
+        },
+        "minimatch": {
+          "version": "9.0.5",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+          "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
+        },
+        "semver": {
+          "version": "7.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+          "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+          "dev": true
+        }
+      }
+    },
+    "@typescript-eslint/utils": {
+      "version": "8.26.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.26.1.tgz",
+      "integrity": "sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==",
+      "dev": true,
+      "requires": {
+        "@eslint-community/eslint-utils": "^4.4.0",
+        "@typescript-eslint/scope-manager": "8.26.1",
+        "@typescript-eslint/types": "8.26.1",
+        "@typescript-eslint/typescript-estree": "8.26.1"
+      }
+    },
+    "@typescript-eslint/visitor-keys": {
+      "version": "8.26.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.1.tgz",
+      "integrity": "sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "8.26.1",
+        "eslint-visitor-keys": "^4.2.0"
+      }
+    },
+    "@visulima/boxen": {
+      "version": "1.0.30",
+      "resolved": "https://registry.npmjs.org/@visulima/boxen/-/boxen-1.0.30.tgz",
+      "integrity": "sha512-izo776RvDFeipY7tJspA0wFrcq/Ih0Qhe/zu6v7O4OlURy2ViFmy+2ZSUYTHSSwKrmVeZWrUUJSpaepZPLPMMQ==",
+      "dev": true
+    },
+    "@vitejs/plugin-react": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz",
+      "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.26.0",
+        "@babel/plugin-transform-react-jsx-self": "^7.25.9",
+        "@babel/plugin-transform-react-jsx-source": "^7.25.9",
+        "@types/babel__core": "^7.20.5",
+        "react-refresh": "^0.14.2"
+      }
+    },
+    "@zag-js/accordion": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/accordion/-/accordion-0.82.2.tgz",
+      "integrity": "sha512-w8+oFbSEbW0otT6LG1boO5Iy9UP5K+NalLhoD5XxP/FHS6Rp4R4zk3iolOxxtOh6JXHnghXzG7VZbDQN9R8OWw==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/anatomy": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/anatomy/-/anatomy-0.82.2.tgz",
+      "integrity": "sha512-WHGKs5O443T2RSQQvUzYhEV5SNJxO5ysAnHxHdFLWBrMdLjLwLDnvyY7w30kzxeXR9/Z+2yxkgDipxRsC+qC8w=="
+    },
+    "@zag-js/aria-hidden": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/aria-hidden/-/aria-hidden-0.82.2.tgz",
+      "integrity": "sha512-V+PjbCABKM4yxFnq9M/t3W1hvwLMVe/0Sj9VyOiAAJDICfSDudGzO+5EfJBTJt59z2Gr4r55X+wtH1uBOtTF7w=="
+    },
+    "@zag-js/auto-resize": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/auto-resize/-/auto-resize-0.82.2.tgz",
+      "integrity": "sha512-93HhdycOkQMzn4g5MRWRgb5QKk03KwIiTkaU1jhx5eAatT/yYFDvrzNbAXQvr0WePcDNPnPrFS5lAY/85p0eew==",
+      "requires": {
+        "@zag-js/dom-query": "0.82.2"
+      }
+    },
+    "@zag-js/avatar": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/avatar/-/avatar-0.82.2.tgz",
+      "integrity": "sha512-rGlZno6S9lm/wWLC12sLj7nyFjUXZ/76hOvpcg5d+e2bmysu+chKz1Z08ecLBVVLWkk4JRq9M3v9Jgji0EgaDQ==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/carousel": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/carousel/-/carousel-0.82.2.tgz",
+      "integrity": "sha512-GMbGnoDFwWS8hDUk2unlg3Selmo6JvnTaI5DKEVmwIgp0MGT8zqUk4eAClsLNiS/JunEeK6tyER7K3b4dhYz8Q==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/scroll-snap": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/checkbox": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/checkbox/-/checkbox-0.82.2.tgz",
+      "integrity": "sha512-9gE4P21YsrY+sFJaJOGG84jW64aAxl7M9S+wsmRruKmzNAwri30bOviMV11qZH2isJ44HxPuJ3iezXsLMN+Thg==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/focus-visible": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/clipboard": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/clipboard/-/clipboard-0.82.2.tgz",
+      "integrity": "sha512-FU2SEHP0KthhtYJNtKU98Aw21ugHyX3CT3a75C9wJKGp5gSUDQ6FMIUT3K7GSFR8JGBQ7f/VI8AgE9gNiRpmdg==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/collapsible": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/collapsible/-/collapsible-0.82.2.tgz",
+      "integrity": "sha512-SWOy9ANjO8vbkYwX8AvEOntkPOAXiT9b4Cg3YT5QALPEB2UMUk0CzxJXw+ilbDoRMWWus2nqgx2g6D+IAabjLQ==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/collection": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/collection/-/collection-0.82.2.tgz",
+      "integrity": "sha512-moWCnb2F8nfnzYpyLPnCNd10pFSIqrBJrnB4ME0C3QydYIxxwmZsnVLPzTPtnDKGT3uVfL4QX2+nsBoeu1LXrw==",
+      "requires": {
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/color-picker": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/color-picker/-/color-picker-0.82.2.tgz",
+      "integrity": "sha512-BRxnToGNyg1HzkWfQquQM8/xg7Jd8HpJeXWQMT9hIh/XqLiz9HRsGN90I6Avv9vYXYJChw1VdSExdfR2HjlqlA==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/color-utils": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dismissable": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/popper": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/color-utils": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/color-utils/-/color-utils-0.82.2.tgz",
+      "integrity": "sha512-tBVocNpmWWBPOla0NPj5yMKefg36X176BsvhItlls3/4TB4We8Cad5Wi9G4SGm0ClYaUGPtQUK/E7UEUhfUjxA==",
+      "requires": {
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/combobox": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/combobox/-/combobox-0.82.2.tgz",
+      "integrity": "sha512-SVLcfJNqY17MqDL4i3QbxyjEDD/t0xUB37QjgsrKzvnq6IviM6FDh6UfsTX6/NHqy28HL0Aty6NIn2NNM7WyjQ==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/aria-hidden": "0.82.2",
+        "@zag-js/collection": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dismissable": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/popper": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/core": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/core/-/core-0.82.2.tgz",
+      "integrity": "sha512-yj4trnU4RzO4duiZJ7uvxECg+6MPVkEbTvTwf2TynotXBYX65LGMTqvMzZP062wvdu0jvTgZ/IbCpN1gc3hmsQ==",
+      "requires": {
+        "@zag-js/store": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/date-picker": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/date-picker/-/date-picker-0.82.2.tgz",
+      "integrity": "sha512-6thJ3ou3u49k4mnnYMecbw0JHvHiaF2nPyToaq/Hsf5grqSijgyZtfkHoDSNFiNN4DKcv1GXErM0N0MiY0dc4A==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/date-utils": "0.82.2",
+        "@zag-js/dismissable": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/live-region": "0.82.2",
+        "@zag-js/popper": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/date-utils": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/date-utils/-/date-utils-0.82.2.tgz",
+      "integrity": "sha512-e2jZ6AFMzwJBNgoOdmATKRH5/Mgr6EqlZmmhI061JzB3uteVOv4x2k5je+g8kWS1IADC5D2OMFQHI/bXSJ5ZFQ=="
+    },
+    "@zag-js/dialog": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/dialog/-/dialog-0.82.2.tgz",
+      "integrity": "sha512-p0E6m28HXQMFj+l0MHJcoh326+p/iMocDFOSL1JT3h/U7JLDeW3kNJvpVGK+6vCLngJ/jnAszgQQYhlaz5smJg==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/aria-hidden": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dismissable": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/focus-trap": "0.82.2",
+        "@zag-js/remove-scroll": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/dismissable": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/dismissable/-/dismissable-0.82.2.tgz",
+      "integrity": "sha512-oi2wLiWEll9vhgFgE4FIH9aWPwId8QExO6kcnfeZPSkytnTRetKlyhj5xsOCygElZK994JRkFP3lpGrGCET+kg==",
+      "requires": {
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/interact-outside": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/dom-query": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/dom-query/-/dom-query-0.82.2.tgz",
+      "integrity": "sha512-4gI1A7Rh9/vZhOuuWzUldP3+2PIiOyR91TBDA0an1VICzHRKBelntlkBR6cZMtjH9gGxhSVxeKN2b060kJ8VQw==",
+      "requires": {
+        "@zag-js/types": "0.82.2"
+      }
+    },
+    "@zag-js/editable": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/editable/-/editable-0.82.2.tgz",
+      "integrity": "sha512-BHheMo+gRo72GCqc8rowtg8yGg7fg39AdiwIrXUQ4PU2oI+jKkxAKamLXFgu19Ne+1keLcGjNAtVWRZkqszjzw==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/interact-outside": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/element-rect": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/element-rect/-/element-rect-0.82.2.tgz",
+      "integrity": "sha512-VdHlu9fLWhKxHFL5vCQXgzqEmxhSBgzTOU0SidR3hsGLcO6dgioz86bJ7i8uPFU+uZDHhyv9Q7lBQQoO76Cr7g=="
+    },
+    "@zag-js/element-size": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.82.2.tgz",
+      "integrity": "sha512-33sCUNJITNAqlNOP+KdMRh8R10s8MPwH+XrxucUBi2R55vWRVs9G3gcA/2uSf1mo/2us74Z4U+/KLnI5FkZycg=="
+    },
+    "@zag-js/file-upload": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/file-upload/-/file-upload-0.82.2.tgz",
+      "integrity": "sha512-r1618x7BkYLh3qaKQOabD838lwM1ARP4aVbzBb5om1cNUjWgy9wCBU1PCNjsqyFzm/bTmHTXgiWdTz06NFpbTg==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/file-utils": "0.82.2",
+        "@zag-js/i18n-utils": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/file-utils": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/file-utils/-/file-utils-0.82.2.tgz",
+      "integrity": "sha512-cjmG+HUBXS+hYsgOfdpNOe/xIYPAQ6CyFDGvuqr4wBnhOd9YyCtn7/M+O4VfodVA9rnVQ67RQsbI/eBBZTQ+/A==",
+      "requires": {
+        "@zag-js/i18n-utils": "0.82.2"
+      }
+    },
+    "@zag-js/focus-trap": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/focus-trap/-/focus-trap-0.82.2.tgz",
+      "integrity": "sha512-TZNSAqqoml6avv6puO8afMJ0ttfYQC4BvIuA/Z8yjMVPvXHcUUeVyP5mgwp2tadMWY2TJ4Bv0/xxJJvvbwNNXQ==",
+      "requires": {
+        "@zag-js/dom-query": "0.82.2"
+      }
+    },
+    "@zag-js/focus-visible": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.82.2.tgz",
+      "integrity": "sha512-fwmNDVHulJ+L6sOFavDhAMYOIZYwo/ivhkPkko2pah6pYYQDwyp4bjsmpofW/VkCgdXgClpcElCC8aoQ83A6Jg==",
+      "requires": {
+        "@zag-js/dom-query": "0.82.2"
+      }
+    },
+    "@zag-js/highlight-word": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/highlight-word/-/highlight-word-0.82.2.tgz",
+      "integrity": "sha512-9sN//8j+TZFTrYIhuSSIJ0rMREVAV8xkJ8250zH///cYfVDuFLCbJp69E613ZfevipemlTQJWP1vTJ1HZGZ5vg=="
+    },
+    "@zag-js/hover-card": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/hover-card/-/hover-card-0.82.2.tgz",
+      "integrity": "sha512-11xb3BzVxMvhSGEx9k/umq4/gt7wbjKB/TVEn2dYTdZ2NTyAa+PLXkZ60VBPnprEZ3Or3AzuWJw68uaSdqxh0A==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dismissable": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/popper": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/i18n-utils": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/i18n-utils/-/i18n-utils-0.82.2.tgz",
+      "integrity": "sha512-ANmNMA7f5Hrhd0ZXVASTV62HRIJut/ioQ6lm/L6PL1+QW+o60j5wJv4HSslQuWWsdyzEpq05u2Sy9ndbcSQ5RA==",
+      "requires": {
+        "@zag-js/dom-query": "0.82.2"
+      }
+    },
+    "@zag-js/interact-outside": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/interact-outside/-/interact-outside-0.82.2.tgz",
+      "integrity": "sha512-9AB7S6NpOr49oSh+nIl+X8wEiKj2YfXtW2Qk/GOTQ0eP9boXK45Y1pqjWvBpDF0rQYofnWPgoldw9B+rZa+lZQ==",
+      "requires": {
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/live-region": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/live-region/-/live-region-0.82.2.tgz",
+      "integrity": "sha512-q6j4qggfyUFgpAWBe48cRiaByrJVrOf3x6gHWhK7EsLu45D/0HPkvZjmDgwoRoIISoJVLeT9YquaNsh7rFKFrQ=="
+    },
+    "@zag-js/menu": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/menu/-/menu-0.82.2.tgz",
+      "integrity": "sha512-vPRLdv9ZcQYgzgtZimXY0LKj7Rs+3EPowc2GEWcMe5ergzhKRlmG/2eRn/mSgESnLmMNx6CaYAYQdNcndd+ksA==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dismissable": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/popper": "0.82.2",
+        "@zag-js/rect-utils": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/number-input": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/number-input/-/number-input-0.82.2.tgz",
+      "integrity": "sha512-gVJZny2MS3ptOpP5W+DGnY7igOCyO9I+Z+dDWlKiLNvHM8v6GlMtxtiPuV8kL1u7TqL8HEGQENA1NZYSr+rcKQ==",
+      "requires": {
+        "@internationalized/number": "3.6.0",
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/pagination": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/pagination/-/pagination-0.82.2.tgz",
+      "integrity": "sha512-xPMhYQOb/QoVwQm8TTchameMsrKR6VhZmcCMzjR0KlBIf7WG4Z5H3Rfzw3HXoQaNTipY2k56YH5p4PEirGYvzA==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/pin-input": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/pin-input/-/pin-input-0.82.2.tgz",
+      "integrity": "sha512-8omi7JeA2UXMOeuMdcE2qNk86AfnA19CpY7pQ0GVKuqsxF4zSniC+4SC7uAOUymNtkdv6xVheJF696bRIoChRw==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/popover": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/popover/-/popover-0.82.2.tgz",
+      "integrity": "sha512-OD0hBCasb8gJU97uWE3m8bAL8XqPrIDkQF4mJ0clAC9puusDdKgRS9W5kCQzgzei3JYdZbK81Bnx5X0gOGWKwQ==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/aria-hidden": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dismissable": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/focus-trap": "0.82.2",
+        "@zag-js/popper": "0.82.2",
+        "@zag-js/remove-scroll": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/popper": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/popper/-/popper-0.82.2.tgz",
+      "integrity": "sha512-hrc9WtFge+m8zVgrxFxOPpBRvqf4YhWoJSnhPfjruBSJDrvrgBkozjCsazM3618b7bB+jpw4Pzj0H+lSsv4Ygw==",
+      "requires": {
+        "@floating-ui/dom": "1.6.13",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/presence": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/presence/-/presence-0.82.2.tgz",
+      "integrity": "sha512-N818BC/PBkdh/yQBECrBONoN9DcYT/PNIblgHic3mG8IIfI49jnAC103gDFbROVJoI/38bk4gwMMOWesZtX/IA==",
+      "requires": {
+        "@zag-js/core": "0.82.2",
+        "@zag-js/types": "0.82.2"
+      }
+    },
+    "@zag-js/progress": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/progress/-/progress-0.82.2.tgz",
+      "integrity": "sha512-YxQXBHLUXF8BOG68sZCXkthKrZPebt02cSinafpjYXIOwauSBeMdmd8rAjsrAIFWhonaXcqxCs+jqlZRn18tEA==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/qr-code": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/qr-code/-/qr-code-0.82.2.tgz",
+      "integrity": "sha512-dotI3wXTGArwxKnqaLWrgNfXZGq2oe0Ur3KT8JPxHy9Kv6JWYGkge5AmtiGkwXFQR/ZxnRYE1vF1RNjFG50OKQ==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2",
+        "proxy-memoize": "3.0.1",
+        "uqr": "0.1.2"
+      }
+    },
+    "@zag-js/radio-group": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/radio-group/-/radio-group-0.82.2.tgz",
+      "integrity": "sha512-Peh3zLq8BEmoC9zHrd1n08gLlrlb5VXUpofOdEj9GqtEphLNCf/S3O5jeM6MlYZ9gHe+CkXIpXH16GDBoZVWjw==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/element-rect": "0.82.2",
+        "@zag-js/focus-visible": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/rating-group": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/rating-group/-/rating-group-0.82.2.tgz",
+      "integrity": "sha512-J2JX9leShV3HbiFqPoKCITaSshpjjt2U9mNakGU09YUlYEtjKwlNPFpYLSkKw2ItA/T9QbYJC58kbF+bAnTL5w==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/react": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/react/-/react-0.82.2.tgz",
+      "integrity": "sha512-lDul3lRZae2ptkOQSfobl5ZQfX6rhcoN5ILLVbGzBJ9hRtNfMTVfKKxXdF2/pg53sMgggK4hZNR3W2P21uC+Wg==",
+      "requires": {
+        "@zag-js/core": "0.82.2",
+        "@zag-js/store": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "proxy-compare": "3.0.1"
+      }
+    },
+    "@zag-js/rect-utils": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/rect-utils/-/rect-utils-0.82.2.tgz",
+      "integrity": "sha512-cmjxI+90La4Kz4CeGAN7EJ6wFbPEjZArnvU7TeUA+FrgRQvotjFrzI4zZ20BTgnlgMH7ahVNFO2qsVp+kcc2LQ=="
+    },
+    "@zag-js/remove-scroll": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/remove-scroll/-/remove-scroll-0.82.2.tgz",
+      "integrity": "sha512-v6ELaC9+sC+YoAkFjOBabjsXAoQgQA5secFDWWjzSVROWynH1mKNbBxakGCqEKtF67ZGbkAy+ysAZJoOkDsW4g==",
+      "requires": {
+        "@zag-js/dom-query": "0.82.2"
+      }
+    },
+    "@zag-js/scroll-snap": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/scroll-snap/-/scroll-snap-0.82.2.tgz",
+      "integrity": "sha512-Fl+utIAJr6nwNDnIML2jGIDRiFrDsQS77soGt8rT9Bj5swqdHpzwdTW3yu/VYlnPbvfrsB7SmMt1HzldukdOHQ==",
+      "requires": {
+        "@zag-js/dom-query": "0.82.2"
+      }
+    },
+    "@zag-js/select": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/select/-/select-0.82.2.tgz",
+      "integrity": "sha512-2aiXx/3PKc6vexloHj6GYndAbnPoe5W5mH2VSHM25Obu0XYkn28OLKTDIyHlqcycypVci2j5MnhCEkqQK/JKuw==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/collection": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dismissable": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/popper": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/signature-pad": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/signature-pad/-/signature-pad-0.82.2.tgz",
+      "integrity": "sha512-o44M7B+cKmmiKmNFEIVTufr59jqvFShLri/EmkS1fY3KMSrnMHWNoa6xbJlVpz4DJMwI8PxapoN+lYxMTYUUEQ==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2",
+        "perfect-freehand": "^1.2.2"
+      }
+    },
+    "@zag-js/slider": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/slider/-/slider-0.82.2.tgz",
+      "integrity": "sha512-ef059F+zWcYVjX3lxTDgb2KEcYNrLMrvJEFyaVg11wRLtwjRqVrjFxn9W/ZpR6pWnJol2D+BV8b478NmTpRwog==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/element-size": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/splitter": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/splitter/-/splitter-0.82.2.tgz",
+      "integrity": "sha512-36KJkdjtogjG0MTXbcf5b8Ienl02KFoKPPx96uOwlWdvbuypwww6z9kAsWQ+CGkpaKXqxZIweO7BCO4seVCwuQ==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/steps": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/steps/-/steps-0.82.2.tgz",
+      "integrity": "sha512-otREJYUKLY+Dku89fCJ5TzkMHxe1Nk4Y5jffyWWOHkf+xy50Ist6jWjGxdIcU2cUwomAJZvPIuz0bq6WjBZ+zg==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/store": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/store/-/store-0.82.2.tgz",
+      "integrity": "sha512-tjG99kSFfnUHWMTe3y+CAqCrH/RGCB2V5y0BoasITYAqTpqbCfPJH0R2+UYsY3kLqPnE+JDkkh1TnwcqKLc0/w==",
+      "requires": {
+        "proxy-compare": "3.0.1"
+      }
+    },
+    "@zag-js/switch": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/switch/-/switch-0.82.2.tgz",
+      "integrity": "sha512-sUZTcHN1+UxtU7cv+kRaz31OVrNdBqR3BC4bqWkjz/ihshAdzHquwKDkOtYiKjIGV9h8CwcuuCksrbwqCJ3apw==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/focus-visible": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/tabs": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/tabs/-/tabs-0.82.2.tgz",
+      "integrity": "sha512-8y4eYpu4oZlANehMavGqu4bG5fepgjGuPDZNeNHzwWnbCh1TjoKJ20HvluRRzOgKoErQqD9+WT3V4Khw8Sd62Q==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/element-rect": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/tags-input": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/tags-input/-/tags-input-0.82.2.tgz",
+      "integrity": "sha512-L9bXHImBs+F0nlWbM6TeUZFN3ur/vwGGbT0sFw9FtsL/+5XmTQfZ5wert3l/qeUE1RJrohFBxsVvq4hz6UYUCw==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/auto-resize": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/interact-outside": "0.82.2",
+        "@zag-js/live-region": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/time-picker": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/time-picker/-/time-picker-0.82.2.tgz",
+      "integrity": "sha512-NIJUrZMrLH6ciphwsmVsqMGyNEw6qtYlI3F6tlPLhVvnXJDcvc0PaGMe5OBM3yKFluQaVWUIVAR84urdhCBbpg==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dismissable": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/popper": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/timer": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/timer/-/timer-0.82.2.tgz",
+      "integrity": "sha512-lpCgHcSL4FNRb+UwlLu/J70iEr0vb2Dybwu39NkzxRi8LuBJGxrXGlTG8Apn2nldf7HHsSLT6cF7Nr0NohQa+Q==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/toast": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/toast/-/toast-0.82.2.tgz",
+      "integrity": "sha512-jAPzB4hxq90DmsvcuHepqzl/YMTnQQivkA7WG03hq/C5bAoPhpIvLauCTKiVW9SjgGfaTM6wuOQmMQEYiIe/rQ==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dismissable": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/toggle-group": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/toggle-group/-/toggle-group-0.82.2.tgz",
+      "integrity": "sha512-aJKP96iwDw/2Z98VWT40ii6CHTSrrvfsGJ03+dE8Mio6a43wiFKhatGLFIMTcu1EExiBmTAec4uUm4A1Xzbu1w==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/tooltip": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/tooltip/-/tooltip-0.82.2.tgz",
+      "integrity": "sha512-s7kXaBR3Ehu7kPzr9xX7FoWlqQ76eEViqGS1RPDtdDVgD1Hg7bfjZ1nCWDKgIuZF7gP/Iq4iC1i5iTOBIdeIOQ==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/focus-visible": "0.82.2",
+        "@zag-js/popper": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/tour": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/tour/-/tour-0.82.2.tgz",
+      "integrity": "sha512-oQyVXSJIw7PeXRnHypI+zKp0mHm8oNiVzgcYBIASk/E9JU0U+DGXh8vRdvzsrQlZD+AKT2rjv1v8xvbVUEngSw==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dismissable": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/focus-trap": "0.82.2",
+        "@zag-js/interact-outside": "0.82.2",
+        "@zag-js/popper": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/tree-view": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/tree-view/-/tree-view-0.82.2.tgz",
+      "integrity": "sha512-7+05aXig4mlISMZ+eKJpi3p+9r9u+h0S5Mvsw2o5Dz7XX/BfPTK8GEEDFWwuJKm03wNBuKCQ8+X1pxUisZqXVQ==",
+      "requires": {
+        "@zag-js/anatomy": "0.82.2",
+        "@zag-js/collection": "0.82.2",
+        "@zag-js/core": "0.82.2",
+        "@zag-js/dom-query": "0.82.2",
+        "@zag-js/types": "0.82.2",
+        "@zag-js/utils": "0.82.2"
+      }
+    },
+    "@zag-js/types": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/types/-/types-0.82.2.tgz",
+      "integrity": "sha512-OUN4QropdK3XZcjtm4n5JVMhbgp78F3pavLDvWCcwW0QwtckJljX6E17N9ViajVti8itKKXCuNRHCMhqLT8jwQ==",
+      "requires": {
+        "csstype": "3.1.3"
+      }
+    },
+    "@zag-js/utils": {
+      "version": "0.82.2",
+      "resolved": "https://registry.npmjs.org/@zag-js/utils/-/utils-0.82.2.tgz",
+      "integrity": "sha512-tN87VEEoo240O2CzQdHvtBVPF8hHqLdpNzDT+obNIQrRj4wbNQ5Ze3Zwrd6/SoBe7ImKgkwbAlgu4k5+v9sDcA=="
+    },
+    "acorn": {
+      "version": "8.14.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
+      "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
+      "dev": true
+    },
+    "acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+      "dev": true
+    },
+    "agent-base": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+      "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
+      "dev": true
+    },
+    "ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dev": true,
+      "requires": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "ansi-regex": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+      "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+      "dev": true
+    },
+    "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,
+      "requires": {
+        "color-convert": "^2.0.1"
+      }
+    },
+    "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
+    },
+    "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,
+      "requires": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      }
+    },
+    "argparse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+      "dev": true
+    },
+    "babel-plugin-macros": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+      "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+      "requires": {
+        "@babel/runtime": "^7.12.5",
+        "cosmiconfig": "^7.0.0",
+        "resolve": "^1.19.0"
+      }
+    },
+    "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
+    },
+    "binary-extensions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+      "dev": true
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+      "dev": true,
+      "requires": {
+        "fill-range": "^7.1.1"
+      }
+    },
+    "browserslist": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
+      "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+      "dev": true,
+      "requires": {
+        "caniuse-lite": "^1.0.30001688",
+        "electron-to-chromium": "^1.5.73",
+        "node-releases": "^2.0.19",
+        "update-browserslist-db": "^1.1.1"
+      }
+    },
+    "bundle-n-require": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/bundle-n-require/-/bundle-n-require-1.1.1.tgz",
+      "integrity": "sha512-EB2wFjXF106LQLe/CYnKCMCdLeTW47AtcEtUfiqAOgr2a08k0+YgRklur2aLfEYHlhz6baMskZ8L2U92Hh0vyA==",
+      "dev": true,
+      "requires": {
+        "esbuild": "^0.20.0",
+        "node-eval": "^2.0.0"
+      },
+      "dependencies": {
+        "@esbuild/aix-ppc64": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
+          "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/android-arm": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
+          "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/android-arm64": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
+          "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/android-x64": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
+          "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/darwin-arm64": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
+          "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/darwin-x64": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
+          "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/freebsd-arm64": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
+          "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/freebsd-x64": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
+          "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-arm": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
+          "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-arm64": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
+          "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-ia32": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
+          "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-loong64": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
+          "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-mips64el": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
+          "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-ppc64": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
+          "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-riscv64": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
+          "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-s390x": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
+          "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-x64": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
+          "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/netbsd-x64": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
+          "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/openbsd-x64": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
+          "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/sunos-x64": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
+          "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/win32-arm64": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
+          "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/win32-ia32": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
+          "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/win32-x64": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
+          "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
+          "dev": true,
+          "optional": true
+        },
+        "esbuild": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
+          "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
+          "dev": true,
+          "requires": {
+            "@esbuild/aix-ppc64": "0.20.2",
+            "@esbuild/android-arm": "0.20.2",
+            "@esbuild/android-arm64": "0.20.2",
+            "@esbuild/android-x64": "0.20.2",
+            "@esbuild/darwin-arm64": "0.20.2",
+            "@esbuild/darwin-x64": "0.20.2",
+            "@esbuild/freebsd-arm64": "0.20.2",
+            "@esbuild/freebsd-x64": "0.20.2",
+            "@esbuild/linux-arm": "0.20.2",
+            "@esbuild/linux-arm64": "0.20.2",
+            "@esbuild/linux-ia32": "0.20.2",
+            "@esbuild/linux-loong64": "0.20.2",
+            "@esbuild/linux-mips64el": "0.20.2",
+            "@esbuild/linux-ppc64": "0.20.2",
+            "@esbuild/linux-riscv64": "0.20.2",
+            "@esbuild/linux-s390x": "0.20.2",
+            "@esbuild/linux-x64": "0.20.2",
+            "@esbuild/netbsd-x64": "0.20.2",
+            "@esbuild/openbsd-x64": "0.20.2",
+            "@esbuild/sunos-x64": "0.20.2",
+            "@esbuild/win32-arm64": "0.20.2",
+            "@esbuild/win32-ia32": "0.20.2",
+            "@esbuild/win32-x64": "0.20.2"
+          }
+        }
+      }
+    },
+    "callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+    },
+    "caniuse-lite": {
+      "version": "1.0.30001703",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001703.tgz",
+      "integrity": "sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==",
+      "dev": true
+    },
+    "chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      }
+    },
+    "chokidar": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+      "dev": true,
+      "requires": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "fsevents": "~2.3.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"
+      },
+      "dependencies": {
+        "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,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        }
+      }
+    },
+    "cli-table": {
+      "version": "0.3.11",
+      "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz",
+      "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==",
+      "dev": true,
+      "requires": {
+        "colors": "1.0.3"
+      }
+    },
+    "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,
+      "requires": {
+        "color-name": "~1.1.4"
+      }
+    },
+    "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
+    },
+    "colors": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+      "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==",
+      "dev": true
+    },
+    "commander": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+      "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+      "dev": true
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+      "dev": true
+    },
+    "convert-source-map": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+      "dev": true
+    },
+    "cookie": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
+      "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="
+    },
+    "cosmiconfig": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+      "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+      "requires": {
+        "@types/parse-json": "^4.0.0",
+        "import-fresh": "^3.2.1",
+        "parse-json": "^5.0.0",
+        "path-type": "^4.0.0",
+        "yaml": "^1.10.0"
+      }
+    },
+    "cross-spawn": {
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+      "dev": true,
+      "requires": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      }
+    },
+    "csstype": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+    },
+    "data-uri-to-buffer": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+      "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+      "dev": true
+    },
+    "debug": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+      "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+      "requires": {
+        "ms": "^2.1.3"
+      }
+    },
+    "deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+      "dev": true
+    },
+    "eastasianwidth": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+      "dev": true
+    },
+    "electron-to-chromium": {
+      "version": "1.5.115",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.115.tgz",
+      "integrity": "sha512-MN1nahVHAQMOz6dz6bNZ7apgqc9InZy7Ja4DBEVCTdeiUcegbyOYE9bi/f2Z/z6ZxLi0RxLpyJ3EGe+4h3w73A==",
+      "dev": true
+    },
+    "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
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "esbuild": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz",
+      "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==",
+      "dev": true,
+      "requires": {
+        "@esbuild/aix-ppc64": "0.25.1",
+        "@esbuild/android-arm": "0.25.1",
+        "@esbuild/android-arm64": "0.25.1",
+        "@esbuild/android-x64": "0.25.1",
+        "@esbuild/darwin-arm64": "0.25.1",
+        "@esbuild/darwin-x64": "0.25.1",
+        "@esbuild/freebsd-arm64": "0.25.1",
+        "@esbuild/freebsd-x64": "0.25.1",
+        "@esbuild/linux-arm": "0.25.1",
+        "@esbuild/linux-arm64": "0.25.1",
+        "@esbuild/linux-ia32": "0.25.1",
+        "@esbuild/linux-loong64": "0.25.1",
+        "@esbuild/linux-mips64el": "0.25.1",
+        "@esbuild/linux-ppc64": "0.25.1",
+        "@esbuild/linux-riscv64": "0.25.1",
+        "@esbuild/linux-s390x": "0.25.1",
+        "@esbuild/linux-x64": "0.25.1",
+        "@esbuild/netbsd-arm64": "0.25.1",
+        "@esbuild/netbsd-x64": "0.25.1",
+        "@esbuild/openbsd-arm64": "0.25.1",
+        "@esbuild/openbsd-x64": "0.25.1",
+        "@esbuild/sunos-x64": "0.25.1",
+        "@esbuild/win32-arm64": "0.25.1",
+        "@esbuild/win32-ia32": "0.25.1",
+        "@esbuild/win32-x64": "0.25.1"
+      }
+    },
+    "escalade": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+      "dev": true
+    },
+    "escape-string-regexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
+    },
+    "eslint": {
+      "version": "9.22.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.22.0.tgz",
+      "integrity": "sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==",
+      "dev": true,
+      "requires": {
+        "@eslint-community/eslint-utils": "^4.2.0",
+        "@eslint-community/regexpp": "^4.12.1",
+        "@eslint/config-array": "^0.19.2",
+        "@eslint/config-helpers": "^0.1.0",
+        "@eslint/core": "^0.12.0",
+        "@eslint/eslintrc": "^3.3.0",
+        "@eslint/js": "9.22.0",
+        "@eslint/plugin-kit": "^0.2.7",
+        "@humanfs/node": "^0.16.6",
+        "@humanwhocodes/module-importer": "^1.0.1",
+        "@humanwhocodes/retry": "^0.4.2",
+        "@types/estree": "^1.0.6",
+        "@types/json-schema": "^7.0.15",
+        "ajv": "^6.12.4",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.6",
+        "debug": "^4.3.2",
+        "escape-string-regexp": "^4.0.0",
+        "eslint-scope": "^8.3.0",
+        "eslint-visitor-keys": "^4.2.0",
+        "espree": "^10.3.0",
+        "esquery": "^1.5.0",
+        "esutils": "^2.0.2",
+        "fast-deep-equal": "^3.1.3",
+        "file-entry-cache": "^8.0.0",
+        "find-up": "^5.0.0",
+        "glob-parent": "^6.0.2",
+        "ignore": "^5.2.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "lodash.merge": "^4.6.2",
+        "minimatch": "^3.1.2",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.3"
+      }
+    },
+    "eslint-plugin-react-hooks": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
+      "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
+      "dev": true
+    },
+    "eslint-plugin-react-refresh": {
+      "version": "0.4.19",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz",
+      "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==",
+      "dev": true
+    },
+    "eslint-scope": {
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz",
+      "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==",
+      "dev": true,
+      "requires": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^5.2.0"
+      }
+    },
+    "eslint-visitor-keys": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+      "dev": true
+    },
+    "espree": {
+      "version": "10.3.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
+      "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+      "dev": true,
+      "requires": {
+        "acorn": "^8.14.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^4.2.0"
+      }
+    },
+    "esquery": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+      "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^5.1.0"
+      }
+    },
+    "esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^5.2.0"
+      }
+    },
+    "estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "dev": true
+    },
+    "esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true
+    },
+    "fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "dev": true
+    },
+    "fast-glob": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+      "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.8"
+      },
+      "dependencies": {
+        "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,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        }
+      }
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+      "dev": true
+    },
+    "fast-safe-stringify": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
+      "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="
+    },
+    "fastq": {
+      "version": "1.19.1",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+      "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+      "dev": true,
+      "requires": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "fetch-blob": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+      "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+      "dev": true,
+      "requires": {
+        "node-domexception": "^1.0.0",
+        "web-streams-polyfill": "^3.0.3"
+      }
+    },
+    "file-entry-cache": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+      "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+      "dev": true,
+      "requires": {
+        "flat-cache": "^4.0.0"
+      }
+    },
+    "fill-range": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+      "dev": true,
+      "requires": {
+        "to-regex-range": "^5.0.1"
+      }
+    },
+    "find-root": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+      "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
+    },
+    "find-up": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "dev": true,
+      "requires": {
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      }
+    },
+    "flat-cache": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+      "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+      "dev": true,
+      "requires": {
+        "flatted": "^3.2.9",
+        "keyv": "^4.5.4"
+      }
+    },
+    "flatted": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+      "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+      "dev": true
+    },
+    "foreground-child": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+      "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^7.0.6",
+        "signal-exit": "^4.0.1"
+      }
+    },
+    "formdata-polyfill": {
+      "version": "4.0.10",
+      "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+      "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+      "dev": true,
+      "requires": {
+        "fetch-blob": "^3.1.2"
+      }
+    },
+    "framer-motion": {
+      "version": "12.5.0",
+      "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.5.0.tgz",
+      "integrity": "sha512-buPlioFbH9/W7rDzYh1C09AuZHAk2D1xTA1BlounJ2Rb9aRg84OXexP0GLd+R83v0khURdMX7b5MKnGTaSg5iA==",
+      "requires": {
+        "motion-dom": "^12.5.0",
+        "motion-utils": "^12.5.0",
+        "tslib": "^2.4.0"
+      }
+    },
+    "fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
+      "optional": true
+    },
+    "function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
+    },
+    "gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+      "dev": true
+    },
+    "glob": {
+      "version": "10.4.5",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+      "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+      "dev": true,
+      "requires": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^3.1.2",
+        "minimatch": "^9.0.4",
+        "minipass": "^7.1.2",
+        "package-json-from-dist": "^1.0.0",
+        "path-scurry": "^1.11.1"
+      },
+      "dependencies": {
+        "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,
+          "requires": {
+            "balanced-match": "^1.0.0"
+          }
+        },
+        "minimatch": {
+          "version": "9.0.5",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+          "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
+        }
+      }
+    },
+    "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,
+      "requires": {
+        "is-glob": "^4.0.3"
+      }
+    },
+    "globals": {
+      "version": "15.15.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+      "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+      "dev": true
+    },
+    "globby": {
+      "version": "14.0.2",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz",
+      "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==",
+      "dev": true,
+      "requires": {
+        "@sindresorhus/merge-streams": "^2.1.0",
+        "fast-glob": "^3.3.2",
+        "ignore": "^5.2.4",
+        "path-type": "^5.0.0",
+        "slash": "^5.1.0",
+        "unicorn-magic": "^0.1.0"
+      },
+      "dependencies": {
+        "path-type": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz",
+          "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==",
+          "dev": true
+        }
+      }
+    },
+    "globrex": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
+      "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
+      "dev": true
+    },
+    "graphemer": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+      "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+      "dev": true
+    },
+    "has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true
+    },
+    "hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "requires": {
+        "function-bind": "^1.1.2"
+      }
+    },
+    "hoist-non-react-statics": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+      "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+      "requires": {
+        "react-is": "^16.7.0"
+      }
+    },
+    "https-proxy-agent": {
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+      "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+      "dev": true,
+      "requires": {
+        "agent-base": "^7.1.2",
+        "debug": "4"
+      }
+    },
+    "ignore": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+      "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+      "dev": true
+    },
+    "import-fresh": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+      "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+      "requires": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+      "dev": true
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
+    },
+    "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,
+      "requires": {
+        "binary-extensions": "^2.0.0"
+      }
+    },
+    "is-core-module": {
+      "version": "2.16.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+      "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+      "requires": {
+        "hasown": "^2.0.2"
+      }
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "dev": true
+    },
+    "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
+    },
+    "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,
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "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
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+      "dev": true
+    },
+    "jackspeak": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+      "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+      "dev": true,
+      "requires": {
+        "@isaacs/cliui": "^8.0.2",
+        "@pkgjs/parseargs": "^0.11.0"
+      }
+    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "js-yaml": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+      "dev": true,
+      "requires": {
+        "argparse": "^2.0.1"
+      }
+    },
+    "jsesc": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+      "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="
+    },
+    "json-buffer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+      "dev": true
+    },
+    "json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+    },
+    "json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
+    },
+    "json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+      "dev": true
+    },
+    "json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "dev": true
+    },
+    "keyv": {
+      "version": "4.5.4",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+      "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+      "dev": true,
+      "requires": {
+        "json-buffer": "3.0.1"
+      }
+    },
+    "levn": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
+      }
+    },
+    "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=="
+    },
+    "locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "dev": true,
+      "requires": {
+        "p-locate": "^5.0.0"
+      }
+    },
+    "lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true
+    },
+    "look-it-up": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/look-it-up/-/look-it-up-2.1.0.tgz",
+      "integrity": "sha512-nMoGWW2HurtuJf6XAL56FWTDCWLOTSsanrgwOyaR5Y4e3zfG5N/0cU5xWZSEU3tBxhQugRbV1xL9jb+ug7yZww==",
+      "dev": true
+    },
+    "lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "dev": true,
+      "requires": {
+        "yallist": "^3.0.2"
+      }
+    },
+    "merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true
+    },
+    "micromatch": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+      "dev": true,
+      "requires": {
+        "braces": "^3.0.3",
+        "picomatch": "^2.3.1"
+      }
+    },
+    "minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minipass": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+      "dev": true
+    },
+    "motion-dom": {
+      "version": "12.5.0",
+      "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.5.0.tgz",
+      "integrity": "sha512-uH2PETDh7m+Hjd1UQQ56yHqwn83SAwNjimNPE/kC+Kds0t4Yh7+29rfo5wezVFpPOv57U4IuWved5d1x0kNhbQ==",
+      "requires": {
+        "motion-utils": "^12.5.0"
+      }
+    },
+    "motion-utils": {
+      "version": "12.5.0",
+      "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.5.0.tgz",
+      "integrity": "sha512-+hFFzvimn0sBMP9iPxBa9OtRX35ZQ3py0UHnb8U29VD+d8lQ8zH3dTygJWqK7av2v6yhg7scj9iZuvTS0f4+SA=="
+    },
+    "ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+    },
+    "mz": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+      "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+      "dev": true,
+      "requires": {
+        "any-promise": "^1.0.0",
+        "object-assign": "^4.0.1",
+        "thenify-all": "^1.0.0"
+      }
+    },
+    "nanoid": {
+      "version": "3.3.9",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz",
+      "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==",
+      "dev": true
+    },
+    "natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+      "dev": true
+    },
+    "next-themes": {
+      "version": "0.4.6",
+      "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz",
+      "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="
+    },
+    "node-domexception": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+      "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+      "dev": true
+    },
+    "node-eval": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/node-eval/-/node-eval-2.0.0.tgz",
+      "integrity": "sha512-Ap+L9HznXAVeJj3TJ1op6M6bg5xtTq8L5CU/PJxtkhea/DrIxdTknGKIECKd/v/Lgql95iuMAYvIzBNd0pmcMg==",
+      "dev": true,
+      "requires": {
+        "path-is-absolute": "1.0.1"
+      }
+    },
+    "node-fetch": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+      "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+      "dev": true,
+      "requires": {
+        "data-uri-to-buffer": "^4.0.0",
+        "fetch-blob": "^3.1.4",
+        "formdata-polyfill": "^4.0.10"
+      }
+    },
+    "node-releases": {
+      "version": "2.0.19",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+      "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+      "dev": true
+    },
+    "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
+    },
+    "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
+    },
+    "optionator": {
+      "version": "0.9.4",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+      "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+      "dev": true,
+      "requires": {
+        "deep-is": "^0.1.3",
+        "fast-levenshtein": "^2.0.6",
+        "levn": "^0.4.1",
+        "prelude-ls": "^1.2.1",
+        "type-check": "^0.4.0",
+        "word-wrap": "^1.2.5"
+      }
+    },
+    "p-limit": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+      "dev": true,
+      "requires": {
+        "yocto-queue": "^0.1.0"
+      }
+    },
+    "p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "dev": true,
+      "requires": {
+        "p-limit": "^3.0.2"
+      }
+    },
+    "package-json-from-dist": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+      "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+      "dev": true
+    },
+    "package-manager-detector": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.1.2.tgz",
+      "integrity": "sha512-iePyefLTOm2gEzbaZKSW+eBMjg+UYsQvUKxmvGXAQ987K16efBg10MxIjZs08iyX+DY2/owKY9DIdu193kX33w==",
+      "dev": true
+    },
+    "parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "requires": {
+        "callsites": "^3.0.0"
+      }
+    },
+    "parse-json": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
+      }
+    },
+    "path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "dev": true
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "dev": true
+    },
+    "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
+    },
+    "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=="
+    },
+    "path-scurry": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+      "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+      "dev": true,
+      "requires": {
+        "lru-cache": "^10.2.0",
+        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "10.4.3",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+          "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+          "dev": true
+        }
+      }
+    },
+    "path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+    },
+    "perfect-freehand": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.2.tgz",
+      "integrity": "sha512-eh31l019WICQ03pkF3FSzHxB8n07ItqIQ++G5UV8JX0zVOXzgTGCqnRR0jJ2h9U8/2uW4W4mtGJELt9kEV0CFQ=="
+    },
+    "picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
+    },
+    "picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true
+    },
+    "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
+    },
+    "postcss": {
+      "version": "8.5.3",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
+      "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
+      "dev": true,
+      "requires": {
+        "nanoid": "^3.3.8",
+        "picocolors": "^1.1.1",
+        "source-map-js": "^1.2.1"
+      }
+    },
+    "prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+      "dev": true
+    },
+    "prettier": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
+      "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
+      "dev": true
+    },
+    "proxy-compare": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-3.0.1.tgz",
+      "integrity": "sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q=="
+    },
+    "proxy-memoize": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/proxy-memoize/-/proxy-memoize-3.0.1.tgz",
+      "integrity": "sha512-VDdG/VYtOgdGkWJx7y0o7p+zArSf2383Isci8C+BP3YXgMYDoPd3cCBjw0JdWb6YBb9sFiOPbAADDVTPJnh+9g==",
+      "requires": {
+        "proxy-compare": "^3.0.0"
+      }
+    },
+    "punycode": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "dev": true
+    },
+    "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
+    },
+    "react": {
+      "version": "19.0.0",
+      "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz",
+      "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="
+    },
+    "react-dom": {
+      "version": "19.0.0",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz",
+      "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==",
+      "requires": {
+        "scheduler": "^0.25.0"
+      }
+    },
+    "react-icons": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz",
+      "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw=="
+    },
+    "react-is": {
+      "version": "16.13.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+    },
+    "react-refresh": {
+      "version": "0.14.2",
+      "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
+      "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
+      "dev": true
+    },
+    "react-router": {
+      "version": "7.3.0",
+      "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.3.0.tgz",
+      "integrity": "sha512-466f2W7HIWaNXTKM5nHTqNxLrHTyXybm7R0eBlVSt0k/u55tTCDO194OIx/NrYD4TS5SXKTNekXfT37kMKUjgw==",
+      "requires": {
+        "@types/cookie": "^0.6.0",
+        "cookie": "^1.0.1",
+        "set-cookie-parser": "^2.6.0",
+        "turbo-stream": "2.4.0"
+      }
+    },
+    "react-tag-input-component": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/react-tag-input-component/-/react-tag-input-component-2.0.2.tgz",
+      "integrity": "sha512-dydI9luVwwv9vrjE5u1TTnkcOVkOVL6mhFti8r6hLi78V2F2EKWQOLptURz79UYbDHLSk6tnbvGl8FE+sMpADg=="
+    },
+    "readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "requires": {
+        "picomatch": "^2.2.1"
+      }
+    },
+    "regenerator-runtime": {
+      "version": "0.14.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+    },
+    "resolve": {
+      "version": "1.22.10",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+      "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+      "requires": {
+        "is-core-module": "^2.16.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      }
+    },
+    "resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
+    },
+    "reusify": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+      "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+      "dev": true
+    },
+    "rollup": {
+      "version": "4.35.0",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.35.0.tgz",
+      "integrity": "sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==",
+      "dev": true,
+      "requires": {
+        "@rollup/rollup-android-arm-eabi": "4.35.0",
+        "@rollup/rollup-android-arm64": "4.35.0",
+        "@rollup/rollup-darwin-arm64": "4.35.0",
+        "@rollup/rollup-darwin-x64": "4.35.0",
+        "@rollup/rollup-freebsd-arm64": "4.35.0",
+        "@rollup/rollup-freebsd-x64": "4.35.0",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.35.0",
+        "@rollup/rollup-linux-arm-musleabihf": "4.35.0",
+        "@rollup/rollup-linux-arm64-gnu": "4.35.0",
+        "@rollup/rollup-linux-arm64-musl": "4.35.0",
+        "@rollup/rollup-linux-loongarch64-gnu": "4.35.0",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.35.0",
+        "@rollup/rollup-linux-riscv64-gnu": "4.35.0",
+        "@rollup/rollup-linux-s390x-gnu": "4.35.0",
+        "@rollup/rollup-linux-x64-gnu": "4.35.0",
+        "@rollup/rollup-linux-x64-musl": "4.35.0",
+        "@rollup/rollup-win32-arm64-msvc": "4.35.0",
+        "@rollup/rollup-win32-ia32-msvc": "4.35.0",
+        "@rollup/rollup-win32-x64-msvc": "4.35.0",
+        "@types/estree": "1.0.6",
+        "fsevents": "~2.3.2"
+      }
+    },
+    "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,
+      "requires": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "scheduler": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
+      "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="
+    },
+    "scule": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz",
+      "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
+      "dev": true
+    },
+    "semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true
+    },
+    "set-cookie-parser": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
+      "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="
+    },
+    "shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "^3.0.0"
+      }
+    },
+    "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
+    },
+    "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
+    },
+    "sisteransi": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+      "dev": true
+    },
+    "slash": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
+      "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
+      "dev": true
+    },
+    "source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="
+    },
+    "source-map-js": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+      "dev": true
+    },
+    "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,
+      "requires": {
+        "eastasianwidth": "^0.2.0",
+        "emoji-regex": "^9.2.2",
+        "strip-ansi": "^7.0.1"
+      }
+    },
+    "string-width-cjs": {
+      "version": "npm:string-width@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,
+      "requires": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "dependencies": {
+        "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
+        },
+        "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
+        },
+        "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,
+          "requires": {
+            "ansi-regex": "^5.0.1"
+          }
+        }
+      }
+    },
+    "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,
+      "requires": {
+        "ansi-regex": "^6.0.1"
+      }
+    },
+    "strip-ansi-cjs": {
+      "version": "npm:strip-ansi@6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^5.0.1"
+      },
+      "dependencies": {
+        "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
+        }
+      }
+    },
+    "strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "dev": true
+    },
+    "stylis": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
+      "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
+    },
+    "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,
+      "requires": {
+        "@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"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+          "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+          "dev": true
+        }
+      }
+    },
+    "supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "requires": {
+        "has-flag": "^4.0.0"
+      }
+    },
+    "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=="
+    },
+    "thenify": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+      "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+      "dev": true,
+      "requires": {
+        "any-promise": "^1.0.0"
+      }
+    },
+    "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,
+      "requires": {
+        "thenify": ">= 3.1.0 < 4"
+      }
+    },
+    "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,
+      "requires": {
+        "is-number": "^7.0.0"
+      }
+    },
+    "ts-api-utils": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz",
+      "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==",
+      "dev": true
+    },
+    "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
+    },
+    "tsconfck": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.5.tgz",
+      "integrity": "sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==",
+      "dev": true
+    },
+    "tslib": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
+    },
+    "turbo-stream": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz",
+      "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g=="
+    },
+    "type-check": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "^1.2.1"
+      }
+    },
+    "typescript": {
+      "version": "5.7.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
+      "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
+      "dev": true
+    },
+    "typescript-eslint": {
+      "version": "8.26.1",
+      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.26.1.tgz",
+      "integrity": "sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/eslint-plugin": "8.26.1",
+        "@typescript-eslint/parser": "8.26.1",
+        "@typescript-eslint/utils": "8.26.1"
+      }
+    },
+    "unicorn-magic": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz",
+      "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
+      "dev": true
+    },
+    "update-browserslist-db": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+      "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+      "dev": true,
+      "requires": {
+        "escalade": "^3.2.0",
+        "picocolors": "^1.1.1"
+      }
+    },
+    "uqr": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz",
+      "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA=="
+    },
+    "uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dev": true,
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "vite": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.1.tgz",
+      "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==",
+      "dev": true,
+      "requires": {
+        "esbuild": "^0.25.0",
+        "fsevents": "~2.3.3",
+        "postcss": "^8.5.3",
+        "rollup": "^4.30.1"
+      }
+    },
+    "vite-tsconfig-paths": {
+      "version": "5.1.4",
+      "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz",
+      "integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.1",
+        "globrex": "^0.1.2",
+        "tsconfck": "^3.0.3"
+      }
+    },
+    "web-streams-polyfill": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+      "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+      "dev": true
+    },
+    "which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dev": true,
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "word-wrap": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+      "dev": true
+    },
+    "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,
+      "requires": {
+        "ansi-styles": "^6.1.0",
+        "string-width": "^5.0.1",
+        "strip-ansi": "^7.0.1"
+      },
+      "dependencies": {
+        "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
+        }
+      }
+    },
+    "wrap-ansi-cjs": {
+      "version": "npm:wrap-ansi@7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "dependencies": {
+        "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
+        },
+        "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
+        },
+        "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,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.1"
+          }
+        },
+        "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,
+          "requires": {
+            "ansi-regex": "^5.0.1"
+          }
+        }
+      }
+    },
+    "yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+      "dev": true
+    },
+    "yaml": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
+    },
+    "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==",
+      "dev": true
+    },
+    "zod": {
+      "version": "3.24.2",
+      "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz",
+      "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==",
+      "dev": true
+    }
+  }
+}
diff --git a/portal/package.json b/portal/package.json
new file mode 100644
index 0000000000..35b0b6300d
--- /dev/null
+++ b/portal/package.json
@@ -0,0 +1,40 @@
+{
+  "name": "portal",
+  "private": true,
+  "version": "0.0.0",
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build": "tsc -b && vite build",
+    "lint": "eslint .",
+    "preview": "vite preview"
+  },
+  "dependencies": {
+    "@chakra-ui/icons": "^2.2.4",
+    "@chakra-ui/react": "^3.12.0",
+    "@emotion/react": "^11.14.0",
+    "@emotion/styled": "^11.14.0",
+    "framer-motion": "^12.5.0",
+    "next-themes": "^0.4.6",
+    "react": "^19.0.0",
+    "react-dom": "^19.0.0",
+    "react-icons": "^5.5.0",
+    "react-router": "^7.3.0",
+    "react-tag-input-component": "^2.0.2"
+  },
+  "devDependencies": {
+    "@chakra-ui/cli": "^3.12.0",
+    "@eslint/js": "^9.21.0",
+    "@types/react": "^19.0.10",
+    "@types/react-dom": "^19.0.4",
+    "@vitejs/plugin-react": "^4.3.4",
+    "eslint": "^9.21.0",
+    "eslint-plugin-react-hooks": "^5.1.0",
+    "eslint-plugin-react-refresh": "^0.4.19",
+    "globals": "^15.15.0",
+    "typescript": "~5.7.2",
+    "typescript-eslint": "^8.24.1",
+    "vite": "^6.2.0",
+    "vite-tsconfig-paths": "^5.1.4"
+  }
+}
diff --git a/portal/public/vite.svg b/portal/public/vite.svg
new file mode 100644
index 0000000000..e7b8dfb1b2
--- /dev/null
+++ b/portal/public/vite.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb [...]
\ No newline at end of file
diff --git a/portal/src/App.tsx b/portal/src/App.tsx
new file mode 100644
index 0000000000..a03737144d
--- /dev/null
+++ b/portal/src/App.tsx
@@ -0,0 +1,41 @@
+import { useColorMode } from "./components/ui/color-mode";
+import { BrowserRouter, Route, Routes } from "react-router";
+import Home from "./components/home";
+import ProjectDetails from "./components/notebooks/ProjectDetails";
+import { Models } from "./components/models";
+import { ModelDetails } from "./components/models/ModelDetails";
+import { Datasets } from "./components/datasets";
+import { DatasetDetails } from "./components/datasets/DatasetDetails";
+
+function App() {
+  const colorMode = useColorMode();
+  if (colorMode.colorMode === "dark") {
+    colorMode.toggleColorMode();
+  }
+
+  return (
+    <>
+      <BrowserRouter>
+        <Routes>
+          <Route index element={<Home />} />
+          <Route path="/notebook">
+            <Route path=":slug" element={<ProjectDetails />} />
+          </Route>
+          <Route path="/repository">
+            <Route path=":slug" element={<ProjectDetails />} />
+          </Route>
+          <Route path="/models">
+            <Route index element={<Models />} />
+            <Route path=":id" element={<ModelDetails />} />
+          </Route>
+          <Route path="/datasets">
+            <Route index element={<Datasets />} />
+            <Route path=":slug" element={<DatasetDetails />} />
+          </Route>
+        </Routes>
+      </BrowserRouter>
+    </>
+  );
+}
+
+export default App;
diff --git a/portal/src/assets/airavata-logo.png b/portal/src/assets/airavata-logo.png
new file mode 100644
index 0000000000..06aea97295
Binary files /dev/null and b/portal/src/assets/airavata-logo.png differ
diff --git a/portal/src/assets/react.svg b/portal/src/assets/react.svg
new file mode 100644
index 0000000000..6c87de9bb3
--- /dev/null
+++ b/portal/src/assets/react.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587 [...]
\ No newline at end of file
diff --git a/portal/src/components/GridContainer.tsx b/portal/src/components/GridContainer.tsx
new file mode 100644
index 0000000000..834a6d3b87
--- /dev/null
+++ b/portal/src/components/GridContainer.tsx
@@ -0,0 +1,17 @@
+import { SimpleGrid } from "@chakra-ui/react";
+
+export const GridContainer = ({ children }: { children: React.ReactNode }) => {
+  return (
+    <SimpleGrid
+      columns={{ base: 1, md: 2, lg: 3 }}
+      gap={4}
+      mt={2}
+      maxH="50vh"
+      overflow="scroll"
+      p={4}
+      bg="gray.50"
+    >
+      {children}
+    </SimpleGrid>
+  );
+};
diff --git a/portal/src/components/Metadata.tsx b/portal/src/components/Metadata.tsx
new file mode 100644
index 0000000000..92b12dd7b8
--- /dev/null
+++ b/portal/src/components/Metadata.tsx
@@ -0,0 +1,66 @@
+import { MetadataType } from "@/interfaces/MetadataType";
+import {
+  Image,
+  HStack,
+  Box,
+  Text,
+  Heading,
+  Avatar,
+  Separator,
+  Badge,
+} from "@chakra-ui/react";
+
+export const Metadata = ({ metadata }: { metadata: MetadataType }) => {
+  return (
+    <>
+      <HStack
+        alignItems={"flex-start"}
+        mb={4}
+        gap={8}
+        justifyContent="space-between"
+      >
+        <Box>
+          <Heading as="h1" size="4xl" mb={4}>
+            {metadata.title}
+          </Heading>
+
+          <HStack>
+            <Avatar.Root shape="full" size="xl">
+              <Avatar.Fallback name={metadata.author.name} />
+              <Avatar.Image src={metadata.author.avatar} />
+            </Avatar.Root>
+
+            <Box>
+              <Text fontWeight="bold">{metadata.author.name}</Text>
+              <Text color="gray.500">{metadata.author.role}</Text>
+            </Box>
+          </HStack>
+        </Box>
+
+        <Image
+          src={metadata.images.headerImage}
+          alt="Notebook Header"
+          rounded="md"
+          maxW="300px"
+        />
+      </HStack>
+
+      <Separator my={6} />
+      <Box>
+        <Heading fontWeight="bold" size="2xl">
+          About
+        </Heading>
+
+        <HStack my={2}>
+          {metadata.tags.map((tag) => (
+            <Badge key={tag} size="lg" rounded="md">
+              {tag}
+            </Badge>
+          ))}
+        </HStack>
+
+        <Text>{metadata.description}</Text>
+      </Box>
+    </>
+  );
+};
diff --git a/portal/src/components/NavBar.tsx b/portal/src/components/NavBar.tsx
new file mode 100644
index 0000000000..f62d1ac85a
--- /dev/null
+++ b/portal/src/components/NavBar.tsx
@@ -0,0 +1,58 @@
+import { Text, Flex, Spacer, Image, HStack, Avatar } from "@chakra-ui/react";
+import ApacheAiravataLogo from "../assets/airavata-logo.png";
+import { Link } from "react-router";
+
+const NAV_CONTENT = [
+  {
+    title: "Home",
+    url: "/",
+  },
+  {
+    title: "Datasets",
+    url: "/datasets",
+  },
+  {
+    title: "Models",
+    url: "/models",
+  },
+];
+
+const NavBar = () => {
+  return (
+    <Flex
+      as="nav"
+      align="center"
+      p={4}
+      boxShadow="sm"
+      position="sticky"
+      top="0"
+      zIndex="1000"
+      bg="white" // Ensure background is not transparent
+    >
+      {/* Logo */}
+      <Link to="/">
+        <Image src={ApacheAiravataLogo} alt="Logo" boxSize="30px" />
+      </Link>
+
+      {/* Navigation Links */}
+      <Flex ml={4} gap={6}>
+        {NAV_CONTENT.map((item) => (
+          <Link key={item.title} to={item.url} color="gray.700">
+            {item.title}
+          </Link>
+        ))}
+      </Flex>
+
+      <Spacer />
+
+      {/* Search Bar */}
+      <HStack _hover={{ cursor: "pointer" }}>
+        <Text>John Doe</Text>
+        <Avatar.Root variant="subtle">
+          <Avatar.Fallback name="John Doe" />
+        </Avatar.Root>
+      </HStack>
+    </Flex>
+  );
+};
+export default NavBar;
diff --git a/portal/src/components/PageHeader.tsx b/portal/src/components/PageHeader.tsx
new file mode 100644
index 0000000000..f4e1e8ee85
--- /dev/null
+++ b/portal/src/components/PageHeader.tsx
@@ -0,0 +1,28 @@
+import { Box, HStack, Text, Heading, Icon } from "@chakra-ui/react";
+import { ReactNode } from "react";
+
+export const PageHeader = ({
+  title,
+  icon,
+  description,
+}: {
+  title: string;
+  icon?: ReactNode;
+  description: string;
+}) => {
+  const fontSize = "4xl";
+  return (
+    <Box>
+      <HStack alignItems="center" gap={4}>
+        {icon && <Icon as={icon} fontSize={fontSize} />}
+        <Heading as="h1" size={fontSize}>
+          {title}
+        </Heading>
+      </HStack>
+
+      <Text color="gray.600" mt={2}>
+        {description}
+      </Text>
+    </Box>
+  );
+};
diff --git a/portal/src/components/datasets/DatasetCard.tsx b/portal/src/components/datasets/DatasetCard.tsx
new file mode 100644
index 0000000000..95d3a84ddf
--- /dev/null
+++ b/portal/src/components/datasets/DatasetCard.tsx
@@ -0,0 +1,70 @@
+import { DatasetType } from "@/interfaces/DatasetType";
+import {
+  Text,
+  Box,
+  Card,
+  HStack,
+  Avatar,
+  Image,
+  Badge,
+} from "@chakra-ui/react";
+import { Link } from "react-router";
+
+export const DatasetCard = ({ dataset }: { dataset: DatasetType }) => {
+  return (
+    <Box>
+      <Card.Root overflow="hidden">
+        <Image
+          src={dataset.metadata.images.headerImage}
+          maxH={100}
+          alt="Green double couch with wooden legs"
+        />
+        <Link to={`/datasets/${dataset.metadata.slug}`}>
+          <Card.Body
+            gap="2"
+            _hover={{
+              bg: "gray.100",
+            }}
+          >
+            <HStack justifyContent="space-between" mb={1}>
+              <Card.Title>{dataset.metadata.title}</Card.Title>
+              <Badge
+                colorPalette={dataset.private ? "red" : "green"}
+                rounded="md"
+              >
+                {dataset.private ? "Private" : "Public"}
+              </Badge>
+            </HStack>
+            <HStack flexWrap={"wrap"}>
+              <Badge colorPalette={"purple"} fontWeight="bold" size="md">
+                {dataset.metadata.type}
+              </Badge>
+              {dataset.metadata.tags.map((tag: string) => (
+                <Badge size="md" key={tag}>
+                  {tag}
+                </Badge>
+              ))}
+            </HStack>
+            <Text color="fg.muted" lineClamp={2}>
+              {dataset.metadata.description}.
+            </Text>
+          </Card.Body>
+        </Link>
+
+        <Card.Footer justifyContent="space-between">
+          <HStack mt={4}>
+            <Avatar.Root shape="full" size="xl">
+              <Avatar.Fallback name={dataset.metadata.author.name} />
+              <Avatar.Image src={dataset.metadata.author.avatar} />
+            </Avatar.Root>
+
+            <Box>
+              <Text fontWeight="bold">{dataset.metadata.author.name}</Text>
+              <Text color="gray.500">{dataset.metadata.author.role}</Text>
+            </Box>
+          </HStack>
+        </Card.Footer>
+      </Card.Root>
+    </Box>
+  );
+};
diff --git a/portal/src/components/datasets/DatasetDetails.tsx b/portal/src/components/datasets/DatasetDetails.tsx
new file mode 100644
index 0000000000..79719752aa
--- /dev/null
+++ b/portal/src/components/datasets/DatasetDetails.tsx
@@ -0,0 +1,54 @@
+import { Metadata } from "../Metadata";
+import NavBar from "../NavBar";
+// @ts-expect-error This is fine
+import { MOCK_DATASETS } from "../../data/MOCK_DATA";
+import { DatasetType } from "@/interfaces/DatasetType";
+import { useEffect, useState } from "react";
+import { Badge, Box, Container, HStack, Icon, Spinner } from "@chakra-ui/react";
+import { Link, useParams } from "react-router";
+import { BiArrowBack } from "react-icons/bi";
+
+async function getDataset(slug: string | undefined) {
+  return MOCK_DATASETS.find(
+    (dataset: DatasetType) => dataset.metadata.slug === slug
+  );
+}
+
+export const DatasetDetails = () => {
+  const [dataset, setDataset] = useState<DatasetType | null>(null);
+  const { slug } = useParams();
+
+  useEffect(() => {
+    async function getData() {
+      const n = await getDataset(slug);
+      setDataset(n);
+    }
+    getData();
+  }, []);
+
+  if (!dataset) return <Spinner />;
+  return (
+    <>
+      <NavBar />
+
+      <Container maxW="breakpoint-lg" mx="auto" p={4} mt={16}>
+        <Box>
+          <HStack alignItems="center" mb={4}>
+            <Icon>
+              <BiArrowBack />
+            </Icon>
+            <Link to="/datasets">Back to Datasets</Link>
+          </HStack>
+        </Box>
+        <Badge
+          colorPalette={dataset.private ? "red" : "green"}
+          rounded="md"
+          mb={1}
+        >
+          {dataset.private ? "Private" : "Public"}
+        </Badge>
+        <Metadata metadata={dataset.metadata} />
+      </Container>
+    </>
+  );
+};
diff --git a/portal/src/components/datasets/index.tsx b/portal/src/components/datasets/index.tsx
new file mode 100644
index 0000000000..82d79d9cb5
--- /dev/null
+++ b/portal/src/components/datasets/index.tsx
@@ -0,0 +1,42 @@
+import NavBar from "../NavBar";
+// @ts-expect-error This is fine
+import { MOCK_DATASETS } from "../../data/MOCK_DATA";
+import { Container, HStack, Input, SimpleGrid } from "@chakra-ui/react";
+import { PageHeader } from "../PageHeader";
+import { LuSearch } from "react-icons/lu";
+import { InputGroup } from "../ui/input-group";
+import { ButtonWithIcon } from "../home/ButtonWithIcon";
+import { FaPlus } from "react-icons/fa";
+import { DatasetCard } from "./DatasetCard";
+import { DatasetType } from "@/interfaces/DatasetType";
+
+export const Datasets = () => {
+  return (
+    <>
+      <NavBar />
+
+      <Container maxW="container.lg" p={4}>
+        <HStack alignItems="flex-end" justify="space-between">
+          <PageHeader
+            title="Datasets"
+            description="Public and Private Scientific Datasets."
+          />
+          <ButtonWithIcon colorPalette="purple" icon={FaPlus}>
+            Dataset
+          </ButtonWithIcon>
+        </HStack>
+        <InputGroup mt={4} endElement={<LuSearch />} w="100%">
+          <Input placeholder="Search" rounded="md" />
+        </InputGroup>
+
+        <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} gap={4} mt={4}>
+          {MOCK_DATASETS.map((dataset: DatasetType) => {
+            return (
+              <DatasetCard dataset={dataset} key={dataset.metadata.slug} />
+            );
+          })}
+        </SimpleGrid>
+      </Container>
+    </>
+  );
+};
diff --git a/portal/src/components/home/AddRepositoryButton.tsx b/portal/src/components/home/AddRepositoryButton.tsx
new file mode 100644
index 0000000000..ed5e0dcc2f
--- /dev/null
+++ b/portal/src/components/home/AddRepositoryButton.tsx
@@ -0,0 +1,125 @@
+import {
+  Dialog,
+  Button,
+  Field,
+  Input,
+  CloseButton,
+  Portal,
+  useDialog,
+  Code,
+  VStack,
+  SimpleGrid,
+  Textarea,
+} from "@chakra-ui/react";
+import { FaPlus } from "react-icons/fa";
+import { ButtonWithIcon } from "./ButtonWithIcon";
+import React from "react";
+
+export const AddRepositoryButton = () => {
+  const dialog = useDialog();
+  // useEffect(() => {
+  //   dialog.setOpen(true);
+  // }, []);
+  return (
+    <>
+      <Dialog.RootProvider value={dialog} size="lg">
+        <Dialog.Trigger asChild>
+          <ButtonWithIcon
+            bg="cyan.600"
+            _hover={{ bg: "cyan.700" }}
+            icon={FaPlus}
+          >
+            Repository
+          </ButtonWithIcon>
+        </Dialog.Trigger>
+        <Portal>
+          <Dialog.Backdrop />
+          <Dialog.Positioner>
+            <Dialog.Content>
+              <Dialog.Body p="4">
+                <Dialog.Title>Add Git Repository</Dialog.Title>
+                <Dialog.Description mt="2">
+                  Start by providing a GitHub URL. If the repository contains a
+                  <Code colorPalette="blue">cybershuttle.yml</Code> file, the
+                  author/tag/workspace information will be pulled from it. If
+                  not, please provide them manually.
+                </Dialog.Description>
+
+                <VStack gap={4} mt="4">
+                  <Field.Root>
+                    <Field.Label>URL</Field.Label>
+                    <Input
+                      type="url"
+                      flexGrow={1}
+                      placeholder="https://github.com/example/repo.git"
+                    />
+                  </Field.Root>
+                  <Field.Root>
+                    <Field.Label>Authors</Field.Label>
+                    <Input
+                      flexGrow={1}
+                      placeholder="John Doe <jo...@test.edu>; Jane Doe <ja...@test.edu>"
+                    />
+                  </Field.Root>
+
+                  <Field.Root>
+                    <Field.Label>Tags</Field.Label>
+                    <Input
+                      flexGrow={1}
+                      placeholder="bmtk-workshop; neuroscience; notebooks"
+                    />
+                  </Field.Root>
+                  <SimpleGrid columns={5} gap={4}>
+                    <Field.Root>
+                      <Field.Label>Dir</Field.Label>
+                      <Input flexGrow={1} placeholder="/workspace" />
+                    </Field.Root>
+                    <Field.Root>
+                      <Field.Label>Nodes</Field.Label>
+                      <Input flexGrow={1} placeholder="1" />
+                    </Field.Root>
+
+                    <Field.Root>
+                      <Field.Label>Min CPU</Field.Label>
+                      <Input flexGrow={1} placeholder="1" />
+                    </Field.Root>
+                    <Field.Root>
+                      <Field.Label>Min GPU</Field.Label>
+                      <Input flexGrow={1} placeholder="1" />
+                    </Field.Root>
+                    <Field.Root>
+                      <Field.Label>Min RAM</Field.Label>
+                      <Input flexGrow={1} placeholder="1" />
+                    </Field.Root>
+                  </SimpleGrid>
+
+                  <Field.Root>
+                    <Field.Label>Data</Field.Label>
+                    <Textarea
+                      flexGrow={1}
+                      rows={4}
+                      placeholder="cyber://321aed:/workspace/data/A
+allen://8a8b2f:/workspace/data/B
+dropbox://4a34d1:/workspace/data/C"
+                    />
+                  </Field.Root>
+                  <Button
+                    bg="cyan.600"
+                    _hover={{ bg: "cyan.700" }}
+                    width="100%"
+                    type="submit"
+                  >
+                    Add Git Repository
+                  </Button>
+                </VStack>
+              </Dialog.Body>
+              <Dialog.CloseTrigger asChild>
+                <CloseButton _hover={{ bg: "gray.100" }} size="sm" />
+              </Dialog.CloseTrigger>
+            </Dialog.Content>
+          </Dialog.Positioner>
+        </Portal>
+      </Dialog.RootProvider>
+    </>
+  );
+};
diff --git a/portal/src/components/home/AddZipButton.tsx b/portal/src/components/home/AddZipButton.tsx
new file mode 100644
index 0000000000..aae98694c0
--- /dev/null
+++ b/portal/src/components/home/AddZipButton.tsx
@@ -0,0 +1,113 @@
+import {
+  Dialog,
+  Button,
+  CloseButton,
+  Portal,
+  useDialog,
+  Code,
+  Box,
+  Icon,
+  FileUpload,
+  Spacer,
+  useFileUpload,
+} from "@chakra-ui/react";
+import { FaPlus } from "react-icons/fa";
+import { ButtonWithIcon } from "./ButtonWithIcon";
+import { LuUpload } from "react-icons/lu";
+
+export const AddZipButton = () => {
+  const dialog = useDialog();
+  // useEffect(() => {
+  //   dialog.setOpen(true);
+  // }, []);
+  const fileUpload = useFileUpload({
+    maxFiles: 1,
+    accept: ".zip",
+  });
+
+  return (
+    <>
+      <Dialog.RootProvider
+        value={dialog}
+        size="lg"
+        onExitComplete={() => {
+          fileUpload.clearFiles(); // Clear files when modal closes
+        }}
+      >
+        <Dialog.Trigger asChild>
+          <ButtonWithIcon
+            bg="pink.500"
+            _hover={{ bg: "pink.600" }}
+            icon={FaPlus}
+          >
+            Zip
+          </ButtonWithIcon>
+        </Dialog.Trigger>
+        <Portal>
+          <Dialog.Backdrop />
+          <Dialog.Positioner>
+            <Dialog.Content>
+              <Dialog.Body p="4">
+                <Dialog.Title>Add Zip File</Dialog.Title>
+                <Dialog.Description mt="2">
+                  Upload a ZIP file containing your repository. If the
+                  repository contains a{" "}
+                  <Code colorPalette="blue">cybershuttle.yml</Code> file, the
+                  author/tag/workspace information will be pulled from it. If
+                  not, please provide them manually.
+                </Dialog.Description>
+                <FileUpload.RootProvider
+                  alignItems="stretch"
+                  mt={4}
+                  value={fileUpload}
+                >
+                  <FileUpload.HiddenInput />
+                  {fileUpload.acceptedFiles.length === 0 && (
+                    <FileUpload.Dropzone>
+                      <Icon size="md" color="fg.muted">
+                        <LuUpload />
+                      </Icon>
+                      <FileUpload.DropzoneContent>
+                        <Box>Drag and drop your .zip file here</Box>
+                      </FileUpload.DropzoneContent>
+                    </FileUpload.Dropzone>
+                  )}
+
+                  <FileUpload.ItemGroup>
+                    <FileUpload.Context>
+                      {({ acceptedFiles }) =>
+                        acceptedFiles.map((file) => (
+                          <FileUpload.Item key={file.name} file={file}>
+                            <FileUpload.ItemPreview />
+                            <FileUpload.ItemName />
+                            <FileUpload.ItemSizeText />
+                            <Spacer />
+                            <FileUpload.ItemDeleteTrigger />
+                          </FileUpload.Item>
+                        ))
+                      }
+                    </FileUpload.Context>
+                  </FileUpload.ItemGroup>
+                </FileUpload.RootProvider>
+
+                <Button
+                  bg="pink.500"
+                  _hover={{ bg: "pink.600" }}
+                  width="100%"
+                  type="submit"
+                  mt={4}
+                  disabled={fileUpload.acceptedFiles.length === 0}
+                >
+                  Add Zip File
+                </Button>
+              </Dialog.Body>
+              <Dialog.CloseTrigger asChild>
+                <CloseButton _hover={{ bg: "gray.100" }} size="sm" />
+              </Dialog.CloseTrigger>
+            </Dialog.Content>
+          </Dialog.Positioner>
+        </Portal>
+      </Dialog.RootProvider>
+    </>
+  );
+};
diff --git a/portal/src/components/home/ButtonWithIcon.tsx b/portal/src/components/home/ButtonWithIcon.tsx
new file mode 100644
index 0000000000..c970dcb185
--- /dev/null
+++ b/portal/src/components/home/ButtonWithIcon.tsx
@@ -0,0 +1,22 @@
+import { Button, ButtonProps, Icon } from "@chakra-ui/react";
+import { IconType } from "react-icons";
+
+interface ButtonWithIconProps extends ButtonProps {
+  icon: IconType;
+  children: React.ReactNode;
+}
+
+export const ButtonWithIcon = ({
+  icon: UserIcon,
+  children,
+  ...rest
+}: ButtonWithIconProps) => {
+  return (
+    <Button {...rest}>
+      <Icon size="xs">
+        <UserIcon fontWeight="solid" />
+      </Icon>
+      {children}
+    </Button>
+  );
+};
diff --git a/portal/src/components/home/ProjectCard.tsx b/portal/src/components/home/ProjectCard.tsx
new file mode 100644
index 0000000000..05173203c2
--- /dev/null
+++ b/portal/src/components/home/ProjectCard.tsx
@@ -0,0 +1,84 @@
+import { ProjectType } from "@/interfaces/ProjectType";
+import {
+  Text,
+  Box,
+  Card,
+  HStack,
+  Avatar,
+  Button,
+  Icon,
+  Image,
+  Badge,
+} from "@chakra-ui/react";
+import { FaPlay } from "react-icons/fa";
+import { Link } from "react-router";
+
+export const ProjectCard = ({ project }: { project: ProjectType }) => {
+  return (
+    <Box>
+      <Card.Root overflow="hidden">
+        <Image
+          src={project.metadata.images.headerImage}
+          maxH={100}
+          alt="Green double couch with wooden legs"
+        />
+        <Link to={`/${project.metadata.type}/${project.metadata.slug}`}>
+          <Card.Body
+            gap="2"
+            _hover={{
+              bg: "gray.100",
+            }}
+          >
+            <Card.Title>{project.metadata.title}</Card.Title>
+            <HStack flexWrap={"wrap"}>
+              <Badge
+                colorPalette={
+                  project.metadata.type === "notebook" ? "cyan" : "pink"
+                }
+                fontWeight="bold"
+                size="md"
+              >
+                {project.metadata.type}
+              </Badge>
+              {project.metadata.tags.map((tag: string) => (
+                <Badge size="md" key={tag}>
+                  {tag}
+                </Badge>
+              ))}
+            </HStack>
+            <Text color="fg.muted" lineClamp={2}>
+              {project.metadata.description}.
+            </Text>
+          </Card.Body>
+        </Link>
+
+        <Card.Footer justifyContent="space-between">
+          <HStack mt={4}>
+            <Avatar.Root shape="full" size="xl">
+              <Avatar.Fallback name={project.metadata.author.name} />
+              <Avatar.Image src={project.metadata.author.avatar} />
+            </Avatar.Root>
+
+            <Box>
+              <Text fontWeight="bold">{project.metadata.author.name}</Text>
+              <Text color="gray.500">{project.metadata.author.role}</Text>
+            </Box>
+          </HStack>
+
+          <Button
+            bg={project.metadata.type === "notebook" ? "cyan.500" : "pink.500"}
+            _hover={{
+              bg:
+                project.metadata.type === "notebook" ? "cyan.600" : "pink.600",
+            }}
+          >
+            Run
+            <Icon ml={1} size={"sm"}>
+              <FaPlay />
+            </Icon>
+          </Button>
+        </Card.Footer>
+      </Card.Root>
+    </Box>
+  );
+};
diff --git a/portal/src/components/home/ProjectsSection.tsx b/portal/src/components/home/ProjectsSection.tsx
new file mode 100644
index 0000000000..836621dbd8
--- /dev/null
+++ b/portal/src/components/home/ProjectsSection.tsx
@@ -0,0 +1,28 @@
+import { ProjectType } from "@/interfaces/ProjectType";
+import { Input } from "@chakra-ui/react";
+import { LuSearch } from "react-icons/lu";
+// @ts-expect-error This is fine
+import { MOCK_PROJECTS } from "../../data/MOCK_DATA";
+import { ProjectCard } from "./ProjectCard";
+import { InputGroup } from "../ui/input-group";
+import { GridContainer } from "../GridContainer";
+
+export const ProjectsSection = () => {
+  // shuffle projects
+  // const shuffledProjects = MOCK_PROJECTS.sort(() => 0.5 - Math.random());
+
+  const projects = MOCK_PROJECTS;
+  return (
+    <>
+      <InputGroup mt={2} endElement={<LuSearch />} w="100%">
+        <Input placeholder="Search" rounded="md" />
+      </InputGroup>
+
+      <GridContainer>
+        {projects.map((project: ProjectType) => {
+          return <ProjectCard key={project.metadata.slug} project={project} />;
+        })}
+      </GridContainer>
+    </>
+  );
+};
diff --git a/portal/src/components/home/SessionCard.tsx b/portal/src/components/home/SessionCard.tsx
new file mode 100644
index 0000000000..a6bf2ee4be
--- /dev/null
+++ b/portal/src/components/home/SessionCard.tsx
@@ -0,0 +1,71 @@
+import { SessionType } from "@/interfaces/SessionType";
+import {
+  Box,
+  Text,
+  Card,
+  Heading,
+  HStack,
+  SimpleGrid,
+  Badge,
+} from "@chakra-ui/react";
+
+const getColorPalette = (status: string) => {
+  switch (status) {
+    case "running":
+      return "green";
+    case "stopped":
+      return "red";
+    case "pending":
+      return "yellow";
+    default:
+      return "gray";
+  }
+};
+export const SessionCard = ({ session }: { session: SessionType }) => {
+  return (
+    <Card.Root
+      size="sm"
+      bg={
+        session.title.toLocaleLowerCase() === "jupyter"
+          ? "green.50"
+          : "purple.50"
+      }
+    >
+      <Card.Header>
+        <HStack justify="space-between" alignItems="flex-start">
+          <Box>
+            <Heading size="lg">{session.title}</Heading>
+            <Text color="fg.muted">{session.started}</Text>
+          </Box>
+          <Badge size="md" colorPalette={getColorPalette(session.status)}>
+            {session.status}
+          </Badge>
+        </HStack>
+      </Card.Header>
+      <Card.Body>
+        <SimpleGrid columns={2}>
+          <KeyValue label="Models" value={session.models.join(", ")} />
+          <KeyValue label="Datasets" value={session.datasets.join(", ")} />
+          <KeyValue label="Nodes" value={session.nodes.toString()} />
+          <KeyValue label="RAM" value={session.ram.toString()} />
+          <KeyValue label="Storage" value={session.storage.toString()} />
+        </SimpleGrid>
+      </Card.Body>
+    </Card.Root>
+  );
+};
+
+export const KeyValue = ({
+  label,
+  value,
+}: {
+  label: string;
+  value: string;
+}) => {
+  return (
+    <HStack>
+      <Text fontWeight="bold">{label}:</Text>
+      <Text>{value}</Text>
+    </HStack>
+  );
+};
diff --git a/portal/src/components/home/SessionsSection.tsx b/portal/src/components/home/SessionsSection.tsx
new file mode 100644
index 0000000000..d3dd2eeea4
--- /dev/null
+++ b/portal/src/components/home/SessionsSection.tsx
@@ -0,0 +1,17 @@
+// @ts-expect-error This is fine
+import { MOCK_SESSIONS } from "../../data/MOCK_DATA";
+import { SessionType } from "@/interfaces/SessionType";
+import { SessionCard } from "./SessionCard";
+import { GridContainer } from "../GridContainer";
+
+export const SessionsSection = () => {
+  return (
+    <>
+      <GridContainer>
+        {MOCK_SESSIONS.map((session: SessionType) => {
+          return <SessionCard key={session.sessionId} session={session} />;
+        })}
+      </GridContainer>
+    </>
+  );
+};
diff --git a/portal/src/components/home/index.tsx b/portal/src/components/home/index.tsx
new file mode 100644
index 0000000000..6a96f64e5e
--- /dev/null
+++ b/portal/src/components/home/index.tsx
@@ -0,0 +1,61 @@
+import { Box, HStack, Container } from "@chakra-ui/react";
+
+import NavBar from "../NavBar";
+import { PageHeader } from "../PageHeader";
+import { AddRepositoryButton } from "./AddRepositoryButton";
+import { AddZipButton } from "./AddZipButton";
+import { ProjectsSection } from "./ProjectsSection";
+import { ButtonWithIcon } from "./ButtonWithIcon";
+import { FaPlus } from "react-icons/fa";
+import { SessionsSection } from "./SessionsSection";
+
+const Home = () => {
+  return (
+    <Box>
+      <NavBar />
+
+      <Container maxW="container.xl" p={4}>
+        <HStack alignItems="flex-end" justify="space-between">
+          <PageHeader
+            title="Notebooks"
+            description="Community-Published Scientific Notebooks and Repositories."
+          />
+
+          <HStack gap={4}>
+            <AddZipButton />
+            <AddRepositoryButton />
+          </HStack>
+        </HStack>
+
+        <ProjectsSection />
+
+        <HStack alignItems="flex-end" justify="space-between" mt={4}>
+          <PageHeader
+            title="Sessions"
+            description="Stop or attach to past sessions. Each session preserves your code and data."
+          />
+
+          <HStack gap={4}>
+            <ButtonWithIcon
+              bg="purple.500"
+              _hover={{ bg: "purple.600" }}
+              icon={FaPlus}
+            >
+              VSCode
+            </ButtonWithIcon>
+            <ButtonWithIcon
+              bg="green.600"
+              _hover={{ bg: "green.700" }}
+              icon={FaPlus}
+            >
+              Jupyter
+            </ButtonWithIcon>
+          </HStack>
+        </HStack>
+        <SessionsSection />
+      </Container>
+    </Box>
+  );
+};
+
+export default Home;
diff --git a/portal/src/components/models/ModelCard.tsx b/portal/src/components/models/ModelCard.tsx
new file mode 100644
index 0000000000..9fd0898e54
--- /dev/null
+++ b/portal/src/components/models/ModelCard.tsx
@@ -0,0 +1,34 @@
+import { Badge, Box, Card, HStack, Heading } from "@chakra-ui/react";
+import { ModelType } from "@/interfaces/ModelType";
+import { Link } from "react-router";
+export const ModelCard = ({ model }: { model: ModelType }) => {
+  return (
+    <Box>
+      <Card.Root
+        size="sm"
+        _hover={{
+          bg: "gray.100",
+          cursor: "pointer",
+        }}
+      >
+        <Link to={`/models/${model.appModuleId}`}>
+          <Card.Header>
+            <HStack
+              justifyContent="space-between"
+              alignItems="flex-start"
+              flexWrap="wrap"
+            >
+              <Heading size="md"> {model.appModuleName}</Heading>
+              {model.appModuleVersion && (
+                <Badge size="md" colorPalette="green">
+                  {model.appModuleVersion}
+                </Badge>
+              )}
+            </HStack>
+          </Card.Header>
+          <Card.Body color="fg.muted">{model.appModuleDescription}</Card.Body>
+        </Link>
+      </Card.Root>
+    </Box>
+  );
+};
diff --git a/portal/src/components/models/ModelDetails.tsx b/portal/src/components/models/ModelDetails.tsx
new file mode 100644
index 0000000000..db3eff60ff
--- /dev/null
+++ b/portal/src/components/models/ModelDetails.tsx
@@ -0,0 +1,96 @@
+import { useParams } from "react-router";
+import NavBar from "../NavBar";
+// @ts-expect-error This is fine
+import { MOCK_MODELS } from "../../data/MOCK_DATA";
+import { ModelType } from "@/interfaces/ModelType";
+import { useState, useEffect } from "react";
+import {
+  Badge,
+  Button,
+  Code,
+  Container,
+  HStack,
+  Heading,
+  Text,
+} from "@chakra-ui/react";
+
+async function getModel(id: string | undefined) {
+  return MOCK_MODELS.find((model: ModelType) => model.appModuleId === id);
+}
+
+export const ModelDetails = () => {
+  const { id } = useParams();
+  const [model, setModel] = useState<ModelType | null>(null);
+  const [copyClicked, setCopyClicked] = useState(false);
+
+  useEffect(() => {
+    if (!id) return;
+
+    async function getData() {
+      const n = await getModel(id);
+      setModel(n);
+    }
+    getData();
+  }, [id]);
+
+  if (!model) return null;
+
+  const templateCode = `exp = md.AlphaFold2.initialize(
+    name=...,
+    input_seq=...,
+    max_template_date=...,
+    model_preset=...,
+    multimers_per_model=...,
+)
+exp.create_task()
+exp.plan().launch()`;
+
+  return (
+    <>
+      <NavBar />
+
+      <Container maxW="breakpoint-md" p={4}>
+        <HStack
+          alignItems="center"
+          mt={4}
+          justifyContent="space-between"
+          flexWrap="wrap"
+        >
+          <Heading size="4xl">{model.appModuleName}</Heading>
+          {model.appModuleVersion && (
+            <Badge size="md" colorPalette="green">
+              {model.appModuleVersion}
+            </Badge>
+          )}
+        </HStack>
+        <Text color="fg.muted" mt={2}>
+          {model.appModuleDescription}
+        </Text>
+
+        <Heading size="2xl" mt={4}>
+          Example
+          <Button
+            size="xs"
+            ml={2}
+            colorPalette="teal"
+            onClick={() => {
+              navigator.clipboard.writeText(templateCode);
+              setCopyClicked(true);
+              setTimeout(() => setCopyClicked(false), 2000);
+            }}
+          >
+            {copyClicked ? "Copied!" : "Copy"}
+          </Button>
+        </Heading>
+
+        <Code
+          mt={2}
+          p={2}
+          display="block"
+          whiteSpace="pre"
+          children={templateCode}
+        />
+      </Container>
+    </>
+  );
+};
diff --git a/portal/src/components/models/index.tsx b/portal/src/components/models/index.tsx
new file mode 100644
index 0000000000..12679290e8
--- /dev/null
+++ b/portal/src/components/models/index.tsx
@@ -0,0 +1,40 @@
+import NavBar from "../NavBar";
+// @ts-expect-error This is fine
+import { MOCK_MODELS } from "../../data/MOCK_DATA";
+import { Container, HStack, Input, SimpleGrid } from "@chakra-ui/react";
+import { PageHeader } from "../PageHeader";
+import { ModelCard } from "./ModelCard";
+import { ModelType } from "@/interfaces/ModelType";
+import { LuSearch } from "react-icons/lu";
+import { InputGroup } from "../ui/input-group";
+import { ButtonWithIcon } from "../home/ButtonWithIcon";
+import { FaPlus } from "react-icons/fa";
+
+export const Models = () => {
+  return (
+    <>
+      <NavBar />
+
+      <Container maxW="container.lg" p={4}>
+        <HStack alignItems="flex-end" justify="space-between">
+          <PageHeader
+            title="Models"
+            description="Public and Private Scientific models that can be run with varying inputs."
+          />
+          <ButtonWithIcon colorPalette="teal" icon={FaPlus}>
+            Model
+          </ButtonWithIcon>
+        </HStack>
+        <InputGroup mt={4} endElement={<LuSearch />} w="100%">
+          <Input placeholder="Search" rounded="md" />
+        </InputGroup>
+
+        <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} gap={4} mt={4}>
+          {MOCK_MODELS.map((model: ModelType) => {
+            return <ModelCard model={model} key={model.appModuleId} />;
+          })}
+        </SimpleGrid>
+      </Container>
+    </>
+  );
+};
diff --git a/portal/src/components/notebooks/NotebookCard.tsx b/portal/src/components/notebooks/NotebookCard.tsx
new file mode 100644
index 0000000000..d2bda42287
--- /dev/null
+++ b/portal/src/components/notebooks/NotebookCard.tsx
@@ -0,0 +1,64 @@
+import {
+  Box,
+  Image,
+  Icon,
+  Text,
+  Card,
+  HStack,
+  Avatar,
+  Button,
+} from "@chakra-ui/react";
+import { FaPlay } from "react-icons/fa";
+import { Link } from "react-router";
+
+export const NotebookCard = ({ notebook }: { notebook: any }) => {
+  return (
+    <Box>
+      <Card.Root overflow="hidden">
+        <Image
+          src={notebook.images.headerImage}
+          alt="Green double couch with wooden legs"
+        />
+        <Link to={notebook.slug}>
+          <Card.Body
+            gap="2"
+            _hover={{
+              bg: "gray.100",
+            }}
+          >
+            <Card.Title>{notebook.title}</Card.Title>
+            <HStack>
+              {notebook.tags.map((tag: string) => (
+                <Text key={tag} bg="gray.200" p={1} rounded="md">
+                  {tag}
+                </Text>
+              ))}
+            </HStack>
+            <Card.Description>{notebook.description}.</Card.Description>
+          </Card.Body>
+        </Link>
+
+        <Card.Footer justifyContent="space-between">
+          <HStack mt={4}>
+            <Avatar.Root shape="full" size="xl">
+              <Avatar.Fallback name={notebook.author.name} />
+              <Avatar.Image src={notebook.author.avatar} />
+            </Avatar.Root>
+
+            <Box>
+              <Text fontWeight="bold">{notebook.author.name}</Text>
+              <Text color="gray.500">{notebook.author.role}</Text>
+            </Box>
+          </HStack>
+
+          <Button>
+            Run
+            <Icon ml={1} size={"sm"}>
+              <FaPlay />
+            </Icon>
+          </Button>
+        </Card.Footer>
+      </Card.Root>
+    </Box>
+  );
+};
diff --git a/portal/src/components/notebooks/ProjectDetails.tsx b/portal/src/components/notebooks/ProjectDetails.tsx
new file mode 100644
index 0000000000..2cf9590076
--- /dev/null
+++ b/portal/src/components/notebooks/ProjectDetails.tsx
@@ -0,0 +1,98 @@
+import { Link, useParams } from "react-router";
+import NavBar from "../NavBar";
+import {
+  Container,
+  Spinner,
+  HStack,
+  Box,
+  Separator,
+  Button,
+  Icon,
+  Link as ChakraLink,
+} from "@chakra-ui/react";
+// @ts-expect-error This is fine
+import { MOCK_PROJECTS } from "../../data/MOCK_DATA";
+import { useEffect, useState } from "react";
+import { BiArrowBack } from "react-icons/bi";
+import { ProjectType } from "@/interfaces/ProjectType";
+import { Metadata } from "../Metadata";
+
+async function getProject(slug: string | undefined) {
+  return MOCK_PROJECTS.find(
+    (project: ProjectType) => project.metadata.slug === slug
+  );
+}
+
+const ProjectDetails = () => {
+  const { slug } = useParams();
+  const [project, setProject] = useState<ProjectType | null>(null);
+
+  useEffect(() => {
+    if (!slug) return;
+
+    async function getData() {
+      const n = await getProject(slug);
+      setProject(n);
+    }
+    getData();
+  }, [slug]);
+
+  if (!project) return <Spinner />;
+
+  const isNotebook = project?.notebookViewer !== undefined;
+
+  return (
+    <>
+      <NavBar />
+
+      <Container maxW="breakpoint-lg" mx="auto" p={4} mt={16}>
+        <Box>
+          <HStack alignItems="center" mb={4}>
+            <Icon>
+              <BiArrowBack />
+            </Icon>
+            <Link to="/">Back to Projects</Link>
+          </HStack>
+        </Box>
+        <Metadata metadata={project.metadata} />
+
+        <Separator my={8} />
+
+        <Button colorPalette="teal" mb={4} w="full">
+          <ChakraLink
+            target="_blank"
+            href={project?.notebookViewer || project?.repositoryUrl}
+            color="white"
+            fontWeight="bold"
+            display="block"
+            width="100%"
+            textAlign="center"
+          >
+            Open
+          </ChakraLink>
+        </Button>
+
+        <Box border="2px solid black">
+          <Box height="600px" borderRadius="md" overflow="hidden">
+            {isNotebook ? (
+              <iframe
+                title="notebook"
+                src={project?.notebookViewer}
+                width="100%"
+                height="100%"
+              />
+            ) : (
+              <iframe
+                width="100%"
+                height="100%"
+                src={`https://emgithub.com/iframe.html?target=${project.repositoryUrl}%2Fblob%2Fmaster%2FREADME.md&style=default&type=markdown&showBorder=on&showLineNumbers=on&showFileMeta=on&showFullPath=on&showCopy=on`}
+              ></iframe>
+            )}
+          </Box>
+        </Box>
+      </Container>
+    </>
+  );
+};
+
+export default ProjectDetails;
diff --git a/portal/src/components/notebooks/index.tsx b/portal/src/components/notebooks/index.tsx
new file mode 100644
index 0000000000..7fa14096d3
--- /dev/null
+++ b/portal/src/components/notebooks/index.tsx
@@ -0,0 +1,55 @@
+import { Box, Container, HStack, Input, SimpleGrid } from "@chakra-ui/react";
+import NavBar from "../NavBar";
+import { PageHeader } from "../PageHeader";
+import { FaCode } from "react-icons/fa";
+import { MOCK_NOTEBOOKS } from "../../data/MOCK_DATA";
+import { NotebookCard } from "./NotebookCard";
+import { InputGroup } from "../ui/input-group";
+import { LuSearch } from "react-icons/lu";
+import { TagsInput } from "react-tag-input-component";
+import { useState } from "react";
+
+const Notebooks = () => {
+  const [tags, setTags] = useState<string[]>([]);
+  let filteredNotebooks = MOCK_NOTEBOOKS;
+  if (tags) {
+    filteredNotebooks = MOCK_NOTEBOOKS.filter((notebook) => {
+      return tags.every((tag) => notebook.tags.includes(tag));
+    });
+  }
+  return (
+    <>
+      <NavBar />
+
+      <Container maxW="container.lg" mt={8}>
+        <PageHeader
+          title="Notebooks"
+          icon={<FaCode />}
+          description="Create and manage your notebooks. From here, you can create new notebooks, view existing ones, and manage them."
+        />
+        <InputGroup endElement={<LuSearch />} w="100%" mt={16}>
+          <Input placeholder="Search" rounded="md" />
+        </InputGroup>
+        <Box mt={4}>
+          <TagsInput
+            value={tags}
+            onChange={setTags}
+            placeHolder="Filter by tags"
+          />
+        </Box>
+        <SimpleGrid
+          columns={{ base: 1, md: 2, lg: 3 }}
+          mt={4}
+          gap={12}
+          justifyContent="space-around"
+        >
+          {filteredNotebooks.map((notebook: any) => {
+            return <NotebookCard key={notebook.slug} notebook={notebook} />;
+          })}
+        </SimpleGrid>
+      </Container>
+    </>
+  );
+};
+
+export default Notebooks;
diff --git a/portal/src/components/repositories/RepositoryCard.tsx b/portal/src/components/repositories/RepositoryCard.tsx
new file mode 100644
index 0000000000..5d5f2ba8e4
--- /dev/null
+++ b/portal/src/components/repositories/RepositoryCard.tsx
@@ -0,0 +1,39 @@
+import {
+  Card,
+  Heading,
+  Box,
+  Text,
+  Link as ChakraLink,
+  HStack,
+} from "@chakra-ui/react";
+export const RepositoryCard = ({ repository }) => {
+  return (
+    <Card.Root width="100%">
+      <Card.Header>
+        <HStack justifyContent="space-between" alignItems="flex-start">
+          <Box>
+            <Heading size="md">{repository.title}</Heading>
+            <Text color="gray.500" mt={2}>
+              {repository.date}
+            </Text>
+          </Box>
+
+          <Text>
+            <ChakraLink
+              href={repository.githubUrl}
+              target="_blank"
+              bg="black"
+              color="white"
+              p={2}
+              rounded="md"
+              fontWeight="bold"
+            >
+              View on GitHub
+            </ChakraLink>
+          </Text>
+        </HStack>
+      </Card.Header>
+      <Card.Body color="fg.muted">{repository.description}</Card.Body>
+    </Card.Root>
+  );
+};
diff --git a/portal/src/components/repositories/index.tsx b/portal/src/components/repositories/index.tsx
new file mode 100644
index 0000000000..4b1e1ebf2d
--- /dev/null
+++ b/portal/src/components/repositories/index.tsx
@@ -0,0 +1,39 @@
+import { Container, VStack } from "@chakra-ui/react";
+import NavBar from "../NavBar";
+import { BsGithub } from "react-icons/bs";
+import { PageHeader } from "../PageHeader";
+import { MOCK_REPOSITORIES } from "../../data/MOCK_DATA";
+import { RepositoryCard } from "./RepositoryCard";
+
+const Repositories = () => {
+  return (
+    <>
+      <NavBar />
+
+      <Container maxW="container.lg" mt={8}>
+        <PageHeader
+          title="Repositories"
+          icon={<BsGithub />}
+          description="View the most viewed repositories on GitHub, all central to this page."
+        />
+
+        <VStack gap={4} mt={8}>
+          {
+            // This is the code that will be replaced by the code snippet
+            // from the instructions
+            MOCK_REPOSITORIES.map((repository) => {
+              return (
+                <RepositoryCard
+                  repository={repository}
+                  key={repository.githubUrl}
+                />
+              );
+            })
+          }
+        </VStack>
+      </Container>
+    </>
+  );
+};
+
+export default Repositories;
diff --git a/portal/src/components/ui/color-mode.tsx b/portal/src/components/ui/color-mode.tsx
new file mode 100644
index 0000000000..f93feabca9
--- /dev/null
+++ b/portal/src/components/ui/color-mode.tsx
@@ -0,0 +1,107 @@
+"use client"
+
+import type { IconButtonProps, SpanProps } from "@chakra-ui/react"
+import { ClientOnly, IconButton, Skeleton, Span } from "@chakra-ui/react"
+import { ThemeProvider, useTheme } from "next-themes"
+import type { ThemeProviderProps } from "next-themes"
+import * as React from "react"
+import { LuMoon, LuSun } from "react-icons/lu"
+
+export interface ColorModeProviderProps extends ThemeProviderProps {}
+
+export function ColorModeProvider(props: ColorModeProviderProps) {
+  return (
+    <ThemeProvider attribute="class" disableTransitionOnChange {...props} />
+  )
+}
+
+export type ColorMode = "light" | "dark"
+
+export interface UseColorModeReturn {
+  colorMode: ColorMode
+  setColorMode: (colorMode: ColorMode) => void
+  toggleColorMode: () => void
+}
+
+export function useColorMode(): UseColorModeReturn {
+  const { resolvedTheme, setTheme } = useTheme()
+  const toggleColorMode = () => {
+    setTheme(resolvedTheme === "dark" ? "light" : "dark")
+  }
+  return {
+    colorMode: resolvedTheme as ColorMode,
+    setColorMode: setTheme,
+    toggleColorMode,
+  }
+}
+
+export function useColorModeValue<T>(light: T, dark: T) {
+  const { colorMode } = useColorMode()
+  return colorMode === "dark" ? dark : light
+}
+
+export function ColorModeIcon() {
+  const { colorMode } = useColorMode()
+  return colorMode === "dark" ? <LuMoon /> : <LuSun />
+}
+
+interface ColorModeButtonProps extends Omit<IconButtonProps, "aria-label"> {}
+
+export const ColorModeButton = React.forwardRef<
+  HTMLButtonElement,
+  ColorModeButtonProps
+>(function ColorModeButton(props, ref) {
+  const { toggleColorMode } = useColorMode()
+  return (
+    <ClientOnly fallback={<Skeleton boxSize="8" />}>
+      <IconButton
+        onClick={toggleColorMode}
+        variant="ghost"
+        aria-label="Toggle color mode"
+        size="sm"
+        ref={ref}
+        {...props}
+        css={{
+          _icon: {
+            width: "5",
+            height: "5",
+          },
+        }}
+      >
+        <ColorModeIcon />
+      </IconButton>
+    </ClientOnly>
+  )
+})
+
+export const LightMode = React.forwardRef<HTMLSpanElement, SpanProps>(
+  function LightMode(props, ref) {
+    return (
+      <Span
+        color="fg"
+        display="contents"
+        className="chakra-theme light"
+        colorPalette="gray"
+        colorScheme="light"
+        ref={ref}
+        {...props}
+      />
+    )
+  },
+)
+
+export const DarkMode = React.forwardRef<HTMLSpanElement, SpanProps>(
+  function DarkMode(props, ref) {
+    return (
+      <Span
+        color="fg"
+        display="contents"
+        className="chakra-theme dark"
+        colorPalette="gray"
+        colorScheme="dark"
+        ref={ref}
+        {...props}
+      />
+    )
+  },
+)
diff --git a/portal/src/components/ui/input-group.tsx b/portal/src/components/ui/input-group.tsx
new file mode 100644
index 0000000000..5d8fb32ad2
--- /dev/null
+++ b/portal/src/components/ui/input-group.tsx
@@ -0,0 +1,53 @@
+import type { BoxProps, InputElementProps } from "@chakra-ui/react"
+import { Group, InputElement } from "@chakra-ui/react"
+import * as React from "react"
+
+export interface InputGroupProps extends BoxProps {
+  startElementProps?: InputElementProps
+  endElementProps?: InputElementProps
+  startElement?: React.ReactNode
+  endElement?: React.ReactNode
+  children: React.ReactElement<InputElementProps>
+  startOffset?: InputElementProps["paddingStart"]
+  endOffset?: InputElementProps["paddingEnd"]
+}
+
+export const InputGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(
+  function InputGroup(props, ref) {
+    const {
+      startElement,
+      startElementProps,
+      endElement,
+      endElementProps,
+      children,
+      startOffset = "6px",
+      endOffset = "6px",
+      ...rest
+    } = props
+
+    const child =
+      React.Children.only<React.ReactElement<InputElementProps>>(children)
+
+    return (
+      <Group ref={ref} {...rest}>
+        {startElement && (
+          <InputElement pointerEvents="none" {...startElementProps}>
+            {startElement}
+          </InputElement>
+        )}
+        {React.cloneElement(child, {
+          ...(startElement && {
+            ps: `calc(var(--input-height) - ${startOffset})`,
+          }),
+          ...(endElement && { pe: `calc(var(--input-height) - ${endOffset})` }),
+          ...children.props,
+        })}
+        {endElement && (
+          <InputElement placement="end" {...endElementProps}>
+            {endElement}
+          </InputElement>
+        )}
+      </Group>
+    )
+  },
+)
diff --git a/portal/src/components/ui/provider.tsx b/portal/src/components/ui/provider.tsx
new file mode 100644
index 0000000000..c1f896c87b
--- /dev/null
+++ b/portal/src/components/ui/provider.tsx
@@ -0,0 +1,12 @@
+"use client";
+
+import { ChakraProvider, defaultSystem } from "@chakra-ui/react";
+import { ColorModeProvider, type ColorModeProviderProps } from "./color-mode";
+
+export function Provider(props: ColorModeProviderProps) {
+  return (
+    <ChakraProvider value={defaultSystem}>
+      <ColorModeProvider {...props} />
+    </ChakraProvider>
+  );
+}
diff --git a/portal/src/data/MOCK_DATA.js b/portal/src/data/MOCK_DATA.js
new file mode 100644
index 0000000000..774b31c38b
--- /dev/null
+++ b/portal/src/data/MOCK_DATA.js
@@ -0,0 +1,555 @@
+export const MOCK_PROJECTS = [
+  {
+    "metadata": {
+      "type": "notebook",
+      "title": "A new framework for molecular sciences",
+      "slug": "a-new-framework-for-molecular-sciences",
+      "description": "This study presents a new framework for molecular sciences that can be used to study the molecular structure of molecules and their interactions with other molecules. The framework is based on the concept of molecular structure and is designed to be used in conjunction with other molecular sciences tools.",
+      "author": {
+        "name": "Dr. John Doe",
+        "avatar": "https://media.istockphoto.com/id/1356638196/photo/teenage-student-using-the-microscope-in-the-laboratory.jpg?s=612x612&w=0&k=20&c=v4ZITw5Wm3QmlcNRssQjShgE5l61E9TW62kK3k-G3jY=",
+        "role": "contributor"
+      },
+      "tags": ["science", "molecular", "framework"],
+      "date": "2021-01-01",
+      "images": {
+        "headerImage": "https://scitechdaily.com/images/Artistic-Molecular-Structure.jpg"
+      },
+    },
+    "notebookViewer": "https://jupyter.org/try-jupyter/lab/"
+  },
+  {
+    "metadata": {
+      "type": "notebook",
+      "title": "The role of machine learning in molecular sciences",
+      "slug": "the-role-of-machine-learning-in-molecular-sciences",
+      "description": "This study presents the role of machine learning in molecular sciences and how it can be used to study the molecular structure of molecules and their interactions with other molecules. The study is based on the concept of molecular structure and is designed to be used in conjunction with other molecular sciences tools.",
+      "author": {
+        "name": "Dr. Jane Doe",
+        "avatar": "https://media.istockphoto.com/id/1356638196/photo/teenage-student-using-the-microscope-in-the-laboratory.jpg?s=612x612&w=0&k=20&c=v4ZITw5Wm3QmlcNRssQjShgE5l61E9TW62kK3k-G3jY=",
+        "role": "contributor"
+      },
+      "tags": ["science", "molecular", "machine learning"],
+      "date": "2021-01-02",
+      "images": {
+        "headerImage": "https://scitechdaily.com/images/Artistic-Molecular-Structure.jpg"
+      },
+    },
+    "notebookViewer": "https://jupyter.org/try-jupyter/lab/"
+  },
+  {
+    "metadata": {
+      "type": "notebook",
+      "title": "The future of molecular sciences",
+      "slug": "the-future-of-molecular-sciences",
+      "description": "This study presents the future of molecular sciences and how it can be used to study the molecular structure of molecules and their interactions with other molecules. The study is based on the concept of molecular structure and is designed to be used in conjunction with other molecular sciences tools.",
+      "author": {
+        "name": "Dr. James Doe",
+        "avatar": "https://media.istockphoto.com/id/1356638196/photo/teenage-student-using-the-microscope-in-the-laboratory.jpg?s=612x612&w=0&k=20&c=v4ZITw5Wm3QmlcNRssQjShgE5l61E9TW62kK3k-G3jY=",
+        "role": "contributor"
+      },
+      "tags": ["science", "molecular", "future"],
+      "date": "2021-01-03",
+      "images": {
+        "headerImage": "https://scitechdaily.com/images/Artistic-Molecular-Structure.jpg"
+      },
+    },
+    "notebookViewer": "https://jupyter.org/try-jupyter/lab/"
+  },
+  {
+    "metadata": {
+      "type": "repository",
+      "title": "Apache Airavata Repository",
+      "slug": "apache-airavata-repository",
+      "description": "Apache Airavata is a software framework for executing and managing computational workflows on distributed computing resources including local clusters, supercomputers, national grids, academic and commercial clouds.",
+      "author": {
+        "name": "Apache Software Foundation",
+        "avatar": "https://avatars.githubusercontent.com/u/47359?v=4",
+        "role": "contributor"
+      },
+      "tags": ["apache", "airavata", "repository"],
+      "date": "2021-01-01",
+      "images": {
+        "headerImage": "https://www.gatech.edu/sites/default/files/styles/hero_16_9_extra_extra_large_1800x1013_/public/2022-04/Tech-tower-wreck.jpg?h=fb7e085a&itok=MGAERbjU"
+      },
+    },
+    "repositoryUrl": "https://github.com/apache/airavata"
+  },
+  {
+    "metadata": {
+      "type": "repository",
+      "title": "TensorFlow Repository",
+      "slug": "tensorflow-repository",
+      "description": "TensorFlow is an end-to-end open-source platform for machine learning, providing a comprehensive, flexible ecosystem of tools, libraries, and community resources.",
+      "author": {
+        "name": "Google",
+        "avatar": "https://avatars.githubusercontent.com/u/1342004?v=4",
+        "role": "contributor"
+      },
+      "tags": ["tensorflow", "machine learning", "repository"],
+      "date": "2022-05-15",
+      "images": {
+        "headerImage": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKis9ECId8eIwn_p0SVMBt3a1vfvKOcOZXy6zK0fWoyzXnzQTguKc2CV__6oI1Pwg22NjWsErpDKqjwQdzjilvmqwWkXPj2ncglphh6mAhpoZ_QXQiDwxnwo-GjKEP0fEOb3uBlNlh9sc/s1600/tensorflow2objectdetection.png"
+      },
+    },
+    "repositoryUrl": "https://github.com/tensorflow/tensorflow",
+  },
+  {
+    "metadata": {
+      "type": "repository",
+      "title": "PyTorch Repository",
+      "slug": "pytorch-repository",
+      "description": "PyTorch is an open-source machine learning framework that accelerates the path from research prototyping to production deployment.",
+      "author": {
+        "name": "Facebook",
+        "avatar": "https://avatars.githubusercontent.com/u/69631?v=4",
+        "role": "contributor"
+      },
+      "tags": ["pytorch", "machine learning", "repository"],
+      "date": "2023-03-10",
+      "images": {
+        "headerImage": "https://pytorch.org/assets/images/community-events-recap/fg1.jpg"
+      },
+    },
+    "repositoryUrl": "https://github.com/pytorch/pytorch"
+  }
+];
+
+export const MOCK_DATASETS = [
+  {
+    "metadata": {
+      "type": "dataset",
+      "title": "Dataset A",
+      "slug": "dataset-a",
+      "description": "Dataset A is the best dataset for machine learning projects. It contains a wide variety of data points and features that can be used to train and test machine learning models.",
+      "author": {
+        "name": "Facebook",
+        "avatar": "https://avatars.githubusercontent.com/u/69631?v=4",
+        "role": "contributor"
+      },
+      "tags": ["pytorch", "machine learning", "repository"],
+      "date": "2023-03-10",
+      "images": {
+        "headerImage": "https://pytorch.org/assets/images/community-events-recap/fg1.jpg"
+      },
+    },
+    "datasetUrl": "https://www.kaggle.com/datasets/muhammadtahir194/movies-dataset-tmdb-top-rated",
+    "private": true,
+  },
+  {
+    "metadata": {
+      "type": "dataset",
+      "title": "Dataset B",
+      "slug": "dataset-b",
+      "description": "Dataset B is the best dataset for machine learning projects. It contains a wide variety of data points and features that can be used to train and test machine learning models.",
+      "author": {
+        "name": "Facebook",
+        "avatar": "https://avatars.githubusercontent.com/u/69631?v=4",
+        "role": "contributor"
+      },
+      "tags": ["pytorch", "machine learning", "repository"],
+      "date": "2023-03-10",
+      "images": {
+        "headerImage": "https://pytorch.org/assets/images/community-events-recap/fg1.jpg"
+      },
+    },
+    "datasetUrl": "https://www.kaggle.com/datasets/muhammadtahir194/movies-dataset-tmdb-top-rated",
+    "private": false,
+  },
+  {
+    "metadata": {
+      "type": "dataset",
+      "title": "Dataset C",
+      "slug": "dataset-c",
+      "description": "Dataset C is the best dataset for machine learning projects. It contains a wide variety of data points and features that can be used to train and test machine learning models.",
+      "author": {
+        "name": "Facebook",
+        "avatar": "https://avatars.githubusercontent.com/u/69631?v=4",
+        "role": "contributor"
+      },
+      "tags": ["pytorch", "machine learning", "repository"],
+      "date": "2023-03-10",
+      "images": {
+        "headerImage": "https://pytorch.org/assets/images/community-events-recap/fg1.jpg"
+      },
+    },
+    "datasetUrl": "https://www.kaggle.com/datasets/muhammadtahir194/movies-dataset-tmdb-top-rated",
+    "private": true,
+  },
+];
+
+export const MOCK_SESSIONS = [
+  {
+    "sessionId": "1",
+    "title": "Jupyter",
+    "started": "4 hours ago",
+    "models": ["v1", "v2"],
+    "datasets": ["A", "B", "C"],
+    "nodes": 1,
+    "ram": "8GB",
+    "storage": "40GB",
+    "status": "running"
+  },
+  {
+    "sessionId": "2",
+    "title": "Jupyter",
+    "started": "2 hours ago",
+    "models": ["v1", "v2"],
+    "datasets": ["A", "B", "C"],
+    "nodes": 1,
+    "ram": "8GB",
+    "storage": "40GB",
+    "status": "running"
+  },
+  {
+    "sessionId": "3",
+    "title": "VSCode",
+    "started": "1 hours ago",
+    "models": ["v1", "v2"],
+    "datasets": ["A", "B", "C"],
+    "nodes": 1,
+    "ram": "8GB",
+    "storage": "40GB",
+    "status": "stopped"
+  },
+  {
+    "sessionId": "4",
+    "title": "Jupyter",
+    "started": "1 hours ago",
+    "models": ["v1", "v2"],
+    "datasets": ["A", "B", "C"],
+    "nodes": 1,
+    "ram": "8GB",
+    "storage": "40GB",
+    "status": "stopped"
+  },
+  {
+    "sessionId": "5",
+    "title": "VSCode",
+    "started": "1 hours ago",
+    "models": ["v1", "v2"],
+    "datasets": ["A", "B", "C"],
+    "nodes": 1,
+    "ram": "8GB",
+    "storage": "40GB",
+    "status": "stopped"
+  },
+  {
+    "sessionId": "6",
+    "title": "VSCode",
+    "started": "1 hours ago",
+    "models": ["v1", "v2"],
+    "datasets": ["A", "B", "C"],
+    "nodes": 1,
+    "ram": "8GB",
+    "storage": "40GB",
+    "status": "stopped"
+  },
+  {
+    "sessionId": "7",
+    "title": "Jupyter",
+    "started": "1 hours ago",
+    "models": ["v1", "v2"],
+    "datasets": ["A", "B", "C"],
+    "nodes": 1,
+    "ram": "8GB",
+    "storage": "40GB",
+    "status": "running"
+  },
+];
+
+
+
+
+export const MOCK_NOTEBOOKS = [
+  {
+    "type": "notebook",
+    "title": "A new framework for molecular sciences",
+    "slug": "a-new-framework-for-molecular-sciences",
+    "description": "This study presents a new framework for molecular sciences that can be used to study the molecular structure of molecules and their interactions with other molecules. The framework is based on the concept of molecular structure and is designed to be used in conjunction with other molecular sciences tools.",
+    "author": {
+      "name": "Dr. John Doe",
+      "avatar": "https://media.istockphoto.com/id/1356638196/photo/teenage-student-using-the-microscope-in-the-laboratory.jpg?s=612x612&w=0&k=20&c=v4ZITw5Wm3QmlcNRssQjShgE5l61E9TW62kK3k-G3jY=",
+      "role": "contributor"
+    },
+    "tags": ["science", "molecular", "framework"],
+    "date": "2021-01-01",
+    "images": {
+      "headerImage": "https://scitechdaily.com/images/Artistic-Molecular-Structure.jpg"
+    },
+    "notebookViewer": "https://jupyter.org/try-jupyter/lab/"
+  },
+  {
+    "type": "notebook",
+    "title": "The role of machine learning in molecular sciences",
+    "slug": "the-role-of-machine-learning-in-molecular-sciences",
+    "description": "This study presents the role of machine learning in molecular sciences and how it can be used to study the molecular structure of molecules and their interactions with other molecules. The study is based on the concept of molecular structure and is designed to be used in conjunction with other molecular sciences tools.",
+    "author": {
+      "name": "Dr. Jane Doe",
+      "avatar": "https://media.istockphoto.com/id/1356638196/photo/teenage-student-using-the-microscope-in-the-laboratory.jpg?s=612x612&w=0&k=20&c=v4ZITw5Wm3QmlcNRssQjShgE5l61E9TW62kK3k-G3jY=",
+      "role": "contributor"
+    },
+    "tags": ["science", "molecular", "machine learning"],
+    "date": "2021-01-02",
+    "images": {
+      "headerImage": "https://scitechdaily.com/images/Artistic-Molecular-Structure.jpg"
+    },
+    "notebookViewer": "https://jupyter.org/try-jupyter/lab/"
+  },
+  {
+    "type": "notebook",
+    "title": "The future of molecular sciences",
+    "slug": "the-future-of-molecular-sciences",
+    "description": "This study presents the future of molecular sciences and how it can be used to study the molecular structure of molecules and their interactions with other molecules. The study is based on the concept of molecular structure and is designed to be used in conjunction with other molecular sciences tools.",
+    "author": {
+      "name": "Dr. James Doe",
+      "avatar": "https://media.istockphoto.com/id/1356638196/photo/teenage-student-using-the-microscope-in-the-laboratory.jpg?s=612x612&w=0&k=20&c=v4ZITw5Wm3QmlcNRssQjShgE5l61E9TW62kK3k-G3jY=",
+      "role": "contributor"
+    },
+    "tags": ["science", "molecular", "future"],
+    "date": "2021-01-03",
+    "images": {
+      "headerImage": "https://scitechdaily.com/images/Artistic-Molecular-Structure.jpg"
+    },
+    "notebookViewer": "https://jupyter.org/try-jupyter/lab/"
+  },
+  {
+    "type": "repository",
+    "title": "Apache Airavata Repository",
+    "slug": "apache-airavata-repository",
+    "description": "Apache Airavata is a software framework for executing and managing computational workflows on distributed computing resources including local clusters, supercomputers, national grids, academic and commercial clouds.",
+    "author": {
+      "name": "Apache Software Foundation",
+      "avatar": "https://avatars.githubusercontent.com/u/47359?v=4",
+      "role": "contributor"
+    },
+    "tags": ["apache", "airavata", "repository"],
+    "date": "2021-01-01",
+    "images": {
+      "headerImage": "https://www.gatech.edu/sites/default/files/styles/hero_16_9_extra_extra_large_1800x1013_/public/2022-04/Tech-tower-wreck.jpg?h=fb7e085a&itok=MGAERbjU"
+    },
+    "repositoryUrl": "https://github.com/apache/airavata"
+  },
+  {
+    "type": "repository",
+    "title": "TensorFlow Repository",
+    "slug": "tensorflow-repository",
+    "description": "TensorFlow is an end-to-end open-source platform for machine learning, providing a comprehensive, flexible ecosystem of tools, libraries, and community resources.",
+    "author": {
+      "name": "Google",
+      "avatar": "https://avatars.githubusercontent.com/u/1342004?v=4",
+      "role": "contributor"
+    },
+    "tags": ["tensorflow", "machine learning", "repository"],
+    "date": "2022-05-15",
+    "images": {
+      "headerImage": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKis9ECId8eIwn_p0SVMBt3a1vfvKOcOZXy6zK0fWoyzXnzQTguKc2CV__6oI1Pwg22NjWsErpDKqjwQdzjilvmqwWkXPj2ncglphh6mAhpoZ_QXQiDwxnwo-GjKEP0fEOb3uBlNlh9sc/s1600/tensorflow2objectdetection.png"
+    },
+    "repositoryUrl": "https://github.com/tensorflow/tensorflow",
+  },
+  {
+    "type": "repository",
+    "title": "PyTorch Repository",
+    "slug": "pytorch-repository",
+    "description": "PyTorch is an open-source machine learning framework that accelerates the path from research prototyping to production deployment.",
+    "author": {
+      "name": "Facebook",
+      "avatar": "https://avatars.githubusercontent.com/u/69631?v=4",
+      "role": "contributor"
+    },
+    "tags": ["pytorch", "machine learning", "repository"],
+    "date": "2023-03-10",
+    "images": {
+      "headerImage": "https://pytorch.org/assets/images/community-events-recap/fg1.jpg"
+    },
+    "repositoryUrl": "https://github.com/pytorch/pytorch"
+  }
+];
+
+
+export const MOCK_REPOSITORIES = [
+  {
+    "githubUrl": "https://github.com/apache/airavata",
+    "title": "Apache Airavata Dataset",
+    "description": "Apache Airavata is a software framework for executing and managing computational workflows on distributed computing resources including local clusters, supercomputers, national grids, academic and commercial clouds.",
+    "date": "2021-01-01",
+  },
+  {
+    "githubUrl": "https://github.com/tensorflow/tensorflow",
+    "title": "TensorFlow",
+    "description": "TensorFlow is an end-to-end open-source platform for machine learning, providing a comprehensive, flexible ecosystem of tools, libraries, and community resources.",
+    "date": "2022-05-15",
+  },
+  {
+    "githubUrl": "https://github.com/pytorch/pytorch",
+    "title": "PyTorch",
+    "description": "PyTorch is an open-source machine learning framework that accelerates the path from research prototyping to production deployment.",
+    "date": "2023-03-10",
+  },
+  {
+    "githubUrl": "https://github.com/apache/spark",
+    "title": "Apache Spark",
+    "description": "Apache Spark is a unified analytics engine for large-scale data processing, with built-in modules for SQL, streaming, machine learning, and graph processing.",
+    "date": "2020-11-20",
+  },
+  {
+    "githubUrl": "https://github.com/microsoft/vscode",
+    "title": "Visual Studio Code",
+    "description": "Visual Studio Code is a lightweight but powerful source code editor that runs on your desktop and is available for Windows, macOS, and Linux.",
+    "date": "2021-09-30",
+  },
+  {
+    "githubUrl": "https://github.com/nodejs/node",
+    "title": "Node.js",
+    "description": "Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine, designed for building scalable network applications.",
+    "date": "2022-07-18",
+  },
+  {
+    "githubUrl": "https://github.com/facebook/react",
+    "title": "React",
+    "description": "React is a declarative, efficient, and flexible JavaScript library for building user interfaces, maintained by Facebook.",
+    "date": "2023-01-05",
+  },
+  {
+    "githubUrl": "https://github.com/django/django",
+    "title": "Django",
+    "description": "Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design.",
+    "date": "2021-12-10",
+  },
+  {
+    "githubUrl": "https://github.com/rust-lang/rust",
+    "title": "Rust",
+    "description": "Rust is a multi-paradigm programming language designed for performance and safety, especially safe concurrency.",
+    "date": "2020-06-25",
+  },
+  {
+    "githubUrl": "https://github.com/kubernetes/kubernetes",
+    "title": "Kubernetes",
+    "description": "Kubernetes is an open-source system for automating deployment, scaling, and management of containerized applications.",
+    "date": "2022-10-14",
+  }
+];
+
+
+export const MOCK_MODELS = [
+  {
+    "appModuleId": "AiravataAgent_6a584041-c8ee-4f89-b1cc-6905093b504c",
+    "appModuleName": "AiravataAgent",
+    "appModuleVersion": "1.0.0",
+    "appModuleDescription": "Airavata Agent Application",
+    "url": "https://cybershuttle.org/api/applications/AiravataAgent_6a584041-c8ee-4f89-b1cc-6905093b504c/",
+    "applicationInterface": "https://cybershuttle.org/api/applications/AiravataAgent_6a584041-c8ee-4f89-b1cc-6905093b504c/application_interface/",
+    "applicationDeployments": "https://cybershuttle.org/api/applications/AiravataAgent_6a584041-c8ee-4f89-b1cc-6905093b504c/application_deployments/",
+    "userHasWriteAccess": false
+  },
+  {
+    "appModuleId": "AlphaFold2_c177803a-f1d2-4559-a306-2e1b9cef6496",
+    "appModuleName": "AlphaFold2",
+    "appModuleVersion": "2.2.0",
+    "appModuleDescription": "AlphaFold is an AI system developed by DeepMind that makes state-of-the-art accurate predictions of a protein’s structure from its amino-acid sequence.",
+    "url": "https://cybershuttle.org/api/applications/AlphaFold2_c177803a-f1d2-4559-a306-2e1b9cef6496/",
+    "applicationInterface": "https://cybershuttle.org/api/applications/AlphaFold2_c177803a-f1d2-4559-a306-2e1b9cef6496/application_interface/",
+    "applicationDeployments": "https://cybershuttle.org/api/applications/AlphaFold2_c177803a-f1d2-4559-a306-2e1b9cef6496/application_deployments/",
+    "userHasWriteAccess": false
+  },
+  {
+    "appModuleId": "Amber_pmemd_7fe7fb4b-38a7-45c4-a4e5-2ca9f4f49f3b",
+    "appModuleName": "Amber_pmemd",
+    "appModuleVersion": null,
+    "appModuleDescription": "Assisted Model Building with Energy Refinement MD Package with Particle Mesh Ewald summation for electrostatic interactions",
+    "url": "https://cybershuttle.org/api/applications/Amber_pmemd_7fe7fb4b-38a7-45c4-a4e5-2ca9f4f49f3b/",
+    "applicationInterface": "https://cybershuttle.org/api/applications/Amber_pmemd_7fe7fb4b-38a7-45c4-a4e5-2ca9f4f49f3b/application_interface/",
+    "applicationDeployments": "https://cybershuttle.org/api/applications/Amber_pmemd_7fe7fb4b-38a7-45c4-a4e5-2ca9f4f49f3b/application_deployments/",
+    "userHasWriteAccess": false
+  },
+  {
+    "appModuleId": "Amber_pmemd_CUDA_25c95122-ac00-4ba6-a834-33f129ad6eb2",
+    "appModuleName": "Amber_pmemd_CUDA",
+    "appModuleVersion": "Amber.22-CUDA",
+    "appModuleDescription": "GPU openmpi version of AMBER pmemd",
+    "url": "https://cybershuttle.org/api/applications/Amber_pmemd_CUDA_25c95122-ac00-4ba6-a834-33f129ad6eb2/",
+    "applicationInterface": "https://cybershuttle.org/api/applications/Amber_pmemd_CUDA_25c95122-ac00-4ba6-a834-33f129ad6eb2/application_interface/",
+    "applicationDeployments": "https://cybershuttle.org/api/applications/Amber_pmemd_CUDA_25c95122-ac00-4ba6-a834-33f129ad6eb2/application_deployments/",
+    "userHasWriteAccess": false
+  },
+  {
+    "appModuleId": "CyberFaCESAgent_74734794-25db-413b-972b-dffbfab346ca",
+    "appModuleName": "CyberFaCESAgent",
+    "appModuleVersion": "1.0.0",
+    "appModuleDescription": "CyberFaCES Agent",
+    "url": "https://cybershuttle.org/api/applications/CyberFaCESAgent_74734794-25db-413b-972b-dffbfab346ca/",
+    "applicationInterface": "https://cybershuttle.org/api/applications/CyberFaCESAgent_74734794-25db-413b-972b-dffbfab346ca/application_interface/",
+    "applicationDeployments": "https://cybershuttle.org/api/applications/CyberFaCESAgent_74734794-25db-413b-972b-dffbfab346ca/application_deployments/",
+    "userHasWriteAccess": false
+  },
+  {
+    "appModuleId": "Echo_88202f35-beef-414a-84a4-6ee9dd4f5a84",
+    "appModuleName": "Echo",
+    "appModuleVersion": "",
+    "appModuleDescription": "",
+    "url": "https://cybershuttle.org/api/applications/Echo_88202f35-beef-414a-84a4-6ee9dd4f5a84/",
+    "applicationInterface": "https://cybershuttle.org/api/applications/Echo_88202f35-beef-414a-84a4-6ee9dd4f5a84/application_interface/",
+    "applicationDeployments": "https://cybershuttle.org/api/applications/Echo_88202f35-beef-414a-84a4-6ee9dd4f5a84/application_deployments/",
+    "userHasWriteAccess": false
+  },
+  {
+    "appModuleId": "Gaussian16_43c4b549-f8c2-4024-accc-d5e965a0025a",
+    "appModuleName": "Gaussian16",
+    "appModuleVersion": "Gaussian16/c.02",
+    "appModuleDescription": "Quantum chemistry application",
+    "url": "https://cybershuttle.org/api/applications/Gaussian16_43c4b549-f8c2-4024-accc-d5e965a0025a/",
+    "applicationInterface": "https://cybershuttle.org/api/applications/Gaussian16_43c4b549-f8c2-4024-accc-d5e965a0025a/application_interface/",
+    "applicationDeployments": "https://cybershuttle.org/api/applications/Gaussian16_43c4b549-f8c2-4024-accc-d5e965a0025a/application_deployments/",
+    "userHasWriteAccess": false
+  },
+  {
+    "appModuleId": "GEM_Magnetic_Reconnection_Challenge_Problem_43026dd1-5229-4d80-8be3-32c7b876e157",
+    "appModuleName": "GEM_Magnetic_Reconnection_Challenge_Problem",
+    "appModuleVersion": "1.0",
+    "appModuleDescription": "\"Magnetic reconnection is studied in a simple Harris sheet configuration with a specified set of initial conditions, including a finite amplitude, magnetic island perturbation to trigger the dynamics.\" [https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/1999JA900449]",
+    "url": "https://cybershuttle.org/api/applications/GEM_Magnetic_Reconnection_Challenge_Problem_43026dd1-5229-4d80-8be3-32c7b876e157/",
+    "applicationInterface": "https://cybershuttle.org/api/applications/GEM_Magnetic_Reconnection_Challenge_Problem_43026dd1-5229-4d80-8be3-32c7b876e157/application_interface/",
+    "applicationDeployments": "https://cybershuttle.org/api/applications/GEM_Magnetic_Reconnection_Challenge_Problem_43026dd1-5229-4d80-8be3-32c7b876e157/application_deployments/",
+    "userHasWriteAccess": false
+  },
+  {
+    "appModuleId": "GkeyllAgent_c884a86e-5c5e-416d-93e9-59361ac87898",
+    "appModuleName": "GkeyllAgent",
+    "appModuleVersion": "1.0.0",
+    "appModuleDescription": "Gkeyll  Agent",
+    "url": "https://cybershuttle.org/api/applications/GkeyllAgent_c884a86e-5c5e-416d-93e9-59361ac87898/",
+    "applicationInterface": "https://cybershuttle.org/api/applications/GkeyllAgent_c884a86e-5c5e-416d-93e9-59361ac87898/application_interface/",
+    "applicationDeployments": "https://cybershuttle.org/api/applications/GkeyllAgent_c884a86e-5c5e-416d-93e9-59361ac87898/application_deployments/",
+    "userHasWriteAccess": false
+  },
+  {
+    "appModuleId": "Groamcs_with_OptionalRestart_cd3e614c-c66c-4b67-b944-42f0adbaba16",
+    "appModuleName": "Gromacs_with_OptionalRestart",
+    "appModuleVersion": "2016.3",
+    "appModuleDescription": "Gromacs with optional restart from cpt file staged from a previous job ID provided in a restart text file",
+    "url": "https://cybershuttle.org/api/applications/Groamcs_with_OptionalRestart_cd3e614c-c66c-4b67-b944-42f0adbaba16/",
+    "applicationInterface": "https://cybershuttle.org/api/applications/Groamcs_with_OptionalRestart_cd3e614c-c66c-4b67-b944-42f0adbaba16/application_interface/",
+    "applicationDeployments": "https://cybershuttle.org/api/applications/Groamcs_with_OptionalRestart_cd3e614c-c66c-4b67-b944-42f0adbaba16/application_deployments/",
+    "userHasWriteAccess": false
+  },
+  {
+    "appModuleId": "NAMD_76b9b262-de09-4ab7-b4d4-e89502405af7",
+    "appModuleName": "NAMD",
+    "appModuleVersion": "2.14/3.2022.07",
+    "appModuleDescription": "NAMD is a parallel, object-oriented molecular dynamics code designed for high-performance simulation of large biomolecular systems. Simulation preparation and analysis is integrated into the visualization package VMD. Visit the NAMD website for complete information.",
+    "url": "https://cybershuttle.org/api/applications/NAMD_76b9b262-de09-4ab7-b4d4-e89502405af7/",
+    "applicationInterface": "https://cybershuttle.org/api/applications/NAMD_76b9b262-de09-4ab7-b4d4-e89502405af7/application_interface/",
+    "applicationDeployments": "https://cybershuttle.org/api/applications/NAMD_76b9b262-de09-4ab7-b4d4-e89502405af7/application_deployments/",
+    "userHasWriteAccess": false
+  },
+  {
+    "appModuleId": "VsCode_0545a9d1-2ab1-4312-b0e9-dfa8f470cb15",
+    "appModuleName": "VsCode",
+    "appModuleVersion": "V1.0",
+    "appModuleDescription": null,
+    "url": "https://cybershuttle.org/api/applications/VsCode_0545a9d1-2ab1-4312-b0e9-dfa8f470cb15/",
+    "applicationInterface": "https://cybershuttle.org/api/applications/VsCode_0545a9d1-2ab1-4312-b0e9-dfa8f470cb15/application_interface/",
+    "applicationDeployments": "https://cybershuttle.org/api/applications/VsCode_0545a9d1-2ab1-4312-b0e9-dfa8f470cb15/application_deployments/",
+    "userHasWriteAccess": false
+  }
+];
\ No newline at end of file
diff --git a/portal/src/interfaces/AuthorType.tsx b/portal/src/interfaces/AuthorType.tsx
new file mode 100644
index 0000000000..7beaed29a3
--- /dev/null
+++ b/portal/src/interfaces/AuthorType.tsx
@@ -0,0 +1,5 @@
+export interface AuthorType {
+  name: string;
+  avatar: string;
+  role: string;
+}
diff --git a/portal/src/interfaces/DatasetType.tsx b/portal/src/interfaces/DatasetType.tsx
new file mode 100644
index 0000000000..c331b864d8
--- /dev/null
+++ b/portal/src/interfaces/DatasetType.tsx
@@ -0,0 +1,7 @@
+import { MetadataType } from "./MetadataType";
+
+export interface DatasetType {
+  metadata: MetadataType;
+  datasetUrl: string;
+  private: true | false;
+}
diff --git a/portal/src/interfaces/MetadataType.tsx b/portal/src/interfaces/MetadataType.tsx
new file mode 100644
index 0000000000..ba183d2185
--- /dev/null
+++ b/portal/src/interfaces/MetadataType.tsx
@@ -0,0 +1,14 @@
+import { AuthorType } from "./AuthorType";
+
+export interface MetadataType {
+  type: string;
+  title: string;
+  slug: string;
+  description: string;
+  author: AuthorType;
+  tags: string[];
+  date: string;
+  images: {
+    headerImage: string;
+  };
+}
diff --git a/portal/src/interfaces/ModelType.tsx b/portal/src/interfaces/ModelType.tsx
new file mode 100644
index 0000000000..7d1f933a11
--- /dev/null
+++ b/portal/src/interfaces/ModelType.tsx
@@ -0,0 +1,10 @@
+export interface ModelType {
+  appModuleId: string;
+  appModuleName: string;
+  appModuleVersion: string;
+  appModuleDescription: string;
+  url: string;
+  applicationInterface: string;
+  applicationDeployments: string;
+  userHasWriteAccess: boolean;
+}
diff --git a/portal/src/interfaces/ProjectType.tsx b/portal/src/interfaces/ProjectType.tsx
new file mode 100644
index 0000000000..b09bb66ced
--- /dev/null
+++ b/portal/src/interfaces/ProjectType.tsx
@@ -0,0 +1,7 @@
+import { MetadataType } from "./MetadataType";
+
+export interface ProjectType {
+  metadata: MetadataType;
+  notebookViewer?: string;
+  repositoryUrl?: string;
+}
diff --git a/portal/src/interfaces/SessionType.tsx b/portal/src/interfaces/SessionType.tsx
new file mode 100644
index 0000000000..fb483cc421
--- /dev/null
+++ b/portal/src/interfaces/SessionType.tsx
@@ -0,0 +1,11 @@
+export interface SessionType {
+  sessionId: string;
+  title: string;
+  started: string;
+  models: string[];
+  datasets: string[];
+  nodes: number;
+  ram: number;
+  storage: number;
+  status: "running" | "stopped";
+}
diff --git a/portal/src/main.tsx b/portal/src/main.tsx
new file mode 100644
index 0000000000..f12fb02d01
--- /dev/null
+++ b/portal/src/main.tsx
@@ -0,0 +1,12 @@
+import { Provider } from "@/components/ui/provider";
+import React from "react";
+import ReactDOM from "react-dom/client";
+import App from "./App";
+
+ReactDOM.createRoot(document.getElementById("root")!).render(
+  <React.StrictMode>
+    <Provider>
+      <App />
+    </Provider>
+  </React.StrictMode>
+);
diff --git a/portal/src/vite-env.d.ts b/portal/src/vite-env.d.ts
new file mode 100644
index 0000000000..11f02fe2a0
--- /dev/null
+++ b/portal/src/vite-env.d.ts
@@ -0,0 +1 @@
+/// <reference types="vite/client" />
diff --git a/portal/tsconfig.app.json b/portal/tsconfig.app.json
new file mode 100644
index 0000000000..7f8080a94e
--- /dev/null
+++ b/portal/tsconfig.app.json
@@ -0,0 +1,29 @@
+{
+  "compilerOptions": {
+    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+    "target": "ES2020",
+    "useDefineForClassFields": true,
+    "lib": ["ES2020", "DOM", "DOM.Iterable"],
+    "module": "ESNext",
+    "skipLibCheck": true,
+
+    /* Bundler mode */
+    "moduleResolution": "bundler",
+    "allowImportingTsExtensions": true,
+    "isolatedModules": true,
+    "moduleDetection": "force",
+    "noEmit": true,
+    "jsx": "react-jsx",
+
+    /* Linting */
+    "strict": true,
+    "noUnusedLocals": true,
+    "noUnusedParameters": true,
+    "noFallthroughCasesInSwitch": true,
+    "noUncheckedSideEffectImports": true,
+    "paths": {
+      "@/*": ["./src/*"]
+    }
+  },
+  "include": ["src"]
+}
diff --git a/portal/tsconfig.json b/portal/tsconfig.json
new file mode 100644
index 0000000000..1ffef600d9
--- /dev/null
+++ b/portal/tsconfig.json
@@ -0,0 +1,7 @@
+{
+  "files": [],
+  "references": [
+    { "path": "./tsconfig.app.json" },
+    { "path": "./tsconfig.node.json" }
+  ]
+}
diff --git a/portal/tsconfig.node.json b/portal/tsconfig.node.json
new file mode 100644
index 0000000000..db0becc8b0
--- /dev/null
+++ b/portal/tsconfig.node.json
@@ -0,0 +1,24 @@
+{
+  "compilerOptions": {
+    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+    "target": "ES2022",
+    "lib": ["ES2023"],
+    "module": "ESNext",
+    "skipLibCheck": true,
+
+    /* Bundler mode */
+    "moduleResolution": "bundler",
+    "allowImportingTsExtensions": true,
+    "isolatedModules": true,
+    "moduleDetection": "force",
+    "noEmit": true,
+
+    /* Linting */
+    "strict": true,
+    "noUnusedLocals": true,
+    "noUnusedParameters": true,
+    "noFallthroughCasesInSwitch": true,
+    "noUncheckedSideEffectImports": true
+  },
+  "include": ["vite.config.ts"]
+}
diff --git a/portal/vite.config.ts b/portal/vite.config.ts
new file mode 100644
index 0000000000..45f06a5dbb
--- /dev/null
+++ b/portal/vite.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from "vite";
+import react from "@vitejs/plugin-react";
+import tsconfigPaths from "vite-tsconfig-paths";
+
+// https://vite.dev/config/
+export default defineConfig({
+  plugins: [react(), tsconfigPaths()],
+});