AgentSkillsCN

Daisyui Components

Daisyui 组件

SKILL.md

DaisyUI Components Reference

Component reference for DaisyUI + Tailwind CSS implementation with The Puppy Day theme configuration.


Theme Configuration

javascript
// tailwind.config.js
module.exports = {
  daisyui: {
    themes: [
      {
        puppyday: {
          // Primary - Charcoal
          "primary": "#434E54",
          "primary-focus": "#363F44",
          "primary-content": "#FFFFFF",

          // Secondary - Lighter Cream
          "secondary": "#EAE0D5",
          "secondary-focus": "#DCD2C7",
          "secondary-content": "#434E54",

          // Accent
          "accent": "#5A6670",
          "accent-focus": "#434E54",
          "accent-content": "#FFFFFF",

          // Neutral
          "neutral": "#F5F5F5",
          "neutral-focus": "#E5E5E5",
          "neutral-content": "#434E54",

          // Base - Warm cream background
          "base-100": "#F8EEE5",
          "base-200": "#EAE0D5",
          "base-300": "#DCD2C7",
          "base-content": "#434E54",

          // Semantic colors
          "info": "#74B9FF",
          "success": "#6BCB77",
          "warning": "#FFB347",
          "error": "#EF4444",
        }
      }
    ]
  }
}

Buttons

Base Classes

html
<!-- Variants -->
<button class="btn">Default</button>
<button class="btn btn-primary">Primary</button>
<button class="btn btn-secondary">Secondary</button>
<button class="btn btn-accent">Accent</button>
<button class="btn btn-ghost">Ghost</button>
<button class="btn btn-link">Link</button>
<button class="btn btn-outline">Outline</button>

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

<!-- States -->
<button class="btn" disabled>Disabled</button>
<button class="btn btn-primary loading">Loading</button>

<!-- With icon -->
<button class="btn btn-primary">
  <svg>...</svg>
  Book Now
</button>

The Puppy Day Button Patterns

tsx
// Primary CTA
<button className="btn btn-primary bg-[#434E54] hover:bg-[#363F44] border-none">
  Book Appointment
</button>

// Secondary action
<button className="btn btn-ghost text-[#434E54]">
  Cancel
</button>

// Loading state
<button className="btn btn-primary" disabled={loading}>
  {loading && <span className="loading loading-spinner loading-sm" />}
  {loading ? 'Saving...' : 'Save Changes'}
</button>

// Icon button
<button className="btn btn-ghost btn-circle" aria-label="Close">
  <X className="w-5 h-5" />
</button>

Cards

Base Structure

html
<div class="card bg-white shadow-md">
  <figure>
    <img src="..." alt="..." />
  </figure>
  <div class="card-body">
    <h2 class="card-title">Title</h2>
    <p>Description text</p>
    <div class="card-actions justify-end">
      <button class="btn btn-primary">Action</button>
    </div>
  </div>
</div>

Variants

html
<!-- Compact -->
<div class="card card-compact">...</div>

<!-- Bordered -->
<div class="card card-bordered">...</div>

<!-- Side (horizontal) -->
<div class="card card-side">...</div>

The Puppy Day Card Pattern

tsx
<div className="card bg-white shadow-md hover:shadow-lg transition-all duration-200">
  <div className="card-body">
    {/* Header with icon */}
    <div className="flex items-center gap-3 mb-4">
      <div className="p-2.5 bg-[#EAE0D5] rounded-lg">
        <Scissors className="w-5 h-5 text-[#434E54]" />
      </div>
      <h3 className="card-title text-[#434E54]">{title}</h3>
    </div>

    {/* Content */}
    <p className="text-[#6B7280] text-sm leading-relaxed mb-4">
      {description}
    </p>

    {/* Actions */}
    <div className="card-actions">
      <button className="btn btn-primary w-full bg-[#434E54] hover:bg-[#363F44] border-none">
        Book Now
      </button>
    </div>
  </div>
</div>

Forms

Input

html
<!-- Base -->
<input type="text" class="input input-bordered w-full" placeholder="Enter text" />

<!-- Variants -->
<input class="input input-primary" />
<input class="input input-secondary" />
<input class="input input-error" />
<input class="input input-success" />

<!-- Sizes -->
<input class="input input-xs" />
<input class="input input-sm" />
<input class="input input-md" />
<input class="input input-lg" />

Select

html
<select class="select select-bordered w-full">
  <option disabled selected>Pick one</option>
  <option>Option 1</option>
  <option>Option 2</option>
</select>

Textarea

html
<textarea class="textarea textarea-bordered w-full" placeholder="Enter message"></textarea>

Checkbox & Radio

html
<!-- Checkbox -->
<input type="checkbox" class="checkbox checkbox-primary" />

<!-- Radio -->
<input type="radio" name="radio-1" class="radio radio-primary" />

<!-- Toggle -->
<input type="checkbox" class="toggle toggle-primary" />

Form Control Pattern

tsx
<div className="form-control w-full">
  <label className="label">
    <span className="label-text text-[#434E54]">Email</span>
  </label>
  <input
    type="email"
    className={`input input-bordered transition-colors duration-200
      ${error ? 'border-error focus:border-error' : 'border-[#E5E5E5] focus:border-[#434E54]'}
    `}
    placeholder="you@example.com"
  />
  {error && (
    <label className="label">
      <span className="label-text-alt text-error">{error}</span>
    </label>
  )}
</div>

Modal

Base Structure

html
<dialog id="my_modal" class="modal">
  <div class="modal-box">
    <h3 class="font-bold text-lg">Title</h3>
    <p class="py-4">Content</p>
    <div class="modal-action">
      <form method="dialog">
        <button class="btn">Close</button>
      </form>
    </div>
  </div>
  <form method="dialog" class="modal-backdrop">
    <button>close</button>
  </form>
</dialog>

React Modal Pattern

tsx
'use client';

interface ModalProps {
  isOpen: boolean;
  onClose: () => void;
  title: string;
  children: React.ReactNode;
}

export function Modal({ isOpen, onClose, title, children }: ModalProps) {
  return (
    <dialog className={`modal ${isOpen ? 'modal-open' : ''}`}>
      <div className="modal-box bg-white">
        {/* Header */}
        <div className="flex items-center justify-between mb-4">
          <h3 className="text-lg font-semibold text-[#434E54]">{title}</h3>
          <button
            onClick={onClose}
            className="btn btn-ghost btn-sm btn-circle"
            aria-label="Close modal"
          >
            <X className="w-5 h-5" />
          </button>
        </div>

        {/* Content */}
        {children}
      </div>

      {/* Backdrop */}
      <div className="modal-backdrop bg-black/50" onClick={onClose} />
    </dialog>
  );
}

Drawer

html
<div class="drawer">
  <input id="my-drawer" type="checkbox" class="drawer-toggle" />
  <div class="drawer-content">
    <!-- Page content -->
    <label for="my-drawer" class="btn btn-primary drawer-button">Open drawer</label>
  </div>
  <div class="drawer-side">
    <label for="my-drawer" class="drawer-overlay"></label>
    <ul class="menu bg-base-200 text-base-content min-h-full w-80 p-4">
      <li><a>Menu Item 1</a></li>
      <li><a>Menu Item 2</a></li>
    </ul>
  </div>
</div>

Navigation

Navbar

html
<div class="navbar bg-base-100">
  <div class="navbar-start">
    <a class="btn btn-ghost text-xl">Logo</a>
  </div>
  <div class="navbar-center hidden lg:flex">
    <ul class="menu menu-horizontal px-1">
      <li><a>Item 1</a></li>
      <li><a>Item 2</a></li>
    </ul>
  </div>
  <div class="navbar-end">
    <a class="btn btn-primary">Get started</a>
  </div>
</div>

Menu

html
<ul class="menu bg-base-200 w-56 rounded-box">
  <li><a>Item 1</a></li>
  <li><a>Item 2</a></li>
  <li>
    <details>
      <summary>Parent</summary>
      <ul>
        <li><a>Submenu 1</a></li>
        <li><a>Submenu 2</a></li>
      </ul>
    </details>
  </li>
</ul>

Tabs

html
<div role="tablist" class="tabs tabs-bordered">
  <a role="tab" class="tab">Tab 1</a>
  <a role="tab" class="tab tab-active">Tab 2</a>
  <a role="tab" class="tab">Tab 3</a>
</div>

Breadcrumbs

html
<div class="breadcrumbs text-sm">
  <ul>
    <li><a>Home</a></li>
    <li><a>Documents</a></li>
    <li>Current Page</li>
  </ul>
</div>

Feedback

Alert

html
<div class="alert">
  <span>Default alert</span>
</div>
<div class="alert alert-info">
  <span>Info alert</span>
</div>
<div class="alert alert-success">
  <span>Success alert</span>
</div>
<div class="alert alert-warning">
  <span>Warning alert</span>
</div>
<div class="alert alert-error">
  <span>Error alert</span>
</div>

Badge

html
<span class="badge">default</span>
<span class="badge badge-primary">primary</span>
<span class="badge badge-secondary">secondary</span>
<span class="badge badge-outline">outline</span>

Loading

html
<span class="loading loading-spinner loading-xs"></span>
<span class="loading loading-spinner loading-sm"></span>
<span class="loading loading-spinner loading-md"></span>
<span class="loading loading-spinner loading-lg"></span>

<span class="loading loading-dots loading-md"></span>
<span class="loading loading-ring loading-md"></span>
<span class="loading loading-ball loading-md"></span>

Progress

html
<progress class="progress w-56" value="0" max="100"></progress>
<progress class="progress progress-primary w-56" value="70" max="100"></progress>

Toast

html
<div class="toast toast-end">
  <div class="alert alert-success">
    <span>Message sent successfully.</span>
  </div>
</div>

Layout Utilities

Divider

html
<div class="divider">OR</div>

Stack

html
<div class="stack">
  <div class="card bg-primary text-primary-content">...</div>
  <div class="card bg-secondary text-secondary-content">...</div>
  <div class="card bg-accent text-accent-content">...</div>
</div>

Tailwind Utility Guidelines

Layout

css
/* Flexbox */
flex, flex-col, flex-row, gap-4, items-center, justify-between

/* Grid */
grid, grid-cols-3, gap-6

/* Spacing */
p-4, px-6, py-8, m-4, mx-auto, space-y-4

Typography

css
/* Size */
text-sm, text-base, text-lg, text-xl, text-2xl, text-3xl

/* Weight */
font-normal, font-medium, font-semibold, font-bold

/* Color (The Puppy Day) */
text-[#434E54]  /* Primary */
text-[#6B7280]  /* Secondary */
text-[#9CA3AF]  /* Muted */

Effects

css
/* Shadows (soft, blurred) */
shadow-sm, shadow-md, shadow-lg

/* Transitions */
transition-all duration-200 ease-in-out

/* Hover */
hover:shadow-lg, hover:bg-[#363F44], hover:-translate-y-0.5

Responsive Breakpoints

css
/* Mobile first */
Default (no prefix)  /* < 640px */
md:                  /* >= 640px */
lg:                  /* >= 1024px */
xl:                  /* >= 1280px */
2xl:                 /* >= 1536px */

Micro-Interactions

Hover Transitions

tsx
// Card hover - elevation + lift
className="transition-all duration-200 hover:shadow-lg hover:-translate-y-0.5"

// Button hover - color shift
className="transition-colors duration-200 hover:bg-[#363F44]"

// Link hover - opacity
className="transition-opacity duration-200 hover:opacity-80"

Loading States

tsx
// Spinner in button
<button className="btn btn-primary" disabled={loading}>
  {loading && <span className="loading loading-spinner loading-sm" />}
  {loading ? 'Saving...' : 'Save Changes'}
</button>

// Skeleton loader
<div className="animate-pulse">
  <div className="h-4 bg-[#EAE0D5] rounded w-3/4 mb-2" />
  <div className="h-4 bg-[#EAE0D5] rounded w-1/2" />
</div>

Button Press Feedback

tsx
className="btn active:scale-[0.98] transition-transform duration-100"

Icon Containers

tsx
// Decorative icon container
<div className="p-2.5 bg-[#EAE0D5] rounded-lg">
  <Scissors className="w-5 h-5 text-[#434E54]" />
</div>

// Circular icon button
<button className="btn btn-ghost btn-circle">
  <Bell className="w-5 h-5" />
</button>

Responsive Grid Patterns

tsx
// Service cards grid
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 md:gap-6">
  {services.map(service => <ServiceCard key={service.id} {...service} />)}
</div>

// Two column layout
<div className="flex flex-col md:flex-row gap-4 md:gap-6">
  <div className="flex-1">Left content</div>
  <div className="flex-1">Right content</div>
</div>

// Sidebar + content
<div className="flex flex-col lg:flex-row">
  <aside className="w-full lg:w-64 shrink-0">Sidebar</aside>
  <main className="flex-1 p-4 lg:p-6">Content</main>
</div>