.github | ||
docs | ||
explorer | ||
src | ||
tests | ||
.gitignore | ||
build.sh | ||
docs.json | ||
elm-analyse.json | ||
elm.json | ||
LICENSE | ||
README.md |
Elm-Ui-Widgets
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.
Table of Contents
Example
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.
Style Type
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
]
}
Styles
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.
Reusable Views vs. Components
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.
Alternatives
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
Motivation
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.
Changelog
- 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.