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

137 lines
3.4 KiB
Elm
Raw Normal View History

2020-05-15 20:15:35 +03:00
module Examples.Confetti exposing (example, State, Msg)
{-|
@docs example, State, Msg
-}
import Browser.Events
2020-05-15 20:15:35 +03:00
import Category exposing (Category(..))
import Css exposing (Color)
import Dict exposing (Dict)
2020-05-15 20:15:35 +03:00
import Example exposing (Example)
import Html.Styled as Html exposing (Html)
2020-05-15 20:15:35 +03:00
import Html.Styled.Attributes as Attributes exposing (css)
import Nri.Ui.Button.V10 as Button
import Nri.Ui.Colors.V1 as Colors
import Nri.Ui.Confetti.V1 as Confetti
import Nri.Ui.TextArea.V4 as TextArea
2020-05-15 20:15:35 +03:00
{-| -}
example : Example State Msg
example =
{ name = "Nri.Ui.Confetti.V1"
, categories = [ Animations ]
, state = init
, update = update
, subscriptions =
\state ->
Sub.batch
[ Browser.Events.onResize WindowResized
, Confetti.subscriptions ConfettiMsg state.confetti
]
2020-05-15 20:15:35 +03:00
, view =
\state ->
[ confettiWordsInput state.confettiWords
, Button.button "Launch confetti!"
2020-05-15 20:15:35 +03:00
[ Button.onClick LaunchConfetti
, Button.small
, Button.secondary
]
, Confetti.view state.confetti
2020-05-15 20:15:35 +03:00
]
}
confettiWordsInput : String -> Html Msg
confettiWordsInput confettiWords =
Html.div [ css [ Css.width (Css.px 600), Css.marginBottom (Css.px 10) ] ]
[ TextArea.writing
{ value = confettiWords
, autofocus = False
, onInput = OnInput
, onBlur = Nothing
, isInError = False
, label = "Confetti Words"
, height = TextArea.Fixed
, placeholder = ""
, showLabel = True
}
]
2020-05-15 20:15:35 +03:00
{-| -}
type alias State =
2020-05-15 20:54:43 +03:00
{ confetti : Confetti.Model
, confettiWords : String
2020-05-15 20:15:35 +03:00
}
init : State
init =
{ confetti = Confetti.init 700
, confettiWords = "lemonade iced tea coca-cola pepsi"
2020-05-15 20:15:35 +03:00
}
{-| -}
type Msg
= LaunchConfetti
| ConfettiMsg Confetti.Msg
| WindowResized Int Int
| OnInput String
2020-05-15 20:15:35 +03:00
{-| -}
update : Msg -> State -> ( State, Cmd Msg )
update msg state =
let
words =
List.indexedMap
(\index word -> { color = getColor index, text = word })
(String.words state.confettiWords)
2020-05-15 20:15:35 +03:00
in
case msg of
LaunchConfetti ->
( { state | confetti = Confetti.burst words state.confetti }
2020-05-15 20:15:35 +03:00
, Cmd.none
)
ConfettiMsg confettiMsg ->
( { state | confetti = Confetti.update confettiMsg state.confetti }
, Cmd.none
)
WindowResized width _ ->
( { state | confetti = Confetti.updateCenter (toFloat (width // 2)) state.confetti }
2020-05-15 20:15:35 +03:00
, Cmd.none
)
OnInput confettiWords ->
( { state | confettiWords = confettiWords }
, Cmd.none
)
getColor : Int -> Color
getColor key =
let
dict =
List.indexedMap (\i c -> ( i, c ))
[ Colors.highlightBlue
, Colors.highlightBlueDark
, Colors.highlightCyan
, Colors.highlightCyanDark
, Colors.highlightGreen
, Colors.highlightGreenDark
, Colors.highlightMagenta
, Colors.highlightMagentaDark
, Colors.highlightYellow
, Colors.highlightYellowDark
]
|> Dict.fromList
in
Maybe.withDefault Colors.highlightYellow (Dict.get key dict)