This package contains independent widgets (no components) written for Elm-Ui. These widgets have no dependencies to other parts of this package. So you can just use as much as you need.
- Examples of all widgets can be found here.
- It has a Material Design Theme ready to use. Additionally, it also supports custom themes.
- It is highly customizable. Checkout Widget.Customize for more information.
Feel free to start an issue on the repository if you have any questions.
Each widget comes with a Widget Type and a Style Type.
- The Widget Type is an abstract representation of the widget. They can be used as building Blocks for more complicated Widgets.
- Style Type has all styling attributes (similar to Element.Attribute).
As example, consider the button widget.
button: ButtonStyle msg
->
{ text : String
, icon : Icon
, onPress : Maybe msg
}
-> Element msg
In comparison to Elm-Ui's button, we see that List (Attribute msg)
has changed into a Style Type. If we look into the Style type, we see that it mirrors the implementation.
type alias ButtonStyle msg =
{ elementButton : List (Attribute msg)
, ifDisabled : List (Attribute msg)
, ifActive : List (Attribute msg)
, otherwise : List (Attribute msg)
, content :
{ elementRow : List (Attribute msg)
, content :
{ text : { contentText : List (Attribute msg) }
, icon : IconStyle
}
}
}
}
So the resulting Elm-Ui code looks like this:
button style { onPress, text, icon } =
Input.button
(style.elementButton
++ (if onPress == Nothing then
style.ifDisabled
else
style.otherwise
)
)
{ onPress = onPress
, label =
Element.row style.content.elementRow
[ icon
(if onPress == Nothing then
style.content.content.icon.ifDisabled
else
style.content.content.icon.otherwise
)
, Element.text text |> Element.el style.content.content.text.contentText
]
}
For actually displaying the button we have a few different implementations:
containedButton : Palette -> ButtonStyle msg
containedButton =
Button.containedButton
outlinedButton : Palette -> ButtonStyle msg
outlinedButton =
Button.outlinedButton
textButton : Palette -> ButtonStyle msg
textButton =
Button.textButton
** Widget Type **
We also have a Widget Type
for the button:
type alias Button msg =
{ text : String
, icon : Icon
, onPress : Maybe msg
}
We can use it to build more complex widgets, for example a select button:
type alias Select msg =
{ selected : Maybe Int
, options :
List
{ text : String
, icon : Icon
}
, onSelect : Int -> Maybe msg
}
select :
Select msg
-> List ( Bool, Button msg )
selectButton :
ButtonStyle msg
-> ( Bool, Button msg )
-> Element msg
Checkout the examples in Widget for more details.
In Elm we like to use reusable views instead of components. At first this packages had a few components, but they where more complicated in comparison. They got slowly turned into reusable views one by one. Most have been reduced even further into view functions: Reusable views without a model. All function in Widget are view functions.
For comparison, here are some alternative packages for creating UIs:
- Using Elm-Ui
- lucamug/style-framework - Full customization requires the cloning of the package.
- jxxcarlson/elm-widget - Uses a Builder pattern. Has some redefined customizations.
- QiTASC/hatchinq - Similar Arroach but still in experimental phase
- Using Elm/Html
- nathanjohnson320/elm-ui-components - Uses the elm/html way of styling.
- NoRedInk/noredink-ui - Similar Approach but no customization options.
- peterszerzo/elm-natural-ui - Uses custom Attributes with some customization.
- Ui Frameworks
- aforemny/material-components-web-elm - Wrapper of Material design using custom elements.
- afidegnum/elm-tailwind - Wrapper of Tailwind by including the tailwind stylesheet.
- surprisetalk/elm-bulma - Wrapper for Bulma by including the bulma stylesheet.
- rundis/elm-bootstrap - Wrapper for Bootstrap by including the bootstrap stylesheet.
- supermacro/elm-antd - Implementation of Ant Design in Elm
After looking at the current packages that implement various reusable views (and components) I noticed two things:
- There are (nearly) no widgets for Elm-Ui, and that's a problem because while going from
Element
toHtml
is easy, the opposite is not always possible (as a lot of styling in Elm-Ui would not be adapted to theHtml
element.) - There is no collection of widgets, all in one place. A lot of components get reimplemented over and over again. It's hard to keep track of what package is currently the best.
This package tries to solve both of these problems.
- Version 3.0.0 - Reworked Style Types making it easier to customize. Added full icon support.
- Version 2.0.0 - Complete rewrite of the package. Now including a material design implementation.