setting-switch.svelte 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <script lang="ts">
  2. import { quintOut } from 'svelte/easing';
  3. import { fly } from 'svelte/transition';
  4. import { createEventDispatcher } from 'svelte';
  5. export let title: string;
  6. export let subtitle = '';
  7. export let checked = false;
  8. export let disabled = false;
  9. export let isEdited = false;
  10. const dispatch = createEventDispatcher<{ toggle: boolean }>();
  11. const onToggle = (event: Event) => dispatch('toggle', (event.target as HTMLInputElement).checked);
  12. </script>
  13. <div class="flex place-items-center justify-between">
  14. <div>
  15. <div class="flex h-[26px] place-items-center gap-1">
  16. <label class="immich-form-label text-sm" for={title}>
  17. {title}
  18. </label>
  19. {#if isEdited}
  20. <div
  21. transition:fly={{ x: 10, duration: 200, easing: quintOut }}
  22. class="rounded-full bg-orange-100 px-2 text-[10px] text-orange-900"
  23. >
  24. Unsaved change
  25. </div>
  26. {/if}
  27. </div>
  28. <p class="text-sm dark:text-immich-dark-fg">{subtitle}</p>
  29. </div>
  30. <label class="relative inline-block h-[10px] w-[36px] flex-none">
  31. <input
  32. class="disabled::cursor-not-allowed h-0 w-0 opacity-0"
  33. type="checkbox"
  34. bind:checked
  35. on:click={onToggle}
  36. {disabled}
  37. />
  38. {#if disabled}
  39. <span class="slider-disable cursor-not-allowed" />
  40. {:else}
  41. <span class="slider cursor-pointer" />
  42. {/if}
  43. </label>
  44. </div>
  45. <style>
  46. .slider,
  47. .slider-disable {
  48. position: absolute;
  49. top: 0;
  50. left: 0;
  51. right: 0;
  52. bottom: 0;
  53. background-color: #ccc;
  54. -webkit-transition: 0.4s;
  55. transition: 0.4s;
  56. border-radius: 34px;
  57. }
  58. input:disabled {
  59. cursor: not-allowed;
  60. }
  61. .slider:before,
  62. .slider-disable:before {
  63. position: absolute;
  64. content: '';
  65. height: 20px;
  66. width: 20px;
  67. left: 0px;
  68. right: 0px;
  69. bottom: -4px;
  70. background-color: gray;
  71. -webkit-transition: 0.4s;
  72. transition: 0.4s;
  73. border-radius: 50%;
  74. }
  75. input:checked + .slider-disable {
  76. background-color: gray;
  77. }
  78. input:checked + .slider {
  79. background-color: #adcbfa;
  80. }
  81. input:checked + .slider:before {
  82. -webkit-transform: translateX(18px);
  83. -ms-transform: translateX(18px);
  84. transform: translateX(18px);
  85. background-color: #4250af;
  86. }
  87. </style>