Skip to content

JotnarDev/KamUI

KamUI - Modern CSS Component Library for Tailwind CSS 4

npm version npm downloads license GitHub stars

Beautiful, accessible, and customizable UI components built on Tailwind CSS 4.
Framework-agnostic with zero JavaScript runtime.

πŸ“– Documentation Β· πŸš€ Getting Started Β· 🧩 Components Β· 🎨 Theming


✨ Features

Feature Description
πŸš€ Framework Agnostic Works with Vue, React, Astro, Svelte, Angular, Next.js, Nuxt, or vanilla HTML
🎨 Tailwind CSS 4 Built on the latest version with the new @theme directive
πŸŒ™ Dark Mode Automatic dark mode with system preference detection + manual toggle
πŸ“¦ Zero JS Runtime Pure CSS components, no JavaScript overhead
πŸ”§ Modular Imports Import only the components you need
β™Ώ Accessible Built with accessibility best practices
🎯 Utility-First Seamlessly mix with Tailwind utilities
πŸ“± Responsive Mobile-first responsive design

πŸ“¦ Works With

KamUI is pure CSS, so it works with any framework or no framework at all:

Framework Supported Framework Supported
Vue 3 βœ… React βœ…
Astro βœ… Next.js βœ…
Nuxt βœ… Svelte βœ…
SvelteKit βœ… Angular βœ…
Solid βœ… Qwik βœ…
HTML/CSS βœ… PHP/Blade βœ…

πŸš€ Getting Started

Installation

# npm
npm install kamui

# pnpm
pnpm add kamui

# yarn
yarn add kamui

Requirements

  • Node.js 18 or higher
  • Tailwind CSS 4.x

πŸ“– Framework Setup Guides

Vue 3 + Vite

npm install kamui tailwindcss @tailwindcss/vite
// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import tailwindcss from '@tailwindcss/vite';

export default defineConfig({
  plugins: [vue(), tailwindcss()],
});
/* src/assets/main.css */
@import 'tailwindcss';
@import 'kamui';
<!-- App.vue -->
<template>
  <button class="button button-primary">Click me</button>
</template>

React + Vite

npm install kamui tailwindcss @tailwindcss/vite
// vite.config.js
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import tailwindcss from '@tailwindcss/vite';

export default defineConfig({
  plugins: [react(), tailwindcss()],
});
/* src/index.css */
@import 'tailwindcss';
@import 'kamui';
// App.jsx
export default function App() {
  return <button className="button button-primary">Click me</button>;
}

Next.js

npm install kamui tailwindcss @tailwindcss/postcss postcss
// postcss.config.mjs
const config = {
  plugins: {
    '@tailwindcss/postcss': {},
  },
};
export default config;
/* app/globals.css */
@import 'tailwindcss';
@import 'kamui';
// app/page.jsx
export default function Home() {
  return <button className="button button-primary">Click me</button>;
}

Nuxt 3

npm install kamui tailwindcss @tailwindcss/vite
// nuxt.config.ts
import tailwindcss from '@tailwindcss/vite';

export default defineNuxtConfig({
  vite: {
    plugins: [tailwindcss()],
  },
  css: ['~/assets/css/main.css'],
});
/* assets/css/main.css */
@import 'tailwindcss';
@import 'kamui';
<!-- app.vue -->
<template>
  <button class="button button-primary">Click me</button>
</template>

Astro

npm install kamui tailwindcss @tailwindcss/vite
// astro.config.mjs
import { defineConfig } from 'astro/config';
import tailwindcss from '@tailwindcss/vite';

export default defineConfig({
  vite: {
    plugins: [tailwindcss()],
  },
});
/* src/styles/global.css */
@import 'tailwindcss';
@import 'kamui';
---
// src/pages/index.astro
import '../styles/global.css'
---

<button class="button button-primary">Click me</button>

Svelte + Vite

npm install kamui tailwindcss @tailwindcss/vite
// vite.config.js
import { defineConfig } from 'vite';
import { svelte } from '@sveltejs/vite-plugin-svelte';
import tailwindcss from '@tailwindcss/vite';

export default defineConfig({
  plugins: [svelte(), tailwindcss()],
});
/* src/app.css */
@import 'tailwindcss';
@import 'kamui';
<!-- src/App.svelte -->
<button class="button button-primary">Click me</button>

SvelteKit

npm install kamui tailwindcss @tailwindcss/vite
// vite.config.js
import { sveltekit } from '@sveltejs/kit/vite';
import tailwindcss from '@tailwindcss/vite';
import { defineConfig } from 'vite';

export default defineConfig({
  plugins: [sveltekit(), tailwindcss()],
});
/* src/app.css */
@import 'tailwindcss';
@import 'kamui';
<!-- src/routes/+page.svelte -->
<button class="button button-primary">Click me</button>

Angular

npm install kamui tailwindcss @tailwindcss/postcss postcss
// .postcssrc.json
{
  "plugins": {
    "@tailwindcss/postcss": {}
  }
}
/* src/styles.css */
@import 'tailwindcss';
@import 'kamui';
<!-- component.html -->
<button class="button button-primary">Click me</button>

Solid + Vite

npm install kamui tailwindcss @tailwindcss/vite
// vite.config.js
import { defineConfig } from 'vite';
import solid from 'vite-plugin-solid';
import tailwindcss from '@tailwindcss/vite';

export default defineConfig({
  plugins: [solid(), tailwindcss()],
});
/* src/index.css */
@import 'tailwindcss';
@import 'kamui';
// src/App.jsx
export default function App() {
  return <button class="button button-primary">Click me</button>;
}

HTML (No Framework)

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>KamUI Example</title>
    <script src="https://cdn.tailwindcss.com"></script>
    <link rel="stylesheet" href="node_modules/kamui/library/index.css" />
  </head>
  <body class="bg-bg text-text p-8">
    <button class="button button-primary">Click me</button>
  </body>
</html>

🧩 Components

KamUI includes 23+ ready-to-use components:

Component Description Component Description
πŸ”˜ Buttons Multiple variants & sizes πŸƒ Cards Content containers
πŸ“ Forms Inputs, labels, validation πŸ”” Alerts Feedback messages
🏷️ Badges Labels & status indicators πŸ“Š Tables Data display
πŸ’¬ Modals Dialog windows πŸ“‘ Tabs Content organization
πŸ“‹ Dropdowns Menu lists πŸ‘€ Avatars User images
🧭 Breadcrumbs Navigation paths πŸ’‘ Tooltips Hover information
πŸ“ Popovers Floating content ⏳ Spinners Loading indicators
πŸ“ˆ Progress Progress bars πŸ”” Toasts Notifications
🎹 Accordion Collapsible content βž– Dividers Visual separators
πŸ“ List Groups Grouped items 🚢 Stepper Multi-step progress
πŸ“„ Pagination Page navigation ✍️ Typography Text styles

πŸ’‘ Usage Examples

Buttons

<!-- Solid variants -->
<button class="button button-primary">Primary</button>
<button class="button button-secondary">Secondary</button>
<button class="button button-success">Success</button>
<button class="button button-warning">Warning</button>
<button class="button button-error">Error</button>

<!-- Outlined variants -->
<button class="button button-outlined button-outlined-primary">Outlined</button>

<!-- Ghost variant -->
<button class="button button-ghost">Ghost</button>

<!-- Sizes -->
<button class="button button-primary button-sm">Small</button>
<button class="button button-primary button-md">Medium</button>
<button class="button button-primary button-lg">Large</button>

<!-- Pill shape -->
<button class="button button-primary button-pill">Pill Button</button>

Cards

<div class="card">
  <div class="card-header">Card Title</div>
  <div class="card-body">
    <p>Card content goes here.</p>
  </div>
  <div class="card-footer">
    <button class="button button-primary">Action</button>
  </div>
</div>

<!-- Card with image -->
<div class="card">
  <img class="card-img" src="image.jpg" alt="Description" />
  <div class="card-body">Content</div>
</div>

Forms

<!-- Basic input -->
<div>
  <label class="form-label" for="email">Email</label>
  <input
    class="form-input"
    type="email"
    id="email"
    placeholder="you@example.com"
  />
</div>

<!-- Floating label -->
<div class="form-floating">
  <input
    id="name"
    type="text"
    class="form-floating-input peer"
    placeholder="Name"
  />
  <label for="name" class="form-floating-label">Your Name</label>
</div>

<!-- Validation states -->
<input class="form-input form-input-success" type="text" value="Valid input" />
<input class="form-input form-input-error" type="text" value="Invalid input" />

Alerts

<div class="alert alert-success">
  <span class="alert-icon">βœ“</span>
  <span class="alert-message">Operation completed successfully!</span>
</div>

<div class="alert alert-error">
  <span class="alert-icon">βœ•</span>
  <span class="alert-message">Something went wrong.</span>
</div>

<div class="alert alert-warning">
  <span class="alert-icon">⚠</span>
  <span class="alert-message">Please review your input.</span>
</div>

<div class="alert alert-info">
  <span class="alert-icon">β„Ή</span>
  <span class="alert-message">Here's some information.</span>
</div>

Badges

<!-- Solid badges -->
<span class="badge badge-success">Success</span>
<span class="badge badge-warning">Warning</span>
<span class="badge badge-error">Error</span>
<span class="badge badge-info">Info</span>

<!-- Sizes -->
<span class="badge badge-success badge-sm">Small</span>
<span class="badge badge-success badge-lg">Large</span>

<!-- Pill shape -->
<span class="badge badge-success badge-pill">Pill</span>

Tables

<div class="table-wrapper">
  <table class="table">
    <thead class="table-head">
      <tr>
        <th>Name</th>
        <th>Email</th>
        <th>Role</th>
      </tr>
    </thead>
    <tbody>
      <tr class="table-row">
        <td class="table-cell">John Doe</td>
        <td class="table-cell">john@example.com</td>
        <td class="table-cell">Admin</td>
      </tr>
    </tbody>
  </table>
</div>

Modal

<div class="modal">
  <div class="modal-backdrop"></div>
  <div class="modal-content">
    <div class="modal-header">Modal Title</div>
    <div class="modal-body">
      <p>Modal content goes here.</p>
    </div>
    <div class="modal-footer">
      <button class="button button-ghost">Cancel</button>
      <button class="button button-primary">Confirm</button>
    </div>
  </div>
</div>

Tabs

<div class="tabs">
  <div class="tab-list">
    <button class="tab tab-active">Tab 1</button>
    <button class="tab">Tab 2</button>
    <button class="tab">Tab 3</button>
  </div>
  <div class="tab-panel">Tab content here.</div>
</div>

πŸ”§ Modular Imports

Import only the components you need to reduce bundle size:

/* Import only what you need */
@import 'tailwindcss';
@import 'kamui/color'; /* Required: theme colors */
@import 'kamui/buttons'; /* Only buttons */
@import 'kamui/cards'; /* Only cards */
@import 'kamui/forms'; /* Only forms */

Available Imports

Import Component
kamui All components
kamui/color Theme colors (required)
kamui/buttons Buttons
kamui/cards Cards
kamui/forms Form inputs
kamui/alerts Alerts
kamui/badges Badges
kamui/tables Tables
kamui/modals Modals
kamui/tabs Tabs
kamui/dropdowns Dropdowns
kamui/avatars Avatars
kamui/breadcrumbs Breadcrumbs
kamui/tooltips Tooltips
kamui/popovers Popovers
kamui/spinners Spinners
kamui/progress Progress bars
kamui/toasts Toasts
kamui/accordion Accordion
kamui/dividers Dividers
kamui/list-groups List groups
kamui/stepper Stepper
kamui/pagination Pagination
kamui/typography Typography

🎨 Theming

KamUI uses CSS custom properties (variables) for theming, defined with Tailwind CSS 4's @theme directive.

Default Colors

Variable Light Mode Dark Mode
--color-primary #2f27ce #3a31d8
--color-secondary #dddbff #020024
--color-accent #443dff #0600c2
--color-bg #fbfbfe #010104
--color-text #040316 #eae9fc
--color-success #059669 #10b981
--color-warning #d97706 #f59e0b
--color-error #dc2626 #ef4444
--color-info #0284c7 #06b6d4

Customizing Colors

Override the theme colors in your CSS:

@import 'tailwindcss';
@import 'kamui';

/* Override colors */
@theme {
  --color-primary: #8b5cf6;
  --color-primary-hover: #7c3aed;
  --color-primary-focus: #a78bfa;
  --color-primary-active: #6d28d9;
  --color-primary-ring: #ddd6fe;
}

/* Override dark mode colors */
.dark {
  --color-primary: #a78bfa;
  --color-primary-hover: #8b5cf6;
}

Using Colors with Tailwind Utilities

The theme colors work as Tailwind utilities:

<div class="bg-primary text-white">Primary background</div>
<div class="text-success">Success text</div>
<div class="border-error">Error border</div>
<div class="bg-bg-elevated">Elevated background</div>

πŸŒ™ Dark Mode

KamUI supports dark mode out of the box with two methods:

1. Automatic (System Preference)

Dark mode is automatically applied based on the user's system preference using prefers-color-scheme.

2. Manual Toggle

Add the .dark class to the <html> element:

<html class="dark">
  <!-- Dark mode active -->
</html>

JavaScript Toggle Example

// Toggle dark mode
function toggleTheme() {
  document.documentElement.classList.toggle('dark');
}

// Set specific theme
function setTheme(theme) {
  if (theme === 'dark') {
    document.documentElement.classList.add('dark');
  } else {
    document.documentElement.classList.remove('dark');
  }
}

React Example

import { useState, useEffect } from 'react';

function useTheme() {
  const [isDark, setIsDark] = useState(false);

  useEffect(() => {
    const saved = localStorage.getItem('theme');
    const prefersDark = window.matchMedia(
      '(prefers-color-scheme: dark)'
    ).matches;

    if (saved === 'dark' || (!saved && prefersDark)) {
      setIsDark(true);
      document.documentElement.classList.add('dark');
    }
  }, []);

  const toggleTheme = () => {
    setIsDark(!isDark);
    document.documentElement.classList.toggle('dark');
    localStorage.setItem('theme', !isDark ? 'dark' : 'light');
  };

  return { isDark, toggleTheme };
}

Vue Example

<script setup>
import { ref, onMounted } from 'vue';

const isDark = ref(false);

onMounted(() => {
  const saved = localStorage.getItem('theme');
  const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;

  if (saved === 'dark' || (!saved && prefersDark)) {
    isDark.value = true;
    document.documentElement.classList.add('dark');
  }
});

const toggleTheme = () => {
  isDark.value = !isDark.value;
  document.documentElement.classList.toggle('dark');
  localStorage.setItem('theme', isDark.value ? 'dark' : 'light');
};
</script>

πŸ“ Project Structure

kamui/
β”œβ”€β”€ library/                 # πŸ“¦ Distributed library (npm package)
β”‚   β”œβ”€β”€ index.css           # Main entry point
β”‚   β”œβ”€β”€ theme/
β”‚   β”‚   └── color.css       # Theme colors & dark mode
β”‚   └── components/
β”‚       β”œβ”€β”€ alerts.css
β”‚       ���── avatars.css
β”‚       β”œβ”€β”€ badges.css
β”‚       β”œβ”€β”€ buttons.css
β”‚       β”œβ”€β”€ cards.css
β”‚       └── ...
β”œβ”€β”€ src/                    # πŸ”§ Source & demo app
β”‚   β”œβ”€β”€ library/           # Source CSS files
β”‚   └── ...                # Demo application
β”œβ”€β”€ tests/                  # πŸ§ͺ Test files
β”œβ”€β”€ package.json
└── README.md

🀝 Contributing

Contributions are welcome! Please read our Contributing Guide before submitting a Pull Request.

Development Setup

# Clone the repository
git clone https://github.com/JotnarDev/KamUI.git
cd KamUI

# Install dependencies
npm install

# Start development server
npm run dev

# Run tests
npm run test

# Check formatting
npm run format:check

πŸ“„ License

MIT License Β© 2025 JotnarDev

See LICENSE for more information.


πŸ™ Acknowledgments


Made with πŸ’œ by JotnarDev

⬆ Back to top

About

No description, website, or topics provided.

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

No packages published