noredink-ui/styleguide-app/Examples/Tabs.elm

144 lines
3.5 KiB
Elm
Raw Normal View History

module Examples.Tabs exposing
( example
2020-03-31 22:43:32 +03:00
, State, Msg
)
{-|
@docs example
2020-03-31 22:43:32 +03:00
@docs State, Msg
-}
import Category exposing (Category(..))
import Css
2020-06-10 00:51:00 +03:00
import Debug.Control as Control exposing (Control)
2020-03-31 23:20:03 +03:00
import Example exposing (Example)
2020-06-10 00:51:00 +03:00
import Html.Styled as Html exposing (Html, fromUnstyled)
import Html.Styled.Attributes exposing (css)
import List.Zipper exposing (Zipper)
import Nri.Ui.Svg.V1 as Svg
2020-06-10 02:23:15 +03:00
import Nri.Ui.Tabs.V5 as Tabs exposing (Alignment(..), Tab)
import Nri.Ui.UiIcon.V1 as UiIcon
2020-06-10 00:51:00 +03:00
type alias State =
{ selected : Id
, settings : Control Settings
2020-06-10 00:51:00 +03:00
}
init : State
init =
{ selected = First
, settings = initSettings
}
type alias Settings =
{ title : Maybe String
, alignment : Alignment
2020-06-10 00:51:00 +03:00
}
initSettings : Control Settings
initSettings =
Control.record Settings
|> Control.field "title" (Control.maybe False (Control.string "Title"))
|> Control.field "alignment"
(Control.choice
[ ( "Left", Control.value Left )
, ( "Center", Control.value Center )
, ( "Right", Control.value Right )
]
)
2020-06-10 00:51:00 +03:00
type Id
= First
| Second
| Third
| Fourth
2020-06-10 00:51:00 +03:00
type Msg
= SelectTab Id
| SetSettings (Control Settings)
2020-06-10 00:51:00 +03:00
update : Msg -> State -> State
update msg model =
case msg of
SelectTab id ->
{ model | selected = id }
SetSettings settings ->
{ model | settings = settings }
2020-03-31 22:43:32 +03:00
2020-03-31 23:20:03 +03:00
example : Example State Msg
2020-03-31 22:43:32 +03:00
example =
2020-06-10 00:21:42 +03:00
{ name = "Nri.Ui.Tabs.V5"
2020-03-31 22:43:32 +03:00
, categories = [ Layout ]
2020-06-10 00:51:00 +03:00
, state = init
, update = \msg model -> ( update msg model, Cmd.none )
2020-03-31 22:48:26 +03:00
, subscriptions = \_ -> Sub.none
2020-03-31 22:43:32 +03:00
, view =
2020-06-10 00:51:00 +03:00
\model ->
let
settings =
Control.currentValue model.settings
in
[ Control.view SetSettings model.settings |> fromUnstyled
2020-06-10 00:51:00 +03:00
, Tabs.view
{ title = settings.title
2020-06-10 02:23:15 +03:00
, alignment = settings.alignment
2020-06-10 00:51:00 +03:00
, onSelect = SelectTab
2020-06-10 01:53:46 +03:00
, selected = model.selected
2020-06-10 02:23:15 +03:00
, tabs = allTabs
2020-03-31 22:43:32 +03:00
}
, Tabs.links
{ title = Nothing
, content = Html.text "Links"
, alignment = Tabs.Left
, tabs =
List.Zipper.from
[]
(Tabs.NormalLink { label = "Nowhere", href = Nothing })
[ Tabs.NormalLink { label = "Elm", href = Just "http://elm-lang.org" }
2020-06-10 00:51:00 +03:00
, Tabs.SpaLink { label = "Spa", href = "/#category/Layout", msg = SelectTab Second }
2020-03-31 22:43:32 +03:00
]
}
]
}
2020-06-10 02:23:15 +03:00
allTabs : List (Tab Id Msg)
allTabs =
[ { id = First
, idString = "tab-0"
, tabView = Tabs.viewTabDefault "First Tab"
, panelView = Html.text "First Panel"
}
, { id = Second
, idString = "tab-1"
, tabView = Tabs.viewTabDefault "Second Tab"
, panelView = Html.text "Second Panel"
}
, { id = Third
, idString = "tab-2"
, tabView =
UiIcon.bulb
|> Svg.withWidth (Css.px 40)
|> Svg.withHeight (Css.px 40)
|> Svg.withCss [ Css.padding2 Css.zero (Css.px 6) ]
|> Svg.toHtml
2020-06-10 02:23:15 +03:00
, panelView = Html.text "Third Panel"
}
, { id = Fourth
, idString = "tab-3"
, tabView = Tabs.viewTabDefault "Fourth Tab"
, panelView = Html.text "Fourth Panel"
}
]