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 []