Switch.svelte 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. <script lang="ts">
  2. import { Switch } from 'bits-ui';
  3. import { createEventDispatcher, tick, getContext } from 'svelte';
  4. import { settings } from '$lib/stores';
  5. import Tooltip from './Tooltip.svelte';
  6. export let state = true;
  7. export let id = '';
  8. export let ariaLabelledbyId = '';
  9. export let tooltip = false;
  10. const i18n = getContext('i18n');
  11. const dispatch = createEventDispatcher();
  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. aria-labelledby={ariaLabelledbyId}
  21. class="flex h-[18px] min-h-[18px] w-8 shrink-0 cursor-pointer items-center rounded-full px-1 mx-[1px] transition {($settings?.highContrastMode ??
  22. false)
  23. ? 'focus:outline focus:outline-2 focus:outline-gray-800 focus:dark:outline-gray-200'
  24. : 'outline outline-1 outline-gray-100 dark:outline-gray-800'} {state
  25. ? ' bg-emerald-500 dark:bg-emerald-700'
  26. : 'bg-gray-200 dark:bg-transparent'}"
  27. onCheckedChange={async () => {
  28. await tick();
  29. dispatch('change', state);
  30. }}
  31. >
  32. <Switch.Thumb
  33. class="pointer-events-none block size-3 shrink-0 rounded-full bg-white transition-transform data-[state=checked]:translate-x-3 data-[state=unchecked]:translate-x-0 data-[state=unchecked]:shadow-mini "
  34. />
  35. </Switch.Root>
  36. </Tooltip>