brainlid

brainlid

Elixir Blog Post: Plucking the "A" from PETAL

This post asks if we can remove Alpine from the PETAL stack. Can we do everything we need with just LiveView? Also, let’s explore an area where LiveView can still improve.

Most Liked

Sebb

Sebb

Arrr good stuff. Only a deleted line of JS-code is a good line of JS-code.

11
Post #2
mgibowski

mgibowski

Furthermore, once Phoenix v1.8 arrives and starts using TailwindCSS by default, I don’t think calling this stack anything more than just LiveView is very useful…

The acronym PETAL played it’s role before, when we had to compose our own stack on top of LiveView.

Now, as LiveView comes with all the necessary elements built-in (JS commands, TailwindCSS set up by default), I think the PETAL acronym can be retired and we don’t need any replacement for it.

trisolaran

trisolaran

Same here. I never understood the appeal of AlpineJS for a LiveView project. When I started using LiveView (long before LiveView.JS) I decided to use JS hooks to keep things simple, cause I didn’t want to add a JS framework. Later on, because everyone was talking about Alpine, I gave it a try out of curiosity. I tried to replace my hooks with AlpineJS. I really had a hard time trying to make it all work, and I came to the conclusion that LV hooks are more flexible and better suited than Alpine for a LiveView project, also because they can hook into LV life-cycle events directly. So I stripped the “A” from PETAL a long time ago. Even more so now that we have LiveView.JS. I suspect Alpine is something so many people were using mainly because so many people were using it.

f0rest8

f0rest8

This is great and I’ve been thinking about this a lot and recently refactored a lot of the Alpine in Metamorphic (including creating the glide photo effect with JS commands).

Though there’s still a few things that I’m not sure would be as easy to do with JS commands, like counting the number of characters in a form as you type. AFAIK that’s still easier/better experience with Alpine but it’s definitely getting closer!

tj0

tj0

I tried Alpine I think last year for a few weeks and ripped it out. Tabs can be done via CS and everything is pretty much instantaneous. No JS of any kind is required.

In production, I’m using nested css elements handled by radio buttons.
css

#radio-page-1 { display: none }
#radio-page-2 { display: none }
#radio-page-3 { display: none }
#radio-page-4 { display: none }
#radio-page-5 { display: none }
#radio-page-1:checked ~ &--wrapper >  #display_control > #page-button-1 {border: red 0.2px solid; color: red;}
#radio-page-1:checked ~ &--wrapper > #display_control > #page-button-1:hover {color: white;}
#radio-page-1:checked ~ &--wrapper > &--subgrid1 {display: grid;}
#radio-page-1:checked ~ &--wrapper > &--subgrid2 {display: none;}

html

<input type="radio" phx-update="ignore" name="radio-page-group" id="radio-page-1" checked value="1">
<input type="radio" phx-update="ignore" name="radio-page-group" id="radio-page-2" value="2">
<input type="radio" phx-update="ignore" name="radio-page-group" id="radio-page-3" value="3">
<input type="radio" phx-update="ignore" name="radio-page-group" id="radio-page-4" value="4">
<input type="radio" phx-update="ignore" name="radio-page-group" id="radio-page-5" value="5">
<div id="main--wrapper" class="main-wrapper">
  <div class="main-subgrid1"></div>
  <div class="main-subgrid2"></div>
</div>

Here is another example done using z-index instead:

Modals can also be done via css, but I think Phoenix.JS is a bit cleaner.
https://sheer.tj/phoenix_live_view_modals.html

Where Next?

Popular in Blog Posts Top

lawik
We all have varying degrees of exposure to Big Tech. Some of it seems fine, stable and can be relied on. Some of it feels like shifting s...
New
brainlid
In a 2 day spike, I created my own Elixir-based AI Personal Fitness Trainer! The surprising part for me was how useful and helpful I foun...
New
New
jordiee
https://medium.com/@jpiepkow/team-based-login-with-accesspass-be236d4bd7dd
New
brainlid
Phoenix LiveView v0.20.4 offers a hidden gem with its handy little JS.toggle_class/1 feature. This addition simplifies toggling classes f...
New
New
rms.mrcs
Hi, everyone! In this article I describe how I created a simple metrics engine that can list to Hackney metric updates and send this data...
New
paulanthonywilson
Whatever your Nerves project does, there’s a good chance that it can be enhanced by securely connecting to a Phoenix Server in the cloud;...
New
brainlid
OTP 26 was released and the Elixir 1.14.4 builds have been updated! Erlang OTP 26 changed how map keys are sorted, or not sorted actually...
New
mssantosdev
Our take on how to build a frontend style guide with Phoenix Components, Atomic Design and plain CSS, with focus on reusability and code ...
New

Other popular topics Top

sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
977 41022 311
New
dotdotdotPaul
Okay, I'm having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I'm sure I'...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
ycv005
I have followed this StackOverflow post to install the specific version of Erlang. And When I am running mix ecto.setup then getting fol...
New
chrismccord
This release brings a number of exciting features, including integration with the new Phoenix LiveDashboard and Phoenix LiveView. There h...
New
mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
danschultzer
None of the current solutions worked well for me, so I went ahead and built a user management system from scratch. This project took far...
548 27727 240
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New

We're in Beta

About us Mission Statement