aboutsummaryrefslogtreecommitdiffstats
path: root/apps/kit/src/lib/components/button.svelte
diff options
context:
space:
mode:
Diffstat (limited to 'apps/kit/src/lib/components/button.svelte')
-rw-r--r--apps/kit/src/lib/components/button.svelte38
1 files changed, 27 insertions, 11 deletions
diff --git a/apps/kit/src/lib/components/button.svelte b/apps/kit/src/lib/components/button.svelte
index 929d728..954f195 100644
--- a/apps/kit/src/lib/components/button.svelte
+++ b/apps/kit/src/lib/components/button.svelte
@@ -1,11 +1,13 @@
<script context="module" lang="ts">
export type ButtonKind = "primary" | "secondary" | "white";
- export type ButtonSize = "xs" | "sm" | "md" | "lg" | "xl";
+ export type ButtonSize = "sm" | "lg" | "md" | "xl";
</script>
<script lang="ts">
+ import { Spinner } from "./icons";
+
export let kind = "primary" as ButtonKind;
- export let size = "sm" as ButtonSize;
+ export let size = "md" as ButtonSize;
export let type: "button" | "submit" | "reset" = "button";
export let id: string | undefined = undefined;
export let tabindex: string | undefined = undefined;
@@ -14,34 +16,38 @@
export let disabled = false;
export let href: string | undefined = undefined;
export let text: string;
+ export let loading = false;
let sizeClasses = "";
let kindClasses = "";
+ let spinnerTextClasses = "";
+ let spinnerMarginClasses = "";
$: shared_props = {
type: type,
id: id || null,
title: title || null,
- disabled: disabled || null,
+ disabled: disabled || loading || null,
tabindex: tabindex || null,
style: style || null,
} as any;
$: switch (size) {
- case "xs":
- sizeClasses = "px-2.5 py-1.5 text-xs";
- break;
case "sm":
- sizeClasses = "px-3 py-2 text-sm";
+ sizeClasses = "px-2.5 py-1.5 text-xs";
+ spinnerMarginClasses = "mr-2";
break;
case "md":
- sizeClasses = "px-3 py-2 text-base";
+ sizeClasses = "px-3 py-2 text-sm";
+ spinnerMarginClasses = "mr-2";
break;
case "lg":
sizeClasses = "px-3 py-2 text-lg";
+ spinnerMarginClasses = "mr-2";
break;
case "xl":
sizeClasses = "px-6 py-3 text-xl";
+ spinnerMarginClasses = "mr-2";
break;
}
@@ -49,27 +55,34 @@
case "secondary":
kindClasses =
"border-transparent text-teal-800 bg-teal-100 hover:bg-teal-200 focus:ring-teal-500";
+ spinnerTextClasses = "teal-800";
break;
case "primary":
kindClasses =
"border-transparent text-teal-900 bg-teal-300 hover:bg-teal-400 focus:ring-teal-500";
+ spinnerTextClasses = "text-teal-900";
break;
case "white":
kindClasses =
"border-gray-300 text-gray-700 bg-white hover:bg-gray-50 focus:ring-gray-400";
+ spinnerTextClasses = "text-gray-700";
break;
}
</script>
-{#if href && !disabled}
- <!--@ts-ignore-->
+{#if href}
<a
{...shared_props}
{href}
on:click
{type}
- class="{sizeClasses} {kindClasses} inline-flex items-center border font-medium rounded shadow-sm focus:outline-none focus:ring-2"
+ class="{sizeClasses} {kindClasses} {loading
+ ? 'disabled:'
+ : ''} inline-flex items-center border font-medium rounded shadow-sm focus:outline-none focus:ring-2"
>
+ {#if loading}
+ <Spinner class={spinnerTextClasses + " " + spinnerMarginClasses} />
+ {/if}
{text}
</a>
{:else}
@@ -79,6 +92,9 @@
{type}
class="{sizeClasses} {kindClasses} inline-flex items-center border font-medium rounded shadow-sm focus:outline-none focus:ring-2"
>
+ {#if loading}
+ <Spinner class={spinnerTextClasses + " " + spinnerMarginClasses} />
+ {/if}
{text}
</button>
{/if}