abitdodgy

abitdodgy

Hi everyone,

One of the issues I’ve consistently come across is writing consistent HTML components. I got the idea to write a component generation library with the premise of allowing you to build reusable components and help standardise your components across different projects or parts of the same project.

For example:

defcomp :alert, type: {:content_tag, :div}, variants: [:primary, :success], class: "alert"

Would generate the following functions for you (including block syntax):

      alert "Alert!"
      #=> <div class="alert">Alert!</div>      

      alert :primary, "Alert!"
      #=> <div class="alert alert-primary">Alert!</div>

      alert :success, "Alert!"
      #=> <div class="alert alert-success">Alert!</div>

      alert :success, "Alert!", class: "extra"
      #=> <div class="alert alert-success extra">Alert!</div>

Although the component in this example happens to be Bootstrap, the library doesn’t really care. But it does make building your own library of components easy. For example, it’s possible to build a good portion of Bootstrap’s components using the current version. You can also use it to generate components for most HTML templates.

There are other features like delegating rendering to other libraries (useful for Phoenix.HTML.Link), composable components with :parent, :append, and :prepend options, as well as a few other goodies.

    defcomp :close_button, type: {:content_tag, :button}, class: "close", data: [dismiss: "alert"], aria: [label: "Close"]
    defcomp :alert, type: {:content_tag, :div}, class: "alert", prepend: {&close_button/2, "&nbsp;"}, variants: [:primary]

    alert :primary do
      "Content"
    end
    #=> <div class="alert alert-primary">
    #    <button aria-label=\"Close\" class=\"close\" data-dismiss=\"alert\">
    #      <span>&times;</span>
    #    </button>
    #    Content
    #   </div>

There is some documentation and decent test coverage.

Before I release it, any feedback or critique as far as approach or usefulness is greatly appreciated.

Where Next? Top

Trending in Discussions Top

cblavier
Hey there, It’s been more than a year since we started using LiveView as our main UI library and building a whole library of UI componen...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
axelson
Hi there! :wave: @frigidcode and I (but mostly him) have been running an Elixir Book club, we’re almost done with Designing Elixir Syste...
New
achempion
I’ve been using Emacs as my main code editor for more than a two years. It’s a custom build version although I’ve tried doom emacs and sp...
New
budgie
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with. But I don’t use it anymore. Serverless was the promis...
New
jtormey
Lately I’ve been thinking about how to organize components as a LiveView application grows. One of the pain points I’ve found (for myself...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
webofbits
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself. My main conc...
#ai
New
georgeguimaraes
Just published claude-code-elixir, a plugin marketplace for Claude Code with Elixir support. These are the plugins I’ve been using for my...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews