From 1169306b84cf6bd19e7601830ba5ef6a82222703 Mon Sep 17 00:00:00 2001 From: Jacob Jonsson Date: Wed, 13 Sep 2023 22:20:04 +0200 Subject: [PATCH 1/3] chore(src/View): inline CSS to get rid of TemplateHaskell --- mat-chalmers.cabal | 1 - src/View.hs | 128 +++++++++++++++++++++++++++++++++++++++++++-- static/style.css | 108 -------------------------------------- 3 files changed, 123 insertions(+), 114 deletions(-) delete mode 100644 static/style.css diff --git a/mat-chalmers.cabal b/mat-chalmers.cabal index bd826e0..2c13dcf 100644 --- a/mat-chalmers.cabal +++ b/mat-chalmers.cabal @@ -8,7 +8,6 @@ category: Web build-type: Simple cabal-version: >=1.10 data-files: - static/style.css static/icon.png library diff --git a/src/View.hs b/src/View.hs index 801bbe0..e6f55db 100644 --- a/src/View.hs +++ b/src/View.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings, TemplateHaskell, RecordWildCards #-} +{-# LANGUAGE OverloadedStrings, QuasiQuotes, RecordWildCards #-} module View ( View(..) @@ -6,7 +6,6 @@ module View ) where -import Data.FileEmbed import qualified Data.Text.Lazy as T import qualified Data.Text.Lazy.Builder as T import Data.Thyme @@ -18,6 +17,7 @@ import Lucid import System.Locale ( defaultTimeLocale ) import qualified Text.CSS.Parse as CSS import qualified Text.CSS.Render as CSS +import Text.Heredoc ( str ) import Model import Model.Types ( NoMenu(..) ) @@ -90,9 +90,127 @@ sitefooter = footer_ a_ [href_ "https://kortladdning3.chalmerskonferens.se/"] "Top-up your card" ) --- brittany-disable-next-binding css :: T.Text css = (either error (T.toLazyText . CSS.renderNestedBlocks) . CSS.parseNestedBlocks) - $(embedStringFile "static/style.css") - + inlineCSS + where + inlineCSS = [str| * { + | box-sizing: border-box; + | } + | + | html { + | font-size: 10px; + | } + | + | body { + | font-family: "Anonymous Pro"; + | font-size: 14px; + | line-height: 1.42857143; + | background: #fdf7e2; + | color: #333; + | margin: 0; + | } + | + | h1, + | h2, + | h3 { + | line-height: 1.1; + | font-weight: 500; + | margin: 0; + | margin-bottom: 10px; + | } + | + | h1 { + | padding-left: 15px; + | font-size: 36px; + | margin-top: 20px; + | } + | + | h2 { + | font-size: 140%; + | font-weight: bold; + | } + | + | h3 { + | margin-right: 10px; + | margin-bottom: 0; + | display: inline-block; + | font-size: 100%; + | font-weight: bold; + | color: #bd3613; + | } + | + | p { + | font-size: 10vh; + | } + | + | a { + | color: #428bca; + | text-decoration: none; + | } + | + | ul { + | padding: 0; + | list-style-type: none; + | margin-top: 0; + | margin-bottom: 10px; + | } + | li { + | width: 100%; + | font-weight: 400; + | padding-bottom: 5px; + | } + | + | .food { + | position: relative; + | margin-top: 20px; + | } + | + | footer { + | font-size: 0.9em; + | margin-top: 20px; + | } + | + | /* Emulate Bootstrap Grid layout */ + | .container-fluid { + | padding-left: 15px; + | padding-right: 15px; + | margin-left: auto; + | margin-right: auto; + | } + | .row { + | margin-left: -15px; + | margin-right: -15px; + | display: flex; + | flex-wrap: wrap; + | } + | .col-xs-12, + | .col-sm-12, + | .col-md-12, + | .col-sm-6, + | .col-md-3 { + | padding-left: 15px; + | padding-right: 15px; + | position: relative; + | } + | .col-xs-12 { + | width: 100%; + | } + | @media (min-width: 768px) { + | .col-sm-12 { + | width: 100%; + | } + | .col-sm-6 { + | width: 50%; + | } + | } + | @media (min-width: 992px) { + | .col-md-3 { + | width: 25%; + | } + | .col-md-12 { + | width: 100%; + | } + | } + |] diff --git a/static/style.css b/static/style.css deleted file mode 100644 index 0c1c39a..0000000 --- a/static/style.css +++ /dev/null @@ -1,108 +0,0 @@ -* { - box-sizing: border-box; -} -html { - font-size: 10px; -} -body { - font-family: "Anonymous Pro"; - font-size: 14px; - line-height: 1.42857143; - background: #fdf7e2; - color: #333; - margin: 0; -} -h1, -h2, -h3 { - line-height: 1.1; - font-weight: 500; - margin: 0; - margin-bottom: 10px; -} -h1 { - padding-left: 15px; - font-size: 36px; - margin-top: 20px; -} -h2 { - font-size: 140%; - font-weight: bold; -} -h3 { - margin-right: 10px; - margin-bottom: 0; - display: inline-block; - font-size: 100%; - font-weight: bold; - color: #bd3613; -} -p { - font-size: 10vh; -} -a { - color: #428bca; - text-decoration: none; -} -ul { - padding: 0; - list-style-type: none; - margin-top: 0; - margin-bottom: 10px; -} -li { - width: 100%; - font-weight: 400; - padding-bottom: 5px; -} -.food { - position: relative; - margin-top: 20px; -} -.row { - display: flex; - flex-wrap: wrap; -} -footer { - font-size: 0.9em; - margin-top: 20px; -} -/* Emulate Bootstrap Grid layout */ -.container-fluid { - padding-left: 15px; - padding-right: 15px; - margin-left: auto; - margin-right: auto; -} -.row { - margin-left: -15px; - margin-right: -15px; -} -.col-xs-12, -.col-sm-12, -.col-md-12, -.col-sm-6, -.col-md-3 { - padding-left: 15px; - padding-right: 15px; - position: relative; -} -.col-xs-12 { - width: 100%; -} -@media (min-width: 768px) { - .col-sm-12 { - width: 100%; - } - .col-sm-6 { - width: 50%; - } -} -@media (min-width: 992px) { - .col-md-3 { - width: 25%; - } - .col-md-12 { - width: 100%; - } -} From f3e404dc94f672772034b61d9e9890547441dc9a Mon Sep 17 00:00:00 2001 From: Jacob Jonsson Date: Wed, 13 Sep 2023 23:04:42 +0200 Subject: [PATCH 2/3] chore(src/View): inline favicon to get rid of TemplateHaskell --- mat-chalmers.cabal | 2 -- src/View.hs | 2 +- static/icon.png | Bin 1887 -> 0 bytes 3 files changed, 1 insertion(+), 3 deletions(-) delete mode 100644 static/icon.png diff --git a/mat-chalmers.cabal b/mat-chalmers.cabal index 2c13dcf..2e351a9 100644 --- a/mat-chalmers.cabal +++ b/mat-chalmers.cabal @@ -7,8 +7,6 @@ maintainer: adam@sandbergericsson.se category: Web build-type: Simple cabal-version: >=1.10 -data-files: - static/icon.png library default-language: Haskell2010 diff --git a/src/View.hs b/src/View.hs index e6f55db..4f2245e 100644 --- a/src/View.hs +++ b/src/View.hs @@ -69,7 +69,7 @@ sitehead = head_ (do meta_ [charset_ "utf-8"] meta_ [name_ "viewport", content_ "width=device-width, initial-scale=1"] - link_ [rel_ "icon", type_ "image/png", href_ "icon.png"] + link_ [rel_ "shortcut icon", id_ "icon", type_ "image/png", href_ "data:image/png;base64,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"] link_ [ rel_ "stylesheet" , href_ "//fonts.googleapis.com/css?family=Anonymous+Pro:400,700" diff --git a/static/icon.png b/static/icon.png deleted file mode 100644 index d1da56d580860eb64b1438ecdb62436411c5e3d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1887 zcmV-l2cYS&=wmeC6{Q?oR*CzYj1 zp}m9fgH&c3SW!@s^w6jfEkq$IicFKF(zL>gvapmiA8F$Fo^mw9N8{{1tbM(E_C4p^ zbMD;hk-UG{-2GTfLqx8(?Li{)rik>l?GYj} zT|~|-^#qy%5g7xl2eyjHxj6*J80?XF9AJP0Kqp{{ZT}6l1!`=2wH-fX+jBEAj<*6_ z?&xWNi9U_%0aw}IR=@zDr){?Zs%^pcR|74a_HhRh=?Q#9R!@Lae7XvkC!}6dh)7GI zGwOM}O%ZNrM5F>(0G#R#weV>x{EkvWM4ABuft!J$KzE?hA*mOU9l#pkV_?29W=jE& zx(nzX(BCqr$BCDDWMgGG@Q2er$EhC#E^^vG$B4yNz~jI!hc9kf23(mS?kj)|A+lcg z=}YbbB62729Qw9hYywsSJ8U@_4TWl;KiPO42z)6b3xEm6n00v`c|8!eGab7S5Rn$Z z4B#H8yVmx72y6i^MJL?Fj;%yJZxtFMqk&t{HR(oRu!xK?#(W&{=z$Sq$0h{OZSot3 z=5OE`pd&CA_!_7u-0lAY-bQz$i-FIau?AprL-#G_&T5$a67Ou zLbH>5P;RBcjTw?1>(PZQi;9a0c1Ya0# z0e%A30@tG61TZC&rDkBa(407T5IY2tlogJQhn)U3XecZ$P_AFgDqjM?ClfVS0J>-&X-6 zJ-TLO_uggb7Fg=Z8{kLaET=s+Mi|t@Hh?4S6-U6+0pp#W@t3@}QtHwc_|w+sIXVps zq2CoZ5pvPSskaUocax$Tat}SFL^oi&uZJ;a5qclsBPS7xV}RBn^$fZ=^%|nH#A2f> zSp#(O#>S(0gNr5`piRKI@#L8Rno_}#okOGN8e=v9Q$6~eG`Scdu-&Ow16yOrEEcw+ zYml!;2G4r^A|lOQf?|ZgHmBYV4TEC=gBl>?`rC2{jM)#o?{zl{gQOl16au@^Z4mVQ zzBGo+V&F&A<1!ySHippoFRf7+G}!};F%7_{w%HGT6NOx4CdGX8ay5g6A$0A%c4806 z7XqM1Y0$fZTY)(-tBwq1wb1O=g;*KWKM#7KnxA)82S4Wa2kHg(>N9)=3J z0ghXy0oOV0*%A8x;PIXvI}=3TXoJJNH-dJGL-!c)K#3;513k2@wC#GJSAd*twX;Vz1trS{FZRy4d`lrIxv~W>(RIv3wY-Mnb#ySK>q*% z=f-$&C7KXrcn+b*>MGz~;B)KJVH4j8yan_@uhm_H)&q~`)4}S|D?s*5NenPFKtSJ^ z53c~Gd%Sh%<>?@F(Yy+{6PSp8_!wa)eX8yE*N;8^8_c6azX1Jjb7}H@8w^T)!;+y! zFvipaV?|^M@B+G?v_p@n@kD?EaJSh+0eGwpLn1<1TFi3bF|?I5p+gfZqYFik{WMehvV zKS)%eSMs1)=XSDxkXT@h*_rft4uU+OQ7T-r5D0?N*RtG}C*bJ6Mmhlpj4}HPl^p{A zAOv0r6ygB|8z2ZqPm@h~%TWmWP}<-&@|^}Z1Tcr4yN^dq1HK@eQ!GH!^P>>EScF1E zt_H3_7o<;&F=5Bf;}#-P1spNP)aH!kGr<2HC&Yh+qfj Date: Wed, 13 Sep 2023 23:08:34 +0200 Subject: [PATCH 3/3] chore(deps): remove unused dependencies Now that we no more include static files we can remove: - wai-middleware-static-embedded - file-embed --- app/Main.hs | 7 +------ mat-chalmers.cabal | 3 --- shell.nix | 8 +++----- stack.yaml | 1 - 4 files changed, 4 insertions(+), 15 deletions(-) diff --git a/app/Main.hs b/app/Main.hs index 618d9ae..2a7ae46 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -2,8 +2,7 @@ module Main ( main - ) -where + ) where import Control.Concurrent ( MVar , newMVar @@ -19,7 +18,6 @@ import Control.Monad.Log ( defaultBatchingOptio ) import Control.Monad.Reader ( runReaderT ) import Control.Monad.Trans ( liftIO ) -import Data.FileEmbed ( embedDir ) import Data.IORef ( IORef , readIORef ) @@ -33,7 +31,6 @@ import Lens.Micro.Platform ( (<&>) ) import Network.HTTP.Client.TLS ( newTlsManager ) import Network.Wai.Middleware.RequestLogger ( logStdout ) -import Network.Wai.Middleware.StaticEmbedded ( static ) import System.Console.GetOpt ( ArgDescr(..) , ArgOrder(..) , OptDescr(..) @@ -115,7 +112,5 @@ serve -> IO () serve conf viewRef upd = scotty (view cPort conf) $ do middleware logStdout - middleware (static $(embedDir "static")) get "/" ((html . render) =<< liftIO (readIORef viewRef)) get "/r" (liftIO (tryPutMVar upd ()) >> redirect "/") -- force update - diff --git a/mat-chalmers.cabal b/mat-chalmers.cabal index 2e351a9..f051ed8 100644 --- a/mat-chalmers.cabal +++ b/mat-chalmers.cabal @@ -38,7 +38,6 @@ library , tagsoup == 0.14.8 , text == 1.2.4.1 , bytestring == 0.10.12.0 - , file-embed , thyme , word8 == 0.1.3 @@ -49,7 +48,6 @@ executable mat-chalmers build-depends: mat-chalmers , base >= 4.7 , bytestring - , file-embed , http-client-tls == 0.3.5.3 , microlens-platform , logging-effect @@ -57,7 +55,6 @@ executable mat-chalmers , scotty , time == 1.9.3 , wai-extra - , wai-middleware-static-embedded == 0.1.0.0 , async >= 2.1.1 default-language: Haskell2010 diff --git a/shell.nix b/shell.nix index 84e1ccf..e822ff5 100644 --- a/shell.nix +++ b/shell.nix @@ -5,10 +5,9 @@ let inherit (nixpkgs) pkgs; f = { mkDerivation, aeson, base, bytestring, css-text, errors - , exceptions, file-embed, heredoc, http-client, http-client-tls + , exceptions, heredoc, http-client, http-client-tls , logging-effect, lucid, microlens-platform, mtl, old-locale , prettyprinter, safe, scotty, stdenv, text, thyme, time, wai-extra - , wai-middleware-static-embedded }: mkDerivation { pname = "mat-chalmers"; @@ -19,14 +18,13 @@ let buildTools = [ haskellPackages.cabal-install ]; enableSeparateDataOutput = true; libraryHaskellDepends = [ - aeson base bytestring css-text errors exceptions file-embed heredoc + aeson base bytestring css-text errors exceptions heredoc http-client logging-effect lucid microlens-platform mtl old-locale prettyprinter safe text thyme ]; executableHaskellDepends = [ - base bytestring file-embed http-client-tls logging-effect + base bytestring http-client-tls logging-effect microlens-platform mtl scotty time wai-extra - wai-middleware-static-embedded ]; license = stdenv.lib.licenses.mit; }; diff --git a/stack.yaml b/stack.yaml index bfa1c8b..df28887 100644 --- a/stack.yaml +++ b/stack.yaml @@ -2,7 +2,6 @@ resolver: lts-18.28 packages: - "." extra-deps: - - wai-middleware-static-embedded-0.1.0.0@sha256:036b7823a5e69452d1fe1e270ef3d4988063caa5bb00b6dfc356e1c21b7433e3 - logging-effect-1.3.12@sha256:72d168dd09887649ba9501627219b6027cbec2d5541931555b7885b133785ce3,1679 ghc-options: { "$locals": -ddump-to-file -ddump-hi }