button-evo.vue 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. <script setup lang="ts">
  2. import { omit } from 'radash'
  3. // const theme
  4. interface ComponentProps {
  5. color?: string
  6. size?: 'lg' | 'md' | 'sm'
  7. location?: 'left' | 'right'
  8. }
  9. interface ButtonProps {
  10. block?: boolean
  11. disabled?: boolean
  12. }
  13. const props = withDefaults(
  14. defineProps<{ customClass?: string; skew?: boolean } & ComponentProps & ButtonProps>(),
  15. { color: 'primary', location: 'left' },
  16. )
  17. const emits = defineEmits<{ click: []; 'click.stop': [] }>()
  18. const instance = getCurrentInstance()
  19. const themeVars = { primary: '--evo-theme-primary' }
  20. const btnThemeClass = { primary: 'before:bg-[--evo-theme-primary] after:bg-[--evo-theme-primary]' }
  21. // const color = computed(() => (theme[props.color] ? theme[props.color] : props.color || 'black'))
  22. const buttonProps = computed(() => omit(props, ['color']))
  23. const btnClass = computed(
  24. () => `${btnThemeClass[props.color] || `before:bg-[--color] after:bg-[--color]`}`,
  25. )
  26. const height = computed(() => ({ lg: '2.75rem', md: '2.1875rem' })[props.size] || '2.75rem')
  27. const handleClick = (event: Event) => {
  28. emits('click')
  29. }
  30. </script>
  31. <template>
  32. <button
  33. class="relative bg-transparent hover:bg-transparent h-[--evo-btn-height]!"
  34. :class="`${btnClass} ${{ md: 'pl-7! pr-3.5!' }[size] || ''} skew skew-${location} ${disabled ? 'opacity-15!' : ''}`"
  35. :style="{ '--color': color, '--evo-btn-height': height }"
  36. :block="block"
  37. @click="handleClick"
  38. >
  39. <div
  40. class="w-full h-full flex items-center justify-center relative z-1 c-white"
  41. :class="`${{ md: 'text-sm' }[size] || ''}`"
  42. >
  43. <slot></slot>
  44. </div>
  45. </button>
  46. </template>
  47. <style lang="scss">
  48. /* 左侧倾斜的按钮 */
  49. // .skew {
  50. // &-right {
  51. // @apply right-skew;
  52. // }
  53. // }
  54. .left-skew {
  55. // @apply bg-blue-500 text-white px-6 rounded text-center relative;
  56. // clip-path: polygon(12% 0%, 100% 0%, 100% 100%, 0% 100%);
  57. // transition: all 0.3s ease;
  58. @apply border-black border-1 h-11 pl-8 pr-4.75 opacity-85 box-border border-red;
  59. &::before {
  60. @apply content-empty absolute top-0 right-5 bottom-0 left-1.25 skew-x-154 rounded-tl-1.25 rounded-bl-3.75;
  61. }
  62. &::after {
  63. @apply content-empty absolute top-0 right-0 bottom-0 left-6 w-auto h-auto rounded-2.5 b-none z-0 transform-none;
  64. }
  65. &:active {
  66. // @apply opacity-75;
  67. }
  68. }
  69. .skew {
  70. @apply border-black border-1 h-11 pl-8 pr-4.75 opacity-85 box-border border-red;
  71. }
  72. .skew-left {
  73. &::before {
  74. @apply content-empty absolute top-0 right-5 bottom-0 left-1.25 skew-x-154 rounded-tl-1.25 rounded-bl-3.75;
  75. }
  76. &::after {
  77. @apply content-empty absolute top-0 right-0 bottom-0 left-6 w-auto h-auto rounded-2.5 b-none z-0 transform-none;
  78. }
  79. }
  80. .skew-right {
  81. @apply pl-4.75 pr-8;
  82. &::before {
  83. @apply content-empty absolute top-0 right-1.25 bottom-0 left-5 skew-x-154 rounded-tr-3.75 rounded-br-1.25 border-[#b5b5b5] border-solid;
  84. }
  85. &::after {
  86. @apply content-empty absolute top-0 right-6 bottom-0 left-0 w-auto h-auto rounded-2.5 rounded-tr-0 rounded-br-0 z-0 transform-none border-[#b5b5b5] b-1.5 border-solid border-r-0;
  87. }
  88. }
  89. </style>