From a25ce4d872f37d78f43a7b7842fd7986360e76ff Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 16:29:48 -0500 Subject: [PATCH 01/33] feat(docs): Phase 1 - Upgraded docs components and layout - Added Cmd+K search with cmdk - Added Table of Contents with scroll spy - Added breadcrumb navigation - Added syntax highlighted code blocks with copy button and language tabs - Added callout components (info, warning, tip, danger, success) - Added step-by-step tutorial components - Added prerequisites with collapsible - Added time estimate and difficulty badges - Added pagination (prev/next) - Upgraded DocsSidebar with icons and search - Upgraded DocsLayout with mobile support and TOC - Redesigned DocsHomePage with professional look - Rewrote MCPSetupPage using new components New shadcn components: - scroll-area - collapsible - command (cmdk) Added dependencies: - cmdk - @radix-ui/react-scroll-area - @radix-ui/react-collapsible --- frontend/bun.lock | 772 ------------------ frontend/package.json | 3 + frontend/src/components/docs/DocsBadges.tsx | 59 ++ .../src/components/docs/DocsBreadcrumb.tsx | 73 ++ frontend/src/components/docs/DocsCallout.tsx | 69 ++ frontend/src/components/docs/DocsCards.tsx | 146 ++++ .../src/components/docs/DocsCodeBlock.tsx | 169 ++++ frontend/src/components/docs/DocsLayout.tsx | 177 +++- .../src/components/docs/DocsPageHeader.tsx | 123 +++ .../src/components/docs/DocsPrerequisites.tsx | 101 +++ frontend/src/components/docs/DocsRelated.tsx | 101 +++ frontend/src/components/docs/DocsSearch.tsx | 188 +++++ frontend/src/components/docs/DocsSidebar.tsx | 176 ++-- frontend/src/components/docs/DocsStepList.tsx | 83 ++ frontend/src/components/docs/DocsSteps.tsx | 99 +++ .../components/docs/DocsTableOfContents.tsx | 105 +++ frontend/src/components/docs/index.ts | 15 + frontend/src/components/ui/collapsible.tsx | 11 + frontend/src/components/ui/command.tsx | 158 ++++ frontend/src/components/ui/scroll-area.tsx | 48 ++ frontend/src/pages/DocsHomePage.tsx | 279 ++++--- frontend/src/pages/MCPSetupPage.tsx | 733 ++++++++--------- 22 files changed, 2367 insertions(+), 1321 deletions(-) delete mode 100644 frontend/bun.lock create mode 100644 frontend/src/components/docs/DocsBadges.tsx create mode 100644 frontend/src/components/docs/DocsBreadcrumb.tsx create mode 100644 frontend/src/components/docs/DocsCallout.tsx create mode 100644 frontend/src/components/docs/DocsCards.tsx create mode 100644 frontend/src/components/docs/DocsCodeBlock.tsx create mode 100644 frontend/src/components/docs/DocsPageHeader.tsx create mode 100644 frontend/src/components/docs/DocsPrerequisites.tsx create mode 100644 frontend/src/components/docs/DocsRelated.tsx create mode 100644 frontend/src/components/docs/DocsSearch.tsx create mode 100644 frontend/src/components/docs/DocsStepList.tsx create mode 100644 frontend/src/components/docs/DocsSteps.tsx create mode 100644 frontend/src/components/docs/DocsTableOfContents.tsx create mode 100644 frontend/src/components/ui/collapsible.tsx create mode 100644 frontend/src/components/ui/command.tsx create mode 100644 frontend/src/components/ui/scroll-area.tsx diff --git a/frontend/bun.lock b/frontend/bun.lock deleted file mode 100644 index ec4f6e0..0000000 --- a/frontend/bun.lock +++ /dev/null @@ -1,772 +0,0 @@ -{ - "lockfileVersion": 1, - "configVersion": 0, - "workspaces": { - "": { - "name": "codeintel-frontend", - "dependencies": { - "@radix-ui/react-accordion": "^1.2.12", - "@radix-ui/react-avatar": "^1.1.11", - "@radix-ui/react-dialog": "^1.1.15", - "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-label": "^2.1.8", - "@radix-ui/react-navigation-menu": "^1.2.14", - "@radix-ui/react-progress": "^1.1.8", - "@radix-ui/react-separator": "^1.1.8", - "@radix-ui/react-slot": "^1.2.4", - "@radix-ui/react-switch": "^1.2.6", - "@radix-ui/react-tabs": "^1.1.13", - "@radix-ui/react-tooltip": "^1.2.8", - "@supabase/supabase-js": "^2.39.0", - "@tanstack/react-query": "^5.90.12", - "@types/dagre": "^0.7.53", - "@types/react-syntax-highlighter": "^15.5.13", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "dagre": "^0.8.5", - "framer-motion": "^12.29.0", - "lucide-react": "^0.554.0", - "next-themes": "^0.4.6", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "^7.12.0", - "react-syntax-highlighter": "^16.1.0", - "reactflow": "^11.11.4", - "sonner": "^2.0.7", - "tailwind-merge": "^3.4.0", - "tailwindcss-animate": "^1.0.7", - }, - "devDependencies": { - "@types/react": "^18.2.43", - "@types/react-dom": "^18.2.17", - "@vitejs/plugin-react": "^4.7.0", - "autoprefixer": "^10.4.16", - "postcss": "^8.4.32", - "tailwindcss": "^3.4.0", - "typescript": "^5.9.3", - "vite": "^6.4.1", - }, - }, - }, - "packages": { - "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], - - "@babel/code-frame": ["@babel/code-frame@7.28.6", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q=="], - - "@babel/compat-data": ["@babel/compat-data@7.28.6", "", {}, "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg=="], - - "@babel/core": ["@babel/core@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/template": "^7.28.6", "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw=="], - - "@babel/generator": ["@babel/generator@7.28.6", "", { "dependencies": { "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw=="], - - "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="], - - "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], - - "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="], - - "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="], - - "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="], - - "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], - - "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], - - "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], - - "@babel/helpers": ["@babel/helpers@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw=="], - - "@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": { "parser": "bin/babel-parser.js" } }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="], - - "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], - - "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], - - "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="], - - "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], - - "@babel/traverse": ["@babel/traverse@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.6", "@babel/template": "^7.28.6", "@babel/types": "^7.28.6", "debug": "^4.3.1" } }, "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg=="], - - "@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="], - - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], - - "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], - - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], - - "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], - - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], - - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], - - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], - - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], - - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], - - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], - - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], - - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], - - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], - - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], - - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], - - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], - - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], - - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], - - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], - - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], - - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], - - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], - - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], - - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], - - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], - - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], - - "@floating-ui/core": ["@floating-ui/core@1.7.3", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w=="], - - "@floating-ui/dom": ["@floating-ui/dom@1.7.4", "", { "dependencies": { "@floating-ui/core": "^1.7.3", "@floating-ui/utils": "^0.2.10" } }, "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA=="], - - "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.6", "", { "dependencies": { "@floating-ui/dom": "^1.7.4" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw=="], - - "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], - - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], - - "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], - - "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], - - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - - "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], - - "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], - - "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - - "@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="], - - "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA=="], - - "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w=="], - - "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.11", "", { "dependencies": { "@radix-ui/react-context": "1.1.3", "@radix-ui/react-primitive": "2.1.4", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q=="], - - "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA=="], - - "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="], - - "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], - - "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], - - "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw=="], - - "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], - - "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg=="], - - "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw=="], - - "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw=="], - - "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="], - - "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="], - - "@radix-ui/react-label": ["@radix-ui/react-label@2.1.8", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A=="], - - "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg=="], - - "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w=="], - - "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.8", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw=="], - - "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.9", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ=="], - - "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.5", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ=="], - - "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - - "@radix-ui/react-progress": ["@radix-ui/react-progress@1.1.8", "", { "dependencies": { "@radix-ui/react-context": "1.1.3", "@radix-ui/react-primitive": "2.1.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA=="], - - "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA=="], - - "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.8", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g=="], - - "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA=="], - - "@radix-ui/react-switch": ["@radix-ui/react-switch@1.2.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ=="], - - "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A=="], - - "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg=="], - - "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], - - "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="], - - "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="], - - "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="], - - "@radix-ui/react-use-is-hydrated": ["@radix-ui/react-use-is-hydrated@0.1.0", "", { "dependencies": { "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA=="], - - "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], - - "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ=="], - - "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.1", "", { "dependencies": { "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w=="], - - "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="], - - "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug=="], - - "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], - - "@reactflow/background": ["@reactflow/background@11.3.14", "", { "dependencies": { "@reactflow/core": "11.11.4", "classcat": "^5.0.3", "zustand": "^4.4.1" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" } }, "sha512-Gewd7blEVT5Lh6jqrvOgd4G6Qk17eGKQfsDXgyRSqM+CTwDqRldG2LsWN4sNeno6sbqVIC2fZ+rAUBFA9ZEUDA=="], - - "@reactflow/controls": ["@reactflow/controls@11.2.14", "", { "dependencies": { "@reactflow/core": "11.11.4", "classcat": "^5.0.3", "zustand": "^4.4.1" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" } }, "sha512-MiJp5VldFD7FrqaBNIrQ85dxChrG6ivuZ+dcFhPQUwOK3HfYgX2RHdBua+gx+40p5Vw5It3dVNp/my4Z3jF0dw=="], - - "@reactflow/core": ["@reactflow/core@11.11.4", "", { "dependencies": { "@types/d3": "^7.4.0", "@types/d3-drag": "^3.0.1", "@types/d3-selection": "^3.0.3", "@types/d3-zoom": "^3.0.1", "classcat": "^5.0.3", "d3-drag": "^3.0.0", "d3-selection": "^3.0.0", "d3-zoom": "^3.0.0", "zustand": "^4.4.1" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" } }, "sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q=="], - - "@reactflow/minimap": ["@reactflow/minimap@11.7.14", "", { "dependencies": { "@reactflow/core": "11.11.4", "@types/d3-selection": "^3.0.3", "@types/d3-zoom": "^3.0.1", "classcat": "^5.0.3", "d3-selection": "^3.0.0", "d3-zoom": "^3.0.0", "zustand": "^4.4.1" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" } }, "sha512-mpwLKKrEAofgFJdkhwR5UQ1JYWlcAAL/ZU/bctBkuNTT1yqV+y0buoNVImsRehVYhJwffSWeSHaBR5/GJjlCSQ=="], - - "@reactflow/node-resizer": ["@reactflow/node-resizer@2.2.14", "", { "dependencies": { "@reactflow/core": "11.11.4", "classcat": "^5.0.4", "d3-drag": "^3.0.0", "d3-selection": "^3.0.0", "zustand": "^4.4.1" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" } }, "sha512-fwqnks83jUlYr6OHcdFEedumWKChTHRGw/kbCxj0oqBd+ekfs+SIp4ddyNU0pdx96JIm5iNFS0oNrmEiJbbSaA=="], - - "@reactflow/node-toolbar": ["@reactflow/node-toolbar@1.3.14", "", { "dependencies": { "@reactflow/core": "11.11.4", "classcat": "^5.0.3", "zustand": "^4.4.1" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" } }, "sha512-rbynXQnH/xFNu4P9H+hVqlEUafDCkEoCy0Dg9mG22Sg+rY/0ck6KkrAQrYrTgXusd+cEJOMK0uOOFCK2/5rSGQ=="], - - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], - - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.56.0", "", { "os": "android", "cpu": "arm" }, "sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw=="], - - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.56.0", "", { "os": "android", "cpu": "arm64" }, "sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q=="], - - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.56.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w=="], - - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.56.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g=="], - - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.56.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ=="], - - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.56.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg=="], - - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.56.0", "", { "os": "linux", "cpu": "arm" }, "sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A=="], - - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.56.0", "", { "os": "linux", "cpu": "arm" }, "sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw=="], - - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.56.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ=="], - - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.56.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA=="], - - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.56.0", "", { "os": "linux", "cpu": "none" }, "sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg=="], - - "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.56.0", "", { "os": "linux", "cpu": "none" }, "sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA=="], - - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.56.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw=="], - - "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.56.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg=="], - - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.56.0", "", { "os": "linux", "cpu": "none" }, "sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew=="], - - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.56.0", "", { "os": "linux", "cpu": "none" }, "sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ=="], - - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.56.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ=="], - - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.56.0", "", { "os": "linux", "cpu": "x64" }, "sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw=="], - - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.56.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA=="], - - "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.56.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA=="], - - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.56.0", "", { "os": "none", "cpu": "arm64" }, "sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ=="], - - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.56.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing=="], - - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.56.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg=="], - - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.56.0", "", { "os": "win32", "cpu": "x64" }, "sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ=="], - - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.56.0", "", { "os": "win32", "cpu": "x64" }, "sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g=="], - - "@supabase/auth-js": ["@supabase/auth-js@2.91.1", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-3gFGMPuif2BOuAHXLAGsoOlDa64PROct1v7G94pMnvUAhh75u6+vnx4MYz1wyoyDBN5lCkJPGQNg5+RIgqxnpA=="], - - "@supabase/functions-js": ["@supabase/functions-js@2.91.1", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-xKepd3HZ6K6rKibriehKggIegsoz+jjV67tikN51q/YQq3AlUAkjUMSnMrqs8t5LMlAi+a3dJU812acXanR0cw=="], - - "@supabase/postgrest-js": ["@supabase/postgrest-js@2.91.1", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-UKumTC6SGHd65G/5Gj0V58u+SkUyiH4zEJ8OP2eb06+Tqnges1E/3Tl7lyq2qbcMP8nEyH/0M7m2bYjrn++haw=="], - - "@supabase/realtime-js": ["@supabase/realtime-js@2.91.1", "", { "dependencies": { "@types/phoenix": "^1.6.6", "@types/ws": "^8.18.1", "tslib": "2.8.1", "ws": "^8.18.2" } }, "sha512-Y4rifuvzekFgd2hUfiEvcMoh/JU3s1hmpWYS7tNGL2QHuFfWg8a4w/qg5qoSMVDvgGRz6G4L6yB1FaQRTplENQ=="], - - "@supabase/storage-js": ["@supabase/storage-js@2.91.1", "", { "dependencies": { "iceberg-js": "^0.8.1", "tslib": "2.8.1" } }, "sha512-hMJNT2tSleOrWwx4FmHTpihIA2PRDixAsWflECuQ4YDkeduBZGX5m2txnstMnteWW+H+mm+92WRRFLuidXqbfA=="], - - "@supabase/supabase-js": ["@supabase/supabase-js@2.91.1", "", { "dependencies": { "@supabase/auth-js": "2.91.1", "@supabase/functions-js": "2.91.1", "@supabase/postgrest-js": "2.91.1", "@supabase/realtime-js": "2.91.1", "@supabase/storage-js": "2.91.1" } }, "sha512-57Fb4s5nfLn5ed2a1rPtl+LI1Wbtms8MS4qcUa0w6luaStBlFhmSeD2TLBgJWdMIupWRF6iFTH4QTrO2+pG/ZQ=="], - - "@tanstack/query-core": ["@tanstack/query-core@5.90.20", "", {}, "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg=="], - - "@tanstack/react-query": ["@tanstack/react-query@5.90.20", "", { "dependencies": { "@tanstack/query-core": "5.90.20" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-vXBxa+qeyveVO7OA0jX1z+DeyCA4JKnThKv411jd5SORpBKgkcVnYKCiBgECvADvniBX7tobwBmg01qq9JmMJw=="], - - "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], - - "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], - - "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], - - "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], - - "@types/d3": ["@types/d3@7.4.3", "", { "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", "@types/d3-brush": "*", "@types/d3-chord": "*", "@types/d3-color": "*", "@types/d3-contour": "*", "@types/d3-delaunay": "*", "@types/d3-dispatch": "*", "@types/d3-drag": "*", "@types/d3-dsv": "*", "@types/d3-ease": "*", "@types/d3-fetch": "*", "@types/d3-force": "*", "@types/d3-format": "*", "@types/d3-geo": "*", "@types/d3-hierarchy": "*", "@types/d3-interpolate": "*", "@types/d3-path": "*", "@types/d3-polygon": "*", "@types/d3-quadtree": "*", "@types/d3-random": "*", "@types/d3-scale": "*", "@types/d3-scale-chromatic": "*", "@types/d3-selection": "*", "@types/d3-shape": "*", "@types/d3-time": "*", "@types/d3-time-format": "*", "@types/d3-timer": "*", "@types/d3-transition": "*", "@types/d3-zoom": "*" } }, "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww=="], - - "@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="], - - "@types/d3-axis": ["@types/d3-axis@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw=="], - - "@types/d3-brush": ["@types/d3-brush@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A=="], - - "@types/d3-chord": ["@types/d3-chord@3.0.6", "", {}, "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg=="], - - "@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="], - - "@types/d3-contour": ["@types/d3-contour@3.0.6", "", { "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" } }, "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg=="], - - "@types/d3-delaunay": ["@types/d3-delaunay@6.0.4", "", {}, "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw=="], - - "@types/d3-dispatch": ["@types/d3-dispatch@3.0.7", "", {}, "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA=="], - - "@types/d3-drag": ["@types/d3-drag@3.0.7", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ=="], - - "@types/d3-dsv": ["@types/d3-dsv@3.0.7", "", {}, "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g=="], - - "@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="], - - "@types/d3-fetch": ["@types/d3-fetch@3.0.7", "", { "dependencies": { "@types/d3-dsv": "*" } }, "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA=="], - - "@types/d3-force": ["@types/d3-force@3.0.10", "", {}, "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw=="], - - "@types/d3-format": ["@types/d3-format@3.0.4", "", {}, "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g=="], - - "@types/d3-geo": ["@types/d3-geo@3.1.0", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ=="], - - "@types/d3-hierarchy": ["@types/d3-hierarchy@3.1.7", "", {}, "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg=="], - - "@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="], - - "@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="], - - "@types/d3-polygon": ["@types/d3-polygon@3.0.2", "", {}, "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA=="], - - "@types/d3-quadtree": ["@types/d3-quadtree@3.0.6", "", {}, "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg=="], - - "@types/d3-random": ["@types/d3-random@3.0.3", "", {}, "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ=="], - - "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="], - - "@types/d3-scale-chromatic": ["@types/d3-scale-chromatic@3.1.0", "", {}, "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ=="], - - "@types/d3-selection": ["@types/d3-selection@3.0.11", "", {}, "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w=="], - - "@types/d3-shape": ["@types/d3-shape@3.1.8", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w=="], - - "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="], - - "@types/d3-time-format": ["@types/d3-time-format@4.0.3", "", {}, "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg=="], - - "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="], - - "@types/d3-transition": ["@types/d3-transition@3.0.9", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg=="], - - "@types/d3-zoom": ["@types/d3-zoom@3.0.8", "", { "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" } }, "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw=="], - - "@types/dagre": ["@types/dagre@0.7.53", "", {}, "sha512-f4gkWqzPZvYmKhOsDnhq/R8mO4UMcKdxZo+i5SCkOU1wvGeHJeUXGIHeE9pnwGyPMDof1Vx5ZQo4nxpeg2TTVQ=="], - - "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], - - "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="], - - "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], - - "@types/node": ["@types/node@25.0.10", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg=="], - - "@types/phoenix": ["@types/phoenix@1.6.7", "", {}, "sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q=="], - - "@types/prismjs": ["@types/prismjs@1.26.5", "", {}, "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ=="], - - "@types/prop-types": ["@types/prop-types@15.7.15", "", {}, "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw=="], - - "@types/react": ["@types/react@18.3.27", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" } }, "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w=="], - - "@types/react-dom": ["@types/react-dom@18.3.7", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ=="], - - "@types/react-syntax-highlighter": ["@types/react-syntax-highlighter@15.5.13", "", { "dependencies": { "@types/react": "*" } }, "sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA=="], - - "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], - - "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], - - "@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="], - - "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], - - "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], - - "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], - - "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], - - "autoprefixer": ["autoprefixer@10.4.23", "", { "dependencies": { "browserslist": "^4.28.1", "caniuse-lite": "^1.0.30001760", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": "bin/autoprefixer" }, "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA=="], - - "baseline-browser-mapping": ["baseline-browser-mapping@2.9.17", "", { "bin": "dist/cli.js" }, "sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ=="], - - "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], - - "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - - "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": "cli.js" }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], - - "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], - - "caniuse-lite": ["caniuse-lite@1.0.30001766", "", {}, "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA=="], - - "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], - - "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], - - "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], - - "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], - - "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], - - "classcat": ["classcat@5.0.5", "", {}, "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w=="], - - "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], - - "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], - - "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], - - "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - - "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], - - "cssesc": ["cssesc@3.0.0", "", { "bin": "bin/cssesc" }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], - - "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], - - "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="], - - "d3-dispatch": ["d3-dispatch@3.0.1", "", {}, "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="], - - "d3-drag": ["d3-drag@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" } }, "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg=="], - - "d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="], - - "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="], - - "d3-selection": ["d3-selection@3.0.0", "", {}, "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="], - - "d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="], - - "d3-transition": ["d3-transition@3.0.1", "", { "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", "d3-ease": "1 - 3", "d3-interpolate": "1 - 3", "d3-timer": "1 - 3" }, "peerDependencies": { "d3-selection": "2 - 3" } }, "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w=="], - - "d3-zoom": ["d3-zoom@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "2 - 3", "d3-transition": "2 - 3" } }, "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw=="], - - "dagre": ["dagre@0.8.5", "", { "dependencies": { "graphlib": "^2.1.8", "lodash": "^4.17.15" } }, "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw=="], - - "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - - "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], - - "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], - - "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], - - "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], - - "electron-to-chromium": ["electron-to-chromium@1.5.278", "", {}, "sha512-dQ0tM1svDRQOwxnXxm+twlGTjr9Upvt8UFWAgmLsxEzFQxhbti4VwxmMjsDxVC51Zo84swW7FVCXEV+VAkhuPw=="], - - "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": "bin/esbuild" }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], - - "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], - - "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], - - "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], - - "fault": ["fault@1.0.4", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA=="], - - "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - - "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], - - "format": ["format@0.2.2", "", {}, "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="], - - "fraction.js": ["fraction.js@5.3.4", "", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="], - - "framer-motion": ["framer-motion@12.29.0", "", { "dependencies": { "motion-dom": "^12.29.0", "motion-utils": "^12.27.2", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid"] }, "sha512-1gEFGXHYV2BD42ZPTFmSU9buehppU+bCuOnHU0AD18DKh9j4DuTx47MvqY5ax+NNWRtK32qIcJf1UxKo1WwjWg=="], - - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - - "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - - "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], - - "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], - - "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - - "graphlib": ["graphlib@2.1.8", "", { "dependencies": { "lodash": "^4.17.15" } }, "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A=="], - - "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], - - "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], - - "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], - - "highlight.js": ["highlight.js@10.7.3", "", {}, "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="], - - "highlightjs-vue": ["highlightjs-vue@1.0.0", "", {}, "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA=="], - - "iceberg-js": ["iceberg-js@0.8.1", "", {}, "sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA=="], - - "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], - - "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], - - "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], - - "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], - - "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], - - "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], - - "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - - "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], - - "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], - - "jiti": ["jiti@1.21.7", "", { "bin": "bin/jiti.js" }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], - - "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - - "jsesc": ["jsesc@3.1.0", "", { "bin": "bin/jsesc" }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], - - "json5": ["json5@2.2.3", "", { "bin": "lib/cli.js" }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], - - "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], - - "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], - - "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], - - "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": "cli.js" }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], - - "lowlight": ["lowlight@1.20.0", "", { "dependencies": { "fault": "^1.0.0", "highlight.js": "~10.7.0" } }, "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw=="], - - "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - - "lucide-react": ["lucide-react@0.554.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-St+z29uthEJVx0Is7ellNkgTEhaeSoA42I7JjOCBCrc5X6LYMGSv0P/2uS5HDLTExP5tpiqRD2PyUEOS6s9UXA=="], - - "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], - - "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], - - "motion-dom": ["motion-dom@12.29.0", "", { "dependencies": { "motion-utils": "^12.27.2" } }, "sha512-3eiz9bb32yvY8Q6XNM4AwkSOBPgU//EIKTZwsSWgA9uzbPBhZJeScCVcBuwwYVqhfamewpv7ZNmVKTGp5qnzkA=="], - - "motion-utils": ["motion-utils@12.27.2", "", {}, "sha512-B55gcoL85Mcdt2IEStY5EEAsrMSVE2sI14xQ/uAdPL+mfQxhKKFaEag9JmfxedJOR4vZpBGoPeC/Gm13I/4g5Q=="], - - "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - - "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], - - "nanoid": ["nanoid@3.3.11", "", { "bin": "bin/nanoid.cjs" }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - - "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], - - "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], - - "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], - - "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], - - "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], - - "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], - - "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], - - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - - "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - - "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], - - "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], - - "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], - - "postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="], - - "postcss-js": ["postcss-js@4.1.0", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw=="], - - "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="], - - "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="], - - "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], - - "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], - - "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], - - "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], - - "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], - - "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="], - - "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], - - "react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], - - "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], - - "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], - - "react-router": ["react-router@7.13.0", "", { "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-PZgus8ETambRT17BUm/LL8lX3Of+oiLaPuVTRH3l1eLvSPpKO3AvhAEb5N7ihAFZQrYDqkvvWfFh9p0z9VsjLw=="], - - "react-router-dom": ["react-router-dom@7.13.0", "", { "dependencies": { "react-router": "7.13.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-5CO/l5Yahi2SKC6rGZ+HDEjpjkGaG/ncEP7eWFTvFxbHP8yeeI0PxTDjimtpXYlR3b3i9/WIL4VJttPrESIf2g=="], - - "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], - - "react-syntax-highlighter": ["react-syntax-highlighter@16.1.0", "", { "dependencies": { "@babel/runtime": "^7.28.4", "highlight.js": "^10.4.1", "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", "prismjs": "^1.30.0", "refractor": "^5.0.0" }, "peerDependencies": { "react": ">= 0.14.0" } }, "sha512-E40/hBiP5rCNwkeBN1vRP+xow1X0pndinO+z3h7HLsHyjztbyjfzNWNKuAsJj+7DLam9iT4AaaOZnueCU+Nplg=="], - - "reactflow": ["reactflow@11.11.4", "", { "dependencies": { "@reactflow/background": "11.3.14", "@reactflow/controls": "11.2.14", "@reactflow/core": "11.11.4", "@reactflow/minimap": "11.7.14", "@reactflow/node-resizer": "2.2.14", "@reactflow/node-toolbar": "1.3.14" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" } }, "sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og=="], - - "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], - - "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - - "refractor": ["refractor@5.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/prismjs": "^1.0.0", "hastscript": "^9.0.0", "parse-entities": "^4.0.0" } }, "sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw=="], - - "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": "bin/resolve" }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], - - "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - - "rollup": ["rollup@4.56.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.56.0", "@rollup/rollup-android-arm64": "4.56.0", "@rollup/rollup-darwin-arm64": "4.56.0", "@rollup/rollup-darwin-x64": "4.56.0", "@rollup/rollup-freebsd-arm64": "4.56.0", "@rollup/rollup-freebsd-x64": "4.56.0", "@rollup/rollup-linux-arm-gnueabihf": "4.56.0", "@rollup/rollup-linux-arm-musleabihf": "4.56.0", "@rollup/rollup-linux-arm64-gnu": "4.56.0", "@rollup/rollup-linux-arm64-musl": "4.56.0", "@rollup/rollup-linux-loong64-gnu": "4.56.0", "@rollup/rollup-linux-loong64-musl": "4.56.0", "@rollup/rollup-linux-ppc64-gnu": "4.56.0", "@rollup/rollup-linux-ppc64-musl": "4.56.0", "@rollup/rollup-linux-riscv64-gnu": "4.56.0", "@rollup/rollup-linux-riscv64-musl": "4.56.0", "@rollup/rollup-linux-s390x-gnu": "4.56.0", "@rollup/rollup-linux-x64-gnu": "4.56.0", "@rollup/rollup-linux-x64-musl": "4.56.0", "@rollup/rollup-openbsd-x64": "4.56.0", "@rollup/rollup-openharmony-arm64": "4.56.0", "@rollup/rollup-win32-arm64-msvc": "4.56.0", "@rollup/rollup-win32-ia32-msvc": "4.56.0", "@rollup/rollup-win32-x64-gnu": "4.56.0", "@rollup/rollup-win32-x64-msvc": "4.56.0", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg=="], - - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], - - "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], - - "semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "set-cookie-parser": ["set-cookie-parser@2.7.2", "", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="], - - "sonner": ["sonner@2.0.7", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w=="], - - "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], - - "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], - - "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="], - - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], - - "tailwind-merge": ["tailwind-merge@3.4.0", "", {}, "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g=="], - - "tailwindcss": ["tailwindcss@3.4.19", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ=="], - - "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="], - - "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], - - "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], - - "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], - - "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - - "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], - - "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - - "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - - "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], - - "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": "cli.js" }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], - - "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], - - "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], - - "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], - - "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - - "vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": "bin/vite.js" }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], - - "ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], - - "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - - "zustand": ["zustand@4.5.7", "", { "dependencies": { "use-sync-external-store": "^1.2.2" }, "peerDependencies": { "@types/react": ">=16.8", "immer": ">=9.0.6", "react": ">=16.8" }, "optionalPeers": ["immer"] }, "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw=="], - - "@radix-ui/react-avatar/@radix-ui/react-context": ["@radix-ui/react-context@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw=="], - - "@radix-ui/react-avatar/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.4", "", { "dependencies": { "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg=="], - - "@radix-ui/react-collection/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-dialog/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-label/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.4", "", { "dependencies": { "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg=="], - - "@radix-ui/react-menu/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-progress/@radix-ui/react-context": ["@radix-ui/react-context@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw=="], - - "@radix-ui/react-progress/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.4", "", { "dependencies": { "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg=="], - - "@radix-ui/react-separator/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.4", "", { "dependencies": { "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg=="], - - "@radix-ui/react-tooltip/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], - - "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - } -} diff --git a/frontend/package.json b/frontend/package.json index 68f5346..5c75245 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,11 +12,13 @@ "dependencies": { "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-avatar": "^1.1.11", + "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-label": "^2.1.8", "@radix-ui/react-navigation-menu": "^1.2.14", "@radix-ui/react-progress": "^1.1.8", + "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-separator": "^1.1.8", "@radix-ui/react-slot": "^1.2.4", "@radix-ui/react-switch": "^1.2.6", @@ -28,6 +30,7 @@ "@types/react-syntax-highlighter": "^15.5.13", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "cmdk": "^1.1.1", "dagre": "^0.8.5", "framer-motion": "^12.29.0", "lucide-react": "^0.554.0", diff --git a/frontend/src/components/docs/DocsBadges.tsx b/frontend/src/components/docs/DocsBadges.tsx new file mode 100644 index 0000000..5e27355 --- /dev/null +++ b/frontend/src/components/docs/DocsBadges.tsx @@ -0,0 +1,59 @@ +import { Clock } from 'lucide-react' +import { cn } from '@/lib/utils' + +interface TimeEstimateProps { + minutes: number + className?: string +} + +export function TimeEstimate({ minutes, className }: TimeEstimateProps) { + const label = minutes === 1 ? '1 min read' : `${minutes} min read` + + return ( + + + {label} + + ) +} + +// Difficulty badge +type Difficulty = 'beginner' | 'intermediate' | 'advanced' + +interface DifficultyBadgeProps { + level: Difficulty + className?: string +} + +const difficultyConfig: Record = { + beginner: { + label: 'Beginner', + className: 'text-green-400 bg-green-500/10 border-green-500/30', + }, + intermediate: { + label: 'Intermediate', + className: 'text-amber-400 bg-amber-500/10 border-amber-500/30', + }, + advanced: { + label: 'Advanced', + className: 'text-red-400 bg-red-500/10 border-red-500/30', + }, +} + +export function DifficultyBadge({ level, className }: DifficultyBadgeProps) { + const config = difficultyConfig[level] + + return ( + + {config.label} + + ) +} diff --git a/frontend/src/components/docs/DocsBreadcrumb.tsx b/frontend/src/components/docs/DocsBreadcrumb.tsx new file mode 100644 index 0000000..d2afe41 --- /dev/null +++ b/frontend/src/components/docs/DocsBreadcrumb.tsx @@ -0,0 +1,73 @@ +import { Link, useLocation } from 'react-router-dom' +import { ChevronRight, Home } from 'lucide-react' + +interface BreadcrumbItem { + label: string + href: string +} + +// Map paths to readable labels +const pathLabels: Record = { + 'docs': 'Documentation', + 'quickstart': 'Quick Start', + 'mcp-setup': 'MCP Setup', + 'mcp-tools': 'MCP Tools', + 'mcp-examples': 'Examples', + 'features': 'Features', + 'search': 'Semantic Search', + 'dependencies': 'Dependencies', + 'impact': 'Impact Analysis', + 'style': 'Code Style', + 'deployment': 'Deployment', + 'docker': 'Docker', + 'self-host': 'Self-Hosting', + 'api': 'API Reference', + 'authentication': 'Authentication', + 'repositories': 'Repositories', + 'architecture': 'Architecture', + 'contributing': 'Contributing', +} + +export function DocsBreadcrumb() { + const location = useLocation() + const pathSegments = location.pathname.split('/').filter(Boolean) + + // Build breadcrumb items + const items: BreadcrumbItem[] = pathSegments.map((segment, index) => { + const href = '/' + pathSegments.slice(0, index + 1).join('/') + const label = pathLabels[segment] || segment.charAt(0).toUpperCase() + segment.slice(1) + return { label, href } + }) + + // Don't show breadcrumb on docs home + if (pathSegments.length <= 1) { + return null + } + + return ( + + ) +} diff --git a/frontend/src/components/docs/DocsCallout.tsx b/frontend/src/components/docs/DocsCallout.tsx new file mode 100644 index 0000000..6fba506 --- /dev/null +++ b/frontend/src/components/docs/DocsCallout.tsx @@ -0,0 +1,69 @@ +import { cn } from '@/lib/utils' +import { AlertCircle, AlertTriangle, Info, Lightbulb, CheckCircle } from 'lucide-react' + +type CalloutType = 'info' | 'warning' | 'tip' | 'danger' | 'success' + +interface DocsCalloutProps { + type?: CalloutType + title?: string + children: React.ReactNode +} + +const calloutConfig: Record = { + info: { + icon: , + containerClass: 'bg-blue-500/10 border-blue-500/30', + titleClass: 'text-blue-400', + }, + warning: { + icon: , + containerClass: 'bg-amber-500/10 border-amber-500/30', + titleClass: 'text-amber-400', + }, + tip: { + icon: , + containerClass: 'bg-green-500/10 border-green-500/30', + titleClass: 'text-green-400', + }, + danger: { + icon: , + containerClass: 'bg-red-500/10 border-red-500/30', + titleClass: 'text-red-400', + }, + success: { + icon: , + containerClass: 'bg-emerald-500/10 border-emerald-500/30', + titleClass: 'text-emerald-400', + }, +} + +export function DocsCallout({ type = 'info', title, children }: DocsCalloutProps) { + const config = calloutConfig[type] + + return ( +
+
+ + {config.icon} + +
+ {title && ( +

+ {title} +

+ )} +
+ {children} +
+
+
+
+ ) +} diff --git a/frontend/src/components/docs/DocsCards.tsx b/frontend/src/components/docs/DocsCards.tsx new file mode 100644 index 0000000..79868d6 --- /dev/null +++ b/frontend/src/components/docs/DocsCards.tsx @@ -0,0 +1,146 @@ +import { Link } from 'react-router-dom' +import { ArrowRight, ChevronLeft, ChevronRight } from 'lucide-react' +import { cn } from '@/lib/utils' + +interface RelatedDoc { + title: string + description: string + href: string + icon?: React.ReactNode +} + +interface DocsRelatedProps { + items: RelatedDoc[] + title?: string +} + +export function DocsRelated({ items, title = 'Related Documentation' }: DocsRelatedProps) { + if (items.length === 0) return null + + return ( +
+

{title}

+
+ {items.map((item) => ( + + {item.icon && ( + + {item.icon} + + )} +
+

+ {item.title} + +

+

+ {item.description} +

+
+ + ))} +
+
+ ) +} + +interface DocsNavLink { + title: string + href: string +} + +interface DocsPaginationProps { + prev?: DocsNavLink + next?: DocsNavLink +} + +export function DocsPagination({ prev, next }: DocsPaginationProps) { + return ( +
+ {prev ? ( + + +
+ Previous + {prev.title} +
+ + ) : ( +
+ )} + + {next ? ( + +
+ Next + {next.title} +
+ + + ) : ( +
+ )} +
+ ) +} + +interface DocsCardProps { + title: string + description: string + href: string + icon?: React.ReactNode + badge?: string +} + +export function DocsCard({ title, description, href, icon, badge }: DocsCardProps) { + return ( + + {badge && ( + + {badge} + + )} + +
+ {icon && ( +
+ {icon} +
+ )} +
+

+ {title} +

+

+ {description} +

+
+
+ + ) +} + +export function DocsCardGrid({ children }: { children: React.ReactNode }) { + return ( +
+ {children} +
+ ) +} diff --git a/frontend/src/components/docs/DocsCodeBlock.tsx b/frontend/src/components/docs/DocsCodeBlock.tsx new file mode 100644 index 0000000..d6fbfe7 --- /dev/null +++ b/frontend/src/components/docs/DocsCodeBlock.tsx @@ -0,0 +1,169 @@ +import { useState } from 'react' +import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter' +import { oneDark } from 'react-syntax-highlighter/dist/esm/styles/prism' +import { Check, Copy } from 'lucide-react' +import { cn } from '@/lib/utils' +import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs' + +interface CodeBlockProps { + children: string + language?: string + filename?: string + showLineNumbers?: boolean + highlightLines?: number[] +} + +export function DocsCodeBlock({ + children, + language = 'bash', + filename, + showLineNumbers = false, + highlightLines = [] +}: CodeBlockProps) { + const [copied, setCopied] = useState(false) + + const copyToClipboard = async () => { + await navigator.clipboard.writeText(children.trim()) + setCopied(true) + setTimeout(() => setCopied(false), 2000) + } + + return ( +
+ {filename && ( +
+ {filename} + {language} +
+ )} + +
+ 0} + lineProps={(lineNumber) => ({ + style: { + backgroundColor: highlightLines.includes(lineNumber) + ? 'rgba(59, 130, 246, 0.1)' + : 'transparent', + display: 'block', + width: '100%', + }, + })} + customStyle={{ + margin: 0, + padding: '1rem', + background: 'transparent', + fontSize: '0.875rem', + }} + > + {children.trim()} + + + +
+
+ ) +} + +// Multi-language code block with tabs +interface CodeTabsProps { + tabs: { + label: string + language: string + code: string + }[] + filename?: string +} + +export function DocsCodeTabs({ tabs, filename }: CodeTabsProps) { + const [copied, setCopied] = useState(false) + const [activeTab, setActiveTab] = useState(tabs[0]?.label || '') + + const copyToClipboard = async () => { + const activeCode = tabs.find(t => t.label === activeTab)?.code || '' + await navigator.clipboard.writeText(activeCode.trim()) + setCopied(true) + setTimeout(() => setCopied(false), 2000) + } + + return ( +
+ +
+ + {tabs.map((tab) => ( + + {tab.label} + + ))} + + + {filename && ( + {filename} + )} +
+ + {tabs.map((tab) => ( + +
+ + {tab.code.trim()} + +
+
+ ))} +
+ + +
+ ) +} diff --git a/frontend/src/components/docs/DocsLayout.tsx b/frontend/src/components/docs/DocsLayout.tsx index 3f14be3..26231d7 100644 --- a/frontend/src/components/docs/DocsLayout.tsx +++ b/frontend/src/components/docs/DocsLayout.tsx @@ -1,18 +1,181 @@ +import { useState } from 'react' import { DocsSidebar } from './DocsSidebar' +import { DocsBreadcrumb } from './DocsBreadcrumb' +import { DocsTableOfContents, TOCItem } from './DocsTableOfContents' +import { DocsSearch } from './DocsSearch' +import { ScrollArea } from '@/components/ui/scroll-area' +import { Sheet, SheetContent, SheetTrigger } from '@/components/ui/sheet' +import { Menu, BookOpen } from 'lucide-react' +import { Link } from 'react-router-dom' interface DocsLayoutProps { children: React.ReactNode + toc?: TOCItem[] + showToc?: boolean } -export function DocsLayout({ children }: DocsLayoutProps) { +export function DocsLayout({ children, toc = [], showToc = true }: DocsLayoutProps) { + const [mobileMenuOpen, setMobileMenuOpen] = useState(false) + return ( -
- -
-
- {children} +
+ {/* Mobile header */} +
+
+ + + + + + setMobileMenuOpen(false)} /> + + + + +
+ +
+ Docs + +
+ +
+
-
+ + +
+ {/* Desktop sidebar */} + + + {/* Main content */} +
+
+
+ {/* Article content */} +
+ +
+ {children} +
+
+ + {/* Table of contents - desktop only */} + {showToc && toc.length > 0 && ( + + )} +
+
+
+
) } + +// Mobile sidebar content +function MobileSidebar({ onNavigate }: { onNavigate: () => void }) { + return ( + +
+ +
+ +
+
+

OpenCodeIntel

+

Documentation

+
+ + + +
+
+ ) +} + +// Mobile navigation items +import { useLocation } from 'react-router-dom' +import { cn } from '@/lib/utils' + +const mobileNavigation = [ + { + title: 'Getting Started', + items: [ + { title: 'Introduction', href: '/docs' }, + { title: 'Quick Start', href: '/docs/quickstart' }, + ], + }, + { + title: 'MCP Integration', + items: [ + { title: 'MCP Setup Guide', href: '/docs/mcp-setup' }, + { title: 'Tools Reference', href: '/docs/mcp-tools' }, + { title: 'Example Prompts', href: '/docs/mcp-examples' }, + ], + }, + { + title: 'Features', + items: [ + { title: 'Semantic Search', href: '/docs/features/search' }, + { title: 'Dependency Analysis', href: '/docs/features/dependencies' }, + { title: 'Impact Prediction', href: '/docs/features/impact' }, + { title: 'Code Style Analysis', href: '/docs/features/style' }, + ], + }, + { + title: 'Deployment', + items: [ + { title: 'Docker Setup', href: '/docs/deployment/docker' }, + { title: 'Self-Hosting', href: '/docs/deployment/self-host' }, + ], + }, +] + +function MobileNavigation({ onNavigate }: { onNavigate: () => void }) { + const location = useLocation() + + const isActive = (href: string) => { + if (href === '/docs') return location.pathname === '/docs' + return location.pathname.startsWith(href) + } + + return ( + + ) +} diff --git a/frontend/src/components/docs/DocsPageHeader.tsx b/frontend/src/components/docs/DocsPageHeader.tsx new file mode 100644 index 0000000..823145e --- /dev/null +++ b/frontend/src/components/docs/DocsPageHeader.tsx @@ -0,0 +1,123 @@ +import { Clock, BookOpen, CheckCircle } from 'lucide-react' +import { Badge } from '@/components/ui/badge' +import { cn } from '@/lib/utils' + +interface DocsTimeEstimateProps { + minutes: number + className?: string +} + +export function DocsTimeEstimate({ minutes, className }: DocsTimeEstimateProps) { + return ( + + + {minutes} min read + + ) +} + +interface DocsDifficultyProps { + level: 'beginner' | 'intermediate' | 'advanced' + className?: string +} + +export function DocsDifficulty({ level, className }: DocsDifficultyProps) { + const config = { + beginner: { label: 'Beginner', color: 'bg-green-500/10 text-green-400 border-green-500/30' }, + intermediate: { label: 'Intermediate', color: 'bg-yellow-500/10 text-yellow-400 border-yellow-500/30' }, + advanced: { label: 'Advanced', color: 'bg-red-500/10 text-red-400 border-red-500/30' }, + } + + const { label, color } = config[level] + + return ( + + + {label} + + ) +} + +interface DocsPageHeaderProps { + title: string + description: string + timeEstimate?: number + difficulty?: 'beginner' | 'intermediate' | 'advanced' + category?: string +} + +export function DocsPageHeader({ + title, + description, + timeEstimate, + difficulty, + category +}: DocsPageHeaderProps) { + return ( +
+ {category && ( +
+ {category} +
+ )} + +

{title}

+ +

{description}

+ + {(timeEstimate || difficulty) && ( +
+ {timeEstimate && } + {difficulty && } +
+ )} +
+ ) +} + +interface Prerequisite { + text: string + href?: string + completed?: boolean +} + +interface DocsPrerequisitesProps { + items: Prerequisite[] +} + +export function DocsPrerequisites({ items }: DocsPrerequisitesProps) { + return ( +
+

+ + Prerequisites +

+
    + {items.map((item, index) => ( +
  • + + {item.href ? ( + + {item.text} + + ) : ( + {item.text} + )} +
  • + ))} +
+
+ ) +} diff --git a/frontend/src/components/docs/DocsPrerequisites.tsx b/frontend/src/components/docs/DocsPrerequisites.tsx new file mode 100644 index 0000000..8ffb685 --- /dev/null +++ b/frontend/src/components/docs/DocsPrerequisites.tsx @@ -0,0 +1,101 @@ +import { useState } from 'react' +import { ChevronDown, Check, ExternalLink } from 'lucide-react' +import { cn } from '@/lib/utils' +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible' + +interface Prerequisite { + text: string + href?: string + completed?: boolean +} + +interface DocsPrerequisitesProps { + items: Prerequisite[] + defaultOpen?: boolean +} + +export function DocsPrerequisites({ items, defaultOpen = false }: DocsPrerequisitesProps) { + const [open, setOpen] = useState(defaultOpen) + + return ( + + +
+ 📋 + Prerequisites + ({items.length} items) +
+ +
+ + +
+
    + {items.map((item, index) => ( +
  • + + {item.completed ? ( + + ) : ( + + )} + + + {item.href ? ( + + {item.text} + + + ) : ( + item.text + )} + +
  • + ))} +
+
+
+
+ ) +} + +// What you will learn section +interface LearningObjective { + text: string +} + +interface DocsLearningObjectivesProps { + items: LearningObjective[] +} + +export function DocsLearningObjectives({ items }: DocsLearningObjectivesProps) { + return ( +
+

+ 🎯 + What you will learn +

+
    + {items.map((item, index) => ( +
  • + + {item.text} +
  • + ))} +
+
+ ) +} diff --git a/frontend/src/components/docs/DocsRelated.tsx b/frontend/src/components/docs/DocsRelated.tsx new file mode 100644 index 0000000..fad57bc --- /dev/null +++ b/frontend/src/components/docs/DocsRelated.tsx @@ -0,0 +1,101 @@ +import { Link } from 'react-router-dom' +import { ArrowRight, ChevronLeft, ChevronRight } from 'lucide-react' +import { cn } from '@/lib/utils' + +interface RelatedDoc { + title: string + description: string + href: string + icon?: React.ReactNode +} + +interface DocsRelatedProps { + items: RelatedDoc[] + title?: string +} + +export function DocsRelated({ items, title = 'Related' }: DocsRelatedProps) { + return ( +
+

+ {title} +

+
+ {items.map((item) => ( + + {item.icon && ( + + {item.icon} + + )} +
+

+ {item.title} +

+

+ {item.description} +

+
+ + + ))} +
+
+ ) +} + +// Previous/Next navigation at bottom of page +interface DocsPaginationProps { + prev?: { + title: string + href: string + } + next?: { + title: string + href: string + } +} + +export function DocsPagination({ prev, next }: DocsPaginationProps) { + return ( +
+ {prev ? ( + + +
+

Previous

+

{prev.title}

+
+ + ) : ( +
+ )} + + {next ? ( + +
+

Next

+

{next.title}

+
+ + + ) : ( +
+ )} +
+ ) +} diff --git a/frontend/src/components/docs/DocsSearch.tsx b/frontend/src/components/docs/DocsSearch.tsx new file mode 100644 index 0000000..0363990 --- /dev/null +++ b/frontend/src/components/docs/DocsSearch.tsx @@ -0,0 +1,188 @@ +import { useEffect, useState, useCallback } from 'react' +import { useNavigate } from 'react-router-dom' +import { + CommandDialog, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from '@/components/ui/command' +import { + FileText, + Zap, + GitBranch, + Search as SearchIcon, + AlertTriangle, + Palette, + Terminal, + Server, + Code, + BookOpen +} from 'lucide-react' + +interface DocPage { + title: string + href: string + description: string + icon: React.ReactNode + category: string +} + +const docsPages: DocPage[] = [ + // Getting Started + { + title: 'Introduction', + href: '/docs', + description: 'Overview of OpenCodeIntel', + icon: , + category: 'Getting Started' + }, + { + title: 'Quick Start', + href: '/docs/quickstart', + description: 'Get up and running in 5 minutes', + icon: , + category: 'Getting Started' + }, + + // MCP Integration + { + title: 'MCP Setup Guide', + href: '/docs/mcp-setup', + description: 'Connect to Claude Desktop', + icon: , + category: 'MCP Integration' + }, + { + title: 'MCP Tools Reference', + href: '/docs/mcp-tools', + description: 'All available MCP tools', + icon: , + category: 'MCP Integration' + }, + { + title: 'Example Prompts', + href: '/docs/mcp-examples', + description: 'Real prompts that work', + icon: , + category: 'MCP Integration' + }, + + // Features + { + title: 'Semantic Search', + href: '/docs/features/search', + description: 'Find code by meaning', + icon: , + category: 'Features' + }, + { + title: 'Dependency Analysis', + href: '/docs/features/dependencies', + description: 'Visualize architecture', + icon: , + category: 'Features' + }, + { + title: 'Impact Prediction', + href: '/docs/features/impact', + description: 'Know what breaks', + icon: , + category: 'Features' + }, + { + title: 'Code Style Analysis', + href: '/docs/features/style', + description: 'Team conventions', + icon: , + category: 'Features' + }, + + // Deployment + { + title: 'Docker Setup', + href: '/docs/deployment/docker', + description: 'Run with Docker Compose', + icon: , + category: 'Deployment' + }, + { + title: 'Self-Hosting Guide', + href: '/docs/deployment/self-host', + description: 'Full deployment guide', + icon: , + category: 'Deployment' + }, +] + +export function DocsSearch() { + const [open, setOpen] = useState(false) + const navigate = useNavigate() + + useEffect(() => { + const down = (e: KeyboardEvent) => { + if (e.key === 'k' && (e.metaKey || e.ctrlKey)) { + e.preventDefault() + setOpen((open) => !open) + } + } + + document.addEventListener('keydown', down) + return () => document.removeEventListener('keydown', down) + }, []) + + const runCommand = useCallback((command: () => void) => { + setOpen(false) + command() + }, []) + + // Group pages by category + const groupedPages = docsPages.reduce((acc, page) => { + if (!acc[page.category]) { + acc[page.category] = [] + } + acc[page.category].push(page) + return acc + }, {} as Record) + + return ( + <> + + + + + + No results found. + {Object.entries(groupedPages).map(([category, pages]) => ( + + {pages.map((page) => ( + runCommand(() => navigate(page.href))} + className="flex items-center gap-3 cursor-pointer" + > + {page.icon} +
+ {page.title} + {page.description} +
+
+ ))} +
+ ))} +
+
+ + ) +} diff --git a/frontend/src/components/docs/DocsSidebar.tsx b/frontend/src/components/docs/DocsSidebar.tsx index d902619..2ed7afe 100644 --- a/frontend/src/components/docs/DocsSidebar.tsx +++ b/frontend/src/components/docs/DocsSidebar.tsx @@ -1,4 +1,22 @@ import { Link, useLocation } from 'react-router-dom' +import { cn } from '@/lib/utils' +import { ScrollArea } from '@/components/ui/scroll-area' +import { DocsSearch } from './DocsSearch' +import { + BookOpen, + Zap, + Terminal, + Code, + FileText, + Search, + GitBranch, + AlertTriangle, + Palette, + Server, + Settings, + Users, + ChevronLeft +} from 'lucide-react' interface NavItem { title: string @@ -15,32 +33,51 @@ const navigation: NavSection[] = [ { title: 'Getting Started', items: [ - { title: 'Introduction', href: '/docs' }, - { title: 'Quick Start', href: '/docs/quickstart' }, + { title: 'Introduction', href: '/docs', icon: }, + { title: 'Quick Start', href: '/docs/quickstart', icon: }, ], }, { title: 'MCP Integration', items: [ - { title: 'MCP Setup Guide', href: '/docs/mcp-setup' }, - { title: 'Available Tools', href: '/docs/mcp-tools' }, - { title: 'Example Prompts', href: '/docs/mcp-examples' }, + { title: 'MCP Setup Guide', href: '/docs/mcp-setup', icon: }, + { title: 'Tools Reference', href: '/docs/mcp-tools', icon: }, + { title: 'Example Prompts', href: '/docs/mcp-examples', icon: }, ], }, { title: 'Features', items: [ - { title: 'Semantic Search', href: '/docs/features/search' }, - { title: 'Dependency Analysis', href: '/docs/features/dependencies' }, - { title: 'Impact Prediction', href: '/docs/features/impact' }, - { title: 'Code Style Analysis', href: '/docs/features/style' }, + { title: 'Semantic Search', href: '/docs/features/search', icon: }, + { title: 'Dependency Analysis', href: '/docs/features/dependencies', icon: }, + { title: 'Impact Prediction', href: '/docs/features/impact', icon: }, + { title: 'Code Style Analysis', href: '/docs/features/style', icon: }, + ], + }, + { + title: 'API Reference', + items: [ + { title: 'Overview', href: '/docs/api', icon: }, + { title: 'Authentication', href: '/docs/api/authentication', icon: }, + { title: 'Repositories', href: '/docs/api/repositories', icon: }, + { title: 'Search', href: '/docs/api/search', icon: }, + { title: 'Analysis', href: '/docs/api/analysis', icon: }, ], }, { title: 'Deployment', items: [ - { title: 'Docker Setup', href: '/docs/deployment/docker' }, - { title: 'Self-Hosting', href: '/docs/deployment/self-host' }, + { title: 'Docker Setup', href: '/docs/deployment/docker', icon: }, + { title: 'Self-Hosting', href: '/docs/deployment/self-host', icon: }, + { title: 'Configuration', href: '/docs/deployment/configuration', icon: }, + ], + }, + { + title: 'Contributing', + items: [ + { title: 'Architecture', href: '/docs/architecture', icon: }, + { title: 'Development Setup', href: '/docs/contributing/setup', icon: }, + { title: 'Code Style Guide', href: '/docs/contributing/style', icon: }, ], }, ] @@ -49,47 +86,90 @@ export function DocsSidebar() { const location = useLocation() const isActive = (href: string) => { - return location.pathname === href + if (href === '/docs') { + return location.pathname === '/docs' + } + return location.pathname.startsWith(href) } return ( -
) diff --git a/frontend/src/components/docs/DocsStepList.tsx b/frontend/src/components/docs/DocsStepList.tsx new file mode 100644 index 0000000..6bb95df --- /dev/null +++ b/frontend/src/components/docs/DocsStepList.tsx @@ -0,0 +1,83 @@ +import { cn } from '@/lib/utils' + +interface Step { + title: string + children: React.ReactNode +} + +interface DocsStepListProps { + children: React.ReactNode +} + +interface DocsStepProps { + number: number + title: string + children: React.ReactNode +} + +export function DocsStepList({ children }: DocsStepListProps) { + return ( +
+ {children} +
+ ) +} + +export function DocsStep({ number, title, children }: DocsStepProps) { + return ( +
+ {/* Step number */} +
+ {number} +
+ + {/* Connecting line */} +
+ + {/* Content */} +
+

{title}

+
+ {children} +
+
+
+ ) +} + +// Alternative: Card-style steps for more visual separation +interface DocsStepCardProps { + number: number + title: string + description?: string + children: React.ReactNode +} + +export function DocsStepCard({ number, title, description, children }: DocsStepCardProps) { + return ( +
+
+ {/* Step indicator */} +
+
+ {number} +
+
+
+ + {/* Card content */} +
+
+

{title}

+ {description && ( +

{description}

+ )} +
+ {children} +
+
+
+
+
+ ) +} diff --git a/frontend/src/components/docs/DocsSteps.tsx b/frontend/src/components/docs/DocsSteps.tsx new file mode 100644 index 0000000..59651a5 --- /dev/null +++ b/frontend/src/components/docs/DocsSteps.tsx @@ -0,0 +1,99 @@ +import { cn } from '@/lib/utils' + +interface StepProps { + number: number + title: string + children: React.ReactNode +} + +export function Step({ number, title, children }: StepProps) { + return ( +
+ {/* Vertical line connecting steps */} +
+ + {/* Step number */} +
+ {number} +
+ + {/* Content */} +
+

{title}

+
+ {children} +
+
+
+ ) +} + +interface StepListProps { + children: React.ReactNode + className?: string +} + +export function StepList({ children, className }: StepListProps) { + return ( +
+ {children} +
+ ) +} + +// Alternative: Horizontal steps for shorter processes +interface HorizontalStepProps { + number: number + title: string + description?: string + active?: boolean + completed?: boolean +} + +export function HorizontalStep({ number, title, description, active, completed }: HorizontalStepProps) { + return ( +
+ {/* Connector line */} +
+ +
+ {/* Step number */} +
+ {completed ? '✓' : number} +
+ +
+

+ {title} +

+ {description && ( +

{description}

+ )} +
+
+
+ ) +} + +interface HorizontalStepListProps { + children: React.ReactNode + className?: string +} + +export function HorizontalStepList({ children, className }: HorizontalStepListProps) { + return ( +
+ {children} +
+ ) +} diff --git a/frontend/src/components/docs/DocsTableOfContents.tsx b/frontend/src/components/docs/DocsTableOfContents.tsx new file mode 100644 index 0000000..537fe07 --- /dev/null +++ b/frontend/src/components/docs/DocsTableOfContents.tsx @@ -0,0 +1,105 @@ +import { useEffect, useState } from 'react' +import { cn } from '@/lib/utils' + +export interface TOCItem { + id: string + title: string + level: number +} + +interface DocsTableOfContentsProps { + items: TOCItem[] +} + +export function DocsTableOfContents({ items }: DocsTableOfContentsProps) { + const [activeId, setActiveId] = useState('') + + useEffect(() => { + if (items.length === 0) return + + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + setActiveId(entry.target.id) + } + }) + }, + { + rootMargin: '-80px 0px -80% 0px', + threshold: 0, + } + ) + + items.forEach((item) => { + const element = document.getElementById(item.id) + if (element) { + observer.observe(element) + } + }) + + return () => observer.disconnect() + }, [items]) + + if (items.length === 0) { + return null + } + + return ( + + ) +} + +// Hook to extract TOC items from page content +export function useTableOfContents(): TOCItem[] { + const [items, setItems] = useState([]) + + useEffect(() => { + // Find all headings with IDs in the main content + const headings = document.querySelectorAll('article h2[id], article h3[id], article h4[id]') + + const tocItems: TOCItem[] = Array.from(headings).map((heading) => ({ + id: heading.id, + title: heading.textContent || '', + level: parseInt(heading.tagName.charAt(1)), + })) + + setItems(tocItems) + }, []) + + return items +} diff --git a/frontend/src/components/docs/index.ts b/frontend/src/components/docs/index.ts index a31bba1..15c31a7 100644 --- a/frontend/src/components/docs/index.ts +++ b/frontend/src/components/docs/index.ts @@ -1,2 +1,17 @@ +// Layout export { DocsLayout } from './DocsLayout' export { DocsSidebar } from './DocsSidebar' +export { DocsBreadcrumb } from './DocsBreadcrumb' +export { DocsTableOfContents, useTableOfContents } from './DocsTableOfContents' +export type { TOCItem } from './DocsTableOfContents' + +// Search +export { DocsSearch } from './DocsSearch' + +// Content components +export { DocsCodeBlock, DocsCodeTabs } from './DocsCodeBlock' +export { DocsCallout } from './DocsCallout' +export { DocsPrerequisites, DocsLearningObjectives } from './DocsPrerequisites' +export { DocsRelated, DocsPagination } from './DocsRelated' +export { Step, StepList, HorizontalStep, HorizontalStepList } from './DocsSteps' +export { TimeEstimate, DifficultyBadge } from './DocsBadges' diff --git a/frontend/src/components/ui/collapsible.tsx b/frontend/src/components/ui/collapsible.tsx new file mode 100644 index 0000000..9fa4894 --- /dev/null +++ b/frontend/src/components/ui/collapsible.tsx @@ -0,0 +1,11 @@ +"use client" + +import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" + +const Collapsible = CollapsiblePrimitive.Root + +const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger + +const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent + +export { Collapsible, CollapsibleTrigger, CollapsibleContent } diff --git a/frontend/src/components/ui/command.tsx b/frontend/src/components/ui/command.tsx new file mode 100644 index 0000000..1c1b1aa --- /dev/null +++ b/frontend/src/components/ui/command.tsx @@ -0,0 +1,158 @@ +"use client" + +import * as React from "react" +import { Command as CommandPrimitive } from "cmdk" +import { Search } from "lucide-react" + +import { cn } from "@/lib/utils" +import { Dialog, DialogContent } from "@/components/ui/dialog" + +const Command = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Command.displayName = CommandPrimitive.displayName + +interface CommandDialogProps { + open?: boolean + onOpenChange?: (open: boolean) => void + children?: React.ReactNode +} + +const CommandDialog = ({ children, ...props }: CommandDialogProps) => { + return ( + + + + {children} + + + + ) +} + +const CommandInput = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( +
+ + +
+)) + +CommandInput.displayName = CommandPrimitive.Input.displayName + +const CommandList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandList.displayName = CommandPrimitive.List.displayName + +const CommandEmpty = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>((props, ref) => ( + +)) + +CommandEmpty.displayName = CommandPrimitive.Empty.displayName + +const CommandGroup = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandGroup.displayName = CommandPrimitive.Group.displayName + +const CommandSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +CommandSeparator.displayName = CommandPrimitive.Separator.displayName + +const CommandItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandItem.displayName = CommandPrimitive.Item.displayName + +const CommandShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +CommandShortcut.displayName = "CommandShortcut" + +export { + Command, + CommandDialog, + CommandInput, + CommandList, + CommandEmpty, + CommandGroup, + CommandItem, + CommandShortcut, + CommandSeparator, +} diff --git a/frontend/src/components/ui/scroll-area.tsx b/frontend/src/components/ui/scroll-area.tsx new file mode 100644 index 0000000..0b4a48d --- /dev/null +++ b/frontend/src/components/ui/scroll-area.tsx @@ -0,0 +1,48 @@ +"use client" + +import * as React from "react" +import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area" + +import { cn } from "@/lib/utils" + +const ScrollArea = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + {children} + + + + +)) +ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName + +const ScrollBar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, orientation = "vertical", ...props }, ref) => ( + + + +)) +ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName + +export { ScrollArea, ScrollBar } diff --git a/frontend/src/pages/DocsHomePage.tsx b/frontend/src/pages/DocsHomePage.tsx index ba25764..8884d55 100644 --- a/frontend/src/pages/DocsHomePage.tsx +++ b/frontend/src/pages/DocsHomePage.tsx @@ -1,153 +1,227 @@ import { Link } from 'react-router-dom' -import { DocsLayout } from '../components/docs/DocsLayout' +import { DocsLayout } from '@/components/docs' +import { + Zap, + Search, + GitBranch, + AlertTriangle, + Palette, + Terminal, + Server, + ArrowRight, + BookOpen, + Code, + ExternalLink +} from 'lucide-react' -function FeatureCard({ title, description, href, icon }: { +interface QuickLinkProps { title: string description: string href: string - icon: React.ReactNode -}) { + icon: React.ReactNode + time?: string +} + +function QuickLink({ title, description, href, icon, time }: QuickLinkProps) { return ( -
-
+
+
{icon}
-
-

{title}

-

{description}

-
+ {time && ( + {time} + )}
+

+ {title} +

+

{description}

+ + Learn more + + + + ) +} + +interface FeatureCardProps { + title: string + description: string + href: string + icon: React.ReactNode +} + +function FeatureCard({ title, description, href, icon }: FeatureCardProps) { + return ( + +
+ {icon} +
+
+

+ {title} +

+

{description}

+
+ ) } export function DocsHomePage() { return ( - -
- {/* Header */} + +
+ {/* Hero */}
-

OpenCodeIntel Documentation

-

+

+ + Documentation +
+

+ OpenCodeIntel Docs +

+

Give your AI assistant deep understanding of your codebase. Semantic search, - dependency analysis, and impact prediction - all through MCP. + dependency analysis, and impact prediction. Set up in 5 minutes.

- {/* Quick Start */} -
-

Get Started

-

- New to OpenCodeIntel? Start here. Most developers are up and running in under 5 minutes. -

- -
- +

+ Get Started +

+
+ } + time="5 min" + /> + - - - } + icon={} + time="5 min" /> - - - - } + } + time="15 min" />
- {/* Core Features */} -
-

Core Features

-

- What OpenCodeIntel actually does for you. -

- -
+ {/* Features */} +
+

+ Core Features +

+
- - - } + icon={} /> - - - } + icon={} /> - - - } + icon={} /> - - - } + icon={} />
{/* Why OpenCodeIntel */} -
-

Why OpenCodeIntel?

-
-

- The problem: AI coding assistants are powerful, - but they're flying blind. They can't search your actual codebase, don't understand - your architecture, and have no clue what breaks when you change something. -

-

- The solution: OpenCodeIntel is an MCP server that - gives AI assistants persistent memory of your codebase. Not just file contents - - semantic understanding, dependency graphs, and impact analysis. -

-

- The result: Claude that actually knows your code. - Ask "where's the auth middleware?" and get real answers, not guesses. -

+
+
+

Why OpenCodeIntel?

+
+

+ The problem: AI coding assistants are powerful, + but they are flying blind. They cannot search your actual codebase, do not understand + your architecture, and have no clue what breaks when you change something. +

+

+ The solution: OpenCodeIntel is an MCP server that + gives AI assistants persistent memory of your codebase. Not just file contents but + semantic understanding, dependency graphs, and impact analysis. +

+

+ The result: Claude that actually knows your code. + Ask "where is the auth middleware?" and get real answers, not guesses. +

+
+
+
+ + {/* API Reference */} +
+

+ API Reference +

+
+ +
+ +
+
+

REST API

+

Full API reference with examples

+
+ + +
+ +
+
+

MCP Tools

+

Tools available to AI assistants

+
+
{/* Resources */}
-

Resources

-
diff --git a/frontend/src/pages/MCPSetupPage.tsx b/frontend/src/pages/MCPSetupPage.tsx index 316075f..6e67e93 100644 --- a/frontend/src/pages/MCPSetupPage.tsx +++ b/frontend/src/pages/MCPSetupPage.tsx @@ -1,204 +1,161 @@ -import { DocsLayout } from '../components/docs/DocsLayout' - -// Code block component with copy button -function CodeBlock({ children, language = 'bash' }: { children: string; language?: string }) { - const copyToClipboard = () => { - navigator.clipboard.writeText(children) - } - - return ( -
-
-        
-          {children}
-        
-      
- -
- ) -} - -// Callout component for tips and warnings -function Callout({ type = 'info', children }: { type?: 'info' | 'warning' | 'tip'; children: React.ReactNode }) { - const styles = { - info: 'bg-blue-500/10 border-blue-500/30 text-blue-200', - warning: 'bg-yellow-500/10 border-yellow-500/30 text-yellow-200', - tip: 'bg-green-500/10 border-green-500/30 text-green-200', - } - - const icons = { - info: 'ℹ️', - warning: '⚠️', - tip: '💡', - } - - return ( -
- {icons[type]} - {children} -
- ) -} +import { + DocsLayout, + DocsCodeBlock, + DocsCodeTabs, + DocsCallout, + DocsPrerequisites, + DocsLearningObjectives, + DocsPagination, + TimeEstimate, + Step, + StepList, + TOCItem +} from '@/components/docs' +import { Terminal } from 'lucide-react' + +const tocItems: TOCItem[] = [ + { id: 'what-is-mcp', title: 'What is MCP?', level: 2 }, + { id: 'prerequisites', title: 'Prerequisites', level: 2 }, + { id: 'setup-steps', title: 'Setup Steps', level: 2 }, + { id: 'available-tools', title: 'Available Tools', level: 2 }, + { id: 'example-prompts', title: 'Example Prompts', level: 2 }, + { id: 'troubleshooting', title: 'Troubleshooting', level: 2 }, +] export function MCPSetupPage() { return ( - -
- {/* Header */} -
-
- - - - MCP Integration + + {/* Header */} +
+
+
+
-

MCP Setup Guide

-

- Connect OpenCodeIntel to Claude Desktop in under 5 minutes. Give your AI assistant - persistent memory of your entire codebase. -

+ MCP Integration +
- - {/* The Problem */} -
-

- Most AI coding assistants forget your codebase the moment you close the chat. - You explain your auth flow, close the window, come back tomorrow - and Claude - has no idea what you're talking about. -

-

- OpenCodeIntel fixes this. It's an MCP server that gives Claude (or any MCP-compatible AI) - persistent access to your codebase - semantic search, dependency graphs, impact analysis, - the works. -

-
- - {/* What is MCP */} -
-

What is MCP?

-

- MCP (Model Context Protocol) is Anthropic's open standard for connecting AI assistants - to external tools and data sources. Think of it as USB for AI - a universal way to - plug in capabilities. -

-

- Instead of copy-pasting code into Claude, MCP lets Claude directly search your codebase, - analyze dependencies, and understand impact of changes. The result? Claude that actually knows your code. -

-
- - {/* Prerequisites */} -
-

Prerequisites

-

Before you start, make sure you have:

-
    -
  • - - Claude Desktop installed (download here) -
  • -
  • - - OpenCodeIntel backend running (local or hosted) -
  • -
  • - - Python 3.11+ for the MCP server -
  • -
  • - - 5 minutes of your time -
  • -
-
- - {/* Setup Steps */} -
-

Setup Steps

- - {/* Step 1 */} -
-

- 1 - Clone the MCP Server -

-

If you haven't already, grab the OpenCodeIntel repo:

- {`git clone https://github.com/OpenCodeIntel/opencodeintel.git -cd opencodeintel/mcp-server`} -
- - {/* Step 2 */} -
-

- 2 - Install Dependencies -

- {`pip install -r requirements.txt`} -

That's it. No virtual environment drama for a simple MCP server.

-
- - {/* Step 3 */} -
-

- 3 - Configure Environment -

-

Create your .env file:

- {`cp .env.example .env`} -

Edit .env with your settings:

- {`# Where's your OpenCodeIntel backend running? +

MCP Setup Guide

+

+ Connect OpenCodeIntel to Claude Desktop in under 5 minutes. Give your AI assistant + persistent memory of your entire codebase. +

+
+ + + + {/* Intro */} +

+ Most AI coding assistants forget your codebase the moment you close the chat. + You explain your auth flow, close the window, come back tomorrow, and Claude + has no idea what you were talking about. +

+

+ OpenCodeIntel fixes this. It is an MCP server that gives Claude (or any MCP-compatible AI) + persistent access to your codebase: semantic search, dependency graphs, impact analysis, + the works. +

+ + {/* What is MCP */} +

What is MCP?

+

+ MCP (Model Context Protocol) is Anthropic's open standard for connecting AI assistants + to external tools and data sources. Think of it as USB for AI: a universal way to + plug in capabilities. +

+

+ Instead of copy-pasting code into Claude, MCP lets Claude directly search your codebase, + analyze dependencies, and understand impact of changes. + The result? Claude that actually knows your code. +

+ + {/* Prerequisites */} +

Prerequisites

+ + + {/* Setup Steps */} +

Setup Steps

+ + + +

If you have not already, grab the OpenCodeIntel repo:

+ +{`git clone https://github.com/OpenCodeIntel/opencodeintel.git +cd opencodeintel/mcp-server`} + +
+ + +

Install the required Python packages:

+ +{`pip install -r requirements.txt`} + + + No virtual environment drama needed for a simple MCP server. Just install and go. + +
+ + +

Create your .env file:

+ +{`cp .env.example .env`} + +

Edit .env with your settings:

+ +{`# Where is your CodeIntel backend running? BACKEND_API_URL=http://localhost:8000 -# Your API key (get this from the OpenCodeIntel dashboard) -API_KEY=your-api-key-here`} - - Using hosted OpenCodeIntel? Replace localhost:8000 with your hosted URL. - +# Your API key (get this from the CodeIntel dashboard) +API_KEY=your-api-key-here`} + + + Using hosted OpenCodeIntel? Replace localhost:8000 with your hosted URL. + +
+ + +

This is where the magic happens. You need to tell Claude Desktop about the MCP server.

+

Find your config file:

+ +
+ + + + + + + + + + + + + + + + + + + + + +
OSConfig Location
macOS~/Library/Application Support/Claude/claude_desktop_config.json
Windows%APPDATA%\Claude\claude_desktop_config.json
Linux~/.config/Claude/claude_desktop_config.json
- {/* Step 4 */} -
-

- 4 - Configure Claude Desktop -

-

This is where the magic happens. You need to tell Claude Desktop about the MCP server.

- -

Find your config file:

-
- - - - - - - - - - - - - - - - - - - - - -
OSConfig Location
macOS~/Library/Application Support/Claude/claude_desktop_config.json
Windows%APPDATA%\Claude\claude_desktop_config.json
Linux~/.config/Claude/claude_desktop_config.json
-
- -

Add OpenCodeIntel to your config:

- {`{ +

Add OpenCodeIntel to your config:

+ +{`{ "mcpServers": { "codeintel": { "command": "python", @@ -209,211 +166,197 @@ API_KEY=your-api-key-here`}
} } } -}`} - - Important: Use the absolute path to server.py. Relative paths won't work. - - -

Example for macOS:

- {`{ - "mcpServers": { - "codeintel": { - "command": "python3", - "args": ["/Users/yourname/projects/opencodeintel/mcp-server/server.py"], - "env": { - "BACKEND_API_URL": "http://localhost:8000", - "API_KEY": "dev-secret-key" - } - } - } -}`} -
- - {/* Step 5 */} -
-

- 5 - Restart Claude Desktop -

-

- Completely quit Claude Desktop (not just close the window) and reopen it. -

-

- You should see a 🔧 icon in the chat input - that means MCP tools are available. -

-
-
- - {/* Available Tools */} -
-

Available Tools

-

Once connected, Claude has access to these tools:

- -
- {/* search_code */} -
-

search_code

-

Semantic search across your codebase. Finds code by meaning, not just keywords.

-
-

"Find authentication middleware"

-

"Show me error handling patterns"

-

"Where's the database connection logic?"

-
-
- - {/* list_repositories */} -
-

list_repositories

-

See all indexed repositories.

-
-

"What repos do you have access to?"

-

"List my codebases"

-
-
- - {/* get_dependency_graph */} -
-

get_dependency_graph

-

Understand how files connect. See which files are critical vs isolated.

-
-

"Show me the dependency graph for this repo"

-

"What files does auth.py depend on?"

-
-
- - {/* analyze_code_style */} -
-

analyze_code_style

-

Team patterns: naming conventions, async usage, type hints, common imports.

-
-

"What coding conventions does this repo use?"

-

"Is this team using snake_case or camelCase?"

-
-
- - {/* analyze_impact */} -
-

analyze_impact

-

Before you change a file, know what breaks. Shows dependents, impact, and related tests.

-
-

"What happens if I modify src/auth/middleware.py?"

-

"What's the blast radius of changing this file?"

-
-
- - {/* get_repository_insights */} -
-

get_repository_insights

-

High-level overview: file count, critical files, architecture patterns.

-
-

"Give me an overview of this codebase"

-

"What are the most important files here?"

-
-
-
-
- - {/* Example Prompts */} -
-

Example Prompts

-

Here's how to actually use OpenCodeIntel with Claude:

- -
-
-

Understanding new code:

-

"I just joined this project. Search for the main entry points and explain the architecture."

-
- -
-

Before refactoring:

-

"I want to refactor UserService. What's the impact? What tests cover it?"

-
- -
-

Finding patterns:

-

"How does this codebase handle errors? Find examples of error handling."

-
- -
-

Code review prep:

-

"Search for all usages of the deprecated oldAuth() function."

-
- -
-

Matching team style:

-

"Analyze the code style. I want to write a new module that fits in."

-
-
-
- - {/* Troubleshooting */} -
-

Troubleshooting

- -
-
-

Claude doesn't show the 🔧 icon

-
    -
  • • Check the config path - Make sure you're editing the right config file
  • -
  • • Validate JSON - A single missing comma breaks everything
  • -
  • • Use absolute paths - Relative paths don't work
  • -
  • • Restart fully - Quit Claude Desktop completely, not just close window
  • -
-
- -
-

"Connection refused" errors

-

Your OpenCodeIntel backend isn't running. Start it:

- {`cd opencodeintel/backend -python main.py`} -
- -
-

"Unauthorized" errors

-

- Check your API_KEY in both - the .env file and Claude Desktop config. - They need to match what your backend expects. -

-
- -
-

Tools work but return no results

-

- You probably haven't indexed any repositories yet. Open the OpenCodeIntel dashboard and add a repo first. -

-
+}`} + + + + Use the absolute path to server.py. Relative paths will not work. + + + + +

+ Completely quit Claude Desktop (not just close the window) and reopen it. +

+

+ You should see a 🔧 icon in the chat input. That means MCP tools are available. +

+ + Claude now has access to your codebase through OpenCodeIntel. + +
+ + + {/* Available Tools */} +

Available Tools

+

Once connected, Claude has access to these tools:

+ +
+ + + + + + +
+ + {/* Example Prompts */} +

Example Prompts

+

Here is how to actually use OpenCodeIntel with Claude:

+ +
+ + + + + +
+ + {/* Troubleshooting */} +

Troubleshooting

+ +
+ + + + + +
+ + {/* Pagination */} + + + ) +} -
-

Python command not found

-

On macOS, you might need python3 instead of python:

- {`{ - "command": "python3", - "args": ["/path/to/server.py"] -}`} -
-
-
+// Helper components +function ToolCard({ name, description, examples }: { name: string; description: string; examples: string[] }) { + return ( +
+

{name}

+

{description}

+
+ {examples.map((example, i) => ( +

"{example}"

+ ))} +
+
+ ) +} - {/* What's Next */} -
-

What's Next?

-

Once you're set up:

-
    -
  1. 1. Index a repository through the OpenCodeIntel dashboard
  2. -
  3. 2. Start chatting with Claude about your code
  4. -
  5. 3. Try impact analysis before your next refactor
  6. -
-

- Questions? Issues? Open a GitHub issue or reach out. -

-
+function PromptExample({ title, prompt }: { title: string; prompt: string }) { + return ( +
+

{title}:

+

"{prompt}"

+
+ ) +} - {/* Footer */} -
- Built because AI assistants shouldn't have amnesia about your code. -
-
-
+function TroubleshootItem({ problem, solutions }: { problem: string; solutions: string[] }) { + return ( +
+

{problem}

+
    + {solutions.map((solution, i) => ( +
  • + + {solution} +
  • + ))} +
+
) } From 047c02dc4294e4a2979de1d6e985c0c2340d86ad Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 16:51:31 -0500 Subject: [PATCH 02/33] fix(docs): remove AI-looking documentation badge from hero --- frontend/bun.lock | 785 ++++++++++++++++++++++++++++ frontend/src/pages/DocsHomePage.tsx | 4 - 2 files changed, 785 insertions(+), 4 deletions(-) create mode 100644 frontend/bun.lock diff --git a/frontend/bun.lock b/frontend/bun.lock new file mode 100644 index 0000000..82a3651 --- /dev/null +++ b/frontend/bun.lock @@ -0,0 +1,785 @@ +{ + "lockfileVersion": 1, + "configVersion": 0, + "workspaces": { + "": { + "name": "codeintel-frontend", + "dependencies": { + "@radix-ui/react-accordion": "^1.2.12", + "@radix-ui/react-avatar": "^1.1.11", + "@radix-ui/react-collapsible": "^1.1.12", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-label": "^2.1.8", + "@radix-ui/react-navigation-menu": "^1.2.14", + "@radix-ui/react-progress": "^1.1.8", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-separator": "^1.1.8", + "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-switch": "^1.2.6", + "@radix-ui/react-tabs": "^1.1.13", + "@radix-ui/react-tooltip": "^1.2.8", + "@supabase/supabase-js": "^2.39.0", + "@tanstack/react-query": "^5.90.12", + "@types/dagre": "^0.7.53", + "@types/react-syntax-highlighter": "^15.5.13", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "dagre": "^0.8.5", + "framer-motion": "^12.29.0", + "lucide-react": "^0.554.0", + "next-themes": "^0.4.6", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^7.12.0", + "react-syntax-highlighter": "^16.1.0", + "reactflow": "^11.11.4", + "sonner": "^2.0.7", + "tailwind-merge": "^3.4.0", + "tailwindcss-animate": "^1.0.7", + }, + "devDependencies": { + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@vitejs/plugin-react": "^4.7.0", + "autoprefixer": "^10.4.16", + "postcss": "^8.4.32", + "tailwindcss": "^3.4.0", + "typescript": "^5.9.3", + "vite": "^6.4.1", + }, + }, + }, + "packages": { + "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], + + "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], + + "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="], + + "@babel/core": ["@babel/core@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA=="], + + "@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helpers": ["@babel/helpers@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw=="], + + "@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" } }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="], + + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], + + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], + + "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="], + + "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], + + "@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="], + + "@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + + "@floating-ui/core": ["@floating-ui/core@1.7.4", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.7.5", "", { "dependencies": { "@floating-ui/core": "^1.7.4", "@floating-ui/utils": "^0.2.10" } }, "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg=="], + + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.7", "", { "dependencies": { "@floating-ui/dom": "^1.7.5" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], + + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="], + + "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA=="], + + "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w=="], + + "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.11", "", { "dependencies": { "@radix-ui/react-context": "1.1.3", "@radix-ui/react-primitive": "2.1.4", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q=="], + + "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA=="], + + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="], + + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], + + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], + + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw=="], + + "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], + + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg=="], + + "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw=="], + + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw=="], + + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="], + + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="], + + "@radix-ui/react-label": ["@radix-ui/react-label@2.1.8", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A=="], + + "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg=="], + + "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w=="], + + "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.8", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw=="], + + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.9", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ=="], + + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.5", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ=="], + + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + + "@radix-ui/react-progress": ["@radix-ui/react-progress@1.1.8", "", { "dependencies": { "@radix-ui/react-context": "1.1.3", "@radix-ui/react-primitive": "2.1.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA=="], + + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA=="], + + "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.10", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A=="], + + "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.8", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g=="], + + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA=="], + + "@radix-ui/react-switch": ["@radix-ui/react-switch@1.2.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ=="], + + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A=="], + + "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg=="], + + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], + + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="], + + "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="], + + "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="], + + "@radix-ui/react-use-is-hydrated": ["@radix-ui/react-use-is-hydrated@0.1.0", "", { "dependencies": { "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA=="], + + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], + + "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ=="], + + "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.1", "", { "dependencies": { "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w=="], + + "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="], + + "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug=="], + + "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], + + "@reactflow/background": ["@reactflow/background@11.3.14", "", { "dependencies": { "@reactflow/core": "11.11.4", "classcat": "^5.0.3", "zustand": "^4.4.1" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" } }, "sha512-Gewd7blEVT5Lh6jqrvOgd4G6Qk17eGKQfsDXgyRSqM+CTwDqRldG2LsWN4sNeno6sbqVIC2fZ+rAUBFA9ZEUDA=="], + + "@reactflow/controls": ["@reactflow/controls@11.2.14", "", { "dependencies": { "@reactflow/core": "11.11.4", "classcat": "^5.0.3", "zustand": "^4.4.1" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" } }, "sha512-MiJp5VldFD7FrqaBNIrQ85dxChrG6ivuZ+dcFhPQUwOK3HfYgX2RHdBua+gx+40p5Vw5It3dVNp/my4Z3jF0dw=="], + + "@reactflow/core": ["@reactflow/core@11.11.4", "", { "dependencies": { "@types/d3": "^7.4.0", "@types/d3-drag": "^3.0.1", "@types/d3-selection": "^3.0.3", "@types/d3-zoom": "^3.0.1", "classcat": "^5.0.3", "d3-drag": "^3.0.0", "d3-selection": "^3.0.0", "d3-zoom": "^3.0.0", "zustand": "^4.4.1" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" } }, "sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q=="], + + "@reactflow/minimap": ["@reactflow/minimap@11.7.14", "", { "dependencies": { "@reactflow/core": "11.11.4", "@types/d3-selection": "^3.0.3", "@types/d3-zoom": "^3.0.1", "classcat": "^5.0.3", "d3-selection": "^3.0.0", "d3-zoom": "^3.0.0", "zustand": "^4.4.1" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" } }, "sha512-mpwLKKrEAofgFJdkhwR5UQ1JYWlcAAL/ZU/bctBkuNTT1yqV+y0buoNVImsRehVYhJwffSWeSHaBR5/GJjlCSQ=="], + + "@reactflow/node-resizer": ["@reactflow/node-resizer@2.2.14", "", { "dependencies": { "@reactflow/core": "11.11.4", "classcat": "^5.0.4", "d3-drag": "^3.0.0", "d3-selection": "^3.0.0", "zustand": "^4.4.1" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" } }, "sha512-fwqnks83jUlYr6OHcdFEedumWKChTHRGw/kbCxj0oqBd+ekfs+SIp4ddyNU0pdx96JIm5iNFS0oNrmEiJbbSaA=="], + + "@reactflow/node-toolbar": ["@reactflow/node-toolbar@1.3.14", "", { "dependencies": { "@reactflow/core": "11.11.4", "classcat": "^5.0.3", "zustand": "^4.4.1" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" } }, "sha512-rbynXQnH/xFNu4P9H+hVqlEUafDCkEoCy0Dg9mG22Sg+rY/0ck6KkrAQrYrTgXusd+cEJOMK0uOOFCK2/5rSGQ=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.57.1", "", { "os": "android", "cpu": "arm" }, "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.57.1", "", { "os": "android", "cpu": "arm64" }, "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.57.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.57.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.57.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.57.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.57.1", "", { "os": "linux", "cpu": "arm" }, "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.57.1", "", { "os": "linux", "cpu": "arm" }, "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.57.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.57.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q=="], + + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.57.1", "", { "os": "linux", "cpu": "none" }, "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA=="], + + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.57.1", "", { "os": "linux", "cpu": "none" }, "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.57.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w=="], + + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.57.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.57.1", "", { "os": "linux", "cpu": "none" }, "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.57.1", "", { "os": "linux", "cpu": "none" }, "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.57.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.57.1", "", { "os": "linux", "cpu": "x64" }, "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.57.1", "", { "os": "linux", "cpu": "x64" }, "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw=="], + + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.57.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.57.1", "", { "os": "none", "cpu": "arm64" }, "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.57.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.57.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.57.1", "", { "os": "win32", "cpu": "x64" }, "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.57.1", "", { "os": "win32", "cpu": "x64" }, "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA=="], + + "@supabase/auth-js": ["@supabase/auth-js@2.95.3", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-vD2YoS8E2iKIX0F7EwXTmqhUpaNsmbU6X2R0/NdFcs02oEfnHyNP/3M716f3wVJ2E5XHGiTFXki6lRckhJ0Thg=="], + + "@supabase/functions-js": ["@supabase/functions-js@2.95.3", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-uTuOAKzs9R/IovW1krO0ZbUHSJnsnyJElTXIRhjJTqymIVGcHzkAYnBCJqd7468Fs/Foz1BQ7Dv6DCl05lr7ig=="], + + "@supabase/postgrest-js": ["@supabase/postgrest-js@2.95.3", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-LTrRBqU1gOovxRm1vRXPItSMPBmEFqrfTqdPTRtzOILV4jPSueFz6pES5hpb4LRlkFwCPRmv3nQJ5N625V2Xrg=="], + + "@supabase/realtime-js": ["@supabase/realtime-js@2.95.3", "", { "dependencies": { "@types/phoenix": "^1.6.6", "@types/ws": "^8.18.1", "tslib": "2.8.1", "ws": "^8.18.2" } }, "sha512-D7EAtfU3w6BEUxDACjowWNJo/ZRo7sDIuhuOGKHIm9FHieGeoJV5R6GKTLtga/5l/6fDr2u+WcW/m8I9SYmaIw=="], + + "@supabase/storage-js": ["@supabase/storage-js@2.95.3", "", { "dependencies": { "iceberg-js": "^0.8.1", "tslib": "2.8.1" } }, "sha512-4GxkJiXI3HHWjxpC3sDx1BVrV87O0hfX+wvJdqGv67KeCu+g44SPnII8y0LL/Wr677jB7tpjAxKdtVWf+xhc9A=="], + + "@supabase/supabase-js": ["@supabase/supabase-js@2.95.3", "", { "dependencies": { "@supabase/auth-js": "2.95.3", "@supabase/functions-js": "2.95.3", "@supabase/postgrest-js": "2.95.3", "@supabase/realtime-js": "2.95.3", "@supabase/storage-js": "2.95.3" } }, "sha512-Fukw1cUTQ6xdLiHDJhKKPu6svEPaCEDvThqCne3OaQyZvuq2qjhJAd91kJu3PXLG18aooCgYBaB6qQz35hhABg=="], + + "@tanstack/query-core": ["@tanstack/query-core@5.90.20", "", {}, "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg=="], + + "@tanstack/react-query": ["@tanstack/react-query@5.90.21", "", { "dependencies": { "@tanstack/query-core": "5.90.20" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg=="], + + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], + + "@types/d3": ["@types/d3@7.4.3", "", { "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", "@types/d3-brush": "*", "@types/d3-chord": "*", "@types/d3-color": "*", "@types/d3-contour": "*", "@types/d3-delaunay": "*", "@types/d3-dispatch": "*", "@types/d3-drag": "*", "@types/d3-dsv": "*", "@types/d3-ease": "*", "@types/d3-fetch": "*", "@types/d3-force": "*", "@types/d3-format": "*", "@types/d3-geo": "*", "@types/d3-hierarchy": "*", "@types/d3-interpolate": "*", "@types/d3-path": "*", "@types/d3-polygon": "*", "@types/d3-quadtree": "*", "@types/d3-random": "*", "@types/d3-scale": "*", "@types/d3-scale-chromatic": "*", "@types/d3-selection": "*", "@types/d3-shape": "*", "@types/d3-time": "*", "@types/d3-time-format": "*", "@types/d3-timer": "*", "@types/d3-transition": "*", "@types/d3-zoom": "*" } }, "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww=="], + + "@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="], + + "@types/d3-axis": ["@types/d3-axis@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw=="], + + "@types/d3-brush": ["@types/d3-brush@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A=="], + + "@types/d3-chord": ["@types/d3-chord@3.0.6", "", {}, "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg=="], + + "@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="], + + "@types/d3-contour": ["@types/d3-contour@3.0.6", "", { "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" } }, "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg=="], + + "@types/d3-delaunay": ["@types/d3-delaunay@6.0.4", "", {}, "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw=="], + + "@types/d3-dispatch": ["@types/d3-dispatch@3.0.7", "", {}, "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA=="], + + "@types/d3-drag": ["@types/d3-drag@3.0.7", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ=="], + + "@types/d3-dsv": ["@types/d3-dsv@3.0.7", "", {}, "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g=="], + + "@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="], + + "@types/d3-fetch": ["@types/d3-fetch@3.0.7", "", { "dependencies": { "@types/d3-dsv": "*" } }, "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA=="], + + "@types/d3-force": ["@types/d3-force@3.0.10", "", {}, "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw=="], + + "@types/d3-format": ["@types/d3-format@3.0.4", "", {}, "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g=="], + + "@types/d3-geo": ["@types/d3-geo@3.1.0", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ=="], + + "@types/d3-hierarchy": ["@types/d3-hierarchy@3.1.7", "", {}, "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg=="], + + "@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="], + + "@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="], + + "@types/d3-polygon": ["@types/d3-polygon@3.0.2", "", {}, "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA=="], + + "@types/d3-quadtree": ["@types/d3-quadtree@3.0.6", "", {}, "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg=="], + + "@types/d3-random": ["@types/d3-random@3.0.3", "", {}, "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ=="], + + "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="], + + "@types/d3-scale-chromatic": ["@types/d3-scale-chromatic@3.1.0", "", {}, "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ=="], + + "@types/d3-selection": ["@types/d3-selection@3.0.11", "", {}, "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w=="], + + "@types/d3-shape": ["@types/d3-shape@3.1.8", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w=="], + + "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="], + + "@types/d3-time-format": ["@types/d3-time-format@4.0.3", "", {}, "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg=="], + + "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="], + + "@types/d3-transition": ["@types/d3-transition@3.0.9", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg=="], + + "@types/d3-zoom": ["@types/d3-zoom@3.0.8", "", { "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" } }, "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw=="], + + "@types/dagre": ["@types/dagre@0.7.53", "", {}, "sha512-f4gkWqzPZvYmKhOsDnhq/R8mO4UMcKdxZo+i5SCkOU1wvGeHJeUXGIHeE9pnwGyPMDof1Vx5ZQo4nxpeg2TTVQ=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="], + + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + + "@types/node": ["@types/node@25.2.3", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ=="], + + "@types/phoenix": ["@types/phoenix@1.6.7", "", {}, "sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q=="], + + "@types/prismjs": ["@types/prismjs@1.26.6", "", {}, "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw=="], + + "@types/prop-types": ["@types/prop-types@15.7.15", "", {}, "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw=="], + + "@types/react": ["@types/react@18.3.28", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" } }, "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw=="], + + "@types/react-dom": ["@types/react-dom@18.3.7", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ=="], + + "@types/react-syntax-highlighter": ["@types/react-syntax-highlighter@15.5.13", "", { "dependencies": { "@types/react": "*" } }, "sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], + + "@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="], + + "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], + + "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], + + "autoprefixer": ["autoprefixer@10.4.24", "", { "dependencies": { "browserslist": "^4.28.1", "caniuse-lite": "^1.0.30001766", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": "bin/autoprefixer" }, "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw=="], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.9.19", "", { "bin": "dist/cli.js" }, "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": "cli.js" }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], + + "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001769", "", {}, "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg=="], + + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], + + "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], + + "classcat": ["classcat@5.0.5", "", {}, "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "cmdk": ["cmdk@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "^1.1.1", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-id": "^1.1.0", "@radix-ui/react-primitive": "^2.0.2" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": "bin/cssesc" }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="], + + "d3-dispatch": ["d3-dispatch@3.0.1", "", {}, "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="], + + "d3-drag": ["d3-drag@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" } }, "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg=="], + + "d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="], + + "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="], + + "d3-selection": ["d3-selection@3.0.0", "", {}, "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="], + + "d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="], + + "d3-transition": ["d3-transition@3.0.1", "", { "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", "d3-ease": "1 - 3", "d3-interpolate": "1 - 3", "d3-timer": "1 - 3" }, "peerDependencies": { "d3-selection": "2 - 3" } }, "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w=="], + + "d3-zoom": ["d3-zoom@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "2 - 3", "d3-transition": "2 - 3" } }, "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw=="], + + "dagre": ["dagre@0.8.5", "", { "dependencies": { "graphlib": "^2.1.8", "lodash": "^4.17.15" } }, "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], + + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], + + "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], + + "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.286", "", {}, "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A=="], + + "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": "bin/esbuild" }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], + + "fault": ["fault@1.0.4", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "format": ["format@0.2.2", "", {}, "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="], + + "fraction.js": ["fraction.js@5.3.4", "", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="], + + "framer-motion": ["framer-motion@12.34.0", "", { "dependencies": { "motion-dom": "^12.34.0", "motion-utils": "^12.29.2", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid"] }, "sha512-+/H49owhzkzQyxtn7nZeF4kdH++I2FWrESQ184Zbcw5cEqNHYkE5yxWxcTLSj5lNx3NWdbIRy5FHqUvetD8FWg=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "graphlib": ["graphlib@2.1.8", "", { "dependencies": { "lodash": "^4.17.15" } }, "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], + + "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], + + "highlight.js": ["highlight.js@10.7.3", "", {}, "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="], + + "highlightjs-vue": ["highlightjs-vue@1.0.0", "", {}, "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA=="], + + "iceberg-js": ["iceberg-js@0.8.1", "", {}, "sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA=="], + + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], + + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "jiti": ["jiti@1.21.7", "", { "bin": "bin/jiti.js" }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": "bin/jsesc" }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json5": ["json5@2.2.3", "", { "bin": "lib/cli.js" }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": "cli.js" }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lowlight": ["lowlight@1.20.0", "", { "dependencies": { "fault": "^1.0.0", "highlight.js": "~10.7.0" } }, "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "lucide-react": ["lucide-react@0.554.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-St+z29uthEJVx0Is7ellNkgTEhaeSoA42I7JjOCBCrc5X6LYMGSv0P/2uS5HDLTExP5tpiqRD2PyUEOS6s9UXA=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "motion-dom": ["motion-dom@12.34.0", "", { "dependencies": { "motion-utils": "^12.29.2" } }, "sha512-Lql3NuEcScRDxTAO6GgUsRHBZOWI/3fnMlkMcH5NftzcN37zJta+bpbMAV9px4Nj057TuvRooMK7QrzMCgtz6Q=="], + + "motion-utils": ["motion-utils@12.29.2", "", {}, "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": "bin/nanoid.cjs" }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], + + "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], + + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], + + "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], + + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="], + + "postcss-js": ["postcss-js@4.1.0", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw=="], + + "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="], + + "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="], + + "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + + "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], + + "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="], + + "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], + + "react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], + + "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], + + "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], + + "react-router": ["react-router@7.13.0", "", { "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-PZgus8ETambRT17BUm/LL8lX3Of+oiLaPuVTRH3l1eLvSPpKO3AvhAEb5N7ihAFZQrYDqkvvWfFh9p0z9VsjLw=="], + + "react-router-dom": ["react-router-dom@7.13.0", "", { "dependencies": { "react-router": "7.13.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-5CO/l5Yahi2SKC6rGZ+HDEjpjkGaG/ncEP7eWFTvFxbHP8yeeI0PxTDjimtpXYlR3b3i9/WIL4VJttPrESIf2g=="], + + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], + + "react-syntax-highlighter": ["react-syntax-highlighter@16.1.0", "", { "dependencies": { "@babel/runtime": "^7.28.4", "highlight.js": "^10.4.1", "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", "prismjs": "^1.30.0", "refractor": "^5.0.0" }, "peerDependencies": { "react": ">= 0.14.0" } }, "sha512-E40/hBiP5rCNwkeBN1vRP+xow1X0pndinO+z3h7HLsHyjztbyjfzNWNKuAsJj+7DLam9iT4AaaOZnueCU+Nplg=="], + + "reactflow": ["reactflow@11.11.4", "", { "dependencies": { "@reactflow/background": "11.3.14", "@reactflow/controls": "11.2.14", "@reactflow/core": "11.11.4", "@reactflow/minimap": "11.7.14", "@reactflow/node-resizer": "2.2.14", "@reactflow/node-toolbar": "1.3.14" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" } }, "sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og=="], + + "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], + + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "refractor": ["refractor@5.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/prismjs": "^1.0.0", "hastscript": "^9.0.0", "parse-entities": "^4.0.0" } }, "sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw=="], + + "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": "bin/resolve" }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rollup": ["rollup@4.57.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.57.1", "@rollup/rollup-android-arm64": "4.57.1", "@rollup/rollup-darwin-arm64": "4.57.1", "@rollup/rollup-darwin-x64": "4.57.1", "@rollup/rollup-freebsd-arm64": "4.57.1", "@rollup/rollup-freebsd-x64": "4.57.1", "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", "@rollup/rollup-linux-arm-musleabihf": "4.57.1", "@rollup/rollup-linux-arm64-gnu": "4.57.1", "@rollup/rollup-linux-arm64-musl": "4.57.1", "@rollup/rollup-linux-loong64-gnu": "4.57.1", "@rollup/rollup-linux-loong64-musl": "4.57.1", "@rollup/rollup-linux-ppc64-gnu": "4.57.1", "@rollup/rollup-linux-ppc64-musl": "4.57.1", "@rollup/rollup-linux-riscv64-gnu": "4.57.1", "@rollup/rollup-linux-riscv64-musl": "4.57.1", "@rollup/rollup-linux-s390x-gnu": "4.57.1", "@rollup/rollup-linux-x64-gnu": "4.57.1", "@rollup/rollup-linux-x64-musl": "4.57.1", "@rollup/rollup-openbsd-x64": "4.57.1", "@rollup/rollup-openharmony-arm64": "4.57.1", "@rollup/rollup-win32-arm64-msvc": "4.57.1", "@rollup/rollup-win32-ia32-msvc": "4.57.1", "@rollup/rollup-win32-x64-gnu": "4.57.1", "@rollup/rollup-win32-x64-msvc": "4.57.1", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "set-cookie-parser": ["set-cookie-parser@2.7.2", "", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="], + + "sonner": ["sonner@2.0.7", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "tailwind-merge": ["tailwind-merge@3.4.0", "", {}, "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g=="], + + "tailwindcss": ["tailwindcss@3.4.19", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ=="], + + "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="], + + "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], + + "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], + + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": "cli.js" }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], + + "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": "bin/vite.js" }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], + + "ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "zustand": ["zustand@4.5.7", "", { "dependencies": { "use-sync-external-store": "^1.2.2" }, "peerDependencies": { "@types/react": ">=16.8", "immer": ">=9.0.6", "react": ">=16.8" }, "optionalPeers": ["immer"] }, "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw=="], + + "@radix-ui/react-avatar/@radix-ui/react-context": ["@radix-ui/react-context@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw=="], + + "@radix-ui/react-avatar/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.4", "", { "dependencies": { "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg=="], + + "@radix-ui/react-collection/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-dialog/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-label/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.4", "", { "dependencies": { "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg=="], + + "@radix-ui/react-menu/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-progress/@radix-ui/react-context": ["@radix-ui/react-context@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw=="], + + "@radix-ui/react-progress/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.4", "", { "dependencies": { "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg=="], + + "@radix-ui/react-separator/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.4", "", { "dependencies": { "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg=="], + + "@radix-ui/react-tooltip/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "tinyglobby/fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "tinyglobby/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + } +} diff --git a/frontend/src/pages/DocsHomePage.tsx b/frontend/src/pages/DocsHomePage.tsx index 8884d55..a24065e 100644 --- a/frontend/src/pages/DocsHomePage.tsx +++ b/frontend/src/pages/DocsHomePage.tsx @@ -81,10 +81,6 @@ export function DocsHomePage() {
{/* Hero */}
-
- - Documentation -

OpenCodeIntel Docs

From 98e256fbdb1a4ad7d6d9b206d71fe0a90b632184 Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 17:00:48 -0500 Subject: [PATCH 03/33] feat(docs): Phase 2 - Add QuickStart and Features pages New pages: - QuickStartPage: Hosted, Docker, and Manual setup options - SemanticSearchPage: How semantic search works, usage, examples - DependencyAnalysisPage: Graph visualization, reading the graph - ImpactPredictionPage: Blast radius, risk levels, API response - CodeStyleAnalysisPage: Naming conventions, patterns, use cases Updated routing in App.tsx for all new pages Removed AI-looking badges from page headers --- frontend/src/App.tsx | 24 +- frontend/src/pages/MCPSetupPage.tsx | 4 - frontend/src/pages/QuickStartPage.tsx | 228 ++++++++++++++++++ .../pages/features/CodeStyleAnalysisPage.tsx | 174 +++++++++++++ .../pages/features/DependencyAnalysisPage.tsx | 176 ++++++++++++++ .../pages/features/ImpactPredictionPage.tsx | 186 ++++++++++++++ .../src/pages/features/SemanticSearchPage.tsx | 164 +++++++++++++ frontend/src/pages/features/index.ts | 4 + 8 files changed, 949 insertions(+), 11 deletions(-) create mode 100644 frontend/src/pages/QuickStartPage.tsx create mode 100644 frontend/src/pages/features/CodeStyleAnalysisPage.tsx create mode 100644 frontend/src/pages/features/DependencyAnalysisPage.tsx create mode 100644 frontend/src/pages/features/ImpactPredictionPage.tsx create mode 100644 frontend/src/pages/features/SemanticSearchPage.tsx create mode 100644 frontend/src/pages/features/index.ts diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index dc68ffe..782f0b3 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -8,6 +8,8 @@ import { LandingPage } from './pages/LandingPage'; import { Dashboard } from './components/Dashboard'; import { DocsHomePage } from './pages/DocsHomePage'; import { MCPSetupPage } from './pages/MCPSetupPage'; +import { QuickStartPage } from './pages/QuickStartPage'; +import { SemanticSearchPage, DependencyAnalysisPage, ImpactPredictionPage, CodeStyleAnalysisPage } from './pages/features'; import { GitHubCallbackPage } from './pages/GitHubCallbackPage'; function ProtectedRoute({ children }: { children: React.ReactNode }) { @@ -66,9 +68,23 @@ function AppRoutes() { {/* Documentation Routes - Public, no auth required */} } /> + } /> } /> + } /> + } /> + + {/* Feature pages */} + } /> + } /> + } /> + } /> - {/* GitHub OAuth Callback - Protected, user must be logged in */} + {/* Placeholder routes for future docs pages */} + } /> + } /> + } /> + } /> + } /> - {/* Placeholder routes for future docs pages */} - } /> - } /> - } /> - } /> - } /> {/* Fallback */} } /> diff --git a/frontend/src/pages/MCPSetupPage.tsx b/frontend/src/pages/MCPSetupPage.tsx index 6e67e93..3644ba9 100644 --- a/frontend/src/pages/MCPSetupPage.tsx +++ b/frontend/src/pages/MCPSetupPage.tsx @@ -28,10 +28,6 @@ export function MCPSetupPage() { {/* Header */}
-
- -
- MCP Integration

MCP Setup Guide

diff --git a/frontend/src/pages/QuickStartPage.tsx b/frontend/src/pages/QuickStartPage.tsx new file mode 100644 index 0000000..c46dcbf --- /dev/null +++ b/frontend/src/pages/QuickStartPage.tsx @@ -0,0 +1,228 @@ +import { + DocsLayout, + DocsCodeBlock, + DocsCallout, + DocsPrerequisites, + DocsLearningObjectives, + DocsPagination, + TimeEstimate, + Step, + StepList, + TOCItem +} from '@/components/docs' +import { Zap } from 'lucide-react' + +const tocItems: TOCItem[] = [ + { id: 'hosted', title: 'Option 1: Hosted (Fastest)', level: 2 }, + { id: 'docker', title: 'Option 2: Docker', level: 2 }, + { id: 'manual', title: 'Option 3: Manual Setup', level: 2 }, + { id: 'next-steps', title: 'Next Steps', level: 2 }, +] + +export function QuickStartPage() { + return ( + + {/* Header */} +
+
+ +
+

Quick Start

+

+ Get OpenCodeIntel running and search your first codebase in under 5 minutes. +

+
+ + + +

+ Pick the setup that works for you. Hosted is fastest if you just want to try it out. + Docker is great for local development. Manual gives you the most control. +

+ + {/* Option 1: Hosted */} +

+ Option 1: Hosted (Fastest) +

+

+ Zero setup. Just sign in and start searching. +

+ + + +

+ Head to opencodeintel.com and + sign in with GitHub. +

+
+ + +

+ Click "Add Repository" and paste a GitHub URL. Public repos work immediately. + For private repos, you will need to connect your GitHub account. +

+
+ + +

+ Indexing takes 30 seconds to a few minutes depending on repo size. + You will see a progress bar. Grab a coffee if it is a big one. +

+
+ + +

+ Once indexed, type a query like "authentication logic" or "error handling" + and see the magic happen. +

+ + That is it. You can now search your codebase by meaning, not keywords. + +
+
+ + {/* Option 2: Docker */} +

+ Option 2: Docker +

+

+ Run everything locally with one command. Great for development or keeping data on your machine. +

+ + + + + + +{`git clone https://github.com/OpenCodeIntel/opencodeintel.git +cd opencodeintel`} + + + + + +{`cp .env.example .env`} + +

Edit .env and add your API keys:

+ +{`OPENAI_API_KEY=sk-... +PINECONE_API_KEY=... +PINECONE_INDEX_NAME=codeintel`} + +
+ + + +{`docker compose up -d`} + +

This starts the backend, frontend, and Redis. First run takes a few minutes to build.

+
+ + +

+ Go to localhost:3000 and + you will see the OpenCodeIntel dashboard. +

+ + Backend API runs on localhost:8000. API docs at localhost:8000/docs. + +
+
+ + {/* Option 3: Manual */} +

+ Option 3: Manual Setup +

+

+ Run backend and frontend separately. Best for active development. +

+ + + + + + +{`# macOS with Homebrew +brew install redis +brew services start redis + +# Or with Docker +docker run -d -p 6379:6379 redis:7-alpine`} + + + + + +{`cd backend +python -m venv venv +source venv/bin/activate # Windows: venv\\Scripts\\activate +pip install -r requirements.txt + +# Copy and configure environment +cp .env.example .env +# Edit .env with your API keys + +# Run the server +uvicorn main:app --reload`} + +

Backend will be running on localhost:8000.

+
+ + + +{`cd frontend +bun install +bun run dev`} + +

Frontend will be running on localhost:5173.

+
+
+ + {/* Next Steps */} +

+ Next Steps +

+

+ Now that you have OpenCodeIntel running, here is what to do next: +

+
    +
  • + + Connect to Claude: Set up MCP to give Claude access to your codebase. MCP Setup Guide +
  • +
  • + + Explore features: Learn about dependency graphs, impact analysis, and code style detection. Features +
  • +
  • + + Use the API: Build integrations with the REST API. API Reference +
  • +
+ + {/* Pagination */} + +
+ ) +} diff --git a/frontend/src/pages/features/CodeStyleAnalysisPage.tsx b/frontend/src/pages/features/CodeStyleAnalysisPage.tsx new file mode 100644 index 0000000..03d62f5 --- /dev/null +++ b/frontend/src/pages/features/CodeStyleAnalysisPage.tsx @@ -0,0 +1,174 @@ +import { + DocsLayout, + DocsCodeBlock, + DocsCallout, + DocsPagination, + TimeEstimate, + TOCItem +} from '@/components/docs' + +const tocItems: TOCItem[] = [ + { id: 'what-it-analyzes', title: 'What It Analyzes', level: 2 }, + { id: 'usage', title: 'Usage', level: 2 }, + { id: 'api-response', title: 'API Response', level: 2 }, + { id: 'use-cases', title: 'Use Cases', level: 2 }, +] + +export function CodeStyleAnalysisPage() { + return ( + +
+
+ +
+

Code Style Analysis

+

+ Understand team conventions. Write code that fits in with existing patterns. +

+
+ +

+ Every codebase has conventions. Some use snake_case, others camelCase. Some teams + love type hints, others hate them. Code style analysis extracts these patterns + so you (or your AI assistant) can write code that fits in. +

+ +

What It Analyzes

+ +
+ + + + +
+ +

Usage

+ +

Via MCP (Claude Desktop)

+ +{`"What coding conventions does this repo use?" +"Is this codebase using snake_case or camelCase?" +"How should I structure a new module to fit this codebase?" +"What testing patterns does this team follow?"`} + + +

Via API

+ +{`curl "http://localhost:8000/api/repos/{repo_id}/style"`} + + +

API Response

+ + +{`{ + "naming": { + "variables": "snake_case", + "functions": "snake_case", + "classes": "PascalCase", + "files": "snake_case", + "confidence": 0.92 + }, + "patterns": { + "async_style": "async/await", + "error_handling": "try/except with custom exceptions", + "imports": "absolute with __init__.py exports", + "structure": "class-based services with dependency injection" + }, + "type_system": { + "type_hint_usage": 0.78, + "strict_mode": false, + "common_types": ["Optional", "List", "Dict", "Union"] + }, + "common_imports": [ + { "module": "fastapi", "count": 34 }, + { "module": "pydantic", "count": 28 }, + { "module": "sqlalchemy", "count": 22 }, + { "module": "pytest", "count": 18 } + ], + "recommendations": [ + "Use snake_case for variables and functions", + "Add type hints - team uses them 78% of the time", + "Follow existing pattern: services as classes, utilities as functions" + ] +}`} + + +

Use Cases

+ +

Onboarding

+

+ New to a codebase? Run style analysis to instantly learn the conventions. + No more guessing if you should use tabs or spaces. +

+ +

AI Code Generation

+

+ When Claude generates code, it can use style analysis to match your team's patterns. + The generated code looks like your team wrote it. +

+ +

Code Review

+

+ Check if a PR follows team conventions. "This uses camelCase but we use snake_case." +

+ + + Style analysis works best on codebases with consistent patterns. If your codebase + is a mix of styles (happens during migrations), the confidence scores will be lower. + + + +
+ ) +} + +function StyleCategory({ title, items }: { title: string; items: string[] }) { + return ( +
+

{title}

+
    + {items.map((item, i) => ( +
  • + + {item} +
  • + ))} +
+
+ ) +} diff --git a/frontend/src/pages/features/DependencyAnalysisPage.tsx b/frontend/src/pages/features/DependencyAnalysisPage.tsx new file mode 100644 index 0000000..c37638a --- /dev/null +++ b/frontend/src/pages/features/DependencyAnalysisPage.tsx @@ -0,0 +1,176 @@ +import { + DocsLayout, + DocsCodeBlock, + DocsCallout, + DocsPagination, + TimeEstimate, + TOCItem +} from '@/components/docs' + +const tocItems: TOCItem[] = [ + { id: 'what-it-shows', title: 'What It Shows', level: 2 }, + { id: 'usage', title: 'Usage', level: 2 }, + { id: 'reading-the-graph', title: 'Reading the Graph', level: 2 }, + { id: 'api-response', title: 'API Response', level: 2 }, +] + +export function DependencyAnalysisPage() { + return ( + +
+
+ +
+

Dependency Analysis

+

+ Visualize your architecture. See what connects to what and identify the critical files. +

+
+ +

+ Every codebase has hidden structure. Some files are imported everywhere (hub files). + Some import everything (aggregator files). Some are isolated. Understanding this + structure helps you make better decisions about where to make changes. +

+ +

What It Shows

+ +

+ The dependency graph gives you: +

+ +
    +
  • + +
    + Import relationships: +

    Which files import which. Follow the arrows to trace data flow.

    +
    +
  • +
  • + +
    + Hub files: +

    Files with many dependents. Change these carefully - lots of things depend on them.

    +
    +
  • +
  • + +
    + Leaf files: +

    Files with no dependents. Safe to modify - nothing else uses them.

    +
    +
  • +
  • + +
    + Circular dependencies: +

    A imports B, B imports A. Usually a sign of tangled architecture.

    +
    +
  • +
  • + +
    + Directory clusters: +

    Files grouped by folder show natural module boundaries.

    +
    +
  • +
+ +

Usage

+ +

Via MCP (Claude Desktop)

+ +{`"Show me the dependency graph for this repo" +"What files depend on auth/middleware.py?" +"Find the most connected files in the codebase"`} + + +

Via API

+ +{`curl "http://localhost:8000/api/repos/{repo_id}/dependencies"`} + + +

Via Dashboard

+

+ Click on any repository and navigate to the "Dependencies" tab. You will see an interactive + graph you can zoom, pan, and click on nodes to explore. +

+ +

Reading the Graph

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VisualMeaning
Large nodeMany files depend on this one (high in-degree)
Many outgoing arrowsThis file imports many others (high out-degree)
Cluster of nodesFiles in same directory or tightly coupled
Isolated nodeStandalone file with no dependencies
Bidirectional arrowCircular dependency (A→B and B→A)
+
+ + + The graph uses force-directed layout. Related files naturally cluster together. + If you see two clusters far apart, they are probably independent modules. + + +

API Response

+ +

The API returns nodes and edges:

+ + +{`{ + "nodes": [ + { + "id": "src/auth/middleware.py", + "label": "middleware.py", + "directory": "src/auth", + "in_degree": 12, + "out_degree": 3 + } + ], + "edges": [ + { + "source": "src/api/routes.py", + "target": "src/auth/middleware.py" + } + ], + "stats": { + "total_files": 47, + "total_edges": 89, + "hub_files": ["src/utils/index.ts", "src/auth/middleware.py"], + "leaf_files": ["src/config.py", "src/constants.ts"] + } +}`} + + + +
+ ) +} diff --git a/frontend/src/pages/features/ImpactPredictionPage.tsx b/frontend/src/pages/features/ImpactPredictionPage.tsx new file mode 100644 index 0000000..fda64d0 --- /dev/null +++ b/frontend/src/pages/features/ImpactPredictionPage.tsx @@ -0,0 +1,186 @@ +import { + DocsLayout, + DocsCodeBlock, + DocsCallout, + DocsPagination, + TimeEstimate, + TOCItem +} from '@/components/docs' + +const tocItems: TOCItem[] = [ + { id: 'why-it-matters', title: 'Why It Matters', level: 2 }, + { id: 'what-you-get', title: 'What You Get', level: 2 }, + { id: 'usage', title: 'Usage', level: 2 }, + { id: 'api-response', title: 'API Response', level: 2 }, +] + +export function ImpactPredictionPage() { + return ( + +
+
+ +
+

Impact Prediction

+

+ Know what breaks before you change it. See the blast radius of any modification. +

+
+ +

+ You are about to refactor UserService.ts. + Will anything break? Impact prediction tells you exactly which files depend on it, + which tests cover it, and how risky the change is. +

+ +

Why It Matters

+ +

+ Without impact analysis, you are guessing. You make a change, run the tests, + and hope nothing breaks in production. With impact analysis: +

+ +
    +
  • + + Know exactly which files will be affected +
  • +
  • + + See if tests exist for the affected code +
  • +
  • + + Get a risk score to help prioritize review +
  • +
  • + + Find blind spots where test coverage is missing +
  • +
+ +

What You Get

+ +
+ + + + +
+ + + If a file has 10+ dependents and no tests, think twice before making big changes. + Consider adding tests first, or breaking the change into smaller pieces. + + +

Usage

+ +

Via MCP (Claude Desktop)

+ +{`"What is the impact of changing src/auth/middleware.py?" +"What happens if I modify the UserService?" +"Show me the blast radius of database.ts"`} + + +

Via API

+ +{`curl "http://localhost:8000/api/repos/{repo_id}/impact?file=src/auth/middleware.py"`} + + +

Via Dashboard

+

+ Click any file in the dependency graph and select "Analyze Impact" from the context menu. +

+ +

API Response

+ + +{`{ + "file": "src/auth/middleware.py", + "risk_level": "high", + "risk_score": 0.85, + "direct_dependents": [ + "src/api/routes.py", + "src/api/admin.py", + "src/api/webhooks.py" + ], + "indirect_dependents": [ + "src/main.py", + "src/server.py" + ], + "related_tests": [ + "tests/test_auth.py", + "tests/integration/test_api.py" + ], + "test_coverage": { + "has_tests": true, + "test_count": 2, + "coverage_estimate": "partial" + }, + "recommendations": [ + "High-impact file with 5 dependents", + "Consider adding more test coverage before major changes", + "Related tests found - run these after modification" + ] +}`} + + +

Risk Levels

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
LevelScoreMeaning
Low0.0 - 0.3Few or no dependents. Safe to modify.
Medium0.3 - 0.7Some dependents. Test after changes.
High0.7 - 1.0Many dependents or missing tests. Proceed carefully.
+
+ + +
+ ) +} + +function ImpactSection({ title, description }: { title: string; description: string }) { + return ( +
+

{title}

+

{description}

+
+ ) +} diff --git a/frontend/src/pages/features/SemanticSearchPage.tsx b/frontend/src/pages/features/SemanticSearchPage.tsx new file mode 100644 index 0000000..7b8a15c --- /dev/null +++ b/frontend/src/pages/features/SemanticSearchPage.tsx @@ -0,0 +1,164 @@ +import { + DocsLayout, + DocsCodeBlock, + DocsCallout, + DocsPagination, + TimeEstimate, + TOCItem +} from '@/components/docs' + +const tocItems: TOCItem[] = [ + { id: 'how-it-works', title: 'How It Works', level: 2 }, + { id: 'usage', title: 'Usage', level: 2 }, + { id: 'examples', title: 'Examples', level: 2 }, + { id: 'tips', title: 'Tips for Better Results', level: 2 }, +] + +export function SemanticSearchPage() { + return ( + +
+
+ +
+

Semantic Search

+

+ Find code by meaning, not keywords. Search for "error handling" and find processFailure(). +

+
+ +

+ Traditional code search is like using Ctrl+F - you find exactly what you type, nothing more. + Semantic search understands what you mean. Ask for "authentication middleware" and it finds + verifyToken(), + checkAuth(), and + requireLogin(). +

+ +

How It Works

+ +

+ When you index a repository, OpenCodeIntel: +

+
    +
  1. + 1. + Parses your code using Tree-sitter to understand structure (functions, classes, imports) +
  2. +
  3. + 2. + Generates summaries using GPT-4o-mini to describe what each chunk does in plain English +
  4. +
  5. + 3. + Creates embeddings using OpenAI's embedding model and stores them in Pinecone +
  6. +
+

+ When you search, your query gets embedded and matched against the stored vectors. + The result? Code that means what you are looking for, even if it does not contain your exact words. +

+ +

Usage

+ +

Via MCP (Claude Desktop)

+

Just ask Claude naturally:

+ +{`"Find the authentication logic in this codebase" +"Where is error handling implemented?" +"Show me the database connection setup"`} + + +

Via API

+ +{`curl -X POST "http://localhost:8000/api/search" \\ + -H "Content-Type: application/json" \\ + -d '{ + "repo_id": "your-repo-id", + "query": "authentication middleware", + "max_results": 10 + }'`} + + +

Via Dashboard

+

+ Use the search bar in the dashboard. Results show file path, code snippet, and relevance score. +

+ +

Examples

+ +
+ + + +
+ +

Tips for Better Results

+ +
    +
  • + + Be descriptive: "user authentication flow" works better than just "auth" +
  • +
  • + + Use domain language: Search in the terms your codebase uses +
  • +
  • + + Ask questions: "How does the app handle failed payments?" works great +
  • +
  • + + Avoid exact syntax: Do not search for "function handleAuth(" - describe what it does instead +
  • +
+ + + If you are not finding what you expect, try rephrasing. "Error handling" and "exception management" + might return different results depending on how your code is written. + + + +
+ ) +} + +function SearchExample({ query, finds }: { query: string; finds: string[] }) { + return ( +
+

Query:

+

"{query}"

+

Finds:

+
    + {finds.map((find, i) => ( +
  • {find}
  • + ))} +
+
+ ) +} diff --git a/frontend/src/pages/features/index.ts b/frontend/src/pages/features/index.ts new file mode 100644 index 0000000..2137d66 --- /dev/null +++ b/frontend/src/pages/features/index.ts @@ -0,0 +1,4 @@ +export { SemanticSearchPage } from './SemanticSearchPage' +export { DependencyAnalysisPage } from './DependencyAnalysisPage' +export { ImpactPredictionPage } from './ImpactPredictionPage' +export { CodeStyleAnalysisPage } from './CodeStyleAnalysisPage' From 2be9c70ede54b646204aa90c9f0b827df47451af Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 17:03:41 -0500 Subject: [PATCH 04/33] feat(docs): Phase 2 continued - MCP and Deployment pages New pages: - MCPToolsPage: Complete reference for all 7 MCP tools with parameters - MCPExamplesPage: Real-world prompt examples organized by use case - DockerSetupPage: Docker Compose setup with env vars and commands - SelfHostingPage: Railway, Fly.io, and VPS deployment guides Updated routing in App.tsx for all new pages --- frontend/src/App.tsx | 12 +- frontend/src/pages/MCPExamplesPage.tsx | 184 +++++++++++++ frontend/src/pages/MCPToolsPage.tsx | 191 ++++++++++++++ .../src/pages/deployment/DockerSetupPage.tsx | 242 ++++++++++++++++++ .../src/pages/deployment/SelfHostingPage.tsx | 223 ++++++++++++++++ frontend/src/pages/deployment/index.ts | 2 + 6 files changed, 851 insertions(+), 3 deletions(-) create mode 100644 frontend/src/pages/MCPExamplesPage.tsx create mode 100644 frontend/src/pages/MCPToolsPage.tsx create mode 100644 frontend/src/pages/deployment/DockerSetupPage.tsx create mode 100644 frontend/src/pages/deployment/SelfHostingPage.tsx create mode 100644 frontend/src/pages/deployment/index.ts diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 782f0b3..449142c 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -8,8 +8,11 @@ import { LandingPage } from './pages/LandingPage'; import { Dashboard } from './components/Dashboard'; import { DocsHomePage } from './pages/DocsHomePage'; import { MCPSetupPage } from './pages/MCPSetupPage'; +import { MCPToolsPage } from './pages/MCPToolsPage'; +import { MCPExamplesPage } from './pages/MCPExamplesPage'; import { QuickStartPage } from './pages/QuickStartPage'; import { SemanticSearchPage, DependencyAnalysisPage, ImpactPredictionPage, CodeStyleAnalysisPage } from './pages/features'; +import { DockerSetupPage, SelfHostingPage } from './pages/deployment'; import { GitHubCallbackPage } from './pages/GitHubCallbackPage'; function ProtectedRoute({ children }: { children: React.ReactNode }) { @@ -70,8 +73,8 @@ function AppRoutes() { } /> } /> } /> - } /> - } /> + } /> + } /> {/* Feature pages */} } /> @@ -79,10 +82,13 @@ function AppRoutes() { } /> } /> + {/* Deployment pages */} + } /> + } /> + {/* Placeholder routes for future docs pages */} } /> } /> - } /> } /> } /> +
+
+ +
+

Example Prompts

+

+ Real-world prompts for using OpenCodeIntel with Claude. Copy, paste, adapt. +

+
+ +

+ These are actual prompts that work well with OpenCodeIntel. They show how to + leverage semantic search, dependency analysis, and impact prediction in real workflows. +

+ + {/* Onboarding */} +

+ Onboarding to New Codebase +

+

First day on a new project? Start here.

+ + + + + + {/* Refactoring */} +

+ Before Refactoring +

+

Know what will break before you break it.

+ + + + + + {/* Debugging */} +

+ Debugging +

+

Find the source of bugs faster.

+ + + + + + {/* Code Review */} +

+ Code Review +

+

Review PRs with context.

+ + + + + + {/* Writing New Code */} +

+ Writing New Code +

+

Write code that fits in.

+ + + + + + {/* Documentation */} +

+ Documentation +

+

Understand and document.

+ + + + + + These prompts work best when you have already indexed your repository. + The more code indexed, the better the results. + + + + + ) +} + +function PromptCard({ title, prompt, explanation }: { title: string; prompt: string; explanation: string }) { + return ( +
+

{title}

+

"{prompt}"

+

{explanation}

+
+ ) +} diff --git a/frontend/src/pages/MCPToolsPage.tsx b/frontend/src/pages/MCPToolsPage.tsx new file mode 100644 index 0000000..f4e812e --- /dev/null +++ b/frontend/src/pages/MCPToolsPage.tsx @@ -0,0 +1,191 @@ +import { + DocsLayout, + DocsCodeBlock, + DocsPagination, + TimeEstimate, + TOCItem +} from '@/components/docs' + +const tocItems: TOCItem[] = [ + { id: 'search-code', title: 'search_code', level: 2 }, + { id: 'list-repositories', title: 'list_repositories', level: 2 }, + { id: 'get-dependency-graph', title: 'get_dependency_graph', level: 2 }, + { id: 'analyze-impact', title: 'analyze_impact', level: 2 }, + { id: 'analyze-code-style', title: 'analyze_code_style', level: 2 }, + { id: 'get-repository-insights', title: 'get_repository_insights', level: 2 }, + { id: 'get-codebase-dna', title: 'get_codebase_dna', level: 2 }, +] + +export function MCPToolsPage() { + return ( + +
+
+ +
+

MCP Tools Reference

+

+ Complete reference for all MCP tools available to Claude and other AI assistants. +

+
+ +

+ When you connect OpenCodeIntel via MCP, your AI assistant gets access to these tools. + Each tool has specific parameters and returns structured data. +

+ + {/* search_code */} + + + {/* list_repositories */} + + + {/* get_dependency_graph */} + + + {/* analyze_impact */} + + + {/* analyze_code_style */} + + + {/* get_repository_insights */} + + + {/* get_codebase_dna */} + + + +
+ ) +} + +interface Parameter { + name: string + type: string + required: boolean + description: string +} + +interface ToolSectionProps { + id: string + name: string + description: string + parameters: Parameter[] + returns: string + example: string +} + +function ToolSection({ id, name, description, parameters, returns, example }: ToolSectionProps) { + return ( +
+

{name}

+

{description}

+ + {parameters.length > 0 && ( + <> +

Parameters

+
+ + + + + + + + + + + {parameters.map((param) => ( + + + + + + + ))} + +
NameTypeRequiredDescription
{param.name}{param.type}{param.required ? Yes : 'No'}{param.description}
+
+ + )} + + {parameters.length === 0 && ( +

No parameters required.

+ )} + +

Returns

+

{returns}

+ +

Example Prompt

+ {example} +
+ ) +} diff --git a/frontend/src/pages/deployment/DockerSetupPage.tsx b/frontend/src/pages/deployment/DockerSetupPage.tsx new file mode 100644 index 0000000..0558c3c --- /dev/null +++ b/frontend/src/pages/deployment/DockerSetupPage.tsx @@ -0,0 +1,242 @@ +import { + DocsLayout, + DocsCodeBlock, + DocsCallout, + DocsPrerequisites, + DocsPagination, + TimeEstimate, + Step, + StepList, + TOCItem +} from '@/components/docs' + +const tocItems: TOCItem[] = [ + { id: 'prerequisites', title: 'Prerequisites', level: 2 }, + { id: 'quick-start', title: 'Quick Start', level: 2 }, + { id: 'configuration', title: 'Configuration', level: 2 }, + { id: 'services', title: 'Services', level: 2 }, + { id: 'commands', title: 'Useful Commands', level: 2 }, + { id: 'troubleshooting', title: 'Troubleshooting', level: 2 }, +] + +export function DockerSetupPage() { + return ( + +
+
+ +
+

Docker Setup

+

+ Run the entire OpenCodeIntel stack locally with Docker Compose. +

+
+ +

+ Docker is the fastest way to run OpenCodeIntel locally. One command spins up the + backend, frontend, and Redis. No Python versions to manage, no Node versions to worry about. +

+ +

Prerequisites

+ + + +

Quick Start

+ + + + +{`git clone https://github.com/OpenCodeIntel/opencodeintel.git +cd opencodeintel`} + + + + + +{`cp .env.example .env`} + +

Edit .env with your API keys:

+ +{`# Required +OPENAI_API_KEY=sk-... +PINECONE_API_KEY=... +PINECONE_INDEX_NAME=codeintel + +# Optional - for GitHub OAuth +GITHUB_CLIENT_ID=... +GITHUB_CLIENT_SECRET=... + +# Optional - for Supabase auth +SUPABASE_URL=... +SUPABASE_ANON_KEY=...`} + +
+ + + +{`docker compose up -d`} + +

First run downloads images and builds containers. Takes 2-5 minutes.

+
+ + + +{`docker compose ps`} + +

You should see three containers running:

+
    +
  • codeintel-frontend - Port 3000
  • +
  • codeintel-backend - Port 8000
  • +
  • codeintel-redis - Port 6379
  • +
+
+ + +

Go to localhost:3000

+ + You are running OpenCodeIntel locally! + +
+
+ +

Configuration

+ +

Environment Variables

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VariableRequiredDescription
OPENAI_API_KEYYesFor embeddings and code summaries
PINECONE_API_KEYYesVector database for semantic search
PINECONE_INDEX_NAMEYesName of your Pinecone index
REDIS_URLNoDefaults to redis://redis:6379
GITHUB_CLIENT_IDNoFor GitHub OAuth login
GITHUB_CLIENT_SECRETNoFor GitHub OAuth login
+
+ +

Services

+ +
+ + + +
+ +

Useful Commands

+ + +{`# Start all services +docker compose up -d + +# Stop all services +docker compose down + +# View logs +docker compose logs -f + +# View logs for specific service +docker compose logs -f backend + +# Rebuild after code changes +docker compose up -d --build + +# Reset everything (including volumes) +docker compose down -v`} + + +

Troubleshooting

+ +

Container won't start

+

+ Check logs: docker compose logs backend +

+

+ Common causes: missing .env file, invalid API keys, port already in use. +

+ +

Port already in use

+

+ Something else is using port 3000 or 8000. Either stop that service or change ports in docker-compose.yml. +

+ +

Out of memory

+

+ Increase Docker Desktop memory allocation in Settings → Resources. Recommend 4GB+. +

+ + +
+ ) +} + +function ServiceCard({ name, port, description, healthCheck }: { name: string; port: string; description: string; healthCheck: string }) { + return ( +
+
+

{name}

+ :{port} +
+

{description}

+

Health check: {healthCheck}

+
+ ) +} diff --git a/frontend/src/pages/deployment/SelfHostingPage.tsx b/frontend/src/pages/deployment/SelfHostingPage.tsx new file mode 100644 index 0000000..d30c62b --- /dev/null +++ b/frontend/src/pages/deployment/SelfHostingPage.tsx @@ -0,0 +1,223 @@ +import { + DocsLayout, + DocsCodeBlock, + DocsCallout, + DocsPagination, + TimeEstimate, + TOCItem +} from '@/components/docs' + +const tocItems: TOCItem[] = [ + { id: 'options', title: 'Deployment Options', level: 2 }, + { id: 'railway', title: 'Railway', level: 2 }, + { id: 'fly', title: 'Fly.io', level: 2 }, + { id: 'vps', title: 'VPS / Bare Metal', level: 2 }, + { id: 'production', title: 'Production Checklist', level: 2 }, +] + +export function SelfHostingPage() { + return ( + +
+
+ +
+

Self-Hosting

+

+ Deploy OpenCodeIntel on your own infrastructure for full control and data privacy. +

+
+ +

+ Self-hosting gives you complete control over your data. Your code never leaves your infrastructure. + Choose from several deployment options depending on your needs. +

+ +

Deployment Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionBest ForEffortCost
RailwayQuick setup, small teamsLow~$20/mo
Fly.ioGlobal distribution, scalingMedium~$15/mo
VPSFull control, existing infraHigher~$10/mo
+
+ +

Railway

+

+ Railway is the easiest way to deploy. Connect your repo and it handles the rest. +

+ + +{`# 1. Install Railway CLI +npm install -g @railway/cli + +# 2. Login +railway login + +# 3. Initialize project +cd opencodeintel +railway init + +# 4. Add Redis +railway add --plugin redis + +# 5. Set environment variables +railway variables set OPENAI_API_KEY=sk-... +railway variables set PINECONE_API_KEY=... +railway variables set PINECONE_INDEX_NAME=codeintel + +# 6. Deploy +railway up`} + + + + Railway auto-detects Dockerfile and docker-compose.yml. It will deploy all services automatically. + + +

Fly.io

+

+ Fly.io is great for global distribution. Deploy close to your users. +

+ + +{`# 1. Install Fly CLI +curl -L https://fly.io/install.sh | sh + +# 2. Login +fly auth login + +# 3. Create apps +cd backend +fly launch --name codeintel-backend + +cd ../frontend +fly launch --name codeintel-frontend + +# 4. Set secrets +fly secrets set OPENAI_API_KEY=sk-... -a codeintel-backend +fly secrets set PINECONE_API_KEY=... -a codeintel-backend + +# 5. Create Redis (Upstash recommended) +# Or use Fly's built-in Redis: fly redis create + +# 6. Deploy +fly deploy -a codeintel-backend +fly deploy -a codeintel-frontend`} + + +

VPS / Bare Metal

+

+ For full control, deploy on any Linux server with Docker. +

+ + +{`# 1. SSH into your server +ssh user@your-server.com + +# 2. Install Docker +curl -fsSL https://get.docker.com | sh + +# 3. Clone repo +git clone https://github.com/OpenCodeIntel/opencodeintel.git +cd opencodeintel + +# 4. Configure +cp .env.example .env +nano .env # Add your API keys + +# 5. Start with production config +docker compose -f docker-compose.prod.yml up -d + +# 6. Set up reverse proxy (nginx/caddy) +# Point your domain to the server`} + + +

Nginx Config

+ +{`server { + listen 80; + server_name codeintel.yourdomain.com; + + location / { + proxy_pass http://localhost:3000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + } + + location /api { + proxy_pass http://localhost:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } +}`} + + +

Production Checklist

+ +
    +
  • + + HTTPS: Use SSL/TLS. Let's Encrypt is free. +
  • +
  • + + Backups: Back up your Pinecone index and any persistent data. +
  • +
  • + + Monitoring: Set up health checks and alerts. +
  • +
  • + + Rate Limiting: Protect your API endpoints. +
  • +
  • + + Auth: Configure proper authentication if exposing publicly. +
  • +
  • + + Secrets: Never commit API keys. Use environment variables or secret managers. +
  • +
+ + + If you are exposing OpenCodeIntel to the internet, make sure authentication is properly configured. + The default setup is for local development and does not enforce auth on all endpoints. + + + +
+ ) +} diff --git a/frontend/src/pages/deployment/index.ts b/frontend/src/pages/deployment/index.ts new file mode 100644 index 0000000..7100b0e --- /dev/null +++ b/frontend/src/pages/deployment/index.ts @@ -0,0 +1,2 @@ +export { DockerSetupPage } from './DockerSetupPage' +export { SelfHostingPage } from './SelfHostingPage' From 39834eba5a125e0074758635dfb94d4ce49cac0e Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 17:07:04 -0500 Subject: [PATCH 05/33] feat(docs): Phase 3 - Complete API Reference pages New pages: - APIOverviewPage: Base URL, authentication, error handling, rate limits - APIRepositoriesPage: List, get, create, delete, reindex endpoints - APISearchPage: Semantic search with parameters and examples - APIAnalysisPage: Dependencies, impact, style, insights endpoints All major documentation sections now complete: - Getting Started (intro, quickstart) - MCP Integration (setup, tools, examples) - Features (search, dependencies, impact, style) - Deployment (docker, self-hosting) - API Reference (overview, repos, search, analysis) Only placeholders remaining: Architecture, Contributing --- frontend/src/App.tsx | 9 +- frontend/src/pages/api/APIAnalysisPage.tsx | 241 ++++++++++++++++++ frontend/src/pages/api/APIOverviewPage.tsx | 229 +++++++++++++++++ .../src/pages/api/APIRepositoriesPage.tsx | 223 ++++++++++++++++ frontend/src/pages/api/APISearchPage.tsx | 195 ++++++++++++++ frontend/src/pages/api/index.ts | 4 + 6 files changed, 899 insertions(+), 2 deletions(-) create mode 100644 frontend/src/pages/api/APIAnalysisPage.tsx create mode 100644 frontend/src/pages/api/APIOverviewPage.tsx create mode 100644 frontend/src/pages/api/APIRepositoriesPage.tsx create mode 100644 frontend/src/pages/api/APISearchPage.tsx create mode 100644 frontend/src/pages/api/index.ts diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 449142c..1dc7072 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -13,6 +13,7 @@ import { MCPExamplesPage } from './pages/MCPExamplesPage'; import { QuickStartPage } from './pages/QuickStartPage'; import { SemanticSearchPage, DependencyAnalysisPage, ImpactPredictionPage, CodeStyleAnalysisPage } from './pages/features'; import { DockerSetupPage, SelfHostingPage } from './pages/deployment'; +import { APIOverviewPage, APIRepositoriesPage, APISearchPage, APIAnalysisPage } from './pages/api'; import { GitHubCallbackPage } from './pages/GitHubCallbackPage'; function ProtectedRoute({ children }: { children: React.ReactNode }) { @@ -86,9 +87,13 @@ function AppRoutes() { } /> } /> + {/* API Reference pages */} + } /> + } /> + } /> + } /> + {/* Placeholder routes for future docs pages */} - } /> - } /> } /> } /> +
+
+ +
+

Analysis API

+

+ Dependency graphs, impact analysis, code style, and repository insights. +

+
+ + {/* Dependency Graph */} +

Dependency Graph

+ +
+ + GET + + /api/repos/{'{repo_id}'}/dependencies +
+ +

+ Get the complete import/dependency graph for a repository. +

+ +

Response

+ +{`{ + "nodes": [ + { + "id": "src/auth/middleware.py", + "label": "middleware.py", + "directory": "src/auth", + "in_degree": 12, + "out_degree": 3, + "is_hub": true + } + ], + "edges": [ + { + "source": "src/api/routes.py", + "target": "src/auth/middleware.py", + "type": "import" + } + ], + "stats": { + "total_files": 47, + "total_edges": 89, + "hub_files": ["src/utils/index.ts"], + "leaf_files": ["src/config.py"], + "circular_dependencies": [] + } +}`} + + +

Example

+ +{`curl -H "Authorization: Bearer YOUR_API_KEY" \\ + http://localhost:8000/api/repos/repo_abc123/dependencies`} + + + {/* Impact Analysis */} +

Impact Analysis

+ +
+ + GET + + /api/repos/{'{repo_id}'}/impact +
+ +

+ Analyze the impact of changing a specific file. +

+ +

Query Parameters

+
+ + + + + + + + + + + + + + + + + +
ParameterTypeRequiredDescription
filestringYesPath to the file to analyze
+
+ +

Response

+ +{`{ + "file": "src/auth/middleware.py", + "risk_level": "high", + "risk_score": 0.85, + "direct_dependents": [ + "src/api/routes.py", + "src/api/admin.py" + ], + "indirect_dependents": [ + "src/main.py" + ], + "related_tests": [ + "tests/test_auth.py" + ], + "test_coverage": { + "has_tests": true, + "test_count": 2 + }, + "recommendations": [ + "High-impact file with 5 dependents", + "Run tests before deploying changes" + ] +}`} + + +

Example

+ +{`curl -H "Authorization: Bearer YOUR_API_KEY" \\ + "http://localhost:8000/api/repos/repo_abc123/impact?file=src/auth/middleware.py"`} + + + {/* Code Style */} +

Code Style

+ +
+ + GET + + /api/repos/{'{repo_id}'}/style +
+ +

+ Analyze coding conventions and patterns in the repository. +

+ +

Response

+ +{`{ + "naming": { + "variables": "snake_case", + "functions": "snake_case", + "classes": "PascalCase", + "confidence": 0.92 + }, + "patterns": { + "async_style": "async/await", + "error_handling": "try/except", + "imports": "absolute" + }, + "type_system": { + "type_hint_usage": 0.78, + "common_types": ["Optional", "List", "Dict"] + }, + "common_imports": [ + { "module": "fastapi", "count": 34 }, + { "module": "pydantic", "count": 28 } + ] +}`} + + + {/* Repository Insights */} +

Repository Insights

+ +
+ + GET + + /api/repos/{'{repo_id}'}/insights +
+ +

+ Get high-level insights and metrics about a repository. +

+ +

Response

+ +{`{ + "overview": { + "total_files": 142, + "total_lines": 28500, + "languages": { + "TypeScript": 65, + "Python": 42, + "JavaScript": 35 + } + }, + "architecture": { + "pattern": "monolith with service layer", + "entry_points": ["src/main.py", "src/cli.py"], + "critical_files": [ + "src/core/engine.py", + "src/api/routes.py" + ] + }, + "health": { + "test_coverage_estimate": "partial", + "documentation_coverage": 0.45, + "circular_dependencies": 0 + } +}`} + + +

Example

+ +{`curl -H "Authorization: Bearer YOUR_API_KEY" \\ + http://localhost:8000/api/repos/repo_abc123/insights`} + + + + + ) +} diff --git a/frontend/src/pages/api/APIOverviewPage.tsx b/frontend/src/pages/api/APIOverviewPage.tsx new file mode 100644 index 0000000..4d5037b --- /dev/null +++ b/frontend/src/pages/api/APIOverviewPage.tsx @@ -0,0 +1,229 @@ +import { + DocsLayout, + DocsCodeBlock, + DocsCallout, + DocsPagination, + TimeEstimate, + TOCItem +} from '@/components/docs' +import { Link } from 'react-router-dom' + +const tocItems: TOCItem[] = [ + { id: 'base-url', title: 'Base URL', level: 2 }, + { id: 'authentication', title: 'Authentication', level: 2 }, + { id: 'endpoints', title: 'Endpoints', level: 2 }, + { id: 'errors', title: 'Error Handling', level: 2 }, + { id: 'rate-limits', title: 'Rate Limits', level: 2 }, +] + +export function APIOverviewPage() { + return ( + +
+
+ +
+

API Reference

+

+ REST API for programmatic access to OpenCodeIntel features. +

+
+ +

+ The OpenCodeIntel API lets you integrate code intelligence into your own tools. + Search code, analyze dependencies, and predict impact programmatically. +

+ + + Interactive API docs available at http://localhost:8000/docs when running locally. + + +

Base URL

+ + +{`# Local development +http://localhost:8000/api + +# Hosted version +https://api.opencodeintel.com/api`} + + +

Authentication

+ +

+ All API requests require an API key passed in the Authorization header: +

+ + +{`curl -H "Authorization: Bearer YOUR_API_KEY" \\ + http://localhost:8000/api/repos`} + + +

+ Get your API key from the dashboard under Settings → API Keys. +

+ +

Endpoints

+ +
+ + + + + + + +
+ +

Error Handling

+ +

+ The API returns standard HTTP status codes. Errors include a JSON body with details: +

+ + +{`{ + "error": "not_found", + "message": "Repository not found", + "status": 404 +}`} + + +

Common Status Codes

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeMeaning
200Success
201Created
400Bad request - check your parameters
401Unauthorized - invalid or missing API key
404Not found - resource doesn't exist
429Rate limited - slow down
500Server error - try again or contact support
+
+ +

Rate Limits

+ +

+ API requests are rate limited to ensure fair usage: +

+ +
    +
  • + + Search: 100 requests/minute +
  • +
  • + + Analysis: 60 requests/minute +
  • +
  • + + Indexing: 10 repositories/hour +
  • +
+ +

+ Rate limit info is included in response headers: +

+ + +{`X-RateLimit-Limit: 100 +X-RateLimit-Remaining: 95 +X-RateLimit-Reset: 1620000000`} + + + +
+ ) +} + +function EndpointLink({ method, path, description, href }: { method: string; path: string; description: string; href: string }) { + const methodColors: Record = { + GET: 'text-green-400 bg-green-500/10', + POST: 'text-blue-400 bg-blue-500/10', + PUT: 'text-amber-400 bg-amber-500/10', + DELETE: 'text-red-400 bg-red-500/10', + } + + return ( + + + {method} + + {path} + {description} + + ) +} diff --git a/frontend/src/pages/api/APIRepositoriesPage.tsx b/frontend/src/pages/api/APIRepositoriesPage.tsx new file mode 100644 index 0000000..96e129f --- /dev/null +++ b/frontend/src/pages/api/APIRepositoriesPage.tsx @@ -0,0 +1,223 @@ +import { + DocsLayout, + DocsCodeBlock, + DocsPagination, + TimeEstimate, + TOCItem +} from '@/components/docs' + +const tocItems: TOCItem[] = [ + { id: 'list', title: 'List Repositories', level: 2 }, + { id: 'get', title: 'Get Repository', level: 2 }, + { id: 'create', title: 'Add Repository', level: 2 }, + { id: 'delete', title: 'Delete Repository', level: 2 }, + { id: 'reindex', title: 'Reindex Repository', level: 2 }, +] + +export function APIRepositoriesPage() { + return ( + +
+
+ +
+

Repositories API

+

+ Manage repositories: list, add, delete, and reindex. +

+
+ + {/* List Repositories */} +

List Repositories

+ + +

Returns all repositories accessible to your account.

+ +

Response

+ +{`{ + "repositories": [ + { + "id": "repo_abc123", + "name": "my-project", + "url": "https://github.com/user/my-project", + "status": "indexed", + "file_count": 142, + "last_indexed": "2024-01-15T10:30:00Z", + "created_at": "2024-01-10T08:00:00Z" + } + ], + "total": 1 +}`} + + +

Example

+ +{`curl -H "Authorization: Bearer YOUR_API_KEY" \\ + http://localhost:8000/api/repos`} + + + {/* Get Repository */} +

Get Repository

+ + +

Get details for a specific repository.

+ +

Parameters

+ + +

Response

+ +{`{ + "id": "repo_abc123", + "name": "my-project", + "url": "https://github.com/user/my-project", + "status": "indexed", + "file_count": 142, + "languages": { + "TypeScript": 65, + "Python": 42, + "JavaScript": 35 + }, + "last_indexed": "2024-01-15T10:30:00Z", + "indexing_duration_ms": 45000, + "created_at": "2024-01-10T08:00:00Z" +}`} + + + {/* Add Repository */} +

Add Repository

+ + +

Add a new repository for indexing.

+ +

Request Body

+ +{`{ + "url": "https://github.com/user/my-project", + "branch": "main" // optional, defaults to default branch +}`} + + +

Response

+ +{`{ + "id": "repo_abc123", + "name": "my-project", + "status": "indexing", + "message": "Repository added. Indexing in progress." +}`} + + +

Example

+ +{`curl -X POST \\ + -H "Authorization: Bearer YOUR_API_KEY" \\ + -H "Content-Type: application/json" \\ + -d '{"url": "https://github.com/user/my-project"}' \\ + http://localhost:8000/api/repos`} + + + {/* Delete Repository */} +

Delete Repository

+ + +

Remove a repository and all its indexed data.

+ +

Parameters

+ + +

Response

+ +{`{ + "message": "Repository deleted successfully" +}`} + + + {/* Reindex Repository */} +

Reindex Repository

+ + +

Trigger a fresh index of the repository. Use after major code changes.

+ +

Parameters

+ + +

Response

+ +{`{ + "id": "repo_abc123", + "status": "indexing", + "message": "Reindexing started" +}`} + + + +
+ ) +} + +function EndpointHeader({ method, path }: { method: string; path: string }) { + const methodColors: Record = { + GET: 'text-green-400 bg-green-500/10', + POST: 'text-blue-400 bg-blue-500/10', + PUT: 'text-amber-400 bg-amber-500/10', + DELETE: 'text-red-400 bg-red-500/10', + } + + return ( +
+ + {method} + + {path} +
+ ) +} + +interface Param { + name: string + location: string + type: string + required: boolean + description: string +} + +function ParamTable({ params }: { params: Param[] }) { + return ( +
+ + + + + + + + + + + + {params.map((param) => ( + + + + + + + + ))} + +
NameLocationTypeRequiredDescription
{param.name}{param.location}{param.type}{param.required ? Yes : 'No'}{param.description}
+
+ ) +} diff --git a/frontend/src/pages/api/APISearchPage.tsx b/frontend/src/pages/api/APISearchPage.tsx new file mode 100644 index 0000000..0de8556 --- /dev/null +++ b/frontend/src/pages/api/APISearchPage.tsx @@ -0,0 +1,195 @@ +import { + DocsLayout, + DocsCodeBlock, + DocsCallout, + DocsPagination, + TimeEstimate, + TOCItem +} from '@/components/docs' + +const tocItems: TOCItem[] = [ + { id: 'search', title: 'Semantic Search', level: 2 }, + { id: 'parameters', title: 'Parameters', level: 2 }, + { id: 'response', title: 'Response', level: 2 }, + { id: 'examples', title: 'Examples', level: 2 }, +] + +export function APISearchPage() { + return ( + +
+
+ +
+

Search API

+

+ Semantic code search across indexed repositories. +

+
+ + + +
+ + POST + + /api/search +
+ +

+ Search code by meaning, not just keywords. The query is converted to an embedding + and matched against indexed code chunks. +

+ +

Parameters

+ +

Request Body

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeRequiredDescription
querystringYesNatural language search query
repo_idstringYesRepository to search in
max_resultsintegerNoMaximum results to return (default: 10, max: 50)
min_scorefloatNoMinimum relevance score 0-1 (default: 0.5)
file_filterstringNoGlob pattern to filter files (e.g., "*.py", "src/**")
+
+ + +{`{ + "query": "authentication middleware", + "repo_id": "repo_abc123", + "max_results": 10, + "min_score": 0.6, + "file_filter": "src/**/*.ts" +}`} + + +

Response

+ + +{`{ + "results": [ + { + "file_path": "src/middleware/auth.ts", + "content": "export async function verifyToken(req, res, next) {\\n const token = req.headers.authorization;\\n // ... verification logic\\n}", + "start_line": 15, + "end_line": 42, + "score": 0.89, + "summary": "Token verification middleware that validates JWT tokens and attaches user to request", + "language": "typescript" + }, + { + "file_path": "src/utils/jwt.ts", + "content": "export function decodeToken(token: string) { ... }", + "start_line": 1, + "end_line": 20, + "score": 0.75, + "summary": "JWT utility functions for encoding and decoding tokens", + "language": "typescript" + } + ], + "total": 2, + "query": "authentication middleware", + "search_time_ms": 145 +}`} + + +

Result Fields

+ +
    +
  • + file_path + - Path to the file containing the match +
  • +
  • + content + - The matching code chunk +
  • +
  • + start_line / end_line + - Line numbers in the original file +
  • +
  • + score + - Relevance score from 0 to 1 +
  • +
  • + summary + - AI-generated description of what the code does +
  • +
+ +

Examples

+ +

Basic Search

+ +{`curl -X POST \\ + -H "Authorization: Bearer YOUR_API_KEY" \\ + -H "Content-Type: application/json" \\ + -d '{"query": "error handling", "repo_id": "repo_abc123"}' \\ + http://localhost:8000/api/search`} + + +

Search with Filters

+ +{`curl -X POST \\ + -H "Authorization: Bearer YOUR_API_KEY" \\ + -H "Content-Type: application/json" \\ + -d '{ + "query": "database connection pool", + "repo_id": "repo_abc123", + "max_results": 5, + "min_score": 0.7, + "file_filter": "**/*.py" + }' \\ + http://localhost:8000/api/search`} + + + + For best results, use natural language queries that describe what the code does, + not exact function names. "handles user login" works better than "handleLogin". + + + +
+ ) +} diff --git a/frontend/src/pages/api/index.ts b/frontend/src/pages/api/index.ts new file mode 100644 index 0000000..53b02ea --- /dev/null +++ b/frontend/src/pages/api/index.ts @@ -0,0 +1,4 @@ +export { APIOverviewPage } from './APIOverviewPage' +export { APIRepositoriesPage } from './APIRepositoriesPage' +export { APISearchPage } from './APISearchPage' +export { APIAnalysisPage } from './APIAnalysisPage' From dbe2c22a17595396b1420b61e0a287bacd1551da Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 17:09:20 -0500 Subject: [PATCH 06/33] fix: scroll to top on page navigation --- frontend/src/App.tsx | 2 ++ frontend/src/components/ScrollToTop.tsx | 12 ++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 frontend/src/components/ScrollToTop.tsx diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 1dc7072..a2b2a7b 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -15,6 +15,7 @@ import { SemanticSearchPage, DependencyAnalysisPage, ImpactPredictionPage, CodeS import { DockerSetupPage, SelfHostingPage } from './pages/deployment'; import { APIOverviewPage, APIRepositoriesPage, APISearchPage, APIAnalysisPage } from './pages/api'; import { GitHubCallbackPage } from './pages/GitHubCallbackPage'; +import { ScrollToTop } from './components/ScrollToTop'; function ProtectedRoute({ children }: { children: React.ReactNode }) { const { user, loading } = useAuth(); @@ -122,6 +123,7 @@ export function App() { > + diff --git a/frontend/src/components/ScrollToTop.tsx b/frontend/src/components/ScrollToTop.tsx new file mode 100644 index 0000000..424e7fa --- /dev/null +++ b/frontend/src/components/ScrollToTop.tsx @@ -0,0 +1,12 @@ +import { useEffect } from 'react' +import { useLocation } from 'react-router-dom' + +export function ScrollToTop() { + const { pathname } = useLocation() + + useEffect(() => { + window.scrollTo(0, 0) + }, [pathname]) + + return null +} From 277321e1d781f2ff14f18861d0cbfabc3518e349 Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 17:13:56 -0500 Subject: [PATCH 07/33] fix: remove broken sidebar links (Authentication, Configuration, Contributing pages) --- frontend/src/components/docs/DocsSidebar.tsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/frontend/src/components/docs/DocsSidebar.tsx b/frontend/src/components/docs/DocsSidebar.tsx index 2ed7afe..18343d3 100644 --- a/frontend/src/components/docs/DocsSidebar.tsx +++ b/frontend/src/components/docs/DocsSidebar.tsx @@ -13,8 +13,6 @@ import { AlertTriangle, Palette, Server, - Settings, - Users, ChevronLeft } from 'lucide-react' @@ -58,7 +56,6 @@ const navigation: NavSection[] = [ title: 'API Reference', items: [ { title: 'Overview', href: '/docs/api', icon: }, - { title: 'Authentication', href: '/docs/api/authentication', icon: }, { title: 'Repositories', href: '/docs/api/repositories', icon: }, { title: 'Search', href: '/docs/api/search', icon: }, { title: 'Analysis', href: '/docs/api/analysis', icon: }, @@ -69,15 +66,12 @@ const navigation: NavSection[] = [ items: [ { title: 'Docker Setup', href: '/docs/deployment/docker', icon: }, { title: 'Self-Hosting', href: '/docs/deployment/self-host', icon: }, - { title: 'Configuration', href: '/docs/deployment/configuration', icon: }, ], }, { title: 'Contributing', items: [ { title: 'Architecture', href: '/docs/architecture', icon: }, - { title: 'Development Setup', href: '/docs/contributing/setup', icon: }, - { title: 'Code Style Guide', href: '/docs/contributing/style', icon: }, ], }, ] From 1e0d07531098e461e884e67952de14421f4baf7f Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 18:24:17 -0500 Subject: [PATCH 08/33] fix(docs): correct API endpoint URLs to /api/v1 prefix - All API endpoints now correctly show /api/v1 prefix - Fixed impact endpoint: POST not GET, takes JSON body not query params - Fixed style endpoint: /style-analysis not /style - Updated all curl examples with correct URLs --- frontend/src/pages/api/APIAnalysisPage.tsx | 51 ++++++++----------- frontend/src/pages/api/APIOverviewPage.tsx | 14 +++-- .../src/pages/api/APIRepositoriesPage.tsx | 14 ++--- frontend/src/pages/api/APISearchPage.tsx | 6 +-- 4 files changed, 39 insertions(+), 46 deletions(-) diff --git a/frontend/src/pages/api/APIAnalysisPage.tsx b/frontend/src/pages/api/APIAnalysisPage.tsx index 8572a62..4558f0a 100644 --- a/frontend/src/pages/api/APIAnalysisPage.tsx +++ b/frontend/src/pages/api/APIAnalysisPage.tsx @@ -33,7 +33,7 @@ export function APIAnalysisPage() { GET - /api/repos/{'{repo_id}'}/dependencies + /api/v1/repos/{'{repo_id}'}/dependencies

@@ -73,44 +73,30 @@ export function APIAnalysisPage() {

Example

{`curl -H "Authorization: Bearer YOUR_API_KEY" \\ - http://localhost:8000/api/repos/repo_abc123/dependencies`} + http://localhost:8000/api/v1/repos/repo_abc123/dependencies`} {/* Impact Analysis */}

Impact Analysis

- - GET + + POST - /api/repos/{'{repo_id}'}/impact + /api/v1/repos/{'{repo_id}'}/impact

Analyze the impact of changing a specific file.

-

Query Parameters

-
- - - - - - - - - - - - - - - - - -
ParameterTypeRequiredDescription
filestringYesPath to the file to analyze
-
+

Request Body

+ +{`{ + "repo_id": "repo_abc123", + "file_path": "src/auth/middleware.py" +}`} +

Response

@@ -141,8 +127,11 @@ export function APIAnalysisPage() {

Example

-{`curl -H "Authorization: Bearer YOUR_API_KEY" \\ - "http://localhost:8000/api/repos/repo_abc123/impact?file=src/auth/middleware.py"`} +{`curl -X POST \\ + -H "Authorization: Bearer YOUR_API_KEY" \\ + -H "Content-Type: application/json" \\ + -d '{"repo_id": "repo_abc123", "file_path": "src/auth/middleware.py"}' \\ + http://localhost:8000/api/v1/repos/repo_abc123/impact`} {/* Code Style */} @@ -152,7 +141,7 @@ export function APIAnalysisPage() { GET - /api/repos/{'{repo_id}'}/style + /api/v1/repos/{'{repo_id}'}/style-analysis

@@ -191,7 +180,7 @@ export function APIAnalysisPage() { GET - /api/repos/{'{repo_id}'}/insights + /api/v1/repos/{'{repo_id}'}/insights

@@ -229,7 +218,7 @@ export function APIAnalysisPage() {

Example

{`curl -H "Authorization: Bearer YOUR_API_KEY" \\ - http://localhost:8000/api/repos/repo_abc123/insights`} + http://localhost:8000/api/v1/repos/repo_abc123/insights`} {`# Local development -http://localhost:8000/api +http://localhost:8000/api/v1 # Hosted version -https://api.opencodeintel.com/api`} +https://api.opencodeintel.com/api/v1`} +

+ The API is versioned. Current version is v1. +

+

Authentication

@@ -56,7 +60,7 @@ https://api.opencodeintel.com/api`} {`curl -H "Authorization: Bearer YOUR_API_KEY" \\ - http://localhost:8000/api/repos`} + http://localhost:8000/api/v1/repos`}

@@ -91,14 +95,14 @@ https://api.opencodeintel.com/api`} href="/docs/api/analysis" /> diff --git a/frontend/src/pages/api/APIRepositoriesPage.tsx b/frontend/src/pages/api/APIRepositoriesPage.tsx index 96e129f..0963c80 100644 --- a/frontend/src/pages/api/APIRepositoriesPage.tsx +++ b/frontend/src/pages/api/APIRepositoriesPage.tsx @@ -29,7 +29,7 @@ export function APIRepositoriesPage() { {/* List Repositories */}

List Repositories

- +

Returns all repositories accessible to your account.

@@ -54,12 +54,12 @@ export function APIRepositoriesPage() {

Example

{`curl -H "Authorization: Bearer YOUR_API_KEY" \\ - http://localhost:8000/api/repos`} + http://localhost:8000/api/v1/repos`} {/* Get Repository */}

Get Repository

- +

Get details for a specific repository.

@@ -89,7 +89,7 @@ export function APIRepositoriesPage() { {/* Add Repository */}

Add Repository

- +

Add a new repository for indexing.

@@ -117,12 +117,12 @@ export function APIRepositoriesPage() { -H "Authorization: Bearer YOUR_API_KEY" \\ -H "Content-Type: application/json" \\ -d '{"url": "https://github.com/user/my-project"}' \\ - http://localhost:8000/api/repos`} + http://localhost:8000/api/v1/repos`} {/* Delete Repository */}

Delete Repository

- +

Remove a repository and all its indexed data.

@@ -140,7 +140,7 @@ export function APIRepositoriesPage() { {/* Reindex Repository */}

Reindex Repository

- +

Trigger a fresh index of the repository. Use after major code changes.

diff --git a/frontend/src/pages/api/APISearchPage.tsx b/frontend/src/pages/api/APISearchPage.tsx index 0de8556..b53647f 100644 --- a/frontend/src/pages/api/APISearchPage.tsx +++ b/frontend/src/pages/api/APISearchPage.tsx @@ -33,7 +33,7 @@ export function APISearchPage() { POST - /api/search + /api/v1/search

@@ -163,7 +163,7 @@ export function APISearchPage() { -H "Authorization: Bearer YOUR_API_KEY" \\ -H "Content-Type: application/json" \\ -d '{"query": "error handling", "repo_id": "repo_abc123"}' \\ - http://localhost:8000/api/search`} + http://localhost:8000/api/v1/search`}

Search with Filters

@@ -178,7 +178,7 @@ export function APISearchPage() { "min_score": 0.7, "file_filter": "**/*.py" }' \\ - http://localhost:8000/api/search`} + http://localhost:8000/api/v1/search`} From 9d30050b3fea3eb02236b4328f6d015a72413f2f Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 18:28:25 -0500 Subject: [PATCH 09/33] feat(docs): add accurate Architecture and Contributing pages Architecture page includes: - Complete tech stack breakdown (backend + frontend) - Data flow diagrams for indexing and search pipelines - Backend services documentation - Frontend structure overview - MCP server explanation - Database schema overview - Emphasis on Bun requirement for frontend Contributing page includes: - Prerequisites with accurate versions - Local setup instructions (using Bun, not npm) - Test commands - Code style guidelines - PR process - Project structure reference --- frontend/src/App.tsx | 8 +- frontend/src/components/docs/DocsSidebar.tsx | 1 + frontend/src/pages/ArchitecturePage.tsx | 341 +++++++++++++++++++ frontend/src/pages/ContributingPage.tsx | 262 ++++++++++++++ 4 files changed, 609 insertions(+), 3 deletions(-) create mode 100644 frontend/src/pages/ArchitecturePage.tsx create mode 100644 frontend/src/pages/ContributingPage.tsx diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index a2b2a7b..2996b73 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -14,6 +14,8 @@ import { QuickStartPage } from './pages/QuickStartPage'; import { SemanticSearchPage, DependencyAnalysisPage, ImpactPredictionPage, CodeStyleAnalysisPage } from './pages/features'; import { DockerSetupPage, SelfHostingPage } from './pages/deployment'; import { APIOverviewPage, APIRepositoriesPage, APISearchPage, APIAnalysisPage } from './pages/api'; +import { ArchitecturePage } from './pages/ArchitecturePage'; +import { ContributingPage } from './pages/ContributingPage'; import { GitHubCallbackPage } from './pages/GitHubCallbackPage'; import { ScrollToTop } from './components/ScrollToTop'; @@ -94,9 +96,9 @@ function AppRoutes() { } /> } /> - {/* Placeholder routes for future docs pages */} - } /> - } /> + {/* Contributing pages */} + } /> + } /> }, + { title: 'Development Setup', href: '/docs/contributing', icon: }, ], }, ] diff --git a/frontend/src/pages/ArchitecturePage.tsx b/frontend/src/pages/ArchitecturePage.tsx new file mode 100644 index 0000000..c17c78b --- /dev/null +++ b/frontend/src/pages/ArchitecturePage.tsx @@ -0,0 +1,341 @@ +import { + DocsLayout, + DocsCodeBlock, + DocsCallout, + DocsPagination, + TimeEstimate, + TOCItem +} from '@/components/docs' + +const tocItems: TOCItem[] = [ + { id: 'overview', title: 'Overview', level: 2 }, + { id: 'tech-stack', title: 'Tech Stack', level: 2 }, + { id: 'data-flow', title: 'Data Flow', level: 2 }, + { id: 'backend-services', title: 'Backend Services', level: 2 }, + { id: 'frontend-structure', title: 'Frontend Structure', level: 2 }, + { id: 'mcp-server', title: 'MCP Server', level: 2 }, + { id: 'database-schema', title: 'Database Schema', level: 2 }, +] + +export function ArchitecturePage() { + return ( + +
+
+ +
+

Architecture

+

+ How OpenCodeIntel is built. Technical deep-dive for contributors. +

+
+ +

Overview

+ +

+ OpenCodeIntel is a monorepo with three main components: a FastAPI backend, + a React frontend, and a standalone MCP server. The backend handles code indexing, + semantic search, and analysis. The frontend provides the dashboard UI. The MCP + server exposes tools to AI assistants like Claude. +

+ + +{`opencodeintel/ +├── backend/ # FastAPI API server (Python 3.11+) +├── frontend/ # React dashboard (TypeScript, Vite, Bun) +├── mcp-server/ # MCP protocol server (Python) +├── supabase/ # Database migrations +├── docs/ # Additional documentation +└── docker-compose.yml`} + + +

Tech Stack

+ +

Backend

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ComponentTechnologyPurpose
FrameworkFastAPIAsync REST API with automatic OpenAPI docs
RuntimePython 3.11+Required for tree-sitter bindings
Code ParsingTree-sitterAST extraction for Python, JS, TS
EmbeddingsOpenAI text-embedding-3-small1536-dim vectors for semantic search
SummariesGPT-4o-miniNatural language code descriptions
Vector DBPineconeServerless vector storage and search
CacheRedisQuery caching, rate limiting
DatabaseSupabase (PostgreSQL)User data, repo metadata, API keys
AuthSupabase AuthJWT-based authentication
RerankingCohere (optional)Improves search result ordering
+
+ +

Frontend

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ComponentTechnologyPurpose
FrameworkReact 18UI framework
LanguageTypeScriptType safety
Build ToolViteFast dev server and bundling
Package ManagerBunFast installs (do NOT use npm)
StylingTailwind CSSUtility-first CSS
Componentsshadcn/ui + RadixAccessible component primitives
Data FetchingTanStack QueryCaching, background refetch
RoutingReact Router v7Client-side navigation
Graph VisualizationReact Flow + DagreDependency graph rendering
+
+ + + The frontend uses Bun exclusively. Never use npm or yarn. + Always run bun install, not npm install. + + +

Data Flow

+ +

Indexing Pipeline

+

When a repository is added:

+ + +{`1. Clone repo to backend/repos/{uuid}/ +2. Walk file tree, filter by language (Python, JS, TS) +3. For each file: + a. Parse with Tree-sitter → Extract functions/classes + b. Generate summary with GPT-4o-mini + c. Create embedding with text-embedding-3-small + d. Store in Pinecone with metadata +4. Build dependency graph from import statements +5. Cache graph in Redis +6. Update repo status in Supabase`} + + +

Search Pipeline

+ +{`1. Receive query from user/MCP +2. Check Redis cache for identical query +3. If miss: + a. Embed query with text-embedding-3-small + b. Query Pinecone for top-k similar chunks + c. (Optional) Rerank with Cohere + d. Cache results in Redis (5 min TTL) +4. Return formatted results`} + + +

Backend Services

+ +

+ Key services in backend/services/: +

+ +
+ + + + + + +
+ +

API Routes

+

+ Routes in backend/routes/. + All prefixed with /api/v1: +

+ + +{`repos.py → /api/v1/repos/* # CRUD for repositories +search.py → /api/v1/search # Semantic search +analysis.py → /api/v1/repos/{id}/* # Dependencies, impact, style, DNA +auth.py → /api/v1/auth/* # Login, signup, session +github.py → /api/v1/github/* # GitHub OAuth, repo import +health.py → /health # Health check (no prefix)`} + + +

Frontend Structure

+ + +{`frontend/src/ +├── components/ +│ ├── ui/ # shadcn/ui primitives +│ ├── docs/ # Documentation components +│ ├── dashboard/ # Dashboard-specific components +│ ├── landing/ # Landing page components +│ └── DependencyGraph/ # React Flow graph components +├── pages/ # Route components +├── contexts/ # React contexts (AuthContext) +├── hooks/ # Custom hooks +├── services/ # API client +├── lib/ # Utilities +└── config/ # App configuration`} + + +

MCP Server

+ +

+ The MCP server (mcp-server/server.py) + is a standalone Python process that exposes 7 tools to AI assistants: +

+ + +{`# Tools exposed via MCP protocol +search_code # Semantic code search +list_repositories # List indexed repos +get_dependency_graph # File dependency graph +analyze_code_style # Team coding conventions +analyze_impact # Change impact analysis +get_repository_insights # High-level repo metrics +get_codebase_dna # Architectural patterns`} + + +

+ The MCP server is a thin proxy - it forwards requests to the FastAPI backend + and formats responses for AI consumption. It uses httpx for + async HTTP calls and the mcp library + for protocol handling. +

+ +

Database Schema

+ +

+ Supabase tables (see supabase/migrations/): +

+ + +{`-- Core tables in codeintel schema +codeintel.repositories # Repo metadata, status, user_id +codeintel.api_keys # User API keys for programmatic access +codeintel.user_limits # Rate limits and quotas per user + +-- Auth handled by Supabase Auth (auth.users) +-- Row Level Security (RLS) enforces user isolation`} + + + + Vector embeddings are stored in Pinecone, not PostgreSQL. + This allows efficient similarity search at scale. + + + +
+ ) +} + +function ServiceCard({ name, description }: { name: string; description: string }) { + return ( +
+

{name}

+

{description}

+
+ ) +} diff --git a/frontend/src/pages/ContributingPage.tsx b/frontend/src/pages/ContributingPage.tsx new file mode 100644 index 0000000..4961068 --- /dev/null +++ b/frontend/src/pages/ContributingPage.tsx @@ -0,0 +1,262 @@ +import { + DocsLayout, + DocsCodeBlock, + DocsCallout, + DocsPrerequisites, + DocsPagination, + TimeEstimate, + Step, + StepList, + TOCItem +} from '@/components/docs' + +const tocItems: TOCItem[] = [ + { id: 'prerequisites', title: 'Prerequisites', level: 2 }, + { id: 'local-setup', title: 'Local Setup', level: 2 }, + { id: 'running-tests', title: 'Running Tests', level: 2 }, + { id: 'code-style', title: 'Code Style', level: 2 }, + { id: 'pull-requests', title: 'Pull Requests', level: 2 }, + { id: 'project-structure', title: 'Project Structure', level: 2 }, +] + +export function ContributingPage() { + return ( + +
+
+ +
+

Contributing

+

+ How to set up your development environment and contribute to OpenCodeIntel. +

+
+ +

Prerequisites

+ + + + + The frontend uses Bun exclusively. Do NOT use npm or yarn. + If you don't have Bun, install it: curl -fsSL https://bun.sh/install | bash + + +

Local Setup

+ + + + +{`git clone https://github.com/YOUR_USERNAME/opencodeintel.git +cd opencodeintel`} + + + + + +{`cd backend +python -m venv venv +source venv/bin/activate # Windows: venv\\Scripts\\activate +pip install -r requirements.txt + +# Configure environment +cp .env.example .env +# Edit .env and add your API keys: +# - OPENAI_API_KEY +# - PINECONE_API_KEY +# - PINECONE_INDEX_NAME`} + + + + + +{`cd ../frontend +bun install # NOT npm install! + +# Configure environment +cp .env.example .env`} + + + + +

Option A: Run services individually

+ +{`# Terminal 1: Backend +cd backend +source venv/bin/activate +uvicorn main:app --reload --port 8000 + +# Terminal 2: Frontend +cd frontend +bun run dev`} + + +

Option B: Use Docker Compose

+ +{`docker compose up -d`} + +
+ + + + +
+ +

Running Tests

+ +

Backend Tests

+ +{`cd backend +source venv/bin/activate + +# Run all tests +pytest tests/ -v + +# Run with coverage +pytest tests/ -v --cov=services --cov-report=term-missing + +# Run specific test file +pytest tests/test_validation.py -v + +# Run tests matching a pattern +pytest tests/ -v -k "test_search"`} + + +

Frontend Type Check

+ +{`cd frontend +bun run build # Build check +bun run typecheck # TypeScript only`} + + + + Tests use mocked external services (OpenAI, Pinecone, Supabase). + See backend/tests/conftest.py for mock setup. + + +

Code Style

+ +

Python (Backend)

+
    +
  • Follow PEP 8
  • +
  • Use type hints for function signatures
  • +
  • Max line length: 120 characters
  • +
  • Use async/await for I/O operations
  • +
  • Docstrings for public functions
  • +
+ + +{`# Lint check +flake8 services/ --max-line-length=120`} + + +

TypeScript (Frontend)

+
    +
  • TypeScript strict mode enabled
  • +
  • Prefer functional components with hooks
  • +
  • Use Tailwind for styling (no CSS files)
  • +
  • Prefer shadcn/ui components over custom UI
  • +
  • No any types without justification
  • +
+ +

Commit Messages

+

Use conventional commits:

+ +{`feat: add new feature +fix: bug fix +docs: documentation changes +refactor: code restructuring +test: adding tests +chore: maintenance tasks`} + + +

Pull Requests

+ +

Before Submitting

+
    +
  • Create an issue first to discuss the approach
  • +
  • Fork the repo and create a feature branch
  • +
  • Write tests for new functionality
  • +
  • Ensure all tests pass: pytest tests/ -v
  • +
  • Update documentation if needed
  • +
+ +

PR Guidelines

+
    +
  • Keep changes focused (one feature/fix per PR)
  • +
  • Write clear commit messages
  • +
  • Reference the issue number in the PR description
  • +
  • Add tests for new code
  • +
  • Respond to review feedback promptly
  • +
+ +

Branch Naming

+ +{`feature/add-rust-support +fix/search-cache-bug +docs/update-api-reference +refactor/simplify-indexer`} + + +

Project Structure

+ + +{`opencodeintel/ +├── backend/ +│ ├── main.py # FastAPI app entry point +│ ├── routes/ # API route handlers +│ ├── services/ # Business logic +│ ├── middleware/ # Auth, rate limiting +│ ├── tests/ # pytest test suite +│ ├── config/ # API versioning config +│ └── requirements.txt # Python dependencies +│ +├── frontend/ +│ ├── src/ +│ │ ├── components/ # React components +│ │ ├── pages/ # Route pages +│ │ ├── hooks/ # Custom hooks +│ │ ├── contexts/ # React contexts +│ │ └── services/ # API client +│ ├── package.json # Dependencies +│ └── bun.lock # Bun lockfile (NOT package-lock.json) +│ +├── mcp-server/ +│ ├── server.py # MCP protocol implementation +│ └── config.py # API URL config +│ +├── supabase/ +│ └── migrations/ # Database schema +│ +├── docker-compose.yml # Local development stack +├── Makefile # Common commands +└── CONTRIBUTING.md # This guide (markdown version)`} + + + + Use make commands for common tasks: + make f - Rebuild frontend + make b - Rebuild backend + make logs - View frontend logs + + + +
+ ) +} From ddf05346fbfb52141cbf4d2fc8468039ffb77de9 Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 18:41:16 -0500 Subject: [PATCH 10/33] fix: update CONTRIBUTING.md to use Bun instead of npm - Changed npm install to bun install - Changed npm run build to bun run build - Added explicit warning about using Bun exclusively --- CONTRIBUTING.md | 9 ++++++--- README.md | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 11f7191..6d16b96 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,15 +17,18 @@ pip install -r requirements.txt cp .env.example .env # Add your API keys to .env -# Set up frontend +# Set up frontend (MUST use Bun, not npm!) cd ../frontend -npm install +bun install # Run tests cd ../backend pytest tests/ -v ``` +> **Important:** The frontend uses Bun exclusively. Do NOT use npm or yarn. +> Install Bun: `curl -fsSL https://bun.sh/install | bash` + ## How to Contribute ### Reporting Bugs @@ -65,7 +68,7 @@ pytest tests/ -v - Use TypeScript strict mode - Prefer functional components - Use Tailwind for styling -- Run: `npm run build` to check for errors +- Run: `bun run build` to check for errors ## Testing diff --git a/README.md b/README.md index c915d3a..4b6301e 100644 --- a/README.md +++ b/README.md @@ -123,9 +123,9 @@ python -m venv venv && source venv/bin/activate pip install -r requirements.txt python main.py -# Frontend (new terminal) +# Frontend (new terminal) - MUST use Bun! cd frontend -npm install && npm run dev +bun install && bun run dev ``` From e8b5a4ea1fcec4ba4db23f7b628c7426861c5dcf Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 18:41:38 -0500 Subject: [PATCH 11/33] fix(docs): correct pagination flow from Self-Hosting to API Overview MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Navigation now flows correctly through all sections: Getting Started → MCP → Features → Deployment → API Reference → Contributing --- frontend/src/pages/deployment/SelfHostingPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/deployment/SelfHostingPage.tsx b/frontend/src/pages/deployment/SelfHostingPage.tsx index d30c62b..9a4bdcc 100644 --- a/frontend/src/pages/deployment/SelfHostingPage.tsx +++ b/frontend/src/pages/deployment/SelfHostingPage.tsx @@ -216,7 +216,7 @@ docker compose -f docker-compose.prod.yml up -d ) From 158441d4d5f93b761c0c609af8905ab3cc3328e8 Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 19:05:58 -0500 Subject: [PATCH 12/33] fix: remove emojis from Makefile --- Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 3b0d88d..bf57580 100644 --- a/Makefile +++ b/Makefile @@ -5,16 +5,16 @@ # Default target - rebuild frontend f frontend: - @echo "🔄 Rebuilding frontend..." + @echo "Rebuilding frontend..." @docker compose build frontend @docker compose up -d frontend - @echo "✅ Done" + @echo "Done" b backend: - @echo "🔄 Rebuilding backend..." + @echo "Rebuilding backend..." @docker compose build backend @docker compose up -d backend - @echo "✅ Done" + @echo "Done" all: @docker compose build @@ -39,7 +39,7 @@ status ps: @docker compose ps clean: - @echo "⚠️ Full rebuild (slow)..." + @echo "Full rebuild (slow)..." @docker compose build --no-cache @docker compose up -d From 6ef5061f84c5060185d67759a3080e30063b5725 Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 22:30:25 -0500 Subject: [PATCH 13/33] fix: remove duplicate DocsRelated and DocsPagination from DocsCards.tsx Keep single source of truth in DocsRelated.tsx --- CLAUDE.md | 59 ++++++++++++++ frontend/src/components/docs/DocsCards.tsx | 93 ---------------------- 2 files changed, 59 insertions(+), 93 deletions(-) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..aa6742d --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,59 @@ +# CodeIntel Development Rules + +## Code Style + +### General +- NO emojis anywhere - not in code, comments, docs, or commit messages +- Files must stay under 200 lines. Split if larger. +- Comments explain WHY, not WHAT. One-liners only. +- No decorative headers, no JSDoc blocks, no ASCII art +- Casual tone in comments - write like a human, not a robot + +### Frontend (TypeScript/React) +- Package manager: **Bun only**. Never npm, never yarn. +- Always `bun install`, `bun run dev`, `bun run build` +- Never delete `bun.lock` or create `package-lock.json` +- Use shadcn/ui components over custom UI +- Tailwind for styling, no CSS files +- Functional components with hooks, no class components + +### Backend (Python) +- Python 3.11+ required +- Type hints on all function signatures +- Async/await for I/O operations +- PEP 8 style, max 120 char lines +- Use existing patterns from `services/` directory + +### Commits +- Format: `type: description` (e.g., `fix: remove broken link`) +- Types: feat, fix, docs, refactor, test, chore +- No emojis in commit messages +- Keep commits focused - one change per commit + +## Architecture + +### Project Structure +``` +backend/ # FastAPI, Python 3.11+ +frontend/ # React 18, TypeScript, Vite, Bun +mcp-server/ # MCP protocol server +``` + +### API Versioning +- All endpoints use `/api/v1/` prefix +- Version config in `backend/config/api.py` + +### Key Services +- `indexer_optimized.py` - Code parsing and embedding +- `dependency_analyzer.py` - Import graph extraction +- `style_analyzer.py` - Convention detection +- `dna_extractor.py` - Architectural pattern extraction + +## What NOT to Do + +- Don't use npm (use Bun) +- Don't add emojis +- Don't write verbose comments +- Don't create files over 200 lines +- Don't add "AI-looking" badges or decorations +- Don't use JSDoc or decorative comment blocks diff --git a/frontend/src/components/docs/DocsCards.tsx b/frontend/src/components/docs/DocsCards.tsx index 79868d6..10b0d7a 100644 --- a/frontend/src/components/docs/DocsCards.tsx +++ b/frontend/src/components/docs/DocsCards.tsx @@ -1,99 +1,6 @@ import { Link } from 'react-router-dom' -import { ArrowRight, ChevronLeft, ChevronRight } from 'lucide-react' import { cn } from '@/lib/utils' -interface RelatedDoc { - title: string - description: string - href: string - icon?: React.ReactNode -} - -interface DocsRelatedProps { - items: RelatedDoc[] - title?: string -} - -export function DocsRelated({ items, title = 'Related Documentation' }: DocsRelatedProps) { - if (items.length === 0) return null - - return ( -
-

{title}

-
- {items.map((item) => ( - - {item.icon && ( - - {item.icon} - - )} -
-

- {item.title} - -

-

- {item.description} -

-
- - ))} -
-
- ) -} - -interface DocsNavLink { - title: string - href: string -} - -interface DocsPaginationProps { - prev?: DocsNavLink - next?: DocsNavLink -} - -export function DocsPagination({ prev, next }: DocsPaginationProps) { - return ( -
- {prev ? ( - - -
- Previous - {prev.title} -
- - ) : ( -
- )} - - {next ? ( - -
- Next - {next.title} -
- - - ) : ( -
- )} -
- ) -} - interface DocsCardProps { title: string description: string From ea22776efb17e591a3fbe7d26eef8041cb103083 Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 22:30:47 -0500 Subject: [PATCH 14/33] fix: wrap clipboard API calls in try/catch in DocsCodeBlock --- .../src/components/docs/DocsCodeBlock.tsx | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/docs/DocsCodeBlock.tsx b/frontend/src/components/docs/DocsCodeBlock.tsx index d6fbfe7..c6d6277 100644 --- a/frontend/src/components/docs/DocsCodeBlock.tsx +++ b/frontend/src/components/docs/DocsCodeBlock.tsx @@ -23,9 +23,13 @@ export function DocsCodeBlock({ const [copied, setCopied] = useState(false) const copyToClipboard = async () => { - await navigator.clipboard.writeText(children.trim()) - setCopied(true) - setTimeout(() => setCopied(false), 2000) + try { + await navigator.clipboard.writeText(children.trim()) + setCopied(true) + setTimeout(() => setCopied(false), 2000) + } catch { + // Clipboard API failed, silently ignore + } } return ( @@ -97,10 +101,14 @@ export function DocsCodeTabs({ tabs, filename }: CodeTabsProps) { const [activeTab, setActiveTab] = useState(tabs[0]?.label || '') const copyToClipboard = async () => { - const activeCode = tabs.find(t => t.label === activeTab)?.code || '' - await navigator.clipboard.writeText(activeCode.trim()) - setCopied(true) - setTimeout(() => setCopied(false), 2000) + try { + const activeCode = tabs.find(t => t.label === activeTab)?.code || '' + await navigator.clipboard.writeText(activeCode.trim()) + setCopied(true) + setTimeout(() => setCopied(false), 2000) + } catch { + // Clipboard API failed, silently ignore + } } return ( From 9d17802b8697f152f99ddfe37847b9eeae7baf3d Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 22:33:05 -0500 Subject: [PATCH 15/33] fix: consolidate imports and add missing mobile nav sections in DocsLayout - Move useLocation and cn imports to top of file - Add API Reference section to mobile navigation - Add Contributing section (Architecture, Development Setup) --- frontend/src/components/docs/DocsLayout.tsx | 22 +++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/docs/DocsLayout.tsx b/frontend/src/components/docs/DocsLayout.tsx index 26231d7..2b8c096 100644 --- a/frontend/src/components/docs/DocsLayout.tsx +++ b/frontend/src/components/docs/DocsLayout.tsx @@ -1,4 +1,5 @@ import { useState } from 'react' +import { Link, useLocation } from 'react-router-dom' import { DocsSidebar } from './DocsSidebar' import { DocsBreadcrumb } from './DocsBreadcrumb' import { DocsTableOfContents, TOCItem } from './DocsTableOfContents' @@ -6,7 +7,7 @@ import { DocsSearch } from './DocsSearch' import { ScrollArea } from '@/components/ui/scroll-area' import { Sheet, SheetContent, SheetTrigger } from '@/components/ui/sheet' import { Menu, BookOpen } from 'lucide-react' -import { Link } from 'react-router-dom' +import { cn } from '@/lib/utils' interface DocsLayoutProps { children: React.ReactNode @@ -104,9 +105,6 @@ function MobileSidebar({ onNavigate }: { onNavigate: () => void }) { } // Mobile navigation items -import { useLocation } from 'react-router-dom' -import { cn } from '@/lib/utils' - const mobileNavigation = [ { title: 'Getting Started', @@ -139,6 +137,22 @@ const mobileNavigation = [ { title: 'Self-Hosting', href: '/docs/deployment/self-host' }, ], }, + { + title: 'API Reference', + items: [ + { title: 'Overview', href: '/docs/api' }, + { title: 'Repositories', href: '/docs/api/repositories' }, + { title: 'Search', href: '/docs/api/search' }, + { title: 'Analysis', href: '/docs/api/analysis' }, + ], + }, + { + title: 'Contributing', + items: [ + { title: 'Architecture', href: '/docs/architecture' }, + { title: 'Development Setup', href: '/docs/contributing' }, + ], + }, ] function MobileNavigation({ onNavigate }: { onNavigate: () => void }) { From 04877dd2c4b9cf4b97a755ba630fff5df878ebeb Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 22:34:59 -0500 Subject: [PATCH 16/33] fix: remove duplicate badge and prerequisites from DocsPageHeader Use canonical TimeEstimate and DifficultyBadge from DocsBadges. DocsPrerequisites already exists in DocsPrerequisites.tsx. --- .../src/components/docs/DocsPageHeader.tsx | 91 +------------------ 1 file changed, 3 insertions(+), 88 deletions(-) diff --git a/frontend/src/components/docs/DocsPageHeader.tsx b/frontend/src/components/docs/DocsPageHeader.tsx index 823145e..5622701 100644 --- a/frontend/src/components/docs/DocsPageHeader.tsx +++ b/frontend/src/components/docs/DocsPageHeader.tsx @@ -1,48 +1,4 @@ -import { Clock, BookOpen, CheckCircle } from 'lucide-react' -import { Badge } from '@/components/ui/badge' -import { cn } from '@/lib/utils' - -interface DocsTimeEstimateProps { - minutes: number - className?: string -} - -export function DocsTimeEstimate({ minutes, className }: DocsTimeEstimateProps) { - return ( - - - {minutes} min read - - ) -} - -interface DocsDifficultyProps { - level: 'beginner' | 'intermediate' | 'advanced' - className?: string -} - -export function DocsDifficulty({ level, className }: DocsDifficultyProps) { - const config = { - beginner: { label: 'Beginner', color: 'bg-green-500/10 text-green-400 border-green-500/30' }, - intermediate: { label: 'Intermediate', color: 'bg-yellow-500/10 text-yellow-400 border-yellow-500/30' }, - advanced: { label: 'Advanced', color: 'bg-red-500/10 text-red-400 border-red-500/30' }, - } - - const { label, color } = config[level] - - return ( - - - {label} - - ) -} +import { TimeEstimate, DifficultyBadge } from './DocsBadges' interface DocsPageHeaderProps { title: string @@ -73,51 +29,10 @@ export function DocsPageHeader({ {(timeEstimate || difficulty) && (
- {timeEstimate && } - {difficulty && } + {timeEstimate && } + {difficulty && }
)}
) } - -interface Prerequisite { - text: string - href?: string - completed?: boolean -} - -interface DocsPrerequisitesProps { - items: Prerequisite[] -} - -export function DocsPrerequisites({ items }: DocsPrerequisitesProps) { - return ( -
-

- - Prerequisites -

-
    - {items.map((item, index) => ( -
  • - - {item.href ? ( - - {item.text} - - ) : ( - {item.text} - )} -
  • - ))} -
-
- ) -} From 563c2a222eb7afef98050581420cbdcaa844ca03 Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 22:36:13 -0500 Subject: [PATCH 17/33] fix: add missing pages to DocsSearch index Add API Reference (Overview, Repositories, Search, Analysis) and Contributing (Architecture, Development Setup) to search results --- frontend/src/components/docs/DocsSearch.tsx | 46 +++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/frontend/src/components/docs/DocsSearch.tsx b/frontend/src/components/docs/DocsSearch.tsx index 0363990..68df7d1 100644 --- a/frontend/src/components/docs/DocsSearch.tsx +++ b/frontend/src/components/docs/DocsSearch.tsx @@ -114,6 +114,52 @@ const docsPages: DocPage[] = [ icon: , category: 'Deployment' }, + + // API Reference + { + title: 'API Overview', + href: '/docs/api', + description: 'REST API introduction', + icon: , + category: 'API Reference' + }, + { + title: 'Repositories API', + href: '/docs/api/repositories', + description: 'Manage indexed repositories', + icon: , + category: 'API Reference' + }, + { + title: 'Search API', + href: '/docs/api/search', + description: 'Semantic code search', + icon: , + category: 'API Reference' + }, + { + title: 'Analysis API', + href: '/docs/api/analysis', + description: 'Dependencies, impact, style', + icon: , + category: 'API Reference' + }, + + // Contributing + { + title: 'Architecture', + href: '/docs/architecture', + description: 'System design and tech stack', + icon: , + category: 'Contributing' + }, + { + title: 'Development Setup', + href: '/docs/contributing', + description: 'Local dev environment', + icon: , + category: 'Contributing' + }, ] export function DocsSearch() { From df7dcd72f9449477c0861609fd2e01ad74a858cf Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 22:38:04 -0500 Subject: [PATCH 18/33] fix: use exact path matching for isActive in sidebar navigation Prevents parent routes from highlighting on child pages --- frontend/src/components/docs/DocsLayout.tsx | 3 +-- frontend/src/components/docs/DocsSidebar.tsx | 5 +---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/docs/DocsLayout.tsx b/frontend/src/components/docs/DocsLayout.tsx index 2b8c096..7878bc9 100644 --- a/frontend/src/components/docs/DocsLayout.tsx +++ b/frontend/src/components/docs/DocsLayout.tsx @@ -159,8 +159,7 @@ function MobileNavigation({ onNavigate }: { onNavigate: () => void }) { const location = useLocation() const isActive = (href: string) => { - if (href === '/docs') return location.pathname === '/docs' - return location.pathname.startsWith(href) + return location.pathname === href } return ( diff --git a/frontend/src/components/docs/DocsSidebar.tsx b/frontend/src/components/docs/DocsSidebar.tsx index 365e42b..8cf81c2 100644 --- a/frontend/src/components/docs/DocsSidebar.tsx +++ b/frontend/src/components/docs/DocsSidebar.tsx @@ -81,10 +81,7 @@ export function DocsSidebar() { const location = useLocation() const isActive = (href: string) => { - if (href === '/docs') { - return location.pathname === '/docs' - } - return location.pathname.startsWith(href) + return location.pathname === href } return ( From 1e7225757a321a11178370aee0aa6e95e264ba4d Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 23:17:58 -0500 Subject: [PATCH 19/33] fix: connector line now hides on last Step using parent selector --- frontend/src/components/docs/DocsSteps.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/docs/DocsSteps.tsx b/frontend/src/components/docs/DocsSteps.tsx index 59651a5..24defc1 100644 --- a/frontend/src/components/docs/DocsSteps.tsx +++ b/frontend/src/components/docs/DocsSteps.tsx @@ -8,9 +8,9 @@ interface StepProps { export function Step({ number, title, children }: StepProps) { return ( -
+
{/* Vertical line connecting steps */} -
+
{/* Step number */}
From d0aa0a6f1c8485028965b991a62f5ee0eee4f26b Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 23:18:42 -0500 Subject: [PATCH 20/33] fix: remove repo_id from impact endpoint request body example repo_id is taken from the URL path, not the body --- frontend/src/pages/api/APIAnalysisPage.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/src/pages/api/APIAnalysisPage.tsx b/frontend/src/pages/api/APIAnalysisPage.tsx index 4558f0a..775267a 100644 --- a/frontend/src/pages/api/APIAnalysisPage.tsx +++ b/frontend/src/pages/api/APIAnalysisPage.tsx @@ -93,7 +93,6 @@ export function APIAnalysisPage() {

Request Body

{`{ - "repo_id": "repo_abc123", "file_path": "src/auth/middleware.py" }`} @@ -130,7 +129,7 @@ export function APIAnalysisPage() { {`curl -X POST \\ -H "Authorization: Bearer YOUR_API_KEY" \\ -H "Content-Type: application/json" \\ - -d '{"repo_id": "repo_abc123", "file_path": "src/auth/middleware.py"}' \\ + -d '{"file_path": "src/auth/middleware.py"}' \\ http://localhost:8000/api/v1/repos/repo_abc123/impact`} From 2b84b1ab3e7d19f23920d5b50ed9e222e7699cf6 Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 23:19:11 -0500 Subject: [PATCH 21/33] fix: remove JS comment from JSON example in APIRepositoriesPage Moved explanation to paragraph below for valid copy-paste JSON --- frontend/src/pages/api/APIRepositoriesPage.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/pages/api/APIRepositoriesPage.tsx b/frontend/src/pages/api/APIRepositoriesPage.tsx index 0963c80..2e45f87 100644 --- a/frontend/src/pages/api/APIRepositoriesPage.tsx +++ b/frontend/src/pages/api/APIRepositoriesPage.tsx @@ -97,9 +97,10 @@ export function APIRepositoriesPage() { {`{ "url": "https://github.com/user/my-project", - "branch": "main" // optional, defaults to default branch + "branch": "main" }`} +

The branch field is optional and defaults to the repository's default branch.

Response

From 7e1516e003111f30383493b30419b30b6aef3494 Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 23:19:43 -0500 Subject: [PATCH 22/33] fix: correct API URL in CodeStyleAnalysisPage to /api/v1/repos/{id}/style-analysis --- frontend/src/pages/features/CodeStyleAnalysisPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/features/CodeStyleAnalysisPage.tsx b/frontend/src/pages/features/CodeStyleAnalysisPage.tsx index 03d62f5..e2cccfb 100644 --- a/frontend/src/pages/features/CodeStyleAnalysisPage.tsx +++ b/frontend/src/pages/features/CodeStyleAnalysisPage.tsx @@ -86,7 +86,7 @@ export function CodeStyleAnalysisPage() {

Via API

-{`curl "http://localhost:8000/api/repos/{repo_id}/style"`} +{`curl "http://localhost:8000/api/v1/repos/{repo_id}/style-analysis"`}

API Response

From b5d304145e33a9659c07b11626dd954a30e73047 Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 23:20:14 -0500 Subject: [PATCH 23/33] fix: correct API URL in DependencyAnalysisPage to /api/v1 --- frontend/src/pages/features/DependencyAnalysisPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/features/DependencyAnalysisPage.tsx b/frontend/src/pages/features/DependencyAnalysisPage.tsx index c37638a..c571a61 100644 --- a/frontend/src/pages/features/DependencyAnalysisPage.tsx +++ b/frontend/src/pages/features/DependencyAnalysisPage.tsx @@ -88,7 +88,7 @@ export function DependencyAnalysisPage() {

Via API

-{`curl "http://localhost:8000/api/repos/{repo_id}/dependencies"`} +{`curl "http://localhost:8000/api/v1/repos/{repo_id}/dependencies"`}

Via Dashboard

From 61ded4f1382a2e961a858f626f16a24a6e668765 Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 23:20:59 -0500 Subject: [PATCH 24/33] fix: correct impact API example to POST with /api/v1 and JSON body --- frontend/src/pages/features/ImpactPredictionPage.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/pages/features/ImpactPredictionPage.tsx b/frontend/src/pages/features/ImpactPredictionPage.tsx index fda64d0..d05e698 100644 --- a/frontend/src/pages/features/ImpactPredictionPage.tsx +++ b/frontend/src/pages/features/ImpactPredictionPage.tsx @@ -96,7 +96,10 @@ export function ImpactPredictionPage() {

Via API

-{`curl "http://localhost:8000/api/repos/{repo_id}/impact?file=src/auth/middleware.py"`} +{`curl -X POST \\ + -H "Content-Type: application/json" \\ + -d '{"file_path": "src/auth/middleware.py"}' \\ + http://localhost:8000/api/v1/repos/{repo_id}/impact`}

Via Dashboard

From 7a0d98e3902326a241d65461ac1cc851d0a6693f Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 23:22:18 -0500 Subject: [PATCH 25/33] fix: correct search API URL in SemanticSearchPage to /api/v1/search --- frontend/src/pages/features/SemanticSearchPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/features/SemanticSearchPage.tsx b/frontend/src/pages/features/SemanticSearchPage.tsx index 7b8a15c..a82abaf 100644 --- a/frontend/src/pages/features/SemanticSearchPage.tsx +++ b/frontend/src/pages/features/SemanticSearchPage.tsx @@ -71,7 +71,7 @@ export function SemanticSearchPage() {

Via API

-{`curl -X POST "http://localhost:8000/api/search" \\ +{`curl -X POST "http://localhost:8000/api/v1/search" \\ -H "Content-Type: application/json" \\ -d '{ "repo_id": "your-repo-id", From f429aa13fa88c96e17757677d2bc3634ebeefc26 Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sat, 14 Feb 2026 23:23:10 -0500 Subject: [PATCH 26/33] fix: change prerequisites from Node.js to Bun in QuickStartPage --- frontend/src/pages/QuickStartPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/QuickStartPage.tsx b/frontend/src/pages/QuickStartPage.tsx index c46dcbf..2687f87 100644 --- a/frontend/src/pages/QuickStartPage.tsx +++ b/frontend/src/pages/QuickStartPage.tsx @@ -151,7 +151,7 @@ PINECONE_INDEX_NAME=codeintel`} Date: Sun, 15 Feb 2026 01:04:08 -0500 Subject: [PATCH 27/33] fix: relax CLAUDE.md rules and add code fence language - Changed 200-line limit from hard rule to guidance - Added JSDoc policy section with approved files - Added large file exceptions with specific approved files - Added plaintext language to code fence - Removed overly restrictive 'no JSDoc' rule --- CLAUDE.md | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index aa6742d..03c5b27 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,11 +4,22 @@ ### General - NO emojis anywhere - not in code, comments, docs, or commit messages -- Files must stay under 200 lines. Split if larger. -- Comments explain WHY, not WHAT. One-liners only. -- No decorative headers, no JSDoc blocks, no ASCII art +- Prefer files under 200 lines. Larger files allowed when logically cohesive. +- Comments explain WHY, not WHAT. Keep them brief. +- No decorative headers or ASCII art - Casual tone in comments - write like a human, not a robot +### JSDoc Policy +- JSDoc allowed for public API functions and exported hooks +- Keep JSDoc minimal - document params and return types, not obvious behavior +- Approved files using JSDoc: `frontend/src/services/playground-api.ts`, `frontend/src/config/api.ts`, `frontend/src/hooks/useViewTransition.ts` + +### Large File Exceptions +These files exceed 200 lines but are approved due to logical cohesion: +- `backend/routes/playground.py` +- `backend/services/dna_extractor.py` +- `frontend/src/components/DependencyGraph/index.tsx` + ### Frontend (TypeScript/React) - Package manager: **Bun only**. Never npm, never yarn. - Always `bun install`, `bun run dev`, `bun run build` @@ -33,7 +44,7 @@ ## Architecture ### Project Structure -``` +```plaintext backend/ # FastAPI, Python 3.11+ frontend/ # React 18, TypeScript, Vite, Bun mcp-server/ # MCP protocol server @@ -54,6 +65,4 @@ mcp-server/ # MCP protocol server - Don't use npm (use Bun) - Don't add emojis - Don't write verbose comments -- Don't create files over 200 lines - Don't add "AI-looking" badges or decorations -- Don't use JSDoc or decorative comment blocks From dcb2254187c144e2b549a17019a5fe46faf802fa Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sun, 15 Feb 2026 11:33:54 -0500 Subject: [PATCH 28/33] fix: use explicit null check for timeEstimate in DocsPageHeader Falsy check would hide badge row when timeEstimate is 0 --- frontend/src/components/docs/DocsPageHeader.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/docs/DocsPageHeader.tsx b/frontend/src/components/docs/DocsPageHeader.tsx index 5622701..f2422a0 100644 --- a/frontend/src/components/docs/DocsPageHeader.tsx +++ b/frontend/src/components/docs/DocsPageHeader.tsx @@ -27,9 +27,9 @@ export function DocsPageHeader({

{description}

- {(timeEstimate || difficulty) && ( + {(timeEstimate != null || difficulty) && (
- {timeEstimate && } + {timeEstimate != null && } {difficulty && }
)} From 74b67c3e0b27c82562481ac1f6b715cd458ef3f4 Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sun, 15 Feb 2026 11:34:14 -0500 Subject: [PATCH 29/33] fix: hoist groupedPages to module scope in DocsSearch docsPages is constant, no need to recompute grouping on every render --- frontend/src/components/docs/DocsSearch.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/frontend/src/components/docs/DocsSearch.tsx b/frontend/src/components/docs/DocsSearch.tsx index 68df7d1..8fcd794 100644 --- a/frontend/src/components/docs/DocsSearch.tsx +++ b/frontend/src/components/docs/DocsSearch.tsx @@ -162,6 +162,15 @@ const docsPages: DocPage[] = [ }, ] +// Pre-compute grouped pages at module level since docsPages is constant +const groupedPages = docsPages.reduce((acc, page) => { + if (!acc[page.category]) { + acc[page.category] = [] + } + acc[page.category].push(page) + return acc +}, {} as Record) + export function DocsSearch() { const [open, setOpen] = useState(false) const navigate = useNavigate() @@ -183,15 +192,6 @@ export function DocsSearch() { command() }, []) - // Group pages by category - const groupedPages = docsPages.reduce((acc, page) => { - if (!acc[page.category]) { - acc[page.category] = [] - } - acc[page.category].push(page) - return acc - }, {} as Record) - return ( <> From ea2882fb481711b0d2ad4139c2105f53bbb22c53 Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Sun, 15 Feb 2026 11:44:59 -0500 Subject: [PATCH 33/33] docs: add DEFERRED.md to track skipped refactoring work --- DEFERRED.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 DEFERRED.md diff --git a/DEFERRED.md b/DEFERRED.md new file mode 100644 index 0000000..273f724 --- /dev/null +++ b/DEFERRED.md @@ -0,0 +1,36 @@ +# Deferred Work + +Items intentionally skipped for future PRs. + +--- + +## PR: feature/docs-overhaul + +### 1. Extract shared EndpointHeader component +**Priority:** Low +**Effort:** 30 min +**Files affected:** +- `frontend/src/pages/api/APIRepositoriesPage.tsx` +- `frontend/src/pages/api/APIAnalysisPage.tsx` +- `frontend/src/pages/api/APISearchPage.tsx` +- `frontend/src/pages/api/APIOverviewPage.tsx` + +**What:** All 4 API doc pages duplicate the endpoint header markup (colored method badge + path in bordered container). APIRepositoriesPage already has a local `EndpointHeader` component - extract it to `@/components/docs` and reuse. + +**Saves:** ~40 lines of duplication + +**When to do:** Next time any of these pages need changes, or during a cleanup sprint. + +--- + +### 2. Consolidate navigation data source +**Priority:** Medium +**Effort:** 1-2 hours +**Files affected:** +- `frontend/src/components/docs/DocsSidebar.tsx` (navigation) +- `frontend/src/components/docs/DocsSearch.tsx` (docsPages) +- `frontend/src/components/docs/DocsLayout.tsx` (mobileNavigation) + +**What:** Same page list maintained in 3 places. Adding a page requires updating all 3. Extract single `docsNavigation` data source and derive variants from it. + +**When to do:** Before adding more doc pages, or if someone forgets to update all 3.