Building Progressively Enhanced Forms Using htmx
72 points by mpweiher 2 weeks ago | 11 comments
arthurcolle 11 hours ago
Video doesn't seem to be rendering, has 0:00 and 0:00 as start and end times
replyQuantumNomad_ 10 hours ago
Video codec is avc1. I think in Safari on iOS this codec is not available on iPhones older than iPhone 15 Pro.
reply
This is almost always because of using a string-based templating system. If you use a language-embedded HTML generation library, it represents HTML fragments as first-class values in your language, and you can compose them together in flexible ways. This makes out-of-band swaps very simple.
FWIW I have a potential solution: to show live data in my app I use an SSE stream of OOB swaps. On every relevant change to the database I regenerate the HTML and compare it to the previously generated html to create OOB swaps (including hx-preserve). I send that down so the browser can update.
The same approach could be used for normal POSTs. On a POST generate the HTML before and after modifying the database and diff them to generate OOB swaps.
Given how much you’ve already developed it would take you no time to pick it up but of course it’s nice to control your own destiny with your own code.
There’s one additional thing you get with Datastar and that’s a very easy Signals implementation on the browser side. For lightweight interactivity you don’t need a server trip. And when you do POST something to the server the values of the signals are automatically included so your backend code knows the front end UI state (and can modify it).
You might be interested in Datastar [1], which is like htmx but centered around Server-Sent Events. You don't have to do diffing yourself in application code because it's already handled by the framework under the hood through the "idiomorph" DOM morphing algorithm.
[1] https://data-star.dev/
There are many ways to skin the cat.
For some reason they are still popular.
A fun experiment is to use a JS runtime with React but render the component tree on the server onto a Writeable stream.
Very easy to understand, no useEffect footguns, great composability.