abitdodgy

abitdodgy

A library to build generic HTML components

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?

Popular in Discussions Top

ricklove
I was just introduced to Elixir and Phoenix. I was told about the 2 million websocket test that was done 2 years ago. From my research, t...
New
MarioFlach
Hello, I want to share a project I’ve been working on for a while: https://github.com/almightycouch/gitgud Background Some time ago I ...
New
jer
I’ve been using umbrellas for a while, and generally started off (on greenfield projects at least) by isolating subapps based on clearly ...
New
wmnnd
The Go vs Elixir thread got me thinking: Would it be too hard to implement a simple mechanism for creating Go-style static app binaries f...
New
mikl
I wanted to capitalize a string, and tried using String.capitalize(). That generally works well, until you try to capitalize a word like...
New
marciol
Please, let me know if this kind of discussion already took place in another topic . Hi all, how do you consider if is better to build ...
New
mmmrrr
Just saw that dhh announced https://hotwire.dev/ Is it just me or is this essentially live view? :smiley: Although I like the “iFrame-e...
New

Other popular topics Top

Qqwy
Update: How to use the Blogs &amp; Podcasts section You can post links to your blog posts or podcasts either in one of the Official Blog...
3271 131117 1222
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 54260 488
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
TunkShif
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
274 42716 114
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New

We're in Beta

About us Mission Statement