changeset 1053:94d7d5e38571

docs: Upgrade to Bootstrap 4 and Sass.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 28 Jan 2018 21:22:03 -0800
parents f8572df0756e
children 75f1b4460491
files docs/api/00__index.md docs/assets/css/piecrust.less docs/assets/css/piecrust.scss docs/assets/js/piecrust.js.concat docs/config.yml docs/docs/00__index.md docs/pages/_index.md docs/pages/getting-started.md docs/pages/support.md docs/templates/api.html docs/templates/default.html docs/templates/doc.html docs/templates/inc/main-navigation.html docs/templates/inc/nav-items.html docs/templates/inc/nav.html docs/templates/simple.html docs/templates/splash.html package-lock.json package.json
diffstat 19 files changed, 1118 insertions(+), 370 deletions(-) [+]
line wrap: on
line diff
--- a/docs/api/00__index.md	Sun Jan 28 21:21:32 2018 -0800
+++ b/docs/api/00__index.md	Sun Jan 28 21:22:03 2018 -0800
@@ -1,5 +1,6 @@
 ---
 title: Code
+api_key: code
 ---
 
 PieCrust can be extended with plugins in order to support additional features
--- a/docs/assets/css/piecrust.less	Sun Jan 28 21:21:32 2018 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,295 +0,0 @@
-// Imports
-@bootstrap-path: "../../../bower_components/bootstrap";
-
-// Core variables and mixins
-@import "@{bootstrap-path}/less/variables.less";
-@import "@{bootstrap-path}/less/mixins.less";
-
-// Reset and dependencies
-@import "@{bootstrap-path}/less/normalize.less";
-@import "@{bootstrap-path}/less/print.less";
-@import "@{bootstrap-path}/less/glyphicons.less";
-
-// Core CSS
-@import "@{bootstrap-path}/less/scaffolding.less";
-@import "@{bootstrap-path}/less/type.less";
-@import "@{bootstrap-path}/less/code.less";
-@import "@{bootstrap-path}/less/grid.less";
-@import "@{bootstrap-path}/less/forms.less";
-@import "@{bootstrap-path}/less/buttons.less";
-
-// Components
-@import "@{bootstrap-path}/less/component-animations.less";
-@import "@{bootstrap-path}/less/navs.less";
-@import "@{bootstrap-path}/less/navbar.less";
-
-// Utility classes
-@import "@{bootstrap-path}/less/utilities.less";
-@import "@{bootstrap-path}/less/responsive-utilities.less";
-
-
-// Variables
-@font-size-base:          17px;
-@font-family-base:        @font-family-serif;
-
-
-// Dividers
-.pc-divider-img(@offset-x, @offset-y) {
-    .hidden-xs();
-    content: " ";
-    background-image: url("../img/dividers.png");
-    background-repeat: no-repeat;
-    background-position: -@offset-x -@offset-y;
-    display: inline-block;
-    width: 100px;
-    height: 50px;
-}
-.pc-divider(@offset) {
-    &::before {
-        .pc-divider-img(0, @offset);
-        margin-right: 0.5em;
-    }
-    &::after {
-        .pc-divider-img(100px, @offset);
-        margin-left: 0.5em;
-    }
-}
-
-.pc-divider1() {
-    .pc-divider(0);
-}
-
-.pc-divider1-white() {
-    .pc-divider(50px);
-}
-
-.pc-divider2() {
-    .pc-divider(100px);
-}
-
-.pc-divider3() {
-    .pc-divider(150px);
-}
-
-
-// Icons
-@pc-icon-width: 128px;
-
-
-// Decorators
-.pc-decorator(@img-name, @margin-left) {
-    margin-left: @pc-icon-width;
-    &::before {
-        content: " ";
-        background-image: url(@img-name);
-        background-repeat: no-repeat;
-        display: block;
-        float: left;
-        width: 128px;
-        height: 92px;
-        margin-left: -(@pc-icon-width + @margin-left);
-    }
-}
-
-.pc-banner(@img-name) {
-    background-image: url(@img-name);
-    background-repeat: no-repeat;
-    background-position: center center;
-    background-size: cover;
-}
-
-.pc-banner-header(@img-name) {
-    .pc-banner(@img-name);
-    padding: 3em 0;
-    margin-bottom: 3em;
-    text-align: center;
-    color: black;
-}
-
-// Customizations
-.navbar {
-    margin-bottom: 0;
-}
-a.navbar-brand {
-    font-family: Lobster, serif;
-}
-
-h1 {
-    font-family: Lobster, serif;
-    font-size: 2em;
-    margin-top: 0;
-    margin-bottom: 0.375em;
-    text-shadow: #fff 0 0 1em, #fff 0 0 0.1em;
-}
-h1.site-title {
-    font-size: 5em;
-    text-align: center;
-}
-@media (min-width: @screen-sm-min) {
-    h1 {
-        font-size: 3em;
-    }
-}
-@media (min-width: @screen-md-min) {
-    h1 {
-        font-size: 4em;
-    }
-}
-
-h2 {
-    font-family: Lobster, serif;
-    font-size: 2.2em;
-}
-
-blockquote {
-    font-size: @font-size-base;
-    border-left: 5px solid @brand-info;
-}
-@media (min-width: @screen-sm-min) {
-    blockquote {
-        .pc-decorator('../img/cake.png', 5px + @line-height-computed);
-        min-height: 126px;
-    }
-}
-
-header.page-title h1 {
-    .pc-divider(150px);
-    text-align: center;
-    margin: 0.5em auto 1em;
-}
-
-footer {
-    .container;
-    font-size: 0.8em;
-    text-align: center;
-    margin: 2em;
-}
-
-
-// Splash-page
-header.splash {
-    .pc-banner("../img/header2-bg.jpg");
-    color: black;
-}
-.splash {
-    h1 {
-        .text-hide();
-    }
-
-    h2 {
-        .pc-divider2();
-        margin: 1em 0;
-        text-align: center;
-    }
-
-    .splash-logo {
-        background-image: url('../img/logo.png');
-        background-repeat: no-repeat;
-        background-position: center center;
-        background-size: contain;
-        height: 275px;
-    }
-    @media (min-width: @screen-sm-min) {
-        .splash-logo {
-            height: 325px;
-        }
-    }
-    @media (min-width: @screen-md-min) {
-        .splash-logo {
-            height: 375px;
-        }
-    }
-
-    .splash-main {
-        font-size: 1.1em;
-        margin: 1em 0.5em 0 0.5em;
-        padding-bottom: 2em;
-
-        p {
-            margin: 0;
-            text-shadow: #fff 0 0 1em, #fff 0 0 0.1em;
-        }
-    }
-    @media (min-width: @screen-sm-min) {
-        .splash-main {
-            font-size: 1.3em;
-            margin: 1em 2em 0 2em;
-        }
-    }
-    @media (min-width: @screen-md-min) {
-        .splash-main {
-            font-size: 1.5em;
-            width: 50%;
-            margin: 1em auto 0 auto;
-        }
-    }
-
-    .splash-icon {
-        display: block;
-        margin: 0 auto;
-    }
-}
-.splash.splash-chalkboard {
-    background: url("../img/chalkboard-bg.jpg");
-    color: white;
-    padding: 0.25em 0 3em 0;
-    margin: 0;
-
-    h2 {
-        .pc-divider1-white();
-    }
-}
-
-
-// Getting-Started
-header.tutorial {
-    .pc-banner-header("../img/header5-bg.jpg");
-}
-
-
-// Documentation
-header.documentation {
-    .pc-banner-header("../img/header10-bg.jpg");
-}
-
-.pc-docnav() {
-    list-style-type: none;
-    padding: 0;
-}
-
-ul.doc-level1 {
-    .pc-docnav();
-
-    &>li {
-        margin-bottom: 1em;
-    }
-    &>li>a {
-        font-size: 1.1em;
-        font-weight: bold;
-    }
-
-    @doc-link-active: darken(@brand-success, 10%);
-    a.active {
-        border-left: 3px solid @doc-link-active;
-        padding-left: 0.5em;
-        color: @doc-link-active;
-    }
-}
-
-ul.doc-level2 {
-    .pc-docnav();
-}
-
-
-// Code
-header.code {
-    .pc-banner-header("../img/header7-bg.jpg");
-}
-
-
-// Support
-header.support {
-    .pc-banner-header("../img/header9-bg.jpg");
-}
-
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/assets/css/piecrust.scss	Sun Jan 28 21:22:03 2018 -0800
@@ -0,0 +1,290 @@
+
+// Core variables and mixins
+@import "bootstrap-reboot";
+@import "bootstrap-grid";
+
+// Components
+@import "media";
+@import "nav";
+@import "navbar";
+@import "utilities";
+
+
+// Variables
+//$font-size-base:          17px;
+
+
+// Dividers
+@mixin pc-divider-img($offsetx, $offsety) {
+    @media (min-width: map-get($grid-breakpoints, 'sm')) {
+        display: inline-block;
+        content: " ";
+        background-image: url("../img/dividers.png");
+        background-repeat: no-repeat;
+        background-position: (-$offsetx) (-$offsety);
+        width: 100px;
+        height: 50px;
+
+    }
+}
+@mixin pc-divider($offset) {
+    &::before {
+        @include pc-divider-img(0, $offset);
+        margin-right: 0.5em;
+    }
+    &::after {
+        @include pc-divider-img(100px, $offset);
+        margin-left: 0.5em;
+    }
+}
+
+@mixin pc-divider1() {
+    @include pc-divider(0);
+}
+
+@mixin pc-divider1-white() {
+    @include pc-divider(50px);
+}
+
+@mixin pc-divider2() {
+    @include pc-divider(100px);
+}
+
+@mixin pc-divider3() {
+    @include pc-divider(150px);
+}
+
+
+// Icons
+$pc-icon-width: 128px;
+
+
+// Decorators
+@mixin pc-decorator($img-name, $margin-left) {
+    margin-left: $pc-icon-width;
+    &::before {
+        content: " ";
+        background-image: url($img-name);
+        background-repeat: no-repeat;
+        display: block;
+        float: left;
+        width: 128px;
+        height: 92px;
+        margin-left: -($pc-icon-width + $margin-left);
+    }
+}
+
+@mixin pc-banner($img-name) {
+    background-image: url($img-name);
+    background-repeat: no-repeat;
+    background-position: center center;
+    background-size: cover;
+}
+
+@mixin pc-banner-header($img-name) {
+    @include pc-banner($img-name);
+    padding: 0 0 3em 0;
+    margin-bottom: 3em;
+    text-align: center;
+    color: black;
+}
+
+// Customizations
+.navbar {
+    padding: 0 1rem;
+    background: #ffffff30;
+    text-shadow: #fff 0 0 1em, #fff 0 0 .1em;
+
+    a {
+        color: #000;
+        padding: 1rem 1rem;
+        
+        &:hover {
+            color: #fff;
+            background: #000000c0 !important;
+            text-shadow: #000 0 0 1em, #000 0 0 .1em;
+        }
+    }
+    a.active {
+        background: #ffffff60;
+    }
+}
+a.navbar-brand {
+    font-family: Lobster, serif;
+    padding: (1rem / 1.25) 1rem;
+}
+
+h1 {
+    font-family: Lobster, serif;
+    font-size: 2em;
+    margin-top: 0;
+    margin-bottom: 0.375em;
+    text-shadow: #fff 0 0 1em, #fff 0 0 0.1em;
+}
+h1.site-title {
+    font-size: 5em;
+    text-align: center;
+}
+@media (min-width: map-get($grid-breakpoints, "sm")) {
+    h1 {
+        font-size: 3em;
+    }
+}
+@media (min-width: map-get($grid-breakpoints, "md")) {
+    h1 {
+        font-size: 4em;
+    }
+}
+
+h2 {
+    font-family: Lobster, serif;
+    font-size: 2.2em;
+}
+
+blockquote {
+    font-size: $font-size-base;
+    border-left: 5px solid #f00; //$brand-info;
+}
+@media (min-width: map-get($grid-breakpoints, "md")) {
+    blockquote {
+        @include pc-decorator('../img/cake.png', 5px + $line-height-base);
+        min-height: 126px;
+    }
+}
+
+header.page-title h1 {
+    @include pc-divider(150px);
+    text-align: center;
+    margin: 0.5em auto 1em;
+}
+
+footer {
+    font-size: 0.8em;
+    text-align: center;
+    margin: 2em;
+}
+
+
+// Splash-page
+.pc-splash {
+    h2 {
+        @include pc-divider2();
+        margin: 1em 0;
+        text-align: center;
+    }
+
+    .pc-splash-logo {
+        background-image: url('../img/logo.png');
+        background-repeat: no-repeat;
+        background-position: center center;
+        background-size: contain;
+        height: 275px;
+    }
+    @media (min-width: map-get($grid-breakpoints, "sm")) {
+        .pc-splash-logo {
+            height: 325px;
+        }
+    }
+    @media (min-width: map-get($grid-breakpoints, "md")) {
+        .pc-splash-logo {
+            height: 375px;
+        }
+    }
+
+    .pc-splash-main {
+        font-size: 1.1em;
+        margin: 1em 0.5em 0 0.5em;
+        padding-bottom: 2em;
+
+        p {
+            margin: 0;
+            text-shadow: #fff 0 0 1em, #fff 0 0 0.1em;
+        }
+    }
+    @media (min-width: map-get($grid-breakpoints, "sm")) {
+        .pc-splash-main {
+            font-size: 1.3em;
+            margin: 1em 2em 0 2em;
+        }
+    }
+    @media (min-width: map-get($grid-breakpoints, "md")) {
+        .pc-splash-main {
+            font-size: 1.5em;
+            width: 50%;
+            margin: 1em auto 0 auto;
+        }
+    }
+
+    .pc-splash-icon {
+        display: block;
+        margin: 0 auto;
+    }
+}
+.pc-splash.pc-header-wrapper {
+    @include pc-banner("../img/header2-bg.jpg");
+    color: black;
+}
+.pc-splash.pc-splash-chalkboard {
+    background: url("../img/chalkboard-bg.jpg");
+    color: white;
+    padding: 0.25em 0 3em 0;
+    margin: 0;
+
+    h2 {
+        @include pc-divider1-white();
+    }
+}
+
+
+// Getting-Started
+.pc-tutorial {
+    @include pc-banner-header("../img/header5-bg.jpg");
+}
+
+
+// Documentation
+.pc-documentation {
+    @include pc-banner-header("../img/header10-bg.jpg");
+}
+
+@mixin pc-docnav() {
+    list-style-type: none;
+    padding: 0;
+}
+
+ul.doc-level1 {
+    @include pc-docnav();
+
+    &>li {
+        margin-bottom: 1em;
+    }
+    &>li>a {
+        font-size: 1.1em;
+        font-weight: bold;
+    }
+
+    $doc-link-active: #f00; //darken($brand-success, 10%);
+    a.active {
+        border-left: 3px solid $doc-link-active;
+        padding-left: 0.5em;
+        color: $doc-link-active;
+    }
+}
+
+ul.doc-level2 {
+    @include pc-docnav();
+}
+
+
+// Code
+.pc-code {
+    @include pc-banner-header("../img/header7-bg.jpg");
+}
+
+
+// Support
+.pc-support {
+    @include pc-banner-header("../img/header9-bg.jpg");
+}
+
+
--- a/docs/assets/js/piecrust.js.concat	Sun Jan 28 21:21:32 2018 -0800
+++ b/docs/assets/js/piecrust.js.concat	Sun Jan 28 21:22:03 2018 -0800
@@ -1,7 +1,6 @@
 path_mode: absolute
 files:
-  - ../bower_components/jquery/dist/jquery.js
-  - ../bower_components/bootstrap/js/transition.js
-  - ../bower_components/bootstrap/js/collapse.js
-  - ../bower_components/bootstrap/js/scrollspy.js
+  - ../node_modules/jquery/dist/jquery.js
+  - ../node_modules/bootstrap/js/dist/collapse.js
+  - ../node_modules/bootstrap/js/dist/scrollspy.js
 
--- a/docs/config.yml	Sun Jan 28 21:21:32 2018 -0800
+++ b/docs/config.yml	Sun Jan 28 21:22:03 2018 -0800
@@ -5,6 +5,9 @@
     tagline: Freshly baked sites & documents since 2006
     description: A static website generator and flat-file CMS
     pretty_urls: true
+    default_format: pymarkdown
+    auto_formats:
+        md: pymarkdown
     sources:
         docs:
             type: ordered
@@ -38,14 +41,8 @@
             css_class: highlight
             guess_lang: false
 
-# Need Foundation for CSS/JS. Install with Bower.
+# Need Bootstrap.
 sass:
     load_paths:
-        - bower_components/foundation/scss
+        - ../node_modules/bootstrap/scss
 
-# Using the Sass compiler directly now, but here's how it would look
-# like if we were using the whole Compass machinery instead.
-compass:
-    enable: false
-    options: --css-dir %out_dir%/css --generated-images-path %out_dir%/img
-
--- a/docs/docs/00__index.md	Sun Jan 28 21:21:32 2018 -0800
+++ b/docs/docs/00__index.md	Sun Jan 28 21:22:03 2018 -0800
@@ -1,5 +1,6 @@
 ---
 title: Documentation
+nav_key: docs
 ---
 
 Using PieCrust is mostly a matter of editing text files and, sometimes, running
--- a/docs/pages/_index.md	Sun Jan 28 21:21:32 2018 -0800
+++ b/docs/pages/_index.md	Sun Jan 28 21:22:03 2018 -0800
@@ -1,6 +1,7 @@
 ---
 title: PieCrust
 layout: splash
+header_class: pc-splash
 ---
 
 ---slogan---
--- a/docs/pages/getting-started.md	Sun Jan 28 21:21:32 2018 -0800
+++ b/docs/pages/getting-started.md	Sun Jan 28 21:22:03 2018 -0800
@@ -1,6 +1,7 @@
 ---
 title: Getting Started
-header_class: tutorial
+header_class: pc-tutorial
+nav_key: tutorial
 ---
 
 This quick tutorial will show you how to create a simple blog with PieCrust.
--- a/docs/pages/support.md	Sun Jan 28 21:21:32 2018 -0800
+++ b/docs/pages/support.md	Sun Jan 28 21:22:03 2018 -0800
@@ -1,6 +1,7 @@
 ---
 title: Support
-header_class: support
+header_class: pc-support
+nav_key: support
 ---
 
 Want to know what's new with PieCrust? Check out the [CHANGELOG][ch].
--- a/docs/templates/api.html	Sun Jan 28 21:21:32 2018 -0800
+++ b/docs/templates/api.html	Sun Jan 28 21:22:03 2018 -0800
@@ -1,8 +1,3 @@
+{% set header_class = 'pc-code' %}
 {% extends "section-page.html" %}
 
-{% block header %}
-<header class="code">
-    <h1>{{ page.title }}</h1>
-</header>
-{% endblock %}
-
--- a/docs/templates/default.html	Sun Jan 28 21:21:32 2018 -0800
+++ b/docs/templates/default.html	Sun Jan 28 21:22:03 2018 -0800
@@ -19,33 +19,20 @@
 </head>
 <body data-spy="scroll">
     <div id="wrapper">
-        <nav class="navbar navbar-default" role="navigation">
-            <div class="container">
-                <div class="navbar-header">
-                    <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#piecrust-menu">
-                        <span class="sr-only">Toggle navigation</span>
-                        <span class="icon-bar"></span>
-                        <span class="icon-bar"></span>
-                        <span class="icon-bar"></span>
-                    </button>
-                    <a class="navbar-brand" href="{{site.root}}">PieCrust</a>
-                </div>
-                <div class="collapse navbar-collapse" id="piecrust-menu">
-                    {% include 'inc/main-navigation.html' %}
-                </div>
-            </div>
-        </nav>
-        {% block header %}
-        <header{% if page.header_class %} class="{{page.header_class}}"{% endif %}>
-            <h1>{{ page.title }}</h1>
-        </header>
-        {% endblock %}
+        <div class="pc-header-wrapper{% if page.header_class or header_class %} {{ page.header_class|default(header_class) }}{% endif %}">
+            {% include 'inc/nav.html' %}
+            <header>
+                {% block header %}
+                <h1>{{ page.title }}</h1>
+                {% endblock %}
+            </header>
+        </div>
         {% block content %}
         <section class="container" id="content">
         {{ content|safe }}
         </section>
         {% endblock %}
-        <footer>
+        <footer class="container">
             <p>&copy;2014 &mdash; {{ piecrust.branding|safe }}</p>
         </footer>
     </div>
--- a/docs/templates/doc.html	Sun Jan 28 21:21:32 2018 -0800
+++ b/docs/templates/doc.html	Sun Jan 28 21:22:03 2018 -0800
@@ -1,8 +1,3 @@
+{% set header_class = 'pc-documentation' %}
 {% extends "section-page.html" %}
 
-{% block header %}
-<header class="documentation">
-    <h1>{{ page.title }}</h1>
-</header>
-{% endblock %}
-
--- a/docs/templates/inc/main-navigation.html	Sun Jan 28 21:21:32 2018 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-<ul class="nav navbar-nav navbar-right">
-    <li><a href="{{ pcurl('getting-started') }}">Getting Started</a></li>
-    <li><a href="{{ pcurl('docs') }}">Documentation</a></li>
-    <li><a href="{{ pcurl('api') }}">Code</a></li>
-    <li><a href="{{ pcurl('support') }}">Support</a></li>
-</ul>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/templates/inc/nav-items.html	Sun Jan 28 21:22:03 2018 -0800
@@ -0,0 +1,6 @@
+<ul class="navbar-nav ml-auto">
+    <li class="nav-item"><a class="nav-link{% if page.nav_key == 'tutorial' %} active{% endif %}" href="{{ pcurl('getting-started') }}">Getting Started</a></li>
+    <li class="nav-item"><a class="nav-link{% if page.nav_key == 'docs' %} active{% endif %}" href="{{ pcurl('docs') }}">Documentation</a></li>
+    <li class="nav-item"><a class="nav-link{% if page.nav_key == 'code' %} active{% endif %}" href="{{ pcurl('api') }}">Code</a></li>
+    <li class="nav-item"><a class="nav-link{% if page.nav_key == 'support' %} active{% endif %}" href="{{ pcurl('support') }}">Support</a></li>
+</ul>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/templates/inc/nav.html	Sun Jan 28 21:22:03 2018 -0800
@@ -0,0 +1,9 @@
+<nav class="navbar navbar-expand-md" role="navigation">
+    <a class="navbar-brand" href="{{site.root}}">PieCrust</a>
+    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#piecrust-menu" aria-controls="piecrust-menu" aria-expanded="false" aria-label="Toggle navigation">
+        <span class="navbar-toggler-icon"></span>
+    </button>
+    <div class="collapse navbar-collapse" id="piecrust-menu">
+        {% include 'inc/nav-items.html' %}
+    </div>
+</nav>
--- a/docs/templates/simple.html	Sun Jan 28 21:21:32 2018 -0800
+++ b/docs/templates/simple.html	Sun Jan 28 21:22:03 2018 -0800
@@ -1,6 +1,5 @@
 {% extends "default.html" %}
 
 {% block header %}
-    <br/>
 {% endblock %}
 
--- a/docs/templates/splash.html	Sun Jan 28 21:21:32 2018 -0800
+++ b/docs/templates/splash.html	Sun Jan 28 21:22:03 2018 -0800
@@ -1,18 +1,16 @@
+{% set header_class = 'pc-documentation' %}
 {% extends "default.html" %}
 
 {% block header %}
-<header class="splash">
-    <h1>PieCurst</h1>
-    <div class="splash-logo">
-    </div>
-    <div class="splash-main">
-        {{main|safe}}
-    </div>
-</header>
+<h1 class="sr-only">{{page.title}}</h1>
+<div class="pc-splash-logo"></div>
+<div class="pc-splash-main">
+    {{main|safe}}
+</div>
 {% endblock %}
 
 {% block content %}
-<section class="splash splash-chalkboard">
+<section class="pc-splash pc-splash-chalkboard">
     <div class="container">
         <h2>Chef's Features</h2>
         <div class="row">
@@ -21,21 +19,21 @@
                 {{simple|safe}}
             </div>
             <div class="col-sm-6 col-md-4">
-                <img class="splash-icon hidden-xs" src="{{site.root}}img/chef-hat-white.png" />
+                <img class="splash-icon d-none d-sm-block" src="{{site.root}}img/chef-hat-white.png" />
                 {{bake|safe}}
             </div>
-            <div class="clearfix visible-sm-block"></div>
+            <div class="clearfix d-none d-sm-block"></div>
             <div class="col-sm-6 col-md-4">
-                <img class="splash-icon hidden-sm" src="{{site.root}}img/whisk-white.png" />
+                <img class="splash-icon d-sm-none d-md-block" src="{{site.root}}img/whisk-white.png" />
                 {{ingr|safe}}
             </div>
-            <div class="clearfix visible-md-block visible-lg-block"></div>
+            <div class="clearfix d-none d-md-block"></div>
             <div class="col-sm-6 col-md-4">
                 {{oven|safe}}
             </div>
-            <div class="clearfix visible-sm-block"></div>
+            <div class="clearfix d-none d-sm-block"></div>
             <div class="col-sm-6 col-md-4">
-                <img class="splash-icon visible-xs" src="{{site.root}}img/chef-hat-white.png" />
+                <img class="splash-icon d-sm-none" src="{{site.root}}img/chef-hat-white.png" />
                 {{fast|safe}}
             </div>
             <div class="col-sm-6 col-md-4">
@@ -44,10 +42,10 @@
         </div>
     </div>
 </section>
-<section class="splash splash-board">
+<section class="pc-splash pc-splash-board">
     <div class="container">
         <div class="row">
-            <div class="col-xs-12 col-md-8 col-md-offset-2">
+            <div class="col-xs-12 col-md-9 offset-md-1 col-lg-8 offset-lg-2">
                 {{startnow|safe}}
             </div>
         </div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/package-lock.json	Sun Jan 28 21:22:03 2018 -0800
@@ -0,0 +1,766 @@
+{
+  "name": "PieCrust",
+  "version": "1.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "ajv": {
+      "version": "4.11.8",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
+      "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
+      "optional": true,
+      "requires": {
+        "co": "4.6.0",
+        "json-stable-stringify": "1.0.1"
+      }
+    },
+    "align-text": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+      "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+      "requires": {
+        "kind-of": "3.2.2",
+        "longest": "1.0.1",
+        "repeat-string": "1.6.1"
+      }
+    },
+    "asap": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+      "optional": true
+    },
+    "asn1": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+      "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
+      "optional": true
+    },
+    "assert-plus": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
+      "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
+      "optional": true
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+      "optional": true
+    },
+    "aws-sign2": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+      "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
+      "optional": true
+    },
+    "aws4": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
+      "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
+      "optional": true
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+    },
+    "bcrypt-pbkdf": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
+      "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
+      "optional": true,
+      "requires": {
+        "tweetnacl": "0.14.5"
+      }
+    },
+    "boom": {
+      "version": "2.10.1",
+      "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+      "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+      "requires": {
+        "hoek": "2.16.3"
+      }
+    },
+    "bootstrap": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0.tgz",
+      "integrity": "sha512-gulJE5dGFo6Q61V/whS6VM4WIyrlydXfCgkE+Gxe5hjrJ8rXLLZlALq7zq2RPhOc45PSwQpJkrTnc2KgD6cvmA=="
+    },
+    "brace-expansion": {
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
+      "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+      "requires": {
+        "balanced-match": "1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "camelcase": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+      "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+      "optional": true
+    },
+    "center-align": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+      "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+      "requires": {
+        "align-text": "0.1.4",
+        "lazy-cache": "1.0.4"
+      }
+    },
+    "clean-css-cli": {
+      "version": "4.1.10",
+      "resolved": "https://registry.npmjs.org/clean-css-cli/-/clean-css-cli-4.1.10.tgz",
+      "integrity": "sha1-g2JMkEY0FCGHXMYKKJSzgvfKDKY=",
+      "requires": {
+        "clean-css": "4.1.9",
+        "commander": "2.13.0",
+        "glob": "7.1.2"
+      },
+      "dependencies": {
+        "clean-css": {
+          "version": "4.1.9",
+          "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz",
+          "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=",
+          "requires": {
+            "source-map": "0.5.7"
+          }
+        }
+      }
+    },
+    "cliui": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+      "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+      "requires": {
+        "center-align": "0.1.3",
+        "right-align": "0.1.3",
+        "wordwrap": "0.0.2"
+      }
+    },
+    "co": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+      "optional": true
+    },
+    "combined-stream": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
+      "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
+      "requires": {
+        "delayed-stream": "1.0.0"
+      }
+    },
+    "commander": {
+      "version": "2.13.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
+      "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA=="
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+      "optional": true
+    },
+    "cryptiles": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+      "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+      "optional": true,
+      "requires": {
+        "boom": "2.10.1"
+      }
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "optional": true,
+      "requires": {
+        "assert-plus": "1.0.0"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "optional": true
+        }
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+    },
+    "ecc-jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+      "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+      "optional": true,
+      "requires": {
+        "jsbn": "0.1.1"
+      }
+    },
+    "errno": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz",
+      "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==",
+      "optional": true,
+      "requires": {
+        "prr": "1.0.1"
+      }
+    },
+    "extend": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+      "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
+      "optional": true
+    },
+    "extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+    },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+      "optional": true
+    },
+    "form-data": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
+      "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+      "optional": true,
+      "requires": {
+        "asynckit": "0.4.0",
+        "combined-stream": "1.0.5",
+        "mime-types": "2.1.17"
+      }
+    },
+    "foundation-sites": {
+      "version": "6.4.4-rc1",
+      "resolved": "https://registry.npmjs.org/foundation-sites/-/foundation-sites-6.4.4-rc1.tgz",
+      "integrity": "sha512-26cL66QFNqMVwM7bmIEqq4jiW+6CkIeW719ci1pchdJ4UK0Om+3Jl7MhkX/lzdzRHB75f2m1IK9lxk3JGOwApA==",
+      "requires": {
+        "jquery": "3.3.1",
+        "what-input": "4.3.1"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "optional": true,
+      "requires": {
+        "assert-plus": "1.0.0"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "optional": true
+        }
+      }
+    },
+    "glob": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+      "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+      "requires": {
+        "fs.realpath": "1.0.0",
+        "inflight": "1.0.6",
+        "inherits": "2.0.3",
+        "minimatch": "3.0.4",
+        "once": "1.4.0",
+        "path-is-absolute": "1.0.1"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.1.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+      "optional": true
+    },
+    "har-schema": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
+      "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=",
+      "optional": true
+    },
+    "har-validator": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
+      "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
+      "optional": true,
+      "requires": {
+        "ajv": "4.11.8",
+        "har-schema": "1.0.5"
+      }
+    },
+    "hawk": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+      "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+      "optional": true,
+      "requires": {
+        "boom": "2.10.1",
+        "cryptiles": "2.0.5",
+        "hoek": "2.16.3",
+        "sntp": "1.0.9"
+      }
+    },
+    "hoek": {
+      "version": "2.16.3",
+      "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+      "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0="
+    },
+    "http-signature": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+      "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+      "optional": true,
+      "requires": {
+        "assert-plus": "0.2.0",
+        "jsprim": "1.4.1",
+        "sshpk": "1.13.1"
+      }
+    },
+    "image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
+      "optional": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "requires": {
+        "once": "1.4.0",
+        "wrappy": "1.0.2"
+      }
+    },
+    "inherits": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+      "optional": true
+    },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+      "optional": true
+    },
+    "jquery": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz",
+      "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg=="
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+      "optional": true
+    },
+    "json-schema": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+      "optional": true
+    },
+    "json-stable-stringify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+      "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+      "optional": true,
+      "requires": {
+        "jsonify": "0.0.0"
+      }
+    },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+      "optional": true
+    },
+    "jsonify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+      "optional": true
+    },
+    "jsprim": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "optional": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.2.3",
+        "verror": "1.10.0"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "optional": true
+        }
+      }
+    },
+    "kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "requires": {
+        "is-buffer": "1.1.6"
+      }
+    },
+    "lazy-cache": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+      "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
+    },
+    "less": {
+      "version": "2.7.3",
+      "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz",
+      "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==",
+      "requires": {
+        "errno": "0.1.6",
+        "graceful-fs": "4.1.11",
+        "image-size": "0.5.5",
+        "mime": "1.6.0",
+        "mkdirp": "0.5.1",
+        "promise": "7.3.1",
+        "request": "2.81.0",
+        "source-map": "0.5.7"
+      }
+    },
+    "longest": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+      "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
+    },
+    "mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "optional": true
+    },
+    "mime-db": {
+      "version": "1.30.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
+      "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE="
+    },
+    "mime-types": {
+      "version": "2.1.17",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
+      "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
+      "requires": {
+        "mime-db": "1.30.0"
+      }
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "requires": {
+        "brace-expansion": "1.1.8"
+      }
+    },
+    "minimist": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+      "optional": true
+    },
+    "mkdirp": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+      "optional": true,
+      "requires": {
+        "minimist": "0.0.8"
+      }
+    },
+    "oauth-sign": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+      "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+      "optional": true
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "requires": {
+        "wrappy": "1.0.2"
+      }
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+    },
+    "performance-now": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
+      "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=",
+      "optional": true
+    },
+    "promise": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+      "optional": true,
+      "requires": {
+        "asap": "2.0.6"
+      }
+    },
+    "prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+      "optional": true
+    },
+    "punycode": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+      "optional": true
+    },
+    "qs": {
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
+      "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
+      "optional": true
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+    },
+    "request": {
+      "version": "2.81.0",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
+      "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
+      "optional": true,
+      "requires": {
+        "aws-sign2": "0.6.0",
+        "aws4": "1.6.0",
+        "caseless": "0.12.0",
+        "combined-stream": "1.0.5",
+        "extend": "3.0.1",
+        "forever-agent": "0.6.1",
+        "form-data": "2.1.4",
+        "har-validator": "4.2.1",
+        "hawk": "3.1.3",
+        "http-signature": "1.1.1",
+        "is-typedarray": "1.0.0",
+        "isstream": "0.1.2",
+        "json-stringify-safe": "5.0.1",
+        "mime-types": "2.1.17",
+        "oauth-sign": "0.8.2",
+        "performance-now": "0.2.0",
+        "qs": "6.4.0",
+        "safe-buffer": "5.1.1",
+        "stringstream": "0.0.5",
+        "tough-cookie": "2.3.3",
+        "tunnel-agent": "0.6.0",
+        "uuid": "3.2.1"
+      }
+    },
+    "right-align": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+      "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+      "requires": {
+        "align-text": "0.1.4"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+      "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
+    },
+    "sntp": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+      "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+      "optional": true,
+      "requires": {
+        "hoek": "2.16.3"
+      }
+    },
+    "source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+    },
+    "sshpk": {
+      "version": "1.13.1",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
+      "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
+      "optional": true,
+      "requires": {
+        "asn1": "0.2.3",
+        "assert-plus": "1.0.0",
+        "bcrypt-pbkdf": "1.0.1",
+        "dashdash": "1.14.1",
+        "ecc-jsbn": "0.1.1",
+        "getpass": "0.1.7",
+        "jsbn": "0.1.1",
+        "tweetnacl": "0.14.5"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "optional": true
+        }
+      }
+    },
+    "stringstream": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
+      "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
+      "optional": true
+    },
+    "tough-cookie": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz",
+      "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=",
+      "optional": true,
+      "requires": {
+        "punycode": "1.4.1"
+      }
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "optional": true,
+      "requires": {
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+      "optional": true
+    },
+    "uglify-js": {
+      "version": "2.8.29",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+      "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+      "requires": {
+        "source-map": "0.5.7",
+        "uglify-to-browserify": "1.0.2",
+        "yargs": "3.10.0"
+      }
+    },
+    "uglify-to-browserify": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+      "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+      "optional": true
+    },
+    "uuid": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
+      "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==",
+      "optional": true
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "optional": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "1.3.0"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "optional": true
+        }
+      }
+    },
+    "what-input": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/what-input/-/what-input-4.3.1.tgz",
+      "integrity": "sha512-7KD71RWNRWI9M08shZ8+n/2UjO5amwsG9PMSXWz0iIlH8H2DVbHE8Z2tW1RqQa0kIwdeqdUIffFz7crDfkcbAw=="
+    },
+    "window-size": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+      "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
+    },
+    "wordwrap": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+      "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+    },
+    "yargs": {
+      "version": "3.10.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+      "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+      "requires": {
+        "camelcase": "1.2.1",
+        "cliui": "2.1.0",
+        "decamelize": "1.2.0",
+        "window-size": "0.1.0"
+      }
+    }
+  }
+}
--- a/package.json	Sun Jan 28 21:21:32 2018 -0800
+++ b/package.json	Sun Jan 28 21:22:03 2018 -0800
@@ -3,8 +3,11 @@
   "version": "1.0.0",
   "license": "Apache-2.0",
   "repository": "http://bitbucket.org/ludovicchabant/piecrust2",
-  "devDependencies": {
+  "dependencies": {
+    "bootstrap": "^4.0.0",
     "clean-css": "^3.4.9",
+    "clean-css-cli": "^4.1.10",
+    "foundation-sites": "^6.4.4-rc1",
     "gulp": "~3.9.0",
     "gulp-concat": "~2.6.0",
     "gulp-cssnano": "^2.1.1",
@@ -14,7 +17,7 @@
     "gulp-sourcemaps": "~1.6.0",
     "gulp-uglify": "^1.5.2",
     "gulp-util": "~3.0.7",
-    "less": "^2.6.0",
-    "uglify-js": "^2.6.1"
+    "less": "^2.7.3",
+    "uglify-js": "^2.8.29"
   }
 }