aboutsummaryrefslogtreecommitdiff
path: root/apps/website/src/components/base/Button.astro
blob: 0a4dc9f091712634ab2a824d7773d199bc56b3fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
---
import type { Icons } from "@components/icons/Icon.astro";
import Icon from "@components/icons/Icon.astro";
import type { HTMLAttributes } from "astro/types";

const styles = {
	// TODO: adjust active / disabled colors
	primary: "bg-blue-500 text-white hover:bg-blue-400 active:bg-blue-600 disabled:bg-blue-800 disabled:text-white-1/4",
	secondary: "bg-blue-20 text-blue-60 border-[1px] border-blue-30 hover:bg-blue-200 active:bg-blue-300 disabled:bg-blue-50 disabled:text-blue-200",
}

const sizes = {
	sm: "px-4 py-2 text-sm",
	md: "px-5 py-3 text-md",
	lg: "px-6 py-3 text-lg rounded-2xl"
}

const iconSize = {
	sm: 15,
	md: 18,
	lg: 24
}

interface Props extends HTMLAttributes<"button"> {
	style?: keyof typeof styles
	size?: keyof typeof sizes
	text?: string
	iconLeft?: Icons
	iconRight?: Icons
	href?: string
}

const {
	style = "primary",
	size = "md",
    text = "",
	iconLeft = "",
	iconRight = "",
	...rest
} = Astro.props;

const className = [
	"flex flex-row justify-center items-center text-center focus-visible:ring-offset-4 focus-visible:outline-offset-4",
	"rounded-xl font-medium",
	styles[style],
	sizes[size],
	"transition-colors",
	rest.class
].join(" ");

const Element = rest.href ? "a" : "button" as any;
---

<Element {...rest} class={className}>
	{iconLeft && <span class="mr-2"><Icon icon={iconLeft} size={iconSize[size]}></Icon></span>}
	{text ? text : <slot />}
	{iconRight && <span class="ml-2"><Icon icon={iconRight} size={iconSize[size]}></Icon></span>}
</Element>