makaronz commited on
Commit
5e7c085
Β·
verified Β·
1 Parent(s): 9ce0897

Can you analyze my github repository and create frontend?

Browse files
Files changed (7) hide show
  1. README.md +8 -5
  2. about.html +66 -0
  3. components/footer.js +103 -0
  4. components/navbar.js +144 -0
  5. index.html +142 -19
  6. script.js +223 -0
  7. style.css +72 -18
README.md CHANGED
@@ -1,10 +1,13 @@
1
  ---
2
- title: Github Repository Analyzer Pro
3
- emoji: πŸ†
4
- colorFrom: indigo
5
- colorTo: indigo
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
1
  ---
2
+ title: GitHub Repository Analyzer Pro πŸš€
3
+ colorFrom: purple
4
+ colorTo: green
5
+ emoji: 🐳
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite-v3
10
  ---
11
 
12
+ # Welcome to your new DeepSite project!
13
+ This project was created with [DeepSite](https://huggingface.co/deepsite).
about.html ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>About - GitHub Repository Analyzer Pro</title>
7
+ <link rel="icon" type="image/x-icon" href="/static/favicon.ico">
8
+ <link rel="stylesheet" href="style.css">
9
+ <script src="https://cdn.tailwindcss.com"></script>
10
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
11
+ <script src="https://unpkg.com/feather-icons"></script>
12
+ <script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.globe.min.js"></script>
13
+ </head>
14
+ <body class="min-h-screen bg-gradient-to-br from-gray-900 via-purple-900 to-violet-900">
15
+ <custom-navbar></custom-navbar>
16
+
17
+ <main class="container mx-auto px-4 py-16">
18
+ <div class="max-w-4xl mx-auto">
19
+ <!-- Header -->
20
+ <div class="text-center mb-16">
21
+ <h1 class="text-5xl md:text-6xl font-bold text-white mb-6">
22
+ About
23
+ <span class="bg-gradient-to-r from-purple-400 to-pink-600 bg-clip-text text-transparent">
24
+ GitHub Analyzer Pro
25
+ </span>
26
+ </h1>
27
+ <p class="text-xl text-gray-300">
28
+ Learn more about our mission and how we help developers analyze their repositories.
29
+ </p>
30
+ </div>
31
+
32
+ <!-- Mission Section -->
33
+ <div class="glass rounded-2xl p-8 mb-12">
34
+ <h2 class="text-3xl font-bold text-white mb-6">Our Mission</h2>
35
+ <p class="text-gray-300 text-lg leading-relaxed mb-6">
36
+ At GitHub Repository Analyzer Pro, we believe that understanding your codebase is the first step
37
+ towards building better software. Our platform provides comprehensive insights into your
38
+ GitHub repositories, helping you make data-driven decisions about your projects.
39
+ </p>
40
+ <p class="text-gray-300 text-lg leading-relaxed">
41
+ We transform raw repository data into actionable insights, beautiful visualizations,
42
+ and meaningful metrics that empower developers and teams.
43
+ </p>
44
+ </div>
45
+
46
+ <!-- Features Grid -->
47
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-8 mb-16">
48
+ <div class="analysis-card bg-white/10 backdrop-blur-lg rounded-2xl p-8 border border-white/20">
49
+ <div class="text-purple-400 mb-4">
50
+ <i data-feather="bar-chart-2"></i>
51
+ </div>
52
+ <h3 class="text-xl font-semibold text-white mb-3">Comprehensive Analysis</h3>
53
+ <p class="text-gray-400">
54
+ Get detailed insights into code quality, performance metrics, and team collaboration patterns.
55
+ </p>
56
+ </div>
57
+
58
+ <div class="analysis-card bg-white/10 backdrop-blur-lg rounded-2xl p-8 border border-white/20">
59
+ <div class="text-purple-400 mb-4">
60
+ <i data-feather="zap"></i>
61
+ </div>
62
+ <h3 class="text-xl font-semibold text-white mb-3">Real-time Data</h3>
63
+ <p class="text-gray-400">
64
+ Access up-to-date information from GitHub's{"ok":false,"message":"Request timeout: The AI model took too long to respond. Please try again with a simpler prompt or try a different model."}
65
+ </body>
66
+ </html>
components/footer.js ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class CustomFooter extends HTMLElement {
2
+ connectedCallback() {
3
+ this.attachShadow({ mode: 'open' });
4
+ this.shadowRoot.innerHTML = `
5
+ <style>
6
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
7
+
8
+ footer {
9
+ background: rgba(17, 24, 39, 0.8);
10
+ backdrop-filter: blur(10px);
11
+ color: #d1d5db;
12
+ padding: 3rem 2rem;
13
+ text-align: center;
14
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
15
+ margin-top: 4rem;
16
+ }
17
+
18
+ .footer-content {
19
+ max-width: 1200px;
20
+ margin: 0 auto;
21
+ }
22
+
23
+ .footer-links {
24
+ display: flex;
25
+ justify-content: center;
26
+ gap: 2rem;
27
+ margin-bottom: 2rem;
28
+ }
29
+
30
+ .footer-links a {
31
+ color: #d1d5db;
32
+ text-decoration: none;
33
+ transition: color 0.3s ease;
34
+ }
35
+
36
+ .footer-links a:hover {
37
+ color: white;
38
+ }
39
+
40
+ .social-links {
41
+ display: flex;
42
+ justify-content: center;
43
+ gap: 1rem;
44
+ margin-bottom: 2rem;
45
+ }
46
+
47
+ .social-links a {
48
+ color: #d1d5db;
49
+ transition: color 0.3s ease;
50
+ }
51
+
52
+ .social-links a:hover {
53
+ color: #8b5cf6;
54
+ }
55
+
56
+ .copyright {
57
+ font-size: 0.875rem;
58
+ color: #9ca3af;
59
+ }
60
+
61
+ @media (max-width: 768px) {
62
+ footer {
63
+ padding: 2rem 1rem;
64
+ }
65
+
66
+ .footer-links {
67
+ flex-direction: column;
68
+ gap: 1rem;
69
+ }
70
+ }
71
+ </style>
72
+ <footer>
73
+ <div class="footer-content">
74
+ <div class="social-links">
75
+ <a href="https://github.com" target="_blank" aria-label="GitHub">
76
+ <i data-feather="github"></i>
77
+ </a>
78
+ <a href="https://twitter.com" target="_blank" aria-label="Twitter">
79
+ <i data-feather="twitter"></i>
80
+ </a>
81
+ <a href="https://linkedin.com" target="_blank" aria-label="LinkedIn">
82
+ <i data-feather="linkedin"></i>
83
+ </a>
84
+ </div>
85
+
86
+ <div class="footer-links">
87
+ <a href="/privacy.html">Privacy Policy</a>
88
+ <a href="/terms.html">Terms of Service</a>
89
+ <a href="/contact.html">Contact</a>
90
+ </div>
91
+
92
+ <div class="copyright">
93
+ &copy; 2024 GitHub Repository Analyzer Pro. All rights reserved. πŸš€
94
+ </div>
95
+ </div>
96
+ </footer>
97
+ `;
98
+
99
+ feather.replace();
100
+ }
101
+ }
102
+
103
+ customElements.define('custom-footer', CustomFooter);
components/navbar.js ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class CustomNavbar extends HTMLElement {
2
+ connectedCallback() {
3
+ this.attachShadow({ mode: 'open' });
4
+ this.shadowRoot.innerHTML = `
5
+ <style>
6
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
7
+
8
+ nav {
9
+ background: rgba(17, 24, 39, 0.8);
10
+ backdrop-filter: blur(10px);
11
+ padding: 1rem 2rem;
12
+ display: flex;
13
+ justify-content: space-between;
14
+ align-items: center;
15
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
16
+ position: sticky;
17
+ top: 0;
18
+ z-index: 1000;
19
+ }
20
+
21
+ .logo {
22
+ color: white;
23
+ font-weight: bold;
24
+ font-size: 1.5rem;
25
+ background: linear-gradient(45deg, #8b5cf6, #ec4899);
26
+ background-clip: text;
27
+ -webkit-background-clip: text;
28
+ -webkit-text-fill-color: transparent;
29
+ animation: gradient-shift 3s ease infinite;
30
+ }
31
+
32
+ .nav-links {
33
+ display: flex;
34
+ gap: 2rem;
35
+ list-style: none;
36
+ margin: 0;
37
+ padding: 0;
38
+ }
39
+
40
+ .nav-links a {
41
+ color: #d1d5db;
42
+ text-decoration: none;
43
+ font-weight: 500;
44
+ transition: all 0.3s ease;
45
+ position: relative;
46
+ }
47
+
48
+ .nav-links a:hover {
49
+ color: white;
50
+ }
51
+
52
+ .nav-links a::after {
53
+ content: '';
54
+ position: absolute;
55
+ bottom: -5px;
56
+ left: 0;
57
+ width: 0;
58
+ height: 2px;
59
+ background: linear-gradient(45deg, #8b5cf6, #ec4899);
60
+ transition: width 0.3s ease;
61
+ }
62
+
63
+ .nav-links a:hover::after {
64
+ width: 100%;
65
+ }
66
+
67
+ .mobile-menu-btn {
68
+ display: none;
69
+ background: none;
70
+ border: none;
71
+ color: white;
72
+ cursor: pointer;
73
+ }
74
+
75
+ @keyframes gradient-shift {
76
+ 0% {
77
+ background-position: 0% 50%;
78
+ }
79
+ 50% {
80
+ background-position: 100% 50%;
81
+ }
82
+ 100% {
83
+ background-position: 0% 50%;
84
+ }
85
+ }
86
+
87
+ @media (max-width: 768px) {
88
+ nav {
89
+ padding: 1rem;
90
+ }
91
+
92
+ .mobile-menu-btn {
93
+ display: block;
94
+ }
95
+
96
+ .nav-links {
97
+ position: absolute;
98
+ top: 100%;
99
+ left: 0;
100
+ right: 0;
101
+ background: rgba(17, 24, 39, 0.95);
102
+ backdrop-filter: blur(10px);
103
+ flex-direction: column;
104
+ padding: 1rem;
105
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
106
+ display: none;
107
+ }
108
+
109
+ .nav-links.active {
110
+ display: flex;
111
+ }
112
+ }
113
+ </style>
114
+ <nav>
115
+ <div class="logo">GitHub Analyzer Pro</div>
116
+
117
+ <button class="mobile-menu-btn">
118
+ <i data-feather="menu"></i>
119
+ </button>
120
+
121
+ <ul class="nav-links">
122
+ <li><a href="/">Home</a></li>
123
+ <li><a href="/about.html">About</a></li>
124
+ <li><a href="https://github.com" target="_blank">GitHub</a></li>
125
+ </ul>
126
+ </nav>
127
+ `;
128
+
129
+ // Mobile menu functionality
130
+ const mobileMenuBtn = this.shadowRoot.querySelector('.mobile-menu-btn');
131
+ const navLinks = this.shadowRoot.querySelector('.nav-links');
132
+
133
+ if (mobileMenuBtn && navLinks) {
134
+ mobileMenuBtn.addEventListener('click', () => {
135
+ navLinks.classList.toggle('active');
136
+ feather.replace();
137
+ });
138
+ }
139
+
140
+ feather.replace();
141
+ }
142
+ }
143
+
144
+ customElements.define('custom-navbar', CustomNavbar);
index.html CHANGED
@@ -1,19 +1,142 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>GitHub Repository Analyzer Pro</title>
7
+ <link rel="icon" type="image/x-icon" href="/static/favicon.ico">
8
+ <link rel="stylesheet" href="style.css">
9
+ <script src="https://cdn.tailwindcss.com"></script>
10
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
11
+ <script src="https://unpkg.com/feather-icons"></script>
12
+ <script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.globe.min.js"></script>
13
+ </head>
14
+ <body class="min-h-screen bg-gradient-to-br from-gray-900 via-purple-900 to-violet-900">
15
+ <custom-navbar></custom-navbar>
16
+
17
+ <main class="container mx-auto px-4 py-8">
18
+ <!-- Hero Section -->
19
+ <section class="text-center mb-16">
20
+ <h1 class="text-5xl md:text-7xl font-bold text-white mb-6">
21
+ GitHub Repository
22
+ <span class="bg-gradient-to-r from-purple-400 to-pink-600 bg-clip-text text-transparent">
23
+ Analyzer Pro
24
+ </span>
25
+ </h1>
26
+ <p class="text-xl text-gray-300 mb-8 max-w-2xl mx-auto">
27
+ Dive deep into your GitHub repositories with our powerful analysis tool.
28
+ Get insights, metrics, and beautiful visualizations in seconds.
29
+ </p>
30
+
31
+ <!-- Repository Input Form -->
32
+ <div class="max-w-md mx-auto bg-white/10 backdrop-blur-lg rounded-2xl p-8 border border-white/20">
33
+ <form id="repoForm" class="space-y-6">
34
+ <div>
35
+ <label for="username" class="block text-sm font-medium text-gray-300 mb-2">
36
+ GitHub Username
37
+ </label>
38
+ <input
39
+ type="text"
40
+ id="username"
41
+ required
42
+ class="w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:border-transparent"
43
+ placeholder="Enter your GitHub username"
44
+ >
45
+ </div>
46
+ <div>
47
+ <label for="repoName" class="block text-sm font-medium text-gray-300 mb-2">
48
+ Repository Name
49
+ </label>
50
+ <input
51
+ type="text"
52
+ id="repoName"
53
+ required
54
+ class="w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:border-transparent"
55
+ placeholder="Enter repository name"
56
+ >
57
+ </div>
58
+ <button
59
+ type="submit"
60
+ class="w-full bg-gradient-to-r from-purple-500 to-pink-600 text-white font-semibold py-3 px-6 rounded-lg hover:from-purple-600 hover:to-pink-700 transition-all duration-300 transform hover:scale-105"
61
+ >
62
+ <i data-feather="search" class="inline mr-2"></i>
63
+ Analyze Repository
64
+ </button>
65
+ </form>
66
+ </div>
67
+ </section>
68
+
69
+ <!-- Features Section -->
70
+ <section class="mb-16">
71
+ <h2 class="text-3xl font-bold text-white text-center mb-12">What We Analyze</h2>
72
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-8">
73
+ <div class="bg-white/5 backdrop-blur-lg rounded-2xl p-6 border border-white/10 hover:border-purple-400/50 transition-all duration-300">
74
+ <div class="text-purple-400 mb-4">
75
+ <i data-feather="code"></i>
76
+ </div>
77
+ <h3 class="text-xl font-semibold text-white mb-3">Code Quality</h3>
78
+ <p class="text-gray-400">Detailed analysis of code structure, complexity, and best practices.</p>
79
+ </div>
80
+
81
+ <div class="bg-white/5 backdrop-blur-lg rounded-2xl p-6 border border-white/10 hover:border-purple-400/50 transition-all duration-300">
82
+ <div class="text-purple-400 mb-4">
83
+ <i data-feather="trending-up"></i>
84
+ </div>
85
+ <h3 class="text-xl font-semibold text-white mb-3">Performance Metrics</h3>
86
+ <p class="text-gray-400">Track commits, issues, pull requests, and contributor activity.</p>
87
+ </div>
88
+
89
+ <div class="bg-white/5 backdrop-blur-lg rounded-2xl p-6 border border-white/10 hover:border-purple-400/50 transition-all duration-300">
90
+ <div class="text-purple-400 mb-4">
91
+ <i data-feather="users"></i>
92
+ </div>
93
+ <h3 class="text-xl font-semibold text-white mb-3">Team Insights</h3>
94
+ <p class="text-gray-400">Understand contributor patterns and collaboration dynamics.</p>
95
+ </div>
96
+ </div>
97
+ </section>
98
+
99
+ <!-- Results Section -->
100
+ <section id="results" class="hidden">
101
+ <div class="bg-white/5 backdrop-blur-lg rounded-2xl p-8 border border-white/20">
102
+ <h2 class="text-3xl font-bold text-white mb-6">Analysis Results</h2>
103
+ <div id="loading" class="hidden text-center py-8">
104
+ <div class="inline-block animate-spin rounded-full h-12 w-12 border-b-2 border-purple-500"></div>
105
+ </div>
106
+ <div id="analysisData" class="space-y-6"></div>
107
+ </div>
108
+ </section>
109
+ </main>
110
+
111
+ <custom-footer></custom-footer>
112
+
113
+ <!-- Component Scripts -->
114
+ <script src="components/navbar.js"></script>
115
+ <script src="components/footer.js"></script>
116
+
117
+ <!-- Main Script -->
118
+ <script src="script.js"></script>
119
+
120
+ <!-- Initialize Vanta.js Globe -->
121
+ <script>
122
+ VANTA.GLOBE({
123
+ el: "body",
124
+ mouseControls: true,
125
+ touchControls: true,
126
+ gyroControls: false,
127
+ minHeight: 200.00,
128
+ minWidth: 200.00,
129
+ scale: 1.00,
130
+ scaleMobile: 1.00,
131
+ color: 0x8b5cf6,
132
+ backgroundColor: 0x111827,
133
+ size: 0.8
134
+ });
135
+ </script>
136
+
137
+ <script>
138
+ feather.replace();
139
+ </script>
140
+ <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
141
+ </body>
142
+ </html>
script.js ADDED
@@ -0,0 +1,223 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Shared JavaScript across all pages
2
+ class GitHubAnalyzer {
3
+ constructor() {
4
+ this.baseURL = 'https://api.github.com';
5
+ this.init();
6
+ }
7
+
8
+ init() {
9
+ this.bindEvents();
10
+ }
11
+
12
+ bindEvents() {
13
+ const repoForm = document.getElementById('repoForm');
14
+ if (repoForm) {
15
+ repoForm.addEventListener('submit', (e) => this.handleRepoSubmit(e));
16
+ }
17
+ }
18
+
19
+ async handleRepoSubmit(e) {
20
+ e.preventDefault();
21
+
22
+ const username = document.getElementById('username').value.trim();
23
+ const repoName = document.getElementById('repoName').value.trim();
24
+
25
+ if (!username || !repoName) {
26
+ this.showError('Please enter both username and repository name');
27
+ return;
28
+ }
29
+
30
+ this.showLoading();
31
+ this.showResultsSection();
32
+
33
+ try {
34
+ const repoData = await this.fetchRepoData(username, repoName);
35
+ const contributorData = await this.fetchContributors(username, repoName);
36
+ const languagesData = await this.fetchLanguages(username, repoName);
37
+
38
+ this.displayAnalysisResults(repoData, contributorData, languagesData);
39
+ } catch (error) {
40
+ this.showError('Failed to fetch repository data. Please check the username and repository name.');
41
+ console.error('Error:', error);
42
+ } finally {
43
+ this.hideLoading();
44
+ }
45
+ }
46
+
47
+ async fetchRepoData(username, repoName) {
48
+ const response = await fetch(`${this.baseURL}/repos/${username}/${repoName}`);
49
+ if (!response.ok) {
50
+ throw new Error('Repository not found');
51
+ }
52
+ return await response.json();
53
+ }
54
+
55
+ async fetchContributors(username, repoName) {
56
+ const response = await fetch(`${this.baseURL}/repos/${username}/${repoName}/contributors`);
57
+ if (!response.ok) {
58
+ return [];
59
+ }
60
+ return await response.json();
61
+ }
62
+
63
+ async fetchLanguages(username, repoName) {
64
+ const response = await fetch(`${this.baseURL}/repos/${username}/${repoName}/languages`);
65
+ if (!response.ok) {
66
+ return {};
67
+ }
68
+ return await response.json();
69
+ }
70
+
71
+ displayAnalysisResults(repoData, contributors, languages) {
72
+ const analysisData = document.getElementById('analysisData');
73
+
74
+ // Calculate metrics
75
+ const stars = repoData.stargazers_count;
76
+ const forks = repoData.forks_count;
77
+ const openIssues = repoData.open_issues_count;
78
+ const watchers = repoData.watchers_count;
79
+ const sizeKB = Math.round(repoData.size / 1024);
80
+ const createdAt = new Date(repoData.created_at).toLocaleDateString();
81
+ const lastUpdate = new Date(repoData.updated_at).toLocaleDateString();
82
+
83
+ // Language distribution
84
+ const totalBytes = Object.values(languages).reduce((sum, bytes) => sum + bytes, 0);
85
+ const languagePercentages = Object.entries(languages).map(([lang, bytes]) => ({
86
+ language: lang,
87
+ percentage: Math.round((bytes / totalBytes) * 100)
88
+ }));
89
+
90
+ analysisData.innerHTML = `
91
+ <!-- Repository Overview -->
92
+ <div class="analysis-card bg-white/10 backdrop-blur-lg rounded-xl p-6 border border-white/20">
93
+ <h3 class="text-xl font-semibold text-white mb-4 flex items-center">
94
+ <i data-feather="book" class="mr-2"></i>
95
+ Repository Overview
96
+ </h3>
97
+ <div class="grid grid-cols-2 md:grid-cols-4 gap-4">
98
+ <div class="text-center">
99
+ <div class="text-2xl font-bold text-purple-400">${stars}</div>
100
+ <div class="text-sm text-gray-300">Stars</div>
101
+ </div>
102
+ <div class="text-center">
103
+ <div class="text-2xl font-bold text-purple-400">${forks}</div>
104
+ <div class="text-sm text-gray-300">Forks</div>
105
+ </div>
106
+ <div class="text-center">
107
+ <div class="text-2xl font-bold text-purple-400">${openIssues}</div>
108
+ <div class="text-sm text-gray-300">Open Issues</div>
109
+ </div>
110
+ <div class="text-center">
111
+ <div class="text-2xl font-bold text-purple-400">${watchers}</div>
112
+ <div class="text-sm text-gray-300">Watchers</div>
113
+ </div>
114
+ </div>
115
+ </div>
116
+
117
+ <!-- Language Distribution -->
118
+ <div class="analysis-card bg-white/10 backdrop-blur-lg rounded-xl p-6 border border-white/20">
119
+ <h3 class="text-xl font-semibold text-white mb-4 flex items-center">
120
+ <i data-feather="code" class="mr-2"></i>
121
+ Languages
122
+ </h3>
123
+ <div class="space-y-3">
124
+ ${languagePercentages.map(lang => `
125
+ <div class="flex items-center justify-between">
126
+ <span class="text-gray-300">${lang.language}</span>
127
+ <span class="text-purple-400 font-semibold">${lang.percentage}%</span>
128
+ </div>
129
+ `).join('')}
130
+ </div>
131
+ </div>
132
+
133
+ <!-- Contributors -->
134
+ <div class="analysis-card bg-white/10 backdrop-blur-lg rounded-xl p-6 border border-white/20">
135
+ <h3 class="text-xl font-semibold text-white mb-4 flex items-center">
136
+ <i data-feather="users" class="mr-2"></i>
137
+ Contributors (${contributors.length})
138
+ </h3>
139
+ <div class="grid grid-cols-2 md:grid-cols-4 gap-4">
140
+ ${contributors.slice(0, 8).map(contributor => `
141
+ <div class="text-center">
142
+ <img src="${contributor.avatar_url}" alt="${contributor.login}" class="w-12 h-12 rounded-full mx-auto mb-2 border-2 border-purple-400">
143
+ <div class="text-sm text-gray-300 truncate">${contributor.login}</div>
144
+ <div class="text-xs text-purple-400">${contributor.contributions} commits</div>
145
+ </div>
146
+ `).join('')}
147
+ </div>
148
+ </div>
149
+
150
+ <!-- Repository Details -->
151
+ <div class="analysis-card bg-white/10 backdrop-blur-lg rounded-xl p-6 border border-white/20">
152
+ <h3 class="text-xl font-semibold text-white mb-4 flex items-center">
153
+ <i data-feather="info" class="mr-2"></i>
154
+ Repository Details
155
+ </h3>
156
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
157
+ <div class="flex justify-between">
158
+ <span class="text-gray-300">Size</span>
159
+ <span class="text-purple-400">${sizeKB} KB</span>
160
+ </div>
161
+ <div class="flex justify-between">
162
+ <span class="text-gray-300">Created</span>
163
+ <span class="text-purple-400">${createdAt}</span>
164
+ </div>
165
+ <div class="flex justify-between">
166
+ <span class="text-gray-300">Last Updated</span>
167
+ <span class="text-purple-400">${lastUpdate}</span>
168
+ </div>
169
+ <div class="flex justify-between">
170
+ <span class="text-gray-300">Default Branch</span>
171
+ <span class="text-purple-400">${repoData.default_branch}</span>
172
+ </div>
173
+ </div>
174
+ </div>
175
+
176
+ <!-- Repository Description -->
177
+ ${repoData.description ? `
178
+ <div class="analysis-card bg-white/10 backdrop-blur-lg rounded-xl p-6 border border-white/20">
179
+ <h3 class="text-xl font-semibold text-white mb-4 flex items-center">
180
+ <i data-feather="file-text" class="mr-2"></i>
181
+ Description
182
+ </h3>
183
+ <p class="text-gray-300">${repoData.description}</p>
184
+ </div>
185
+ ` : ''}
186
+ `;
187
+
188
+ feather.replace();
189
+ }
190
+
191
+ showLoading() {
192
+ const loading = document.getElementById('loading');
193
+ if (loading) loading.classList.remove('hidden');
194
+ }
195
+
196
+ hideLoading() {
197
+ const loading = document.getElementById('loading');
198
+ if (loading) loading.classList.add('hidden');
199
+ }
200
+
201
+ showResultsSection() {
202
+ const results = document.getElementById('results');
203
+ if (results) results.classList.remove('hidden');
204
+ }
205
+
206
+ showError(message) {
207
+ alert(message); // In a real app, you'd use a better notification system
208
+ }
209
+ }
210
+
211
+ // Initialize the analyzer when DOM is loaded
212
+ document.addEventListener('DOMContentLoaded', () => {
213
+ new GitHubAnalyzer();
214
+ });
215
+
216
+ // Utility function for API calls
217
+ async function fetchWithErrorHandling(url, options = {}) {
218
+ const response = await fetch(url, options);
219
+ if (!response.ok) {
220
+ throw new Error(`HTTP error! status: ${response.status}`);
221
+ }
222
+ return await response.json();
223
+ }
style.css CHANGED
@@ -1,28 +1,82 @@
 
 
 
1
  body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  }
5
 
6
- h1 {
7
- font-size: 16px;
8
- margin-top: 0;
 
 
9
  }
10
 
11
- p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
 
 
 
 
 
16
  }
17
 
18
- .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
24
  }
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
 
28
  }
 
 
 
 
 
 
 
 
 
1
+ /* Shared styles across all pages */
2
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
3
+
4
  body {
5
+ font-family: 'Inter', sans-serif;
6
+ }
7
+
8
+ /* Custom scrollbar */
9
+ ::-webkit-scrollbar {
10
+ width: 8px;
11
+ }
12
+
13
+ ::-webkit-scrollbar-track {
14
+ background: #1f2937;
15
+ }
16
+
17
+ ::-webkit-scrollbar-thumb {
18
+ background: #7c3aed;
19
+ border-radius: 4px;
20
+ }
21
+
22
+ ::-webkit-scrollbar-thumb:hover {
23
+ background: #6d28d9;
24
+ }
25
+
26
+ /* Loading animation */
27
+ @keyframes pulse {
28
+ 0%, 100% {
29
+ opacity: 1;
30
+ }
31
+ 50% {
32
+ opacity: 0.5;
33
+ }
34
+ }
35
+
36
+ .animate-pulse {
37
+ animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
38
+ }
39
+
40
+ /* Glass morphism effect */
41
+ .glass {
42
+ background: rgba(255, 255, 255, 0.1);
43
+ backdrop-filter: blur(10px);
44
+ border: 1px solid rgba(255, 255, 255, 0.2);
45
  }
46
 
47
+ /* Gradient text animation */
48
+ .gradient-text {
49
+ background: linear-gradient(45deg, #8b5cf6, #ec4899, #8b5cf6);
50
+ background-size: 200% 200%;
51
+ animation: gradient-shift 3s ease infinite;
52
  }
53
 
54
+ @keyframes gradient-shift {
55
+ 0% {
56
+ background-position: 0% 50%;
57
+ }
58
+ 50% {
59
+ background-position: 100% 50%;
60
+ }
61
+ 100% {
62
+ background-position: 0% 50%;
63
+ }
64
  }
65
 
66
+ /* Card hover effects */
67
+ .analysis-card {
68
+ transition: all 0.3s ease;
 
 
 
69
  }
70
 
71
+ .analysis-card:hover {
72
+ transform: translateY(-5px);
73
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
74
  }
75
+
76
+ /* Responsive adjustments */
77
+ @media (max-width: 768px) {
78
+ .container {
79
+ padding-left: 1rem;
80
+ padding-right: 1rem;
81
+ }
82
+ }