├── .bowerrc ├── .gitignore ├── .ruby-version ├── .travis.yml ├── Gemfile ├── Gemfile.lock ├── LICENSE.md ├── Procfile ├── README.md ├── Rakefile ├── bower.json ├── config.ru ├── lib ├── github_uploader.rb ├── github_uploader │ └── helpers.rb ├── public │ ├── assets │ │ ├── javascripts │ │ │ └── app.coffee │ │ └── style.css │ └── vendor │ │ ├── bootstrap │ │ ├── .bower.json │ │ ├── Gruntfile.js │ │ ├── LICENSE │ │ ├── README.md │ │ ├── bower.json │ │ ├── dist │ │ │ ├── css │ │ │ │ ├── bootstrap-theme.css │ │ │ │ ├── bootstrap-theme.css.map │ │ │ │ ├── bootstrap-theme.min.css │ │ │ │ ├── bootstrap.css │ │ │ │ ├── bootstrap.css.map │ │ │ │ └── bootstrap.min.css │ │ │ ├── fonts │ │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ │ └── glyphicons-halflings-regular.woff │ │ │ └── js │ │ │ │ ├── bootstrap.js │ │ │ │ └── bootstrap.min.js │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ └── glyphicons-halflings-regular.woff │ │ ├── js │ │ │ ├── affix.js │ │ │ ├── alert.js │ │ │ ├── button.js │ │ │ ├── carousel.js │ │ │ ├── collapse.js │ │ │ ├── dropdown.js │ │ │ ├── modal.js │ │ │ ├── popover.js │ │ │ ├── scrollspy.js │ │ │ ├── tab.js │ │ │ ├── tooltip.js │ │ │ └── transition.js │ │ └── package.json │ │ └── jquery │ │ ├── .bower.json │ │ ├── MIT-LICENSE.txt │ │ ├── bower.json │ │ └── dist │ │ ├── jquery.js │ │ ├── jquery.min.js │ │ └── jquery.min.map └── views │ ├── index.erb │ ├── layout.erb │ └── tree.erb ├── manifest.yml ├── script ├── bootstrap ├── cibuild └── server ├── spec ├── fixtures │ ├── file.json │ ├── foo.txt │ ├── repo-contents.json │ ├── repo-sub-contents.json │ ├── repo.json │ └── repos.json ├── github_uploader_helpers_spec.rb ├── github_uploader_spec.rb └── spec_helper.rb └── vendor └── cache ├── activesupport-4.2.5.gem ├── addressable-2.3.8.gem ├── coderay-1.1.0.gem ├── coffee-script-2.4.1.gem ├── coffee-script-source-1.10.0.gem ├── crack-0.4.3.gem ├── diff-lcs-1.2.5.gem ├── dotenv-2.0.2.gem ├── execjs-2.6.0.gem ├── faraday-0.9.2.gem ├── ffi-1.9.10.gem ├── hashdiff-0.2.3.gem ├── i18n-0.7.0.gem ├── json-1.8.3.gem ├── listen-3.0.5.gem ├── method_source-0.8.2.gem ├── minitest-5.8.3.gem ├── moneta-0.8.0.gem ├── multipart-post-2.0.0.gem ├── octokit-4.2.0.gem ├── pry-0.10.3.gem ├── rack-1.6.4.gem ├── rack-coffee-1.0.3.gem ├── rack-flash3-1.0.5.gem ├── rack-protection-1.5.3.gem ├── rack-ssl-enforcer-0.2.9.gem ├── rack-test-0.6.3.gem ├── rake-10.4.2.gem ├── rb-fsevent-0.9.6.gem ├── rb-inotify-0.9.5.gem ├── redis-3.2.2.gem ├── rerun-0.11.0.gem ├── rspec-3.4.0.gem ├── rspec-core-3.4.1.gem ├── rspec-expectations-3.4.0.gem ├── rspec-mocks-3.4.0.gem ├── rspec-support-3.4.1.gem ├── safe_yaml-1.0.4.gem ├── sawyer-0.6.0.gem ├── sinatra-1.4.6.gem ├── sinatra-redirect-with-flash-0.2.1.gem ├── sinatra_auth_github-1.2.0.gem ├── slop-3.6.0.gem ├── thread_safe-0.3.5.gem ├── tilt-2.0.1.gem ├── tzinfo-1.2.2.gem ├── warden-1.2.4.gem ├── warden-github-1.2.0.gem └── webmock-1.22.3.gem /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "lib/public/vendor" 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | .bundle 3 | /vendor/gems/ 4 | /bin 5 | tmp 6 | 7 | #bower bloat 8 | lib/public/vendor/bootstrap/grunt 9 | lib/public/vendor/bootstrap/less 10 | lib/public/vendor/bootstrap/test-infra 11 | lib/public/vendor/jquery/src 12 | -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 2.3.0 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: ruby 2 | script: "./script/cibuild" 3 | sudo: false 4 | cache: bundler 5 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | ruby `cat .ruby-version`.strip 4 | 5 | gem "sinatra" 6 | gem "octokit" 7 | gem "dotenv" 8 | gem "rack-ssl-enforcer" 9 | gem "sinatra_auth_github" 10 | gem "rack-coffee" 11 | gem 'sinatra-redirect-with-flash' 12 | gem 'rack-flash3' 13 | gem 'moneta' 14 | gem 'redis' 15 | gem 'rake' 16 | 17 | group :development do 18 | gem "pry" 19 | gem "rerun" 20 | end 21 | 22 | group :test do 23 | gem 'rspec' 24 | gem 'rack-test' 25 | gem 'webmock' 26 | end 27 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | activesupport (4.2.5) 5 | i18n (~> 0.7) 6 | json (~> 1.7, >= 1.7.7) 7 | minitest (~> 5.1) 8 | thread_safe (~> 0.3, >= 0.3.4) 9 | tzinfo (~> 1.1) 10 | addressable (2.3.8) 11 | coderay (1.1.0) 12 | coffee-script (2.4.1) 13 | coffee-script-source 14 | execjs 15 | coffee-script-source (1.10.0) 16 | crack (0.4.3) 17 | safe_yaml (~> 1.0.0) 18 | diff-lcs (1.2.5) 19 | dotenv (2.0.2) 20 | execjs (2.6.0) 21 | faraday (0.9.2) 22 | multipart-post (>= 1.2, < 3) 23 | ffi (1.9.10) 24 | hashdiff (0.2.3) 25 | i18n (0.7.0) 26 | json (1.8.3) 27 | listen (3.0.5) 28 | rb-fsevent (>= 0.9.3) 29 | rb-inotify (>= 0.9) 30 | method_source (0.8.2) 31 | minitest (5.8.3) 32 | moneta (0.8.0) 33 | multipart-post (2.0.0) 34 | octokit (4.2.0) 35 | sawyer (~> 0.6.0, >= 0.5.3) 36 | pry (0.10.3) 37 | coderay (~> 1.1.0) 38 | method_source (~> 0.8.1) 39 | slop (~> 3.4) 40 | rack (1.6.4) 41 | rack-coffee (1.0.3) 42 | coffee-script 43 | rack 44 | rack-flash3 (1.0.5) 45 | rack 46 | rack-protection (1.5.3) 47 | rack 48 | rack-ssl-enforcer (0.2.9) 49 | rack-test (0.6.3) 50 | rack (>= 1.0) 51 | rake (10.4.2) 52 | rb-fsevent (0.9.6) 53 | rb-inotify (0.9.5) 54 | ffi (>= 0.5.0) 55 | redis (3.2.2) 56 | rerun (0.11.0) 57 | listen (~> 3.0) 58 | rspec (3.4.0) 59 | rspec-core (~> 3.4.0) 60 | rspec-expectations (~> 3.4.0) 61 | rspec-mocks (~> 3.4.0) 62 | rspec-core (3.4.1) 63 | rspec-support (~> 3.4.0) 64 | rspec-expectations (3.4.0) 65 | diff-lcs (>= 1.2.0, < 2.0) 66 | rspec-support (~> 3.4.0) 67 | rspec-mocks (3.4.0) 68 | diff-lcs (>= 1.2.0, < 2.0) 69 | rspec-support (~> 3.4.0) 70 | rspec-support (3.4.1) 71 | safe_yaml (1.0.4) 72 | sawyer (0.6.0) 73 | addressable (~> 2.3.5) 74 | faraday (~> 0.8, < 0.10) 75 | sinatra (1.4.6) 76 | rack (~> 1.4) 77 | rack-protection (~> 1.4) 78 | tilt (>= 1.3, < 3) 79 | sinatra-redirect-with-flash (0.2.1) 80 | sinatra (>= 1.0.0) 81 | sinatra_auth_github (1.2.0) 82 | sinatra (~> 1.0) 83 | warden-github (~> 1.2.0) 84 | slop (3.6.0) 85 | thread_safe (0.3.5) 86 | tilt (2.0.1) 87 | tzinfo (1.2.2) 88 | thread_safe (~> 0.1) 89 | warden (1.2.4) 90 | rack (>= 1.0) 91 | warden-github (1.2.0) 92 | activesupport (> 3.0) 93 | octokit (> 2.1.0) 94 | warden (> 1.0) 95 | webmock (1.22.3) 96 | addressable (>= 2.3.6) 97 | crack (>= 0.3.2) 98 | hashdiff 99 | 100 | PLATFORMS 101 | ruby 102 | 103 | DEPENDENCIES 104 | dotenv 105 | moneta 106 | octokit 107 | pry 108 | rack-coffee 109 | rack-flash3 110 | rack-ssl-enforcer 111 | rack-test 112 | rake 113 | redis 114 | rerun 115 | rspec 116 | sinatra 117 | sinatra-redirect-with-flash 118 | sinatra_auth_github 119 | webmock 120 | 121 | BUNDLED WITH 122 | 1.10.6 123 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Ben Balter 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: bundle exec rackup config.ru -p $PORT 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ***Note: [this is now supported by GitHub natively](https://help.github.com/articles/adding-a-file-to-a-repository/).*** 2 | 3 | # GitHub Uploader 4 | 5 | A simple app to enable drag-and-drop uploading of binary and other assets to GitHub Repositories 6 | 7 | [![Build Status](https://travis-ci.org/benbalter/github-uploader.svg)](https://travis-ci.org/benbalter/github-uploader) 8 | 9 | ## Demo 10 | 11 | [Live Demo](https://github-uploader.herokuapp.com/) 12 | 13 | ## Usage 14 | 15 | 1. Select a repository 16 | 2. Navigate to the target directory 17 | 3. Drag and drop the file to upload 18 | 19 | ## Creating an OAuth application 20 | 21 | GitHub Uploader needs a GitHub OAUth application to run. You can create on [in your account or organization's settings](https://github.com/settings/applications/new). 22 | 23 | ## Deploying 24 | 25 | GitHub Uploader works well with Heroku or Cloud Foundry. Simply follow the platform's instructions to create a new application and push the repository. You'll need to set the following environmental variables: 26 | 27 | * `GITHUB_CLIENT_SECRET` 28 | * `GITHUB_CLIENT_ID` 29 | 30 | ## Running locally 31 | 32 | You can also run the server yourself. To do so: 33 | 34 | 1. `script/bootstrap` 35 | 2. Create [a new (development) OAuth application](https://github.com/settings/applications/new) and add the `GITHUB_CLIENT_SECRET` and `GITHUB_CLIENT_ID` to a `.env` file in the repository root 36 | 3. `script/server` 37 | 4. Open [`localhost:9292`](http://localhost:9292) in your browser 38 | 39 | ## Project Status 40 | 41 | Please note this project is a proof of concept, and should not be relied on for mission-critical workflows. 42 | 43 | ## Contributing 44 | 45 | 1. Fork the repository 46 | 2. Create a descriptively named feature branch 47 | 3. Make your changes 48 | 4. Submit a pull request 49 | 50 | ## License 51 | 52 | MIT 53 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | begin 2 | require 'rspec/core/rake_task' 3 | desc "Run specs" 4 | RSpec::Core::RakeTask.new do |t| 5 | t.pattern = 'spec/**/*_spec.rb' 6 | t.rspec_opts = ["--order", "rand", "--color"] 7 | end 8 | rescue LoadError 9 | end 10 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "github-uploader", 3 | "version": "0.0.0", 4 | "authors": [ 5 | "Ben Balter " 6 | ], 7 | "license": "MIT", 8 | "ignore": [ 9 | "**/.*", 10 | "node_modules", 11 | "bower_components", 12 | "lib/public/vendor", 13 | "test", 14 | "tests" 15 | ], 16 | "dependencies": { 17 | "bootstrap": "~3.1.1" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /config.ru: -------------------------------------------------------------------------------- 1 | require "./lib/github_uploader" 2 | run GitHubUploader::App 3 | -------------------------------------------------------------------------------- /lib/github_uploader.rb: -------------------------------------------------------------------------------- 1 | require 'octokit' 2 | require 'sinatra_auth_github' 3 | require 'dotenv' 4 | require 'open3' 5 | require 'json' 6 | require 'securerandom' 7 | require 'fileutils' 8 | require 'rack/coffee' 9 | require 'rack-flash' 10 | require 'sinatra/redirect_with_flash' 11 | require_relative "github_uploader/helpers" 12 | 13 | Dotenv.load 14 | 15 | module GitHubUploader 16 | class App < Sinatra::Base 17 | 18 | include GitHubUploader::Helpers 19 | 20 | configure :production do 21 | require 'rack-ssl-enforcer' 22 | use Rack::SslEnforcer 23 | end 24 | 25 | if ENV["REDIS_URL"] && !ENV["REDIS_URL"].to_s.empty? 26 | use Rack::Session::Moneta, store: :Redis, url: ENV["REDIS_URL"] 27 | else 28 | use Rack::Session::Cookie, { 29 | :http_only => true, 30 | :secret => ENV['SESSION_SECRET'] || SecureRandom.hex 31 | } 32 | end 33 | 34 | set :github_options, { :scopes => "repo" } 35 | ENV['WARDEN_GITHUB_VERIFIER_SECRET'] ||= SecureRandom.hex 36 | register Sinatra::Auth::Github 37 | 38 | configure do 39 | Octokit.auto_paginate = true 40 | end 41 | 42 | before do 43 | authenticate! 44 | end 45 | 46 | use Rack::Coffee, root: "#{root}/public", urls: '/assets/javascripts' 47 | use Rack::Flash 48 | helpers Sinatra::RedirectWithFlash 49 | 50 | get "/" do 51 | render_template :index, { :repositories => client.repositories } 52 | end 53 | 54 | get "/:user/:repo/?*" do 55 | render_template :tree, { 56 | :tree => tree(path), 57 | :nwo => nwo, 58 | :path => path, 59 | :repo => repo, 60 | :flash => flash 61 | } 62 | end 63 | 64 | post "/:user/:repo/?*" do 65 | params['path'] = params['doc'][:tempfile].path 66 | params['filename'] = File.basename params['doc'][:filename] 67 | 68 | url = "#{params[:user]}/#{params[:repo]}/#{path}" 69 | if process_upload 70 | redirect url, success: "\"#{params['filename']}\" uploaded successfully" 71 | else 72 | redirect url, error: "Upload failed" 73 | end 74 | end 75 | end 76 | end 77 | -------------------------------------------------------------------------------- /lib/github_uploader/helpers.rb: -------------------------------------------------------------------------------- 1 | module GitHubUploader 2 | module Helpers 3 | def root 4 | @root ||= File.expand_path "../", File.dirname(__FILE__) 5 | end 6 | 7 | def client 8 | @client ||= Octokit::Client.new :access_token => github_user.token 9 | end 10 | 11 | def repo 12 | @repo ||= client.repository "#{params[:user]}/#{params[:repo]}" 13 | end 14 | 15 | def nwo 16 | @nwo ||= "#{repo.owner.login}/#{repo.name}" 17 | end 18 | 19 | def render_template(template, locals) 20 | halt erb template, :layout => :layout, :locals => locals.merge(:template => template) 21 | end 22 | 23 | def tree(path=nil) 24 | client.contents nwo, path: path 25 | end 26 | 27 | def file_exists?(path) 28 | directory = File.dirname path 29 | filename = File.basename path 30 | 31 | tree(directory).any? { |object| object.name == filename } 32 | end 33 | 34 | def upload(upload_path, message, file) 35 | if file_exists?(upload_path) 36 | blob = client.contents nwo, path: upload_path 37 | client.update_contents nwo, upload_path, message, blob.sha, file: file 38 | else 39 | client.create_contents nwo, upload_path, message, file: file 40 | end 41 | end 42 | 43 | def path 44 | params[:splat].first.to_s 45 | end 46 | 47 | def process_upload 48 | upload "#{path}/#{params['filename']}", "Upload #{params['filename']}", params['path'] 49 | end 50 | end 51 | end 52 | -------------------------------------------------------------------------------- /lib/public/assets/javascripts/app.coffee: -------------------------------------------------------------------------------- 1 | $ -> 2 | $("#doc").change -> 3 | upload = $("#doc").val().split("\\").pop() 4 | 5 | abort = false 6 | $("#tree li").each (i,file) -> 7 | if $(file).text() == upload 8 | if $(file).hasClass "directory" 9 | alert "A directory with that name already exists." 10 | $("#doc").val('') 11 | return abort = true 12 | else if !confirm('File already exists. Overwrite?') 13 | $("#doc").val('') 14 | return abort = true 15 | 16 | $("#submit").click() 17 | -------------------------------------------------------------------------------- /lib/public/assets/style.css: -------------------------------------------------------------------------------- 1 | #doc { width: 100%; padding: 10px; border: 1px solid #ccc; line-height: 0; font-size: 1.5em; } 2 | #submit {margin-left: auto; margin-right: auto; margin-top: 25px; font-size: 1.2em; } 3 | #upload {margin-top: 50px; margin-bottom: 50px; } 4 | body { padding: 25px; } 5 | footer { margin: 10px; text-align: right; } 6 | #tree {margin-bottom: 25px; } 7 | -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap", 3 | "version": "3.1.1", 4 | "main": [ 5 | "./dist/css/bootstrap.css", 6 | "./dist/js/bootstrap.js", 7 | "./dist/fonts/glyphicons-halflings-regular.eot", 8 | "./dist/fonts/glyphicons-halflings-regular.svg", 9 | "./dist/fonts/glyphicons-halflings-regular.ttf", 10 | "./dist/fonts/glyphicons-halflings-regular.woff" 11 | ], 12 | "ignore": [ 13 | "**/.*", 14 | "_config.yml", 15 | "CNAME", 16 | "composer.json", 17 | "CONTRIBUTING.md", 18 | "docs", 19 | "js/tests" 20 | ], 21 | "dependencies": { 22 | "jquery": ">= 1.9.0" 23 | }, 24 | "homepage": "https://github.com/twbs/bootstrap", 25 | "_release": "3.1.1", 26 | "_resolution": { 27 | "type": "version", 28 | "tag": "v3.1.1", 29 | "commit": "a365d8689c3f3cee7f1acf86b61270ecca8e106d" 30 | }, 31 | "_source": "git://github.com/twbs/bootstrap.git", 32 | "_target": "~3.1.1", 33 | "_originalSource": "bootstrap" 34 | } -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/Gruntfile.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap's Gruntfile 3 | * http://getbootstrap.com 4 | * Copyright 2013-2014 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | */ 7 | 8 | module.exports = function (grunt) { 9 | 'use strict'; 10 | 11 | // Force use of Unix newlines 12 | grunt.util.linefeed = '\n'; 13 | 14 | RegExp.quote = function (string) { 15 | return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&'); 16 | }; 17 | 18 | var fs = require('fs'); 19 | var path = require('path'); 20 | var generateGlyphiconsData = require('./grunt/bs-glyphicons-data-generator.js'); 21 | var BsLessdocParser = require('./grunt/bs-lessdoc-parser.js'); 22 | var generateRawFilesJs = require('./grunt/bs-raw-files-generator.js'); 23 | var updateShrinkwrap = require('./grunt/shrinkwrap.js'); 24 | 25 | // Project configuration. 26 | grunt.initConfig({ 27 | 28 | // Metadata. 29 | pkg: grunt.file.readJSON('package.json'), 30 | banner: '/*!\n' + 31 | ' * Bootstrap v<%= pkg.version %> (<%= pkg.homepage %>)\n' + 32 | ' * Copyright 2011-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' + 33 | ' * Licensed under <%= pkg.license.type %> (<%= pkg.license.url %>)\n' + 34 | ' */\n', 35 | jqueryCheck: 'if (typeof jQuery === \'undefined\') { throw new Error(\'Bootstrap\\\'s JavaScript requires jQuery\') }\n\n', 36 | 37 | // Task configuration. 38 | clean: { 39 | dist: ['dist', 'docs/dist'] 40 | }, 41 | 42 | jshint: { 43 | options: { 44 | jshintrc: 'js/.jshintrc' 45 | }, 46 | grunt: { 47 | options: { 48 | jshintrc: 'grunt/.jshintrc' 49 | }, 50 | src: ['Gruntfile.js', 'grunt/*.js'] 51 | }, 52 | src: { 53 | src: 'js/*.js' 54 | }, 55 | test: { 56 | src: 'js/tests/unit/*.js' 57 | }, 58 | assets: { 59 | src: ['docs/assets/js/application.js', 'docs/assets/js/customizer.js'] 60 | } 61 | }, 62 | 63 | jscs: { 64 | options: { 65 | config: 'js/.jscs.json', 66 | }, 67 | grunt: { 68 | src: ['Gruntfile.js', 'grunt/*.js'] 69 | }, 70 | src: { 71 | src: 'js/*.js' 72 | }, 73 | test: { 74 | src: 'js/tests/unit/*.js' 75 | }, 76 | assets: { 77 | src: ['docs/assets/js/application.js', 'docs/assets/js/customizer.js'] 78 | } 79 | }, 80 | 81 | csslint: { 82 | options: { 83 | csslintrc: 'less/.csslintrc' 84 | }, 85 | src: [ 86 | 'dist/css/bootstrap.css', 87 | 'dist/css/bootstrap-theme.css', 88 | 'docs/assets/css/docs.css', 89 | 'docs/examples/**/*.css' 90 | ] 91 | }, 92 | 93 | concat: { 94 | options: { 95 | banner: '<%= banner %>\n<%= jqueryCheck %>', 96 | stripBanners: false 97 | }, 98 | bootstrap: { 99 | src: [ 100 | 'js/transition.js', 101 | 'js/alert.js', 102 | 'js/button.js', 103 | 'js/carousel.js', 104 | 'js/collapse.js', 105 | 'js/dropdown.js', 106 | 'js/modal.js', 107 | 'js/tooltip.js', 108 | 'js/popover.js', 109 | 'js/scrollspy.js', 110 | 'js/tab.js', 111 | 'js/affix.js' 112 | ], 113 | dest: 'dist/js/<%= pkg.name %>.js' 114 | } 115 | }, 116 | 117 | uglify: { 118 | options: { 119 | report: 'min' 120 | }, 121 | bootstrap: { 122 | options: { 123 | banner: '<%= banner %>' 124 | }, 125 | src: '<%= concat.bootstrap.dest %>', 126 | dest: 'dist/js/<%= pkg.name %>.min.js' 127 | }, 128 | customize: { 129 | options: { 130 | preserveComments: 'some' 131 | }, 132 | src: [ 133 | 'docs/assets/js/vendor/less.min.js', 134 | 'docs/assets/js/vendor/jszip.min.js', 135 | 'docs/assets/js/vendor/uglify.min.js', 136 | 'docs/assets/js/vendor/blob.js', 137 | 'docs/assets/js/vendor/filesaver.js', 138 | 'docs/assets/js/raw-files.min.js', 139 | 'docs/assets/js/customizer.js' 140 | ], 141 | dest: 'docs/assets/js/customize.min.js' 142 | }, 143 | docsJs: { 144 | options: { 145 | preserveComments: 'some' 146 | }, 147 | src: [ 148 | 'docs/assets/js/vendor/holder.js', 149 | 'docs/assets/js/application.js' 150 | ], 151 | dest: 'docs/assets/js/docs.min.js' 152 | } 153 | }, 154 | 155 | less: { 156 | compileCore: { 157 | options: { 158 | strictMath: true, 159 | sourceMap: true, 160 | outputSourceFiles: true, 161 | sourceMapURL: '<%= pkg.name %>.css.map', 162 | sourceMapFilename: 'dist/css/<%= pkg.name %>.css.map' 163 | }, 164 | files: { 165 | 'dist/css/<%= pkg.name %>.css': 'less/bootstrap.less' 166 | } 167 | }, 168 | compileTheme: { 169 | options: { 170 | strictMath: true, 171 | sourceMap: true, 172 | outputSourceFiles: true, 173 | sourceMapURL: '<%= pkg.name %>-theme.css.map', 174 | sourceMapFilename: 'dist/css/<%= pkg.name %>-theme.css.map' 175 | }, 176 | files: { 177 | 'dist/css/<%= pkg.name %>-theme.css': 'less/theme.less' 178 | } 179 | }, 180 | minify: { 181 | options: { 182 | cleancss: true, 183 | report: 'min' 184 | }, 185 | files: { 186 | 'dist/css/<%= pkg.name %>.min.css': 'dist/css/<%= pkg.name %>.css', 187 | 'dist/css/<%= pkg.name %>-theme.min.css': 'dist/css/<%= pkg.name %>-theme.css' 188 | } 189 | } 190 | }, 191 | 192 | cssmin: { 193 | compress: { 194 | options: { 195 | keepSpecialComments: '*', 196 | noAdvanced: true, // turn advanced optimizations off until the issue is fixed in clean-css 197 | report: 'min', 198 | selectorsMergeMode: 'ie8' 199 | }, 200 | src: [ 201 | 'docs/assets/css/docs.css', 202 | 'docs/assets/css/pygments-manni.css' 203 | ], 204 | dest: 'docs/assets/css/docs.min.css' 205 | } 206 | }, 207 | 208 | usebanner: { 209 | dist: { 210 | options: { 211 | position: 'top', 212 | banner: '<%= banner %>' 213 | }, 214 | files: { 215 | src: [ 216 | 'dist/css/<%= pkg.name %>.css', 217 | 'dist/css/<%= pkg.name %>.min.css', 218 | 'dist/css/<%= pkg.name %>-theme.css', 219 | 'dist/css/<%= pkg.name %>-theme.min.css' 220 | ] 221 | } 222 | } 223 | }, 224 | 225 | csscomb: { 226 | options: { 227 | config: 'less/.csscomb.json' 228 | }, 229 | dist: { 230 | files: { 231 | 'dist/css/<%= pkg.name %>.css': 'dist/css/<%= pkg.name %>.css', 232 | 'dist/css/<%= pkg.name %>-theme.css': 'dist/css/<%= pkg.name %>-theme.css' 233 | } 234 | }, 235 | examples: { 236 | expand: true, 237 | cwd: 'docs/examples/', 238 | src: ['**/*.css'], 239 | dest: 'docs/examples/' 240 | } 241 | }, 242 | 243 | copy: { 244 | fonts: { 245 | expand: true, 246 | src: 'fonts/*', 247 | dest: 'dist/' 248 | }, 249 | docs: { 250 | expand: true, 251 | cwd: './dist', 252 | src: [ 253 | '{css,js}/*.min.*', 254 | 'css/*.map', 255 | 'fonts/*' 256 | ], 257 | dest: 'docs/dist' 258 | } 259 | }, 260 | 261 | qunit: { 262 | options: { 263 | inject: 'js/tests/unit/phantom.js' 264 | }, 265 | files: 'js/tests/index.html' 266 | }, 267 | 268 | connect: { 269 | server: { 270 | options: { 271 | port: 3000, 272 | base: '.' 273 | } 274 | } 275 | }, 276 | 277 | jekyll: { 278 | docs: {} 279 | }, 280 | 281 | jade: { 282 | compile: { 283 | options: { 284 | pretty: true, 285 | data: function () { 286 | var filePath = path.join(__dirname, 'less/variables.less'); 287 | var fileContent = fs.readFileSync(filePath, {encoding: 'utf8'}); 288 | var parser = new BsLessdocParser(fileContent); 289 | return {sections: parser.parseFile()}; 290 | } 291 | }, 292 | files: { 293 | 'docs/_includes/customizer-variables.html': 'docs/jade/customizer-variables.jade', 294 | 'docs/_includes/nav-customize.html': 'docs/jade/customizer-nav.jade' 295 | } 296 | } 297 | }, 298 | 299 | validation: { 300 | options: { 301 | charset: 'utf-8', 302 | doctype: 'HTML5', 303 | failHard: true, 304 | reset: true, 305 | relaxerror: [ 306 | 'Bad value X-UA-Compatible for attribute http-equiv on element meta.', 307 | 'Element img is missing required attribute src.' 308 | ] 309 | }, 310 | files: { 311 | src: '_gh_pages/**/*.html' 312 | } 313 | }, 314 | 315 | watch: { 316 | src: { 317 | files: '<%= jshint.src.src %>', 318 | tasks: ['jshint:src', 'qunit'] 319 | }, 320 | test: { 321 | files: '<%= jshint.test.src %>', 322 | tasks: ['jshint:test', 'qunit'] 323 | }, 324 | less: { 325 | files: 'less/*.less', 326 | tasks: 'less' 327 | } 328 | }, 329 | 330 | sed: { 331 | versionNumber: { 332 | pattern: (function () { 333 | var old = grunt.option('oldver'); 334 | return old ? RegExp.quote(old) : old; 335 | })(), 336 | replacement: grunt.option('newver'), 337 | recursive: true 338 | } 339 | }, 340 | 341 | 'saucelabs-qunit': { 342 | all: { 343 | options: { 344 | build: process.env.TRAVIS_JOB_ID, 345 | concurrency: 10, 346 | urls: ['http://127.0.0.1:3000/js/tests/index.html'], 347 | browsers: grunt.file.readYAML('test-infra/sauce_browsers.yml') 348 | } 349 | } 350 | }, 351 | 352 | exec: { 353 | npmUpdate: { 354 | command: 'npm update' 355 | }, 356 | npmShrinkWrap: { 357 | command: 'npm shrinkwrap --dev' 358 | } 359 | } 360 | }); 361 | 362 | 363 | // These plugins provide necessary tasks. 364 | require('load-grunt-tasks')(grunt, {scope: 'devDependencies'}); 365 | 366 | // Docs HTML validation task 367 | grunt.registerTask('validate-html', ['jekyll', 'validation']); 368 | 369 | // Test task. 370 | var testSubtasks = []; 371 | // Skip core tests if running a different subset of the test suite 372 | if (!process.env.TWBS_TEST || process.env.TWBS_TEST === 'core') { 373 | testSubtasks = testSubtasks.concat(['dist-css', 'csslint', 'jshint', 'jscs', 'qunit', 'build-customizer-html']); 374 | } 375 | // Skip HTML validation if running a different subset of the test suite 376 | if (!process.env.TWBS_TEST || process.env.TWBS_TEST === 'validate-html') { 377 | testSubtasks.push('validate-html'); 378 | } 379 | // Only run Sauce Labs tests if there's a Sauce access key 380 | if (typeof process.env.SAUCE_ACCESS_KEY !== 'undefined' && 381 | // Skip Sauce if running a different subset of the test suite 382 | (!process.env.TWBS_TEST || process.env.TWBS_TEST === 'sauce-js-unit')) { 383 | testSubtasks.push('connect'); 384 | testSubtasks.push('saucelabs-qunit'); 385 | } 386 | grunt.registerTask('test', testSubtasks); 387 | 388 | // JS distribution task. 389 | grunt.registerTask('dist-js', ['concat', 'uglify']); 390 | 391 | // CSS distribution task. 392 | grunt.registerTask('dist-css', ['less', 'cssmin', 'csscomb', 'usebanner']); 393 | 394 | // Docs distribution task. 395 | grunt.registerTask('dist-docs', 'copy:docs'); 396 | 397 | // Full distribution task. 398 | grunt.registerTask('dist', ['clean', 'dist-css', 'copy:fonts', 'dist-js', 'dist-docs']); 399 | 400 | // Default task. 401 | grunt.registerTask('default', ['test', 'dist', 'build-glyphicons-data', 'build-customizer', 'update-shrinkwrap']); 402 | 403 | // Version numbering task. 404 | // grunt change-version-number --oldver=A.B.C --newver=X.Y.Z 405 | // This can be overzealous, so its changes should always be manually reviewed! 406 | grunt.registerTask('change-version-number', 'sed'); 407 | 408 | grunt.registerTask('build-glyphicons-data', generateGlyphiconsData); 409 | 410 | // task for building customizer 411 | grunt.registerTask('build-customizer', ['build-customizer-html', 'build-raw-files']); 412 | grunt.registerTask('build-customizer-html', 'jade'); 413 | grunt.registerTask('build-raw-files', 'Add scripts/less files to customizer.', function () { 414 | var banner = grunt.template.process('<%= banner %>'); 415 | generateRawFilesJs(banner); 416 | }); 417 | 418 | // Task for updating the npm packages used by the Travis build. 419 | grunt.registerTask('update-shrinkwrap', ['exec:npmUpdate', 'exec:npmShrinkWrap', '_update-shrinkwrap']); 420 | grunt.registerTask('_update-shrinkwrap', function () { updateShrinkwrap.call(this, grunt); }); 421 | }; 422 | -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2011-2014 Twitter, Inc 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/README.md: -------------------------------------------------------------------------------- 1 | # [Bootstrap](http://getbootstrap.com) [![Bower version](https://badge.fury.io/bo/bootstrap.png)](http://badge.fury.io/bo/bootstrap) [![Build Status](https://secure.travis-ci.org/twbs/bootstrap.png)](http://travis-ci.org/twbs/bootstrap) [![devDependency Status](https://david-dm.org/twbs/bootstrap/dev-status.png?theme=shields.io)](https://david-dm.org/twbs/bootstrap#info=devDependencies) 2 | [![Selenium Test Status](https://saucelabs.com/browser-matrix/bootstrap.svg)](https://saucelabs.com/u/bootstrap) 3 | 4 | Bootstrap is a sleek, intuitive, and powerful front-end framework for faster and easier web development, created by [Mark Otto](http://twitter.com/mdo) and [Jacob Thornton](http://twitter.com/fat), and maintained by the [core team](https://github.com/twbs?tab=members) with the massive support and involvement of the community. 5 | 6 | To get started, check out ! 7 | 8 | ## Table of contents 9 | 10 | - [Quick start](#quick-start) 11 | - [Bugs and feature requests](#bugs-and-feature-requests) 12 | - [Documentation](#documentation) 13 | - [Compiling CSS and JavaScript](#compiling-css-and-javascript) 14 | - [Contributing](#contributing) 15 | - [Community](#community) 16 | - [Versioning](#versioning) 17 | - [Authors](#authors) 18 | - [Copyright and license](#copyright-and-license) 19 | 20 | ## Quick start 21 | 22 | Three quick start options are available: 23 | 24 | - [Download the latest release](https://github.com/twbs/bootstrap/archive/v3.1.1.zip). 25 | - Clone the repo: `git clone https://github.com/twbs/bootstrap.git`. 26 | - Install with [Bower](http://bower.io): `bower install bootstrap`. 27 | 28 | Read the [Getting Started page](http://getbootstrap.com/getting-started/) for information on the framework contents, templates and examples, and more. 29 | 30 | ### What's included 31 | 32 | Within the download you'll find the following directories and files, logically grouping common assets and providing both compiled and minified variations. You'll see something like this: 33 | 34 | ``` 35 | bootstrap/ 36 | ├── css/ 37 | │ ├── bootstrap.css 38 | │ ├── bootstrap.min.css 39 | │ ├── bootstrap-theme.css 40 | │ └── bootstrap-theme.min.css 41 | ├── js/ 42 | │ ├── bootstrap.js 43 | │ └── bootstrap.min.js 44 | └── fonts/ 45 | ├── glyphicons-halflings-regular.eot 46 | ├── glyphicons-halflings-regular.svg 47 | ├── glyphicons-halflings-regular.ttf 48 | └── glyphicons-halflings-regular.woff 49 | ``` 50 | 51 | We provide compiled CSS and JS (`bootstrap.*`), as well as compiled and minified CSS and JS (`bootstrap.min.*`). Fonts from Glyphicons are included, as is the optional Bootstrap theme. 52 | 53 | 54 | 55 | ## Bugs and feature requests 56 | 57 | Have a bug or a feature request? Please first read the [issue guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md#using-the-issue-tracker) and search for existing and closed issues. If your problem or idea is not addressed yet, [please open a new issue](https://github.com/twbs/bootstrap/issues/new). 58 | 59 | 60 | ## Documentation 61 | 62 | Bootstrap's documentation, included in this repo in the root directory, is built with [Jekyll](http://jekyllrb.com) and publicly hosted on GitHub Pages at . The docs may also be run locally. 63 | 64 | ### Running documentation locally 65 | 66 | 1. If necessary, [install Jekyll](http://jekyllrb.com/docs/installation) (requires v1.x). 67 | - **Windows users:** Read [this unofficial guide](https://github.com/juthilo/run-jekyll-on-windows/) to get Jekyll up and running without problems. We use Pygments for syntax highlighting, so make sure to read the sections on installing Python and Pygments. 68 | 2. From the root `/bootstrap` directory, run `jekyll serve` in the command line. 69 | - **Windows users:** While we use Jekyll's `encoding` setting, you might still need to change the command prompt's character encoding ([code page](http://en.wikipedia.org/wiki/Windows_code_page)) to UTF-8 so Jekyll runs without errors. For Ruby 2.0.0, run `chcp 65001` first. For Ruby 1.9.3, you can alternatively do `SET LANG=en_EN.UTF-8`. 70 | 3. Open in your browser, and voilà. 71 | 72 | Learn more about using Jekyll by reading its [documentation](http://jekyllrb.com/docs/home/). 73 | 74 | ### Documentation for previous releases 75 | 76 | Documentation for v2.3.2 has been made available for the time being at while folks transition to Bootstrap 3. 77 | 78 | [Previous releases](https://github.com/twbs/bootstrap/releases) and their documentation are also available for download. 79 | 80 | 81 | 82 | ## Compiling CSS and JavaScript 83 | 84 | Bootstrap uses [Grunt](http://gruntjs.com/) with convenient methods for working with the framework. It's how we compile our code, run tests, and more. To use it, install the required dependencies as directed and then run some Grunt commands. 85 | 86 | ### Install Grunt 87 | 88 | From the command line: 89 | 90 | 1. Install `grunt-cli` globally with `npm install -g grunt-cli`. 91 | 2. Navigate to the root `/bootstrap` directory, then run `npm install`. npm will look at [package.json](https://github.com/twbs/bootstrap/blob/master/package.json) and automatically install the necessary local dependencies listed there. 92 | 93 | When completed, you'll be able to run the various Grunt commands provided from the command line. 94 | 95 | **Unfamiliar with `npm`? Don't have node installed?** That's a-okay. npm stands for [node packaged modules](http://npmjs.org/) and is a way to manage development dependencies through node.js. [Download and install node.js](http://nodejs.org/download/) before proceeding. 96 | 97 | ### Available Grunt commands 98 | 99 | #### Build - `grunt` 100 | Run `grunt` to run tests locally and compile the CSS and JavaScript into `/dist`. **Uses [Less](http://lesscss.org/) and [UglifyJS](http://lisperator.net/uglifyjs/).** 101 | 102 | #### Only compile CSS and JavaScript - `grunt dist` 103 | `grunt dist` creates the `/dist` directory with compiled files. **Uses [Less](http://lesscss.org/) and [UglifyJS](http://lisperator.net/uglifyjs/).** 104 | 105 | #### Tests - `grunt test` 106 | Runs [JSHint](http://jshint.com) and [QUnit](http://qunitjs.com/) tests headlessly in [PhantomJS](http://phantomjs.org/) (used for CI). 107 | 108 | #### Watch - `grunt watch` 109 | This is a convenience method for watching just Less files and automatically building them whenever you save. 110 | 111 | ### Troubleshooting dependencies 112 | 113 | Should you encounter problems with installing dependencies or running Grunt commands, uninstall all previous dependency versions (global and local). Then, rerun `npm install`. 114 | 115 | 116 | 117 | ## Contributing 118 | 119 | Please read through our [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development. 120 | 121 | Moreover, if your pull request contains JavaScript patches or features, you must include relevant unit tests. All HTML and CSS should conform to the [Code Guide](http://github.com/mdo/code-guide), maintained by [Mark Otto](http://github.com/mdo). 122 | 123 | Editor preferences are available in the [editor config](https://github.com/twbs/bootstrap/blob/master/.editorconfig) for easy use in common text editors. Read more and download plugins at . 124 | 125 | 126 | 127 | ## Community 128 | 129 | Keep track of development and community news. 130 | 131 | - Follow [@twbootstrap on Twitter](http://twitter.com/twbootstrap). 132 | - Read and subscribe to [The Official Bootstrap Blog](http://blog.getbootstrap.com). 133 | - Chat with fellow Bootstrappers in IRC. On the `irc.freenode.net` server, in the `##twitter-bootstrap` channel. 134 | - Implementation help may be found at Stack Overflow (tagged [`twitter-bootstrap-3`](http://stackoverflow.com/questions/tagged/twitter-bootstrap-3)). 135 | 136 | 137 | 138 | 139 | ## Versioning 140 | 141 | For transparency into our release cycle and in striving to maintain backward compatibility, Bootstrap is maintained under the Semantic Versioning guidelines. Sometimes we screw up, but we'll adhere to these rules whenever possible. 142 | 143 | Releases will be numbered with the following format: 144 | 145 | `..` 146 | 147 | And constructed with the following guidelines: 148 | 149 | - Breaking backward compatibility **bumps the major** while resetting minor and patch 150 | - New additions without breaking backward compatibility **bumps the minor** while resetting the patch 151 | - Bug fixes and misc changes **bumps only the patch** 152 | 153 | For more information on SemVer, please visit . 154 | 155 | 156 | 157 | ## Authors 158 | 159 | **Mark Otto** 160 | 161 | - 162 | - 163 | 164 | **Jacob Thornton** 165 | 166 | - 167 | - 168 | 169 | 170 | 171 | ## Copyright and license 172 | 173 | Code and documentation copyright 2011-2014 Twitter, Inc. Code released under [the MIT license](LICENSE). Docs released under [Creative Commons](docs/LICENSE). 174 | -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap", 3 | "version": "3.1.1", 4 | "main": [ 5 | "./dist/css/bootstrap.css", 6 | "./dist/js/bootstrap.js", 7 | "./dist/fonts/glyphicons-halflings-regular.eot", 8 | "./dist/fonts/glyphicons-halflings-regular.svg", 9 | "./dist/fonts/glyphicons-halflings-regular.ttf", 10 | "./dist/fonts/glyphicons-halflings-regular.woff" 11 | ], 12 | "ignore": [ 13 | "**/.*", 14 | "_config.yml", 15 | "CNAME", 16 | "composer.json", 17 | "CONTRIBUTING.md", 18 | "docs", 19 | "js/tests" 20 | ], 21 | "dependencies": { 22 | "jquery": ">= 1.9.0" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/dist/css/bootstrap-theme.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.1.1 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | .btn-default, 8 | .btn-primary, 9 | .btn-success, 10 | .btn-info, 11 | .btn-warning, 12 | .btn-danger { 13 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); 14 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 15 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 16 | } 17 | .btn-default:active, 18 | .btn-primary:active, 19 | .btn-success:active, 20 | .btn-info:active, 21 | .btn-warning:active, 22 | .btn-danger:active, 23 | .btn-default.active, 24 | .btn-primary.active, 25 | .btn-success.active, 26 | .btn-info.active, 27 | .btn-warning.active, 28 | .btn-danger.active { 29 | -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 30 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 31 | } 32 | .btn:active, 33 | .btn.active { 34 | background-image: none; 35 | } 36 | .btn-default { 37 | text-shadow: 0 1px 0 #fff; 38 | background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); 39 | background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); 40 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); 41 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 42 | background-repeat: repeat-x; 43 | border-color: #dbdbdb; 44 | border-color: #ccc; 45 | } 46 | .btn-default:hover, 47 | .btn-default:focus { 48 | background-color: #e0e0e0; 49 | background-position: 0 -15px; 50 | } 51 | .btn-default:active, 52 | .btn-default.active { 53 | background-color: #e0e0e0; 54 | border-color: #dbdbdb; 55 | } 56 | .btn-primary { 57 | background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); 58 | background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); 59 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); 60 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 61 | background-repeat: repeat-x; 62 | border-color: #2b669a; 63 | } 64 | .btn-primary:hover, 65 | .btn-primary:focus { 66 | background-color: #2d6ca2; 67 | background-position: 0 -15px; 68 | } 69 | .btn-primary:active, 70 | .btn-primary.active { 71 | background-color: #2d6ca2; 72 | border-color: #2b669a; 73 | } 74 | .btn-success { 75 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); 76 | background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); 77 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); 78 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 79 | background-repeat: repeat-x; 80 | border-color: #3e8f3e; 81 | } 82 | .btn-success:hover, 83 | .btn-success:focus { 84 | background-color: #419641; 85 | background-position: 0 -15px; 86 | } 87 | .btn-success:active, 88 | .btn-success.active { 89 | background-color: #419641; 90 | border-color: #3e8f3e; 91 | } 92 | .btn-info { 93 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 94 | background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); 95 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); 96 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 97 | background-repeat: repeat-x; 98 | border-color: #28a4c9; 99 | } 100 | .btn-info:hover, 101 | .btn-info:focus { 102 | background-color: #2aabd2; 103 | background-position: 0 -15px; 104 | } 105 | .btn-info:active, 106 | .btn-info.active { 107 | background-color: #2aabd2; 108 | border-color: #28a4c9; 109 | } 110 | .btn-warning { 111 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 112 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); 113 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); 114 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 115 | background-repeat: repeat-x; 116 | border-color: #e38d13; 117 | } 118 | .btn-warning:hover, 119 | .btn-warning:focus { 120 | background-color: #eb9316; 121 | background-position: 0 -15px; 122 | } 123 | .btn-warning:active, 124 | .btn-warning.active { 125 | background-color: #eb9316; 126 | border-color: #e38d13; 127 | } 128 | .btn-danger { 129 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 130 | background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); 131 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); 132 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 133 | background-repeat: repeat-x; 134 | border-color: #b92c28; 135 | } 136 | .btn-danger:hover, 137 | .btn-danger:focus { 138 | background-color: #c12e2a; 139 | background-position: 0 -15px; 140 | } 141 | .btn-danger:active, 142 | .btn-danger.active { 143 | background-color: #c12e2a; 144 | border-color: #b92c28; 145 | } 146 | .thumbnail, 147 | .img-thumbnail { 148 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 149 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 150 | } 151 | .dropdown-menu > li > a:hover, 152 | .dropdown-menu > li > a:focus { 153 | background-color: #e8e8e8; 154 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 155 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 156 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 157 | background-repeat: repeat-x; 158 | } 159 | .dropdown-menu > .active > a, 160 | .dropdown-menu > .active > a:hover, 161 | .dropdown-menu > .active > a:focus { 162 | background-color: #357ebd; 163 | background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); 164 | background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); 165 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); 166 | background-repeat: repeat-x; 167 | } 168 | .navbar-default { 169 | background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); 170 | background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); 171 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); 172 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 173 | background-repeat: repeat-x; 174 | border-radius: 4px; 175 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 176 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 177 | } 178 | .navbar-default .navbar-nav > .active > a { 179 | background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); 180 | background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); 181 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); 182 | background-repeat: repeat-x; 183 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 184 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 185 | } 186 | .navbar-brand, 187 | .navbar-nav > li > a { 188 | text-shadow: 0 1px 0 rgba(255, 255, 255, .25); 189 | } 190 | .navbar-inverse { 191 | background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); 192 | background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); 193 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); 194 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 195 | background-repeat: repeat-x; 196 | } 197 | .navbar-inverse .navbar-nav > .active > a { 198 | background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%); 199 | background-image: linear-gradient(to bottom, #222 0%, #282828 100%); 200 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); 201 | background-repeat: repeat-x; 202 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 203 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 204 | } 205 | .navbar-inverse .navbar-brand, 206 | .navbar-inverse .navbar-nav > li > a { 207 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); 208 | } 209 | .navbar-static-top, 210 | .navbar-fixed-top, 211 | .navbar-fixed-bottom { 212 | border-radius: 0; 213 | } 214 | .alert { 215 | text-shadow: 0 1px 0 rgba(255, 255, 255, .2); 216 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 217 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 218 | } 219 | .alert-success { 220 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 221 | background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); 222 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); 223 | background-repeat: repeat-x; 224 | border-color: #b2dba1; 225 | } 226 | .alert-info { 227 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 228 | background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); 229 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); 230 | background-repeat: repeat-x; 231 | border-color: #9acfea; 232 | } 233 | .alert-warning { 234 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 235 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); 236 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); 237 | background-repeat: repeat-x; 238 | border-color: #f5e79e; 239 | } 240 | .alert-danger { 241 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 242 | background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); 243 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); 244 | background-repeat: repeat-x; 245 | border-color: #dca7a7; 246 | } 247 | .progress { 248 | background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 249 | background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); 250 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); 251 | background-repeat: repeat-x; 252 | } 253 | .progress-bar { 254 | background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); 255 | background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); 256 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); 257 | background-repeat: repeat-x; 258 | } 259 | .progress-bar-success { 260 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); 261 | background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); 262 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); 263 | background-repeat: repeat-x; 264 | } 265 | .progress-bar-info { 266 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 267 | background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); 268 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); 269 | background-repeat: repeat-x; 270 | } 271 | .progress-bar-warning { 272 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 273 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); 274 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); 275 | background-repeat: repeat-x; 276 | } 277 | .progress-bar-danger { 278 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); 279 | background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); 280 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); 281 | background-repeat: repeat-x; 282 | } 283 | .list-group { 284 | border-radius: 4px; 285 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 286 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 287 | } 288 | .list-group-item.active, 289 | .list-group-item.active:hover, 290 | .list-group-item.active:focus { 291 | text-shadow: 0 -1px 0 #3071a9; 292 | background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); 293 | background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); 294 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); 295 | background-repeat: repeat-x; 296 | border-color: #3278b3; 297 | } 298 | .panel { 299 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 300 | box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 301 | } 302 | .panel-default > .panel-heading { 303 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 304 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 305 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 306 | background-repeat: repeat-x; 307 | } 308 | .panel-primary > .panel-heading { 309 | background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); 310 | background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); 311 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); 312 | background-repeat: repeat-x; 313 | } 314 | .panel-success > .panel-heading { 315 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 316 | background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); 317 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); 318 | background-repeat: repeat-x; 319 | } 320 | .panel-info > .panel-heading { 321 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 322 | background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); 323 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); 324 | background-repeat: repeat-x; 325 | } 326 | .panel-warning > .panel-heading { 327 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 328 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); 329 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); 330 | background-repeat: repeat-x; 331 | } 332 | .panel-danger > .panel-heading { 333 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 334 | background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); 335 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); 336 | background-repeat: repeat-x; 337 | } 338 | .well { 339 | background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 340 | background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); 341 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); 342 | background-repeat: repeat-x; 343 | border-color: #dcdcdc; 344 | -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 345 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 346 | } 347 | /*# sourceMappingURL=bootstrap-theme.css.map */ 348 | -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/dist/css/bootstrap-theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.1.1 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | .btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:active,.btn.active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-color:#357ebd}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);border-color:#3278b3}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/dist/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benbalter/github-uploader/fad9a4883826d04295d9dde39c6c7211f4e91efe/lib/public/vendor/bootstrap/dist/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benbalter/github-uploader/fad9a4883826d04295d9dde39c6c7211f4e91efe/lib/public/vendor/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/dist/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benbalter/github-uploader/fad9a4883826d04295d9dde39c6c7211f4e91efe/lib/public/vendor/bootstrap/dist/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/dist/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.1.1 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript 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]};return!1}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),this.isLoading=!1};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",f.resetText||d.data("resetText",d[e]()),d[e](f[b]||this.options[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},b.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&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.bs.carousel",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&&(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]()}if(e.hasClass("active"))return this.sliding=!1;var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});return this.$element.trigger(j),j.isDefaultPrevented()?void 0:(this.sliding=!0,f&&this.pause(),this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")?(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.bs.carousel")},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")),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("collapse 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?void this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350):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&&f.toggle&&"show"==c&&(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(b){a(d).remove(),a(e).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.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){"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?"string"==typeof c?"html":"append":"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||"destroy"!=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(a(c).is("body")?window: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=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[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);if(g&&b<=e[0])return g!=(a=f[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).parentsUntil(this.options.target,".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.bs.scrollspy")};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=this.pinnedOffset=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(b.RESET).addClass("affix");var a=this.$window.scrollTop(),c=this.$element.offset();return this.pinnedOffset=c.top-a},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;"top"==this.affixed&&(e.top+=d),"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));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;if(this.affixed!==i){this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(b.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:c-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); -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benbalter/github-uploader/fad9a4883826d04295d9dde39c6c7211f4e91efe/lib/public/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benbalter/github-uploader/fad9a4883826d04295d9dde39c6c7211f4e91efe/lib/public/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benbalter/github-uploader/fad9a4883826d04295d9dde39c6c7211f4e91efe/lib/public/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/js/affix.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: affix.js v3.1.1 3 | * http://getbootstrap.com/javascript/#affix 4 | * ======================================================================== 5 | * Copyright 2011-2014 Twitter, Inc. 6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 7 | * ======================================================================== */ 8 | 9 | 10 | +function ($) { 11 | 'use strict'; 12 | 13 | // AFFIX CLASS DEFINITION 14 | // ====================== 15 | 16 | var Affix = function (element, options) { 17 | this.options = $.extend({}, Affix.DEFAULTS, options) 18 | this.$window = $(window) 19 | .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) 20 | .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) 21 | 22 | this.$element = $(element) 23 | this.affixed = 24 | this.unpin = 25 | this.pinnedOffset = null 26 | 27 | this.checkPosition() 28 | } 29 | 30 | Affix.RESET = 'affix affix-top affix-bottom' 31 | 32 | Affix.DEFAULTS = { 33 | offset: 0 34 | } 35 | 36 | Affix.prototype.getPinnedOffset = function () { 37 | if (this.pinnedOffset) return this.pinnedOffset 38 | this.$element.removeClass(Affix.RESET).addClass('affix') 39 | var scrollTop = this.$window.scrollTop() 40 | var position = this.$element.offset() 41 | return (this.pinnedOffset = position.top - scrollTop) 42 | } 43 | 44 | Affix.prototype.checkPositionWithEventLoop = function () { 45 | setTimeout($.proxy(this.checkPosition, this), 1) 46 | } 47 | 48 | Affix.prototype.checkPosition = function () { 49 | if (!this.$element.is(':visible')) return 50 | 51 | var scrollHeight = $(document).height() 52 | var scrollTop = this.$window.scrollTop() 53 | var position = this.$element.offset() 54 | var offset = this.options.offset 55 | var offsetTop = offset.top 56 | var offsetBottom = offset.bottom 57 | 58 | if (this.affixed == 'top') position.top += scrollTop 59 | 60 | if (typeof offset != 'object') offsetBottom = offsetTop = offset 61 | if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) 62 | if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) 63 | 64 | var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false : 65 | offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' : 66 | offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false 67 | 68 | if (this.affixed === affix) return 69 | if (this.unpin) this.$element.css('top', '') 70 | 71 | var affixType = 'affix' + (affix ? '-' + affix : '') 72 | var e = $.Event(affixType + '.bs.affix') 73 | 74 | this.$element.trigger(e) 75 | 76 | if (e.isDefaultPrevented()) return 77 | 78 | this.affixed = affix 79 | this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null 80 | 81 | this.$element 82 | .removeClass(Affix.RESET) 83 | .addClass(affixType) 84 | .trigger($.Event(affixType.replace('affix', 'affixed'))) 85 | 86 | if (affix == 'bottom') { 87 | this.$element.offset({ top: scrollHeight - offsetBottom - this.$element.height() }) 88 | } 89 | } 90 | 91 | 92 | // AFFIX PLUGIN DEFINITION 93 | // ======================= 94 | 95 | var old = $.fn.affix 96 | 97 | $.fn.affix = function (option) { 98 | return this.each(function () { 99 | var $this = $(this) 100 | var data = $this.data('bs.affix') 101 | var options = typeof option == 'object' && option 102 | 103 | if (!data) $this.data('bs.affix', (data = new Affix(this, options))) 104 | if (typeof option == 'string') data[option]() 105 | }) 106 | } 107 | 108 | $.fn.affix.Constructor = Affix 109 | 110 | 111 | // AFFIX NO CONFLICT 112 | // ================= 113 | 114 | $.fn.affix.noConflict = function () { 115 | $.fn.affix = old 116 | return this 117 | } 118 | 119 | 120 | // AFFIX DATA-API 121 | // ============== 122 | 123 | $(window).on('load', function () { 124 | $('[data-spy="affix"]').each(function () { 125 | var $spy = $(this) 126 | var data = $spy.data() 127 | 128 | data.offset = data.offset || {} 129 | 130 | if (data.offsetBottom) data.offset.bottom = data.offsetBottom 131 | if (data.offsetTop) data.offset.top = data.offsetTop 132 | 133 | $spy.affix(data) 134 | }) 135 | }) 136 | 137 | }(jQuery); 138 | -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/js/alert.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: alert.js v3.1.1 3 | * http://getbootstrap.com/javascript/#alerts 4 | * ======================================================================== 5 | * Copyright 2011-2014 Twitter, Inc. 6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 7 | * ======================================================================== */ 8 | 9 | 10 | +function ($) { 11 | 'use strict'; 12 | 13 | // ALERT CLASS DEFINITION 14 | // ====================== 15 | 16 | var dismiss = '[data-dismiss="alert"]' 17 | var Alert = function (el) { 18 | $(el).on('click', dismiss, this.close) 19 | } 20 | 21 | Alert.prototype.close = function (e) { 22 | var $this = $(this) 23 | var selector = $this.attr('data-target') 24 | 25 | if (!selector) { 26 | selector = $this.attr('href') 27 | selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 28 | } 29 | 30 | var $parent = $(selector) 31 | 32 | if (e) e.preventDefault() 33 | 34 | if (!$parent.length) { 35 | $parent = $this.hasClass('alert') ? $this : $this.parent() 36 | } 37 | 38 | $parent.trigger(e = $.Event('close.bs.alert')) 39 | 40 | if (e.isDefaultPrevented()) return 41 | 42 | $parent.removeClass('in') 43 | 44 | function removeElement() { 45 | $parent.trigger('closed.bs.alert').remove() 46 | } 47 | 48 | $.support.transition && $parent.hasClass('fade') ? 49 | $parent 50 | .one($.support.transition.end, removeElement) 51 | .emulateTransitionEnd(150) : 52 | removeElement() 53 | } 54 | 55 | 56 | // ALERT PLUGIN DEFINITION 57 | // ======================= 58 | 59 | var old = $.fn.alert 60 | 61 | $.fn.alert = function (option) { 62 | return this.each(function () { 63 | var $this = $(this) 64 | var data = $this.data('bs.alert') 65 | 66 | if (!data) $this.data('bs.alert', (data = new Alert(this))) 67 | if (typeof option == 'string') data[option].call($this) 68 | }) 69 | } 70 | 71 | $.fn.alert.Constructor = Alert 72 | 73 | 74 | // ALERT NO CONFLICT 75 | // ================= 76 | 77 | $.fn.alert.noConflict = function () { 78 | $.fn.alert = old 79 | return this 80 | } 81 | 82 | 83 | // ALERT DATA-API 84 | // ============== 85 | 86 | $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) 87 | 88 | }(jQuery); 89 | -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/js/button.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: button.js v3.1.1 3 | * http://getbootstrap.com/javascript/#buttons 4 | * ======================================================================== 5 | * Copyright 2011-2014 Twitter, Inc. 6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 7 | * ======================================================================== */ 8 | 9 | 10 | +function ($) { 11 | 'use strict'; 12 | 13 | // BUTTON PUBLIC CLASS DEFINITION 14 | // ============================== 15 | 16 | var Button = function (element, options) { 17 | this.$element = $(element) 18 | this.options = $.extend({}, Button.DEFAULTS, options) 19 | this.isLoading = false 20 | } 21 | 22 | Button.DEFAULTS = { 23 | loadingText: 'loading...' 24 | } 25 | 26 | Button.prototype.setState = function (state) { 27 | var d = 'disabled' 28 | var $el = this.$element 29 | var val = $el.is('input') ? 'val' : 'html' 30 | var data = $el.data() 31 | 32 | state = state + 'Text' 33 | 34 | if (!data.resetText) $el.data('resetText', $el[val]()) 35 | 36 | $el[val](data[state] || this.options[state]) 37 | 38 | // push to event loop to allow forms to submit 39 | setTimeout($.proxy(function () { 40 | if (state == 'loadingText') { 41 | this.isLoading = true 42 | $el.addClass(d).attr(d, d) 43 | } else if (this.isLoading) { 44 | this.isLoading = false 45 | $el.removeClass(d).removeAttr(d) 46 | } 47 | }, this), 0) 48 | } 49 | 50 | Button.prototype.toggle = function () { 51 | var changed = true 52 | var $parent = this.$element.closest('[data-toggle="buttons"]') 53 | 54 | if ($parent.length) { 55 | var $input = this.$element.find('input') 56 | if ($input.prop('type') == 'radio') { 57 | if ($input.prop('checked') && this.$element.hasClass('active')) changed = false 58 | else $parent.find('.active').removeClass('active') 59 | } 60 | if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') 61 | } 62 | 63 | if (changed) this.$element.toggleClass('active') 64 | } 65 | 66 | 67 | // BUTTON PLUGIN DEFINITION 68 | // ======================== 69 | 70 | var old = $.fn.button 71 | 72 | $.fn.button = function (option) { 73 | return this.each(function () { 74 | var $this = $(this) 75 | var data = $this.data('bs.button') 76 | var options = typeof option == 'object' && option 77 | 78 | if (!data) $this.data('bs.button', (data = new Button(this, options))) 79 | 80 | if (option == 'toggle') data.toggle() 81 | else if (option) data.setState(option) 82 | }) 83 | } 84 | 85 | $.fn.button.Constructor = Button 86 | 87 | 88 | // BUTTON NO CONFLICT 89 | // ================== 90 | 91 | $.fn.button.noConflict = function () { 92 | $.fn.button = old 93 | return this 94 | } 95 | 96 | 97 | // BUTTON DATA-API 98 | // =============== 99 | 100 | $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { 101 | var $btn = $(e.target) 102 | if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') 103 | $btn.button('toggle') 104 | e.preventDefault() 105 | }) 106 | 107 | }(jQuery); 108 | -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/js/carousel.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: carousel.js v3.1.1 3 | * http://getbootstrap.com/javascript/#carousel 4 | * ======================================================================== 5 | * Copyright 2011-2014 Twitter, Inc. 6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 7 | * ======================================================================== */ 8 | 9 | 10 | +function ($) { 11 | 'use strict'; 12 | 13 | // CAROUSEL CLASS DEFINITION 14 | // ========================= 15 | 16 | var Carousel = function (element, options) { 17 | this.$element = $(element) 18 | this.$indicators = this.$element.find('.carousel-indicators') 19 | this.options = options 20 | this.paused = 21 | this.sliding = 22 | this.interval = 23 | this.$active = 24 | this.$items = null 25 | 26 | this.options.pause == 'hover' && this.$element 27 | .on('mouseenter', $.proxy(this.pause, this)) 28 | .on('mouseleave', $.proxy(this.cycle, this)) 29 | } 30 | 31 | Carousel.DEFAULTS = { 32 | interval: 5000, 33 | pause: 'hover', 34 | wrap: true 35 | } 36 | 37 | Carousel.prototype.cycle = function (e) { 38 | e || (this.paused = false) 39 | 40 | this.interval && clearInterval(this.interval) 41 | 42 | this.options.interval 43 | && !this.paused 44 | && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) 45 | 46 | return this 47 | } 48 | 49 | Carousel.prototype.getActiveIndex = function () { 50 | this.$active = this.$element.find('.item.active') 51 | this.$items = this.$active.parent().children() 52 | 53 | return this.$items.index(this.$active) 54 | } 55 | 56 | Carousel.prototype.to = function (pos) { 57 | var that = this 58 | var activeIndex = this.getActiveIndex() 59 | 60 | if (pos > (this.$items.length - 1) || pos < 0) return 61 | 62 | if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) 63 | if (activeIndex == pos) return this.pause().cycle() 64 | 65 | return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) 66 | } 67 | 68 | Carousel.prototype.pause = function (e) { 69 | e || (this.paused = true) 70 | 71 | if (this.$element.find('.next, .prev').length && $.support.transition) { 72 | this.$element.trigger($.support.transition.end) 73 | this.cycle(true) 74 | } 75 | 76 | this.interval = clearInterval(this.interval) 77 | 78 | return this 79 | } 80 | 81 | Carousel.prototype.next = function () { 82 | if (this.sliding) return 83 | return this.slide('next') 84 | } 85 | 86 | Carousel.prototype.prev = function () { 87 | if (this.sliding) return 88 | return this.slide('prev') 89 | } 90 | 91 | Carousel.prototype.slide = function (type, next) { 92 | var $active = this.$element.find('.item.active') 93 | var $next = next || $active[type]() 94 | var isCycling = this.interval 95 | var direction = type == 'next' ? 'left' : 'right' 96 | var fallback = type == 'next' ? 'first' : 'last' 97 | var that = this 98 | 99 | if (!$next.length) { 100 | if (!this.options.wrap) return 101 | $next = this.$element.find('.item')[fallback]() 102 | } 103 | 104 | if ($next.hasClass('active')) return this.sliding = false 105 | 106 | var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) 107 | this.$element.trigger(e) 108 | if (e.isDefaultPrevented()) return 109 | 110 | this.sliding = true 111 | 112 | isCycling && this.pause() 113 | 114 | if (this.$indicators.length) { 115 | this.$indicators.find('.active').removeClass('active') 116 | this.$element.one('slid.bs.carousel', function () { 117 | var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) 118 | $nextIndicator && $nextIndicator.addClass('active') 119 | }) 120 | } 121 | 122 | if ($.support.transition && this.$element.hasClass('slide')) { 123 | $next.addClass(type) 124 | $next[0].offsetWidth // force reflow 125 | $active.addClass(direction) 126 | $next.addClass(direction) 127 | $active 128 | .one($.support.transition.end, function () { 129 | $next.removeClass([type, direction].join(' ')).addClass('active') 130 | $active.removeClass(['active', direction].join(' ')) 131 | that.sliding = false 132 | setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0) 133 | }) 134 | .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000) 135 | } else { 136 | $active.removeClass('active') 137 | $next.addClass('active') 138 | this.sliding = false 139 | this.$element.trigger('slid.bs.carousel') 140 | } 141 | 142 | isCycling && this.cycle() 143 | 144 | return this 145 | } 146 | 147 | 148 | // CAROUSEL PLUGIN DEFINITION 149 | // ========================== 150 | 151 | var old = $.fn.carousel 152 | 153 | $.fn.carousel = function (option) { 154 | return this.each(function () { 155 | var $this = $(this) 156 | var data = $this.data('bs.carousel') 157 | var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) 158 | var action = typeof option == 'string' ? option : options.slide 159 | 160 | if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) 161 | if (typeof option == 'number') data.to(option) 162 | else if (action) data[action]() 163 | else if (options.interval) data.pause().cycle() 164 | }) 165 | } 166 | 167 | $.fn.carousel.Constructor = Carousel 168 | 169 | 170 | // CAROUSEL NO CONFLICT 171 | // ==================== 172 | 173 | $.fn.carousel.noConflict = function () { 174 | $.fn.carousel = old 175 | return this 176 | } 177 | 178 | 179 | // CAROUSEL DATA-API 180 | // ================= 181 | 182 | $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { 183 | var $this = $(this), href 184 | var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 185 | var options = $.extend({}, $target.data(), $this.data()) 186 | var slideIndex = $this.attr('data-slide-to') 187 | if (slideIndex) options.interval = false 188 | 189 | $target.carousel(options) 190 | 191 | if (slideIndex = $this.attr('data-slide-to')) { 192 | $target.data('bs.carousel').to(slideIndex) 193 | } 194 | 195 | e.preventDefault() 196 | }) 197 | 198 | $(window).on('load', function () { 199 | $('[data-ride="carousel"]').each(function () { 200 | var $carousel = $(this) 201 | $carousel.carousel($carousel.data()) 202 | }) 203 | }) 204 | 205 | }(jQuery); 206 | -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/js/collapse.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: collapse.js v3.1.1 3 | * http://getbootstrap.com/javascript/#collapse 4 | * ======================================================================== 5 | * Copyright 2011-2014 Twitter, Inc. 6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 7 | * ======================================================================== */ 8 | 9 | 10 | +function ($) { 11 | 'use strict'; 12 | 13 | // COLLAPSE PUBLIC CLASS DEFINITION 14 | // ================================ 15 | 16 | var Collapse = function (element, options) { 17 | this.$element = $(element) 18 | this.options = $.extend({}, Collapse.DEFAULTS, options) 19 | this.transitioning = null 20 | 21 | if (this.options.parent) this.$parent = $(this.options.parent) 22 | if (this.options.toggle) this.toggle() 23 | } 24 | 25 | Collapse.DEFAULTS = { 26 | toggle: true 27 | } 28 | 29 | Collapse.prototype.dimension = function () { 30 | var hasWidth = this.$element.hasClass('width') 31 | return hasWidth ? 'width' : 'height' 32 | } 33 | 34 | Collapse.prototype.show = function () { 35 | if (this.transitioning || this.$element.hasClass('in')) return 36 | 37 | var startEvent = $.Event('show.bs.collapse') 38 | this.$element.trigger(startEvent) 39 | if (startEvent.isDefaultPrevented()) return 40 | 41 | var actives = this.$parent && this.$parent.find('> .panel > .in') 42 | 43 | if (actives && actives.length) { 44 | var hasData = actives.data('bs.collapse') 45 | if (hasData && hasData.transitioning) return 46 | actives.collapse('hide') 47 | hasData || actives.data('bs.collapse', null) 48 | } 49 | 50 | var dimension = this.dimension() 51 | 52 | this.$element 53 | .removeClass('collapse') 54 | .addClass('collapsing') 55 | [dimension](0) 56 | 57 | this.transitioning = 1 58 | 59 | var complete = function () { 60 | this.$element 61 | .removeClass('collapsing') 62 | .addClass('collapse in') 63 | [dimension]('auto') 64 | this.transitioning = 0 65 | this.$element.trigger('shown.bs.collapse') 66 | } 67 | 68 | if (!$.support.transition) return complete.call(this) 69 | 70 | var scrollSize = $.camelCase(['scroll', dimension].join('-')) 71 | 72 | this.$element 73 | .one($.support.transition.end, $.proxy(complete, this)) 74 | .emulateTransitionEnd(350) 75 | [dimension](this.$element[0][scrollSize]) 76 | } 77 | 78 | Collapse.prototype.hide = function () { 79 | if (this.transitioning || !this.$element.hasClass('in')) return 80 | 81 | var startEvent = $.Event('hide.bs.collapse') 82 | this.$element.trigger(startEvent) 83 | if (startEvent.isDefaultPrevented()) return 84 | 85 | var dimension = this.dimension() 86 | 87 | this.$element 88 | [dimension](this.$element[dimension]()) 89 | [0].offsetHeight 90 | 91 | this.$element 92 | .addClass('collapsing') 93 | .removeClass('collapse') 94 | .removeClass('in') 95 | 96 | this.transitioning = 1 97 | 98 | var complete = function () { 99 | this.transitioning = 0 100 | this.$element 101 | .trigger('hidden.bs.collapse') 102 | .removeClass('collapsing') 103 | .addClass('collapse') 104 | } 105 | 106 | if (!$.support.transition) return complete.call(this) 107 | 108 | this.$element 109 | [dimension](0) 110 | .one($.support.transition.end, $.proxy(complete, this)) 111 | .emulateTransitionEnd(350) 112 | } 113 | 114 | Collapse.prototype.toggle = function () { 115 | this[this.$element.hasClass('in') ? 'hide' : 'show']() 116 | } 117 | 118 | 119 | // COLLAPSE PLUGIN DEFINITION 120 | // ========================== 121 | 122 | var old = $.fn.collapse 123 | 124 | $.fn.collapse = function (option) { 125 | return this.each(function () { 126 | var $this = $(this) 127 | var data = $this.data('bs.collapse') 128 | var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) 129 | 130 | if (!data && options.toggle && option == 'show') option = !option 131 | if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) 132 | if (typeof option == 'string') data[option]() 133 | }) 134 | } 135 | 136 | $.fn.collapse.Constructor = Collapse 137 | 138 | 139 | // COLLAPSE NO CONFLICT 140 | // ==================== 141 | 142 | $.fn.collapse.noConflict = function () { 143 | $.fn.collapse = old 144 | return this 145 | } 146 | 147 | 148 | // COLLAPSE DATA-API 149 | // ================= 150 | 151 | $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { 152 | var $this = $(this), href 153 | var target = $this.attr('data-target') 154 | || e.preventDefault() 155 | || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 156 | var $target = $(target) 157 | var data = $target.data('bs.collapse') 158 | var option = data ? 'toggle' : $this.data() 159 | var parent = $this.attr('data-parent') 160 | var $parent = parent && $(parent) 161 | 162 | if (!data || !data.transitioning) { 163 | if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') 164 | $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') 165 | } 166 | 167 | $target.collapse(option) 168 | }) 169 | 170 | }(jQuery); 171 | -------------------------------------------------------------------------------- /lib/public/vendor/bootstrap/js/dropdown.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: dropdown.js v3.1.1 3 | * http://getbootstrap.com/javascript/#dropdowns 4 | * ======================================================================== 5 | * Copyright 2011-2014 Twitter, Inc. 6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 7 | * ======================================================================== */ 8 | 9 | 10 | +function ($) { 11 | 'use strict'; 12 | 13 | // DROPDOWN CLASS DEFINITION 14 | // ========================= 15 | 16 | var backdrop = '.dropdown-backdrop' 17 | var toggle = '[data-toggle=dropdown]' 18 | var Dropdown = function (element) { 19 | $(element).on('click.bs.dropdown', this.toggle) 20 | } 21 | 22 | Dropdown.prototype.toggle = function (e) { 23 | var $this = $(this) 24 | 25 | if ($this.is('.disabled, :disabled')) return 26 | 27 | var $parent = getParent($this) 28 | var isActive = $parent.hasClass('open') 29 | 30 | clearMenus() 31 | 32 | if (!isActive) { 33 | if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { 34 | // if mobile we use a backdrop because click events don't delegate 35 | $('