feat: add fade-in and fade-out animations for feature images in FeaturesSection

This commit is contained in:
JOYCEQL
2025-03-05 17:57:31 +08:00
committed by qingchen
parent b76704418b
commit 9e75e6e5d9
2 changed files with 136 additions and 104 deletions
+24 -14
View File
@@ -272,13 +272,18 @@ export default function FeaturesSection() {
<div className="relative aspect-[3/2] w-full overflow-hidden rounded-xl group">
<div className="absolute inset-0 bg-gradient-to-br from-transparent via-transparent to-blue-600/15 z-10"></div>
<Image
src={features[0].items[activeFeatures[0]].image}
alt={t(features[0].items[activeFeatures[0]].title)}
fill
className="object-contain z-1"
sizes="(max-width: 768px) 100vw, 50vw"
/>
<div
key={activeFeatures[0]}
className="animate-fade-in w-full h-full"
>
<Image
src={features[0].items[activeFeatures[0]].image}
alt={t(features[0].items[activeFeatures[0]].title)}
fill
className="object-contain z-1 transition-transform duration-300 ease-in-out"
sizes="(max-width: 768px) 100vw, 50vw"
/>
</div>
</div>
<div className="absolute inset-0 -z-10 blur-2xl opacity-70">
@@ -367,13 +372,18 @@ export default function FeaturesSection() {
<div className="relative aspect-[3/2] w-full overflow-hidden rounded-xl group">
<div className="absolute inset-0 bg-gradient-to-br from-transparent via-transparent to-green-600/15 z-10"></div>
<Image
src={features[1].items[activeFeatures[1]].image}
alt={t(features[1].items[activeFeatures[1]].title)}
fill
className="object-contain z-1"
sizes="(max-width: 768px) 100vw, 50vw"
/>
<div
key={activeFeatures[1]}
className="animate-fade-in w-full h-full"
>
<Image
src={features[1].items[activeFeatures[1]].image}
alt={t(features[1].items[activeFeatures[1]].title)}
fill
className="object-contain z-1 transition-transform duration-300 ease-in-out"
sizes="(max-width: 768px) 100vw, 50vw"
/>
</div>
</div>
<div className="absolute inset-0 -z-10 blur-2xl opacity-70">
+112 -90
View File
@@ -11,96 +11,118 @@ const config = {
],
prefix: "",
theme: {
container: {
center: true,
padding: '2rem',
screens: {
'2xl': '1400px'
}
},
extend: {
colors: {
baseFont: '#212529',
subtitleFont: '#9ca3af',
border: 'hsl(var(--border))',
input: 'hsl(var(--input))',
ring: 'hsl(var(--ring))',
background: 'hsl(var(--background))',
foreground: 'hsl(var(--foreground))',
primary: {
DEFAULT: 'hsl(var(--primary))',
foreground: 'hsl(var(--primary-foreground))'
},
secondary: {
DEFAULT: 'hsl(var(--secondary))',
foreground: 'hsl(var(--secondary-foreground))'
},
destructive: {
DEFAULT: 'hsl(var(--destructive))',
foreground: 'hsl(var(--destructive-foreground))'
},
muted: {
DEFAULT: 'hsl(var(--muted))',
foreground: 'hsl(var(--muted-foreground))'
},
accent: {
DEFAULT: 'hsl(var(--accent))',
foreground: 'hsl(var(--accent-foreground))'
},
popover: {
DEFAULT: 'hsl(var(--popover))',
foreground: 'hsl(var(--popover-foreground))'
},
card: {
DEFAULT: 'hsl(var(--card))',
foreground: 'hsl(var(--card-foreground))'
},
sidebar: {
DEFAULT: 'hsl(var(--sidebar-background))',
foreground: 'hsl(var(--sidebar-foreground))',
primary: 'hsl(var(--sidebar-primary))',
'primary-foreground': 'hsl(var(--sidebar-primary-foreground))',
accent: 'hsl(var(--sidebar-accent))',
'accent-foreground': 'hsl(var(--sidebar-accent-foreground))',
border: 'hsl(var(--sidebar-border))',
ring: 'hsl(var(--sidebar-ring))'
},
chart: {
'1': 'hsl(var(--chart-1))',
'2': 'hsl(var(--chart-2))',
'3': 'hsl(var(--chart-3))',
'4': 'hsl(var(--chart-4))',
'5': 'hsl(var(--chart-5))'
}
},
borderRadius: {
lg: 'var(--radius)',
md: 'calc(var(--radius) - 2px)',
sm: 'calc(var(--radius) - 4px)'
},
keyframes: {
'accordion-down': {
from: {
height: '0'
},
to: {
height: 'var(--radix-accordion-content-height)'
}
},
'accordion-up': {
from: {
height: 'var(--radix-accordion-content-height)'
},
to: {
height: '0'
}
}
},
animation: {
'accordion-down': 'accordion-down 0.2s ease-out',
'accordion-up': 'accordion-up 0.2s ease-out'
}
}
container: {
center: true,
padding: "2rem",
screens: {
"2xl": "1400px",
},
},
extend: {
colors: {
baseFont: "#212529",
subtitleFont: "#9ca3af",
border: "hsl(var(--border))",
input: "hsl(var(--input))",
ring: "hsl(var(--ring))",
background: "hsl(var(--background))",
foreground: "hsl(var(--foreground))",
primary: {
DEFAULT: "hsl(var(--primary))",
foreground: "hsl(var(--primary-foreground))",
},
secondary: {
DEFAULT: "hsl(var(--secondary))",
foreground: "hsl(var(--secondary-foreground))",
},
destructive: {
DEFAULT: "hsl(var(--destructive))",
foreground: "hsl(var(--destructive-foreground))",
},
muted: {
DEFAULT: "hsl(var(--muted))",
foreground: "hsl(var(--muted-foreground))",
},
accent: {
DEFAULT: "hsl(var(--accent))",
foreground: "hsl(var(--accent-foreground))",
},
popover: {
DEFAULT: "hsl(var(--popover))",
foreground: "hsl(var(--popover-foreground))",
},
card: {
DEFAULT: "hsl(var(--card))",
foreground: "hsl(var(--card-foreground))",
},
sidebar: {
DEFAULT: "hsl(var(--sidebar-background))",
foreground: "hsl(var(--sidebar-foreground))",
primary: "hsl(var(--sidebar-primary))",
"primary-foreground": "hsl(var(--sidebar-primary-foreground))",
accent: "hsl(var(--sidebar-accent))",
"accent-foreground": "hsl(var(--sidebar-accent-foreground))",
border: "hsl(var(--sidebar-border))",
ring: "hsl(var(--sidebar-ring))",
},
chart: {
"1": "hsl(var(--chart-1))",
"2": "hsl(var(--chart-2))",
"3": "hsl(var(--chart-3))",
"4": "hsl(var(--chart-4))",
"5": "hsl(var(--chart-5))",
},
},
borderRadius: {
lg: "var(--radius)",
md: "calc(var(--radius) - 2px)",
sm: "calc(var(--radius) - 4px)",
},
keyframes: {
"accordion-down": {
from: {
height: "0",
},
to: {
height: "var(--radix-accordion-content-height)",
},
},
"accordion-up": {
from: {
height: "var(--radix-accordion-content-height)",
},
to: {
height: "0",
},
},
"fade-in": {
"0%": {
opacity: "0",
transform: "scale(0.95)",
},
"100%": {
opacity: "1",
transform: "scale(1)",
},
},
"fade-out": {
"0%": {
opacity: "1",
transform: "scale(1)",
},
"100%": {
opacity: "0",
transform: "scale(0.98)",
},
},
},
animation: {
"accordion-down": "accordion-down 0.2s ease-out",
"accordion-up": "accordion-up 0.2s ease-out",
"fade-in": "fade-in 0.4s cubic-bezier(0.16, 1, 0.3, 1)",
"fade-out": "fade-out 0.4s cubic-bezier(0.16, 1, 0.3, 1)",
},
},
},
colors: {
primary: "262.1 83.3% 57.8%",