<script setup lang="ts"> import { omit } from 'radash' // const theme interface ComponentProps { color?: string size?: 'lg' | 'md' | 'sm' location?: 'left' | 'right' } interface ButtonProps { block?: boolean disabled?: boolean } const props = withDefaults( defineProps<{ customClass?: string; skew?: boolean } & ComponentProps & ButtonProps>(), { color: 'primary', location: 'left' }, ) const emits = defineEmits<{ click: []; 'click.stop': [] }>() const instance = getCurrentInstance() const themeVars = { primary: '--evo-theme-primary' } const btnThemeClass = { primary: 'before:bg-[--evo-theme-primary] after:bg-[--evo-theme-primary]' } // const color = computed(() => (theme[props.color] ? theme[props.color] : props.color || 'black')) const buttonProps = computed(() => omit(props, ['color'])) const btnClass = computed( () => `${btnThemeClass[props.color] || `before:bg-[--color] after:bg-[--color]`}`, ) const height = computed(() => ({ lg: '2.75rem', md: '2.1875rem' })[props.size] || '2.75rem') const handleClick = (event: Event) => { emits('click') } </script> <template> <button class="relative bg-transparent hover:bg-transparent h-[--evo-btn-height]!" :class="`${btnClass} ${{ md: 'pl-7! pr-3.5!' }[size] || ''} skew skew-${location} ${disabled ? 'opacity-15!' : ''}`" :style="{ '--color': color, '--evo-btn-height': height }" :block="block" @click="handleClick" > <div class="w-full h-full flex items-center justify-center relative z-1 c-white" :class="`${{ md: 'text-sm' }[size] || ''}`" > <slot></slot> </div> </button> </template> <style lang="scss"> /* 左侧倾斜的按钮 */ // .skew { // &-right { // @apply right-skew; // } // } .left-skew { // @apply bg-blue-500 text-white px-6 rounded text-center relative; // clip-path: polygon(12% 0%, 100% 0%, 100% 100%, 0% 100%); // transition: all 0.3s ease; @apply border-black border-1 h-11 pl-8 pr-4.75 opacity-85 box-border border-red; &::before { @apply content-empty absolute top-0 right-5 bottom-0 left-1.25 skew-x-154 rounded-tl-1.25 rounded-bl-3.75; } &::after { @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; } &:active { // @apply opacity-75; } } .skew { @apply border-black border-1 h-11 pl-8 pr-4.75 opacity-85 box-border border-red; } .skew-left { &::before { @apply content-empty absolute top-0 right-5 bottom-0 left-1.25 skew-x-154 rounded-tl-1.25 rounded-bl-3.75; } &::after { @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; } } .skew-right { @apply pl-4.75 pr-8; &::before { @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; } &::after { @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; } } </style>