| <script lang="ts"> |
| import { createEventDispatcher } from 'svelte'; |
| const dispatch = createEventDispatcher(); |
|
|
| export let state = 'unchecked'; |
| export let indeterminate = false; |
| export let disabled = false; |
|
|
| export let disabledClassName = 'opacity-50 cursor-not-allowed'; |
|
|
| 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-sm inline-block w-3.5 h-3.5 relative {disabled |
| ? disabledClassName |
| : ''}" |
| on:click={() => { |
| if (disabled) return; |
|
|
| 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" |
| {disabled} |
| > |
| <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> |
|
|
| |
| </button> |
|
|