blob: ba20233a19965133ac9310d22f8cab5443464171 [file] [log] [blame]
<script lang="ts">
import { tooltip } from '$lib/actions/tooltip';
import type { Placement } from '@floating-ui/dom';
import type { HTMLButtonAttributes } from 'svelte/elements';
import { twMerge } from 'tailwind-merge';
const baseClasses =
'flex items-center justify-center font-semibold transition-all gap-2 rounded-[4px] focus:outline-none focus-visible:ring focus:ring-blue-600/60 ring-offset-2 ring-offset-white dark:ring-offset-shadeD700 ';
const disabledClasses =
'disabled:bg-zinc-300 dark:disabled:bg-zinc-500 disabled:text-zinc-700 disabled:pointer-events-none';
const variants = {
rounded:
'w-[40px] h-[40px] rounded-full dark:text-white flex items-center justify-center dark:hover:bg-shadeD300 hover:bg-shadeL500',
outlined:
'border-black dark:border-white dark:text-white border-2 bg-transparent dark:hover:bg-shadeD400 hover:bg-shadeL400',
outlinedRed: 'border-2 border-red-500 text-red-500 hover:text-red-600 hover:border-red-600 ',
contained:
'bg-black hover:bg-shadeD600 text-white dark:bg-white dark:text-black dark:text-black hover:shadow-lg dark:shadow-shadeD300',
containedRed: 'bg-red-500 hover:bg-red-600 text-white hover:shadow-lg',
text: 'bg-transparent text-color enabled:dark:hover:bg-shadeD500 hover:bg-shadeL400'
};
const sizes = {
xs: 'px-2 py-[4px] text-[10px]',
sm: 'px-3 py-[6px] text-xs',
md: 'px-5 py-2 text-sm',
lg: 'px-6 py-3 text-base',
xl: 'px-7 py-4 text-lg'
};
interface Props extends HTMLButtonAttributes {
variant: keyof typeof variants;
tooltipPlacement?: Placement;
size?: keyof typeof sizes;
class?: string;
children?: import('svelte').Snippet;
tooltip?: import('svelte').Snippet;
}
let {
variant,
tooltipPlacement = 'right',
size = 'md',
class: className = '',
children,
tooltip: tooltipSnippet,
onclick,
...restProps
}: Props = $props();
</script>
<button
{onclick}
data-trigger
use:tooltip={{ placement: tooltipPlacement, isTrigger: true }}
class={twMerge(baseClasses, variants[variant], sizes[size], disabledClasses, className, ' ')}
{...restProps}
>
{@render children?.()}
{#if tooltipSnippet}
<div role="tooltip" class="tooltip ring-bl">
{@render tooltipSnippet()}
</div>
{/if}
</button>