github-to-mcp-monorepo 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +8 -0
- package/.github/CODEOWNERS +6 -0
- package/.husky/pre-commit +1 -0
- package/.nvmrc +1 -0
- package/.prettierignore +5 -0
- package/.prettierrc +7 -0
- package/.vscode/settings.json +4 -0
- package/ARCHITECTURE.md +1429 -0
- package/CHANGELOG.md +167 -0
- package/CONTRIBUTING.md +327 -0
- package/LICENSE +201 -0
- package/README.md +1028 -0
- package/SECURITY.md +248 -0
- package/VISUAL_GUIDE.md +437 -0
- package/apps/vscode/IMPLEMENTATION.md +480 -0
- package/apps/vscode/README.md +248 -0
- package/apps/vscode/package.json +381 -0
- package/apps/vscode/resources/icon.png +0 -0
- package/apps/vscode/resources/icon.svg +5 -0
- package/apps/vscode/src/commands/browseRegistry.ts +211 -0
- package/apps/vscode/src/commands/configureClaudeDesktop.ts +332 -0
- package/apps/vscode/src/commands/convert.ts +82 -0
- package/apps/vscode/src/commands/convertCurrentRepo.ts +109 -0
- package/apps/vscode/src/commands/convertFromUrl.ts +138 -0
- package/apps/vscode/src/commands/index.ts +121 -0
- package/apps/vscode/src/commands/validate.ts +197 -0
- package/apps/vscode/src/extension.ts +464 -0
- package/apps/vscode/src/global.d.ts +36 -0
- package/apps/vscode/src/test/extension.test.ts +73 -0
- package/apps/vscode/src/utils/file-generator.ts +529 -0
- package/apps/vscode/src/utils/github-api.ts +335 -0
- package/apps/vscode/src/utils/index.ts +29 -0
- package/apps/vscode/src/utils/mcp-config.ts +334 -0
- package/apps/vscode/src/utils/storage.ts +87 -0
- package/apps/vscode/src/views/McpServersTreeView.ts +160 -0
- package/apps/vscode/src/views/OutputChannelView.ts +195 -0
- package/apps/vscode/src/views/StatusBarItem.ts +251 -0
- package/apps/vscode/src/views/ToolsExplorerView.ts +314 -0
- package/apps/vscode/src/views/historyProvider.ts +75 -0
- package/apps/vscode/src/views/index.ts +12 -0
- package/apps/vscode/src/views/resultsPanel.ts +330 -0
- package/apps/vscode/src/webviews/ConversionPanel.ts +350 -0
- package/apps/vscode/src/webviews/ToolDetailsPanel.ts +448 -0
- package/apps/vscode/src/webviews/index.ts +9 -0
- package/apps/vscode/src/webviews/webview-ui/styles.ts +492 -0
- package/apps/vscode/tsconfig.json +20 -0
- package/apps/web/PLAYGROUND_GUIDE.md +499 -0
- package/apps/web/README.md +505 -0
- package/apps/web/app/api/convert/route.ts +100 -0
- package/apps/web/app/api/convert/stream/route.ts +198 -0
- package/apps/web/app/api/deploy/route.ts +157 -0
- package/apps/web/app/api/edge/route.ts +308 -0
- package/apps/web/app/api/export-docker/route.ts +284 -0
- package/apps/web/app/api/generate-openapi/route.ts +119 -0
- package/apps/web/app/api/mcp/[serverId]/route.ts +263 -0
- package/apps/web/app/api/playground/connect/route.ts +143 -0
- package/apps/web/app/api/playground/disconnect/route.ts +78 -0
- package/apps/web/app/api/playground/execute/route.ts +135 -0
- package/apps/web/app/api/playground/sessions/route.ts +103 -0
- package/apps/web/app/api/playground/tools/route.ts +117 -0
- package/apps/web/app/api/playground/v2/connect/route.ts +96 -0
- package/apps/web/app/api/playground/v2/disconnect/route.ts +88 -0
- package/apps/web/app/api/playground/v2/health/route.ts +80 -0
- package/apps/web/app/api/playground/v2/prompts/route.ts +160 -0
- package/apps/web/app/api/playground/v2/resources/route.ts +159 -0
- package/apps/web/app/api/playground/v2/sessions/route.ts +184 -0
- package/apps/web/app/api/playground/v2/tools/route.ts +167 -0
- package/apps/web/app/api/stream/route.ts +232 -0
- package/apps/web/app/batch/BatchConvertClient.tsx +190 -0
- package/apps/web/app/batch/page.tsx +37 -0
- package/apps/web/app/convert/page.tsx +269 -0
- package/apps/web/app/dashboard/page.tsx +380 -0
- package/apps/web/app/globals.css +622 -0
- package/apps/web/app/layout.tsx +120 -0
- package/apps/web/app/manifest.ts +31 -0
- package/apps/web/app/opengraph-image.tsx +112 -0
- package/apps/web/app/page.old.tsx +924 -0
- package/apps/web/app/page.tsx +77 -0
- package/apps/web/app/playground/page.tsx +306 -0
- package/apps/web/app/playground/v2/error.tsx +163 -0
- package/apps/web/app/playground/v2/layout.tsx +58 -0
- package/apps/web/app/playground/v2/loading.tsx +152 -0
- package/apps/web/app/playground/v2/page.tsx +644 -0
- package/apps/web/app/playground/v2/providers.tsx +214 -0
- package/apps/web/app/playground/v2/use-shortcuts.ts +209 -0
- package/apps/web/app/playground/v2/use-url-state.ts +296 -0
- package/apps/web/app/providers.tsx +22 -0
- package/apps/web/app/sitemap.ts +32 -0
- package/apps/web/app/twitter-image.tsx +112 -0
- package/apps/web/components/BranchSelector.tsx +401 -0
- package/apps/web/components/ClaudeConfigExport.tsx +226 -0
- package/apps/web/components/Features.tsx +84 -0
- package/apps/web/components/Footer.tsx +119 -0
- package/apps/web/components/GenerationProgress.tsx +248 -0
- package/apps/web/components/GithubUrlInput.tsx +483 -0
- package/apps/web/components/Header.tsx +175 -0
- package/apps/web/components/Hero.tsx +117 -0
- package/apps/web/components/HowItWorks.tsx +119 -0
- package/apps/web/components/InstallBanner.tsx +158 -0
- package/apps/web/components/Logo.tsx +116 -0
- package/apps/web/components/ParticleBackground.tsx +105 -0
- package/apps/web/components/Playground.tsx +472 -0
- package/apps/web/components/PlaygroundToolTester.tsx +410 -0
- package/apps/web/components/ProductCards.tsx +179 -0
- package/apps/web/components/SplitView.tsx +194 -0
- package/apps/web/components/ToolFilter.tsx +260 -0
- package/apps/web/components/ToolList.tsx +325 -0
- package/apps/web/components/batch/BatchConvert.tsx +785 -0
- package/apps/web/components/batch/index.ts +7 -0
- package/apps/web/components/convert/ConfigTabs.tsx +230 -0
- package/apps/web/components/convert/ConversionResult.tsx +482 -0
- package/apps/web/components/convert/InlinePlayground.tsx +259 -0
- package/apps/web/components/convert/LoadingSteps.tsx +311 -0
- package/apps/web/components/convert/OneClickInstall.tsx +224 -0
- package/apps/web/components/convert/ToolCard.tsx +189 -0
- package/apps/web/components/convert/TryInPlayground.tsx +242 -0
- package/apps/web/components/convert/index.ts +12 -0
- package/apps/web/components/deploy/DeployButton.tsx +369 -0
- package/apps/web/components/deploy/index.ts +7 -0
- package/apps/web/components/docker/DockerExport.tsx +690 -0
- package/apps/web/components/docker/index.ts +7 -0
- package/apps/web/components/install/OneClickInstall.tsx +676 -0
- package/apps/web/components/install/index.ts +7 -0
- package/apps/web/components/playground/CapabilityTabs.tsx +150 -0
- package/apps/web/components/playground/ConnectionStatusV2.tsx +322 -0
- package/apps/web/components/playground/EmptyStates.tsx +305 -0
- package/apps/web/components/playground/ExecutionLog.tsx +260 -0
- package/apps/web/components/playground/ExecutionLogV2.tsx +378 -0
- package/apps/web/components/playground/JsonViewer.tsx +388 -0
- package/apps/web/components/playground/PlaygroundLayout.tsx +244 -0
- package/apps/web/components/playground/PromptsPanel.tsx +385 -0
- package/apps/web/components/playground/ResourcesPanel.tsx +378 -0
- package/apps/web/components/playground/SchemaForm.tsx +477 -0
- package/apps/web/components/playground/ServerStatus.tsx +151 -0
- package/apps/web/components/playground/ShareButton.tsx +239 -0
- package/apps/web/components/playground/ToolsPanel.tsx +309 -0
- package/apps/web/components/playground/TransportConfigurator.tsx +563 -0
- package/apps/web/components/playground/index.ts +74 -0
- package/apps/web/components/playground/types.ts +202 -0
- package/apps/web/components/streaming/StreamingProgress.tsx +441 -0
- package/apps/web/components/streaming/index.ts +7 -0
- package/apps/web/components/ui/badge.tsx +42 -0
- package/apps/web/components/ui/button.tsx +88 -0
- package/apps/web/components/ui/card.tsx +75 -0
- package/apps/web/components/ui/code-block.tsx +122 -0
- package/apps/web/components/ui/index.ts +12 -0
- package/apps/web/components/ui/input.tsx +55 -0
- package/apps/web/components/ui/tabs.tsx +61 -0
- package/apps/web/hooks/index.ts +85 -0
- package/apps/web/hooks/types.ts +1173 -0
- package/apps/web/hooks/use-conversion.ts +133 -0
- package/apps/web/hooks/use-execution-history.ts +376 -0
- package/apps/web/hooks/use-generation-progress.ts +147 -0
- package/apps/web/hooks/use-local-storage.ts +88 -0
- package/apps/web/hooks/use-mcp-client.ts +623 -0
- package/apps/web/hooks/use-mcp-connection.ts +500 -0
- package/apps/web/hooks/use-mcp-execution.ts +282 -0
- package/apps/web/hooks/use-mcp-prompts.ts +441 -0
- package/apps/web/hooks/use-mcp-resources.ts +430 -0
- package/apps/web/hooks/use-mcp-tools.ts +540 -0
- package/apps/web/hooks/use-playground-store.ts +299 -0
- package/apps/web/hooks/use-playground.ts +184 -0
- package/apps/web/hooks/use-streaming-conversion.ts +227 -0
- package/apps/web/hooks/useBatchConversion.ts +271 -0
- package/apps/web/hooks/useDockerConfig.ts +161 -0
- package/apps/web/hooks/usePlatformDetection.ts +80 -0
- package/apps/web/hooks/useStreaming.ts +199 -0
- package/apps/web/lib/api/errors.ts +386 -0
- package/apps/web/lib/api/index.ts +137 -0
- package/apps/web/lib/api/logger.ts +187 -0
- package/apps/web/lib/api/middleware.ts +364 -0
- package/apps/web/lib/api/openapi.ts +977 -0
- package/apps/web/lib/api/session-manager.ts +594 -0
- package/apps/web/lib/api/types.ts +433 -0
- package/apps/web/lib/api/validation.ts +523 -0
- package/apps/web/lib/constants.ts +114 -0
- package/apps/web/lib/mcp/client.ts +1137 -0
- package/apps/web/lib/mcp/events.ts +651 -0
- package/apps/web/lib/mcp/index.ts +347 -0
- package/apps/web/lib/mcp/logger.ts +428 -0
- package/apps/web/lib/mcp/metrics.ts +703 -0
- package/apps/web/lib/mcp/retry.ts +616 -0
- package/apps/web/lib/mcp/session-manager.ts +779 -0
- package/apps/web/lib/mcp/transports.ts +988 -0
- package/apps/web/lib/mcp/types.ts +594 -0
- package/apps/web/lib/mcp-client-enhanced.ts +871 -0
- package/apps/web/lib/mcp-client.ts +778 -0
- package/apps/web/lib/mcp-errors.ts +489 -0
- package/apps/web/lib/mcp-sandbox.ts +593 -0
- package/apps/web/lib/mcp-testing.ts +428 -0
- package/apps/web/lib/mcp-types.ts +448 -0
- package/apps/web/lib/playground-store.tsx +1147 -0
- package/apps/web/lib/utils.ts +439 -0
- package/apps/web/next-env.d.ts +5 -0
- package/apps/web/next.config.js +23 -0
- package/apps/web/package.json +55 -0
- package/apps/web/postcss.config.js +6 -0
- package/apps/web/public/.well-known/ai-plugin.json +17 -0
- package/apps/web/public/logo.svg +6 -0
- package/apps/web/public/robots.txt +22 -0
- package/apps/web/public/schema.json +27 -0
- package/apps/web/tailwind.config.js +26 -0
- package/apps/web/tailwind.config.ts +123 -0
- package/apps/web/tsconfig.json +20 -0
- package/apps/web/types/deploy.ts +139 -0
- package/apps/web/types/index.ts +247 -0
- package/apps/web/vercel.json +39 -0
- package/eslint.config.mjs +23 -0
- package/llms.txt +102 -0
- package/mkdocs/docs/api/core.md +318 -0
- package/mkdocs/docs/api/index.md +128 -0
- package/mkdocs/docs/api/mcp-server.md +301 -0
- package/mkdocs/docs/api/openapi-parser.md +254 -0
- package/mkdocs/docs/assets/logo.svg +7 -0
- package/mkdocs/docs/changelog.md +118 -0
- package/mkdocs/docs/cli/generate.md +148 -0
- package/mkdocs/docs/cli/index.md +52 -0
- package/mkdocs/docs/cli/inspect.md +164 -0
- package/mkdocs/docs/cli/serve.md +136 -0
- package/mkdocs/docs/concepts/classification.md +254 -0
- package/mkdocs/docs/concepts/how-it-works.md +299 -0
- package/mkdocs/docs/concepts/index.md +77 -0
- package/mkdocs/docs/concepts/mcp-protocol.md +362 -0
- package/mkdocs/docs/concepts/tool-types.md +382 -0
- package/mkdocs/docs/contributing/architecture.md +262 -0
- package/mkdocs/docs/contributing/development.md +245 -0
- package/mkdocs/docs/contributing/index.md +73 -0
- package/mkdocs/docs/contributing/testing.md +320 -0
- package/mkdocs/docs/getting-started/configuration.md +235 -0
- package/mkdocs/docs/getting-started/index.md +54 -0
- package/mkdocs/docs/getting-started/installation.md +145 -0
- package/mkdocs/docs/getting-started/quickstart.md +160 -0
- package/mkdocs/docs/guides/batch.md +375 -0
- package/mkdocs/docs/guides/claude-desktop.md +227 -0
- package/mkdocs/docs/guides/cursor.md +188 -0
- package/mkdocs/docs/guides/custom-tools.md +367 -0
- package/mkdocs/docs/guides/index.md +78 -0
- package/mkdocs/docs/guides/private-repos.md +221 -0
- package/mkdocs/docs/guides/vscode.md +247 -0
- package/mkdocs/docs/index.md +175 -0
- package/mkdocs/docs/reference/config.md +223 -0
- package/mkdocs/docs/reference/env.md +192 -0
- package/mkdocs/docs/reference/index.md +102 -0
- package/mkdocs/docs/reference/tools.md +309 -0
- package/mkdocs/docs/stylesheets/extra.css +231 -0
- package/mkdocs/mkdocs.yml +204 -0
- package/mkdocs/overrides/.gitkeep +1 -0
- package/mkdocs/overrides/main.html +7 -0
- package/mkdocs/python-deps.txt +7 -0
- package/mkdocs/vercel.json +11 -0
- package/package.json +63 -0
- package/packages/core/package.json +61 -0
- package/packages/core/src/__tests__/bitbucket-client.test.ts +366 -0
- package/packages/core/src/__tests__/cli.test.ts +235 -0
- package/packages/core/src/__tests__/code-extractor.test.ts +378 -0
- package/packages/core/src/__tests__/docker-generator.test.ts +255 -0
- package/packages/core/src/__tests__/github-client.test.ts +390 -0
- package/packages/core/src/__tests__/gitlab-client.test.ts +319 -0
- package/packages/core/src/__tests__/go-extractor.test.ts +351 -0
- package/packages/core/src/__tests__/graphql-extractor.test.ts +330 -0
- package/packages/core/src/__tests__/java-extractor.test.ts +497 -0
- package/packages/core/src/__tests__/plugins.test.ts +467 -0
- package/packages/core/src/__tests__/readme-extractor.test.ts +258 -0
- package/packages/core/src/__tests__/redis-cache.test.ts +307 -0
- package/packages/core/src/__tests__/rust-extractor.test.ts +252 -0
- package/packages/core/src/__tests__/streaming.test.ts +251 -0
- package/packages/core/src/additional-extractors.ts +333 -0
- package/packages/core/src/cache/cache-interface.ts +179 -0
- package/packages/core/src/cache/index.ts +210 -0
- package/packages/core/src/cache/redis-cache.ts +291 -0
- package/packages/core/src/cache/upstash-cache.ts +379 -0
- package/packages/core/src/cache.ts +251 -0
- package/packages/core/src/cli.ts +822 -0
- package/packages/core/src/code-extractor.ts +696 -0
- package/packages/core/src/docker-generator.ts +470 -0
- package/packages/core/src/edge-compatible.ts +491 -0
- package/packages/core/src/extractors/go-extractor.ts +791 -0
- package/packages/core/src/extractors/index.ts +9 -0
- package/packages/core/src/extractors/java-extractor.ts +937 -0
- package/packages/core/src/extractors/rust-extractor.ts +744 -0
- package/packages/core/src/github-client.ts +319 -0
- package/packages/core/src/go-generator.ts +356 -0
- package/packages/core/src/graphql-extractor.ts +358 -0
- package/packages/core/src/index.ts +797 -0
- package/packages/core/src/langchain-exporter.ts +617 -0
- package/packages/core/src/language-parsers.ts +1114 -0
- package/packages/core/src/mcp-introspector.ts +279 -0
- package/packages/core/src/monorepo-detector.ts +378 -0
- package/packages/core/src/plugins/index.ts +370 -0
- package/packages/core/src/plugins/registry.ts +404 -0
- package/packages/core/src/plugins/types.ts +215 -0
- package/packages/core/src/providers/base-provider.ts +246 -0
- package/packages/core/src/providers/bitbucket-client.ts +464 -0
- package/packages/core/src/providers/gitlab-client.ts +388 -0
- package/packages/core/src/providers/index.ts +176 -0
- package/packages/core/src/python-generator.ts +260 -0
- package/packages/core/src/queue/index.ts +100 -0
- package/packages/core/src/queue/memory-queue.ts +445 -0
- package/packages/core/src/queue/redis-queue.ts +578 -0
- package/packages/core/src/queue/types.ts +251 -0
- package/packages/core/src/readme-extractor.ts +409 -0
- package/packages/core/src/schema-generator.ts +638 -0
- package/packages/core/src/streaming.ts +999 -0
- package/packages/core/src/types.ts +289 -0
- package/packages/core/tsconfig.json +9 -0
- package/packages/core/tsup.config.ts +25 -0
- package/packages/mcp-server/README.md +297 -0
- package/packages/mcp-server/package.json +55 -0
- package/packages/mcp-server/src/__tests__/mcp-server.test.ts +177 -0
- package/packages/mcp-server/src/__tests__/tools.test.ts +217 -0
- package/packages/mcp-server/src/index.ts +1206 -0
- package/packages/mcp-server/src/prompts/index.ts +601 -0
- package/packages/mcp-server/src/tools/export-docker.ts +362 -0
- package/packages/mcp-server/src/tools/generate-openapi.ts +162 -0
- package/packages/mcp-server/src/tools/monitor-mcp-server.ts +448 -0
- package/packages/mcp-server/src/tools/stream-convert.ts +398 -0
- package/packages/mcp-server/src/tools/test-mcp-tool.ts +531 -0
- package/packages/mcp-server/tsconfig.json +12 -0
- package/packages/mcp-server/tsup.config.ts +14 -0
- package/packages/openapi-parser/package-lock.json +3028 -0
- package/packages/openapi-parser/package.json +41 -0
- package/packages/openapi-parser/src/analyzer.ts +700 -0
- package/packages/openapi-parser/src/asyncapi-parser.ts +475 -0
- package/packages/openapi-parser/src/cli.ts +302 -0
- package/packages/openapi-parser/src/generator.ts +570 -0
- package/packages/openapi-parser/src/generators/express-analyzer.ts +649 -0
- package/packages/openapi-parser/src/generators/fastapi-analyzer.ts +960 -0
- package/packages/openapi-parser/src/generators/index.ts +200 -0
- package/packages/openapi-parser/src/generators/nextjs-analyzer.ts +768 -0
- package/packages/openapi-parser/src/generators/openapi-builder.ts +527 -0
- package/packages/openapi-parser/src/generators/types.ts +298 -0
- package/packages/openapi-parser/src/graphql-parser.ts +462 -0
- package/packages/openapi-parser/src/grpc-parser.ts +649 -0
- package/packages/openapi-parser/src/har-parser.ts +723 -0
- package/packages/openapi-parser/src/index.ts +635 -0
- package/packages/openapi-parser/src/insomnia-parser.ts +614 -0
- package/packages/openapi-parser/src/parser.ts +231 -0
- package/packages/openapi-parser/src/postman-parser.ts +611 -0
- package/packages/openapi-parser/src/ref-resolver.ts +313 -0
- package/packages/openapi-parser/src/transformer.ts +459 -0
- package/packages/openapi-parser/tests/generators/express.test.ts +209 -0
- package/packages/openapi-parser/tests/generators/fastapi.test.ts +236 -0
- package/packages/openapi-parser/tests/generators/nextjs.test.ts +273 -0
- package/packages/openapi-parser/tests/parsers.test.ts +847 -0
- package/packages/openapi-parser/tsconfig.json +9 -0
- package/packages/openapi-parser/tsup.config.ts +11 -0
- package/packages/registry/package.json +59 -0
- package/packages/registry/src/cli.ts +456 -0
- package/packages/registry/src/index.ts +44 -0
- package/packages/registry/src/popular/github.json +47 -0
- package/packages/registry/src/popular/index.ts +55 -0
- package/packages/registry/src/popular/linear.json +42 -0
- package/packages/registry/src/popular/notion.json +42 -0
- package/packages/registry/src/popular/openai.json +40 -0
- package/packages/registry/src/popular/resend.json +38 -0
- package/packages/registry/src/popular/slack.json +42 -0
- package/packages/registry/src/popular/stripe.json +163 -0
- package/packages/registry/src/popular/supabase.json +42 -0
- package/packages/registry/src/popular/twilio.json +40 -0
- package/packages/registry/src/popular/vercel.json +40 -0
- package/packages/registry/src/registry.ts +492 -0
- package/packages/registry/src/storage.ts +334 -0
- package/packages/registry/src/types.ts +275 -0
- package/packages/registry/src/updater.ts +208 -0
- package/packages/registry/tsconfig.json +10 -0
- package/packages/registry/tsup.config.ts +11 -0
- package/pnpm-workspace.yaml +3 -0
- package/scripts/build-docs.sh +16 -0
- package/server.json +9 -0
- package/templates/Dockerfile.python.template +60 -0
- package/templates/Dockerfile.typescript.template +60 -0
- package/templates/docker-compose.template.yml +68 -0
- package/tests/fixtures/express-app/index.js +34 -0
- package/tests/fixtures/express-app/routes/posts.js +43 -0
- package/tests/fixtures/express-app/routes/users.js +58 -0
- package/tests/fixtures/fastapi-app/main.py +125 -0
- package/tests/fixtures/fastapi-app/routes/admin.py +42 -0
- package/tests/fixtures/graphql/simple-schema.graphql +65 -0
- package/tests/fixtures/mocks/github-api-responses.json +63 -0
- package/tests/fixtures/nextjs-app/app/api/posts/route.ts +55 -0
- package/tests/fixtures/nextjs-app/app/api/users/[id]/route.ts +63 -0
- package/tests/fixtures/nextjs-app/app/api/users/route.ts +44 -0
- package/tests/fixtures/nextjs-app/pages/api/health.ts +28 -0
- package/tests/fixtures/openapi/petstore.yaml +179 -0
- package/tests/integration/langchain-export.test.ts +405 -0
- package/tests/integration/openapi-conversion.test.ts +221 -0
- package/tsconfig.json +18 -0
- package/vitest.config.ts +32 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useState, useCallback } from 'react'
|
|
4
|
+
import { motion } from 'framer-motion'
|
|
5
|
+
import { Github, ArrowRight } from 'lucide-react'
|
|
6
|
+
import { useRouter } from 'next/navigation'
|
|
7
|
+
import GithubUrlInput from '@/components/GithubUrlInput'
|
|
8
|
+
|
|
9
|
+
const QUICK_TRY = [
|
|
10
|
+
{ name: 'MCP Servers', url: 'https://github.com/modelcontextprotocol/servers' },
|
|
11
|
+
{ name: 'Anthropic Cookbook', url: 'https://github.com/anthropics/anthropic-cookbook' },
|
|
12
|
+
{ name: 'Vercel AI', url: 'https://github.com/vercel/ai' },
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
export default function Hero() {
|
|
16
|
+
const router = useRouter()
|
|
17
|
+
const [isConverting, setIsConverting] = useState(false)
|
|
18
|
+
|
|
19
|
+
const handleSubmit = useCallback((url: string) => {
|
|
20
|
+
setIsConverting(true)
|
|
21
|
+
const finalUrl = url.startsWith('http') ? url : `https://${url}`
|
|
22
|
+
router.push(`/convert?url=${encodeURIComponent(finalUrl)}`)
|
|
23
|
+
}, [router])
|
|
24
|
+
|
|
25
|
+
const handleQuickTry = useCallback((repoUrl: string) => {
|
|
26
|
+
router.push(`/convert?url=${encodeURIComponent(repoUrl)}`)
|
|
27
|
+
}, [router])
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<div className="text-center py-8">
|
|
31
|
+
{/* Badge */}
|
|
32
|
+
<motion.div
|
|
33
|
+
initial={{ opacity: 0, scale: 0.8 }}
|
|
34
|
+
animate={{ opacity: 1, scale: 1 }}
|
|
35
|
+
className="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/5 border border-white/10 mb-6"
|
|
36
|
+
>
|
|
37
|
+
<Github className="w-4 h-4 text-white/60" />
|
|
38
|
+
<span className="text-sm font-medium text-neutral-400">
|
|
39
|
+
Free & <span className="text-white font-semibold">Open Source</span>
|
|
40
|
+
</span>
|
|
41
|
+
</motion.div>
|
|
42
|
+
|
|
43
|
+
{/* Main heading */}
|
|
44
|
+
<motion.h1
|
|
45
|
+
initial={{ opacity: 0, y: 20 }}
|
|
46
|
+
animate={{ opacity: 1, y: 0 }}
|
|
47
|
+
transition={{ delay: 0.1 }}
|
|
48
|
+
className="text-5xl md:text-7xl font-bold mb-4 leading-[1.1] tracking-tight"
|
|
49
|
+
>
|
|
50
|
+
<span className="block text-white">Convert GitHub Repos</span>
|
|
51
|
+
<span className="block text-neutral-500">to MCP Servers</span>
|
|
52
|
+
</motion.h1>
|
|
53
|
+
|
|
54
|
+
{/* Short subheadline */}
|
|
55
|
+
<motion.p
|
|
56
|
+
initial={{ opacity: 0, y: 20 }}
|
|
57
|
+
animate={{ opacity: 1, y: 0 }}
|
|
58
|
+
transition={{ delay: 0.15 }}
|
|
59
|
+
className="text-xl text-neutral-400 mb-10"
|
|
60
|
+
>
|
|
61
|
+
Transform any GitHub repository into a Model Context Protocol server for AI agents
|
|
62
|
+
</motion.p>
|
|
63
|
+
|
|
64
|
+
{/* Main URL Input - THE CORE TOOL */}
|
|
65
|
+
<motion.div
|
|
66
|
+
initial={{ opacity: 0, y: 20 }}
|
|
67
|
+
animate={{ opacity: 1, y: 0 }}
|
|
68
|
+
transition={{ delay: 0.2 }}
|
|
69
|
+
className="max-w-2xl mx-auto mb-4"
|
|
70
|
+
>
|
|
71
|
+
<GithubUrlInput
|
|
72
|
+
onSubmit={handleSubmit}
|
|
73
|
+
disabled={isConverting}
|
|
74
|
+
/>
|
|
75
|
+
</motion.div>
|
|
76
|
+
|
|
77
|
+
{/* Quick try buttons */}
|
|
78
|
+
<motion.div
|
|
79
|
+
initial={{ opacity: 0 }}
|
|
80
|
+
animate={{ opacity: 1 }}
|
|
81
|
+
transition={{ delay: 0.25 }}
|
|
82
|
+
className="flex flex-wrap justify-center items-center gap-2 mb-8"
|
|
83
|
+
role="group"
|
|
84
|
+
aria-label="Example repositories"
|
|
85
|
+
>
|
|
86
|
+
<span className="text-sm text-neutral-500">Try:</span>
|
|
87
|
+
{QUICK_TRY.map((repo) => (
|
|
88
|
+
<button
|
|
89
|
+
key={repo.name}
|
|
90
|
+
type="button"
|
|
91
|
+
onClick={() => handleQuickTry(repo.url)}
|
|
92
|
+
className="px-3 py-1.5 text-sm bg-white/5 border border-neutral-800 rounded-lg hover:border-neutral-600 hover:bg-white/10 transition-all text-neutral-400 hover:text-white focus:outline-none focus:ring-2 focus:ring-white/20"
|
|
93
|
+
aria-label={`Convert ${repo.name} repository`}
|
|
94
|
+
>
|
|
95
|
+
{repo.name}
|
|
96
|
+
</button>
|
|
97
|
+
))}
|
|
98
|
+
</motion.div>
|
|
99
|
+
|
|
100
|
+
{/* Feature pills */}
|
|
101
|
+
<motion.div
|
|
102
|
+
initial={{ opacity: 0 }}
|
|
103
|
+
animate={{ opacity: 1 }}
|
|
104
|
+
transition={{ delay: 0.3 }}
|
|
105
|
+
className="flex flex-wrap justify-center items-center gap-2 text-xs text-neutral-500"
|
|
106
|
+
>
|
|
107
|
+
<span>Smart extraction</span>
|
|
108
|
+
<span className="text-neutral-700">•</span>
|
|
109
|
+
<span>TypeScript & Python</span>
|
|
110
|
+
<span className="text-neutral-700">•</span>
|
|
111
|
+
<span>Ready-to-use configs</span>
|
|
112
|
+
<span className="text-neutral-700">•</span>
|
|
113
|
+
<span>Interactive playground</span>
|
|
114
|
+
</motion.div>
|
|
115
|
+
</div>
|
|
116
|
+
)
|
|
117
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { motion } from 'framer-motion'
|
|
4
|
+
import { Github, Code2, Server } from 'lucide-react'
|
|
5
|
+
|
|
6
|
+
const steps = [
|
|
7
|
+
{
|
|
8
|
+
number: 1,
|
|
9
|
+
title: 'Paste GitHub URL',
|
|
10
|
+
description: 'Enter any public GitHub repository URL. We support repos with README files, OpenAPI specs, GraphQL schemas, and source code.',
|
|
11
|
+
icon: Github,
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
number: 2,
|
|
15
|
+
title: 'Analyze & Extract',
|
|
16
|
+
description: 'We analyze the repository structure, detect the type (SDK, CLI, library), and extract all available tools and endpoints.',
|
|
17
|
+
icon: Code2,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
number: 3,
|
|
21
|
+
title: 'Get MCP Server',
|
|
22
|
+
description: 'Download production-ready MCP server code in TypeScript or Python, with configs for Claude Desktop, Cursor, and more.',
|
|
23
|
+
icon: Server,
|
|
24
|
+
},
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
export default function HowItWorks() {
|
|
28
|
+
return (
|
|
29
|
+
<section id="how-it-works" className="py-24 scroll-mt-24 relative overflow-hidden">
|
|
30
|
+
{/* Background decoration */}
|
|
31
|
+
<div className="absolute inset-0 bg-dots opacity-30" aria-hidden="true" />
|
|
32
|
+
|
|
33
|
+
<div className="relative z-10">
|
|
34
|
+
{/* Section header */}
|
|
35
|
+
<motion.div
|
|
36
|
+
initial={{ opacity: 0, y: 20 }}
|
|
37
|
+
whileInView={{ opacity: 1, y: 0 }}
|
|
38
|
+
viewport={{ once: true }}
|
|
39
|
+
transition={{ duration: 0.5 }}
|
|
40
|
+
className="text-center mb-16"
|
|
41
|
+
>
|
|
42
|
+
<h2 className="text-4xl md:text-5xl font-bold text-white mb-4">
|
|
43
|
+
How it <span className="text-neutral-500">works</span>
|
|
44
|
+
</h2>
|
|
45
|
+
<p className="text-xl text-neutral-400 max-w-2xl mx-auto">
|
|
46
|
+
Three simple steps to convert any GitHub repo into an MCP server.
|
|
47
|
+
</p>
|
|
48
|
+
</motion.div>
|
|
49
|
+
|
|
50
|
+
{/* Steps timeline */}
|
|
51
|
+
<div className="max-w-4xl mx-auto">
|
|
52
|
+
<div className="relative">
|
|
53
|
+
{/* Connecting line */}
|
|
54
|
+
<div className="absolute left-1/2 top-0 bottom-0 w-px bg-gradient-to-b from-neutral-600 via-neutral-700 to-neutral-800 hidden md:block" />
|
|
55
|
+
|
|
56
|
+
{/* Steps */}
|
|
57
|
+
<div className="space-y-12 md:space-y-24">
|
|
58
|
+
{steps.map((step, index) => {
|
|
59
|
+
const Icon = step.icon
|
|
60
|
+
const isEven = index % 2 === 0
|
|
61
|
+
|
|
62
|
+
return (
|
|
63
|
+
<motion.div
|
|
64
|
+
key={step.number}
|
|
65
|
+
initial={{ opacity: 0, x: isEven ? -50 : 50 }}
|
|
66
|
+
whileInView={{ opacity: 1, x: 0 }}
|
|
67
|
+
viewport={{ once: true }}
|
|
68
|
+
transition={{ duration: 0.5, delay: index * 0.2 }}
|
|
69
|
+
className={`flex flex-col md:flex-row items-center gap-8 ${
|
|
70
|
+
isEven ? 'md:flex-row' : 'md:flex-row-reverse'
|
|
71
|
+
}`}
|
|
72
|
+
>
|
|
73
|
+
{/* Content */}
|
|
74
|
+
<div className={`flex-1 text-center ${isEven ? 'md:text-right' : 'md:text-left'}`}>
|
|
75
|
+
<motion.div
|
|
76
|
+
whileHover={{ scale: 1.02 }}
|
|
77
|
+
className="inline-block"
|
|
78
|
+
>
|
|
79
|
+
<div className="rounded-2xl p-6 md:p-8 bg-neutral-900/50 backdrop-blur-sm border border-neutral-800">
|
|
80
|
+
<div className="text-sm font-bold text-neutral-500 mb-2">
|
|
81
|
+
Step {step.number}
|
|
82
|
+
</div>
|
|
83
|
+
<h3 className="text-xl md:text-2xl font-bold text-white mb-3">
|
|
84
|
+
{step.title}
|
|
85
|
+
</h3>
|
|
86
|
+
<p className="text-neutral-400">
|
|
87
|
+
{step.description}
|
|
88
|
+
</p>
|
|
89
|
+
</div>
|
|
90
|
+
</motion.div>
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
{/* Center icon */}
|
|
94
|
+
<div className="relative z-10">
|
|
95
|
+
<motion.div
|
|
96
|
+
whileHover={{ scale: 1.1 }}
|
|
97
|
+
className="w-16 h-16 md:w-20 md:h-20 rounded-2xl bg-white/5 border border-neutral-700 flex items-center justify-center shadow-lg"
|
|
98
|
+
>
|
|
99
|
+
<Icon className="w-8 h-8 md:w-10 md:h-10 text-white" />
|
|
100
|
+
</motion.div>
|
|
101
|
+
|
|
102
|
+
{/* Number badge */}
|
|
103
|
+
<div className="absolute -top-2 -right-2 w-6 h-6 rounded-full bg-white text-black flex items-center justify-center text-xs font-bold">
|
|
104
|
+
{step.number}
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
|
|
108
|
+
{/* Empty space for alternating layout */}
|
|
109
|
+
<div className="flex-1 hidden md:block" aria-hidden="true" />
|
|
110
|
+
</motion.div>
|
|
111
|
+
)
|
|
112
|
+
})}
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
</section>
|
|
118
|
+
)
|
|
119
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install Banner - Prominent CLI install command
|
|
3
|
+
* @copyright 2024-2026 nirholas
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use client';
|
|
8
|
+
|
|
9
|
+
import { useState, useCallback } from 'react';
|
|
10
|
+
import { motion } from 'framer-motion';
|
|
11
|
+
import { Copy, Check, Terminal, Zap, ArrowRight } from 'lucide-react';
|
|
12
|
+
|
|
13
|
+
interface InstallBannerProps {
|
|
14
|
+
variant?: 'hero' | 'inline' | 'minimal';
|
|
15
|
+
repoUrl?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default function InstallBanner({ variant = 'hero', repoUrl }: InstallBannerProps) {
|
|
19
|
+
const [copied, setCopied] = useState(false);
|
|
20
|
+
|
|
21
|
+
const command = repoUrl
|
|
22
|
+
? `npx @nirholas/github-to-mcp install ${repoUrl} --claude`
|
|
23
|
+
: `npx @nirholas/github-to-mcp install <github-url> --claude`;
|
|
24
|
+
|
|
25
|
+
const handleCopy = useCallback(async () => {
|
|
26
|
+
await navigator.clipboard.writeText(command);
|
|
27
|
+
setCopied(true);
|
|
28
|
+
setTimeout(() => setCopied(false), 2000);
|
|
29
|
+
}, [command]);
|
|
30
|
+
|
|
31
|
+
if (variant === 'minimal') {
|
|
32
|
+
return (
|
|
33
|
+
<div className="flex items-center gap-2">
|
|
34
|
+
<code className="text-sm text-green-400 font-mono bg-black/40 px-3 py-1.5 rounded-lg">
|
|
35
|
+
npx @nirholas/github-to-mcp
|
|
36
|
+
</code>
|
|
37
|
+
<button
|
|
38
|
+
onClick={handleCopy}
|
|
39
|
+
className="p-1.5 hover:bg-white/10 rounded transition-colors"
|
|
40
|
+
>
|
|
41
|
+
{copied ? (
|
|
42
|
+
<Check className="w-4 h-4 text-green-400" />
|
|
43
|
+
) : (
|
|
44
|
+
<Copy className="w-4 h-4 text-neutral-400" />
|
|
45
|
+
)}
|
|
46
|
+
</button>
|
|
47
|
+
</div>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (variant === 'inline') {
|
|
52
|
+
return (
|
|
53
|
+
<motion.div
|
|
54
|
+
initial={{ opacity: 0, y: 10 }}
|
|
55
|
+
animate={{ opacity: 1, y: 0 }}
|
|
56
|
+
className="flex items-center gap-3 p-3 bg-black/40 border border-neutral-800 rounded-xl"
|
|
57
|
+
>
|
|
58
|
+
<Terminal className="w-5 h-5 text-neutral-500 flex-shrink-0" />
|
|
59
|
+
<code className="flex-1 text-sm text-green-400 font-mono overflow-x-auto whitespace-nowrap">
|
|
60
|
+
{command}
|
|
61
|
+
</code>
|
|
62
|
+
<button
|
|
63
|
+
onClick={handleCopy}
|
|
64
|
+
className="flex-shrink-0 p-2 hover:bg-white/10 rounded-lg transition-colors"
|
|
65
|
+
>
|
|
66
|
+
{copied ? (
|
|
67
|
+
<Check className="w-4 h-4 text-green-400" />
|
|
68
|
+
) : (
|
|
69
|
+
<Copy className="w-4 h-4 text-neutral-400" />
|
|
70
|
+
)}
|
|
71
|
+
</button>
|
|
72
|
+
</motion.div>
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Hero variant (default)
|
|
77
|
+
return (
|
|
78
|
+
<motion.div
|
|
79
|
+
initial={{ opacity: 0, y: 20 }}
|
|
80
|
+
animate={{ opacity: 1, y: 0 }}
|
|
81
|
+
className="rounded-2xl border border-neutral-800 bg-gradient-to-br from-neutral-900/80 to-black/80 backdrop-blur-xl overflow-hidden"
|
|
82
|
+
>
|
|
83
|
+
{/* Header */}
|
|
84
|
+
<div className="flex items-center justify-between p-4 border-b border-neutral-800 bg-white/[0.02]">
|
|
85
|
+
<div className="flex items-center gap-3">
|
|
86
|
+
<div className="w-10 h-10 rounded-xl bg-gradient-to-br from-green-500/20 to-emerald-500/10 flex items-center justify-center">
|
|
87
|
+
<Zap className="w-5 h-5 text-green-400" />
|
|
88
|
+
</div>
|
|
89
|
+
<div>
|
|
90
|
+
<h3 className="font-semibold text-white">One-Click Install</h3>
|
|
91
|
+
<p className="text-xs text-neutral-400">Add to Claude Desktop instantly</p>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
<span className="px-2.5 py-1 text-xs font-medium bg-green-500/20 text-green-400 rounded-full">
|
|
95
|
+
NEW
|
|
96
|
+
</span>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
{/* Command */}
|
|
100
|
+
<div className="p-4">
|
|
101
|
+
<div className="flex items-center gap-3 p-4 bg-black/60 border border-neutral-800 rounded-xl group">
|
|
102
|
+
<span className="text-neutral-500 font-mono">$</span>
|
|
103
|
+
<code className="flex-1 text-green-400 font-mono text-sm overflow-x-auto whitespace-nowrap scrollbar-thin">
|
|
104
|
+
{command}
|
|
105
|
+
</code>
|
|
106
|
+
<button
|
|
107
|
+
onClick={handleCopy}
|
|
108
|
+
className="flex-shrink-0 flex items-center gap-2 px-3 py-1.5 bg-white/5 hover:bg-white/10 border border-neutral-700 rounded-lg transition-all text-sm"
|
|
109
|
+
>
|
|
110
|
+
{copied ? (
|
|
111
|
+
<>
|
|
112
|
+
<Check className="w-4 h-4 text-green-400" />
|
|
113
|
+
<span className="text-green-400">Copied!</span>
|
|
114
|
+
</>
|
|
115
|
+
) : (
|
|
116
|
+
<>
|
|
117
|
+
<Copy className="w-4 h-4 text-neutral-400" />
|
|
118
|
+
<span className="text-neutral-300">Copy</span>
|
|
119
|
+
</>
|
|
120
|
+
)}
|
|
121
|
+
</button>
|
|
122
|
+
</div>
|
|
123
|
+
|
|
124
|
+
{/* Features */}
|
|
125
|
+
<div className="mt-4 flex flex-wrap gap-4 text-xs text-neutral-400">
|
|
126
|
+
<div className="flex items-center gap-1.5">
|
|
127
|
+
<Check className="w-3.5 h-3.5 text-green-400" />
|
|
128
|
+
<span>Auto-configures Claude Desktop</span>
|
|
129
|
+
</div>
|
|
130
|
+
<div className="flex items-center gap-1.5">
|
|
131
|
+
<Check className="w-3.5 h-3.5 text-green-400" />
|
|
132
|
+
<span>Installs dependencies</span>
|
|
133
|
+
</div>
|
|
134
|
+
<div className="flex items-center gap-1.5">
|
|
135
|
+
<Check className="w-3.5 h-3.5 text-green-400" />
|
|
136
|
+
<span>Works with Cursor too</span>
|
|
137
|
+
</div>
|
|
138
|
+
</div>
|
|
139
|
+
</div>
|
|
140
|
+
|
|
141
|
+
{/* Footer */}
|
|
142
|
+
<div className="flex items-center justify-between px-4 py-3 bg-white/[0.02] border-t border-neutral-800">
|
|
143
|
+
<p className="text-xs text-neutral-500">
|
|
144
|
+
Supports <span className="text-neutral-400">--claude</span>, <span className="text-neutral-400">--cursor</span>, and <span className="text-neutral-400">--vscode</span> flags
|
|
145
|
+
</p>
|
|
146
|
+
<a
|
|
147
|
+
href="https://github.com/nirholas/github-to-mcp#cli"
|
|
148
|
+
target="_blank"
|
|
149
|
+
rel="noopener noreferrer"
|
|
150
|
+
className="flex items-center gap-1 text-xs text-neutral-400 hover:text-white transition-colors"
|
|
151
|
+
>
|
|
152
|
+
View docs
|
|
153
|
+
<ArrowRight className="w-3 h-3" />
|
|
154
|
+
</a>
|
|
155
|
+
</div>
|
|
156
|
+
</motion.div>
|
|
157
|
+
);
|
|
158
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { motion } from 'framer-motion'
|
|
4
|
+
|
|
5
|
+
interface LogoProps {
|
|
6
|
+
size?: 'sm' | 'md' | 'lg'
|
|
7
|
+
showText?: boolean
|
|
8
|
+
className?: string
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// Custom space/conversion themed logo - represents transformation/portal
|
|
12
|
+
function LogoIcon({ className = '' }: { className?: string }) {
|
|
13
|
+
return (
|
|
14
|
+
<svg
|
|
15
|
+
viewBox="0 0 32 32"
|
|
16
|
+
fill="none"
|
|
17
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
18
|
+
className={className}
|
|
19
|
+
>
|
|
20
|
+
{/* Outer ring - represents the conversion portal */}
|
|
21
|
+
<circle
|
|
22
|
+
cx="16"
|
|
23
|
+
cy="16"
|
|
24
|
+
r="12"
|
|
25
|
+
stroke="currentColor"
|
|
26
|
+
strokeWidth="2"
|
|
27
|
+
strokeDasharray="4 2"
|
|
28
|
+
className="opacity-40"
|
|
29
|
+
/>
|
|
30
|
+
|
|
31
|
+
{/* Inner orbital rings - crossing paths representing transformation */}
|
|
32
|
+
<ellipse
|
|
33
|
+
cx="16"
|
|
34
|
+
cy="16"
|
|
35
|
+
rx="8"
|
|
36
|
+
ry="3"
|
|
37
|
+
stroke="currentColor"
|
|
38
|
+
strokeWidth="1.5"
|
|
39
|
+
className="opacity-60"
|
|
40
|
+
transform="rotate(-30 16 16)"
|
|
41
|
+
/>
|
|
42
|
+
<ellipse
|
|
43
|
+
cx="16"
|
|
44
|
+
cy="16"
|
|
45
|
+
rx="8"
|
|
46
|
+
ry="3"
|
|
47
|
+
stroke="currentColor"
|
|
48
|
+
strokeWidth="1.5"
|
|
49
|
+
className="opacity-60"
|
|
50
|
+
transform="rotate(30 16 16)"
|
|
51
|
+
/>
|
|
52
|
+
|
|
53
|
+
{/* Center core - the conversion point */}
|
|
54
|
+
<circle
|
|
55
|
+
cx="16"
|
|
56
|
+
cy="16"
|
|
57
|
+
r="4"
|
|
58
|
+
fill="currentColor"
|
|
59
|
+
className="opacity-90"
|
|
60
|
+
/>
|
|
61
|
+
|
|
62
|
+
{/* Small orbiting dots - representing data/particles */}
|
|
63
|
+
<circle cx="16" cy="6" r="1.5" fill="currentColor" className="opacity-70" />
|
|
64
|
+
<circle cx="16" cy="26" r="1.5" fill="currentColor" className="opacity-70" />
|
|
65
|
+
<circle cx="6" cy="16" r="1.5" fill="currentColor" className="opacity-70" />
|
|
66
|
+
<circle cx="26" cy="16" r="1.5" fill="currentColor" className="opacity-70" />
|
|
67
|
+
</svg>
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function Logo({ size = 'md', showText = true, className = '' }: LogoProps) {
|
|
72
|
+
const sizeClasses = {
|
|
73
|
+
sm: { container: 'w-8 h-8', icon: 'w-5 h-5', text: 'text-base' },
|
|
74
|
+
md: { container: 'w-8 h-8 md:w-9 md:h-9', icon: 'w-5 h-5 md:w-6 md:h-6', text: 'text-base md:text-lg' },
|
|
75
|
+
lg: { container: 'w-10 h-10', icon: 'w-6 h-6', text: 'text-xl' },
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const sizes = sizeClasses[size]
|
|
79
|
+
|
|
80
|
+
return (
|
|
81
|
+
<div className={`flex items-center gap-2 md:gap-3 ${className}`}>
|
|
82
|
+
{/* Logo Icon Container */}
|
|
83
|
+
<div className="relative">
|
|
84
|
+
<motion.div
|
|
85
|
+
className={`${sizes.container} rounded-lg bg-white flex items-center justify-center`}
|
|
86
|
+
whileHover={{ scale: 1.05 }}
|
|
87
|
+
transition={{ type: 'spring', stiffness: 400, damping: 17 }}
|
|
88
|
+
>
|
|
89
|
+
<LogoIcon className={`${sizes.icon} text-black`} />
|
|
90
|
+
</motion.div>
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
{/* Text with shimmer effect */}
|
|
94
|
+
{showText && (
|
|
95
|
+
<span className={`${sizes.text} font-bold text-white relative overflow-hidden`}>
|
|
96
|
+
<span className="relative z-10">github-to-mcp</span>
|
|
97
|
+
{/* Shimmer overlay */}
|
|
98
|
+
<motion.span
|
|
99
|
+
className="absolute inset-0 bg-gradient-to-r from-transparent via-white/20 to-transparent -skew-x-12"
|
|
100
|
+
initial={{ x: '-100%' }}
|
|
101
|
+
animate={{ x: '200%' }}
|
|
102
|
+
transition={{
|
|
103
|
+
duration: 3,
|
|
104
|
+
repeat: Infinity,
|
|
105
|
+
repeatDelay: 4,
|
|
106
|
+
ease: 'easeInOut',
|
|
107
|
+
}}
|
|
108
|
+
/>
|
|
109
|
+
</span>
|
|
110
|
+
)}
|
|
111
|
+
</div>
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export { LogoIcon }
|
|
116
|
+
export default Logo
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useEffect, useMemo, useState } from 'react'
|
|
4
|
+
import Particles, { initParticlesEngine } from '@tsparticles/react'
|
|
5
|
+
import { loadSlim } from '@tsparticles/slim'
|
|
6
|
+
|
|
7
|
+
export default function ParticleBackground() {
|
|
8
|
+
const [init, setInit] = useState(false)
|
|
9
|
+
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
initParticlesEngine(async (engine) => {
|
|
12
|
+
await loadSlim(engine)
|
|
13
|
+
}).then(() => {
|
|
14
|
+
setInit(true)
|
|
15
|
+
})
|
|
16
|
+
}, [])
|
|
17
|
+
|
|
18
|
+
const options = useMemo(
|
|
19
|
+
() => ({
|
|
20
|
+
background: {
|
|
21
|
+
color: {
|
|
22
|
+
value: 'transparent',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
fpsLimit: 60,
|
|
26
|
+
interactivity: {
|
|
27
|
+
events: {
|
|
28
|
+
onClick: {
|
|
29
|
+
enable: true,
|
|
30
|
+
mode: 'push',
|
|
31
|
+
},
|
|
32
|
+
onHover: {
|
|
33
|
+
enable: true,
|
|
34
|
+
mode: 'repulse',
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
modes: {
|
|
38
|
+
push: {
|
|
39
|
+
quantity: 2,
|
|
40
|
+
},
|
|
41
|
+
repulse: {
|
|
42
|
+
distance: 120,
|
|
43
|
+
duration: 0.4,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
particles: {
|
|
48
|
+
color: {
|
|
49
|
+
value: ['#ffffff', '#a3a3a3', '#737373'],
|
|
50
|
+
},
|
|
51
|
+
links: {
|
|
52
|
+
color: '#ffffff',
|
|
53
|
+
distance: 150,
|
|
54
|
+
enable: true,
|
|
55
|
+
opacity: 0.05,
|
|
56
|
+
width: 1,
|
|
57
|
+
},
|
|
58
|
+
move: {
|
|
59
|
+
direction: 'none' as const,
|
|
60
|
+
enable: true,
|
|
61
|
+
outModes: {
|
|
62
|
+
default: 'bounce' as const,
|
|
63
|
+
},
|
|
64
|
+
random: true,
|
|
65
|
+
speed: 0.5,
|
|
66
|
+
straight: false,
|
|
67
|
+
},
|
|
68
|
+
number: {
|
|
69
|
+
density: {
|
|
70
|
+
enable: true,
|
|
71
|
+
area: 1200,
|
|
72
|
+
},
|
|
73
|
+
value: 40,
|
|
74
|
+
},
|
|
75
|
+
opacity: {
|
|
76
|
+
value: { min: 0.05, max: 0.2 },
|
|
77
|
+
animation: {
|
|
78
|
+
enable: true,
|
|
79
|
+
speed: 0.5,
|
|
80
|
+
minimumValue: 0.05,
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
shape: {
|
|
84
|
+
type: 'circle',
|
|
85
|
+
},
|
|
86
|
+
size: {
|
|
87
|
+
value: { min: 1, max: 2 },
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
detectRetina: true,
|
|
91
|
+
}),
|
|
92
|
+
[]
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
if (!init) return null
|
|
96
|
+
|
|
97
|
+
return (
|
|
98
|
+
<Particles
|
|
99
|
+
id="tsparticles"
|
|
100
|
+
className="fixed inset-0 pointer-events-none"
|
|
101
|
+
style={{ zIndex: 0 }}
|
|
102
|
+
options={options}
|
|
103
|
+
/>
|
|
104
|
+
)
|
|
105
|
+
}
|