<script lang="ts"> | |
import { createEventDispatcher } from 'svelte'; | |
const dispatch = createEventDispatcher(); | |
export let state = 'unchecked'; | |
export let indeterminate = false; | |
let _state = 'unchecked'; | |
$: _state = state; | |
</script> | |
<button | |
class=" outline -outline-offset-1 outline-[1.5px] outline-gray-200 dark:outline-gray-600 {state !== | |
'unchecked' | |
? 'bg-black outline-black ' | |
: 'hover:outline-gray-500 hover:bg-gray-50 dark:hover:bg-gray-800'} text-white transition-all rounded inline-block w-3.5 h-3.5 relative" | |
on:click={() => { | |
if (_state === 'unchecked') { | |
_state = 'checked'; | |
dispatch('change', _state); | |
} else if (_state === 'checked') { | |
_state = 'unchecked'; | |
if (!indeterminate) { | |
dispatch('change', _state); | |
} | |
} else if (indeterminate) { | |
_state = 'checked'; | |
dispatch('change', _state); | |
} | |
}} | |
type="button" | |
> | |
<div class="top-0 left-0 absolute w-full flex justify-center"> | |
{#if _state === 'checked'} | |
<svg | |
class="w-3.5 h-3.5" | |
aria-hidden="true" | |
xmlns="http://www.w3.org/2000/svg" | |
fill="none" | |
viewBox="0 0 24 24" | |
> | |
<path | |
stroke="currentColor" | |
stroke-linecap="round" | |
stroke-linejoin="round" | |
stroke-width="3" | |
d="m5 12 4.7 4.5 9.3-9" | |
/> | |
</svg> | |
{:else if indeterminate} | |
<svg | |
class="w-3 h-3.5 text-gray-800 dark:text-white" | |
aria-hidden="true" | |
xmlns="http://www.w3.org/2000/svg" | |
fill="none" | |
viewBox="0 0 24 24" | |
> | |
<path | |
stroke="currentColor" | |
stroke-linecap="round" | |
stroke-linejoin="round" | |
stroke-width="3" | |
d="M5 12h14" | |
/> | |
</svg> | |
{/if} | |
</div> | |
<!-- {checked} --> | |
</button> | |