couchdb-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From nsla...@apache.org
Subject [17/51] [partial] Bring Fauxton directories together
Date Sat, 14 Dec 2013 11:41:23 GMT
http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/assets/less/bootstrap/tooltip.less
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/assets/less/bootstrap/tooltip.less b/share/www/fauxton/src/assets/less/bootstrap/tooltip.less
new file mode 100644
index 0000000..83d5f2b
--- /dev/null
+++ b/share/www/fauxton/src/assets/less/bootstrap/tooltip.less
@@ -0,0 +1,70 @@
+//
+// Tooltips
+// --------------------------------------------------
+
+
+// Base class
+.tooltip {
+  position: absolute;
+  z-index: @zindexTooltip;
+  display: block;
+  visibility: visible;
+  font-size: 11px;
+  line-height: 1.4;
+  .opacity(0);
+  &.in     { .opacity(80); }
+  &.top    { margin-top:  -3px; padding: 5px 0; }
+  &.right  { margin-left:  3px; padding: 0 5px; }
+  &.bottom { margin-top:   3px; padding: 5px 0; }
+  &.left   { margin-left: -3px; padding: 0 5px; }
+}
+
+// Wrapper for the tooltip content
+.tooltip-inner {
+  max-width: 200px;
+  padding: 8px;
+  color: @tooltipColor;
+  text-align: center;
+  text-decoration: none;
+  background-color: @tooltipBackground;
+  .border-radius(@baseBorderRadius);
+}
+
+// Arrows
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.tooltip {
+  &.top .tooltip-arrow {
+    bottom: 0;
+    left: 50%;
+    margin-left: -@tooltipArrowWidth;
+    border-width: @tooltipArrowWidth @tooltipArrowWidth 0;
+    border-top-color: @tooltipArrowColor;
+  }
+  &.right .tooltip-arrow {
+    top: 50%;
+    left: 0;
+    margin-top: -@tooltipArrowWidth;
+    border-width: @tooltipArrowWidth @tooltipArrowWidth @tooltipArrowWidth 0;
+    border-right-color: @tooltipArrowColor;
+  }
+  &.left .tooltip-arrow {
+    top: 50%;
+    right: 0;
+    margin-top: -@tooltipArrowWidth;
+    border-width: @tooltipArrowWidth 0 @tooltipArrowWidth @tooltipArrowWidth;
+    border-left-color: @tooltipArrowColor;
+  }
+  &.bottom .tooltip-arrow {
+    top: 0;
+    left: 50%;
+    margin-left: -@tooltipArrowWidth;
+    border-width: 0 @tooltipArrowWidth @tooltipArrowWidth;
+    border-bottom-color: @tooltipArrowColor;
+  }
+}

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/assets/less/bootstrap/type.less
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/assets/less/bootstrap/type.less b/share/www/fauxton/src/assets/less/bootstrap/type.less
new file mode 100644
index 0000000..337138a
--- /dev/null
+++ b/share/www/fauxton/src/assets/less/bootstrap/type.less
@@ -0,0 +1,247 @@
+//
+// Typography
+// --------------------------------------------------
+
+
+// Body text
+// -------------------------
+
+p {
+  margin: 0 0 @baseLineHeight / 2;
+}
+.lead {
+  margin-bottom: @baseLineHeight;
+  font-size: @baseFontSize * 1.5;
+  font-weight: 200;
+  line-height: @baseLineHeight * 1.5;
+}
+
+
+// Emphasis & misc
+// -------------------------
+
+// Ex: 14px base font * 85% = about 12px
+small   { font-size: 85%; }
+
+strong  { font-weight: bold; }
+em      { font-style: italic; }
+cite    { font-style: normal; }
+
+// Utility classes
+.muted               { color: @grayLight; }
+a.muted:hover,
+a.muted:focus        { color: darken(@grayLight, 10%); }
+
+.text-warning        { color: @warningText; }
+a.text-warning:hover,
+a.text-warning:focus { color: darken(@warningText, 10%); }
+
+.text-error          { color: @errorText; }
+a.text-error:hover,
+a.text-error:focus   { color: darken(@errorText, 10%); }
+
+.text-info           { color: @infoText; }
+a.text-info:hover,
+a.text-info:focus    { color: darken(@infoText, 10%); }
+
+.text-success        { color: @successText; }
+a.text-success:hover,
+a.text-success:focus { color: darken(@successText, 10%); }
+
+.text-left           { text-align: left; }
+.text-right          { text-align: right; }
+.text-center         { text-align: center; }
+
+
+// Headings
+// -------------------------
+
+h1, h2, h3, h4, h5, h6 {
+  margin: (@baseLineHeight / 2) 0;
+  font-family: @headingsFontFamily;
+  font-weight: @headingsFontWeight;
+  line-height: @baseLineHeight;
+  color: @headingsColor;
+  text-rendering: optimizelegibility; // Fix the character spacing for headings
+  small {
+    font-weight: normal;
+    line-height: 1;
+    color: @grayLight;
+  }
+}
+
+h1,
+h2,
+h3 { line-height: @baseLineHeight * 2; }
+
+h1 { font-size: @baseFontSize * 2.75; } // ~38px
+h2 { font-size: @baseFontSize * 2.25; } // ~32px
+h3 { font-size: @baseFontSize * 1.75; } // ~24px
+h4 { font-size: @baseFontSize * 1.25; } // ~18px
+h5 { font-size: @baseFontSize; }
+h6 { font-size: @baseFontSize * 0.85; } // ~12px
+
+h1 small { font-size: @baseFontSize * 1.75; } // ~24px
+h2 small { font-size: @baseFontSize * 1.25; } // ~18px
+h3 small { font-size: @baseFontSize; }
+h4 small { font-size: @baseFontSize; }
+
+
+// Page header
+// -------------------------
+
+.page-header {
+  padding-bottom: (@baseLineHeight / 2) - 1;
+  margin: @baseLineHeight 0 (@baseLineHeight * 1.5);
+  border-bottom: 1px solid @grayLighter;
+}
+
+
+
+// Lists
+// --------------------------------------------------
+
+// Unordered and Ordered lists
+ul, ol {
+  padding: 0;
+  margin: 0 0 @baseLineHeight / 2 25px;
+}
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+}
+li {
+  line-height: @baseLineHeight;
+}
+
+// Remove default list styles
+ul.unstyled,
+ol.unstyled {
+  margin-left: 0;
+  list-style: none;
+}
+
+// Single-line list items
+ul.inline,
+ol.inline {
+  margin-left: 0;
+  list-style: none;
+  > li {
+    display: inline-block;
+    .ie7-inline-block();
+    padding-left: 5px;
+    padding-right: 5px;
+  }
+}
+
+// Description Lists
+dl {
+  margin-bottom: @baseLineHeight;
+}
+dt,
+dd {
+  line-height: @baseLineHeight;
+}
+dt {
+  font-weight: bold;
+}
+dd {
+  margin-left: @baseLineHeight / 2;
+}
+// Horizontal layout (like forms)
+.dl-horizontal {
+  .clearfix(); // Ensure dl clears floats if empty dd elements present
+  dt {
+    float: left;
+    width: @horizontalComponentOffset - 20;
+    clear: left;
+    text-align: right;
+    .text-overflow();
+  }
+  dd {
+    margin-left: @horizontalComponentOffset;
+  }
+}
+
+// MISC
+// ----
+
+// Horizontal rules
+hr {
+  margin: @baseLineHeight 0;
+  border: 0;
+  border-top: 1px solid @hrBorder;
+  border-bottom: 1px solid @white;
+}
+
+// Abbreviations and acronyms
+abbr[title],
+// Added data-* attribute to help out our tooltip plugin, per https://github.com/twitter/bootstrap/issues/5257
+abbr[data-original-title] {
+  cursor: help;
+  border-bottom: 1px dotted @grayLight;
+}
+abbr.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+
+// Blockquotes
+blockquote {
+  padding: 0 0 0 15px;
+  margin: 0 0 @baseLineHeight;
+  border-left: 5px solid @grayLighter;
+  p {
+    margin-bottom: 0;
+    font-size: @baseFontSize * 1.25;
+    font-weight: 300;
+    line-height: 1.25;
+  }
+  small {
+    display: block;
+    line-height: @baseLineHeight;
+    color: @grayLight;
+    &:before {
+      content: '\2014 \00A0';
+    }
+  }
+
+  // Float right with text-align: right
+  &.pull-right {
+    float: right;
+    padding-right: 15px;
+    padding-left: 0;
+    border-right: 5px solid @grayLighter;
+    border-left: 0;
+    p,
+    small {
+      text-align: right;
+    }
+    small {
+      &:before {
+        content: '';
+      }
+      &:after {
+        content: '\00A0 \2014';
+      }
+    }
+  }
+}
+
+// Quotes
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+  content: "";
+}
+
+// Addresses
+address {
+  display: block;
+  margin-bottom: @baseLineHeight;
+  font-style: normal;
+  line-height: @baseLineHeight;
+}

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/assets/less/bootstrap/utilities.less
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/assets/less/bootstrap/utilities.less b/share/www/fauxton/src/assets/less/bootstrap/utilities.less
new file mode 100644
index 0000000..314b4ff
--- /dev/null
+++ b/share/www/fauxton/src/assets/less/bootstrap/utilities.less
@@ -0,0 +1,30 @@
+//
+// Utility classes
+// --------------------------------------------------
+
+
+// Quick floats
+.pull-right {
+  float: right;
+}
+.pull-left {
+  float: left;
+}
+
+// Toggling content
+.hide {
+  display: none;
+}
+.show {
+  display: block;
+}
+
+// Visibility
+.invisible {
+  visibility: hidden;
+}
+
+// For Affix plugin
+.affix {
+  position: fixed;
+}

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/assets/less/bootstrap/variables.less
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/assets/less/bootstrap/variables.less b/share/www/fauxton/src/assets/less/bootstrap/variables.less
new file mode 100644
index 0000000..31c131b
--- /dev/null
+++ b/share/www/fauxton/src/assets/less/bootstrap/variables.less
@@ -0,0 +1,301 @@
+//
+// Variables
+// --------------------------------------------------
+
+
+// Global values
+// --------------------------------------------------
+
+
+// Grays
+// -------------------------
+@black:                 #000;
+@grayDarker:            #222;
+@grayDark:              #333;
+@gray:                  #555;
+@grayLight:             #999;
+@grayLighter:           #eee;
+@white:                 #fff;
+
+
+// Accent colors
+// -------------------------
+@blue:                  #049cdb;
+@blueDark:              #0064cd;
+@green:                 #46a546;
+@red:                   #9d261d;
+@yellow:                #ffc40d;
+@orange:                #f89406;
+@pink:                  #c3325f;
+@purple:                #7a43b6;
+
+
+// Scaffolding
+// -------------------------
+@bodyBackground:        @white;
+@textColor:             @grayDark;
+
+
+// Links
+// -------------------------
+@linkColor:             #08c;
+@linkColorHover:        darken(@linkColor, 15%);
+
+
+// Typography
+// -------------------------
+@sansFontFamily:        "Helvetica Neue", Helvetica, Arial, sans-serif;
+@serifFontFamily:       Georgia, "Times New Roman", Times, serif;
+@monoFontFamily:        Monaco, Menlo, Consolas, "Courier New", monospace;
+
+@baseFontSize:          14px;
+@baseFontFamily:        @sansFontFamily;
+@baseLineHeight:        20px;
+@altFontFamily:         @serifFontFamily;
+
+@headingsFontFamily:    inherit; // empty to use BS default, @baseFontFamily
+@headingsFontWeight:    bold;    // instead of browser default, bold
+@headingsColor:         inherit; // empty to use BS default, @textColor
+
+
+// Component sizing
+// -------------------------
+// Based on 14px font-size and 20px line-height
+
+@fontSizeLarge:         @baseFontSize * 1.25; // ~18px
+@fontSizeSmall:         @baseFontSize * 0.85; // ~12px
+@fontSizeMini:          @baseFontSize * 0.75; // ~11px
+
+@paddingLarge:          11px 19px; // 44px
+@paddingSmall:          2px 10px;  // 26px
+@paddingMini:           0 6px;   // 22px
+
+@baseBorderRadius:      4px;
+@borderRadiusLarge:     6px;
+@borderRadiusSmall:     3px;
+
+
+// Tables
+// -------------------------
+@tableBackground:                   transparent; // overall background-color
+@tableBackgroundAccent:             #f9f9f9; // for striping
+@tableBackgroundHover:              #f5f5f5; // for hover
+@tableBorder:                       #ddd; // table and cell border
+
+// Buttons
+// -------------------------
+@btnBackground:                     @white;
+@btnBackgroundHighlight:            darken(@white, 10%);
+@btnBorder:                         #ccc;
+
+@btnPrimaryBackground:              @linkColor;
+@btnPrimaryBackgroundHighlight:     spin(@btnPrimaryBackground, 20%);
+
+@btnInfoBackground:                 #5bc0de;
+@btnInfoBackgroundHighlight:        #2f96b4;
+
+@btnSuccessBackground:              #62c462;
+@btnSuccessBackgroundHighlight:     #51a351;
+
+@btnWarningBackground:              lighten(@orange, 15%);
+@btnWarningBackgroundHighlight:     @orange;
+
+@btnDangerBackground:               #ee5f5b;
+@btnDangerBackgroundHighlight:      #bd362f;
+
+@btnInverseBackground:              #444;
+@btnInverseBackgroundHighlight:     @grayDarker;
+
+
+// Forms
+// -------------------------
+@inputBackground:               @white;
+@inputBorder:                   #ccc;
+@inputBorderRadius:             @baseBorderRadius;
+@inputDisabledBackground:       @grayLighter;
+@formActionsBackground:         #f5f5f5;
+@inputHeight:                   @baseLineHeight + 10px; // base line-height + 8px vertical padding + 2px top/bottom border
+
+
+// Dropdowns
+// -------------------------
+@dropdownBackground:            @white;
+@dropdownBorder:                rgba(0,0,0,.2);
+@dropdownDividerTop:            #e5e5e5;
+@dropdownDividerBottom:         @white;
+
+@dropdownLinkColor:             @grayDark;
+@dropdownLinkColorHover:        @white;
+@dropdownLinkColorActive:       @white;
+
+@dropdownLinkBackgroundActive:  @linkColor;
+@dropdownLinkBackgroundHover:   @dropdownLinkBackgroundActive;
+
+
+
+// COMPONENT VARIABLES
+// --------------------------------------------------
+
+
+// Z-index master list
+// -------------------------
+// Used for a bird's eye view of components dependent on the z-axis
+// Try to avoid customizing these :)
+@zindexDropdown:          1000;
+@zindexPopover:           1010;
+@zindexTooltip:           1030;
+@zindexFixedNavbar:       1030;
+@zindexModalBackdrop:     1040;
+@zindexModal:             1050;
+
+
+// Sprite icons path
+// -------------------------
+@iconSpritePath:          "../img/glyphicons-halflings.png";
+@iconWhiteSpritePath:     "../img/glyphicons-halflings-white.png";
+
+
+// Input placeholder text color
+// -------------------------
+@placeholderText:         @grayLight;
+
+
+// Hr border color
+// -------------------------
+@hrBorder:                @grayLighter;
+
+
+// Horizontal forms & lists
+// -------------------------
+@horizontalComponentOffset:       180px;
+
+
+// Wells
+// -------------------------
+@wellBackground:                  #f5f5f5;
+
+
+// Navbar
+// -------------------------
+@navbarCollapseWidth:             979px;
+@navbarCollapseDesktopWidth:      @navbarCollapseWidth + 1;
+
+@navbarHeight:                    40px;
+@navbarBackgroundHighlight:       #ffffff;
+@navbarBackground:                darken(@navbarBackgroundHighlight, 5%);
+@navbarBorder:                    darken(@navbarBackground, 12%);
+
+@navbarText:                      #777;
+@navbarLinkColor:                 #777;
+@navbarLinkColorHover:            @grayDark;
+@navbarLinkColorActive:           @gray;
+@navbarLinkBackgroundHover:       transparent;
+@navbarLinkBackgroundActive:      darken(@navbarBackground, 5%);
+
+@navbarBrandColor:                @navbarLinkColor;
+
+// Inverted navbar
+@navbarInverseBackground:                #111111;
+@navbarInverseBackgroundHighlight:       #222222;
+@navbarInverseBorder:                    #252525;
+
+@navbarInverseText:                      @grayLight;
+@navbarInverseLinkColor:                 @grayLight;
+@navbarInverseLinkColorHover:            @white;
+@navbarInverseLinkColorActive:           @navbarInverseLinkColorHover;
+@navbarInverseLinkBackgroundHover:       transparent;
+@navbarInverseLinkBackgroundActive:      @navbarInverseBackground;
+
+@navbarInverseSearchBackground:          lighten(@navbarInverseBackground, 25%);
+@navbarInverseSearchBackgroundFocus:     @white;
+@navbarInverseSearchBorder:              @navbarInverseBackground;
+@navbarInverseSearchPlaceholderColor:    #ccc;
+
+@navbarInverseBrandColor:                @navbarInverseLinkColor;
+
+
+// Pagination
+// -------------------------
+@paginationBackground:                #fff;
+@paginationBorder:                    #ddd;
+@paginationActiveBackground:          #f5f5f5;
+
+
+// Hero unit
+// -------------------------
+@heroUnitBackground:              @grayLighter;
+@heroUnitHeadingColor:            inherit;
+@heroUnitLeadColor:               inherit;
+
+
+// Form states and alerts
+// -------------------------
+@warningText:             #c09853;
+@warningBackground:       #fcf8e3;
+@warningBorder:           darken(spin(@warningBackground, -10), 3%);
+
+@errorText:               #b94a48;
+@errorBackground:         #f2dede;
+@errorBorder:             darken(spin(@errorBackground, -10), 3%);
+
+@successText:             #468847;
+@successBackground:       #dff0d8;
+@successBorder:           darken(spin(@successBackground, -10), 5%);
+
+@infoText:                #3a87ad;
+@infoBackground:          #d9edf7;
+@infoBorder:              darken(spin(@infoBackground, -10), 7%);
+
+
+// Tooltips and popovers
+// -------------------------
+@tooltipColor:            #fff;
+@tooltipBackground:       #000;
+@tooltipArrowWidth:       5px;
+@tooltipArrowColor:       @tooltipBackground;
+
+@popoverBackground:       #fff;
+@popoverArrowWidth:       10px;
+@popoverArrowColor:       #fff;
+@popoverTitleBackground:  darken(@popoverBackground, 3%);
+
+// Special enhancement for popovers
+@popoverArrowOuterWidth:  @popoverArrowWidth + 1;
+@popoverArrowOuterColor:  rgba(0,0,0,.25);
+
+
+
+// GRID
+// --------------------------------------------------
+
+
+// Default 940px grid
+// -------------------------
+@gridColumns:             12;
+@gridColumnWidth:         60px;
+@gridGutterWidth:         20px;
+@gridRowWidth:            (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));
+
+// 1200px min
+@gridColumnWidth1200:     70px;
+@gridGutterWidth1200:     30px;
+@gridRowWidth1200:        (@gridColumns * @gridColumnWidth1200) + (@gridGutterWidth1200 * (@gridColumns - 1));
+
+// 768px-979px
+@gridColumnWidth768:      42px;
+@gridGutterWidth768:      20px;
+@gridRowWidth768:         (@gridColumns * @gridColumnWidth768) + (@gridGutterWidth768 * (@gridColumns - 1));
+
+
+// Fluid grid
+// -------------------------
+@fluidGridColumnWidth:    percentage(@gridColumnWidth/@gridRowWidth);
+@fluidGridGutterWidth:    percentage(@gridGutterWidth/@gridRowWidth);
+
+// 1200px min
+@fluidGridColumnWidth1200:     percentage(@gridColumnWidth1200/@gridRowWidth1200);
+@fluidGridGutterWidth1200:     percentage(@gridGutterWidth1200/@gridRowWidth1200);
+
+// 768px-979px
+@fluidGridColumnWidth768:      percentage(@gridColumnWidth768/@gridRowWidth768);
+@fluidGridGutterWidth768:      percentage(@gridGutterWidth768/@gridRowWidth768);

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/assets/less/bootstrap/wells.less
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/assets/less/bootstrap/wells.less b/share/www/fauxton/src/assets/less/bootstrap/wells.less
new file mode 100644
index 0000000..84a744b
--- /dev/null
+++ b/share/www/fauxton/src/assets/less/bootstrap/wells.less
@@ -0,0 +1,29 @@
+//
+// Wells
+// --------------------------------------------------
+
+
+// Base class
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: @wellBackground;
+  border: 1px solid darken(@wellBackground, 7%);
+  .border-radius(@baseBorderRadius);
+  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
+  blockquote {
+    border-color: #ddd;
+    border-color: rgba(0,0,0,.15);
+  }
+}
+
+// Sizes
+.well-large {
+  padding: 24px;
+  .border-radius(@borderRadiusLarge);
+}
+.well-small {
+  padding: 9px;
+  .border-radius(@borderRadiusSmall);
+}

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/assets/less/config.less
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/assets/less/config.less b/share/www/fauxton/src/assets/less/config.less
new file mode 100644
index 0000000..fe03796
--- /dev/null
+++ b/share/www/fauxton/src/assets/less/config.less
@@ -0,0 +1,46 @@
+/*  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ *  use this file except in compliance with the License. You may obtain a copy of
+ *  the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing permissions and limitations under
+ *  the License.
+ */
+
+.config-item {
+  height: 41px;
+
+  .edit-button {
+    float: right;
+    .btn;
+    .btn-mini;
+    display:none;
+  }
+
+  td:hover .edit-button {
+    display: block;
+  }
+
+  .value-input {
+    width: 98%;
+  }
+
+  #delete-value {
+    cursor: pointer;
+  }
+}
+
+.button-margin {
+  margin-bottom: 15px;
+}
+
+#add-section-modal {
+  width: 400px;
+}
+
+
+

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/assets/less/couchdb.less
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/assets/less/couchdb.less b/share/www/fauxton/src/assets/less/couchdb.less
new file mode 100644
index 0000000..20da486
--- /dev/null
+++ b/share/www/fauxton/src/assets/less/couchdb.less
@@ -0,0 +1,72 @@
+/*  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ *  use this file except in compliance with the License. You may obtain a copy of
+ *  the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing permissions and limitations under
+ *  the License.
+ */
+
+/*!
+ *
+ * CouchDB less style files
+ *
+ */
+@import "bootstrap/bootstrap.less";
+
+//
+// Variables
+// --------------------------------------------------
+
+
+// Global values
+// --------------------------------------------------
+
+// Links
+@linkColor:             #CA2530;
+@linkColorHover:        darken(@linkColor, 15%);
+
+// Grays
+@black:                 #0C0C0C;
+@grayDark:              #5A5A5A;
+@grayDarker:            darken(@grayDark, 10%);
+@gray:                  #F80507;
+@grayLight:             #E27B81;
+@grayLighter:           #B95D40;
+@white:                 #FDFBFB;
+
+// Accent colors
+// -------------------------
+@blue:                  #049cdb;
+@blueDark:              #0064cd;
+@green:                 #46a546;
+@red:                   #9d261d;
+@yellow:                #ffc40d;
+@orange:                #f89406;
+@pink:                  #c3325f;
+@purple:                #7a43b6;
+
+
+// Scaffolding
+// -------------------------
+@bodyBackground:        @white;
+@textColor:             @grayDark;
+
+// Typography
+// -------------------------
+@sansFontFamily:        "Helvetica Neue", Helvetica, Arial, sans-serif;
+@serifFontFamily:       Georgia, "Times New Roman", Times, serif;
+@monoFontFamily:        Monaco, Menlo, Consolas, "Courier New", monospace;
+
+@baseFontSize:          14px;
+@baseFontFamily:        @sansFontFamily;
+@baseLineHeight:        20px;
+@altFontFamily:         @serifFontFamily;
+
+@headingsFontFamily:    inherit; // empty to use BS default, @baseFontFamily
+@headingsFontWeight:    bold;    // instead of browser default, bold
+@headingsColor:         inherit; // empty to use BS default, @textColor

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/assets/less/database.less
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/assets/less/database.less b/share/www/fauxton/src/assets/less/database.less
new file mode 100644
index 0000000..6f2ae92
--- /dev/null
+++ b/share/www/fauxton/src/assets/less/database.less
@@ -0,0 +1,238 @@
+/*  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ *  use this file except in compliance with the License. You may obtain a copy of
+ *  the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing permissions and limitations under
+ *  the License.
+ */
+
+/* =database
+   ---------------------------------------------------------------------- */
+#db-tools {
+    position: absolute;
+    top: -7px;
+    right: 0;
+    width: 390px;
+
+    .btn-group {
+        position: absolute;
+        left: 0;
+        top: 6px;
+    }
+
+    form {
+        position: absolute;
+        right: 0;
+        top: 0;
+    }
+}
+
+.tools .nav {
+    margin-bottom: 10px;
+}
+
+#sidenav {
+    padding-top: 10px;
+
+    h3 {
+        margin: 10px 0;
+    }
+
+    li a span.divider {
+        background: none;
+        color: #ccc;
+        padding: 0 2px;
+    }
+
+    li.nav-header a {
+        display: inline
+    }
+
+    div.btn-group {
+        display: inline-block;
+    }
+
+    li.nav-header, #sidenav li a {
+        padding-left: 4px;
+    }
+
+    li.active a {
+        background-color: #ddd;
+        color: #333;
+        text-shadow: none;
+    }
+}
+
+.edit {
+    display: none;
+
+    form {
+        margin-bottom: 0;
+    }
+
+    h3 {
+        border-bottom: 1px solid #ccc;
+        font-size: 100%;
+        line-height: 1;
+        margin-bottom: 18px;
+    }
+
+    textarea {
+        height: 100px;
+        width: 95%;
+    }
+
+    .btn-toolbar {
+        margin-bottom: 0;
+    }
+
+    .preview {
+        width: 100px;
+    }
+
+    .save {
+    }
+}
+
+#new-view-index {
+    .confirm {
+        display: none;
+    }
+
+    .confirm .progress {
+        display: none;
+        margin: 20px;
+    }
+
+    textarea {
+        height: 100px;
+        width: 95%;
+    }
+}
+
+.view {
+    display: none;
+
+    .result-tools {
+        float: left;
+        width: 100%;
+        margin-bottom: 10px;
+    }
+
+    table td div  {
+        position: relative;
+    }
+
+    table td div div {
+        display: none;
+        line-height: 1;
+        position: absolute;
+        right: 4px;
+        top: 4px;
+    }
+
+    table td div:hover div a.edits {
+        padding-left: 16px;
+        padding-right: 16px;
+    }
+
+    table td div:hover div {
+        display: block;
+    }
+
+}
+.view.show {
+    display: block;
+}
+.view.show.hidden-by-params {
+    display: none;
+}
+#database .view table tr td {
+    padding: 0;
+}
+
+.loading {display: none;}
+
+.view-request-duration {
+  padding-right: 10px;
+  float: right;
+}
+
+table.active-tasks{
+    th {
+        cursor: pointer;
+    }
+}
+
+.well{
+    .row-fluid{
+        margin: 0;
+    }
+    .row-fluid .row-fluid:last-child .well-item {
+        border: none;
+    }
+    .well-item{
+        color: #666;
+        font-size: 12px;
+        border-bottom: 1px solid #e5e5e5;
+        padding: 8px 4px;
+        strong {
+            font-size: 16px;
+        }  
+    } 
+}
+
+
+#doc {
+    .dropdown-menu{
+        width: auto;
+    }
+}
+// #tabs {
+//     height: 40px;
+// }
+
+.databases{
+    a.db-actions,
+    a.db-actions:visited{
+        color: @red; 
+        border: 1px solid #e3e3e3;
+        padding: 5px 7px;
+        .border-radius(6px);
+        text-decoration: none;
+        font-size: 19px;
+    }
+}
+.btn-group{
+    ul.dropdown-menu li a:before{
+        margin-right: 10px;
+    }
+}
+
+.design-doc-group{
+    .span3 { margin: 0;}
+    #new-ddoc-section {
+        margin-top: 10px;
+        label{ width: 100px}
+        .controls{
+            margin-left: 100px;
+        }
+    }
+}
+table#changes-table {
+
+  #changes {
+    width: 50%;
+  }
+
+  #seq, #deleted {
+    width: 5%;
+  }
+
+}
+

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/assets/less/fauxton.less
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/assets/less/fauxton.less b/share/www/fauxton/src/assets/less/fauxton.less
new file mode 100644
index 0000000..0efbba9
--- /dev/null
+++ b/share/www/fauxton/src/assets/less/fauxton.less
@@ -0,0 +1,1005 @@
+/*  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ *  use this file except in compliance with the License. You may obtain a copy of
+ *  the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing permissions and limitations under
+ *  the License.
+ */
+
+/*!
+ *
+ * Fauxton less style files
+ *
+ */
+@import "bootstrap/bootstrap.less";
+@import "bootstrap/mixins.less";
+@import "variables.less";
+@import "config.less";
+@import "logs.less";
+@import "prettyprint.less";
+@import "database.less";
+@import "icons.less";
+
+
+body {
+  background-color: #F2F2F2;
+}
+#main > footer {
+  position: fixed;
+  bottom: 0;
+  font-size: 10px;
+  margin-left: @navWidth;
+  padding: 5px 10px;
+  background-color: #F2F2F2;
+  width: 100%;
+  .closeMenu & {
+    margin-left: @collapsedNavWidth;
+  }
+}
+
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.row {
+  margin-left: 0;
+}
+
+// globals
+body {
+  font-size: 16px;
+  line-height:1.3;
+  padding-bottom: 0px;
+  color: #333;
+  padding-top: 92px;
+  &#home{
+    padding-top: 90px;
+  }
+  background-color: @sidebarBG;
+  /* OVERRIDE BOOTSTRAP BTN STYLES */
+  .btn{
+    .box-shadow(none);
+    .border-radius(0);
+    background-image: none;
+    text-shadow: none;
+    background-repeat: no-repeat;
+  }
+}
+
+h2,h3,h4 {font-weight: 600;}
+
+
+a, .btn{
+  .transition(all .25s linear);
+}
+
+a,
+a:visited,
+a:active {
+  color: @linkColor;
+}
+
+a:hover{
+  color: @red;
+}
+
+/* ajax loader */
+.loader {
+  background: url('../img/loader.gif') center center no-repeat;
+  min-height:  100px;
+}
+#app-container.loader{
+  min-height: 400px;
+  > *{
+    display: none;
+  }
+}
+
+#global-notifications {
+  position: fixed;
+  top: 0px;
+  display: block;
+  z-index: 100000;
+  left: @navWidth;
+  .closeMenu & {
+    left: @collapsedNavWidth;
+  }
+  width: 100%;
+}
+
+#app-container{
+  padding: 0;
+  height: 100%;
+  width: 100%;
+  position: absolute;
+  top: 0;
+  left: 0;
+  > .row-fluid {
+    height: 100%;
+  }
+}
+
+/* bootstrap override */
+.container-fluid {
+  padding-right: 0px;
+  padding-left: 0px;
+}
+
+/* Fixed side navigation */
+#primary-navbar {
+  height: 100%;
+  position: fixed;
+  width: @navWidth;
+  top: 0;
+  bottom: 0;
+  background-color: @primaryNav;
+  #footer-links{
+    position: absolute;
+    bottom: 0;
+    width: 100%;
+  }
+
+  .navbar {
+    .brand {
+      .box-sizing(content-box);
+      .hide-text;
+      .customTransition(left, 1s, 0.805, 0.005, 0.165, 0.985);
+      margin: 10px 0 6px;
+      width: 174px;
+      height: 40px;
+      padding: 10px;
+      .icon{
+        .box-sizing(content-box);
+        background: url(../img/couchdb-site.png) no-repeat 0 0;
+        display: block;
+        height: 100%;
+        width: 100%; 
+      }
+      .burger{
+        .transition(all @transitionSpeed @transitionEaseType);
+        padding-top: 6px;
+        left: -8px;
+        position: absolute;
+        div{
+          .transition(all @transitionSpeed @transitionEaseType);
+          height: 4px;
+          width: 8px;
+          .border-radius(2);
+          background-color: @navBG;
+          margin: 4px 0px;
+        }
+      }
+      &:hover .burger div{
+        background-color: @orange;
+      }
+      .closeMenu & {
+        .icon {
+          background: url(../img/minilogo.png) no-repeat 0 0;
+        }
+        width: 45px;
+        .burger{
+          left: 0;
+        }
+      }
+    }
+    nav {
+      .nav{
+        margin: 0;
+        li{
+          .transition(all @transitionSpeed @transitionEaseType);
+          padding: 0;
+          font-size: 20px;
+          line-height: 23px;
+          width: @navWidth;
+          font-weight: normal;
+          font-family: helvetica;
+          .box-sizing(border-box);
+          background-color: @navBG;
+          border-bottom:  1px solid @primaryNav;
+          min-height: 55px;
+          &.active, &:hover{
+            a{
+              .box-shadow(none);
+            }
+            background-color: @red;
+          }
+          &:hover a.fonticon:before{
+            color: @white;
+          }
+          &.active a.fonticon:before,
+          &:hover a.fonticon:before,
+          {
+            text-shadow: @boxShadow;
+            color: @NavIconActive;
+          }
+          a{
+            padding: 17px 25px 12px 60px;
+            background-color: transparent;
+            color: #fff;
+            text-shadow: @textShadowOff;
+            &.closeMenu{
+              color: transparent;
+            }
+            & span.fonticon {
+              position: relative;
+              &:before {
+                position: absolute;
+                top: -5px;
+                left: -44px;
+                font-size: 28px;
+                color: @NavIcon;
+                text-shadow: @boxShadowOff;
+              }
+            }
+            .closeMenu &{
+              color: transparent;
+            }
+          }
+        }
+      }
+      ul#footer-nav-links{
+        li{
+          background-color: @primaryNav;
+          border-top: 1px solid @red;
+          border-bottom: none;
+          font-size: 12px;
+          padding: 12px;
+          min-height: 44px;
+          &.active, &:hover{
+            background-color: @linkRed;
+            border-top: 1px solid @red;
+            a{
+              color: white;
+            }
+          }
+          a{
+            color: @red;
+          }
+        }
+      }
+      ul#bottom-nav-links{
+        margin-top: 0;
+        li{
+          min-height: 46px;
+          background-color: @bottomNav;
+          &.active{
+            background-color:@linkRed;
+          } 
+          &:hover{
+            background-color: @navBGHover;
+          }
+          a{
+            &.fonticon {
+              position: relative;
+              &:before {
+                left: -40px;
+                font-size: 22px;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+
+#dashboard {
+  max-width: 1500px;
+  .box-shadow(-6px 0 rgba(0, 0, 0, 0.1));
+  border-left: 1px solid #999;
+  position: absolute;
+  left: @navWidth;
+  margin-left: 0;
+  background-color: @sidebarBG;
+  min-width: 600px;
+  height: 100%;
+  .closeMenu &{
+    left: @collapsedNavWidth;
+  }
+  &.one-pane{
+    min-width: 800px;
+    margin-top: 0;
+  }
+}
+
+/*dashboard content can be in multiple templates*/
+
+#dashboard-content{
+  &.row-fluid,
+  &.window-resizeable{
+    /*remove gutter without rewriting variable*/
+    margin-left: 0px;
+  }
+  padding: 20px;
+  .with-sidebar &{
+    border-left: 1px solid #999;
+    border-right: 1px solid #999;
+    width: auto;
+    .box-shadow(-6px 0 rgba(0, 0, 0, 0.1));
+    padding: 0px;
+    bottom: 0px;
+    top: 60px;
+    position: absolute;
+    overflow-x: hidden;
+    overflow-y: auto;
+    left: @sidebarWidth;
+    right: 0;
+    .box-sizing(border-box);
+  }
+  > div.inner {
+    display: block;
+  }
+}
+
+.with-sidebar.content-area {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+}
+
+// .closeMenu .with-sidebar.content-area {
+//   left: 0;
+// }
+/*tools*/
+
+.row-fluid.content-area{
+  background-color: @background;
+}
+
+
+.fixed-header{
+  background-color: @breadcrumbBG;
+  position: fixed;
+  top: 0;
+  right: 0;
+  left: @navWidth;
+  .closeMenu & {
+    left: @collapsedNavWidth;
+  }
+  border-bottom: 5px solid @breadcrumbBorder;
+  .box-shadow(0 4px 6px -2px #808080);
+  z-index: 100;
+  .one-pane & {
+    position: relative;
+    border: none;
+    .box-shadow(none);
+    left: auto;
+  }
+}
+
+#breadcrumbs {
+   padding: 15px 20px;
+   .breadcrumb {
+    margin-bottom: 0;
+    background-color: transparent;
+    padding: 0;
+    li {
+      .divider {
+        font-size: 12px;
+        color: @breadcrumbArrow;
+      }
+      &:first-child {
+        font-size: 30px;
+      }
+      color: @breadcrumbText;
+      font-size: 18px;
+      text-shadow: none;
+      &.active{
+        color: #333;
+      }
+      a{
+        color: @breadcrumbText;
+      }
+    }
+   }
+}
+
+
+footer#mainFooter{
+  position: fixed;
+  bottom: 0;
+}
+
+/*SIDEBAR TEMPLATE STYLES*/
+.topmenu-defaults {
+  height: 70px;
+  padding: 12px 10px 0;
+  border-bottom: 1px solid @darkRed;
+  .box-sizing(border-box);
+}
+
+#dashboard-upper-menu{
+  position: fixed;
+  z-index: 11;
+  .topmenu-defaults;
+  background-color: #CBCBCB;
+}
+
+#dashboard-lower-content{
+  padding: 20px;
+  background-color: #F1F1F1;
+}
+
+#dashboard-upper-content{
+  .well{
+    padding: 20px;
+    .border-radius(0);
+    .box-shadow(none);
+  }
+}
+
+#sidenav{
+  padding: 0;
+  header {
+    width: @sidebarWidth;
+    .box-shadow(inset -7px 0 15px -6px #000);
+    background: transparent url('../img/linen.png') repeat 0 0;
+    .topmenu-defaults;
+  }
+  nav {
+    .nav-list{
+      .divider {
+        border: none;
+      }
+      li.active a {
+        background-color: @darkRed;
+        color: #fff;
+      }
+      a{
+        display: block;
+        padding: 10px 5px 10px 15px;
+        color: #333333;
+        border-bottom: 1px solid #989898;
+      }
+      .nav-header{
+        background-color: #B2B2B2;
+        padding: 5px;
+        text-shadow: none;
+        color: #333333;
+        border-bottom: 1px solid #989898;
+      }
+
+    }
+  }
+}
+#sidebar-content {
+.box-shadow(-7px 0 15px -6px #000);
+  position: absolute;
+  bottom: 0px;
+  top: 60px;
+  width: @sidebarWidth;
+  left: 0;
+  overflow-x: hidden;
+  overflow-y: auto;
+  background-color: @secondarySidebar;
+  > div.inner {
+    display: block;
+  }
+}
+
+
+/*ONE PANEL TEMPLATE ONLY STYLES  AKA _all_dbs */
+
+.result-tools{
+  border-bottom: 1px solid #999999;
+  padding: 5px 0;
+  border-bottom: 1px solid #999999;
+  padding: 10px 0;
+  float: left;
+  width: 100%;
+  margin-bottom: 10px;
+}
+
+.navbar-form.pull-right.database-search {
+  margin-right: 36px;
+    input[type=text]{
+      margin-top: -4px;
+    }
+}
+
+#db-views-tabs-nav{
+  position: fixed;
+  z-index: 12;
+  margin-top: 31px;
+  margin-bottom: 0;
+  /*background-color: #f4f4f4;*/
+  padding: 0 20px;
+}
+
+.db-views-smaller {
+  max-width: 500px;
+}
+
+.nav-tabs > li{
+  margin-right: 2px;
+  > a {
+  color: #333;
+  border-color: #eeeeee #eeeeee #dddddd;
+  text-decoration: none;
+  background-color: #eeeeee;
+  border-radius: 0;
+  border-left: none;
+  border-right: none;
+    &.fonticon:before{
+      margin-right: 6px;
+      font-size: 16px;
+    }
+  }
+}
+
+.nav-tabs > li > a:hover, .nav-tabs > li > a:focus {
+  background-color: @linkRed;
+  border-top: 1px solid @red;
+  color: white;
+}
+
+
+.tab-content {
+  margin-top: 70px;
+}
+
+.well { 
+  .controls-group {
+  &:first-child, &:last-child{
+    margin-top: 24px;
+  }
+  margin-bottom: 8px;
+  }
+  .controls-row {
+    margin-bottom: 8px;
+  }
+}
+
+/*TABLE STYLES*/
+table.table {
+  table-layout: fixed;
+}
+table {
+  tr{
+    td{
+      word-wrap: break-word;
+      &.select {
+        width: 20px;
+      }
+    }
+  }
+}
+table.databases {clear: both;}
+thead {border-bottom: 2px solid @redButton;}
+tbody {padding-top: 10px;}
+.table-condensed td {padding: 18px 5px;}
+.table-striped tbody > tr:nth-child(odd) > td, 
+.table-striped tbody > tr:nth-child(odd) > th
+{
+  background-color: #F7F7F7;
+}
+
+
+/*form elements and buttons*/
+.btn-group {
+  > .btn + .dropdown-toggle,
+  > .btn:first-child,
+  > .btn:last-child,
+  > .dropdown-toggle
+  {
+    .border-radius(0);
+    background-image: none;
+    text-shadow: none;
+  }
+}
+
+.btn {
+  padding-top: 12px;
+  padding-bottom: 12px;
+  margin-top: 0px;
+}
+
+.button{
+  .button-style;
+  .transition(all @transitionSpeed @transitionEaseType);
+  border: none;
+  background-color: @redButton;
+  color: #fff;
+  padding: 10px;
+  .icon {
+    margin-right: 10px;
+    font-size: 20px;
+  }
+  &:hover {
+    color: #fff;
+    text-decoration: none;
+  }
+}
+
+
+.button-style{
+  background-color: @redButton;
+  color: #fff;
+  padding: 10px 15px;
+  cursor: pointer;
+  &:before{
+    padding-right: 5px;
+  }
+  &.outlineGray{
+    border: 1px solid @grayLight;
+    background-color: transparent;
+    color: @grayDark;
+    &:hover{
+      border: 1px solid @orange;
+    }
+  }
+  &.green{
+    background-color: @green;
+  }
+
+  &.round-btn {
+    .border-radius(@radius);
+  }
+  .icon {
+    margin-right: 10px;
+    font-size: 20px;
+  }
+  &:hover {
+    color: #fff;
+    text-decoration: none;
+    background-color: @orange;
+  }
+  a&,
+  a&:visited,
+  a&:active{
+    color: #fff;
+  }
+  &:disabled {
+    opacity: 0.5;
+  }
+}
+
+
+
+
+a.button, 
+a.button:visited, 
+a.button:active {
+  .button-style;
+}
+
+.select{
+  > a{
+    display: block;
+    padding: 5px 15px 5px 5px;
+    border: 1px solid #989898;
+    position: relative;
+    background-color: #FFFFFF;
+    color: #666666;
+    &:after {
+      content: '';
+      width: 0;
+      height: 0;
+      border-left: 7px solid transparent;
+      border-right: 7px solid transparent;
+      border-top: 7px solid #989898;
+      position: absolute;
+      right: 9px;
+      top: 12px;
+    }
+    &:before{
+      content: '';
+      border-left:  1px solid #989898;
+      height: 30px;
+      position: absolute;
+      right: 30px;
+      top: 0;
+    }
+  }
+}
+
+input[type=text], input[type=password],
+.navbar-form input{
+  .border-radius(0);
+  padding: 12px;
+  border: 1px solid #ccc;
+  height: auto;
+  font-size: 16px;
+  margin-top: 0;
+}
+
+
+input[type=checkbox]{
+
+}
+label.fonticon-search {
+  .box-sizing(content-box);
+  position: relative;
+  &:before {
+    .transition(all .25s linear);
+    font-size: 16px;
+    position: absolute;
+    right: -47px;
+    background-color: #E1E1E1;
+    height: 46px;
+    width: 48px;
+    border: 1px solid #cccccc;
+    padding: 14px;
+    top: -4px;
+  }
+  &:hover{
+    color:white;
+    &:before {
+      background-color: @red;
+    }
+  }
+}
+
+
+.form-inline {
+  input[type=password],
+  input[type=text]{
+    width: auto;
+  }
+}
+*, *:before, *:after {
+  .box-sizing(border-box);
+}
+
+input[type="checkbox"], input[type="radio"] {
+  box-sizing: border-box;
+  padding: 0;
+}
+
+input[type="file"], input[type="checkbox"], input[type="radio"], select {
+  margin: 0 0 1em 0;
+}
+
+.well select {
+  margin: 0;
+}
+
+form.custom .hidden-field {
+  margin-left: -99999px;
+  position: absolute;
+  visibility: hidden;
+}
+
+
+.checkbox {
+  label{
+    display: inline-block;
+    padding-left:25px;
+  }
+}
+
+label{ 
+  margin-right: 15px; 
+  padding-left:0;
+  display: block;  
+  cursor: pointer;  
+  position: relative;  
+  font-size: 14px; 
+  &.inline{
+    display: inline-block;
+  } 
+}
+.help-block{
+  font-size: 12px;
+}
+.custom-inputs{
+
+  input[type=radio], 
+  input[type=checkbox] {  
+    display: none;  
+  } 
+
+  .checkbox label:before {  
+    border-radius: 3px;  
+  }  
+
+  .controls > .radio:first-child, .controls > .checkbox:first-child {
+    padding-top: 15px;
+  }
+
+  .radio.inline, .checkbox.inline {
+    display: inline-block;
+    padding-top: 15px;
+    margin-bottom: 12px;
+    vertical-align: middle;
+  }
+
+  input[type=checkbox]:checked + label:before {  
+    /*content: "\2713"; */
+    content: "\00d7"; 
+    text-shadow: 1px 1px 1px rgba(0, 0, 0, .2);  
+    font-size: 16px;
+    background-color: @red;  
+    color: white;  
+    text-align: center;  
+    line-height: 15px;  
+  }  
+
+  label:before {  
+    content: "";  
+    display: inline-block;  
+
+    width: 16px;  
+    height: 16px;  
+
+    margin-right: 10px;  
+    position: absolute;  
+    left: 0;  
+    bottom: 1px;  
+    background-color: #aaa;  
+    box-shadow: inset 0px 2px 3px 0px rgba(0, 0, 0, .3), 0px 1px 0px 0px rgba(255, 255, 255, .8);  
+  }  
+
+  .radio label:before {  
+    border-radius: 8px;  
+  }  
+
+  input[type=radio]:checked + label:before {  
+    content: "\2022";  
+    color: #f3f3f3;  
+    font-size: 30px;  
+    text-align: center;  
+    line-height: 18px;  
+  }
+
+  label.drop-down{
+    &:before{
+    display: none;
+    }
+  }
+}
+
+form.view-query-update, form.view-query-save {
+  max-width: 100%;
+}
+
+
+.form-actions {
+  background: none;
+  border: none;
+}
+
+.input-append,
+.input-prepend {
+  .add-on {
+    font-size: 18px;
+    padding: 14px 5px 30px;
+  }
+}
+
+.input-append .btn:last-child, 
+.input-append .btn-group:last-child > .dropdown-toggle {
+  padding: 10px 5px 14px;
+}
+.input-append .btn{
+  padding: 10px 5px 14px;
+}
+.row-fluid .input-append [class*="span"],
+.input-prepend input[class*="span"]{
+  width: auto;
+}
+
+/*pretty print*/
+pre.prettyprint {
+  background: #E5E0DD;
+  border: none;
+}
+
+.prettyprint .str, .prettyprint .lit {
+  color: @red;
+}
+
+.prettyprint .pln, .prettyprint .pun, .prettyprint .typ{
+  color: #333333;
+}
+
+/*ALL DOCS TABLE*/
+tr.all-docs-item{
+  border: none;
+  background: transparent;
+}
+
+/*logs*/
+#log-sidebar{
+  padding: 20px;
+}
+
+
+/*documents and databases */
+.view.show{
+  color: @fontGrey;
+}
+
+div.spinner {
+  position: absolute;
+  left: 50%;
+  top: 50%;
+}
+
+/* Code mirror overrides */
+.CodeMirror-scroll {
+  .border-radius(2px);
+  border: solid 1px #ddd;
+}
+
+.btn-primary a:visited {
+  color: #fff;
+}
+
+#api-navbar{
+  position: relative;
+}
+
+.button.api-url-btn {
+  position: absolute;
+  right: 15px;
+  top: -50px;
+  span.icon {
+    font-size: 11px;
+  }
+}
+
+.api-navbar {
+  border-top: 1px solid @red;
+  padding: 20px 20px 15px;
+  .input-append.input-prepend {
+    margin-bottom: 0px;
+    .add-on {
+      background: none;
+      padding: 14px 12px 32px 12px;
+      border: none;
+    }
+    .btn:last-child{
+      margin-left: -1px;
+      background: none;
+      padding: 13px 12px 11px 12px;
+      &:hover{
+        background-color: @red;
+        color: white;
+      }
+    }
+  }
+}
+
+#jump-to-doc {
+  width: 50%;
+  max-width: 600px;
+  float:right;
+  margin-right: 40px;
+
+  #jump-to-doc-label {
+    width: 100%;
+  }
+
+  #jump-to-doc-id {
+    width: 100%;
+    margin-top: -4px;
+  }
+}
+
+#map-function, #reduce-function{
+    width: 100%;
+    font-size: 16px;
+}
+
+#editor-container {
+    width: 1316px;
+    height: 688px;
+    font-size: 16px;
+}
+
+#delete-database {
+  float: right;
+}

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/assets/less/icons.less
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/assets/less/icons.less b/share/www/fauxton/src/assets/less/icons.less
new file mode 100644
index 0000000..cf0593c
--- /dev/null
+++ b/share/www/fauxton/src/assets/less/icons.less
@@ -0,0 +1,111 @@
+/*  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ *  use this file except in compliance with the License. You may obtain a copy of
+ *  the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing permissions and limitations under
+ *  the License.
+ */
+
+@font-face {
+  font-family: "fauxtonicon";
+  src: url("../img/fontcustom_fauxton.eot");
+  src: url("../img/fontcustom_fauxton.eot?#iefix") format("embedded-opentype"),
+       url("../img/fontcustom_fauxton.woff") format("woff"),
+       url("../img/fontcustom_fauxton.ttf") format("truetype"),
+       url("../img/fontcustom_fauxton.svg#fontcustom_fauxton") format("svg");
+  font-weight: normal;
+  font-style: normal;
+}
+
+.fonticon-activetasks:before,
+.fonticon-bookmark:before,
+.fonticon-carrot:before,
+.fonticon-circle-check:before,
+.fonticon-circle-minus:before,
+.fonticon-circle-plus:before,
+.fonticon-circle-x:before,
+.fonticon-cog:before,
+.fonticon-collapse:before,
+.fonticon-dashboard:before,
+.fonticon-database:before,
+.fonticon-document:before,
+.fonticon-documents:before,
+.fonticon-expand:before,
+.fonticon-eye:before,
+.fonticon-key:before,
+.fonticon-link:before,
+.fonticon-log:before,
+.fonticon-minus:before,
+.fonticon-mixer:before,
+.fonticon-new-database:before,
+.fonticon-paperclip:before,
+.fonticon-pencil:before,
+.fonticon-play:before,
+.fonticon-plus:before,
+.fonticon-profile:before,
+.fonticon-replicate:before,
+.fonticon-reply:before,
+.fonticon-save:before,
+.fonticon-search:before,
+.fonticon-stats:before,
+.fonticon-support:before,
+.fonticon-swap-arrows:before,
+.fonticon-trash:before,
+.fonticon-user:before,
+.fonticon-users:before,
+.fonticon-wrench:before,
+.fonticon-x:before {
+  font-family: "fauxtonicon";
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+  -webkit-font-smoothing: antialiased;
+  display: inline-block;
+  text-decoration: inherit;
+}
+
+.fonticon-activetasks:before { content: "\f100"; }
+.fonticon-bookmark:before { content: "\f101"; }
+.fonticon-carrot:before { content: "\f102"; }
+.fonticon-circle-check:before { content: "\f103"; }
+.fonticon-circle-minus:before { content: "\f104"; }
+.fonticon-circle-plus:before { content: "\f105"; }
+.fonticon-circle-x:before { content: "\f106"; }
+.fonticon-cog:before { content: "\f107"; }
+.fonticon-collapse:before { content: "\f108"; }
+.fonticon-dashboard:before { content: "\f109"; }
+.fonticon-database:before { content: "\f10a"; }
+.fonticon-document:before { content: "\f10b"; }
+.fonticon-documents:before { content: "\f10c"; }
+.fonticon-expand:before { content: "\f10d"; }
+.fonticon-eye:before { content: "\f10e"; }
+.fonticon-key:before { content: "\f10f"; }
+.fonticon-link:before { content: "\f110"; }
+.fonticon-log:before { content: "\f111"; }
+.fonticon-minus:before { content: "\f112"; }
+.fonticon-mixer:before { content: "\f113"; }
+.fonticon-new-database:before { content: "\f114"; }
+.fonticon-paperclip:before { content: "\f115"; }
+.fonticon-pencil:before { content: "\f116"; }
+.fonticon-play:before { content: "\f117"; }
+.fonticon-plus:before { content: "\f118"; }
+.fonticon-profile:before { content: "\f119"; }
+.fonticon-replicate:before { content: "\f11a"; }
+.fonticon-reply:before { content: "\f11b"; }
+.fonticon-save:before { content: "\f11c"; }
+.fonticon-search:before { content: "\f11d"; }
+.fonticon-stats:before { content: "\f11e"; }
+.fonticon-support:before { content: "\f11f"; }
+.fonticon-swap-arrows:before { content: "\f120"; }
+.fonticon-trash:before { content: "\f121"; }
+.fonticon-user:before { content: "\f122"; }
+.fonticon-users:before { content: "\f123"; }
+.fonticon-wrench:before { content: "\f124"; }
+.fonticon-x:before { content: "\f125"; }

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/assets/less/logs.less
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/assets/less/logs.less b/share/www/fauxton/src/assets/less/logs.less
new file mode 100644
index 0000000..e50f903
--- /dev/null
+++ b/share/www/fauxton/src/assets/less/logs.less
@@ -0,0 +1,24 @@
+/*  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ *  use this file except in compliance with the License. You may obtain a copy of
+ *  the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing permissions and limitations under
+ *  the License.
+ */
+
+#log-sidebar {
+  
+  ul {
+    margin-left: 0px;
+    list-style: none;
+  }
+
+  .remove-filter {
+     opacity: 0.2;
+  }
+}

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/assets/less/prettyprint.less
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/assets/less/prettyprint.less b/share/www/fauxton/src/assets/less/prettyprint.less
new file mode 100644
index 0000000..7925fa7
--- /dev/null
+++ b/share/www/fauxton/src/assets/less/prettyprint.less
@@ -0,0 +1,46 @@
+/*  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ *  use this file except in compliance with the License. You may obtain a copy of
+ *  the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing permissions and limitations under
+ *  the License.
+ */
+
+pre.prettyprint {
+  background: #000;
+  border-radius: 0;
+  font-size: 83%;
+  line-height: 1.4;
+  margin: 0;
+  padding: 16px;
+}
+.prettyprint {
+  .pln, .pun,  .typ {
+    color: #f8f8f8;
+  }
+  .kwd {
+    color: #ff8300;
+  }
+  .str {
+    color: #ff8300;
+  }
+  .lit {
+    color: #00ff00;
+  }
+  .com {
+    color: #666;
+  }
+}
+.CodeMirror-wrap pre{
+  &.view-code-error{
+    color: @darkRed;
+  }
+  .tooltip{
+    z-index: 100000000;
+  }
+}

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/assets/less/variables.less
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/assets/less/variables.less b/share/www/fauxton/src/assets/less/variables.less
new file mode 100644
index 0000000..bf97b5d
--- /dev/null
+++ b/share/www/fauxton/src/assets/less/variables.less
@@ -0,0 +1,82 @@
+/*  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ *  use this file except in compliance with the License. You may obtain a copy of
+ *  the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing permissions and limitations under
+ *  the License.
+ */
+
+/* = color variables
+   ---------------------------------------------------------------------- */
+@brown: #3A2C2B;
+@red: #E33F3B;
+@darkRed: #AF2D24;
+@linkRed: #DA4F49;
+@greyBrown: #554D4C;
+@fontGrey: #808080;
+@secondarySidebar: #E4DFDC;
+
+
+@orange: #F3622D;
+
+/*nav*/
+@primaryNav : @brown;
+@navBG: @darkRed;
+@navBGHighlight: @red;
+@navBGHover: @red;
+@navIconColor: @darkRed;
+@navIconHighlight: #FFFFFF;
+@bottomNav: @greyBrown;
+
+/*top header*/
+@breadcrumbBG: #F1F1F1;
+@breadcrumbText: @red;
+@breadcrumbArrow: #999999;
+@breadcrumbBorder: @red;
+
+/*background colors*/
+@background: #F2F2F2;
+@leftPanel: @background;
+@rightPanel: #CBCBCB;
+@defaultText: #4D4D4D;
+@defaultHTag: #333333;
+
+@saveButton: #80A221;
+
+@collapsedNavWidth: 62px;
+@navWidth: 220px;
+@sidebarBG: #F2F2F2;
+@sidebarWidth: 330px;
+
+@NavIconActive: #ffffff;
+@NavIcon: @brown;
+
+
+/*buttons */
+@redButton: @red;
+@linkColor: @red;
+@blue:                  #049cdb;
+@blueDark:              #0064cd;
+@green:                 #7FA30C;
+//@red:                   #9d261d;
+@yellow:                #ffcc00;
+@pink:                  #c3325f;
+@purple:                #7a43b6;
+
+
+
+
+@boxShadow: 2px 2px rgba(0,0,0,0.2);
+@boxShadowOff: 2px 2px rgba(0,0,0,0);
+@textShadow: 1px 2px rgba(0,0,0,0.2);
+@textShadowOff: 1px 2px rgba(0,0,0,0);
+
+@radius: 4px;
+@transitionSpeed: .25s;
+@transitionEaseType: linear;
+

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/bin/grunt
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/bin/grunt b/share/www/fauxton/src/bin/grunt
new file mode 100755
index 0000000..2c52393
--- /dev/null
+++ b/share/www/fauxton/src/bin/grunt
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+REL_PATH="`dirname \"$0\"`"
+GRUNT_PATH="$REL_PATH/../node_modules/.bin/grunt"
+
+$GRUNT_PATH $*

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/couchapp.js
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/couchapp.js b/share/www/fauxton/src/couchapp.js
new file mode 100644
index 0000000..fec8dd3
--- /dev/null
+++ b/share/www/fauxton/src/couchapp.js
@@ -0,0 +1,39 @@
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+var couchapp = require('couchapp'),
+    path = require('path'),
+    ddoc;
+
+ddoc = {
+  _id: '_design/fauxton',
+  rewrites: [
+    { "from": "_db" ,    "to"  : "../.." },
+    { "from": "_db/*" ,  "to"  : "../../*" },
+    { "from": "_ddoc" ,  "to"  : "" },
+    { "from": "_ddoc/*", "to"  : "*"},
+    {from: '/', to: 'index.html'},
+    {from: '/*', to: '*'}
+  ],
+  views: {},
+  shows: {},
+  lists: {},
+  validate_doc_update: function(newDoc, oldDoc, userCtx) {
+    /*if (newDoc._deleted === true && userCtx.roles.indexOf('_admin') === -1) {
+      throw "Only admin can delete documents on this database.";
+    }*/
+  }
+};
+
+
+couchapp.loadAttachments(ddoc, path.join(__dirname, 'dist', 'release'));
+module.exports = ddoc;

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/extensions.md
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/extensions.md b/share/www/fauxton/src/extensions.md
new file mode 100644
index 0000000..13fcf8d
--- /dev/null
+++ b/share/www/fauxton/src/extensions.md
@@ -0,0 +1,17 @@
+#Extensions
+
+Extensions allow Fauxton views to be have extra functionality.
+
+A module registers an extension by
+
+    FauxtonAPI.registerExtension('extensionName', myObjectToRegister);
+
+Any other module wanting to use that extension can then get 
+all objects registered for an extension by:
+
+    var extensions = FauxtonAPI.getExtensions('extensionName');
+    // extensions will always be an array
+
+The module can then use those extensions to extend its functionality.
+An example of extensions in the compaction module (app/addons/compaction/base.js) 
+and in documents module (app/modules/documents/views line 1003)

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/favicon.ico
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/favicon.ico b/share/www/fauxton/src/favicon.ico
new file mode 100644
index 0000000..0baa6f3
Binary files /dev/null and b/share/www/fauxton/src/favicon.ico differ

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/index.html
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/index.html b/share/www/fauxton/src/index.html
new file mode 100644
index 0000000..892f499
--- /dev/null
+++ b/share/www/fauxton/src/index.html
@@ -0,0 +1,53 @@
+<!doctype html>
+
+<!--
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+-->
+
+<html lang="en">
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="viewport" content="width=device-width,initial-scale=1">
+
+  <title>Project Fauxton</title>
+
+  <!-- Application styles. -->
+  <link rel="stylesheet" href="/css/index.css">
+  <style type="text/css">
+    body {
+    padding-top: 60px;
+    padding-bottom: 40px;
+    }
+  </style>
+  <base href="/"></base>
+</head>
+
+<body id="home">
+  <!-- Main container. -->
+  <div role="main" id="main">
+    <div id="global-notifications" class="container errors-container"></div>
+    <div id="app-container"></div>
+    <hr>
+
+    <footer>
+      <div id="footer-content" class="container">
+        <p>&copy; Project Fauxton 2012</p>
+      </div>
+    </footer>
+  </div>
+
+  <!-- Application source. -->
+  <script data-main="/app/config" src="/assets/js/libs/require.js"></script>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/package.json
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/package.json b/share/www/fauxton/src/package.json
new file mode 100644
index 0000000..fd5e3d3
--- /dev/null
+++ b/share/www/fauxton/src/package.json
@@ -0,0 +1,48 @@
+{
+  "name": "fauxton",
+  "version": "0.1.0",
+  "description": "Fauxton is a modular CouchDB dashboard and Futon replacement.",
+  "main": "grunt.js",
+  "directories": {
+    "test": "test"
+  },
+  "dependencies": {
+    "async": "~0.2.6",
+    "grunt": "~0.4.1",
+    "grunt-cli": "~0.1.6",
+    "couchapp": "~0.9.1",
+    "grunt-contrib-cssmin": "~0.5.0",
+    "grunt-contrib-clean": "~0.4.1",
+    "grunt-contrib-jshint": "~0.6.0",
+    "grunt-contrib-concat": "~0.3.0",
+    "grunt-contrib-less": "~0.5.0",
+    "grunt-contrib-jst": "~0.5.0",
+    "grunt-contrib-watch": "~0.4.4",
+    "grunt-contrib-uglify": "~0.2.0",
+    "grunt-contrib-copy": "~0.4.1",
+    "grunt-couchapp": "~0.1.0",
+    "grunt-exec": "~0.4.0",
+    "grunt-init": "~0.2.0",
+    "grunt-contrib-requirejs": "~0.4.1",
+    "underscore": "~1.4.2",
+    "url": "~0.7.9",
+    "urls": "~0.0.3",
+    "http-proxy": "~0.10.2",
+    "send": "~0.1.1",
+    "grunt-mocha-phantomjs": "~0.3.0"
+  },
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://git-wip-us.apache.org/repos/asf/couchdb.git"
+  },
+  "keywords": [
+    "couchdb",
+    "futon",
+    "fauxton"
+  ],
+  "author": "",
+  "license": "Apache V2"
+}

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/settings.json.default
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/settings.json.default b/share/www/fauxton/src/settings.json.default
new file mode 100644
index 0000000..27cd38f
--- /dev/null
+++ b/share/www/fauxton/src/settings.json.default
@@ -0,0 +1,55 @@
+{
+  "deps": [
+  { "name": "activetasks" },
+  { "name": "config" },
+  { "name": "logs" },
+  { "name": "stats" },
+  { "name": "replication" },
+  { "name": "plugins" },
+  { "name": "contribute" },
+  { "name": "permissions" },
+  { "name": "compaction" },
+  { "name": "auth" },
+  { "name": "verifyinstall" }
+  ],
+    "template": {
+      "development": {
+        "src": "assets/index.underscore",
+        "dest": "dist/debug/index.html",
+        "variables": {
+          "requirejs": "/assets/js/libs/require.js",
+          "css": "./css/index.css",
+          "base": null
+        },
+        "app": {
+          "root": "/",
+          "host": "../..",
+          "version": "1.0.dev"
+        }
+      },
+      "release": {
+        "src": "assets/index.underscore",
+        "dest": "dist/debug/index.html",
+        "variables": {
+          "requirejs": "./js/require.js",
+          "css": "./css/index.css",
+          "base": null
+        },
+        "app": {
+          "root": "/utils/fauxton/",
+          "host": "../..",
+          "version": "1.0"
+        }
+      }
+    },
+
+    "couch_config": {
+      "fauxton": {
+        "db": "http://localhost:5984/fauxton",
+        "app": "./couchapp.js",
+        "options": {
+          "okay_if_missing": true
+        }
+      }
+    }
+}

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/settings.json.sample_external
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/settings.json.sample_external b/share/www/fauxton/src/settings.json.sample_external
new file mode 100644
index 0000000..71c45b4
--- /dev/null
+++ b/share/www/fauxton/src/settings.json.sample_external
@@ -0,0 +1,10 @@
+{
+  "deps": [
+    {
+      "name": "fauxton-demo-plugin",
+      "url": "git://github.com/chewbranca/fauxton-demo-plugin.git"
+    },
+    { "name": "config" },
+    { "name": "logs" }
+  ]
+}

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/tasks/addon/rename.json
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/tasks/addon/rename.json b/share/www/fauxton/src/tasks/addon/rename.json
new file mode 100644
index 0000000..046ca50
--- /dev/null
+++ b/share/www/fauxton/src/tasks/addon/rename.json
@@ -0,0 +1,5 @@
+{
+  "routes.js.underscore": "{%= path %}/{%= name.toLowerCase() %}/routes.js",
+  "resources.js.underscore": "{%= path %}/{%= name.toLowerCase() %}/resources.js",
+  "base.js.underscore": "{%= path %}/{%= name.toLowerCase() %}/base.js"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/tasks/addon/root/base.js.underscore
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/tasks/addon/root/base.js.underscore b/share/www/fauxton/src/tasks/addon/root/base.js.underscore
new file mode 100644
index 0000000..d002cd5
--- /dev/null
+++ b/share/www/fauxton/src/tasks/addon/root/base.js.underscore
@@ -0,0 +1,21 @@
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+define([
+  "app",
+  "api",
+  "addons/{%= name.toLowerCase() %}/routes"
+],
+
+function(app, FauxtonAPI, {%= name %}) {
+  return {%= name %};
+});

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/tasks/addon/root/resources.js.underscore
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/tasks/addon/root/resources.js.underscore b/share/www/fauxton/src/tasks/addon/root/resources.js.underscore
new file mode 100644
index 0000000..8d0ef32
--- /dev/null
+++ b/share/www/fauxton/src/tasks/addon/root/resources.js.underscore
@@ -0,0 +1,21 @@
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+define([
+  "app",
+  "api"
+],
+
+function (app, FauxtonAPI) {
+  var {%= name %} = FauxtonAPI.addon();
+  return {%= name %};
+});

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/tasks/addon/root/routes.js.underscore
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/tasks/addon/root/routes.js.underscore b/share/www/fauxton/src/tasks/addon/root/routes.js.underscore
new file mode 100644
index 0000000..fa565b3
--- /dev/null
+++ b/share/www/fauxton/src/tasks/addon/root/routes.js.underscore
@@ -0,0 +1,42 @@
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+define([
+  "app",
+  "api",
+  "addons/{%= name.toLowerCase() %}/resources"
+],
+function(app, FauxtonAPI, {%= name %}) {
+  {%= name.substr(0, 1).toUpperCase() + name.substr(1)%}RouteObject = FauxtonAPI.RouteObject.extend({
+    layout: "with_sidebar",
+
+    crumbs: [
+    ],
+
+    routes: {
+    },
+
+    roles: [],
+
+    apiUrl: function() {
+      return ["insert url here..."];
+    },
+
+    initialize: function () {
+    },
+
+  });
+
+
+  {%= name %}.RouteObjects =  [{%= name.substr(0, 1).toUpperCase() + name.substr(1)%}RouteObject];
+  return {%= name %};
+});

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/tasks/addon/template.js
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/tasks/addon/template.js b/share/www/fauxton/src/tasks/addon/template.js
new file mode 100644
index 0000000..459ff34
--- /dev/null
+++ b/share/www/fauxton/src/tasks/addon/template.js
@@ -0,0 +1,70 @@
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+'use strict';
+
+exports.description = 'Generate a skeleton for an addon.';
+
+exports.notes = '';
+
+exports.after = "Created your addon! Don't forget to update your"+
+                " settings.json for it to be compiled and deployed";
+
+// Any existing file or directory matching this wildcard will cause a warning.
+// exports.warnOn = '*';
+
+// The actual init template.
+exports.template = function(grunt, init, done) {
+
+  // destpath
+  init.process(
+    {},
+    [
+      {
+        name: "name",
+        message: "Add on Name",
+        validator: /^[\w\-\.]+$/,
+        default: "WickedCool"
+      },
+      {
+        name: "path",
+        message: "Location of add ons",
+        default: "app/addons"
+      },
+      {
+        name: "assets",
+        message: "Do you need an assets folder? (for .less)",
+        default: 'y/N'
+      }
+    ],
+    function (err, props) {
+      // Files to copy (and process).
+      var files = init.filesToCopy(props);
+
+      // Actually copy and process (apply the template props) files.
+      init.copyAndProcess(files, props);
+
+      // Make the assets dir if requested
+      if (props.assets == "y"){
+        var asspath = props.path + "/" + props.name.toLowerCase() + "/assets";
+        grunt.file.mkdir(asspath);
+        grunt.log.writeln("Created " + asspath);
+      }
+
+      var tmplpath = props.path + "/" + props.name.toLowerCase() + "/templates";
+      grunt.file.mkdir(tmplpath);
+      grunt.log.writeln("Created " + tmplpath);
+      // All done!
+      done();
+    }
+  )
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/tasks/couchserver.js
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/tasks/couchserver.js b/share/www/fauxton/src/tasks/couchserver.js
new file mode 100644
index 0000000..b9ff3ef
--- /dev/null
+++ b/share/www/fauxton/src/tasks/couchserver.js
@@ -0,0 +1,104 @@
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+module.exports = function (grunt) {
+  var log = grunt.log;
+
+  grunt.registerTask("couchserver", 'Run a couch dev proxy server', function () {
+    var fs = require("fs"),
+        path = require("path"),
+        http = require("http"),
+        httpProxy = require('http-proxy'),
+        send = require('send'),
+        options = grunt.config('couchserver');
+
+    // Options
+    var dist_dir = options.dist || './dist/debug/',
+        app_dir = './app',
+        port = options.port || 8000;
+
+    // Proxy options with default localhost
+    var proxy_settings = options.proxy || {
+      target: {
+        host: 'localhost',
+        port: 5984,
+        https: false
+      }
+    };
+
+    // inform grunt that this task is async
+    var done = this.async();
+
+    // create proxy to couch for all couch requests
+    var proxy = new httpProxy.HttpProxy(proxy_settings);
+
+    http.createServer(function (req, res) {
+      var url = req.url.replace('app/',''),
+          accept = req.headers.accept.split(','),
+          filePath;
+
+      if (!!url.match(/assets/)) {
+        // serve any javascript or css files from here assets dir
+        filePath = path.join('./',url);
+      } else if (!!url.match(/mocha|\/test\/core\/|test\.config/)) {
+        filePath = path.join('./test', url.replace('/test/',''));
+      } else if (!!url.match(/\.css|img/)) {
+        filePath = path.join(dist_dir,url);
+      /*} else if (!!url.match(/\/js\//)) {
+        // serve any javascript or files from dist debug dir
+        filePath = path.join(dist_dir,req.url);*/
+      } else if (!!url.match(/\.js$|\.html$/)) {
+        // server js from app directory
+        filePath = path.join(app_dir, url.replace('/_utils/fauxton/',''));
+      } else if (!!url.match(/testrunner/)) {
+        var testSetup = grunt.util.spawn({cmd: 'grunt', grunt: true, args: ['mochaSetup']}, function (error, result, code) {/* log.writeln(String(result));*/ });
+        testSetup.stdout.pipe(process.stdout);
+        testSetup.stderr.pipe(process.stderr);
+        filePath = path.join('./test/runner.html');
+      } else if (url === '/' && accept[0] !== 'application/json') {
+        // serve main index file from here
+        filePath = path.join(dist_dir, 'index.html');
+      };
+
+      if (filePath) {
+        return send(req, filePath)
+          .on('error', function (err) {
+            if (err.status === 404) {
+              log.writeln('Could not locate', filePath);
+            } else {
+              log.writeln('ERROR', filePath, err);
+            }
+
+            res.setHeader("Content-Type", "text/javascript");
+            res.statusCode = 404;
+            res.end(JSON.stringify({error: err.message}));
+          })
+          .pipe(res);
+      } 
+
+      proxy.proxyRequest(req, res);
+    }).listen(port);
+
+    // Fail this task if any errors have been logged
+    if (grunt.errors) {
+      return false;
+    }
+
+    var watch = grunt.util.spawn({cmd: 'grunt', grunt: true, args: ['watch']}, function (error, result, code) {/* log.writeln(String(result));*/ });
+
+    watch.stdout.pipe(process.stdout);
+    watch.stderr.pipe(process.stderr);
+
+    log.writeln('Listening on ' + port);
+  });
+
+};

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/tasks/fauxton.js
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/tasks/fauxton.js b/share/www/fauxton/src/tasks/fauxton.js
new file mode 100644
index 0000000..e54bab8
--- /dev/null
+++ b/share/www/fauxton/src/tasks/fauxton.js
@@ -0,0 +1,137 @@
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+module.exports = function(grunt) {
+  var _ = grunt.util._;
+
+  grunt.registerMultiTask('template', 'generates an html file from a specified template', function(){
+    var data = this.data,
+        _ = grunt.util._,
+        tmpl = _.template(grunt.file.read(data.src), null, data.variables);
+
+    grunt.file.write(data.dest, tmpl(data.variables));
+  });
+
+  grunt.registerMultiTask('get_deps', 'Fetch external dependencies', function(version) {
+    grunt.log.writeln("Fetching external dependencies");
+
+    var path = require('path');
+        done = this.async(),
+        data = this.data,
+        target = data.target || "app/addons/",
+        settingsFile = path.existsSync(data.src) ? data.src : "settings.json.default",
+        settings = grunt.file.readJSON(settingsFile),
+        _ = grunt.util._;
+
+    // This should probably be a helper, though they seem to have been removed
+    var fetch = function(deps, command){
+      var child_process = require('child_process');
+      var async = require('async');
+      async.forEach(deps, function(dep, cb) {
+        var path = target + dep.name;
+        var location = dep.url || dep.path;
+        grunt.log.writeln("Fetching: " + dep.name + " (" + location + ")");
+
+        child_process.exec(command(dep, path), function(error, stdout, stderr) {
+          grunt.log.writeln(stderr);
+          grunt.log.writeln(stdout);
+          cb(error);
+        });
+      }, function(error) {
+        if (error) {
+          grunt.log.writeln("ERROR: " + error.message);
+          return false;
+        } else {
+          return true;
+        }
+      });
+    };
+
+    var remoteDeps = _.filter(settings.deps, function(dep) { return !! dep.url; });
+    grunt.log.writeln(remoteDeps.length + " remote dependencies");
+    var remote = fetch(remoteDeps, function(dep, destination){
+      return "git clone " + dep.url + " " + destination;
+    });
+
+    var localDeps = _.filter(settings.deps, function(dep) { return !! dep.path; });
+    grunt.log.writeln(localDeps.length + " local dependencies");
+    var local = fetch(localDeps, function(dep, destination){
+      // TODO: Windows
+      var command = "cp -r " + dep.path + " " + destination;
+      grunt.log.writeln(command);
+      return command;
+    });
+
+    done(remote && local);
+
+  });
+
+  grunt.registerMultiTask('gen_load_addons', 'Generate the load_addons.js file', function() {
+    var path = require('path');
+        data = this.data,
+        _ = grunt.util._,
+        settingsFile = path.existsSync(data.src) ? data.src : "settings.json.default",
+        settings = grunt.file.readJSON(settingsFile),
+        template = "app/load_addons.js.underscore",
+        dest = "app/load_addons.js",
+        deps = _.map(settings.deps, function(dep) {
+          return "addons/" + dep.name + "/base";
+        });
+
+    var tmpl = _.template(grunt.file.read(template));
+    grunt.file.write(dest, tmpl({deps: deps}));
+  });
+
+  grunt.registerMultiTask('gen_initialize', 'Generate the app.js file', function() {
+    var _ = grunt.util._,
+        settings = this.data,
+        template = "app/initialize.js.underscore",
+        dest = "app/initialize.js"
+        tmpl = _.template(grunt.file.read(template)),
+        app = {};
+      
+
+    _.defaults(app, settings.app, {
+      root: '/',
+      host: '../..',
+      version: "0.0"
+    });
+
+    grunt.file.write(dest, tmpl(app));
+  });
+
+  grunt.registerMultiTask('mochaSetup','Generate a config.js and runner.html for tests', function(){
+    var data = this.data,
+        configInfo,
+        _ = grunt.util._,
+        configTemplateSrc = data.template,
+        testFiles = grunt.file.expand(data.files.src);
+
+    var configTemplate = _.template(grunt.file.read(configTemplateSrc));
+    // a bit of a nasty hack to read our current config.js and get the info so we can change it 
+    // for our testing setup
+    var require = {
+      config: function (args) {
+        configInfo = args;
+        configInfo.paths['chai'] = "../test/mocha/chai";
+        configInfo.paths['sinon-chai'] = "../test/mocha/sinon-chai";
+        configInfo.paths['testUtils'] = "../test/mocha/testUtils";
+        configInfo.baseUrl = '../app';
+        delete configInfo.deps;
+      }
+    };
+
+    eval(grunt.file.read(data.config) +'');
+
+    grunt.file.write('./test/test.config.js', configTemplate({configInfo: configInfo, testFiles: testFiles}));
+  });
+};

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/tasks/helper.js
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/tasks/helper.js b/share/www/fauxton/src/tasks/helper.js
new file mode 100644
index 0000000..4b66e55
--- /dev/null
+++ b/share/www/fauxton/src/tasks/helper.js
@@ -0,0 +1,45 @@
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+var fs = require('fs'),
+    path = require('path');
+
+exports.init = function(grunt) {
+  var _ = grunt.util._;
+
+  return { 
+    readSettingsFile: function () {
+      if (fs.existsSync("settings.json")) {
+        return grunt.file.readJSON("settings.json");
+      } else if (fs.existsSync("settings.json.default")) {
+        return grunt.file.readJSON("settings.json.default");
+      } else {
+        return {deps: []};
+      }
+    },
+
+    processAddons: function (callback) {
+      this.readSettingsFile().deps.forEach(callback);
+    },
+
+    watchFiles: function (fileExtensions, defaults) {
+      return _.reduce(this.readSettingsFile().deps, function (files, dep) { 
+        if (dep.path) { 
+          _.each(fileExtensions, function (fileExtension) {
+            files.push(path.join(dep.path, '**/*' + fileExtension ));
+          });
+        }
+        return files
+      }, defaults);
+    }
+  };
+};

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/test/core/layoutSpec.js
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/test/core/layoutSpec.js b/share/www/fauxton/src/test/core/layoutSpec.js
new file mode 100644
index 0000000..3876b70
--- /dev/null
+++ b/share/www/fauxton/src/test/core/layoutSpec.js
@@ -0,0 +1,94 @@
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+define([
+       'modules/fauxton/layout',
+      'testUtils'
+], function (Layout, testUtils) {
+  var assert = testUtils.assert;
+
+  describe("Faxuton Layout", function () {
+    var layout;
+
+    beforeEach(function () {
+      var navBar = new Backbone.View();
+      var apiBar = new Backbone.View();
+      layout = new Layout(navBar, apiBar);
+    });
+
+    describe('#setTemplate', function () {
+
+      it("Should set template without prefix", function () {
+        layout.setTemplate('myTemplate');
+
+        assert.equal(layout.layout.template, 'templates/layouts/myTemplate');
+
+      });
+
+      it("Should set template with prefix", function () {
+        layout.setTemplate({name: 'myTemplate', prefix: 'myPrefix/'});
+
+        assert.equal(layout.layout.template, 'myPrefix/myTemplate');
+      });
+
+      it("Should remove old views", function () {
+        var view = {
+          remove: function () {}
+        };
+
+        layout.layoutViews = {
+          'selector': view
+        };
+
+        var mockRemove = sinon.spy(view, 'remove');
+        layout.setTemplate('myTemplate');
+        assert.ok(mockRemove.calledOnce);
+
+      });
+
+      it("Should render", function () {
+        var mockRender = sinon.spy(layout, 'render');
+
+        layout.setTemplate('myTemplate');
+
+        assert.ok(mockRender.calledOnce);
+
+      });
+
+    });
+
+    describe('#renderView', function () {
+
+      it('Should render existing view', function () {
+        var view = new Backbone.View();
+        var mockRender = sinon.spy(view, 'render');
+        layout.layoutViews = {
+          '#selector': view
+        };
+
+        var out = layout.renderView('#selector');
+
+        assert.ok(mockRender.calledOnce);
+      });
+
+      it('Should return false for non-existing view', function () {
+        var view = new Backbone.View();
+        layout.layoutViews = {
+          'selector': view
+        };
+
+        var out = layout.renderView('wrongSelector');
+        assert.notOk(out, 'No view found');
+      });
+    });
+
+  });
+});


Mime
View raw message