<template> <span class="container" :class="{ confirming }"> <span v-if="confirming">Are you sure?</span> <button @click.stop="click" class="button danger" :disabled="disabled"> <span v-if="confirming">Yes</span> <slot v-else /> </button> <button v-if="confirming" class="button" @click.stop="cancel">No</button> </span> </template> <script> export default { name: 'danger-button', data() { return { confirming: false } }, props: { disabled: Boolean, skipConfirm: Boolean }, emits: [ 'click', 'confirmingChanged' ], watch: { confirming(newValue) { this.$emit('confirmingChanged', newValue); } }, methods: { click() { if (this.skipConfirm) { this.$emit('click'); return; } if (this.confirming) { this.$emit('click'); } this.confirming = !this.confirming; }, cancel() { this.confirming = false; } } }; </script> <style scoped> .container { display: flex; align-items: center; } .container.confirming button { font-size: 1em; } .container > * { margin: 0 4px; } </style> <style> .danger { position: relative; border: solid 2px var(--danger); border-right-width: 16px; } .danger::after { position: absolute; content: "!"; color: white; right: -13px; } </style>