Collection of reusable views for elm-ui.
Go to file
2021-02-02 22:22:10 +01:00
.github Update pull_request_template.md 2020-08-12 06:53:02 +02:00
docs Added Sheet and more 2021-02-02 22:22:10 +01:00
example Added Sheet and more 2021-02-02 22:22:10 +01:00
src Added Sheet and more 2021-02-02 22:22:10 +01:00
tests Added Sheet and more 2021-02-02 22:22:10 +01:00
.gitignore Hello World 2020-03-15 19:13:12 +01:00
build.sh Added Tests 2021-01-26 22:12:35 +01:00
docs.json Added Sheet and more 2021-02-02 22:22:10 +01:00
elm-analyse.json Moved Widget.Style into Widget 2021-01-24 09:41:55 +01:00
elm.json Added Sheet and more 2021-02-02 22:22:10 +01:00
LICENSE Hello World 2020-03-15 19:13:12 +01:00
README.md Added Sheet and more 2021-02-02 22:22:10 +01:00

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.

Feel free to start an issue on the repository if you have any questions.

Example using the Material Design style

Summary

  • Each widget comes with a Widget Type and a Style Type. The Widget Type is an abstract representation of the widget and the Style Type has all styling attributes.
  • Widget Types can be used as building Blocks for more complicated Widgets (Button -> Select Buttons -> Menu -> Layout)

Example

Let's look at 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. Furthermore, the Style type mirrors the implementation. element corresponds to Element.element, elementRow corresponds to Element.row and so on.

type alias ButtonStyle msg =
    { element : 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
              }
          }
      }
    }

** Style Implementation **

For actually displaying the button we have a few different implementations:

{-| Button with only an icon and no text -}
iconButton :
    ButtonStyle msg
    ->
        { text : String --for screen readers
        , icon : Icon
        , onPress : Maybe msg
        }
    -> Element msg

{-| Button with a text but no icon -}
textButton :
    ButtonStyle msg
    ->
        { textButton
            | text : String
            , onPress : Maybe msg
        }
    -> Element msg

{-| Button with both icon and text -}
button :
    ButtonStyle msg
    ->
        { text : String
        , icon : Icon
        , onPress : Maybe msg
        }
    -> Element msg

** 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 could be 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:

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 to Html is easy, the opposite is not always possible (as a lot of styling in Elm-Ui would not be adapted to the Html 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.