You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ns...@apache.org on 2013/12/14 12:41:23 UTC
[17/51] [partial] Bring Fauxton directories together
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>© 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');
+ });
+ });
+
+ });
+});