packages feed

hpaste-1.2.0: src/Hpaste/View/Style.hs

{-# OPTIONS -Wall #-}
{-# LANGUAGE OverloadedStrings #-}

-- | Page style.

module Hpaste.View.Style
  (style)
  where

import Data.Monoid.Operator ((++))
import Data.Text.Lazy       (Text)
import Prelude              hiding ((++))
import Language.CSS

-- | Side-wide style sheet.
style :: Text
style = renderCSS $ runCSS $ do
  layout
  sections
  paste
  utils
  highlighter
  hints
  form
  home
  browse
  footer
  activity
  ircEntries
  
-- | IRC log entries.
ircEntries :: CSS Rule
ircEntries = do
  classRule "irc-entries" $ do
    marginLeft "0"
    paddingLeft "0"
    listStyle "none"
    rule ".current" $ do
      fontWeight "bold"
      marginTop "1em"
      marginBottom "1em"

-- | Footer.
footer :: CSS Rule
footer = do
  classRule "footer" $ do
    textAlign "center"
    rule "a" $ do 
      textDecoration "none"
    rule "a:hover" $ do
      textDecoration "underline"

-- | General layout styles.
layout :: CSS Rule
layout = do
  rule "body" $ do
    fontFamily "'DejaVu Sans', sans-serif"
    fontSize "13px"
    textAlign "center"
    
  classRule "logo" $ do
    margin "1em 0 1em 0"
    border "0"
    background "url(/css/hpaste.png) no-repeat"
    width "190px"
    height "50px"
    display "block"
    textIndent "-999px"
  
  classRule "wrap" $ do
    margin "auto"
    textAlign "left"
    
  classRule "nav" $ do
    float "right"
    marginTop "1em"

-- | Paste form.
form :: CSS Rule
form = do
  inputs
  classRule "spam" $ do
    display "none"
  classRule "errors" $ do
    color "#743838"
    fontWeight "bold"

-- | Input style.
inputs :: CSS Rule
inputs =
  rule "form p label" $ do
    rule "textarea" $ do
      width "100%"
      height "20em"
      clear "both"
      margin "1em 0 0 0"
         
    rule "textarea, input.text" $ do
      border "2px solid #ddd"
      borderRadius "4px"
    rule "textarea:focus, input.text:focus" $ do
      background "#eee"
      
    rule "span" $ do
      float "left"
      width "7em"
      display "block"

-- | Section styles.
sections :: CSS Rule
sections = do
  classRule "section" $ do
    borderRadius "5px"
    padding "10px"
    border "3px solid #000"
    margin "0 0 0.5em 0"
     
    rule "h2" $ do
      margin "0"
      fontSize "1.2em"
      padding "0"
  
  classRule "section-dark" $ do
    background "#453D5B"
    borderColor "#A9A0D2"
    color "#FFF"

    rule "h2" $ do
      color "#FFF"
    
    rule "a" $ do
      color "#8ae0c2"
      textDecoration "none"

    rule "a:hover" $ do
      textDecoration "underline"

  classRule "section-light" $ do
    background "#FFF"
    borderColor "#EEE"
    color "#000"

    rule "h2" $ do
      color "#2D2542"
   
  classRule "section-error" $ do
    background "#FFDFDF"
    color "#5b4444"
    border "1px solid #EFB3B3"

    rule "pre" $ do
      margin "0"
    rule "h2" $ do
      color "#2D2542"
   
  classRule "section-warn" $ do
    background "#FFF9C7"
    color "#915c31"
    border "1px solid #FFF178"
    rule "pre" $ do
      margin "0"
    rule "h2" $ do
      color "#2D2542"

-- | Paste view styles.
paste :: CSS Rule
paste = do
  classRule "paste-specs" $ do
    margin "0.5em 0 0 0"
    padding "0"
    listStyle "none"
    lineHeight "1.5em"
    
    rule "strong" $ do
      fontWeight "normal"
      width "8em"
      display "block"
      float "left"
  rule ".revisions" $ do
    listStyleType "none"
    paddingLeft "0"
  classRule "paste-nav" $ do
    float "right"

-- | Utility styles to help with HTML weirdness.
utils :: CSS Rule
utils = do
  classRule "clear" $ do
    clear "both"

-- | A short-hand for prefixing rules with ‘.amelie-’.
classRule :: Text -> CSS (Either Property Rule) -> CSS Rule
classRule = rule . (".amelie-" ++)

-- | Styles for the highlighter.
highlighter :: CSS Rule
highlighter = do
  diff

  classRule "steps" $ do
    marginTop "1em"
  classRule "steps-expr" $ do
    rule ".text" $ do
      width "300px"

  classRule "code" $ do
    tokens

    rule "pre" $ do
      margin "0"

    rule "td" $ do
      verticalAlign "top"
  lineNumbers
  
-- | Style for diff groups.
diff :: CSS Rule
diff = do
  classRule "diff-both" $
    return ()
  classRule "diff-first" $ do
    backgroundColor "#FDD"
    color "#695B5B"
  classRule "diff-second" $ do
    backgroundColor "#DFD"

-- | Tokens colours and styles.
tokens :: CSS (Either Property Rule)
tokens = do
  rule "pre" $ do
    marginTop "0"
    tokenColor "comment" "#555"
    tokenColor "keyword" "#397460"
    tokenColor "str" "#366354"
    tokenColor "conid" "#4F4371"
    tokenColor "varop" "#333"
    tokenColor "varid" "#333"
    tokenColor "num" "#4F4371"
  rule "pre" $ do
    rule ".diff" $ do
      color "#555"
    rule "code" $ do
      jcolor "title" "#333"
      jcolor "string" "#366354"
      jcolor "built_in" "#397460"
      jcolor "preprocessor" "#4F4371"
      jcolor "comment" "#555"
      jcolor "command" "#397460"
      jcolor "special" "#333"
      jcolor "formula" "#4F4371"
      jcolor "keyword" "#397460"
      jcolor "number" "#4F4371"
      rule ".header" $ do
        color "#555"
      rule ".deletion" $ do
        backgroundColor "#FDD"
        color "#695B5B"
      rule ".addition" $ do
        backgroundColor "#DFD"
        color "#000"
  where token name props = rule (".hs-" ++ name) $ props
        tokenColor name col = token name $ color col
        jcolor name col = rule ("." ++ name) $ color col

-- | The line number part.
lineNumbers :: CSS Rule
lineNumbers = do
  rule ".amelie-line-nums pre" $ do
    margin "0 1em 0 0"
    textAlign "right"
    rule "a" $ do
      textDecoration "none"
      color "#555"
    rule "a:target" $ do
      textDecoration "underline"
      color "#000"

-- | Home page styles.
home :: CSS Rule
home = do
  rule "#new" wrap
  classRule "browse-link" $ do
    margin "1em 0 0 0"
  classRule "latest-pastes" $ do
    marginTop "0.5em"
  
  where wrap = rule ".amelie-wrap" $ do
                 width "50em"

-- | Browse page styles.
browse :: CSS Rule
browse = do
  rule ".pages-list" $ do
    rule "li" $ do
      display "inline"
      marginRight "1em"
    rule "a.active" $ do
      fontWeight "bold"
      color "#fff"
      cursor "default"

  classRule "pagination" $ do
    textAlign "center"
    margin "1em"

    rule ".amelie-inner" $ do
      margin "auto"
      width "15em"

-- | Developer activity page styles.
activity :: CSS Rule
activity = do
  rule "#activity" $ do
    rule ".amelie-wrap" $ do
      width "50em"

-- | Hlint hints
hints :: CSS Rule
hints = do
  classRule "hint-highlight" $ do
    background "#333"
    color "#999"
    border "1px solid #444"