diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e859e37..7483ced 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -14,6 +14,7 @@ "lucide-react": "^1.17.0", "react": "^19.2.4", "react-dom": "^19.2.4", + "react-helmet-async": "^3.0.0", "react-markdown": "^10.1.0", "react-router-dom": "^7.13.2", "recharts": "^3.8.1", @@ -2712,6 +2713,15 @@ "node": ">=12" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", @@ -2811,7 +2821,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -3180,6 +3189,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -4127,6 +4148,26 @@ "react": "^19.2.4" } }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-3.0.0.tgz", + "integrity": "sha512-nA3IEZfXiclgrz4KLxAhqJqIfFDuvzQwlKwpdmzZIuC1KNSghDEIXmyU0TKtbM+NafnkICcwx8CECFrZ/sL/1w==", + "license": "Apache-2.0", + "dependencies": { + "invariant": "^2.2.4", + "react-fast-compare": "^3.2.2", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/react-is": { "version": "19.2.6", "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.6.tgz", @@ -4377,6 +4418,12 @@ "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", "license": "MIT" }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 7f310cb..746c2cb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -16,6 +16,7 @@ "lucide-react": "^1.17.0", "react": "^19.2.4", "react-dom": "^19.2.4", + "react-helmet-async": "^3.0.0", "react-markdown": "^10.1.0", "react-router-dom": "^7.13.2", "recharts": "^3.8.1", diff --git a/frontend/src/components/auth/ForgotPassword.jsx b/frontend/src/components/auth/ForgotPassword.jsx index 26364fe..ef24710 100644 --- a/frontend/src/components/auth/ForgotPassword.jsx +++ b/frontend/src/components/auth/ForgotPassword.jsx @@ -153,6 +153,7 @@ export default function ForgotPassword() {
- + +
+ setHandle(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter") { + e.preventDefault(); + handleInitiate(); + } + }} + className="flex-1 px-6 py-4 border-[4px] border-black text-lg font-black uppercase tracking-widest focus:outline-none bg-gray-50 rounded-none" + /> + + +
)} @@ -108,19 +128,20 @@ export default function VerifyModal({

Follow these steps carefully:

+
    {[ `Go to codeforces.com/settings`, `Set your Last Name to the code below`, `Click Save and return here`, `Click Verify — we will check and link your account`, - ].map((step, i) => ( + ].map((stepText, i) => (
  1. {i + 1} - {step} + {stepText}
  2. ))} @@ -146,6 +167,7 @@ export default function VerifyModal({ > ← Back + + +
    +

    + {item.a} +

    + +
    + + ); + })} + + ); +} \ 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 ( +
    + + + +
    + +
    +

    + 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 = () => { - + -