+ );
+}
\ No newline at end of file
diff --git a/frontend/src/components/faq/GettingStartedFAQ.jsx b/frontend/src/components/faq/GettingStartedFAQ.jsx
new file mode 100644
index 0000000..b9ebc82
--- /dev/null
+++ b/frontend/src/components/faq/GettingStartedFAQ.jsx
@@ -0,0 +1,37 @@
+import { gettingStartedFaqs } from "../../data/faqs/gettingStarted";
+
+export default function GettingStartedFAQ() {
+ return (
+
+
+
+ Getting Started
+
+
+
+
+ {gettingStartedFaqs.map((faq) => (
+
+
+ {faq.q}
+
+
+
+ {faq.a}
+
+
+ ))}
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/frontend/src/components/faq/LegalComplianceFAQ.jsx b/frontend/src/components/faq/LegalComplianceFAQ.jsx
new file mode 100644
index 0000000..ac84fd1
--- /dev/null
+++ b/frontend/src/components/faq/LegalComplianceFAQ.jsx
@@ -0,0 +1,57 @@
+import { legalComplianceFaqs } from "../../data/faqs/legalCompliance";
+
+export default function LegalComplianceFAQ() {
+ return (
+
+
+
+ Legal Compliance
+
+
+
+
+
+
+ Policy • Terms • License
+
+
+
+ CodeLens follows transparent policies around privacy,
+ open-source licensing, user rights, and responsible data handling.
+
+
+
+
+
+ {legalComplianceFaqs.map((faq) => (
+
+
+
+
+ {faq.q}
+
+
+
+ {faq.a}
+
+
+
+
+ ))}
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/frontend/src/components/faq/OpenSourceContribFAQ.jsx b/frontend/src/components/faq/OpenSourceContribFAQ.jsx
new file mode 100644
index 0000000..7f497fb
--- /dev/null
+++ b/frontend/src/components/faq/OpenSourceContribFAQ.jsx
@@ -0,0 +1,22 @@
+import { openSourceContribFaqs } from "../../data/faqs/openSourceContrib";
+import FAQAccordion from "./FAQAccordion";
+
+export default function OpenSourceContribFAQ() {
+ return (
+
+
+
+ OPEN SOURCE CONTRIBUTION
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/frontend/src/components/faq/PerformanceFAQ.jsx b/frontend/src/components/faq/PerformanceFAQ.jsx
new file mode 100644
index 0000000..b036886
--- /dev/null
+++ b/frontend/src/components/faq/PerformanceFAQ.jsx
@@ -0,0 +1,49 @@
+import { performanceFaqs } from "../../data/faqs/performance";
+
+export default function PerformanceFAQ() {
+ if (!Array.isArray(performanceFaqs)) {
+ return (
+
+
+ Performance
+
+
+ No performance FAQs available yet.
+
+
+ );
+ }
+
+ return (
+
+
+ Performance
+
+
+
+ {performanceFaqs.map((faq) => (
+
+
+ {faq.q}
+
+
+
+
+ {faq.a}
+
+
+
+ ))}
+
+
+ );
+}
\ No newline at end of file
diff --git a/frontend/src/components/faq/PlatformIntegrationFAQ.jsx b/frontend/src/components/faq/PlatformIntegrationFAQ.jsx
new file mode 100644
index 0000000..0ca65b6
--- /dev/null
+++ b/frontend/src/components/faq/PlatformIntegrationFAQ.jsx
@@ -0,0 +1,21 @@
+import { platformIntegrationFaqs } from "../../data/faqs/platformIntegration";
+import FAQAccordion from "./FAQAccordion";
+
+export default function PlatformIntegrationFAQ() {
+ return (
+
+
+ PLATFORM INTEGRATIONS
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/frontend/src/components/faq/RoadmapFAQ.jsx b/frontend/src/components/faq/RoadmapFAQ.jsx
new file mode 100644
index 0000000..962e9ed
--- /dev/null
+++ b/frontend/src/components/faq/RoadmapFAQ.jsx
@@ -0,0 +1,22 @@
+import FAQAccordion from "./FAQAccordion";
+import { roadmapFaqs } from "../../data/faqs/roadmap";
+
+export default function RoadmapFAQ() {
+ return (
+
+
+
+ ROADMAP & FUTURE FEATURES
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/frontend/src/components/faq/TroubleshootingFAQ.jsx b/frontend/src/components/faq/TroubleshootingFAQ.jsx
new file mode 100644
index 0000000..9145ae2
--- /dev/null
+++ b/frontend/src/components/faq/TroubleshootingFAQ.jsx
@@ -0,0 +1,25 @@
+import FAQAccordion from "./FAQAccordion";
+import { troubleshootingFaqs } from "../../data/faqs/troubleshooting";
+
+export default function TroubleshootingFAQ() {
+ return (
+
+
+
+
+ Troubleshooting
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/frontend/src/data/faqs.js b/frontend/src/data/faqs.js
index b6c1eac..5d219b0 100644
--- a/frontend/src/data/faqs.js
+++ b/frontend/src/data/faqs.js
@@ -3,24 +3,30 @@ export const faqs = [
id: "what-is-codelens",
category: "Platform tracking",
q: "What is CodeLens?",
- a: "CodeLens is a platform that helps developers track their coding progress across different platforms like Codeforces, LeetCode, and GitHub in one place.",
+ a: "CodeLens is a platform that helps developers track coding progress across platforms.",
},
{
id: "problem-solved",
category: "Platform tracking",
q: "What problem does CodeLens solve?",
- a: "It brings all your coding activity into one place so you can understand your progress, stay consistent, and know what to improve next.",
+ a: "It brings all coding activity into one place.",
},
{
id: "data-privacy",
category: "Data privacy",
q: "Is my repository data private?",
- a: "CodeLens only uses publicly available data from connected platforms and does not store any sensitive information.",
+ a: "CodeLens uses only public data and does not store sensitive info.",
},
{
id: "contribute",
category: "Open source",
- q: "How can I contribute to CodeLens?",
- a: "You can contribute by solving issues, adding features, improving UI, or fixing bugs. Check the repository and start with beginner-friendly issues.",
+ q: "How can I contribute?",
+ a: "You can contribute via GitHub issues, features, and bug fixes.",
+ },
+ {
+ id: "performance-1",
+ category: "Performance",
+ q: "How does CodeLens perform?",
+ a: "It is optimized with caching and minimal API calls.",
},
];
diff --git a/frontend/src/data/faqs/accessibility.js b/frontend/src/data/faqs/accessibility.js
new file mode 100644
index 0000000..cbc3377
--- /dev/null
+++ b/frontend/src/data/faqs/accessibility.js
@@ -0,0 +1,27 @@
+export const accessibilityFaqs = [
+ {
+ id: "screen-reader",
+ q: "Is CodeLens screen-reader friendly?",
+ a: "The platform aims to follow accessible HTML practices for screen reader compatibility.",
+ },
+ {
+ id: "keyboard-nav",
+ q: "Are there keyboard navigation shortcuts?",
+ a: "Interactive elements are designed to remain keyboard accessible where possible.",
+ },
+ {
+ id: "high-contrast",
+ q: "Does CodeLens support high-contrast mode?",
+ a: "The UI design emphasizes readability and contrast for accessibility.",
+ },
+ {
+ id: "responsive-design",
+ q: "Does CodeLens work well on mobile devices?",
+ a: "The interface is designed to remain usable across desktop, tablet, and mobile screen sizes.",
+ },
+ {
+ id: "accessible-navigation",
+ q: "Can users navigate without using a mouse?",
+ a: "Interactive elements are built to support keyboard navigation for improved accessibility.",
+ }
+];
\ No newline at end of file
diff --git a/frontend/src/data/faqs/accountManagement.js b/frontend/src/data/faqs/accountManagement.js
new file mode 100644
index 0000000..ce0c135
--- /dev/null
+++ b/frontend/src/data/faqs/accountManagement.js
@@ -0,0 +1,22 @@
+export const accountManagementFaqs = [
+ {
+ id: "change-name",
+ q: "How do I change my display name or avatar?",
+ a: "Profile customization options are available inside account settings.",
+ },
+ {
+ id: "disconnect-platform",
+ q: "How do I disconnect a platform integration?",
+ a: "You can disconnect platforms through the integrations or profile settings page.",
+ },
+ {
+ id: "forgot-password",
+ q: "What happens if I forget my password?",
+ a: "Use the password recovery flow available on the login page.",
+ },
+ {
+ id: "multiple-profiles",
+ q: "Can I have multiple profiles on one account?",
+ a: "Each account is intended for a single developer identity and linked platform set.",
+ },
+];
\ No newline at end of file
diff --git a/frontend/src/data/faqs/analyticsDashboard.js b/frontend/src/data/faqs/analyticsDashboard.js
new file mode 100644
index 0000000..eb437fe
--- /dev/null
+++ b/frontend/src/data/faqs/analyticsDashboard.js
@@ -0,0 +1,27 @@
+export const analyticsDashboardFaqs = [
+ {
+ id: "metrics-track",
+ q: "What metrics does CodeLens track?",
+ a: "CodeLens tracks coding activity, GitHub contributions, problem-solving count, consistency, and platform progress.",
+ },
+ {
+ id: "rating-history",
+ q: "How is my rating history visualized?",
+ a: "Rating changes are shown using charts and progress visualizations over time.",
+ },
+ {
+ id: "compare-stats",
+ q: "Can I compare my stats with other users?",
+ a: "CodeLens may allow comparative analytics to benchmark your progress with other developers.",
+ },
+ {
+ id: "heatmap",
+ q: "What does the heatmap represent?",
+ a: "The heatmap represents consistency and activity patterns across coding platforms.",
+ },
+ {
+ id: "streaks",
+ q: "How are streaks calculated?",
+ a: "Streaks are calculated based on continuous coding activity tracked from connected platforms.",
+ },
+];
\ No newline at end of file
diff --git a/frontend/src/data/faqs/community.js b/frontend/src/data/faqs/community.js
new file mode 100644
index 0000000..b93dfc0
--- /dev/null
+++ b/frontend/src/data/faqs/community.js
@@ -0,0 +1,27 @@
+export const communityFaqs = [
+ {
+ id: "get-help",
+ q: "Where can I get help if something breaks?",
+ a: "You can ask for help through project support channels or issue discussions.",
+ },
+ {
+ id: "discord",
+ q: "Is there a Discord or community channel?",
+ a: "Community communication channels may be linked through the project repository.",
+ },
+ {
+ id: "reach-maintainers",
+ q: "How do I reach the maintainers?",
+ a: "Maintainers can usually be contacted through GitHub discussions or issue comments.",
+ },
+ {
+ id: "feature-request",
+ q: "How can I suggest a new feature?",
+ a: "Users can suggest ideas by opening discussions or contributing feature requests through the project repository.",
+ },
+ {
+ id: "bug-report",
+ q: "Where can I report bugs or issues?",
+ a: "Bugs can be reported through the open source repository issue tracker for maintainers to review.",
+ }
+];
\ No newline at end of file
diff --git a/frontend/src/data/faqs/dataPrivacy.js b/frontend/src/data/faqs/dataPrivacy.js
new file mode 100644
index 0000000..2f95dcb
--- /dev/null
+++ b/frontend/src/data/faqs/dataPrivacy.js
@@ -0,0 +1,27 @@
+export const dataPrivacyFaqs = [
+ {
+ id: "data-collect",
+ q: "What data does CodeLens collect?",
+ a: "CodeLens collects publicly available coding activity and platform statistics linked to connected accounts.",
+ },
+ {
+ id: "password-storage",
+ q: "Do you store my passwords or API tokens?",
+ a: "No. CodeLens does not store sensitive credentials such as passwords.",
+ },
+ {
+ id: "repo-private",
+ q: "Is my repository data private?",
+ a: "CodeLens only accesses publicly available repository information unless explicitly authorized.",
+ },
+ {
+ id: "delete-account",
+ q: "Can I delete my account and associated data?",
+ a: "Users can request account deletion and associated platform disconnection.",
+ },
+ {
+ id: "third-party-data",
+ q: "Do you share data with third parties?",
+ a: "No user data is shared externally without a clear product requirement or user permission.",
+ },
+];
\ No newline at end of file
diff --git a/frontend/src/data/faqs/gettingStarted.js b/frontend/src/data/faqs/gettingStarted.js
new file mode 100644
index 0000000..807a787
--- /dev/null
+++ b/frontend/src/data/faqs/gettingStarted.js
@@ -0,0 +1,27 @@
+export const gettingStartedFaqs = [
+ {
+ id: "what-is-codelens",
+ q: "What is CodeLens and who is it for?",
+ a: "CodeLens is an open-source developer analytics platform built for students, competitive programmers, and developers who want to track their coding progress in one place.",
+ },
+ {
+ id: "create-account",
+ q: "How do I create an account?",
+ a: "You can create an account by signing up on the platform and then connecting your developer profiles for tracking.",
+ },
+ {
+ id: "platform-connect",
+ q: "What platforms can I connect?",
+ a: "Currently CodeLens supports platforms like Codeforces, GitHub, and LeetCode for tracking activity and progress.",
+ },
+ {
+ id: "free-use",
+ q: "Is CodeLens free to use?",
+ a: "Yes. CodeLens is an open-source project and is free for developers to use.",
+ },
+ {
+ id: "competitive-programming",
+ q: "Do I need to be a competitive programmer to use CodeLens?",
+ a: "No. Anyone interested in tracking coding activity and developer growth can use CodeLens.",
+ },
+];
\ No newline at end of file
diff --git a/frontend/src/data/faqs/index.js b/frontend/src/data/faqs/index.js
new file mode 100644
index 0000000..267935e
--- /dev/null
+++ b/frontend/src/data/faqs/index.js
@@ -0,0 +1,12 @@
+export * from "./gettingStarted";
+export * from "./platformIntegration";
+export * from "./analyticsDashboard";
+export * from "./dataPrivacy";
+export * from "./accountManagement";
+export * from "./openSourceContrib";
+export * from "./legalCompliance";
+export * from "./troubleshooting";
+export * from "./performance";
+export * from "./community";
+export * from "./roadmap";
+export * from "./accessibility";
\ No newline at end of file
diff --git a/frontend/src/data/faqs/legalCompliance.js b/frontend/src/data/faqs/legalCompliance.js
new file mode 100644
index 0000000..4fb8557
--- /dev/null
+++ b/frontend/src/data/faqs/legalCompliance.js
@@ -0,0 +1,22 @@
+export const legalComplianceFaqs = [
+ {
+ id: "terms",
+ q: "What are the Terms of Service?",
+ a: "Terms define acceptable usage, responsibilities, and limitations while using CodeLens.",
+ },
+ {
+ id: "privacy-policy",
+ q: "What is your Privacy Policy?",
+ a: "The privacy policy explains what data is collected and how it is handled securely.",
+ },
+ {
+ id: "license",
+ q: "What license is CodeLens distributed under?",
+ a: "CodeLens is distributed under its open-source project license available in the repository.",
+ },
+ {
+ id: "cookies",
+ q: "Do you use cookies?",
+ a: "Cookies may be used for authentication, session management, and improving user experience.",
+ },
+];
\ No newline at end of file
diff --git a/frontend/src/data/faqs/openSourceContrib.js b/frontend/src/data/faqs/openSourceContrib.js
new file mode 100644
index 0000000..61a5f19
--- /dev/null
+++ b/frontend/src/data/faqs/openSourceContrib.js
@@ -0,0 +1,27 @@
+export const openSourceContribFaqs = [
+ {
+ id: "how-contribute",
+ q: "How can I contribute to CodeLens?",
+ a: "You can contribute by fixing issues, improving UI, writing code, or improving documentation.",
+ },
+ {
+ id: "source-code",
+ q: "Where is the source code hosted?",
+ a: "The project source code is publicly available on GitHub.",
+ },
+ {
+ id: "tech-stack",
+ q: "What tech stack does CodeLens use?",
+ a: "CodeLens uses modern frontend and backend technologies for analytics and integrations.",
+ },
+ {
+ id: "report-bug",
+ q: "How do I report a bug?",
+ a: "You can report bugs by opening GitHub issues with reproduction details.",
+ },
+ {
+ id: "workflow",
+ q: "What is the contribution workflow?",
+ a: "Fork repository, create branch, make changes, push code, and open a pull request for review.",
+ },
+];
\ No newline at end of file
diff --git a/frontend/src/data/faqs/performance.js b/frontend/src/data/faqs/performance.js
new file mode 100644
index 0000000..e37fe1a
--- /dev/null
+++ b/frontend/src/data/faqs/performance.js
@@ -0,0 +1,27 @@
+export const performanceFaqs = [
+ {
+ id: "uptime",
+ q: "What is the expected uptime of CodeLens?",
+ a: "The platform is designed for reliable access with minimal downtime during maintenance.",
+ },
+ {
+ id: "rate-limit",
+ q: "Are there rate limits on data sync?",
+ a: "Platform APIs may enforce limits that affect synchronization frequency.",
+ },
+ {
+ id: "caching",
+ q: "How does caching work on the platform?",
+ a: "Caching reduces repeated API requests and improves dashboard loading performance.",
+ },
+ {
+ id: "dashboard-speed",
+ q: "Why does dashboard loading speed vary?",
+ a: "Loading speed may depend on API response times and the amount of connected platform data being fetched.",
+ },
+ {
+ id: "server-maintenance",
+ q: "Does scheduled maintenance affect availability?",
+ a: "Occasional maintenance may temporarily impact access while updates and infrastructure improvements are applied.",
+ }
+];
\ No newline at end of file
diff --git a/frontend/src/data/faqs/platformIntegration.js b/frontend/src/data/faqs/platformIntegration.js
new file mode 100644
index 0000000..92dd212
--- /dev/null
+++ b/frontend/src/data/faqs/platformIntegration.js
@@ -0,0 +1,27 @@
+export const platformIntegrationFaqs = [
+ {
+ id: "connect-codeforces",
+ q: "How do I connect my Codeforces account?",
+ a: "You can connect Codeforces by entering your username in the integration settings section.",
+ },
+ {
+ id: "connect-github",
+ q: "How do I connect my GitHub account?",
+ a: "GitHub can be connected through authentication and repository integration options available on the platform.",
+ },
+ {
+ id: "connect-leetcode",
+ q: "How do I connect LeetCode?",
+ a: "LeetCode profile integration allows CodeLens to fetch coding statistics and problem-solving activity.",
+ },
+ {
+ id: "data-pulled",
+ q: "What data is pulled from each platform?",
+ a: "CodeLens collects publicly available coding activity, contributions, rating history, and problem-solving metrics.",
+ },
+ {
+ id: "username-change",
+ q: "What happens if my platform username changes?",
+ a: "You may need to update the connected username manually so CodeLens can continue syncing data correctly.",
+ },
+];
\ No newline at end of file
diff --git a/frontend/src/data/faqs/roadmap.js b/frontend/src/data/faqs/roadmap.js
new file mode 100644
index 0000000..6823e41
--- /dev/null
+++ b/frontend/src/data/faqs/roadmap.js
@@ -0,0 +1,27 @@
+export const roadmapFaqs = [
+ {
+ id: "planned-features",
+ q: "What features are planned for CodeLens?",
+ a: "Future updates may include better analytics, more platform integrations, and UI improvements.",
+ },
+ {
+ id: "future-platforms",
+ q: "Will CodeLens support more platforms in the future?",
+ a: "Yes. Future development may expand support to additional coding platforms.",
+ },
+ {
+ id: "mobile-app",
+ q: "Is there a mobile app planned?",
+ a: "Mobile support may be considered as the platform grows.",
+ },
+ {
+ id: "new-platform-support",
+ q: "Will more coding platforms be supported in future?",
+ a: "Future development may include support for additional developer platforms based on community demand.",
+ },
+ {
+ id: "community-priority",
+ q: "Does community feedback influence the roadmap?",
+ a: "Community suggestions and contribution discussions can help shape future platform priorities.",
+ }
+];
\ No newline at end of file
diff --git a/frontend/src/data/faqs/troubleshooting.js b/frontend/src/data/faqs/troubleshooting.js
new file mode 100644
index 0000000..599268b
--- /dev/null
+++ b/frontend/src/data/faqs/troubleshooting.js
@@ -0,0 +1,27 @@
+export const troubleshootingFaqs = [
+ {
+ id: "codeforces-loading",
+ q: "My Codeforces data is not loading. What should I do?",
+ a: "Check whether the username is correct and confirm platform connection status.",
+ },
+ {
+ id: "github-empty",
+ q: "Why is my GitHub contribution graph empty?",
+ a: "GitHub data may require refresh or public repository activity to display correctly.",
+ },
+ {
+ id: "loading-state",
+ q: "The page is stuck loading. How do I fix it?",
+ a: "Refresh the page or reconnect integrations if data fetching fails.",
+ },
+ {
+ id: "stats-outdated",
+ q: "Why are my stats outdated?",
+ a: "Data synchronization may occur periodically instead of instantly.",
+ },
+ {
+ id: "integration-failed",
+ q: "Why is my platform integration failing?",
+ a: "Integration may fail if the entered username is invalid or the external platform API is temporarily unavailable.",
+ }
+];
\ No newline at end of file
diff --git a/frontend/src/index.css b/frontend/src/index.css
index 108ce24..03b076c 100644
--- a/frontend/src/index.css
+++ b/frontend/src/index.css
@@ -1,11 +1,13 @@
@import url('https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap');
@import "tailwindcss";
-@plugin "@tailwindcss/typography";
-
-@theme {
- --font-sans: 'Inter', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
-}
body {
font-family: 'Inter', sans-serif;
}
+
+@layer base {
+ html {
+ -webkit-text-size-adjust: 100%;
+ text-size-adjust: 100%;
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/pages/Contact.jsx b/frontend/src/pages/Contact.jsx
index b117f53..b9c9fb4 100644
--- a/frontend/src/pages/Contact.jsx
+++ b/frontend/src/pages/Contact.jsx
@@ -2,7 +2,7 @@ const Contact = () => {
const handleSubmit = (e) => {
e.preventDefault();
alert("Message sent!");
- e.target.reset();
+ e.currentTarget.reset();
};
return (
@@ -99,9 +99,22 @@ const Contact = () => {
-
+
-
+
Send message
diff --git a/frontend/src/pages/FAQPage.jsx b/frontend/src/pages/FAQPage.jsx
index 4c224d5..012b0eb 100644
--- a/frontend/src/pages/FAQPage.jsx
+++ b/frontend/src/pages/FAQPage.jsx
@@ -1,12 +1,21 @@
-import { useRef, useState } from "react";
import { useNavigate } from "react-router-dom";
-import { faqs } from "../data/faqs";
+import GettingStartedFAQ from "../components/faq/GettingStartedFAQ";
+import PlatformIntegrationFAQ from "../components/faq/PlatformIntegrationFAQ";
+import AnalyticsDashboardFAQ from "../components/faq/AnalyticsDashboardFAQ";
+import DataPrivacyFAQ from "../components/faq/DataPrivacyFAQ";
+import AccountManagementFAQ from "../components/faq/AccountManagementFAQ";
+import OpenSourceContribFAQ from "../components/faq/OpenSourceContribFAQ";
+import LegalComplianceFAQ from "../components/faq/LegalComplianceFAQ";
+import TroubleshootingFAQ from "../components/faq/TroubleshootingFAQ";
+import PerformanceFAQ from "../components/faq/PerformanceFAQ";
+import CommunityFAQ from "../components/faq/CommunityFAQ";
+import RoadmapFAQ from "../components/faq/RoadmapFAQ";
+import AccessibilityFAQ from "../components/faq/AccessibilityFAQ";
+
-const supportTopics = [...new Set(faqs.map((item) => item.category))];
export default function FAQPage() {
- const [openIdx, setOpenIdx] = useState(null);
- const itemRefs = useRef([]);
+
const navigate = useNavigate();
const handleGoBack = () => {
@@ -18,23 +27,11 @@ export default function FAQPage() {
navigate("/explore");
};
- const toggleFaq = (index, shouldScroll = false) => {
- setOpenIdx((currentIndex) => (currentIndex === index ? null : index));
-
- if (shouldScroll) {
- window.requestAnimationFrame(() => {
- window.requestAnimationFrame(() => {
- itemRefs.current[index]?.scrollIntoView({
- behavior: "smooth",
- block: "start",
- });
- });
- });
- }
- };
+
return (
+
FAQ - CodeLens
+
Help Center / FAQ
+
Answers Without The Noise.
-
+
+
- Quick answers for developers connecting coding platforms, reading analytics,
- protecting profile data, and contributing to CodeLens.
+ Quick answers for developers connecting coding platforms, reading analytics,
+ protecting profile data, and contributing to CodeLens.