Refine client rule delete strike animation
All checks were successful
Build and Deploy Gateway / build-and-push (push) Successful in 16s
Build and Deploy Gateway / deploy (push) Successful in 6s

This commit is contained in:
2026-07-11 23:57:00 +03:00
parent fbbd6e40b4
commit 87cd83f89a
4 changed files with 14 additions and 14 deletions

View File

@@ -1,6 +1,6 @@
export const HARBOR_VERSIONS = Object.freeze({
macClient: '0.6.4',
gatewayClient: '0.6.3',
macClient: '0.6.5',
gatewayClient: '0.6.4',
gatewayBackend: '0.6.0',
});

View File

@@ -391,12 +391,12 @@ function LocalRulesPanel({
key={rule._key}
style={{ viewTransitionName: rule.removing ? 'none' : rule._key }}
inert={rule.removing ? true : undefined}
onAnimationEnd={(event) => {
if (event.animationName === 'client-local-rule-leave') {
onRemoveComplete(rule._key);
}
}}
>
<span
className="client-delete-strike"
aria-hidden="true"
onAnimationEnd={() => onRemoveComplete(rule._key)}
/>
<button
className="client-local-rule-enabled"
type="button"

View File

@@ -958,23 +958,22 @@ p {
animation: client-local-rule-leave 760ms cubic-bezier(0.7, 0, 0.84, 0) both;
}
.client-deletable-row::after {
content: '';
.client-delete-strike {
position: absolute;
left: 0;
right: 0;
top: 50%;
z-index: 6;
height: 2px;
background: oklch(0.67 0.24 27);
box-shadow: 0 0 4px oklch(0.67 0.24 27), 0 0 12px oklch(0.67 0.24 27 / 0.8);
background: oklch(0.68 0.15 28);
box-shadow: 0 0 6px oklch(0.68 0.15 28 / 0.45);
opacity: 0;
pointer-events: none;
transform: scaleX(0);
transform-origin: left center;
}
.client-deletable-row.is-removing::after {
.client-deletable-row.is-removing > .client-delete-strike {
animation: client-delete-strike 760ms cubic-bezier(0.16, 1, 0.3, 1) both;
}
@@ -2987,7 +2986,7 @@ p {
@media (prefers-reduced-motion: reduce) {
.client-operation-progress::before,
.client-deletable-row::after,
.client-delete-strike,
.client-power,
.client-power::before,
.client-power::after,

View File

@@ -20,7 +20,8 @@ test('rule editor add latency stays constant and dirty exits are guarded', () =>
assert.match(component, /Ждёт перезапуска/);
assert.match(component, /Перезапустить VPN/);
assert.match(component, /client-deletable-row/);
assert.match(styles, /\.client-deletable-row\.is-removing::after[\s\S]*client-delete-strike/);
assert.match(component, /className="client-delete-strike"[\s\S]*onAnimationEnd/);
assert.match(styles, /\.client-deletable-row\.is-removing > \.client-delete-strike[\s\S]*client-delete-strike/);
assert.match(styles, /@keyframes client-delete-strike[\s\S]*scaleX\(0\)[\s\S]*scaleX\(1\)/);
assert.match(styles, /\.client-local-rule:has\(\.client-rule-type\.is-open\)[\s\S]*z-index: 5/);
});