Beautiful, accessible UI components for SignalX, powered by DaisyUI and Tailwind CSS.
🚧 Early public release (
0.4.x). API is small and stabilising — feedback welcome.
- 🎨 30+ DaisyUI themes — light, dark, and everything in between
- ⚡ Full SignalX reactivity — components built with SignalX primitives
- 🔧 Easy theme switching — built-in
ThemeProviderand utilities - 📦 Tree-shakeable — subpath exports let you import only what you need
- 🎯 Type-safe — full TypeScript types
- ♿ Accessible — built on DaisyUI's accessible components
pnpm add @sigx/daisyui sigx daisyui tailwindcssIn your main CSS file, add the @source directive so Tailwind v4 scans
@sigx/daisyui for class names:
@import "tailwindcss";
@plugin "daisyui";
@source "../node_modules/@sigx/daisyui";The path is relative to your CSS file — adjust to your project layout.
// vite.config.ts
import { defineConfig } from "vite";
import sigx from "@sigx/vite";
import tailwindcss from "@tailwindcss/vite";
export default defineConfig({
plugins: [sigx(), tailwindcss()],
});import { component, defineApp } from "sigx";
import { ThemeProvider, Button, Card, CardTitle, ThemeSelector } from "@sigx/daisyui";
const App = component(({ signal }) => {
const count = signal(0);
return () => (
<ThemeProvider defaultTheme="cupcake" darkMode>
<div class="p-8">
<ThemeSelector class="mb-4" />
<Card>
<Card.Body center>
<CardTitle>Counter: {count.value}</CardTitle>
<div class="flex gap-2">
<Button variant="primary" onClick={() => count.value++}>Increment</Button>
<Button variant="error" onClick={() => count.value--}>Decrement</Button>
</div>
</Card.Body>
</Card>
</div>
</ThemeProvider>
);
});
defineApp(App).mount("#app");import { ThemeProvider } from "@sigx/daisyui";
<ThemeProvider defaultTheme="cupcake" darkMode>
<App />
</ThemeProvider>import {
setTheme,
getCurrentTheme,
toggleDarkMode,
initializeTheme,
} from "@sigx/daisyui";
setTheme("cyberpunk");
getCurrentTheme(); // "cyberpunk"
toggleDarkMode();
initializeTheme({ defaultTheme: "light", darkMode: true });import { ThemeSelector, ThemeToggle } from "@sigx/daisyui";
<ThemeSelector />
<ThemeSelector themes={["light", "dark", "cupcake", "cyberpunk"]} />
<ThemeToggle />All 32 DaisyUI themes are supported.
Light: light, cupcake, bumblebee, emerald, corporate, retro, cyberpunk, valentine, garden, lofi, pastel, fantasy, wireframe, cmyk, autumn, acid, lemonade, winter, nord Dark: dark, synthwave, halloween, forest, aqua, black, luxury, dracula, business, night, coffee, dim, sunset
Button, ButtonGroup
Input, Textarea, Select, FormField, Toggle, Checkbox, Radio, Range, Fieldset, Label
Container, Card (+ Card.Body, CardTitle, Card.Actions), Stack, Flex, Row, Col, Divider, Hero, Footer, Join, Link, Chat, Artboard, Mockup (browser/code/phone/window), Carousel, Mask
Modal, Badge, Loading, Alert, Progress, Tooltip, Accordion, FileInput, Rating, Skeleton, Steps, Timeline, Toast, Kbd, RadialProgress, Countdown, Diff, Swap, Indicator, Status
Tabs, Menu, Dropdown, Drawer, Breadcrumbs, Navbar, Pagination
Table (+ Thead, Tbody, Tr, Th, Td), Avatar, Stats, Stat
Text, Heading
Icon
Import from subpath exports for smaller bundles:
import { Button } from "@sigx/daisyui/buttons";
import { Card } from "@sigx/daisyui/layout";
import { ThemeProvider } from "@sigx/daisyui/theme";Form components work with SignalX's model={() => state.x} binding:
import { component } from "sigx";
import { Input, Toggle } from "@sigx/daisyui";
const Form = component(({ signal }) => {
const form = signal({ name: "", enabled: false });
return () => (
<div>
<Input model={() => form.name} placeholder="Enter name" variant="bordered" />
<Toggle model={() => form.enabled} label="Enable feature" color="primary" />
</div>
);
});signalxjs/core— reactivity, runtime-core, DOM renderer, SSR, Vite pluginsignalxjs/router— routersignalxjs/cli—sigxCLI andcreate-sigx
See CONTRIBUTING.md. Releases: RELEASING.md.
MIT © Andreas Ekdahl
{ "compilerOptions": { "jsx": "react-jsx", "jsxImportSource": "@sigx/runtime-core" } }