Spaces:
Sleeping
Sleeping
Download src/features/MetadataPanel.jsx from goat1242/pixelroast: direct link, hf CLI and curl.
- Browser
- Download file 3.57 kB
-
https://huggingface.co/spaces/goat1242/pixelroast/resolve/main/src/features/MetadataPanel.jsx
- Command line
-
hf download hf://spaces/goat1242/pixelroast/src/features/MetadataPanel.jsx
-
curl -L -o MetadataPanel.jsx https://huggingface.co/spaces/goat1242/pixelroast/resolve/main/src/features/MetadataPanel.jsx
3.57 kB
| import React from 'react'; | |
| import { motion } from 'framer-motion'; | |
| import { Globe, Code2, Image as ImageIcon, Heading, FileText, Tag, ChevronDown, ChevronUp } from 'lucide-react'; | |
| import { useState } from 'react'; | |
| export const MetadataPanel = ({ metadata }) => { | |
| const [isExpanded, setIsExpanded] = useState(false); | |
| if (!metadata || Object.keys(metadata).length === 0) return null; | |
| const items = [ | |
| { icon: <FileText size={14} />, label: 'Title', value: metadata.title }, | |
| { icon: <Tag size={14} />, label: 'Description', value: metadata.meta_description }, | |
| { icon: <Code2 size={14} />, label: 'Generator', value: metadata.generator }, | |
| { icon: <Globe size={14} />, label: 'Frameworks', value: metadata.detected_frameworks?.join(', ') }, | |
| { icon: <Heading size={14} />, label: 'Headings', value: metadata.heading_count?.toString() }, | |
| { icon: <ImageIcon size={14} />, label: 'Images', value: metadata.image_count?.toString() }, | |
| { icon: <FileText size={14} />, label: 'Page Size', value: metadata.page_size_kb ? `${metadata.page_size_kb} KB` : null }, | |
| ].filter(item => item.value); | |
| if (items.length === 0) return null; | |
| return ( | |
| <motion.div | |
| initial={{ opacity: 0, y: 10 }} | |
| animate={{ opacity: 1, y: 0 }} | |
| className="border-2 border-brutalist-black bg-white shadow-hard mt-4" | |
| > | |
| <button | |
| onClick={() => setIsExpanded(!isExpanded)} | |
| className="w-full flex items-center justify-between p-3 bg-gray-50 border-b-2 border-brutalist-black font-black text-sm uppercase hover:bg-gray-100 transition-colors" | |
| > | |
| <span className="flex items-center gap-2"> | |
| <Globe size={16} /> | |
| Site Metadata | |
| </span> | |
| {isExpanded ? <ChevronUp size={16} /> : <ChevronDown size={16} />} | |
| </button> | |
| {isExpanded && ( | |
| <motion.div | |
| initial={{ height: 0, opacity: 0 }} | |
| animate={{ height: 'auto', opacity: 1 }} | |
| className="divide-y divide-gray-100" | |
| > | |
| {items.map((item, idx) => ( | |
| <div key={idx} className="flex items-start gap-3 px-3 py-2"> | |
| <span className="text-gray-400 mt-0.5 shrink-0">{item.icon}</span> | |
| <div className="min-w-0"> | |
| <span className="text-xs font-bold uppercase text-gray-500 block">{item.label}</span> | |
| <span className="text-sm text-gray-800 break-words">{item.value}</span> | |
| </div> | |
| </div> | |
| ))} | |
| {/* OG Tags */} | |
| {metadata.og_tags && Object.keys(metadata.og_tags).length > 0 && ( | |
| <div className="px-3 py-2"> | |
| <span className="text-xs font-bold uppercase text-gray-500 block mb-1">Open Graph Tags</span> | |
| {Object.entries(metadata.og_tags).map(([key, value]) => ( | |
| <div key={key} className="text-xs font-mono text-gray-600 truncate"> | |
| <span className="text-gray-400">{key}:</span> {value} | |
| </div> | |
| ))} | |
| </div> | |
| )} | |
| </motion.div> | |
| )} | |
| </motion.div> | |
| ); | |
| }; | |