Polish subscription and server picker animations
Build and Deploy Gateway / build-and-push (push) Successful in 28s
Build and Deploy Gateway / deploy (push) Successful in 7s

This commit is contained in:
2026-08-11 07:55:41 +03:00
parent 9a8191dc91
commit 9ad0307333
8 changed files with 247 additions and 48 deletions
@@ -51,6 +51,8 @@ test('local validation, scoped refresh and drawer focus remain feature-owned', (
assert.match(feature, /if \(!adding \|\| \(profiles\.length > 0 && !open\)\) return undefined/);
assert.match(feature, /if \(deleteIdRef\.current\) return;[\s\S]*toggleRef\.current\?\.focus\(\)/);
assert.match(feature, /setAdding\(false\)[\s\S]*client-profile-add-trigger'\)\?\.focus\(\)/);
assert.match(feature, /addFormRef\.current\?\.contains\(target\)[\s\S]*resetAdd\(Boolean\(target && panelRef\.current\?\.contains\(target\)\)\)/);
assert.match(feature, /feature\.adding \|\| feature\.addClosing/);
assert.doesNotMatch(feature, /addInvokerRef/);
assert.match(feature, /className="client-profile-delete"[\s\S]*client-profile-delete-lid/);
assert.doesNotMatch(feature, /cancelRename|client-profile-menu|onRename/);
@@ -104,7 +106,7 @@ test('profiles render as flat accordion groups with scoped controls', () => {
assert.match(feature, /aria-expanded=\{expanded\}/);
assert.match(feature, /profile\.subscription\.status === 'stale'[\s\S]*profile\.subscription\.fetchedAt/);
assert.match(feature, /feature\.operations\.profileRefresh\?\.target === profile\.id/);
assert.match(feature, /!expanded && visibleServer && <button[\s\S]*client-profile-selected-server/);
assert.match(feature, /!expanded && !closing && visibleServer && <button[\s\S]*client-profile-selected-server/);
assert.match(feature, /const visibleServerId = applied \? feature\.selection\.appliedServerId : profile\.desiredServerId/);
assert.match(feature, /const desired = !feature\.connected[\s\S]*&& !feature\.gatewayDirect/);
assert.match(feature, /const profileDomain = subscriptionDomain\(profile\.subscription\.host\)/);
@@ -112,6 +114,8 @@ test('profiles render as flat accordion groups with scoped controls', () => {
assert.doesNotMatch(feature, /<strong>\{profile\.label\}<\/strong>|Переименовать|client-profile-menu/);
assert.match(styles, /\.client-profile-group/);
assert.match(styles, /\.client-profile-body/);
assert.match(styles, /\.client-profile-body \{[\s\S]*grid-template-rows: 0fr[\s\S]*\.client-profile-body\.is-open \{[\s\S]*grid-template-rows: 1fr/);
assert.match(styles, /@media \(prefers-reduced-motion: reduce\)[\s\S]*\.client-profile-body \*/);
assert.match(styles, /\.client-profile-refresh\.is-refreshing/);
assert.doesNotMatch(feature, /client-subscription-card|role="tab"/);
});