Phoenix LiveView lets you build real-time, dynamic UIs with minimal JavaScript.
But sometimes you want just a little extra client-side sparkle — toggles, dropdowns, animations — without pulling in a heavy JS framework.
Enter: Tailwind CSS + Alpine.js
Why This Combo Rocks
- Tailwind CSS: Utility-first CSS for fast, beautiful, responsive design — no CSS bloat.
- Alpine.js: Minimal JavaScript framework for declarative interactivity via HTML attributes.
- LiveView: The server-driven powerhouse handling data, validation, and persistence.
Together, they create a modern, maintainable stack that’s both fast and delightful.
Getting Started
1. Tailwind CSS Setup
Use Tailwind with your Phoenix app’s asset pipeline (esbuild, webpack, or mix):
npm install tailwindcss postcss autoprefixer
npx tailwindcss init
Add Tailwind directives in your CSS:
@tailwind base;
@tailwind components;
@tailwind utilities;
Use utility classes in your templates:
<div class="flex space-x-4 rounded-lg bg-gray-100 p-4 transition duration-300">
<!-- UI content -->
</div>
2. Alpine.js Integration
Add Alpine via CDN in your app layout or bundle it:
<script src="https://unpkg.com/alpinejs" defer></script>
Use Alpine’s declarative attributes inside your LiveView templates:
<div x-data="{ open: false }" class="relative">
<button @click="open = !open" class="btn">Toggle Menu</button>
<div x-show="open" x-transition class="absolute mt-2 bg-white shadow rounded">
<a href="#" class="block px-4 py-2 hover:bg-gray-200">Item 1</a>
<a href="#" class="block px-4 py-2 hover:bg-gray-200">Item 2</a>
</div>
</div>
Best Practices for Alpine + LiveView
- Use LiveView for business logic, server-side data, forms, validations, persistence.
- Use Alpine.js only for small, self-contained UI behaviors that don’t require server round-trips (e.g., toggles, tabs, animations).
- Trigger LiveView events from Alpine with
phx-hook
or custom event dispatches when you need server interaction.
Example: Alpine controls modal visibility, LiveView processes the confirmed action.
Responsive & Animated UI
Tailwind’s responsive utilities + Alpine toggles make mobile-first UI easy:
<button class="sm:hidden" @click="open = !open">Menu</button>
<nav class="hidden sm:flex">
<!-- Desktop nav -->
</nav>
Alpine’s x-transition
adds smooth animations:
<div x-show="open" x-transition.opacity.duration.300ms>
<!-- Fade-in/out content -->
</div>
No extra CSS or JavaScript needed.
Why This Matters
- Lightweight: No bulky JS frameworks — just what you need.
- Maintainable: Clear separation of concerns between server and client.
- Fast: LiveView handles all data/state; Alpine handles UI polish.
- Scalable: Easy to add features without complexity explosion.
Next Steps
If you want to master this stack and build production‑grade, real‑world apps with Phoenix LiveView, check out my comprehensive PDF guide:
Phoenix LiveView: The Pro's Guide to Scalable Interfaces and UI Patterns
It empowers you to build interfaces users love and teams trust.
Top comments (0)