Switch.svelte 1.2 KB

12345678910111213141516171819202122232425262728293031323334
  1. <script lang="ts">
  2. import { createEventDispatcher, tick, getContext } from 'svelte';
  3. import { Switch } from 'bits-ui';
  4. import { settings } from '$lib/stores';
  5. import Tooltip from './Tooltip.svelte';
  6. export let state = true;
  7. export let id = '';
  8. export let tooltip = false;
  9. const i18n = getContext('i18n');
  10. const dispatch = createEventDispatcher();
  11. $: dispatch('change', state);
  12. </script>
  13. <Tooltip
  14. content={tooltip ? (state ? $i18n.t('Enabled') : $i18n.t('Disabled')) : ''}
  15. placement="top"
  16. >
  17. <Switch.Root
  18. bind:checked={state}
  19. {id}
  20. class="flex h-5 min-h-5 w-9 shrink-0 cursor-pointer items-center rounded-full px-[3px] mx-[1px] transition {($settings?.highContrastMode ??
  21. false)
  22. ? 'focus:outline focus:outline-2 focus:outline-gray-800 focus:dark:outline-gray-200'
  23. : 'outline outline-1 outline-gray-100 dark:outline-gray-800'} {state
  24. ? ' bg-emerald-600'
  25. : 'bg-gray-200 dark:bg-transparent'}"
  26. >
  27. <Switch.Thumb
  28. class="pointer-events-none block size-4 shrink-0 rounded-full bg-white transition-transform data-[state=checked]:translate-x-3.5 data-[state=unchecked]:translate-x-0 data-[state=unchecked]:shadow-mini "
  29. />
  30. </Switch.Root>
  31. </Tooltip>