├── .env ├── .gitignore ├── .ruby-version ├── 404.md ├── Gemfile ├── Gemfile.lock ├── Procfile ├── Rakefile ├── Readme.md ├── _bowercopy.sh ├── _chapters ├── 0 │ ├── 0-setup.md │ ├── 1-prerequisites.md │ ├── 2-installing-ruby.md │ ├── 3-verifying.md │ └── 4-github.md ├── 1 │ ├── 0-up-and-running.md │ ├── 1-sinatra-basics.md │ ├── 2-ruby-file.md │ ├── 3-html-forms.md │ └── 4-post-requests.md ├── 2 │ ├── 0-intro.md │ ├── 1-what-is-css.md │ ├── 2-css-frameworks.md │ └── 3-debugging-css.md ├── 3 │ ├── 0-intro.md │ └── 1-additional-help.md ├── 4 │ ├── 0-intro.md │ ├── 1-database-basics.md │ ├── 2-creating-databases.md │ └── 3-using-activerecord.md ├── 5 │ ├── 0-intro.md │ ├── 1-basic-concepts.md │ ├── 2-setup.md │ ├── 3-app-edits.md │ ├── 4-deploying.md │ └── 5-readmes-and-deleting.md ├── 6 │ ├── 0-intro.md │ └── 1-lab-6-hints.md ├── 7 │ ├── 0-intro.md │ └── 1-project.md ├── 8 │ └── 0-intro.md ├── 9 │ ├── 0-intro.md │ └── 1-authentication.md ├── 10 │ └── 0-intro.md ├── 11 │ └── 0-intro.md ├── 12 │ ├── 0-resources.md │ ├── 1-example-repo.md │ ├── 2-git-cheatsheet.md │ └── 3-about-this-site.md └── 0-schedule.md ├── _config.yml ├── _includes ├── analytics.js ├── app.js ├── bootstrap.min.js ├── d3.min.js ├── footer.html ├── head.html ├── header.html ├── jquery.min.js └── trianglify.min.js ├── _layouts ├── blog.html ├── default.html ├── intro.html └── schedule.html ├── _plugins ├── schedule.rb ├── sorted_chapters.rb └── toc.rb ├── _sass ├── _pygments.scss └── _variables.scss ├── _templates └── intro.md ├── blog.html ├── bower.json ├── bower_components ├── bootstrap-sass-official │ ├── .bower.json │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── bower.json │ ├── composer.json │ └── vendor │ │ └── assets │ │ ├── fonts │ │ └── bootstrap │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ └── glyphicons-halflings-regular.woff │ │ ├── javascripts │ │ ├── bootstrap.js │ │ └── bootstrap │ │ │ ├── affix.js │ │ │ ├── alert.js │ │ │ ├── button.js │ │ │ ├── carousel.js │ │ │ ├── collapse.js │ │ │ ├── dropdown.js │ │ │ ├── modal.js │ │ │ ├── popover.js │ │ │ ├── scrollspy.js │ │ │ ├── tab.js │ │ │ ├── tooltip.js │ │ │ └── transition.js │ │ └── stylesheets │ │ ├── bootstrap.scss │ │ └── bootstrap │ │ ├── _alerts.scss │ │ ├── _badges.scss │ │ ├── _breadcrumbs.scss │ │ ├── _button-groups.scss │ │ ├── _buttons.scss │ │ ├── _carousel.scss │ │ ├── _close.scss │ │ ├── _code.scss │ │ ├── _component-animations.scss │ │ ├── _dropdowns.scss │ │ ├── _forms.scss │ │ ├── _glyphicons.scss │ │ ├── _grid.scss │ │ ├── _input-groups.scss │ │ ├── _jumbotron.scss │ │ ├── _labels.scss │ │ ├── _list-group.scss │ │ ├── _media.scss │ │ ├── _mixins.scss │ │ ├── _modals.scss │ │ ├── _navbar.scss │ │ ├── _navs.scss │ │ ├── _normalize.scss │ │ ├── _pager.scss │ │ ├── _pagination.scss │ │ ├── _panels.scss │ │ ├── _popovers.scss │ │ ├── _print.scss │ │ ├── _progress-bars.scss │ │ ├── _responsive-utilities.scss │ │ ├── _scaffolding.scss │ │ ├── _tables.scss │ │ ├── _theme.scss │ │ ├── _thumbnails.scss │ │ ├── _tooltip.scss │ │ ├── _type.scss │ │ ├── _utilities.scss │ │ ├── _variables.scss │ │ ├── _wells.scss │ │ └── bootstrap.scss ├── 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 │ ├── grunt │ │ ├── bs-glyphicons-data-generator.js │ │ ├── bs-lessdoc-parser.js │ │ ├── bs-raw-files-generator.js │ │ └── shrinkwrap.js │ ├── 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 │ ├── less │ │ ├── alerts.less │ │ ├── badges.less │ │ ├── bootstrap.less │ │ ├── breadcrumbs.less │ │ ├── button-groups.less │ │ ├── buttons.less │ │ ├── carousel.less │ │ ├── close.less │ │ ├── code.less │ │ ├── component-animations.less │ │ ├── dropdowns.less │ │ ├── forms.less │ │ ├── glyphicons.less │ │ ├── grid.less │ │ ├── input-groups.less │ │ ├── jumbotron.less │ │ ├── labels.less │ │ ├── list-group.less │ │ ├── media.less │ │ ├── mixins.less │ │ ├── modals.less │ │ ├── navbar.less │ │ ├── navs.less │ │ ├── normalize.less │ │ ├── pager.less │ │ ├── pagination.less │ │ ├── panels.less │ │ ├── popovers.less │ │ ├── print.less │ │ ├── progress-bars.less │ │ ├── responsive-utilities.less │ │ ├── scaffolding.less │ │ ├── tables.less │ │ ├── theme.less │ │ ├── thumbnails.less │ │ ├── tooltip.less │ │ ├── type.less │ │ ├── utilities.less │ │ ├── variables.less │ │ └── wells.less │ ├── package.json │ └── test-infra │ │ ├── README.md │ │ ├── npm-shrinkwrap.canonical.json │ │ ├── requirements.txt │ │ ├── s3_cache.py │ │ ├── sauce_browsers.yml │ │ └── uncached-npm-install.sh ├── d3 │ ├── .bower.json │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── bower.json │ ├── composer.json │ ├── d3.js │ └── d3.min.js ├── jquery │ ├── .bower.json │ ├── MIT-LICENSE.txt │ ├── bower.json │ ├── dist │ │ ├── jquery.js │ │ ├── jquery.min.js │ │ └── jquery.min.map │ └── src │ │ ├── ajax.js │ │ ├── ajax │ │ ├── jsonp.js │ │ ├── load.js │ │ ├── parseJSON.js │ │ ├── parseXML.js │ │ ├── script.js │ │ ├── var │ │ │ ├── nonce.js │ │ │ └── rquery.js │ │ └── xhr.js │ │ ├── attributes.js │ │ ├── attributes │ │ ├── attr.js │ │ ├── classes.js │ │ ├── prop.js │ │ ├── support.js │ │ └── val.js │ │ ├── callbacks.js │ │ ├── core.js │ │ ├── core │ │ ├── access.js │ │ ├── init.js │ │ ├── parseHTML.js │ │ ├── ready.js │ │ └── var │ │ │ └── rsingleTag.js │ │ ├── css.js │ │ ├── css │ │ ├── addGetHookIf.js │ │ ├── curCSS.js │ │ ├── defaultDisplay.js │ │ ├── hiddenVisibleSelectors.js │ │ ├── support.js │ │ ├── swap.js │ │ └── var │ │ │ ├── cssExpand.js │ │ │ ├── getStyles.js │ │ │ ├── isHidden.js │ │ │ ├── rmargin.js │ │ │ └── rnumnonpx.js │ │ ├── data.js │ │ ├── data │ │ ├── Data.js │ │ ├── accepts.js │ │ └── var │ │ │ ├── data_priv.js │ │ │ └── data_user.js │ │ ├── deferred.js │ │ ├── deprecated.js │ │ ├── dimensions.js │ │ ├── effects.js │ │ ├── effects │ │ ├── Tween.js │ │ └── animatedSelector.js │ │ ├── event.js │ │ ├── event │ │ ├── alias.js │ │ └── support.js │ │ ├── exports │ │ ├── amd.js │ │ └── global.js │ │ ├── intro.js │ │ ├── jquery.js │ │ ├── manipulation.js │ │ ├── manipulation │ │ ├── _evalUrl.js │ │ ├── support.js │ │ └── var │ │ │ └── rcheckableType.js │ │ ├── offset.js │ │ ├── outro.js │ │ ├── queue.js │ │ ├── queue │ │ └── delay.js │ │ ├── selector-native.js │ │ ├── selector-sizzle.js │ │ ├── selector.js │ │ ├── serialize.js │ │ ├── sizzle │ │ └── dist │ │ │ ├── sizzle.js │ │ │ ├── sizzle.min.js │ │ │ └── sizzle.min.map │ │ ├── traversing.js │ │ ├── traversing │ │ ├── findFilter.js │ │ └── var │ │ │ └── rneedsContext.js │ │ ├── var │ │ ├── arr.js │ │ ├── class2type.js │ │ ├── concat.js │ │ ├── hasOwn.js │ │ ├── indexOf.js │ │ ├── pnum.js │ │ ├── push.js │ │ ├── rnotwhite.js │ │ ├── slice.js │ │ ├── strundefined.js │ │ ├── support.js │ │ ├── toString.js │ │ └── trim.js │ │ └── wrap.js └── trianglify │ ├── .bower.json │ ├── LICENSE │ ├── Readme.md │ ├── bower.json │ ├── examples │ ├── example0.jpg │ ├── example1.jpg │ ├── example1.svg │ ├── example2.jpg │ ├── example2.svg │ ├── example3.jpg │ └── example3.svg │ ├── gulpfile.js │ ├── index.html │ ├── package.json │ ├── trianglify.js │ └── trianglify.min.js ├── config.ru ├── css └── style.scss ├── favicon.png ├── fonts ├── glyphicons-halflings-regular.eot ├── glyphicons-halflings-regular.svg ├── glyphicons-halflings-regular.ttf └── glyphicons-halflings-regular.woff ├── images ├── gandalf.jpg ├── gettingstarted.png ├── github-create.png ├── github-name.png └── github-tag.png ├── index.md └── js ├── jquery.js ├── jquery.min.map └── scripts.js /.env: -------------------------------------------------------------------------------- 1 | export BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-ruby 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | _site -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 2.1.2 2 | -------------------------------------------------------------------------------- /404.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: 404 4 | summary: Page Not Found 5 | --- 6 | 7 | ![](/images/gandalf.jpg) 8 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | ruby "2.1.1" 2 | source 'https://rubygems.org' 3 | 4 | gem 'jekyll', '>= 2.0.3' 5 | gem 'rouge', '~> 1.3.3' 6 | gem 'puma', '~> 2.8.1' 7 | gem 'rack-contrib', '~> 1.1.0' -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | blankslate (2.1.2.4) 5 | celluloid (0.15.2) 6 | timers (~> 1.1.0) 7 | classifier (1.3.4) 8 | fast-stemmer (>= 1.0.0) 9 | coffee-script (2.2.0) 10 | coffee-script-source 11 | execjs 12 | coffee-script-source (1.7.0) 13 | colorator (0.1) 14 | execjs (2.2.1) 15 | fast-stemmer (1.0.2) 16 | ffi (1.9.3) 17 | jekyll (2.1.0) 18 | classifier (~> 1.3) 19 | colorator (~> 0.1) 20 | jekyll-coffeescript (~> 1.0) 21 | jekyll-gist (~> 1.0) 22 | jekyll-paginate (~> 1.0) 23 | jekyll-sass-converter (~> 1.0) 24 | jekyll-watch (~> 1.0) 25 | kramdown (~> 1.3) 26 | liquid (~> 2.6.1) 27 | mercenary (~> 0.3.3) 28 | pygments.rb (~> 0.6.0) 29 | redcarpet (~> 3.1) 30 | safe_yaml (~> 1.0) 31 | toml (~> 0.1.0) 32 | jekyll-coffeescript (1.0.0) 33 | coffee-script (~> 2.2) 34 | jekyll-gist (1.1.0) 35 | jekyll-paginate (1.0.0) 36 | jekyll-sass-converter (1.0.0) 37 | sass (~> 3.2) 38 | jekyll-watch (1.0.0) 39 | listen (~> 2.7) 40 | kramdown (1.4.0) 41 | liquid (2.6.1) 42 | listen (2.7.9) 43 | celluloid (>= 0.15.2) 44 | rb-fsevent (>= 0.9.3) 45 | rb-inotify (>= 0.9) 46 | mercenary (0.3.3) 47 | parslet (1.5.0) 48 | blankslate (~> 2.0) 49 | posix-spawn (0.3.8) 50 | puma (2.8.2) 51 | rack (>= 1.1, < 2.0) 52 | pygments.rb (0.6.0) 53 | posix-spawn (~> 0.3.6) 54 | yajl-ruby (~> 1.1.0) 55 | rack (1.5.2) 56 | rack-contrib (1.1.0) 57 | rack (>= 0.9.1) 58 | rb-fsevent (0.9.4) 59 | rb-inotify (0.9.5) 60 | ffi (>= 0.5.0) 61 | redcarpet (3.1.2) 62 | rouge (1.3.4) 63 | safe_yaml (1.0.3) 64 | sass (3.3.9) 65 | timers (1.1.0) 66 | toml (0.1.1) 67 | parslet (~> 1.5.0) 68 | yajl-ruby (1.1.0) 69 | 70 | PLATFORMS 71 | ruby 72 | 73 | DEPENDENCIES 74 | jekyll (>= 2.0.3) 75 | puma (~> 2.8.1) 76 | rack-contrib (~> 1.1.0) 77 | rouge (~> 1.3.3) 78 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: bundle exec puma -p $PORT config.ru -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | namespace :assets do 2 | desc 'Precompile assets' 3 | task :precompile do 4 | sh "bundle exec jekyll build" 5 | end 6 | end -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # Sensible Web Development 2 | 3 | This is the online text for a web development course I'm teaching. It contains background information about each lesson as well as homework assignments, links to external resources, and troubleshooting tips. 4 | 5 | See it in action at [http://webdev.qrohlf.com](http://webdev.qrohlf.com)! 6 | -------------------------------------------------------------------------------- /_bowercopy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # quick and dirty script to copy the relevant bower files to their appropriate places. Totally a hack. 4 | 5 | # trianglify 6 | cp -f bower_components/trianglify/trianglify.min.js _includes 7 | 8 | # glyphicons 9 | cp -f bower_components/bootstrap-sass-official/vendor/assets/fonts/bootstrap/* fonts 10 | 11 | # jquery 12 | cp -f bower_components/jquery/dist/jquery.min.js _includes 13 | cp -f bower_components/jquery/dist/jquery.js js 14 | cp -f bower_components/jquery/dist/jquery.min.map js 15 | 16 | # bootstrap 17 | cp -f bower_components/bootstrap/dist/js/bootstrap.min.js _includes 18 | 19 | # d3 20 | cp -f bower_components/d3/d3.min.js _includes 21 | -------------------------------------------------------------------------------- /_chapters/0-schedule.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Course Schedule 3 | summary: (subject to change) 4 | layout: schedule 5 | --- 6 | 7 | # Schedule 8 | This is a general overview for the whole course. If you have a question about a specific week or lab, you can find more info in the introduction to the corresponding chapter. 9 | 10 | **Each lab is assigned in class and is due at the beginning of class the following week (i.e we will talk about Lab 0 in class on Week 0, and it will be due before class on Week 1)**. 11 | -------------------------------------------------------------------------------- /_chapters/0/0-setup.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Setup 3 | summary: Getting your system ready for this class 4 | layout: intro 5 | index: 0 6 | 7 | date: 8 | September 4 9 | 10 | overview: 11 | This week, we'll be getting our environments set up with Ruby and some other tools that are necessary for this class, as well as going over some basic HTML syntax and the GitHub turn-in system. 12 | 13 | reading: 14 | Please read the short MDN Introduction to HTML and complete the [Try Git](http://try.github.io) exercises before class. 15 | 16 | due: 17 | Development environment set up (instructions in sections 0.1-0.3 in this chapter) and GitHub account created 18 | 19 | workshop: 20 | HTTP and HTML basics, and how to turn in assignments via GitHub. 21 | 22 | assignment: 23 | title: "Lab 0: HTML Todo" 24 | summary: For next week, write a todo list in HTML. 25 | requirements: 26 | - You should use an appropriate list element (ul or li for your list) 27 | - Your list should include at least 3 items with due dates and 3 items without due dates. 28 | - Your list should pass the w3c validator with no errors. 29 | - "Optional: use CSS to style your list" 30 | due: before next week's class 31 | tag: v0.0.0 32 | --- 33 | -------------------------------------------------------------------------------- /_chapters/0/1-prerequisites.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Prerequisites 3 | summary: Tools to set up before the first day of class 4 | layout: default 5 | index: 0.1 6 | --- 7 | # Please have your environment ready by Thursday, September 4th 8 | We're going to be using some tools that you probably haven't run across yet in this course, so please find some time before the first lab class to get your environment set up. 9 | 10 | While I highly recommend that you use a machine that you own and have full admin access to for this class (i.e. your laptop), some of this *might* work on the Maclab computers. 11 | 12 | ## Operating System 13 | 14 | You will need to have a Unix-based OS (OSX or Ubuntu recommended) on your machine for this course. 15 | 16 | - If you're a Mac user and have OSX 10.8 or 10.9 installed, you're good to go (here's [how to check your version of OSX](http://support.apple.com/kb/ht1633)) 17 | - If you're a Windows user, you should install Ubuntu 14.04 LTS to a secondary partition. You can download a free Ubuntu installer image [here](http://www.ubuntu.com/download/desktop/), and an installation guide [here](http://www.ubuntu.com/download/desktop/install-ubuntu-desktop). 18 | - I will be available to help troubleshoot Linux install issues after the first class on Tuesday (Sep. 2). 19 | 20 | ## GitHub 21 | 22 | We will be using [GitHub](https://github.com) to turn in assignments for this course. If you don't have a GitHub account, please [create one now](https://github.com/join). 23 | 24 | ## Tools 25 | 26 | We will be using the following tools and libraries in this course 27 | 28 | - Git 29 | - Ruby 2.1.1 30 | - Bundler 31 | - Sqlite3 32 | 33 | # OSX Setup 34 | 35 | ### Homebrew 36 | 37 | [Homebrew](http://brew.sh/) is a package manager for OSX. It's incredibly helpful for setting up a development environment, and is required if you plan to use OSX for this course. 38 | 39 | To install it, run this in your terminal: 40 | 41 | ```sh 42 | ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 43 | ``` 44 | 45 | ### Git 46 | OSX comes with an older version of Git. It's fine for our purposes, but if you want to have the newest version you use Homebrew to upgrade Git with `brew install git`. 47 | 48 | ### Sqlite3 49 | OSX 10.8 and 10.9 come with a version of sqlite3 that's sufficiently up-to-date for our purposes. You can verify that it's installed by running `sqlite3 --version`. 50 | 51 | ### Ruby and Bundler 52 | See the next section for instructions on how to install Ruby and Bundler. 53 | 54 | # Ubuntu Setup 55 | 56 | ### Git 57 | 58 | You can install Git on Ubuntu via apt: 59 | 60 | ```sh 61 | sudo apt-get install git 62 | ``` 63 | 64 | ### Sqlite3 65 | 66 | On Ubuntu, you'll need to install sqlite with apt: 67 | 68 | ``` sh 69 | sudo apt-get install sqlite3 libsqlite3-dev 70 | ``` 71 | 72 | ### Ruby and Bundler 73 | See the next section for instructions on how to install Ruby and Bundler. 74 | -------------------------------------------------------------------------------- /_chapters/0/3-verifying.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Verifying Your Setup 3 | summary: Making sure you're good to go 4 | layout: default 5 | index: 0.3 6 | --- 7 | 8 | # It's time to test your setup! 9 | 10 | Now that you have Ruby 2.1.1, bundler, and SQLite installed, you should be able to run Ruby-based web applications locally. 11 | 12 | ## Preflight Check 13 | First, make sure that you've got all of the tools from the previous section installed: 14 | 15 | ```sh 16 | git --version # should be version 1.8.* 17 | sqlite3 --version # should be version 3.* 18 | ruby --verison # should be version 2.1.1-* 19 | bundle --version # should be version 1.6.* 20 | ``` 21 | 22 | If any of those commands give you errors, go back and try reinstalling the relevant tools. A quick tip - Google is your friend when it comes to cryptic error messages. 23 | 24 | ## Running Your First Sinatra App 25 | Once you've verified that all of the dependencies for Ruby web development are installed, you can try running an app! 26 | 27 | First, clone the example app with Git: 28 | 29 | ```sh 30 | git clone https://github.com/qrohlf/webdev-gettingstarted.git 31 | ``` 32 | 33 | Next, go into the app directory and install the dependencies with bundler 34 | 35 | ```sh 36 | cd webdev-gettingstarted 37 | bundle install 38 | ``` 39 | 40 | Finally, run the app 41 | 42 | ```sh 43 | shotgun 44 | ``` 45 | 46 | And you should be able to browse to http://localhost:9393 and see a screen that looks like this: 47 | 48 | ![](/images/gettingstarted.png) 49 | 50 | If you're not seeing a screen that looks like that, check the output of `shotgun` for error messages! 51 | -------------------------------------------------------------------------------- /_chapters/1/0-up-and-running.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Ruby & Sinatra 3 | summary: An introduction to two powerful tools 4 | layout: intro 5 | index: 1 6 | 7 | date: 8 | September 11 9 | 10 | overview: 11 | This week focuses on introducing the concepts of server-side HTML generation, HTTP requests, and basic Ruby and Sinatra syntax. In this chapter, you'll find some helpful tips on how to read and write file with Ruby, how to write a simple GET request 12 | 13 | reading: 14 | Please watch [this screencast](https://www.destroyallsoftware.com/talks/wat) and complete the interactive lesson at http://tryruby.org/ **before class**. 15 | 16 | 17 | After class, you will probably want to read the sections on Routes, Conditions, and Static Files in the [Sinatra Readme](http://www.sinatrarb.com/intro.html). You may also want to check out the [MDN HTML Form Guide](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Forms) ([section 1](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Forms/My_first_HTML_form) and [section 5](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Forms/Sending_and_retrieving_form_data) are particularly relevant). 18 | 19 | due: 20 | You should have [Lab 0](/chapters/0/0-setup.html#assignment) completed before class. 21 | 22 | workshop: 23 | Introduction to web application development 24 | 25 | assignment: 26 | title: "Lab 1: MVC Todo" 27 | summary: We will be rewriting our static todo HTML page as a Sinatra application. Our app will read in a list of todo items from a text file and then render them as HTML when it recieves a GET request from the browser. 28 | requirements: 29 | - Your app should be able to read in a list of todo items with optional due dates from a text file 30 | - It should respond to GET requests at the site root with an HTML representation of your todo list with no syntax errors 31 | - It should use a view template for rendering the html 32 | - It should have a form for submitting new todo items to the server via a POST request. 33 | - Your app should be in the root directory of your git repository. 34 | - You should remove any files that are not a part of your app from your git repo before submitting it. 35 | due: before next week's class 36 | tag: v0.1.0 37 | --- 38 | -------------------------------------------------------------------------------- /_chapters/1/3-html-forms.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Submitting Data 3 | summary: How to use HTML forms to collect user input 4 | layout: default 5 | index: 1.3 6 | --- 7 | # Getting User Data 8 | 9 | Once you have a way to read and display your data, you'll need to implement a way to take data from the user and append it to the file. To do this, we'll use an HTML form! The [MDN Guide to HTML forms](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Forms/My_first_HTML_form) is an excellent and comprehensive resource on how to write and use HTML forms. The example on this page is just a basic implementation to get you started - reading the MDN article is highly recommended! 10 | 11 | For our purposes, we'll need to collect two pieces of data: the task, and an optional due date. Here's what the form for that looks like: 12 | 13 | ```html 14 |
15 | New Task: 16 | 17 | 18 | 19 |
20 | ``` 21 | 22 | We've defined a `
` element that will send the data that's entered into it to the `/` route via an HTTP POST request. (For more on POST requests, see [this article](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Forms/Sending_and_retrieving_form_data)). That's all we need in our view for this to work - all of the heavy lifting will happen on the server when the POST request is received. Once you've got the hang of defining HTML forms, head over to the next section to see how to handle the data in your app. 23 | -------------------------------------------------------------------------------- /_chapters/1/4-post-requests.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Handling Data 3 | summary: How to handle user data in your app 4 | layout: default 5 | index: 1.4 6 | --- 7 | # Working with POST data 8 | Now that you have a way to collect data from the user, you need to be able to do something with that data in your app. 9 | 10 | Remember that Sinatra `routes` are just http verbs with a path after them. So our route to handle form submissions will look like this: 11 | 12 | ```ruby 13 | post '/' do 14 | #code goes here 15 | end 16 | ``` 17 | 18 | But how do you get at the data that the user submitted in the POST request? Sinatra has a special hash called `params` that contains all of the data that was issued with the user's request, accessible in routes. So if we wanted to output all of our params to the browser (useful for debugging), we would do something like this: 19 | 20 | ```ruby 21 | require 'json' #nice output formatting 22 | post '/' do 23 | JSON.pretty_generate params 24 | end 25 | ``` 26 | 27 |
Tip: Ruby's JSON library is great for pretty-printing data structures for debugging as valid JSON with nice line breaks. Another popular library to use for debugging is the awesome_print gem.
28 | 29 | To write to a file, you can simply format the parameters using [string interpolation](http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Literals#Interpolation): 30 | 31 | ```ruby 32 | post '/' do 33 | File.open("todo.txt", "a") do |file| 34 | file.puts "#{params[:task]} - #{params[:date]}" 35 | end 36 | end 37 | ``` 38 | 39 | That should be enough to get you going on this week's assignment. Remember that if you get really stuck, you can see a working reference app by checking out the `v0.1.0` release of the [example app repo](https://github.com/qrohlf/webdev). 40 | -------------------------------------------------------------------------------- /_chapters/10/0-intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Demo Day 3 | layout: intro 4 | index: 10 5 | 6 | date: 7 | December 2 8 | 9 | due: 10 | project demos 11 | 12 | --- 13 | -------------------------------------------------------------------------------- /_chapters/11/0-intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Demo Day 3 | layout: intro 4 | index: 11 5 | 6 | date: 7 | December 4 8 | 9 | due: 10 | project demos 11 | 12 | 13 | --- 14 | -------------------------------------------------------------------------------- /_chapters/12/0-resources.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Appendix 3 | layout: default 4 | index: 12 5 | --- 6 | 7 | # Quick Links 8 | 9 | ## Recommended Text Editors 10 | - [Atom](https://atom.io) 11 | - [Sublime Text](http://www.sublimetext.com) 12 | 13 | ## Ruby Documentation 14 | 15 | - [Official Ruby Docs](http://www.ruby-doc.org) 16 | - [Omniref](https://www.omniref.com) 17 | - [Sinatra Readme](http://www.sinatrarb.com/intro.html) 18 | 19 | ## HTML 20 | - [MDN HTML Tutorial](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Introduction) 21 | - [MDN HTML Reference](https://developer.mozilla.org/en-US/docs/Web/HTML/Element) 22 | - [Code School HTML 101](http://www.codecademy.com/courses/html-one-o-one/0/1) 23 | 24 | ## Browser Developer Tools Documentation 25 | 26 | - [Chrome](https://developer.chrome.com/devtools/index) 27 | - [Firefox](https://developer.mozilla.org/en-US/docs/Tools) 28 | - [Safari](https://developer.apple.com/library/safari/documentation/AppleApplications/Conceptual/Safari_Developer_Guide/Introduction/Introduction.html) 29 | - [IE](http://i.imgur.com/EmeXvye.jpg) 30 | 31 | ## CSS Frameworks 32 | 33 | - [Bootstrap](http://getbootstrap.com) 34 | - [Foundation](http://foundation.zurb.com) 35 | 36 | 37 | ## More 38 | 39 | - [My personal list of useful tools](https://github.com/qrohlf/tools) 40 | -------------------------------------------------------------------------------- /_chapters/12/1-example-repo.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Example Repo 3 | summary: working reference code for when you get stuck 4 | layout: default 5 | index: 12.1 6 | --- 7 | 8 | One of the resources available to you for this course is a GitHub repo containing working solutions to all the labs. It should be helpful for when you get stuck or can't quite remember how to do something. Just keep in mind that you'll probably get a lot more out of the labs if you try to come up with your own solutions first before looking at the reference code. 9 | 10 | The repo is located at https://github.com/qrohlf/webdev-examples. 11 | 12 | To check it out, simply clone it: 13 | 14 | ```bash 15 | git clone https://github.com/qrohlf/webdev-examples.git 16 | ``` 17 | 18 | And then to view the solution for a particular lab, just check out the relevant release using git tags. (You can view a list of the releases on [GitHub](https://github.com/qrohlf/webdev-examples/releases)) 19 | 20 | ```bash 21 | git checkout v0.1.0 # check out the example for lab 1 22 | ``` 23 | -------------------------------------------------------------------------------- /_chapters/12/2-git-cheatsheet.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Git Cheatsheet 3 | summary: A quick reference for common Git-related tasks 4 | layout: default 5 | index: 12.2 6 | --- 7 | 8 | # Git Cheatsheet 9 | 10 | This page is a quick reference of common Git tasks. 11 | 12 | ## Initialize a repository 13 | 14 | ```sh 15 | mkdir my-repo 16 | cd my-repo 17 | git init 18 | ``` 19 | 20 | ## Add all modified and new files to a commit 21 | 22 | ```sh 23 | git add -A 24 | ``` 25 | 26 | ## Shortcut to specify a commit message on the command line 27 | 28 | ```sh 29 | git commit -m "my commit message" 30 | ``` 31 | 32 | ## Shortcut to commit all modified files with one command 33 | 34 | ```sh 35 | git commit -am "my commit message" 36 | ``` 37 | 38 | ## My commit messages are opening in emacs/vim/nano 39 | 40 | See https://help.github.com/articles/associating-text-editors-with-git to change your default text editor to use with git. 41 | 42 | ## Should I commit my changes? 43 | 44 | Yes. 45 | 46 | ## Tag a finished lab or resubmission and push it to GitHub 47 | 48 | ```sh 49 | git tag v0.X.X # replace X.X with the appropriate version numbers 50 | git push 51 | git push v0.X.X 52 | ``` 53 | -------------------------------------------------------------------------------- /_chapters/12/3-about-this-site.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: About This Site 3 | summary: How this site is built. 4 | layout: default 5 | index: 12.2 6 | --- 7 | 8 | If you're curious about the technology behind this website, here's what makes it tick: 9 | 10 | ## Page Generation & Styling 11 | 12 | The site content is built from a collection of [markdown](http://daringfireball.net/projects/markdown/) files into static HTML with a tool called [Jekyll](http://jekyllrb.com). I'm using [Twitter Bootstrap](http://getbootstrap.com) and [SASS](http://sass-lang.com) for styling. The header background images are generated client-side with a JavaScript library that I wrote called [Trianglify](http://qrohlf.com/trianglify/). 13 | 14 | ## Deployment 15 | 16 | This page is deployed Amazon's cloud using [Heroku](https://www.heroku.com). Jekyll generates the site's static files during asset compilation and then I use [Puma](http://puma.io) and Rack::TryStatic to serve the compiled site. I trigger the deployments through a script I wrote called [booyah](https://github.com/qrohlf/dotfiles/blob/master/functions/booyah.sh) to make sure that the Github repo and the depoyed site are both updated at the same time. 17 | 18 | ## Source 19 | 20 | All of the source for this site is available on [GitHub](https://github.com/qrohlf/sensible-web-development), and you can submit corrections and suggestions using the [Issue Tracker](https://github.com/qrohlf/sensible-web-development). 21 | -------------------------------------------------------------------------------- /_chapters/2/0-intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: "CSS" 3 | summary: Unleashing your inner artist 4 | layout: intro 5 | index: 2 6 | 7 | date: 8 | September 18 9 | 10 | overview: 11 | This week focuses on some of the visual aspects of web development, and should give you a good idea of how to customize the look and feel of your app. The lab is intentionally very open ended - while I'd love to see everyone's artistic chops, if you are behind on the previous lab, this is the week to get caught up. 12 | 13 | reading: 14 | "Optional reading: [James Mickens - To Wash It All Away](https://www.usenix.org/system/files/1403_02-08_mickens.pdf)" 15 | 16 | due: 17 | You should have [Lab 1](/chapters/1/0-up-and-running.html#assignment) completed before class. 18 | 19 | workshop: 20 | HTML, Git, and Ruby review, plus a short tutorial on basic CSS. 21 | 22 | assignment: 23 | title: "Lab 2: CSS Artistry" 24 | summary: Add some CSS to your todo list 25 | requirements: 26 | - Write at least one CSS rule that styles your todo list 27 | - Your CSS should be in a separate .css file. 28 | due: before next week's class 29 | tag: v0.2.0 30 | --- 31 | -------------------------------------------------------------------------------- /_chapters/2/3-debugging-css.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Debugging CSS 3 | summary: An introduction to web debugging 4 | layout: default 5 | index: 2.3 6 | --- 7 | # In-Browser Debugging 8 | 9 | One of the most useful features of modern browsers is that they all come with an extensive set of tools for inspecting how your CSS styles are interacting with your webpage's HTML. My preferred browser for debugging web sites is Google Chrome - here's a tutorial on how to use Chrome's developer tools: 10 | 11 | [Chrome DevTools Overview](https://developer.chrome.com/devtools#dom-and-styles) 12 | 13 | The section on "Inspecting the DOM and Styles" should be most helpful for this chapter. 14 | 15 | # Other Browsers 16 | While I like Chrome's dev tools best, it's definitely a personal preference. Here are links to developer tools documentation for other major browsers: 17 | 18 | - [Firefox](https://developer.mozilla.org/en-US/docs/Tools) 19 | 20 | - [Safari](https://developer.apple.com/library/safari/documentation/AppleApplications/Conceptual/Safari_Developer_Guide/Introduction/Introduction.html) 21 | 22 | - [IE](http://i.imgur.com/EmeXvye.jpg) 23 | -------------------------------------------------------------------------------- /_chapters/3/0-intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Review 3 | summary: Let's get caught up! 4 | layout: intro 5 | index: 3 6 | 7 | date: 8 | September 25 9 | 10 | overview: 11 | By popular demand, this Thursday will be extended office hours. If you are behind (you don't have Lab 2 finished), please come to class with one or two **specific** things that you want help with. Please note that there is still a lab assigned this week - I want you to get used to continuously iterating on and improving your app in preperation for the project portion of this class. 12 | 13 | reading: 14 | "Recommended reading - review any of the previous chapters that you had trouble with, as well as the [suggested resources](/chapters/3/1-additional-help.html) for those topics. Optional reading - [this StackOverFlow question](https://stackoverflow.com/questions/184618/what-is-the-best-comment-in-source-code-you-have-ever-encountered)" 15 | 16 | due: 17 | You should have [Lab 1](/chapters/1/0-up-and-running.html#assignment) completed by the end of class. I would like to see everyone have Lab 3 finished by next Thursday (October 2nd). 18 | 19 | workshop: 20 | TBD 21 | 22 | assignment: 23 | title: "Lab 3: Iterate" 24 | summary: Make one improvement to your todo app. This can be a CSS tweak that makes it look better, a Ruby change that adds an additional feature, anything that improves the functionality. 25 | requirements: 26 | - Make one improvement to your app. 27 | - In your commit message, give a short explanation of what improvement you made, and why it's an improvement. 28 | due: before next week's class 29 | tag: v0.3.0 30 | --- 31 | -------------------------------------------------------------------------------- /_chapters/3/1-additional-help.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Additional Help 3 | summary: Places to go to learn more 4 | layout: default 5 | index: 3.1 6 | --- 7 | 8 | # Help! I don't quite understand... 9 | 10 | 11 | ## ...Ruby 12 | 13 | If you're having trouble with Ruby, you might find the official Ruby [quickstart](https://www.ruby-lang.org/en/documentation/quickstart/) tutorial helpful. It walks you through basic syntax, methods, string interpolation, classes, looping, blocks, and duck typing. 14 | 15 | You can also try going through the [Try Ruby](http://tryruby.org) interactive tutorial again, this time making sure you understand everything that you're doing before moving on. 16 | 17 | ## ...Git 18 | 19 | If the [Try Git](http://try.github.io) tutorial didn't make sense to you, the Git Basics [Video Series](http://git-scm.com/videos) might be a good place to go for some additional help. 20 | 21 | ## ...Sinatra 22 | 23 | Read the [Readme](http://www.sinatrarb.com/intro.html). 24 | -------------------------------------------------------------------------------- /_chapters/4/0-intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Databases 3 | layout: intro 4 | index: 4 5 | 6 | date: 7 | October 2 8 | 9 | overview: 10 | This week touches on some basic concepts related to databases on the web, then introduces the ActiveRecord database abstration layer. 11 | 12 | reading: 13 | Please familiarize yourself with [basic database terminology](http://homepages.ius.edu/DSCHWEI2/handouts/access/terms.htm) and [ActiveRecord basics](http://guides.rubyonrails.org/active_record_basics.html). Don't worry too much if you don't understand the code examples or migrations, just try to get a sense for what ActiveRecord's role is in a ruby web app. 14 | 15 | due: 16 | You should be caught up with the class, with your Lab 3 pushed to GitHub and tagged properly with a `v0.3.x` tag. 17 | 18 | workshop: 19 | Introduction to relational databases and ActiveRecord. 20 | 21 | assignment: 22 | title: "Lab 4: ActiveRecord" 23 | summary: Modify your todo list to use a database! 24 | requirements: 25 | - You should write an ActiveRecord migration to create your database 26 | - All dynamic data in your app should be loaded from a SQLite database using an ActiveRecord model 27 | - Your todo items should be displayed sorted by due date 28 | - Your form should now save data to the database instead of a file 29 | due: before next week's class 30 | tag: v0.4.0 31 | --- 32 | -------------------------------------------------------------------------------- /_chapters/4/1-database-basics.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Database Basics 3 | summary: What are databases, and why do we use them? 4 | layout: default 5 | index: 4.1 6 | --- 7 | 8 | # Databases? 9 | 10 | Databases are the preferred way to store information on the web. So far, we have been storing our data in a "flat file", or a file with no special structure or meaning. For reading and appending to a simple list, this actually works pretty well, but problems start to arise if we want to be able to delete items, or ensure that the data isn't overwritten by some error, or store and filter a set of items that is too big for our app to load into memory at the same time. 11 | 12 | This is where databases start to become extremely helpful. Databases all provide at least two things: efficient storage and querying of large sets of data, and some kind of API that allows your application to create, read, update, and delete data while still ensuring that the integrity of your database is maintained. There are many different database implementations - for this chapter we will be talking about traditional *relational databases* that can be queried using *Standard Query Language* or SQL. 13 | 14 | Databases are essential tools for writing scalable and maintainable web applications. In this chapter, we will look at how we can effectively use them to improve our application, focusing mostly on implementation rather than theory (the subject of database workings/theory is often split up into 2-3 courses only about databases). We'll also be using the [ActiveRecord](http://guides.rubyonrails.org/active_record_basics.html) database abstraction layer so that we can write our database queries using Ruby rather than having to learn SQL. 15 | 16 | # ActiveRecord 17 | 18 | Working directly with databases can be cumbersome. Often, developers will find themselves writing mind-boggling queries in SQL to do what seem like simple tasks. It also brings up a host of issues - when working directly in SQL, developers have to be constantly aware of things like SQL injection attacks, schema management, and the underlying database techology that their application is running on. 19 | 20 | ActiveRecord is an *Object-Relational-Mapping* layer, or ORM written in Ruby and designed specifically for web applications. It allows you to interact with your database schema and contents as objects, using Ruby code rather than SQL. The rest of this chapter will deal mainly with ActiveRecord. 21 | 22 | # Overview 23 | 24 | In order to add a database to your app, you will need to: 25 | 26 | 1. Add several dependencies to your `Gemfile`. 27 | 2. Use `rake` to create a database migration and run it. 28 | 3. Add a model to your app by creating a subclass of `ActiveRecord::Base`. 29 | 4. Modify your `app.rb` file to read and write to the database instead of a file. 30 | 31 | 32 | -------------------------------------------------------------------------------- /_chapters/4/3-using-activerecord.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Using ActiveRecord 3 | summary: How to read and write data in the database 4 | layout: default 5 | index: 4.3 6 | --- 7 | 8 | # ActiveRecord Models 9 | 10 | Now that we have a database table called `todo_items` all set up with an appropriate schema, we now need to create an object to interact with this table in our Ruby code. Fortunately, ActiveRecord already has a class called `ActiveRecord::Base` that will automatically expose all the necessary functionality to our application. We are going to create a *subclass* of `ActiveRecord::Base` called `TodoItem` that will represent our data. 11 | 12 | Create a new folder in the root of your application called `models`, and a file inside this new folder called `TodoItem.rb` (the name is important - the class name is how ActiveRecord knows which database table to use, and your filenames should match your class names). Edit the `TodoItem.rb` file to look like this: 13 | 14 | ```ruby 15 | class TodoItem < ActiveRecord::Base 16 | 17 | end 18 | 19 | ``` 20 | 21 | Now edit your 'app.rb' file to include your new Model. After the `Bundler.require` line, add the following require statement: 22 | 23 | ```ruby 24 | require './models/TodoItem' 25 | ``` 26 | 27 | Now the TodoItem class will be available in your application to use for querying the `todo_items` table in your database. 28 | 29 | Here are some examples of how this can be used: 30 | 31 | ```ruby 32 | # get all items in the database 33 | all_items = TodoItem.all 34 | 35 | # print a description of each item to the console (ordered by due_date) 36 | all_items.order(:due_date).each do |item| 37 | puts item.description 38 | end 39 | 40 | # get all items with a due date of '10/4/14' 41 | due_today = TodoItem.find_by(due_date: '10/4/14') 42 | 43 | # add a new item to the database 44 | TodoItem.create(description: "Learn ActiveRecord", due_date: "today") 45 | ``` 46 | 47 | For more information about how to use ActiveRecord, see [this guide](http://guides.rubyonrails.org/active_record_basics.html), or email me with your questions. 48 | -------------------------------------------------------------------------------- /_chapters/5/0-intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Deployment 3 | layout: intro 4 | index: 5 5 | 6 | date: 7 | October 16 8 | 9 | overview: 10 | So far, all of your apps have been running *locally*, only accessible on your own machine. This week, we'll be *deploying* our applications to a server that's accessible from anywhere on the internet. 11 | 12 | reading: 13 | None. 14 | 15 | due: 16 | You will need to have Lab 4 finished before you can deploy your application. 17 | 18 | workshop: 19 | Deploying your application to Heroku 20 | 21 | assignment: 22 | title: "Lab 5: Deployment" 23 | summary: This week, you will deploy your application to Heroku. 24 | requirements: 25 | - Your application should be deployed on Heroku. 26 | - You should add a Readme file to your repository which includes a link to your deployed application. 27 | - Users of your app should be able to view the todo list over the web. 28 | - Users of your app should be able to add items to the todo list over the web. 29 | - Users of your app should be able to remove items from the todo list over the web. 30 | due: before next week's class 31 | tag: v0.5.0 32 | --- 33 | -------------------------------------------------------------------------------- /_chapters/5/1-basic-concepts.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Deployment Concepts 3 | summary: Some key terms, and what they refer to 4 | layout: default 5 | index: 5.1 6 | --- 7 | 8 | # Key Terms in Deployment 9 | 10 | In order to talk about how to get your app running on a server, there are a few concepts we need to go over first. Make sure that you understand the following explanations before continuing with this chapter. 11 | 12 | ## Client 13 | 14 | The term *client* refers to the computer that is viewing a web page. A client can be anything running a web browser - laptops, smartphones, tablets, even [refrigerators](https://www.google.com/search?client=safari&rls=en&q=smart+fridge&ie=UTF-8&oe=UTF-8). 15 | 16 | ## Server 17 | 18 | The term *server* refers to whatever is generating a web page. So far, you've been running your application on your own machine - making it both the client and the server. However, because your computer isn't set up to handle incoming connections, your application has only been available on one machine. By *deploying* your application to a server that's always online and accepting incoming connections from the Internet, you can make it so that your application is available on any machine with Internet access. 19 | 20 | ## Production 21 | 22 | The word *production* is often used to refer to the code or setup on the server (as opposed to the *development* code or setup on your computer). 23 | 24 | ## Git Remotes 25 | 26 | One thing you may have noticed while working with git in this class is that we've been using the word `origin` to refer to GitHub. `origin` is an example of a *git remote* - an external location that git is aware of and able to upload code to. By convention, we're using the name `origin` to point to the main remote server where we store our code (in this case, GitHub). Git, however, is capable of working with multiple remotes. In this chapter, we will use a git remote to keep the code that's running on our server in sync with the code on our machine. 27 | 28 | ## Environment Variables 29 | 30 | Sometimes an application needs to behave differently based on where it's running - for example, it's convenient for us to use a SQLite database while developing our app locally, but when we upload it the same code to our new server it will need to use a different database implementation. A common solution to this problem is to use *environment variables* - special variables that are set on the server that an application is running on instead of inside the application itself. The application can then use these variables to change its behavior at runtime. We will use environment variables to make our app use a different database when it's deployed to the server. 31 | -------------------------------------------------------------------------------- /_chapters/5/2-setup.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Deployment Setup 3 | summary: Some bookkeeping 4 | layout: default 5 | index: 5.2 6 | --- 7 | 8 | # Getting started with Heroku 9 | 10 | For this class, we'll be using a service called Heroku to deploy our apps. Heroku is a popular cloud computing platform that makes deploying applications super easy. They have a free plan for development & low-traffic websites, so it's ideal for our purposes. You can think of it as a free server that you can run your application on. 11 | First, you will need to create a free account at [https://id.heroku.com/signup/www-header](https://id.heroku.com/signup/www-header). Do that now. 12 | 13 | Then, you'll need to install the Heroku Toolbelt. Follow the instructions for your system: 14 | 15 | ## Mac 16 | 17 | Run `brew install heroku-toolbelt` in your terminal. 18 | 19 | ## Ubuntu 20 | 21 | Run `wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh` in your terminal. 22 | 23 | # Setup 24 | 25 | After you've created a Heroku account and installed the Heroku Toolbelt, you'll need to connect your computer to your Heroku account. In your terminal, run `heroku login`. The `heroku` command was installed as part of the Toolbelt, and accepts subcommands much like git. In this case, it will ask for the email and password for your Heroku account. It will also ask to upload or generate a SSH public key - press enter to accept. 26 | 27 | After your public key has been uploaded to Heroku, check that you are logged in by running `heroku keys`. You should see an entry with your email and some random-looking numbers and letters, signaling that you're set up to use Heroku from the terminal and ready to continue. 28 | 29 | Next, we'll be tweaking our application code to get it ready to run on a server. 30 | -------------------------------------------------------------------------------- /_chapters/5/5-readmes-and-deleting.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Deleting Items 3 | summary: Some tips to help you finish Lab 5 4 | layout: default 5 | index: 5.5 6 | --- 7 | 8 | # On The Subject of Deleting... 9 | 10 | Basically, to delete you need a way to tell the server to delete an item from the browser. You already have all the knowledge you need in order to do this. Here's a quick recap: 11 | 12 | ### Sending data between the browser and server 13 | 14 | To send data between the browser and server, we can use an html form: 15 | 16 | ```html 17 | 18 | 19 | 20 | 21 |
22 | ``` 23 | 24 | And then process it in a callback in `app.rb`: 25 | 26 | ```ruby 27 | post '/some_endpoint' do 28 | some_user_data = params[:some_user_data] 29 | some_constant_data = params[:some_constant_data] 30 | # do some action with that data 31 | end 32 | ``` 33 | 34 | ### Deleting an item on the server: 35 | 36 | ActiveRecord makes this easy 37 | 38 | ```ruby 39 | some_id = 7 #the id of the item you want to delete 40 | TodoItem.find(some_id).destroy 41 | ``` -------------------------------------------------------------------------------- /_chapters/6/0-intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Databases II 3 | layout: intro 4 | index: 6 5 | 6 | date: 7 | October 23 8 | 9 | overview: 10 | "This week, we'll be covering some more advanced database functionality - validations and relations. This will be the last lab of the class; we'll be moving into projects next week." 11 | 12 | reading: 13 | None this week. 14 | 15 | due: 16 | You should have Lab 5 completed prior to class. 17 | 18 | workshop: 19 | Advanced ActiveRecord - validations and relations. 20 | 21 | assignment: 22 | title: "Lab 6: Multi-user app" 23 | summary: Turn your app into a multi-user todo list using ActiveRecord relations 24 | requirements: 25 | - "while this spec has users in mind, it is also acceptable to do something else using a relation in your database. For example, instead of adding 'users', you could modify your app to handle multiple 'lists' of items" 26 | - write a migration to add a `users` table to your application. 27 | - "write a migration to add a `user_id` column to your `todo_items` table" 28 | - "each user should get their own todo list that they can add and delete items on" 29 | - the root route or index should now show a list of links to users' todo lists. 30 | due: before next week's class 31 | tag: v0.6.0 32 | --- 33 | -------------------------------------------------------------------------------- /_chapters/7/0-intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Projects 3 | layout: intro 4 | index: 7 5 | 6 | date: 7 | October 30 8 | 9 | overview: 10 | This week will be an opportunity for you to ask questions about the final project, followed by a work session where you can get help with your project from me and your classmates. 11 | 12 | reading: 13 | 'Optional: read [this blog post](http://qrohlf.com/posts/creating-lisst/) about what I think makes for a successful project.' 14 | 15 | due: 16 | "Post 1-3 ideas for your project topic on this [GitHub thread](https://github.com/qrohlf/sensible-web-development/issues/3) by TUESDAY. I will follow up with you to make sure that you've got a feasible project topic chosen by THURSDAY. See the next page for some guidelines for the project." 17 | 18 | workshop: 19 | Projects Q&A/Office Hours 20 | 21 | --- 22 | -------------------------------------------------------------------------------- /_chapters/7/1-project.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Project Details 3 | summary: Project guidelines and grading details 4 | layout: default 5 | index: 7.1 6 | --- 7 | 8 | # Guidelines for a good project: 9 | 10 | - **It should be something you think you would use.** 11 | - It should be at least as complex as the Todo app that we've already written. 12 | - It should be feasible to build in ~2-3 weeks. 13 | 14 | ## Your Project will be graded on: 15 | 16 | - **15% Technical ambition** - This is a check-off grade noting that your project was technically challenging in some way. If you're not sure whether your project meets this criteria, email me or talk to me during office hours or after class. 17 | - **15% Documentation** - Do you have a good README that explains what your project does, how to get it up and running, and the key design aspects that a person who wanted to modify your project would need to know? The demo is included in this portion of the grade. 18 | - **30% Design** - Does the way your application is structured make sense? Do you reduce repetition in your code by breaking repetitive aspects into new functions/views? Does your database schema fit your data? 19 | - **40% Execution** - Does it work well without bugs? Is it easy to use? 20 | 21 | ## Project Deadlines: 22 | 23 | - **Monday, November 3rd** - You've confirmed your project idea with me and are ready to start working on it. 24 | - **Thursday, November 13** - A "first draft" of your project with at least a Readme should be up on GitHub, with a link emailed to me (qrohlf@lclark.edu). 25 | - **Tuesday, December 2nd** - The first demo day - half of the projects are due, the other half should be nearly finished. 26 | - **Thursday, December 4th** - The second demo day - all of the projects are due. -------------------------------------------------------------------------------- /_chapters/8/0-intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Project Q&A 3 | layout: intro 4 | index: 8 5 | 6 | date: 7 | November 6 8 | 9 | overview: 10 | Javascript! 11 | 12 | due: 13 | N/A 14 | 15 | workshop: 16 | Introduction to Javascript 17 | 18 | --- 19 | -------------------------------------------------------------------------------- /_chapters/9/0-intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Authentication 3 | layout: intro 4 | index: 9 5 | 6 | date: 7 | November 13 8 | 9 | overview: 10 | Authentication with a username and password using the `has_secure_password` ActiveRecord feature. 11 | 12 | due: 13 | work on project 14 | 15 | workshop: 16 | Authentication 17 | 18 | --- 19 | -------------------------------------------------------------------------------- /_chapters/9/1-authentication.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Authentication 3 | summary: How to add a login feature to your app 4 | layout: default 5 | index: 9.1 6 | --- 7 | 8 | # What We Covered In Class 9 | 10 | Here's a quick bullet-points reminder of the important concepts from the lecture: 11 | 12 | - To authenticate a user with a username and password securely, we need to *hash* their password before storing it in the database. 13 | - To prevent a user from having to send their username and password with every request, we need to use a *session cookie* to store a *token* that allows us to identify them as a logged-in user. 14 | - To prevent someone from being able to login as another user by spoofing the session cookie token, we need to *encrypt* the session cookie. (Fortunately, Sinatra does this for us!) 15 | 16 | # Code Example 17 | 18 | A cleaned-up version of the code from class has been posted to [https://github.com/qrohlf/webdev-examples](https://github.com/qrohlf/webdev-examples/tree/v0.7.0) (and tagged with `v0.7.0`). 19 | 20 | If you're interested in implementing user login in your final project, I highly recommend reading the `app.rb` file from the example app in it's entirety. I've added extensive comments explaining the ins and outs of implementing a simple login system with Sinatra. 21 | 22 | # Further Reading 23 | 24 | This version of the app introduces a few new concepts: Rack sessions, ActiveRecord `has_secure_password` methods, and ActiveRecord validations. 25 | 26 | - To learn more about using Rack sessions with Sinatra, see the [Sinatra README](http://www.sinatrarb.com/intro.html#Using%20Sessions). 27 | - To learn more about the `has_secure_password` features for ActiveRecord, see the [Rails documentation](http://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html). 28 | - To learn more about ActiveRecord validations, see RailsGuides [Active Record Validations](http://guides.rubyonrails.org/active_record_validations.html) chapter. -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | name: Sensible Web Development 2 | markdown: redcarpet 3 | redcarpet: 4 | extensions: 5 | - tables 6 | - with_toc_data 7 | - fenced_code_blocks 8 | highlighter: pygments 9 | baseurl: '' 10 | tracking_id: UA-40241848-2 11 | tracking_property: qrohlf.com 12 | github_repo: qrohlf/sensible-web-development 13 | exclude: [compass.rb, config.ru, Gemfile, Gemfile.lock, Procfile, Rakefile, README.md, sass, unicorn.rb, vendor] 14 | collections: 15 | chapters: 16 | output: true 17 | -------------------------------------------------------------------------------- /_includes/analytics.js: -------------------------------------------------------------------------------- 1 | (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 2 | (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 3 | m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 4 | })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); 5 | 6 | ga('create', '{{site.tracking_id}}', '{{site.tracking_property}}'); 7 | ga('send', 'pageview'); -------------------------------------------------------------------------------- /_includes/footer.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_includes/head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | {% if page.title %}{{ page.title }} · {{ site.name }} {% else %}{{ site.name }} by @qrohlf{% endif %} 10 | 11 | 12 | 13 | 17 | 18 | -------------------------------------------------------------------------------- /_includes/header.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_layouts/blog.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 | {% for post in site.posts %} 6 |

{{ post.title }}

7 |

{{ post.summary }}

8 |

{{ post.date | date: "%d %h %Y" }}

9 | {% endfor %} -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% include head.html %} 5 | 6 | 7 | 8 | {% include header.html %} 9 | 10 |
11 |
12 |
13 |
14 | 20 | {% toc %} 21 |
22 |
23 | {{ content }} 24 | {% for chapter in site.sorted_chapters %} 25 | {% if chapter.url == page.url %} 26 | {% assign next = site.sorted_chapters[forloop.index] %} 27 | {% endif %} 28 | {% endfor %} 29 | {% if next.url %} 30 |
31 | 34 |
35 | {% endif %} 36 |
37 |
38 |
39 |
40 | 41 | {% include footer.html %} 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /_layouts/intro.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 |

Week {{page.index}}: {{page.subtitle}}

6 |

Class date: {{page.date}}

7 | 8 | {% if page.overview %} 9 |

Overview

10 | {{page.overview | markdownify}} 11 | {% endif %} 12 | 13 | {% if page.due %} 14 |

Due

15 | {{page.due | markdownify}} 16 | {% endif %} 17 | 18 | {% if page.reading %} 19 |

Reading

20 | {{page.reading | markdownify}} 21 | {% endif %} 22 | 23 | {{ content }} 24 | 25 | {% if page.assignment %} 26 |

This Week's Assignment

27 |
28 |
29 |

{{page.assignment.title}}

30 |
31 |
32 |

{{page.assignment.summary | markdownify}}

33 |

Requirements:

34 | 39 |

Due Date:

40 |

{{page.assignment.due | markdownify}}

41 |
42 | 45 |
46 |

47 | {% endif %} 48 | -------------------------------------------------------------------------------- /_layouts/schedule.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 | {{content}} 6 | 7 | {% schedule %} -------------------------------------------------------------------------------- /_plugins/schedule.rb: -------------------------------------------------------------------------------- 1 | module Jekyll 2 | class ScheduleTag < Liquid::Tag 3 | 4 | def initialize(tag_name, text, tokens) 5 | super 6 | @text = text 7 | end 8 | 9 | def render(context) 10 | toc = [] 11 | @site = context.registers[:site] 12 | 13 | output = [] 14 | @site.config['chapter_groups'].each do |i, c| 15 | intro = c[0].data 16 | next if intro['layout'] != 'intro' 17 | output << "

Week #{intro['index']}: #{intro['subtitle']}#{intro['date']}

" 18 | output << "

Assignments Due

#{md(intro['due'])}" unless intro['due'].nil? 19 | output << "

Reading Due

#{md(intro['reading'])}" unless intro['reading'].nil? 20 | output << "

Workshop Topic

#{md(intro['workshop'])}" unless intro['workshop'].nil? 21 | output << "

Lab Assigned

#{md(intro['assignment']['title'])}" unless intro['assignment'].nil? 22 | end 23 | output.join(''); 24 | end 25 | 26 | def md(string) 27 | converter = @site.getConverterImpl(::Jekyll::Converters::Markdown) 28 | converter.convert(string) 29 | end 30 | end 31 | end 32 | 33 | Liquid::Template.register_tag('schedule', Jekyll::ScheduleTag) 34 | 35 | -------------------------------------------------------------------------------- /_plugins/sorted_chapters.rb: -------------------------------------------------------------------------------- 1 | module Next 2 | class Generator < Jekyll::Generator 3 | def generate(site) 4 | # puts site.collections["chapters"].docs.class 5 | chapter_groups = site.collections["chapters"].docs.group_by do |section| 6 | section.relative_path.split('/')[1] # group by chapter number 7 | end 8 | chapter_groups_sorted = Hash[chapter_groups.sort_by{|i, c| i.to_i}] # sort the chapters 9 | chapter_groups_sorted.each do |k, v| 10 | v.sort_by!{|i, c| i.to_i} if v.class == 'Array' # sort the sections 11 | end 12 | site.config['chapter_groups'] = chapter_groups_sorted 13 | site.config['sorted_chapters'] = chapter_groups_sorted.values.flatten 14 | end 15 | end 16 | end -------------------------------------------------------------------------------- /_plugins/toc.rb: -------------------------------------------------------------------------------- 1 | module Jekyll 2 | class TocTag < Liquid::Tag 3 | 4 | def initialize(tag_name, text, tokens) 5 | super 6 | @text = text 7 | end 8 | 9 | def render(context) 10 | toc = [] 11 | @page = context.environments.first["page"] 12 | current_chapter = @page['relative_path'].split('/')[1] unless @page['relative_path'].nil? 13 | current_chapter = '-1' unless current_chapter =~ /^\d+$/ #default to chapter 0 14 | site = context.registers[:site] 15 | @baseurl = site.config['baseurl'] 16 | 17 | site.config['chapter_groups'].each do |i, c| 18 | toc << list_group_item(c[0]) 19 | if i == current_chapter 20 | c.drop(1).each do |section| 21 | toc << list_group_item(section, ['section']) 22 | end 23 | end 24 | end 25 | "
#{toc.join('')}
" 26 | end 27 | 28 | def list_group_item(section, classes=[]) 29 | subtitle = section.data['subtitle'] 30 | index = section.data['index'] 31 | unless index.nil? 32 | label = "#{index} · #{subtitle}" 33 | else 34 | label = subtitle 35 | end 36 | classes << 'list-group-item' 37 | classes << 'active' if @page['url'] == section.url 38 | "#{label}" 39 | end 40 | end 41 | end 42 | 43 | Liquid::Template.register_tag('toc', Jekyll::TocTag) 44 | -------------------------------------------------------------------------------- /_templates/intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | subtitle: Week Title 3 | summary: week summary 4 | layout: intro 5 | index: 0 6 | 7 | date: 8 | month and day 9 | 10 | overview: 11 | a brief overview (markdown allowed) of the week's topics 12 | 13 | reading: 14 | a reminder of what reading is due 15 | 16 | due: 17 | a reminder of what assignments are due 18 | 19 | workshop: 20 | short description of the workshop topic 21 | 22 | assignment: 23 | title: "Lab 0: Lab Title" 24 | summary: a short description of the lab 25 | requirements: 26 | - A list of items that are required for the lab 27 | - these can have inline markdown formatting 28 | due: before next week's class 29 | tag: v0.0.0 30 | --- -------------------------------------------------------------------------------- /blog.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: Blog 3 | layout: blog 4 | permalink: blog/index.html 5 | --- 6 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simplify", 3 | "version": "0.0.1", 4 | "authors": [ 5 | "Quinn Rohlf " 6 | ], 7 | "description": "My jekyll theme", 8 | "license": "Copyright 2014 Quinn Rohlf", 9 | "homepage": "http://qrohlf.com", 10 | "private": true, 11 | "ignore": [ 12 | "**/.*", 13 | "node_modules", 14 | "bower_components", 15 | "test", 16 | "tests" 17 | ], 18 | "dependencies": { 19 | "bootstrap-sass-official": "~3.1.1", 20 | "trianglify": "~0.1.3", 21 | "d3": "~3.4.6", 22 | "jquery": "~2.1.0", 23 | "bootstrap": "~3.1.1" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap-sass", 3 | "version": "3.1.1", 4 | "homepage": "https://github.com/twbs/bootstrap-sass", 5 | "authors": [ 6 | "Thomas McDonald", 7 | "Tristan Harward", 8 | "Peter Gumeson", 9 | "Gleb Mazovetskiy" 10 | ], 11 | "description": "bootstrap-sass is a Sass-powered version of Bootstrap, ready to drop right into your Sass powered applications.", 12 | "main": [ 13 | "vendor/assets/stylesheets/bootstrap.scss", 14 | "vendor/assets/javascripts/bootstrap.js" 15 | ], 16 | "keywords": [ 17 | "twbs", 18 | "bootstrap", 19 | "sass" 20 | ], 21 | "license": "MIT", 22 | "ignore": [ 23 | "**/.*", 24 | "lib", 25 | "tasks", 26 | "templates", 27 | "test", 28 | "*.gemspec", 29 | "Rakefile", 30 | "Gemfile" 31 | ], 32 | "_release": "3.1.1", 33 | "_resolution": { 34 | "type": "version", 35 | "tag": "v3.1.1", 36 | "commit": "cd4062f43dcb5293da8b10ee455a5c6d0aab0b91" 37 | }, 38 | "_source": "git://github.com/twbs/bootstrap-sass.git", 39 | "_target": "~3.1.1", 40 | "_originalSource": "bootstrap-sass-official", 41 | "_direct": true 42 | } -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 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 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap-sass", 3 | "version": "3.1.1", 4 | "homepage": "https://github.com/twbs/bootstrap-sass", 5 | "authors": [ 6 | "Thomas McDonald", 7 | "Tristan Harward", 8 | "Peter Gumeson", 9 | "Gleb Mazovetskiy" 10 | ], 11 | "description": "bootstrap-sass is a Sass-powered version of Bootstrap, ready to drop right into your Sass powered applications.", 12 | "main": ["vendor/assets/stylesheets/bootstrap.scss", "vendor/assets/javascripts/bootstrap.js"], 13 | "keywords": [ 14 | "twbs", 15 | "bootstrap", 16 | "sass" 17 | ], 18 | "license": "MIT", 19 | "ignore": [ 20 | "**/.*", "lib", "tasks", "templates", "test", "*.gemspec", "Rakefile", "Gemfile" 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "twbs/bootstrap-sass", 3 | "description": "bootstrap-sass is a Sass-powered version of Bootstrap, ready to drop right into your Sass powered applications.", 4 | "keywords": ["bootstrap", "css", "sass"], 5 | "homepage": "http://github.com/twbs/bootstrap-sass", 6 | "authors": [ 7 | { 8 | "name": "Thomas McDonald" 9 | }, 10 | { 11 | "name": "Tristan Harward" 12 | }, 13 | { 14 | "name": "Peter Gumeson" 15 | }, 16 | { 17 | "name": "Gleb Mazovetskiy" 18 | }, 19 | { 20 | "name": "Mark Otto" 21 | }, 22 | { 23 | "name": "Jacob Thornton" 24 | } 25 | ], 26 | "support": { 27 | "issues": "https://github.com/twbs/bootstrap-sass/issues" 28 | }, 29 | "license": "MIT", 30 | "extra": { 31 | "branch-alias": { 32 | "dev-master": "3.1.x-dev" 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/fonts/bootstrap/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qrohlf/sensible-web-development/cf636a6b22cd68a9cecbc7d61c69b7b3e1aa031b/bower_components/bootstrap-sass-official/vendor/assets/fonts/bootstrap/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qrohlf/sensible-web-development/cf636a6b22cd68a9cecbc7d61c69b7b3e1aa031b/bower_components/bootstrap-sass-official/vendor/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/fonts/bootstrap/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qrohlf/sensible-web-development/cf636a6b22cd68a9cecbc7d61c69b7b3e1aa031b/bower_components/bootstrap-sass-official/vendor/assets/fonts/bootstrap/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap.js: -------------------------------------------------------------------------------- 1 | //= require bootstrap/affix 2 | //= require bootstrap/alert 3 | //= require bootstrap/button 4 | //= require bootstrap/carousel 5 | //= require bootstrap/collapse 6 | //= require bootstrap/dropdown 7 | //= require bootstrap/tab 8 | //= require bootstrap/transition 9 | //= require bootstrap/scrollspy 10 | //= require bootstrap/modal 11 | //= require bootstrap/tooltip 12 | //= require bootstrap/popover 13 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/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 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/transition.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: transition.js v3.1.1 3 | * http://getbootstrap.com/javascript/#transitions 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 | // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) 14 | // ============================================================ 15 | 16 | function transitionEnd() { 17 | var el = document.createElement('bootstrap') 18 | 19 | var transEndEventNames = { 20 | 'WebkitTransition' : 'webkitTransitionEnd', 21 | 'MozTransition' : 'transitionend', 22 | 'OTransition' : 'oTransitionEnd otransitionend', 23 | 'transition' : 'transitionend' 24 | } 25 | 26 | for (var name in transEndEventNames) { 27 | if (el.style[name] !== undefined) { 28 | return { end: transEndEventNames[name] } 29 | } 30 | } 31 | 32 | return false // explicit for ie8 ( ._.) 33 | } 34 | 35 | // http://blog.alexmaccaw.com/css-transitions 36 | $.fn.emulateTransitionEnd = function (duration) { 37 | var called = false, $el = this 38 | $(this).one($.support.transition.end, function () { called = true }) 39 | var callback = function () { if (!called) $($el).trigger($.support.transition.end) } 40 | setTimeout(callback, duration) 41 | return this 42 | } 43 | 44 | $(function () { 45 | $.support.transition = transitionEnd() 46 | }) 47 | 48 | }(jQuery); 49 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap.scss: -------------------------------------------------------------------------------- 1 | // Core variables and mixins 2 | @import "bootstrap/variables"; 3 | @import "bootstrap/mixins"; 4 | 5 | // Reset 6 | @import "bootstrap/normalize"; 7 | @import "bootstrap/print"; 8 | 9 | // Core CSS 10 | @import "bootstrap/scaffolding"; 11 | @import "bootstrap/type"; 12 | @import "bootstrap/code"; 13 | @import "bootstrap/grid"; 14 | @import "bootstrap/tables"; 15 | @import "bootstrap/forms"; 16 | @import "bootstrap/buttons"; 17 | 18 | // Components 19 | @import "bootstrap/component-animations"; 20 | @import "bootstrap/glyphicons"; 21 | @import "bootstrap/dropdowns"; 22 | @import "bootstrap/button-groups"; 23 | @import "bootstrap/input-groups"; 24 | @import "bootstrap/navs"; 25 | @import "bootstrap/navbar"; 26 | @import "bootstrap/breadcrumbs"; 27 | @import "bootstrap/pagination"; 28 | @import "bootstrap/pager"; 29 | @import "bootstrap/labels"; 30 | @import "bootstrap/badges"; 31 | @import "bootstrap/jumbotron"; 32 | @import "bootstrap/thumbnails"; 33 | @import "bootstrap/alerts"; 34 | @import "bootstrap/progress-bars"; 35 | @import "bootstrap/media"; 36 | @import "bootstrap/list-group"; 37 | @import "bootstrap/panels"; 38 | @import "bootstrap/wells"; 39 | @import "bootstrap/close"; 40 | 41 | // Components w/ JavaScript 42 | @import "bootstrap/modals"; 43 | @import "bootstrap/tooltip"; 44 | @import "bootstrap/popovers"; 45 | @import "bootstrap/carousel"; 46 | 47 | // Utility classes 48 | @import "bootstrap/utilities"; 49 | @import "bootstrap/responsive-utilities"; 50 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_alerts.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Alerts 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base styles 7 | // ------------------------- 8 | 9 | .alert { 10 | padding: $alert-padding; 11 | margin-bottom: $line-height-computed; 12 | border: 1px solid transparent; 13 | border-radius: $alert-border-radius; 14 | 15 | // Headings for larger alerts 16 | h4 { 17 | margin-top: 0; 18 | // Specified for the h4 to prevent conflicts of changing $headings-color 19 | color: inherit; 20 | } 21 | // Provide class for links that match alerts 22 | .alert-link { 23 | font-weight: $alert-link-font-weight; 24 | } 25 | 26 | // Improve alignment and spacing of inner content 27 | > p, 28 | > ul { 29 | margin-bottom: 0; 30 | } 31 | > p + p { 32 | margin-top: 5px; 33 | } 34 | } 35 | 36 | // Dismissable alerts 37 | // 38 | // Expand the right padding and account for the close button's positioning. 39 | 40 | .alert-dismissable { 41 | padding-right: ($alert-padding + 20); 42 | 43 | // Adjust close link position 44 | .close { 45 | position: relative; 46 | top: -2px; 47 | right: -21px; 48 | color: inherit; 49 | } 50 | } 51 | 52 | // Alternate styles 53 | // 54 | // Generate contextual modifier classes for colorizing the alert. 55 | 56 | .alert-success { 57 | @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text); 58 | } 59 | .alert-info { 60 | @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text); 61 | } 62 | .alert-warning { 63 | @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text); 64 | } 65 | .alert-danger { 66 | @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text); 67 | } 68 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_badges.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Badges 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base classes 7 | .badge { 8 | display: inline-block; 9 | min-width: 10px; 10 | padding: 3px 7px; 11 | font-size: $font-size-small; 12 | font-weight: $badge-font-weight; 13 | color: $badge-color; 14 | line-height: $badge-line-height; 15 | vertical-align: baseline; 16 | white-space: nowrap; 17 | text-align: center; 18 | background-color: $badge-bg; 19 | border-radius: $badge-border-radius; 20 | 21 | // Empty badges collapse automatically (not available in IE8) 22 | &:empty { 23 | display: none; 24 | } 25 | 26 | // Quick fix for badges in buttons 27 | .btn & { 28 | position: relative; 29 | top: -1px; 30 | } 31 | .btn-xs & { 32 | top: 0; 33 | padding: 1px 5px; 34 | } 35 | } 36 | 37 | // Hover state, but only for links 38 | a.badge { 39 | &:hover, 40 | &:focus { 41 | color: $badge-link-hover-color; 42 | text-decoration: none; 43 | cursor: pointer; 44 | } 45 | } 46 | 47 | // Account for counters in navs 48 | a.list-group-item.active > .badge, 49 | .nav-pills > .active > a > .badge { 50 | color: $badge-active-color; 51 | background-color: $badge-active-bg; 52 | } 53 | .nav-pills > li > a > .badge { 54 | margin-left: 3px; 55 | } 56 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_breadcrumbs.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Breadcrumbs 3 | // -------------------------------------------------- 4 | 5 | 6 | .breadcrumb { 7 | padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal; 8 | margin-bottom: $line-height-computed; 9 | list-style: none; 10 | background-color: $breadcrumb-bg; 11 | border-radius: $border-radius-base; 12 | 13 | > li { 14 | display: inline-block; 15 | 16 | + li:before { 17 | content: "#{$breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space 18 | padding: 0 5px; 19 | color: $breadcrumb-color; 20 | } 21 | } 22 | 23 | > .active { 24 | color: $breadcrumb-active-color; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_close.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Close icons 3 | // -------------------------------------------------- 4 | 5 | 6 | .close { 7 | float: right; 8 | font-size: ($font-size-base * 1.5); 9 | font-weight: $close-font-weight; 10 | line-height: 1; 11 | color: $close-color; 12 | text-shadow: $close-text-shadow; 13 | @include opacity(.2); 14 | 15 | &:hover, 16 | &:focus { 17 | color: $close-color; 18 | text-decoration: none; 19 | cursor: pointer; 20 | @include opacity(.5); 21 | } 22 | 23 | // [converter] extracted button& to button.close 24 | } 25 | 26 | // Additional properties for button version 27 | // iOS requires the button element instead of an anchor tag. 28 | // If you want the anchor version, it requires `href="#"`. 29 | button.close { 30 | padding: 0; 31 | cursor: pointer; 32 | background: transparent; 33 | border: 0; 34 | -webkit-appearance: none; 35 | } 36 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_code.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Code (inline and block) 3 | // -------------------------------------------------- 4 | 5 | 6 | // Inline and block code styles 7 | code, 8 | kbd, 9 | pre, 10 | samp { 11 | font-family: $font-family-monospace; 12 | } 13 | 14 | // Inline code 15 | code { 16 | padding: 2px 4px; 17 | font-size: 90%; 18 | color: $code-color; 19 | background-color: $code-bg; 20 | white-space: nowrap; 21 | border-radius: $border-radius-base; 22 | } 23 | 24 | // User input typically entered via keyboard 25 | kbd { 26 | padding: 2px 4px; 27 | font-size: 90%; 28 | color: $kbd-color; 29 | background-color: $kbd-bg; 30 | border-radius: $border-radius-small; 31 | box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); 32 | } 33 | 34 | // Blocks of code 35 | pre { 36 | display: block; 37 | padding: (($line-height-computed - 1) / 2); 38 | margin: 0 0 ($line-height-computed / 2); 39 | font-size: ($font-size-base - 1); // 14px to 13px 40 | line-height: $line-height-base; 41 | word-break: break-all; 42 | word-wrap: break-word; 43 | color: $pre-color; 44 | background-color: $pre-bg; 45 | border: 1px solid $pre-border-color; 46 | border-radius: $border-radius-base; 47 | 48 | // Account for some code outputs that place code tags in pre tags 49 | code { 50 | padding: 0; 51 | font-size: inherit; 52 | color: inherit; 53 | white-space: pre-wrap; 54 | background-color: transparent; 55 | border-radius: 0; 56 | } 57 | } 58 | 59 | // Enable scrollable blocks of code 60 | .pre-scrollable { 61 | max-height: $pre-scrollable-max-height; 62 | overflow-y: scroll; 63 | } 64 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_component-animations.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component animations 3 | // -------------------------------------------------- 4 | 5 | // Heads up! 6 | // 7 | // We don't use the `.opacity()` mixin here since it causes a bug with text 8 | // fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552. 9 | 10 | .fade { 11 | opacity: 0; 12 | @include transition(opacity .15s linear); 13 | &.in { 14 | opacity: 1; 15 | } 16 | } 17 | 18 | .collapse { 19 | display: none; 20 | &.in { 21 | display: block; 22 | } 23 | } 24 | .collapsing { 25 | position: relative; 26 | height: 0; 27 | overflow: hidden; 28 | @include transition(height .35s ease); 29 | } 30 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_grid.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Grid system 3 | // -------------------------------------------------- 4 | 5 | 6 | // Container widths 7 | // 8 | // Set the container width, and override it for fixed navbars in media queries. 9 | 10 | .container { 11 | @include container-fixed(); 12 | 13 | @media (min-width: $screen-sm-min) { 14 | width: $container-sm; 15 | } 16 | @media (min-width: $screen-md-min) { 17 | width: $container-md; 18 | } 19 | @media (min-width: $screen-lg-min) { 20 | width: $container-lg; 21 | } 22 | } 23 | 24 | 25 | // Fluid container 26 | // 27 | // Utilizes the mixin meant for fixed width containers, but without any defined 28 | // width for fluid, full width layouts. 29 | 30 | .container-fluid { 31 | @include container-fixed(); 32 | } 33 | 34 | 35 | // Row 36 | // 37 | // Rows contain and clear the floats of your columns. 38 | 39 | .row { 40 | @include make-row(); 41 | } 42 | 43 | 44 | // Columns 45 | // 46 | // Common styles for small and large grid columns 47 | 48 | @include make-grid-columns(); 49 | 50 | 51 | // Extra small grid 52 | // 53 | // Columns, offsets, pushes, and pulls for extra small devices like 54 | // smartphones. 55 | 56 | @include make-grid(xs); 57 | 58 | 59 | // Small grid 60 | // 61 | // Columns, offsets, pushes, and pulls for the small device range, from phones 62 | // to tablets. 63 | 64 | @media (min-width: $screen-sm-min) { 65 | @include make-grid(sm); 66 | } 67 | 68 | 69 | // Medium grid 70 | // 71 | // Columns, offsets, pushes, and pulls for the desktop device range. 72 | 73 | @media (min-width: $screen-md-min) { 74 | @include make-grid(md); 75 | } 76 | 77 | 78 | // Large grid 79 | // 80 | // Columns, offsets, pushes, and pulls for the large desktop device range. 81 | 82 | @media (min-width: $screen-lg-min) { 83 | @include make-grid(lg); 84 | } 85 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_jumbotron.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Jumbotron 3 | // -------------------------------------------------- 4 | 5 | 6 | .jumbotron { 7 | padding: $jumbotron-padding; 8 | margin-bottom: $jumbotron-padding; 9 | color: $jumbotron-color; 10 | background-color: $jumbotron-bg; 11 | 12 | h1, 13 | .h1 { 14 | color: $jumbotron-heading-color; 15 | } 16 | p { 17 | margin-bottom: ($jumbotron-padding / 2); 18 | font-size: $jumbotron-font-size; 19 | font-weight: 200; 20 | } 21 | 22 | .container & { 23 | border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container 24 | } 25 | 26 | .container { 27 | max-width: 100%; 28 | } 29 | 30 | @media screen and (min-width: $screen-sm-min) { 31 | padding-top: ($jumbotron-padding * 1.6); 32 | padding-bottom: ($jumbotron-padding * 1.6); 33 | 34 | .container & { 35 | padding-left: ($jumbotron-padding * 2); 36 | padding-right: ($jumbotron-padding * 2); 37 | } 38 | 39 | h1, 40 | .h1 { 41 | font-size: ($font-size-base * 4.5); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_labels.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Labels 3 | // -------------------------------------------------- 4 | 5 | .label { 6 | display: inline; 7 | padding: .2em .6em .3em; 8 | font-size: 75%; 9 | font-weight: bold; 10 | line-height: 1; 11 | color: $label-color; 12 | text-align: center; 13 | white-space: nowrap; 14 | vertical-align: baseline; 15 | border-radius: .25em; 16 | 17 | // Add hover effects, but only for links 18 | &[href] { 19 | &:hover, 20 | &:focus { 21 | color: $label-link-hover-color; 22 | text-decoration: none; 23 | cursor: pointer; 24 | } 25 | } 26 | 27 | // Empty labels collapse automatically (not available in IE8) 28 | &:empty { 29 | display: none; 30 | } 31 | 32 | // Quick fix for labels in buttons 33 | .btn & { 34 | position: relative; 35 | top: -1px; 36 | } 37 | } 38 | 39 | // Colors 40 | // Contextual variations (linked labels get darker on :hover) 41 | 42 | .label-default { 43 | @include label-variant($label-default-bg); 44 | } 45 | 46 | .label-primary { 47 | @include label-variant($label-primary-bg); 48 | } 49 | 50 | .label-success { 51 | @include label-variant($label-success-bg); 52 | } 53 | 54 | .label-info { 55 | @include label-variant($label-info-bg); 56 | } 57 | 58 | .label-warning { 59 | @include label-variant($label-warning-bg); 60 | } 61 | 62 | .label-danger { 63 | @include label-variant($label-danger-bg); 64 | } 65 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_media.scss: -------------------------------------------------------------------------------- 1 | // Media objects 2 | // Source: http://stubbornella.org/content/?p=497 3 | // -------------------------------------------------- 4 | 5 | 6 | // Common styles 7 | // ------------------------- 8 | 9 | // Clear the floats 10 | .media, 11 | .media-body { 12 | overflow: hidden; 13 | zoom: 1; 14 | } 15 | 16 | // Proper spacing between instances of .media 17 | .media, 18 | .media .media { 19 | margin-top: 15px; 20 | } 21 | .media:first-child { 22 | margin-top: 0; 23 | } 24 | 25 | // For images and videos, set to block 26 | .media-object { 27 | display: block; 28 | } 29 | 30 | // Reset margins on headings for tighter default spacing 31 | .media-heading { 32 | margin: 0 0 5px; 33 | } 34 | 35 | 36 | // Media image alignment 37 | // ------------------------- 38 | 39 | .media { 40 | > .pull-left { 41 | margin-right: 10px; 42 | } 43 | > .pull-right { 44 | margin-left: 10px; 45 | } 46 | } 47 | 48 | 49 | // Media list variation 50 | // ------------------------- 51 | 52 | // Undo default ul/ol styles 53 | .media-list { 54 | padding-left: 0; 55 | list-style: none; 56 | } 57 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_pager.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Pager pagination 3 | // -------------------------------------------------- 4 | 5 | 6 | .pager { 7 | padding-left: 0; 8 | margin: $line-height-computed 0; 9 | list-style: none; 10 | text-align: center; 11 | @include clearfix(); 12 | li { 13 | display: inline; 14 | > a, 15 | > span { 16 | display: inline-block; 17 | padding: 5px 14px; 18 | background-color: $pager-bg; 19 | border: 1px solid $pager-border; 20 | border-radius: $pager-border-radius; 21 | } 22 | 23 | > a:hover, 24 | > a:focus { 25 | text-decoration: none; 26 | background-color: $pager-hover-bg; 27 | } 28 | } 29 | 30 | .next { 31 | > a, 32 | > span { 33 | float: right; 34 | } 35 | } 36 | 37 | .previous { 38 | > a, 39 | > span { 40 | float: left; 41 | } 42 | } 43 | 44 | .disabled { 45 | > a, 46 | > a:hover, 47 | > a:focus, 48 | > span { 49 | color: $pager-disabled-color; 50 | background-color: $pager-bg; 51 | cursor: not-allowed; 52 | } 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_pagination.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Pagination (multiple pages) 3 | // -------------------------------------------------- 4 | .pagination { 5 | display: inline-block; 6 | padding-left: 0; 7 | margin: $line-height-computed 0; 8 | border-radius: $border-radius-base; 9 | 10 | > li { 11 | display: inline; // Remove list-style and block-level defaults 12 | > a, 13 | > span { 14 | position: relative; 15 | float: left; // Collapse white-space 16 | padding: $padding-base-vertical $padding-base-horizontal; 17 | line-height: $line-height-base; 18 | text-decoration: none; 19 | color: $pagination-color; 20 | background-color: $pagination-bg; 21 | border: 1px solid $pagination-border; 22 | margin-left: -1px; 23 | } 24 | &:first-child { 25 | > a, 26 | > span { 27 | margin-left: 0; 28 | @include border-left-radius($border-radius-base); 29 | } 30 | } 31 | &:last-child { 32 | > a, 33 | > span { 34 | @include border-right-radius($border-radius-base); 35 | } 36 | } 37 | } 38 | 39 | > li > a, 40 | > li > span { 41 | &:hover, 42 | &:focus { 43 | color: $pagination-hover-color; 44 | background-color: $pagination-hover-bg; 45 | border-color: $pagination-hover-border; 46 | } 47 | } 48 | 49 | > .active > a, 50 | > .active > span { 51 | &, 52 | &:hover, 53 | &:focus { 54 | z-index: 2; 55 | color: $pagination-active-color; 56 | background-color: $pagination-active-bg; 57 | border-color: $pagination-active-border; 58 | cursor: default; 59 | } 60 | } 61 | 62 | > .disabled { 63 | > span, 64 | > span:hover, 65 | > span:focus, 66 | > a, 67 | > a:hover, 68 | > a:focus { 69 | color: $pagination-disabled-color; 70 | background-color: $pagination-disabled-bg; 71 | border-color: $pagination-disabled-border; 72 | cursor: not-allowed; 73 | } 74 | } 75 | } 76 | 77 | // Sizing 78 | // -------------------------------------------------- 79 | 80 | // Large 81 | .pagination-lg { 82 | @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $border-radius-large); 83 | } 84 | 85 | // Small 86 | .pagination-sm { 87 | @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $border-radius-small); 88 | } 89 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_print.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Basic print styles 3 | // -------------------------------------------------- 4 | // Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css 5 | 6 | @media print { 7 | 8 | * { 9 | text-shadow: none !important; 10 | color: #000 !important; // Black prints faster: h5bp.com/s 11 | background: transparent !important; 12 | box-shadow: none !important; 13 | } 14 | 15 | a, 16 | a:visited { 17 | text-decoration: underline; 18 | } 19 | 20 | a[href]:after { 21 | content: " (" attr(href) ")"; 22 | } 23 | 24 | abbr[title]:after { 25 | content: " (" attr(title) ")"; 26 | } 27 | 28 | // Don't show links for images, or javascript/internal links 29 | a[href^="javascript:"]:after, 30 | a[href^="#"]:after { 31 | content: ""; 32 | } 33 | 34 | pre, 35 | blockquote { 36 | border: 1px solid #999; 37 | page-break-inside: avoid; 38 | } 39 | 40 | thead { 41 | display: table-header-group; // h5bp.com/t 42 | } 43 | 44 | tr, 45 | img { 46 | page-break-inside: avoid; 47 | } 48 | 49 | img { 50 | max-width: 100% !important; 51 | } 52 | 53 | p, 54 | h2, 55 | h3 { 56 | orphans: 3; 57 | widows: 3; 58 | } 59 | 60 | h2, 61 | h3 { 62 | page-break-after: avoid; 63 | } 64 | 65 | // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245 66 | // Once fixed, we can just straight up remove this. 67 | select { 68 | background: #fff !important; 69 | } 70 | 71 | // Bootstrap components 72 | .navbar { 73 | display: none; 74 | } 75 | .table { 76 | td, 77 | th { 78 | background-color: #fff !important; 79 | } 80 | } 81 | .btn, 82 | .dropup > .btn { 83 | > .caret { 84 | border-top-color: #000 !important; 85 | } 86 | } 87 | .label { 88 | border: 1px solid #000; 89 | } 90 | 91 | .table { 92 | border-collapse: collapse !important; 93 | } 94 | .table-bordered { 95 | th, 96 | td { 97 | border: 1px solid #ddd !important; 98 | } 99 | } 100 | 101 | } 102 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_progress-bars.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Progress bars 3 | // -------------------------------------------------- 4 | 5 | 6 | // Bar animations 7 | // ------------------------- 8 | 9 | // WebKit 10 | @-webkit-keyframes progress-bar-stripes { 11 | from { background-position: 40px 0; } 12 | to { background-position: 0 0; } 13 | } 14 | 15 | // Spec and IE10+ 16 | @keyframes progress-bar-stripes { 17 | from { background-position: 40px 0; } 18 | to { background-position: 0 0; } 19 | } 20 | 21 | 22 | 23 | // Bar itself 24 | // ------------------------- 25 | 26 | // Outer container 27 | .progress { 28 | overflow: hidden; 29 | height: $line-height-computed; 30 | margin-bottom: $line-height-computed; 31 | background-color: $progress-bg; 32 | border-radius: $border-radius-base; 33 | @include box-shadow(inset 0 1px 2px rgba(0,0,0,.1)); 34 | } 35 | 36 | // Bar of progress 37 | .progress-bar { 38 | float: left; 39 | width: 0%; 40 | height: 100%; 41 | font-size: $font-size-small; 42 | line-height: $line-height-computed; 43 | color: $progress-bar-color; 44 | text-align: center; 45 | background-color: $progress-bar-bg; 46 | @include box-shadow(inset 0 -1px 0 rgba(0,0,0,.15)); 47 | @include transition(width .6s ease); 48 | } 49 | 50 | // Striped bars 51 | .progress-striped .progress-bar { 52 | @include gradient-striped(); 53 | background-size: 40px 40px; 54 | } 55 | 56 | // Call animation for the active one 57 | .progress.active .progress-bar { 58 | @include animation(progress-bar-stripes 2s linear infinite); 59 | } 60 | 61 | 62 | 63 | // Variations 64 | // ------------------------- 65 | 66 | .progress-bar-success { 67 | @include progress-bar-variant($progress-bar-success-bg); 68 | } 69 | 70 | .progress-bar-info { 71 | @include progress-bar-variant($progress-bar-info-bg); 72 | } 73 | 74 | .progress-bar-warning { 75 | @include progress-bar-variant($progress-bar-warning-bg); 76 | } 77 | 78 | .progress-bar-danger { 79 | @include progress-bar-variant($progress-bar-danger-bg); 80 | } 81 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_responsive-utilities.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Responsive: Utility classes 3 | // -------------------------------------------------- 4 | 5 | 6 | // IE10 in Windows (Phone) 8 7 | // 8 | // Support for responsive views via media queries is kind of borked in IE10, for 9 | // Surface/desktop in split view and for Windows Phone 8. This particular fix 10 | // must be accompanied by a snippet of JavaScript to sniff the user agent and 11 | // apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at 12 | // our Getting Started page for more information on this bug. 13 | // 14 | // For more information, see the following: 15 | // 16 | // Issue: https://github.com/twbs/bootstrap/issues/10497 17 | // Docs: http://getbootstrap.com/getting-started/#browsers 18 | // Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/ 19 | 20 | @-ms-viewport { 21 | width: device-width; 22 | } 23 | 24 | 25 | // Visibility utilities 26 | 27 | @include responsive-invisibility('.visible-xs, .visible-sm, .visible-md, .visible-lg'); 28 | 29 | @media (max-width: $screen-xs-max) { 30 | @include responsive-visibility('.visible-xs'); 31 | } 32 | 33 | @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) { 34 | @include responsive-visibility('.visible-sm'); 35 | } 36 | 37 | @media (min-width: $screen-md-min) and (max-width: $screen-md-max) { 38 | @include responsive-visibility('.visible-md'); 39 | } 40 | 41 | @media (min-width: $screen-lg-min) { 42 | @include responsive-visibility('.visible-lg'); 43 | } 44 | 45 | @media (max-width: $screen-xs-max) { 46 | @include responsive-invisibility('.hidden-xs'); 47 | } 48 | 49 | @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) { 50 | @include responsive-invisibility('.hidden-sm'); 51 | } 52 | 53 | @media (min-width: $screen-md-min) and (max-width: $screen-md-max) { 54 | @include responsive-invisibility('.hidden-md'); 55 | } 56 | 57 | @media (min-width: $screen-lg-min) { 58 | @include responsive-invisibility('.hidden-lg'); 59 | } 60 | 61 | 62 | // Print utilities 63 | // 64 | // Media queries are placed on the inside to be mixin-friendly. 65 | 66 | @include responsive-invisibility('.visible-print'); 67 | 68 | @media print { 69 | @include responsive-visibility('.visible-print'); 70 | } 71 | 72 | @media print { 73 | @include responsive-invisibility('.hidden-print'); 74 | } 75 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_thumbnails.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Thumbnails 3 | // -------------------------------------------------- 4 | 5 | 6 | // Mixin and adjust the regular image class 7 | .thumbnail { 8 | display: block; 9 | padding: $thumbnail-padding; 10 | margin-bottom: $line-height-computed; 11 | line-height: $line-height-base; 12 | background-color: $thumbnail-bg; 13 | border: 1px solid $thumbnail-border; 14 | border-radius: $thumbnail-border-radius; 15 | @include transition(all .2s ease-in-out); 16 | 17 | > img, 18 | a > img { 19 | @include img-responsive(); 20 | margin-left: auto; 21 | margin-right: auto; 22 | } 23 | 24 | // [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active 25 | 26 | // Image captions 27 | .caption { 28 | padding: $thumbnail-caption-padding; 29 | color: $thumbnail-caption-color; 30 | } 31 | } 32 | 33 | // Add a hover state for linked versions only 34 | a.thumbnail:hover, 35 | a.thumbnail:focus, 36 | a.thumbnail.active { 37 | border-color: $link-color; 38 | } 39 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_tooltip.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Tooltips 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .tooltip { 8 | position: absolute; 9 | z-index: $zindex-tooltip; 10 | display: block; 11 | visibility: visible; 12 | font-size: $font-size-small; 13 | line-height: 1.4; 14 | @include opacity(0); 15 | 16 | &.in { @include opacity($tooltip-opacity); } 17 | &.top { margin-top: -3px; padding: $tooltip-arrow-width 0; } 18 | &.right { margin-left: 3px; padding: 0 $tooltip-arrow-width; } 19 | &.bottom { margin-top: 3px; padding: $tooltip-arrow-width 0; } 20 | &.left { margin-left: -3px; padding: 0 $tooltip-arrow-width; } 21 | } 22 | 23 | // Wrapper for the tooltip content 24 | .tooltip-inner { 25 | max-width: $tooltip-max-width; 26 | padding: 3px 8px; 27 | color: $tooltip-color; 28 | text-align: center; 29 | text-decoration: none; 30 | background-color: $tooltip-bg; 31 | border-radius: $border-radius-base; 32 | } 33 | 34 | // Arrows 35 | .tooltip-arrow { 36 | position: absolute; 37 | width: 0; 38 | height: 0; 39 | border-color: transparent; 40 | border-style: solid; 41 | } 42 | .tooltip { 43 | &.top .tooltip-arrow { 44 | bottom: 0; 45 | left: 50%; 46 | margin-left: -$tooltip-arrow-width; 47 | border-width: $tooltip-arrow-width $tooltip-arrow-width 0; 48 | border-top-color: $tooltip-arrow-color; 49 | } 50 | &.top-left .tooltip-arrow { 51 | bottom: 0; 52 | left: $tooltip-arrow-width; 53 | border-width: $tooltip-arrow-width $tooltip-arrow-width 0; 54 | border-top-color: $tooltip-arrow-color; 55 | } 56 | &.top-right .tooltip-arrow { 57 | bottom: 0; 58 | right: $tooltip-arrow-width; 59 | border-width: $tooltip-arrow-width $tooltip-arrow-width 0; 60 | border-top-color: $tooltip-arrow-color; 61 | } 62 | &.right .tooltip-arrow { 63 | top: 50%; 64 | left: 0; 65 | margin-top: -$tooltip-arrow-width; 66 | border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0; 67 | border-right-color: $tooltip-arrow-color; 68 | } 69 | &.left .tooltip-arrow { 70 | top: 50%; 71 | right: 0; 72 | margin-top: -$tooltip-arrow-width; 73 | border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width; 74 | border-left-color: $tooltip-arrow-color; 75 | } 76 | &.bottom .tooltip-arrow { 77 | top: 0; 78 | left: 50%; 79 | margin-left: -$tooltip-arrow-width; 80 | border-width: 0 $tooltip-arrow-width $tooltip-arrow-width; 81 | border-bottom-color: $tooltip-arrow-color; 82 | } 83 | &.bottom-left .tooltip-arrow { 84 | top: 0; 85 | left: $tooltip-arrow-width; 86 | border-width: 0 $tooltip-arrow-width $tooltip-arrow-width; 87 | border-bottom-color: $tooltip-arrow-color; 88 | } 89 | &.bottom-right .tooltip-arrow { 90 | top: 0; 91 | right: $tooltip-arrow-width; 92 | border-width: 0 $tooltip-arrow-width $tooltip-arrow-width; 93 | border-bottom-color: $tooltip-arrow-color; 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_utilities.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Utility classes 3 | // -------------------------------------------------- 4 | 5 | 6 | // Floats 7 | // ------------------------- 8 | 9 | .clearfix { 10 | @include clearfix(); 11 | } 12 | .center-block { 13 | @include center-block(); 14 | } 15 | .pull-right { 16 | float: right !important; 17 | } 18 | .pull-left { 19 | float: left !important; 20 | } 21 | 22 | 23 | // Toggling content 24 | // ------------------------- 25 | 26 | // Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1 27 | .hide { 28 | display: none !important; 29 | } 30 | .show { 31 | display: block !important; 32 | } 33 | .invisible { 34 | visibility: hidden; 35 | } 36 | .text-hide { 37 | @include text-hide(); 38 | } 39 | 40 | 41 | // Hide from screenreaders and browsers 42 | // 43 | // Credit: HTML5 Boilerplate 44 | 45 | .hidden { 46 | display: none !important; 47 | visibility: hidden !important; 48 | } 49 | 50 | 51 | // For Affix plugin 52 | // ------------------------- 53 | 54 | .affix { 55 | position: fixed; 56 | } 57 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/_wells.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Wells 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .well { 8 | min-height: 20px; 9 | padding: 19px; 10 | margin-bottom: 20px; 11 | background-color: $well-bg; 12 | border: 1px solid $well-border; 13 | border-radius: $border-radius-base; 14 | @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); 15 | blockquote { 16 | border-color: #ddd; 17 | border-color: rgba(0,0,0,.15); 18 | } 19 | } 20 | 21 | // Sizes 22 | .well-lg { 23 | padding: 24px; 24 | border-radius: $border-radius-large; 25 | } 26 | .well-sm { 27 | padding: 9px; 28 | border-radius: $border-radius-small; 29 | } 30 | -------------------------------------------------------------------------------- /bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/bootstrap.scss: -------------------------------------------------------------------------------- 1 | // Core variables and mixins 2 | @import "variables"; 3 | @import "mixins"; 4 | 5 | // Reset 6 | @import "normalize"; 7 | @import "print"; 8 | 9 | // Core CSS 10 | @import "scaffolding"; 11 | @import "type"; 12 | @import "code"; 13 | @import "grid"; 14 | @import "tables"; 15 | @import "forms"; 16 | @import "buttons"; 17 | 18 | // Components 19 | @import "component-animations"; 20 | @import "glyphicons"; 21 | @import "dropdowns"; 22 | @import "button-groups"; 23 | @import "input-groups"; 24 | @import "navs"; 25 | @import "navbar"; 26 | @import "breadcrumbs"; 27 | @import "pagination"; 28 | @import "pager"; 29 | @import "labels"; 30 | @import "badges"; 31 | @import "jumbotron"; 32 | @import "thumbnails"; 33 | @import "alerts"; 34 | @import "progress-bars"; 35 | @import "media"; 36 | @import "list-group"; 37 | @import "panels"; 38 | @import "wells"; 39 | @import "close"; 40 | 41 | // Components w/ JavaScript 42 | @import "modals"; 43 | @import "tooltip"; 44 | @import "popovers"; 45 | @import "carousel"; 46 | 47 | // Utility classes 48 | @import "utilities"; 49 | @import "responsive-utilities"; 50 | -------------------------------------------------------------------------------- /bower_components/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 | "_direct": true 35 | } -------------------------------------------------------------------------------- /bower_components/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 | -------------------------------------------------------------------------------- /bower_components/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 | -------------------------------------------------------------------------------- /bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qrohlf/sensible-web-development/cf636a6b22cd68a9cecbc7d61c69b7b3e1aa031b/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qrohlf/sensible-web-development/cf636a6b22cd68a9cecbc7d61c69b7b3e1aa031b/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qrohlf/sensible-web-development/cf636a6b22cd68a9cecbc7d61c69b7b3e1aa031b/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qrohlf/sensible-web-development/cf636a6b22cd68a9cecbc7d61c69b7b3e1aa031b/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qrohlf/sensible-web-development/cf636a6b22cd68a9cecbc7d61c69b7b3e1aa031b/bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qrohlf/sensible-web-development/cf636a6b22cd68a9cecbc7d61c69b7b3e1aa031b/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /bower_components/bootstrap/grunt/bs-glyphicons-data-generator.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Grunt task for Glyphicons data generation 3 | * http://getbootstrap.com 4 | * Copyright 2014 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | */ 7 | 'use strict'; 8 | var fs = require('fs'); 9 | 10 | module.exports = function generateGlyphiconsData() { 11 | // Pass encoding, utf8, so `readFileSync` will return a string instead of a 12 | // buffer 13 | var glyphiconsFile = fs.readFileSync('less/glyphicons.less', 'utf8'); 14 | var glpyhiconsLines = glyphiconsFile.split('\n'); 15 | 16 | // Use any line that starts with ".glyphicon-" and capture the class name 17 | var iconClassName = /^\.(glyphicon-[^\s]+)/; 18 | var glyphiconsData = '# This file is generated via Grunt task. **Do not edit directly.**\n' + 19 | '# See the \'build-glyphicons-data\' task in Gruntfile.js.\n\n'; 20 | for (var i = 0, len = glpyhiconsLines.length; i < len; i++) { 21 | var match = glpyhiconsLines[i].match(iconClassName); 22 | 23 | if (match !== null) { 24 | glyphiconsData += '- ' + match[1] + '\n'; 25 | } 26 | } 27 | 28 | // Create the `_data` directory if it doesn't already exist 29 | if (!fs.existsSync('docs/_data')) { 30 | fs.mkdirSync('docs/_data'); 31 | } 32 | 33 | fs.writeFileSync('docs/_data/glyphicons.yml', glyphiconsData); 34 | }; 35 | -------------------------------------------------------------------------------- /bower_components/bootstrap/grunt/bs-raw-files-generator.js: -------------------------------------------------------------------------------- 1 | /* global btoa: true */ 2 | /*! 3 | * Bootstrap Grunt task for generating raw-files.min.js for the Customizer 4 | * http://getbootstrap.com 5 | * Copyright 2014 Twitter, Inc. 6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 7 | */ 8 | 'use strict'; 9 | var btoa = require('btoa'); 10 | var fs = require('fs'); 11 | 12 | function getFiles(type) { 13 | var files = {}; 14 | fs.readdirSync(type) 15 | .filter(function (path) { 16 | return type === 'fonts' ? true : new RegExp('\\.' + type + '$').test(path); 17 | }) 18 | .forEach(function (path) { 19 | var fullPath = type + '/' + path; 20 | files[path] = (type === 'fonts' ? btoa(fs.readFileSync(fullPath)) : fs.readFileSync(fullPath, 'utf8')); 21 | }); 22 | return 'var __' + type + ' = ' + JSON.stringify(files) + '\n'; 23 | } 24 | 25 | module.exports = function generateRawFilesJs(banner) { 26 | if (!banner) { 27 | banner = ''; 28 | } 29 | var files = banner + getFiles('js') + getFiles('less') + getFiles('fonts'); 30 | fs.writeFileSync('docs/assets/js/raw-files.min.js', files); 31 | }; 32 | -------------------------------------------------------------------------------- /bower_components/bootstrap/grunt/shrinkwrap.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Grunt task for generating npm-shrinkwrap.canonical.json 3 | * http://getbootstrap.com 4 | * Copyright 2014 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | */ 7 | /* 8 | This Grunt task updates the npm-shrinkwrap.canonical.json file that's used as the key for Bootstrap's npm packages cache. 9 | This task should be run and the updated file should be committed whenever Bootstrap's dependencies change. 10 | */ 11 | 'use strict'; 12 | var canonicallyJsonStringify = require('canonical-json'); 13 | var NON_CANONICAL_FILE = 'npm-shrinkwrap.json'; 14 | var DEST_FILE = 'test-infra/npm-shrinkwrap.canonical.json'; 15 | 16 | 17 | function updateShrinkwrap(grunt) { 18 | // Assumption: Non-canonical shrinkwrap already generated by prerequisite Grunt task 19 | var shrinkwrapData = grunt.file.readJSON(NON_CANONICAL_FILE); 20 | grunt.log.writeln('Deleting ' + NON_CANONICAL_FILE.cyan + '...'); 21 | grunt.file.delete(NON_CANONICAL_FILE); 22 | // Output as Canonical JSON in correct location 23 | grunt.file.write(DEST_FILE, canonicallyJsonStringify(shrinkwrapData)); 24 | grunt.log.writeln('File ' + DEST_FILE.cyan + ' updated.'); 25 | } 26 | 27 | 28 | module.exports = updateShrinkwrap; 29 | -------------------------------------------------------------------------------- /bower_components/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 | -------------------------------------------------------------------------------- /bower_components/bootstrap/js/transition.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: transition.js v3.1.1 3 | * http://getbootstrap.com/javascript/#transitions 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 | // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) 14 | // ============================================================ 15 | 16 | function transitionEnd() { 17 | var el = document.createElement('bootstrap') 18 | 19 | var transEndEventNames = { 20 | 'WebkitTransition' : 'webkitTransitionEnd', 21 | 'MozTransition' : 'transitionend', 22 | 'OTransition' : 'oTransitionEnd otransitionend', 23 | 'transition' : 'transitionend' 24 | } 25 | 26 | for (var name in transEndEventNames) { 27 | if (el.style[name] !== undefined) { 28 | return { end: transEndEventNames[name] } 29 | } 30 | } 31 | 32 | return false // explicit for ie8 ( ._.) 33 | } 34 | 35 | // http://blog.alexmaccaw.com/css-transitions 36 | $.fn.emulateTransitionEnd = function (duration) { 37 | var called = false, $el = this 38 | $(this).one($.support.transition.end, function () { called = true }) 39 | var callback = function () { if (!called) $($el).trigger($.support.transition.end) } 40 | setTimeout(callback, duration) 41 | return this 42 | } 43 | 44 | $(function () { 45 | $.support.transition = transitionEnd() 46 | }) 47 | 48 | }(jQuery); 49 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/alerts.less: -------------------------------------------------------------------------------- 1 | // 2 | // Alerts 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base styles 7 | // ------------------------- 8 | 9 | .alert { 10 | padding: @alert-padding; 11 | margin-bottom: @line-height-computed; 12 | border: 1px solid transparent; 13 | border-radius: @alert-border-radius; 14 | 15 | // Headings for larger alerts 16 | h4 { 17 | margin-top: 0; 18 | // Specified for the h4 to prevent conflicts of changing @headings-color 19 | color: inherit; 20 | } 21 | // Provide class for links that match alerts 22 | .alert-link { 23 | font-weight: @alert-link-font-weight; 24 | } 25 | 26 | // Improve alignment and spacing of inner content 27 | > p, 28 | > ul { 29 | margin-bottom: 0; 30 | } 31 | > p + p { 32 | margin-top: 5px; 33 | } 34 | } 35 | 36 | // Dismissable alerts 37 | // 38 | // Expand the right padding and account for the close button's positioning. 39 | 40 | .alert-dismissable { 41 | padding-right: (@alert-padding + 20); 42 | 43 | // Adjust close link position 44 | .close { 45 | position: relative; 46 | top: -2px; 47 | right: -21px; 48 | color: inherit; 49 | } 50 | } 51 | 52 | // Alternate styles 53 | // 54 | // Generate contextual modifier classes for colorizing the alert. 55 | 56 | .alert-success { 57 | .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); 58 | } 59 | .alert-info { 60 | .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); 61 | } 62 | .alert-warning { 63 | .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); 64 | } 65 | .alert-danger { 66 | .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); 67 | } 68 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/badges.less: -------------------------------------------------------------------------------- 1 | // 2 | // Badges 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base classes 7 | .badge { 8 | display: inline-block; 9 | min-width: 10px; 10 | padding: 3px 7px; 11 | font-size: @font-size-small; 12 | font-weight: @badge-font-weight; 13 | color: @badge-color; 14 | line-height: @badge-line-height; 15 | vertical-align: baseline; 16 | white-space: nowrap; 17 | text-align: center; 18 | background-color: @badge-bg; 19 | border-radius: @badge-border-radius; 20 | 21 | // Empty badges collapse automatically (not available in IE8) 22 | &:empty { 23 | display: none; 24 | } 25 | 26 | // Quick fix for badges in buttons 27 | .btn & { 28 | position: relative; 29 | top: -1px; 30 | } 31 | .btn-xs & { 32 | top: 0; 33 | padding: 1px 5px; 34 | } 35 | } 36 | 37 | // Hover state, but only for links 38 | a.badge { 39 | &:hover, 40 | &:focus { 41 | color: @badge-link-hover-color; 42 | text-decoration: none; 43 | cursor: pointer; 44 | } 45 | } 46 | 47 | // Account for counters in navs 48 | a.list-group-item.active > .badge, 49 | .nav-pills > .active > a > .badge { 50 | color: @badge-active-color; 51 | background-color: @badge-active-bg; 52 | } 53 | .nav-pills > li > a > .badge { 54 | margin-left: 3px; 55 | } 56 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/bootstrap.less: -------------------------------------------------------------------------------- 1 | // Core variables and mixins 2 | @import "variables.less"; 3 | @import "mixins.less"; 4 | 5 | // Reset 6 | @import "normalize.less"; 7 | @import "print.less"; 8 | 9 | // Core CSS 10 | @import "scaffolding.less"; 11 | @import "type.less"; 12 | @import "code.less"; 13 | @import "grid.less"; 14 | @import "tables.less"; 15 | @import "forms.less"; 16 | @import "buttons.less"; 17 | 18 | // Components 19 | @import "component-animations.less"; 20 | @import "glyphicons.less"; 21 | @import "dropdowns.less"; 22 | @import "button-groups.less"; 23 | @import "input-groups.less"; 24 | @import "navs.less"; 25 | @import "navbar.less"; 26 | @import "breadcrumbs.less"; 27 | @import "pagination.less"; 28 | @import "pager.less"; 29 | @import "labels.less"; 30 | @import "badges.less"; 31 | @import "jumbotron.less"; 32 | @import "thumbnails.less"; 33 | @import "alerts.less"; 34 | @import "progress-bars.less"; 35 | @import "media.less"; 36 | @import "list-group.less"; 37 | @import "panels.less"; 38 | @import "wells.less"; 39 | @import "close.less"; 40 | 41 | // Components w/ JavaScript 42 | @import "modals.less"; 43 | @import "tooltip.less"; 44 | @import "popovers.less"; 45 | @import "carousel.less"; 46 | 47 | // Utility classes 48 | @import "utilities.less"; 49 | @import "responsive-utilities.less"; 50 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/breadcrumbs.less: -------------------------------------------------------------------------------- 1 | // 2 | // Breadcrumbs 3 | // -------------------------------------------------- 4 | 5 | 6 | .breadcrumb { 7 | padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal; 8 | margin-bottom: @line-height-computed; 9 | list-style: none; 10 | background-color: @breadcrumb-bg; 11 | border-radius: @border-radius-base; 12 | 13 | > li { 14 | display: inline-block; 15 | 16 | + li:before { 17 | content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space 18 | padding: 0 5px; 19 | color: @breadcrumb-color; 20 | } 21 | } 22 | 23 | > .active { 24 | color: @breadcrumb-active-color; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/close.less: -------------------------------------------------------------------------------- 1 | // 2 | // Close icons 3 | // -------------------------------------------------- 4 | 5 | 6 | .close { 7 | float: right; 8 | font-size: (@font-size-base * 1.5); 9 | font-weight: @close-font-weight; 10 | line-height: 1; 11 | color: @close-color; 12 | text-shadow: @close-text-shadow; 13 | .opacity(.2); 14 | 15 | &:hover, 16 | &:focus { 17 | color: @close-color; 18 | text-decoration: none; 19 | cursor: pointer; 20 | .opacity(.5); 21 | } 22 | 23 | // Additional properties for button version 24 | // iOS requires the button element instead of an anchor tag. 25 | // If you want the anchor version, it requires `href="#"`. 26 | button& { 27 | padding: 0; 28 | cursor: pointer; 29 | background: transparent; 30 | border: 0; 31 | -webkit-appearance: none; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/code.less: -------------------------------------------------------------------------------- 1 | // 2 | // Code (inline and block) 3 | // -------------------------------------------------- 4 | 5 | 6 | // Inline and block code styles 7 | code, 8 | kbd, 9 | pre, 10 | samp { 11 | font-family: @font-family-monospace; 12 | } 13 | 14 | // Inline code 15 | code { 16 | padding: 2px 4px; 17 | font-size: 90%; 18 | color: @code-color; 19 | background-color: @code-bg; 20 | white-space: nowrap; 21 | border-radius: @border-radius-base; 22 | } 23 | 24 | // User input typically entered via keyboard 25 | kbd { 26 | padding: 2px 4px; 27 | font-size: 90%; 28 | color: @kbd-color; 29 | background-color: @kbd-bg; 30 | border-radius: @border-radius-small; 31 | box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); 32 | } 33 | 34 | // Blocks of code 35 | pre { 36 | display: block; 37 | padding: ((@line-height-computed - 1) / 2); 38 | margin: 0 0 (@line-height-computed / 2); 39 | font-size: (@font-size-base - 1); // 14px to 13px 40 | line-height: @line-height-base; 41 | word-break: break-all; 42 | word-wrap: break-word; 43 | color: @pre-color; 44 | background-color: @pre-bg; 45 | border: 1px solid @pre-border-color; 46 | border-radius: @border-radius-base; 47 | 48 | // Account for some code outputs that place code tags in pre tags 49 | code { 50 | padding: 0; 51 | font-size: inherit; 52 | color: inherit; 53 | white-space: pre-wrap; 54 | background-color: transparent; 55 | border-radius: 0; 56 | } 57 | } 58 | 59 | // Enable scrollable blocks of code 60 | .pre-scrollable { 61 | max-height: @pre-scrollable-max-height; 62 | overflow-y: scroll; 63 | } 64 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/component-animations.less: -------------------------------------------------------------------------------- 1 | // 2 | // Component animations 3 | // -------------------------------------------------- 4 | 5 | // Heads up! 6 | // 7 | // We don't use the `.opacity()` mixin here since it causes a bug with text 8 | // fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552. 9 | 10 | .fade { 11 | opacity: 0; 12 | .transition(opacity .15s linear); 13 | &.in { 14 | opacity: 1; 15 | } 16 | } 17 | 18 | .collapse { 19 | display: none; 20 | &.in { 21 | display: block; 22 | } 23 | } 24 | .collapsing { 25 | position: relative; 26 | height: 0; 27 | overflow: hidden; 28 | .transition(height .35s ease); 29 | } 30 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/grid.less: -------------------------------------------------------------------------------- 1 | // 2 | // Grid system 3 | // -------------------------------------------------- 4 | 5 | 6 | // Container widths 7 | // 8 | // Set the container width, and override it for fixed navbars in media queries. 9 | 10 | .container { 11 | .container-fixed(); 12 | 13 | @media (min-width: @screen-sm-min) { 14 | width: @container-sm; 15 | } 16 | @media (min-width: @screen-md-min) { 17 | width: @container-md; 18 | } 19 | @media (min-width: @screen-lg-min) { 20 | width: @container-lg; 21 | } 22 | } 23 | 24 | 25 | // Fluid container 26 | // 27 | // Utilizes the mixin meant for fixed width containers, but without any defined 28 | // width for fluid, full width layouts. 29 | 30 | .container-fluid { 31 | .container-fixed(); 32 | } 33 | 34 | 35 | // Row 36 | // 37 | // Rows contain and clear the floats of your columns. 38 | 39 | .row { 40 | .make-row(); 41 | } 42 | 43 | 44 | // Columns 45 | // 46 | // Common styles for small and large grid columns 47 | 48 | .make-grid-columns(); 49 | 50 | 51 | // Extra small grid 52 | // 53 | // Columns, offsets, pushes, and pulls for extra small devices like 54 | // smartphones. 55 | 56 | .make-grid(xs); 57 | 58 | 59 | // Small grid 60 | // 61 | // Columns, offsets, pushes, and pulls for the small device range, from phones 62 | // to tablets. 63 | 64 | @media (min-width: @screen-sm-min) { 65 | .make-grid(sm); 66 | } 67 | 68 | 69 | // Medium grid 70 | // 71 | // Columns, offsets, pushes, and pulls for the desktop device range. 72 | 73 | @media (min-width: @screen-md-min) { 74 | .make-grid(md); 75 | } 76 | 77 | 78 | // Large grid 79 | // 80 | // Columns, offsets, pushes, and pulls for the large desktop device range. 81 | 82 | @media (min-width: @screen-lg-min) { 83 | .make-grid(lg); 84 | } 85 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/jumbotron.less: -------------------------------------------------------------------------------- 1 | // 2 | // Jumbotron 3 | // -------------------------------------------------- 4 | 5 | 6 | .jumbotron { 7 | padding: @jumbotron-padding; 8 | margin-bottom: @jumbotron-padding; 9 | color: @jumbotron-color; 10 | background-color: @jumbotron-bg; 11 | 12 | h1, 13 | .h1 { 14 | color: @jumbotron-heading-color; 15 | } 16 | p { 17 | margin-bottom: (@jumbotron-padding / 2); 18 | font-size: @jumbotron-font-size; 19 | font-weight: 200; 20 | } 21 | 22 | .container & { 23 | border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container 24 | } 25 | 26 | .container { 27 | max-width: 100%; 28 | } 29 | 30 | @media screen and (min-width: @screen-sm-min) { 31 | padding-top: (@jumbotron-padding * 1.6); 32 | padding-bottom: (@jumbotron-padding * 1.6); 33 | 34 | .container & { 35 | padding-left: (@jumbotron-padding * 2); 36 | padding-right: (@jumbotron-padding * 2); 37 | } 38 | 39 | h1, 40 | .h1 { 41 | font-size: (@font-size-base * 4.5); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/labels.less: -------------------------------------------------------------------------------- 1 | // 2 | // Labels 3 | // -------------------------------------------------- 4 | 5 | .label { 6 | display: inline; 7 | padding: .2em .6em .3em; 8 | font-size: 75%; 9 | font-weight: bold; 10 | line-height: 1; 11 | color: @label-color; 12 | text-align: center; 13 | white-space: nowrap; 14 | vertical-align: baseline; 15 | border-radius: .25em; 16 | 17 | // Add hover effects, but only for links 18 | &[href] { 19 | &:hover, 20 | &:focus { 21 | color: @label-link-hover-color; 22 | text-decoration: none; 23 | cursor: pointer; 24 | } 25 | } 26 | 27 | // Empty labels collapse automatically (not available in IE8) 28 | &:empty { 29 | display: none; 30 | } 31 | 32 | // Quick fix for labels in buttons 33 | .btn & { 34 | position: relative; 35 | top: -1px; 36 | } 37 | } 38 | 39 | // Colors 40 | // Contextual variations (linked labels get darker on :hover) 41 | 42 | .label-default { 43 | .label-variant(@label-default-bg); 44 | } 45 | 46 | .label-primary { 47 | .label-variant(@label-primary-bg); 48 | } 49 | 50 | .label-success { 51 | .label-variant(@label-success-bg); 52 | } 53 | 54 | .label-info { 55 | .label-variant(@label-info-bg); 56 | } 57 | 58 | .label-warning { 59 | .label-variant(@label-warning-bg); 60 | } 61 | 62 | .label-danger { 63 | .label-variant(@label-danger-bg); 64 | } 65 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/media.less: -------------------------------------------------------------------------------- 1 | // Media objects 2 | // Source: http://stubbornella.org/content/?p=497 3 | // -------------------------------------------------- 4 | 5 | 6 | // Common styles 7 | // ------------------------- 8 | 9 | // Clear the floats 10 | .media, 11 | .media-body { 12 | overflow: hidden; 13 | zoom: 1; 14 | } 15 | 16 | // Proper spacing between instances of .media 17 | .media, 18 | .media .media { 19 | margin-top: 15px; 20 | } 21 | .media:first-child { 22 | margin-top: 0; 23 | } 24 | 25 | // For images and videos, set to block 26 | .media-object { 27 | display: block; 28 | } 29 | 30 | // Reset margins on headings for tighter default spacing 31 | .media-heading { 32 | margin: 0 0 5px; 33 | } 34 | 35 | 36 | // Media image alignment 37 | // ------------------------- 38 | 39 | .media { 40 | > .pull-left { 41 | margin-right: 10px; 42 | } 43 | > .pull-right { 44 | margin-left: 10px; 45 | } 46 | } 47 | 48 | 49 | // Media list variation 50 | // ------------------------- 51 | 52 | // Undo default ul/ol styles 53 | .media-list { 54 | padding-left: 0; 55 | list-style: none; 56 | } 57 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/pager.less: -------------------------------------------------------------------------------- 1 | // 2 | // Pager pagination 3 | // -------------------------------------------------- 4 | 5 | 6 | .pager { 7 | padding-left: 0; 8 | margin: @line-height-computed 0; 9 | list-style: none; 10 | text-align: center; 11 | &:extend(.clearfix all); 12 | li { 13 | display: inline; 14 | > a, 15 | > span { 16 | display: inline-block; 17 | padding: 5px 14px; 18 | background-color: @pager-bg; 19 | border: 1px solid @pager-border; 20 | border-radius: @pager-border-radius; 21 | } 22 | 23 | > a:hover, 24 | > a:focus { 25 | text-decoration: none; 26 | background-color: @pager-hover-bg; 27 | } 28 | } 29 | 30 | .next { 31 | > a, 32 | > span { 33 | float: right; 34 | } 35 | } 36 | 37 | .previous { 38 | > a, 39 | > span { 40 | float: left; 41 | } 42 | } 43 | 44 | .disabled { 45 | > a, 46 | > a:hover, 47 | > a:focus, 48 | > span { 49 | color: @pager-disabled-color; 50 | background-color: @pager-bg; 51 | cursor: not-allowed; 52 | } 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/pagination.less: -------------------------------------------------------------------------------- 1 | // 2 | // Pagination (multiple pages) 3 | // -------------------------------------------------- 4 | .pagination { 5 | display: inline-block; 6 | padding-left: 0; 7 | margin: @line-height-computed 0; 8 | border-radius: @border-radius-base; 9 | 10 | > li { 11 | display: inline; // Remove list-style and block-level defaults 12 | > a, 13 | > span { 14 | position: relative; 15 | float: left; // Collapse white-space 16 | padding: @padding-base-vertical @padding-base-horizontal; 17 | line-height: @line-height-base; 18 | text-decoration: none; 19 | color: @pagination-color; 20 | background-color: @pagination-bg; 21 | border: 1px solid @pagination-border; 22 | margin-left: -1px; 23 | } 24 | &:first-child { 25 | > a, 26 | > span { 27 | margin-left: 0; 28 | .border-left-radius(@border-radius-base); 29 | } 30 | } 31 | &:last-child { 32 | > a, 33 | > span { 34 | .border-right-radius(@border-radius-base); 35 | } 36 | } 37 | } 38 | 39 | > li > a, 40 | > li > span { 41 | &:hover, 42 | &:focus { 43 | color: @pagination-hover-color; 44 | background-color: @pagination-hover-bg; 45 | border-color: @pagination-hover-border; 46 | } 47 | } 48 | 49 | > .active > a, 50 | > .active > span { 51 | &, 52 | &:hover, 53 | &:focus { 54 | z-index: 2; 55 | color: @pagination-active-color; 56 | background-color: @pagination-active-bg; 57 | border-color: @pagination-active-border; 58 | cursor: default; 59 | } 60 | } 61 | 62 | > .disabled { 63 | > span, 64 | > span:hover, 65 | > span:focus, 66 | > a, 67 | > a:hover, 68 | > a:focus { 69 | color: @pagination-disabled-color; 70 | background-color: @pagination-disabled-bg; 71 | border-color: @pagination-disabled-border; 72 | cursor: not-allowed; 73 | } 74 | } 75 | } 76 | 77 | // Sizing 78 | // -------------------------------------------------- 79 | 80 | // Large 81 | .pagination-lg { 82 | .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large); 83 | } 84 | 85 | // Small 86 | .pagination-sm { 87 | .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small); 88 | } 89 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/print.less: -------------------------------------------------------------------------------- 1 | // 2 | // Basic print styles 3 | // -------------------------------------------------- 4 | // Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css 5 | 6 | @media print { 7 | 8 | * { 9 | text-shadow: none !important; 10 | color: #000 !important; // Black prints faster: h5bp.com/s 11 | background: transparent !important; 12 | box-shadow: none !important; 13 | } 14 | 15 | a, 16 | a:visited { 17 | text-decoration: underline; 18 | } 19 | 20 | a[href]:after { 21 | content: " (" attr(href) ")"; 22 | } 23 | 24 | abbr[title]:after { 25 | content: " (" attr(title) ")"; 26 | } 27 | 28 | // Don't show links for images, or javascript/internal links 29 | a[href^="javascript:"]:after, 30 | a[href^="#"]:after { 31 | content: ""; 32 | } 33 | 34 | pre, 35 | blockquote { 36 | border: 1px solid #999; 37 | page-break-inside: avoid; 38 | } 39 | 40 | thead { 41 | display: table-header-group; // h5bp.com/t 42 | } 43 | 44 | tr, 45 | img { 46 | page-break-inside: avoid; 47 | } 48 | 49 | img { 50 | max-width: 100% !important; 51 | } 52 | 53 | p, 54 | h2, 55 | h3 { 56 | orphans: 3; 57 | widows: 3; 58 | } 59 | 60 | h2, 61 | h3 { 62 | page-break-after: avoid; 63 | } 64 | 65 | // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245 66 | // Once fixed, we can just straight up remove this. 67 | select { 68 | background: #fff !important; 69 | } 70 | 71 | // Bootstrap components 72 | .navbar { 73 | display: none; 74 | } 75 | .table { 76 | td, 77 | th { 78 | background-color: #fff !important; 79 | } 80 | } 81 | .btn, 82 | .dropup > .btn { 83 | > .caret { 84 | border-top-color: #000 !important; 85 | } 86 | } 87 | .label { 88 | border: 1px solid #000; 89 | } 90 | 91 | .table { 92 | border-collapse: collapse !important; 93 | } 94 | .table-bordered { 95 | th, 96 | td { 97 | border: 1px solid #ddd !important; 98 | } 99 | } 100 | 101 | } 102 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/progress-bars.less: -------------------------------------------------------------------------------- 1 | // 2 | // Progress bars 3 | // -------------------------------------------------- 4 | 5 | 6 | // Bar animations 7 | // ------------------------- 8 | 9 | // WebKit 10 | @-webkit-keyframes progress-bar-stripes { 11 | from { background-position: 40px 0; } 12 | to { background-position: 0 0; } 13 | } 14 | 15 | // Spec and IE10+ 16 | @keyframes progress-bar-stripes { 17 | from { background-position: 40px 0; } 18 | to { background-position: 0 0; } 19 | } 20 | 21 | 22 | 23 | // Bar itself 24 | // ------------------------- 25 | 26 | // Outer container 27 | .progress { 28 | overflow: hidden; 29 | height: @line-height-computed; 30 | margin-bottom: @line-height-computed; 31 | background-color: @progress-bg; 32 | border-radius: @border-radius-base; 33 | .box-shadow(inset 0 1px 2px rgba(0,0,0,.1)); 34 | } 35 | 36 | // Bar of progress 37 | .progress-bar { 38 | float: left; 39 | width: 0%; 40 | height: 100%; 41 | font-size: @font-size-small; 42 | line-height: @line-height-computed; 43 | color: @progress-bar-color; 44 | text-align: center; 45 | background-color: @progress-bar-bg; 46 | .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15)); 47 | .transition(width .6s ease); 48 | } 49 | 50 | // Striped bars 51 | .progress-striped .progress-bar { 52 | #gradient > .striped(); 53 | background-size: 40px 40px; 54 | } 55 | 56 | // Call animation for the active one 57 | .progress.active .progress-bar { 58 | .animation(progress-bar-stripes 2s linear infinite); 59 | } 60 | 61 | 62 | 63 | // Variations 64 | // ------------------------- 65 | 66 | .progress-bar-success { 67 | .progress-bar-variant(@progress-bar-success-bg); 68 | } 69 | 70 | .progress-bar-info { 71 | .progress-bar-variant(@progress-bar-info-bg); 72 | } 73 | 74 | .progress-bar-warning { 75 | .progress-bar-variant(@progress-bar-warning-bg); 76 | } 77 | 78 | .progress-bar-danger { 79 | .progress-bar-variant(@progress-bar-danger-bg); 80 | } 81 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/responsive-utilities.less: -------------------------------------------------------------------------------- 1 | // 2 | // Responsive: Utility classes 3 | // -------------------------------------------------- 4 | 5 | 6 | // IE10 in Windows (Phone) 8 7 | // 8 | // Support for responsive views via media queries is kind of borked in IE10, for 9 | // Surface/desktop in split view and for Windows Phone 8. This particular fix 10 | // must be accompanied by a snippet of JavaScript to sniff the user agent and 11 | // apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at 12 | // our Getting Started page for more information on this bug. 13 | // 14 | // For more information, see the following: 15 | // 16 | // Issue: https://github.com/twbs/bootstrap/issues/10497 17 | // Docs: http://getbootstrap.com/getting-started/#browsers 18 | // Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/ 19 | 20 | @-ms-viewport { 21 | width: device-width; 22 | } 23 | 24 | 25 | // Visibility utilities 26 | .visible-xs, 27 | .visible-sm, 28 | .visible-md, 29 | .visible-lg { 30 | .responsive-invisibility(); 31 | } 32 | 33 | .visible-xs { 34 | @media (max-width: @screen-xs-max) { 35 | .responsive-visibility(); 36 | } 37 | } 38 | .visible-sm { 39 | @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { 40 | .responsive-visibility(); 41 | } 42 | } 43 | .visible-md { 44 | @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { 45 | .responsive-visibility(); 46 | } 47 | } 48 | .visible-lg { 49 | @media (min-width: @screen-lg-min) { 50 | .responsive-visibility(); 51 | } 52 | } 53 | 54 | .hidden-xs { 55 | @media (max-width: @screen-xs-max) { 56 | .responsive-invisibility(); 57 | } 58 | } 59 | .hidden-sm { 60 | @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { 61 | .responsive-invisibility(); 62 | } 63 | } 64 | .hidden-md { 65 | @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { 66 | .responsive-invisibility(); 67 | } 68 | } 69 | .hidden-lg { 70 | @media (min-width: @screen-lg-min) { 71 | .responsive-invisibility(); 72 | } 73 | } 74 | 75 | 76 | // Print utilities 77 | // 78 | // Media queries are placed on the inside to be mixin-friendly. 79 | 80 | .visible-print { 81 | .responsive-invisibility(); 82 | 83 | @media print { 84 | .responsive-visibility(); 85 | } 86 | } 87 | 88 | .hidden-print { 89 | @media print { 90 | .responsive-invisibility(); 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/scaffolding.less: -------------------------------------------------------------------------------- 1 | // 2 | // Scaffolding 3 | // -------------------------------------------------- 4 | 5 | 6 | // Reset the box-sizing 7 | // 8 | // Heads up! This reset may cause conflicts with some third-party widgets. 9 | // For recommendations on resolving such conflicts, see 10 | // http://getbootstrap.com/getting-started/#third-box-sizing 11 | * { 12 | .box-sizing(border-box); 13 | } 14 | *:before, 15 | *:after { 16 | .box-sizing(border-box); 17 | } 18 | 19 | 20 | // Body reset 21 | 22 | html { 23 | font-size: 62.5%; 24 | -webkit-tap-highlight-color: rgba(0,0,0,0); 25 | } 26 | 27 | body { 28 | font-family: @font-family-base; 29 | font-size: @font-size-base; 30 | line-height: @line-height-base; 31 | color: @text-color; 32 | background-color: @body-bg; 33 | } 34 | 35 | // Reset fonts for relevant elements 36 | input, 37 | button, 38 | select, 39 | textarea { 40 | font-family: inherit; 41 | font-size: inherit; 42 | line-height: inherit; 43 | } 44 | 45 | 46 | // Links 47 | 48 | a { 49 | color: @link-color; 50 | text-decoration: none; 51 | 52 | &:hover, 53 | &:focus { 54 | color: @link-hover-color; 55 | text-decoration: underline; 56 | } 57 | 58 | &:focus { 59 | .tab-focus(); 60 | } 61 | } 62 | 63 | 64 | // Figures 65 | // 66 | // We reset this here because previously Normalize had no `figure` margins. This 67 | // ensures we don't break anyone's use of the element. 68 | 69 | figure { 70 | margin: 0; 71 | } 72 | 73 | 74 | // Images 75 | 76 | img { 77 | vertical-align: middle; 78 | } 79 | 80 | // Responsive images (ensure images don't scale beyond their parents) 81 | .img-responsive { 82 | .img-responsive(); 83 | } 84 | 85 | // Rounded corners 86 | .img-rounded { 87 | border-radius: @border-radius-large; 88 | } 89 | 90 | // Image thumbnails 91 | // 92 | // Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`. 93 | .img-thumbnail { 94 | padding: @thumbnail-padding; 95 | line-height: @line-height-base; 96 | background-color: @thumbnail-bg; 97 | border: 1px solid @thumbnail-border; 98 | border-radius: @thumbnail-border-radius; 99 | .transition(all .2s ease-in-out); 100 | 101 | // Keep them at most 100% wide 102 | .img-responsive(inline-block); 103 | } 104 | 105 | // Perfect circle 106 | .img-circle { 107 | border-radius: 50%; // set radius in percents 108 | } 109 | 110 | 111 | // Horizontal rules 112 | 113 | hr { 114 | margin-top: @line-height-computed; 115 | margin-bottom: @line-height-computed; 116 | border: 0; 117 | border-top: 1px solid @hr-border; 118 | } 119 | 120 | 121 | // Only display content to screen readers 122 | // 123 | // See: http://a11yproject.com/posts/how-to-hide-content/ 124 | 125 | .sr-only { 126 | position: absolute; 127 | width: 1px; 128 | height: 1px; 129 | margin: -1px; 130 | padding: 0; 131 | overflow: hidden; 132 | clip: rect(0,0,0,0); 133 | border: 0; 134 | } 135 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/thumbnails.less: -------------------------------------------------------------------------------- 1 | // 2 | // Thumbnails 3 | // -------------------------------------------------- 4 | 5 | 6 | // Mixin and adjust the regular image class 7 | .thumbnail { 8 | display: block; 9 | padding: @thumbnail-padding; 10 | margin-bottom: @line-height-computed; 11 | line-height: @line-height-base; 12 | background-color: @thumbnail-bg; 13 | border: 1px solid @thumbnail-border; 14 | border-radius: @thumbnail-border-radius; 15 | .transition(all .2s ease-in-out); 16 | 17 | > img, 18 | a > img { 19 | &:extend(.img-responsive); 20 | margin-left: auto; 21 | margin-right: auto; 22 | } 23 | 24 | // Add a hover state for linked versions only 25 | a&:hover, 26 | a&:focus, 27 | a&.active { 28 | border-color: @link-color; 29 | } 30 | 31 | // Image captions 32 | .caption { 33 | padding: @thumbnail-caption-padding; 34 | color: @thumbnail-caption-color; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/tooltip.less: -------------------------------------------------------------------------------- 1 | // 2 | // Tooltips 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .tooltip { 8 | position: absolute; 9 | z-index: @zindex-tooltip; 10 | display: block; 11 | visibility: visible; 12 | font-size: @font-size-small; 13 | line-height: 1.4; 14 | .opacity(0); 15 | 16 | &.in { .opacity(@tooltip-opacity); } 17 | &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; } 18 | &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; } 19 | &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; } 20 | &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; } 21 | } 22 | 23 | // Wrapper for the tooltip content 24 | .tooltip-inner { 25 | max-width: @tooltip-max-width; 26 | padding: 3px 8px; 27 | color: @tooltip-color; 28 | text-align: center; 29 | text-decoration: none; 30 | background-color: @tooltip-bg; 31 | border-radius: @border-radius-base; 32 | } 33 | 34 | // Arrows 35 | .tooltip-arrow { 36 | position: absolute; 37 | width: 0; 38 | height: 0; 39 | border-color: transparent; 40 | border-style: solid; 41 | } 42 | .tooltip { 43 | &.top .tooltip-arrow { 44 | bottom: 0; 45 | left: 50%; 46 | margin-left: -@tooltip-arrow-width; 47 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0; 48 | border-top-color: @tooltip-arrow-color; 49 | } 50 | &.top-left .tooltip-arrow { 51 | bottom: 0; 52 | left: @tooltip-arrow-width; 53 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0; 54 | border-top-color: @tooltip-arrow-color; 55 | } 56 | &.top-right .tooltip-arrow { 57 | bottom: 0; 58 | right: @tooltip-arrow-width; 59 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0; 60 | border-top-color: @tooltip-arrow-color; 61 | } 62 | &.right .tooltip-arrow { 63 | top: 50%; 64 | left: 0; 65 | margin-top: -@tooltip-arrow-width; 66 | border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0; 67 | border-right-color: @tooltip-arrow-color; 68 | } 69 | &.left .tooltip-arrow { 70 | top: 50%; 71 | right: 0; 72 | margin-top: -@tooltip-arrow-width; 73 | border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width; 74 | border-left-color: @tooltip-arrow-color; 75 | } 76 | &.bottom .tooltip-arrow { 77 | top: 0; 78 | left: 50%; 79 | margin-left: -@tooltip-arrow-width; 80 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; 81 | border-bottom-color: @tooltip-arrow-color; 82 | } 83 | &.bottom-left .tooltip-arrow { 84 | top: 0; 85 | left: @tooltip-arrow-width; 86 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; 87 | border-bottom-color: @tooltip-arrow-color; 88 | } 89 | &.bottom-right .tooltip-arrow { 90 | top: 0; 91 | right: @tooltip-arrow-width; 92 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; 93 | border-bottom-color: @tooltip-arrow-color; 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/utilities.less: -------------------------------------------------------------------------------- 1 | // 2 | // Utility classes 3 | // -------------------------------------------------- 4 | 5 | 6 | // Floats 7 | // ------------------------- 8 | 9 | .clearfix { 10 | .clearfix(); 11 | } 12 | .center-block { 13 | .center-block(); 14 | } 15 | .pull-right { 16 | float: right !important; 17 | } 18 | .pull-left { 19 | float: left !important; 20 | } 21 | 22 | 23 | // Toggling content 24 | // ------------------------- 25 | 26 | // Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1 27 | .hide { 28 | display: none !important; 29 | } 30 | .show { 31 | display: block !important; 32 | } 33 | .invisible { 34 | visibility: hidden; 35 | } 36 | .text-hide { 37 | .text-hide(); 38 | } 39 | 40 | 41 | // Hide from screenreaders and browsers 42 | // 43 | // Credit: HTML5 Boilerplate 44 | 45 | .hidden { 46 | display: none !important; 47 | visibility: hidden !important; 48 | } 49 | 50 | 51 | // For Affix plugin 52 | // ------------------------- 53 | 54 | .affix { 55 | position: fixed; 56 | } 57 | -------------------------------------------------------------------------------- /bower_components/bootstrap/less/wells.less: -------------------------------------------------------------------------------- 1 | // 2 | // Wells 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .well { 8 | min-height: 20px; 9 | padding: 19px; 10 | margin-bottom: 20px; 11 | background-color: @well-bg; 12 | border: 1px solid @well-border; 13 | border-radius: @border-radius-base; 14 | .box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); 15 | blockquote { 16 | border-color: #ddd; 17 | border-color: rgba(0,0,0,.15); 18 | } 19 | } 20 | 21 | // Sizes 22 | .well-lg { 23 | padding: 24px; 24 | border-radius: @border-radius-large; 25 | } 26 | .well-sm { 27 | padding: 9px; 28 | border-radius: @border-radius-small; 29 | } 30 | -------------------------------------------------------------------------------- /bower_components/bootstrap/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap", 3 | "description": "Sleek, intuitive, and powerful front-end framework for faster and easier web development.", 4 | "version": "3.1.1", 5 | "keywords": [ 6 | "bootstrap", 7 | "css" 8 | ], 9 | "homepage": "http://getbootstrap.com", 10 | "author": "Twitter, Inc.", 11 | "scripts": { 12 | "test": "grunt test" 13 | }, 14 | "style": "./dist/css/bootstrap.css", 15 | "less": "./less/bootstrap.less", 16 | "repository": { 17 | "type": "git", 18 | "url": "https://github.com/twbs/bootstrap.git" 19 | }, 20 | "bugs": { 21 | "url": "https://github.com/twbs/bootstrap/issues" 22 | }, 23 | "license": { 24 | "type": "MIT", 25 | "url": "https://github.com/twbs/bootstrap/blob/master/LICENSE" 26 | }, 27 | "devDependencies": { 28 | "btoa": "~1.1.1", 29 | "canonical-json": "~0.0.3", 30 | "grunt": "~0.4.2", 31 | "grunt-banner": "~0.2.0", 32 | "grunt-contrib-clean": "~0.5.0", 33 | "grunt-contrib-concat": "~0.3.0", 34 | "grunt-contrib-connect": "~0.6.0", 35 | "grunt-contrib-copy": "~0.5.0", 36 | "grunt-contrib-csslint": "~0.2.0", 37 | "grunt-contrib-cssmin": "~0.7.0", 38 | "grunt-contrib-jade": "~0.9.1", 39 | "grunt-contrib-jshint": "~0.8.0", 40 | "grunt-contrib-less": "~0.9.0", 41 | "grunt-contrib-qunit": "~0.4.0", 42 | "grunt-contrib-uglify": "~0.3.0", 43 | "grunt-contrib-watch": "~0.5.3", 44 | "grunt-csscomb": "~2.0.1", 45 | "grunt-exec": "0.4.3", 46 | "grunt-html-validation": "~0.1.13", 47 | "grunt-jekyll": "~0.4.1", 48 | "grunt-jscs-checker": "~0.3.0", 49 | "grunt-saucelabs": "~5.0.0", 50 | "grunt-sed": "~0.1.1", 51 | "load-grunt-tasks": "~0.3.0", 52 | "markdown": "~0.5.0" 53 | }, 54 | "jspm": { 55 | "main": "js/bootstrap", 56 | "directories": { 57 | "example": "examples", 58 | "lib": "dist" 59 | }, 60 | "shim": { 61 | "js/bootstrap": { 62 | "imports": "jquery", 63 | "exports": "$" 64 | } 65 | }, 66 | "buildConfig": { 67 | "uglify": true 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /bower_components/bootstrap/test-infra/requirements.txt: -------------------------------------------------------------------------------- 1 | boto==2.20.0 2 | -------------------------------------------------------------------------------- /bower_components/bootstrap/test-infra/sauce_browsers.yml: -------------------------------------------------------------------------------- 1 | [ 2 | # Docs: https://saucelabs.com/docs/platforms/webdriver 3 | 4 | { 5 | browserName: "safari", 6 | platform: "OS X 10.9" 7 | }, 8 | # { 9 | # browserName: "googlechrome", 10 | # platform: "OS X 10.9", 11 | # version: "31" 12 | # }, 13 | { 14 | browserName: "firefox", 15 | platform: "OS X 10.9" 16 | }, 17 | 18 | # Mac Opera not currently supported by Sauce Labs 19 | 20 | { 21 | browserName: "internet explorer", 22 | version: "11", 23 | platform: "Windows 8.1" 24 | }, 25 | { 26 | browserName: "internet explorer", 27 | version: "10", 28 | platform: "Windows 8" 29 | }, 30 | # { 31 | # browserName: "internet explorer", 32 | # version: "9", 33 | # platform: "Windows 7" 34 | # }, 35 | # { 36 | # browserName: "internet explorer", 37 | # version: "8", 38 | # platform: "Windows 7" 39 | # }, 40 | 41 | # { # Unofficial 42 | # browserName: "internet explorer", 43 | # version: "7", 44 | # platform: "Windows XP" 45 | # }, 46 | 47 | { 48 | browserName: "googlechrome", 49 | platform: "Windows 8.1" 50 | }, 51 | { 52 | browserName: "firefox", 53 | platform: "Windows 8.1" 54 | }, 55 | 56 | # Win Opera 15+ not currently supported by Sauce Labs 57 | 58 | { 59 | browserName: "iphone", 60 | platform: "OS X 10.9", 61 | version: "7" 62 | }, 63 | 64 | # iOS Chrome not currently supported by Sauce Labs 65 | 66 | # Linux (unofficial) 67 | { 68 | browserName: "googlechrome", 69 | platform: "Linux" 70 | }, 71 | { 72 | browserName: "firefox", 73 | platform: "Linux" 74 | } 75 | 76 | # Android Chrome not currently supported by Sauce Labs 77 | 78 | # { # Android Browser (super-unofficial) 79 | # browserName: "android", 80 | # version: "4.0", 81 | # platform: "Linux" 82 | # } 83 | ] 84 | -------------------------------------------------------------------------------- /bower_components/bootstrap/test-infra/uncached-npm-install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cp test-infra/npm-shrinkwrap.canonical.json npm-shrinkwrap.json 3 | npm install 4 | rm npm-shrinkwrap.json 5 | -------------------------------------------------------------------------------- /bower_components/d3/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "d3", 3 | "version": "3.4.6", 4 | "main": "d3.js", 5 | "scripts": [ 6 | "d3.js" 7 | ], 8 | "ignore": [ 9 | ".DS_Store", 10 | ".git", 11 | ".gitignore", 12 | ".npmignore", 13 | ".travis.yml", 14 | "Makefile", 15 | "bin", 16 | "component.json", 17 | "index.js", 18 | "lib", 19 | "node_modules", 20 | "package.json", 21 | "src", 22 | "test" 23 | ], 24 | "homepage": "https://github.com/mbostock/d3", 25 | "_release": "3.4.6", 26 | "_resolution": { 27 | "type": "version", 28 | "tag": "v3.4.6", 29 | "commit": "5d58ae83001016f6ad3c30191433bd6941498332" 30 | }, 31 | "_source": "git://github.com/mbostock/d3.git", 32 | "_target": "~3.4.6", 33 | "_originalSource": "d3", 34 | "_direct": true 35 | } -------------------------------------------------------------------------------- /bower_components/d3/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | If you’re looking for ways to contribute, please [peruse open issues](https://github.com/mbostock/d3/issues?milestone=&page=1&state=open). The icebox is a good place to find ideas that are not currently in development. If you already have an idea, please check past issues to see whether your idea or a similar one was previously discussed. 4 | 5 | Before submitting a pull request, consider implementing a live example first, say using [bl.ocks.org](http://bl.ocks.org). Real-world use cases go a long way to demonstrating the usefulness of a proposed feature. The more complex a feature’s implementation, the more usefulness it should provide. Share your demo using the #d3js tag on Twitter or by sending it to the d3-js Google group. 6 | 7 | If your proposed feature does not involve changing core functionality, consider submitting it instead as a [D3 plugin](https://github.com/d3/d3-plugins). New core features should be for general use, whereas plugins are suitable for more specialized use cases. When in doubt, it’s easier to start with a plugin before “graduating” to core. 8 | 9 | To contribute new documentation or add examples to the gallery, just [edit the Wiki](https://github.com/mbostock/d3/wiki)! 10 | 11 | ## How to Submit a Pull Request 12 | 13 | 1. Click the “Fork” button to create your personal fork of the D3 repository. 14 | 15 | 2. After cloning your fork of the D3 repository in the terminal, run `npm install` to install D3’s dependencies. 16 | 17 | 3. Create a new branch for your new feature. For example: `git checkout -b my-awesome-feature`. A dedicated branch for your pull request means you can develop multiple features at the same time, and ensures that your pull request is stable even if you later decide to develop an unrelated feature. 18 | 19 | 4. The `d3.js` and `d3.min.js` files are built from source files in the `src` directory. _Do not edit `d3.js` directly._ Instead, edit the source files, and then run `make` to build the generated files. 20 | 21 | 5. Use `make test` to run tests and verify your changes. If you are adding a new feature, you should add new tests! If you are changing existing functionality, make sure the existing tests run, or update them as appropriate. 22 | 23 | 6. Sign D3’s [Individual Contributor License Agreement](https://docs.google.com/forms/d/1CzjdBKtDuA8WeuFJinadx956xLQ4Xriv7-oDvXnZMaI/viewform). Unless you are submitting a trivial patch (such as fixing a typo), this form is needed to verify that you are able to contribute. 24 | 25 | 7. Submit your pull request, and good luck! 26 | -------------------------------------------------------------------------------- /bower_components/d3/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2010-2014, Michael Bostock 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 10 | * Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | * The name Michael Bostock may not be used to endorse or promote products 15 | derived from this software without specific prior written permission. 16 | 17 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 | DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT, 21 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 22 | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 24 | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 25 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 26 | EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 | -------------------------------------------------------------------------------- /bower_components/d3/README.md: -------------------------------------------------------------------------------- 1 | # Data-Driven Documents 2 | 3 | 4 | 5 | **D3.js** is a JavaScript library for manipulating documents based on data. **D3** helps you bring data to life using HTML, SVG and CSS. D3’s emphasis on web standards gives you the full capabilities of modern browsers without tying yourself to a proprietary framework, combining powerful visualization components and a data-driven approach to DOM manipulation. 6 | 7 | Want to learn more? [See the wiki.](https://github.com/mbostock/d3/wiki) 8 | 9 | For examples, [see the gallery](https://github.com/mbostock/d3/wiki/Gallery) and [mbostock’s bl.ocks](http://bl.ocks.org/mbostock). 10 | -------------------------------------------------------------------------------- /bower_components/d3/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "d3", 3 | "version": "3.4.6", 4 | "main": "d3.js", 5 | "scripts": [ 6 | "d3.js" 7 | ], 8 | "ignore": [ 9 | ".DS_Store", 10 | ".git", 11 | ".gitignore", 12 | ".npmignore", 13 | ".travis.yml", 14 | "Makefile", 15 | "bin", 16 | "component.json", 17 | "index.js", 18 | "lib", 19 | "node_modules", 20 | "package.json", 21 | "src", 22 | "test" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /bower_components/d3/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mbostock/d3", 3 | "description": "A small, free JavaScript library for manipulating documents based on data.", 4 | "keywords": ["dom", "svg", "visualization", "js", "canvas"], 5 | "homepage": "http://d3js.org/", 6 | "license": "BSD-3-Clause", 7 | "authors": [ 8 | { 9 | "name": "Mike Bostock", 10 | "homepage": "http://bost.ocks.org/mike" 11 | } 12 | ], 13 | "support": { 14 | "issues": "https://github.com/mbostock/d3/issues", 15 | "wiki": "https://github.com/mbostock/d3/wiki", 16 | "API": "https://github.com/mbostock/d3/wiki/API-Reference", 17 | "source": "https://github.com/mbostock/d3" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /bower_components/jquery/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery", 3 | "version": "2.1.0", 4 | "main": "dist/jquery.js", 5 | "license": "MIT", 6 | "ignore": [ 7 | "**/.*", 8 | "build", 9 | "speed", 10 | "test", 11 | "*.md", 12 | "AUTHORS.txt", 13 | "Gruntfile.js", 14 | "package.json" 15 | ], 16 | "devDependencies": { 17 | "sizzle": "1.10.16", 18 | "requirejs": "~2.1.8", 19 | "qunit": "~1.12.0", 20 | "sinon": "~1.7.3" 21 | }, 22 | "keywords": [ 23 | "jquery", 24 | "javascript", 25 | "library" 26 | ], 27 | "homepage": "https://github.com/jquery/jquery", 28 | "_release": "2.1.0", 29 | "_resolution": { 30 | "type": "version", 31 | "tag": "2.1.0", 32 | "commit": "9434e03193c45d51bbd063a0edd1a07a6178d33f" 33 | }, 34 | "_source": "git://github.com/jquery/jquery.git", 35 | "_target": "~2.1.0", 36 | "_originalSource": "jquery", 37 | "_direct": true 38 | } -------------------------------------------------------------------------------- /bower_components/jquery/MIT-LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2014 jQuery Foundation and other contributors 2 | http://jquery.com/ 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining 5 | a copy of this software and associated documentation files (the 6 | "Software"), to deal in the Software without restriction, including 7 | without limitation the rights to use, copy, modify, merge, publish, 8 | distribute, sublicense, and/or sell copies of the Software, and to 9 | permit persons to whom the Software is furnished to do so, subject to 10 | the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /bower_components/jquery/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery", 3 | "version": "2.1.0", 4 | "main": "dist/jquery.js", 5 | "license": "MIT", 6 | "ignore": [ 7 | "**/.*", 8 | "build", 9 | "speed", 10 | "test", 11 | "*.md", 12 | "AUTHORS.txt", 13 | "Gruntfile.js", 14 | "package.json" 15 | ], 16 | "devDependencies": { 17 | "sizzle": "1.10.16", 18 | "requirejs": "~2.1.8", 19 | "qunit": "~1.12.0", 20 | "sinon": "~1.7.3" 21 | }, 22 | "keywords": [ 23 | "jquery", 24 | "javascript", 25 | "library" 26 | ] 27 | } 28 | -------------------------------------------------------------------------------- /bower_components/jquery/src/ajax/jsonp.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "../core", 3 | "./var/nonce", 4 | "./var/rquery", 5 | "../ajax" 6 | ], function( jQuery, nonce, rquery ) { 7 | 8 | var oldCallbacks = [], 9 | rjsonp = /(=)\?(?=&|$)|\?\?/; 10 | 11 | // Default jsonp settings 12 | jQuery.ajaxSetup({ 13 | jsonp: "callback", 14 | jsonpCallback: function() { 15 | var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); 16 | this[ callback ] = true; 17 | return callback; 18 | } 19 | }); 20 | 21 | // Detect, normalize options and install callbacks for jsonp requests 22 | jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { 23 | 24 | var callbackName, overwritten, responseContainer, 25 | jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? 26 | "url" : 27 | typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data" 28 | ); 29 | 30 | // Handle iff the expected data type is "jsonp" or we have a parameter to set 31 | if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { 32 | 33 | // Get callback name, remembering preexisting value associated with it 34 | callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? 35 | s.jsonpCallback() : 36 | s.jsonpCallback; 37 | 38 | // Insert callback into url or form data 39 | if ( jsonProp ) { 40 | s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); 41 | } else if ( s.jsonp !== false ) { 42 | s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; 43 | } 44 | 45 | // Use data converter to retrieve json after script execution 46 | s.converters["script json"] = function() { 47 | if ( !responseContainer ) { 48 | jQuery.error( callbackName + " was not called" ); 49 | } 50 | return responseContainer[ 0 ]; 51 | }; 52 | 53 | // force json dataType 54 | s.dataTypes[ 0 ] = "json"; 55 | 56 | // Install callback 57 | overwritten = window[ callbackName ]; 58 | window[ callbackName ] = function() { 59 | responseContainer = arguments; 60 | }; 61 | 62 | // Clean-up function (fires after converters) 63 | jqXHR.always(function() { 64 | // Restore preexisting value 65 | window[ callbackName ] = overwritten; 66 | 67 | // Save back as free 68 | if ( s[ callbackName ] ) { 69 | // make sure that re-using the options doesn't screw things around 70 | s.jsonpCallback = originalSettings.jsonpCallback; 71 | 72 | // save the callback name for future use 73 | oldCallbacks.push( callbackName ); 74 | } 75 | 76 | // Call if it was a function and we have a response 77 | if ( responseContainer && jQuery.isFunction( overwritten ) ) { 78 | overwritten( responseContainer[ 0 ] ); 79 | } 80 | 81 | responseContainer = overwritten = undefined; 82 | }); 83 | 84 | // Delegate to script 85 | return "script"; 86 | } 87 | }); 88 | 89 | }); 90 | -------------------------------------------------------------------------------- /bower_components/jquery/src/ajax/load.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "../core", 3 | "../core/parseHTML", 4 | "../ajax", 5 | "../traversing", 6 | "../manipulation", 7 | "../selector", 8 | // Optional event/alias dependency 9 | "../event/alias" 10 | ], function( jQuery ) { 11 | 12 | // Keep a copy of the old load method 13 | var _load = jQuery.fn.load; 14 | 15 | /** 16 | * Load a url into a page 17 | */ 18 | jQuery.fn.load = function( url, params, callback ) { 19 | if ( typeof url !== "string" && _load ) { 20 | return _load.apply( this, arguments ); 21 | } 22 | 23 | var selector, type, response, 24 | self = this, 25 | off = url.indexOf(" "); 26 | 27 | if ( off >= 0 ) { 28 | selector = url.slice( off ); 29 | url = url.slice( 0, off ); 30 | } 31 | 32 | // If it's a function 33 | if ( jQuery.isFunction( params ) ) { 34 | 35 | // We assume that it's the callback 36 | callback = params; 37 | params = undefined; 38 | 39 | // Otherwise, build a param string 40 | } else if ( params && typeof params === "object" ) { 41 | type = "POST"; 42 | } 43 | 44 | // If we have elements to modify, make the request 45 | if ( self.length > 0 ) { 46 | jQuery.ajax({ 47 | url: url, 48 | 49 | // if "type" variable is undefined, then "GET" method will be used 50 | type: type, 51 | dataType: "html", 52 | data: params 53 | }).done(function( responseText ) { 54 | 55 | // Save response for use in complete callback 56 | response = arguments; 57 | 58 | self.html( selector ? 59 | 60 | // If a selector was specified, locate the right elements in a dummy div 61 | // Exclude scripts to avoid IE 'Permission Denied' errors 62 | jQuery("
").append( jQuery.parseHTML( responseText ) ).find( selector ) : 63 | 64 | // Otherwise use the full result 65 | responseText ); 66 | 67 | }).complete( callback && function( jqXHR, status ) { 68 | self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] ); 69 | }); 70 | } 71 | 72 | return this; 73 | }; 74 | 75 | }); 76 | -------------------------------------------------------------------------------- /bower_components/jquery/src/ajax/parseJSON.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "../core" 3 | ], function( jQuery ) { 4 | 5 | // Support: Android 2.3 6 | // Workaround failure to string-cast null input 7 | jQuery.parseJSON = function( data ) { 8 | return JSON.parse( data + "" ); 9 | }; 10 | 11 | return jQuery.parseJSON; 12 | 13 | }); 14 | -------------------------------------------------------------------------------- /bower_components/jquery/src/ajax/parseXML.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "../core" 3 | ], function( jQuery ) { 4 | 5 | // Cross-browser xml parsing 6 | jQuery.parseXML = function( data ) { 7 | var xml, tmp; 8 | if ( !data || typeof data !== "string" ) { 9 | return null; 10 | } 11 | 12 | // Support: IE9 13 | try { 14 | tmp = new DOMParser(); 15 | xml = tmp.parseFromString( data, "text/xml" ); 16 | } catch ( e ) { 17 | xml = undefined; 18 | } 19 | 20 | if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { 21 | jQuery.error( "Invalid XML: " + data ); 22 | } 23 | return xml; 24 | }; 25 | 26 | return jQuery.parseXML; 27 | 28 | }); 29 | -------------------------------------------------------------------------------- /bower_components/jquery/src/ajax/script.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "../core", 3 | "../ajax" 4 | ], function( jQuery ) { 5 | 6 | // Install script dataType 7 | jQuery.ajaxSetup({ 8 | accepts: { 9 | script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" 10 | }, 11 | contents: { 12 | script: /(?:java|ecma)script/ 13 | }, 14 | converters: { 15 | "text script": function( text ) { 16 | jQuery.globalEval( text ); 17 | return text; 18 | } 19 | } 20 | }); 21 | 22 | // Handle cache's special case and crossDomain 23 | jQuery.ajaxPrefilter( "script", function( s ) { 24 | if ( s.cache === undefined ) { 25 | s.cache = false; 26 | } 27 | if ( s.crossDomain ) { 28 | s.type = "GET"; 29 | } 30 | }); 31 | 32 | // Bind script tag hack transport 33 | jQuery.ajaxTransport( "script", function( s ) { 34 | // This transport only deals with cross domain requests 35 | if ( s.crossDomain ) { 36 | var script, callback; 37 | return { 38 | send: function( _, complete ) { 39 | script = jQuery("