Skip to content

Commit 6c8b9d0

Browse files
committed
Refactor button components to support dynamic element types and improve accessibility
1 parent 439b5dd commit 6c8b9d0

4 files changed

Lines changed: 10 additions & 12 deletions

File tree

src/components/BadgePreview.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ const handleStyleChange = (newStyle: string) => {
8181
<Input id="input" placeholder="@username" type="text" v-model="state.input" />
8282
</div>
8383
<div class="mt-1 flex flex-col items-center gap-2">
84-
<button v-for="styleOption in availableStyles" :key="styleOption.name" :class="['mb-2 w-full shrink-0 cursor-pointer rounded-md border border-neutral-800 p-4 text-left text-white outline-hidden duration-200', styleOption.name === state.style ? 'bg-neutral-800/70' : 'hover:bg-neutral-800/40']" @click="handleStyleChange(styleOption.name)">
84+
<button v-for="styleOption in availableStyles" :key="styleOption.name" :class="['mb-2 w-full shrink-0 cursor-pointer rounded-md border border-neutral-800 focus:bg-neutral-800 p-4 text-left text-white outline-hidden duration-200', styleOption.name === state.style ? 'bg-neutral-800/70' : 'hover:bg-neutral-800/40']" @click="handleStyleChange(styleOption.name)">
8585
<h3 class="font-medium capitalize tracking-tight">{{ styleOption.name }}</h3>
8686
<p class="text-sm text-neutral-400">{{ styleOption.description }}</p>
8787
</button>

src/components/Button.vue

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,21 @@ const buttonVariants = cva("rounded-md px-4 py-2 font-medium duration-200 disabl
1616
1717
interface ButtonProps {
1818
variant?: VariantProps<typeof buttonVariants>["variant"];
19+
as?: string;
20+
href?: string;
1921
}
2022
2123
const props = withDefaults(defineProps<ButtonProps>(), {
2224
variant: "primary",
25+
as: "button",
26+
href: "",
2327
});
2428
2529
const emits = defineEmits(["click"]);
2630
</script>
2731

2832
<template>
29-
<button @click="$emit('click')" v-bind="$attrs" :class="cn(buttonVariants({ variant: props.variant }), $attrs.class ?? '')">
33+
<component :is="props.as" @click="$emit('click')" v-bind="$attrs" :href="props.href" :class="cn(buttonVariants({ variant: props.variant }), $attrs.class ?? '')">
3034
<slot />
31-
</button>
35+
</component>
3236
</template>

src/pages/404.astro

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@ import Layout from "@/layouts/Layout.astro";
1010
<Header>404 - Page not found</Header>
1111
<Description>This page does not exist! </Description>
1212
<div class="mt-6 flex items-center justify-center">
13-
<a href="/">
14-
<Button variant="primary">Go back to home</Button>
15-
</a>
13+
<Button as="a" href="/" variant="primary">Go back to home</Button>
1614
</div>
1715
</section>
1816
</Layout>

src/pages/index.astro

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,8 @@ import Layout from "@/layouts/Layout.astro";
1212
<Header id="main">@igorkowalczyk/profile-views</Header>
1313
<Description>Create your own badge that will count views anywhere you want!</Description>
1414
<div class="mt-4 flex items-center justify-center gap-4">
15-
<a href="/docs">
16-
<Button variant="primary">Documentation</Button>
17-
</a>
18-
<a href="/github" target="_blank">
19-
<Button variant="secondary">Github</Button>
20-
</a>
15+
<Button variant="primary" href="/docs" as="a">Documentation</Button>
16+
<Button variant="secondary" href="/github" as="a">Github</Button>
2117
</div>
2218
</div>
2319
<div class="lg:flex lg:items-center lg:justify-center lg:col-span-1 hidden">

0 commit comments

Comments
 (0)