89 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
		
		
			
		
	
	
			89 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| 
								 | 
							
								<template>
							 | 
						||
| 
								 | 
							
								  <button
							 | 
						||
| 
								 | 
							
								    :class="['app-button', variant, size]"
							 | 
						||
| 
								 | 
							
								    :disabled="disabled"
							 | 
						||
| 
								 | 
							
								    @click="$emit('click')"
							 | 
						||
| 
								 | 
							
								  >
							 | 
						||
| 
								 | 
							
								    <slot />
							 | 
						||
| 
								 | 
							
								  </button>
							 | 
						||
| 
								 | 
							
								</template>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<script setup lang="ts">
							 | 
						||
| 
								 | 
							
								interface Props {
							 | 
						||
| 
								 | 
							
								  variant?: "primary" | "secondary" | "danger";
							 | 
						||
| 
								 | 
							
								  size?: "small" | "medium" | "large";
							 | 
						||
| 
								 | 
							
								  disabled?: boolean;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								interface Emits {
							 | 
						||
| 
								 | 
							
								  click: [];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								withDefaults(defineProps<Props>(), {
							 | 
						||
| 
								 | 
							
								  variant: "primary",
							 | 
						||
| 
								 | 
							
								  size: "medium",
							 | 
						||
| 
								 | 
							
								  disabled: false,
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								defineEmits<Emits>();
							 | 
						||
| 
								 | 
							
								</script>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<style scoped>
							 | 
						||
| 
								 | 
							
								.app-button {
							 | 
						||
| 
								 | 
							
								  border: none;
							 | 
						||
| 
								 | 
							
								  border-radius: 4px;
							 | 
						||
| 
								 | 
							
								  cursor: pointer;
							 | 
						||
| 
								 | 
							
								  font-weight: 500;
							 | 
						||
| 
								 | 
							
								  transition: all 0.2s;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.app-button:disabled {
							 | 
						||
| 
								 | 
							
								  opacity: 0.6;
							 | 
						||
| 
								 | 
							
								  cursor: not-allowed;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Variants */
							 | 
						||
| 
								 | 
							
								.primary {
							 | 
						||
| 
								 | 
							
								  background-color: #00dc82;
							 | 
						||
| 
								 | 
							
								  color: white;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.primary:hover:not(:disabled) {
							 | 
						||
| 
								 | 
							
								  background-color: #00b368;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.secondary {
							 | 
						||
| 
								 | 
							
								  background-color: #6c757d;
							 | 
						||
| 
								 | 
							
								  color: white;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.secondary:hover:not(:disabled) {
							 | 
						||
| 
								 | 
							
								  background-color: #5a6268;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.danger {
							 | 
						||
| 
								 | 
							
								  background-color: #dc3545;
							 | 
						||
| 
								 | 
							
								  color: white;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.danger:hover:not(:disabled) {
							 | 
						||
| 
								 | 
							
								  background-color: #c82333;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Sizes */
							 | 
						||
| 
								 | 
							
								.small {
							 | 
						||
| 
								 | 
							
								  padding: 0.5rem 1rem;
							 | 
						||
| 
								 | 
							
								  font-size: 0.875rem;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.medium {
							 | 
						||
| 
								 | 
							
								  padding: 0.75rem 1.5rem;
							 | 
						||
| 
								 | 
							
								  font-size: 1rem;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.large {
							 | 
						||
| 
								 | 
							
								  padding: 1rem 2rem;
							 | 
						||
| 
								 | 
							
								  font-size: 1.125rem;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								</style>
							 |