refactor(InvestmentPlanningCenter): 重构为 GlassCard 毛玻璃风格

- 移除 Chakra Card 组件,改用 GlassCard
- 标题添加金色渐变效果
- 视图切换按钮改为金色主题
- 使用 lucide-react 的 Target 图标替换 FiTarget
- 整体适配 FUI 黑金设计风格

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
zdl
2025-12-23 10:54:28 +08:00
parent 4f6bfe0b8c
commit a2a15e45a4

View File

@@ -15,9 +15,6 @@
import React, { useState, useEffect, useCallback, useMemo, Suspense, lazy } from 'react'; import React, { useState, useEffect, useCallback, useMemo, Suspense, lazy } from 'react';
import { import {
Box, Box,
Card,
CardHeader,
CardBody,
Heading, Heading,
HStack, HStack,
Flex, Flex,
@@ -33,14 +30,16 @@ import {
Center, Center,
Button, Button,
ButtonGroup, ButtonGroup,
Text,
} from '@chakra-ui/react'; } from '@chakra-ui/react';
import { import {
FiCalendar, FiCalendar,
FiTarget,
FiFileText, FiFileText,
FiList, FiList,
FiPlus, FiPlus,
} from 'react-icons/fi'; } from 'react-icons/fi';
import { Target } from 'lucide-react';
import GlassCard from '@components/GlassCard';
import { PlanningDataProvider } from './PlanningContext'; import { PlanningDataProvider } from './PlanningContext';
import type { InvestmentEvent, PlanningContextValue } from '@/types'; import type { InvestmentEvent, PlanningContextValue } from '@/types';
@@ -160,37 +159,64 @@ const InvestmentPlanningCenter: React.FC = () => {
[allEvents] [allEvents]
); );
// 金色主题色
const goldAccent = 'rgba(212, 175, 55, 0.9)';
return ( return (
<PlanningDataProvider value={contextValue}> <PlanningDataProvider value={contextValue}>
<Card bg={bgColor} shadow="md"> <GlassCard variant="transparent" cornerDecor padding="lg">
<CardHeader pb={{ base: 2, md: 4 }} px={{ base: 3, md: 5 }}> {/* 标题区域 */}
<Flex justify="space-between" align="center" wrap="wrap" gap={2}> <Flex justify="space-between" align="center" wrap="wrap" gap={2} mb={{ base: 3, md: 4 }}>
<HStack spacing={{ base: 1, md: 2 }}> <HStack spacing={{ base: 2, md: 3 }}>
<Icon as={FiTarget} color="purple.500" boxSize={{ base: 4, md: 5 }} /> <Box
<Heading size={{ base: 'sm', md: 'md' }}></Heading> as={Target}
</HStack> boxSize={{ base: 5, md: 6 }}
{/* 视图切换按钮组 - H5隐藏 */} color={goldAccent}
<ButtonGroup size="sm" isAttached variant="outline" display={{ base: 'none', md: 'flex' }}> />
<Button <Heading
leftIcon={<Icon as={FiList} boxSize={4} />} size={{ base: 'sm', md: 'md' }}
colorScheme={viewMode === 'list' ? 'purple' : 'gray'} bgGradient="linear(to-r, #D4AF37, #F5E6A3)"
variant={viewMode === 'list' ? 'solid' : 'outline'} bgClip="text"
onClick={() => setViewMode('list')} >
>
</Heading>
</Button> </HStack>
<Button {/* 视图切换按钮组 - H5隐藏 */}
leftIcon={<Icon as={FiCalendar} boxSize={4} />} <ButtonGroup size="sm" isAttached display={{ base: 'none', md: 'flex' }}>
colorScheme={viewMode === 'calendar' ? 'purple' : 'gray'} <Button
variant={viewMode === 'calendar' ? 'solid' : 'outline'} leftIcon={<Icon as={FiList} boxSize={4} />}
onClick={() => setViewMode('calendar')} bg={viewMode === 'list' ? 'rgba(212, 175, 55, 0.2)' : 'transparent'}
> color={viewMode === 'list' ? goldAccent : 'rgba(255, 255, 255, 0.6)'}
border="1px solid"
</Button> borderColor={viewMode === 'list' ? 'rgba(212, 175, 55, 0.4)' : 'rgba(212, 175, 55, 0.2)'}
</ButtonGroup> _hover={{ bg: 'rgba(212, 175, 55, 0.15)', color: goldAccent }}
</Flex> onClick={() => setViewMode('list')}
</CardHeader> >
<CardBody pt={0} px={{ base: 3, md: 5 }}>
</Button>
<Button
leftIcon={<Icon as={FiCalendar} boxSize={4} />}
bg={viewMode === 'calendar' ? 'rgba(212, 175, 55, 0.2)' : 'transparent'}
color={viewMode === 'calendar' ? goldAccent : 'rgba(255, 255, 255, 0.6)'}
border="1px solid"
borderColor={viewMode === 'calendar' ? 'rgba(212, 175, 55, 0.4)' : 'rgba(212, 175, 55, 0.2)'}
_hover={{ bg: 'rgba(212, 175, 55, 0.15)', color: goldAccent }}
onClick={() => setViewMode('calendar')}
>
</Button>
</ButtonGroup>
</Flex>
{/* 渐变分割线 */}
<Box
h="1px"
bgGradient="linear(to-r, transparent, rgba(212, 175, 55, 0.4), transparent)"
mb={{ base: 3, md: 4 }}
/>
{/* 内容区域 */}
<Box>
{viewMode === 'calendar' ? ( {viewMode === 'calendar' ? (
/* 日历视图 */ /* 日历视图 */
<Suspense fallback={<PanelLoadingFallback />}> <Suspense fallback={<PanelLoadingFallback />}>
@@ -201,27 +227,52 @@ const InvestmentPlanningCenter: React.FC = () => {
<Tabs <Tabs
index={listTab} index={listTab}
onChange={setListTab} onChange={setListTab}
variant="enclosed" variant="unstyled"
colorScheme="purple"
size={{ base: 'sm', md: 'md' }} size={{ base: 'sm', md: 'md' }}
> >
<Flex justify="space-between" align="center" mb={{ base: 2, md: 4 }} flexWrap="nowrap" gap={1}> <Flex justify="space-between" align="center" mb={{ base: 2, md: 4 }} flexWrap="nowrap" gap={1}>
<TabList mb={0} borderBottom="none" flex="1" minW={0}> <TabList mb={0} flex="1" minW={0}>
<Tab fontSize={{ base: '11px', md: 'sm' }} px={{ base: 1, md: 4 }} whiteSpace="nowrap"> <Tab
<Icon as={FiTarget} mr={1} boxSize={{ base: 3, md: 4 }} /> fontSize={{ base: '11px', md: 'sm' }}
px={{ base: 2, md: 4 }}
py={2}
whiteSpace="nowrap"
color="rgba(255, 255, 255, 0.6)"
_selected={{
color: goldAccent,
borderBottom: '2px solid',
borderColor: goldAccent,
}}
>
<Box as={Target} boxSize={{ base: 3, md: 4 }} mr={1} />
({planCount}) ({planCount})
</Tab> </Tab>
<Tab fontSize={{ base: '11px', md: 'sm' }} px={{ base: 1, md: 4 }} whiteSpace="nowrap"> <Tab
fontSize={{ base: '11px', md: 'sm' }}
px={{ base: 2, md: 4 }}
py={2}
whiteSpace="nowrap"
color="rgba(255, 255, 255, 0.6)"
_selected={{
color: goldAccent,
borderBottom: '2px solid',
borderColor: goldAccent,
}}
>
<Icon as={FiFileText} mr={1} boxSize={{ base: 3, md: 4 }} /> <Icon as={FiFileText} mr={1} boxSize={{ base: 3, md: 4 }} />
({reviewCount}) ({reviewCount})
</Tab> </Tab>
</TabList> </TabList>
<Button <Button
size="xs" size="xs"
colorScheme="purple" bg="rgba(212, 175, 55, 0.2)"
color={goldAccent}
border="1px solid"
borderColor="rgba(212, 175, 55, 0.3)"
leftIcon={<Icon as={FiPlus} boxSize={3} />} leftIcon={<Icon as={FiPlus} boxSize={3} />}
fontSize={{ base: '11px', md: 'sm' }} fontSize={{ base: '11px', md: 'sm' }}
flexShrink={0} flexShrink={0}
_hover={{ bg: 'rgba(212, 175, 55, 0.3)' }}
onClick={() => { onClick={() => {
if (listTab === 0) { if (listTab === 0) {
setOpenPlanModalTrigger(prev => prev + 1); setOpenPlanModalTrigger(prev => prev + 1);
@@ -240,7 +291,7 @@ const InvestmentPlanningCenter: React.FC = () => {
<Suspense fallback={<PanelLoadingFallback />}> <Suspense fallback={<PanelLoadingFallback />}>
<EventPanel <EventPanel
type="plan" type="plan"
colorScheme="purple" colorScheme="orange"
label="计划" label="计划"
openModalTrigger={openPlanModalTrigger} openModalTrigger={openPlanModalTrigger}
/> />
@@ -252,7 +303,7 @@ const InvestmentPlanningCenter: React.FC = () => {
<Suspense fallback={<PanelLoadingFallback />}> <Suspense fallback={<PanelLoadingFallback />}>
<EventPanel <EventPanel
type="review" type="review"
colorScheme="green" colorScheme="orange"
label="复盘" label="复盘"
openModalTrigger={openReviewModalTrigger} openModalTrigger={openReviewModalTrigger}
/> />
@@ -261,8 +312,8 @@ const InvestmentPlanningCenter: React.FC = () => {
</TabPanels> </TabPanels>
</Tabs> </Tabs>
)} )}
</CardBody> </Box>
</Card> </GlassCard>
</PlanningDataProvider> </PlanningDataProvider>
); );
}; };