diff --git a/frontend/src/components/input/Button.vue b/frontend/src/components/input/Button.vue index 63b956c7c..53e9b1130 100644 --- a/frontend/src/components/input/Button.vue +++ b/frontend/src/components/input/Button.vue @@ -6,6 +6,7 @@ { 'is-loading': loading, 'has-no-shadow': !shadow || variant === 'tertiary', + 'is-danger': danger, } ]" :disabled="disabled || loading" @@ -58,6 +59,7 @@ export interface ButtonProps { disabled?: boolean shadow?: boolean wrap?: boolean + danger?: boolean } defineOptions({name: 'XButton'}) @@ -168,6 +170,65 @@ const variantClass = computed(() => VARIANT_CLASS_MAP[variant.value]) color: inherit; } + // Danger modifier - solid filled button (default and primary variant) + &.is-danger { + background-color: var(--danger); + border-color: transparent; + color: var(--white); + + &:hover { + background-color: var(--danger-dark); + border-color: transparent; + } + + &:focus, + &:focus-visible { + outline-color: var(--danger); + &:not(:active) { + box-shadow: 0 0 0 0.125em hsla(var(--danger-h), var(--danger-s), var(--danger-l), 0.25); + } + } + + &:active { + background-color: var(--danger-dark); + border-color: transparent; + } + } + + // Danger + outlined/secondary variant + &.is-danger.is-outlined { + background-color: transparent; + border: 1px solid var(--danger); + color: var(--danger); + + &:hover, + &:focus { + background-color: var(--danger); + border-color: var(--danger); + color: var(--white); + } + } + + // Danger + text/tertiary variant + &.is-danger.is-text { + background-color: transparent; + color: var(--danger); + + &:hover { + background-color: hsla(var(--danger-h), var(--danger-s), var(--danger-l), 0.1); + } + } + + // Danger loading spinner - white on solid, danger-colored on outlined/text + &.is-danger.is-loading::after { + border-color: transparent transparent var(--white) var(--white); + } + + &.is-danger.is-outlined.is-loading::after, + &.is-danger.is-text.is-loading::after { + border-color: transparent transparent var(--danger) var(--danger); + } + // Loading state &.is-loading { color: transparent !important; diff --git a/frontend/src/components/sharing/LinkSharing.vue b/frontend/src/components/sharing/LinkSharing.vue index 98692d89f..7e69221ac 100644 --- a/frontend/src/components/sharing/LinkSharing.vue +++ b/frontend/src/components/sharing/LinkSharing.vue @@ -186,7 +186,7 @@ diff --git a/frontend/src/views/project/settings/ProjectSettingsBackground.vue b/frontend/src/views/project/settings/ProjectSettingsBackground.vue index c8ec2e4b8..3ea2597ef 100644 --- a/frontend/src/views/project/settings/ProjectSettingsBackground.vue +++ b/frontend/src/views/project/settings/ProjectSettingsBackground.vue @@ -90,7 +90,7 @@ v-if="hasBackground" :shadow="false" variant="tertiary" - class="is-danger" + danger @click.prevent.stop="removeBackground" > {{ $t('project.background.remove') }} diff --git a/frontend/src/views/project/settings/ProjectSettingsWebhooks.vue b/frontend/src/views/project/settings/ProjectSettingsWebhooks.vue index 4244b0cad..91356f9a4 100644 --- a/frontend/src/views/project/settings/ProjectSettingsWebhooks.vue +++ b/frontend/src/views/project/settings/ProjectSettingsWebhooks.vue @@ -245,7 +245,7 @@ function validateSelectedEvents() { diff --git a/frontend/src/views/teams/EditTeam.vue b/frontend/src/views/teams/EditTeam.vue index 7e19b025e..108be0493 100644 --- a/frontend/src/views/teams/EditTeam.vue +++ b/frontend/src/views/teams/EditTeam.vue @@ -84,7 +84,7 @@
@@ -184,7 +184,7 @@ diff --git a/frontend/src/views/user/settings/TOTP.vue b/frontend/src/views/user/settings/TOTP.vue index 409b34d38..a3aac40e8 100644 --- a/frontend/src/views/user/settings/TOTP.vue +++ b/frontend/src/views/user/settings/TOTP.vue @@ -51,7 +51,7 @@

{{ $t('misc.disable') }} @@ -76,7 +76,7 @@

{{ $t('user.settings.totp.disable') }}