Disclosure list. Changed to nested syntax in v0.4.0 (naturally pass Blade slots without XSS). Nest <x-accordion-item title="...">content</x-accordion-item> inside <x-accordion>. Single-open or multiple-open, 3 sizes. Content is a Blade slot, so any Blade markup, components, or links work. Alpine x-collapse animates smoothly.
Rich content — since it is a Blade slot, any markup / component / link / list / multiple paragraphs work naturally
CopyCopied
Content containing a link to an external resource. See the official docs.
Bullet 1
Bullet 2
Bullet 3
The body is a Blade slot, so any HTML or Blade component can be embedded.
A second paragraph. Line breaks and styling are free-form.
<x-accordion><x-accordion-itemtitle="With a link"><p>Content containing a link to an external resource. See the <ahref="#"class="text-primary underline underline-offset-2 hover:opacity-80">official docs</a>.</p></x-accordion-item><x-accordion-itemtitle="With a list"><ulclass="list-disc list-inside space-y-1"><li>Bullet 1</li><li>Bullet 2</li><li>Bullet 3</li></ul></x-accordion-item><x-accordion-itemtitle="Multiple paragraphs"><pclass="mb-2">The body is a Blade slot, so any HTML or Blade component can be embedded.</p><p>A second paragraph. Line breaks and styling are free-form.</p></x-accordion-item></x-accordion>
<divx-data="{ open: null }"class="w-full divide-y divide-base-300 radius-box tune-border border-base-300 overflow-hidden"><div><buttontype="button"class="w-full flex items-center justify-between min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-0 font-medium text-base-content hover:bg-base-200/50 transition-colors cursor-pointer"x-on:click="open = (open === 'item_e55fc371') ? null : 'item_e55fc371'"x-bind:aria-expanded="open === 'item_e55fc371'"><span>With a link</span><svgclass="w-4 h-4 shrink-0 transition-transform duration-200"x-bind:class="open === 'item_e55fc371' && 'rotate-180'"fill="none"viewbox="0 0 24 24"stroke="currentcolor"stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5"></path></svg></button><divx-show="open === 'item_e55fc371'"x-collapse=""x-cloak=""><divclass="min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-sm text-base-content/70"><p> Content containing a link to an external resource. See the <ahref="#"class="text-primary underline underline-offset-2 hover:opacity-80">official docs</a>.
</p></div></div></div><div><buttontype="button"class="w-full flex items-center justify-between min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-0 font-medium text-base-content hover:bg-base-200/50 transition-colors cursor-pointer"x-on:click="open = (open === 'item_bdd74600') ? null : 'item_bdd74600'"x-bind:aria-expanded="open === 'item_bdd74600'"><span>With a list</span><svgclass="w-4 h-4 shrink-0 transition-transform duration-200"x-bind:class="open === 'item_bdd74600' && 'rotate-180'"fill="none"viewbox="0 0 24 24"stroke="currentcolor"stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5"></path></svg></button><divx-show="open === 'item_bdd74600'"x-collapse=""x-cloak=""><divclass="min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-sm text-base-content/70"><ulclass="list-disc list-inside space-y-1"><li>Bullet 1
</li><li>Bullet 2
</li><li>Bullet 3
</li></ul></div></div></div><div><buttontype="button"class="w-full flex items-center justify-between min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-0 font-medium text-base-content hover:bg-base-200/50 transition-colors cursor-pointer"x-on:click="open = (open === 'item_cacbad78') ? null : 'item_cacbad78'"x-bind:aria-expanded="open === 'item_cacbad78'"><span>Multiple paragraphs</span><svgclass="w-4 h-4 shrink-0 transition-transform duration-200"x-bind:class="open === 'item_cacbad78' && 'rotate-180'"fill="none"viewbox="0 0 24 24"stroke="currentcolor"stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5"></path></svg></button><divx-show="open === 'item_cacbad78'"x-collapse=""x-cloak=""><divclass="min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-sm text-base-content/70"><pclass="mb-2"> The body is a Blade slot, so any HTML or Blade component can be embedded.
</p><p> A second paragraph. Line breaks and styling are free-form.
</p></div></div></div></div>
FAQ demo — a realistic use case (single-open)
An in-house Blade component library by Yakaze Tech Studio, built on Tailwind v4 + daisyUI v5 + Alpine.js. It aims to keep UI consistency across projects.
Run composer require sparrowhawk-labs/pinion-ui, then php artisan ui:install to wire up the required resources.
Yes. pinion-ui uses daisyUI classes internally, so it shares the same theme variables. You can freely mix <x-...> with regular daisyUI markup.
Define your theme with daisyUI v5's @plugin "daisyui/theme" directive. Every pinion-ui class goes through theme variables, so changing the theme is enough to update the colors.
FAQ (multiple-open) — for comparing items side by side
A Blade component library built on Tailwind v4 + daisyUI v5 + Alpine.js.
composer require → php artisan ui:install.
Light only (pinion) since v0.4.0. If you need dark, specify daisyUI's standard dark / dim / night on <html data-theme>.
data-theme = pinion
Accordion
Disclosure list. Changed to nested syntax in v0.4.0 (naturally pass Blade slots without XSS). Nest <x-accordion-item title="...">content</x-accordion-item> inside <x-accordion>. Single-open or multiple-open, 3 sizes. Content is a Blade slot, so any Blade markup, components, or links work. Alpine x-collapse animates smoothly.
Rich content — since it is a Blade slot, any markup / component / link / list / multiple paragraphs work naturally
CopyCopied
Content containing a link to an external resource. See the official docs.
Bullet 1
Bullet 2
Bullet 3
The body is a Blade slot, so any HTML or Blade component can be embedded.
A second paragraph. Line breaks and styling are free-form.
<x-accordion><x-accordion-itemtitle="With a link"><p>Content containing a link to an external resource. See the <ahref="#"class="text-primary underline underline-offset-2 hover:opacity-80">official docs</a>.</p></x-accordion-item><x-accordion-itemtitle="With a list"><ulclass="list-disc list-inside space-y-1"><li>Bullet 1</li><li>Bullet 2</li><li>Bullet 3</li></ul></x-accordion-item><x-accordion-itemtitle="Multiple paragraphs"><pclass="mb-2">The body is a Blade slot, so any HTML or Blade component can be embedded.</p><p>A second paragraph. Line breaks and styling are free-form.</p></x-accordion-item></x-accordion>
<divx-data="{ open: null }"class="w-full divide-y divide-base-300 radius-box tune-border border-base-300 overflow-hidden"><div><buttontype="button"class="w-full flex items-center justify-between min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-0 font-medium text-base-content hover:bg-base-200/50 transition-colors cursor-pointer"x-on:click="open = (open === 'item_e55fc371') ? null : 'item_e55fc371'"x-bind:aria-expanded="open === 'item_e55fc371'"><span>With a link</span><svgclass="w-4 h-4 shrink-0 transition-transform duration-200"x-bind:class="open === 'item_e55fc371' && 'rotate-180'"fill="none"viewbox="0 0 24 24"stroke="currentcolor"stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5"></path></svg></button><divx-show="open === 'item_e55fc371'"x-collapse=""x-cloak=""><divclass="min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-sm text-base-content/70"><p> Content containing a link to an external resource. See the <ahref="#"class="text-primary underline underline-offset-2 hover:opacity-80">official docs</a>.
</p></div></div></div><div><buttontype="button"class="w-full flex items-center justify-between min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-0 font-medium text-base-content hover:bg-base-200/50 transition-colors cursor-pointer"x-on:click="open = (open === 'item_bdd74600') ? null : 'item_bdd74600'"x-bind:aria-expanded="open === 'item_bdd74600'"><span>With a list</span><svgclass="w-4 h-4 shrink-0 transition-transform duration-200"x-bind:class="open === 'item_bdd74600' && 'rotate-180'"fill="none"viewbox="0 0 24 24"stroke="currentcolor"stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5"></path></svg></button><divx-show="open === 'item_bdd74600'"x-collapse=""x-cloak=""><divclass="min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-sm text-base-content/70"><ulclass="list-disc list-inside space-y-1"><li>Bullet 1
</li><li>Bullet 2
</li><li>Bullet 3
</li></ul></div></div></div><div><buttontype="button"class="w-full flex items-center justify-between min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-0 font-medium text-base-content hover:bg-base-200/50 transition-colors cursor-pointer"x-on:click="open = (open === 'item_cacbad78') ? null : 'item_cacbad78'"x-bind:aria-expanded="open === 'item_cacbad78'"><span>Multiple paragraphs</span><svgclass="w-4 h-4 shrink-0 transition-transform duration-200"x-bind:class="open === 'item_cacbad78' && 'rotate-180'"fill="none"viewbox="0 0 24 24"stroke="currentcolor"stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5"></path></svg></button><divx-show="open === 'item_cacbad78'"x-collapse=""x-cloak=""><divclass="min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-sm text-base-content/70"><pclass="mb-2"> The body is a Blade slot, so any HTML or Blade component can be embedded.
</p><p> A second paragraph. Line breaks and styling are free-form.
</p></div></div></div></div>
FAQ demo — a realistic use case (single-open)
An in-house Blade component library by Yakaze Tech Studio, built on Tailwind v4 + daisyUI v5 + Alpine.js. It aims to keep UI consistency across projects.
Run composer require sparrowhawk-labs/pinion-ui, then php artisan ui:install to wire up the required resources.
Yes. pinion-ui uses daisyUI classes internally, so it shares the same theme variables. You can freely mix <x-...> with regular daisyUI markup.
Define your theme with daisyUI v5's @plugin "daisyui/theme" directive. Every pinion-ui class goes through theme variables, so changing the theme is enough to update the colors.
FAQ (multiple-open) — for comparing items side by side
A Blade component library built on Tailwind v4 + daisyUI v5 + Alpine.js.
composer require → php artisan ui:install.
Light only (pinion) since v0.4.0. If you need dark, specify daisyUI's standard dark / dim / night on <html data-theme>.
data-theme = pinion-dark
Accordion
Disclosure list. Changed to nested syntax in v0.4.0 (naturally pass Blade slots without XSS). Nest <x-accordion-item title="...">content</x-accordion-item> inside <x-accordion>. Single-open or multiple-open, 3 sizes. Content is a Blade slot, so any Blade markup, components, or links work. Alpine x-collapse animates smoothly.
Rich content — since it is a Blade slot, any markup / component / link / list / multiple paragraphs work naturally
CopyCopied
Content containing a link to an external resource. See the official docs.
Bullet 1
Bullet 2
Bullet 3
The body is a Blade slot, so any HTML or Blade component can be embedded.
A second paragraph. Line breaks and styling are free-form.
<x-accordion><x-accordion-itemtitle="With a link"><p>Content containing a link to an external resource. See the <ahref="#"class="text-primary underline underline-offset-2 hover:opacity-80">official docs</a>.</p></x-accordion-item><x-accordion-itemtitle="With a list"><ulclass="list-disc list-inside space-y-1"><li>Bullet 1</li><li>Bullet 2</li><li>Bullet 3</li></ul></x-accordion-item><x-accordion-itemtitle="Multiple paragraphs"><pclass="mb-2">The body is a Blade slot, so any HTML or Blade component can be embedded.</p><p>A second paragraph. Line breaks and styling are free-form.</p></x-accordion-item></x-accordion>
<divx-data="{ open: null }"class="w-full divide-y divide-base-300 radius-box tune-border border-base-300 overflow-hidden"><div><buttontype="button"class="w-full flex items-center justify-between min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-0 font-medium text-base-content hover:bg-base-200/50 transition-colors cursor-pointer"x-on:click="open = (open === 'item_e55fc371') ? null : 'item_e55fc371'"x-bind:aria-expanded="open === 'item_e55fc371'"><span>With a link</span><svgclass="w-4 h-4 shrink-0 transition-transform duration-200"x-bind:class="open === 'item_e55fc371' && 'rotate-180'"fill="none"viewbox="0 0 24 24"stroke="currentcolor"stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5"></path></svg></button><divx-show="open === 'item_e55fc371'"x-collapse=""x-cloak=""><divclass="min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-sm text-base-content/70"><p> Content containing a link to an external resource. See the <ahref="#"class="text-primary underline underline-offset-2 hover:opacity-80">official docs</a>.
</p></div></div></div><div><buttontype="button"class="w-full flex items-center justify-between min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-0 font-medium text-base-content hover:bg-base-200/50 transition-colors cursor-pointer"x-on:click="open = (open === 'item_bdd74600') ? null : 'item_bdd74600'"x-bind:aria-expanded="open === 'item_bdd74600'"><span>With a list</span><svgclass="w-4 h-4 shrink-0 transition-transform duration-200"x-bind:class="open === 'item_bdd74600' && 'rotate-180'"fill="none"viewbox="0 0 24 24"stroke="currentcolor"stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5"></path></svg></button><divx-show="open === 'item_bdd74600'"x-collapse=""x-cloak=""><divclass="min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-sm text-base-content/70"><ulclass="list-disc list-inside space-y-1"><li>Bullet 1
</li><li>Bullet 2
</li><li>Bullet 3
</li></ul></div></div></div><div><buttontype="button"class="w-full flex items-center justify-between min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-0 font-medium text-base-content hover:bg-base-200/50 transition-colors cursor-pointer"x-on:click="open = (open === 'item_cacbad78') ? null : 'item_cacbad78'"x-bind:aria-expanded="open === 'item_cacbad78'"><span>Multiple paragraphs</span><svgclass="w-4 h-4 shrink-0 transition-transform duration-200"x-bind:class="open === 'item_cacbad78' && 'rotate-180'"fill="none"viewbox="0 0 24 24"stroke="currentcolor"stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5"></path></svg></button><divx-show="open === 'item_cacbad78'"x-collapse=""x-cloak=""><divclass="min-h-[var(--h-field-md)] px-[var(--px-field-md)] text-[length:var(--text-field-md)] py-sm text-base-content/70"><pclass="mb-2"> The body is a Blade slot, so any HTML or Blade component can be embedded.
</p><p> A second paragraph. Line breaks and styling are free-form.
</p></div></div></div></div>
FAQ demo — a realistic use case (single-open)
An in-house Blade component library by Yakaze Tech Studio, built on Tailwind v4 + daisyUI v5 + Alpine.js. It aims to keep UI consistency across projects.
Run composer require sparrowhawk-labs/pinion-ui, then php artisan ui:install to wire up the required resources.
Yes. pinion-ui uses daisyUI classes internally, so it shares the same theme variables. You can freely mix <x-...> with regular daisyUI markup.
Define your theme with daisyUI v5's @plugin "daisyui/theme" directive. Every pinion-ui class goes through theme variables, so changing the theme is enough to update the colors.