@ -214,7 +214,7 @@ function setTabRef(areaId: string, el: any) {
< TransitionGroup name = "tab" tag = "div" class = "flex items-center gap-1" >
< TabsTrigger v -for = " area in visibleAreas " :key ="area.id" : ref = "(el) => setTabRef(area.id, el)"
: value = "area.id" : disabled = "!area.enabled" : class = " [
'gap-2 py-3 md:py-4 data-[state=active]:bg-accent data-[state=active]:text-white data-[state=active]:shadow-md transition-all duration-300' ,
'relative gap-2 py-3 md:py-4 data-[state=active]:bg-accent data-[state=active]:text-white data-[state=active]:shadow-md transition-all duration-300' ,
! area . enabled && 'opacity-50 cursor-not-allowed' ,
newlyAddedAreaIds . includes ( area . id ) && 'tab-highlight' ,
] " @click=" navigateToArea ( area ) " >
@ -239,7 +239,7 @@ function setTabRef(areaId: string, el: any) {
< TransitionGroup name = "tab" tag = "div" class = "inline-flex items-center gap-2" >
< button v -for = " area in visibleAreas " :key ="area.id" : ref = "(el) => setTabRef(area.id, el)"
: disabled = "!area.enabled" : class = " [
'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[25px] px-4 py-3 text-lg font-medium transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-0 duration-300' ,
'relative inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[25px] px-4 py-3 text-lg font-medium transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-0 duration-300' ,
currentArea === area . id
? 'bg-accent text-white shadow-md'
: 'text-white/70 hover:text-white' ,
@ -327,6 +327,7 @@ function setTabRef(areaId: string, el: any) {
}
@ keyframes highlight - pulse {
0 % ,
100 % {
transform : scale ( 1 ) ;
@ -337,35 +338,41 @@ function setTabRef(areaId: string, el: any) {
}
}
/* Background gradient - stay visible during blinks, then fade out slowly */
@ keyframes highlight - background {
/* Opacity fade for background (Chrome-compatible workaround) */
@ keyframes highlight - opacity {
0 % {
background : linear - gradient ( 135 deg , rgba ( 233 , 30 , 133 , 0.2 ) , rgba ( 201 , 125 , 255 , 0.2 ) ) ;
opacity : 1 ;
}
/* Stay visible during first blink */
25 % {
background : linear - gradient ( 135 deg , rgba ( 233 , 30 , 133 , 0.2 ) , rgba ( 201 , 125 , 255 , 0.2 ) ) ;
opacity : 1 ;
}
/* Start fading slowly after first blink (over 1s instead of 0.5s) */
/* Start fading slowly after first blink */
50 % {
background : linear - gradient ( 135 deg , rgba ( 233 , 30 , 133 , 0.2 ) , rgba ( 201 , 125 , 255 , 0.2 ) ) ;
opacity : 1 ;
}
/* Fade to transparent gradually */
100 % {
background : transparent ;
opacity : 0 ;
}
}
. tab - highlight {
/* Initial background state (will be animated) */
background : linear - gradient ( 135 deg , rgba ( 233 , 30 , 133 , 0.2 ) , rgba ( 201 , 125 , 255 , 0.2 ) ) ;
/* Animations */
animation : highlight - glow 2 s ease - in - out 1 forwards ,
highlight - pulse 0.5 s ease - in - out 2 ,
highlight - background 2 s ease - in - out 1 forwards ;
highlight - pulse 0.5 s ease - in - out 2 ;
}
. tab - highlight : : before {
content : '' ;
position : absolute ;
inset : 0 ;
border - radius : inherit ;
background : linear - gradient ( 135 deg , rgba ( 233 , 30 , 133 , 0.2 ) , rgba ( 201 , 125 , 255 , 0.2 ) ) ;
pointer - events : none ;
animation : highlight - opacity 2 s ease - in - out 1 forwards ;
}
< / style >