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

196 lines
4.9 KiB
Elm
Raw Normal View History

2019-11-26 04:38:07 +03:00
module Examples.Svg exposing
( Msg
, State
, example
, init
, update
)
{-|
@docs Msg
@docs State
@docs example
@docs init
@docs update
-}
import Color exposing (Color)
2019-11-26 04:58:50 +03:00
import Css
2019-11-26 04:38:07 +03:00
import Examples.IconExamples as IconExamples
import Html.Styled as Html
import Html.Styled.Attributes as Attributes
import Html.Styled.Events as Events
import ModuleExample exposing (Category(..), ModuleExample)
import Nri.Ui.Colors.Extra exposing (fromCssColor, toCssColor)
import Nri.Ui.Colors.V1 as Colors
import Nri.Ui.Heading.V2 as Heading
import Nri.Ui.Select.V6 as Select
import Nri.Ui.Svg.V1 as Svg
import Nri.Ui.UiIcon.V1 as UiIcon
{-| -}
example : (Msg -> msg) -> State -> ModuleExample msg
example parentMessage state =
{ name = "Nri.Ui.Svg.V1"
, category = Icons
, content =
2019-11-26 04:58:50 +03:00
[ viewSettings state
|> Html.map parentMessage
2019-11-26 05:18:11 +03:00
, viewResults state
2019-11-26 04:58:50 +03:00
]
}
viewSettings : State -> Html.Html Msg
viewSettings state =
2019-11-26 05:18:11 +03:00
Html.div
[ Attributes.css
[ Css.displayFlex
, Css.justifyContent Css.spaceBetween
]
]
2019-11-26 04:38:07 +03:00
[ Html.label []
[ Html.text "Color: "
, Html.input
[ Attributes.type_ "color"
, Attributes.value (Color.toHex state.color)
, Events.onInput (SetColor << Color.fromHex)
]
[]
]
2019-11-26 04:58:50 +03:00
, Html.label []
[ Html.text "Width: "
, Html.input
[ Attributes.type_ "range"
, Attributes.min "0"
, Attributes.max "200"
, Attributes.value (String.fromFloat state.width)
, Events.onInput (SetWidth << String.toFloat)
]
[]
]
, Html.label []
[ Html.text "Height: "
, Html.input
[ Attributes.type_ "range"
, Attributes.min "0"
, Attributes.max "200"
, Attributes.value (String.fromFloat state.height)
, Events.onInput (SetHeight << String.toFloat)
]
[]
]
2019-11-26 05:08:40 +03:00
, Html.label []
[ Html.text "Aria-label: "
, Html.input
[ Attributes.value state.label
, Events.onInput SetLabel
]
[]
]
2019-11-26 04:38:07 +03:00
]
2019-11-26 05:18:11 +03:00
viewResults : State -> Html.Html msg
viewResults state =
2019-11-27 03:03:26 +03:00
let
( red, green, blue ) =
Color.toRGB state.color
in
2019-11-26 05:18:11 +03:00
Html.div [ Attributes.css [ Css.displayFlex ] ]
[ Html.pre
[ Attributes.css
[ Css.width (Css.px 400)
, Css.marginRight (Css.px 20)
]
]
2019-11-27 03:03:26 +03:00
[ [ "color : Css.Color"
, "color ="
, " Css.rgb " ++ String.fromFloat red ++ " " ++ String.fromFloat green ++ " " ++ String.fromFloat blue
, ""
, ""
, "renderedSvg : Svg "
, "renderedSvg = "
, " UiIcon.newspaper"
, " |> Svg.withColor color"
, " |> Svg.withWidth (Css.px " ++ String.fromFloat state.width ++ ")"
, " |> Svg.withHeight (Css.px " ++ String.fromFloat state.height ++ ")"
, " |> Svg.withLabel \"" ++ state.label ++ "\""
, " |> Svg.toHtml"
2019-11-26 05:18:11 +03:00
]
|> String.join "\n"
|> Html.text
]
, Html.div
[ Attributes.css
[ Css.backgroundColor Colors.gray92
, Css.flexGrow (Css.int 2)
]
]
[ UiIcon.newspaper
|> Svg.withColor (toCssColor state.color)
|> Svg.withWidth (Css.px state.width)
|> Svg.withHeight (Css.px state.height)
|> Svg.withLabel state.label
|> Svg.toHtml
]
]
2019-11-26 04:38:07 +03:00
2019-11-26 05:08:40 +03:00
{-| -}
type alias State =
{ color : Color
, width : Float
, height : Float
, label : String
}
2019-11-26 04:38:07 +03:00
{-| -}
init : State
init =
{ color = fromCssColor Colors.blue
2019-11-26 04:58:50 +03:00
, width = 30
, height = 30
2019-11-26 05:08:40 +03:00
, label = "Newspaper"
2019-11-26 04:38:07 +03:00
}
2019-11-26 04:58:50 +03:00
{-| -}
type Msg
= SetColor (Result String Color)
| SetWidth (Maybe Float)
| SetHeight (Maybe Float)
2019-11-26 05:08:40 +03:00
| SetLabel String
2019-11-26 04:58:50 +03:00
2019-11-26 04:38:07 +03:00
{-| -}
update : Msg -> State -> ( State, Cmd Msg )
update msg state =
case msg of
SetColor (Ok color) ->
( { state | color = color }
, Cmd.none
)
SetColor (Err err) ->
( state, Cmd.none )
2019-11-26 04:58:50 +03:00
SetWidth (Just width) ->
( { state | width = width }, Cmd.none )
SetWidth Nothing ->
( state, Cmd.none )
SetHeight (Just height) ->
( { state | height = height }, Cmd.none )
SetHeight Nothing ->
( state, Cmd.none )
2019-11-26 05:08:40 +03:00
SetLabel label ->
( { state | label = label }, Cmd.none )