A music player that connects to your cloud/distributed storage.
at main 5.9 kB view raw
1module UI.Backdrop exposing (..) 2 3import Chunky exposing (..) 4import Color 5import Html exposing (Html) 6import Html.Attributes exposing (src, style) 7import Html.Events exposing (on) 8import Html.Lazy as Lazy 9import Json.Decode 10import Return exposing (return) 11import UI.Ports as Ports 12import UI.Types exposing (..) 13import UI.User.State.Export as User 14 15 16 17-- ⛩ 18 19 20default : String 21default = 22 "21.jpg" 23 24 25options : List ( String, String ) 26options = 27 [ ( "1.jpg", "Option 1" ) 28 , ( "2.jpg", "Option 2" ) 29 , ( "3.jpg", "Option 3" ) 30 , ( "4.jpg", "Option 4" ) 31 , ( "5.jpg", "Option 5" ) 32 , ( "6.jpg", "Option 6" ) 33 , ( "7.jpg", "Option 7" ) 34 , ( "8.jpg", "Option 8" ) 35 , ( "9.jpg", "Option 9" ) 36 , ( "10.jpg", "Option 10" ) 37 , ( "11.jpg", "Option 11" ) 38 , ( "12.jpg", "Option 12" ) 39 , ( "13.jpg", "Option 13" ) 40 , ( "14.jpg", "Option 14" ) 41 , ( "15.jpg", "Option 15" ) 42 , ( "16.jpg", "Option 16" ) 43 , ( "17.jpg", "Option 17" ) 44 , ( "18.jpg", "Option 18" ) 45 , ( "19.jpg", "Option 19" ) 46 , ( "20.jpg", "Option 20" ) 47 , ( "21.jpg", "Option 21 (default)" ) 48 , ( "22.jpg", "Option 22" ) 49 , ( "23.jpg", "Option 23" ) 50 , ( "24.jpg", "Option 24" ) 51 , ( "25.jpg", "Option 25" ) 52 , ( "26.jpg", "Option 26" ) 53 , ( "27.jpg", "Option 27" ) 54 , ( "28.jpg", "Option 28" ) 55 , ( "29.jpg", "Option 29" ) 56 , ( "30.jpg", "Option 30" ) 57 ] 58 59 60 61-- 📣 62 63 64extractedBackdropColor : { r : Int, g : Int, b : Int } -> Manager 65extractedBackdropColor { r, g, b } model = 66 Return.singleton { model | extractedBackdropColor = Just (Color.rgb255 r g b) } 67 68 69chooseBackdrop : String -> Manager 70chooseBackdrop backdrop model = 71 User.saveSettings { model | chosenBackdrop = Just backdrop } 72 73 74loadBackdrop : String -> Manager 75loadBackdrop backdrop model = 76 return 77 { model | loadedBackdrops = model.loadedBackdrops ++ [ backdrop ] } 78 (Ports.pickAverageBackgroundColor backdrop) 79 80 81setDefault : Manager 82setDefault model = 83 Return.singleton { model | chosenBackdrop = Just default } 84 85 86 87-- 🗺 88 89 90view : Model -> Html Msg 91view model = 92 chunk 93 [ "fixed" 94 , "-inset-px" 95 , "z-0" 96 ] 97 [ Lazy.lazy chosen model.chosenBackdrop 98 , Lazy.lazy2 loaded model.loadedBackdrops model.fadeInBackdrop 99 100 -- Shadow 101 --------- 102 , brick 103 [ style "background" "linear-gradient(#0000, rgba(0, 0, 0, 0.175))" ] 104 [ "absolute" 105 , "bottom-0" 106 , "h-64" 107 , "inset-x-0" 108 , "z-10" 109 ] 110 [] 111 ] 112 113 114backgroundImage : String -> Html.Attribute msg 115backgroundImage backdrop = 116 style "background-image" ("url(images/Background/" ++ backdrop ++ ")") 117 118 119backgroundPositioning : String -> Html.Attribute msg 120backgroundPositioning filename = 121 case filename of 122 "2.jpg" -> 123 style "background-position" "center 68%" 124 125 "3.jpg" -> 126 style "background-position" "center 30%" 127 128 "4.jpg" -> 129 style "background-position" "center 96.125%" 130 131 "6.jpg" -> 132 style "background-position" "center 40%" 133 134 "11.jpg" -> 135 style "background-position" "center 67.25%" 136 137 "19.jpg" -> 138 style "background-position" "center 13%" 139 140 "20.jpg" -> 141 style "background-position" "center 39.75%" 142 143 "21.jpg" -> 144 style "background-position" "center 52.5%" 145 146 "22.jpg" -> 147 style "background-position" "center top" 148 149 "23.jpg" -> 150 style "background-position" "center 92.5%" 151 152 "24.jpg" -> 153 style "background-position" "center top" 154 155 "25.jpg" -> 156 style "background-position" "center 50%" 157 158 "27.jpg" -> 159 style "background-position" "center top" 160 161 _ -> 162 style "background-position" "center bottom" 163 164 165 166----------------------------------------- 167-- ㊙️ 168----------------------------------------- 169 170 171chosen : Maybe String -> Html Msg 172chosen maybeChosen = 173 case maybeChosen of 174 Just c -> 175 let 176 loadingDecoder = 177 c 178 |> LoadBackdrop 179 |> Json.Decode.succeed 180 in 181 slab 182 Html.img 183 [ on "load" loadingDecoder 184 , src ("images/Background/" ++ c) 185 , style "opacity" "0.00001" 186 ] 187 [ "fixed" 188 , "h-px" 189 , "left-full" 190 , "overflow-hidden" 191 , "top-full" 192 , "w-px" 193 ] 194 [] 195 196 Nothing -> 197 nothing 198 199 200loaded : List String -> Bool -> Html Msg 201loaded list fadeIn = 202 let 203 amount = 204 List.length list 205 206 indexedMapFn idx = 207 image fadeIn (idx + 1 < amount) 208 in 209 list 210 |> List.indexedMap indexedMapFn 211 |> raw 212 213 214image : Bool -> Bool -> String -> Html msg 215image fadeIn isPrevious loadedBackdrop = 216 let 217 defaultClasses = 218 [ "bg-cover" 219 , "fixed" 220 , "inset-0" 221 222 -- Opacity 223 ---------- 224 , if isPrevious || not fadeIn then 225 "opacity-100" 226 227 else 228 "opacity-0" 229 ] 230 231 animationClasses = 232 if not isPrevious && fadeIn then 233 [ "animation-2s" 234 , "animation-delay-50ms" 235 , "animation-fadeIn" 236 , "animation-fill-forwards" 237 , "animation-once" 238 ] 239 240 else 241 [] 242 in 243 brick 244 [ backgroundImage loadedBackdrop 245 , backgroundPositioning loadedBackdrop 246 ] 247 (List.append 248 defaultClasses 249 animationClasses 250 ) 251 []