diff --git a/logo.png b/logo.png index fad6b7d2..91d1022c 100644 Binary files a/logo.png and b/logo.png differ diff --git a/public/DevPath-logo.png b/public/DevPath-logo.png index b09a4232..91d1022c 100644 Binary files a/public/DevPath-logo.png and b/public/DevPath-logo.png differ diff --git a/public/logo-circle.png b/public/logo-circle.png index d36ff752..91d1022c 100644 Binary files a/public/logo-circle.png and b/public/logo-circle.png differ diff --git a/public/logo.png b/public/logo.png index 373237ba..91d1022c 100644 Binary files a/public/logo.png and b/public/logo.png differ diff --git a/src/app/wiki/page.tsx b/src/app/wiki/page.tsx index 8c72b943..d4da034c 100644 --- a/src/app/wiki/page.tsx +++ b/src/app/wiki/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { useState } from 'react'; +import { useState, useEffect } from 'react'; import { Search, ChevronRight, Book, Code, FileText, HelpCircle, ThumbsUp, ThumbsDown, Github, Users, MapPin, MessageCircle, Calendar } from 'lucide-react'; import Button from '@/components/ui/Button'; import styles from './Wiki.module.css'; @@ -42,6 +42,44 @@ export default function WikiPage() { const [activeArticle, setActiveArticle] = useState("intro"); const [searchQuery, setSearchQuery] = useState(""); + useEffect(() => { + const articleBody = document.querySelector(`.${styles.articleBody}`); + if (!articleBody) return; + const preElements = articleBody.querySelectorAll('pre'); + + preElements.forEach((pre) => { + if (pre.parentElement?.classList.contains('code-wrapper')) return; + + const wrapper = document.createElement('div'); + wrapper.className = 'code-wrapper relative group w-full'; + + pre.parentNode?.insertBefore(wrapper, pre); + wrapper.appendChild(pre); + + const button = document.createElement('button'); + button.className = 'absolute right-3 top-3 px-2 py-1 text-xs font-semibold bg-zinc-900/80 text-zinc-300 rounded border border-white/10 opacity-0 group-hover:opacity-100 hover:bg-zinc-800 hover:text-white transition-all duration-200 shadow-md cursor-pointer backdrop-blur-sm'; + button.innerHTML = 'Copy'; + button.type = 'button'; + + button.addEventListener('click', async () => { + const codeText = pre.textContent || ''; + try { + await navigator.clipboard.writeText(codeText); + button.innerHTML = 'Copied!'; + button.className = 'absolute right-3 top-3 px-2 py-1 text-xs font-semibold bg-emerald-600 text-white rounded border border-emerald-500 transition-all duration-200 shadow-md'; + setTimeout(() => { + button.innerHTML = 'Copy'; + button.className = 'absolute right-3 top-3 px-2 py-1 text-xs font-semibold bg-zinc-900/80 text-zinc-300 rounded border border-white/10 opacity-0 group-hover:opacity-100 hover:bg-zinc-800 hover:text-white transition-all duration-200 shadow-md cursor-pointer backdrop-blur-sm'; + }, 2000); + } catch (err) { + console.error('Failed to copy text: ', err); + } + }); + + wrapper.appendChild(button); + }); + }, [activeArticle]); + return (