diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c625bfb --- /dev/null +++ b/LICENSE @@ -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 . diff --git a/app/__init__.py b/app/__init__.py index 9266301..bfd7391 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -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 . +__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, diff --git a/app/routes.py b/app/routes.py index 46ac355..753bf1c 100644 --- a/app/routes.py +++ b/app/routes.py @@ -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 . + +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() diff --git a/app/static/coffees/main.coffee b/app/static/coffees/main.coffee index 353e47e..6aa6647 100644 --- a/app/static/coffees/main.coffee +++ b/app/static/coffees/main.coffee @@ -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 = $('
').addClass('terminal') - $test = $('
').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}" diff --git a/app/static/javascripts/bootstrap.min.js b/app/static/javascripts/bootstrap.min.js deleted file mode 100644 index 9f2a754..0000000 --- a/app/static/javascripts/bootstrap.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap v3.0.2 by @fat and @mdo - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */ - -if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]');if(a.length){var b=this.$element.find("input").prop("checked",!this.$element.hasClass("active")).trigger("change");"radio"===b.prop("type")&&a.find(".active").removeClass("active")}this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(''}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);{var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})}},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); \ No newline at end of file diff --git a/app/static/javascripts/main.js b/app/static/javascripts/main.js index 341c742..aabab69 100644 --- a/app/static/javascripts/main.js +++ b/app/static/javascripts/main.js @@ -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 = $('
').addClass('terminal'); - $test = $('
').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); }); diff --git a/app/static/sass/bootstrap/_alerts.sass b/app/static/sass/bootstrap/_alerts.sass deleted file mode 100644 index 8ee39d1..0000000 --- a/app/static/sass/bootstrap/_alerts.sass +++ /dev/null @@ -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) diff --git a/app/static/sass/bootstrap/_badges.sass b/app/static/sass/bootstrap/_badges.sass deleted file mode 100644 index dc0d7ec..0000000 --- a/app/static/sass/bootstrap/_badges.sass +++ /dev/null @@ -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 diff --git a/app/static/sass/bootstrap/_breadcrumbs.sass b/app/static/sass/bootstrap/_breadcrumbs.sass deleted file mode 100644 index 5187690..0000000 --- a/app/static/sass/bootstrap/_breadcrumbs.sass +++ /dev/null @@ -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 diff --git a/app/static/sass/bootstrap/_button-groups.sass b/app/static/sass/bootstrap/_button-groups.sass deleted file mode 100644 index 4c1a922..0000000 --- a/app/static/sass/bootstrap/_button-groups.sass +++ /dev/null @@ -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 diff --git a/app/static/sass/bootstrap/_buttons.sass b/app/static/sass/bootstrap/_buttons.sass deleted file mode 100644 index a79ada7..0000000 --- a/app/static/sass/bootstrap/_buttons.sass +++ /dev/null @@ -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% diff --git a/app/static/sass/bootstrap/_carousel.sass b/app/static/sass/bootstrap/_carousel.sass deleted file mode 100644 index e9480b5..0000000 --- a/app/static/sass/bootstrap/_carousel.sass +++ /dev/null @@ -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 diff --git a/app/static/sass/bootstrap/_close.sass b/app/static/sass/bootstrap/_close.sass deleted file mode 100644 index 2a773e8..0000000 --- a/app/static/sass/bootstrap/_close.sass +++ /dev/null @@ -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 diff --git a/app/static/sass/bootstrap/_code.sass b/app/static/sass/bootstrap/_code.sass deleted file mode 100644 index e1f6df1..0000000 --- a/app/static/sass/bootstrap/_code.sass +++ /dev/null @@ -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 diff --git a/app/static/sass/bootstrap/_component-animations.sass b/app/static/sass/bootstrap/_component-animations.sass deleted file mode 100644 index 8710b66..0000000 --- a/app/static/sass/bootstrap/_component-animations.sass +++ /dev/null @@ -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) diff --git a/app/static/sass/bootstrap/_dropdowns.sass b/app/static/sass/bootstrap/_dropdowns.sass deleted file mode 100644 index cc63a90..0000000 --- a/app/static/sass/bootstrap/_dropdowns.sass +++ /dev/null @@ -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 diff --git a/app/static/sass/bootstrap/_forms.sass b/app/static/sass/bootstrap/_forms.sass deleted file mode 100644 index a452d11..0000000 --- a/app/static/sass/bootstrap/_forms.sass +++ /dev/null @@ -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 diff --git a/app/static/sass/bootstrap/_glyphicons.sass b/app/static/sass/bootstrap/_glyphicons.sass deleted file mode 100644 index b17cc80..0000000 --- a/app/static/sass/bootstrap/_glyphicons.sass +++ /dev/null @@ -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: -// -// Star - -// 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" diff --git a/app/static/sass/bootstrap/_grid.sass b/app/static/sass/bootstrap/_grid.sass deleted file mode 100644 index ece29a0..0000000 --- a/app/static/sass/bootstrap/_grid.sass +++ /dev/null @@ -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) diff --git a/app/static/sass/bootstrap/_input-groups.sass b/app/static/sass/bootstrap/_input-groups.sass deleted file mode 100644 index 2a322ee..0000000 --- a/app/static/sass/bootstrap/_input-groups.sass +++ /dev/null @@ -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 diff --git a/app/static/sass/bootstrap/_jumbotron.sass b/app/static/sass/bootstrap/_jumbotron.sass deleted file mode 100644 index b292883..0000000 --- a/app/static/sass/bootstrap/_jumbotron.sass +++ /dev/null @@ -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 diff --git a/app/static/sass/bootstrap/_labels.sass b/app/static/sass/bootstrap/_labels.sass deleted file mode 100644 index 51ec4f4..0000000 --- a/app/static/sass/bootstrap/_labels.sass +++ /dev/null @@ -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) diff --git a/app/static/sass/bootstrap/_list-group.sass b/app/static/sass/bootstrap/_list-group.sass deleted file mode 100644 index 49a2f88..0000000 --- a/app/static/sass/bootstrap/_list-group.sass +++ /dev/null @@ -1,71 +0,0 @@ -// -// List groups -// -------------------------------------------------- - -// Base class -// -// Easily usable on
    ,
      , or
      . -.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 diff --git a/app/static/sass/bootstrap/_media.sass b/app/static/sass/bootstrap/_media.sass deleted file mode 100644 index 09e392b..0000000 --- a/app/static/sass/bootstrap/_media.sass +++ /dev/null @@ -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 diff --git a/app/static/sass/bootstrap/_mixins.sass b/app/static/sass/bootstrap/_mixins.sass deleted file mode 100644 index b508cef..0000000 --- a/app/static/sass/bootstrap/_mixins.sass +++ /dev/null @@ -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. `