<template> <NuxtLink :class="[ $style.button, $attrs.style, $style[`variant-${variant}`], $style[`size-${size}`], { [$style.prefixed]: $slots.prefix, [$style.suffixed]: $slots.suffix, }, ]" :to="href" > <span v-if="$slots.prefix" :class="$style.prefix"> <slot name="prefix" /> </span> <span :class="$style.title"> <slot /> </span> <span v-if="$slots.suffix" :class="$style.suffix"> <slot name="suffix" /> </span> </NuxtLink> </template> <script lang="ts" setup> interface Props { href: string; size?: "md"; variant?: "outline" | "text" | "primary"; } withDefaults(defineProps<Props>(), { size: "md", variant: "outline", }); </script> <style lang="scss" module> .button { color: white; border-radius: 8px; text-decoration: none; display: inline-flex; align-items: center; justify-content: center; &.variant-primary { background-color: var(--color-primary); } &.variant-outline { box-shadow: var(--color-text) 0 0 0 1px; color: var(--color-text); overflow: hidden; position: relative; transition: all 250ms; &::after { content: " "; background: var(--color-primary); position: absolute; inset: 0; transform: scale(0); opacity: 0; transition: all 250ms; z-index: 0; border-radius: 8px; } &:hover { box-shadow: var(--color-background) 0 0 0 1px; color: var(--color-primary-contrast); &::after { transform: scale(1); opacity: 1; } } } &.size-md { height: 40px; padding: 0 30px; &.prefixed, &.suffixed { padding: 0 10px 0 20px; } &.suffixed { padding-right: 0 20px 0 10px; } } } .title { z-index: 1; position: relative; flex: 1; text-align: center; .size-md.prefixed & { padding-left: 10px; } .size-md.suffixed & { padding-right: 10px; } } .prefix, .suffix { display: inline-flex; position: relative; z-index: 2; } </style>