diff --git a/frontend/css/contributors.css b/frontend/css/contributors.css index d8101ab..49e1238 100644 --- a/frontend/css/contributors.css +++ b/frontend/css/contributors.css @@ -853,6 +853,97 @@ body.dark-mode .contributors-section p { text-overflow: ellipsis; } +.contributor-actions { + flex-shrink: 0; + margin-left: 1rem; + display: flex; + align-items: center; +} + +/* ===== Contributors Controls (Search + Toggle) ===== */ +.contributors-controls { + display: flex; + align-items: center; + justify-content: space-between; + gap: 20px; + margin: 30px auto 20px; + max-width: 900px; + flex-wrap: wrap; +} + +/* Search Wrapper */ +.search-wrapper { + position: relative; + flex: 1; + min-width: 280px; +} + +/* Search Icon */ +.search-icon { + position: absolute; + left: 14px; + top: 50%; + transform: translateY(-50%); + color: #9ca3af; + font-size: 15px; + pointer-events: none; +} + +/* Search Input Styling */ +#contributor-search { + width: 100%; + padding: 14px 16px 14px 42px; + border-radius: 12px; + border: 1.5px solid #e5e7eb; + font-size: 16px; + font-family: "Inter", sans-serif; + background: #ffffff; + transition: all 0.25s ease; + box-shadow: 0 4px 14px rgba(0, 0, 0, 0.04); +} + +/* Hover Effect */ +#contributor-search:hover { + border-color: #d1d5db; + box-shadow: 0 6px 18px rgba(0, 0, 0, 0.06); +} + +/* Focus Effect (Important for UX) */ +#contributor-search:focus { + outline: none; + border-color: var(--primary-gold, #d4af37); + box-shadow: 0 0 0 3px rgba(212, 175, 55, 0.15); + background: #ffffff; +} + +/* Bot Toggle Styling */ +.bot-toggle { + display: flex; + align-items: center; + gap: 8px; + font-weight: 500; + color: #374151; + background: #ffffff; + padding: 10px 14px; + border-radius: 10px; + border: 1px solid #e5e7eb; + transition: all 0.2s ease; + cursor: pointer; +} + +.bot-toggle:hover { + border-color: #d1d5db; + background: #f9fafb; +} + +.bot-toggle input { + accent-color: var(--primary-gold, #d4af37); + cursor: pointer; +} + +/* Mobile Responsiveness */ +@media (max-width: 640px) { + .contributors-controls { /* Animation trigger */ .contributor-card.is-visible { opacity: 1; @@ -963,7 +1054,6 @@ body.dark-mode .contributors-section p { /* ========================================= SKELETON LOADING ANIMATION -========================================= */ .contributor-skeleton { background: #fff; border: 1px solid #eee; @@ -1007,7 +1097,6 @@ body.dark-mode .contributors-section p { /* ========================================= DARK MODE OVERRIDES (The Fix) -========================================= */ body.dark-mode .contributor-card { background-color: #1e1e1e !important; border-color: #333 !important; @@ -1057,7 +1146,6 @@ body.dark-mode .sk { /* ========================================= CONTRIBUTORS STATS -========================================= */ .contributors-stats { display: flex; @@ -1118,7 +1206,6 @@ body.dark-mode .sk { /* ========================================= TOP CONTRIBUTOR – ENHANCED -========================================= */ .stat-pill.stat-top { background: linear-gradient(180deg, #e6c453, #fdeeb5); @@ -1141,7 +1228,6 @@ body.dark-mode .sk { /* ========================================= CONTRIBUTORS CONTROLS -========================================= */ .contributors-controls { display: flex; @@ -1183,7 +1269,6 @@ body.dark-mode .sk { /* ========================================= RESPONSIVE -========================================= */ @media (max-width: 768px) { .contributors-stats { @@ -1202,6 +1287,129 @@ body.dark-mode .sk { align-items: stretch; } + .bot-toggle { + justify-content: center; + } +} + +.contributors-section { + padding-top: 40px; +} + +.contributors-section h3 { + text-align: center; + margin-bottom: 10px; +} + +.contributors-section p { + text-align: center; + margin-bottom: 20px; + color: #6b7280; +} + +/* ===== Top Contributors Highlight Section ===== */ +.top-contributors-section { + max-width: 1100px; + margin: 40px auto 20px; + padding: 30px 24px; + background: linear-gradient(135deg, #fffaf0, #fff7e6); + border-radius: 20px; + border: 1px solid #f1e3b0; + box-shadow: 0 12px 35px rgba(212, 175, 55, 0.15); + text-align: center; +} + + +.top-title { + text-align: center; + font-size: 22px; + font-weight: 700; + margin-bottom: 20px; + color: #b8860b; + display: flex; + justify-content: center; + align-items: center; + gap: 8px; +} + +.top-title i { + color: #d4af37; +} + +.top-contributors-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + gap: 20px; +} + +/* Highlight Top Cards */ +.top-contributors-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 24px; + align-items: stretch; + justify-content: center; +} + +/* Rank Badge */ +.top-contributors-grid .contributor-card::before { + content: "🏆 Top"; + position: absolute; + top: 10px; + right: 10px; + background: #d4af37; + color: white; + font-size: 12px; + font-weight: 600; + padding: 4px 8px; + border-radius: 8px; +} + +.top-contributors-grid .contributor-card { + width: 100%; + max-width: 320px; + margin: 0 auto; + display: flex; + align-items: center; + justify-content: center; +} + + +/* Hover Effect */ +.top-contributors-grid .contributor-card:hover { + transform: scale(1.08) translateY(-5px); + box-shadow: 0 20px 45px rgba(212, 175, 55, 0.25); +} + +/* Dark Mode Support */ +body.dark-mode .top-contributors-section { + background: linear-gradient(135deg, #1f2937, #111827); + border: 1px solid #374151; +} + +body.dark-mode .top-title { + color: #facc15; +} +.top-card { + transform: scale(1.05); + border: 2px solid #f0d98c; + box-shadow: 0 15px 35px rgba(212, 175, 55, 0.18); + position: relative; +} + +.top-rank-badge { + position: absolute; + top: 10px; + right: 12px; + font-size: 20px; +} + +.contributor-chip.is-top { + background: #fff3cd; + color: #856404; + font-weight: 600; +} + .stat-pill { width: 100%; justify-content: center; @@ -1219,7 +1427,6 @@ body.dark-mode .sk { /* ========================================= DARK MODE -========================================= */ body.dark-mode .stat-pill { background: linear-gradient(180deg, #ffffff, #ffe9a9); @@ -1256,7 +1463,6 @@ body.dark-mode #contributor-search { /* ========================================= ANIMATION -========================================= */ @keyframes statFadeUp { to { @@ -1267,7 +1473,6 @@ body.dark-mode #contributor-search { /* ========================== Enhance contributors UI -========================== */ .dark-mode { --contributors-bg: #0f172a; @@ -1346,4 +1551,4 @@ body.dark-mode #contributor-search { /* Divider lines */ .dark-mode hr { border-color: var(--contributors-border); -} \ No newline at end of file +} diff --git a/frontend/css/feedback.css b/frontend/css/feedback.css index 5c21a3b..d8a2860 100644 --- a/frontend/css/feedback.css +++ b/frontend/css/feedback.css @@ -1,3 +1,11 @@ +body { + margin: 0; +} + +.feedback-header { + text-align: center; + padding: 40px 20px 0px; /* remove bottom gap */ + margin-bottom: 0; :root { --primary-gold: #d4af37; --deep-navy: #0a192f; @@ -30,6 +38,8 @@ body { align-items: center; } + + .feedback-header h1 { font-family: 'Playfair Display', serif; font-size: 3rem; @@ -55,6 +65,13 @@ body { color: var(--text-secondary-dark, #666); font-size: 1.1rem; max-width: 600px; + margin: 0 auto 60px; /* removes top gap */ + padding: 0 20px 40px; +} + + + +form { margin: 0 auto; line-height: 1.6; } @@ -177,6 +194,66 @@ body.dark-mode select:focus { box-shadow: 0 0 0 2px rgba(212, 175, 55, 0.2); } +/* ===== Card Layout Enhancement ===== */ + +.feedback-container { + max-width: 700px; + margin: auto; + padding: 40px 20px 80px; + display: flex; + justify-content: center; +} + +.feedback-card { + width: 100%; + background: #ffffff; + padding: 35px 30px; + border-radius: 14px; + box-shadow: 0 8px 30px rgba(0, 0, 0, 0.08); + transition: all 0.3s ease; + border: 1px solid rgba(0, 0, 0, 0.05); +} + +/* Hover effect for modern UI depth */ +.feedback-card:hover { + transform: translateY(-4px); + box-shadow: 0 14px 40px rgba(0, 0, 0, 0.12); +} + +/* Improve input styling consistency */ +.feedback-card input, +.feedback-card select, +.feedback-card textarea { + width: 100%; + padding: 12px; + border-radius: 8px; + border: 1px solid #dcdcdc; + font-size: 1rem; + transition: border 0.2s ease, box-shadow 0.2s ease; +} + +/* Focus interaction */ +.feedback-card input:focus, +.feedback-card select:focus, +.feedback-card textarea:focus { + outline: none; + border-color: var(--primary-gold); + box-shadow: 0 0 0 2px rgba(212, 175, 55, 0.2); +} + +/* Better button polish */ +.feedback-card button { + margin-top: 10px; + font-size: 1rem; + letter-spacing: 0.3px; + transition: transform 0.2s ease, box-shadow 0.2s ease; +} + +.feedback-card button:hover { + transform: translateY(-2px); + box-shadow: 0 6px 18px rgba(0, 0, 0, 0.1); +} + /* Dropdown options */ body.dark-mode select option { background-color: #0f1b2d; @@ -193,4 +270,4 @@ body.dark-mode input { body.dark-mode textarea::placeholder, body.dark-mode input::placeholder { color: #94a3b8 !important; -} \ No newline at end of file +} diff --git a/frontend/css/guides.css b/frontend/css/guides.css index 841c953..dcaa48f 100644 --- a/frontend/css/guides.css +++ b/frontend/css/guides.css @@ -814,10 +814,71 @@ body.dark-mode #scrollTopBtn:hover { } } +/* ========================================================= + DARK MODE FIX — GUIDES PAGE READABILITY (Issue #860) + ========================================================= */ + +/* Page background & base text */ +body.dark-mode { + background-color: #0f172a; + color: #e5e7eb; +} + +/* Section headings */ +body.dark-mode h2, +body.dark-mode h3, +body.dark-mode h4 { + color: #f9fafb !important; +} + +/* Paragraph text readability */ +body.dark-mode p, +body.dark-mode li { + color: #cbd5e1 !important; +} + +/* Guide cards (major issue: parchment background in dark mode) */ +body.dark-mode .guide-list li, +body.dark-mode .pr-steps li, +body.dark-mode .practice-item, +body.dark-mode .mistakes-list li { + background: #1e293b !important; /* replaces light parchment */ + color: #e5e7eb !important; + border: 1px solid rgba(255,255,255,0.06); +} + +/* Fix titles inside cards */ +body.dark-mode .guide-list h4, +body.dark-mode .pr-steps h4, +body.dark-mode .timeline-list h4, +body.dark-mode .practice-item h4 { + color: #ffffff !important; +} + +/* Fix description text inside components */ +body.dark-mode .guide-list p, +body.dark-mode .pr-steps p, +body.dark-mode .timeline-list p, +body.dark-mode .practice-item p, +body.dark-mode .mistakes-list p { + color: #cbd5e1 !important; +} + +/* Timeline line visibility */ +body.dark-mode .timeline-list::before { + background: linear-gradient(to bottom, #facc15, #eab308); +} + +/* Icons contrast */ +body.dark-mode .icon, +body.dark-mode .step, +body.dark-mode .mistake-icon { + background: #facc15 !important; + color: #0f172a !important; +} /* ===================================================== Dark Mode Refinement – Guides Page (Final Patch) Paste at the bottom of guides.css -===================================================== */ /* Section surfaces */ .dark-mode .guides-hero, @@ -943,4 +1004,4 @@ body.dark-mode .pr-steps h4, body.dark-mode .guide-list h4, body.dark-mode .mistakes-list p { color: #f9fafb; -} \ No newline at end of file +} diff --git a/frontend/css/style.css b/frontend/css/style.css index 1fe2411..7247781 100644 --- a/frontend/css/style.css +++ b/frontend/css/style.css @@ -1745,9 +1745,158 @@ body.dark-mode .chat-widget-btn { color: #0b1220; } +/* FAQ Accordion Styles */ +/* ===== FAQ Accordion - Improved Structure ===== */ +.faq-accordion { + max-width: 950px; + margin: 50px auto 0; + display: flex; + flex-direction: column; + gap: 16px; /* SPACE BETWEEN QUESTIONS */ +} + +.faq-item { + background: #ffffff; + border-radius: 14px; /* ROUNDED CORNERS */ + box-shadow: 0 4px 18px rgba(0, 0, 0, 0.06); + overflow: hidden; + transition: all 0.3s ease; + border: 1px solid #e5e7eb; +} + +/* Hover Card Effect */ +.faq-item:hover { + transform: translateY(-3px); + box-shadow: 0 10px 28px rgba(0, 0, 0, 0.12); + border-color: #d1d5db; +} + +.faq-question { + width: 100%; + background: #ffffff; + border: none; + padding: 20px 24px; + font-size: 19px; + font-weight: 600; + text-align: left; + cursor: pointer; + display: flex; + justify-content: space-between; + align-items: center; + color: #1f2937; + transition: all 0.25s ease; + border-radius: 14px; +} + +/* Hover effect on question */ +.faq-question:hover { + background: #f8fafc; +} + +/* Chevron icon animation */ +.faq-question i { + font-size: 16px; + transition: transform 0.3s ease; + color: #6b7280; +} + +.faq-item.active .faq-question i { + transform: rotate(180deg); +} + +/* Answer section */ +.faq-answer { + max-height: 0; + overflow: hidden; + background: #ffffff; + transition: max-height 0.35s ease, padding 0.3s ease; + padding: 0 24px; + border-top: 1px solid transparent; +} + +/* When open */ +.faq-item.active { + border-color: #e2e8f0; +} + +.faq-item.active .faq-answer { + max-height: 300px; + padding: 10px 24px 22px 24px; + border-top: 1px solid #f1f5f9; +} + +.faq-answer p { + margin: 0; + color: #4b5563; + font-size: 16px; + line-height: 1.7; +} + +/* ===== FAQ CTA Redirect Card ===== */ +.faq-cta-card { + max-width: 950px; + margin: 30px auto 0; + padding: 28px 24px; + border-radius: 16px; + text-align: center; + background: linear-gradient(135deg, #fffaf0, #fff3d6); + border: 1px solid #f1e3b0; + box-shadow: 0 10px 30px rgba(212, 175, 55, 0.15); + transition: transform 0.3s ease, box-shadow 0.3s ease; +} + +.faq-cta-card:hover { + transform: translateY(-4px); + box-shadow: 0 16px 40px rgba(212, 175, 55, 0.25); +} + +.faq-cta-content h4 { + font-size: 1.6rem; + margin-bottom: 10px; + color: #b8860b; + font-weight: 700; +} + +.faq-cta-content p { + font-size: 1rem; + color: #555; + margin-bottom: 18px; + line-height: 1.6; +} + +.faq-cta-btn { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 12px 22px; + border-radius: 10px; + background: #d4af37; + color: #fff; + text-decoration: none; + font-weight: 600; + transition: all 0.25s ease; +} + +.faq-cta-btn:hover { + background: #b8962e; + transform: translateY(-2px); +} + +/* Dark Mode Support */ +body.dark-mode .faq-cta-card { + background: linear-gradient(135deg, #1f2937, #111827); + border: 1px solid #374151; +} + +body.dark-mode .faq-cta-content h4 { + color: #facc15; +} + +body.dark-mode .faq-cta-content p { + color: #d1d5db; +} /* ========================= ACCESSIBILITY -========================= */ @media (prefers-reduced-motion: reduce) { footer.site-footer::after, @@ -1765,14 +1914,12 @@ body.dark-mode .chat-widget-btn { /* ========================= QUIZ SECTION SCROLLBAR -========================= */ #level-chain-wrapper::-webkit-scrollbar { display: none; } /* ========================= PRINT STYLES -========================= */ @media print { .why-section::before, @@ -1787,7 +1934,6 @@ body.dark-mode .chat-widget-btn { /* ========================= FOOTER (GLOBAL) -========================= */ footer.site-footer { position: relative; overflow: hidden; @@ -2044,7 +2190,6 @@ body.dark-mode footer.site-footer { /* ========================= RESOURCE LINKS -========================= */ .resource-link-wrapper { display: flex; align-items: center; @@ -2083,7 +2228,6 @@ body.dark-mode footer.site-footer { /* ========================= DARK MODE FIXES -========================= */ body.dark-mode .navbar, body.dark-mode header { background-color: rgba(27, 38, 59, 0.98); @@ -2292,4 +2436,4 @@ body.dark-mode .newsletter-section input { body.dark-mode { background: #121212 !important; -} \ No newline at end of file +} diff --git a/frontend/js/contributors.js b/frontend/js/contributors.js index 3ff5012..f9e156b 100644 --- a/frontend/js/contributors.js +++ b/frontend/js/contributors.js @@ -56,7 +56,11 @@ async function refreshInBackground() { writeCache(enriched); const grid = document.getElementById("contributors-grid"); - if (grid) renderContributorsGrid(grid, visibleContributors); + if (grid) { + renderTopContributors(visibleContributors); + renderContributorsGrid(grid, visibleContributors); +} + } catch { // Silent background refresh failure. } @@ -77,8 +81,12 @@ async function loadAndRender() { writeCache(enriched); setStatus(""); - renderContributorsGrid(grid, visibleContributors); - updateStats(visibleContributors); +renderTopContributors(visibleContributors); +renderTopContributors(visibleContributors); +renderContributorsGrid(grid, visibleContributors); +updateStats(visibleContributors); + + } catch (err) { renderEmptyState(grid); setStatus(formatError(err), true); @@ -149,10 +157,24 @@ function renderContributorsGrid(grid, list) { return; } + // 🔥 Remove Top 3 contributors (already shown in highlight section) + const topThreeLogins = new Set( + [...list] + .sort((a, b) => (b.merged_prs || 0) - (a.merged_prs || 0)) + .slice(0, 3) + .map(c => c.login) + ); + + const filteredList = list.filter(c => !topThreeLogins.has(c.login)); + + if (!filteredList.length) { + renderEmptyState(grid); + return; + } + const frag = document.createDocumentFragment(); - - list.forEach((c) => { + filteredList.forEach((c) => { const login = c?.login || c?.name || "Anonymous"; const mergedPrs = Number.isFinite(c?.merged_prs) ? c.merged_prs : 0; const avatar = c?.avatar_url @@ -162,7 +184,7 @@ function renderContributorsGrid(grid, list) { const isBot = (c?.type || "").toLowerCase() === "bot" || /\[bot\]$/i.test(login); const isFirstTime = isFirstTimeContributor(c); - const tier = getContributorTier(mergedPrs); // ✅ MOVE HERE + const tier = getContributorTier(mergedPrs); const card = document.createElement("div"); card.className = "contributor-card"; @@ -172,46 +194,42 @@ function renderContributorsGrid(grid, list) {
${escapeHtml(login)}
- - - ${mergedPrs} merged PR${mergedPrs === 1 ? "" : "s"} - - - ${ - isFirstTime - ? ` - - 🏅 First-time contributor - - ` - : "" - } - - ${ - tier - ? ` - - ${tier === "gold" ? "🥇 Gold" : tier === "silver" ? "🥈 Silver" : "🥉 Bronze"} - - ` - : "" - } - - ${ - isBot - ? ` - - Bot - - ` - : "" - } -
- - + + + ${mergedPrs} merged PR${mergedPrs === 1 ? "" : "s"} + + + ${ + isFirstTime + ? `🏅 First-time contributor` + : "" + } + + ${ + tier + ? ` + ${tier === "gold" ? "🥇 Gold" : tier === "silver" ? "🥈 Silver" : "🥉 Bronze"} + ` + : "" + } + + ${ + isBot + ? ` + Bot + ` + : "" + } +
- ${profileUrl ? `` : ""} + ${ + profileUrl + ? ` + + ` + : "" + }
`; @@ -223,6 +241,7 @@ function renderContributorsGrid(grid, list) { grid.appendChild(frag); } + function fallbackAvatar(seed) { // Inline SVG fallback so we never show a broken image. const initial = @@ -492,6 +511,61 @@ function updateStats(list, allList = allContributors) { animateStatCounts(); } +function renderTopContributors(contributors) { + const topGrid = document.getElementById("top-contributors-grid"); + if (!topGrid) return; + + // Use merged PRs (your actual metric) + const topThree = [...contributors] + .sort((a, b) => (b.merged_prs || 0) - (a.merged_prs || 0)) + .slice(0, 3); + + topGrid.innerHTML = ""; + + topThree.forEach((c, index) => { + const login = c?.login || "Anonymous"; + const mergedPrs = c?.merged_prs || 0; + const avatar = c?.avatar_url + ? `${c.avatar_url}&s=200` + : fallbackAvatar(login); + const profileUrl = c?.html_url || ""; + + const card = document.createElement("div"); + card.className = "contributor-card top-card"; + + card.innerHTML = ` +
+
+ ${index === 0 ? "🥇" : index === 1 ? "🥈" : "🥉"} +
+ ${escapeHtml(login)} avatar +
+
${escapeHtml(login)}
+
+ + + ${mergedPrs} merged PR${mergedPrs === 1 ? "" : "s"} + + + 🏆 Top Contributor + +
+
+
+ ${ + profileUrl + ? ` + + ` + : "" + } +
+
+ `; + + topGrid.appendChild(card); + }); +} function animateStatCounts() { const counters = document.querySelectorAll(".stat-count"); @@ -513,4 +587,4 @@ function animateStatCounts() { tick(); }); -} \ No newline at end of file +} diff --git a/frontend/pages/Event/gsoc.html b/frontend/pages/Event/gsoc.html index bdfd6f9..b9bbc70 100644 --- a/frontend/pages/Event/gsoc.html +++ b/frontend/pages/Event/gsoc.html @@ -16,11 +16,977 @@ +
+

OpenSource Compass

+ +
+ + +
+

Tips to Get Selected for GSoC

+

Practical strategies that significantly increase your chances of getting accepted into Google Summer of Code.

+ +
+
+ +

Start Contributing Early

+

Begin contributing to open source projects before the application period to build credibility and familiarity with the codebase.

+
+ +
+ +

Pick Beginner-Friendly Issues

+

Look for “good first issue” or “beginner-friendly” tags to understand the project structure and workflow.

+
+ +
+ +

Communicate with Mentors

+

Actively interact in community channels like Discord, Slack, or mailing lists to show genuine interest.

+
+ +
+ +

Write a Strong Proposal

+

Create a detailed proposal with technical approach, timeline, and expected deliverables to stand out.

+
+ +
+ +

Be Consistent

+

Regular contributions and consistent activity show commitment and reliability to mentors.

+
+ +
+ +

Understand the Codebase

+

Study documentation, past PRs, and project architecture before proposing your idea.

+
+
+
+ + +
+

Ready to Start Your GSoC Journey?

+

Take the first step today. Begin preparing, contribute to open source, and build your profile for GSoC 2026.

+
+ + + Read FAQ
@@ -589,6 +1607,79 @@

Ready to Kickstart Your GSoC Journey?

+ diff --git a/frontend/pages/contributors.html b/frontend/pages/contributors.html index 2f86f11..fd2c876 100644 --- a/frontend/pages/contributors.html +++ b/frontend/pages/contributors.html @@ -34,6 +34,40 @@

Contributors

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

+ Top Contributors +

+
+
+ + +
+ +
+ +

Frequently Asked Questions

Common questions about OpenSource Compass and open source contributions.

+
+
+ +
+

OpenSource Compass is a platform that helps beginners navigate open source by providing structured guides, resources, and program information.

+
+
+ +
+ +
+

No. You can contribute to open source through documentation, design, testing, community support, and many other non-coding roles.

+
+
+ +
+ +
+

Start by reading contribution guides, choosing a beginner-friendly project, and working on small issues such as documentation or bug fixes.

+
+
+ +
+ +
+

Pick projects that match your interests and skill level. Look for repositories with labels like “good first issue” or “help wanted”.

+
+
+ +
+ +
+

Contributing helps you build a portfolio, improve technical skills, collaborate globally, and gain real-world development experience.

+
+
+ +
+ +
+

Most projects have active communities on GitHub, Discord, or Slack. Asking questions is encouraged and is part of open-source culture.

+
+
+ +
+ +
+

Look for repositories with labels like good first issue, beginner, or help wanted.

+
+
+ +
+ +
+

A good first issue is a small, well-defined task that helps beginners understand the project without deep knowledge of the entire codebase.

+
+
+ +
+ +
+

Basic Git knowledge is helpful, but not mandatory. Many projects provide step-by-step contribution guides.

+
+
+ +
+ +
+

Be polite, clear, and patient. Use GitHub issues or discussions to ask questions and seek feedback before starting work.

+
+
+ +
+ +
+

Don’t be discouraged. Read the feedback carefully, make the suggested changes, or ask for clarification.

+
+
+
+ + +
+
@@ -448,6 +575,29 @@

Frequently Asked Questions

+ + +