anchor.diff:  (defun page-title (title)
     (<:title (concatenate 'string title " | scrumli")))
   
  +(defun css (&rest sheets)
  +  (apply 'concatenate 'string
  +         (mapcar (lambda (s)
  +                   (<:link :href s :rel "stylesheet" :type "text/css"))
  +                 sheets)))
  +
  +(defun js (&rest scripts)
  +  (apply 'concatenate 'string
  +         (mapcar (lambda (s)
  +                   (<:script :type "text/javascript" :src s))
  +                 scripts)))
  +
  +(defmacro navbar (&body body)
  +  `(<:div :class "navbar navbar-static-top navbar-inverse"
  +          (<:div :class "navbar-inner"
  +                 (<:div :class "container"
  +                        (<:a :class "brand" "scrumli")
  +                        ,@body))))
  +
   (define-route main ("")
     (if (logged-in-p)
         (<:html
          (<:head (page-title "Backlog")
  -               (<:link :href *scrumelo-bootstrap-css-location*
  -                       :rel "stylesheet" :type "text/css")
  -               (<:link :href *scrumelo-font-awesome-css-location*
  -                       :rel "stylesheet" :type "text/css")
  -               (<:script :type "text/javascript"
  -                         :src *scrumelo-bootstrap-js-location*)
  -               (<:script :type "text/javascript"
  -                         :src *scrumelo-jquery-js-location*)
  -               (<:script :type "text/javascript"
  -                         :src *scrumelo-react-js-location*)
  -               (<:script :type "text/javascript"
  -                         :src *scrumelo-jsxtransformer-js-location*))
  +               (css *scrumli-bootstrap-css-location*
  +                    *scrumli-font-awesome-css-location*)
  +               (js *scrumli-bootstrap-js-location*
  +                   *scrumli-jquery-js-location*
  +                   *scrumli-react-js-location*
  +                   *scrumli-jsxtransformer-js-location*))
          (<:body
  -        (<:div :class "navbar navbar-static-top navbar-inverse"
  -               (<:div :class "navbar-inner"
  -                      (<:div :class "container"
  -                             (<:a :class "brand" "scrumli")
  -                             (<:div :class "pull-right"
  -                                    (<:span :class "navbar-text"
  -                                            (hunchentoot:session-value
  -                                             :username))
  -                                    (<:ul :class "nav pull-right"
  -                                          (<:li :class "divider-vertical")
  -                                          (<:li (<:a :href "/logout"
  -                                                     "Logout")))))))
  +        (navbar (<:div :class "pull-right"
  +                       (<:span :class "navbar-text"
  +                               (hunchentoot:session-value :username))
  +                       (<:ul :class "nav pull-right"
  +                             (<:li :class "divider-vertical")
  +                             (<:li (<:a :href (genurl 'logout-page)
  +                                        "Logout"))
  +                             (<:li :class "divider-vertical"))))
           (<:div :class "container"
                  (<:h1 "Backlog")
                  (<:div :id "content")
  -               (<:script :type "text/jsx" :src "js/main.js"))))
  +               (<:script :type "text/jsx" :src (genurl 'main-js)))))
         (redirect 'login-page)))
   
  -(define-route react-ui ("js/main.js"
  -                        :content-type "application/ecmascript")
  -  (merge-pathnames "js/main.js" *static-directory*))
  -
  -(define-route login-js ("js/login.js"
  -                        :content-type "application/ecmascript")
  -  (merge-pathnames "js/login.js" *static-directory*))
  +(defmacro serve-static (name relpath)
  +  `(define-route ,name (,relpath :content-type "application/ecmascript")
  +     (merge-pathnames ,relpath *static-directory*)))
  +
  +(serve-static main-js "js/main.js")
  +(serve-static login-js "js/login.js")
   
   (define-route stories-json ("stories" :content-type "text/json")
     (if (logged-in-p)
  
positive.code: (defvar *scrumli-host* "http://localhost:8080"
    "The host currently running Scrumli. Used by Mozilla Persona.")
  
  (defvar *scrumelo-bootstrap-css-location*
    "http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.no-icons.min.css"
    "The location of the twitter bootstrap CSS file.")
  
  (defvar *scrumelo-bootstrap-js-location*
    "http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"
    "The location of the twitter bootstrap JS file.")
  
  (defvar *scrumelo-font-awesome-css-location*
    "http://netdna.bootstrapcdn.com/font-awesome/3.1.1/css/font-awesome.min.css"
    "The location of the font awesome CSS file.")
  
  (defvar *scrumelo-jquery-js-location*
    "http://code.jquery.com/jquery-2.0.0.min.js"
    "The location of the jQuery JS file.")
  
  (defvar *scrumelo-react-js-location*
    "http://cdnjs.cloudflare.com/ajax/libs/react/0.3.2/react.min.js"
    "The location of the React JS file.")
  
  (defvar *scrumelo-jsxtransformer-js-location*
    "http://cdnjs.cloudflare.com/ajax/libs/react/0.3.2/JSXTransformer.js"
    "The location of the JSX Transformer JS file.")
  
  
negative.code:         (encode-json (get-all-stories) out))
        403))
  
  (defmacro with-post-parameters (parameters &body body)
    `(let ,(mapcar (lambda (p)
                     (list (intern (string-upcase p))
                           `(hunchentoot:post-parameter ,p)))
                   parameters)
       ,@body))
  
  (define-route stories-new ("stories/new" :method :post)
    (if (logged-in-p)
        (with-post-parameters ("role" "necessity" "headline" "content")
          (post-story role necessity headline content
                      (hunchentoot:session-value :username))
          200)
        403))
  
  (define-route tasks-new ("stories/tasks/new" :method :post)
    (if (logged-in-p)
        (with-post-parameters ("storyId" "description")
          (post-task storyid description
                     (hunchentoot:session-value :username))
          200)
        403))
  
  