From b9db482f0c408609067604d64c6d02b1120e35ba Mon Sep 17 00:00:00 2001 From: pheralb Date: Tue, 4 Feb 2025 22:53:21 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20Add=20new=20badge,=20button=20&?= =?UTF-8?q?=20input=20UI=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/badge/badge.svelte | 18 +++++++++++++ src/ui/badge/index.ts | 17 ++++++++++++ src/ui/button/button.svelte | 25 +++++++++++++++++ src/ui/button/index.ts | 53 +++++++++++++++++++++++++++++++++++++ src/ui/input/index.ts | 31 ++++++++++++++++++++++ src/ui/input/input.svelte | 36 +++++++++++++++++++++++++ 6 files changed, 180 insertions(+) create mode 100644 src/ui/badge/badge.svelte create mode 100644 src/ui/badge/index.ts create mode 100644 src/ui/button/button.svelte create mode 100644 src/ui/button/index.ts create mode 100644 src/ui/input/index.ts create mode 100644 src/ui/input/input.svelte diff --git a/src/ui/badge/badge.svelte b/src/ui/badge/badge.svelte new file mode 100644 index 0000000..498de14 --- /dev/null +++ b/src/ui/badge/badge.svelte @@ -0,0 +1,18 @@ + + + + + diff --git a/src/ui/badge/index.ts b/src/ui/badge/index.ts new file mode 100644 index 0000000..df14223 --- /dev/null +++ b/src/ui/badge/index.ts @@ -0,0 +1,17 @@ +import { type VariantProps, tv } from 'tailwind-variants'; +export { default as Badge } from './badge.svelte'; + +export const badgeVariants = tv({ + base: 'inline-flex items-center px-2.5 py-0.5 rounded-full font-medium text-xs font-mono hover:underline transition-colors duration-100', + variants: { + variant: { + default: + 'bg-neutral-100 dark:bg-neutral-800/50 border border-neutral-200 dark:border-neutral-800 text-neutral-600 dark:text-neutral-400 hover:bg-neutral-200 dark:hover:bg-neutral-700/50' + } + }, + defaultVariants: { + variant: 'default' + } +}); + +export type Variant = VariantProps['variant']; diff --git a/src/ui/button/button.svelte b/src/ui/button/button.svelte new file mode 100644 index 0000000..2590413 --- /dev/null +++ b/src/ui/button/button.svelte @@ -0,0 +1,25 @@ + + + + + diff --git a/src/ui/button/index.ts b/src/ui/button/index.ts new file mode 100644 index 0000000..610cc06 --- /dev/null +++ b/src/ui/button/index.ts @@ -0,0 +1,53 @@ +import type { Button as ButtonPrimitive } from 'bits-ui'; +import { type VariantProps, tv } from 'tailwind-variants'; + +import Root from './button.svelte'; + +const buttonVariants = tv({ + base: 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-neutral-300 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 dark:focus-visible:ring-neutral-700', + variants: { + variant: { + default: + 'bg-neutral-900 text-neutral-50 shadow hover:bg-neutral-900/90 dark:bg-neutral-800 dark:text-neutral-50 dark:hover:bg-neutral-800/70', + destructive: + 'bg-red-500 text-neutral-50 shadow-sm hover:bg-red-500/90 dark:bg-red-900 dark:text-neutral-50 dark:hover:bg-red-900/90', + outline: + 'border border-neutral-200 bg-white shadow-sm hover:bg-neutral-100 hover:text-neutral-900 dark:border-neutral-800 dark:bg-neutral-900 dark:hover:bg-neutral-800 dark:hover:text-neutral-50', + secondary: + 'bg-neutral-100 text-neutral-900 shadow-sm hover:bg-neutral-100/80 dark:bg-neutral-800 dark:text-neutral-50 dark:hover:bg-neutral-800/80', + ghost: + 'hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-800 dark:hover:text-neutral-50', + link: 'text-neutral-900 underline-offset-4 hover:underline dark:text-neutral-50' + }, + size: { + default: 'h-9 px-4 py-2', + sm: 'h-8 rounded-md px-3 text-xs', + lg: 'h-10 rounded-md px-8', + icon: 'h-9 w-9' + } + }, + defaultVariants: { + variant: 'default', + size: 'default' + } +}); + +type Variant = VariantProps['variant']; +type Size = VariantProps['size']; + +type Props = ButtonPrimitive.Props & { + variant?: Variant; + size?: Size; +}; + +type Events = ButtonPrimitive.Events; + +export { + Root, + type Props, + type Events, + Root as Button, + type Props as ButtonProps, + type Events as ButtonEvents, + buttonVariants +}; diff --git a/src/ui/input/index.ts b/src/ui/input/index.ts new file mode 100644 index 0000000..8e50251 --- /dev/null +++ b/src/ui/input/index.ts @@ -0,0 +1,31 @@ +import { cn } from '@/utils/cn'; +import Root from './input.svelte'; + +export type FormInputEvent = T & { + currentTarget: EventTarget & HTMLInputElement; +}; + +export const InputStyles = cn( + 'flex h-9 w-full rounded-md border border-neutral-200 bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-neutral-500 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-neutral-300 disabled:cursor-not-allowed disabled:opacity-50 dark:border-neutral-800 dark:placeholder:text-neutral-400 dark:focus-visible:ring-neutral-700' +); + +export type InputEvents = { + blur: FormInputEvent; + change: FormInputEvent; + click: FormInputEvent; + focus: FormInputEvent; + focusin: FormInputEvent; + focusout: FormInputEvent; + keydown: FormInputEvent; + keypress: FormInputEvent; + keyup: FormInputEvent; + mouseover: FormInputEvent; + mouseenter: FormInputEvent; + mouseleave: FormInputEvent; + mousemove: FormInputEvent; + paste: FormInputEvent; + input: FormInputEvent; + wheel: FormInputEvent; +}; + +export { Root, Root as Input }; diff --git a/src/ui/input/input.svelte b/src/ui/input/input.svelte new file mode 100644 index 0000000..7f275bc --- /dev/null +++ b/src/ui/input/input.svelte @@ -0,0 +1,36 @@ + + +