.hero-unit
  h1 Trello calendar
  p Trello calendar is a tool to show your cards with a due date on a calendar and provide ICS feed.
  p
    a.btn.btn-large.btn-primary(href='/login') Login with Trello

footer
  p This service is not affilied with trello.
  p
    | © 2012 François de Metz
    br
    | This website is a free software. Fork
    a(href="https://github.com/francois2metz/trello-calendar") trello-calendar
    |  on github.

Improve the homepage with features.

.container-fluid
  .hero-unit
    h1 Trello calendar
    p Show your cards with a due date on a calendar and provide ICS feed.
    p
      a.btn.btn-large.btn-primary(href='/login') Login with Trello

  section.row-fluid
    .span4
      h2 Features
      ul
        li Show cards from your trello boards with a due date
        li Filter cards by boards
        li Show only cards assigned to you
        li Hide archived cards
        li Update due date by drag'n drop
    .span4
      h2 ICS feed
      p
        | The ICS feed allows you to show your cards on Google calendar or Thunderbird Lightning for example.
    .span4
      h2 Security
      p No data are stored on our server.
      p We ask for both read and write permissions. The write permission is to be able to update due date on cards.

  footer
    p This service is not affilied with
      a(href="https://trello.com") trello
      .
    p
      | © 2012 François de Metz
      br
      | This website is a free software. Fork
      a(href="https://github.com/francois2metz/trello-calendar") trello-calendar
      |  on github.


doctype html
html(lang='en')
  head
    meta(charset='utf-8')
    title ShieldBattery
    block headScripts
    script(type='text/javascript', src='/scripts/client.js', defer, async)
    link(href='https://fonts.googleapis.com/css?family=Roboto:300,400,500|Material+Icons',
        rel='stylesheet', type='text/css')
    link(href='/styles/site.css', rel='stylesheet', type='text/css')
    link(rel='icon', type='image/x-icon', href='/images/favicon.ico')
  body
    block content

Remove our dependency on material icon fonts.

doctype html
html(lang='en')
  head
    meta(charset='utf-8')
    title ShieldBattery
    block headScripts
    script(type='text/javascript', src='/scripts/client.js', defer, async)
    link(href='https://fonts.googleapis.com/css?family=Roboto:300,400,500',
        rel='stylesheet', type='text/css')
    link(href='/styles/site.css', rel='stylesheet', type='text/css')
    link(rel='icon', type='image/x-icon', href='/images/favicon.ico')
  body
    block content


.typeahead-suggestion
  a(href="#")
    .icon
      if object_type === 'service'
        span.icon-icon-browse
      else
        - root_id = root_services.length ? root_services[0] : 0
        div(class="color-ball service-background-color-#{root_id}")
    = t_attr(name)

Fix suggestion template for events.

.typeahead-suggestion
  a(href="#")
    .icon
      if object_type === 'service'
        span.icon-icon-browse
      else if object_type === 'event'
        span.icon-icon-events
      else if object_type === 'unit'
        - root_id = root_services.length ? root_services[0] : 0
        div(class="color-ball service-background-color-#{root_id}")
    = t_attr(name)


div.navbar.navbar-inverse.navbar-static-top(role='navigation')
  div.container
    button.navbar-toggle(type='button', data-toggle='collapse', data-target='.navbar-collapse')
      span.sr-only Toggle navigation
      span.icon-bar
      span.icon-bar
      span.icon-bar
    a.navbar-brand(href="/") Downtime
    div.collapse.navbar-collapse
      ul.nav.navbar-nav
        if user
          li
            a(href="/dashboard") Dashboard
          li
            a(href="/create") Monitor a Website
        li
          a(href="#about") About
      ul.nav.navbar-nav.navbar-right
        if !user
          li
            a(href="/auth/github") Login With Gitub
        else
          li.dropdown
            a.dropdown-toggle(href="/account" data-toggle="dropdown")
              != user.name + ' <img src="//www.gravatar.com/avatar/' + user.gravatar + '?s=24" /> '
              span.caret
            ul.dropdown-menu(role="menu")
              li
                a(href="/logout") Logout

Drop about button from navbar.

div.navbar.navbar-inverse.navbar-static-top(role='navigation')
  div.container
    button.navbar-toggle(type='button', data-toggle='collapse', data-target='.navbar-collapse')
      span.sr-only Toggle navigation
      span.icon-bar
      span.icon-bar
      span.icon-bar
    a.navbar-brand(href="/") Downtime
    div.collapse.navbar-collapse
      ul.nav.navbar-nav
        if user
          li
            a(href="/dashboard") Dashboard
          li
            a(href="/create") Monitor a Website
      ul.nav.navbar-nav.navbar-right
        if !user
          li
            a(href="/auth/github") Login With Gitub
        else
          li.dropdown
            a.dropdown-toggle(href="/account" data-toggle="dropdown")
              != user.name + ' <img src="//www.gravatar.com/avatar/' + user.gravatar + '?s=24" /> '
              span.caret
            ul.dropdown-menu(role="menu")
              li
                a(href="/logout") Logout


extends layout

block prepend title
  | #{ page.title } -

block header
  include author
  a.back(href='/') << back to index
  h1= page.title
  p
    | written by:
    mixin author(page.metadata.author)

block content
  article.post
    section.content!= page.html

Add a cyclic dep in example site

extends layout

block prepend title
  | #{ page.title } -

block header
  include author
  a.back(href=contents.index.url) << back to index
  h1= page.title
  p
    | written by:
    mixin author(page.metadata.author)

block content
  article.post
    section.content!= page.html


section.screencasts.inspector.column-contain(itemscope, itemtype="http://schema.org/WebApplication")
  h2(itemprop="name") Marionette Inspector - Chrome Extension

  ul
    li
      .col-2-3
        a.link(itemprop="url", href="http://chrome.google.com/webstore/detail/marionette-inspector/fbgfjlockdhidoaempmjcddibjklhpka", target= "_blank")
          img.thumbnail.left(itemprop="image", src="images/screenshots/inspector-screenshots.gif", alt="Marionette Inspector")

      .col-1-3.right
        p.description(itemprop="description").
          A world-class inspector for exploring your application's views, models, events and more. You won't know how you got by without it.

        a.btn.btn-action(itemprop="downloadUrl", href="http://chrome.google.com/webstore/detail/marionette-inspector/fbgfjlockdhidoaempmjcddibjklhpka", target="_blank") Install Now
        a.btn.btn-action.secondary-color(href="inspector") Learn More

Add missing Inspetor properties - 'operating system' is required - 'application cateogry' better describes it Values based on Inspector home page within Google Web Store

section.screencasts.inspector.column-contain(itemscope, itemtype="http://schema.org/WebApplication")
  h2(itemprop="name") Marionette Inspector - Chrome Extension
  meta(itemprop="operatingSystem", content="Chrome")
  meta(itemprop="applicationCategory", content="Developer Tools")
  ul
    li
      .col-2-3
        a.link(itemprop="url", href="http://chrome.google.com/webstore/detail/marionette-inspector/fbgfjlockdhidoaempmjcddibjklhpka", target= "_blank")
          img.thumbnail.left(itemprop="image", src="images/screenshots/inspector-screenshots.gif", alt="Marionette Inspector")

      .col-1-3.right
        p.description(itemprop="description").
          A world-class inspector for exploring your application's views, models, events and more. You won't know how you got by without it.

        a.btn.btn-action(itemprop="downloadUrl", href="http://chrome.google.com/webstore/detail/marionette-inspector/fbgfjlockdhidoaempmjcddibjklhpka", target="_blank") Install Now
        a.btn.btn-action.secondary-color(href="inspector") Learn More


include ../mixins/_helpers
include ../mixins/_view_helpers
include ../mixins/_profile
include ../mixins/_admin

- var bodyClass = ""
- var pageTitle = "Stonecutter"
- var pageTitleDataL8n = "content:default/title"
- demoAppURL = demoAppURL || "http://thoughtworksinc.github.io/stonecutter-client"

block vars

doctype
html
  head
    meta(charset='utf-8')
    meta(http-equiv='X-UA-Compatible', content='IE=edge')
    title(data-l8n="#{pageTitleDataL8n}") #{pageTitle}
    meta(name="viewport", content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no")
    meta(name="format-detection", content="telephone=no")
    link(rel="shortcut icon" href="/stonecutter-favicon.ico")
    block headerMeta

    +stylesheetLinkTag("application","screen")
    +stylesheetLinkTag("theme","screen")

    block headerScripts

  body(class="#{bodyClass}")
    a.skip-link(href="#main") Skip navigation
    .header(role="banner")
      .header__inner.middle-container
        .header__logo
          span.visuallyhidden.clj--app-name Stonecutter
        nav.header-nav.clj--header-nav(role="navigation")
          block headerContent
    .main-content#main(role="main")
      block columns
      .columns
        block content
    script.
      document.addEventListener("touchstart", function(){}, true);
    block footerScripts

Add simple js script to add js class to html tag

include ../mixins/_helpers
include ../mixins/_view_helpers
include ../mixins/_profile
include ../mixins/_admin

- var bodyClass = ""
- var pageTitle = "Stonecutter"
- var pageTitleDataL8n = "content:default/title"
- demoAppURL = demoAppURL || "http://thoughtworksinc.github.io/stonecutter-client"

block vars

doctype
html
  head
    meta(charset='utf-8')
    meta(http-equiv='X-UA-Compatible', content='IE=edge')
    title(data-l8n="#{pageTitleDataL8n}") #{pageTitle}
    meta(name="viewport", content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no")
    meta(name="format-detection", content="telephone=no")
    link(rel="shortcut icon" href="/stonecutter-favicon.ico")
    script(type="text/javascript").
      document.getElementsByTagName('html')[0].className += ' js';
    block headerMeta

    +stylesheetLinkTag("application","screen")
    +stylesheetLinkTag("theme","screen")

    block headerScripts

  body(class="#{bodyClass}")
    a.skip-link(href="#main") Skip navigation
    .header(role="banner")
      .header__inner.middle-container
        .header__logo
          span.visuallyhidden.clj--app-name Stonecutter
        nav.header-nav.clj--header-nav(role="navigation")
          block headerContent
    .main-content#main(role="main")
      block columns
      .columns
        block content
    script.
      document.addEventListener("touchstart", function(){}, true);
    block footerScripts


extends layout

block content
    iframe(src="https://dashboard.graphdat.com/embed/e.39fc390b51?d-w=1&d-h=2&d-pad=5&d-header=0&d-legend=0&d-light=1&d-bg=000000&d-sg-reqresptime=0-1-1-1&d-sg-reqcount=0-0-1-1",
           width='100%', height='550', frameborder='0', style="margin-top:-20px;")
    br

    include _partials/footer

block last
    script.
        $(window).load(function() {
            $('ul.nav.navbar-nav li').each(function() { $(this).removeClass('active'); });
            $('li#extras').addClass('active');
            $('li#app').addClass('active');
        });

//- vim: ft=jade sw=4 sts=4 et:

Revert "tweaking app stats graphs"

extends layout

block content
    iframe(src="https://dashboard.graphdat.com/embed/e.39fc390b51?d-w=1&d-h=2&d-pad=5&d-header=0&d-legend=0&d-light=1&d-bg=000000&d-sg-reqresptime=0-0-1-1&d-sg-reqcount=0-1-1-1",
           width='100%', height='550', frameborder='0', style="margin-top:-20px;")
    br

    include _partials/footer

block last
    script.
        $(window).load(function() {
            $('ul.nav.navbar-nav li').each(function() { $(this).removeClass('active'); });
            $('li#extras').addClass('active');
            $('li#app').addClass('active');
        });

//- vim: ft=jade sw=4 sts=4 et:


.isic-header-wrapper
  .isic-icons-wrapper
    a.isic-link-home(title="Home", href="#")
      i.icon-home
      span Home
    a.isic-link-forum(title="Forum", href="#forum")
      i.icon-chat
      span Forum
    if datasetContributor
      a.isic-link-dataset-upload(title="Upload Dataset", href="#uploadDataset")
        i.icon-upload
        span Upload Dataset
    a.isic-link-studies(title="Annotation Studies", href="#studies")
      i.icon-eye
      span Annotation Studies
    a.isic-link-featuresets(title="Featuresets", href="#featuresets")
      i.icon-list
      span Featuresets
    a.isic-link-tasks(title="Your Tasks", href="#tasks")
      i.icon-check
      span Your Tasks
  .isic-current-user-wrapper
  .g-clear-both

Add a link to the annotation study results page

.isic-header-wrapper
  .isic-icons-wrapper
    a.isic-link-home(title="Home", href="#")
      i.icon-home
      span Home
    a.isic-link-forum(title="Forum", href="#forum")
      i.icon-chat
      span Forum
    if datasetContributor
      a.isic-link-dataset-upload(title="Upload Dataset", href="#uploadDataset")
        i.icon-upload
        span Upload Dataset
    a.isic-link-studies(title="Annotation Studies", href="#studies")
      i.icon-eye
      span Annotation Studies
    a.isic-link-study-results(title="Annotation Study Results", href="#studyResults")
      i.icon-pencil
      span Annotation Study Results
    a.isic-link-featuresets(title="Featuresets", href="#featuresets")
      i.icon-list
      span Featuresets
    a.isic-link-tasks(title="Your Tasks", href="#tasks")
      i.icon-check
      span Your Tasks
  .isic-current-user-wrapper
  .g-clear-both


extends ../includes/layout.jade

block head
	title #{metadata.title} - strugee.net

block content
	article.h-entry(itemscope, itemtype='http://schema.org/BlogPosting')
		h1.p-name= metadata.title
		p Published by #[a.p-author.h-card(href='https://strugee.net/', rel='author')= metadata.author]
		.e-content!= text

Add webmention and pingback URLs

extends ../includes/layout.jade

block head
	title #{metadata.title} - strugee.net
	link(rel='pingback', href='https://webmention.io/strugee.net/xmlrpc')
	link(rel='webmention', href='https://webmention.io/strugee.net/webmention')

block content
	article.h-entry(itemscope, itemtype='http://schema.org/BlogPosting')
		h1.p-name= metadata.title
		p Published by #[a.p-author.h-card(href='https://strugee.net/', rel='author')= metadata.author]
		.e-content!= text


doctype html
html
  head
    title= title
    link(rel='stylesheet', href='/stylesheets/style.css')
    script(src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.js")
    script(src="/javascripts/studies.js")
  body
    h1 #{title}
    input(id="new" type="button", size="30", value="New Study")
    table#list
      tbody

Switch to newer jQuery version

doctype html
html
  head
    title= title
    link(rel='stylesheet', href='/stylesheets/style.css')
    script(src="https://code.jquery.com/jquery-1.12.0.js")
    script(src="/javascripts/studies.js")
  body
    h1 #{title}
    input(id="new" type="button", size="30", value="New Study")
    table#list
      tbody


h1 #{__i('Folders')}

include includes/toolbox

ul.folders
  - each folder in folders
    li(class=folder.type)
      a(href=basepath + "/folder/" + folder.id)= folder.name

Add link to recent changes

h1 #{__i('Folders')}

include includes/toolbox

ul.folders
  - each folder in folders
    li(class=folder.type)
      a(href=basepath + "/folder/" + folder.id)= folder.name
      a(href=basepath + "/recentchanges/" + folder.id).recentchanges [Recent changes]


extends ../layout

block content
	.content
		.container.wiki
			.row
				.col-xs-3.contents
					| !{contents.content}
				.col-xs-8.page
					.page-header
						- if (page.title == "Main Page")
							h1 ShareLaTeX Documentation
						- else
							h1 #{page.title}

					| !{page.content}

Add card around wiki content to make it stand out

extends ../layout

block content
	.content.content-alt
		.container.wiki
			.row
				.col-xs-3.contents
					| !{contents.content}
				.col-xs-9.page
					.card
						.page-header
							- if (page.title == "Main Page")
								h1 ShareLaTeX Documentation
							- else
								h1 #{page.title}

						| !{page.content}


doctype html
html(lang="en")
    head
        meta(charset = "UTF-8")
        meta(
            name    = "viewport",
            content = "width = device-width, initial-scale = 1, maximum-scale = 1, user-scalable = no"
        )
        title
            | Maestro

        //- CSS Includes
        link(
            rel  = "stylesheet",
            href = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"
        )

        //- Custom CSS
        link(
            rel  = "stylesheet",
            type = "text/css",
            href = "styles/stdtheme.css"
        )

        //- JS includes
        script(src = "http://code.jquery.com/jquery-1.11.3.min.js")
        script(src = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js")

        //- Custom JS
        script(src = "js/app.js")

    body
        .container-fluid
            include ./views/header.jade

Add comment on header include

doctype html
html(lang="en")
    head
        meta(charset = "UTF-8")
        meta(
            name    = "viewport",
            content = "width = device-width, initial-scale = 1, maximum-scale = 1, user-scalable = no"
        )
        title
            | Maestro

        //- CSS Includes
        link(
            rel  = "stylesheet",
            href = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"
        )

        //- Custom CSS
        link(
            rel  = "stylesheet",
            type = "text/css",
            href = "styles/stdtheme.css"
        )

        //- JS includes
        script(src = "http://code.jquery.com/jquery-1.11.3.min.js")
        script(src = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js")

        //- Custom JS
        script(src = "js/app.js")

    body
        .container-fluid
            //- Header
            include ./views/header.jade


.qi-subtable-title Tumor Extent

.qi-panel.qi-nested(ng-controller='TumorExtentCtrl')
  .qi-ver-space
    table.table.qi-table
      tr
        th Length
        td {{ extent.length }} mm
      tr
        th Width
        td {{ extent.width }} mm
      tr
        th Depth
        td {{ extent.depth }} mm

Hide rows with null values in tumor extent panel.

.qi-subtable-title Tumor Extent

.qi-panel.qi-nested(ng-controller='TumorExtentCtrl')
  .qi-ver-space
    table.table.qi-table
      tr(ng-show="extent.length != null")
        th Length
        td {{ extent.length }} mm
      tr(ng-show="extent.width != null")
        th Width
        td {{ extent.width }} mm
      tr(ng-show="extent.depth != null")
        th Depth
        td {{ extent.depth }} mm


section#about
  h2.title About
  img.profile(src="/images/profileRot.jpg")
  p.longBio
    em Hello there!
    |  I'm Grant Timmerman, a student,
    = ' '
    a(href='http://en.wikipedia.org/wiki/Maker_culture') maker
    | , and web entrepreneur currently studying
    = ' '
    a(href='http://www.cs.washington.edu/') Computer Science
    = ' '
    | at the
    = ' '
    a(href='http://www.washington.edu/') University of Washington
    | . I love making beautiful user experiences and tackling algorithmic challenges.
    br

Add alt attribute to profile picture

section#about
  h2.title About
  img.profile(src="/images/profileRot.jpg" alt="Grant Timmerman")
  p.longBio
    em Hello there!
    |  I'm Grant Timmerman, a student,
    = ' '
    a(href='http://en.wikipedia.org/wiki/Maker_culture') maker
    | , and web entrepreneur currently studying
    = ' '
    a(href='http://www.cs.washington.edu/') Computer Science
    = ' '
    | at the
    = ' '
    a(href='http://www.washington.edu/') University of Washington
    | . I love making beautiful user experiences and tackling algorithmic challenges.
    br


p Hello, #{name.first} #{name.last}

Add doctype, html, head, body

doctype html
html
  head
    meta(charset='utf-8')
    base(href='/')
    title #{meta.title}
    meta(name='description' content='#{meta.description}')
    meta(name='author' content='#{meta.author}')
  body
      p Hello, #{name.first} #{name.last}


template(name="tomeDetails")
	.container
		.col-xs-12.col-sm-12.col-md-6.col-lg-6
			h1 #{mangasName}
			h3 {{_ "by"}} #{author}
			.thumbnail
				img(src="#{cover}" alt="#{title}")
				.caption
					h3.text-center #{title}
					h4.text-center {{_ "tome"}} #{tomeNumber} - {{_ "version"}} : #{version}
					p {{_ "released"}} #{displayDate} {{_ "byEditor"}} #{editor}
					if owned
						p {{_ "inBiblio"}}
					else
						p {{_ "notInBiblio"}}
		if notOwned
			.col-xs-12.col-sm-12.col-md-6.col-lg-6
				h2 {{_ "actions"}}
				a(href="http://www.amazon.fr/s?field-keywords=#{isbn}" target="blank") {{_ "buyItOnAmazon"}}

Add text to set tome owned

template(name="tomeDetails")
	.container
		.col-xs-12.col-sm-12.col-md-6.col-lg-6
			h1 #{mangasName}
			h3 {{_ "by"}} #{author}
			.thumbnail
				img(src="#{cover}" alt="#{title}")
				.caption
					h3.text-center #{title}
					h4.text-center {{_ "tome"}} #{tomeNumber} - {{_ "version"}} : #{version}
					p {{_ "released"}} #{displayDate} {{_ "byEditor"}} #{editor}
					if owned
						p {{_ "inBiblio"}}
					else
						p {{_ "notInBiblio"}}
		if notOwned
			.col-xs-12.col-sm-12.col-md-6.col-lg-6
				h2 {{_ "buyTome"}}
				a(href="http://www.amazon.fr/s?field-keywords=#{isbn}" target="blank") {{_ "buyItOnAmazon"}}
				h2 {{_ "setOwnedTrue"}}


table.footable.table(data-filter="#filter")
    thead
        tr
            th(data-class="expand") Name
            th Version
            th Open signups
            th(data-type="numeric") Active users 6 months
            th(data-type="numeric", data-sort-initial="descending") Active users 1 month
            th(data-hide="phone", data-type="numeric") Total users
            th(data-hide="phone", data-type="numeric") Posts
    tbody
        - for (var i=0; i<data.length; i++)
            tr
                td!= ''+data[i].name+''
                td= (data[i].version.indexOf('head') === 0) ? '.develop' : data[i].version
                td= (data[i].registrations_open) ? 'Yes' : 'No'
                td= (data[i].active_users_halfyear) ? data[i].active_users_halfyear : '-'
                td= (data[i].active_users_monthly) ? data[i].active_users_monthly : '-'
                td= (data[i].total_users) ? data[i].total_users : '-'
                td= (data[i].local_posts) ? data[i].local_posts : '-'

Clean up version column for stable versions

table.footable.table(data-filter="#filter")
    thead
        tr
            th(data-class="expand") Name
            th Version
            th Open signups
            th(data-type="numeric") Active users 6 months
            th(data-type="numeric", data-sort-initial="descending") Active users 1 month
            th(data-hide="phone", data-type="numeric") Total users
            th(data-hide="phone", data-type="numeric") Posts
    tbody
        - for (var i=0; i<data.length; i++)
            tr
                td!= ''+data[i].name+''
                td= (data[i].version.indexOf('head') === 0) ? '.develop' : (data[i].version.indexOf('-') > -1) ? data[i].version.split('-')[0] : data[i].version
                td= (data[i].registrations_open) ? 'Yes' : 'No'
                td= (data[i].active_users_halfyear) ? data[i].active_users_halfyear : '-'
                td= (data[i].active_users_monthly) ? data[i].active_users_monthly : '-'
                td= (data[i].total_users) ? data[i].total_users : '-'
                td= (data[i].local_posts) ? data[i].local_posts : '-'


| {?name}
.background(style="background-image:url('http://cdn2.steampowered.com/v/gfx/apps/{id}/page_bg_generated.jpg')")
    .page-header
        h1 {name}
    .page-content
        .banner
            img(src='{header_image}')
        .categories
            h3 Categories
            ul
                | {#categories}
                li {description}
                | {/categories}
        .description
            h3 Description
            p {detailed_description|s}
        .genres
            h3 Genres
            ul
                | {#genres}
                li {description}
                | {/genres}
        .screenshots
            h3 Screenshots
            ul
                | {#screenshots}
                li
                    img.img-rounded(src='{path_thumbnail}')
                | {/screenshots}
| {:else}
.page-header
    h1 Loading
.page-content
    include tpl_loader
| {/name}

Remove background for now as it's ugly

| {?name}
//.background(style="background-image:url('http://cdn2.steampowered.com/v/gfx/apps/{id}/page_bg_generated.jpg')")
.background
    .page-header
        h1 {name}
    .page-content
        .banner
            img(src='{header_image}')
        .categories
            h3 Categories
            ul
                | {#categories}
                li {description}
                | {/categories}
        .description
            h3 Description
            p {detailed_description|s}
        .genres
            h3 Genres
            ul
                | {#genres}
                li {description}
                | {/genres}
        .screenshots
            h3 Screenshots
            ul
                | {#screenshots}
                li
                    img.img-rounded(src='{path_thumbnail}')
                | {/screenshots}
| {:else}
.page-header
    h1 Loading
.page-content
    include tpl_loader
| {/name}


#nav-menu.ui.menu.inverted.fixed(ng-show="display()")
    .ui.container
        .header.item Optimizer
        //.item(ui-sref="dashboard") Dashboard
        .item(ui-sref="spreadsheet") Spreadsheet
        .right.menu(ng-click="logout()")
            .item(ng-bind="$root.player.data.username")
            .item.logout
                i.icon.unlock.alternate

Fix the accidental click to logout,Explicit logout button. Add Mon statistical.

#nav-menu.ui.menu.inverted.fixed(ng-show="display()")
    .ui.container
        .header.item Optimizer
        //.item(ui-sref="dashboard") Dashboard
        .item(ui-sref="spreadsheet") Spreadsheet
        .right.menu
            .header.item(ng-bind="$root.player.data.username")
            .header.item mon : {{$root.inventory.pokemon.length}}/{{$root.player.data.max_pokemon_storage}}
            .item(ng-click="logout()")
                i.icon.unlock.alternate
                span Logout


extends ../layout
block content
    include ../partials/flyer
    #modal-dialog.modal
        .modal-dialog
            .modal-content
                .modal-header
                    a.close(href='/about', data-dismiss='modal', aria-hidden='true') ×
                    h3 You don't really want to delete your account, do you?
                .modal-body
                    p This will really delete all your data, including all your progress and brownie points.
                    p We won't be able to recover any of it for you later, even if you change your mind.
                    p If there's something we could do better, send us an email instead and we'll do our best:
                        a(href="mailto:team@freecodecamp.com") team@freecodecamp.com
                        | .
                .modal-footer
                    a.btn.btn-success.btn-block(href='/about', data-dismiss='modal', aria-hidden='true')
                        | Nevermind, I don't want to delete all of my progress
                    .spacer
                    form(action='/account/delete', method='POST')
                        input(type='hidden', name='_csrf', value=_csrf)
                        button.btn.btn-danger.btn-block(type='submit')
                            | I am 100% sure I want to delete my account and all of my progress
    script.
      document.addEventListener('DOMContentLoaded', function() {
        const modal$ = document.getElementById('modal-dialog');
        modal$.classList.add('show');
      });

Update Redirect when cancelling to remove account

extends ../layout
block content
    include ../partials/flyer
    #modal-dialog.modal
        .modal-dialog
            .modal-content
                .modal-header
                    a.close(href='/settings', data-dismiss='modal', aria-hidden='true') ×
                    h3 You don't really want to delete your account, do you?
                .modal-body
                    p This will really delete all your data, including all your progress and brownie points.
                    p We won't be able to recover any of it for you later, even if you change your mind.
                    p If there's something we could do better, send us an email instead and we'll do our best:
                        a(href="mailto:team@freecodecamp.com") team@freecodecamp.com
                        | .
                .modal-footer
                    a.btn.btn-success.btn-block(href='/settings', data-dismiss='modal', aria-hidden='true')
                        | Nevermind, I don't want to delete all of my progress
                    .spacer
                    form(action='/account/delete', method='POST')
                        input(type='hidden', name='_csrf', value=_csrf)
                        button.btn.btn-danger.btn-block(type='submit')
                            | I am 100% sure I want to delete my account and all of my progress
    script.
      document.addEventListener('DOMContentLoaded', function() {
        const modal$ = document.getElementById('modal-dialog');
        modal$.classList.add('show');
      });


h2.md-title(layout-align="center end") CHOOSE YOUR PROJECT

div(ng-show='filteredBoards.length')
    h3 Your projects
    md-grid-list(md-cols="5" md-gutter="1em" md-row-height="4:3")
        md-grid-tile(style="background-color:#f5f5f5;cursor:pointer;" ng-repeat="board in filteredBoards = (boards | filter:{idOrganization:'!'})" ng-click="selectBoard(board.id)") {{board.name}}

div(ng-repeat='organization in organizations')
    h3 {{organization.name}}
    md-grid-list(md-cols="5" md-gutter="1em" md-row-height="4:3")
        md-grid-tile.project-tile.clickable(ng-repeat="board in boards | filter:board.idOrganization=organization.id" ng-click="selectBoard(board.id)") {{board.name}}

Correct once more to use less styles

h2.md-title(layout-align="center end") CHOOSE YOUR PROJECT

div(ng-show='filteredBoards.length')
    h3 Your projects
    md-grid-list(md-cols="5" md-gutter="1em" md-row-height="4:3")
        md-grid-tile.project-tile.clickable(ng-repeat="board in filteredBoards = (boards | filter:{idOrganization:'!'})" ng-click="selectBoard(board.id)") {{board.name}}

div(ng-repeat='organization in organizations')
    h3 {{organization.name}}
    md-grid-list(md-cols="5" md-gutter="1em" md-row-height="4:3")
        md-grid-tile.project-tile.clickable(ng-repeat="board in boards | filter:board.idOrganization=organization.id" ng-click="selectBoard(board.id)") {{board.name}}


extends layout

block content
  row
    .col-md-8
      h1= "Preview "+blog.name
    .col-md-4
      div.btn-group(role="group" class="pull-right")
        if (edit)
          button.btn.btn-default.btn-lg
            a(href="#{layout.htmlroot}/blog/#{blog.id}/preview?lang=#{lang}") Edit Off
        else
          button.btn.btn-default.btn-lg
            a(href="#{layout.htmlroot}/blog/#{blog.id}/preview?edit=true&lang=#{lang}") Edit
        button.btn.btn-default.btn-lg
          a(href="#{layout.htmlroot}/blog/#{blog.id}/preview?download=true&lang=#{lang}") Download

  row
    .col-md-12
      if (preview)
        :verbatim
          !{preview}

Edit in Blog Preview now goes to Blog Page.

extends layout

block content
  row
    .col-md-8
      h1= "Preview "+blog.name
    .col-md-4
      div.btn-group(role="group" class="pull-right")
        button.btn.btn-default.btn-lg
          a(href="#{layout.htmlroot}/blog/#{blog.id}/?edit=true&lang=#{lang}") Edit
        button.btn.btn-default.btn-lg
          a(href="#{layout.htmlroot}/blog/#{blog.id}/preview?download=true&lang=#{lang}") Download

  row
    .col-md-12
      if (preview)
        :verbatim
          !{preview}


extends domain

block domain-content
  table.table.table-bordered
    tr
      th Document service endpoint
      td= domain.DocService.Endpoint
    tr
      th Search service endpoint
      td= domain.SearchService.Endpoint

  a.btn.btn-danger.pull-right(role="button", data-toggle="modal", data-target="#deleteDialog")
    i.icon-trash.icon-white
    |  Delete this domain

  .modal.hide#deleteDialog(role="dialog", tabindex="-1", aria-labelledby="deleteDialogLabel", aria-hidden="true")
    .modal-header
      button.close(type="button", data-dismiss="modal", aria-hidden="true") ×
      h3#deleteDialogLabel Delete '#{domain.DomainName}' domain
    .modal-body
      p Are you sure?
    .modal-footer
      form(action="/domain/"+domain.DomainName, method="POST").modal-form
        input(type="hidden", name="_method", value="DELETE")
        button.btn(data-dismiss="modal", aria-hidden="true") Cancel
        button.btn(type="submit").btn.btn-danger
          i.icon-trash.icon-white
          |  Delete

Remove a tailing blank line


article(about=(item.id?'/'+item.id:''), typeof="post")
  h1(property='title') #{item.title}
  div(property='content') !{item.content}

Allow mark-up in title too

article(about=(item.id?'/'+item.id:''), typeof="post")
  h1(property='title') !{item.title}
  div(property='content') !{item.content}


#notifs_modal.modal.fade(tabindex='-1', role='dialog', ng-controller="NotificationsCtrl")
  .modal-dialog
    .modal-content
      .modal-header
        h4.modal-title Настройки уведомлений
      .modal-body
        | Вы хотите получать уведомления о событиях, в которых Вы принимаете участие?
        p
        form(name='notifsForm', method='POST')
          input(type='hidden', name='_csrf', value=_csrf)

          label
            input(type="radio", role="button", ng-model="notifs.enabled", value="true")
            span  Да
          label(style="margin-left: 20px;")
            input(type="radio", role="button", ng-model="notifs.enabled", value="false")
            span  Нет

          div.form-group(
            ng-if="notifs.enabled == 'true'",
            ng-class="{'has-error': notifsForm.email.$invalid}"
          )
            div Получать уведомления на эл. почту:
            input.form-control(
              type='email', id='email', name='email', ng-model='notifs.email',
              required, style="width: 30em;"
            )
            p(ng-show="notifsForm.email.$invalid", class="help-block") Введите правильную эл. почту.
            .clearfix

      .modal-footer
        button.btn.btn-primary(type='button', ng-click='saveNotifications()') Сохранить настройки

Simplify form declaration with angular

#notifs_modal.modal.fade(tabindex='-1', role='dialog', ng-controller="NotificationsCtrl")
  .modal-dialog
    .modal-content
      .modal-header
        h4.modal-title Настройки уведомлений
      .modal-body
        | Вы хотите получать уведомления о событиях, в которых Вы принимаете участие?
        p
        form(name='notifsForm')
          label
            input(type="radio", role="button", ng-model="notifs.enabled", value="true")
            span  Да
          label(style="margin-left: 20px;")
            input(type="radio", role="button", ng-model="notifs.enabled", value="false")
            span  Нет

          div.form-group(
            ng-if="notifs.enabled == 'true'",
            ng-class="{'has-error': notifsForm.email.$invalid}"
          )
            div Получать уведомления на эл. почту:
            input.form-control(
              type='email', id='email', name='email', ng-model='notifs.email',
              required, style="width: 30em;"
            )
            p(ng-show="notifsForm.email.$invalid", class="help-block") Введите правильную эл. почту.
            .clearfix

      .modal-footer
        button.btn.btn-primary(type='button', ng-click='saveNotifications()') Сохранить настройки


block navbar
  nav
    h1 HOLIS

Create Navbar basics but unstyled

block navbar
  //Navbar starts here
  .navbar-fixed
      ul#nav-mobile.side-nav
        li
          a(href='#') Sass
        li
          a(href='#') Components
        li
          a(href='#') JavaScript
      nav
        .nav-wrapper.indigo.z-depth-3
          a.button-collapse(href='#', data-activates='nav-mobile')
            i.mdi-navigation-menu
          ul#nav-mobile.left.hide-on-med-and-down
            li
              a(href='#') Sass
            li
              a(href='#') Components
            li
              a(href='#') JavaScript
          ul.center
            li.search
              form.center
                .input-field
                  input#search(type='search', placeholder='Buscar por Nombre', required='')
                  label(for='search')
                    i.mdi-action-search
                  i.mdi-navigation-close
          ul.right
            li
              a.user.dropdown-button(href='#', data-activates='userDropdown')
                img.circle.responsive-img(src='http://placehold.it/30', alt='UserProfile')
                span El Usuario
                  i.mdi-navigation-expand-more.small.right
        ul#userDropdown.auto-size.dropdown-content.indigo.darken-1
          li
            a.white-text(href='#!') Cambiar Contraseña
              i.mdi-action-lock.tiny
          li
            a.white-text(href='#!') Salir
              i.mdi-action-exit-to-app.tiny


div.wrapper
    div.notifications-page.centered
        header.header
            h1.title {{ 'EVENTS.MY_EVENTS' | translate }}
            a.action(
                href="",
                ng-if="!vm.notificationsList.get(0).get('read')",
                ng-click="vm.setAllAsRead()") {{ 'EVENTS.DISMISS_ALL' | translate }}
            span.action.disabled(ng-if="vm.notificationsList.get(0).get('read')") {{ 'EVENTS.DISMISS_ALL' | translate }}
        tg-notifications-list()

Disable dismiss-all link if there are no events

div.wrapper
    div.notifications-page.centered
        header.header
            h1.title {{ 'EVENTS.MY_EVENTS' | translate }}
            a.action(
                href="",
                ng-if="vm.notificationsList.size && !vm.notificationsList.get(0).get('read')",
                ng-click="vm.setAllAsRead()") {{ 'EVENTS.DISMISS_ALL' | translate }}
            span.action.disabled(ng-if="!vm.notificationsList.size || vm.notificationsList.get(0).get('read')") {{ 'EVENTS.DISMISS_ALL' | translate }}
        tg-notifications-list()


doctype html
html
  include ./includes/head.jade
  body
    h1 Welcome to Net-Set

    include ./includes/board.jade

    script(src="client.js")

Add jQuery and client-side Socket.io scripts

doctype html
html
  include ./includes/head.jade
  body
    h1 Welcome to Net-Set

    include ./includes/board.jade

    script(src="https://cdn.socket.io/socket.io-1.2.0.js")
    script(src="http://code.jquery.com/jquery-1.11.1.js")
    script(src="client.js")


mixin footer
  footer#footer
    .container
      p.text-muted.credit.
        Copyright © 2013-2015 Calvin Montgomery · GitHub · User Agreement · Contact · Wiki
  script(src="/js/jquery-1.11.0.min.js")
  // Must be included before jQuery-UI since jQuery-UI overrides jQuery.fn.button
  // I should really abandon this crap one day
  script(src="/js/jquery-ui.js")
  script(src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js")

Update copyright year (finally lol)

mixin footer
  footer#footer
    .container
      p.text-muted.credit.
        Copyright © 2013-2016 Calvin Montgomery · GitHub · User Agreement · Contact · Wiki
  script(src="/js/jquery-1.11.0.min.js")
  // Must be included before jQuery-UI since jQuery-UI overrides jQuery.fn.button
  // I should really abandon this crap one day
  script(src="/js/jquery-ui.js")
  script(src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js")


-var exports=pages[page]
include /src/mixins/index

doctype html
html(lang="fr", class="cssr-VerticalRhythm")
  head
    meta(charset="utf-8")
    meta(http-equiv="X-UA-Compatible" content="IE=Edge")
    meta(
      name="viewport"
      content="width=device-width, init-scale=1.0, minimal-ui"
    )
    title #{exports.title}
    block head
    link(
      rel="stylesheet"
      href="#{uri('stylesheets/index.css', page)}"
    )
    link(
      rel="alternate"
      href="#{uri('feed.xml', page)}"
      title="#{lang.title}"
      type="application/atom+xml"
    )
    //- link(
    //-   rel="stylesheet"
    //-   href="http://basehold.it/25/255/42/85/0.1"
    //- )
  body
    include /tmp/svg-symbols.svg
    .putainde-Header
      .Grid
        .Grid-cell.u-size5of12
          include /src/partials/header
        .Grid-cell.u-size7of12
          +Navigation(lang.navigation, page)
    .putainde-Main
      block main
    .putainde-Footer
      include /src/partials/footer
    block end
    script(src="#{uri('scripts/index.js', page)}")
    include /src/partials/analytics

Fix meta initial-scale (& also remove useless minimal-ui)

-var exports=pages[page]
include /src/mixins/index

doctype html
html(lang="fr", class="cssr-VerticalRhythm")
  head
    meta(charset="utf-8")
    meta(http-equiv="X-UA-Compatible" content="IE=Edge")
    meta(
      name="viewport"
      content="width=device-width, initial-scale=1.0, minimal-ui"
    )
    title #{exports.title}
    block head
    link(
      rel="stylesheet"
      href="#{uri('stylesheets/index.css', page)}"
    )
    link(
      rel="alternate"
      href="#{uri('feed.xml', page)}"
      title="#{lang.title}"
      type="application/atom+xml"
    )
    //- link(
    //-   rel="stylesheet"
    //-   href="http://basehold.it/25/255/42/85/0.1"
    //- )
  body
    include /tmp/svg-symbols.svg
    .putainde-Header
      .Grid
        .Grid-cell.u-size5of12
          include /src/partials/header
        .Grid-cell.u-size7of12
          +Navigation(lang.navigation, page)
    .putainde-Main
      block main
    .putainde-Footer
      include /src/partials/footer
    block end
    script(src="#{uri('scripts/index.js', page)}")
    include /src/partials/analytics


section.code-samples.column-contain.hidden-xs
  h2.hidden-visually Code Samples
  .code-sample-block.first-sample-block
      h4.code-header Define view classes
      pre.prettyprint
        code.notranslate.
          var SingleLink = Marionette.ItemView.extend({
            tagName: "li",
            template: _.template("<a href='<%-path%>'><%-path%>")
          });

          var ListView = Marionette.CollectionView.extend({
            tagName: 'ul',
            childView: SingleLink
          });

  .code-sample-block.second-sample-block
    h4.code-header Pass in data
    pre.prettyprint
      code.notranslate.
        var list = new Backbone.Collection([
          {path: 'http://google.com'},
          {path: 'http://mojotech.com'},
        ]);

        (new ListView({
          collection: list,
          el: '.link-area'
        })).render();

  .code-sample-block.code-results-block
    h4.code-header.code-header-results Results
    .result
      ul
        li
          a.notranslate(href="http://google.com", target="_blank") http://google.com
        li
          a.notranslate(href="http://mojotech.com", target="_blank") http://mojotech.com
    .cl
  .cl

Use current header tags as subheaders

section.code-samples.column-contain.hidden-xs
  h2.hidden-visually Code Samples
  .code-sample-block.first-sample-block
      h3.code-header Define view classes
      pre.prettyprint
        code.notranslate.
          var SingleLink = Marionette.ItemView.extend({
            tagName: "li",
            template: _.template("<a href='<%-path%>'><%-path%>")
          });

          var ListView = Marionette.CollectionView.extend({
            tagName: 'ul',
            childView: SingleLink
          });

  .code-sample-block.second-sample-block
    h3.code-header Pass in data
    pre.prettyprint
      code.notranslate.
        var list = new Backbone.Collection([
          {path: 'http://google.com'},
          {path: 'http://mojotech.com'},
        ]);

        (new ListView({
          collection: list,
          el: '.link-area'
        })).render();

  .code-sample-block.code-results-block
    h3.code-header.code-header-results Results
    .result
      ul
        li
          a.notranslate(href="http://google.com", target="_blank") http://google.com
        li
          a.notranslate(href="http://mojotech.com", target="_blank") http://mojotech.com
    .cl
  .cl


include hero_unit
.about-2-foreground
  include nav
  .about2-spacer( style="height: 300px" )
  .about2-section(
    id=sections[0].slug
    data-href="/about2/#{sections[0].slug}"
  ): include section1
  .about2-section(
    id=sections[1].slug
    data-href="/about2/#{sections[1].slug}"
  ): include section2
  .about2-section(
    id=sections[2].slug
    data-href="/about2/#{sections[2].slug}"
  ): include section3
  .about2-section(
    id=sections[3].slug
    data-href="/about2/#{sections[3].slug}"
  ): include section4
  .about2-section(
    id=sections[4].slug
    data-href="/about2/#{sections[4].slug}"
  ): include section5
  .about2-section(
    id=sections[5].slug
    data-href="/about2/#{sections[5].slug}"
  ): include section6

Kill extra padding at the top

include hero_unit
.about-2-foreground
  include nav
  .about2-section(
    id=sections[0].slug
    data-href="/about2/#{sections[0].slug}"
  ): include section1
  .about2-section(
    id=sections[1].slug
    data-href="/about2/#{sections[1].slug}"
  ): include section2
  .about2-section(
    id=sections[2].slug
    data-href="/about2/#{sections[2].slug}"
  ): include section3
  .about2-section(
    id=sections[3].slug
    data-href="/about2/#{sections[3].slug}"
  ): include section4
  .about2-section(
    id=sections[4].slug
    data-href="/about2/#{sections[4].slug}"
  ): include section5
  .about2-section(
    id=sections[5].slug
    data-href="/about2/#{sections[5].slug}"
  ): include section6


// Display list of all sequences of a given sequence type

a(
  href = "#/"
) Back to Sequence Types

table.table.table-striped
  th
    tr
      td Name
      td UUID
      td Checkpoints
  tbody
    tr(
      ng-repeat = "s in data.sequences"
    )
      td {{ s.name }}
      td
        a(
          ng-href = "#/{{ data.sequenceName }}/{{ s.uuid }}"
        ) {{ s.uuid }}
      td {{ s.checkpoints.length }} / {{ data.specCheckpoints.length }}

Remove Name column from sequences template'

// Display list of all sequences of a given sequence type

a(
  href = "#/"
) Back to Sequence Types

h1 {{ data.sequenceName }} Sequences

table.table.table-striped
  th
    tr
      td UUID
      td Checkpoints
  tbody
    tr(
      ng-repeat = "s in data.sequences"
    )
      td
        a(
          ng-href = "#/{{ data.sequenceName }}/{{ s.uuid }}"
        ) {{ s.uuid }}
      td {{ s.checkpoints.length }} / {{ data.specCheckpoints.length }}


#share_links
	.pad
		| Share:

Fix missing FB share icon


block append scripts

for event in events
  div.timeline-tooltip(style="left: #{event.position}%")
    #{event.days_remaining}
    div.alert.hide
      b=event.name
      br
      #{event.description}
      ul.related_links
        if event.related_links
          for link in event.related_links
            li
              a(href="#{link}") #{link}
      span.date-info
        #{event.days_remaining} days left - !{(new Date(event.timestamp)).toDateString()}

Fix dates in event stream.

block append scripts

for event in events
  div.timeline-tooltip(style="left: #{event.position}%")
    #{event.days_remaining}
    div.alert.hide
      b=event.name
      br
      #{event.description}
      ul.related_links
        if event.related_links
          for link in event.related_links
            li
              a(href="#{link}") #{link}
      span.date-info
        #{event.days_remaining} days left - !{(new Date(event.timestamp * 1000)).toDateString()}


!!! 5
html
  head
  body
    form(method="post",enctype="multipart/form-data",action="/")
      input(type="file", name="img")
      input(type="submit",value="Submit")
    div#result
    script(src='jquery/jquery.js')
    script(src='framejax.js')
    script
      $('form')
        .framejax()
        .on('complete', function(e, result) {
          $('#result').html(result);
        });

Update to maintain compatability with the latest version of jade

!!! 5
html
  head
  body
    form(method="post",enctype="multipart/form-data",action="/")
      input(type="file", name="img")
      input(type="submit",value="Submit")
    div#result
    script(src='jquery/jquery.js')
    script(src='framejax.js')
    script.
      $('form')
        .framejax()
        .on('complete', function(e, result) {
          $('#result').html(result);
        });


template(name="archivedBoards")
  h2
    i.fa.fa-archive
    | {{_ 'archived-boards'}}

  ul.archived-lists
    each archivedBoards
      li.archived-lists-item
        button.js-restore-board
          i.fa.fa-undo
          | {{_ 'restore-board'}}
        button.js-delete-board
          i.fa.fa-trash-o
          | {{_ 'delete-board'}}
        = title
    else
      li.no-items-message {{_ 'no-archived-boards'}}

template(name="deleteBoardPopup")
  p {{_ 'delete-board-pop'}}
  unless archived
    p {{_ 'board-delete-suggest-archive'}}
  button.js-confirm.negate.full(type="submit") {{_ 'delete'}}

Remove double template for deleteCardPopup


.hinge.hinge-0
.hinge.hinge-1
.hinge.hinge-2
.hinge.hinge-3

if includeSpellList
  .btn.btn-small.btn-illustrated.spell-list-button(data-i18n="[title]play_level.tome_see_all_methods", title="See all methods you can edit")
    .glyphicon.glyphicon-chevron-down

.thang-avatar-placeholder

.method-name-area
  .method-label(data-i18n="play_level.tome_current_method") Current Method
  .method-signature #{methodSignature}

.spell-tool-buttons
  .btn.btn-small.btn-illustrated.btn-warning.reload-code(data-i18n="[title]play_level.tome_reload_method", title="Reload original code for this method")
    .glyphicon.glyphicon-repeat
    span.spl(data-i18n="play_level.reload") Reload

  if levelType !== 'hero' && levelType !== 'hero-ladder' && levelType !== 'hero-coop'
   .btn.btn-small.btn-illustrated.fullscreen-code(title=maximizeShortcutVerbose)
     .glyphicon.glyphicon-fullscreen
     .glyphicon.glyphicon-resize-small

  if codeLanguage === 'javascript' && levelType !== 'hero' && levelType !== 'hero-ladder' && levelType !== 'hero-coop'
    .btn.btn-small.btn-illustrated.beautify-code(title=beautifyShortcutVerbose)
      .glyphicon.glyphicon-magnet

  .clearfix

Fix the fullscreen-code button and beautiful-code button

.hinge.hinge-0
.hinge.hinge-1
.hinge.hinge-2
.hinge.hinge-3

if includeSpellList
  .btn.btn-small.btn-illustrated.spell-list-button(data-i18n="[title]play_level.tome_see_all_methods", title="See all methods you can edit")
    .glyphicon.glyphicon-chevron-down

.thang-avatar-placeholder

.method-name-area
  .method-label(data-i18n="play_level.tome_current_method") Current Method
  .method-signature #{methodSignature}

.spell-tool-buttons
  .btn.btn-small.btn-illustrated.btn-warning.reload-code(data-i18n="[title]play_level.tome_reload_method", title="Reload original code for this method")
    .glyphicon.glyphicon-repeat
    span.spl(data-i18n="play_level.reload") Reload

  if me.level() >= 15
   .btn.btn-small.btn-illustrated.fullscreen-code(title=maximizeShortcutVerbose)
     .glyphicon.glyphicon-fullscreen
     .glyphicon.glyphicon-resize-small

  if codeLanguage === 'javascript' && me.level() >= 15
    .btn.btn-small.btn-illustrated.beautify-code(title=beautifyShortcutVerbose)
      .glyphicon.glyphicon-magnet

  .clearfix


extends layout
block body
   .container
      br
      br
      .col-lg-6.col-lg-offset-3.panel.panel-default
         form(method='POST', action='/api/resetPassword')
            - if (error!="")
               .alert.alert-dismissable.alert-danger
               button(type="button" class="close" data-dismiss="alert") ×
               p #{error}
            h2 Reset password
            br
            h3 User: #{user}
            br
            .form-group
               label Old password:
               input.form-control(type='password', name='oldpassword', required)
            .form-group
               label New password:
               input.form-control(type='password', name='newpassword', required)
            div
               button.btn.btn-default.pull-right(type='submit') Submit
            br
            br
            br

Add small hint message to the password reset page

extends layout
block body
  .container
    br
    br
    .col-lg-6.col-lg-offset-3.panel.panel-default
      form(method='POST', action='/api/resetPassword')
        - if (error!="")
          .alert.alert-dismissable.alert-danger
            button(type="button" class="close" data-dismiss="alert") ×
            p #{error}
        h2 Reset password
        br
        p Your password needs to be reset before you can continue
        h3 User: #{user}
        br
        .form-group
          label Old password:
          input.form-control(type='password', name='oldpassword', required)
        .form-group
          label New password:
          input.form-control(type='password', name='newpassword', required)
        div
          button.btn.btn-default.pull-right(type='submit') Submit
        br
        br
        br


mixin romtable(allRoms)
  div.table-responsive
    table.table.table-striped.table-hover#rom-table
      thead
        tr
          th.col-device Device
          th.col-updatechannel Type
          th.col-filename.text-center Filename / Download
          th.col-size Size
          th.col-date Date Added
      tbody
        each rom in allRoms
          tr
            - var deviceArticle = contents.devices[rom.DeviceId + '.json']
            td
              a(href="#{deviceArticle.url}") #{deviceArticle.metadata.name}
              if deviceArticle.metadata.displayName
                br
                small #{deviceArticle.metadata.displayName}
            td #{rom.updateChannel}
            td
              dl.dl-horizontal
                dt
                  b Download:
                dd
                  a(href="#{rom.downloadUrl}")
                    span.glyphicon.glyphicon-download
                    |  #{rom.filename}
                if rom.subdirectory
                  dt
                    small.font-weight-normal directory:
                  dd
                    small #{rom.subdirectory}
                dt
                  small.font-weight-normal md5sum:
                dd
                  small #{rom.md5sum}
            td(data-order=rom.fileSize)
              if rom.fileSize
                | #{filesize(rom.fileSize)}
              else
                i (unknown)
            - var romTimestamp = new Date(rom.createdAt)
            td(data-order=romTimestamp.toISOString())
              | #{romTimestamp.toUTCString()}

Use the "build start timestamp".

mixin romtable(allRoms)
  div.table-responsive
    table.table.table-striped.table-hover#rom-table
      thead
        tr
          th.col-device Device
          th.col-updatechannel Type
          th.col-filename.text-center Filename / Download
          th.col-size Size
          th.col-date Date Added
      tbody
        each rom in allRoms
          tr
            - var deviceArticle = contents.devices[rom.DeviceId + '.json']
            td
              a(href="#{deviceArticle.url}") #{deviceArticle.metadata.name}
              if deviceArticle.metadata.displayName
                br
                small #{deviceArticle.metadata.displayName}
            td #{rom.updateChannel}
            td
              dl.dl-horizontal
                dt
                  b Download:
                dd
                  a(href="#{rom.downloadUrl}")
                    span.glyphicon.glyphicon-download
                    |  #{rom.filename}
                if rom.subdirectory
                  dt
                    small.font-weight-normal directory:
                  dd
                    small #{rom.subdirectory}
                dt
                  small.font-weight-normal md5sum:
                dd
                  small #{rom.md5sum}
            td(data-order=rom.fileSize)
              if rom.fileSize
                | #{filesize(rom.fileSize)}
              else
                i (unknown)
            - var romTimestamp = new Date(rom.timestamp)
            td(data-order=romTimestamp.toISOString())
              | #{romTimestamp.toUTCString()}


.PricingBrands
  h3.Type.Type--size-h3.Utility--align-center
    | Are.na is used by people and teams at:
  br
  .PricingBrands__icons
    img(src="https://d2w9rnfcy7mm78.cloudfront.net/2034139/original_c3a3a9bbb15964f69af8cc2bfdbc28f7.png")

Replace pricing page logo image

.PricingBrands
  h3.Type.Type--size-h3.Utility--align-center
    | Are.na is used by people and teams at:
  br
  .PricingBrands__icons
    img(src="https://d2w9rnfcy7mm78.cloudfront.net/3292656/original_33a711d0ffabc169566d37a824d74adf.png?1546460030")


mixin privacyEditor(typeName)
  .g-public-container
    .radio
      label
        input#g-access-private(type="radio", name="privacy",
                               checked=(public ? undefined : "checked"))
        i.icon-lock
        | #[b Private] — Access is required to view this #{typeName}
    .radio
      label
        input#g-access-public(type="radio", name="privacy",
                              checked=(public ? "checked" : undefined))
        i.icon-globe
        | #[b Public] — Anyone can view this #{typeName}

mixin permissionsEditor
  .g-permissions-editor
    .g-ac-list-title: #[i.icon-key-1]  Permissions
    .g-ac-list
      #g-ac-list-groups
      #g-ac-list-users

    .g-grant-access-container
      form(role="form")
        .form-group
          label(for="addAccess") Grant access to another group or user
          .g-search-field-container

mixin recurseOption(typeName)
  .g-recursive-container
    .radio
      label
        input#g-apply-nonrecursive(type="radio" name="recurse" checked="checked")
        | Apply permissions only to this #{typeName}, not its subfolders
    .radio
      label
        input#g-apply-recursive(type="radio" name="recurse")
        | Also set permissions on all subfolders to match this #{typeName}'s permissions

mixin saveAccessButton
  button.g-save-access-list.btn.btn-small.btn-primary #[i.icon-ok]  Save

Fix a Jade syntax error

mixin privacyEditor(typeName)
  .g-public-container
    .radio
      label
        input#g-access-private(type="radio", name="privacy",
                               checked=(public ? undefined : "checked"))
        i.icon-lock
        | #[b Private] — Access is required to view this #{typeName}
    .radio
      label
        input#g-access-public(type="radio", name="privacy",
                              checked=(public ? "checked" : undefined))
        i.icon-globe
        | #[b Public] — Anyone can view this #{typeName}

mixin permissionsEditor
  .g-permissions-editor
    .g-ac-list-title #[i.icon-key-1]  Permissions
    .g-ac-list
      #g-ac-list-groups
      #g-ac-list-users

    .g-grant-access-container
      form(role="form")
        .form-group
          label(for="addAccess") Grant access to another group or user
          .g-search-field-container

mixin recurseOption(typeName)
  .g-recursive-container
    .radio
      label
        input#g-apply-nonrecursive(type="radio" name="recurse" checked="checked")
        | Apply permissions only to this #{typeName}, not its subfolders
    .radio
      label
        input#g-apply-recursive(type="radio" name="recurse")
        | Also set permissions on all subfolders to match this #{typeName}'s permissions

mixin saveAccessButton
  button.g-save-access-list.btn.btn-small.btn-primary #[i.icon-ok]  Save


doctype html
html
  head
    title= title
    link(rel='stylesheet', href='/stylesheets/bootstrap-3.3.1.min.css')
    link(rel='stylesheet', href='/stylesheets/bootstrap-theme-3.3.1.min.css')
    link(rel='stylesheet', href='/stylesheets/style.css')
  body
    block content
    script(data-main='javascripts/main.min', src="javascripts/libs/require-2.1.15.min.js")

Remove all the separate css include and use style.css instead

doctype html
html
  head
    title= title
    link(rel='stylesheet', href='/stylesheets/style.css')
  body
    block content
    script(data-main='javascripts/main.min', src="javascripts/libs/require-2.1.15.js")


doctype html
html
  head
    title= title
    link(rel='stylesheet', href='/stylesheets/style.css')
    script(type='text/javascript' src='//cdn.raygun.io/raygun4js/raygun.min.js')
    script(type='text/javascript').
      Raygun.init('FUf6zElJ917dlWbhOEAmvw==').attach();
  body
    block content

Add user tracking to raygun4js

doctype html
html
  head
    title= title
    link(rel='stylesheet', href='/stylesheets/style.css')
    script(type='text/javascript' src='//cdn.raygun.io/raygun4js/raygun.min.js')
    script(type='text/javascript').
      Raygun.init('FUf6zElJ917dlWbhOEAmvw==').attach();
      Raygun.setUser('2', false, 'jamie+js@raygun.io', 'Jamie \'JS\' Penney');
  body
    block content


!!!
html
	head
		meta(http-equiv="Content-Type", content="text/html; charset=utf-8")
		link(rel="stylesheet", href="/css/bootstrap.css", type="text/css")
		link(rel="stylesheet", href="/css/client.css", type="text/css")
		title Activity Streams
	body!=body
		script(src="/js/jquery.min.js", type="text/javascript")
		script(src="/js/underscore-min.js", type="text/javascript")
		script(src="/js/helper.js", type="text/javascript")
		script(type="text/javascript")
			var App = {
				helper : new AppHelper()
			}
		script(src="/static/js/#{assetsCacheHashes.js||0}/client.js", type="text/javascript")
		script(src="https://maps.googleapis.com/maps/api/js?sensor=true")

Set the state via JSON

!!!
html
	head
		meta(http-equiv="Content-Type", content="text/html; charset=utf-8")
		link(rel="stylesheet", href="/css/bootstrap.css", type="text/css")
		link(rel="stylesheet", href="/css/client.css", type="text/css")
		title Activity Streams
	body!=body
		script(src="/js/jquery.min.js", type="text/javascript")
		script(src="/js/underscore-min.js", type="text/javascript")
		script(src="/js/helper.js", type="text/javascript")
		script(type="text/javascript")
			var App = {
				helper : new AppHelper()
			};
		- if (locals.currentUser && locals.filters)
			script(type="text/javascript")
				App.desiredStream = "#{locals.desiredStream}";
				App.currentUser = !{JSON.stringify(locals.currentUser)};
				App.filters = !{JSON.stringify(locals.filters)};
				App.included = !{JSON.stringify(locals.included)};
		script(src="/static/js/#{assetsCacheHashes.js||0}/client.js", type="text/javascript")
		script(src="https://maps.googleapis.com/maps/api/js?sensor=true")


---
layout: default
title: Blog
---
h1 {{ page.title }}
{% for post in site.posts %}
h2
  a(href="{{ post.url }}") {{ post.title }}
  span.small « {{ post.date | date_to_string }}
.well {{ post.excerpt }}
{% endfor %}

Add class 'active' to the active page

---
layout: default
title: Blog
---
script
  $(function () { $("#blog-nav-button").addClass("active"); });
h1 {{ page.title }}
{% for post in site.posts %}
h2
  a(href="{{ post.url }}") {{ post.title }}
  span.small « {{ post.date | date_to_string }}
.well {{ post.excerpt }}
{% endfor %}


extends ../layout

block content
  div.news-item
    include ../partials/joinsite

    .page-header
        h3
            a(href=item.html_url)= item.title
        = 'submitted '
        span.timeago(title="#{item.created_at}")= timeago(item.created_at)
        = ' by '
        a(href='/news/user/' + item.user.login, class='user')= item.user.login
        h4
          div(class="item-summary")!= item.body
    include ../partials/postcomment

    each comment, index in comments
      div.comment
        a(href='/news/user/' + comment.user.login)= comment.user.login
        span.timeago(title="#{comment.created_at}")= timeago(comment.created_at)
        blockquote.content
            != comment.body
            button.btn.btn-primary(data-toggle='modal', data-target='##{index}modal', style= 'float: right;') View MD Source
            div(style= 'clear:both;')
        div(id= index + 'modal', tabindex= "-1", role= "dialog").modal.fade
          div.modal-dialog
            div.modal-content
              div.modal-header
                button.close(data-dismiss= "modal")
                  span(aria-hidden= "true", st) ×
                h4.modal-title
                  Comment MD Source
              div.modal-body
                textarea(readonly, style="width: 100%; height: 300px;")
                  #{comment.mdBody}

Fix bad markup in “View MD Source” modal

extends ../layout

block content
  div.news-item
    include ../partials/joinsite

    .page-header
        h3
            a(href=item.html_url)= item.title
        = 'submitted '
        span.timeago(title="#{item.created_at}")= timeago(item.created_at)
        = ' by '
        a(href='/news/user/' + item.user.login, class='user')= item.user.login
        h4
          div(class="item-summary")!= item.body
    include ../partials/postcomment

    each comment, index in comments
      div.comment
        a(href='/news/user/' + comment.user.login)= comment.user.login
        span.timeago(title="#{comment.created_at}")= timeago(comment.created_at)
        blockquote.content
            != comment.body
            button.btn.btn-primary(data-toggle='modal', data-target='##{index}modal', style= 'float: right;') View MD Source
            div(style= 'clear:both;')
        div(id= index + 'modal', tabindex= "-1", role= "dialog").modal.fade
          div.modal-dialog
            div.modal-content
              div.modal-header
                button.close(data-dismiss= "modal")
                  span(aria-hidden= "true", st) ×
                h4.modal-title
                  | Comment’s Markdown Source
              div.modal-body
                textarea(readonly, style="width: 100%; height: 300px;")
                  = comment.mdBody


doctype html

html
  head
    meta(charset='utf-8')
    title Trendy
    meta(name="viewport" content="width=device-width, initial-scale=1.0")

    script(src="/public/components/webcomponentsjs/webcomponents.min.js")
    script(src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js")
    script(src="/public/client.js")

    link(rel="import", href="/public/card.html")
    link(rel="import", href="/public/components/paper-styles/color.html")
    link(rel="import", href="/public/components/paper-progress/paper-progress.html")

    style(is="custom-style")
      | paper-progress {
      |  display: block;
      |  width: 100%;
      |  padding: 0;
      |}

      |paper-progress.green {
      |  --paper-progress-active-color: var(--paper-light-green-800);
      |  --paper-progress-secondary-color: var(--paper-light-green-300);
      |}

  body
    paper-progress.green(value=0,min=0,max=60000,step=1)
    .list
      each url in urls
        my-card
          .shares #{url.share_count}
          .url.truncate
            a(href="#{url.url}")
              | !{url.title || url.url}

Change the progress bar color from green to red

doctype html

html
  head
    meta(charset='utf-8')
    title Trendy
    meta(name="viewport" content="width=device-width, initial-scale=1.0")

    script(src="/public/components/webcomponentsjs/webcomponents.min.js")
    script(src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js")
    script(src="/public/client.js")

    link(rel="import", href="/public/card.html")
    link(rel="import", href="/public/components/paper-styles/color.html")
    link(rel="import", href="/public/components/paper-progress/paper-progress.html")

    style(is="custom-style")
      | paper-progress {
      |  display: block;
      |  width: 100%;
      |  padding: 0;
      |}

      |paper-progress.green {
      |  --paper-progress-active-color: var(--paper-light-green-800);
      |  --paper-progress-secondary-color: var(--paper-light-green-300);
      |}
      |paper-progress.red {
      |  --paper-progress-active-color: var(--paper-red-700);
      |  --paper-progress-secondary-color: var(--paper-red-300);
      |}

  body
    paper-progress.red(value=0,min=0,max=60000,step=1)
    .list
      each url in urls
        my-card
          .shares #{url.share_count}
          .url.truncate
            a(href="#{url.url}")
              | !{url.title || url.url}


extends layouts/default

block content

  - var idField = resource.fields.id;
  - var nameField = resource.fields.name;

  h1
    .ui.breadcrumb
      block breadcrumbs
        a.active.section(href="/#{resource.collection}") #{resource.plural}
        - if (typeof(item) != 'undefined')
          .divider /
          a.section(href="/#{resource.collection}/#{item[ resource.fields.id ]}") #{item[ resource.fields.name ]}

    - if (typeof(item) != 'undefined')
      .ui.right.floated.header
        a.ui.button(href="/#{resource.collection}/#{item[ resource.fields.id ]}") edit

  - var fields = Object.keys(resource.keys) || []
  - fields = fields.filter(function(x) {
  -   return (resource.attributes[ x ]._type !== 'password');
  - })
  - if (resource.fields.name !== '_id') {
  -   delete resource.keys['_id']
  - }

  //- TODO: use different modules for different collection types?
  if (!collection)
    //- No collection was provided, render single
    include modules/item

  else
    include modules/collection

    h3 Create
    include forms/resource-create

Handle an issue with non-_typed fields.

extends layouts/default

block content

  - var idField = resource.fields.id;
  - var nameField = resource.fields.name;

  h1
    .ui.breadcrumb
      block breadcrumbs
        a.active.section(href="/#{resource.collection}") #{resource.plural}
        - if (typeof(item) != 'undefined')
          .divider /
          a.section(href="/#{resource.collection}/#{item[ resource.fields.id ]}") #{item[ resource.fields.name ]}

    - if (typeof(item) != 'undefined')
      .ui.right.floated.header
        a.ui.button(href="/#{resource.collection}/#{item[ resource.fields.id ]}") edit

  - var fields = Object.keys(resource.keys) || []
  - fields = fields.filter(function(x) {
  -   if (!resource.attributes[ x ]) return true;
  -   return (resource.attributes[ x ]._type !== 'password');
  - })
  - if (resource.fields.name !== '_id') {
  -   delete resource.keys['_id']
  - }

  //- TODO: use different modules for different collection types?
  if (!collection)
    //- No collection was provided, render single
    include modules/item

  else
    include modules/collection

    h3 Create
    include forms/resource-create


extends layout

block content
  h1 Server Side JavaScript Injection
  //- TODO: Add Conext
      //- https://ckarande.gitbooks.io/owasp-nodegoat-tutorial/content/tutorial/a1_-_server_side_js_injection.html
      //- https://nvisium.com/blog/2015/08/27/the-evil-side-of-javascript-server-side/
  p.
    For many years client-side JavaScript exploitation has been the focus of
    web application security research - with the advent of JavaScript run on
    the server in recent years, new exploitation research has taken off. As
    the web moved toward ever-increasing use of JavaScript to make sites
    reactive and easier to develop, Server Side JavaScript Injection evolved
    as one method for code execution against the host server.
  p.
    #[a(href="https://nvisium.com/blog/2015/08/27/the-evil-side-of-javascript-server-side/"] nVisium
    has a good write up on how Server Side JavaScript Injection occurs, as
    well as examples on how to exploit web applications using this
    exploitation method.
  p.
    The following form is vulnerable to a Server Side JavaScript Injection.
    Exploit it to read /etc/passwd.
  div
    form(name="search", method="post")
          div.input
              input(type="text", name="query", placeholder="Search...")
          div.actions
              input(type="submit", value="Go")
  p
    //- TODO: Figure out how to properly reroute to index
    a(href="http://localhost:3000") Return to Index

Fix error from missing parenthesis

extends layout

block content
  h1 Server Side JavaScript Injection
  //- TODO: Add Conext
      //- https://ckarande.gitbooks.io/owasp-nodegoat-tutorial/content/tutorial/a1_-_server_side_js_injection.html
      //- https://nvisium.com/blog/2015/08/27/the-evil-side-of-javascript-server-side/
  p.
    For many years client-side JavaScript exploitation has been the focus of
    web application security research - with the advent of JavaScript run on
    the server in recent years, new exploitation research has taken off. As
    the web moved toward ever-increasing use of JavaScript to make sites
    reactive and easier to develop, Server Side JavaScript Injection evolved
    as one method for code execution against the host server.
  p.
    #[a(href="https://nvisium.com/blog/2015/08/27/the-evil-side-of-javascript-server-side/")] nVisium
    has a good write up on how Server Side JavaScript Injection occurs, as
    well as examples on how to exploit web applications using this
    exploitation method.
  p.
    The following form is vulnerable to a Server Side JavaScript Injection.
    Exploit it to read /etc/passwd.
  div
    form(name="search", method="post")
          div.input
              input(type="text", name="query", placeholder="Search...")
          div.actions
              input(type="submit", value="Go")
  p
    //- TODO: Figure out how to properly reroute to index
    a(href="http://localhost:3000") Return to Index


mixin romvariantfiltersidebar(deviceId)
  - var romVariantArticlesForCurrentDevice = []
  - for (var i in contents.romvariants) {
  -   var variantArticle = contents.romvariants[i]
  -   if (variantArticle.metadata.DeviceId == deviceId) {
  -     romVariantArticlesForCurrentDevice.push(variantArticle)
  -   }
  - }

  if romVariantArticlesForCurrentDevice && romVariantArticlesForCurrentDevice.length > 1
    div.sidebar-nav.well
      ul.nav.nav-pills.nav-stacked
        li.nav-header
          h3 Rom variant
          each romVariantArticle in romVariantArticlesForCurrentDevice.sort()
            - var linkCssClass = (romVariantArticle.url == page.url) ? 'active' : null
            li(class=linkCssClass)
             a(href='#{romVariantArticle.url}', title="Show only the files for #{romVariantArticle.metadata.displayName}")
               | #{romVariantArticle.metadata.displayName}

Use the correct RomVariant displayName only when available.

mixin romvariantfiltersidebar(deviceId)
  - var romVariantArticlesForCurrentDevice = []
  - for (var i in contents.romvariants) {
  -   var variantArticle = contents.romvariants[i]
  -   if (variantArticle.metadata.DeviceId == deviceId) {
  -     romVariantArticlesForCurrentDevice.push(variantArticle)
  -   }
  - }

  if romVariantArticlesForCurrentDevice && romVariantArticlesForCurrentDevice.length > 1
    div.sidebar-nav.well
      ul.nav.nav-pills.nav-stacked
        li.nav-header
          h3 Rom variant
          each romVariantArticle in romVariantArticlesForCurrentDevice.sort()
            - var linkCssClass = (romVariantArticle.url == page.url) ? 'active' : null
            - var variantName = romVariantArticle.metadata.displayName ? romVariantArticle.metadata.displayName : romVariantArticle.metadata.name
            li(class=linkCssClass)
             a(href='#{romVariantArticle.url}', title="Show only the files for ROM variant #{variantName}")
               | #{variantName}


extends ../layout

block content
  h2 API Browser

  ol
    li
      a(href='/api/aviary') Aviary
    li
      a(href='/api/facebook') Facebook
    li
      a(href='/api/foursquare') Foursquare
    li
      a(href='/api/github') GitHub
    li
      a(href='/api/lastfm') Last.fm
    li
      a(href='/api/nyt') New York Times
    li
      a(href='/api/tumblr') Tumblr
    li
      a(href='/api/twitter') Twitter
    li
      a(href='/api/scraping') Web Scraping

Add Login required text on some api links

extends ../layout

block content
  h2 API Browser

  ol.lead
    li
      a(href='/api/aviary') Aviary
    li
      a(href='/api/facebook') Facebook
      small  (Login required)
    li
      a(href='/api/foursquare') Foursquare
      small  (Login required)
    li
      a(href='/api/github') GitHub
      small  (Login required)
    li
      a(href='/api/lastfm') Last.fm
    li
      a(href='/api/nyt') New York Times
    li
      a(href='/api/tumblr') Tumblr
      small  (Login required)
    li
      a(href='/api/twitter') Twitter
      small  (Login required)
    li
      a(href='/api/scraping') Web Scraping


body
  nav.navbar.navbar-default
    div.container-fluid
      div.navbar-header
        a.navbar-brand(href='/') Urban Heat Island analyzer
      ul.nav.navbar-nav
        li
          a(href="/uhimap") UHI Map
        li
          a(href="/filters") Filters
        li
          a(href="/analyze") Analyze
  div
    main(data-hook="page-container")
    footer.footer-main
      nav.nav-footer.cf
        //- Three columns of links
        div
          a.nav-item.external(href="http://nlesc.nl") Netherlands eScience Center
        div
          a.nav-item.external(href="http://www.met.wau.nl/SummerInTheCity") Summer in the City
        div
          a.nav-item.external(href="http://ampersandjs.com") Ampersand

Remove dead link to previously removed page

body
  nav.navbar.navbar-default
    div.container-fluid
      div.navbar-header
        a.navbar-brand(href='/') Urban Heat Island analyzer
      ul.nav.navbar-nav
        li
          a(href="/filters") Filters
        li
          a(href="/analyze") Analyze
  div
    main(data-hook="page-container")
    footer.footer-main
      nav.nav-footer.cf
        //- Three columns of links
        div
          a.nav-item.external(href="http://nlesc.nl") Netherlands eScience Center
        div
          a.nav-item.external(href="http://www.met.wau.nl/SummerInTheCity") Summer in the City
        div
          a.nav-item.external(href="http://ampersandjs.com") Ampersand


!!! 5
html("xmlns\u003Afb"="http://www.facebook.com/2008/fbml", xmlns="http://www.w3.org/1999/xhtml")
	head
		!=partial('layouts/_head')
	body.hide_userlist(id=w.page_name, class=w.authenticated ? '' : 'anonymous')
		#fb-root
		!=partial('layouts/_header')
		.main
			!{body}
			!=partial('layouts/_footer')
			.clear
		- if(w.jquery)
			script(src="https://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js", type="text/javascript")
			script(src="/s/external/jquery-ui-1.8.12.custom.min.js", type="text/javascript")
		- if(w.page_js)
			!{assetHelpers.assetGroupTag(w.page_js, w.user && w.user.doc)}
		- if(w.channel)
			script(type='text/javascript', src='http://connect.facebook.net/en_US/all.js#appId=181725458505189&xfbml=1',async='true')
		!=partial('shared/_ga')

Move footer outside of main content div


.navbar.navbar-default.navbar-fixed-top(role='navigation')
  .container
    .navbar-header
      button.navbar-toggle(type='button', data-toggle='collapse', data-target='.navbar-collapse')
        span.sr-only Toggle navigation
        span.icon-bar
        span.icon-bar
        span.icon-bar
      a.navbar-brand(href='/') Node.js test task
    .navbar-collapse.collapse
      ul.nav.navbar-nav
        li.active
          a(href='#') Home
        li
          a(href='#cities') Cities
        li
          a(href='#users') Users
        li
          a(href='#projects') Projects
      ul.nav.navbar-nav.navbar-right
        li
          a(href='#')= user.fullName()
        li
          p.navbar-btn
            form(role='form' method='post' action='/logout')
              button.btn.btn-info(type='submit') Log out

Add highlihting of active links in navbar

.navbar.navbar-default.navbar-fixed-top(role='navigation')
  .container
    .navbar-header
      button.navbar-toggle(type='button', data-toggle='collapse', data-target='.navbar-collapse')
        span.sr-only Toggle navigation
        span.icon-bar
        span.icon-bar
        span.icon-bar
      a.navbar-brand(href='/') Node.js test task
    .navbar-collapse.collapse
      ul.nav.navbar-nav
        - var menu = { 'Home': '/', 'Cities': '/cities', 'Users': '/users', 'Projects': '/projects'}
        block link
          - var selected = 'Home';
        for val, key in menu
          - var itemClass = (selected === key ? 'active' : '');
            li(class=itemClass)
              a(href=val)= key

      ul.nav.navbar-nav.navbar-right
        li
          a(href='#')= user.fullName()
        li
          p.navbar-btn
            form(role='form' method='post' action='/logout')
              button.btn.btn-info(type='submit') Log out


script(src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js")
script(src=appUrl+"/js/controllers.js")
link(href=appUrl+"/stylesheets/style.css", rel="stylesheet", type="text/css")
link(href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css", rel="stylesheet", type="text/css")
#HangDownContent(ng-app='', ng-controller="HangDownListCntr")

  ul.items
    li(ng-repeat="item in items", ng-class="{ active: (activeItem == $index), past: (activeItem > $index) }")
      p.title {{item.label}}
      p.creator {{item.creator}}

  #HangDownControls
    #HangDownButtons
      button(ng-click="regressTopic()") Regress
      button(ng-click="advanceTopic()") Advance
    #HangDownInput
      input(ng-model="newTopicBuffer")
      button(ng-click="addNewTopic()") Add

Change addTopic div to form so that <enter> can add a new topic.

script(src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js")
script(src=appUrl+"/js/controllers.js")
link(href=appUrl+"/stylesheets/style.css", rel="stylesheet", type="text/css")
link(href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css", rel="stylesheet", type="text/css")
#HangDownContent(ng-app='', ng-controller="HangDownListCntr")

  ul.items
    li(ng-repeat="item in items", ng-class="{ active: (activeItem == $index), past: (activeItem > $index) }")
      p.title {{item.label}}
      p.creator {{item.creator}}

  #HangDownControls
    #HangDownButtons
      button(ng-click="regressTopic()") Regress
      button(ng-click="advanceTopic()") Advance
    form(ng-submit="addNewTopic()")
      input(ng-model="newTopicBuffer")
      button(ng-click="addNewTopic()", type="submit") Add


google-site-verification: google69b07b41c088b283.html

Fix jade file to display plain text.


h1 Login
form(name="login", method="POST", action="login")
  table
    tr
      th username
      td
        input(name="username", type="text", size="30")
    tr
      th password
      td
        input(name="password", type="text", size="30")
    tr
      td
        input(type="submit", name="login")

Use password input for password.

h1 Login
form(name="login", method="POST", action="login")
  table
    tr
      th username
      td
        input(name="username", type="text", size="30")
    tr
      th password
      td
        input(name="password", type="password", size="30")
    tr
      td
        input(type="submit", name="login")


.grid-item.user-card
  - var image_uri = card_user.profile.picture || '/images/person_placeholder.gif'
  - var bookmark_uri = curr_user.bookmarks.indexOf(card_user._id) >= 0 ? 'bookmark_active.svg' : 'bookmark_inactive.svg'
  img.bookmark(src='/images/#{bookmark_uri}', data-user-id=card_user.id)
  .profile-info
    .profile-pic(onclick='window.location = "/profile/#{card_user.id}"' class="#{card_user.match}" data-long=card_user.loc.coordinates[0] data-lat=card_user.loc.coordinates[1] style="background-image:url('#{image_uri}')", data-toggle="popover" data-trigger="hover" title="#{card_user.profile.name}")
    .name-location
      h3=card_user.profile.name.split(' ')[0]
      h4=card_user.profile.location
    p=card_user.aboutMe
    hr.separator
    .skill-icons
      each skill in card_user.skills.slice(0, 5)
        .skill-label #{skill.label}
  .card-footer
    .action-calls(data-toggle="modal", data-target="#requestModal", data-name="#{card_user.profile.name}" data-id="#{card_user.id}" data-skills=card_user.skills) Request me

Make request button a success button

.grid-item.user-card
  - var image_uri = card_user.profile.picture || '/images/person_placeholder.gif'
  - var bookmark_uri = curr_user.bookmarks.indexOf(card_user._id) >= 0 ? 'bookmark_active.svg' : 'bookmark_inactive.svg'
  img.bookmark(src='/images/#{bookmark_uri}', data-user-id=card_user.id)
  .profile-info
    .profile-pic(onclick='window.location = "/profile/#{card_user.id}"' class="#{card_user.match}" data-long=card_user.loc.coordinates[0] data-lat=card_user.loc.coordinates[1] style="background-image:url('#{image_uri}')", data-toggle="popover" data-trigger="hover" title="#{card_user.profile.name}")
    .name-location
      h3=card_user.profile.name.split(' ')[0]
      h4=card_user.profile.location
    p=card_user.aboutMe
    hr.separator
    .skill-icons
      each skill in card_user.skills.slice(0, 5)
        .skill-label #{skill.label}
  .card-footer
    button.btn.btn-success.action-calls(data-toggle="modal", data-target="#requestModal", data-name="#{card_user.profile.name}" data-id="#{card_user.id}" data-skills=card_user.skills) Request me


p
  strong Alt:
.alt-input.clearfix.hidden
  .input-wrapper
    input(type="text")
  .buttons-wrapper
    button.btn.add-button Add
    button.btn.cancel-button Cancel
.alt-dropdown-section.dropdown
  .select.select-alt(data-toggle="dropdown")
  ul.dropdown-menu.alt-dropdown(role = "menu")

p
  strong Format:
.dropdown
  .select.select-format(data-toggle = "dropdown")
  ul.dropdown-menu.format-dropdown(role = "menu")
    li
      a.select-format-dropdown-item(data-format="xy") Pokebank XY
    li
      a.select-format-dropdown-item(data-format="bw") Pokemon BW

p
  strong Select a team:
.dropdown
  .select.select-team(data-toggle = "dropdown")
    strong Your team
  ul.dropdown-menu.team-dropdown(role = "menu")

p
  strong Clauses:
ul.challenge_clauses.well
  for value, clause in window.Conditions
    - var checked = (defaultClauses.indexOf(value) >= 0)
    li
      label
        input(type = "checkbox", value = value, checked = checked)
        |  #{window.HumanizedConditions[clause]}

Copy change to Alternate Display Name

p
  strong Alternate Display Name:
.alt-input.clearfix.hidden
  .input-wrapper
    input(type="text")
  .buttons-wrapper
    button.btn.add-button Add
    button.btn.cancel-button Cancel
.alt-dropdown-section.dropdown
  .select.select-alt(data-toggle="dropdown")
  ul.dropdown-menu.alt-dropdown(role = "menu")

p
  strong Format:
.dropdown
  .select.select-format(data-toggle = "dropdown")
  ul.dropdown-menu.format-dropdown(role = "menu")
    li
      a.select-format-dropdown-item(data-format="xy") Pokebank XY
    li
      a.select-format-dropdown-item(data-format="bw") Pokemon BW

p
  strong Select a team:
.dropdown
  .select.select-team(data-toggle = "dropdown")
    strong Your team
  ul.dropdown-menu.team-dropdown(role = "menu")

p
  strong Clauses:
ul.challenge_clauses.well
  for value, clause in window.Conditions
    - var checked = (defaultClauses.indexOf(value) >= 0)
    li
      label
        input(type = "checkbox", value = value, checked = checked)
        |  #{window.HumanizedConditions[clause]}


.y-dialog-container
  .y-dialog.y-scoring-filter-dialog(data-dialog-width='500')
    .y-dialog-title-bar
      .y-dialog-title Filter Scorings
      .y-dialog-exit(data-bind='click:cancel')
        i.fa.fa-times
    .y-dialog-body
      div(style='max-height:300px;overflow:auto')
        // ko foreach:filters
        div(style='margin-bottom:20px;border-bottom:1px solid #eee')
          h1(data-bind="text:caption")
          // ko foreach:items
          .checkbox
            label
              input(type='checkbox' data-bind="checked:isChecked")
              span(data-bind="text:caption")
          // /ko
        // /ko
      .y-dialog-actions
        button.btn(data-bind='click:cancel') Cancel
        button.btn.btn-primary(data-bind='click:confirm') OK

Make filter headers collapsible PP-132

.y-dialog-container
  .y-dialog.y-scoring-filter-dialog(data-dialog-width='500')
    .y-dialog-title-bar
      .y-dialog-title Filter Scorings
      .y-dialog-exit(data-bind='click:cancel')
        i.fa.fa-times
    .y-dialog-body
      div(style='max-height:300px;overflow:auto')
        // ko foreach:filters
        div(style='margin-bottom:20px;border-bottom:1px solid #eee')
          h1(data-bind="text:caption, collapse:false")
          div
            // ko foreach:items
            .checkbox
              label
                input(type='checkbox' data-bind="checked:isChecked")
                span(data-bind="text:caption")
            // /ko
        // /ko
      .y-dialog-actions
        button.btn(data-bind='click:cancel') Cancel
        button.btn.btn-primary(data-bind='click:confirm') OK


extends ../node_modules/maki/views/layouts/default

block content
  h2 Shows

  for show in shows
    .ui.top.attached.segment
      h3
        a(href="/shows/#{show.slug}") #{show.name}
    .ui.attached.segment
      p #{show.description}
    .ui.buttons.bottom.attached.segment
      a.ui.button(href="/shows/#{show.slug}") View »
      if (show.website)
        a.ui.button(href="#{show.website}") Website
          i.external.icon

  if (user)
    h3 Create a Show

    form.ui.form.segment
      input(type="hidden", name="creator", value="#{user._id}")

      .field.required
        label Name
        input(type="text", name="name", required)

      .field
        label Description
        textarea(name="description", rows="3")

      h4 Donations
      .two.fields
        .field
          label Type
          select.ui.dropdown(name="donations[type]")
            option(value="bitcoin") Bitcoin
        .field
          label Destination
          input(type="text", name="donations[destination]")

      button.ui.blue.submit.button(type="submit") Create »

Switch to POST method for Show creation.

extends ../node_modules/maki/views/layouts/default

block content
  h2 Shows

  for show in shows
    .ui.top.attached.segment
      h3
        a(href="/shows/#{show.slug}") #{show.name}
    .ui.attached.segment
      p #{show.description}
    .ui.buttons.bottom.attached.segment
      a.ui.button(href="/shows/#{show.slug}") View »
      if (show.website)
        a.ui.button(href="#{show.website}") Website
          i.external.icon

  if (user)
    h3 Create a Show

    form.ui.form.segment(method="post")
      input(type="hidden", name="creator", value="#{user._id}")

      .field.required
        label Name
        input(type="text", name="name", required)

      .field
        label Description
        textarea(name="description", rows="3")

      h4 Donations
      .two.fields
        .field
          label Type
          select.ui.dropdown(name="donations[type]")
            option(value="bitcoin") Bitcoin
        .field
          label Destination
          input(type="text", name="donations[destination]")

      button.ui.blue.submit.button(type="submit") Create »


extends layout

block content
  h1= title
  p A simple tool for experimenting with JS libraries in your web console.
  p.
    Development versions of jQuery and Underscore are included in this page,
    with no other JavaScript files. To use your web console with these
    libraries, simply open it up on this page and hack away.

  footer
    © 2013
    a(href='http://thenickperson.com/') Nicolas McCurdy

  h2 Current libraries
  if activeLibraries
    ul: each activeLibrary in activeLibraries
      if activeLibrary
        li: a(href=activeLibrary.url)= activeLibrary.name
  else
    p none

  h2 All libraries
  form
    select.chosen-select(name='libraries', multiple, size=15)
      each library in libraries
        option(value=library.name)= library.name
    input(type='submit', value='Load')

  if activeLibraries
    each activeLibrary in activeLibraries
      if activeLibrary
        script(src=activeLibrary.url)

Fix an annoying jade warning

extends layout

block content
  h1= title
  p A simple tool for experimenting with JS libraries in your web console.
  p.
    Development versions of jQuery and Underscore are included in this page,
    with no other JavaScript files. To use your web console with these
    libraries, simply open it up on this page and hack away.

  footer
    | © 2013
    a(href='http://thenickperson.com/') Nicolas McCurdy

  h2 Current libraries
  if activeLibraries
    ul: each activeLibrary in activeLibraries
      if activeLibrary
        li: a(href=activeLibrary.url)= activeLibrary.name
  else
    p none

  h2 All libraries
  form
    select.chosen-select(name='libraries', multiple, size=15)
      each library in libraries
        option(value=library.name)= library.name
    input(type='submit', value='Load')

  if activeLibraries
    each activeLibrary in activeLibraries
      if activeLibrary
        script(src=activeLibrary.url)


.staticPage
	h1 Getting Bloom On Linux
	P Bloom 3 is currently available
		strong
			|  for testing
		| on Ubuntu Precise and Trusty.

	H3 Step 1: Add the repository to your sytem
	pre
		sudo echo have sudo
		wget -qO - http://packages.sil.org/sil.gpg | sudo apt-key add -
		wget -qO - http://linux.lsdev.sil.org/downloads/sil-testing.gpg | sudo apt-key add -
		sudo add-apt-repository "deb http://packages.sil.org/ubuntu $(lsb_release -sc) main"
		sudo add-apt-repository "deb http://packages.sil.org/ubuntu $(lsb_release -sc)-experimental main"
		sudo add-apt-repository "deb http://linux.lsdev.sil.org/ubuntu $(lsb_release -sc) main"
		sudo add-apt-repository "deb http://linux.lsdev.sil.org/ubuntu $(lsb_release -sc)-experimental main"
		sudo apt-get update
	H3 Step 2: Add Bloom Desktop
	pre
		sudo apt-get install bloom-desktop

	// H3 Reporting Errors

Add instructions for reporting errors of linux version

.staticPage
	h1 Getting Bloom On Linux
	P Bloom 3 is currently available
		strong
			|  for testing
		| on Ubuntu Precise and Trusty.

	H3 Step 1: Add the repository to your sytem
	pre
		sudo echo have sudo
		wget -qO - http://packages.sil.org/sil.gpg | sudo apt-key add -
		wget -qO - http://linux.lsdev.sil.org/downloads/sil-testing.gpg | sudo apt-key add -
		sudo add-apt-repository "deb http://packages.sil.org/ubuntu $(lsb_release -sc) main"
		sudo add-apt-repository "deb http://packages.sil.org/ubuntu $(lsb_release -sc)-experimental main"
		sudo add-apt-repository "deb http://linux.lsdev.sil.org/ubuntu $(lsb_release -sc) main"
		sudo add-apt-repository "deb http://linux.lsdev.sil.org/ubuntu $(lsb_release -sc)-experimental main"
		sudo apt-get update
		sudo apt-get dist-upgrade
	H3 Step 2: Add Bloom Desktop
	pre
		sudo apt-get install bloom-desktop

	H3 Reporting Errors While Testing

	p Start Bloom in a new Terminal. If Bloom dies/crashes,
		ol
			li Create a .txt file from the contents of the Terminal.
			li Look at /var/crash for a file created about the time of the Bloom crash.
			li Attach those files with information about what OS you were using (precise, trusty) (64bit, 32bit) and where the OS was running (Virtual Machine, Real hardware), and what you were doing.  Using Screenshot is a plus for when you feel that something is not quite right about what is happening.
			li Mail to issues at bloomlibrary dot o r g.


- s = connections.length === 1 ? '' : 's'
- connectionLabel = connections.length === 0 ? 'Loading Connections…' : connections.length + ' Connection' + s

header.BlockSidebar__header.js-connection-count
  = connectionLabel

.BlockConnectionsList.js-connections-list
  if connections.length
    for channel in connections
      include ../../../../components/connection_list/compact
  else
    include ../../../../components/connection_list/placeholder

.BlockConnectionsList.js-url-connections-list
  //- Rendered client-side

if user && user.has('username')
  .BlockConnect
    .Button.Button--size-sm.js-connect
      | Connect →

Connect join for logged out users

- s = connections.length === 1 ? '' : 's'
- connectionLabel = connections.length === 0 ? 'Loading Connections…' : connections.length + ' Connection' + s

header.BlockSidebar__header.js-connection-count
  = connectionLabel

.BlockConnectionsList.js-connections-list
  if connections.length
    for channel in connections
      include ../../../../components/connection_list/compact
  else
    include ../../../../components/connection_list/placeholder

.BlockConnectionsList.js-url-connections-list
  //- Rendered client-side

.BlockConnect
  if user && user.has('username')
    .Button.Button--size-sm.js-connect
      | Connect →
  else
    a.Button.Button--size-sm( href='/sign_up?ref=connect' )
      | Connect →