Refactor Tab Styling and Highlight Animation in AreaTabs Component
- Updated tab styling to include a relative positioning for better layout control. - Introduced a new highlight animation for newly added tabs, replacing the previous background gradient with an opacity fade effect for improved visual feedback. - Enhanced the tab-highlight class to include a pseudo-element for a more dynamic appearance during animations.
This commit is contained in:
@@ -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(135deg, rgba(233, 30, 133, 0.2), rgba(201, 125, 255, 0.2));
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* Stay visible during first blink */
|
||||
25% {
|
||||
background: linear-gradient(135deg, 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(135deg, 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(135deg, rgba(233, 30, 133, 0.2), rgba(201, 125, 255, 0.2));
|
||||
|
||||
/* Animations */
|
||||
animation: highlight-glow 2s ease-in-out 1 forwards,
|
||||
highlight-pulse 0.5s ease-in-out 2,
|
||||
highlight-background 2s ease-in-out 1 forwards;
|
||||
highlight-pulse 0.5s ease-in-out 2;
|
||||
}
|
||||
|
||||
.tab-highlight::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
border-radius: inherit;
|
||||
background: linear-gradient(135deg, rgba(233, 30, 133, 0.2), rgba(201, 125, 255, 0.2));
|
||||
pointer-events: none;
|
||||
animation: highlight-opacity 2s ease-in-out 1 forwards;
|
||||
}
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user