Package app (get rid of useless stuff)

This commit is contained in:
Florian Mounier
2014-01-30 13:17:36 +01:00
parent f802155116
commit 55af42f905
61 changed files with 1390 additions and 15731 deletions

13
LICENSE Normal file
View File

@@ -0,0 +1,13 @@
wdb Copyright (C) 2012 Florian Mounier, Kozea
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.

View File

@@ -1,10 +1,29 @@
# *-* coding: utf-8 *-*
# This file is part of butterfly
#
# butterfly Copyright (C) 2014 Florian Mounier
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
__version__ = '1.0'
import os
import tornado.web
import tornado.options
import tornado.web
from logging import getLogger
log = getLogger('wsterm')
log = getLogger('butterfly')
application = tornado.web.Application(
debug=tornado.options.options.debug,

View File

@@ -1,3 +1,21 @@
# *-* coding: utf-8 *-*
# This file is part of butterfly
#
# butterfly Copyright (C) 2014 Florian Mounier
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import pwd
import pty
import os
import io
@@ -13,13 +31,13 @@ from app import url, Route
ioloop = tornado.ioloop.IOLoop.instance()
@url(r'/(?:(wd/.+))?')
@url(r'/(?:user/(.+))?/?(?:wd/(.+))?')
class Index(Route):
def get(self, path):
def get(self, user, path):
return self.render('index.html')
@url(r'/ws(?:(/.+))?')
@url(r'/ws(?:/user/([^/]+))?/?(?:/wd/(.+))?')
class TermWebSocket(Route, tornado.websocket.WebSocketHandler):
def pty(self):
@@ -30,20 +48,39 @@ class TermWebSocket(Route, tornado.websocket.WebSocketHandler):
os.closerange(3, 256)
except:
pass
env = os.environ
env = {}
env["TERM"] = "xterm-256color"
env["COLORTERM"] = "wsterm"
command = os.getenv('SHELL')
env["COLORTERM"] = "butterfly"
env["LOCATION"] = "http://%s:%d/" % (
tornado.options.options.host, tornado.options.options.port)
env["WSTERMDIR"] = os.getcwd()
env["BUTTERFLY_DIR"] = os.getcwd()
env["SHELL"] = self.pw.pw_shell or '/bin/sh'
# env["PATH"] = os.path.abspath(os.path.join(
# os.path.dirname(__file__), '..', 'bin'))
try:
os.chdir(self.path or self.pw.pw_dir)
except:
pass
shell = tornado.options.options.command or self.pw.pw_shell
args = ['-i', '-l']
env["SHELL"] = command
env["PATH"] = "%s:%s" % (
os.path.abspath(os.path.join(
os.path.dirname(__file__), '..', 'bin')), env["PATH"])
os.chdir(self.path or os.path.expanduser("~"))
os.execvpe(command, [''], env)
# All users are the same -> launch shell
if self.is_local and (
self.uid == self.pw.pw_uid and self.uid == os.getuid()):
os.execvpe(shell, args, env)
if not (self.is_local and os.getuid() == 0 and
self.uid == self.pw.pw_uid):
# If user is not the same, get a password prompt
os.setuid(self.uid)
if tornado.options.options.command:
args.append('-s')
args.append('%s' % tornado.options.options.command)
args.append(self.pw.pw_name)
print('Logging: %s@%s' % (self.pw.pw_name, self.bind))
os.execvpe('/bin/su', args, env)
else:
self.log.debug('Adding handler')
fcntl.fcntl(self.fd, fcntl.F_SETFL, os.O_NONBLOCK)
@@ -69,9 +106,35 @@ class TermWebSocket(Route, tornado.websocket.WebSocketHandler):
)
ioloop.add_handler(self.fd, self.shell, ioloop.READ | ioloop.ERROR)
def open(self, path):
self.log.info('Websocket opened')
@property
def is_local(self):
return self.bind == '127.0.0.1'
@property
def pw(self):
if self.user:
return pwd.getpwnam(self.user)
if self.uid and self.is_local:
return pwd.getpwuid(self.uid)
# ?? Returning first user
return pwd.getpwuid(1000)
@property
def uid(self):
with open('/proc/net/tcp') as k:
lines = k.readlines()
for line in lines:
# Look for local address with peer port
if line.split()[1] == '0100007F:%X' % self.port:
# We got the user
return int(line.split()[7])
def open(self, user, path):
self.bind, self.port = self.ws_connection.stream.socket.getpeername()
self.log.info('Websocket opened for %s:%d' % (self.bind, self.port))
self.set_nodelay(True)
self.user = user.decode('utf-8') if user else None
self.path = path
self.pty()

View File

@@ -1,55 +1,56 @@
term = ws = null
cols = rows = null
$ = document.querySelectorAll.bind(document)
$ ->
ws_url = 'ws://' + document.location.host + '/ws'
if location.pathname.indexOf('/wd') == 0
ws_url += location.pathname.slice 3
ws = new WebSocket ws_url
ws.onopen = ->
console.log "WebSocket open", arguments
term = new Terminal(
visualBell: 100
screenKeys: true
scrollback: -1
)
term.on "data", (data) ->
ws.send 'SH|' + data
ws_url = 'ws://' + document.location.host + '/ws' + location.pathname
ws = new WebSocket ws_url
ws.onopen = ->
console.log "WebSocket open", arguments
term = new Terminal(
visualBell: 100
screenKeys: true
scrollback: -1
)
term.on "data", (data) ->
ws.send 'SH|' + data
term.on "title", (title) ->
document.title = title
term.on "title", (title) ->
document.title = title
term.open $('main').get(0)
$('.terminal').attr('style', '')
$(window).trigger 'resize'
term.open $('main')[0]
$('.terminal')[0].style = ''
resize()
ws.onclose = ->
if term
term.destroy()
console.log "WebSocket closed", arguments
open('','_self').close()
ws.onclose = ->
if term
term.destroy()
console.log "WebSocket closed", arguments
open('','_self').close()
ws.onerror = -> console.log "WebSocket error", arguments
ws.onmessage = (event) ->
# setTimeout (term.write event.data), 1
term.write event.data
ws.onerror = -> console.log "WebSocket error", arguments
ws.onmessage = (event) ->
term.write event.data
$(window).resize ->
$main = $('main')
$termtest = $('<div>').addClass('terminal')
$test = $('<div>').text('0123456789')
$termtest.append($test)
addEventListener 'resize', resize = ->
main = $('main')[0]
fake_term = document.createElement('div')
fake_term.className = 'terminal test'
fake_term_div = document.createElement('div')
fake_term_line = document.createElement('span')
fake_term_line.textContent = '0123456789'
fake_term_div.appendChild(fake_term_line)
fake_term.appendChild(fake_term_div)
main.appendChild(fake_term)
$main.append($termtest)
eh = $test.outerHeight()
$test.css(display: 'inline')
ew = $test.outerWidth() / 10
$termtest.remove()
w = $main.outerWidth()
h = $main.outerHeight()
cols = Math.floor(w / ew) - 1
rows = Math.floor(h / eh)
console.log "Computed #{cols} cols and #{rows} rows from main size #{w}, #{h} and div #{ew}, #{eh}"
term.resize cols, rows
ws.send "RS|#{cols},#{rows}"
ew = fake_term_line.getBoundingClientRect().width
eh = fake_term_div.getBoundingClientRect().height
main.removeChild(fake_term)
main_bb = main.getBoundingClientRect()
cols = Math.floor(10 * main_bb.width / ew) - 1
rows = Math.floor(main_bb.height / eh)
console.log "Computed #{cols} cols and #{rows} rows from ", main_bb, ew, eh
term.resize cols, rows
ws.send "RS|#{cols},#{rows}"

File diff suppressed because one or more lines are too long

View File

@@ -1,66 +1,68 @@
// Generated by CoffeeScript 1.6.3
var cols, rows, term, ws;
var $, cols, resize, rows, term, ws, ws_url;
term = ws = null;
cols = rows = null;
$(function() {
var ws_url;
ws_url = 'ws://' + document.location.host + '/ws';
if (location.pathname.indexOf('/wd') === 0) {
ws_url += location.pathname.slice(3);
}
ws = new WebSocket(ws_url);
ws.onopen = function() {
console.log("WebSocket open", arguments);
term = new Terminal({
visualBell: 100,
screenKeys: true,
scrollback: -1
});
term.on("data", function(data) {
return ws.send('SH|' + data);
});
term.on("title", function(title) {
return document.title = title;
});
term.open($('main').get(0));
$('.terminal').attr('style', '');
return $(window).trigger('resize');
};
ws.onclose = function() {
if (term) {
term.destroy();
}
console.log("WebSocket closed", arguments);
return open('', '_self').close();
};
ws.onerror = function() {
return console.log("WebSocket error", arguments);
};
ws.onmessage = function(event) {
return term.write(event.data);
};
return $(window).resize(function() {
var $main, $termtest, $test, eh, ew, h, w;
$main = $('main');
$termtest = $('<div>').addClass('terminal');
$test = $('<div>').text('0123456789');
$termtest.append($test);
$main.append($termtest);
eh = $test.outerHeight();
$test.css({
display: 'inline'
});
ew = $test.outerWidth() / 10;
$termtest.remove();
w = $main.outerWidth();
h = $main.outerHeight();
cols = Math.floor(w / ew) - 1;
rows = Math.floor(h / eh);
console.log("Computed " + cols + " cols and " + rows + " rows from main size " + w + ", " + h + " and div " + ew + ", " + eh);
term.resize(cols, rows);
return ws.send("RS|" + cols + "," + rows);
$ = document.querySelectorAll.bind(document);
ws_url = 'ws://' + document.location.host + '/ws' + location.pathname;
ws = new WebSocket(ws_url);
ws.onopen = function() {
console.log("WebSocket open", arguments);
term = new Terminal({
visualBell: 100,
screenKeys: true,
scrollback: -1
});
term.on("data", function(data) {
return ws.send('SH|' + data);
});
term.on("title", function(title) {
return document.title = title;
});
term.open($('main')[0]);
$('.terminal')[0].style = '';
return resize();
};
ws.onclose = function() {
if (term) {
term.destroy();
}
console.log("WebSocket closed", arguments);
return open('', '_self').close();
};
ws.onerror = function() {
return console.log("WebSocket error", arguments);
};
ws.onmessage = function(event) {
return term.write(event.data);
};
addEventListener('resize', resize = function() {
var eh, ew, fake_term, fake_term_div, fake_term_line, main, main_bb;
main = $('main')[0];
fake_term = document.createElement('div');
fake_term.className = 'terminal test';
fake_term_div = document.createElement('div');
fake_term_line = document.createElement('span');
fake_term_line.textContent = '0123456789';
fake_term_div.appendChild(fake_term_line);
fake_term.appendChild(fake_term_div);
main.appendChild(fake_term);
ew = fake_term_line.getBoundingClientRect().width;
eh = fake_term_div.getBoundingClientRect().height;
main.removeChild(fake_term);
main_bb = main.getBoundingClientRect();
cols = Math.floor(10 * main_bb.width / ew) - 1;
rows = Math.floor(main_bb.height / eh);
console.log("Computed " + cols + " cols and " + rows + " rows from ", main_bb, ew, eh);
term.resize(cols, rows);
return ws.send("RS|" + cols + "," + rows);
});

View File

@@ -1,55 +0,0 @@
//
// Alerts
// --------------------------------------------------
// Base styles
// -------------------------
.alert
padding: $alert-padding
margin-bottom: $line-height-computed
border: 1px solid transparent
border-radius: $alert-border-radius
// Headings for larger alerts
h4
margin-top: 0
// Specified for the h4 to prevent conflicts of changing $headings-color
color: inherit
// Provide class for links that match alerts
.alert-link
font-weight: $alert-link-font-weight
// Improve alignment and spacing of inner content
> p,
> ul
margin-bottom: 0
> p + p
margin-top: 5px
// Dismissable alerts
//
// Expand the right padding and account for the close button's positioning.
.alert-dismissable
padding-right: $alert-padding + 20
// Adjust close link position
.close
position: relative
top: -2px
right: -21px
color: inherit
// Alternate styles
//
// Generate contextual modifier classes for colorizing the alert.
.alert-success
+alert-variant($alert-success-bg, $alert-success-border, $alert-success-text)
.alert-info
+alert-variant($alert-info-bg, $alert-info-border, $alert-info-text)
.alert-warning
+alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text)
.alert-danger
+alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text)

View File

@@ -1,44 +0,0 @@
//
// Badges
// --------------------------------------------------
// Base classes
.badge
display: inline-block
min-width: 10px
padding: 3px 7px
font-size: $font-size-small
font-weight: $badge-font-weight
color: $badge-color
line-height: $badge-line-height
vertical-align: baseline
white-space: nowrap
text-align: center
background-color: $badge-bg
border-radius: $badge-border-radius
// Empty badges collapse automatically (not available in IE8)
&:empty
display: none
// Hover state, but only for links
a.badge
&:hover,
&:focus
color: $badge-link-hover-color
text-decoration: none
cursor: pointer
// Quick fix for labels/badges in buttons
.btn .badge
position: relative
top: -1px
// Account for counters in navs
a.list-group-item.active > .badge,
.nav-pills > .active > a > .badge
color: $badge-active-color
background-color: $badge-active-bg
.nav-pills > li > a > .badge
margin-left: 3px

View File

@@ -1,19 +0,0 @@
//
// Breadcrumbs
// --------------------------------------------------
.breadcrumb
padding: 8px 15px
margin-bottom: $line-height-computed
list-style: none
background-color: $breadcrumb-bg
border-radius: $border-radius-base
> li
display: inline-block
+ li:before
content: "#{$breadcrumb-separator}\00a0"
// Unicode space added since inline-block means non-collapsing white-space
padding: 0 5px
color: $breadcrumb-color
> .active
color: $breadcrumb-active-color

View File

@@ -1,213 +0,0 @@
//
// Button groups
// --------------------------------------------------
// Button carets
//
// Match the button text color to the arrow/caret for indicating dropdown-ness.
.caret
.btn-default &
border-top-color: $btn-default-color
.btn-primary &,
.btn-success &,
.btn-warning &,
.btn-danger &,
.btn-info &
border-top-color: #fff
.dropup
.btn-default .caret
border-bottom-color: $btn-default-color
.btn-primary,
.btn-success,
.btn-warning,
.btn-danger,
.btn-info
.caret
border-bottom-color: #fff
// Make the div behave like a button
.btn-group,
.btn-group-vertical
position: relative
display: inline-block
vertical-align: middle
// match .btn alignment given font-size hack above
> .btn
position: relative
float: left
// Bring the "active" button to the front
&:hover,
&:focus,
&:active,
&.active
z-index: 2
&:focus
// Remove focus outline when dropdown JS adds it after closing the menu
outline: none
// Prevent double borders when buttons are next to each other
.btn-group
.btn + .btn,
.btn + .btn-group,
.btn-group + .btn,
.btn-group + .btn-group
margin-left: -1px
// Optional: Group multiple button groups together for a toolbar
.btn-toolbar
+clearfix
.btn-group
float: left
// Space out series of button groups
> .btn,
> .btn-group
+ .btn,
+ .btn-group
margin-left: 5px
.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle)
border-radius: 0
// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
.btn-group > .btn:first-child
margin-left: 0
&:not(:last-child):not(.dropdown-toggle)
+border-right-radius(0)
// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
.btn-group > .btn:last-child:not(:first-child),
.btn-group > .dropdown-toggle:not(:first-child)
+border-left-radius(0)
// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
.btn-group > .btn-group
float: left
.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn
border-radius: 0
.btn-group > .btn-group:first-child
> .btn:last-child,
> .dropdown-toggle
+border-right-radius(0)
.btn-group > .btn-group:last-child > .btn:first-child
+border-left-radius(0)
// On active and open, don't show outline
.btn-group .dropdown-toggle:active,
.btn-group.open .dropdown-toggle
outline: 0
// Sizing
//
// Remix the default button sizing classes into new ones for easier manipulation.
.btn-group-xs > .btn
@extend .btn-xs
.btn-group-sm > .btn
@extend .btn-sm
.btn-group-lg > .btn
@extend .btn-lg
// Split button dropdowns
// ----------------------
// Give the line between buttons some depth
.btn-group > .btn + .dropdown-toggle
padding-left: 8px
padding-right: 8px
.btn-group > .btn-lg + .dropdown-toggle
padding-left: 12px
padding-right: 12px
// The clickable button for toggling the menu
// Remove the gradient and set the same inset shadow as the :active state
.btn-group.open .dropdown-toggle
+box-shadow(inset 0 3px 5px rgba(0, 0, 0, 0.125))
// Show no shadow for `.btn-link` since it has no other button styles.
&.btn-link
+box-shadow(none)
// Reposition the caret
.btn .caret
margin-left: 0
// Carets in other button sizes
.btn-lg .caret
border-width: $caret-width-large $caret-width-large 0
border-bottom-width: 0
// Upside down carets for .dropup
.dropup .btn-lg .caret
border-width: 0 $caret-width-large $caret-width-large
// Vertical button groups
// ----------------------
.btn-group-vertical
> .btn,
> .btn-group
display: block
float: none
width: 100%
max-width: 100%
// Clear floats so dropdown menus can be properly placed
> .btn-group
+clearfix
> .btn
float: none
> .btn + .btn,
> .btn + .btn-group,
> .btn-group + .btn,
> .btn-group + .btn-group
margin-top: -1px
margin-left: 0
.btn-group-vertical > .btn
&:not(:first-child):not(:last-child)
border-radius: 0
&:first-child:not(:last-child)
border-top-right-radius: $border-radius-base
+border-bottom-radius(0)
&:last-child:not(:first-child)
border-bottom-left-radius: $border-radius-base
+border-top-radius(0)
.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn
border-radius: 0
.btn-group-vertical > .btn-group:first-child
> .btn:last-child,
> .dropdown-toggle
+border-bottom-radius(0)
.btn-group-vertical > .btn-group:last-child > .btn:first-child
+border-top-radius(0)
// Justified button groups
// ----------------------
.btn-group-justified
display: table
width: 100%
table-layout: fixed
border-collapse: separate
.btn
float: none
display: table-cell
width: 1%
// Checkbox and radio options
[data-toggle="buttons"] > .btn > input[type="radio"],
[data-toggle="buttons"] > .btn > input[type="checkbox"]
display: none

View File

@@ -1,134 +0,0 @@
//
// Buttons
// --------------------------------------------------
// Base styles
// --------------------------------------------------
// Core styles
.btn
display: inline-block
margin-bottom: 0
// For input.btn
font-weight: $btn-font-weight
text-align: center
vertical-align: middle
cursor: pointer
background-image: none
// Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
border: 1px solid transparent
white-space: nowrap
+button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $border-radius-base)
+user-select(none)
&:focus
+tab-focus
&:hover,
&:focus
color: $btn-default-color
text-decoration: none
&:active,
&.active
outline: 0
background-image: none
+box-shadow(inset 0 3px 5px rgba(0, 0, 0, 0.125))
&.disabled,
&[disabled],
fieldset[disabled] &
cursor: not-allowed
pointer-events: none
// Future-proof disabling of clicks
+opacity(0.65)
+box-shadow(none)
// Alternate buttons
// --------------------------------------------------
.btn-default
+button-variant($btn-default-color, $btn-default-bg, $btn-default-border)
.btn-primary
+button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border)
// Warning appears as orange
.btn-warning
+button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border)
// Danger and error appear as red
.btn-danger
+button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border)
// Success appears as green
.btn-success
+button-variant($btn-success-color, $btn-success-bg, $btn-success-border)
// Info appears as blue-green
.btn-info
+button-variant($btn-info-color, $btn-info-bg, $btn-info-border)
// Link buttons
// -------------------------
// Make a button look and behave like a link
.btn-link
color: $link-color
font-weight: normal
cursor: pointer
border-radius: 0
&,
&:active,
&[disabled],
fieldset[disabled] &
background-color: transparent
+box-shadow(none)
&,
&:hover,
&:focus,
&:active
border-color: transparent
&:hover,
&:focus
color: $link-hover-color
text-decoration: underline
background-color: transparent
&[disabled],
fieldset[disabled] &
&:hover,
&:focus
color: $btn-link-disabled-color
text-decoration: none
// Button Sizes
// --------------------------------------------------
.btn-lg
// line-height: ensure even-numbered height of button next to large input
+button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large)
.btn-sm,
.btn-xs
// line-height: ensure proper height of button next to small input
+button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small)
.btn-xs
padding: 1px 5px
// Block button
// --------------------------------------------------
.btn-block
display: block
width: 100%
padding-left: 0
padding-right: 0
// Vertically space out multiple block buttons
.btn-block + .btn-block
margin-top: 5px
// Specificity overrides
input[type="submit"],
input[type="reset"],
input[type="button"]
&.btn-block
width: 100%

View File

@@ -1,185 +0,0 @@
//
// Carousel
// --------------------------------------------------
// Wrapper for the slide container and indicators
.carousel
position: relative
.carousel-inner
position: relative
overflow: hidden
width: 100%
> .item
display: none
position: relative
+transition(0.6s ease-in-out left)
// Account for jankitude on images
> img,
> a > img
+img-responsive
line-height: 1
> .active,
> .next,
> .prev
display: block
> .active
left: 0
> .next,
> .prev
position: absolute
top: 0
width: 100%
> .next
left: 100%
> .prev
left: -100%
> .next.left,
> .prev.right
left: 0
> .active.left
left: -100%
> .active.right
left: 100%
// Left/right controls for nav
// ---------------------------
.carousel-control
position: absolute
top: 0
left: 0
bottom: 0
width: $carousel-control-width
+opacity($carousel-control-opacity)
font-size: $carousel-control-font-size
color: $carousel-control-color
text-align: center
text-shadow: $carousel-text-shadow
// We can't have this transition here because WebKit cancels the carousel
// animation if you trip this while in the middle of another animation.
// Set gradients for backgrounds
&.left
+gradient-horizontal($start_color: rgba(0, 0, 0, 0.5), $end_color: rgba(0, 0, 0, 0.0001))
&.right
left: auto
right: 0
+gradient-horizontal($start_color: rgba(0, 0, 0, 0.0001), $end_color: rgba(0, 0, 0, 0.5))
// Hover/focus state
&:hover,
&:focus
color: $carousel-control-color
text-decoration: none
+opacity(0.9)
// Toggles
.icon-prev,
.icon-next,
.glyphicon-chevron-left,
.glyphicon-chevron-right
position: absolute
top: 50%
z-index: 5
display: inline-block
.icon-prev,
.glyphicon-chevron-left
left: 50%
.icon-next,
.glyphicon-chevron-right
right: 50%
.icon-prev,
.icon-next
width: 20px
height: 20px
margin-top: -10px
margin-left: -10px
font-family: serif
.icon-prev
&:before
content: '\2039'
// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
.icon-next
&:before
content: '\203a'
// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
// Optional indicator pips
//
// Add an unordered list with the following class and add a list item for each
// slide your carousel holds.
.carousel-indicators
position: absolute
bottom: 10px
left: 50%
z-index: 15
width: 60%
margin-left: -30%
padding-left: 0
list-style: none
text-align: center
li
display: inline-block
width: 10px
height: 10px
margin: 1px
text-indent: -999px
border: 1px solid $carousel-indicator-border-color
border-radius: 10px
cursor: pointer
// IE8-9 hack for event handling
//
// Internet Explorer 8-9 does not support clicks on elements without a set
// `background-color`. We cannot use `filter` since that's not viewed as a
// background color by the browser. Thus, a hack is needed.
//
// For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we
// set alpha transparency for the best results possible.
background-color: #000 \9
// IE8
background-color: rgba(0, 0, 0, 0)
// IE9
.active
margin: 0
width: 12px
height: 12px
background-color: $carousel-indicator-active-bg
// Optional captions
// -----------------------------
// Hidden by default for smaller viewports
.carousel-caption
position: absolute
left: 15%
right: 15%
bottom: 20px
z-index: 10
padding-top: 20px
padding-bottom: 20px
color: $carousel-caption-color
text-align: center
text-shadow: $carousel-text-shadow
& .btn
text-shadow: none
// No shadow for button elements in carousel-caption
// Scale up controls for tablets and up
@media screen and (min-width: $screen-sm-min)
// Scale up the controls a smidge
.carousel-control
.glyphicons-chevron-left,
.glyphicons-chevron-right,
.icon-prev,
.icon-next
width: 30px
height: 30px
margin-top: -15px
margin-left: -15px
font-size: 30px
// Show and left align the captions
.carousel-caption
left: 20%
right: 20%
padding-bottom: 30px
// Move up the indicators
.carousel-indicators
bottom: 20px

View File

@@ -1,29 +0,0 @@
//
// Close icons
// --------------------------------------------------
.close
float: right
font-size: $font-size-base * 1.5
font-weight: $close-font-weight
line-height: 1
color: $close-color
text-shadow: $close-text-shadow
+opacity(0.2)
&:hover,
&:focus
color: $close-color
text-decoration: none
cursor: pointer
+opacity(0.5)
// [converter] extracted button& to button.close
// Additional properties for button version
// iOS requires the button element instead of an anchor tag.
// If you want the anchor version, it requires `href="#"`.
button.close
padding: 0
cursor: pointer
background: transparent
border: 0
-webkit-appearance: none

View File

@@ -1,48 +0,0 @@
//
// Code (inline and block)
// --------------------------------------------------
// Inline and block code styles
code,
kbd,
pre,
samp
font-family: $font-family-monospace
// Inline code
code
padding: 2px 4px
font-size: 90%
color: $code-color
background-color: $code-bg
white-space: nowrap
border-radius: $border-radius-base
// Blocks of code
pre
display: block
padding: ($line-height-computed - 1) / 2
margin: 0 0 $line-height-computed / 2
font-size: $font-size-base - 1
// 14px to 13px
line-height: $line-height-base
word-break: break-all
word-wrap: break-word
color: $pre-color
background-color: $pre-bg
border: 1px solid $pre-border-color
border-radius: $border-radius-base
// Account for some code outputs that place code tags in pre tags
code
padding: 0
font-size: inherit
color: inherit
white-space: pre-wrap
background-color: transparent
border-radius: 0
// Enable scrollable blocks of code
.pre-scrollable
max-height: $pre-scrollable-max-height
overflow-y: scroll

View File

@@ -1,25 +0,0 @@
//
// Component animations
// --------------------------------------------------
// Heads up!
//
// We don't use the `.opacity()` mixin here since it causes a bug with text
// fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552.
.fade
opacity: 0
+transition(opacity 0.15s linear)
&.in
opacity: 1
.collapse
display: none
&.in
display: block
.collapsing
position: relative
height: 0
overflow: hidden
+transition(height 0.35s ease)

View File

@@ -1,165 +0,0 @@
//
// Dropdown menus
// --------------------------------------------------
// Dropdown arrow/caret
.caret
display: inline-block
width: 0
height: 0
margin-left: 2px
vertical-align: middle
border-top: $caret-width-base solid $dropdown-caret-color
border-right: $caret-width-base solid transparent
border-left: $caret-width-base solid transparent
// Firefox fix for https://github.com/twbs/bootstrap/issues/9538. Once fixed,
// we can just straight up remove this.
border-bottom: 0 dotted
// The dropdown wrapper (div)
.dropdown
position: relative
// Prevent the focus on the dropdown toggle when closing dropdowns
.dropdown-toggle:focus
outline: 0
// The dropdown menu (ul)
.dropdown-menu
position: absolute
top: 100%
left: 0
z-index: $zindex-dropdown
display: none
// none by default, but block on "open" of the menu
float: left
min-width: 160px
padding: 5px 0
margin: 2px 0 0
// override default ul
list-style: none
font-size: $font-size-base
background-color: $dropdown-bg
border: 1px solid $dropdown-fallback-border
// IE8 fallback
border: 1px solid $dropdown-border
border-radius: $border-radius-base
+box-shadow(0 6px 12px rgba(0, 0, 0, 0.175))
background-clip: padding-box
// Aligns the dropdown menu to right
&.pull-right
right: 0
left: auto
// Dividers (basically an hr) within the dropdown
.divider
+nav-divider($dropdown-divider-bg)
// Links within the dropdown menu
> li > a
display: block
padding: 3px 20px
clear: both
font-weight: normal
line-height: $line-height-base
color: $dropdown-link-color
white-space: nowrap
// prevent links from randomly breaking onto new lines
// Hover/Focus state
.dropdown-menu > li > a
&:hover,
&:focus
text-decoration: none
color: $dropdown-link-hover-color
background-color: $dropdown-link-hover-bg
// Active state
.dropdown-menu > .active > a
&,
&:hover,
&:focus
color: $dropdown-link-active-color
text-decoration: none
outline: 0
background-color: $dropdown-link-active-bg
// Disabled state
//
// Gray out text and ensure the hover/focus state remains gray
.dropdown-menu > .disabled > a
&,
&:hover,
&:focus
color: $dropdown-link-disabled-color
// Nuke hover/focus effects
.dropdown-menu > .disabled > a
&:hover,
&:focus
text-decoration: none
background-color: transparent
background-image: none
// Remove CSS gradient
+reset-filter
cursor: not-allowed
// Open state for the dropdown
.open
// Show the menu
> .dropdown-menu
display: block
// Remove the outline when :focus is triggered
> a
outline: 0
// Dropdown section headers
.dropdown-header
display: block
padding: 3px 20px
font-size: $font-size-small
line-height: $line-height-base
color: $dropdown-header-color
// Backdrop to catch body clicks on mobile, etc.
.dropdown-backdrop
position: fixed
left: 0
right: 0
bottom: 0
top: 0
z-index: $zindex-dropdown - 10
// Right aligned dropdowns
.pull-right > .dropdown-menu
right: 0
left: auto
// Allow for dropdowns to go bottom up (aka, dropup-menu)
//
// Just add .dropup after the standard .dropdown class and you're set, bro.
// TODO: abstract this so that the navbar fixed styles are not placed here?
.dropup,
.navbar-fixed-bottom .dropdown
// Reverse the caret
.caret
// Firefox fix for https://github.com/twbs/bootstrap/issues/9538. Once this
// gets fixed, restore `border-top: 0;`.
border-top: 0 dotted
border-bottom: $caret-width-base solid $dropdown-caret-color
content: ""
// Different positioning for bottom up menu
.dropdown-menu
top: auto
bottom: 100%
margin-bottom: 1px
// Component alignment
//
// Reiterate per navbar.less and the modified component alignment there.
@media (min-width: $grid-float-breakpoint)
.navbar-right
.dropdown-menu
right: 0
left: auto

View File

@@ -1,320 +0,0 @@
//
// Forms
// --------------------------------------------------
// Normalize non-controls
//
// Restyle and baseline non-control form elements.
fieldset
padding: 0
margin: 0
border: 0
legend
display: block
width: 100%
padding: 0
margin-bottom: $line-height-computed
font-size: $font-size-base * 1.5
line-height: inherit
color: $legend-color
border: 0
border-bottom: 1px solid $legend-border-color
label
display: inline-block
margin-bottom: 5px
font-weight: bold
// Normalize form controls
// Override content-box in Normalize (* isn't specific enough)
input[type="search"]
+box-sizing(border-box)
// Position radios and checkboxes better
input[type="radio"],
input[type="checkbox"]
margin: 4px 0 0
margin-top: 1px \9
/* IE8-9
line-height: normal
// Set the height of select and file controls to match text inputs
input[type="file"]
display: block
// Make multiple select elements height not fixed
select[multiple],
select[size]
height: auto
// Fix optgroup Firefox bug per https://github.com/twbs/bootstrap/issues/7611
select optgroup
font-size: inherit
font-style: inherit
font-family: inherit
// Focus for select, file, radio, and checkbox
input[type="file"]:focus,
input[type="radio"]:focus,
input[type="checkbox"]:focus
+tab-focus
// Fix for Chrome number input
// Setting certain font-sizes causes the `I` bar to appear on hover of the bottom increment button.
// See https://github.com/twbs/bootstrap/issues/8350 for more.
input[type="number"]
&::-webkit-outer-spin-button,
&::-webkit-inner-spin-button
height: auto
// Adjust output element
output
display: block
padding-top: $padding-base-vertical + 1
font-size: $font-size-base
line-height: $line-height-base
color: $input-color
vertical-align: middle
// Common form controls
//
// Shared size and type resets for form controls. Apply `.form-control` to any
// of the following form controls:
//
// select
// textarea
// input[type="text"]
// input[type="password"]
// input[type="datetime"]
// input[type="datetime-local"]
// input[type="date"]
// input[type="month"]
// input[type="time"]
// input[type="week"]
// input[type="number"]
// input[type="email"]
// input[type="url"]
// input[type="search"]
// input[type="tel"]
// input[type="color"]
.form-control
display: block
width: 100%
height: $input-height-base
// Make inputs at least the height of their button counterpart (base line-height + padding + border)
padding: $padding-base-vertical $padding-base-horizontal
font-size: $font-size-base
line-height: $line-height-base
color: $input-color
vertical-align: middle
background-color: $input-bg
background-image: none
// Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
border: 1px solid $input-border
border-radius: $input-border-radius
+box-shadow(inset 0 1px 1px rgba(0, 0, 0, 0.075))
+transition(border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s)
// Customize the `:focus` state to imitate native WebKit styles.
+form-control-focus
// Placeholder
//
// Placeholder text gets special styles because when browsers invalidate entire
// lines if it doesn't understand a selector/
+placeholder
// Disabled and read-only inputs
// Note: HTML5 says that controls under a fieldset > legend:first-child won't
// be disabled if the fieldset is disabled. Due to implementation difficulty,
// we don't honor that edge case; we style them as disabled anyway.
&[disabled],
&[readonly],
fieldset[disabled] &
cursor: not-allowed
background-color: $input-bg-disabled
// [converter] extracted textarea& to textarea.form-control
// Reset height for `textarea`s
textarea.form-control
height: auto
// Form groups
//
// Designed to help with the organization and spacing of vertical forms. For
// horizontal forms, use the predefined grid classes.
.form-group
margin-bottom: 15px
// Checkboxes and radios
//
// Indent the labels to position radios/checkboxes as hanging controls.
.radio,
.checkbox
display: block
min-height: $line-height-computed
// clear the floating input if there is no label text
margin-top: 10px
margin-bottom: 10px
padding-left: 20px
vertical-align: middle
label
display: inline
margin-bottom: 0
font-weight: normal
cursor: pointer
.radio input[type="radio"],
.radio-inline input[type="radio"],
.checkbox input[type="checkbox"],
.checkbox-inline input[type="checkbox"]
float: left
margin-left: -20px
.radio + .radio,
.checkbox + .checkbox
margin-top: -5px
// Move up sibling radios or checkboxes for tighter spacing
// Radios and checkboxes on same line
.radio-inline,
.checkbox-inline
display: inline-block
padding-left: 20px
margin-bottom: 0
vertical-align: middle
font-weight: normal
cursor: pointer
.radio-inline + .radio-inline,
.checkbox-inline + .checkbox-inline
margin-top: 0
margin-left: 10px
// space out consecutive inline controls
// Apply same disabled cursor tweak as for inputs
//
// Note: Neither radios nor checkboxes can be readonly.
input[type="radio"],
input[type="checkbox"],
.radio,
.radio-inline,
.checkbox,
.checkbox-inline
&[disabled],
fieldset[disabled] &
cursor: not-allowed
// Form control sizing
+input-size(".input-sm", $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small)
+input-size(".input-lg", $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large)
// Form control feedback states
//
// Apply contextual and semantic states to individual form controls.
// Warning
.has-warning
+form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg)
// Error
.has-error
+form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg)
// Success
.has-success
+form-control-validation($state-success-text, $state-success-text, $state-success-bg)
// Static form control text
//
// Apply class to a `p` element to make any string of text align with labels in
// a horizontal form layout.
.form-control-static
margin-bottom: 0
// Remove default margin from `p`
// Help text
//
// Apply to any element you wish to create light text for placement immediately
// below a form control. Use for general help, formatting, or instructional text.
.help-block
display: block
// account for any element using help-block
margin-top: 5px
margin-bottom: 10px
color: lighten($text-color, 25%)
// lighten the text some for contrast
// Inline forms
//
// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
// forms begin stacked on extra small (mobile) devices and then go inline when
// viewports reach <768px.
//
// Requires wrapping inputs and labels with `.form-group` for proper display of
// default HTML form controls and our custom form controls (e.g., input groups).
//
// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.
.form-inline
// Kick in the inline
@media (min-width: $screen-sm)
// Inline-block all the things for "inline"
.form-group
display: inline-block
margin-bottom: 0
vertical-align: middle
// In navbar-form, allow folks to *not* use `.form-group`
.form-control
display: inline-block
// Remove default margin on radios/checkboxes that were used for stacking, and
// then undo the floating of radios and checkboxes to match (which also avoids
// a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).
.radio,
.checkbox
display: inline-block
margin-top: 0
margin-bottom: 0
padding-left: 0
.radio input[type="radio"],
.checkbox input[type="checkbox"]
float: none
margin-left: 0
// Horizontal forms
//
// Horizontal forms are built on grid classes and allow you to create forms with
// labels on the left and inputs on the right.
.form-horizontal
// Consistent vertical alignment of labels, radios, and checkboxes
.control-label,
.radio,
.checkbox,
.radio-inline,
.checkbox-inline
margin-top: 0
margin-bottom: 0
padding-top: $padding-base-vertical + 1
// Default padding plus a border
// Make form groups behave like rows
.form-group
+make-row
.form-control-static
padding-top: $padding-base-vertical + 1
// Only right align form labels here when the columns stop stacking
@media (min-width: $screen-sm-min)
.control-label
text-align: right

View File

@@ -1,830 +0,0 @@
//
// Glyphicons for Bootstrap
//
// Since icons are fonts, they can be placed anywhere text is placed and are
// thus automatically sized to match the surrounding child. To use, create an
// inline element with the appropriate classes, like so:
//
// <a href="#"><span class="glyphicon glyphicon-star"></span> Star</a>
// Import the fonts
@font-face
font-family: 'Glyphicons Halflings'
src: url("#{$icon-font-path}#{$icon-font-name}.eot")
src: url("#{$icon-font-path}#{$icon-font-name}.eot?#iefix") format("embedded-opentype"), url("#{$icon-font-path}#{$icon-font-name}.woff") format("woff"), url("#{$icon-font-path}#{$icon-font-name}.ttf") format("truetype"), url("#{$icon-font-path}#{$icon-font-name}.svg#glyphicons_halflingsregular") format("svg")
// Catchall baseclass
.glyphicon
position: relative
top: 1px
display: inline-block
font-family: 'Glyphicons Halflings'
font-style: normal
font-weight: normal
line-height: 1
-webkit-font-smoothing: antialiased
-moz-osx-font-smoothing: grayscale
&:empty
width: 1em
// Individual icons
.glyphicon-asterisk
&:before
content: "\2a"
.glyphicon-plus
&:before
content: "\2b"
.glyphicon-euro
&:before
content: "\20ac"
.glyphicon-minus
&:before
content: "\2212"
.glyphicon-cloud
&:before
content: "\2601"
.glyphicon-envelope
&:before
content: "\2709"
.glyphicon-pencil
&:before
content: "\270f"
.glyphicon-glass
&:before
content: "\e001"
.glyphicon-music
&:before
content: "\e002"
.glyphicon-search
&:before
content: "\e003"
.glyphicon-heart
&:before
content: "\e005"
.glyphicon-star
&:before
content: "\e006"
.glyphicon-star-empty
&:before
content: "\e007"
.glyphicon-user
&:before
content: "\e008"
.glyphicon-film
&:before
content: "\e009"
.glyphicon-th-large
&:before
content: "\e010"
.glyphicon-th
&:before
content: "\e011"
.glyphicon-th-list
&:before
content: "\e012"
.glyphicon-ok
&:before
content: "\e013"
.glyphicon-remove
&:before
content: "\e014"
.glyphicon-zoom-in
&:before
content: "\e015"
.glyphicon-zoom-out
&:before
content: "\e016"
.glyphicon-off
&:before
content: "\e017"
.glyphicon-signal
&:before
content: "\e018"
.glyphicon-cog
&:before
content: "\e019"
.glyphicon-trash
&:before
content: "\e020"
.glyphicon-home
&:before
content: "\e021"
.glyphicon-file
&:before
content: "\e022"
.glyphicon-time
&:before
content: "\e023"
.glyphicon-road
&:before
content: "\e024"
.glyphicon-download-alt
&:before
content: "\e025"
.glyphicon-download
&:before
content: "\e026"
.glyphicon-upload
&:before
content: "\e027"
.glyphicon-inbox
&:before
content: "\e028"
.glyphicon-play-circle
&:before
content: "\e029"
.glyphicon-repeat
&:before
content: "\e030"
.glyphicon-refresh
&:before
content: "\e031"
.glyphicon-list-alt
&:before
content: "\e032"
.glyphicon-lock
&:before
content: "\e033"
.glyphicon-flag
&:before
content: "\e034"
.glyphicon-headphones
&:before
content: "\e035"
.glyphicon-volume-off
&:before
content: "\e036"
.glyphicon-volume-down
&:before
content: "\e037"
.glyphicon-volume-up
&:before
content: "\e038"
.glyphicon-qrcode
&:before
content: "\e039"
.glyphicon-barcode
&:before
content: "\e040"
.glyphicon-tag
&:before
content: "\e041"
.glyphicon-tags
&:before
content: "\e042"
.glyphicon-book
&:before
content: "\e043"
.glyphicon-bookmark
&:before
content: "\e044"
.glyphicon-print
&:before
content: "\e045"
.glyphicon-camera
&:before
content: "\e046"
.glyphicon-font
&:before
content: "\e047"
.glyphicon-bold
&:before
content: "\e048"
.glyphicon-italic
&:before
content: "\e049"
.glyphicon-text-height
&:before
content: "\e050"
.glyphicon-text-width
&:before
content: "\e051"
.glyphicon-align-left
&:before
content: "\e052"
.glyphicon-align-center
&:before
content: "\e053"
.glyphicon-align-right
&:before
content: "\e054"
.glyphicon-align-justify
&:before
content: "\e055"
.glyphicon-list
&:before
content: "\e056"
.glyphicon-indent-left
&:before
content: "\e057"
.glyphicon-indent-right
&:before
content: "\e058"
.glyphicon-facetime-video
&:before
content: "\e059"
.glyphicon-picture
&:before
content: "\e060"
.glyphicon-map-marker
&:before
content: "\e062"
.glyphicon-adjust
&:before
content: "\e063"
.glyphicon-tint
&:before
content: "\e064"
.glyphicon-edit
&:before
content: "\e065"
.glyphicon-share
&:before
content: "\e066"
.glyphicon-check
&:before
content: "\e067"
.glyphicon-move
&:before
content: "\e068"
.glyphicon-step-backward
&:before
content: "\e069"
.glyphicon-fast-backward
&:before
content: "\e070"
.glyphicon-backward
&:before
content: "\e071"
.glyphicon-play
&:before
content: "\e072"
.glyphicon-pause
&:before
content: "\e073"
.glyphicon-stop
&:before
content: "\e074"
.glyphicon-forward
&:before
content: "\e075"
.glyphicon-fast-forward
&:before
content: "\e076"
.glyphicon-step-forward
&:before
content: "\e077"
.glyphicon-eject
&:before
content: "\e078"
.glyphicon-chevron-left
&:before
content: "\e079"
.glyphicon-chevron-right
&:before
content: "\e080"
.glyphicon-plus-sign
&:before
content: "\e081"
.glyphicon-minus-sign
&:before
content: "\e082"
.glyphicon-remove-sign
&:before
content: "\e083"
.glyphicon-ok-sign
&:before
content: "\e084"
.glyphicon-question-sign
&:before
content: "\e085"
.glyphicon-info-sign
&:before
content: "\e086"
.glyphicon-screenshot
&:before
content: "\e087"
.glyphicon-remove-circle
&:before
content: "\e088"
.glyphicon-ok-circle
&:before
content: "\e089"
.glyphicon-ban-circle
&:before
content: "\e090"
.glyphicon-arrow-left
&:before
content: "\e091"
.glyphicon-arrow-right
&:before
content: "\e092"
.glyphicon-arrow-up
&:before
content: "\e093"
.glyphicon-arrow-down
&:before
content: "\e094"
.glyphicon-share-alt
&:before
content: "\e095"
.glyphicon-resize-full
&:before
content: "\e096"
.glyphicon-resize-small
&:before
content: "\e097"
.glyphicon-exclamation-sign
&:before
content: "\e101"
.glyphicon-gift
&:before
content: "\e102"
.glyphicon-leaf
&:before
content: "\e103"
.glyphicon-fire
&:before
content: "\e104"
.glyphicon-eye-open
&:before
content: "\e105"
.glyphicon-eye-close
&:before
content: "\e106"
.glyphicon-warning-sign
&:before
content: "\e107"
.glyphicon-plane
&:before
content: "\e108"
.glyphicon-calendar
&:before
content: "\e109"
.glyphicon-random
&:before
content: "\e110"
.glyphicon-comment
&:before
content: "\e111"
.glyphicon-magnet
&:before
content: "\e112"
.glyphicon-chevron-up
&:before
content: "\e113"
.glyphicon-chevron-down
&:before
content: "\e114"
.glyphicon-retweet
&:before
content: "\e115"
.glyphicon-shopping-cart
&:before
content: "\e116"
.glyphicon-folder-close
&:before
content: "\e117"
.glyphicon-folder-open
&:before
content: "\e118"
.glyphicon-resize-vertical
&:before
content: "\e119"
.glyphicon-resize-horizontal
&:before
content: "\e120"
.glyphicon-hdd
&:before
content: "\e121"
.glyphicon-bullhorn
&:before
content: "\e122"
.glyphicon-bell
&:before
content: "\e123"
.glyphicon-certificate
&:before
content: "\e124"
.glyphicon-thumbs-up
&:before
content: "\e125"
.glyphicon-thumbs-down
&:before
content: "\e126"
.glyphicon-hand-right
&:before
content: "\e127"
.glyphicon-hand-left
&:before
content: "\e128"
.glyphicon-hand-up
&:before
content: "\e129"
.glyphicon-hand-down
&:before
content: "\e130"
.glyphicon-circle-arrow-right
&:before
content: "\e131"
.glyphicon-circle-arrow-left
&:before
content: "\e132"
.glyphicon-circle-arrow-up
&:before
content: "\e133"
.glyphicon-circle-arrow-down
&:before
content: "\e134"
.glyphicon-globe
&:before
content: "\e135"
.glyphicon-wrench
&:before
content: "\e136"
.glyphicon-tasks
&:before
content: "\e137"
.glyphicon-filter
&:before
content: "\e138"
.glyphicon-briefcase
&:before
content: "\e139"
.glyphicon-fullscreen
&:before
content: "\e140"
.glyphicon-dashboard
&:before
content: "\e141"
.glyphicon-paperclip
&:before
content: "\e142"
.glyphicon-heart-empty
&:before
content: "\e143"
.glyphicon-link
&:before
content: "\e144"
.glyphicon-phone
&:before
content: "\e145"
.glyphicon-pushpin
&:before
content: "\e146"
.glyphicon-usd
&:before
content: "\e148"
.glyphicon-gbp
&:before
content: "\e149"
.glyphicon-sort
&:before
content: "\e150"
.glyphicon-sort-by-alphabet
&:before
content: "\e151"
.glyphicon-sort-by-alphabet-alt
&:before
content: "\e152"
.glyphicon-sort-by-order
&:before
content: "\e153"
.glyphicon-sort-by-order-alt
&:before
content: "\e154"
.glyphicon-sort-by-attributes
&:before
content: "\e155"
.glyphicon-sort-by-attributes-alt
&:before
content: "\e156"
.glyphicon-unchecked
&:before
content: "\e157"
.glyphicon-expand
&:before
content: "\e158"
.glyphicon-collapse-down
&:before
content: "\e159"
.glyphicon-collapse-up
&:before
content: "\e160"
.glyphicon-log-in
&:before
content: "\e161"
.glyphicon-flash
&:before
content: "\e162"
.glyphicon-log-out
&:before
content: "\e163"
.glyphicon-new-window
&:before
content: "\e164"
.glyphicon-record
&:before
content: "\e165"
.glyphicon-save
&:before
content: "\e166"
.glyphicon-open
&:before
content: "\e167"
.glyphicon-saved
&:before
content: "\e168"
.glyphicon-import
&:before
content: "\e169"
.glyphicon-export
&:before
content: "\e170"
.glyphicon-send
&:before
content: "\e171"
.glyphicon-floppy-disk
&:before
content: "\e172"
.glyphicon-floppy-saved
&:before
content: "\e173"
.glyphicon-floppy-remove
&:before
content: "\e174"
.glyphicon-floppy-save
&:before
content: "\e175"
.glyphicon-floppy-open
&:before
content: "\e176"
.glyphicon-credit-card
&:before
content: "\e177"
.glyphicon-transfer
&:before
content: "\e178"
.glyphicon-cutlery
&:before
content: "\e179"
.glyphicon-header
&:before
content: "\e180"
.glyphicon-compressed
&:before
content: "\e181"
.glyphicon-earphone
&:before
content: "\e182"
.glyphicon-phone-alt
&:before
content: "\e183"
.glyphicon-tower
&:before
content: "\e184"
.glyphicon-stats
&:before
content: "\e185"
.glyphicon-sd-video
&:before
content: "\e186"
.glyphicon-hd-video
&:before
content: "\e187"
.glyphicon-subtitles
&:before
content: "\e188"
.glyphicon-sound-stereo
&:before
content: "\e189"
.glyphicon-sound-dolby
&:before
content: "\e190"
.glyphicon-sound-5-1
&:before
content: "\e191"
.glyphicon-sound-6-1
&:before
content: "\e192"
.glyphicon-sound-7-1
&:before
content: "\e193"
.glyphicon-copyright-mark
&:before
content: "\e194"
.glyphicon-registration-mark
&:before
content: "\e195"
.glyphicon-cloud-download
&:before
content: "\e197"
.glyphicon-cloud-upload
&:before
content: "\e198"
.glyphicon-tree-conifer
&:before
content: "\e199"
.glyphicon-tree-deciduous
&:before
content: "\e200"

View File

@@ -1,81 +0,0 @@
//
// Grid system
// --------------------------------------------------
// Set the container width, and override it for fixed navbars in media queries
.container
+container-fixed
// mobile first defaults
.row
+make-row
// Common styles for small and large grid columns
+make-grid-columns
// Extra small grid
//
// Grid classes for extra small devices like smartphones. No offset, push, or
// pull classes are present here due to the size of the target.
//
// Note that `.col-xs-12` doesn't get floated on purpose--there's no need since
// it's full-width.
+make-grid-columns-float(xs)
+make-grid($grid-columns, xs, width)
+make-grid($grid-columns, xs, pull)
+make-grid($grid-columns, xs, push)
+make-grid($grid-columns, xs, offset)
// Small grid
//
// Columns, offsets, pushes, and pulls for the small device range, from phones
// to tablets.
//
// Note that `.col-sm-12` doesn't get floated on purpose--there's no need since
// it's full-width.
@media (min-width: $screen-sm-min)
.container
width: $container-sm
+make-grid-columns-float(sm)
+make-grid($grid-columns, sm, width)
+make-grid($grid-columns, sm, pull)
+make-grid($grid-columns, sm, push)
+make-grid($grid-columns, sm, offset)
// Medium grid
//
// Columns, offsets, pushes, and pulls for the desktop device range.
//
// Note that `.col-md-12` doesn't get floated on purpose--there's no need since
// it's full-width.
@media (min-width: $screen-md-min)
.container
width: $container-md
+make-grid-columns-float(md)
+make-grid($grid-columns, md, width)
+make-grid($grid-columns, md, pull)
+make-grid($grid-columns, md, push)
+make-grid($grid-columns, md, offset)
// Large grid
//
// Columns, offsets, pushes, and pulls for the large desktop device range.
//
// Note that `.col-lg-12` doesn't get floated on purpose--there's no need since
// it's full-width.
@media (min-width: $screen-lg-min)
.container
width: $container-lg
+make-grid-columns-float(lg)
+make-grid($grid-columns, lg, width)
+make-grid($grid-columns, lg, pull)
+make-grid($grid-columns, lg, push)
+make-grid($grid-columns, lg, offset)

View File

@@ -1,123 +0,0 @@
//
// Input groups
// --------------------------------------------------
// Base styles
// -------------------------
.input-group
position: relative
// For dropdowns
display: table
border-collapse: separate
// prevent input groups from inheriting border styles from table cells when placed within a table
// Undo padding and float of grid classes
&.col
float: none
padding-left: 0
padding-right: 0
.form-control
width: 100%
margin-bottom: 0
// Sizing options
//
// Remix the default form control sizing classes into new ones for easier
// manipulation.
.input-group-lg > .form-control,
.input-group-lg > .input-group-addon,
.input-group-lg > .input-group-btn > .btn
@extend .input-lg
.input-group-sm > .form-control,
.input-group-sm > .input-group-addon,
.input-group-sm > .input-group-btn > .btn
@extend .input-sm
// Display as table-cell
// -------------------------
.input-group-addon,
.input-group-btn,
.input-group .form-control
display: table-cell
&:not(:first-child):not(:last-child)
border-radius: 0
// Addon and addon wrapper for buttons
.input-group-addon,
.input-group-btn
width: 1%
white-space: nowrap
vertical-align: middle
// Match the inputs
// Text input groups
// -------------------------
.input-group-addon
padding: $padding-base-vertical $padding-base-horizontal
font-size: $font-size-base
font-weight: normal
line-height: 1
color: $input-color
text-align: center
background-color: $input-group-addon-bg
border: 1px solid $input-group-addon-border-color
border-radius: $border-radius-base
// Sizing
&.input-sm
padding: $padding-small-vertical $padding-small-horizontal
font-size: $font-size-small
border-radius: $border-radius-small
&.input-lg
padding: $padding-large-vertical $padding-large-horizontal
font-size: $font-size-large
border-radius: $border-radius-large
// Nuke default margins from checkboxes and radios to vertically center within.
input[type="radio"],
input[type="checkbox"]
margin-top: 0
// Reset rounded corners
.input-group .form-control:first-child,
.input-group-addon:first-child,
.input-group-btn:first-child > .btn,
.input-group-btn:first-child > .dropdown-toggle,
.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle)
+border-right-radius(0)
.input-group-addon:first-child
border-right: 0
.input-group .form-control:last-child,
.input-group-addon:last-child,
.input-group-btn:last-child > .btn,
.input-group-btn:last-child > .dropdown-toggle,
.input-group-btn:first-child > .btn:not(:first-child)
+border-left-radius(0)
.input-group-addon:last-child
border-left: 0
// Button input groups
// -------------------------
.input-group-btn
position: relative
white-space: nowrap
// Negative margin to only have a 1px border between the two
&:first-child > .btn
margin-right: -1px
&:last-child > .btn
margin-left: -1px
.input-group-btn > .btn
position: relative
// Jankily prevent input button groups from wrapping
+ .btn
margin-left: -4px
// Bring the "active" button to the front
&:hover,
&:active
z-index: 2

View File

@@ -1,28 +0,0 @@
//
// Jumbotron
// --------------------------------------------------
.jumbotron
padding: $jumbotron-padding
margin-bottom: $jumbotron-padding
font-size: $jumbotron-font-size
font-weight: 200
line-height: $line-height-base * 1.5
color: $jumbotron-color
background-color: $jumbotron-bg
h1
line-height: 1
color: $jumbotron-heading-color
p
line-height: 1.4
.container &
border-radius: $border-radius-large
// Only round corners at higher resolutions if contained in a container
@media screen and (min-width: $screen-sm-min)
padding-top: $jumbotron-padding * 1.6
padding-bottom: $jumbotron-padding * 1.6
.container &
padding-left: $jumbotron-padding * 2
padding-right: $jumbotron-padding * 2
h1
font-size: $font-size-base * 4.5

View File

@@ -1,46 +0,0 @@
//
// Labels
// --------------------------------------------------
.label
display: inline
padding: .2em .6em .3em
font-size: 75%
font-weight: bold
line-height: 1
color: $label-color
text-align: center
white-space: nowrap
vertical-align: baseline
border-radius: .25em
// Add hover effects, but only for links
&[href]
&:hover,
&:focus
color: $label-link-hover-color
text-decoration: none
cursor: pointer
// Empty labels collapse automatically (not available in IE8)
&:empty
display: none
// Colors
// Contextual variations (linked labels get darker on :hover)
.label-default
+label-variant($label-default-bg)
.label-primary
+label-variant($label-primary-bg)
.label-success
+label-variant($label-success-bg)
.label-info
+label-variant($label-info-bg)
.label-warning
+label-variant($label-warning-bg)
.label-danger
+label-variant($label-danger-bg)

View File

@@ -1,71 +0,0 @@
//
// List groups
// --------------------------------------------------
// Base class
//
// Easily usable on <ul>, <ol>, or <div>.
.list-group
// No need to set list-style: none; since .list-group-item is block level
margin-bottom: 20px
padding-left: 0
// reset padding because ul and ol
// Individual list items
// -------------------------
.list-group-item
position: relative
display: block
padding: 10px 15px
// Place the border on the list items and negative margin up for better styling
margin-bottom: -1px
background-color: $list-group-bg
border: 1px solid $list-group-border
// Round the first and last items
&:first-child
+border-top-radius($list-group-border-radius)
&:last-child
margin-bottom: 0
+border-bottom-radius($list-group-border-radius)
// Align badges within list items
> .badge
float: right
> .badge + .badge
margin-right: 5px
// Linked list items
a.list-group-item
color: $list-group-link-color
.list-group-item-heading
color: $list-group-link-heading-color
// Hover state
&:hover,
&:focus
text-decoration: none
background-color: $list-group-hover-bg
// Active class on item itself, not parent
&.active,
&.active:hover,
&.active:focus
z-index: 2
// Place active items above their siblings for proper border styling
color: $list-group-active-color
background-color: $list-group-active-bg
border-color: $list-group-active-border
// Force color to inherit for custom content
.list-group-item-heading
color: inherit
.list-group-item-text
color: lighten($list-group-active-bg, 40%)
// Custom content options
// -------------------------
.list-group-item-heading
margin-top: 0
margin-bottom: 5px
.list-group-item-text
margin-bottom: 0
line-height: 1.3

View File

@@ -1,47 +0,0 @@
// Media objects
// Source: http://stubbornella.org/content/?p=497
// --------------------------------------------------
// Common styles
// -------------------------
// Clear the floats
.media,
.media-body
overflow: hidden
zoom: 1
// Proper spacing between instances of .media
.media,
.media .media
margin-top: 15px
.media:first-child
margin-top: 0
// For images and videos, set to block
.media-object
display: block
// Reset margins on headings for tighter default spacing
.media-heading
margin: 0 0 5px
// Media image alignment
// -------------------------
.media
> .pull-left
margin-right: 10px
> .pull-right
margin-left: 10px
// Media list variation
// -------------------------
// Undo default ul/ol styles
.media-list
padding-left: 0
list-style: none

View File

@@ -1,759 +0,0 @@
//
// Mixins
// --------------------------------------------------
// Utilities
// -------------------------
// Clearfix
// Source: http://nicolasgallagher.com/micro-clearfix-hack/
//
// For modern browsers
// 1. The space content is one way to avoid an Opera bug when the
// contenteditable attribute is included anywhere else in the document.
// Otherwise it causes space to appear at the top and bottom of elements
// that are clearfixed.
// 2. The use of `table` rather than `block` is only necessary if using
// `:before` to contain the top-margins of child elements.
=clearfix
&:before,
&:after
content: " "
/* 1
display: table
/* 2
&:after
clear: both
// WebKit-style focus
=tab-focus
// Default
outline: thin dotted #333
// WebKit
outline: 5px auto -webkit-focus-ring-color
outline-offset: -2px
// Center-align a block level element
=center-block
display: block
margin-left: auto
margin-right: auto
// Sizing shortcuts
=size($width, $height)
width: $width
height: $height
=square($size)
+size($size, $size)
// Placeholder text
=placeholder($color: $input-color-placeholder)
&:-moz-placeholder
color: $color
// Firefox 4-18
&::-moz-placeholder
color: $color
// Firefox 19+
&:-ms-input-placeholder
color: $color
// Internet Explorer 10+
&::-webkit-input-placeholder
color: $color
// Safari and Chrome
// Text overflow
// Requires inline-block or block for proper styling
=text-overflow
overflow: hidden
text-overflow: ellipsis
white-space: nowrap
// CSS image replacement
//
// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for
// mixins being reused as classes with the same name, this doesn't hold up. As
// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. Note
// that we cannot chain the mixins together in Less, so they are repeated.
//
// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
// Deprecated as of v3.0.1 (will be removed in v4)
=hide-text
font: #{0 / 0} a
color: transparent
text-shadow: none
background-color: transparent
border: 0
// New mixin to use as of v3.0.1
=text-hide
font: #{0 / 0} a
color: transparent
text-shadow: none
background-color: transparent
border: 0
// CSS3 PROPERTIES
// --------------------------------------------------
// Single side border-radius
=border-top-radius($radius)
border-top-right-radius: $radius
border-top-left-radius: $radius
=border-right-radius($radius)
border-bottom-right-radius: $radius
border-top-right-radius: $radius
=border-bottom-radius($radius)
border-bottom-right-radius: $radius
border-bottom-left-radius: $radius
=border-left-radius($radius)
border-bottom-left-radius: $radius
border-top-left-radius: $radius
// Drop shadows
=box-shadow($shadow...)
-webkit-box-shadow: $shadow
// iOS <4.3 & Android <4.1
box-shadow: $shadow
// Transitions
=transition($transition...)
-webkit-transition: $transition
transition: $transition
=transition-property($transition-property)
-webkit-transition-property: $transition-property
transition-property: $transition-property
=transition-delay($transition-delay)
-webkit-transition-delay: $transition-delay
transition-delay: $transition-delay
=transition-duration($transition-duration)
-webkit-transition-duration: $transition-duration
transition-duration: $transition-duration
=transition-transform($transition...)
-webkit-transition: -webkit-transform $transition
-moz-transition: -moz-transform $transition
-o-transition: -o-transform $transition
transition: transform $transition
// Transformations
=rotate($degrees)
-webkit-transform: rotate($degrees)
-ms-transform: rotate($degrees)
// IE9+
transform: rotate($degrees)
=scale($ratio)
-webkit-transform: scale($ratio)
-ms-transform: scale($ratio)
// IE9+
transform: scale($ratio)
=translate($x, $y)
-webkit-transform: translate($x, $y)
-ms-transform: translate($x, $y)
// IE9+
transform: translate($x, $y)
=skew($x, $y)
-webkit-transform: skew($x, $y)
-ms-transform: skewX($x) skewY($y)
// See https://github.com/twbs/bootstrap/issues/4885; IE9+
transform: skew($x, $y)
=translate3d($x, $y, $z)
-webkit-transform: translate3d($x, $y, $z)
transform: translate3d($x, $y, $z)
=rotateX($degrees)
-webkit-transform: rotateX($degrees)
-ms-transform: rotateX($degrees)
// IE9+
transform: rotateX($degrees)
=rotateY($degrees)
-webkit-transform: rotateY($degrees)
-ms-transform: rotateY($degrees)
// IE9+
transform: rotateY($degrees)
=perspective($perspective)
-webkit-perspective: $perspective
-moz-perspective: $perspective
perspective: $perspective
=perspective-origin($perspective)
-webkit-perspective-origin: $perspective
-moz-perspective-origin: $perspective
perspective-origin: $perspective
=transform-origin($origin)
-webkit-transform-origin: $origin
-moz-transform-origin: $origin
transform-origin: $origin
// Animations
=animation($animation)
-webkit-animation: $animation
animation: $animation
// Backface visibility
// Prevent browsers from flickering when using CSS 3D transforms.
// Default value is `visible`, but can be changed to `hidden`
=backface-visibility($visibility)
-webkit-backface-visibility: $visibility
-moz-backface-visibility: $visibility
backface-visibility: $visibility
// Box sizing
=box-sizing($boxmodel)
-webkit-box-sizing: $boxmodel
-moz-box-sizing: $boxmodel
box-sizing: $boxmodel
// User select
// For selecting text on the page
=user-select($select)
-webkit-user-select: $select
-moz-user-select: $select
-ms-user-select: $select
// IE10+
-o-user-select: $select
user-select: $select
// Resize anything
=resizable($direction)
resize: $direction
// Options: horizontal, vertical, both
overflow: auto
// Safari fix
// CSS3 Content Columns
=content-columns($column-count, $column-gap: $grid-gutter-width)
-webkit-column-count: $column-count
-moz-column-count: $column-count
column-count: $column-count
-webkit-column-gap: $column-gap
-moz-column-gap: $column-gap
column-gap: $column-gap
// Optional hyphenation
=hyphens($mode: auto)
word-wrap: break-word
-webkit-hyphens: $mode
-moz-hyphens: $mode
-ms-hyphens: $mode
// IE10+
-o-hyphens: $mode
hyphens: $mode
// Opacity
=opacity($opacity)
opacity: $opacity
// IE8 filter
$opacity-ie: $opacity * 100
filter: #{alpha(opacity = $opacity-ie)}
// GRADIENTS
// --------------------------------------------------
// Horizontal gradient, from left to right
//
// Creates two color stops, start and end, by specifying a color and position for each color stop.
// Color stops are not available in IE9 and below.
=gradient-horizontal($start-color: #555555, $end-color: #333333, $start-percent: 0%, $end-percent: 100%)
background-image: -webkit-gradient(linear, $start-percent top, $end-percent top, from($start-color), to($end-color))
// Safari 4+, Chrome 2+
background-image: -webkit-linear-gradient(left, color-stop($start-color $start-percent), color-stop($end-color $end-percent))
// Safari 5.1+, Chrome 10+
background-image: -moz-linear-gradient(left, $start-color $start-percent, $end-color $end-percent)
// FF 3.6+
background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent)
// Standard, IE10
background-repeat: repeat-x
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1)
// IE9 and down
// Vertical gradient, from top to bottom
//
// Creates two color stops, start and end, by specifying a color and position for each color stop.
// Color stops are not available in IE9 and below.
=gradient-vertical($start-color: #555555, $end-color: #333333, $start-percent: 0%, $end-percent: 100%)
background-image: -webkit-gradient(linear, left $start-percent, left $end-percent, from($start-color), to($end-color))
// Safari 4+, Chrome 2+
background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent)
// Safari 5.1+, Chrome 10+
background-image: -moz-linear-gradient(top, $start-color $start-percent, $end-color $end-percent)
// FF 3.6+
background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent)
// Standard, IE10
background-repeat: repeat-x
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0)
// IE9 and down
=gradient-directional($start-color: #555555, $end-color: #333333, $deg: 45deg)
background-repeat: repeat-x
background-image: -webkit-linear-gradient($deg, $start-color, $end-color)
// Safari 5.1+, Chrome 10+
background-image: -moz-linear-gradient($deg, $start-color, $end-color)
// FF 3.6+
background-image: linear-gradient($deg, $start-color, $end-color)
// Standard, IE10
=gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f)
background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from($start-color), color-stop($color-stop, $mid-color), to($end-color))
background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color)
background-image: -moz-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color)
background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color)
background-repeat: no-repeat
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1)
// IE9 and down, gets no color-stop at all for proper fallback
=gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f)
background-image: -webkit-gradient(linear, 0 0, 0 100%, from($start-color), color-stop($color-stop, $mid-color), to($end-color))
background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color)
background-image: -moz-linear-gradient(top, $start-color, $mid-color $color-stop, $end-color)
background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color)
background-repeat: no-repeat
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0)
// IE9 and down, gets no color-stop at all for proper fallback
=gradient-radial($inner-color: #555555, $outer-color: #333333)
background-image: -webkit-gradient(radial, center center, 0, center center, 460, from($inner-color), to($outer-color))
background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color)
background-image: -moz-radial-gradient(circle, $inner-color, $outer-color)
background-image: radial-gradient(circle, $inner-color, $outer-color)
background-repeat: no-repeat
=gradient-striped($color: rgba(255, 255, 255, 0.15), $angle: 45deg)
background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, $color), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, $color), color-stop(0.75, $color), color-stop(0.75, transparent), to(transparent))
background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent)
background-image: -moz-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent)
background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent)
// Reset filters for IE
//
// When you need to remove a gradient background, do not forget to use this to reset
// the IE filter for IE9 and below.
=reset-filter
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false)
// Retina images
//
// Short retina mixin for setting background-image and -size
=img-retina($file-1x, $file-2x, $width-1x, $height-1x)
background-image: image-url(#{$file-1x})
@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2 / 1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx)
background-image: image-url(#{$file-2x})
background-size: $width-1x $height-1x
// Responsive image
//
// Keep images from scaling beyond the width of their parents.
=img-responsive($display: block)
display: $display
max-width: 100%
// Part 1: Set a maximum relative to the parent
height: auto
// Part 2: Scale the height according to the width, otherwise you get stretching
// COMPONENT MIXINS
// --------------------------------------------------
// Horizontal dividers
// -------------------------
// Dividers (basically an hr) within dropdowns and nav lists
=nav-divider($color: #e5e5e5)
height: 1px
margin: $line-height-computed / 2 - 1 0
overflow: hidden
background-color: $color
// Panels
// -------------------------
=panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border)
border-color: $border
& > .panel-heading
color: $heading-text-color
background-color: $heading-bg-color
border-color: $heading-border
+ .panel-collapse .panel-body
border-top-color: $border
& > .dropdown .caret
border-color: $heading-text-color transparent
& > .panel-footer
+ .panel-collapse .panel-body
border-bottom-color: $border
// Alerts
// -------------------------
=alert-variant($background, $border, $text-color)
background-color: $background
border-color: $border
color: $text-color
hr
border-top-color: darken($border, 5%)
.alert-link
color: darken($text-color, 10%)
// Tables
// -------------------------
=table-row-variant($state, $background, $border)
// Exact selectors below required to override `.table-striped` and prevent
// inheritance to nested tables.
.table > thead > tr,
.table > tbody > tr,
.table > tfoot > tr
> td.#{$state},
> th.#{$state},
&.#{$state} > td,
&.#{$state} > th
background-color: $background
// Hover states for `.table-hover`
// Note: this is not available for cells or rows within `thead` or `tfoot`.
.table-hover > tbody > tr
> td.#{$state}:hover,
> th.#{$state}:hover,
&.#{$state}:hover > td,
&.#{$state}:hover > th
background-color: darken($background, 5%)
// Button variants
// -------------------------
// Easily pump out default styles, as well as :hover, :focus, :active,
// and disabled options for all buttons
=button-variant($color, $background, $border)
color: $color
background-color: $background
border-color: $border
&:hover,
&:focus,
&:active,
&.active
color: $color
background-color: darken($background, 8%)
border-color: darken($border, 12%)
.open &
&.dropdown-toggle
color: $color
background-color: darken($background, 8%)
border-color: darken($border, 12%)
&:active,
&.active
background-image: none
.open &
&.dropdown-toggle
background-image: none
&.disabled,
&[disabled],
fieldset[disabled] &
&,
&:hover,
&:focus,
&:active,
&.active
background-color: $background
border-color: $border
// Button sizes
// -------------------------
=button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius)
padding: $padding-vertical $padding-horizontal
font-size: $font-size
line-height: $line-height
border-radius: $border-radius
// Pagination
// -------------------------
=pagination-size($padding-vertical, $padding-horizontal, $font-size, $border-radius)
> li
> a,
> span
padding: $padding-vertical $padding-horizontal
font-size: $font-size
&:first-child
> a,
> span
+border-left-radius($border-radius)
&:last-child
> a,
> span
+border-right-radius($border-radius)
// Labels
// -------------------------
=label-variant($color)
background-color: $color
&[href]
&:hover,
&:focus
background-color: darken($color, 10%)
// Navbar vertical align
// -------------------------
// Vertically center elements in the navbar.
// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
=navbar-vertical-align($element-height)
margin-top: ($navbar-height - $element-height) / 2
margin-bottom: ($navbar-height - $element-height) / 2
// Progress bars
// -------------------------
=progress-bar-variant($color)
background-color: $color
.progress-striped &
+gradient-striped
// Responsive utilities
// -------------------------
// More easily include all the states for responsive-utilities.less.
// [converter] $parent hack
=responsive-visibility($parent)
#{$parent}
display: block !important
tr#{$parent}
display: table-row !important
th#{$parent},
td#{$parent}
display: table-cell !important
// [converter] $parent hack
=responsive-invisibility($parent)
#{$parent},
tr#{$parent},
th#{$parent},
td#{$parent}
display: none !important
// Grid System
// -----------
// Centered container element
=container-fixed
margin-right: auto
margin-left: auto
padding-left: $grid-gutter-width / 2
padding-right: $grid-gutter-width / 2
+clearfix
// Creates a wrapper for a series of columns
=make-row($gutter: $grid-gutter-width)
margin-left: $gutter / -2
margin-right: $gutter / -2
+clearfix
// Generate the extra small columns
=make-xs-column($columns, $gutter: $grid-gutter-width)
position: relative
float: left
width: percentage($columns / $grid-columns)
// Prevent columns from collapsing when empty
min-height: 1px
// Inner gutter via padding
padding-left: $gutter / 2
padding-right: $gutter / 2
// Generate the small columns
=make-sm-column($columns, $gutter: $grid-gutter-width)
position: relative
// Prevent columns from collapsing when empty
min-height: 1px
// Inner gutter via padding
padding-left: $gutter / 2
padding-right: $gutter / 2
// Calculate width based on number of columns available
@media (min-width: $screen-sm-min)
float: left
width: percentage($columns / $grid-columns)
// Generate the small column offsets
=make-sm-column-offset($columns)
@media (min-width: $screen-sm-min)
margin-left: percentage($columns / $grid-columns)
=make-sm-column-push($columns)
@media (min-width: $screen-sm-min)
left: percentage($columns / $grid-columns)
=make-sm-column-pull($columns)
@media (min-width: $screen-sm-min)
right: percentage($columns / $grid-columns)
// Generate the medium columns
=make-md-column($columns, $gutter: $grid-gutter-width)
position: relative
// Prevent columns from collapsing when empty
min-height: 1px
// Inner gutter via padding
padding-left: $gutter / 2
padding-right: $gutter / 2
// Calculate width based on number of columns available
@media (min-width: $screen-md-min)
float: left
width: percentage($columns / $grid-columns)
// Generate the medium column offsets
=make-md-column-offset($columns)
@media (min-width: $screen-md-min)
margin-left: percentage($columns / $grid-columns)
=make-md-column-push($columns)
@media (min-width: $screen-md)
left: percentage($columns / $grid-columns)
=make-md-column-pull($columns)
@media (min-width: $screen-md-min)
right: percentage($columns / $grid-columns)
// Generate the large columns
=make-lg-column($columns, $gutter: $grid-gutter-width)
position: relative
// Prevent columns from collapsing when empty
min-height: 1px
// Inner gutter via padding
padding-left: $gutter / 2
padding-right: $gutter / 2
// Calculate width based on number of columns available
@media (min-width: $screen-lg-min)
float: left
width: percentage($columns / $grid-columns)
// Generate the large column offsets
=make-lg-column-offset($columns)
@media (min-width: $screen-lg-min)
margin-left: percentage($columns / $grid-columns)
=make-lg-column-push($columns)
@media (min-width: $screen-lg-min)
left: percentage($columns / $grid-columns)
=make-lg-column-pull($columns)
@media (min-width: $screen-lg-min)
right: percentage($columns / $grid-columns)
// Framework grid generation
//
// Used only by Bootstrap to generate the correct number of grid classes given
// any value of `$grid-columns`.
// [converter] Grid converted to use SASS cycles (LESS uses recursive nested mixin defs not supported by SASS)
=make-grid-columns
$list: ""
$i: 1
$list: ".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}"
@for $i from 2 through $grid-columns
$list: ".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}, #{$list}"
#{$list}
position: relative
// Prevent columns from collapsing when empty
min-height: 1px
// Inner gutter via padding
padding-left: $grid-gutter-width / 2
padding-right: $grid-gutter-width / 2
// [converter] Grid converted to use SASS cycles (LESS uses recursive nested mixin defs not supported by SASS)
=make-grid-columns-float($class)
$list: ""
$i: 1
$list: ".col-#{$class}-#{$i}"
@for $i from 2 through $grid-columns
$list: ".col-#{$class}-#{$i}, #{$list}"
#{$list}
float: left
=calc-grid($index, $class, $type)
@if $type == width and $index > 0
.col-#{$class}-#{$index}
width: percentage($index / $grid-columns)
@if $type == push
.col-#{$class}-push-#{$index}
left: percentage($index / $grid-columns)
@if $type == pull
.col-#{$class}-pull-#{$index}
right: percentage($index / $grid-columns)
@if $type == offset
.col-#{$class}-offset-#{$index}
margin-left: percentage($index / $grid-columns)
// [converter] This is defined recursively in LESS, but SASS supports real loops
=make-grid($columns, $class, $type)
@for $i from 0 through $columns
+calc-grid($i, $class, $type)
// Form validation states
//
// Used in forms.less to generate the form validation CSS for warnings, errors,
// and successes.
=form-control-validation($text-color: #555555, $border-color: #cccccc, $background-color: whitesmoke)
// Color the label and help text
.help-block,
.control-label,
.radio,
.checkbox,
.radio-inline,
.checkbox-inline
color: $text-color
// Set the border and box shadow on specific inputs to match
.form-control
border-color: $border-color
+box-shadow(inset 0 1px 1px rgba(0, 0, 0, 0.075))
// Redeclare so transitions work
&:focus
border-color: darken($border-color, 10%)
$shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px lighten($border-color, 20%)
+box-shadow($shadow)
// Set validation states also for addons
.input-group-addon
color: $text-color
border-color: $border-color
background-color: $background-color
// Form control focus state
//
// Generate a customized focus state and for any input with the specified color,
// which defaults to the `$input-focus-border` variable.
//
// We highly encourage you to not customize the default value, but instead use
// this to tweak colors on an as-needed basis. This aesthetic change is based on
// WebKit's default styles, but applicable to a wider range of browsers. Its
// usability and accessibility should be taken into account with any change.
//
// Example usage: change the default blue border and shadow to white for better
// contrast against a dark gray background.
=form-control-focus($color: $input-border-focus)
$color-rgba: rgba(red($color), green($color), blue($color), 0.6)
&:focus
border-color: $color
outline: 0
+box-shadow(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px $color-rgba)
// Form control sizing
//
// Relative text size, padding, and border-radii changes for form controls. For
// horizontal sizing, wrap controls in the predefined grid classes. `<select>`
// element gets special love because it's special, and that's a fact!
// [converter] $parent hack
=input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius)
#{$parent}
height: $input-height
padding: $padding-vertical $padding-horizontal
font-size: $font-size
line-height: $line-height
border-radius: $border-radius
select#{$parent}
height: $input-height
line-height: $input-height
textarea#{$parent}
height: auto

View File

@@ -1,119 +0,0 @@
//
// Modals
// --------------------------------------------------
// .modal-open - body class for killing the scroll
// .modal - container to scroll within
// .modal-dialog - positioning shell for the actual modal
// .modal-content - actual modal w/ bg and corners and shit
// Kill the scroll on the body
.modal-open
overflow: hidden
// Container that the modal scrolls within
.modal
display: none
overflow: auto
overflow-y: scroll
position: fixed
top: 0
right: 0
bottom: 0
left: 0
z-index: $zindex-modal-background
// When fading in the modal, animate it to slide down
&.fade .modal-dialog
+translate(0, -25%)
+transition-transform(0.3s ease-out)
&.in .modal-dialog
+translate(0, 0)
// Shell div to position the modal with bottom padding
.modal-dialog
position: relative
margin-left: auto
margin-right: auto
width: auto
padding: 10px
z-index: $zindex-modal-background + 10
// Actual modal
.modal-content
position: relative
background-color: $modal-content-bg
border: 1px solid $modal-content-fallback-border-color
//old browsers fallback (ie8 etc)
border: 1px solid $modal-content-border-color
border-radius: $border-radius-large
+box-shadow(0 3px 9px rgba(0, 0, 0, 0.5))
background-clip: padding-box
// Remove focus outline from opened modal
outline: none
// Modal background
.modal-backdrop
position: fixed
top: 0
right: 0
bottom: 0
left: 0
z-index: $zindex-modal-background - 10
background-color: $modal-backdrop-bg
// Fade for backdrop
&.fade
+opacity(0)
&.in
+opacity(0.5)
// Modal header
// Top section of the modal w/ title and dismiss
.modal-header
padding: $modal-title-padding
border-bottom: 1px solid $modal-header-border-color
min-height: $modal-title-padding + $modal-title-line-height
// Close icon
.modal-header .close
margin-top: -2px
// Title text within header
.modal-title
margin: 0
line-height: $modal-title-line-height
// Modal body
// Where all modal content resides (sibling of .modal-header and .modal-footer)
.modal-body
position: relative
padding: $modal-inner-padding
// Footer (for actions)
.modal-footer
margin-top: 15px
padding: $modal-inner-padding - 1 $modal-inner-padding $modal-inner-padding
text-align: right
// right align buttons
border-top: 1px solid $modal-footer-border-color
+clearfix
// clear it in case folks use .pull-* classes on buttons
// Properly space out buttons
.btn + .btn
margin-left: 5px
margin-bottom: 0
// account for input[type="submit"] which gets the bottom margin like all other inputs
// but override that for button groups
.btn-group .btn + .btn
margin-left: -1px
// and override it for block buttons as well
.btn-block + .btn-block
margin-left: 0
// Scale up the modal
@media screen and (min-width: $screen-sm-min)
.modal-dialog
width: 600px
padding-top: 30px
padding-bottom: 30px
.modal-content
+box-shadow(0 5px 15px rgba(0, 0, 0, 0.5))

View File

@@ -1,458 +0,0 @@
//
// Navbars
// --------------------------------------------------
// Wrapper and base class
//
// Provide a static navbar from which we expand to create full-width, fixed, and
// other navbar variations.
.navbar
position: relative
min-height: $navbar-height
// Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)
margin-bottom: $navbar-margin-bottom
border: 1px solid transparent
// Prevent floats from breaking the navbar
+clearfix
@media (min-width: $grid-float-breakpoint)
border-radius: $navbar-border-radius
// Navbar heading
//
// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
// styling of responsive aspects.
.navbar-header
+clearfix
@media (min-width: $grid-float-breakpoint)
float: left
// Navbar collapse (body)
//
// Group your navbar content into this for easy collapsing and expanding across
// various device sizes. By default, this content is collapsed when <768px, but
// will expand past that for a horizontal display.
//
// To start (on mobile devices) the navbar links, forms, and buttons are stacked
// vertically and include a `max-height` to overflow in case you have too much
// content for the user's viewport.
.navbar-collapse
max-height: 340px
overflow-x: visible
padding-right: $navbar-padding-horizontal
padding-left: $navbar-padding-horizontal
border-top: 1px solid transparent
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1)
+clearfix
-webkit-overflow-scrolling: touch
&.in
overflow-y: auto
@media (min-width: $grid-float-breakpoint)
width: auto
border-top: 0
box-shadow: none
&.collapse
display: block !important
height: auto !important
padding-bottom: 0
// Override default setting
overflow: visible !important
&.in
overflow-y: auto
// Account for first and last children spacing
.navbar-nav.navbar-left:first-child
margin-left: -$navbar-padding-horizontal
.navbar-nav.navbar-right:last-child
margin-right: -$navbar-padding-horizontal
.navbar-text:last-child
margin-right: 0
// Both navbar header and collapse
//
// When a container is present, change the behavior of the header and collapse.
.container > .navbar-header,
.container > .navbar-collapse
margin-right: -$navbar-padding-horizontal
margin-left: -$navbar-padding-horizontal
@media (min-width: $grid-float-breakpoint)
margin-right: 0
margin-left: 0
//
// Navbar alignment options
//
// Display the navbar across the entirety of the page or fixed it to the top or
// bottom of the page.
// Static top (unfixed, but 100% wide) navbar
.navbar-static-top
z-index: $zindex-navbar
border-width: 0 0 1px
@media (min-width: $grid-float-breakpoint)
border-radius: 0
// Fix the top/bottom navbars when screen real estate supports it
.navbar-fixed-top,
.navbar-fixed-bottom
position: fixed
right: 0
left: 0
z-index: $zindex-navbar-fixed
// Undo the rounded corners
@media (min-width: $grid-float-breakpoint)
border-radius: 0
.navbar-fixed-top
top: 0
border-width: 0 0 1px
.navbar-fixed-bottom
bottom: 0
margin-bottom: 0
// override .navbar defaults
border-width: 1px 0 0
// Brand/project name
.navbar-brand
float: left
padding: $navbar-padding-vertical $navbar-padding-horizontal
font-size: $font-size-large
line-height: $line-height-computed
&:hover,
&:focus
text-decoration: none
@media (min-width: $grid-float-breakpoint)
.navbar > .container &
margin-left: -$navbar-padding-horizontal
// Navbar toggle
//
// Custom button for toggling the `.navbar-collapse`, powered by the collapse
// JavaScript plugin.
.navbar-toggle
position: relative
float: right
margin-right: $navbar-padding-horizontal
padding: 9px 10px
+navbar-vertical-align(34px)
background-color: transparent
border: 1px solid transparent
border-radius: $border-radius-base
// Bars
.icon-bar
display: block
width: 22px
height: 2px
border-radius: 1px
.icon-bar + .icon-bar
margin-top: 4px
@media (min-width: $grid-float-breakpoint)
display: none
// Navbar nav links
//
// Builds on top of the `.nav` components with it's own modifier class to make
// the nav the full height of the horizontal nav (above 768px).
.navbar-nav
margin: $navbar-padding-vertical / 2 (-$navbar-padding-horizontal)
> li > a
padding-top: 10px
padding-bottom: 10px
line-height: $line-height-computed
@media (max-width: $screen-xs-max)
// Dropdowns get custom display when collapsed
.open .dropdown-menu
position: static
float: none
width: auto
margin-top: 0
background-color: transparent
border: 0
box-shadow: none
> li > a,
.dropdown-header
padding: 5px 15px 5px 25px
> li > a
line-height: $line-height-computed
&:hover,
&:focus
background-image: none
// Uncollapse the nav
@media (min-width: $grid-float-breakpoint)
float: left
margin: 0
> li
float: left
> a
padding-top: ($navbar-height - $line-height-computed) / 2
padding-bottom: ($navbar-height - $line-height-computed) / 2
// Component alignment
//
// Repurpose the pull utilities as their own navbar utilities to avoid specificity
// issues with parents and chaining. Only do this when the navbar is uncollapsed
// though so that navbar contents properly stack and align in mobile.
@media (min-width: $grid-float-breakpoint)
.navbar-left
float: left !important
.navbar-right
float: right !important
// Navbar form
//
// Extension of the `.form-inline` with some extra flavor for optimum display in
// our navbars.
.navbar-form
margin-left: -$navbar-padding-horizontal
margin-right: -$navbar-padding-horizontal
padding: 10px $navbar-padding-horizontal
border-top: 1px solid transparent
border-bottom: 1px solid transparent
$shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1)
+box-shadow($shadow)
// Mixin behavior for optimum display
@extend .form-inline
.form-group
@media (max-width: $screen-xs-max)
margin-bottom: 5px
// Vertically center in expanded, horizontal navbar
+navbar-vertical-align($input-height-base)
// Undo 100% width for pull classes
@media (min-width: $grid-float-breakpoint)
width: auto
border: 0
margin-left: 0
margin-right: 0
padding-top: 0
padding-bottom: 0
+box-shadow(none)
// Dropdown menus
// Menu position and menu carets
.navbar-nav > li > .dropdown-menu
margin-top: 0
+border-top-radius(0)
// Menu position and menu caret support for dropups via extra dropup class
.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu
+border-bottom-radius(0)
// Right aligned menus need alt position
.navbar-nav.pull-right > li > .dropdown-menu,
.navbar-nav > li > .dropdown-menu.pull-right
left: auto
right: 0
// Buttons in navbars
//
// Vertically center a button within a navbar (when *not* in a form).
.navbar-btn
+navbar-vertical-align($input-height-base)
// Text in navbars
//
// Add a class to make any element properly align itself vertically within the navbars.
.navbar-text
float: left
+navbar-vertical-align($line-height-computed)
@media (min-width: $grid-float-breakpoint)
margin-left: $navbar-padding-horizontal
margin-right: $navbar-padding-horizontal
// Alternate navbars
// --------------------------------------------------
// Default navbar
.navbar-default
background-color: $navbar-default-bg
border-color: $navbar-default-border
.navbar-brand
color: $navbar-default-brand-color
&:hover,
&:focus
color: $navbar-default-brand-hover-color
background-color: $navbar-default-brand-hover-bg
.navbar-text
color: $navbar-default-color
.navbar-nav
> li > a
color: $navbar-default-link-color
&:hover,
&:focus
color: $navbar-default-link-hover-color
background-color: $navbar-default-link-hover-bg
> .active > a
&,
&:hover,
&:focus
color: $navbar-default-link-active-color
background-color: $navbar-default-link-active-bg
> .disabled > a
&,
&:hover,
&:focus
color: $navbar-default-link-disabled-color
background-color: $navbar-default-link-disabled-bg
.navbar-toggle
border-color: $navbar-default-toggle-border-color
&:hover,
&:focus
background-color: $navbar-default-toggle-hover-bg
.icon-bar
background-color: $navbar-default-toggle-icon-bar-bg
.navbar-collapse,
.navbar-form
border-color: $navbar-default-border
// Dropdown menu items and carets
.navbar-nav
// Caret should match text color on hover
> .dropdown > a:hover .caret,
> .dropdown > a:focus .caret
border-top-color: $navbar-default-link-hover-color
border-bottom-color: $navbar-default-link-hover-color
// Remove background color from open dropdown
> .open > a
&,
&:hover,
&:focus
background-color: $navbar-default-link-active-bg
color: $navbar-default-link-active-color
.caret
border-top-color: $navbar-default-link-active-color
border-bottom-color: $navbar-default-link-active-color
> .dropdown > a .caret
border-top-color: $navbar-default-link-color
border-bottom-color: $navbar-default-link-color
@media (max-width: $screen-xs-max)
// Dropdowns get custom display when collapsed
.open .dropdown-menu
> li > a
color: $navbar-default-link-color
&:hover,
&:focus
color: $navbar-default-link-hover-color
background-color: $navbar-default-link-hover-bg
> .active > a
&,
&:hover,
&:focus
color: $navbar-default-link-active-color
background-color: $navbar-default-link-active-bg
> .disabled > a
&,
&:hover,
&:focus
color: $navbar-default-link-disabled-color
background-color: $navbar-default-link-disabled-bg
// Links in navbars
//
// Add a class to ensure links outside the navbar nav are colored correctly.
.navbar-link
color: $navbar-default-link-color
&:hover
color: $navbar-default-link-hover-color
// Inverse navbar
.navbar-inverse
background-color: $navbar-inverse-bg
border-color: $navbar-inverse-border
.navbar-brand
color: $navbar-inverse-brand-color
&:hover,
&:focus
color: $navbar-inverse-brand-hover-color
background-color: $navbar-inverse-brand-hover-bg
.navbar-text
color: $navbar-inverse-color
.navbar-nav
> li > a
color: $navbar-inverse-link-color
&:hover,
&:focus
color: $navbar-inverse-link-hover-color
background-color: $navbar-inverse-link-hover-bg
> .active > a
&,
&:hover,
&:focus
color: $navbar-inverse-link-active-color
background-color: $navbar-inverse-link-active-bg
> .disabled > a
&,
&:hover,
&:focus
color: $navbar-inverse-link-disabled-color
background-color: $navbar-inverse-link-disabled-bg
// Darken the responsive nav toggle
.navbar-toggle
border-color: $navbar-inverse-toggle-border-color
&:hover,
&:focus
background-color: $navbar-inverse-toggle-hover-bg
.icon-bar
background-color: $navbar-inverse-toggle-icon-bar-bg
.navbar-collapse,
.navbar-form
border-color: darken($navbar-inverse-bg, 7%)
// Dropdowns
.navbar-nav
> .open > a
&,
&:hover,
&:focus
background-color: $navbar-inverse-link-active-bg
color: $navbar-inverse-link-active-color
> .dropdown > a:hover .caret
border-top-color: $navbar-inverse-link-hover-color
border-bottom-color: $navbar-inverse-link-hover-color
> .dropdown > a .caret
border-top-color: $navbar-inverse-link-color
border-bottom-color: $navbar-inverse-link-color
> .open > a
&,
&:hover,
&:focus
.caret
border-top-color: $navbar-inverse-link-active-color
border-bottom-color: $navbar-inverse-link-active-color
@media (max-width: $screen-xs-max)
// Dropdowns get custom display
.open .dropdown-menu
> .dropdown-header
border-color: $navbar-inverse-border
> li > a
color: $navbar-inverse-link-color
&:hover,
&:focus
color: $navbar-inverse-link-hover-color
background-color: $navbar-inverse-link-hover-bg
> .active > a
&,
&:hover,
&:focus
color: $navbar-inverse-link-active-color
background-color: $navbar-inverse-link-active-bg
> .disabled > a
&,
&:hover,
&:focus
color: $navbar-inverse-link-disabled-color
background-color: $navbar-inverse-link-disabled-bg
.navbar-link
color: $navbar-inverse-link-color
&:hover
color: $navbar-inverse-link-hover-color

View File

@@ -1,192 +0,0 @@
//
// Navs
// --------------------------------------------------
// Base class
// --------------------------------------------------
.nav
margin-bottom: 0
padding-left: 0
// Override default ul/ol
list-style: none
+clearfix
> li
position: relative
display: block
> a
position: relative
display: block
padding: $nav-link-padding
&:hover,
&:focus
text-decoration: none
background-color: $nav-link-hover-bg
// Disabled state sets text to gray and nukes hover/tab effects
&.disabled > a
color: $nav-disabled-link-color
&:hover,
&:focus
color: $nav-disabled-link-hover-color
text-decoration: none
background-color: transparent
cursor: not-allowed
// Open dropdowns
.open > a
&,
&:hover,
&:focus
background-color: $nav-link-hover-bg
border-color: $link-color
.caret
border-top-color: $link-hover-color
border-bottom-color: $link-hover-color
// Nav dividers (deprecated with v3.0.1)
//
// This should have been removed in v3 with the dropping of `.nav-list`, but
// we missed it. We don't currently support this anywhere, but in the interest
// of maintaining backward compatibility in case you use it, it's deprecated.
.nav-divider
+nav-divider
// Prevent IE8 from misplacing imgs
//
// See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
> li > a > img
max-width: none
// Tabs
// -------------------------
// Give the tabs something to sit on
.nav-tabs
border-bottom: 1px solid $nav-tabs-border-color
> li
float: left
// Make the list-items overlay the bottom border
margin-bottom: -1px
// Actual tabs (as links)
> a
margin-right: 2px
line-height: $line-height-base
border: 1px solid transparent
border-radius: $border-radius-base $border-radius-base 0 0
&:hover
border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color
// Active state, and it's :hover to override normal :hover
&.active > a
&,
&:hover,
&:focus
color: $nav-tabs-active-link-hover-color
background-color: $nav-tabs-active-link-hover-bg
border: 1px solid $nav-tabs-active-link-hover-border-color
border-bottom-color: transparent
cursor: default
// pulling this in mainly for less shorthand
&.nav-justified
@extend .nav-justified
@extend .nav-tabs-justified
// Pills
// -------------------------
.nav-pills
> li
float: left
// Links rendered as pills
> a
border-radius: $nav-pills-border-radius
+ li
margin-left: 2px
// Active state
&.active > a
&,
&:hover,
&:focus
color: $nav-pills-active-link-hover-color
background-color: $nav-pills-active-link-hover-bg
.caret
border-top-color: $nav-pills-active-link-hover-color
border-bottom-color: $nav-pills-active-link-hover-color
// Stacked pills
.nav-stacked
> li
float: none
+ li
margin-top: 2px
margin-left: 0
// no need for this gap between nav items
// Nav variations
// --------------------------------------------------
// Justified nav links
// -------------------------
.nav-justified
width: 100%
> li
float: none
> a
text-align: center
margin-bottom: 5px
> .dropdown .dropdown-menu
top: auto
left: auto
@media (min-width: $screen-sm-min)
> li
display: table-cell
width: 1%
> a
margin-bottom: 0
// Move borders to anchors instead of bottom of list
//
// Mixin for adding on top the shared `.nav-justified` styles for our tabs
.nav-tabs-justified
border-bottom: 0
> li > a
// Override margin from .nav-tabs
margin-right: 0
border-radius: $border-radius-base
> .active > a,
> .active > a:hover,
> .active > a:focus
border: 1px solid $nav-tabs-justified-link-border-color
@media (min-width: $screen-sm-min)
> li > a
border-bottom: 1px solid $nav-tabs-justified-link-border-color
border-radius: $border-radius-base $border-radius-base 0 0
> .active > a,
> .active > a:hover,
> .active > a:focus
border-bottom-color: $nav-tabs-justified-active-link-border-color
// Tabbable tabs
// -------------------------
// Hide tabbable panes to start, show them when `.active`
.tab-content
> .tab-pane
display: none
> .active
display: block
// Dropdowns
// -------------------------
// Make dropdown carets use link color in navs
.nav .caret
border-top-color: $link-color
border-bottom-color: $link-color
.nav a:hover .caret
border-top-color: $link-hover-color
border-bottom-color: $link-hover-color
// Specific dropdowns
.nav-tabs .dropdown-menu
// make dropdown border overlap tab border
margin-top: -1px
// Remove the top rounded corners here since there is a hard edge above the menu
+border-top-radius(0)

View File

@@ -1,384 +0,0 @@
/*! normalize.css v2.1.3 | MIT License | git.io/normalize
// ==========================================================================
// HTML5 display definitions
// ==========================================================================
//
// Correct `block` display not defined in IE 8/9.
//
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
nav,
section,
summary
display: block
//
// Correct `inline-block` display not defined in IE 8/9.
//
audio,
canvas,
video
display: inline-block
//
// Prevent modern browsers from displaying `audio` without controls.
// Remove excess height in iOS 5 devices.
//
audio:not([controls])
display: none
height: 0
//
// Address `[hidden]` styling not present in IE 8/9.
// Hide the `template` element in IE, Safari, and Firefox < 22.
//
[hidden],
template
display: none
// ==========================================================================
// Base
// ==========================================================================
//
// 1. Set default font family to sans-serif.
// 2. Prevent iOS text size adjust after orientation change, without disabling
// user zoom.
//
html
font-family: sans-serif
// 1
-ms-text-size-adjust: 100%
// 2
-webkit-text-size-adjust: 100%
// 2
//
// Remove default margin.
//
body
margin: 0
// ==========================================================================
// Links
// ==========================================================================
//
// Remove the gray background color from active links in IE 10.
//
a
background: transparent
//
// Address `outline` inconsistency between Chrome and other browsers.
//
a:focus
outline: thin dotted
//
// Improve readability when focused and also mouse hovered in all browsers.
//
a:active,
a:hover
outline: 0
// ==========================================================================
// Typography
// ==========================================================================
//
// Address variable `h1` font-size and margin within `section` and `article`
// contexts in Firefox 4+, Safari 5, and Chrome.
//
h1
font-size: 2em
margin: 0.67em 0
//
// Address styling not present in IE 8/9, Safari 5, and Chrome.
//
abbr[title]
border-bottom: 1px dotted
//
// Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
//
b,
strong
font-weight: bold
//
// Address styling not present in Safari 5 and Chrome.
//
dfn
font-style: italic
//
// Address differences between Firefox and other browsers.
//
hr
-moz-box-sizing: content-box
box-sizing: content-box
height: 0
//
// Address styling not present in IE 8/9.
//
mark
background: #ff0
color: #000
//
// Correct font family set oddly in Safari 5 and Chrome.
//
code,
kbd,
pre,
samp
font-family: monospace, serif
font-size: 1em
//
// Improve readability of pre-formatted text in all browsers.
//
pre
white-space: pre-wrap
//
// Set consistent quote types.
//
q
quotes: "\201C" "\201D" "\2018" "\2019"
//
// Address inconsistent and variable font size in all browsers.
//
small
font-size: 80%
//
// Prevent `sub` and `sup` affecting `line-height` in all browsers.
//
sub,
sup
font-size: 75%
line-height: 0
position: relative
vertical-align: baseline
sup
top: -0.5em
sub
bottom: -0.25em
// ==========================================================================
// Embedded content
// ==========================================================================
//
// Remove border when inside `a` element in IE 8/9.
//
img
border: 0
//
// Correct overflow displayed oddly in IE 9.
//
svg:not(:root)
overflow: hidden
// ==========================================================================
// Figures
// ==========================================================================
//
// Address margin not present in IE 8/9 and Safari 5.
//
figure
margin: 0
// ==========================================================================
// Forms
// ==========================================================================
//
// Define consistent border, margin, and padding.
//
fieldset
border: 1px solid #c0c0c0
margin: 0 2px
padding: 0.35em 0.625em 0.75em
//
// 1. Correct `color` not being inherited in IE 8/9.
// 2. Remove padding so people aren't caught out if they zero out fieldsets.
//
legend
border: 0
// 1
padding: 0
// 2
//
// 1. Correct font family not being inherited in all browsers.
// 2. Correct font size not being inherited in all browsers.
// 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
//
button,
input,
select,
textarea
font-family: inherit
// 1
font-size: 100%
// 2
margin: 0
// 3
//
// Address Firefox 4+ setting `line-height` on `input` using `!important` in
// the UA stylesheet.
//
button,
input
line-height: normal
//
// Address inconsistent `text-transform` inheritance for `button` and `select`.
// All other form control elements do not inherit `text-transform` values.
// Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.
// Correct `select` style inheritance in Firefox 4+ and Opera.
//
button,
select
text-transform: none
//
// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
// and `video` controls.
// 2. Correct inability to style clickable `input` types in iOS.
// 3. Improve usability and consistency of cursor style between image-type
// `input` and others.
//
button,
html input[type="button"],
input[type="reset"],
input[type="submit"]
-webkit-appearance: button
// 2
cursor: pointer
// 3
//
// Re-set default cursor for disabled elements.
//
button[disabled],
html input[disabled]
cursor: default
//
// 1. Address box sizing set to `content-box` in IE 8/9/10.
// 2. Remove excess padding in IE 8/9/10.
//
input[type="checkbox"],
input[type="radio"]
box-sizing: border-box
// 1
padding: 0
// 2
//
// 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
// 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
// (include `-moz` to future-proof).
//
input[type="search"]
-webkit-appearance: textfield
// 1
-moz-box-sizing: content-box
-webkit-box-sizing: content-box
// 2
box-sizing: content-box
//
// Remove inner padding and search cancel button in Safari 5 and Chrome
// on OS X.
//
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration
-webkit-appearance: none
//
// Remove inner padding and border in Firefox 4+.
//
button::-moz-focus-inner,
input::-moz-focus-inner
border: 0
padding: 0
//
// 1. Remove default vertical scrollbar in IE 8/9.
// 2. Improve readability and alignment in all browsers.
//
textarea
overflow: auto
// 1
vertical-align: top
// 2
// ==========================================================================
// Tables
// ==========================================================================
//
// Remove most spacing between table cells.
//
table
border-collapse: collapse
border-spacing: 0

View File

@@ -1,39 +0,0 @@
//
// Pager pagination
// --------------------------------------------------
.pager
padding-left: 0
margin: $line-height-computed 0
list-style: none
text-align: center
+clearfix
li
display: inline
> a,
> span
display: inline-block
padding: 5px 14px
background-color: $pagination-bg
border: 1px solid $pagination-border
border-radius: $pager-border-radius
> a:hover,
> a:focus
text-decoration: none
background-color: $pagination-hover-bg
.next
> a,
> span
float: right
.previous
> a,
> span
float: left
.disabled
> a,
> a:hover,
> a:focus,
> span
color: $pager-disabled-color
background-color: $pagination-bg
cursor: not-allowed

View File

@@ -1,68 +0,0 @@
//
// Pagination (multiple pages)
// --------------------------------------------------
.pagination
display: inline-block
padding-left: 0
margin: $line-height-computed 0
border-radius: $border-radius-base
> li
display: inline
// Remove list-style and block-level defaults
> a,
> span
position: relative
float: left
// Collapse white-space
padding: $padding-base-vertical $padding-base-horizontal
line-height: $line-height-base
text-decoration: none
background-color: $pagination-bg
border: 1px solid $pagination-border
margin-left: -1px
&:first-child
> a,
> span
margin-left: 0
+border-left-radius($border-radius-base)
&:last-child
> a,
> span
+border-right-radius($border-radius-base)
> li > a,
> li > span
&:hover,
&:focus
background-color: $pagination-hover-bg
> .active > a,
> .active > span
&,
&:hover,
&:focus
z-index: 2
color: $pagination-active-color
background-color: $pagination-active-bg
border-color: $pagination-active-bg
cursor: default
> .disabled
> span,
> span:hover,
> span:focus,
> a,
> a:hover,
> a:focus
color: $pagination-disabled-color
background-color: $pagination-bg
border-color: $pagination-border
cursor: not-allowed
// Sizing
// --------------------------------------------------
// Large
.pagination-lg
+pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $border-radius-large)
// Small
.pagination-sm
+pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $border-radius-small)

View File

@@ -1,132 +0,0 @@
//
// Panels
// --------------------------------------------------
// Base class
.panel
margin-bottom: $line-height-computed
background-color: $panel-bg
border: 1px solid transparent
border-radius: $panel-border-radius
+box-shadow(0 1px 1px rgba(0, 0, 0, 0.05))
// Panel contents
.panel-body
padding: 15px
+clearfix
// List groups in panels
//
// By default, space out list group content from panel headings to account for
// any kind of custom content between the two.
.panel
> .list-group
margin-bottom: 0
.list-group-item
border-width: 1px 0
// Remove border radius for top one
&:first-child
+border-top-radius(0)
// But keep it for the last one
&:last-child
border-bottom: 0
// Collapse space between when there's no additional content.
.panel-heading + .list-group
.list-group-item:first-child
border-top-width: 0
// Tables in panels
//
// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and
// watch it go full width.
.panel
> .table,
> .table-responsive
margin-bottom: 0
> .panel-body + .table,
> .panel-body + .table-responsive
border-top: 1px solid $table-border-color
> .table-bordered,
> .table-responsive > .table-bordered
border: 0
> thead,
> tbody,
> tfoot
> tr
> th:first-child,
> td:first-child
border-left: 0
> th:last-child,
> td:last-child
border-right: 0
&:last-child > th,
&:last-child > td
border-bottom: 0
// Optional heading
.panel-heading
padding: 10px 15px
border-bottom: 1px solid transparent
+border-top-radius($panel-border-radius - 1)
> .dropdown .dropdown-toggle
color: inherit
// Within heading, strip any `h*` tag of it's default margins for spacing.
.panel-title
margin-top: 0
margin-bottom: 0
font-size: ceil($font-size-base * 1.125)
> a
color: inherit
// Optional footer (stays gray in every modifier class)
.panel-footer
padding: 10px 15px
background-color: $panel-footer-bg
border-top: 1px solid $panel-inner-border
+border-bottom-radius($panel-border-radius - 1)
// Collapsable panels (aka, accordion)
//
// Wrap a series of panels in `.panel-group` to turn them into an accordion with
// the help of our collapse JavaScript plugin.
.panel-group
// Tighten up margin so it's only between panels
.panel
margin-bottom: 0
border-radius: $panel-border-radius
overflow: hidden
// crop contents when collapsed
+ .panel
margin-top: 5px
.panel-heading
border-bottom: 0
+ .panel-collapse .panel-body
border-top: 1px solid $panel-inner-border
.panel-footer
border-top: 0
+ .panel-collapse .panel-body
border-bottom: 1px solid $panel-inner-border
// Contextual variations
.panel-default
+panel-variant($panel-default-border, $panel-default-text, $panel-default-heading-bg, $panel-default-border)
.panel-primary
+panel-variant($panel-primary-border, $panel-primary-text, $panel-primary-heading-bg, $panel-primary-border)
.panel-success
+panel-variant($panel-success-border, $panel-success-text, $panel-success-heading-bg, $panel-success-border)
.panel-warning
+panel-variant($panel-warning-border, $panel-warning-text, $panel-warning-heading-bg, $panel-warning-border)
.panel-danger
+panel-variant($panel-danger-border, $panel-danger-text, $panel-danger-heading-bg, $panel-danger-border)
.panel-info
+panel-variant($panel-info-border, $panel-info-text, $panel-info-heading-bg, $panel-info-border)

View File

@@ -1,124 +0,0 @@
//
// Popovers
// --------------------------------------------------
.popover
position: absolute
top: 0
left: 0
z-index: $zindex-popover
display: none
max-width: $popover-max-width
padding: 1px
text-align: left
// Reset given new insertion method
background-color: $popover-bg
background-clip: padding-box
border: 1px solid $popover-fallback-border-color
border: 1px solid $popover-border-color
border-radius: $border-radius-large
+box-shadow(0 5px 10px rgba(0, 0, 0, 0.2))
// Overrides for proper insertion
white-space: normal
// Offset the popover to account for the popover arrow
&.top
margin-top: -10px
&.right
margin-left: 10px
&.bottom
margin-top: 10px
&.left
margin-left: -10px
.popover-title
margin: 0
// reset heading margin
padding: 8px 14px
font-size: $font-size-base
font-weight: normal
line-height: 18px
background-color: $popover-title-bg
border-bottom: 1px solid darken($popover-title-bg, 5%)
border-radius: 5px 5px 0 0
.popover-content
padding: 9px 14px
// Arrows
//
// .arrow is outer, .arrow:after is inner
.popover .arrow
&,
&:after
position: absolute
display: block
width: 0
height: 0
border-color: transparent
border-style: solid
.popover .arrow
border-width: $popover-arrow-outer-width
.popover .arrow:after
border-width: $popover-arrow-width
content: ""
.popover
&.top .arrow
left: 50%
margin-left: -$popover-arrow-outer-width
border-bottom-width: 0
border-top-color: $popover-arrow-outer-fallback-color
// IE8 fallback
border-top-color: $popover-arrow-outer-color
bottom: -$popover-arrow-outer-width
&:after
content: " "
bottom: 1px
margin-left: -$popover-arrow-width
border-bottom-width: 0
border-top-color: $popover-arrow-color
&.right .arrow
top: 50%
left: -$popover-arrow-outer-width
margin-top: -$popover-arrow-outer-width
border-left-width: 0
border-right-color: $popover-arrow-outer-fallback-color
// IE8 fallback
border-right-color: $popover-arrow-outer-color
&:after
content: " "
left: 1px
bottom: -$popover-arrow-width
border-left-width: 0
border-right-color: $popover-arrow-color
&.bottom .arrow
left: 50%
margin-left: -$popover-arrow-outer-width
border-top-width: 0
border-bottom-color: $popover-arrow-outer-fallback-color
// IE8 fallback
border-bottom-color: $popover-arrow-outer-color
top: -$popover-arrow-outer-width
&:after
content: " "
top: 1px
margin-left: -$popover-arrow-width
border-top-width: 0
border-bottom-color: $popover-arrow-color
&.left .arrow
top: 50%
right: -$popover-arrow-outer-width
margin-top: -$popover-arrow-outer-width
border-right-width: 0
border-left-color: $popover-arrow-outer-fallback-color
// IE8 fallback
border-left-color: $popover-arrow-outer-color
&:after
content: " "
right: 1px
border-right-width: 0
border-left-color: $popover-arrow-color
bottom: -$popover-arrow-width

View File

@@ -1,69 +0,0 @@
//
// Basic print styles
// --------------------------------------------------
// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css
@media print
*
text-shadow: none !important
color: #000 !important
// Black prints faster: h5bp.com/s
background: transparent !important
box-shadow: none !important
a,
a:visited
text-decoration: underline
a[href]:after
content: " (" attr(href) ")"
abbr[title]:after
content: " (" attr(title) ")"
// Don't show links for images, or javascript/internal links
a[href^="javascript:"]:after,
a[href^="#"]:after
content: ""
pre,
blockquote
border: 1px solid #999
page-break-inside: avoid
thead
display: table-header-group
// h5bp.com/t
tr,
img
page-break-inside: avoid
img
max-width: 100% !important
@page
margin: 2cm .5cm
p,
h2,
h3
orphans: 3
widows: 3
h2,
h3
page-break-after: avoid
// Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245
// Once fixed, we can just straight up remove this.
select
background: #fff !important
// Bootstrap components
.navbar
display: none
.table
td,
th
background-color: #fff !important
.btn,
.dropup > .btn
> .caret
border-top-color: #000 !important
.label
border: 1px solid #000
.table
border-collapse: collapse !important
.table-bordered
th,
td
border: 1px solid #ddd !important

View File

@@ -1,87 +0,0 @@
//
// Progress bars
// --------------------------------------------------
// Bar animations
// -------------------------
// WebKit
@-webkit-keyframes progress-bar-stripes
from
background-position: 40px 0
to
background-position: 0 0
// Firefox
@-moz-keyframes progress-bar-stripes
from
background-position: 40px 0
to
background-position: 0 0
// Opera
@-o-keyframes progress-bar-stripes
from
background-position: 0 0
to
background-position: 40px 0
// Spec and IE10+
@keyframes progress-bar-stripes
from
background-position: 40px 0
to
background-position: 0 0
// Bar itself
// -------------------------
// Outer container
.progress
overflow: hidden
height: $line-height-computed
margin-bottom: $line-height-computed
background-color: $progress-bg
border-radius: $border-radius-base
+box-shadow(inset 0 1px 2px rgba(0, 0, 0, 0.1))
// Bar of progress
.progress-bar
float: left
width: 0%
height: 100%
font-size: $font-size-small
line-height: $line-height-computed
color: $progress-bar-color
text-align: center
background-color: $progress-bar-bg
+box-shadow(inset 0 -1px 0 rgba(0, 0, 0, 0.15))
+transition(width 0.6s ease)
// Striped bars
.progress-striped .progress-bar
+gradient-striped
background-size: 40px 40px
// Call animation for the active one
.progress.active .progress-bar
+animation(progress-bar-stripes 2s linear infinite)
// Variations
// -------------------------
.progress-bar-success
+progress-bar-variant($progress-bar-success-bg)
.progress-bar-info
+progress-bar-variant($progress-bar-info-bg)
.progress-bar-warning
+progress-bar-variant($progress-bar-warning-bg)
.progress-bar-danger
+progress-bar-variant($progress-bar-danger-bg)

View File

@@ -1,143 +0,0 @@
//
// Responsive: Utility classes
// --------------------------------------------------
// IE10 in Windows (Phone) 8
//
// Support for responsive views via media queries is kind of borked in IE10, for
// Surface/desktop in split view and for Windows Phone 8. This particular fix
// must be accompanied by a snippet of JavaScript to sniff the user agent and
// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at
// our Getting Started page for more information on this bug.
//
// For more information, see the following:
//
// Issue: https://github.com/twbs/bootstrap/issues/10497
// Docs: http://getbootstrap.com/getting-started/#browsers
// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
@-ms-viewport
width: device-width
// Visibility utilities
+responsive-invisibility(".visible-xs")
@media (max-width: $screen-xs-max)
+responsive-visibility(".visible-xs")
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max)
+responsive-visibility(".visible-xs.visible-sm")
@media (min-width: $screen-md-min) and (max-width: $screen-md-max)
+responsive-visibility(".visible-xs.visible-md")
@media (min-width: $screen-lg-min)
+responsive-visibility(".visible-xs.visible-lg")
+responsive-invisibility(".visible-sm")
@media (max-width: $screen-xs-max)
+responsive-visibility(".visible-sm.visible-xs")
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max)
+responsive-visibility(".visible-sm")
@media (min-width: $screen-md-min) and (max-width: $screen-md-max)
+responsive-visibility(".visible-sm.visible-md")
@media (min-width: $screen-lg-min)
+responsive-visibility(".visible-sm.visible-lg")
+responsive-invisibility(".visible-md")
@media (max-width: $screen-xs-max)
+responsive-visibility(".visible-md.visible-xs")
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max)
+responsive-visibility(".visible-md.visible-sm")
@media (min-width: $screen-md-min) and (max-width: $screen-md-max)
+responsive-visibility(".visible-md")
@media (min-width: $screen-lg-min)
+responsive-visibility(".visible-md.visible-lg")
+responsive-invisibility(".visible-lg")
@media (max-width: $screen-xs-max)
+responsive-visibility(".visible-lg.visible-xs")
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max)
+responsive-visibility(".visible-lg.visible-sm")
@media (min-width: $screen-md-min) and (max-width: $screen-md-max)
+responsive-visibility(".visible-lg.visible-md")
@media (min-width: $screen-lg-min)
+responsive-visibility(".visible-lg")
+responsive-visibility(".hidden-xs")
@media (max-width: $screen-xs-max)
+responsive-invisibility(".hidden-xs")
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max)
+responsive-invisibility(".hidden-xs.hidden-sm")
@media (min-width: $screen-md-min) and (max-width: $screen-md-max)
+responsive-invisibility(".hidden-xs.hidden-md")
@media (min-width: $screen-lg-min)
+responsive-invisibility(".hidden-xs.hidden-lg")
+responsive-visibility(".hidden-sm")
@media (max-width: $screen-xs-max)
+responsive-invisibility(".hidden-sm.hidden-xs")
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max)
+responsive-invisibility(".hidden-sm")
@media (min-width: $screen-md-min) and (max-width: $screen-md-max)
+responsive-invisibility(".hidden-sm.hidden-md")
@media (min-width: $screen-lg-min)
+responsive-invisibility(".hidden-sm.hidden-lg")
+responsive-visibility(".hidden-md")
@media (max-width: $screen-xs-max)
+responsive-invisibility(".hidden-md.hidden-xs")
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max)
+responsive-invisibility(".hidden-md.hidden-sm")
@media (min-width: $screen-md-min) and (max-width: $screen-md-max)
+responsive-invisibility(".hidden-md")
@media (min-width: $screen-lg-min)
+responsive-invisibility(".hidden-md.hidden-lg")
+responsive-visibility(".hidden-lg")
@media (max-width: $screen-xs-max)
+responsive-invisibility(".hidden-lg.hidden-xs")
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max)
+responsive-invisibility(".hidden-lg.hidden-sm")
@media (min-width: $screen-md-min) and (max-width: $screen-md-max)
+responsive-invisibility(".hidden-lg.hidden-md")
@media (min-width: $screen-lg-min)
+responsive-invisibility(".hidden-lg")
// Print utilities
+responsive-invisibility(".visible-print")
@media print
+responsive-visibility(".visible-print")
+responsive-invisibility(".hidden-print")

View File

@@ -1,98 +0,0 @@
//
// Scaffolding
// --------------------------------------------------
// Reset the box-sizing
*,
*:before,
*:after
+box-sizing(border-box)
// Body reset
html
font-size: 62.5%
-webkit-tap-highlight-color: rgba(0, 0, 0, 0)
body
font-family: $font-family-base
font-size: $font-size-base
line-height: $line-height-base
color: $text-color
background-color: $body-bg
// Reset fonts for relevant elements
input,
button,
select,
textarea
font-family: inherit
font-size: inherit
line-height: inherit
// Links
a
color: $link-color
text-decoration: none
&:hover,
&:focus
color: $link-hover-color
text-decoration: underline
&:focus
+tab-focus
// Images
img
vertical-align: middle
// Responsive images (ensure images don't scale beyond their parents)
.img-responsive
+img-responsive
// Rounded corners
.img-rounded
border-radius: $border-radius-large
// Image thumbnails
//
// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.
.img-thumbnail
padding: $thumbnail-padding
line-height: $line-height-base
background-color: $thumbnail-bg
border: 1px solid $thumbnail-border
border-radius: $thumbnail-border-radius
+transition(all 0.2s ease-in-out)
// Keep them at most 100% wide
+img-responsive(inline-block)
// Perfect circle
.img-circle
border-radius: 50%
// set radius in percents
// Horizontal rules
hr
margin-top: $line-height-computed
margin-bottom: $line-height-computed
border: 0
border-top: 1px solid $hr-border
// Only display content to screen readers
//
// See: http://a11yproject.com/posts/how-to-hide-content/
.sr-only
position: absolute
width: 1px
height: 1px
margin: -1px
padding: 0
overflow: hidden
clip: rect(0, 0, 0, 0)
border: 0

View File

@@ -1,182 +0,0 @@
//
// Tables
// --------------------------------------------------
table
max-width: 100%
background-color: $table-bg
th
text-align: left
// Baseline styles
.table
width: 100%
margin-bottom: $line-height-computed
// Cells
> thead,
> tbody,
> tfoot
> tr
> th,
> td
padding: $table-cell-padding
line-height: $line-height-base
vertical-align: top
border-top: 1px solid $table-border-color
// Bottom align for column headings
> thead > tr > th
vertical-align: bottom
border-bottom: 2px solid $table-border-color
// Remove top border from thead by default
> caption + thead,
> colgroup + thead,
> thead:first-child
> tr:first-child
> th,
> td
border-top: 0
// Account for multiple tbody instances
> tbody + tbody
border-top: 2px solid $table-border-color
// Nesting
.table
background-color: $body-bg
// Condensed table w/ half padding
.table-condensed
> thead,
> tbody,
> tfoot
> tr
> th,
> td
padding: $table-condensed-cell-padding
// Bordered version
//
// Add borders all around the table and between all the columns.
.table-bordered
border: 1px solid $table-border-color
> thead,
> tbody,
> tfoot
> tr
> th,
> td
border: 1px solid $table-border-color
> thead > tr
> th,
> td
border-bottom-width: 2px
// Zebra-striping
//
// Default zebra-stripe styles (alternating gray and transparent backgrounds)
.table-striped
> tbody > tr:nth-child(odd)
> td,
> th
background-color: $table-bg-accent
// Hover effect
//
// Placed here since it has to come after the potential zebra striping
.table-hover
> tbody > tr:hover
> td,
> th
background-color: $table-bg-hover
// Table cell sizing
//
// Reset default table behavior
table col[class*="col-"]
float: none
display: table-column
table
td,
th
&[class*="col-"]
float: none
display: table-cell
// Table backgrounds
//
// Exact selectors below required to override `.table-striped` and prevent
// inheritance to nested tables.
.table
> thead,
> tbody,
> tfoot
> tr
> td.active,
> th.active,
&.active > td,
&.active > th
background-color: $table-bg-active
// Generate the contextual variants
+table-row-variant("success", $state-success-bg, $state-success-border)
+table-row-variant("danger", $state-danger-bg, $state-danger-border)
+table-row-variant("warning", $state-warning-bg, $state-warning-border)
// Responsive tables
//
// Wrap your tables in `.table-responsive` and we'll make them mobile friendly
// by enabling horizontal scrolling. Only applies <768px. Everything above that
// will display normally.
@media (max-width: $screen-xs-max)
.table-responsive
width: 100%
margin-bottom: $line-height-computed * 0.75
overflow-y: hidden
overflow-x: scroll
-ms-overflow-style: -ms-autohiding-scrollbar
border: 1px solid $table-border-color
-webkit-overflow-scrolling: touch
// Tighten up spacing
> .table
margin-bottom: 0
// Ensure the content doesn't wrap
> thead,
> tbody,
> tfoot
> tr
> th,
> td
white-space: nowrap
// Special overrides for the bordered tables
> .table-bordered
border: 0
// Nuke the appropriate borders so that the parent can handle them
> thead,
> tbody,
> tfoot
> tr
> th:first-child,
> td:first-child
border-left: 0
> th:last-child,
> td:last-child
border-right: 0
// Only nuke the last row's bottom-border in `tbody` and `tfoot` since
// chances are there will be only one `tr` in a `thead` and that would
// remove the border altogether.
> tbody,
> tfoot
> tr:last-child
> th,
> td
border-bottom: 0

View File

@@ -1,244 +0,0 @@
//
// Load core variables and mixins
// --------------------------------------------------
@import variables
@import mixins
//
// Buttons
// --------------------------------------------------
// Common styles
.btn-default,
.btn-primary,
.btn-success,
.btn-info,
.btn-warning,
.btn-danger
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2)
$shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075)
+box-shadow($shadow)
// Reset the shadow
&:active,
&.active
+box-shadow(inset 0 3px 5px rgba(0, 0, 0, 0.125))
// Mixin for generating new styles
=btn-styles($btn-color: #555555)
+gradient-vertical($start_color: $btn-color, $end_color: darken($btn-color, 12%))
+reset-filter
// Disable gradients for IE9 because filter bleeds through rounded corners
background-repeat: repeat-x
border-color: darken($btn-color, 14%)
&:hover,
&:focus
background-color: darken($btn-color, 12%)
background-position: 0 -15px
&:active,
&.active
background-color: darken($btn-color, 12%)
border-color: darken($btn-color, 14%)
// Common styles
.btn
// Remove the gradient for the pressed/active state
&:active,
&.active
background-image: none
// Apply the mixin to the buttons
.btn-default
+btn-styles($btn-default-bg)
text-shadow: 0 1px 0 #fff
border-color: #ccc
.btn-primary
+btn-styles($btn-primary-bg)
.btn-success
+btn-styles($btn-success-bg)
.btn-warning
+btn-styles($btn-warning-bg)
.btn-danger
+btn-styles($btn-danger-bg)
.btn-info
+btn-styles($btn-info-bg)
//
// Images
// --------------------------------------------------
.thumbnail,
.img-thumbnail
+box-shadow(0 1px 2px rgba(0, 0, 0, 0.075))
//
// Dropdowns
// --------------------------------------------------
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus
+gradient-vertical($start_color: $dropdown-link-hover-bg, $end_color: darken($dropdown-link-hover-bg, 5%))
background-color: darken($dropdown-link-hover-bg, 5%)
.dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus
+gradient-vertical($start_color: $dropdown-link-active-bg, $end_color: darken($dropdown-link-active-bg, 5%))
background-color: darken($dropdown-link-active-bg, 5%)
//
// Navbar
// --------------------------------------------------
// Default navbar
.navbar-default
+gradient-vertical($start_color: lighten($navbar-default-bg, 10%), $end_color: $navbar-default-bg)
+reset-filter
// Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
border-radius: $navbar-border-radius
$shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075)
+box-shadow($shadow)
.navbar-nav > .active > a
+gradient-vertical($start_color: darken($navbar-default-bg, 5%), $end_color: darken($navbar-default-bg, 2%))
+box-shadow(inset 0 3px 9px rgba(0, 0, 0, 0.075))
.navbar-brand,
.navbar-nav > li > a
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25)
// Inverted navbar
.navbar-inverse
+gradient-vertical($start_color: lighten($navbar-inverse-bg, 10%), $end_color: $navbar-inverse-bg)
+reset-filter
// Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
.navbar-nav > .active > a
+gradient-vertical($start_color: $navbar-inverse-bg, $end_color: lighten($navbar-inverse-bg, 2.5%))
+box-shadow(inset 0 3px 9px rgba(0, 0, 0, 0.25))
.navbar-brand,
.navbar-nav > li > a
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25)
// Undo rounded corners in static and fixed navbars
.navbar-static-top,
.navbar-fixed-top,
.navbar-fixed-bottom
border-radius: 0
//
// Alerts
// --------------------------------------------------
// Common styles
.alert
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2)
$shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05)
+box-shadow($shadow)
// Mixin for generating new styles
=alert-styles($color)
+gradient-vertical($start_color: $color, $end_color: darken($color, 7.5%))
border-color: darken($color, 15%)
// Apply the mixin to the alerts
.alert-success
+alert-styles($alert-success-bg)
.alert-info
+alert-styles($alert-info-bg)
.alert-warning
+alert-styles($alert-warning-bg)
.alert-danger
+alert-styles($alert-danger-bg)
//
// Progress bars
// --------------------------------------------------
// Give the progress background some depth
.progress
+gradient-vertical($start_color: darken($progress-bg, 4%), $end_color: $progress-bg)
// Mixin for generating new styles
=progress-bar-styles($color)
+gradient-vertical($start_color: $color, $end_color: darken($color, 10%))
// Apply the mixin to the progress bars
.progress-bar
+progress-bar-styles($progress-bar-bg)
.progress-bar-success
+progress-bar-styles($progress-bar-success-bg)
.progress-bar-info
+progress-bar-styles($progress-bar-info-bg)
.progress-bar-warning
+progress-bar-styles($progress-bar-warning-bg)
.progress-bar-danger
+progress-bar-styles($progress-bar-danger-bg)
//
// List groups
// --------------------------------------------------
.list-group
border-radius: $border-radius-base
+box-shadow(0 1px 2px rgba(0, 0, 0, 0.075))
.list-group-item.active,
.list-group-item.active:hover,
.list-group-item.active:focus
text-shadow: 0 -1px 0 darken($list-group-active-bg, 10%)
+gradient-vertical($start_color: $list-group-active-bg, $end_color: darken($list-group-active-bg, 7.5%))
border-color: darken($list-group-active-border, 7.5%)
//
// Panels
// --------------------------------------------------
// Common styles
.panel
+box-shadow(0 1px 2px rgba(0, 0, 0, 0.05))
// Mixin for generating new styles
=panel-heading-styles($color)
+gradient-vertical($start_color: $color, $end_color: darken($color, 5%))
// Apply the mixin to the panel headings only
.panel-default > .panel-heading
+panel-heading-styles($panel-default-heading-bg)
.panel-primary > .panel-heading
+panel-heading-styles($panel-primary-heading-bg)
.panel-success > .panel-heading
+panel-heading-styles($panel-success-heading-bg)
.panel-info > .panel-heading
+panel-heading-styles($panel-info-heading-bg)
.panel-warning > .panel-heading
+panel-heading-styles($panel-warning-heading-bg)
.panel-danger > .panel-heading
+panel-heading-styles($panel-danger-heading-bg)
//
// Wells
// --------------------------------------------------
.well
+gradient-vertical($start_color: darken($well-bg, 5%), $end_color: $well-bg)
border-color: darken($well-bg, 10%)
$shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1)
+box-shadow($shadow)

View File

@@ -1,26 +0,0 @@
//
// Thumbnails
// --------------------------------------------------
// Mixin and adjust the regular image class
.thumbnail
@extend .img-thumbnail
display: block
// Override the inline-block from `.img-thumbnail`
margin-bottom: $line-height-computed
> img
+img-responsive
margin-left: auto
margin-right: auto
// [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active
// Image captions
.caption
padding: $thumbnail-caption-padding
color: $thumbnail-caption-color
// Add a hover state for linked versions only
a.thumbnail:hover,
a.thumbnail:focus,
a.thumbnail.active
border-color: $link-color

View File

@@ -1,91 +0,0 @@
//
// Tooltips
// --------------------------------------------------
// Base class
.tooltip
position: absolute
z-index: $zindex-tooltip
display: block
visibility: visible
font-size: $font-size-small
line-height: 1.4
+opacity(0)
&.in
+opacity(0.9)
&.top
margin-top: -3px
padding: $tooltip-arrow-width 0
&.right
margin-left: 3px
padding: 0 $tooltip-arrow-width
&.bottom
margin-top: 3px
padding: $tooltip-arrow-width 0
&.left
margin-left: -3px
padding: 0 $tooltip-arrow-width
// Wrapper for the tooltip content
.tooltip-inner
max-width: $tooltip-max-width
padding: 3px 8px
color: $tooltip-color
text-align: center
text-decoration: none
background-color: $tooltip-bg
border-radius: $border-radius-base
// 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: -$tooltip-arrow-width
border-width: $tooltip-arrow-width $tooltip-arrow-width 0
border-top-color: $tooltip-arrow-color
&.top-left .tooltip-arrow
bottom: 0
left: $tooltip-arrow-width
border-width: $tooltip-arrow-width $tooltip-arrow-width 0
border-top-color: $tooltip-arrow-color
&.top-right .tooltip-arrow
bottom: 0
right: $tooltip-arrow-width
border-width: $tooltip-arrow-width $tooltip-arrow-width 0
border-top-color: $tooltip-arrow-color
&.right .tooltip-arrow
top: 50%
left: 0
margin-top: -$tooltip-arrow-width
border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0
border-right-color: $tooltip-arrow-color
&.left .tooltip-arrow
top: 50%
right: 0
margin-top: -$tooltip-arrow-width
border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width
border-left-color: $tooltip-arrow-color
&.bottom .tooltip-arrow
top: 0
left: 50%
margin-left: -$tooltip-arrow-width
border-width: 0 $tooltip-arrow-width $tooltip-arrow-width
border-bottom-color: $tooltip-arrow-color
&.bottom-left .tooltip-arrow
top: 0
left: $tooltip-arrow-width
border-width: 0 $tooltip-arrow-width $tooltip-arrow-width
border-bottom-color: $tooltip-arrow-color
&.bottom-right .tooltip-arrow
top: 0
right: $tooltip-arrow-width
border-width: 0 $tooltip-arrow-width $tooltip-arrow-width
border-bottom-color: $tooltip-arrow-color

View File

@@ -1,253 +0,0 @@
//
// Typography
// --------------------------------------------------
// Body text
// -------------------------
p
margin: 0 0 $line-height-computed / 2
.lead
margin-bottom: $line-height-computed
font-size: floor($font-size-base * 1.15)
font-weight: 200
line-height: 1.4
@media (min-width: $screen-sm-min)
font-size: $font-size-base * 1.5
// Emphasis & misc
// -------------------------
// Ex: 14px base font * 85% = about 12px
small,
.small
font-size: 85%
// Undo browser default styling
cite
font-style: normal
// Contextual emphasis
.text-muted
color: $text-muted
.text-primary
color: $brand-primary
&:hover
color: darken($brand-primary, 10%)
.text-warning
color: $state-warning-text
&:hover
color: darken($state-warning-text, 10%)
.text-danger
color: $state-danger-text
&:hover
color: darken($state-danger-text, 10%)
.text-success
color: $state-success-text
&:hover
color: darken($state-success-text, 10%)
.text-info
color: $state-info-text
&:hover
color: darken($state-info-text, 10%)
// Alignment
.text-left
text-align: left
.text-right
text-align: right
.text-center
text-align: center
// Headings
// -------------------------
h1, h2, h3, h4, h5, h6,
.h1, .h2, .h3, .h4, .h5, .h6
font-family: $headings-font-family
font-weight: $headings-font-weight
line-height: $headings-line-height
color: $headings-color
small,
.small
font-weight: normal
line-height: 1
color: $headings-small-color
h1,
h2,
h3
margin-top: $line-height-computed
margin-bottom: $line-height-computed / 2
small,
.small
font-size: 65%
h4,
h5,
h6
margin-top: $line-height-computed / 2
margin-bottom: $line-height-computed / 2
small,
.small
font-size: 75%
h1, .h1
font-size: $font-size-h1
h2, .h2
font-size: $font-size-h2
h3, .h3
font-size: $font-size-h3
h4, .h4
font-size: $font-size-h4
h5, .h5
font-size: $font-size-h5
h6, .h6
font-size: $font-size-h6
// Page header
// -------------------------
.page-header
padding-bottom: $line-height-computed / 2 - 1
margin: $line-height-computed * 2 0 $line-height-computed
border-bottom: 1px solid $page-header-border-color
// Lists
// --------------------------------------------------
// Unordered and Ordered lists
ul,
ol
margin-top: 0
margin-bottom: $line-height-computed / 2
ul,
ol
margin-bottom: 0
// List options
// Unstyled keeps list items block level, just removes default browser padding and list-style
.list-unstyled
padding-left: 0
list-style: none
// Inline turns list items into inline-block
.list-inline
@extend .list-unstyled
> li
display: inline-block
padding-left: 5px
padding-right: 5px
&:first-child
padding-left: 0
// Description Lists
dl
margin-bottom: $line-height-computed
dt,
dd
line-height: $line-height-base
dt
font-weight: bold
dd
margin-left: 0
// Undo browser default
// Horizontal description lists
//
// Defaults to being stacked without any of the below styles applied, until the
// grid breakpoint is reached (default of ~768px).
@media (min-width: $grid-float-breakpoint)
.dl-horizontal
dt
float: left
width: $component-offset-horizontal - 20
clear: left
text-align: right
+text-overflow
dd
margin-left: $component-offset-horizontal
+clearfix
// Clear the floated `dt` if an empty `dd` is present
// MISC
// ----
// Abbreviations and acronyms
abbr[title],
abbr[data-original-title]
cursor: help
border-bottom: 1px dotted $abbr-border-color
abbr.initialism
font-size: 90%
text-transform: uppercase
// Blockquotes
blockquote
padding: $line-height-computed / 2 $line-height-computed
margin: 0 0 $line-height-computed
border-left: 5px solid $blockquote-border-color
p
font-size: $font-size-base * 1.25
font-weight: 300
line-height: 1.25
p:last-child
margin-bottom: 0
small
display: block
line-height: $line-height-base
color: $blockquote-small-color
&:before
content: '\2014 \00A0'
// EM DASH, NBSP
// Float right with text-align: right
&.pull-right
padding-right: 15px
padding-left: 0
border-right: 5px solid $blockquote-border-color
border-left: 0
p,
small,
.small
text-align: right
small,
.small
&:before
content: ''
&:after
content: '\00A0 \2014'
// NBSP, EM DASH
// Quotes
blockquote:before,
blockquote:after
content: ""
// Addresses
address
margin-bottom: $line-height-computed
font-style: normal
line-height: $line-height-base

View File

@@ -1,48 +0,0 @@
//
// Utility classes
// --------------------------------------------------
// Floats
// -------------------------
.clearfix
+clearfix
.center-block
+center-block
.pull-right
float: right !important
.pull-left
float: left !important
// Toggling content
// -------------------------
// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1
.hide
display: none !important
.show
display: block !important
.invisible
visibility: hidden
.text-hide
+text-hide
// Hide from screenreaders and browsers
//
// Credit: HTML5 Boilerplate
.hidden
display: none !important
visibility: hidden !important
// For Affix plugin
// -------------------------
.affix
position: fixed

View File

@@ -1,641 +0,0 @@
//
// Variables
// --------------------------------------------------
// Global values
// --------------------------------------------------
// Grays
// -------------------------
$gray-darker: lighten(black, 13.5%) !default
// #222
$gray-dark: lighten(black, 20%) !default
// #333
$gray: lighten(black, 33.5%) !default
// #555
$gray-light: lighten(black, 60%) !default
// #999
$gray-lighter: lighten(black, 93.5%) !default
// #eee
// Brand colors
// -------------------------
$brand-primary: #428bca !default
$brand-success: #5cb85c !default
$brand-warning: #f0ad4e !default
$brand-danger: #d9534f !default
$brand-info: #5bc0de !default
// Scaffolding
// -------------------------
$body-bg: white !default
$text-color: $gray-dark !default
// Links
// -------------------------
$link-color: $brand-primary !default
$link-hover-color: darken($link-color, 15%) !default
// Typography
// -------------------------
$font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif !default
$font-family-serif: Georgia, "Times New Roman", Times, serif !default
$font-family-monospace: Monaco, Menlo, Consolas, "Courier New", monospace !default
$font-family-base: $font-family-sans-serif !default
$font-size-base: 14px !default
$font-size-large: ceil($font-size-base * 1.25) !default
// ~18px
$font-size-small: ceil($font-size-base * 0.85) !default
// ~12px
$font-size-h1: floor($font-size-base * 2.6) !default
// ~36px
$font-size-h2: floor($font-size-base * 2.15) !default
// ~30px
$font-size-h3: ceil($font-size-base * 1.7) !default
// ~24px
$font-size-h4: ceil($font-size-base * 1.25) !default
// ~18px
$font-size-h5: $font-size-base !default
$font-size-h6: ceil($font-size-base * 0.85) !default
// ~12px
$line-height-base: 1.42857 !default
// 20/14
$line-height-computed: floor($font-size-base * $line-height-base) !default
// ~20px
$headings-font-family: $font-family-base !default
$headings-font-weight: 500 !default
$headings-line-height: 1.1 !default
$headings-color: inherit !default
// Iconography
// -------------------------
$icon-font-path: "../fonts/" !default
$icon-font-name: "glyphicons-halflings-regular" !default
// Components
// -------------------------
// Based on 14px font-size and 1.428 line-height (~20px to start)
$padding-base-vertical: 6px !default
$padding-base-horizontal: 12px !default
$padding-large-vertical: 10px !default
$padding-large-horizontal: 16px !default
$padding-small-vertical: 5px !default
$padding-small-horizontal: 10px !default
$line-height-large: 1.33 !default
$line-height-small: 1.5 !default
$border-radius-base: 4px !default
$border-radius-large: 6px !default
$border-radius-small: 3px !default
$component-active-color: white !default
$component-active-bg: $brand-primary !default
$caret-width-base: 4px !default
$caret-width-large: 5px !default
// Tables
// -------------------------
$table-cell-padding: 8px !default
$table-condensed-cell-padding: 5px !default
$table-bg: transparent !default
// overall background-color
$table-bg-accent: #f9f9f9 !default
// for striping
$table-bg-hover: whitesmoke !default
$table-bg-active: $table-bg-hover !default
$table-border-color: #dddddd !default
// table and cell border
// Buttons
// -------------------------
$btn-font-weight: normal !default
$btn-default-color: #333333 !default
$btn-default-bg: white !default
$btn-default-border: #cccccc !default
$btn-primary-color: white !default
$btn-primary-bg: $brand-primary !default
$btn-primary-border: darken($btn-primary-bg, 5%) !default
$btn-success-color: white !default
$btn-success-bg: $brand-success !default
$btn-success-border: darken($btn-success-bg, 5%) !default
$btn-warning-color: white !default
$btn-warning-bg: $brand-warning !default
$btn-warning-border: darken($btn-warning-bg, 5%) !default
$btn-danger-color: white !default
$btn-danger-bg: $brand-danger !default
$btn-danger-border: darken($btn-danger-bg, 5%) !default
$btn-info-color: white !default
$btn-info-bg: $brand-info !default
$btn-info-border: darken($btn-info-bg, 5%) !default
$btn-link-disabled-color: $gray-light !default
// Forms
// -------------------------
$input-bg: white !default
$input-bg-disabled: $gray-lighter !default
$input-color: $gray !default
$input-border: #cccccc !default
$input-border-radius: $border-radius-base !default
$input-border-focus: #66afe9 !default
$input-color-placeholder: $gray-light !default
$input-height-base: $line-height-computed + $padding-base-vertical * 2 + 2 !default
$input-height-large: floor($font-size-large * $line-height-large) + $padding-large-vertical * 2 + 2 !default
$input-height-small: floor($font-size-small * $line-height-small) + $padding-small-vertical * 2 + 2 !default
$legend-color: $gray-dark !default
$legend-border-color: #e5e5e5 !default
$input-group-addon-bg: $gray-lighter !default
$input-group-addon-border-color: $input-border !default
// Dropdowns
// -------------------------
$dropdown-bg: white !default
$dropdown-border: rgba(0, 0, 0, 0.15) !default
$dropdown-fallback-border: #cccccc !default
$dropdown-divider-bg: #e5e5e5 !default
$dropdown-link-color: $gray-dark !default
$dropdown-link-hover-color: darken($gray-dark, 5%) !default
$dropdown-link-hover-bg: whitesmoke !default
$dropdown-link-active-color: $component-active-color !default
$dropdown-link-active-bg: $component-active-bg !default
$dropdown-link-disabled-color: $gray-light !default
$dropdown-header-color: $gray-light !default
$dropdown-caret-color: black !default
// 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 :)
$zindex-navbar: 1000 !default
$zindex-dropdown: 1000 !default
$zindex-popover: 1010 !default
$zindex-tooltip: 1030 !default
$zindex-navbar-fixed: 1030 !default
$zindex-modal-background: 1040 !default
$zindex-modal: 1050 !default
// Media queries breakpoints
// --------------------------------------------------
// Extra small screen / phone
// Note: Deprecated $screen-xs and $screen-phone as of v3.0.1
$screen-xs: 480px !default
$screen-xs-min: $screen-xs !default
$screen-phone: $screen-xs-min !default
// Small screen / tablet
// Note: Deprecated $screen-sm and $screen-tablet as of v3.0.1
$screen-sm: 768px !default
$screen-sm-min: $screen-sm !default
$screen-tablet: $screen-sm-min !default
// Medium screen / desktop
// Note: Deprecated $screen-md and $screen-desktop as of v3.0.1
$screen-md: 992px !default
$screen-md-min: $screen-md !default
$screen-desktop: $screen-md-min !default
// Large screen / wide desktop
// Note: Deprecated $screen-lg and $screen-lg-desktop as of v3.0.1
$screen-lg: 1200px !default
$screen-lg-min: $screen-lg !default
$screen-lg-desktop: $screen-lg-min !default
// So media queries don't overlap when required, provide a maximum
$screen-xs-max: $screen-sm-min - 1 !default
$screen-sm-max: $screen-md-min - 1 !default
$screen-md-max: $screen-lg-min - 1 !default
// Grid system
// --------------------------------------------------
// Number of columns in the grid system
$grid-columns: 12 !default
// Padding, to be divided by two and applied to the left and right of all columns
$grid-gutter-width: 30px !default
// Point at which the navbar stops collapsing
$grid-float-breakpoint: $screen-sm-min !default
// Navbar
// -------------------------
// Basics of a navbar
$navbar-height: 50px !default
$navbar-margin-bottom: $line-height-computed !default
$navbar-border-radius: $border-radius-base !default
$navbar-padding-horizontal: floor($grid-gutter-width / 2) !default
$navbar-padding-vertical: ($navbar-height - $line-height-computed) / 2 !default
$navbar-default-color: #777777 !default
$navbar-default-bg: #f8f8f8 !default
$navbar-default-border: darken($navbar-default-bg, 6.5%) !default
// Navbar links
$navbar-default-link-color: #777777 !default
$navbar-default-link-hover-color: #333333 !default
$navbar-default-link-hover-bg: transparent !default
$navbar-default-link-active-color: #555555 !default
$navbar-default-link-active-bg: darken($navbar-default-bg, 6.5%) !default
$navbar-default-link-disabled-color: #cccccc !default
$navbar-default-link-disabled-bg: transparent !default
// Navbar brand label
$navbar-default-brand-color: $navbar-default-link-color !default
$navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%) !default
$navbar-default-brand-hover-bg: transparent !default
// Navbar toggle
$navbar-default-toggle-hover-bg: #dddddd !default
$navbar-default-toggle-icon-bar-bg: #cccccc !default
$navbar-default-toggle-border-color: #dddddd !default
// Inverted navbar
//
// Reset inverted navbar basics
$navbar-inverse-color: $gray-light !default
$navbar-inverse-bg: #222222 !default
$navbar-inverse-border: darken($navbar-inverse-bg, 10%) !default
// Inverted navbar links
$navbar-inverse-link-color: $gray-light !default
$navbar-inverse-link-hover-color: white !default
$navbar-inverse-link-hover-bg: transparent !default
$navbar-inverse-link-active-color: $navbar-inverse-link-hover-color !default
$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 10%) !default
$navbar-inverse-link-disabled-color: #444444 !default
$navbar-inverse-link-disabled-bg: transparent !default
// Inverted navbar brand label
$navbar-inverse-brand-color: $navbar-inverse-link-color !default
$navbar-inverse-brand-hover-color: white !default
$navbar-inverse-brand-hover-bg: transparent !default
// Inverted navbar toggle
$navbar-inverse-toggle-hover-bg: #333333 !default
$navbar-inverse-toggle-icon-bar-bg: white !default
$navbar-inverse-toggle-border-color: #333333 !default
// Navs
// -------------------------
$nav-link-padding: 10px 15px !default
$nav-link-hover-bg: $gray-lighter !default
$nav-disabled-link-color: $gray-light !default
$nav-disabled-link-hover-color: $gray-light !default
$nav-open-link-hover-color: white !default
$nav-open-caret-border-color: white !default
// Tabs
$nav-tabs-border-color: #dddddd !default
$nav-tabs-link-hover-border-color: $gray-lighter !default
$nav-tabs-active-link-hover-bg: $body-bg !default
$nav-tabs-active-link-hover-color: $gray !default
$nav-tabs-active-link-hover-border-color: #dddddd !default
$nav-tabs-justified-link-border-color: #dddddd !default
$nav-tabs-justified-active-link-border-color: $body-bg !default
// Pills
$nav-pills-border-radius: $border-radius-base !default
$nav-pills-active-link-hover-bg: $component-active-bg !default
$nav-pills-active-link-hover-color: $component-active-color !default
// Pagination
// -------------------------
$pagination-bg: white !default
$pagination-border: #dddddd !default
$pagination-hover-bg: $gray-lighter !default
$pagination-active-bg: $brand-primary !default
$pagination-active-color: white !default
$pagination-disabled-color: $gray-light !default
// Pager
// -------------------------
$pager-border-radius: 15px !default
$pager-disabled-color: $gray-light !default
// Jumbotron
// -------------------------
$jumbotron-padding: 30px !default
$jumbotron-color: inherit !default
$jumbotron-bg: $gray-lighter !default
$jumbotron-heading-color: inherit !default
$jumbotron-font-size: ceil($font-size-base * 1.5) !default
// Form states and alerts
// -------------------------
$state-success-text: #468847 !default
$state-success-bg: #dff0d8 !default
$state-success-border: darken(adjust-hue($state-success-bg, -10), 5%) !default
$state-info-text: #3a87ad !default
$state-info-bg: #d9edf7 !default
$state-info-border: darken(adjust-hue($state-info-bg, -10), 7%) !default
$state-warning-text: #c09853 !default
$state-warning-bg: #fcf8e3 !default
$state-warning-border: darken(adjust-hue($state-warning-bg, -10), 5%) !default
$state-danger-text: #b94a48 !default
$state-danger-bg: #f2dede !default
$state-danger-border: darken(adjust-hue($state-danger-bg, -10), 5%) !default
// Tooltips
// -------------------------
$tooltip-max-width: 200px !default
$tooltip-color: white !default
$tooltip-bg: black !default
$tooltip-arrow-width: 5px !default
$tooltip-arrow-color: $tooltip-bg !default
// Popovers
// -------------------------
$popover-bg: white !default
$popover-max-width: 276px !default
$popover-border-color: rgba(0, 0, 0, 0.2) !default
$popover-fallback-border-color: #cccccc !default
$popover-title-bg: darken($popover-bg, 3%) !default
$popover-arrow-width: 10px !default
$popover-arrow-color: white !default
$popover-arrow-outer-width: $popover-arrow-width + 1 !default
$popover-arrow-outer-color: rgba(0, 0, 0, 0.25) !default
$popover-arrow-outer-fallback-color: #999999 !default
// Labels
// -------------------------
$label-default-bg: $gray-light !default
$label-primary-bg: $brand-primary !default
$label-success-bg: $brand-success !default
$label-info-bg: $brand-info !default
$label-warning-bg: $brand-warning !default
$label-danger-bg: $brand-danger !default
$label-color: white !default
$label-link-hover-color: white !default
// Modals
// -------------------------
$modal-inner-padding: 20px !default
$modal-title-padding: 15px !default
$modal-title-line-height: $line-height-base !default
$modal-content-bg: white !default
$modal-content-border-color: rgba(0, 0, 0, 0.2) !default
$modal-content-fallback-border-color: #999999 !default
$modal-backdrop-bg: black !default
$modal-header-border-color: #e5e5e5 !default
$modal-footer-border-color: $modal-header-border-color !default
// Alerts
// -------------------------
$alert-padding: 15px !default
$alert-border-radius: $border-radius-base !default
$alert-link-font-weight: bold !default
$alert-success-bg: $state-success-bg !default
$alert-success-text: $state-success-text !default
$alert-success-border: $state-success-border !default
$alert-info-bg: $state-info-bg !default
$alert-info-text: $state-info-text !default
$alert-info-border: $state-info-border !default
$alert-warning-bg: $state-warning-bg !default
$alert-warning-text: $state-warning-text !default
$alert-warning-border: $state-warning-border !default
$alert-danger-bg: $state-danger-bg !default
$alert-danger-text: $state-danger-text !default
$alert-danger-border: $state-danger-border !default
// Progress bars
// -------------------------
$progress-bg: whitesmoke !default
$progress-bar-color: white !default
$progress-bar-bg: $brand-primary !default
$progress-bar-success-bg: $brand-success !default
$progress-bar-warning-bg: $brand-warning !default
$progress-bar-danger-bg: $brand-danger !default
$progress-bar-info-bg: $brand-info !default
// List group
// -------------------------
$list-group-bg: white !default
$list-group-border: #dddddd !default
$list-group-border-radius: $border-radius-base !default
$list-group-hover-bg: whitesmoke !default
$list-group-active-color: $component-active-color !default
$list-group-active-bg: $component-active-bg !default
$list-group-active-border: $list-group-active-bg !default
$list-group-link-color: #555555 !default
$list-group-link-heading-color: #333333 !default
// Panels
// -------------------------
$panel-bg: white !default
$panel-inner-border: #dddddd !default
$panel-border-radius: $border-radius-base !default
$panel-footer-bg: whitesmoke !default
$panel-default-text: $gray-dark !default
$panel-default-border: #dddddd !default
$panel-default-heading-bg: whitesmoke !default
$panel-primary-text: white !default
$panel-primary-border: $brand-primary !default
$panel-primary-heading-bg: $brand-primary !default
$panel-success-text: $state-success-text !default
$panel-success-border: $state-success-border !default
$panel-success-heading-bg: $state-success-bg !default
$panel-warning-text: $state-warning-text !default
$panel-warning-border: $state-warning-border !default
$panel-warning-heading-bg: $state-warning-bg !default
$panel-danger-text: $state-danger-text !default
$panel-danger-border: $state-danger-border !default
$panel-danger-heading-bg: $state-danger-bg !default
$panel-info-text: $state-info-text !default
$panel-info-border: $state-info-border !default
$panel-info-heading-bg: $state-info-bg !default
// Thumbnails
// -------------------------
$thumbnail-padding: 4px !default
$thumbnail-bg: $body-bg !default
$thumbnail-border: #dddddd !default
$thumbnail-border-radius: $border-radius-base !default
$thumbnail-caption-color: $text-color !default
$thumbnail-caption-padding: 9px !default
// Wells
// -------------------------
$well-bg: whitesmoke !default
// Badges
// -------------------------
$badge-color: white !default
$badge-link-hover-color: white !default
$badge-bg: $gray-light !default
$badge-active-color: $link-color !default
$badge-active-bg: white !default
$badge-font-weight: bold !default
$badge-line-height: 1 !default
$badge-border-radius: 10px !default
// Breadcrumbs
// -------------------------
$breadcrumb-bg: whitesmoke !default
$breadcrumb-color: #cccccc !default
$breadcrumb-active-color: $gray-light !default
$breadcrumb-separator: "/" !default
// Carousel
// ------------------------
$carousel-text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6) !default
$carousel-control-color: white !default
$carousel-control-width: 15% !default
$carousel-control-opacity: 0.5 !default
$carousel-control-font-size: 20px !default
$carousel-indicator-active-bg: white !default
$carousel-indicator-border-color: white !default
$carousel-caption-color: white !default
// Close
// ------------------------
$close-font-weight: bold !default
$close-color: black !default
$close-text-shadow: 0 1px 0 white !default
// Code
// ------------------------
$code-color: #c7254e !default
$code-bg: #f9f2f4 !default
$pre-bg: whitesmoke !default
$pre-color: $gray-dark !default
$pre-border-color: #cccccc !default
$pre-scrollable-max-height: 340px !default
// Type
// ------------------------
$text-muted: $gray-light !default
$abbr-border-color: $gray-light !default
$headings-small-color: $gray-light !default
$blockquote-small-color: $gray-light !default
$blockquote-border-color: $gray-lighter !default
$page-header-border-color: $gray-lighter !default
// Miscellaneous
// -------------------------
// Hr border color
$hr-border: $gray-lighter !default
// Horizontal forms & lists
$component-offset-horizontal: 180px !default
// Container sizes
// --------------------------------------------------
// Small screen / tablet
$container-tablet: 720px + $grid-gutter-width !default
$container-sm: $container-tablet !default
// Medium screen / desktop
$container-desktop: 940px + $grid-gutter-width !default
$container-md: $container-desktop !default
// Large screen / wide desktop
$container-large-desktop: 1140px + $grid-gutter-width !default
$container-lg: $container-large-desktop !default

View File

@@ -1,25 +0,0 @@
//
// Wells
// --------------------------------------------------
// Base class
.well
min-height: 20px
padding: 19px
margin-bottom: 20px
background-color: $well-bg
border: 1px solid darken($well-bg, 7%)
border-radius: $border-radius-base
+box-shadow(inset 0 1px 1px rgba(0, 0, 0, 0.05))
blockquote
border-color: #ddd
border-color: rgba(0, 0, 0, 0.15)
// Sizes
.well-lg
padding: 24px
border-radius: $border-radius-large
.well-sm
padding: 9px
border-radius: $border-radius-small

View File

@@ -1,49 +0,0 @@
// Core variables and mixins
@import variables
@import mixins
// Reset
@import normalize
@import print
// Core CSS
@import scaffolding
@import type
@import code
@import grid
@import tables
@import forms
@import buttons
// Components
@import component-animations
@import glyphicons
@import dropdowns
@import button-groups
@import input-groups
@import navs
@import navbar
@import breadcrumbs
@import pagination
@import pager
@import labels
@import badges
@import jumbotron
@import thumbnails
@import alerts
@import progress-bars
@import media
@import list-group
@import panels
@import wells
@import close
// Components w/ JavaScript
@import modals
@import tooltip
@import popovers
@import carousel
// Utility classes
@import utilities
@import responsive-utilities

View File

@@ -18,6 +18,9 @@ $shadow-alpha: .5
html, body
height: 100%
font-family: "SourceCodePro"
margin: 0
padding: 0
line-height: 1.2
body
main

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -8,8 +8,7 @@
<meta name="author" content="">
<link rel="shortcut icon" href="{{ static_url('images/favicon.png') }}">
<title>Apparatus</title>
<link href="{{ static_url('stylesheets/bootstrap/bootstrap.css') }}" rel="stylesheet">
<title>Butterfly</title>
<link href="{{ static_url('stylesheets/main.css') }}" rel="stylesheet">
</head>
@@ -17,8 +16,6 @@
<main>
</main>
<script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
<script src="{{ static_url('javascripts/bootstrap.min.js') }}"></script>
<script src="{{ static_url('javascripts/term.js/src/term.js') }}"></script>
<script src="{{ static_url('javascripts/main.js') }}"></script>
</body>

63
butterfly.py Normal file
View File

@@ -0,0 +1,63 @@
#!/usr/bin/env python
# *-* coding: utf-8 *-*
# This file is part of butterfly
#
# butterfly Copyright (C) 2014 Florian Mounier
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import tornado.options
import tornado.ioloop
tornado.options.define("secret", default='secret', help="Secret")
tornado.options.define("debug", default=False, help="Debug mode")
tornado.options.define("host", default='127.0.0.1', help="Server host")
tornado.options.define("port", default=57575, type=int, help="Server port")
tornado.options.define("command", help="Command to execute at login")
tornado.options.parse_command_line()
from logging import getLogger
for logger in ('tornado.access', 'tornado.application',
'tornado.general', 'butterfly'):
getLogger(logger).setLevel(10 if tornado.options.options.debug else 30)
log = getLogger('butterfly')
log.debug('Starting server')
ioloop = tornado.ioloop.IOLoop.instance()
from app import application
application.listen(tornado.options.options.port)
url = "http://%s:%d/*" % (
tornado.options.options.host, tornado.options.options.port)
# This is for debugging purpose
try:
from wsreload.client import sporadic_reload, watch
except ImportError:
log.debug('wsreload not found')
else:
sporadic_reload({'url': url})
files = ['app/static/javascripts/',
'app/static/stylesheets/',
'app/templates/']
watch({'url': url}, files, unwatch_at_exit=True)
log.debug('Starting loop')
ioloop.start()

10
butterfly.service Normal file
View File

@@ -0,0 +1,10 @@
[Unit]
Description=Butterfly Terminal Server
After=syslog.target
[Service]
ExecStart=/usr/bin/butterfly.py
Restart=on-abort
[Install]
WantedBy=multi-user.target

View File

@@ -10,7 +10,7 @@ commands = [
'coffee -wcb -j app/static/javascripts/main.js ' +
' '.join(glob('app/static/coffees/*.coffee')),
'compass watch app/static',
'python serve.py ' + ' '.join(sys.argv[1:])
'python butterfly.py ' + ' '.join(sys.argv[1:])
]

View File

@@ -1,50 +0,0 @@
#!/usr/bin/env python
try:
from wdb.ext import add_w_builtin
add_w_builtin()
except ImportError:
pass
import tornado.options
import tornado.ioloop
tornado.options.define("secret", default='secret', help="Secret")
tornado.options.define("debug", default=False, help="Debug mode")
tornado.options.define("host", default='wsterm.l', help="Server host")
tornado.options.define("port", default=11112, type=int, help="Server port")
tornado.options.parse_command_line()
from logging import getLogger
for logger in ('tornado.access', 'tornado.application',
'tornado.general', 'wsterm'):
getLogger(logger).setLevel(10 if tornado.options.options.debug else 30)
log = getLogger('wsterm')
log.debug('Starting server')
ioloop = tornado.ioloop.IOLoop.instance()
from app import application
application.listen(tornado.options.options.port)
url = "http://%s:%d/*" % (
tornado.options.options.host, tornado.options.options.port)
try:
from wsreload.client import sporadic_reload, watch
except ImportError:
log.debug('wsreload not found')
else:
sporadic_reload({'url': url})
files = ['app/static/javascripts/',
'app/static/stylesheets/',
'app/templates/']
watch({'url': url}, files, unwatch_at_exit=True)
log.debug('Starting loop')
ioloop.start()

47
setup.py Normal file
View File

@@ -0,0 +1,47 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
wdb
"""
import os
import re
from setuptools import setup
ROOT = os.path.dirname(__file__)
with open(os.path.join(ROOT, 'app', '__init__.py')) as fd:
__version__ = re.search("__version__ = '([^']+)'", fd.read()).group(1)
options = dict(
name="butterfly",
version=__version__,
description="A sleek web based terminal emulator",
long_description="See http://github.com/paradoxxxzero/butterfly",
author="Florian Mounier",
author_email="paradoxxx.zero@gmail.com",
url="http://github.com/paradoxxxzero/butterfly",
license="GPLv3",
platforms="Any",
scripts=['butterfly.py'],
packages=['app'],
install_requires=["tornado"],
package_dir={'butterfly': 'app'},
package_data={
'app': [
'static/fonts/*',
'static/stylesheets/main.css',
'static/javascripts/term.js/src/term.js',
'static/javascripts/main.js',
'templates/index.html'
]
},
classifiers=[
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
"Operating System :: Linux",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
"Topic :: Terminals"])
setup(**options)

View File

View File

@@ -1,161 +0,0 @@
from selenium import webdriver
from pytest import fixture
from multiprocessing import Process, Lock, active_children
from cutter import attr_cut
from signal import SIGKILL
import atexit
import re
import os
import sys
try:
from wdb.ext import add_w_builtin
add_w_builtin()
except ImportError:
pass
display = None
fs_path = {}
browsers = ['firefox', 'chrome']
def pytest_report_teststatus(report):
try:
browser = re.search('(\[.*\])', report.nodeid).groups()[0]
except:
return
if browser not in fs_path:
fs_path[browser] = [report.fspath]
sys.stdout.write('\t' + browser + '\t')
elif report.fspath not in fs_path[browser]:
fs_path[browser].append(report.fspath)
sys.stdout.write('\t' + browser + '\t')
def pytest_addoption(parser):
parser.addoption("--display", action="store_true")
parser.addoption("--browser", action="append")
def pytest_configure(config):
if not config.getoption("--display"):
from pyvirtualdisplay import Display
display = Display(visible=0, size=(1440, 900))
display.start()
if config.getoption("--browser"):
browsers[:] = config.getoption("--browser")
class App(Process):
def __init__(self):
# self.parent_pid = os.getpid()
super(App, self).__init__()
self.lock = Lock()
self.start()
def run(self):
from http.server import HTTPServer
old_serve_forever = HTTPServer.serve_forever
print('Acquire lock')
l = self.lock
l.acquire()
# Inform parent that we are ready
def new_serve_forever(self):
print('Release lock')
l.release()
old_serve_forever(self)
HTTPServer.serve_forever = new_serve_forever
os.environ['APP_TESTING'] = 'YES'
from app import app
app.run(
debug=True,
threaded=True,
use_reloader=False,
port=29013)
def wait_for_lock(self):
ok = self.lock.acquire(20)
if not ok:
raise RuntimeError(
'Impossible to get app lock.'
' App may not have been started successfuly')
self.lock.release()
@fixture(scope='session')
def app(request):
app = App()
def end_app():
app.terminate()
request.addfinalizer(end_app)
return app
class ElementWrapper(object):
def __init__(self, element):
self.element = element
def __getattr__(self, attr):
if attr in self.__dict__:
return getattr(self, attr)
return getattr(self.element, attr)
def find(self, selector):
return attr_cut(
map(ElementWrapper,
self.element.find_elements_by_css_selector(selector)))
__call__ = find
def type(self, keys):
self.clear()
self.send_keys(keys)
class BrowserWrapper(object):
def __init__(self, browser):
self.browser = browser
def __getattr__(self, attr):
if attr in self.__dict__:
return getattr(self, attr)
return getattr(self.browser, attr)
def go(self, url):
if url.startswith('/'):
url = url[1:]
self.browser.get('http://localhost:29013/' + url)
def __call__(self, selector):
return attr_cut(
map(ElementWrapper,
self.browser.find_elements_by_css_selector(selector)))
@fixture(scope='session', params=browsers)
def s(request, app): # s = Selenium Browser
browser = getattr(webdriver, request.param.capitalize())()
def close_browser():
browser.close()
request.addfinalizer(close_browser)
app.wait_for_lock()
return BrowserWrapper(browser)
@atexit.register
def killall():
if display:
display.stop()
for child in active_children():
os.kill(child.pid, SIGKILL)

View File

@@ -1,4 +0,0 @@
def test_not_found(s):
s.get('http://localhost:29013/some_random_page')
h1 = s.find_element_by_css_selector('h1')
assert h1.text == 'Not Found'

View File

@@ -1,11 +0,0 @@
def test_index(s):
s.go('/')
assert 'Apparatus' in s.title
assert s('h1')
def test_index_2(s):
s.go('/')
assert 'Apparatus' in s.title
assert s('ol')

View File

@@ -1,3 +0,0 @@
def test_not_selenium():
assert True