{-# LANGUAGE ExtendedDefaultRules #-} {-# LANGUAGE MultiWayIf #-} {-# LANGUAGE OverloadedStrings #-} {-# OPTIONS_GHC -fno-warn-type-defaults #-} module Main where import Control.Concurrent.STM (atomically, writeTVar) import Control.Monad (void) import Control.Monad.IO.Class import Data.Text import Ease import GHCJS.DOM import GHCJS.DOM.RequestAnimationFrameCallback import GHCJS.DOM.Window import Shpadoinkle import Shpadoinkle.Backend.ParDiff import Shpadoinkle.Html as H default (Text) left :: Double -> Text left x = "transform:translate3d(150px, " <> pack (show $ x / 5) <> "px, 0)" easeRange :: Fractional b => b -> (b -> b) -> b -> b easeRange r e = (* r) . e . (/ r) dur :: Double dur = 3000 view :: Double -> Html m a view clock = H.div [ textProperty "style" $ "position:absolute;background:red;padding:10px;" <> left (easeRange dur bounceOut clock) ] [ if | clock < 500 -> "Wat?" | clock < 1000 -> "AAAA!!" | clock < dur * 0.65 -> "Oh no!" | otherwise -> "I'm ok" ] animation :: Window -> TVar Double -> JSM () animation w t = void $ requestAnimationFrame w =<< go where go = newRequestAnimationFrameCallback $ \clock -> do liftIO . atomically $ writeTVar t clock r <- go if clock < dur then void $ requestAnimationFrame w r else return () main :: IO () main = do putStrLn "\nHappy point of view on https://localhost:8080\n" runJSorWarp 8080 $ do t <- newTVarIO 0 w <- currentWindowUnchecked animation w t shpadoinkle id runParDiff 0 t view getBody