Button.vue 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. <script setup lang="ts">
  2. const props = defineProps<{
  3. color?: "primary" | "info" | "warning" | "danger";
  4. size?: "sm" | "lg";
  5. href?: string;
  6. type?: "button" | "submit" | "reset";
  7. }>();
  8. const emit = defineEmits(["click"]);
  9. const colorCss = computed(() => {
  10. switch (props.color) {
  11. case "primary":
  12. return "bg-blue-600 border-blue-700 text-white hover:bg-blue-700";
  13. case "info":
  14. return "bg-cyan-600 border-cyan-700 text-white hover:bg-cyan-700";
  15. case "warning":
  16. return "bg-orange-600 border-orange-700 text-white hover:bg-orange-700";
  17. case "danger":
  18. return "bg-red-600 border-red-700 text-white hover:bg-red-700";
  19. default:
  20. return "hover:bg-gray-100";
  21. }
  22. });
  23. const sizeCss = computed(() => {
  24. switch (props.size) {
  25. case "sm":
  26. return "px-1 py-0.5 text-sm";
  27. case "lg":
  28. return "px-4 py-2 text-lg";
  29. default:
  30. return "px-2 py-1 text-base";
  31. }
  32. });
  33. </script>
  34. <template>
  35. <NuxtLink
  36. :to="href"
  37. :class="`border ${colorCss} ${sizeCss}`"
  38. @click="emit('click')"
  39. v-if="href"
  40. ><slot></slot
  41. ></NuxtLink>
  42. <button
  43. v-else
  44. :class="`border ${colorCss} ${sizeCss}`"
  45. @click="emit('click')"
  46. >
  47. <slot></slot>
  48. </button>
  49. </template>