Quoted from htmx.org:
htmx gives you access to AJAX, CSS Transitions, WebSockets and Server Sent Events directly in HTML, using attributes, so you can build modern user interfaces with the simplicity and power of hypertext
The idea behind htmx is to allow adding attributes to any HTML element that cause an HTTP request. The HTTP response is typically a (short) HTML fragment that extends or replaces an element on the page. This allows us to program a most functionality interactive seen in modern web applications using the powerful SWI-Prolog HTML generation framework rather than having to write a JSON backend and accompagnying JavaScript frontend that runs in the browser.
Below is a minimal, yet fully functional application
:- use_module(library(http/http_server)). :- use_module(library(http/htmx)). :- use_module(library(main)). :- initialization(main, main). main(_Argv) :- http_server([port(8080)]), thread_get_message(quit). http:location(htmx, root(htmx), []). :- http_handler(root(.), home, []). home(_Request) :- reply_html_page( [ title('HTMX demo'), script(src('https://unpkg.com/htmx.org'), []) ], [ button([ 'hx-post'('/htmx/clicked'), 'hx-swap'('outerHTML') ], 'Click me') ]). :- http_handler(htmx(clicked), reply_htmx(\clicked), []). clicked --> html('Thanks for clicking me!').
HTMX requires no dedicated support from the server. This library provides reply_htmx/1,2 to reply with a single HTML element rather than an entire page. Future versions of this library may provide some additional utility predicates.