setting-accordion.svelte 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. <script lang="ts">
  2. import { slide } from 'svelte/transition';
  3. export let title: string;
  4. export let subtitle = '';
  5. export let isOpen = false;
  6. const toggle = () => (isOpen = !isOpen);
  7. </script>
  8. <div class="border-b-[1px] border-gray-200 dark:border-gray-700 py-4">
  9. <div class="flex justify-between place-items-center">
  10. <div>
  11. <h2 class="font-medium text-immich-primary dark:text-immich-dark-primary">
  12. {title}
  13. </h2>
  14. <p class="text-sm dark:text-immich-dark-fg">{subtitle}</p>
  15. </div>
  16. <button
  17. on:click={toggle}
  18. aria-expanded={isOpen}
  19. class="immich-circle-icon-button hover:bg-immich-primary/10 dark:text-immich-dark-fg hover:dark:bg-immich-dark-primary/20 rounded-full p-3 flex place-items-center place-content-center transition-all"
  20. >
  21. <svg
  22. style="tran"
  23. width="20"
  24. height="20"
  25. fill="none"
  26. stroke-linecap="round"
  27. stroke-linejoin="round"
  28. stroke-width="2"
  29. viewBox="0 0 24 24"
  30. stroke="currentColor"
  31. >
  32. <path d="M19 9l-7 7-7-7" />
  33. </svg>
  34. </button>
  35. </div>
  36. {#if isOpen}
  37. <ul transition:slide={{ duration: 250 }} class="mb-2 ml-4">
  38. <slot />
  39. </ul>
  40. {/if}
  41. </div>
  42. <style>
  43. svg {
  44. transition: transform 0.2s ease-in;
  45. }
  46. [aria-expanded='true'] svg {
  47. transform: rotate(0.5turn);
  48. }
  49. </style>