mirror of
https://github.com/correl/elm-mdl.git
synced 2024-12-18 03:00:11 +00:00
Separate examples folder
This commit is contained in:
parent
100683cd09
commit
ed12ecf8e8
4 changed files with 414 additions and 0 deletions
182
examples/Demo.elm
Normal file
182
examples/Demo.elm
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
import StartApp
|
||||||
|
import Html exposing (..)
|
||||||
|
import Html.Attributes exposing (href, class, style)
|
||||||
|
import Signal exposing (Signal)
|
||||||
|
import Effects exposing (..)
|
||||||
|
import Task
|
||||||
|
import Signal
|
||||||
|
import Task exposing (Task)
|
||||||
|
import Array exposing (Array)
|
||||||
|
|
||||||
|
import Material.Layout as Layout exposing (defaultLayoutModel)
|
||||||
|
import Material
|
||||||
|
|
||||||
|
import Demo.Buttons
|
||||||
|
import Demo.Grid
|
||||||
|
import Demo.Textfields
|
||||||
|
|
||||||
|
|
||||||
|
-- MODEL
|
||||||
|
|
||||||
|
|
||||||
|
type alias Model =
|
||||||
|
{ layout : Layout.Model
|
||||||
|
, buttons : Demo.Buttons.Model
|
||||||
|
, textfields : Demo.Textfields.Model
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
layoutModel : Layout.Model
|
||||||
|
layoutModel =
|
||||||
|
{ defaultLayoutModel
|
||||||
|
| state = Layout.initState (List.length tabs)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
model : Model
|
||||||
|
model =
|
||||||
|
{ layout = layoutModel
|
||||||
|
, buttons = Demo.Buttons.model
|
||||||
|
, textfields = Demo.Textfields.model
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-- ACTION, UPDATE
|
||||||
|
|
||||||
|
|
||||||
|
type Action
|
||||||
|
= LayoutAction Layout.Action
|
||||||
|
| ButtonsAction Demo.Buttons.Action
|
||||||
|
| TextfieldAction Demo.Textfields.Action
|
||||||
|
|
||||||
|
|
||||||
|
update : Action -> Model -> (Model, Effects.Effects Action)
|
||||||
|
update action model =
|
||||||
|
case action of
|
||||||
|
LayoutAction a ->
|
||||||
|
let
|
||||||
|
(l, e) = Layout.update a model.layout
|
||||||
|
in
|
||||||
|
({ model | layout = l }, Effects.map LayoutAction e)
|
||||||
|
|
||||||
|
ButtonsAction a ->
|
||||||
|
let
|
||||||
|
(b, e) = Demo.Buttons.update a model.buttons
|
||||||
|
in
|
||||||
|
({ model | buttons = b }, Effects.map ButtonsAction e)
|
||||||
|
|
||||||
|
TextfieldAction a ->
|
||||||
|
({ model | textfields = Demo.Textfields.update a model.textfields }
|
||||||
|
, Effects.none
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
-- VIEW
|
||||||
|
|
||||||
|
|
||||||
|
type alias Addr = Signal.Address Action
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
drawer : List Html
|
||||||
|
drawer =
|
||||||
|
[ Layout.title "Example drawer"
|
||||||
|
, Layout.navigation
|
||||||
|
[ Layout.link
|
||||||
|
[href "https://groups.google.com/forum/#!forum/elm-discuss"]
|
||||||
|
[text "Elm Discuss"]
|
||||||
|
, Layout.link
|
||||||
|
[href "http://elm-lang.org"]
|
||||||
|
[text "Elm"]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
header : List Html
|
||||||
|
header =
|
||||||
|
[ Layout.title "elm-mdl"
|
||||||
|
, Layout.spacer
|
||||||
|
, Layout.navigation
|
||||||
|
[ Layout.link
|
||||||
|
[ href "https://www.getmdl.io/components/index.html" ]
|
||||||
|
[ text "MDL" ]
|
||||||
|
, Layout.link
|
||||||
|
[ href "https://www.google.com/design/spec/material-design/introduction.html"]
|
||||||
|
[ text "Material Design"]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
tabs : List (String, Addr -> Model -> List Html)
|
||||||
|
tabs =
|
||||||
|
[ ("Buttons", \addr model ->
|
||||||
|
[Demo.Buttons.view (Signal.forwardTo addr ButtonsAction) model.buttons])
|
||||||
|
, ("Textfields", \addr model ->
|
||||||
|
[Demo.Textfields.view (Signal.forwardTo addr TextfieldAction) model.textfields])
|
||||||
|
, ("Grid", \addr model -> Demo.Grid.view)
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
tabViews : Array (Addr -> Model -> List Html)
|
||||||
|
tabViews = List.map snd tabs |> Array.fromList
|
||||||
|
|
||||||
|
|
||||||
|
tabTitles : List Html
|
||||||
|
tabTitles = List.map (fst >> text) tabs
|
||||||
|
|
||||||
|
|
||||||
|
view : Signal.Address Action -> Model -> Html
|
||||||
|
view addr model =
|
||||||
|
let top =
|
||||||
|
div
|
||||||
|
[ style
|
||||||
|
[ ("margin", "auto")
|
||||||
|
, ("width", "90%")
|
||||||
|
]
|
||||||
|
]
|
||||||
|
((Array.get model.layout.selectedTab tabViews
|
||||||
|
|> Maybe.withDefault (\addr model ->
|
||||||
|
[div [] [text "This can't happen."]]
|
||||||
|
)
|
||||||
|
) addr model)
|
||||||
|
|
||||||
|
in
|
||||||
|
Layout.view (Signal.forwardTo addr LayoutAction) model.layout
|
||||||
|
{ header = Just header
|
||||||
|
, drawer = Just drawer
|
||||||
|
, tabs = Just tabTitles
|
||||||
|
, main = [ top ]
|
||||||
|
}
|
||||||
|
|> Material.topWithColors Material.Teal Material.Red
|
||||||
|
|
||||||
|
|
||||||
|
init : (Model, Effects.Effects Action)
|
||||||
|
init = (model, Effects.none)
|
||||||
|
|
||||||
|
|
||||||
|
inputs : List (Signal.Signal Action)
|
||||||
|
inputs =
|
||||||
|
[ Layout.setupSizeChangeSignal LayoutAction
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
app : StartApp.App Model
|
||||||
|
app =
|
||||||
|
StartApp.start
|
||||||
|
{ init = init
|
||||||
|
, view = view
|
||||||
|
, update = update
|
||||||
|
, inputs = inputs
|
||||||
|
}
|
||||||
|
|
||||||
|
main : Signal Html
|
||||||
|
main =
|
||||||
|
app.html
|
||||||
|
|
||||||
|
|
||||||
|
-- PORTS
|
||||||
|
|
||||||
|
|
||||||
|
port tasks : Signal (Task.Task Never ())
|
||||||
|
port tasks =
|
||||||
|
app.tasks
|
144
examples/Demo/Buttons.elm
Normal file
144
examples/Demo/Buttons.elm
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
module Demo.Buttons where
|
||||||
|
|
||||||
|
import Dict
|
||||||
|
import Html exposing (..)
|
||||||
|
import Html.Attributes exposing (..)
|
||||||
|
import Effects
|
||||||
|
|
||||||
|
import Material.Button as Button exposing (..)
|
||||||
|
import Material.Grid as Grid
|
||||||
|
import Material.Icon as Icon
|
||||||
|
|
||||||
|
|
||||||
|
-- MODEL
|
||||||
|
|
||||||
|
|
||||||
|
type alias Index = (Int, Int)
|
||||||
|
|
||||||
|
|
||||||
|
tabulate' : Int -> List a -> List (Int, a)
|
||||||
|
tabulate' i ys =
|
||||||
|
case ys of
|
||||||
|
[] -> []
|
||||||
|
y :: ys -> (i, y) :: tabulate' (i+1) ys
|
||||||
|
|
||||||
|
|
||||||
|
tabulate : List a -> List (Int, a)
|
||||||
|
tabulate = tabulate' 0
|
||||||
|
|
||||||
|
|
||||||
|
type alias View =
|
||||||
|
Signal.Address Button.Action -> Button.Model -> Coloring -> List Html -> Html
|
||||||
|
|
||||||
|
type alias View' =
|
||||||
|
Signal.Address Button.Action -> Button.Model -> Html
|
||||||
|
|
||||||
|
|
||||||
|
view' : View -> Coloring -> Html -> Signal.Address Button.Action -> Button.Model -> Html
|
||||||
|
view' view coloring elem addr model =
|
||||||
|
view addr model coloring [elem]
|
||||||
|
|
||||||
|
|
||||||
|
describe : String -> Bool -> Coloring -> String
|
||||||
|
describe kind ripple coloring =
|
||||||
|
let
|
||||||
|
c =
|
||||||
|
case coloring of
|
||||||
|
Plain -> "plain"
|
||||||
|
Colored -> "colored"
|
||||||
|
Primary -> "primary"
|
||||||
|
Accent -> "accent"
|
||||||
|
in
|
||||||
|
kind ++ ", " ++ c ++ if ripple then " w/ripple" else ""
|
||||||
|
|
||||||
|
|
||||||
|
row : (String, Html, View) -> Bool -> List (Int, (Bool, String, View'))
|
||||||
|
row (kind, elem, v) ripple =
|
||||||
|
[ Plain, Colored, Primary, Accent ]
|
||||||
|
|> List.map (\c -> (ripple, describe kind ripple c, view' v c elem))
|
||||||
|
|> tabulate
|
||||||
|
|
||||||
|
|
||||||
|
buttons : List (List (Index, (Bool, String, View')))
|
||||||
|
buttons =
|
||||||
|
[ ("flat", text "Flat Button", Button.flat)
|
||||||
|
, ("raised", text "Raised Button", Button.raised)
|
||||||
|
, ("FAB", Icon.i "add", Button.fab)
|
||||||
|
, ("mini-FAB", Icon.i "zoom_in", Button.minifab)
|
||||||
|
, ("icon", Icon.i "flight_land", Button.icon)
|
||||||
|
]
|
||||||
|
|> List.concatMap (\a -> [row a False, row a True])
|
||||||
|
|> tabulate
|
||||||
|
|> List.map (\(i, row) -> List.map (\(j, x) -> ((i,j), x)) row)
|
||||||
|
|
||||||
|
|
||||||
|
model : Model
|
||||||
|
model =
|
||||||
|
{ clicked = ""
|
||||||
|
, buttons =
|
||||||
|
buttons
|
||||||
|
|> List.concatMap (List.map <| \(idx, (ripple, _, _)) -> (idx, Button.model ripple))
|
||||||
|
|> Dict.fromList
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-- ACTION, UPDATE
|
||||||
|
|
||||||
|
|
||||||
|
type Action = Action Index Button.Action
|
||||||
|
|
||||||
|
|
||||||
|
type alias Model =
|
||||||
|
{ clicked : String
|
||||||
|
, buttons : Dict.Dict Index Button.Model
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
update : Action -> Model -> (Model, Effects.Effects Action)
|
||||||
|
update (Action idx action) model =
|
||||||
|
Dict.get idx model.buttons
|
||||||
|
|> Maybe.map (\m0 ->
|
||||||
|
let
|
||||||
|
(m1, e) = Button.update action m0
|
||||||
|
in
|
||||||
|
({ model | buttons = Dict.insert idx m1 model.buttons }, Effects.map (Action idx) e)
|
||||||
|
)
|
||||||
|
|> Maybe.withDefault (model, Effects.none)
|
||||||
|
|
||||||
|
|
||||||
|
-- VIEW
|
||||||
|
|
||||||
|
|
||||||
|
view : Signal.Address Action -> Model -> Html
|
||||||
|
view addr model =
|
||||||
|
buttons |> List.concatMap (\row ->
|
||||||
|
row |> List.concatMap (\(idx, (ripple, description, view)) ->
|
||||||
|
let model' =
|
||||||
|
Dict.get idx model.buttons |> Maybe.withDefault (Button.model False)
|
||||||
|
in
|
||||||
|
[ Grid.cell
|
||||||
|
[ Grid.size Grid.All 3]
|
||||||
|
[ div
|
||||||
|
[ style
|
||||||
|
[ ("text-align", "center")
|
||||||
|
, ("margin-top", "1em")
|
||||||
|
, ("margin-bottom", "1em")
|
||||||
|
]
|
||||||
|
]
|
||||||
|
[ view
|
||||||
|
(Signal.forwardTo addr (Action idx))
|
||||||
|
model'
|
||||||
|
, div
|
||||||
|
[ style
|
||||||
|
[ ("font-size", "9pt")
|
||||||
|
, ("margin-top", "1em")
|
||||||
|
]
|
||||||
|
]
|
||||||
|
[ text description
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|> Grid.grid
|
36
examples/Demo/Grid.elm
Normal file
36
examples/Demo/Grid.elm
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
module Demo.Grid where
|
||||||
|
|
||||||
|
import Material.Grid exposing (..)
|
||||||
|
import Html exposing (..)
|
||||||
|
|
||||||
|
|
||||||
|
view : List Html
|
||||||
|
view =
|
||||||
|
[ [1..12]
|
||||||
|
|> List.map (\i -> cell [size All 1] [text "1"])
|
||||||
|
|> grid
|
||||||
|
, [1 .. 3]
|
||||||
|
|> List.map (\i -> cell [size All 4] [text <| "4"])
|
||||||
|
|> grid
|
||||||
|
, [ cell [size All 6] [text "6"]
|
||||||
|
, cell [size All 4] [text "4"]
|
||||||
|
, cell [size All 2] [text "2"]
|
||||||
|
] |> grid
|
||||||
|
, [ cell [size All 6, size Tablet 8] [text "6 (8 tablet)"]
|
||||||
|
, cell [size All 4, size Tablet 6] [text "4 (6 tablet)"]
|
||||||
|
, cell [size All 2, size Phone 4] [text "2 (4 phone)"]
|
||||||
|
] |> grid
|
||||||
|
, Html.node "style" [] [text """
|
||||||
|
.mdl-cell {
|
||||||
|
text-sizing: border-box;
|
||||||
|
background-color: #BDBDBD;
|
||||||
|
height: 200px;
|
||||||
|
padding-left: 8px;
|
||||||
|
padding-top: 4px;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
.mdl-grid:first-of-type .mdl-cell {
|
||||||
|
height: 50px;
|
||||||
|
}
|
||||||
|
"""]
|
||||||
|
]
|
52
examples/Demo/Textfields.elm
Normal file
52
examples/Demo/Textfields.elm
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
module Demo.Textfields where
|
||||||
|
|
||||||
|
import Array exposing (Array)
|
||||||
|
import Html exposing (Html)
|
||||||
|
|
||||||
|
import Material.Textfield as Textfield
|
||||||
|
import Material.Grid as Grid exposing (..)
|
||||||
|
|
||||||
|
|
||||||
|
type alias Model = Array Textfield.Model
|
||||||
|
|
||||||
|
|
||||||
|
model : Model
|
||||||
|
model =
|
||||||
|
let t0 = Textfield.model in
|
||||||
|
[ t0
|
||||||
|
, { t0 | label = Just { text = "Labelled", float = False } }
|
||||||
|
, { t0 | label = Just { text = "Floating label", float = True }}
|
||||||
|
, { t0
|
||||||
|
| label = Just { text = "Disabled", float = False }
|
||||||
|
, isDisabled = True
|
||||||
|
}
|
||||||
|
, { t0
|
||||||
|
| label = Just { text = "With error and value", float = False }
|
||||||
|
, error = Just "The input is wrong!"
|
||||||
|
, value = "Incorrect input"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|> Array.fromList
|
||||||
|
|
||||||
|
|
||||||
|
type Action =
|
||||||
|
Field Int Textfield.Action
|
||||||
|
|
||||||
|
|
||||||
|
update : Action -> Model -> Model
|
||||||
|
update (Field k action) fields =
|
||||||
|
Array.get k fields
|
||||||
|
|> Maybe.map (Textfield.update action)
|
||||||
|
|> Maybe.map (\field' -> Array.set k field' fields)
|
||||||
|
|> Maybe.withDefault fields
|
||||||
|
|
||||||
|
|
||||||
|
view : Signal.Address Action -> Model -> Html
|
||||||
|
view addr model =
|
||||||
|
model
|
||||||
|
|> Array.indexedMap (\k field ->
|
||||||
|
Textfield.view (Signal.forwardTo addr (Field k)) field
|
||||||
|
)
|
||||||
|
|> Array.toList
|
||||||
|
|> List.map (\x -> cell [size All 3] [x])
|
||||||
|
|> grid
|
Loading…
Reference in a new issue