Restore visual effects using GPU-safe techniques (no repaint triggers)
Rules: transform/opacity = GPU composited (fine). box-shadow/text-shadow on hover = CPU repaint (removed). Static box-shadow/text-shadow = painted once (fine). - Buttons (.btn, .btn-base, button, .btn-primary): add will-change:transform for pre-promotion, add transform:translateY(-1px) on hover (GPU, no repaint), scope transition to include transform, remove box-shadow/text-shadow from hover - Stat cards: add will-change:transform, add transform:translateY(-2px) on hover - Priority badges: replace filter:blur(6px) ::after pseudo-element (permanent GPU layer per badge, ~20 on screen at once) with static box-shadow:0 0 6px currentColor on the badge itself — painted once, never changes, zero compositor overhead - Links: replace opacity-transition ::after underline (lazy GPU layer creation on hover) with text-decoration:underline on hover (pure CPU paint, no GPU layer) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -251,11 +251,14 @@ h1, h2, h3 {
|
|||||||
text-shadow: 0 0 2px currentColor, 0 0 4px currentColor;
|
text-shadow: 0 0 2px currentColor, 0 0 4px currentColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enhanced link hover with underline animation */
|
/* Link hover — text-decoration (no opacity pseudo-element, no GPU layer creation) */
|
||||||
a:not(.btn) {
|
a:not(.btn) {
|
||||||
position: relative;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
a:not(.btn):hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
text-underline-offset: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
a:not(.btn)::after {
|
a:not(.btn)::after {
|
||||||
content: '';
|
content: '';
|
||||||
@@ -349,20 +352,9 @@ tbody tr {
|
|||||||
51%, 100% { opacity: 0; }
|
51%, 100% { opacity: 0; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Neon glow effect for priority badges */
|
/* Neon glow effect for priority badges — static box-shadow (no filter:blur GPU layer) */
|
||||||
.priority-badge {
|
.priority-badge {
|
||||||
position: relative;
|
box-shadow: 0 0 6px currentColor;
|
||||||
}
|
|
||||||
|
|
||||||
.priority-badge::after {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
inset: -2px;
|
|
||||||
border-radius: inherit;
|
|
||||||
background: inherit;
|
|
||||||
filter: blur(6px);
|
|
||||||
opacity: 0.4;
|
|
||||||
z-index: -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Smooth scrollbar styling */
|
/* Smooth scrollbar styling */
|
||||||
@@ -1605,7 +1597,8 @@ button {
|
|||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
position: relative;
|
position: relative;
|
||||||
transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, text-shadow 0.2s ease;
|
will-change: transform;
|
||||||
|
transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease, transform 0.15s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn::before,
|
.btn::before,
|
||||||
@@ -1626,13 +1619,13 @@ button:hover {
|
|||||||
background: rgba(0, 255, 65, 0.15);
|
background: rgba(0, 255, 65, 0.15);
|
||||||
color: var(--terminal-amber);
|
color: var(--terminal-amber);
|
||||||
border-color: var(--terminal-amber);
|
border-color: var(--terminal-amber);
|
||||||
|
transform: translateY(-1px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn:active,
|
.btn:active,
|
||||||
.btn-base:active,
|
.btn-base:active,
|
||||||
button:active {
|
button:active {
|
||||||
transform: translateY(0);
|
transform: translateY(0);
|
||||||
box-shadow: var(--glow-green-intense);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes pulse-glow-box {
|
@keyframes pulse-glow-box {
|
||||||
@@ -1663,7 +1656,8 @@ button:active {
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-family: var(--font-mono);
|
font-family: var(--font-mono);
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease;
|
will-change: transform;
|
||||||
|
transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease, transform 0.15s ease;
|
||||||
margin-right: 3.75rem;
|
margin-right: 3.75rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1682,6 +1676,7 @@ button:active {
|
|||||||
background: rgba(255, 176, 0, 0.1);
|
background: rgba(255, 176, 0, 0.1);
|
||||||
color: var(--terminal-green);
|
color: var(--terminal-green);
|
||||||
border-color: var(--terminal-green);
|
border-color: var(--terminal-green);
|
||||||
|
transform: translateY(-1px);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===== RESPONSIVE TICKET CARDS - Hidden on desktop (1400px+) ===== */
|
/* ===== RESPONSIVE TICKET CARDS - Hidden on desktop (1400px+) ===== */
|
||||||
@@ -4320,7 +4315,8 @@ tr:hover .quick-actions {
|
|||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
background: linear-gradient(135deg, var(--bg-secondary) 0%, rgba(0, 255, 65, 0.03) 100%);
|
background: linear-gradient(135deg, var(--bg-secondary) 0%, rgba(0, 255, 65, 0.03) 100%);
|
||||||
border: 2px solid var(--terminal-green);
|
border: 2px solid var(--terminal-green);
|
||||||
transition: border-color 0.2s ease;
|
will-change: transform;
|
||||||
|
transition: border-color 0.2s ease, transform 0.15s ease;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
@@ -4338,6 +4334,7 @@ tr:hover .quick-actions {
|
|||||||
|
|
||||||
.stat-card:hover {
|
.stat-card:hover {
|
||||||
border-color: var(--terminal-amber);
|
border-color: var(--terminal-amber);
|
||||||
|
transform: translateY(-2px);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Critical stat card styling */
|
/* Critical stat card styling */
|
||||||
|
|||||||
Reference in New Issue
Block a user