subbu
Achieving tailwind enter/leave transitions with LiveView.JS
Tailwind has nice transitions for components like slid-overs, dropdowns, and modals. For example, these are the transitions classes for a slideover:
Slide-over panel, show/hide based on slide-over state.
Entering: "transform transition ease-in-out duration-500 sm:duration-700"
From: "translate-x-full"
To: "translate-x-0"
Leaving: "transform transition ease-in-out duration-500 sm:duration-700"
From: "translate-x-0"
To: "translate-x-full"
These are easy to get right with Alpine.js using x-transitions, but is there a way to do them using LiveView.JS? Has anybody tried?
Marked As Solved
cvkmohan
You would find an example here - live_beats/live_helpers.ex at master · fly-apps/live_beats (github.com)
You can find a practical demonstration at Client-Side Tabs in LiveView with JS Commands · Fly
Also Liked
christopherslee
I think the answer here is that you can apply multiple classes in the 3-tuple separated by spaces. I guessed at this by looking at the linked source code, and then saw that it uses a function transition_class_names which calls class_names which uses String.split(" "") (source)
For example something specified as:
Entering: "transition ease-out duration-100"
From: "transform opacity-0 scale-95"
To: "transform opacity-100 scale-100"
Leaving: "transition ease-in duration-75"
From: "transform opacity-100 scale-100"
To: "transform opacity-0 scale-95"
can be implemented as:
def show_user_menu(js \\ %JS{}) do
js
|> JS.toggle(
to: "#user_menu",
in:
{"transition ease-out duration-100", "transform opacity-0 scale-95",
"transform opacity-100 scale-100"},
out:
{"transition ease-in duration-75", "transform opacity-100 scale-100",
"transform opacity-0 scale-95"}
)
end
cmo
Or the docs
paulstatezny
@tcoopman Thanks for chiming in!
I was mostly having trouble with entrance transitions. (Elements not previously shown.) I had to add these to get Tailwind transitions to apply correctly:
style="display: none"class="start-classes"phx-mounted={JS.show(transition: {"transition-classes", "start-classes", "end-classes"}, time: ...)}
So for example, if a TailwindUI component has:
<!--
Entering: "ease-out duration-300"
From: "opacity-0"
To: "opacity-100"
-->
<div>
...
</div>
I had to do:
<div
style="display: none"
class="opacity-0"
phx-mounted={JS.show(
transition: {"ease-out duration-300", "opacity-0", "opacity-100"},
time: 300
)}
>
...
</div>
Without this precise configuration, I wasn’t able to get the transition to display correctly. (Notice I’m using JS.show instead of JS.transition.)
Hopefully someone out there finds this helpful! ![]()
It’s worth noting that Alpine.js makes this much less confusing to get right. You just take the 3 lists of classes from the TailwindUI example HTML and drop them into 3 corresponding attributes.
<div
x-show="open"
x-transition:enter="ease-out duration-300"
x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100"
>
...
</div>
Perhaps LiveView could benefit to evolve more in that direction. ![]()
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









