feat: 实现Tabs组件/样式

This commit is contained in:
2025-12-22 14:23:01 +08:00
parent f3c03fa167
commit 724071af02
5 changed files with 80 additions and 0 deletions

View File

@ -0,0 +1,23 @@
<script lang="ts">
import { Tabs as BitsTabs } from 'bits-ui';
import type { Snippet } from 'svelte';
// import type { SvelteComponent } from 'svelte';
interface Props {
value?: string;
onValueChange?: (value: string) => void;
className?: string;
children?: Snippet;
}
let {
value = $bindable(),
onValueChange,
className,
children,
}: Props = $props();
</script>
<BitsTabs.Root bind:value {onValueChange} class={`w-full ${className}`}>
{@render children?.()}
</BitsTabs.Root>

View File

@ -0,0 +1,16 @@
<script lang="ts">
import { Tabs as BitsTabs } from 'bits-ui';
import type { Snippet } from 'svelte';
interface Props {
value: string;
className?: string;
children?: Snippet;
}
let { value, className, children }: Props = $props();
</script>
<BitsTabs.Content {value} class={`flex-1 outline-none ${className}`}>
{@render children?.()}
</BitsTabs.Content>

View File

@ -0,0 +1,17 @@
<script lang="ts">
import { Tabs as BitsTabs } from 'bits-ui';
import type { Snippet } from 'svelte';
interface Props {
className?: string;
children?: Snippet;
}
let { className, children }: Props = $props();
</script>
<BitsTabs.List
class={`tabs-box tabs flex gap-2 border-b border-gray-200 dark:border-gray-700 ${className}`}
>
{@render children?.()}
</BitsTabs.List>

View File

@ -0,0 +1,20 @@
<script lang="ts">
import { Tabs as BitsTabs } from 'bits-ui';
import type { Snippet } from 'svelte';
interface Props {
value: string;
className?: string;
children?: Snippet;
}
let { value, className, children }: Props = $props();
</script>
<BitsTabs.Trigger
{value}
class={`tab transition-colors data-[state='active']:bg-white data-[state='active']:shadow data-[state='inactive']:hover:bg-gray-200
${className}`}
>
{@render children?.()}
</BitsTabs.Trigger>

View File

@ -0,0 +1,4 @@
export { default as Tabs } from './Tabs.svelte';
export { default as TabsList } from './TabsList.svelte';
export { default as TabsTrigger } from './TabsTrigger.svelte';
export { default as TabsContent } from './TabsContent.svelte';