From 194fc53ade76355063473ba097f5f474e6102211 Mon Sep 17 00:00:00 2001
From: Ulf Gebhardt
Date: Fri, 20 Mar 2026 20:02:57 +0100
Subject: [PATCH] fix(package/ui): override active hover effect of disabled
button to not create visual glitches when button state changes (#9408)
---
.../components/OsButton/button.variants.ts | 13 ++++
.../GroupContentMenu.spec.js.snap | 8 +--
.../CtaJoinLeaveGroup.spec.js.snap | 2 +-
.../__snapshots__/ActionButton.spec.js.snap | 4 +-
.../__snapshots__/ObserveButton.spec.js.snap | 4 +-
.../__snapshots__/ShoutButton.spec.js.snap | 8 +--
.../CreateInvitation.spec.js.snap | 4 +-
.../__snapshots__/Invitation.spec.js.snap | 8 +--
.../__snapshots__/InvitationList.spec.js.snap | 12 ++--
.../users/__snapshots__/index.spec.js.snap | 16 ++---
.../_id/__snapshots__/_slug.spec.js.snap | 72 +++++++++----------
.../_id/__snapshots__/invites.spec.js.snap | 6 +-
.../_id/__snapshots__/_slug.spec.js.snap | 20 +++---
.../__snapshots__/notifications.spec.js.snap | 6 +-
14 files changed, 98 insertions(+), 85 deletions(-)
diff --git a/packages/ui/src/components/OsButton/button.variants.ts b/packages/ui/src/components/OsButton/button.variants.ts
index ac4050acb..2d29054f3 100644
--- a/packages/ui/src/components/OsButton/button.variants.ts
+++ b/packages/ui/src/components/OsButton/button.variants.ts
@@ -42,16 +42,29 @@ export const buttonVariants = cva(
// Keep inset shadow to prevent layout shift
'disabled:bg-[var(--color-disabled)] disabled:text-[var(--color-disabled-contrast)]',
'disabled:border-[var(--color-disabled)] disabled:shadow-[inset_0_0_0_1px_transparent]',
+ // Override hover/active when disabled (hover persists until mouse leaves)
+ 'disabled:hover:bg-[var(--color-disabled)] disabled:hover:text-[var(--color-disabled-contrast)]',
+ 'disabled:hover:border-[var(--color-disabled)]',
+ 'disabled:active:bg-[var(--color-disabled)] disabled:active:text-[var(--color-disabled-contrast)]',
+ 'disabled:active:border-[var(--color-disabled)]',
],
outline: [
'bg-transparent shadow-none',
// Disabled: light gray border and gray text
'disabled:border-[var(--color-disabled)] disabled:text-[var(--color-disabled)]',
+ // Override hover/active when disabled
+ 'disabled:hover:bg-transparent disabled:hover:text-[var(--color-disabled)]',
+ 'disabled:hover:border-[var(--color-disabled)]',
+ 'disabled:active:bg-transparent disabled:active:text-[var(--color-disabled)]',
+ 'disabled:active:border-[var(--color-disabled)]',
],
ghost: [
'bg-transparent shadow-none',
// Disabled: gray text
'disabled:text-[var(--color-disabled)]',
+ // Override hover/active when disabled
+ 'disabled:hover:bg-transparent disabled:hover:text-[var(--color-disabled)]',
+ 'disabled:active:bg-transparent disabled:active:text-[var(--color-disabled)]',
],
},
size: {
diff --git a/webapp/components/ContentMenu/__snapshots__/GroupContentMenu.spec.js.snap b/webapp/components/ContentMenu/__snapshots__/GroupContentMenu.spec.js.snap
index 9840bfa1c..3f45ded10 100644
--- a/webapp/components/ContentMenu/__snapshots__/GroupContentMenu.spec.js.snap
+++ b/webapp/components/ContentMenu/__snapshots__/GroupContentMenu.spec.js.snap
@@ -25,7 +25,7 @@ exports[`GroupContentMenu renders as groupProfile when I am the owner 1`] = `
>
-
+
group.joinLeaveButton.join
diff --git a/webapp/components/__snapshots__/ActionButton.spec.js.snap b/webapp/components/__snapshots__/ActionButton.spec.js.snap
index 97a88e580..eb16eceaa 100644
--- a/webapp/components/__snapshots__/ActionButton.spec.js.snap
+++ b/webapp/components/__snapshots__/ActionButton.spec.js.snap
@@ -7,7 +7,7 @@ exports[`ActionButton.vue when disabled renders 1`] = `
>