Claude Code Plugins

Community-maintained marketplace

Feedback

tailwind-components

@omanjaya/attendancedev
0
0

Reusable Tailwind CSS component patterns for consistent UI. Use when creating buttons, cards, forms, tables, modals, navigation, or any UI components with Tailwind CSS.

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name tailwind-components
description Reusable Tailwind CSS component patterns for consistent UI. Use when creating buttons, cards, forms, tables, modals, navigation, or any UI components with Tailwind CSS.
allowed-tools Read, Grep, Glob, Edit, Write

Tailwind Components Skill

This skill provides ready-to-use Tailwind CSS component patterns for building consistent, professional UI.

Button Components

Primary Buttons

<!-- Primary Button -->
<button type="button" class="inline-flex items-center justify-center px-4 py-2.5
    bg-blue-600 hover:bg-blue-700 active:bg-blue-800
    text-white text-sm font-medium
    rounded-lg shadow-sm hover:shadow
    transition-all duration-200
    focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2
    disabled:opacity-50 disabled:cursor-not-allowed">
    <svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"/>
    </svg>
    Add New
</button>

<!-- Secondary Button -->
<button type="button" class="inline-flex items-center justify-center px-4 py-2.5
    bg-white hover:bg-gray-50 active:bg-gray-100
    text-gray-700 text-sm font-medium
    border border-gray-300
    rounded-lg shadow-sm
    transition-colors duration-200
    focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2
    dark:bg-gray-800 dark:hover:bg-gray-700 dark:text-gray-200 dark:border-gray-600">
    Cancel
</button>

<!-- Danger Button -->
<button type="button" class="inline-flex items-center justify-center px-4 py-2.5
    bg-red-600 hover:bg-red-700 active:bg-red-800
    text-white text-sm font-medium
    rounded-lg shadow-sm
    transition-colors duration-200
    focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2">
    Delete
</button>

<!-- Ghost Button -->
<button type="button" class="inline-flex items-center justify-center px-4 py-2.5
    hover:bg-gray-100 active:bg-gray-200
    text-gray-700 text-sm font-medium
    rounded-lg
    transition-colors duration-200
    dark:hover:bg-gray-700 dark:text-gray-200">
    View Details
</button>

<!-- Icon Button -->
<button type="button" class="inline-flex items-center justify-center p-2
    hover:bg-gray-100 active:bg-gray-200
    text-gray-500 hover:text-gray-700
    rounded-lg
    transition-colors duration-200
    dark:hover:bg-gray-700 dark:text-gray-400">
    <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/>
    </svg>
</button>

Button Group

<div class="inline-flex rounded-lg shadow-sm" role="group">
    <button class="px-4 py-2 text-sm font-medium text-gray-900 bg-white border border-gray-200
        rounded-l-lg hover:bg-gray-100 focus:z-10 focus:ring-2 focus:ring-blue-500
        dark:bg-gray-800 dark:border-gray-700 dark:text-white dark:hover:bg-gray-700">
        Day
    </button>
    <button class="px-4 py-2 text-sm font-medium text-white bg-blue-600 border-y border-blue-600
        focus:z-10 focus:ring-2 focus:ring-blue-500">
        Week
    </button>
    <button class="px-4 py-2 text-sm font-medium text-gray-900 bg-white border border-gray-200
        rounded-r-lg hover:bg-gray-100 focus:z-10 focus:ring-2 focus:ring-blue-500
        dark:bg-gray-800 dark:border-gray-700 dark:text-white dark:hover:bg-gray-700">
        Month
    </button>
</div>

Card Components

Basic Card

<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm
    border border-gray-200 dark:border-gray-700
    overflow-hidden">
    <div class="p-6">
        <h3 class="text-lg font-semibold text-gray-900 dark:text-white">
            Card Title
        </h3>
        <p class="mt-2 text-sm text-gray-600 dark:text-gray-400">
            Card description goes here with some supporting text.
        </p>
    </div>
</div>

Stats Card

<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm
    border border-gray-200 dark:border-gray-700 p-6">
    <div class="flex items-center justify-between">
        <div class="flex items-center justify-center w-12 h-12
            bg-blue-100 dark:bg-blue-900/30 rounded-xl">
            <svg class="w-6 h-6 text-blue-600 dark:text-blue-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z"/>
            </svg>
        </div>
        <span class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-medium
            bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400">
            <svg class="w-3 h-3 mr-1" fill="currentColor" viewBox="0 0 20 20">
                <path fill-rule="evenodd" d="M5.293 9.707a1 1 0 010-1.414l4-4a1 1 0 011.414 0l4 4a1 1 0 01-1.414 1.414L11 7.414V15a1 1 0 11-2 0V7.414L6.707 9.707a1 1 0 01-1.414 0z" clip-rule="evenodd"/>
            </svg>
            12%
        </span>
    </div>
    <div class="mt-4">
        <h4 class="text-2xl font-bold text-gray-900 dark:text-white">2,543</h4>
        <p class="text-sm text-gray-500 dark:text-gray-400">Total Employees</p>
    </div>
</div>

Card with Header & Actions

<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm
    border border-gray-200 dark:border-gray-700 overflow-hidden">
    <!-- Header -->
    <div class="flex items-center justify-between px-6 py-4 border-b border-gray-200 dark:border-gray-700">
        <div>
            <h3 class="text-lg font-semibold text-gray-900 dark:text-white">Recent Activity</h3>
            <p class="text-sm text-gray-500 dark:text-gray-400">Last 7 days</p>
        </div>
        <button class="text-sm font-medium text-blue-600 hover:text-blue-700 dark:text-blue-400">
            View All
        </button>
    </div>
    <!-- Body -->
    <div class="p-6">
        <!-- Content here -->
    </div>
</div>

Form Components

Text Input

<div class="space-y-2">
    <label for="email" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
        Email Address
    </label>
    <input type="email" id="email" name="email"
        class="block w-full px-4 py-2.5
        bg-white dark:bg-gray-800
        border border-gray-300 dark:border-gray-600
        rounded-lg shadow-sm
        text-gray-900 dark:text-white
        placeholder:text-gray-400 dark:placeholder:text-gray-500
        focus:ring-2 focus:ring-blue-500 focus:border-blue-500
        transition-colors duration-200"
        placeholder="you@example.com">
    <p class="text-sm text-gray-500 dark:text-gray-400">We'll never share your email.</p>
</div>

Input with Icon

<div class="relative">
    <div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
        <svg class="w-5 h-5 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
        </svg>
    </div>
    <input type="text"
        class="block w-full pl-10 pr-4 py-2.5
        bg-white dark:bg-gray-800
        border border-gray-300 dark:border-gray-600
        rounded-lg shadow-sm
        text-gray-900 dark:text-white
        placeholder:text-gray-400
        focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
        placeholder="Search...">
</div>

Select Input

<div class="space-y-2">
    <label for="department" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
        Department
    </label>
    <select id="department" name="department"
        class="block w-full px-4 py-2.5
        bg-white dark:bg-gray-800
        border border-gray-300 dark:border-gray-600
        rounded-lg shadow-sm
        text-gray-900 dark:text-white
        focus:ring-2 focus:ring-blue-500 focus:border-blue-500
        transition-colors duration-200">
        <option value="">Select Department</option>
        <option value="engineering">Engineering</option>
        <option value="hr">Human Resources</option>
        <option value="finance">Finance</option>
    </select>
</div>

Checkbox & Radio

<!-- Checkbox -->
<label class="inline-flex items-center cursor-pointer">
    <input type="checkbox" class="w-4 h-4 text-blue-600 bg-gray-100 border-gray-300
        rounded focus:ring-blue-500 dark:focus:ring-blue-600
        dark:ring-offset-gray-800 dark:bg-gray-700 dark:border-gray-600">
    <span class="ml-2 text-sm text-gray-700 dark:text-gray-300">Remember me</span>
</label>

<!-- Radio -->
<label class="inline-flex items-center cursor-pointer">
    <input type="radio" name="type" value="full-time"
        class="w-4 h-4 text-blue-600 bg-gray-100 border-gray-300
        focus:ring-blue-500 dark:focus:ring-blue-600
        dark:ring-offset-gray-800 dark:bg-gray-700 dark:border-gray-600">
    <span class="ml-2 text-sm text-gray-700 dark:text-gray-300">Full Time</span>
</label>

Toggle Switch

<label class="relative inline-flex items-center cursor-pointer">
    <input type="checkbox" class="sr-only peer">
    <div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4
        peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer
        dark:bg-gray-700 peer-checked:after:translate-x-full peer-checked:after:border-white
        after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white
        after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5
        after:transition-all dark:border-gray-600 peer-checked:bg-blue-600"></div>
    <span class="ml-3 text-sm font-medium text-gray-700 dark:text-gray-300">Enable notifications</span>
</label>

Table Components

Basic Table

<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden">
    <div class="overflow-x-auto">
        <table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700">
            <thead class="bg-gray-50 dark:bg-gray-900/50">
                <tr>
                    <th scope="col" class="px-6 py-3 text-left text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider">
                        Employee
                    </th>
                    <th scope="col" class="px-6 py-3 text-left text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider">
                        Status
                    </th>
                    <th scope="col" class="px-6 py-3 text-left text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider">
                        Department
                    </th>
                    <th scope="col" class="relative px-6 py-3">
                        <span class="sr-only">Actions</span>
                    </th>
                </tr>
            </thead>
            <tbody class="divide-y divide-gray-200 dark:divide-gray-700">
                <tr class="hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors">
                    <td class="px-6 py-4 whitespace-nowrap">
                        <div class="flex items-center">
                            <img class="h-10 w-10 rounded-full object-cover" src="avatar.jpg" alt="">
                            <div class="ml-4">
                                <div class="text-sm font-medium text-gray-900 dark:text-white">John Doe</div>
                                <div class="text-sm text-gray-500 dark:text-gray-400">john@example.com</div>
                            </div>
                        </div>
                    </td>
                    <td class="px-6 py-4 whitespace-nowrap">
                        <span class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-medium
                            bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400">
                            Active
                        </span>
                    </td>
                    <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-700 dark:text-gray-300">
                        Engineering
                    </td>
                    <td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
                        <button class="text-blue-600 hover:text-blue-800 dark:text-blue-400 mr-3">Edit</button>
                        <button class="text-red-600 hover:text-red-800 dark:text-red-400">Delete</button>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
</div>

Modal Component

<!-- Backdrop -->
<div class="fixed inset-0 z-50 overflow-y-auto" x-show="open" x-cloak>
    <div class="flex min-h-screen items-center justify-center p-4">
        <!-- Overlay -->
        <div class="fixed inset-0 bg-black/50 transition-opacity" @click="open = false"></div>

        <!-- Modal -->
        <div class="relative w-full max-w-lg bg-white dark:bg-gray-800 rounded-xl shadow-2xl
            transform transition-all">
            <!-- Header -->
            <div class="flex items-center justify-between px-6 py-4 border-b border-gray-200 dark:border-gray-700">
                <h3 class="text-lg font-semibold text-gray-900 dark:text-white">Modal Title</h3>
                <button @click="open = false" class="p-1 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors">
                    <svg class="w-5 h-5 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
                    </svg>
                </button>
            </div>

            <!-- Body -->
            <div class="px-6 py-4">
                <p class="text-sm text-gray-600 dark:text-gray-400">
                    Modal content goes here.
                </p>
            </div>

            <!-- Footer -->
            <div class="flex items-center justify-end gap-3 px-6 py-4 border-t border-gray-200 dark:border-gray-700">
                <button @click="open = false" class="px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50">
                    Cancel
                </button>
                <button class="px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700">
                    Confirm
                </button>
            </div>
        </div>
    </div>
</div>

Badge/Status Components

<!-- Status Badges -->
<span class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-medium bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400">
    <span class="w-1.5 h-1.5 mr-1.5 rounded-full bg-green-500"></span>
    Active
</span>

<span class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-medium bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400">
    <span class="w-1.5 h-1.5 mr-1.5 rounded-full bg-yellow-500"></span>
    Pending
</span>

<span class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-medium bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400">
    <span class="w-1.5 h-1.5 mr-1.5 rounded-full bg-red-500"></span>
    Inactive
</span>

<span class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-medium bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-300">
    Draft
</span>

Alert Components

<!-- Success Alert -->
<div class="flex items-center p-4 rounded-lg bg-green-50 dark:bg-green-900/30 border border-green-200 dark:border-green-800">
    <svg class="w-5 h-5 text-green-500" fill="currentColor" viewBox="0 0 20 20">
        <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
    </svg>
    <p class="ml-3 text-sm font-medium text-green-700 dark:text-green-400">
        Successfully saved!
    </p>
</div>

<!-- Error Alert -->
<div class="flex items-center p-4 rounded-lg bg-red-50 dark:bg-red-900/30 border border-red-200 dark:border-red-800">
    <svg class="w-5 h-5 text-red-500" fill="currentColor" viewBox="0 0 20 20">
        <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd"/>
    </svg>
    <p class="ml-3 text-sm font-medium text-red-700 dark:text-red-400">
        Something went wrong!
    </p>
</div>

<!-- Warning Alert -->
<div class="flex items-center p-4 rounded-lg bg-yellow-50 dark:bg-yellow-900/30 border border-yellow-200 dark:border-yellow-800">
    <svg class="w-5 h-5 text-yellow-500" fill="currentColor" viewBox="0 0 20 20">
        <path fill-rule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clip-rule="evenodd"/>
    </svg>
    <p class="ml-3 text-sm font-medium text-yellow-700 dark:text-yellow-400">
        Please review before submitting.
    </p>
</div>

Navigation Components

Sidebar Navigation Item

<a href="#" class="flex items-center px-4 py-2.5 text-sm font-medium rounded-lg
    text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700
    transition-colors duration-200 group">
    <svg class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-gray-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"/>
    </svg>
    Dashboard
</a>

<!-- Active state -->
<a href="#" class="flex items-center px-4 py-2.5 text-sm font-medium rounded-lg
    bg-blue-50 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400">
    <svg class="w-5 h-5 mr-3 text-blue-600 dark:text-blue-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z"/>
    </svg>
    Employees
</a>

Loading States

<!-- Spinner -->
<svg class="animate-spin h-5 w-5 text-blue-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
    <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
    <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
</svg>

<!-- Skeleton -->
<div class="animate-pulse space-y-4">
    <div class="h-4 bg-gray-200 dark:bg-gray-700 rounded w-3/4"></div>
    <div class="h-4 bg-gray-200 dark:bg-gray-700 rounded"></div>
    <div class="h-4 bg-gray-200 dark:bg-gray-700 rounded w-5/6"></div>
</div>

<!-- Button with Loading -->
<button class="inline-flex items-center px-4 py-2.5 bg-blue-600 text-white rounded-lg" disabled>
    <svg class="animate-spin -ml-1 mr-2 h-4 w-4 text-white" fill="none" viewBox="0 0 24 24">
        <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
        <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path>
    </svg>
    Processing...
</button>

Empty States

<div class="flex flex-col items-center justify-center py-12 px-4">
    <div class="w-16 h-16 bg-gray-100 dark:bg-gray-700 rounded-full flex items-center justify-center mb-4">
        <svg class="w-8 h-8 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4"/>
        </svg>
    </div>
    <h3 class="text-lg font-medium text-gray-900 dark:text-white mb-1">No data found</h3>
    <p class="text-sm text-gray-500 dark:text-gray-400 text-center mb-4">
        Get started by creating your first item.
    </p>
    <button class="inline-flex items-center px-4 py-2 bg-blue-600 text-white text-sm font-medium rounded-lg hover:bg-blue-700">
        <svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"/>
        </svg>
        Create New
    </button>
</div>