3
3
module Slides
4
4
( runSlides
5
5
, mkSlides
6
- , ui
7
6
, Move ()
8
7
, Slides ()
9
8
, Slide ()
@@ -29,89 +28,75 @@ module Slides
29
28
30
29
import Prelude
31
30
import Data.List.Zipper as Z
31
+ import Slides.Internal.Input as I
32
32
import Control.Comonad (extract )
33
33
import Control.Monad.Eff (Eff )
34
+ import DOM (DOM )
34
35
import Data.Array ((:), uncons , singleton )
35
- import Data.Foldable (foldr )
36
+ import Data.Foldable (foldMap , fold , foldr )
36
37
import Data.Functor (($>))
37
38
import Data.Generic (class Generic , gShow )
38
39
import Data.List (List (..), length )
39
40
import Data.Maybe (Maybe (..), fromMaybe )
40
- import Halogen (ComponentDSL , ComponentHTML , Component , HalogenEffects , component , modify , runUI )
41
- import Halogen.HTML (className ) as H
42
- import Halogen.HTML.Events.Handler (preventDefault ) as Events
43
- import Halogen.HTML.Events.Indexed (onKeyPress , input_ , onClick ) as Events
44
- import Halogen.HTML.Indexed (HTML (Element), className , span , li_ , ul_ , img , text , p , a , h2_ , span_ , div , button ) as Html
45
- import Halogen.HTML.Properties (id_ , class_ ) as H
46
- import Halogen.HTML.Properties.Indexed (class_ , src , href ) as Html
47
- import Halogen.Query (action )
48
- import Halogen.Util (awaitBody , runHalogenAff )
49
-
41
+ import Signal (foldp , runSignal ) as S
42
+ import Text.Smolder.HTML (p , div , img , a , h2 , ul , li , span ) as H
43
+ import Text.Smolder.HTML.Attributes (className , id , src , href ) as H
44
+ import Text.Smolder.Markup (Markup , text ) as H
45
+ import Text.Smolder.Markup ((!))
46
+ import Text.Smolder.Renderer.String (render ) as H
50
47
51
48
-- -----------
52
49
-- Running --
53
50
-- -----------
54
51
52
+
55
53
-- | run a component for a presentation
56
- runSlides :: Slides -> Eff (HalogenEffects ()) Unit
57
- runSlides slides = runHalogenAff do
58
- body <- awaitBody
59
- runUI ui slides body
60
-
61
- -- | Halogen UI component for a presentation
62
- ui :: forall g . Component Slides Move g
63
- ui = component { render, eval }
64
- where
65
-
66
- render :: Slides -> ComponentHTML Move
67
- render (Slides state) =
68
- Html .span []
69
- [ Html .button [ keyboardEvent, Events .onClick (Events .input_ Back ) ] [ Html .text " Back" ]
70
- , Html .button [ keyboardEvent, Events .onClick (Events .input_ Next ) ] [ Html .text " Next" ]
71
- , Html .span
72
- [ Html .class_ $ Html .className " counter" ]
73
- [ Html .text $ show (position state + 1 ) <> " / " <> show (zipLength state) ]
74
- , renderSlides (extract state)
75
- ]
76
-
77
- eval :: Move ~> (ComponentDSL Slides Move g )
78
- eval move = do
79
- modify (\(Slides slides) -> Slides $ moveSlides move slides)
80
- pure (getNext move)
81
-
82
- keyMapping = case _ of
83
- 35.0 -> Events .preventDefault $> map action (Just End ) -- End key
84
- 36.0 -> Events .preventDefault $> map action (Just Start ) -- Home key
85
- 37.0 -> Events .preventDefault $> map action (Just Back ) -- Left Arrow key
86
- 39.0 -> Events .preventDefault $> map action (Just Next ) -- Right Arrow key
87
- _ -> pure Nothing
88
-
89
- keyboardEvent = Events .onKeyPress \e -> keyMapping e.keyCode
90
-
91
- data Move a
92
- = Back a
93
- | Next a
94
- | Start a
95
- | End a
96
-
97
- getNext :: forall a . Move a -> a
98
- getNext = case _ of
99
- Back a -> a
100
- Next a -> a
101
- Start a -> a
102
- End a -> a
103
-
104
- moveSlides :: forall a . Move a -> SlidesInternal -> SlidesInternal
105
- moveSlides (Back _) slides =
54
+ runSlides :: forall e . Slides -> Eff ( dom :: DOM | e ) Unit
55
+ runSlides (Slides slides) = do
56
+ inn <- I .input
57
+ let ui = S .foldp update slides inn
58
+ S .runSignal (setHtml <<< H .render <<< render <$> ui)
59
+
60
+
61
+ -- Rendering
62
+
63
+ render :: SlidesInternal -> H.Markup
64
+ render slides =
65
+ H .div ! H .id " main" $ do
66
+ H .span ! H .className " counter" $
67
+ H .text $ show (position slides + 1 ) <> " / " <> show (zipLength slides)
68
+ renderSlides (extract slides)
69
+
70
+ foreign import setHtml :: forall e . String -> Eff ( dom :: DOM | e ) Unit
71
+
72
+
73
+ -- Update
74
+
75
+ update :: I.Input -> SlidesInternal -> SlidesInternal
76
+ update i slides
77
+ | I .clickOrHold (i.arrows.right) = moveSlides Next slides
78
+ | I .clickOrHold (i.arrows.left) = moveSlides Back slides
79
+ | I .clickOrHold (i.arrows.down) = moveSlides Start slides
80
+ | I .clickOrHold (i.arrows.up) = moveSlides End slides
81
+ | otherwise = slides
82
+
83
+ data Move
84
+ = Back
85
+ | Next
86
+ | Start
87
+ | End
88
+
89
+ moveSlides :: Move -> SlidesInternal -> SlidesInternal
90
+ moveSlides Back slides =
106
91
fromMaybe slides (Z .up slides)
107
92
108
- moveSlides ( Next _) slides =
93
+ moveSlides Next slides =
109
94
fromMaybe slides (Z .down slides)
110
95
111
- moveSlides ( Start _) slides =
96
+ moveSlides Start slides =
112
97
Z .beginning slides
113
98
114
- moveSlides ( End _) slides =
99
+ moveSlides End slides =
115
100
Z .end slides
116
101
117
102
@@ -244,66 +229,52 @@ italic = withClass "italicEl" <<< group <<< singleton
244
229
-- Rendering --
245
230
-- -------------
246
231
247
- renderSlides :: forall p i . Slide -> Html.HTML p i
232
+ renderSlides :: Slide -> H.Markup
248
233
renderSlides (Slide el) =
249
- Html .div (giveClass " slide" ) [ renderE el]
234
+ H .div ! H .className " slide" $ renderE el
250
235
251
- renderE :: forall p i . Element -> Html.HTML p i
236
+ renderE :: Element -> H.Markup
252
237
renderE element =
253
238
case element of
254
239
Empty ->
255
- Html .span_ []
240
+ H .span ( H .text " " )
256
241
257
242
Title tl ->
258
- Html .span (giveClass " title" ) [ Html .h2_ [ Html .text tl ] ]
243
+ H .span ! H .className " title" $ H .h2 ( H .text tl)
259
244
260
245
Link l el ->
261
- Html .a [ Html .href l ] [ renderE el ]
246
+ H .a ! H .href l $ renderE el
262
247
263
248
Text str ->
264
- Html .p marwidStyle [ Html .text str ]
249
+ H .p ! H .className " marwid " $ H .text str
265
250
266
251
Image url ->
267
- Html .img (marwidStyle <> [ Html .src url ])
252
+ H .img ! H .className " marwid " ! H .src url
268
253
269
254
VAlign els ->
270
- Html .span colFlexStyle ( applyRest block $ map renderE els)
255
+ H .span ! H .className " colflex " $ fold $ applyRest block $ map renderE els
271
256
272
257
HAlign els ->
273
- Html .span rowFlexStyle (map renderE els)
258
+ H .span ! H .className " rowflex " $ foldMap renderE els
274
259
275
260
UList els ->
276
- Html .span [] [ Html .ul_ $ map ( Html .li_ <<< singleton <<< renderE) els ]
261
+ H .span $ H .ul $ foldMap ( H .li <<< renderE) els
277
262
278
263
Group els ->
279
- Html .span [] $ map renderE els
264
+ H .span $ foldMap renderE els
280
265
281
266
Class c e ->
282
- case renderE e of
283
- Html.Element nm tn props els ->
284
- Html.Element nm tn (props <> [ H .class_ $ H .className c ]) els
285
- el ->
286
- el
267
+ renderE e ! H .className c
287
268
288
269
Id i e ->
289
- case renderE e of
290
- Html.Element nm tn props els ->
291
- Html.Element nm tn (props <> giveId i) els
292
- el ->
293
- el
270
+ renderE e ! H .id i
294
271
295
- giveClasses = map (Html .class_ <<< Html .className)
296
- giveClass = singleton <<< Html .class_ <<< Html .className
297
- giveId = singleton <<< H .id_
298
-
299
- marwidStyle = giveClass " marwid"
300
- rowFlexStyle = giveClass " rowflex"
301
- colFlexStyle = giveClass " colflex"
302
-
303
- block x = Html .span (giveClass " block" ) [ x ]
272
+ block :: H.Markup -> H.Markup
273
+ block = H .span ! H .className " block"
304
274
305
275
applyRest :: forall a . (a -> a ) -> Array a -> Array a
306
276
applyRest f xs =
307
277
case uncons xs of
308
278
Nothing -> xs
309
279
Just list -> list.head : map f list.tail
280
+
0 commit comments