/** * 图片灯箱组件 * 点击图片放大查看 */ import React, { useState } from 'react'; import { Modal, ModalOverlay, ModalContent, ModalBody, ModalCloseButton, Image, Box, IconButton, HStack, useDisclosure, } from '@chakra-ui/react'; import { ChevronLeft, ChevronRight, X, ZoomIn } from 'lucide-react'; import { motion, AnimatePresence } from 'framer-motion'; const MotionBox = motion(Box); /** * 单图片灯箱 */ export const ImageLightbox = ({ src, alt, ...props }) => { const { isOpen, onOpen, onClose } = useDisclosure(); return ( <> {/* 缩略图 */} {alt} {/* 放大图标 */} {/* 灯箱模态框 */} {alt} ); }; /** * 多图片轮播灯箱 */ export const ImageGalleryLightbox = ({ images, initialIndex = 0, ...props }) => { const { isOpen, onOpen, onClose } = useDisclosure(); const [currentIndex, setCurrentIndex] = useState(initialIndex); const handleOpen = (index) => { setCurrentIndex(index); onOpen(); }; const handlePrev = () => { setCurrentIndex((prev) => (prev === 0 ? images.length - 1 : prev - 1)); }; const handleNext = () => { setCurrentIndex((prev) => (prev === images.length - 1 ? 0 : prev + 1)); }; const handleKeyDown = (e) => { if (e.key === 'ArrowLeft') handlePrev(); if (e.key === 'ArrowRight') handleNext(); if (e.key === 'Escape') onClose(); }; return ( <> {/* 缩略图网格 */} {images.map((image, index) => ( handleOpen(index)} _hover={{ '& .zoom-icon': { opacity: 1, }, }} > {image.alt {/* 放大图标 */} ))} {/* 灯箱模态框(带轮播) */} {/* 关闭按钮 */} } position="fixed" top="4" right="4" size="lg" color="white" bg="blackAlpha.600" _hover={{ bg: 'blackAlpha.800' }} borderRadius="full" zIndex={2} onClick={onClose} /> {/* 左箭头 */} {images.length > 1 && ( } position="absolute" left="4" top="50%" transform="translateY(-50%)" size="lg" color="white" bg="blackAlpha.600" _hover={{ bg: 'blackAlpha.800' }} borderRadius="full" zIndex={2} onClick={handlePrev} /> )} {/* 图片 */} {images[currentIndex].alt {/* 右箭头 */} {images.length > 1 && ( } position="absolute" right="4" top="50%" transform="translateY(-50%)" size="lg" color="white" bg="blackAlpha.600" _hover={{ bg: 'blackAlpha.800' }} borderRadius="full" zIndex={2} onClick={handleNext} /> )} {/* 图片计数 */} {images.length > 1 && ( {currentIndex + 1} / {images.length} )} ); }; export default ImageLightbox;