diff --git a/app/components/modules/CodeBlock.jsx b/app/components/modules/CodeBlock.jsx new file mode 100755 index 0000000..e7a31fa --- /dev/null +++ b/app/components/modules/CodeBlock.jsx @@ -0,0 +1,155 @@ +"use client"; +import { useState } from "react"; +import { FaCopy, FaCheck, FaCode } from "react-icons/fa"; +import { motion, AnimatePresence } from "framer-motion"; +import hljs from "highlight.js"; +import "highlight.js/styles/github.css"; +import "highlight.js/styles/github-dark.css"; + +const LANGUAGE_NAMES = { + javascript: "JavaScript", + python: "Python", + java: "Java", + c: "C", + cpp: "C++", +}; + +export const highlightCode = (code, language) => { + const validLanguage = hljs.getLanguage(language) ? language : "plaintext"; + return hljs.highlight(code, { language: validLanguage }).value; +}; + +const CodeBlock = ({ title, codeExamples }) => { + const languageIds = Object.keys(codeExamples); + const [selectedLanguage, setSelectedLanguage] = useState(languageIds[0]); + const [copied, setCopied] = useState(false); + const [isHovered, setIsHovered] = useState(false); + + const copyToClipboard = async (text) => { + try { + await navigator.clipboard.writeText(text); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } catch (err) { + console.error("Failed to copy text: ", err); + } + }; + + return ( +
setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + > + + {/* Header */} +
+
+ +

+ {title} +

+
+ + copyToClipboard(codeExamples[selectedLanguage])} + className="flex items-center gap-2 px-3 py-1.5 bg-gray-100 dark:bg-gray-600 rounded-lg hover:bg-gray-200 dark:hover:bg-gray-500 transition-colors text-gray-800 dark:text-gray-100 text-sm font-medium" + aria-label="Copy code" + > + + {copied ? ( + + Copied + + ) : ( + + Copy Code + + )} + + +
+ + {/* Language Selector */} +
+ {languageIds.map((id) => ( + setSelectedLanguage(id)} + className={`px-3 py-1.5 rounded-lg text-sm font-medium transition-colors ${ + selectedLanguage === id + ? "bg-blue-500 text-white shadow-md" + : "bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200 hover:bg-gray-200 dark:hover:bg-gray-600" + }`} + > + {LANGUAGE_NAMES[id] || id} + + ))} +
+ + {/* Code Block */} +
+ + +
+                
+              
+
+
+ + {/* Language indicator (shown on hover) */} + + {isHovered && ( + + {selectedLanguage.toUpperCase()} + + )} + +
+
+
+ ); +}; + +export default CodeBlock; diff --git a/app/visualizer/linkedList/operations/comparison/animation.jsx b/app/visualizer/linkedList/operations/comparison/animation.jsx index c6e9bc3..be41ef1 100755 --- a/app/visualizer/linkedList/operations/comparison/animation.jsx +++ b/app/visualizer/linkedList/operations/comparison/animation.jsx @@ -1,13 +1,6 @@ "use client"; import React, { useState, useRef, useEffect } from 'react'; import { gsap } from 'gsap'; -import Footer from '@/app/components/footer'; -import ExploreOther from '@/app/components/ui/exploreOther'; -import Content from "@/app/visualizer/linkedList/operations/comparison/content"; -import Quiz from '@/app/visualizer/linkedList/operations/comparison/quiz'; -import CodeBlock from "@/app/visualizer/linkedList/operations/comparison/codeBlock"; -import BackToTop from '@/app/components/ui/backtotop'; -import GoBackButton from "@/app/components/ui/goback"; const LinkedListComparison = () => { const [list1, setList1] = useState([]); @@ -111,17 +104,7 @@ const LinkedListComparison = () => { }, [list1, list2]); return ( -
-
-
- -
- -

- Linked List Comparison -

-
- +

Visualize comparison of two linked lists node by node

@@ -273,28 +256,6 @@ const LinkedListComparison = () => {
- -

- Test Your Knowledge Before Moving Forward! -

- - - - - - - -