aboutsummaryrefslogtreecommitdiffstats
path: root/code/app/src/lib
diff options
context:
space:
mode:
authorivarlovlie <git@ivarlovlie.no>2022-10-11 06:55:31 +0200
committerivarlovlie <git@ivarlovlie.no>2022-10-11 06:55:31 +0200
commit9372f7da2f86e43a8fc35b5042610782795d79f6 (patch)
tree633494bbf62be0b75c14557a57c55b74aafae862 /code/app/src/lib
parentc2c69ce73461ce6335bb0be67bdec52e95f3aafe (diff)
downloadgreatoffice-9372f7da2f86e43a8fc35b5042610782795d79f6.tar.xz
greatoffice-9372f7da2f86e43a8fc35b5042610782795d79f6.zip
feat: Add badges
Diffstat (limited to 'code/app/src/lib')
-rw-r--r--code/app/src/lib/components/badge.svelte75
-rw-r--r--code/app/src/lib/components/index.ts4
-rw-r--r--code/app/src/lib/components/project-status-badge.svelte24
3 files changed, 103 insertions, 0 deletions
diff --git a/code/app/src/lib/components/badge.svelte b/code/app/src/lib/components/badge.svelte
new file mode 100644
index 0000000..fdffb11
--- /dev/null
+++ b/code/app/src/lib/components/badge.svelte
@@ -0,0 +1,75 @@
+<script lang="ts">
+ import { createEventDispatcher } from "svelte";
+
+ export let id: string | undefined = undefined;
+ export let type: "default" | "red" | "yellow" | "green" | "blue" | "tame" = "default";
+ export let text: string;
+ export let size: "large" | "default" = "default";
+ export let withDot: boolean = false;
+ export let removeable: boolean = false;
+ export let uppercase: boolean = false;
+
+ let colorName = "gray";
+ let sizeClass = "rounded px-2 py-0.5 text-xs";
+ let dotSizeClass = "mr-1.5 h-2 w-2";
+
+ const dispatch = createEventDispatcher();
+
+ function handle_remove(event) {
+ event.target.closest("span").remove();
+ dispatch("remove", { event, id, text });
+ }
+
+ $: switch (type) {
+ case "red":
+ colorName = "red";
+ break;
+ case "yellow":
+ colorName = "yellow";
+ break;
+ case "blue":
+ colorName = "blue";
+ break;
+ case "green":
+ colorName = "teal";
+ break;
+ case "default":
+ case "tame":
+ default:
+ colorName = "gray";
+ break;
+ }
+
+ $: switch (size) {
+ case "large":
+ sizeClass = "rounded-md px-2.5 py-0.5 text-sm";
+ dotSizeClass = "-ml-0.5 mr-1.5 h-2 w-2";
+ break;
+ case "default":
+ default:
+ sizeClass = "rounded px-2 py-0.5 text-xs";
+ dotSizeClass = "mr-1.5 h-2 w-2";
+ break;
+ }
+</script>
+
+<span class="inline-flex items-center font-medium {uppercase ? 'uppercase' : ''} bg-{colorName}-100 text-{colorName}-800 {sizeClass}">
+ {#if withDot}
+ <svg class="{dotSizeClass} text-{colorName}-400" fill="currentColor" viewBox="0 0 8 8">
+ <circle cx="4" cy="4" r="3" />
+ </svg>
+ {/if}
+ {text}
+ {#if removeable}
+ <button
+ on:click={handle_remove}
+ type="button"
+ class="ml-0.5 inline-flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-full text-{colorName}-400 hover:bg-{colorName}-200 hover:text-{colorName}-500 focus:bg-{colorName}-500 focus:text-white focus:outline-none"
+ >
+ <span class="sr-only">Remove badge</span>
+ <svg class="h-2 w-2" stroke="currentColor" fill="none" viewBox="0 0 8 8">
+ <path stroke-linecap="round" stroke-width="1.5" d="M1 1l6 6m0-6L1 7" />
+ </svg>
+ </button>
+ {/if}
+</span>
diff --git a/code/app/src/lib/components/index.ts b/code/app/src/lib/components/index.ts
index a81e0c3..5ed1f09 100644
--- a/code/app/src/lib/components/index.ts
+++ b/code/app/src/lib/components/index.ts
@@ -4,8 +4,12 @@ import Checkbox from "./checkbox.svelte";
import Input from "./input.svelte";
import LocaleSwitcher from "./locale-switcher.svelte";
import Switch from "./switch.svelte";
+import Badge from "./badge.svelte";
+import ProjectStatusBadge from "./project-status-badge.svelte";
export {
+ Badge,
+ ProjectStatusBadge,
Alert,
Button,
Checkbox,
diff --git a/code/app/src/lib/components/project-status-badge.svelte b/code/app/src/lib/components/project-status-badge.svelte
new file mode 100644
index 0000000..5390344
--- /dev/null
+++ b/code/app/src/lib/components/project-status-badge.svelte
@@ -0,0 +1,24 @@
+<script lang="ts">
+ import type { ProjectStatus } from "$lib/models/projects/ProjectStatus";
+ import Badge from "./badge.svelte";
+ export let status: string | ProjectStatus;
+
+ let text = "";
+ let type = "default" as any;
+ $: switch (status) {
+ case "idl":
+ type = "tame";
+ text = "IDLE";
+ break;
+ case "exp":
+ type = "yellow";
+ text = "EXPIRED";
+ break;
+ case "act":
+ type = "green";
+ text = "ACTIVE";
+ break;
+ }
+</script>
+
+<Badge {text} {type} uppercase />