diff --git a/contributor/contributor.css b/contributor/contributor.css index 559f7f8d..aa00ec6d 100644 --- a/contributor/contributor.css +++ b/contributor/contributor.css @@ -1,291 +1,291 @@ * { - box-sizing: border-box; - margin: 0; - padding: 0; - } - - body { - font-family: Arial, sans-serif; - line-height: 1.6; - color: #333; - background-color: #f5f5f5; - } - - .contributor-container { - margin: 0 auto; - } - - /* Hero Section */ - .contributor-hero { - background-image: url('https://images.unsplash.com/photo-1522071820081-009f0129c71c?auto=format&fit=crop&w=2850&q=80'); - background-size: cover; - background-position: center; - height: 70vh; - display: flex; - align-items: center; - justify-content: center; - text-align: center; - position: relative; - } - - .contributor-hero::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.7); - } - - .contributor-hero-content { - position: relative; - z-index: 1; - color: #fff; - } - + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + font-family: Arial, sans-serif; + line-height: 1.6; + color: #333; + background-color: #f5f5f5; +} + +.contributor-container { + margin: 0 auto; +} + +/* Hero Section */ +.contributor-hero { + background-image: url('https://images.unsplash.com/photo-1522071820081-009f0129c71c?auto=format&fit=crop&w=2850&q=80'); + background-size: cover; + background-position: center; + height: 70vh; + display: flex; + align-items: center; + justify-content: center; + text-align: center; + position: relative; +} + +.contributor-hero::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.7); +} + +.contributor-hero-content { + position: relative; + z-index: 1; + color: #fff; +} + +.contributor-hero h1 { + font-size: 3.5rem; + margin-bottom: 1rem; +} + +.contributor-hero p { + font-size: 1.5rem; + margin-bottom: 2rem; +} + +/* Buttons */ +.contributor-btn { + display: inline-block; + padding: 0.8rem 1.5rem; + border: none; + border-radius: 5px; + font-size: 1rem; + cursor: pointer; + transition: background-color 0.3s ease; +} + +.contributor-btn-primary { + background-color: #fff; + color: #333; +} + +.contributor-btn-primary:hover { + background-color: #f0f0f0; +} + +.contributor-btn-secondary { + background-color: #333; + color: #fff; +} + +.contributor-btn-secondary:hover { + background-color: #444; +} + +/* Stats Section */ +.contributor-stats { + max-width: 1200px; + margin: 0 auto; + padding: 4rem 0; + text-align: center; +} + +.contributor-stats h2 { + font-size: 2rem; + margin-bottom: 2rem; +} + +.contributor-stats-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 2rem; +} + +.contributor-stat-card { + background-color: #fff; + border: 1px solid #e0e0e0; + border-radius: 10px; + padding: 1.5rem; + text-align: center; +} + +.contributor-stat-card .contributor-icon { + font-size: 2rem; + margin-bottom: 1rem; +} + +.contributor-stat-card h3 { + font-size: 2rem; + margin-bottom: 0.5rem; +} + +.contributor-stat-card p { + color: #666; +} + +/* Contributors Section */ +.contributor-contributors { + max-width: 1200px; + margin: 0 auto; + padding: 4rem 0; + text-align: center; +} + +.contributor-contributors h2 { + font-size: 2rem; + margin-bottom: 2rem; +} + +.contributor-contributors-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 2rem; +} + +.contributor-contributor-card { + background-color: #fff; + border: 1px solid #e0e0e0; + border-radius: 10px; + overflow: hidden; + transition: transform 0.3s ease, box-shadow 0.3s ease; +} + +.contributor-contributor-card:hover { + transform: translateY(-5px); + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1); +} + +.contributor-contributor-card img { + width: 100px; + height: 100px; + border-radius: 50%; + margin: 1.5rem auto; + display: block; + border: 4px solid #f0f0f0; +} + +.contributor-contributor-card h3 { + font-size: 1.2rem; + margin-bottom: 0.5rem; +} + +.contributor-contributor-card p { + color: #666; + margin-bottom: 1rem; +} + +.contributor-contributor-card .contributor-contributions { + background-color: #f0f0f0; + padding: 0.5rem 1rem; + border-radius: 20px; + display: inline-block; + margin-bottom: 1rem; +} + +.contributor-contributor-card .contributor-footer { + background-color: #f9f9f9; + padding: 1rem; + display: flex; + justify-content: space-between; + align-items: center; +} + +.contributor-contributor-card .contributor-footer a { + color: #333; + text-decoration: none; + display: flex; + align-items: center; +} + +.contributor-contributor-card .contributor-footer svg { + margin-right: 0.5rem; +} + +/* Loading Spinner */ +.contributor-loading { + display: flex; + justify-content: center; + align-items: center; + height: 200px; +} + +.contributor-spinner { + border: 4px solid #f3f3f3; + border-top: 4px solid #333; + border-radius: 50%; + width: 40px; + height: 40px; + animation: contributor-spin 1s linear infinite; +} + +@keyframes contributor-spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* Call to Action Section */ +.contributor-cta { + background-color: #333; + color: #fff; + padding: 4rem 0; + text-align: center; +} + +.contributor-cta h2 { + font-size: 2rem; + margin-bottom: 1rem; +} + +.contributor-cta p { + font-size: 1.2rem; + margin-bottom: 2rem; +} + +.contributor-cta form { + display: flex; + justify-content: center; + gap: 1rem; + margin-bottom: 1rem; +} + +.contributor-cta input[type="email"] { + padding: 0.8rem; + font-size: 1rem; + border: none; + border-radius: 5px; + width: 300px; +} + +.contributor-notification { + background-color: #4CAF50; + color: white; + padding: 1rem; + border-radius: 5px; + margin-top: 1rem; +} + +.contributor-hidden { + display: none; +} + +/* Responsive Design */ +@media (max-width: 768px) { .contributor-hero h1 { - font-size: 3.5rem; - margin-bottom: 1rem; + font-size: 2.5rem; } - + .contributor-hero p { - font-size: 1.5rem; - margin-bottom: 2rem; - } - - /* Buttons */ - .contributor-btn { - display: inline-block; - padding: 0.8rem 1.5rem; - border: none; - border-radius: 5px; - font-size: 1rem; - cursor: pointer; - transition: background-color 0.3s ease; - } - - .contributor-btn-primary { - background-color: #fff; - color: #333; - } - - .contributor-btn-primary:hover { - background-color: #f0f0f0; - } - - .contributor-btn-secondary { - background-color: #333; - color: #fff; - } - - .contributor-btn-secondary:hover { - background-color: #444; - } - - /* Stats Section */ - .contributor-stats { - max-width: 1200px; - margin: 0 auto; - padding: 4rem 0; - text-align: center; - } - - .contributor-stats h2 { - font-size: 2rem; - margin-bottom: 2rem; - } - - .contributor-stats-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 2rem; - } - - .contributor-stat-card { - background-color: #fff; - border: 1px solid #e0e0e0; - border-radius: 10px; - padding: 1.5rem; - text-align: center; - } - - .contributor-stat-card .contributor-icon { - font-size: 2rem; - margin-bottom: 1rem; - } - - .contributor-stat-card h3 { - font-size: 2rem; - margin-bottom: 0.5rem; - } - - .contributor-stat-card p { - color: #666; - } - - /* Contributors Section */ - .contributor-contributors { - max-width: 1200px; - margin: 0 auto; - padding: 4rem 0; - text-align: center; + font-size: 1.2rem; } - - .contributor-contributors h2 { - font-size: 2rem; - margin-bottom: 2rem; - } - - .contributor-contributors-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - gap: 2rem; - } - - .contributor-contributor-card { - background-color: #fff; - border: 1px solid #e0e0e0; - border-radius: 10px; - overflow: hidden; - transition: transform 0.3s ease, box-shadow 0.3s ease; - } - - .contributor-contributor-card:hover { - transform: translateY(-5px); - box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1); - } - - .contributor-contributor-card img { - width: 100px; - height: 100px; - border-radius: 50%; - margin: 1.5rem auto; - display: block; - border: 4px solid #f0f0f0; - } - - .contributor-contributor-card h3 { - font-size: 1.2rem; - margin-bottom: 0.5rem; - } - - .contributor-contributor-card p { - color: #666; - margin-bottom: 1rem; - } - - .contributor-contributor-card .contributor-contributions { - background-color: #f0f0f0; - padding: 0.5rem 1rem; - border-radius: 20px; - display: inline-block; - margin-bottom: 1rem; - } - - .contributor-contributor-card .contributor-footer { - background-color: #f9f9f9; - padding: 1rem; - display: flex; - justify-content: space-between; - align-items: center; - } - - .contributor-contributor-card .contributor-footer a { - color: #333; - text-decoration: none; - display: flex; - align-items: center; - } - - .contributor-contributor-card .contributor-footer svg { - margin-right: 0.5rem; - } - - /* Loading Spinner */ - .contributor-loading { - display: flex; - justify-content: center; - align-items: center; - height: 200px; - } - - .contributor-spinner { - border: 4px solid #f3f3f3; - border-top: 4px solid #333; - border-radius: 50%; - width: 40px; - height: 40px; - animation: contributor-spin 1s linear infinite; - } - - @keyframes contributor-spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } - } - - /* Call to Action Section */ - .contributor-cta { - background-color: #333; - color: #fff; - padding: 4rem 0; - text-align: center; - } - - .contributor-cta h2 { - font-size: 2rem; - margin-bottom: 1rem; - } - - .contributor-cta p { - font-size: 1.2rem; - margin-bottom: 2rem; - } - + .contributor-cta form { - display: flex; - justify-content: center; - gap: 1rem; - margin-bottom: 1rem; + flex-direction: column; + align-items: center; } - + .contributor-cta input[type="email"] { - padding: 0.8rem; - font-size: 1rem; - border: none; - border-radius: 5px; - width: 300px; - } - - .contributor-notification { - background-color: #4CAF50; - color: white; - padding: 1rem; - border-radius: 5px; - margin-top: 1rem; - } - - .contributor-hidden { - display: none; + width: 100%; + max-width: 300px; } - - /* Responsive Design */ - @media (max-width: 768px) { - .contributor-hero h1 { - font-size: 2.5rem; - } - - .contributor-hero p { - font-size: 1.2rem; - } - - .contributor-cta form { - flex-direction: column; - align-items: center; - } - - .contributor-cta input[type="email"] { - width: 100%; - max-width: 300px; - } - } \ No newline at end of file +} \ No newline at end of file diff --git a/contributor/contributor.html b/contributor/contributor.html index 30282d4e..4a7cd4c8 100644 --- a/contributor/contributor.html +++ b/contributor/contributor.html @@ -1,4 +1,3 @@ - diff --git a/contributor/contributor.js b/contributor/contributor.js index 4ff0ea2e..6aab8ba0 100644 --- a/contributor/contributor.js +++ b/contributor/contributor.js @@ -1,149 +1,143 @@ // Fetch data from GitHub API async function fetchData() { -Contributors - try { - const contributors = []; - let page = 1; - let totalContributions = 0; // Initialize total contributions - let moreContributors = true; - - // Fetch contributors in a loop until no more pages - while (moreContributors) { - const response = await fetch(`https://api.github.com/repos/PriyaGhosal/BuddyTrail/contributors?per_page=100&page=${page}`); - - // Check for rate limiting - if (response.status === 403) { - console.warn('Rate limit exceeded. Waiting for reset...'); - const resetTime = response.headers.get('X-RateLimit-Reset') * 1000; // Convert to milliseconds - const waitTime = resetTime - Date.now(); - if (waitTime > 0) { - await new Promise(resolve => setTimeout(resolve, waitTime)); // Wait until rate limit resets - } - continue; // Retry the request after waiting - } - - if (!response.ok) throw new Error('Failed to fetch contributors'); - const data = await response.json(); - - if (data.length > 0) { - contributors.push(...data); - // Accumulate contributions - totalContributions += data.reduce((sum, contributor) => sum + contributor.contributions, 0); - page++; - } else { - moreContributors = false; // No more contributors to fetch - } - } - - const repoResponse = await fetch('https://api.github.com/repos/PriyaGhosal/BuddyTrail'); - if (!repoResponse.ok) throw new Error('Failed to fetch repo data'); - const repoData = await repoResponse.json(); - - return { contributors, repoStats: repoData, totalContributions }; // Return total contributions - } catch (error) { - console.error('Error fetching data:', error); - return { contributors: [], repoStats: {}, totalContributions: 0 }; // Default value - } - main + try { + const contributorsResponse = await fetch( + "https://api.github.com/repos/PriyaGhosal/BuddyTrail/contributors" + ); + const contributorsData = await contributorsResponse.json(); + + const repoResponse = await fetch( + "https://api.github.com/repos/PriyaGhosal/BuddyTrail" + ); + const repoData = await repoResponse.json(); + + return { contributors: contributorsData, repoStats: repoData }; + } catch (error) { + console.error("Error fetching data:", error); + return { contributors: [], repoStats: {} }; + } } // Render stats function renderStats(repoStats, contributorsCount, totalContributions) { -Contributors - const statsGrid = document.getElementById('statsGrid'); - const stats = [ - { label: 'Contributors', value: contributorsCount, icon: 'users' }, - { label: 'Total Contributions', value: totalContributions, icon: 'git-commit' }, // Use total contributions - { label: 'GitHub Stars', value: repoStats.stargazers_count || 0, icon: 'star' }, - { label: 'Forks', value: repoStats.forks_count || 0, icon: 'git-branch' } - ]; - - statsGrid.innerHTML = stats.map(stat => ` -
-
${getIcon(stat.icon)}
-

${stat.value}

-

${stat.label}

-
- `).join(''); - main + const statsGrid = document.getElementById("statsGrid"); + const stats = [ + { label: "Contributors", value: contributorsCount, icon: "users" }, + { + label: "Total Contributions", + value: totalContributions, + icon: "git-commit", + }, + { + label: "GitHub Stars", + value: repoStats.stargazers_count || 0, + icon: "star", + }, + { label: "Forks", value: repoStats.forks_count || 0, icon: "git-branch" }, + ]; + + statsGrid.innerHTML = stats + .map( + (stat) => ` +
+
${getIcon(stat.icon)}
+

${stat.value}

+

${stat.label}

+
+ ` + ) + .join(""); } // Render contributors function renderContributors(contributors) { -Contributors - const contributorsGrid = document.getElementById('contributorsGrid'); - contributorsGrid.innerHTML = contributors.map(contributor => ` -
- ${contributor.login} -

${contributor.login}

-

${contributor.type}

-
${contributor.contributions} contributions
- -
- `).join(''); -main + const contributorsGrid = document.getElementById("contributorsGrid"); + contributorsGrid.innerHTML = contributors + .map( + (contributor) => ` +
+ ${contributor.login} +

${contributor.login}

+

${contributor.type}

+
${ + contributor.contributions + } contributions
+ +
+ ` + ) + .join(""); } // Helper function to get icons (simplified version) function getIcon(name) { - Contributors - const icons = { - 'users': '', - 'git-commit': '', - 'star': '', - 'git-branch': '', - 'external-link': '', - 'github': '' - }; - return icons[name] || ''; -main + const icons = { + users: + '', + "git-commit": + '', + star: '', + "git-branch": + '', + "external-link": + '', + github: + '', + }; + return icons[name] || ""; } // Initialize the page async function init() { -Contributors - const loading = document.getElementById('loading'); - const contributorsGrid = document.getElementById('contributorsGrid'); + const loading = document.getElementById("loading"); + const contributorsGrid = document.getElementById("contributorsGrid"); - loading.style.display = 'flex'; - contributorsGrid.style.display = 'none'; + loading.style.display = "flex"; + contributorsGrid.style.display = "none"; - const { contributors, repoStats, totalContributions } = await fetchData(); // Get total contributions + const { contributors, repoStats } = await fetchData(); + const totalContributions = contributors.reduce( + (sum, contributor) => sum + contributor.contributions, + 0 + ); - renderStats(repoStats, contributors.length, totalContributions); // Pass total contributions - renderContributors(contributors); + renderStats(repoStats, contributors.length, totalContributions); + renderContributors(contributors); - loading.style.display = 'none'; - contributorsGrid.style.display = 'grid'; + loading.style.display = "none"; + contributorsGrid.style.display = "grid"; } // Handle form submission -document.getElementById('subscribeForm').addEventListener('submit', function(e) { +document + .getElementById("subscribeForm") + .addEventListener("submit", function (e) { e.preventDefault(); - const email = document.getElementById('emailInput').value; - const notification = document.getElementById('notification'); - + const email = document.getElementById("emailInput").value; + const notification = document.getElementById("notification"); + notification.textContent = `Thank you for subscribing with ${email}. We'll keep you updated!`; - notification.classList.remove('hidden'); - - document.getElementById('emailInput').value = ''; - + notification.classList.remove("hidden"); + + document.getElementById("emailInput").value = ""; + setTimeout(() => { - notification.classList.add('hidden'); + notification.classList.add("hidden"); }, 5000); -}); + }); // Scroll to contribute section function scrollToContribute() { - document.getElementById('contribute').scrollIntoView({ behavior: 'smooth' }); + document.getElementById("contribute").scrollIntoView({ behavior: "smooth" }); } // Initialize the page when the DOM is loaded -document.addEventListener('DOMContentLoaded', init); -main +document.addEventListener("DOMContentLoaded", init); diff --git a/index.html b/index.html index 5723a63c..af991615 100644 --- a/index.html +++ b/index.html @@ -2559,7 +2559,7 @@

Quick Links

  • Services
  • Contact
  • Team
  • -
  • Our Contributor
  • +
  • Our Contributor