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

210 lines
5.8 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
-}
2020-06-10 03:56:10 +03:00
import Browser.Dom as Dom
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 KeyboardSupport exposing (Key(..))
import List.Zipper exposing (Zipper)
import Nri.Ui.Svg.V1 as Svg
import Nri.Ui.Tabs.V7 as Tabs exposing (Alignment(..), Tab)
import Nri.Ui.Tooltip.V2 as Tooltip
import Nri.Ui.UiIcon.V1 as UiIcon
2020-06-10 03:56:10 +03:00
import Task
2020-06-10 00:51:00 +03:00
type alias State =
{ selected : Id
, settings : Control Settings
2020-09-08 21:55:09 +03:00
, openTooltip : Maybe Id
2020-06-10 00:51:00 +03:00
}
init : State
init =
{ selected = First
, settings = initSettings
2020-09-08 21:55:09 +03:00
, openTooltip = Nothing
}
type alias Settings =
{ title : Maybe String
, alignment : Alignment
2020-06-10 04:08:33 +03:00
, customSpacing : Maybe Float
, labelledBy : Maybe String
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 04:08:33 +03:00
|> Control.field "customSpacing"
(Control.maybe False
(Control.choice
[ ( "2", Control.value 2 )
, ( "3", Control.value 3 )
, ( "4", Control.value 4 )
, ( "8", Control.value 8 )
, ( "16", Control.value 16 )
]
)
)
|> Control.field "labelledBy" (Control.maybe False (Control.string "someId"))
2020-06-10 00:51:00 +03:00
type Id
= First
| Second
| Third
| Fourth
2020-06-10 00:51:00 +03:00
type Msg
2020-09-09 00:35:36 +03:00
= FocusAndSelectTab { select : Id, focus : Maybe String }
2020-06-10 03:56:10 +03:00
| Focused (Result Dom.Error ())
| SetSettings (Control Settings)
2020-09-08 21:55:09 +03:00
| ToggleTooltip Id Bool
2020-06-10 00:51:00 +03:00
2020-06-10 03:43:54 +03:00
update : Msg -> State -> ( State, Cmd Msg )
2020-06-10 00:51:00 +03:00
update msg model =
case msg of
2020-09-09 00:35:36 +03:00
FocusAndSelectTab { select, focus } ->
( { model | selected = select }
, focus
|> Maybe.map (Dom.focus >> Task.attempt Focused)
|> Maybe.withDefault Cmd.none
)
2020-06-10 03:56:10 +03:00
Focused error ->
( model, Cmd.none )
SetSettings settings ->
2020-06-10 03:43:54 +03:00
( { model | settings = settings }, Cmd.none )
2020-03-31 22:43:32 +03:00
2020-09-08 21:55:09 +03:00
ToggleTooltip id openTooltip ->
( { model
| openTooltip =
if openTooltip then
Just id
else
Nothing
}
, Cmd.none
)
2020-03-31 23:20:03 +03:00
example : Example State Msg
2020-03-31 22:43:32 +03:00
example =
2020-09-09 21:43:10 +03:00
{ name = "Tabs"
, version = 7
2020-03-31 22:43:32 +03:00
, categories = [ Layout ]
2020-06-20 00:50:47 +03:00
, keyboardSupport =
[ { keys = [ KeyboardSupport.Tab ]
2020-08-06 01:58:40 +03:00
, result = "Move focus to the currently-selected Tab's tab panel"
2020-06-20 00:50:47 +03:00
}
, { keys = [ Arrow KeyboardSupport.Left ]
, result = "Select the tab to the left of the currently-selected Tab"
}
, { keys = [ Arrow KeyboardSupport.Right ]
, result = "Select the tab to the right of the currently-selected Tab"
}
]
2020-06-10 00:51:00 +03:00
, state = init
2020-06-10 03:43:54 +03:00
, update = update
2020-03-31 22:48:26 +03:00
, subscriptions = \_ -> Sub.none
2021-11-05 21:19:08 +03:00
, preview = []
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 04:08:33 +03:00
, customSpacing = settings.customSpacing
2020-09-09 00:35:36 +03:00
, focusAndSelect = FocusAndSelectTab
2020-06-10 01:53:46 +03:00
, selected = model.selected
, tabs = allTabs model.openTooltip settings.labelledBy
2020-03-31 22:43:32 +03:00
}
]
}
allTabs : Maybe Id -> Maybe String -> List (Tab Id Msg)
allTabs openTooltipId labelledBy =
2020-09-08 21:00:29 +03:00
let
bulbIcon =
UiIcon.bulb
|> Svg.withWidth (Css.px 40)
2020-09-08 21:22:17 +03:00
|> Svg.withHeight (Css.px 45)
|> Svg.withLabel "Bulb"
2020-09-08 21:00:29 +03:00
|> Svg.withCss [ Css.padding2 Css.zero (Css.px 6) ]
|> Svg.toHtml
in
2020-09-08 20:56:29 +03:00
[ Tabs.build { id = First, idString = "tab-0" }
([ Tabs.spaHref "/#/doodad/Tabs"
, Tabs.tabString "1"
, Tabs.withTooltip
2020-09-08 21:55:09 +03:00
[ Tooltip.plaintext "Link Example"
, Tooltip.onHover (ToggleTooltip First)
, Tooltip.alignStart (Css.px 75)
, Tooltip.primaryLabel
, Tooltip.open (openTooltipId == Just First)
]
, Tabs.panelHtml (Html.text "First Panel")
]
++ (case labelledBy of
Nothing ->
[]
Just labelledById ->
[ Tabs.labelledBy labelledById ]
)
)
2020-09-08 20:56:29 +03:00
, Tabs.build { id = Second, idString = "tab-1" }
[ Tabs.tabString "Second Tab (disabled)"
, Tabs.disabled True
2020-09-08 20:56:29 +03:00
, Tabs.panelHtml (Html.text "Second Panel")
]
, Tabs.build { id = Third, idString = "tab-2" }
2020-09-08 21:00:29 +03:00
[ Tabs.tabHtml bulbIcon
, Tabs.withTooltip
[ Tooltip.plaintext "The Electrifying Third Tab"
2020-09-08 21:55:09 +03:00
, Tooltip.onHover (ToggleTooltip Third)
2020-09-08 21:00:29 +03:00
, Tooltip.primaryLabel
2020-09-08 21:55:09 +03:00
, Tooltip.open (openTooltipId == Just Third)
2020-09-08 21:00:29 +03:00
]
2020-09-08 20:56:29 +03:00
, Tabs.panelHtml (Html.text "Third Panel")
]
, Tabs.build { id = Fourth, idString = "tab-3" }
[ Tabs.tabString "Fourth Tab"
, Tabs.panelHtml (Html.text "Fourth Panel")
]
2020-06-10 02:23:15 +03:00
]