diff --git a/src/views/Concept/components/BreadcrumbNav.js b/src/views/Concept/components/BreadcrumbNav.js index a8e1acf2..541f8611 100644 --- a/src/views/Concept/components/BreadcrumbNav.js +++ b/src/views/Concept/components/BreadcrumbNav.js @@ -16,13 +16,14 @@ import { Flex, Tooltip, } from '@chakra-ui/react'; -import { ChevronRightIcon, CloseIcon } from '@chakra-ui/icons'; -import { FaLayerGroup, FaFilter, FaTimes, FaHome } from 'react-icons/fa'; +import { ChevronRightIcon } from '@chakra-ui/icons'; +import { FaFilter, FaTimes, FaHome } from 'react-icons/fa'; const BreadcrumbNav = ({ filter, onClearFilter, onNavigate, + isDarkMode = false, }) => { // 如果没有筛选条件,不显示 if (!filter || (!filter.lv1 && !filter.lv2 && !filter.lv3)) { @@ -56,14 +57,71 @@ const BreadcrumbNav = ({ }); } + // 深色主题样式 + const darkStyles = { + container: { + bg: 'rgba(15, 23, 42, 0.8)', + backdropFilter: 'blur(20px)', + borderColor: 'whiteAlpha.100', + }, + filterBadge: { + bg: 'purple.500', + color: 'white', + }, + homeBadge: { + bg: 'whiteAlpha.100', + color: 'white', + _hover: { bg: 'whiteAlpha.200' }, + }, + chevron: { color: 'whiteAlpha.400' }, + crumbBadge: (level, isLast) => ({ + bg: level === 'lv1' ? 'purple.500' : level === 'lv2' ? 'blue.500' : 'cyan.500', + color: 'white', + }), + clearBtn: { + color: 'red.300', + _hover: { bg: 'whiteAlpha.100' }, + }, + hintText: { color: 'whiteAlpha.500' }, + linkText: { color: 'purple.300' }, + }; + + // 浅色主题样式 + const lightStyles = { + container: { + bg: 'linear-gradient(135deg, rgba(99, 102, 241, 0.1) 0%, rgba(168, 85, 247, 0.1) 100%)', + borderColor: 'purple.200', + }, + filterBadge: { + bg: 'purple.500', + color: 'white', + }, + homeBadge: { + colorScheme: 'gray', + _hover: { bg: 'gray.200' }, + }, + chevron: { color: 'gray.400' }, + crumbBadge: (level, isLast) => ({ + colorScheme: level === 'lv1' ? 'purple' : level === 'lv2' ? 'blue' : 'cyan', + }), + clearBtn: { + colorScheme: 'red', + }, + hintText: { color: 'gray.500' }, + linkText: { color: 'purple.600' }, + }; + + const styles = isDarkMode ? darkStyles : lightStyles; + return ( ( - + } - colorScheme="red" + {...(isDarkMode ? {} : { colorScheme: 'red' })} + color={isDarkMode ? styles.clearBtn.color : undefined} variant="ghost" borderRadius="full" onClick={onClearFilter} aria-label="清除筛选" + _hover={isDarkMode ? styles.clearBtn._hover : undefined} /> {/* 筛选提示 */} - + 当前显示「{breadcrumbs.map(b => b.label).join(' > ')}」分类下的概念, { init(); }, []); - // 概念卡片组件 - 科幻毛玻璃版 + // 获取股票名称(兼容新旧API格式) + const getStockName = (stock) => stock.name || stock.stock_name || '未知'; + const getStockCode = (stock) => stock.code || stock.stock_code || ''; + + // 概念卡片组件 - 深色毛玻璃版(HeroUI风格) const ConceptCard = ({ concept, position = 0 }) => { const changePercent = concept.price_info?.avg_change_pct; const changeColor = getChangeColor(changePercent); const hasChange = changePercent !== null && changePercent !== undefined; // H5 端使用更紧凑的尺寸 const isMobile = useBreakpointValue({ base: true, md: false }); - const coverHeight = useBreakpointValue({ base: '100px', md: '180px' }); - const logoSize = useBreakpointValue({ base: '60px', md: '120px' }); + const coverHeight = useBreakpointValue({ base: '100px', md: '160px' }); + const logoSize = useBreakpointValue({ base: '60px', md: '100px' }); // 生成随机涨幅数字背景 const generateNumbersBackground = () => { @@ -663,22 +667,24 @@ const ConceptCenter = () => { handleConceptClick(concept.concept_id, concept.concept, concept, position)} - bg="white" + bg="rgba(15, 23, 42, 0.8)" + backdropFilter="blur(20px)" borderWidth="1px" - borderColor="transparent" + borderColor="whiteAlpha.100" overflow="hidden" _hover={{ - transform: 'translateY(-8px)', - boxShadow: '0 20px 40px rgba(139, 92, 246, 0.3)', - borderColor: 'purple.400', + transform: 'translateY(-6px)', + boxShadow: '0 20px 40px rgba(139, 92, 246, 0.25)', + borderColor: 'purple.500', }} - transition="all 0.3s" + transition="all 0.3s cubic-bezier(0.4, 0, 0.2, 1)" position="relative" - boxShadow="0 4px 12px rgba(0, 0, 0, 0.1)" + boxShadow="0 4px 20px rgba(0, 0, 0, 0.3)" + borderRadius="2xl" > {/* 毛玻璃涨幅数字背景 */} - {/* 渐变背景层 */} + {/* 渐变背景层 - 涨红跌绿 */} { bottom={0} bgGradient={ hasChange && changePercent > 0 - ? "linear(135deg, #667eea 0%, #764ba2 100%)" + ? "linear(135deg, rgba(153, 27, 27, 0.6) 0%, rgba(239, 68, 68, 0.4) 100%)" : hasChange && changePercent < 0 - ? "linear(135deg, #f093fb 0%, #f5576c 100%)" - : "linear(135deg, #4facfe 0%, #00f2fe 100%)" + ? "linear(135deg, rgba(20, 83, 45, 0.6) 0%, rgba(34, 197, 94, 0.4) 100%)" + : "linear(135deg, rgba(71, 85, 105, 0.6) 0%, rgba(100, 116, 139, 0.4) 100%)" } /> @@ -706,7 +712,7 @@ const ConceptCenter = () => { gridTemplateRows="repeat(6, 1fr)" gap={2} p={3} - opacity={0.15} + opacity={0.1} > {backgroundNumbers.map((num, idx) => ( { transform="translate(-50%, -50%)" width={logoSize} height={logoSize} - opacity={0.15} + opacity={0.1} > { /> - {/* 毛玻璃层 */} + {/* 高光效果 */} - - {/* 渐变遮罩 */} - - - {/* 发光边框效果 */} - {/* 左上角涨跌幅 Badge */} @@ -779,14 +765,14 @@ const ConceptCenter = () => { position="absolute" top={3} left={3} - bg={changeColor === 'red' ? 'red.500' : changeColor === 'green' ? 'green.500' : 'gray.500'} + bg={changeColor === 'red' ? 'rgba(239, 68, 68, 0.9)' : changeColor === 'green' ? 'rgba(34, 197, 94, 0.9)' : 'rgba(100, 116, 139, 0.9)'} color="white" fontSize="sm" px={3} py={1} borderRadius="full" fontWeight="bold" - boxShadow="0 4px 12px rgba(0, 0, 0, 0.3)" + boxShadow={`0 4px 12px rgba(${changeColor === 'red' ? '239, 68, 68' : changeColor === 'green' ? '34, 197, 94' : '100, 116, 139'}, 0.4)`} display="flex" alignItems="center" gap={1} @@ -805,38 +791,36 @@ const ConceptCenter = () => { position="absolute" top={3} right={3} - bg="rgba(255, 255, 255, 0.2)" + bg="rgba(0, 0, 0, 0.4)" backdropFilter="blur(10px)" color="white" fontSize="xs" px={3} py={1} borderRadius="full" - fontWeight="bold" - boxShadow="0 4px 12px rgba(0, 0, 0, 0.2)" + fontWeight="medium" border="1px solid" - borderColor="whiteAlpha.300" + borderColor="whiteAlpha.200" > {concept.stock_count || 0} 只股票 - + {/* 概念名称 */} {concept.concept} {/* 描述信息 - H5端显示1行 */} - + {concept.description || '暂无描述信息'} @@ -844,31 +828,34 @@ const ConceptCenter = () => { handleViewStocks(e, concept)} _hover={{ - bg: 'linear-gradient(135deg, rgba(99, 102, 241, 0.1) 0%, rgba(168, 85, 247, 0.1) 100%)', + bg: 'whiteAlpha.100', transform: 'translateX(2px)', }} transition="all 0.2s" border="1px solid" - borderColor="purple.100" + borderColor="whiteAlpha.100" > - - + + 热门个股 {!hasFeatureAccess('hot_stocks') && ( 🔒Pro @@ -881,24 +868,24 @@ const ConceptCenter = () => { - {stock.stock_name} + {getStockName(stock)} ))} {concept.stocks.length > 2 && ( - + +{concept.stocks.length - 2} )} ) : ( - - + + 升级查看{concept.stocks.length}只个股 @@ -907,32 +894,41 @@ const ConceptCenter = () => { )} - + - {formatAddedDate(concept)} + {/* 添加日期 - 深色主题适配 */} + {concept.created_at || concept.added_date || concept.happened_times?.[0] ? ( + + + + 添加于 {new Date(concept.created_at || concept.added_date || concept.happened_times?.[0]).toLocaleDateString('zh-CN')} + + + ) : } @@ -1068,10 +1087,12 @@ const ConceptCenter = () => { @@ -1080,9 +1101,9 @@ const ConceptCenter = () => { {concept.stocks && concept.stocks.length > 0 && ( - 热门个股 + 热门个股 {!hasFeatureAccess('hot_stocks') && ( - + 🔒需Pro )} @@ -1092,14 +1113,14 @@ const ConceptCenter = () => { <> {concept.stocks.slice(0, 3).map((stock, idx) => ( - - {stock.stock_name} + + {getStockName(stock)} ))} {concept.stocks.length > 3 && ( - + +{concept.stocks.length - 3}更多 @@ -1108,8 +1129,8 @@ const ConceptCenter = () => { ) : ( - - + + 升级查看{concept.stocks.length}只 @@ -1125,26 +1146,26 @@ const ConceptCenter = () => { ); }; - // 骨架屏组件 + // 骨架屏组件 - 深色主题 const SkeletonCard = () => ( - - + + - + ); - // 日期选择组件 - 科幻风格 + // 日期选择组件 - 深色主题 const DateSelector = () => ( { }} latestTradeDate={latestTradeDate} label="交易日期" + isDarkMode={true} /> - {/* 快捷按钮保留在页面内 */} + {/* 快捷按钮 - 深色主题 */}