flotilla/src/lib/components/Collapse.svelte

36 lines
827 B
Svelte
Raw Normal View History

2024-10-03 18:49:52 +00:00
<script lang="ts">
2024-10-08 18:39:16 +00:00
import {slide} from "@lib/transition"
import Icon from "@lib/components/Icon.svelte"
2025-02-04 00:37:14 +00:00
interface Props {
title?: import("svelte").Snippet
description?: import("svelte").Snippet
children?: import("svelte").Snippet
[key: string]: any
}
const {...props}: Props = $props()
2024-10-03 18:49:52 +00:00
const toggle = () => {
isOpen = !isOpen
}
2025-02-04 00:37:14 +00:00
let isOpen = $state(false)
2024-10-03 18:49:52 +00:00
</script>
2025-02-04 00:37:14 +00:00
<div class="relative flex flex-col gap-4 {props.class}">
2024-10-03 18:49:52 +00:00
<button
type="button"
2024-10-08 18:39:16 +00:00
class="absolute right-8 top-8 h-4 w-4 cursor-pointer transition-all"
2024-10-03 18:49:52 +00:00
class:rotate-90={!isOpen}
2025-02-04 00:37:14 +00:00
onclick={toggle}>
2024-10-03 18:49:52 +00:00
<Icon icon="alt-arrow-down" />
</button>
2025-02-04 00:37:14 +00:00
{@render props.title?.()}
{@render props.description?.()}
2024-10-03 18:49:52 +00:00
{#if isOpen}
<div transition:slide>
2025-02-04 00:37:14 +00:00
{@render props.children?.()}
2024-10-03 18:49:52 +00:00
</div>
{/if}
</div>