Modern UI component library for Svelte 5
Tailwind CSS 4 · OKLCH Color Tokens · Fully Typed · 50+ Components · 7 Hooks
Live Demo · Getting Started · Changelog
npm install sv5ui
# pnpm add sv5ui
# yarn add sv5ui
# bun add sv5ui
/* layout.css */
@import 'sv5ui/theme.css';
<script>
import { Button, Avatar, toast } from 'sv5ui'
</script>
<Button variant="soft" color="primary" leadingIcon="lucide:edit">Edit</Button>
<Avatar src="/photo.jpg" alt="Jane" size="lg" />
Reactive hooks built on Svelte 5 runes and actions.
<script>
import { useMediaQuery, useClipboard, useDebounce } from 'sv5ui'
const isMobile = useMediaQuery('(max-width: 640px)')
const clipboard = useClipboard()
const debounce = useDebounce({ delay: 500 })
</script>
{#if isMobile.matches}
<MobileLayout />
{/if}
<Button onclick={() => clipboard.copy('Hello!')}>
{clipboard.copied ? 'Copied!' : 'Copy'}
</Button>
| Hook | Type | Description |
|---|---|---|
useMediaQuery |
Runes | Reactive CSS media query tracking |
useClipboard |
Runes | Copy text with auto-reset state |
useFormField |
Context | Access FormField context from child components |
useDebounce |
Runes | Debounce with pending, cancel, flush |
useClickOutside |
Action | Detect clicks outside an element |
useInfiniteScroll |
Runes + Action | Auto-load on scroll with loading state |
useEscapeKeydown |
Action | Listen for Escape key |
<!-- Per-instance -->
<Button ui={{ base: 'rounded-full shadow-lg' }}>Custom</Button>
// Global defaults
import { defineConfig } from 'sv5ui'
defineConfig({
button: { defaultVariants: { variant: 'outline' } },
icons: { loading: 'lucide:loader' }
})
/* Custom colors */
:root {
--color-primary: oklch(0.55 0.25 270);
}