tailadmin ui patterns

TailAdmin UI Patterns Skill

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "tailadmin ui patterns" with this command: npx skills add kaakati/rails-enterprise-dev/kaakati-rails-enterprise-dev-tailadmin-ui-patterns

TailAdmin UI Patterns Skill

When to Use This Skill

ALWAYS invoke this skill for:

  • Dashboard interfaces and admin panels

  • Data tables and grid layouts

  • Charts, metrics, and KPI displays

  • Form components (inputs, selects, checkboxes, toggles)

  • Card layouts and stat boxes

  • Navigation (sidebar, header, breadcrumbs)

  • Buttons, badges, alerts, and modals

  • Any UI requiring TailAdmin styling

Critical Rule: FETCH BEFORE IMPLEMENTING

NEVER guess or invent classes. ALWAYS fetch from the official repository first.

MANDATORY: Fetch TailAdmin source before ANY UI work

git clone --depth 1 https://github.com/TailAdmin/tailadmin-free-tailwind-dashboard-template.git /tmp/tailadmin 2>/dev/null || echo "Already cloned"

Verify the clone

ls /tmp/tailadmin/src/

Repository Reference

Item Value

Repository https://github.com/TailAdmin/tailadmin-free-tailwind-dashboard-template

Branch main

Source Path src/

CSS Config tailwind.config.js

Custom CSS src/css/style.css

Mandatory Fetch Commands

Before implementing ANY TailAdmin UI, run these commands:

1. Clone repository (if not already done)

git clone --depth 1 https://github.com/TailAdmin/tailadmin-free-tailwind-dashboard-template.git /tmp/tailadmin 2>/dev/null

2. Check available page templates

ls /tmp/tailadmin/src/*.html

3. Check partials (reusable components)

ls /tmp/tailadmin/src/partials/

4. View Tailwind config for custom classes

cat /tmp/tailadmin/tailwind.config.js

5. View custom CSS definitions

cat /tmp/tailadmin/src/css/style.css

Finding Specific Components

Find dashboard/stats card patterns

grep -A 50 'stat|kpi|metric' /tmp/tailadmin/src/index.html | head -80

Find table patterns

cat /tmp/tailadmin/src/tables.html | head -200

Find form patterns

cat /tmp/tailadmin/src/form-elements.html | head -200

Find button patterns

grep -B 5 -A 10 'btn|button' /tmp/tailadmin/src/*.html | head -100

Find card patterns

grep -B 5 -A 20 'rounded-sm border' /tmp/tailadmin/src/*.html | head -100

Find sidebar patterns

cat /tmp/tailadmin/src/partials/sidebar.html

Find header patterns

cat /tmp/tailadmin/src/partials/header.html

Find modal patterns

grep -B 5 -A 30 'modal' /tmp/tailadmin/src/*.html | head -100

Find alert patterns

cat /tmp/tailadmin/src/alerts.html | head -150

Search for ANY specific class

grep -r 'class-name-here' /tmp/tailadmin/src/

Class Verification Process

Before using ANY class, verify it exists:

Step 1: Search in HTML files

grep -r 'bg-boxdark' /tmp/tailadmin/src/ | head -5

Step 2: Search in Tailwind config (for custom classes)

grep 'boxdark' /tmp/tailadmin/tailwind.config.js

Step 3: Search in custom CSS

grep 'boxdark' /tmp/tailadmin/src/css/style.css

If class not found in ANY of these = DO NOT USE IT

TailAdmin Custom Tailwind Configuration

IMPORTANT: These custom classes are defined in tailwind.config.js . Always verify before using:

View the full Tailwind config to see ALL custom values

cat /tmp/tailadmin/tailwind.config.js

Custom Colors (from tailwind.config.js)

// Verify with: grep -A 100 'colors:' /tmp/tailadmin/tailwind.config.js colors: { current: 'currentColor', transparent: 'transparent', white: '#FFFFFF', black: '#1C2434', 'black-2': '#010101', body: '#64748B', bodydark: '#AEB7C0', bodydark1: '#DEE4EE', bodydark2: '#8A99AF', primary: '#3C50E0', secondary: '#80CAEE', stroke: '#E2E8F0', gray: '#EFF4FB', graydark: '#333A48', 'gray-2': '#F7F9FC', 'gray-3': '#FAFAFA', whiten: '#F1F5F9', whiter: '#F5F7FD', boxdark: '#24303F', 'boxdark-2': '#1A222C', strokedark: '#2E3A47', 'form-strokedark': '#3d4d60', 'form-input': '#1d2a39', 'meta-1': '#DC3545', 'meta-2': '#EFF2F7', 'meta-3': '#10B981', 'meta-4': '#313D4A', 'meta-5': '#259AE6', 'meta-6': '#FFBA00', 'meta-7': '#FF6766', 'meta-8': '#F0950C', 'meta-9': '#E5E7EB', 'meta-10': '#0FADCF', success: '#219653', danger: '#D34053', warning: '#FFA70B', }

Custom Spacing (from tailwind.config.js)

// Verify with: grep -A 50 'spacing:' /tmp/tailadmin/tailwind.config.js // Or check extend section spacing: { '4.5': '1.125rem', // 18px '5.5': '1.375rem', // 22px '6.5': '1.625rem', // 26px '7.5': '1.875rem', // 30px '8.5': '2.125rem', // 34px '9.5': '2.375rem', // 38px '10.5': '2.625rem', // 42px '11': '2.75rem', // 44px '11.5': '2.875rem', // 46px '12.5': '3.125rem', // 50px '13': '3.25rem', // 52px '14': '3.5rem', // 56px '15': '3.75rem', // 60px '16': '4rem', // 64px '17': '4.25rem', // 68px '18': '4.5rem', // 72px '19': '4.75rem', // 76px '21': '5.25rem', // 84px '22': '5.5rem', // 88px '22.5': '5.625rem', // 90px '25': '6.25rem', // 100px '27': '6.75rem', // 108px '29': '7.25rem', // 116px '30': '7.5rem', // 120px '35': '8.75rem', // 140px '45': '11.25rem', // 180px '46': '11.5rem', // 184px '54': '13.5rem', // 216px '55': '13.75rem', // 220px '60': '15rem', // 240px '65': '16.25rem', // 260px '70': '17.5rem', // 280px '72.5': '18.125rem', // 290px - Sidebar width '90': '22.5rem', // 360px '125': '31.25rem', // 500px '142.5': '35.625rem',// 570px - Modal width '180': '45rem', // 720px '203': '50.75rem', // 812px '230': '57.5rem', // 920px }

Custom Shadows

// Verify with: grep -A 20 'boxShadow:' /tmp/tailadmin/tailwind.config.js boxShadow: { default: '0px 8px 13px -3px rgba(0, 0, 0, 0.07)', card: '0px 1px 3px rgba(0, 0, 0, 0.12)', 'card-2': '0px 1px 2px rgba(0, 0, 0, 0.05)', switcher: '0px 2px 4px rgba(0, 0, 0, 0.2), inset 0px 2px 2px #FFFFFF, inset 0px -1px 1px rgba(0, 0, 0, 0.1)', 'switch-1': '0px 0px 5px rgba(0, 0, 0, 0.15)', 1: '0px 1px 3px rgba(0, 0, 0, 0.08)', 2: '0px 1px 4px rgba(0, 0, 0, 0.12)', 3: '0px 1px 5px rgba(0, 0, 0, 0.14)', 4: '0px 4px 10px rgba(0, 0, 0, 0.12)', 5: '0px 1px 1px rgba(0, 0, 0, 0.15)', 6: '0px 3px 15px rgba(0, 0, 0, 0.1)', 7: '-5px 0 0 #313D4A, 5px 0 0 #313D4A', 8: '1px 0 0 #313D4A, -1px 0 0 #313D4A, 0 1px 0 #313D4A, 0 -1px 0 #313D4A, 0 3px 13px rgb(0 0 0 / 8%)', }

// Drop shadows dropShadow: { 1: '0px 1px 0px #E2E8F0', 2: '0px 1px 4px rgba(0, 0, 0, 0.12)', }

Layout Structure

Main Layout Wrapper

<!-- Main container with dark mode support --> <div class="flex h-screen overflow-hidden"> <!-- Sidebar --> <aside class="absolute left-0 top-0 z-9999 flex h-screen w-72.5 flex-col overflow-y-hidden bg-black duration-300 ease-linear dark:bg-boxdark lg:static lg:translate-x-0"> <!-- Sidebar content --> </aside>

<!-- Content Area --> <div class="relative flex flex-1 flex-col overflow-y-auto overflow-x-hidden"> <!-- Header --> <header class="sticky top-0 z-999 flex w-full bg-white drop-shadow-1 dark:bg-boxdark dark:drop-shadow-none"> <!-- Header content --> </header>

&#x3C;!-- Main Content -->
&#x3C;main>
  &#x3C;div class="mx-auto max-w-screen-2xl p-4 md:p-6 2xl:p-10">
    &#x3C;!-- Page content -->
  &#x3C;/div>
&#x3C;/main>

</div> </div>

Page Header / Breadcrumb

<!-- Breadcrumb --> <div class="mb-6 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between"> <h2 class="text-title-md2 font-semibold text-black dark:text-white"> Page Title </h2>

<nav> <ol class="flex items-center gap-2"> <li> <a class="font-medium" href="index.html">Dashboard /</a> </li> <li class="font-medium text-primary">Current Page</li> </ol> </nav> </div>

Card Components

Basic Card

<div class="rounded-sm border border-stroke bg-white px-5 pt-6 pb-2.5 shadow-default dark:border-strokedark dark:bg-boxdark sm:px-7.5 xl:pb-1"> <h4 class="mb-6 text-xl font-semibold text-black dark:text-white"> Card Title </h4>

<!-- Card content --> </div>

Stats Card (KPI Card)

<div class="rounded-sm border border-stroke bg-white py-6 px-7.5 shadow-default dark:border-strokedark dark:bg-boxdark"> <div class="flex h-11.5 w-11.5 items-center justify-center rounded-full bg-meta-2 dark:bg-meta-4"> <!-- Icon SVG --> <svg class="fill-primary dark:fill-white" width="22" height="16" viewBox="0 0 22 16"> <!-- SVG path --> </svg> </div>

<div class="mt-4 flex items-end justify-between"> <div> <h4 class="text-title-md font-bold text-black dark:text-white"> $3.456K </h4> <span class="text-sm font-medium">Total Views</span> </div>

&#x3C;span class="flex items-center gap-1 text-sm font-medium text-meta-3">
  0.43%
  &#x3C;svg class="fill-meta-3" width="10" height="11" viewBox="0 0 10 11">
    &#x3C;!-- Up arrow SVG -->
  &#x3C;/svg>
&#x3C;/span>

</div> </div>

Card with Chart

<div class="col-span-12 rounded-sm border border-stroke bg-white px-5 pt-7.5 pb-5 shadow-default dark:border-strokedark dark:bg-boxdark sm:px-7.5 xl:col-span-8"> <div class="flex flex-wrap items-start justify-between gap-3 sm:flex-nowrap"> <div class="flex w-full flex-wrap gap-3 sm:gap-5"> <div class="flex min-w-47.5"> <span class="mt-1 mr-2 flex h-4 w-full max-w-4 items-center justify-center rounded-full border border-primary"> <span class="block h-2.5 w-full max-w-2.5 rounded-full bg-primary"></span> </span> <div class="w-full"> <p class="font-semibold text-primary">Total Revenue</p> <p class="text-sm font-medium">12.04.2022 - 12.05.2022</p> </div> </div> </div>

&#x3C;div class="flex w-full max-w-45 justify-end">
  &#x3C;!-- Period selector dropdown -->
&#x3C;/div>

</div>

<!-- Chart container --> <div id="chartOne" class="-ml-5"></div> </div>

Tables

Basic Table

<div class="rounded-sm border border-stroke bg-white px-5 pt-6 pb-2.5 shadow-default dark:border-strokedark dark:bg-boxdark sm:px-7.5 xl:pb-1"> <h4 class="mb-6 text-xl font-semibold text-black dark:text-white"> Table Title </h4>

<div class="flex flex-col"> <!-- Table Header --> <div class="grid grid-cols-3 rounded-sm bg-gray-2 dark:bg-meta-4 sm:grid-cols-5"> <div class="p-2.5 xl:p-5"> <h5 class="text-sm font-medium uppercase xsm:text-base">Source</h5> </div> <div class="p-2.5 text-center xl:p-5"> <h5 class="text-sm font-medium uppercase xsm:text-base">Visitors</h5> </div> <div class="p-2.5 text-center xl:p-5"> <h5 class="text-sm font-medium uppercase xsm:text-base">Revenues</h5> </div> <div class="hidden p-2.5 text-center sm:block xl:p-5"> <h5 class="text-sm font-medium uppercase xsm:text-base">Sales</h5> </div> <div class="hidden p-2.5 text-center sm:block xl:p-5"> <h5 class="text-sm font-medium uppercase xsm:text-base">Conversion</h5> </div> </div>

&#x3C;!-- Table Rows -->
&#x3C;div class="grid grid-cols-3 border-b border-stroke dark:border-strokedark sm:grid-cols-5">
  &#x3C;div class="flex items-center gap-3 p-2.5 xl:p-5">
    &#x3C;div class="flex-shrink-0">
      &#x3C;img src="image.jpg" alt="Brand" />
    &#x3C;/div>
    &#x3C;p class="hidden text-black dark:text-white sm:block">Google&#x3C;/p>
  &#x3C;/div>

  &#x3C;div class="flex items-center justify-center p-2.5 xl:p-5">
    &#x3C;p class="text-black dark:text-white">3.5K&#x3C;/p>
  &#x3C;/div>

  &#x3C;div class="flex items-center justify-center p-2.5 xl:p-5">
    &#x3C;p class="text-meta-3">$5,768&#x3C;/p>
  &#x3C;/div>

  &#x3C;div class="hidden items-center justify-center p-2.5 sm:flex xl:p-5">
    &#x3C;p class="text-black dark:text-white">590&#x3C;/p>
  &#x3C;/div>

  &#x3C;div class="hidden items-center justify-center p-2.5 sm:flex xl:p-5">
    &#x3C;p class="text-meta-5">4.8%&#x3C;/p>
  &#x3C;/div>
&#x3C;/div>

</div> </div>

Data Table with Actions

<div class="rounded-sm border border-stroke bg-white shadow-default dark:border-strokedark dark:bg-boxdark"> <div class="py-6 px-4 md:px-6 xl:px-7.5"> <h4 class="text-xl font-semibold text-black dark:text-white"> Top Products </h4> </div>

<div class="grid grid-cols-6 border-t border-stroke py-4.5 px-4 dark:border-strokedark sm:grid-cols-8 md:px-6 2xl:px-7.5"> <div class="col-span-3 flex items-center"> <p class="font-medium">Product Name</p> </div> <div class="col-span-2 hidden items-center sm:flex"> <p class="font-medium">Category</p> </div> <div class="col-span-1 flex items-center"> <p class="font-medium">Price</p> </div> <div class="col-span-1 flex items-center"> <p class="font-medium">Sold</p> </div> <div class="col-span-1 flex items-center"> <p class="font-medium">Profit</p> </div> </div>

<!-- Row --> <div class="grid grid-cols-6 border-t border-stroke py-4.5 px-4 dark:border-strokedark sm:grid-cols-8 md:px-6 2xl:px-7.5"> <div class="col-span-3 flex items-center"> <div class="flex flex-col gap-4 sm:flex-row sm:items-center"> <div class="h-12.5 w-15 rounded-md"> <img src="product.jpg" alt="Product" /> </div> <p class="text-sm text-black dark:text-white">Apple Watch Series 7</p> </div> </div> <div class="col-span-2 hidden items-center sm:flex"> <p class="text-sm text-black dark:text-white">Electronics</p> </div> <div class="col-span-1 flex items-center"> <p class="text-sm text-black dark:text-white">$269</p> </div> <div class="col-span-1 flex items-center"> <p class="text-sm text-black dark:text-white">22</p> </div> <div class="col-span-1 flex items-center"> <p class="text-sm text-meta-3">$45</p> </div> </div> </div>

Forms

Input Field

<div class="mb-4.5"> <label class="mb-2.5 block text-black dark:text-white"> Email <span class="text-meta-1">*</span> </label> <input type="email" placeholder="Enter your email address" class="w-full rounded border-[1.5px] border-stroke bg-transparent py-3 px-5 font-medium outline-none transition focus:border-primary active:border-primary disabled:cursor-default disabled:bg-whiter dark:border-form-strokedark dark:bg-form-input dark:focus:border-primary" /> </div>

Select Input

<div class="mb-4.5"> <label class="mb-2.5 block text-black dark:text-white">Subject</label> <div class="relative z-20 bg-transparent dark:bg-form-input"> <select class="relative z-20 w-full appearance-none rounded border border-stroke bg-transparent py-3 px-5 outline-none transition focus:border-primary active:border-primary dark:border-form-strokedark dark:bg-form-input dark:focus:border-primary"> <option value="">Select subject</option> <option value="USA">USA</option> <option value="UK">UK</option> <option value="Canada">Canada</option> </select> <span class="absolute top-1/2 right-4 z-30 -translate-y-1/2"> <svg class="fill-current" width="24" height="24" viewBox="0 0 24 24"> <path d="M6 9L12 15L18 9" stroke="currentColor" stroke-width="2"/> </svg> </span> </div> </div>

Textarea

<div class="mb-6"> <label class="mb-2.5 block text-black dark:text-white">Message</label> <textarea rows="6" placeholder="Type your message" class="w-full rounded border-[1.5px] border-stroke bg-transparent py-3 px-5 font-medium outline-none transition focus:border-primary active:border-primary disabled:cursor-default disabled:bg-whiter dark:border-form-strokedark dark:bg-form-input dark:focus:border-primary"

</textarea> </div>

Checkbox

<div> <label class="flex cursor-pointer select-none items-center"> <div class="relative"> <input type="checkbox" class="sr-only" /> <div class="box mr-4 flex h-5 w-5 items-center justify-center rounded border border-stroke dark:border-strokedark"> <span class="opacity-0"> <svg class="h-3.5 w-3.5 stroke-current" fill="none" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"/> </svg> </span> </div> </div> Remember me </label> </div>

Toggle Switch

<div x-data="{ switcherToggle: false }"> <label for="toggle1" class="flex cursor-pointer select-none items-center"> <div class="relative"> <input type="checkbox" id="toggle1" class="sr-only" @change="switcherToggle = !switcherToggle" /> <div class="block h-8 w-14 rounded-full bg-meta-9 dark:bg-[#5A616B]"></div> <div :class="switcherToggle && '!right-1 !translate-x-full !bg-primary dark:!bg-white'" class="absolute left-1 top-1 h-6 w-6 rounded-full bg-white transition"> </div> </div> </label> </div>

Buttons

Primary Button

<button class="flex w-full justify-center rounded bg-primary p-3 font-medium text-gray hover:bg-opacity-90"> Sign In </button>

Secondary Button

<button class="flex justify-center rounded border border-stroke py-2 px-6 font-medium text-black hover:shadow-1 dark:border-strokedark dark:text-white"> Cancel </button>

Button with Icon

<button class="inline-flex items-center justify-center gap-2.5 rounded-md bg-primary py-4 px-10 text-center font-medium text-white hover:bg-opacity-90 lg:px-8 xl:px-10"> <span> <svg class="fill-current" width="20" height="20" viewBox="0 0 20 20"> <!-- Icon SVG --> </svg> </span> Button With Icon </button>

Button Sizes

<!-- Small --> <button class="inline-flex items-center justify-center rounded-md bg-primary py-2 px-4 text-center font-medium text-white hover:bg-opacity-90"> Small </button>

<!-- Medium (default) --> <button class="inline-flex items-center justify-center rounded-md bg-primary py-3 px-6 text-center font-medium text-white hover:bg-opacity-90"> Medium </button>

<!-- Large --> <button class="inline-flex items-center justify-center rounded-md bg-primary py-4 px-10 text-center font-medium text-white hover:bg-opacity-90"> Large </button>

Status Buttons

<!-- Success --> <button class="inline-flex items-center justify-center rounded-md bg-meta-3 py-3 px-6 text-center font-medium text-white hover:bg-opacity-90"> Success </button>

<!-- Warning --> <button class="inline-flex items-center justify-center rounded-md bg-warning py-3 px-6 text-center font-medium text-white hover:bg-opacity-90"> Warning </button>

<!-- Danger --> <button class="inline-flex items-center justify-center rounded-md bg-danger py-3 px-6 text-center font-medium text-white hover:bg-opacity-90"> Danger </button>

Badges & Tags

<!-- Primary Badge --> <span class="inline-flex rounded-full bg-primary bg-opacity-10 py-1 px-3 text-sm font-medium text-primary"> Primary </span>

<!-- Success Badge --> <span class="inline-flex rounded-full bg-success bg-opacity-10 py-1 px-3 text-sm font-medium text-success"> Paid </span>

<!-- Warning Badge --> <span class="inline-flex rounded-full bg-warning bg-opacity-10 py-1 px-3 text-sm font-medium text-warning"> Pending </span>

<!-- Danger Badge --> <span class="inline-flex rounded-full bg-danger bg-opacity-10 py-1 px-3 text-sm font-medium text-danger"> Unpaid </span>

Alerts

<!-- Warning Alert --> <div class="flex w-full border-l-6 border-warning bg-warning bg-opacity-[15%] px-7 py-8 shadow-md dark:bg-[#1B1B24] dark:bg-opacity-30 md:p-9"> <div class="mr-5 flex h-9 w-9 items-center justify-center rounded-lg bg-warning bg-opacity-30"> <svg class="h-[22px] w-[22px] fill-current text-warning"> <!-- Warning icon --> </svg> </div> <div class="w-full"> <h5 class="mb-3 text-lg font-semibold text-[#9D5425]">Attention needed</h5> <p class="leading-relaxed text-[#D0915C]"> Lorem ipsum dolor sit amet, consectetur adipiscing elit. </p> </div> </div>

<!-- Success Alert --> <div class="flex w-full border-l-6 border-[#34D399] bg-[#34D399] bg-opacity-[15%] px-7 py-8 shadow-md dark:bg-[#1B1B24] dark:bg-opacity-30 md:p-9"> <div class="mr-5 flex h-9 w-full max-w-[36px] items-center justify-center rounded-lg bg-[#34D399]"> <svg class="h-[18px] w-[18px] fill-current text-white"> <!-- Check icon --> </svg> </div> <div class="w-full"> <h5 class="mb-3 font-semibold text-black dark:text-[#34D399]">Message Sent Successfully</h5> <p class="text-base leading-relaxed text-body"> Lorem ipsum dolor sit amet, consectetur adipiscing elit. </p> </div> </div>

Sidebar Navigation

<aside class="absolute left-0 top-0 z-9999 flex h-screen w-72.5 flex-col overflow-y-hidden bg-black duration-300 ease-linear dark:bg-boxdark lg:static lg:translate-x-0"> <!-- Logo --> <div class="flex items-center justify-between gap-2 px-6 py-5.5 lg:py-6.5"> <a href="index.html"> <img src="logo.svg" alt="Logo" /> </a> </div>

<!-- Menu --> <div class="no-scrollbar flex flex-col overflow-y-auto duration-300 ease-linear"> <nav class="mt-5 py-4 px-4 lg:mt-9 lg:px-6"> <div> <h3 class="mb-4 ml-4 text-sm font-semibold text-bodydark2">MENU</h3>

    &#x3C;ul class="mb-6 flex flex-col gap-1.5">
      &#x3C;!-- Menu Item -->
      &#x3C;li>
        &#x3C;a href="index.html"
           class="group relative flex items-center gap-2.5 rounded-sm py-2 px-4 font-medium text-bodydark1 duration-300 ease-in-out hover:bg-graydark dark:hover:bg-meta-4"
           :class="{ 'bg-graydark dark:bg-meta-4': page === 'dashboard' }">
          &#x3C;svg class="fill-current" width="18" height="18" viewBox="0 0 18 18">
            &#x3C;!-- Dashboard icon -->
          &#x3C;/svg>
          Dashboard
        &#x3C;/a>
      &#x3C;/li>

      &#x3C;!-- Dropdown Menu Item -->
      &#x3C;li>
        &#x3C;a href="#"
           class="group relative flex items-center gap-2.5 rounded-sm py-2 px-4 font-medium text-bodydark1 duration-300 ease-in-out hover:bg-graydark dark:hover:bg-meta-4"
           @click.prevent="selected = (selected === 'Forms' ? '' : 'Forms')">
          &#x3C;svg class="fill-current" width="18" height="18" viewBox="0 0 18 18">
            &#x3C;!-- Forms icon -->
          &#x3C;/svg>
          Forms
          &#x3C;svg class="absolute right-4 top-1/2 -translate-y-1/2 fill-current"
               :class="{ 'rotate-180': selected === 'Forms' }"
               width="20" height="20" viewBox="0 0 20 20">
            &#x3C;!-- Chevron icon -->
          &#x3C;/svg>
        &#x3C;/a>

        &#x3C;!-- Dropdown Menu -->
        &#x3C;div class="overflow-hidden" :class="selected === 'Forms' ? 'block' : 'hidden'">
          &#x3C;ul class="mt-4 mb-5.5 flex flex-col gap-2.5 pl-6">
            &#x3C;li>
              &#x3C;a href="form-elements.html"
                 class="group relative flex items-center gap-2.5 rounded-md px-4 font-medium text-bodydark2 duration-300 ease-in-out hover:text-white">
                Form Elements
              &#x3C;/a>
            &#x3C;/li>
          &#x3C;/ul>
        &#x3C;/div>
      &#x3C;/li>
    &#x3C;/ul>
  &#x3C;/div>
&#x3C;/nav>

</div> </aside>

Header

<header class="sticky top-0 z-999 flex w-full bg-white drop-shadow-1 dark:bg-boxdark dark:drop-shadow-none"> <div class="flex flex-grow items-center justify-between py-4 px-4 shadow-2 md:px-6 2xl:px-11"> <!-- Hamburger (mobile) --> <div class="flex items-center gap-2 sm:gap-4 lg:hidden"> <button class="z-99999 block rounded-sm border border-stroke bg-white p-1.5 shadow-sm dark:border-strokedark dark:bg-boxdark lg:hidden"> <!-- Menu icon --> </button> </div>

&#x3C;!-- Search -->
&#x3C;div class="hidden sm:block">
  &#x3C;form action="#">
    &#x3C;div class="relative">
      &#x3C;button class="absolute top-1/2 left-0 -translate-y-1/2">
        &#x3C;svg class="fill-body hover:fill-primary dark:fill-bodydark dark:hover:fill-primary" width="20" height="20">
          &#x3C;!-- Search icon -->
        &#x3C;/svg>
      &#x3C;/button>
      &#x3C;input type="text" placeholder="Type to search..."
             class="w-full bg-transparent pr-4 pl-9 focus:outline-none" />
    &#x3C;/div>
  &#x3C;/form>
&#x3C;/div>

&#x3C;!-- Right Side -->
&#x3C;div class="flex items-center gap-3 2xsm:gap-7">
  &#x3C;!-- Dark Mode Toggle -->
  &#x3C;div class="flex items-center gap-4">
    &#x3C;!-- Theme toggler -->
  &#x3C;/div>

  &#x3C;!-- Notification -->
  &#x3C;div class="relative" x-data="{ dropdownOpen: false }">
    &#x3C;a href="#" class="relative flex h-8.5 w-8.5 items-center justify-center rounded-full border-[0.5px] border-stroke bg-gray hover:text-primary dark:border-strokedark dark:bg-meta-4 dark:text-white">
      &#x3C;span class="absolute -top-0.5 right-0 z-1 h-2 w-2 rounded-full bg-meta-1">
        &#x3C;span class="absolute -z-1 inline-flex h-full w-full animate-ping rounded-full bg-meta-1 opacity-75">&#x3C;/span>
      &#x3C;/span>
      &#x3C;svg class="fill-current duration-300 ease-in-out" width="18" height="18">
        &#x3C;!-- Bell icon -->
      &#x3C;/svg>
    &#x3C;/a>
    &#x3C;!-- Dropdown -->
  &#x3C;/div>

  &#x3C;!-- User Dropdown -->
  &#x3C;div class="relative" x-data="{ dropdownOpen: false }">
    &#x3C;a href="#" class="flex items-center gap-4" @click.prevent="dropdownOpen = !dropdownOpen">
      &#x3C;span class="hidden text-right lg:block">
        &#x3C;span class="block text-sm font-medium text-black dark:text-white">Thomas Anree&#x3C;/span>
        &#x3C;span class="block text-xs">UX Designer&#x3C;/span>
      &#x3C;/span>
      &#x3C;span class="h-12 w-12 rounded-full">
        &#x3C;img src="user.jpg" alt="User" />
      &#x3C;/span>
    &#x3C;/a>
    &#x3C;!-- Dropdown content -->
  &#x3C;/div>
&#x3C;/div>

</div> </header>

Modal

<div x-show="modalOpen" x-transition class="fixed top-0 left-0 z-999999 flex h-full min-h-screen w-full items-center justify-center bg-black/90 px-4 py-5"> <div class="w-full max-w-142.5 rounded-lg bg-white py-12 px-8 text-center dark:bg-boxdark md:py-15 md:px-17.5"> <span class="mx-auto inline-block"> <!-- Modal icon --> </span> <h3 class="mt-5.5 pb-2 text-xl font-bold text-black dark:text-white sm:text-2xl"> Modal Title </h3> <p class="mb-10"> Modal description text goes here. </p> <div class="flex flex-wrap justify-center gap-4"> <button class="inline-flex rounded border border-stroke py-2 px-6 font-medium text-black hover:shadow-1 dark:border-strokedark dark:text-white" @click="modalOpen = false"> Cancel </button> <button class="inline-flex rounded bg-primary py-2 px-6 font-medium text-gray hover:bg-opacity-90"> Confirm </button> </div> </div> </div>

Pagination

<div class="p-4 sm:p-6 xl:p-7.5"> <nav> <ul class="flex flex-wrap items-center gap-2"> <li> <a href="#" class="flex items-center justify-center rounded bg-[#EDEFF1] py-1.5 px-3 text-xs font-medium text-black hover:bg-primary hover:text-white dark:bg-graydark dark:text-white dark:hover:bg-primary dark:hover:text-white"> Previous </a> </li> <li> <a href="#" class="flex items-center justify-center rounded py-1.5 px-3 font-medium hover:bg-primary hover:text-white">1</a> </li> <li> <a href="#" class="flex items-center justify-center rounded bg-primary py-1.5 px-3 font-medium text-white">2</a> </li> <li> <a href="#" class="flex items-center justify-center rounded py-1.5 px-3 font-medium hover:bg-primary hover:text-white">3</a> </li> <li> <a href="#" class="flex items-center justify-center rounded bg-[#EDEFF1] py-1.5 px-3 text-xs font-medium text-black hover:bg-primary hover:text-white dark:bg-graydark dark:text-white dark:hover:bg-primary dark:hover:text-white"> Next </a> </li> </ul> </nav> </div>

Custom TailAdmin Classes Reference

These are custom classes defined in TailAdmin's CSS that extend Tailwind:

Custom Widths

w-72.5 # Sidebar width max-w-142.5 # Modal max width max-w-45 # Dropdown width w-15 # Small image width h-11.5 # Icon container height

Custom Spacing

py-7.5, px-7.5 # Card padding gap-7.5 # Larger gaps pb-2.5 # Table padding mt-5.5 # Modal spacing

Custom Colors

bg-boxdark # Dark mode background (#24303F) bg-boxdark-2 # Darker background (#1A222C) bg-strokedark # Dark mode borders bg-graydark # Gray dark variant bg-meta-1 # Red notification bg-meta-2 # Icon background bg-meta-3 # Success green bg-meta-4 # Active state dark bg-meta-5 # Info blue bg-whiter # Off-white text-bodydark # Dark mode body text text-bodydark1 # Lighter body text text-bodydark2 # Menu section headers border-stroke # Light borders border-strokedark # Dark borders

Custom Drop Shadows

drop-shadow-1 # Header shadow shadow-default # Card shadow shadow-2 # Inner header shadow

Converting to Rails ViewComponents

When converting TailAdmin HTML to ViewComponents:

app/components/dashboard/stats_card_component.rb

class Dashboard::StatsCardComponent < ViewComponent::Base def initialize(title:, value:, icon:, trend: nil, trend_value: nil) @title = title @value = value @icon = icon @trend = trend @trend_value = trend_value end

def trend_color_class @trend == :up ? 'text-meta-3' : 'text-meta-1' end

def trend_icon @trend == :up ? 'arrow-up' : 'arrow-down' end end

<%# app/components/dashboard/stats_card_component.html.erb %> <div class="rounded-sm border border-stroke bg-white py-6 px-7.5 shadow-default dark:border-strokedark dark:bg-boxdark"> <div class="flex h-11.5 w-11.5 items-center justify-center rounded-full bg-meta-2 dark:bg-meta-4"> <%= render "icons/#{@icon}" %> </div>

<div class="mt-4 flex items-end justify-between"> <div> <h4 class="text-title-md font-bold text-black dark:text-white"> <%= @value %> </h4> <span class="text-sm font-medium"><%= @title %></span> </div>

&#x3C;% if @trend.present? %>
  &#x3C;span class="flex items-center gap-1 text-sm font-medium &#x3C;%= trend_color_class %>">
    &#x3C;%= @trend_value %>
    &#x3C;%= render "icons/#{trend_icon}" %>
  &#x3C;/span>
&#x3C;% end %>

</div> </div>

Anti-Patterns: NEVER Do This

❌ Inventing Classes (CRITICAL VIOLATION)

<!-- WRONG: These classes DON'T EXIST in TailAdmin --> <div class="card-dashboard"> <!-- INVENTED - doesn't exist --> <div class="tailadmin-header"> <!-- INVENTED - doesn't exist --> <div class="custom-stat-box"> <!-- INVENTED - doesn't exist --> <button class="btn-tailadmin"> <!-- INVENTED - doesn't exist --> <div class="dashboard-widget"> <!-- INVENTED - doesn't exist --> <div class="admin-card"> <!-- INVENTED - doesn't exist -->

Verify ANY class before using:

If this returns nothing, the class DOES NOT EXIST

grep -r 'class-name' /tmp/tailadmin/src/ grep 'class-name' /tmp/tailadmin/tailwind.config.js

❌ Wrong Color Names

<!-- WRONG: These color classes don't exist --> <div class="bg-boxlight"> <!-- Doesn't exist - use bg-white or bg-whiter --> <div class="text-bodylight"> <!-- Doesn't exist - use text-body --> <div class="bg-meta-11"> <!-- Only meta-1 through meta-10 exist --> <div class="bg-primary-light"> <!-- Doesn't exist --> <div class="border-dark"> <!-- Doesn't exist - use border-strokedark -->

❌ Wrong Spacing Values

<!-- WRONG: These spacing values don't exist --> <div class="p-7.6"> <!-- Not defined - use p-7.5 --> <div class="w-73"> <!-- Not defined - use w-72.5 --> <div class="mt-5.7"> <!-- Not defined - use mt-5.5 or mt-6 -->

❌ Mixing Frameworks

<!-- WRONG: Don't mix Bootstrap or other frameworks --> <div class="card rounded-sm"> <!-- Bootstrap 'card' class --> <button class="btn btn-primary"> <!-- Bootstrap button classes --> <div class="container-fluid"> <!-- Bootstrap container --> <div class="row"> <!-- Bootstrap grid -->

✅ Correct Approach: Always Verify First

BEFORE using any class:

1. Clone repo (first time only)

git clone --depth 1 https://github.com/TailAdmin/tailadmin-free-tailwind-dashboard-template.git /tmp/tailadmin

2. Search for the class

grep -r 'the-class-you-want' /tmp/tailadmin/src/

3. If found, copy the EXACT pattern from the source

4. If NOT found, find an alternative that DOES exist

Verification Checklist Before Any UI Code

[ ] Cloned/updated TailAdmin repository to /tmp/tailadmin [ ] Found example of component type in src/.html or src/partials/ [ ] Verified ALL custom classes exist in tailwind.config.js [ ] Copied EXACT HTML structure from source [ ] Did NOT invent any new classes [ ] Did NOT modify class names from source [ ] Tested dark mode classes (dark:) are correct

Quick Reference: File Locations

Component Type Source File

Dashboard/Stats src/index.html

Tables src/tables.html

Forms src/form-elements.html

Buttons src/buttons.html

Alerts src/alerts.html

Cards src/index.html (search "rounded-sm border")

Modals Various files (search "modal")

Sidebar src/partials/sidebar.html

Header src/partials/header.html

Charts src/chart-*.html

Authentication src/signin.html , src/signup.html

Profile src/profile.html

Settings src/settings.html

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

flutter conventions & best practices

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

getx state management patterns

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

ruby oop patterns

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

rails localization (i18n) - english & arabic

No summary provided by upstream source.

Repository SourceNeeds Review