diff --git a/.gitignore b/.gitignore index 0cb6eeb..31cc3fb 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ /pkg/ /spec/reports/ /tmp/ +.sass-cache diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000..2bf1c1c --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.3.1 diff --git a/.sass-cache/bf6bcf5c2b198613d6e505b1ecdfe1fe9a7efb59/_mixins.scssc b/.sass-cache/bf6bcf5c2b198613d6e505b1ecdfe1fe9a7efb59/_mixins.scssc new file mode 100644 index 0000000..75bf5f9 Binary files /dev/null and b/.sass-cache/bf6bcf5c2b198613d6e505b1ecdfe1fe9a7efb59/_mixins.scssc differ diff --git a/Gemfile b/Gemfile index b30a3a9..c554fb3 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,21 @@ -source "http://artprod.dev.bloomberg.com/artifactory/api/gems/bb-ruby-repos/" +source "https://rubygems.org" +ruby RUBY_VERSION -# Specify your gem's dependencies in jsonapi_suite.gemspec -gemspec +# Hello! This is where you manage which Jekyll version is used to run. +# When you want to use a different version, change it below, save the +# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: +# +# bundle exec jekyll serve +# +# This will help ensure the proper Jekyll version is running. +# Happy Jekylling! +gem "jekyll", "3.3.1" + +# If you want to use GitHub Pages, remove the "gem "jekyll"" above and +# uncomment the line below. To upgrade, run `bundle update github-pages`. +# gem "github-pages", group: :jekyll_plugins + +# If you have any plugins, put them here! +group :jekyll_plugins do + gem "jekyll-feed", "~> 0.6" +end diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 1a7a41d..0000000 --- a/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Lee Richmond - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/README.md b/README.md index 99eb853..0b0b6e4 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,17 @@ -# JsonapiSuite +JSONAPI Suite Documentation +========== -Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/jsonapi_suite`. To experiment with that code, run `bin/console` for an interactive prompt. +This is a static website generated by [jekyll](https://jekyllrb.com). To +contribute: -TODO: Delete this and the text above, and describe your gem - -## Installation - -Add this line to your application's Gemfile: - -```ruby -gem 'jsonapi_suite' +```bash +$ git checkout gh-pages +$ bundle install --binstubs +$ bin/jekyll serve ``` -And then execute: - - $ bundle - -Or install it yourself as: - - $ gem install jsonapi_suite - -## Usage - -TODO: Write usage instructions here - -## Development - -After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. - -To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). - -## Contributing - -Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/jsonapi_suite. - - -## License - -The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). +To add a how-to, edit `_data/how-tos`, and add a corresponding markdown +file. See the existing how-tos for reference. +Always make sure files are compiled before pushing. You can do this with +`jekyll serve` or `jekyll build` diff --git a/Rakefile b/Rakefile deleted file mode 100644 index b7e9ed5..0000000 --- a/Rakefile +++ /dev/null @@ -1,6 +0,0 @@ -require "bundler/gem_tasks" -require "rspec/core/rake_task" - -RSpec::Core::RakeTask.new(:spec) - -task :default => :spec diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..070ec0e --- /dev/null +++ b/_config.yml @@ -0,0 +1,40 @@ +# Welcome to Jekyll! +# +# This config file is meant for settings that affect your whole blog, values +# which you are expected to set up once and rarely edit after that. If you find +# yourself editing this file very often, consider using Jekyll's data files +# feature for the data you need to update frequently. +# +# For technical reasons, this file is *NOT* reloaded automatically when you use +# 'bundle exec jekyll serve'. If you change this file, please restart the server process. + +# Site settings +# These are used to personalize your new site. If you look in the HTML files, +# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on. +# You can create any custom variable you would like, and they will be accessible +# in the templates via {{ site.myvariable }}. +title: JSONAPI Suite +email: richmolj@gmail.com +description: > # this means to ignore newlines until "baseurl:" + Collection of Ruby libraries for powering JSONAPI-compliant APIs. +baseurl: "" # the subpath of your site, e.g. /blog +url: "" # the base hostname & protocol for your site, e.g. http://example.com +twitter_username: jekyllrb +github_username: jekyll + +# Build settings +markdown: kramdown +gems: + - jekyll-feed +exclude: + - Gemfile + - Gemfile.lock + +github: + #url: 'http://localhost:4000' + url: 'https://jsonapi-suite.github.io/jsonapi_suite_deprecated' +defaults: + - scope: + path: "assets/img" + values: + image: true diff --git a/_data/docs.yml b/_data/docs.yml new file mode 100644 index 0000000..4f47e27 --- /dev/null +++ b/_data/docs.yml @@ -0,0 +1,12 @@ +- + title: 'Resources' + id: 'resources' +- + title: 'Serializers' + id: 'serializers' +- + title: 'Sideloading' + id: 'sideloading' +- + title: 'Sideposting' + id: 'sideposting' diff --git a/_data/howtos.yml b/_data/howtos.yml new file mode 100644 index 0000000..4c789d8 --- /dev/null +++ b/_data/howtos.yml @@ -0,0 +1,36 @@ +- + path: '/how-to-scope-to-current-user' + title: 'Scope to Current User' +- + path: '/how-to-cause-side-effects' + title: 'Cause Side-Effects' +- + path: '/how-to-use-without-activerecord' + title: 'Use Alternate ORMs' +- + path: '/how-to-build-an-adapter' + title: 'Build an Adapter' +- + path: '/how-to-code-many-to-many-associations' + title: 'Many-to-Many Relationships' +- + path: '/how-to-code-polymorphic-associations' + title: 'Polymorphic Relationships' +- + path: '/how-to-add-defaults' + title: 'Add Default Behavior' +- + path: '/how-to-conditionally-render-fields' + title: 'Conditionally Render Fields' +- + path: '/how-to-customize-error-responses' + title: 'Customize Error Responses' +- + path: '/how-to-write-specs' + title: 'Write Specs' +- + path: '/how-to-return-statistics' + title: 'Statistics' +- + path: '/how-to-autodocument' + title: 'Autodocument with Swagger' diff --git a/_includes/docs/resources/description.html b/_includes/docs/resources/description.html new file mode 100644 index 0000000..c2d0851 --- /dev/null +++ b/_includes/docs/resources/description.html @@ -0,0 +1,33 @@ +

+ Resources are where you define how to query and persist a given Model. + We'll wire-up the JSONAPI contract for you, so you can customize hooks rather + than spend your time parsing query parameters. +

+ +

+To the right, you'll see potential overrides of default behavior. Our defaults are based on ActiveRecord + and Rails conventions - so customizations like this are often not required. +

+ +

+ If you find yourself writing the same customizations over and over again, DRY them up by writing an + Adapter. +

+ +

+ See also: +

+

diff --git a/_includes/docs/resources/example.html b/_includes/docs/resources/example.html new file mode 100644 index 0000000..f74ed3c --- /dev/null +++ b/_includes/docs/resources/example.html @@ -0,0 +1,31 @@ +{% highlight ruby %} +class PostResource < ApplicationResource + # Use default logic (specified in adapter) + # when no block passed + allow_filter :active + + allow_filter :title_prefix do |scope, value| + # Example: + # scope.where(["title LIKE ?", "#{value}%"]) + end + + sort do |scope, att, dir| + # Example: + # scope.order(att => dir) + end + + paginate do |scope, current_page, per_page| + # Example: + # scope.per(per_page).page(current_page) + end + + # Example: let's say we're hitting an HTTP + # service instead of ActiveRecord. Maybe our + # scope is a big hash we build up, and now + # we need to use a client to take that hash and + # execute the HTTP request. + def resolve(scope) + MyHTTPClient.request(scope) + end +end +{% endhighlight %} diff --git a/_includes/docs/serializers/description.html b/_includes/docs/serializers/description.html new file mode 100644 index 0000000..a63adf1 --- /dev/null +++ b/_includes/docs/serializers/description.html @@ -0,0 +1,19 @@ +

+ Serializers define the structure of the response. +

+ +

+ We use jsonapi-rb for serialization. If you're familiar + with active_model_serializers, + the interface will seem very familiar. In fact, jsonapi-rb was created by one of the owners of that + project. +

+ +

+ See also: +

+

diff --git a/_includes/docs/serializers/example.html b/_includes/docs/serializers/example.html new file mode 100644 index 0000000..68e0da2 --- /dev/null +++ b/_includes/docs/serializers/example.html @@ -0,0 +1,29 @@ +{% highlight ruby %} +class PostSerializer < ApplicationSerializer + type 'foos' + + attribute :title + + attribute :description do + @object.active? ? 'Active Post' : 'Inactive Post' + end + + extra_attribute :net_worth do + @object.assets.sum(&:value) + end + + has_many :comments do + data do + @object.published_comments + end + + link :related do + @url_helpers.comments_url(filter: { post_id: @object.id }) + end + end + + meta do + { featured: true } + end +end +{% endhighlight %} diff --git a/_includes/docs/sideloading/description.html b/_includes/docs/sideloading/description.html new file mode 100644 index 0000000..3216140 --- /dev/null +++ b/_includes/docs/sideloading/description.html @@ -0,0 +1,58 @@ +

+ You're probably already familiar with the concept of "sideloading", documented in + the + + "Inclusion of Related Resources" + + section of the JSONPI spec. +

+ +

+ If using an + + Adapter + , such as the default + ActiveRecord adapter, + you can do this with simple + has_many-style macros. +

+ +

+ If not using an adapter, or to implement a one-off customization, + you can drop down to the lower-level + allow_sideload DSL. Adapter + macros are simply wrapping this DSL. +

+ +

+ allow_sideload specifies two simple + configuration options: +

+ +

+ You can see the default + ActiveRecord implementation on the right. +

+

+ +

+ See also: + +

+

diff --git a/_includes/docs/sideloading/example.html b/_includes/docs/sideloading/example.html new file mode 100644 index 0000000..44bddc0 --- /dev/null +++ b/_includes/docs/sideloading/example.html @@ -0,0 +1,24 @@ +{% highlight ruby %} +# Adapter example +has_many :comments, + foreign_key: :post_id, + resource: CommentResource, + scope: -> { Comment.all } # base scope, like you'd see in a controller + + + +# Lower-level customization example +allow_sideload :blog, resource: BlogResource do + # Return a scope so further query parameters can be applied + # and the Resource logic can be re-used + scope do |posts| + Blog.where(id: posts.map(&:blog_id)) + end + + assign do |posts, blogs| + posts.each do |p| + p.blog = blogs.find { |b| b.id == p.blog_id } + end + end +end +{% endhighlight %} diff --git a/_includes/docs/sideposting/description.html b/_includes/docs/sideposting/description.html new file mode 100644 index 0000000..ad06272 --- /dev/null +++ b/_includes/docs/sideposting/description.html @@ -0,0 +1,48 @@ +

+ We want to be able to *write* a nested relationship graph. + You can do this by mirroring the same + sideloading payload + you see in read requests. To the right, you'll see we're updating a + Post, changing the name of its associated + Blog, creating a + Tag, deleting one + Comment, and disassociating (null foreign key) a different + Comment, all in a single request. +

+ +

+ When we send RESTful resources to the server, we typically send a corresponding HTTP verb. + That's the + method section of the payload. + method can be either + create, + update, + destroy, or + disassociate. +

+ +

+ When creating, there is no + id to pass. Instead, pass + temp-id, a random uuid used to + link the relevant sections of the payload, and which tells clients how to associate + their in-memory objects with the + ids returned from the server. Clients like + JSORM will take care of this for you automatically. +

+ +

+ When we actually perform these operations, everything will run within a transaction. The + transaction will be rolled back if an error is raised or the + Models, do not pass validation. +

+ +

+ See also: + +

+

diff --git a/_includes/docs/sideposting/example.html b/_includes/docs/sideposting/example.html new file mode 100644 index 0000000..4e374d5 --- /dev/null +++ b/_includes/docs/sideposting/example.html @@ -0,0 +1,27 @@ +{% highlight ruby %} +{ + data: { + type: 'posts', + id: 123, + attributes: { title: 'Updated!' }, + relationships: { + blog: { + data: { type: 'blogs', id: 123, method: 'update' } + }, + tags: { + data: [{ type: 'tags', temp-id: 's0m3uu1d', method: 'create' }] + }, + comments: { + data: [ + { type: 'comments', id: 123, method: 'destroy' } + { type: 'comments', id: 456, method: 'disassociate' } + ] + } + } + }, + included: [ + { type: 'tags', temp-id: 's0m3uu1d', attributes: { name: 'Important' } }, + { type: 'blogs', id: 123, attributes: { name: 'Updated!' } } + ] +} +{% endhighlight %} diff --git a/_includes/footer.html b/_includes/footer.html new file mode 100644 index 0000000..62ac22d --- /dev/null +++ b/_includes/footer.html @@ -0,0 +1,48 @@ + diff --git a/_includes/head.html b/_includes/head.html new file mode 100644 index 0000000..f2555ca --- /dev/null +++ b/_includes/head.html @@ -0,0 +1,19 @@ + + + + + + {% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %} + + + + + + + + + + {% if jekyll.environment == 'production' and site.google_analytics %} + {% include google-analytics.html %} + {% endif %} + diff --git a/_includes/header.html b/_includes/header.html new file mode 100644 index 0000000..9e8af16 --- /dev/null +++ b/_includes/header.html @@ -0,0 +1,36 @@ + diff --git a/_includes/highlight.html b/_includes/highlight.html new file mode 100644 index 0000000..8dd6f8c --- /dev/null +++ b/_includes/highlight.html @@ -0,0 +1,43 @@ + diff --git a/_includes/homepage/features-grid-section.html b/_includes/homepage/features-grid-section.html new file mode 100644 index 0000000..0fef3a1 --- /dev/null +++ b/_includes/homepage/features-grid-section.html @@ -0,0 +1,38 @@ +
+
+
+
+ train + Rails Standards +

If you choose to use Ruby on Rails, you'll find all the normal expectations of MVC development in place. We help you deal with the API contract, then get out of your way.

+
+
+ cloud + Easy Microservices +

Because the API contract is standardized, the microservice premium is drastically lowered. Build quick, lightweight APIs without the hassle. +

+
+ smartphone + One API, Many Clients +

The API for your website should be the same API for your mobile app or ETL process. Flexible APIs enable easy re-use across a variety of use-cases.

+
+
+
+
+ tools + Client Support +

We offer an ActiveRecord-like isomorphic javascript client in JSORM. Ruby and Python clients are upcoming.

+
+
+ caution + Error Handling +

Always render valid JSONAPI-compliant error responses. Use a simple DSL to customize messages and response codes.

+
+
+ document + Automatic Documentation +

Full Swagger documentation enabled with one line of code. Use swagger-diff for an extra level of backwards-compatibility check.

+
+
+
+
diff --git a/_includes/homepage/features-tabs-section.html b/_includes/homepage/features-tabs-section.html new file mode 100644 index 0000000..7e2ffe7 --- /dev/null +++ b/_includes/homepage/features-tabs-section.html @@ -0,0 +1,79 @@ +
+
+
+
+

Batteries Included

+

From server to client, we've got you covered.

+
+
+
+
+ + +
+
+
+

Up and Running in Minutes

+

+ Everything you want from an API - filtering, sorting, pagination, statistics and more - comes "out of the box". Common problems are solved in a common way, leaving you more time to tend to your domain and focus on client needs. +

+

+ Don't worry - this isn't a straightjacket, just a grouping of sensible defaults. +

+
+
+ pic1 +
+
+
+
+ pic2 +
+
+

Custom sorting logic? MongoDB? No problem.

+

+ JSONAPI Suite was built for customization. We provide out-of-the-box defaults, but everything can be overridden. You can even package your overrides into an adapter to DRY up code. +

+

+ We take care of wiring up the API contract. You take care of your domain. +

+
+
+
+
+

Full-Stack RSpec Integration Tests

+

+ Whether you're a hardcore TDD engineer or throwing up a quick prototype, we'll provide patterns for easy-to-write integration tests than ensure backwards-compatibility. +

+

+ We're not just validating schemas or stubbing critical integration points. Test your API fully - a real server, a real database, and robust assertions on full JSON payloads. +

+
+
+ pic3 +
+
+
+
+ pic4 +
+
+

Problem Solved.

+

+ One of the problems with REST has always been compound documents. What if you need to save your Post and its Tags within the same transaction? What if you need a single request to fetch the Post and its last three active Tags? +

+

+ JSONAPI Suite standardizes patterns for cross-relationship reads and writes, providing out-of-the-box functionality and one more thing you no longer have to worry about. +

+
+
+
+
+
+
+
diff --git a/_includes/js-code-tabs.html b/_includes/js-code-tabs.html new file mode 100644 index 0000000..490ae7f --- /dev/null +++ b/_includes/js-code-tabs.html @@ -0,0 +1,8 @@ +
+
+ Typescript +
+
+ Javascript +
+
diff --git a/_includes/js-header.html b/_includes/js-header.html new file mode 100644 index 0000000..3429229 --- /dev/null +++ b/_includes/js-header.html @@ -0,0 +1,4 @@ +

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

diff --git a/_includes/js-toc.html b/_includes/js-toc.html new file mode 100644 index 0000000..9a3b93d --- /dev/null +++ b/_includes/js-toc.html @@ -0,0 +1,25 @@ +
+* [Home]({{ site.github.url }}/js/home) +* [Introduction]({{ site.github.url }}/js/introduction) +* [Installation]({{ site.github.url }}/js/installation) + * [Defining Models]({{ site.github.url }}/js/installation#defining-models) + * [Connecting to the API]({{ site.github.url }}/js/installation#connecting-to-the-api) + * [Defining Attributes]({{ site.github.url }}/js/installation#defining-attributes) + * [Defining Relationships]({{ site.github.url }}/js/installation#defining-relationships) +* [Reads]({{ site.github.url }}/js/reads) + * [Sorting]({{ site.github.url }}/js/reads/sorting) + * [Pagination]({{ site.github.url }}/js/reads/pagination) + * [Filtering]({{ site.github.url }}/js/reads/filtering) + * [Fieldsets]({{ site.github.url }}/js/reads/fieldsets) + * [Statistics]({{ site.github.url }}/js/reads/statistics) + * [Includes]({{ site.github.url }}/js/reads/includes) + * [Nested Queries]({{ site.github.url }}/js/reads/nested-queries) +* [Writes]({{ site.github.url }}/js/writes) + * [Validations]({{ site.github.url }}/js/writes/validations) + * [Dirty Tracking]({{ site.github.url }}/js/writes/dirty-tracking) + * [Nested Writes]({{ site.github.url }}/js/writes/nested) +* [Middleware]({{ site.github.url }}/js/middleware) +* [Authentication]({{ site.github.url }}/js/authentication) +* [State Syncing]({{ site.github.url }}/js/state-syncing) +* [Data Down, Actions Up]({{ site.github.url }}/js/ddau) +
diff --git a/_includes/ruby-toc.html b/_includes/ruby-toc.html new file mode 100644 index 0000000..2e1feb4 --- /dev/null +++ b/_includes/ruby-toc.html @@ -0,0 +1,30 @@ +
+* [Installation]({{ site.github.url }}/ruby/installation) +* [Understanding Resources]({{ site.github.url }}/ruby/resources) +* Reads + * [Basic Reads]({{ site.github.url }}/ruby/reads/basic-reads) + * [Sorting]({{ site.github.url }}/ruby/reads/sorting) + * [Pagination]({{ site.github.url }}/ruby/reads/pagination) + * [Filtering]({{ site.github.url }}/ruby/reads/filtering) + * [Fieldsets]({{ site.github.url }}/ruby/reads/fieldsets) + * [Statistics]({{ site.github.url }}/ruby/reads/statistics) + * [ActiveRecord Associations]({{ site.github.url }}/ruby/reads/activerecord-associations) + * [Querying Relationships]({{ site.github.url }}/ruby/reads/nested) + * [Serializers]({{ site.github.url }}/ruby/reads/serializers) + * [Default Behavior]({{ site.github.url }}/ruby/reads/default-behavior) +* Writes + * [Basic Writes]({{ site.github.url }}/ruby/writes/basic-writes) + * [Validations]({{ site.github.url }}/ruby/writes/validations) + * [Strong Resources]({{site.github.url}}/ruby/writes/strong-resources) + * [Nested Writes]({{site.github.url}}/ruby/writes/nested-writes) + * [Side Effects]({{site.github.url}}/ruby/writes/side-effects) +* [Alternate Datastores]({{site.github.url}}/ruby/alternate-datastores) + * [ElasticSearch]({{site.github.url}}/ruby/alternate-datastores/elasticsearch) + * [HTTP Services]({{site.github.url}}/ruby/alternate-datastores/http) + * [Adapters]({{site.github.url}}/ruby/alternate-datastores/adapters) +* [Scoping to Current User]({{site.github.url}}/ruby/scoping-to-current-user) +* [Backwards Compatibility]({{site.github.url}}/ruby/backwards-compatibility) +* [Swagger]({{site.github.url}}/ruby/swagger) +* [Integration Testing]({{site.github.url}}/ruby/testing) +* [Error Handling]({{site.github.url}}/ruby/error-handling) +
diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..fac3288 --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,13 @@ + + + + {% include head.html %} + + +
+
+ {{ content }} +
+
+ + diff --git a/_layouts/docs.html b/_layouts/docs.html new file mode 100644 index 0000000..e2f9a13 --- /dev/null +++ b/_layouts/docs.html @@ -0,0 +1,15 @@ + + + + {% include head.html %} + + +
+
+ {% include header.html %} + {{ content }} +
+
+ {% include footer.html %} + + diff --git a/_layouts/home.html b/_layouts/home.html new file mode 100644 index 0000000..3430fea --- /dev/null +++ b/_layouts/home.html @@ -0,0 +1,262 @@ +--- +layout: default +--- + +
+ Skip Intro » + +
+ JSONAPI SUITE + is a collection of + ruby libraries + that facilitate the + jsonapi.org + specification. +
+ +
+ If you're + unfamiliar + with + JSONAPI, + think + +
"RESTful GraphQL created by Yehuda Katz"
+
+ +
+ Here's a simple Suite app: +
+ + + {% highlight ruby %} +# controllers/posts_controller.rb +class PostsController + jsonapi resource: PostResource + + def index + posts = Post.all + render_jsonapi(posts) + end +end + {% endhighlight %} + + {% highlight ruby %} +# resources/post_resource.rb +class PostResource + type :posts + model Post + + allow_filter :title + allow_stat total: [:count] +end + {% endhighlight %} + + {% highlight ruby %} +# serializers/serializable_posts.rb +class SerializablePosts + type :posts + + attribute :title + attribute :created_at + attribute :updated_at +end + {% endhighlight %} + + +
+ This API now supports + Sparse Fieldsets, + Sorting, + Pagination, + statistics, and + Filtering. + + Though we're using + ActiveRecord + in these examples, the same patterns + apply to + ANY ORM or DATASTORE + including + HTTP calls. + Blend SQL and NoSQL in a + single + request. +
+ +
+ Let's access the API using our + Javascript Client, + which you can think of as +
+ "ActiveRecord in the browser" +
+
+ + + {% highlight typescript %} +await Post + .where({ title: "Hello!" }) + .order({ created_at: "desc" }) + .per(10).page(2) + .stats({ total: "count" }) + .fields(["title", "byline"]) + {% endhighlight %} + + + {% comment %}customize filter, no magic, complete control{% endcomment %} + {% comment %}maybe invert with the any data store bit{% endcomment %} + {% comment %}then associations, swagger, backwards-compat{% endcomment %} + {% comment %}microservices{% endcomment %} + {% comment %}testingß{% endcomment %} + +
+ Associations are simple and customizable: + + + {% highlight ruby %} +# app/resources/post_resource.rb +has_many :comments, + scope: -> { Comment.all }, + resource: CommentResource, + foreign_key: :post_id + {% endhighlight %} + + {% highlight typescript %} +// In your JS app +Post.includes("comments") + {% endhighlight %} + +
+ +
+ Associations are + deep queryable. In other words, + you could fetch the Post and only its + active comments, + sorted by + created_at descending. + This applies to your + entire graph of data. + The server-side code would be nothing more than: +
+ + + {% highlight ruby %} +allow_filter :active + {% endhighlight %} + + +
+ At this point, You may be thinking: + +
+ + "Is this just a bunch of incomprehensible ruby magic + + 😬 + + ?" + +
+ +
+ No. +
+ + We're simply parsing the request, removing boilerplate, and supplying + sensible defaults because we believe in + convention over configuration. +
+ +
+ Let's make our filter a prefix query: +
+ + + {% highlight ruby %} +allow_filter :title_prefix do |scope, value| + scope.where(["title LIKE ?", "#{value}%"]) +end + {% endhighlight %} + + +
+ From filtering to pagination, these are all just + customizable lambdas. + You have + complete control + of the query. +
+ +
+ Just as you can + Query + the full graph of data, you can also + Persist + the full graph of data in a + single request: +
+ + + {% highlight typescript %} +post = new Post({ title: "JSONAPI Rocks!" }) +comment = new Comment({ body: "I agree!" }) +post.comments.push(comment) +post.save({ with: "comments" }) + {% endhighlight %} + + +
+ All of this is easily validated with + end-to-end + integration test patterns + that ensure + backwards-compatibility: +
+ + + {% highlight ruby %} +let(:post1) { create(:post, title: "Hello") } +let(:post2) { create(:post, title: "Hiya") } + +it "filters correctly" do + jsonapi_get '/api/v1/posts', params: { + filter: { title_prefix: 'He' } + } + expect(json_ids(true)).to eq([post1.id]) + assert_payload(:post, post1, json_items[0]) +end + {% endhighlight %} + + +
+ ...and + automatically documented + in Swagger: +
+ +
+ +
+ +
+ There's + so much more + to talk about. To get your feet wet, check out + our + Quickstart, + or step-by-step + Tutorial. + We also have + comprehensive documentation + on the + Server + and on the + Client. + Join our + Slack Chat + to ask questions or say hi - we'd + love to meet you and hear what you think ❤️ +
+
diff --git a/_layouts/page.html b/_layouts/page.html new file mode 100644 index 0000000..40a12f4 --- /dev/null +++ b/_layouts/page.html @@ -0,0 +1,18 @@ + + + + {% include head.html %} + + +
+
+ {% include header.html %} +
+ {{ content }} +
+
+
+ {% include footer.html %} + {% include highlight.html %} + + diff --git a/_sass/bootstrap/_overrides.scss b/_sass/bootstrap/_overrides.scss new file mode 100755 index 0000000..bdfd189 --- /dev/null +++ b/_sass/bootstrap/_overrides.scss @@ -0,0 +1,25 @@ +@media (min-width: 1200px) { + .container { + width: 970px; + } +} + +a { + color: #459CE7; +} + +.pagination>.active { + >a, + >span, + >a:hover, + >span:hover, + >a:focus, + >span:focus { + background-color: #5585B3; + border-color: #4477A3; + } +} +.pagination>li>a, +.pagination>li>span { + @include transition(all 0.25s linear); +} \ No newline at end of file diff --git a/_sass/bootstrap/bootstrap.scss b/_sass/bootstrap/bootstrap.scss new file mode 100755 index 0000000..8176de1 --- /dev/null +++ b/_sass/bootstrap/bootstrap.scss @@ -0,0 +1,6757 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../../fonts/glyphicons-halflings-regular.eot'); + src: url('../../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\002a"; +} +.glyphicon-plus:before { + content: "\002b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + + line-break: auto; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + + line-break: auto; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/_sass/compiled/theme.css b/_sass/compiled/theme.css new file mode 100755 index 0000000..cb1c6e0 --- /dev/null +++ b/_sass/compiled/theme.css @@ -0,0 +1,12106 @@ +@charset "UTF-8"; +/* modules */ +/* this mixin makes possible to add transition to a specific vendor, example: */ +/* -webkit-transition: -webkit-transform 0.5s linear; */ +@import url(https://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300italic,300,400italic,500,500italic,700,700italic,900,900italic); +@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600,700,900,200italic,300italic,400italic,600italic,700italic,900italic); +@import url(https://fonts.googleapis.com/css?family=Lato:100,300,400,700,900,100italic,300italic,400italic,700italic,900italic); +@import url(https://fonts.googleapis.com/css?family=Merriweather:400,300italic,300,400italic,700,700italic); +@import url(https://fonts.googleapis.com/css?family=Karla:400,700); +*:focus { + outline: 0; } + +.button { + display: inline-block; + vertical-align: middle; + zoom: 1; + padding: 13px 32px; + font-weight: 400; + font-size: 17px; + color: #fff !important; + text-shadow: rgba(0, 0, 0, 0.2) 0 -1px 0; + border: 0px; + border-radius: 5px; + box-shadow: rgba(0, 0, 0, 0.3) 0 1px 2px, inset rgba(255, 255, 255, 0.88) 0px 1px 3px -1px; + background-color: #4589E3; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5DA4FF), color-stop(100%, #417BFF)); + background: -webkit-linear-gradient(#5DA4FF, #417BFF); + background: -moz-linear-gradient(#5DA4FF, #417BFF); + background: -o-linear-gradient(#5DA4FF, #417BFF); + background: linear-gradient(#5DA4FF, #417BFF); + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .button:hover { + color: #fff; + text-decoration: none; } + .button:active { + box-shadow: inset 0px 3px 3px rgba(0, 0, 0, 0.29); } + .button.button-small { + padding: 10px 33px; + border: 1px solid #68A2EE; + font-size: 14px; + font-weight: 500; } + +.button-outline { + display: inline-block; + vertical-align: middle; + zoom: 1; + color: #fff; + padding: 12px 31px; + border: 2px solid #fff; + border-radius: 4px; + font-size: 16px; + font-weight: 400; + background: rgba(0, 0, 0, 0.15); + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .button-outline:hover { + text-decoration: none; + color: #ddd; + border-color: #ddd; } + +.button-clear { + border: 0; + outline: none; + padding: 1px; + display: inline-block; + text-decoration: none; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075); + -ms-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075); + -o-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075); + background: #adb2bb; + background: -webkit-linear-gradient(#ccd0d6, #adb2bb); + background: -moz-linear-gradient(#ccd0d6, #adb2bb); + background: -ms-linear-gradient(#ccd0d6, #adb2bb); + background: -o-linear-gradient(#ccd0d6, #adb2bb); + background: linear-gradient(#ccd0d6, #adb2bb); } + .button-clear span { + display: block; + font-size: 14px; + padding-left: 23px; + padding-right: 23px; + height: 36px; + line-height: 33px; + border-radius: 4px; + font-weight: bold; + color: #444; + text-shadow: 0 1px 0 white; + background: #eff1f4; + background: -webkit-linear-gradient(#f7f8fa, #eff1f4); + background: -moz-linear-gradient(#f7f8fa, #eff1f4); + background: -ms-linear-gradient(#f7f8fa, #eff1f4); + background: -o-linear-gradient(#f7f8fa, #eff1f4); + background: linear-gradient(#f7f8fa, #eff1f4); + -webkit-box-shadow: inset 0 1px 0 white; + -moz-box-shadow: inset 0 1px 0 white; + -ms-box-shadow: inset 0 1px 0 white; + -o-box-shadow: inset 0 1px 0 white; + box-shadow: inset 0 1px 0 white; } + .button-clear:hover { + text-decoration: none; } + .button-clear:active, .button-clear.active { + background: #b5bac2; + background: -webkit-linear-gradient(#b5bac2, #b5bac2); + background: -moz-linear-gradient(#b5bac2, #b5bac2); + background: -ms-linear-gradient(#b5bac2, #b5bac2); + background: -o-linear-gradient(#b5bac2, #b5bac2); + background: linear-gradient(#b5bac2, #b5bac2); } + .button-clear:active span, .button-clear.active span { + color: #444; + background: #eff1f4; + background: -webkit-linear-gradient(#e6e8eb, #eff1f4); + background: -moz-linear-gradient(#e6e8eb, #eff1f4); + background: -ms-linear-gradient(#e6e8eb, #eff1f4); + background: -o-linear-gradient(#e6e8eb, #eff1f4); + background: linear-gradient(#e6e8eb, #eff1f4); + -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1); + -ms-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1); + -o-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1); } + +/* form controls */ +input[type="text"].form-control, +input[type="email"].form-control, +input[type="password"].form-control { + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); + height: 39px; } + input[type="text"].form-control::-webkit-input-placeholder, + input[type="email"].form-control::-webkit-input-placeholder, + input[type="password"].form-control::-webkit-input-placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; } + input[type="text"].form-control:-moz-placeholder, + input[type="email"].form-control:-moz-placeholder, + input[type="password"].form-control:-moz-placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; } + input[type="text"].form-control::-moz-placeholder, + input[type="email"].form-control::-moz-placeholder, + input[type="password"].form-control::-moz-placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; } + input[type="text"].form-control:-ms-input-placeholder, + input[type="email"].form-control:-ms-input-placeholder, + input[type="password"].form-control:-ms-input-placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; } + input[type="text"].form-control:focus, + input[type="email"].form-control:focus, + input[type="password"].form-control:focus { + border-color: #98D2FF; + outline: 0; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px rgba(166, 205, 236, 0.6); } + +textarea.form-control { + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); } + textarea.form-control::-webkit-input-placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; } + textarea.form-control:-moz-placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; } + textarea.form-control::-moz-placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; } + textarea.form-control:-ms-input-placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; } + textarea.form-control:focus { + border-color: #98D2FF; + outline: 0; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px rgba(166, 205, 236, 0.6); } + +.btn-shadow { + border: 0; + font-weight: 600; + color: #fff; + display: inline-block; + box-shadow: rgba(23, 43, 99, 0.24) 0 7px 28px; + text-transform: uppercase; + letter-spacing: 1px; + font-size: 13px; + padding: 12px 23px; + text-shadow: 1px 1px rgba(0, 0, 0, 0.09); + border-radius: 4px; + -webkit-transition: all 0.2s; + -moz-transition: all 0.2s; + -ms-transition: all 0.2s; + -o-transition: all 0.2s; + transition: all 0.2s; + /* sizes */ + /* colors */ } + .btn-shadow:hover, .btn-shadow:focus { + color: #fff; + text-decoration: none; } + .btn-shadow:active { + box-shadow: rgba(23, 43, 99, 0.24) 0 7px 28px, inset 0 2px 3px rgba(0, 0, 0, 0.3); } + .btn-shadow.btn-shadow-sm { + font-size: 11px; + padding: 7px 14px; } + .btn-shadow.btn-shadow-lg { + font-size: 14px; + padding: 16px 31px; } + .btn-shadow.btn-shadow-default { + background: #fff; + color: #444; + text-shadow: none; } + .btn-shadow.btn-shadow-primary { + background: linear-gradient(#2083fe, #1d7bf0); } + .btn-shadow.btn-shadow-dark { + background: #2C394D; } + .btn-shadow.btn-shadow-info { + background: #42B1E2; } + .btn-shadow.btn-shadow-warning { + background: #E2B477; } + .btn-shadow.btn-shadow-success { + background: #0ad6bc; } + +/* vendor */ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; } + +body { + margin: 0; } + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; } + +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; } + +audio:not([controls]) { + display: none; + height: 0; } + +[hidden], +template { + display: none; } + +a { + background-color: transparent; } + +a:active, +a:hover { + outline: 0; } + +abbr[title] { + border-bottom: 1px dotted; } + +b, +strong { + font-weight: bold; } + +dfn { + font-style: italic; } + +h1 { + margin: .67em 0; + font-size: 2em; } + +mark { + color: #000; + background: #ff0; } + +small { + font-size: 80%; } + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; } + +sup { + top: -.5em; } + +sub { + bottom: -.25em; } + +img { + border: 0; } + +svg:not(:root) { + overflow: hidden; } + +figure { + margin: 1em 40px; } + +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; } + +pre { + overflow: auto; } + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; } + +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; } + +button { + overflow: visible; } + +button, +select { + text-transform: none; } + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; } + +button[disabled], +html input[disabled] { + cursor: default; } + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; } + +input { + line-height: normal; } + +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; } + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; } + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; } + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; } + +legend { + padding: 0; + border: 0; } + +textarea { + overflow: auto; } + +optgroup { + font-weight: bold; } + +table { + border-spacing: 0; + border-collapse: collapse; } + +td, +th { + padding: 0; } + +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; } + + a, + a:visited { + text-decoration: underline; } + + a[href]:after { + content: " (" attr(href) ")"; } + + abbr[title]:after { + content: " (" attr(title) ")"; } + + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; } + + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; } + + thead { + display: table-header-group; } + + tr, + img { + page-break-inside: avoid; } + + img { + max-width: 100% !important; } + + p, + h2, + h3 { + orphans: 3; + widows: 3; } + + h2, + h3 { + page-break-after: avoid; } + + .navbar { + display: none; } + + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; } + + .label { + border: 1px solid #000; } + + .table { + border-collapse: collapse !important; } + + .table td, + .table th { + background-color: #fff !important; } + + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; } } +@font-face { + font-family: 'Glyphicons Halflings'; + src: url("../../fonts/glyphicons-halflings-regular.eot"); + src: url("../../fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../../fonts/glyphicons-halflings-regular.woff2") format("woff2"), url("../../fonts/glyphicons-halflings-regular.woff") format("woff"), url("../../fonts/glyphicons-halflings-regular.ttf") format("truetype"), url("../../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg"); } +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +.glyphicon-asterisk:before { + content: "\002a"; } + +.glyphicon-plus:before { + content: "\002b"; } + +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; } + +.glyphicon-minus:before { + content: "\2212"; } + +.glyphicon-cloud:before { + content: "\2601"; } + +.glyphicon-envelope:before { + content: "\2709"; } + +.glyphicon-pencil:before { + content: "\270f"; } + +.glyphicon-glass:before { + content: "\e001"; } + +.glyphicon-music:before { + content: "\e002"; } + +.glyphicon-search:before { + content: "\e003"; } + +.glyphicon-heart:before { + content: "\e005"; } + +.glyphicon-star:before { + content: "\e006"; } + +.glyphicon-star-empty:before { + content: "\e007"; } + +.glyphicon-user:before { + content: "\e008"; } + +.glyphicon-film:before { + content: "\e009"; } + +.glyphicon-th-large:before { + content: "\e010"; } + +.glyphicon-th:before { + content: "\e011"; } + +.glyphicon-th-list:before { + content: "\e012"; } + +.glyphicon-ok:before { + content: "\e013"; } + +.glyphicon-remove:before { + content: "\e014"; } + +.glyphicon-zoom-in:before { + content: "\e015"; } + +.glyphicon-zoom-out:before { + content: "\e016"; } + +.glyphicon-off:before { + content: "\e017"; } + +.glyphicon-signal:before { + content: "\e018"; } + +.glyphicon-cog:before { + content: "\e019"; } + +.glyphicon-trash:before { + content: "\e020"; } + +.glyphicon-home:before { + content: "\e021"; } + +.glyphicon-file:before { + content: "\e022"; } + +.glyphicon-time:before { + content: "\e023"; } + +.glyphicon-road:before { + content: "\e024"; } + +.glyphicon-download-alt:before { + content: "\e025"; } + +.glyphicon-download:before { + content: "\e026"; } + +.glyphicon-upload:before { + content: "\e027"; } + +.glyphicon-inbox:before { + content: "\e028"; } + +.glyphicon-play-circle:before { + content: "\e029"; } + +.glyphicon-repeat:before { + content: "\e030"; } + +.glyphicon-refresh:before { + content: "\e031"; } + +.glyphicon-list-alt:before { + content: "\e032"; } + +.glyphicon-lock:before { + content: "\e033"; } + +.glyphicon-flag:before { + content: "\e034"; } + +.glyphicon-headphones:before { + content: "\e035"; } + +.glyphicon-volume-off:before { + content: "\e036"; } + +.glyphicon-volume-down:before { + content: "\e037"; } + +.glyphicon-volume-up:before { + content: "\e038"; } + +.glyphicon-qrcode:before { + content: "\e039"; } + +.glyphicon-barcode:before { + content: "\e040"; } + +.glyphicon-tag:before { + content: "\e041"; } + +.glyphicon-tags:before { + content: "\e042"; } + +.glyphicon-book:before { + content: "\e043"; } + +.glyphicon-bookmark:before { + content: "\e044"; } + +.glyphicon-print:before { + content: "\e045"; } + +.glyphicon-camera:before { + content: "\e046"; } + +.glyphicon-font:before { + content: "\e047"; } + +.glyphicon-bold:before { + content: "\e048"; } + +.glyphicon-italic:before { + content: "\e049"; } + +.glyphicon-text-height:before { + content: "\e050"; } + +.glyphicon-text-width:before { + content: "\e051"; } + +.glyphicon-align-left:before { + content: "\e052"; } + +.glyphicon-align-center:before { + content: "\e053"; } + +.glyphicon-align-right:before { + content: "\e054"; } + +.glyphicon-align-justify:before { + content: "\e055"; } + +.glyphicon-list:before { + content: "\e056"; } + +.glyphicon-indent-left:before { + content: "\e057"; } + +.glyphicon-indent-right:before { + content: "\e058"; } + +.glyphicon-facetime-video:before { + content: "\e059"; } + +.glyphicon-picture:before { + content: "\e060"; } + +.glyphicon-map-marker:before { + content: "\e062"; } + +.glyphicon-adjust:before { + content: "\e063"; } + +.glyphicon-tint:before { + content: "\e064"; } + +.glyphicon-edit:before { + content: "\e065"; } + +.glyphicon-share:before { + content: "\e066"; } + +.glyphicon-check:before { + content: "\e067"; } + +.glyphicon-move:before { + content: "\e068"; } + +.glyphicon-step-backward:before { + content: "\e069"; } + +.glyphicon-fast-backward:before { + content: "\e070"; } + +.glyphicon-backward:before { + content: "\e071"; } + +.glyphicon-play:before { + content: "\e072"; } + +.glyphicon-pause:before { + content: "\e073"; } + +.glyphicon-stop:before { + content: "\e074"; } + +.glyphicon-forward:before { + content: "\e075"; } + +.glyphicon-fast-forward:before { + content: "\e076"; } + +.glyphicon-step-forward:before { + content: "\e077"; } + +.glyphicon-eject:before { + content: "\e078"; } + +.glyphicon-chevron-left:before { + content: "\e079"; } + +.glyphicon-chevron-right:before { + content: "\e080"; } + +.glyphicon-plus-sign:before { + content: "\e081"; } + +.glyphicon-minus-sign:before { + content: "\e082"; } + +.glyphicon-remove-sign:before { + content: "\e083"; } + +.glyphicon-ok-sign:before { + content: "\e084"; } + +.glyphicon-question-sign:before { + content: "\e085"; } + +.glyphicon-info-sign:before { + content: "\e086"; } + +.glyphicon-screenshot:before { + content: "\e087"; } + +.glyphicon-remove-circle:before { + content: "\e088"; } + +.glyphicon-ok-circle:before { + content: "\e089"; } + +.glyphicon-ban-circle:before { + content: "\e090"; } + +.glyphicon-arrow-left:before { + content: "\e091"; } + +.glyphicon-arrow-right:before { + content: "\e092"; } + +.glyphicon-arrow-up:before { + content: "\e093"; } + +.glyphicon-arrow-down:before { + content: "\e094"; } + +.glyphicon-share-alt:before { + content: "\e095"; } + +.glyphicon-resize-full:before { + content: "\e096"; } + +.glyphicon-resize-small:before { + content: "\e097"; } + +.glyphicon-exclamation-sign:before { + content: "\e101"; } + +.glyphicon-gift:before { + content: "\e102"; } + +.glyphicon-leaf:before { + content: "\e103"; } + +.glyphicon-fire:before { + content: "\e104"; } + +.glyphicon-eye-open:before { + content: "\e105"; } + +.glyphicon-eye-close:before { + content: "\e106"; } + +.glyphicon-warning-sign:before { + content: "\e107"; } + +.glyphicon-plane:before { + content: "\e108"; } + +.glyphicon-calendar:before { + content: "\e109"; } + +.glyphicon-random:before { + content: "\e110"; } + +.glyphicon-comment:before { + content: "\e111"; } + +.glyphicon-magnet:before { + content: "\e112"; } + +.glyphicon-chevron-up:before { + content: "\e113"; } + +.glyphicon-chevron-down:before { + content: "\e114"; } + +.glyphicon-retweet:before { + content: "\e115"; } + +.glyphicon-shopping-cart:before { + content: "\e116"; } + +.glyphicon-folder-close:before { + content: "\e117"; } + +.glyphicon-folder-open:before { + content: "\e118"; } + +.glyphicon-resize-vertical:before { + content: "\e119"; } + +.glyphicon-resize-horizontal:before { + content: "\e120"; } + +.glyphicon-hdd:before { + content: "\e121"; } + +.glyphicon-bullhorn:before { + content: "\e122"; } + +.glyphicon-bell:before { + content: "\e123"; } + +.glyphicon-certificate:before { + content: "\e124"; } + +.glyphicon-thumbs-up:before { + content: "\e125"; } + +.glyphicon-thumbs-down:before { + content: "\e126"; } + +.glyphicon-hand-right:before { + content: "\e127"; } + +.glyphicon-hand-left:before { + content: "\e128"; } + +.glyphicon-hand-up:before { + content: "\e129"; } + +.glyphicon-hand-down:before { + content: "\e130"; } + +.glyphicon-circle-arrow-right:before { + content: "\e131"; } + +.glyphicon-circle-arrow-left:before { + content: "\e132"; } + +.glyphicon-circle-arrow-up:before { + content: "\e133"; } + +.glyphicon-circle-arrow-down:before { + content: "\e134"; } + +.glyphicon-globe:before { + content: "\e135"; } + +.glyphicon-wrench:before { + content: "\e136"; } + +.glyphicon-tasks:before { + content: "\e137"; } + +.glyphicon-filter:before { + content: "\e138"; } + +.glyphicon-briefcase:before { + content: "\e139"; } + +.glyphicon-fullscreen:before { + content: "\e140"; } + +.glyphicon-dashboard:before { + content: "\e141"; } + +.glyphicon-paperclip:before { + content: "\e142"; } + +.glyphicon-heart-empty:before { + content: "\e143"; } + +.glyphicon-link:before { + content: "\e144"; } + +.glyphicon-phone:before { + content: "\e145"; } + +.glyphicon-pushpin:before { + content: "\e146"; } + +.glyphicon-usd:before { + content: "\e148"; } + +.glyphicon-gbp:before { + content: "\e149"; } + +.glyphicon-sort:before { + content: "\e150"; } + +.glyphicon-sort-by-alphabet:before { + content: "\e151"; } + +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; } + +.glyphicon-sort-by-order:before { + content: "\e153"; } + +.glyphicon-sort-by-order-alt:before { + content: "\e154"; } + +.glyphicon-sort-by-attributes:before { + content: "\e155"; } + +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; } + +.glyphicon-unchecked:before { + content: "\e157"; } + +.glyphicon-expand:before { + content: "\e158"; } + +.glyphicon-collapse-down:before { + content: "\e159"; } + +.glyphicon-collapse-up:before { + content: "\e160"; } + +.glyphicon-log-in:before { + content: "\e161"; } + +.glyphicon-flash:before { + content: "\e162"; } + +.glyphicon-log-out:before { + content: "\e163"; } + +.glyphicon-new-window:before { + content: "\e164"; } + +.glyphicon-record:before { + content: "\e165"; } + +.glyphicon-save:before { + content: "\e166"; } + +.glyphicon-open:before { + content: "\e167"; } + +.glyphicon-saved:before { + content: "\e168"; } + +.glyphicon-import:before { + content: "\e169"; } + +.glyphicon-export:before { + content: "\e170"; } + +.glyphicon-send:before { + content: "\e171"; } + +.glyphicon-floppy-disk:before { + content: "\e172"; } + +.glyphicon-floppy-saved:before { + content: "\e173"; } + +.glyphicon-floppy-remove:before { + content: "\e174"; } + +.glyphicon-floppy-save:before { + content: "\e175"; } + +.glyphicon-floppy-open:before { + content: "\e176"; } + +.glyphicon-credit-card:before { + content: "\e177"; } + +.glyphicon-transfer:before { + content: "\e178"; } + +.glyphicon-cutlery:before { + content: "\e179"; } + +.glyphicon-header:before { + content: "\e180"; } + +.glyphicon-compressed:before { + content: "\e181"; } + +.glyphicon-earphone:before { + content: "\e182"; } + +.glyphicon-phone-alt:before { + content: "\e183"; } + +.glyphicon-tower:before { + content: "\e184"; } + +.glyphicon-stats:before { + content: "\e185"; } + +.glyphicon-sd-video:before { + content: "\e186"; } + +.glyphicon-hd-video:before { + content: "\e187"; } + +.glyphicon-subtitles:before { + content: "\e188"; } + +.glyphicon-sound-stereo:before { + content: "\e189"; } + +.glyphicon-sound-dolby:before { + content: "\e190"; } + +.glyphicon-sound-5-1:before { + content: "\e191"; } + +.glyphicon-sound-6-1:before { + content: "\e192"; } + +.glyphicon-sound-7-1:before { + content: "\e193"; } + +.glyphicon-copyright-mark:before { + content: "\e194"; } + +.glyphicon-registration-mark:before { + content: "\e195"; } + +.glyphicon-cloud-download:before { + content: "\e197"; } + +.glyphicon-cloud-upload:before { + content: "\e198"; } + +.glyphicon-tree-conifer:before { + content: "\e199"; } + +.glyphicon-tree-deciduous:before { + content: "\e200"; } + +.glyphicon-cd:before { + content: "\e201"; } + +.glyphicon-save-file:before { + content: "\e202"; } + +.glyphicon-open-file:before { + content: "\e203"; } + +.glyphicon-level-up:before { + content: "\e204"; } + +.glyphicon-copy:before { + content: "\e205"; } + +.glyphicon-paste:before { + content: "\e206"; } + +.glyphicon-alert:before { + content: "\e209"; } + +.glyphicon-equalizer:before { + content: "\e210"; } + +.glyphicon-king:before { + content: "\e211"; } + +.glyphicon-queen:before { + content: "\e212"; } + +.glyphicon-pawn:before { + content: "\e213"; } + +.glyphicon-bishop:before { + content: "\e214"; } + +.glyphicon-knight:before { + content: "\e215"; } + +.glyphicon-baby-formula:before { + content: "\e216"; } + +.glyphicon-tent:before { + content: "\26fa"; } + +.glyphicon-blackboard:before { + content: "\e218"; } + +.glyphicon-bed:before { + content: "\e219"; } + +.glyphicon-apple:before { + content: "\f8ff"; } + +.glyphicon-erase:before { + content: "\e221"; } + +.glyphicon-hourglass:before { + content: "\231b"; } + +.glyphicon-lamp:before { + content: "\e223"; } + +.glyphicon-duplicate:before { + content: "\e224"; } + +.glyphicon-piggy-bank:before { + content: "\e225"; } + +.glyphicon-scissors:before { + content: "\e226"; } + +.glyphicon-bitcoin:before { + content: "\e227"; } + +.glyphicon-btc:before { + content: "\e227"; } + +.glyphicon-xbt:before { + content: "\e227"; } + +.glyphicon-yen:before { + content: "\00a5"; } + +.glyphicon-jpy:before { + content: "\00a5"; } + +.glyphicon-ruble:before { + content: "\20bd"; } + +.glyphicon-rub:before { + content: "\20bd"; } + +.glyphicon-scale:before { + content: "\e230"; } + +.glyphicon-ice-lolly:before { + content: "\e231"; } + +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; } + +.glyphicon-education:before { + content: "\e233"; } + +.glyphicon-option-horizontal:before { + content: "\e234"; } + +.glyphicon-option-vertical:before { + content: "\e235"; } + +.glyphicon-menu-hamburger:before { + content: "\e236"; } + +.glyphicon-modal-window:before { + content: "\e237"; } + +.glyphicon-oil:before { + content: "\e238"; } + +.glyphicon-grain:before { + content: "\e239"; } + +.glyphicon-sunglasses:before { + content: "\e240"; } + +.glyphicon-text-size:before { + content: "\e241"; } + +.glyphicon-text-color:before { + content: "\e242"; } + +.glyphicon-text-background:before { + content: "\e243"; } + +.glyphicon-object-align-top:before { + content: "\e244"; } + +.glyphicon-object-align-bottom:before { + content: "\e245"; } + +.glyphicon-object-align-horizontal:before { + content: "\e246"; } + +.glyphicon-object-align-left:before { + content: "\e247"; } + +.glyphicon-object-align-vertical:before { + content: "\e248"; } + +.glyphicon-object-align-right:before { + content: "\e249"; } + +.glyphicon-triangle-right:before { + content: "\e250"; } + +.glyphicon-triangle-left:before { + content: "\e251"; } + +.glyphicon-triangle-bottom:before { + content: "\e252"; } + +.glyphicon-triangle-top:before { + content: "\e253"; } + +.glyphicon-console:before { + content: "\e254"; } + +.glyphicon-superscript:before { + content: "\e255"; } + +.glyphicon-subscript:before { + content: "\e256"; } + +.glyphicon-menu-left:before { + content: "\e257"; } + +.glyphicon-menu-right:before { + content: "\e258"; } + +.glyphicon-menu-down:before { + content: "\e259"; } + +.glyphicon-menu-up:before { + content: "\e260"; } + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +html { + font-size: 10px; + -webkit-tap-highlight-color: transparent; } + +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; } + +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; } + +a { + color: #337ab7; + text-decoration: none; } + +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; } + +a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } + +figure { + margin: 0; } + +img { + vertical-align: middle; } + +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; } + +.img-rounded { + border-radius: 6px; } + +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; } + +.img-circle { + border-radius: 50%; } + +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; } + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; } + +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; } + +[role="button"] { + cursor: pointer; } + +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; } + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; } + +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; } + +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; } + +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; } + +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; } + +h1, +.h1 { + font-size: 36px; } + +h2, +.h2 { + font-size: 30px; } + +h3, +.h3 { + font-size: 24px; } + +h4, +.h4 { + font-size: 18px; } + +h5, +.h5 { + font-size: 14px; } + +h6, +.h6 { + font-size: 12px; } + +p { + margin: 0 0 10px; } + +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; } + +@media (min-width: 768px) { + .lead { + font-size: 21px; } } +small, +.small { + font-size: 85%; } + +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; } + +.text-left { + text-align: left; } + +.text-right { + text-align: right; } + +.text-center { + text-align: center; } + +.text-justify { + text-align: justify; } + +.text-nowrap { + white-space: nowrap; } + +.text-lowercase { + text-transform: lowercase; } + +.text-uppercase { + text-transform: uppercase; } + +.text-capitalize { + text-transform: capitalize; } + +.text-muted { + color: #777; } + +.text-primary { + color: #337ab7; } + +a.text-primary:hover, +a.text-primary:focus { + color: #286090; } + +.text-success { + color: #3c763d; } + +a.text-success:hover, +a.text-success:focus { + color: #2b542c; } + +.text-info { + color: #31708f; } + +a.text-info:hover, +a.text-info:focus { + color: #245269; } + +.text-warning { + color: #8a6d3b; } + +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; } + +.text-danger { + color: #a94442; } + +a.text-danger:hover, +a.text-danger:focus { + color: #843534; } + +.bg-primary { + color: #fff; + background-color: #337ab7; } + +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; } + +.bg-success { + background-color: #dff0d8; } + +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; } + +.bg-info { + background-color: #d9edf7; } + +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; } + +.bg-warning { + background-color: #fcf8e3; } + +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; } + +.bg-danger { + background-color: #f2dede; } + +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; } + +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; } + +ul, +ol { + margin-top: 0; + margin-bottom: 10px; } + +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; } + +.list-unstyled { + padding-left: 0; + list-style: none; } + +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; } + +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; } + +dl { + margin-top: 0; + margin-bottom: 20px; } + +dt, +dd { + line-height: 1.42857143; } + +dt { + font-weight: bold; } + +dd { + margin-left: 0; } + +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; } + + .dl-horizontal dd { + margin-left: 180px; } } +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; } + +.initialism { + font-size: 90%; + text-transform: uppercase; } + +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; } + +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; } + +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; } + +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; } + +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; } + +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; } + +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; } + +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; } + +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } + +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; } + +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } + +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; } + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; } + +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; } + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; } + +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; } + +@media (min-width: 768px) { + .container { + width: 750px; } } +@media (min-width: 992px) { + .container { + width: 970px; } } +@media (min-width: 1200px) { + .container { + width: 1170px; } } +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; } + +.row { + margin-right: -15px; + margin-left: -15px; } + +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; } + +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; } + +.col-xs-12 { + width: 100%; } + +.col-xs-11 { + width: 91.66666667%; } + +.col-xs-10 { + width: 83.33333333%; } + +.col-xs-9 { + width: 75%; } + +.col-xs-8 { + width: 66.66666667%; } + +.col-xs-7 { + width: 58.33333333%; } + +.col-xs-6 { + width: 50%; } + +.col-xs-5 { + width: 41.66666667%; } + +.col-xs-4 { + width: 33.33333333%; } + +.col-xs-3 { + width: 25%; } + +.col-xs-2 { + width: 16.66666667%; } + +.col-xs-1 { + width: 8.33333333%; } + +.col-xs-pull-12 { + right: 100%; } + +.col-xs-pull-11 { + right: 91.66666667%; } + +.col-xs-pull-10 { + right: 83.33333333%; } + +.col-xs-pull-9 { + right: 75%; } + +.col-xs-pull-8 { + right: 66.66666667%; } + +.col-xs-pull-7 { + right: 58.33333333%; } + +.col-xs-pull-6 { + right: 50%; } + +.col-xs-pull-5 { + right: 41.66666667%; } + +.col-xs-pull-4 { + right: 33.33333333%; } + +.col-xs-pull-3 { + right: 25%; } + +.col-xs-pull-2 { + right: 16.66666667%; } + +.col-xs-pull-1 { + right: 8.33333333%; } + +.col-xs-pull-0 { + right: auto; } + +.col-xs-push-12 { + left: 100%; } + +.col-xs-push-11 { + left: 91.66666667%; } + +.col-xs-push-10 { + left: 83.33333333%; } + +.col-xs-push-9 { + left: 75%; } + +.col-xs-push-8 { + left: 66.66666667%; } + +.col-xs-push-7 { + left: 58.33333333%; } + +.col-xs-push-6 { + left: 50%; } + +.col-xs-push-5 { + left: 41.66666667%; } + +.col-xs-push-4 { + left: 33.33333333%; } + +.col-xs-push-3 { + left: 25%; } + +.col-xs-push-2 { + left: 16.66666667%; } + +.col-xs-push-1 { + left: 8.33333333%; } + +.col-xs-push-0 { + left: auto; } + +.col-xs-offset-12 { + margin-left: 100%; } + +.col-xs-offset-11 { + margin-left: 91.66666667%; } + +.col-xs-offset-10 { + margin-left: 83.33333333%; } + +.col-xs-offset-9 { + margin-left: 75%; } + +.col-xs-offset-8 { + margin-left: 66.66666667%; } + +.col-xs-offset-7 { + margin-left: 58.33333333%; } + +.col-xs-offset-6 { + margin-left: 50%; } + +.col-xs-offset-5 { + margin-left: 41.66666667%; } + +.col-xs-offset-4 { + margin-left: 33.33333333%; } + +.col-xs-offset-3 { + margin-left: 25%; } + +.col-xs-offset-2 { + margin-left: 16.66666667%; } + +.col-xs-offset-1 { + margin-left: 8.33333333%; } + +.col-xs-offset-0 { + margin-left: 0; } + +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; } + + .col-sm-12 { + width: 100%; } + + .col-sm-11 { + width: 91.66666667%; } + + .col-sm-10 { + width: 83.33333333%; } + + .col-sm-9 { + width: 75%; } + + .col-sm-8 { + width: 66.66666667%; } + + .col-sm-7 { + width: 58.33333333%; } + + .col-sm-6 { + width: 50%; } + + .col-sm-5 { + width: 41.66666667%; } + + .col-sm-4 { + width: 33.33333333%; } + + .col-sm-3 { + width: 25%; } + + .col-sm-2 { + width: 16.66666667%; } + + .col-sm-1 { + width: 8.33333333%; } + + .col-sm-pull-12 { + right: 100%; } + + .col-sm-pull-11 { + right: 91.66666667%; } + + .col-sm-pull-10 { + right: 83.33333333%; } + + .col-sm-pull-9 { + right: 75%; } + + .col-sm-pull-8 { + right: 66.66666667%; } + + .col-sm-pull-7 { + right: 58.33333333%; } + + .col-sm-pull-6 { + right: 50%; } + + .col-sm-pull-5 { + right: 41.66666667%; } + + .col-sm-pull-4 { + right: 33.33333333%; } + + .col-sm-pull-3 { + right: 25%; } + + .col-sm-pull-2 { + right: 16.66666667%; } + + .col-sm-pull-1 { + right: 8.33333333%; } + + .col-sm-pull-0 { + right: auto; } + + .col-sm-push-12 { + left: 100%; } + + .col-sm-push-11 { + left: 91.66666667%; } + + .col-sm-push-10 { + left: 83.33333333%; } + + .col-sm-push-9 { + left: 75%; } + + .col-sm-push-8 { + left: 66.66666667%; } + + .col-sm-push-7 { + left: 58.33333333%; } + + .col-sm-push-6 { + left: 50%; } + + .col-sm-push-5 { + left: 41.66666667%; } + + .col-sm-push-4 { + left: 33.33333333%; } + + .col-sm-push-3 { + left: 25%; } + + .col-sm-push-2 { + left: 16.66666667%; } + + .col-sm-push-1 { + left: 8.33333333%; } + + .col-sm-push-0 { + left: auto; } + + .col-sm-offset-12 { + margin-left: 100%; } + + .col-sm-offset-11 { + margin-left: 91.66666667%; } + + .col-sm-offset-10 { + margin-left: 83.33333333%; } + + .col-sm-offset-9 { + margin-left: 75%; } + + .col-sm-offset-8 { + margin-left: 66.66666667%; } + + .col-sm-offset-7 { + margin-left: 58.33333333%; } + + .col-sm-offset-6 { + margin-left: 50%; } + + .col-sm-offset-5 { + margin-left: 41.66666667%; } + + .col-sm-offset-4 { + margin-left: 33.33333333%; } + + .col-sm-offset-3 { + margin-left: 25%; } + + .col-sm-offset-2 { + margin-left: 16.66666667%; } + + .col-sm-offset-1 { + margin-left: 8.33333333%; } + + .col-sm-offset-0 { + margin-left: 0; } } +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; } + + .col-md-12 { + width: 100%; } + + .col-md-11 { + width: 91.66666667%; } + + .col-md-10 { + width: 83.33333333%; } + + .col-md-9 { + width: 75%; } + + .col-md-8 { + width: 66.66666667%; } + + .col-md-7 { + width: 58.33333333%; } + + .col-md-6 { + width: 50%; } + + .col-md-5 { + width: 41.66666667%; } + + .col-md-4 { + width: 33.33333333%; } + + .col-md-3 { + width: 25%; } + + .col-md-2 { + width: 16.66666667%; } + + .col-md-1 { + width: 8.33333333%; } + + .col-md-pull-12 { + right: 100%; } + + .col-md-pull-11 { + right: 91.66666667%; } + + .col-md-pull-10 { + right: 83.33333333%; } + + .col-md-pull-9 { + right: 75%; } + + .col-md-pull-8 { + right: 66.66666667%; } + + .col-md-pull-7 { + right: 58.33333333%; } + + .col-md-pull-6 { + right: 50%; } + + .col-md-pull-5 { + right: 41.66666667%; } + + .col-md-pull-4 { + right: 33.33333333%; } + + .col-md-pull-3 { + right: 25%; } + + .col-md-pull-2 { + right: 16.66666667%; } + + .col-md-pull-1 { + right: 8.33333333%; } + + .col-md-pull-0 { + right: auto; } + + .col-md-push-12 { + left: 100%; } + + .col-md-push-11 { + left: 91.66666667%; } + + .col-md-push-10 { + left: 83.33333333%; } + + .col-md-push-9 { + left: 75%; } + + .col-md-push-8 { + left: 66.66666667%; } + + .col-md-push-7 { + left: 58.33333333%; } + + .col-md-push-6 { + left: 50%; } + + .col-md-push-5 { + left: 41.66666667%; } + + .col-md-push-4 { + left: 33.33333333%; } + + .col-md-push-3 { + left: 25%; } + + .col-md-push-2 { + left: 16.66666667%; } + + .col-md-push-1 { + left: 8.33333333%; } + + .col-md-push-0 { + left: auto; } + + .col-md-offset-12 { + margin-left: 100%; } + + .col-md-offset-11 { + margin-left: 91.66666667%; } + + .col-md-offset-10 { + margin-left: 83.33333333%; } + + .col-md-offset-9 { + margin-left: 75%; } + + .col-md-offset-8 { + margin-left: 66.66666667%; } + + .col-md-offset-7 { + margin-left: 58.33333333%; } + + .col-md-offset-6 { + margin-left: 50%; } + + .col-md-offset-5 { + margin-left: 41.66666667%; } + + .col-md-offset-4 { + margin-left: 33.33333333%; } + + .col-md-offset-3 { + margin-left: 25%; } + + .col-md-offset-2 { + margin-left: 16.66666667%; } + + .col-md-offset-1 { + margin-left: 8.33333333%; } + + .col-md-offset-0 { + margin-left: 0; } } +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; } + + .col-lg-12 { + width: 100%; } + + .col-lg-11 { + width: 91.66666667%; } + + .col-lg-10 { + width: 83.33333333%; } + + .col-lg-9 { + width: 75%; } + + .col-lg-8 { + width: 66.66666667%; } + + .col-lg-7 { + width: 58.33333333%; } + + .col-lg-6 { + width: 50%; } + + .col-lg-5 { + width: 41.66666667%; } + + .col-lg-4 { + width: 33.33333333%; } + + .col-lg-3 { + width: 25%; } + + .col-lg-2 { + width: 16.66666667%; } + + .col-lg-1 { + width: 8.33333333%; } + + .col-lg-pull-12 { + right: 100%; } + + .col-lg-pull-11 { + right: 91.66666667%; } + + .col-lg-pull-10 { + right: 83.33333333%; } + + .col-lg-pull-9 { + right: 75%; } + + .col-lg-pull-8 { + right: 66.66666667%; } + + .col-lg-pull-7 { + right: 58.33333333%; } + + .col-lg-pull-6 { + right: 50%; } + + .col-lg-pull-5 { + right: 41.66666667%; } + + .col-lg-pull-4 { + right: 33.33333333%; } + + .col-lg-pull-3 { + right: 25%; } + + .col-lg-pull-2 { + right: 16.66666667%; } + + .col-lg-pull-1 { + right: 8.33333333%; } + + .col-lg-pull-0 { + right: auto; } + + .col-lg-push-12 { + left: 100%; } + + .col-lg-push-11 { + left: 91.66666667%; } + + .col-lg-push-10 { + left: 83.33333333%; } + + .col-lg-push-9 { + left: 75%; } + + .col-lg-push-8 { + left: 66.66666667%; } + + .col-lg-push-7 { + left: 58.33333333%; } + + .col-lg-push-6 { + left: 50%; } + + .col-lg-push-5 { + left: 41.66666667%; } + + .col-lg-push-4 { + left: 33.33333333%; } + + .col-lg-push-3 { + left: 25%; } + + .col-lg-push-2 { + left: 16.66666667%; } + + .col-lg-push-1 { + left: 8.33333333%; } + + .col-lg-push-0 { + left: auto; } + + .col-lg-offset-12 { + margin-left: 100%; } + + .col-lg-offset-11 { + margin-left: 91.66666667%; } + + .col-lg-offset-10 { + margin-left: 83.33333333%; } + + .col-lg-offset-9 { + margin-left: 75%; } + + .col-lg-offset-8 { + margin-left: 66.66666667%; } + + .col-lg-offset-7 { + margin-left: 58.33333333%; } + + .col-lg-offset-6 { + margin-left: 50%; } + + .col-lg-offset-5 { + margin-left: 41.66666667%; } + + .col-lg-offset-4 { + margin-left: 33.33333333%; } + + .col-lg-offset-3 { + margin-left: 25%; } + + .col-lg-offset-2 { + margin-left: 16.66666667%; } + + .col-lg-offset-1 { + margin-left: 8.33333333%; } + + .col-lg-offset-0 { + margin-left: 0; } } +table { + background-color: transparent; } + +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; } + +th { + text-align: left; } + +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; } + +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; } + +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; } + +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; } + +.table > tbody + tbody { + border-top: 2px solid #ddd; } + +.table .table { + background-color: #fff; } + +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; } + +.table-bordered { + border: 1px solid #ddd; } + +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; } + +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; } + +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; } + +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; } + +table col[class*="col-"] { + position: static; + display: table-column; + float: none; } + +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; } + +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; } + +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; } + +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; } + +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; } + +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; } + +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; } + +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; } + +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; } + +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; } + +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; } + +.table-responsive { + min-height: .01%; + overflow-x: auto; } + +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; } + + .table-responsive > .table { + margin-bottom: 0; } + + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; } + + .table-responsive > .table-bordered { + border: 0; } + + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; } + + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; } + + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; } } +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; } + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; } + +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; } + +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; } + +input[type="file"] { + display: block; } + +input[type="range"] { + display: block; + width: 100%; } + +select[multiple], +select[size] { + height: auto; } + +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } + +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; } + +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } + +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); } + +.form-control::-moz-placeholder { + color: #999; + opacity: 1; } + +.form-control:-ms-input-placeholder { + color: #999; } + +.form-control::-webkit-input-placeholder { + color: #999; } + +.form-control::-ms-expand { + background-color: transparent; + border: 0; } + +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; } + +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; } + +textarea.form-control { + height: auto; } + +input[type="search"] { + -webkit-appearance: none; } + +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; } + + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; } + + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; } } +.form-group { + margin-bottom: 15px; } + +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; } + +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; } + +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; } + +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; } + +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; } + +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; } + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; } + +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; } + +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; } + +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; } + +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; } + +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + +select.input-sm { + height: 30px; + line-height: 30px; } + +textarea.input-sm, +select[multiple].input-sm { + height: auto; } + +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; } + +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; } + +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; } + +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; } + +select.input-lg { + height: 46px; + line-height: 46px; } + +textarea.input-lg, +select[multiple].input-lg { + height: auto; } + +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; } + +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; } + +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; } + +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; } + +.has-feedback { + position: relative; } + +.has-feedback .form-control { + padding-right: 42.5px; } + +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; } + +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; } + +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; } + +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; } + +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } + +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; } + +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; } + +.has-success .form-control-feedback { + color: #3c763d; } + +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; } + +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } + +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; } + +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; } + +.has-warning .form-control-feedback { + color: #8a6d3b; } + +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; } + +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } + +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; } + +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; } + +.has-error .form-control-feedback { + color: #a94442; } + +.has-feedback label ~ .form-control-feedback { + top: 25px; } + +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; } + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; } + +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; } + + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; } + + .form-inline .form-control-static { + display: inline-block; } + + .form-inline .input-group { + display: inline-table; + vertical-align: middle; } + + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; } + + .form-inline .input-group > .form-control { + width: 100%; } + + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; } + + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; } + + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; } + + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; } + + .form-inline .has-feedback .form-control-feedback { + top: 0; } } +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; } + +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; } + +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; } + +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; } } +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; } + +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; } } +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; } } +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; } + +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } + +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; } + +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } + +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; } + +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; } + +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; } + +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; } + +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; } + +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; } + +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; } + +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; } + +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; } + +.btn-default .badge { + color: #fff; + background-color: #333; } + +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; } + +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; } + +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; } + +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; } + +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; } + +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; } + +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #337ab7; + border-color: #2e6da4; } + +.btn-primary .badge { + color: #337ab7; + background-color: #fff; } + +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; } + +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; } + +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; } + +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; } + +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; } + +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; } + +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus { + background-color: #5cb85c; + border-color: #4cae4c; } + +.btn-success .badge { + color: #5cb85c; + background-color: #fff; } + +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; } + +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; } + +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; } + +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; } + +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; } + +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; } + +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #5bc0de; + border-color: #46b8da; } + +.btn-info .badge { + color: #5bc0de; + background-color: #fff; } + +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; } + +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; } + +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; } + +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; } + +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; } + +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; } + +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus { + background-color: #f0ad4e; + border-color: #eea236; } + +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; } + +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; } + +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; } + +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; } + +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; } + +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; } + +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; } + +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: #d43f3a; } + +.btn-danger .badge { + color: #d9534f; + background-color: #fff; } + +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; } + +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; } + +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; } + +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; } + +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; } + +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; } + +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + +.btn-block { + display: block; + width: 100%; } + +.btn-block + .btn-block { + margin-top: 5px; } + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; } + +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; } + +.fade.in { + opacity: 1; } + +.collapse { + display: none; } + +.collapse.in { + display: block; } + +tr.collapse.in { + display: table-row; } + +tbody.collapse.in { + display: table-row-group; } + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; } + +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; } + +.dropup, +.dropdown { + position: relative; } + +.dropdown-toggle:focus { + outline: 0; } + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); } + +.dropdown-menu.pull-right { + right: 0; + left: auto; } + +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; } + +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; } + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; } + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; } + +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; } + +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } + +.open > .dropdown-menu { + display: block; } + +.open > a { + outline: 0; } + +.dropdown-menu-right { + right: 0; + left: auto; } + +.dropdown-menu-left { + right: auto; + left: 0; } + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; } + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; } + +.pull-right > .dropdown-menu { + right: 0; + left: auto; } + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; } + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; } + +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; } + + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; } } +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; } + +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; } + +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; } + +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; } + +.btn-toolbar { + margin-left: -5px; } + +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; } + +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; } + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; } + +.btn-group > .btn:first-child { + margin-left: 0; } + +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + +.btn-group > .btn-group { + float: left; } + +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; } + +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; } + +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; } + +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; } + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } + +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; } + +.btn .caret { + margin-left: 0; } + +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; } + +.dropup .btn-lg .caret { + border-width: 0 5px 5px; } + +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; } + +.btn-group-vertical > .btn-group > .btn { + float: none; } + +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; } + +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; } + +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; } + +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; } + +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; } + +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; } + +.btn-group-justified > .btn-group .btn { + width: 100%; } + +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; } + +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; } + +.input-group { + position: relative; + display: table; + border-collapse: separate; } + +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; } + +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; } + +.input-group .form-control:focus { + z-index: 3; } + +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; } + +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; } + +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; } + +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; } + +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; } + +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; } + +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; } + +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; } + +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; } + +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; } + +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; } + +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; } + +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + +.input-group-addon:first-child { + border-right: 0; } + +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + +.input-group-addon:last-child { + border-left: 0; } + +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; } + +.input-group-btn > .btn { + position: relative; } + +.input-group-btn > .btn + .btn { + margin-left: -1px; } + +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; } + +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; } + +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; } + +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; } + +.nav > li { + position: relative; + display: block; } + +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; } + +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; } + +.nav > li.disabled > a { + color: #777; } + +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; } + +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; } + +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; } + +.nav > li > a > img { + max-width: none; } + +.nav-tabs { + border-bottom: 1px solid #ddd; } + +.nav-tabs > li { + float: left; + margin-bottom: -1px; } + +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; } + +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; } + +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; } + +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; } + +.nav-tabs.nav-justified > li { + float: none; } + +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; } + +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; } + +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; } + + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; } } +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; } + +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; } + +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; } + + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; } } +.nav-pills > li { + float: left; } + +.nav-pills > li > a { + border-radius: 4px; } + +.nav-pills > li + li { + margin-left: 2px; } + +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; } + +.nav-stacked > li { + float: none; } + +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; } + +.nav-justified { + width: 100%; } + +.nav-justified > li { + float: none; } + +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; } + +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; } + +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; } + + .nav-justified > li > a { + margin-bottom: 0; } } +.nav-tabs-justified { + border-bottom: 0; } + +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; } + +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; } + +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; } + + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; } } +.tab-content > .tab-pane { + display: none; } + +.tab-content > .active { + display: block; } + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; } + +@media (min-width: 768px) { + .navbar { + border-radius: 4px; } } +@media (min-width: 768px) { + .navbar-header { + float: left; } } +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); } + +.navbar-collapse.in { + overflow-y: auto; } + +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; } + + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; } + + .navbar-collapse.in { + overflow-y: visible; } + + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; } } +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; } + +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; } } +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; } + +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; } } +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; } + +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; } } +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; } + +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; } } +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; } + +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; } + +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; } + +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; } + +.navbar-brand > img { + display: block; } + +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; } } +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; } + +.navbar-toggle:focus { + outline: 0; } + +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; } + +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; } + +@media (min-width: 768px) { + .navbar-toggle { + display: none; } } +.navbar-nav { + margin: 7.5px -15px; } + +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; } + +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; } + + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; } + + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; } + + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; } } +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; } + + .navbar-nav > li { + float: left; } + + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; } } +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); } + +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; } + + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; } + + .navbar-form .form-control-static { + display: inline-block; } + + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; } + + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; } + + .navbar-form .input-group > .form-control { + width: 100%; } + + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; } + + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; } + + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; } + + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; } + + .navbar-form .has-feedback .form-control-feedback { + top: 0; } } +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; } + + .navbar-form .form-group:last-child { + margin-bottom: 0; } } +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; } } +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; } + +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; } + +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; } + +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; } + +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; } } +@media (min-width: 768px) { + .navbar-left { + float: left !important; } + + .navbar-right { + float: right !important; + margin-right: -15px; } + + .navbar-right ~ .navbar-right { + margin-right: 0; } } +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; } + +.navbar-default .navbar-brand { + color: #777; } + +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; } + +.navbar-default .navbar-text { + color: #777; } + +.navbar-default .navbar-nav > li > a { + color: #777; } + +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; } + +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; } + +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; } + +.navbar-default .navbar-toggle { + border-color: #ddd; } + +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; } + +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; } + +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; } + +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; } + +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; } + + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; } + + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; } + + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; } } +.navbar-default .navbar-link { + color: #777; } + +.navbar-default .navbar-link:hover { + color: #333; } + +.navbar-default .btn-link { + color: #777; } + +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; } + +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; } + +.navbar-inverse { + background-color: #222; + border-color: #080808; } + +.navbar-inverse .navbar-brand { + color: #9d9d9d; } + +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; } + +.navbar-inverse .navbar-text { + color: #9d9d9d; } + +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; } + +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; } + +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; } + +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; } + +.navbar-inverse .navbar-toggle { + border-color: #333; } + +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; } + +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; } + +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; } + +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; } + +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; } + + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; } + + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; } + + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; } + + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; } + + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; } } +.navbar-inverse .navbar-link { + color: #9d9d9d; } + +.navbar-inverse .navbar-link:hover { + color: #fff; } + +.navbar-inverse .btn-link { + color: #9d9d9d; } + +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; } + +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; } + +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; } + +.breadcrumb > li { + display: inline-block; } + +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; } + +.breadcrumb > .active { + color: #777; } + +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; } + +.pagination > li { + display: inline; } + +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; } + +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; } + +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; } + +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eee; + border-color: #ddd; } + +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; } + +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; } + +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; } + +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; } + +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; } + +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; } + +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; } + +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; } + +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; } + +.pager li { + display: inline; } + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; } + +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; } + +.pager .next > a, +.pager .next > span { + float: right; } + +.pager .previous > a, +.pager .previous > span { + float: left; } + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; } + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; } + +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; } + +.label:empty { + display: none; } + +.btn .label { + position: relative; + top: -1px; } + +.label-default { + background-color: #777; } + +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; } + +.label-primary { + background-color: #337ab7; } + +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; } + +.label-success { + background-color: #5cb85c; } + +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; } + +.label-info { + background-color: #5bc0de; } + +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; } + +.label-warning { + background-color: #f0ad4e; } + +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; } + +.label-danger { + background-color: #d9534f; } + +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; } + +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; } + +.badge:empty { + display: none; } + +.btn .badge { + position: relative; + top: -1px; } + +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; } + +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; } + +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; } + +.list-group-item > .badge { + float: right; } + +.list-group-item > .badge + .badge { + margin-right: 5px; } + +.nav-pills > li > a > .badge { + margin-left: 3px; } + +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; } + +.jumbotron h1, +.jumbotron .h1 { + color: inherit; } + +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; } + +.jumbotron > hr { + border-top-color: #d5d5d5; } + +.container .jumbotron, +.container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; } + +.jumbotron .container { + max-width: 100%; } + +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; } + + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; } + + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; } } +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; } + +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; } + +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; } + +.thumbnail .caption { + padding: 9px; + color: #333; } + +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; } + +.alert h4 { + margin-top: 0; + color: inherit; } + +.alert .alert-link { + font-weight: bold; } + +.alert > p, +.alert > ul { + margin-bottom: 0; } + +.alert > p + p { + margin-top: 5px; } + +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; } + +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; } + +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; } + +.alert-success hr { + border-top-color: #c9e2b3; } + +.alert-success .alert-link { + color: #2b542c; } + +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; } + +.alert-info hr { + border-top-color: #a6e1ec; } + +.alert-info .alert-link { + color: #245269; } + +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; } + +.alert-warning hr { + border-top-color: #f7e1b5; } + +.alert-warning .alert-link { + color: #66512c; } + +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; } + +.alert-danger hr { + border-top-color: #e4b9c0; } + +.alert-danger .alert-link { + color: #843534; } + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; } + to { + background-position: 0 0; } } +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; } + to { + background-position: 0 0; } } +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; } + to { + background-position: 0 0; } } +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } + +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; } + +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; } + +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; } + +.progress-bar-success { + background-color: #5cb85c; } + +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.progress-bar-info { + background-color: #5bc0de; } + +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.progress-bar-warning { + background-color: #f0ad4e; } + +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.progress-bar-danger { + background-color: #d9534f; } + +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.media { + margin-top: 15px; } + +.media:first-child { + margin-top: 0; } + +.media, +.media-body { + overflow: hidden; + zoom: 1; } + +.media-body { + width: 10000px; } + +.media-object { + display: block; } + +.media-object.img-thumbnail { + max-width: none; } + +.media-right, +.media > .pull-right { + padding-left: 10px; } + +.media-left, +.media > .pull-left { + padding-right: 10px; } + +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; } + +.media-middle { + vertical-align: middle; } + +.media-bottom { + vertical-align: bottom; } + +.media-heading { + margin-top: 0; + margin-bottom: 5px; } + +.media-list { + padding-left: 0; + list-style: none; } + +.list-group { + padding-left: 0; + margin-bottom: 20px; } + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; } + +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; } + +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; } + +a.list-group-item, +button.list-group-item { + color: #555; } + +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; } + +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; } + +button.list-group-item { + width: 100%; + text-align: left; } + +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; } + +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; } + +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; } + +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; } + +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; } + +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; } + +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; } + +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; } + +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; } + +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; } + +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; } + +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; } + +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; } + +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; } + +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; } + +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; } + +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; } + +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; } + +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; } + +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; } + +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; } + +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; } + +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; } + +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; } + +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; } + +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; } + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; } + +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; } + +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } + +.panel-body { + padding: 15px; } + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; } + +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; } + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; } + +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; } + +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; } + +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; } + +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; } + +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; } + +.list-group + .panel-footer { + border-top-width: 0; } + +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; } + +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; } + +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; } + +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; } + +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; } + +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; } + +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; } + +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; } + +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; } + +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; } + +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; } + +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; } + +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; } + +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; } + +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; } + +.panel > .table-responsive { + margin-bottom: 0; + border: 0; } + +.panel-group { + margin-bottom: 20px; } + +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; } + +.panel-group .panel + .panel { + margin-top: 5px; } + +.panel-group .panel-heading { + border-bottom: 0; } + +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; } + +.panel-group .panel-footer { + border-top: 0; } + +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; } + +.panel-default { + border-color: #ddd; } + +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; } + +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; } + +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; } + +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; } + +.panel-primary { + border-color: #337ab7; } + +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; } + +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; } + +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; } + +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; } + +.panel-success { + border-color: #d6e9c6; } + +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; } + +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; } + +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; } + +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; } + +.panel-info { + border-color: #bce8f1; } + +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; } + +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; } + +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; } + +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; } + +.panel-warning { + border-color: #faebcc; } + +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; } + +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; } + +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; } + +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; } + +.panel-danger { + border-color: #ebccd1; } + +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; } + +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; } + +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; } + +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; } + +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; } + +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; } + +.embed-responsive-16by9 { + padding-bottom: 56.25%; } + +.embed-responsive-4by3 { + padding-bottom: 75%; } + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); } + +.well-lg { + padding: 24px; + border-radius: 6px; } + +.well-sm { + padding: 9px; + border-radius: 3px; } + +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; } + +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; } + +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; } + +.modal-open { + overflow: hidden; } + +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; } + +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); } + +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); } + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; } + +.modal-dialog { + position: relative; + width: auto; + margin: 10px; } + +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); } + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; } + +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; } + +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; } + +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; } + +.modal-header .close { + margin-top: -2px; } + +.modal-title { + margin: 0; + line-height: 1.42857143; } + +.modal-body { + position: relative; + padding: 15px; } + +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; } + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; } + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; } + +.modal-footer .btn-block + .btn-block { + margin-left: 0; } + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; } + +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; } + + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } + + .modal-sm { + width: 300px; } } +@media (min-width: 992px) { + .modal-lg { + width: 900px; } } +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + line-break: auto; } + +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; } + +.tooltip.top { + padding: 5px 0; + margin-top: -3px; } + +.tooltip.right { + padding: 0 5px; + margin-left: 3px; } + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; } + +.tooltip.left { + padding: 0 5px; + margin-left: -3px; } + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; } + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; } + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; } + +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; } + +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; } + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; } + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; } + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } + +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } + +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + line-break: auto; } + +.popover.top { + margin-top: -10px; } + +.popover.right { + margin-left: 10px; } + +.popover.bottom { + margin-top: 10px; } + +.popover.left { + margin-left: -10px; } + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; } + +.popover-content { + padding: 9px 14px; } + +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; } + +.popover > .arrow { + border-width: 11px; } + +.popover > .arrow:after { + content: ""; + border-width: 10px; } + +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; } + +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; } + +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; } + +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; } + +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); } + +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; } + +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); } + +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; } + +.carousel { + position: relative; } + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; } + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; } + +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; } + +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; } + + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); } + + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); } + + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } } +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; } + +.carousel-inner > .active { + left: 0; } + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; } + +.carousel-inner > .next { + left: 100%; } + +.carousel-inner > .prev { + left: -100%; } + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; } + +.carousel-inner > .active.left { + left: -100%; } + +.carousel-inner > .active.right { + left: 100%; } + +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + background-color: transparent; + filter: alpha(opacity=50); + opacity: .5; } + +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; } + +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; } + +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; } + +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; } + +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; } + +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; } + +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; } + +.carousel-control .icon-prev:before { + content: '\2039'; } + +.carousel-control .icon-next:before { + content: '\203a'; } + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; } + +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: transparent; + border: 1px solid #fff; + border-radius: 10px; } + +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; } + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } + +.carousel-caption .btn { + text-shadow: none; } + +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; } + + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; } + + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; } + + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; } + + .carousel-indicators { + bottom: 20px; } } +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; } + +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; } + +.center-block { + display: block; + margin-right: auto; + margin-left: auto; } + +.pull-right { + float: right !important; } + +.pull-left { + float: left !important; } + +.hide { + display: none !important; } + +.show { + display: block !important; } + +.invisible { + visibility: hidden; } + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; } + +.hidden { + display: none !important; } + +.affix { + position: fixed; } + +@-ms-viewport { + width: device-width; } +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; } + +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; } + +@media (max-width: 767px) { + .visible-xs { + display: block !important; } + + table.visible-xs { + display: table !important; } + + tr.visible-xs { + display: table-row !important; } + + th.visible-xs, + td.visible-xs { + display: table-cell !important; } } +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; } } +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; } } +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; } } +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; } + + table.visible-sm { + display: table !important; } + + tr.visible-sm { + display: table-row !important; } + + th.visible-sm, + td.visible-sm { + display: table-cell !important; } } +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; } } +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; } } +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; } } +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; } + + table.visible-md { + display: table !important; } + + tr.visible-md { + display: table-row !important; } + + th.visible-md, + td.visible-md { + display: table-cell !important; } } +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; } } +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; } } +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; } } +@media (min-width: 1200px) { + .visible-lg { + display: block !important; } + + table.visible-lg { + display: table !important; } + + tr.visible-lg { + display: table-row !important; } + + th.visible-lg, + td.visible-lg { + display: table-cell !important; } } +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; } } +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; } } +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; } } +@media (max-width: 767px) { + .hidden-xs { + display: none !important; } } +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; } } +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; } } +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; } } +.visible-print { + display: none !important; } + +@media print { + .visible-print { + display: block !important; } + + table.visible-print { + display: table !important; } + + tr.visible-print { + display: table-row !important; } + + th.visible-print, + td.visible-print { + display: table-cell !important; } } +.visible-print-block { + display: none !important; } + +@media print { + .visible-print-block { + display: block !important; } } +.visible-print-inline { + display: none !important; } + +@media print { + .visible-print-inline { + display: inline !important; } } +.visible-print-inline-block { + display: none !important; } + +@media print { + .visible-print-inline-block { + display: inline-block !important; } } +@media print { + .hidden-print { + display: none !important; } } +/*# sourceMappingURL=bootstrap.css.map */ +@media (min-width: 1200px) { + .container { + width: 970px; } } +a { + color: #459CE7; } + +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + background-color: #5585B3; + border-color: #4477A3; } + +.pagination > li > a, +.pagination > li > span { + -webkit-transition: all 0.25s linear; + -moz-transition: all 0.25s linear; + -ms-transition: all 0.25s linear; + -o-transition: all 0.25s linear; + transition: all 0.25s linear; } + +/* config variables */ +/* roboto font */ +/* source sans pro */ +/* lato */ +/* merriweather */ +/* karla */ +/* layout */ +body { + font-family: "Roboto"; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +a:focus, button:focus { + outline: none; } + +.navbar.normal { + min-height: 70px; + background: #223741; + border-radius: 0px; + box-shadow: 0px 1px 3px 1px rgba(46, 46, 46, 0.3), inset rgba(255, 255, 255, 0.2) 0 1px 1px; + border: none; + z-index: 9999; } + .navbar.normal .navbar-header .navbar-brand { + color: #fff; + padding: 25px 15px; + font-weight: 400; + font-size: 23px; } + .navbar.normal .navbar-header .navbar-toggle { + margin-top: 17px; } + @media (min-width: 768px) { + .navbar.normal .navbar-collapse { + text-align: center; } } + @media (min-width: 768px) { + .navbar.normal .navbar-collapse .navbar-nav { + float: none; + display: inline-block; } } + .navbar.normal .navbar-collapse .navbar-nav > li { + float: none; + display: inline-block; } + @media (max-width: 767px) { + .navbar.normal .navbar-collapse .navbar-nav > li { + display: block; } } + .navbar.normal .navbar-collapse .navbar-nav > li.active > a { + background: none; + color: #fff; } + .navbar.normal .navbar-collapse .navbar-nav > li > a { + padding: 25px 20px; + color: #d5d5d5; + font-weight: 500; + z-index: 1001; + -webkit-transition: color 0.2s linear; + -moz-transition: color 0.2s linear; + -ms-transition: color 0.2s linear; + -o-transition: color 0.2s linear; + transition: color 0.2s linear; } + @media (max-width: 767px) { + .navbar.normal .navbar-collapse .navbar-nav > li > a { + padding: 18px 20px; } } + .navbar.normal .navbar-collapse .navbar-nav > li > a:hover { + color: #fff; } + @media (max-width: 767px) { + .navbar.normal .navbar-collapse .navbar-nav > li.open ul.dropdown-menu a { + color: #fff; + padding: 12px 18px 12px 30px; } } + .navbar.normal .navbar-collapse .navbar-nav > li ul.dropdown-menu { + text-align: left; + padding: 9px 0; } + .navbar.normal .navbar-collapse .navbar-nav > li ul.dropdown-menu li a { + padding: 8px 18px; } + .navbar.normal .navbar-collapse .navbar-nav .button { + padding: 8px 18px; + font-size: 13px; + position: relative; + top: 17px; } + @media (max-width: 767px) { + .navbar.normal .navbar-collapse .navbar-nav .button { + box-shadow: none; + background: none; + top: 0; + margin-bottom: 20px; + color: #d5d5d5 !important; + font-size: 15px; } } +.navbar.hero { + margin: 0px; + border-radius: 0px; + border: 0px; + z-index: 999; + position: absolute; + width: 100%; + top: 0; } + @media (min-width: 768px) { + .navbar.hero { + background: transparent; + padding-top: 10px; } + .navbar.hero .navbar-nav > .active > a { + background: transparent; + color: #fff; } } + .navbar.hero .navbar-brand { + color: #fff; + font-weight: 400; + font-size: 26px; } + .navbar.hero .navbar-nav > li.dropdown > a .caret { + border-top-color: #EBEBEB; } + .navbar.hero .navbar-nav > li > a { + color: #fff; + font-size: 15px; + padding: 15px 20px; + font-weight: 500; + -webkit-transition: color 0.2s linear; + -moz-transition: color 0.2s linear; + -ms-transition: color 0.2s linear; + -o-transition: color 0.2s linear; + transition: color 0.2s linear; } + .navbar.hero .navbar-nav > li > a:hover { + color: #fff; } + .navbar.hero .navbar-nav > li.open > a { + color: #fff !important; + background-color: rgba(0, 0, 0, 0.8); + border-radius: 4px 4px 0 0; } + @media (max-width: 767px) { + .navbar.hero .navbar-nav > li.open ul.dropdown-menu a { + color: #fff; + padding: 12px 18px 12px 30px; } } + .navbar.hero .navbar-nav > li ul.dropdown-menu { + text-align: left; + background: rgba(0, 0, 0, 0.8); + box-shadow: none; + padding: 5px 0 8px 0; + border-radius: 4px 0 4px 4px; + border: 0px; } + .navbar.hero .navbar-nav > li ul.dropdown-menu li a { + color: #fff; + padding: 10px 18px; } + .navbar.hero .navbar-nav > li ul.dropdown-menu li a:hover { + color: #e9e9e9; + background: none; } +.navbar.white { + min-height: 70px; + margin-bottom: 0; + border-radius: 0; + border: 0; + z-index: 999; } + @media (min-width: 768px) { + .navbar.white { + background: #fff; + box-shadow: 0px 1px 5px rgba(0, 0, 0, 0.75); } } + @media (min-width: 1200px) { + .navbar.white .container { + width: 1000px; } } + .navbar.white .navbar-header .navbar-brand { + color: #333; + font-weight: 400; + font-size: 26px; + padding-top: 24px; } + @media (max-width: 767px) { + .navbar.white .navbar-header .navbar-brand { + color: #fff; + font-size: 20px; } } + .navbar.white .navbar-header .navbar-toggle { + margin-top: 17px; } + @media (min-width: 768px) { + .navbar.white .navbar-collapse { + text-align: center; } } + @media (min-width: 768px) { + .navbar.white .navbar-collapse .navbar-nav { + float: none; + display: inline-block; } } + .navbar.white .navbar-collapse .navbar-nav > li { + float: none; + display: inline-block; } + @media (max-width: 767px) { + .navbar.white .navbar-collapse .navbar-nav > li { + display: block; } } + .navbar.white .navbar-collapse .navbar-nav > li.active > a { + background: none; + color: #333; } + .navbar.white .navbar-collapse .navbar-nav > li > a { + padding: 25px 20px; + color: #555; + z-index: 1001; + -webkit-transition: color 0.2s linear; + -moz-transition: color 0.2s linear; + -ms-transition: color 0.2s linear; + -o-transition: color 0.2s linear; + transition: color 0.2s linear; } + .navbar.white .navbar-collapse .navbar-nav > li > a.signup { + border: 1px solid #CED7DF; + border-radius: 5px; + padding: 8px 11px; + font-size: 13px; + color: #333; + margin-left: 20px; } + @media (max-width: 767px) { + .navbar.white .navbar-collapse .navbar-nav > li > a { + padding: 18px 20px; + color: #fff; } } + .navbar.white .navbar-collapse .navbar-nav > li > a .fa-chevron-down { + color: #777; + font-size: 8px; + margin-left: 2px; + position: relative; + top: -1px; } + .navbar.white .navbar-collapse .navbar-nav > li > a:hover { + color: #333; } + @media (max-width: 767px) { + .navbar.white .navbar-collapse .navbar-nav > li > a:hover { + color: #fff; } } + @media (min-width: 768px) { + .navbar.white .navbar-collapse .navbar-nav > li.open > a { + background: #fff; + color: #333; } } + .navbar.white .navbar-collapse .navbar-nav > li.open > a .caret { + border-top-color: #999; + border-bottom-color: #999; } + @media (max-width: 767px) { + .navbar.white .navbar-collapse .navbar-nav > li.open ul.dropdown-menu a { + color: #fff; + padding: 12px 18px 12px 30px; } } + .navbar.white .navbar-collapse .navbar-nav > li ul.dropdown-menu { + text-align: left; + border: 0; + padding: 0 0 10px; + box-shadow: 0 8px 12px rgba(0, 0, 0, 0.175); } + .navbar.white .navbar-collapse .navbar-nav > li ul.dropdown-menu li a { + padding: 8px 18px; } + +.main-footer { + background: #414B5B; + margin-top: 120px; + padding-top: 60px; + padding-bottom: 30px; } + @media (max-width: 991px) { + .main-footer { + padding-top: 30px; } } + @media (max-width: 767px) { + .main-footer .menu { + text-align: center; + margin-top: 40px; } } + .main-footer .menu h3 { + margin-top: 0; + color: #ced5e0; + text-transform: uppercase; + letter-spacing: 4px; + font-size: 14px; + font-weight: 600; } + .main-footer .menu ul { + list-style-type: none; + padding: 0; + margin-top: 30px; } + .main-footer .menu ul li { + display: block; + margin-bottom: 9px; } + .main-footer .menu ul li a { + color: #fff; + display: inline-block; + font-weight: 500; + font-size: 13px; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .main-footer .menu ul li a:hover { + color: #f7f7f7; + text-decoration: none; } + @media (max-width: 991px) { + .main-footer .menu ul li a { + padding: 0; } } + .main-footer .menu ul li .hiring { + font-weight: 700; + letter-spacing: .3px; + text-transform: uppercase; + word-spacing: 1.5px; + font-size: 11px; + margin-left: 4px; + padding: 3px 8px; + border-radius: 4px; + color: #fff; + background: #49B7E2; } + .main-footer .menu ul li .hiring:hover { + color: #fff; + background: #0E82AF; } + .main-footer .newsletter { + text-align: right; } + @media (max-width: 767px) { + .main-footer .newsletter { + text-align: center; + margin-top: 40px; } } + .main-footer .newsletter .signup { + margin-bottom: 40px; } + .main-footer .newsletter .signup p { + font-size: 13px; + color: #fff; + width: 90%; + float: right; + text-align: left; + line-height: 20px; } + @media (max-width: 767px) { + .main-footer .newsletter .signup p { + float: none; + text-align: center; + width: 100%; } } + .main-footer .newsletter .signup form { + float: right; + width: 90%; + position: relative; } + @media (max-width: 767px) { + .main-footer .newsletter .signup form { + float: none; + width: 100%; } } + .main-footer .newsletter .signup form input[type="text"] { + font-size: 13px; } + .main-footer .newsletter .signup form input[type="text"]::-webkit-input-placeholder { + font-size: 13px; + line-height: 17px; } + .main-footer .newsletter .signup form input[type="text"]:-moz-placeholder { + font-size: 13px; + line-height: 17px; } + .main-footer .newsletter .signup form input[type="text"]::-moz-placeholder { + font-size: 13px; + line-height: 17px; } + .main-footer .newsletter .signup form input[type="text"]:-ms-input-placeholder { + font-size: 13px; + line-height: 17px; } + .main-footer .newsletter .signup form input[type="submit"] { + border: 0; + background: #84B0E2; + color: #FFF; + border-radius: 3px; + padding: 6px 10px; + position: absolute; + top: 5px; + text-shadow: 1px 1px rgba(0, 0, 0, 0.28); + right: 5px; + font-size: 13px; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .main-footer .newsletter .signup form input[type="submit"]:hover { + background: #6284AC; } + .main-footer .newsletter a { + border: 0; + text-decoration: none; + opacity: 1; + filter: alpha(opacity=100); + margin-left: 15px; + position: relative; + top: -10px; + -webkit-transition: all 0.3s ease; + -moz-transition: all 0.3s ease; + -ms-transition: all 0.3s ease; + -o-transition: all 0.3s ease; + transition: all 0.3s ease; } + .main-footer .newsletter a:hover { + opacity: 0.7; + filter: alpha(opacity=70); } + .main-footer .credits { + margin-top: 30px; } + .main-footer .credits .col-md-12 { + padding-top: 20px; + font-size: 13px; + text-align: center; + color: #a3aab5; } + .main-footer--white { + background: #fff; + margin-top: 0; } + .main-footer--white .menu h3 { + color: #888; } + .main-footer--white .menu ul li a { + color: #89A1C0; } + .main-footer--white .menu ul li a:hover { + color: #000; } + .main-footer--white .newsletter .signup p { + color: #666; } + .main-footer--white .credits .col-md-12 { + color: #A1AAB6; } + +/* snippets */ +.features-section { + margin-top: 90px; } + .features-section--margin { + margin-top: 120px; } + .features-section--margin .feature { + margin-bottom: 110px; } + .features-section--margin .feature.last { + margin-bottom: 50px; } + @media (max-width: 991px) { + .features-section { + margin-top: 50px; } } + .features-section .header { + text-align: center; } + .features-section .header h2 { + color: #555; + font-weight: 400; + font-size: 27px; } + @media (max-width: 767px) { + .features-section .header h2 { + font-size: 25px; } } + .features-section .header p { + font-size: 17px; + color: #757575; } + .features-section .feature { + margin-top: 60px; } + .features-section .feature.last .image img { + margin-left: 70px; } + @media (min-width: 992px) { + .features-section .feature.backwards .info { + float: right; } + .features-section .feature.backwards .image { + float: left; } + .features-section .feature.backwards .image img { + margin: 0 auto; } } + @media (max-width: 991px) { + .features-section .feature { + margin-top: 10px; } } + .features-section .feature .info h4 { + color: #3B88B6; + font-weight: normal; + font-size: 19px; + line-height: 25px; + margin-top: 35px; } + @media (max-width: 991px) { + .features-section .feature .info h4 { + text-align: center; } } + .features-section .feature .info p { + color: #6C7279; + font-size: 14px; + margin-top: 20px; + line-height: 24px; + width: 83%; + font-weight: normal; } + @media (max-width: 991px) { + .features-section .feature .info p { + text-align: center; + width: 100%; + font-size: 14px; } } + @media (max-width: 991px) { + .features-section .feature .image img { + margin: 0 auto !important; + margin-top: 20px; } } + .features-section .divider { + height: 1px; + width: 100%; + background-color: #ddd; + position: relative; + margin: 70px 0 60px; } + .features-section .divider:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 2px; + background-image: -webkit-gradient(linear, left top, right top, color-stop(0, rgba(255, 255, 255, 0.75)), color-stop(0.5, rgba(250, 250, 250, 0)), color-stop(1, rgba(255, 255, 255, 0.75))); + background-image: -webkit-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -moz-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -o-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -ms-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); } + @media (max-width: 991px) { + .features-section .divider { + margin: 55px 0 35px; } } + +.slider-section { + margin-top: 70px; } + @media (max-width: 991px) { + .slider-section { + margin-top: 30px; } } + .slider-section .header { + text-align: center; } + .slider-section .header h3 { + font-size: 25px; + color: #555; + line-height: 25px; + font-weight: 400; + margin-bottom: 15px; } + .slider-section .slide-wrapper { + border-bottom: 1px solid #E4E4E4; } + .slider-section .slide-wrapper .slideshow { + background: url("../../images/slider-bg.png") 0 0 no-repeat; + margin: 0 auto; + margin-top: 35px; + width: 844px; + height: 418px; + position: relative; + overflow: hidden; } + @media (max-width: 991px) { + .slider-section .slide-wrapper .slideshow { + background: none; + width: inherit; + height: 340px; } } + @media (max-width: 620px) { + .slider-section .slide-wrapper .slideshow { + height: 290px; } } + @media (max-width: 530px) { + .slider-section .slide-wrapper .slideshow { + height: 240px; } } + @media (max-width: 450px) { + .slider-section .slide-wrapper .slideshow { + height: 205px; } } + .slider-section .slide-wrapper .slideshow .btn-nav { + width: 48px; + height: 51px; + position: absolute; + top: 55%; + z-index: 999; + cursor: pointer; + opacity: 0; + filter: alpha(opacity=0); + -webkit-transition: all .3s ease; + -moz-transition: all .3s ease; + -o-transition: all .3s ease; + -ms-transition: all .3s ease; + transition: all .3s ease; } + .slider-section .slide-wrapper .slideshow .btn-nav.active { + opacity: 1; + filter: alpha(opacity=100); + -moz-transform: translateX(0px) !important; + -o-transform: translateX(0px) !important; + -ms-transform: translateX(0px) !important; + -webkit-transform: translateX(0px) !important; + transform: translateX(0px) !important; } + .slider-section .slide-wrapper .slideshow .btn-nav.prev { + background: url("../../images/slider/slide-left.png") 0 0 no-repeat; + left: 91px; + -moz-transform: translateX(-48px); + -o-transform: translateX(-48px); + -ms-transform: translateX(-48px); + -webkit-transform: translateX(-48px); + transform: translateX(-48px); } + @media (max-width: 991px) { + .slider-section .slide-wrapper .slideshow .btn-nav.prev { + left: 30px; } } + .slider-section .slide-wrapper .slideshow .btn-nav.next { + background: url("../../images/slider/slide-right.png") 0 0 no-repeat; + right: 91px; + -moz-transform: translateX(48px); + -o-transform: translateX(48px); + -ms-transform: translateX(48px); + -webkit-transform: translateX(48px); + transform: translateX(48px); } + @media (max-width: 991px) { + .slider-section .slide-wrapper .slideshow .btn-nav.next { + right: 29px; } } + .slider-section .slide-wrapper .slideshow .slide { + width: 100%; + height: 100%; + position: absolute; } + .slider-section .slide-wrapper .slideshow .slide.active img { + opacity: 1; + filter: alpha(opacity=100); + -moz-transform: translateY(0px); + -o-transform: translateY(0px); + -ms-transform: translateY(0px); + -webkit-transform: translateY(0px); + transform: translateY(0px); } + .slider-section .slide-wrapper .slideshow .slide img { + position: absolute; + bottom: 0; + left: 0; + right: 0; + margin: auto; + -moz-transform: translateY(300px); + -o-transform: translateY(300px); + -ms-transform: translateY(300px); + -webkit-transform: translateY(300px); + transform: translateY(300px); + opacity: 0; + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + filter: alpha(opacity=0); + -webkit-transition: all .6s ease; + -moz-transition: all .6s ease; + -o-transition: all .6s ease; + -ms-transition: all .6s ease; + transition: all .6s ease; } + @media (max-width: 767px) { + .slider-section .slide-wrapper .slideshow .slide img { + width: 100%; } } + +/* pages */ +.index-hero { + overflow: hidden; + background: #4B4848; + background-size: cover; + background-image: url("../../images/8254861601_1fbf969a14_b.jpg"); + /*background: -webkit-radial-gradient(closest-corner, rgba(16, 47, 70, 0) 60%, rgba(16, 47, 70, 0.26)), -webkit-linear-gradient(108deg, #5E8199, #153752 90%);*/ + background-position: center 16%; + height: 580px; + position: relative; + padding-top: 150px; + box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.4); } + @media (max-width: 991px) { + .index-hero { + padding-top: 100px; } } + @media (max-width: 767px) { + .index-hero { + height: 550px; } } + .index-hero:before { + position: absolute; + content: ''; + left: 0; + bottom: 0; + width: 100%; + height: 100%; + background: -webkit-linear-gradient(right, rgba(255, 255, 255, 0) 0%, transparent 1%, rgba(0, 0, 0, 0.1) 26%, rgba(0, 0, 0, 0.35) 71%, rgba(0, 0, 0, 0.5) 100%); + background: -moz-linear-gradient(right, rgba(255, 255, 255, 0) 0%, transparent 1%, rgba(0, 0, 0, 0.1) 26%, rgba(0, 0, 0, 0.35) 71%, rgba(0, 0, 0, 0.5) 100%); + background: -o-linear-gradient(right, rgba(255, 255, 255, 0) 0%, transparent 1%, rgba(0, 0, 0, 0.1) 26%, rgba(0, 0, 0, 0.35) 71%, rgba(0, 0, 0, 0.5) 100%); + background: linear-gradient(right, rgba(255, 255, 255, 0) 0%, transparent 1%, rgba(0, 0, 0, 0.1) 26%, rgba(0, 0, 0, 0.35) 71%, rgba(0, 0, 0, 0.5) 100%); } + .index-hero:after { + position: absolute; + content: ''; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: rgba(32, 54, 114, 0.29); } + .index-hero .container { + position: relative; + z-index: 33; } + .index-hero h1.hero-text { + line-height: 52px; + text-align: left; + font-size: 37px; + text-transform: uppercase; + font-weight: 300; + letter-spacing: .3px; + color: #FFF; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); + -webkit-animation-duration: 1s; } + @media (max-width: 767px) { + .index-hero h1.hero-text { + font-size: 25px; + line-height: 38px; + margin-top: 0; + text-align: center; } } + .index-hero .sub-text { + width: 50%; + margin-top: 25px; + color: #fff; + font-weight: 400; + font-size: 17px; + line-height: 28px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3); + -webkit-animation-duration: 1s; } + @media (max-width: 991px) { + .index-hero .sub-text { + width: 70%; } } + @media (max-width: 767px) { + .index-hero .sub-text { + font-size: 15px; + width: 100%; + text-align: center; } } + .index-hero .cta { + -webkit-animation-delay: 0.6s; + -moz-animation-delay: 0.6s; + -o-animation-delay: 0.6s; + -ms-animation-delay: 0.6s; + animation-delay: 0.6s; + margin-top: 60px; } + @media (max-width: 767px) { + .index-hero .cta { + text-align: center; } } + .index-hero .cta a { + margin-right: 20px; + padding: 15px 31px; } + @media (max-width: 767px) { + .index-hero .cta a { + font-size: 14px; + padding: 12px 25px; + margin: 0px 15px 15px 0px; } } + .index-hero .img { + position: absolute; + top: 15px; + left: 625px; + width: 570px; + height: 333px; + background-image: url("../../images/static-hero.png"); + background-repeat: no-repeat; } + @media (max-width: 991px) { + .index-hero .img { + display: none; } } + +.testimonials-section { + margin-top: 100px; } + .testimonials-section .header { + text-align: center; } + .testimonials-section .header h3 { + font-size: 23px; + color: #656565; + font-weight: 400; + line-height: 25px; + margin-bottom: 45px; } + .testimonials-section .testimonial { + width: 90%; } + @media (max-width: 767px) { + .testimonials-section .testimonial { + float: none !important; + margin: 0 auto; + margin-bottom: 45px; } } + .testimonials-section .testimonial .quote { + color: #53565f; + line-height: 26px; + border: 1px solid #E2E2E2; + padding: 16px 25px; + border-radius: 5px; + width: 95%; + position: relative; } + @media (max-width: 767px) { + .testimonials-section .testimonial .quote { + margin: 0 auto; } } + .testimonials-section .testimonial .quote .arrow-down { + position: absolute; + bottom: 3px; + left: 30px; } + .testimonials-section .testimonial .quote .arrow-down .arrow, .testimonials-section .testimonial .quote .arrow-down .arrow-border { + border-color: #fff transparent transparent; + border-style: solid; + border-width: 11px; + cursor: pointer; + position: absolute; + top: 3px; + z-index: 1002; } + .testimonials-section .testimonial .quote .arrow-down .arrow-border { + border-color: #E2E2E2 transparent transparent; + border-width: 12px; + top: 3px; + z-index: 1001; + left: -1px; } + .testimonials-section .testimonial .author { + margin-top: 40px; + margin-left: 10px; } + @media (max-width: 767px) { + .testimonials-section .testimonial .author { + margin-left: 6%; } } + .testimonials-section .testimonial .author .pic { + width: 71px; + height: 71px; + border-radius: 50px; + float: left; + position: relative; + top: -12px; + margin-right: 18px; + border: 1px solid #ccc; } + .testimonials-section .testimonial .author .name { + color: #3C92C5; + line-height: 23px; + font-weight: 500; } + .testimonials-section .testimonial .author .company { + font-size: 14px; + color: #909090; + line-height: 23px; + font-weight: 400; } + +.cta-section { + text-align: center; + margin-top: 120px; } + .cta-section p { + font-size: 18px; + color: #7A7D81; + letter-spacing: 0.1px; } + .cta-section a { + display: inline-block; + margin-top: 30px; + background: #6CAAE4; + color: #FFF; + padding: 23px 40px; + font-size: 16px; + letter-spacing: 1px; + font-weight: 500; + text-transform: uppercase; + border-radius: 5px; + box-shadow: rgba(23, 43, 99, 0.3) 0 7px 28px; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .cta-section a:hover { + text-decoration: none; + background: #3FD8DF; } + +.clients-section { + background: #5E7A9B; + background: radial-gradient(#36414E, #253241); + margin-top: 120px; + padding: 65px 0 80px; + text-align: center; } + .clients-section h3 { + color: #FFF; + margin-top: 0; + font-weight: 300; + font-size: 35px; + letter-spacing: .3px; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } + .clients-section p { + font-size: 16px; + color: #f8f8f8; + margin-top: 17px; + font-weight: 300; + line-height: 25px; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } + .clients-section .logos { + margin-top: 35px; } + .clients-section .logos img { + margin: 0 16px; } + @media (max-width: 767px) { + .clients-section .logos img { + margin: 0 auto; + display: block; + margin-bottom: 15px; } } + +@-webkit-keyframes $name { + 0% { + left: 0; } + 100% { + left: -15px; } } +@-moz-keyframes $name { + 0% { + left: 0; } + 100% { + left: -15px; } } +@-o-keyframes $name { + 0% { + left: 0; } + 100% { + left: -15px; } } +@keyframes $name { + 0% { + left: 0; } + 100% { + left: -15px; } } +.slider-hero { + background: #4B4848; + height: 585px; + position: relative; + /* prev & next arrows */ + /* navigation dots */ + /* slides */ + /* video modal */ } + @media (max-width: 991px) { + .slider-hero { + padding-top: 100px; } } + @media (max-width: 767px) { + .slider-hero { + height: 550px; } } + .slider-hero .slide-nav { + position: absolute; + top: 0; + bottom: 0; + width: 140px; + z-index: 200; + text-indent: 100%; + overflow: hidden; + opacity: 0.5; + filter: alpha(opacity=50); + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + -ms-transition: opacity 0.2s linear; + -o-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; } + .slider-hero .slide-nav:hover { + opacity: 1; + filter: alpha(opacity=100); } + .slider-hero .slide-nav.prev:after { + content: ""; + display: block; + position: absolute; + top: 0; + bottom: 0; + margin: auto 0; + width: 19px; + height: 58px; + background: url("../../images/slide-arrow.png") no-repeat; + left: 30px; + -moz-transform: rotate(180deg); + -o-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + .slider-hero .slide-nav.next { + right: 0; } + .slider-hero .slide-nav.next:after { + content: ""; + display: block; + position: absolute; + top: 0; + bottom: 0; + margin: auto 0; + width: 19px; + height: 58px; + background: url("../../images/slide-arrow.png") no-repeat; + right: 30px; } + .slider-hero nav { + z-index: 999; + position: absolute; + bottom: 20px; + width: 100%; + text-align: center; } + .slider-hero nav a { + display: inline-block; + width: 10px; + height: 10px; + background: #a2a2a2; + border-radius: 50%; + margin: 0 3px; } + .slider-hero nav a.active { + background: #fff; } + .slider-hero .slides { + overflow: hidden; + position: absolute; + top: 0px; + width: 100%; + height: 100%; + /* each slide */ } + .slider-hero .slides .slide { + display: none; + z-index: 80; + height: 100%; + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + padding-top: 90px; } + .slider-hero .slides .slide.active { + opacity: 1; + filter: alpha(opacity=100); + display: block; + z-index: 100; } + .slider-hero .slides .slide.next { + z-index: 90; } + @media (min-width: 768px) { + .slider-hero .slides .slide.next .bg { + -webkit-animation: slideLeft 700ms linear; + -moz-animation: slideLeft 700ms linear; + -o-animation: slideLeft 700ms linear; + -ms-animation: slideLeft 700ms linear; + animation: slideLeft 700ms linear; } } + .slider-hero .slides .slide .container { + position: relative; + z-index: 3; + height: 100%; } + .slider-hero .slides .slide .bg { + position: absolute; + top: 0; + left: -15px; + width: 102%; + height: 100%; + background-position: center center; + background-size: cover; } + @media (max-width: 767px) { + .slider-hero .slides .slide .bg { + left: 0px; } } + .slider-hero .slides .slide .bg:before { + position: absolute; + top: 10%; + bottom: 0; + left: 0; + right: 0; + content: ''; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, transparent), color-stop(100%, rgba(0, 0, 0, 0.25))); + background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.25) 100%); + background: -moz-linear-gradient(top, transparent, rgba(0, 0, 0, 0.25)); + background: -o-linear-gradient(top, transparent, rgba(0, 0, 0, 0.25)); + background: linear-gradient(top, transparent, rgba(0, 0, 0, 0.25)); } + .slider-hero .slides .slide .bg:after { + content: ''; + position: absolute; + display: block; + height: 100%; + left: 0; + width: 100%; + top: 0; } + @media (max-width: 767px) { + .slider-hero .slides .slide.first { + padding-top: 40px; } } + .slider-hero .slides .slide.first .bg { + background-image: url("../../images/bgs/photo-1467703834117-04386e3dadd8.jpeg"); + background-position: center 29%; } + .slider-hero .slides .slide.first .bg:after { + background: rgba(5, 11, 29, 0.4); } + .slider-hero .slides .slide.first h1.hero-text { + text-align: center; + font-family: "Lato", "Helvetica Neue", Arial; + font-size: 37px; + font-weight: 400; + color: #fff; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.65); } + @media (max-width: 767px) { + .slider-hero .slides .slide.first h1.hero-text { + font-size: 25px; } } + .slider-hero .slides .slide.first .sub-text { + margin: 0 auto; + font-family: "Lato", "Helvetica Neue", Arial; + line-height: 26px; + margin-top: 25px; + text-align: center; + color: #fff; + font-weight: 400; + font-size: 17px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.2); + width: 50%; + -webkit-animation-delay: 0.6s; + -moz-animation-delay: 0.6s; + -o-animation-delay: 0.6s; + -ms-animation-delay: 0.6s; + animation-delay: 0.6s; } + @media (max-width: 991px) { + .slider-hero .slides .slide.first .sub-text { + width: 70%; } } + @media (max-width: 767px) { + .slider-hero .slides .slide.first .sub-text { + font-size: 15px; } } + .slider-hero .slides .slide.first .video-wrapper { + text-align: center; + margin-top: 50px; } + @media (max-width: 767px) { + .slider-hero .slides .slide.first .video-wrapper { + margin-top: 25px; } } + .slider-hero .slides .slide.first .video-wrapper .video { + display: inline-block; + padding: 6px; + background: rgba(255, 255, 255, 0.5); + border-radius: 5px; + -webkit-animation-duration: 1.2s; + -moz-animation-duration: 1.2s; + -o-animation-duration: 1.2s; + animation-duration: 1.2s; } + .slider-hero .slides .slide.first .video-wrapper .video img { + max-width: 280px; + cursor: pointer; } + @media (max-width: 767px) { + .slider-hero .slides .slide.first .video-wrapper .video img { + max-width: 200px; } } + @media (max-width: 767px) { + .slider-hero .slides .slide.second { + padding-top: 50px; } } + .slider-hero .slides .slide.second .bg { + background-image: url("../../images/bgs/photo-1472132858735-6313c7962473.jpeg"); + background-position: center 18%; } + .slider-hero .slides .slide.second .bg:after { + background: rgba(52, 52, 58, 0.5); } + .slider-hero .slides .slide.second .info h1.hero-text { + margin-top: 65px; + font-family: "Lato", "Helvetica Neue", Arial; + font-size: 40px; + line-height: 45px; + font-weight: 400; + color: #fff; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8); } + @media (max-width: 767px) { + .slider-hero .slides .slide.second .info h1.hero-text { + font-size: 28px; + text-align: center; } } + .slider-hero .slides .slide.second .info p { + color: rgba(255, 255, 255, 0.94); + font-family: "Lato", "Helvetica Neue", Arial; + letter-spacing: 0.3px; + margin-top: 25px; + font-size: 17px; + line-height: 26px; } + .slider-hero .slides .slide.second .info .cta { + -webkit-animation-delay: 0.6s; + -moz-animation-delay: 0.6s; + -o-animation-delay: 0.6s; + -ms-animation-delay: 0.6s; + animation-delay: 0.6s; + margin-top: 40px; } + @media (max-width: 767px) { + .slider-hero .slides .slide.second .info .cta { + text-align: center; } } + .slider-hero .slides .slide.second .info .cta a { + position: relative; + margin: 0px 30px 0 0; + padding: 16px 25px; + letter-spacing: 1px; + font-weight: 500; + text-transform: uppercase; + border: 2px solid rgba(255, 255, 255, 0.8); + background: rgba(0, 0, 0, 0.4); } + .slider-hero .slides .slide.second .info .cta a:hover { + color: #252525; + background: #fff; + padding-right: 45px; } + .slider-hero .slides .slide.second .info .cta a:hover .fa { + opacity: 1; } + .slider-hero .slides .slide.second .info .cta a .fa { + opacity: 0; + font-size: 13px; + position: absolute; + color: #252525; + top: 21px; + right: 20px; + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + -ms-transition: all 0.15s linear; + -o-transition: all 0.15s linear; + transition: all 0.15s linear; } + @media (max-width: 767px) { + .slider-hero .slides .slide.second .info .cta a { + font-size: 14px; + padding: 12px 25px; + margin: 0px 15px 15px 0px; } } + .slider-hero .slides .slide.second .mobiles img { + display: block; + margin: 0 auto; + width: 360px; + -webkit-animation-duration: 1.2s; + -moz-animation-duration: 1.2s; + -o-animation-duration: 1.2s; + animation-duration: 1.2s; } + .slider-hero .slides .slide.third { + padding-top: 115px; } + @media (max-width: 767px) { + .slider-hero .slides .slide.third { + padding-top: 50px; } } + .slider-hero .slides .slide.third .bg { + background-image: url("../../images/bgs/photo-1467659226669-a1360d97be2d.jpeg"); + background-position: center 15%; } + .slider-hero .slides .slide.third .bg:after { + background: rgba(3, 9, 27, 0.5); } + .slider-hero .slides .slide.third h1, .slider-hero .slides .slide.third .sub-text { + -webkit-animation-duration: 1s; + -moz-animation-duration: 1s; + -o-animation-duration: 1s; + animation-duration: 1s; } + .slider-hero .slides .slide.third h1.hero-text { + text-align: center; + font-size: 38px; + font-weight: 400; + color: #fff; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); } + @media (max-width: 767px) { + .slider-hero .slides .slide.third h1.hero-text { + font-size: 28px; } } + .slider-hero .slides .slide.third .sub-text { + margin: 0 auto; + margin-top: 25px; + text-align: center; + color: #f7f7f7; + font-weight: 400; + font-size: 17px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.2); + width: 50%; } + @media (max-width: 991px) { + .slider-hero .slides .slide.third .sub-text { + width: 70%; } } + @media (max-width: 767px) { + .slider-hero .slides .slide.third .sub-text { + font-size: 15px; } } + .slider-hero .slides .slide.third .cta { + -webkit-animation-delay: 0.6s; + -moz-animation-delay: 0.6s; + -o-animation-delay: 0.6s; + -ms-animation-delay: 0.6s; + animation-delay: 0.6s; + text-align: center; + margin-top: 60px; } + .slider-hero .slides .slide.third .cta a { + margin: 0px 20px; } + @media (max-width: 767px) { + .slider-hero .slides .slide.third .cta a { + font-size: 14px; + padding: 12px 25px; + margin: 0px 15px 15px 0px; } } + .slider-hero .video-modal { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 999; + opacity: 0; + filter: alpha(opacity=0); + visibility: hidden; + -webkit-transition: all 0.25s linear; + -moz-transition: all 0.25s linear; + -ms-transition: all 0.25s linear; + -o-transition: all 0.25s linear; + transition: all 0.25s linear; } + .slider-hero .video-modal.active { + opacity: 1; + filter: alpha(opacity=100); + visibility: visible; + background: rgba(44, 44, 45, 0.8); } + .slider-hero .video-modal.active .wrap { + -moz-transform: scale3d(1, 1, 1); + -o-transform: scale3d(1, 1, 1); + -ms-transform: scale3d(1, 1, 1); + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + opacity: 1; + filter: alpha(opacity=100); } + .slider-hero .video-modal .wrap { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + margin: auto; + padding: 5px; + background: rgba(255, 255, 255, 0.65); + border-radius: 5px; + width: 630px; + height: 360px; + opacity: 0; + filter: alpha(opacity=0); + -moz-transform: scale3d(0.3, 0.3, 0.3); + -o-transform: scale3d(0.3, 0.3, 0.3); + -ms-transform: scale3d(0.3, 0.3, 0.3); + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + -webkit-transition: all 0.4s ease-out; + -moz-transition: all 0.4s ease-out; + -ms-transition: all 0.4s ease-out; + -o-transition: all 0.4s ease-out; + transition: all 0.4s ease-out; } + +.features-hover-section { + margin-top: 120px; } + @media (max-width: 991px) { + .features-hover-section { + margin-top: 60px; } } + .features-hover-section .images { + height: 355px; } + @media (max-width: 767px) { + .features-hover-section .images { + height: 300px; } } + .features-hover-section .images img { + margin: 0 auto; + position: absolute; + left: 0; + right: 0; + display: none; } + .features-hover-section .images img.active { + display: block; } + .features-hover-section .features { + margin-top: 50px; } + @media (max-width: 991px) { + .features-hover-section .features { + margin-top: 0px; } } + .features-hover-section .features .feature { + cursor: pointer; } + @media (min-width: 992px) { + .features-hover-section .features .feature { + width: 85%; + margin: 0 auto; } } + .features-hover-section .features .feature.active strong, .features-hover-section .features .feature:hover strong { + color: #58B0D5; } + .features-hover-section .features .feature.active p, .features-hover-section .features .feature:hover p { + color: #555; } + .features-hover-section .features .feature strong { + color: #b6b6b6; + font-size: 16px; + -webkit-transition: color 0.2s linear; + -moz-transition: color 0.2s linear; + -ms-transition: color 0.2s linear; + -o-transition: color 0.2s linear; + transition: color 0.2s linear; } + .features-hover-section .features .feature p { + margin-top: 15px; + line-height: 25px; + color: #b6b6b6; + -webkit-transition: color 0.2s linear; + -moz-transition: color 0.2s linear; + -ms-transition: color 0.2s linear; + -o-transition: color 0.2s linear; + transition: color 0.2s linear; } + +.sidebar-toggle { + width: 30px; + float: right; + margin-top: 15px; + cursor: pointer; } + .sidebar-toggle .line { + background: #fff; + width: 100%; + height: 3px; + margin-bottom: 6px; + border-radius: 1px; } + +.st-container { + position: relative; + overflow: hidden; } + .st-container--right-side { + /* show hidden navbar */ } + .st-container--right-side .nav-menu { + right: 0; + -moz-transform: translate3d(50%, 0, 0); + -o-transform: translate3d(50%, 0, 0); + -ms-transform: translate3d(50%, 0, 0); + -webkit-transform: translate3d(50%, 0, 0); + transform: translate3d(50%, 0, 0); } + .st-container--right-side.nav-effect .nav-menu { + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + .st-container--right-side.nav-effect .st-pusher { + -moz-transform: translate3d(-320px, 0, 0); + -o-transform: translate3d(-320px, 0, 0); + -ms-transform: translate3d(-320px, 0, 0); + -webkit-transform: translate3d(-320px, 0, 0); + transform: translate3d(-320px, 0, 0); + box-shadow: 5px 0px 20px 0px rgba(0, 0, 0, 0.5); } + @media (max-width: 767px) { + .st-container--right-side.nav-effect .st-pusher { + -moz-transform: translate3d(-220px, 0, 0); + -o-transform: translate3d(-220px, 0, 0); + -ms-transform: translate3d(-220px, 0, 0); + -webkit-transform: translate3d(-220px, 0, 0); + transform: translate3d(-220px, 0, 0); } } + .st-container--left-side { + /* show hidden navbar */ } + .st-container--left-side .nav-menu { + left: 0; + -moz-transform: translate3d(-50%, 0, 0); + -o-transform: translate3d(-50%, 0, 0); + -ms-transform: translate3d(-50%, 0, 0); + -webkit-transform: translate3d(-50%, 0, 0); + transform: translate3d(-50%, 0, 0); } + .st-container--left-side.nav-effect .nav-menu { + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + .st-container--left-side.nav-effect .st-pusher { + -moz-transform: translate3d(300px, 0, 0); + -o-transform: translate3d(300px, 0, 0); + -ms-transform: translate3d(300px, 0, 0); + -webkit-transform: translate3d(300px, 0, 0); + transform: translate3d(300px, 0, 0); + box-shadow: -5px 0px 20px 0px rgba(0, 0, 0, 0.5); } + @media (max-width: 767px) { + .st-container--left-side.nav-effect .st-pusher { + -moz-transform: translate3d(220px, 0, 0); + -o-transform: translate3d(220px, 0, 0); + -ms-transform: translate3d(220px, 0, 0); + -webkit-transform: translate3d(220px, 0, 0); + transform: translate3d(220px, 0, 0); } } + +.st-pusher { + position: relative; + left: 0; + z-index: 99; + background: #fff; + -webkit-transition: -webkit-transform 0.35s ease-out; + -moz-transition: -moz-transform 0.35s ease-out; + -ms-transition: -ms-transform 0.35s ease-out; + -o-transition: -o-transform 0.35s ease-out; + transition: transform 0.35s ease-out; } + +.nav-menu { + position: fixed; + top: 0; + z-index: 1; + width: 320px; + height: 100%; + background: #2a313a; + padding-top: 30px; + -webkit-transition: -webkit-transform 0.35s ease-out; + -moz-transition: -moz-transform 0.35s ease-out; + -ms-transition: -ms-transform 0.35s ease-out; + -o-transition: -o-transform 0.35s ease-out; + transition: transform 0.35s ease-out; } + @media (max-width: 767px) { + .nav-menu { + width: 220px; + position: absolute; } } + .nav-menu .main-menu h3 { + color: #fff; + font-size: 26px; + margin-left: 50px; + margin-bottom: 30px; } + @media (max-width: 767px) { + .nav-menu .main-menu h3 { + margin-left: 30px; + font-size: 23px; } } + .nav-menu .main-menu a { + display: block; + padding: 5px 30px 5px 50px; + margin-bottom: 10px; + text-decoration: none; + color: #fff; + font-size: 15px; + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + -ms-transition: all 0.15s linear; + -o-transition: all 0.15s linear; + transition: all 0.15s linear; } + @media (max-width: 767px) { + .nav-menu .main-menu a { + padding-left: 30px; + font-size: 16px; } } + .nav-menu .main-menu a:hover { + color: #82C4F8; } + .nav-menu .main-menu .social { + margin-left: 45px; + margin-top: 50px; } + @media (max-width: 767px) { + .nav-menu .main-menu .social { + margin-left: 30px; } } + .nav-menu .main-menu .social a { + padding: 0px; + display: inline-block; + margin-right: 22px; } + .nav-menu .main-menu .social a:hover i { + color: #7EBDE7; } + .nav-menu .main-menu .social a i { + font-size: 22px; + color: #fff; + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + -ms-transition: all 0.15s linear; + -o-transition: all 0.15s linear; + transition: all 0.15s linear; } + .nav-menu .projects .back { + margin-top: 10px; + font-weight: 500; + font-size: 21px; + color: #fff; + margin-bottom: 20px; } + .nav-menu .projects a { + display: block; + position: relative; + left: 0px; + padding: 15px 40px; + text-decoration: none; + color: #fff; + font-size: 16px; + font-weight: 400; + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + -ms-transition: all 0.15s linear; + -o-transition: all 0.15s linear; + transition: all 0.15s linear; } + @media (max-width: 767px) { + .nav-menu .projects a { + padding-left: 20px; } } + .nav-menu .projects a:hover { + left: 10px; } + .nav-menu .projects a p { + color: #A2B1C2; + font-size: 14px; + margin-top: 5px; } + +.index-sidebar-hero { + background: #3D4046; + height: 630px; + position: relative; + overflow: hidden; + box-shadow: 0px 1px 3px -1px rgba(0, 0, 0, 0.35); + padding-top: 130px; } + @media (max-width: 991px) { + .index-sidebar-hero { + padding-top: 100px; + height: 550px; } } + .index-sidebar-hero #cover-image { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + padding-top: 105px; + background-position: center center; + background-size: cover; + -webkit-animation-delay: 0.15s; + -moz-animation-delay: 0.15s; + -o-animation-delay: 0.15s; + -ms-animation-delay: 0.15s; + animation-delay: 0.15s; + background-image: url("../images/bg4.png"); } + @media (max-width: 991px) { + .index-sidebar-hero #cover-image { + padding-top: 65px; } } + .index-sidebar-hero #cover-image:after { + content: ''; + position: absolute; + display: block; + height: 100%; + left: 0; + width: 100%; + top: 0; + background: rgba(24, 22, 19, 0.4); } + .index-sidebar-hero #cover-image:before { + position: absolute; + top: 10%; + bottom: 0; + left: 0; + right: 0; + content: ''; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, transparent), color-stop(100%, rgba(0, 0, 0, 0.25))); + background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.25) 100%); + background: -moz-linear-gradient(top, transparent, rgba(0, 0, 0, 0.25)); + background: -o-linear-gradient(top, transparent, rgba(0, 0, 0, 0.25)); + background: linear-gradient(top, transparent, rgba(0, 0, 0, 0.25)); } + .index-sidebar-hero .container { + position: relative; + z-index: 3; + height: 100%; } + .index-sidebar-hero .hero-text { + text-align: center; + font-size: 35px; + font-weight: 400; + color: #fff; + margin-top: 50px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.55); + -webkit-animation-delay: 0.6s; + -moz-animation-delay: 0.6s; + -o-animation-delay: 0.6s; + -ms-animation-delay: 0.6s; + animation-delay: 0.6s; } + @media (max-width: 991px) { + .index-sidebar-hero .hero-text { + font-size: 30px; } } + @media (max-width: 767px) { + .index-sidebar-hero .hero-text { + font-size: 27px; } } + .index-sidebar-hero .cta { + text-align: center; + margin-top: 40px; + -webkit-animation-delay: 0.6s; + -moz-animation-delay: 0.6s; + -o-animation-delay: 0.6s; + -ms-animation-delay: 0.6s; + animation-delay: 0.6s; } + .index-sidebar-hero .cta a { + margin: 0px 20px; } + @media (max-width: 400px) { + .index-sidebar-hero .cta a { + display: block; } } + .index-sidebar-hero .cta a.button { + border-radius: 50px; + padding: 12px 36px; + font-size: 18px; + -webkit-transition: all 0.3s linear; + -moz-transition: all 0.3s linear; + -ms-transition: all 0.3s linear; + -o-transition: all 0.3s linear; + transition: all 0.3s linear; } + @media (max-width: 767px) { + .index-sidebar-hero .cta a.button { + font-size: 16px; } } + @media (max-width: 400px) { + .index-sidebar-hero .cta a.button { + width: 65%; + margin: 0 auto; + margin-bottom: 25px; } } + .index-sidebar-hero .cta a.button:hover { + box-shadow: rgba(0, 0, 0, 0.3) 0 1px 2px, inset rgba(255, 255, 255, 0.88) 0px 1px 3px -1px, rgba(0, 0, 0, 0.3) 0 1px 2px, #69B1F3 0 1px 30px; } + .index-sidebar-hero .cta a.demo { + color: #fff; + font-size: 17px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3); } + @media (max-width: 767px) { + .index-sidebar-hero .cta a.demo { + font-size: 16px; } } + .index-sidebar-hero .screenshot { + position: absolute; + bottom: 0; + left: 0; + right: 0; } + .index-sidebar-hero .screenshot img { + margin: 0 auto; } + +.cta-mobile-section { + background: #F7F8FB; + border: 1px solid #EAEDF7; + box-shadow: inset rgba(100, 100, 100, 0.25) 0 1px 1px; + margin-top: 100px; } + @media (min-width: 992px) { + .cta-mobile-section .container { + width: 870px; } } + .cta-mobile-section .device { + margin: -30px 0px 0px 0px; + position: relative; + top: 2px; } + .cta-mobile-section .info { + margin-top: 50px; } + @media (max-width: 767px) { + .cta-mobile-section .info { + margin: 35px; + text-align: center; } } + .cta-mobile-section .info h3 { + font-weight: 400; + color: #616974; + font-size: 26px; } + .cta-mobile-section .info p { + font-size: 15px; + margin-top: 20px; + color: #6a6e7b; + line-height: 23px; } + .cta-mobile-section .info .app-store { + margin-top: 18px; + border: none; + display: inline-block; } + .cta-mobile-section .info .app-store img { + max-width: 135px; } + +.call-to-action-signup { + margin-top: 110px; + margin-bottom: -120px; + background: #fafafa; + padding: 60px 0 70px; + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; } + @media (min-width: 1200px) { + .call-to-action-signup .container { + width: 1170px; } } + .call-to-action-signup h3 { + margin: 0; + font-size: 20px; + letter-spacing: 2px; + text-align: center; + color: #4c4c4c; + text-transform: uppercase; + font-weight: 600; + text-shadow: 1px 1px #fff; } + .call-to-action-signup form { + margin-top: 40px; + position: relative; + text-align: center; } + .call-to-action-signup form .form-group { + margin-right: 7px; + width: 250px; } + @media (max-width: 991px) { + .call-to-action-signup form .form-group { + width: 220px; } } + @media (max-width: 767px) { + .call-to-action-signup form .form-group { + width: 100%; } } + .call-to-action-signup form input { + box-shadow: 0 1px 1px #fff; + height: 42px; + width: 100% !important; + font-size: 15px; } + .call-to-action-signup form input:focus { + box-shadow: none; } + @media (max-width: 1199px) { + .call-to-action-signup form [type="submit"] { + margin-top: 30px; } } + .call-to-action-signup form .agree { + top: 20px; + position: relative; + display: block; + text-align: right; + padding-right: 95px; + color: #555; } + @media (max-width: 1199px) { + .call-to-action-signup form .agree { + text-align: center; + padding: 0; } } + +#demo .modal-dialog { + padding-top: 100px; + width: 650px; } +#demo .modal-body { + padding: 0px; } + +.features-tabs-section { + margin-top: 60px; } + @media (max-width: 991px) { + .features-tabs-section { + margin-bottom: 20px; } } + .features-tabs-section .header { + text-align: center; } + .features-tabs-section .header h3 { + font-size: 23px; + color: #55565d; + line-height: 25px; + font-weight: 500; } + .features-tabs-section .header p { + font-size: 16px; + font-weight: 400; + color: #888; } + .features-tabs-section .tabs-wrapper { + margin-top: 45px; } + .features-tabs-section .tabs-wrapper .nav-tabs { + text-align: center; + border-bottom: 2px solid #EDEDED; } + @media (max-width: 991px) { + .features-tabs-section .tabs-wrapper .nav-tabs { + display: none; } } + .features-tabs-section .tabs-wrapper .nav-tabs li { + float: none; + display: inline-block; } + .features-tabs-section .tabs-wrapper .nav-tabs li.active a { + color: #2B69A2; + font-weight: 400; + border-bottom: 0px; } + .features-tabs-section .tabs-wrapper .nav-tabs li.active a:after { + content: ''; + position: absolute; + width: 100%; + height: auto; + border-bottom: 2px solid #7BA3C9; + left: 1px; + bottom: -1px; } + .features-tabs-section .tabs-wrapper .nav-tabs li a { + color: #888; + font-weight: 400; + border: 0px; + padding: 10px 20px; + font-size: 15px; + -webkit-transition: color 0.25s linear; + -moz-transition: color 0.25s linear; + -ms-transition: color 0.25s linear; + -o-transition: color 0.25s linear; + transition: color 0.25s linear; } + .features-tabs-section .tabs-wrapper .nav-tabs li a:hover { + color: #2B69A2; + background: none; } + .features-tabs-section .tabs-wrapper .tab-content { + margin-top: 60px; } + .features-tabs-section .tabs-wrapper .tab-content .tab-pane { + height: 325px; } + @media (max-width: 991px) { + .features-tabs-section .tabs-wrapper .tab-content .tab-pane { + display: block !important; + opacity: 1; + filter: alpha(opacity=100); + height: auto; + text-align: center; + margin-bottom: 70px; } } + @media (max-width: 991px) { + .features-tabs-section .tabs-wrapper .tab-content .tab-pane .info { + margin-bottom: 35px; } } + .features-tabs-section .tabs-wrapper .tab-content .tab-pane .info h4 { + color: #3B88B6; + font-weight: normal; + font-size: 19px; + line-height: 25px; + margin-top: 35px; } + .features-tabs-section .tabs-wrapper .tab-content .tab-pane .info p { + color: #6C7279; + font-size: 15px; + margin-top: 20px; + line-height: 24px; + width: 83%; + font-weight: normal; } + @media (max-width: 991px) { + .features-tabs-section .tabs-wrapper .tab-content .tab-pane .info p { + margin: 0 auto; + width: 95%; } } + .features-tabs-section .tabs-wrapper .tab-content .tab-pane .image img { + display: inline-block; + margin: 0 auto; } + +.features-grid-section { + margin-top: 100px; } + @media (max-width: 991px) { + .features-grid-section { + margin-top: 50px; } } + @media (min-width: 992px) { + .features-grid-section .row { + margin-bottom: 50px; } } + @media (max-width: 991px) { + .features-grid-section .feature { + text-align: center; + margin-bottom: 35px; } } + .features-grid-section .feature img { + max-width: 40px; } + .features-grid-section .feature .icon { + font-size: 32px; + color: #4187ba; } + .features-grid-section .feature strong { + display: block; + font-weight: 400; + font-size: 17px; + color: #354E75; + margin-top: 15px; } + .features-grid-section .feature p { + font-weight: normal; + font-size: 14px; + color: #797979; + margin-top: 10px; + line-height: 24px; } + +.blog-showcase { + margin-top: 120px; } + .blog-showcase .header { + text-align: center; + margin-bottom: 45px; } + .blog-showcase .header h3 { + font-size: 25px; + color: #444; + line-height: 25px; + font-weight: 400; } + .blog-showcase .pics { + text-align: center; } + .blog-showcase .pics .pic { + position: relative; + width: 250px; + height: 258px; + margin: 0 auto; + margin-left: 10px; + margin-right: 10px; + display: inline-block; + opacity: 1; + filter: alpha(opacity=100); + -webkit-transition: all 0.25s linear; + -moz-transition: all 0.25s linear; + -ms-transition: all 0.25s linear; + -o-transition: all 0.25s linear; + transition: all 0.25s linear; } + @media (max-width: 991px) { + .blog-showcase .pics .pic { + margin-bottom: 35px; } } + .blog-showcase .pics .pic:hover { + opacity: 0.7; + filter: alpha(opacity=70); + text-decoration: none; } + .blog-showcase .pics .pic .bg { + position: absolute; + padding: 80px 20px 20px; + bottom: 0; + left: 0; + right: 0; + border-radius: 0px 5px 5px 0px; + background-repeat: repeat-x; + background-image: -webkit-linear-gradient(bottom, rgba(0, 0, 0, 0.12) 0, rgba(0, 0, 0, 0.3) 30%, transparent 100%); + background-image: -moz-linear-gradient(bottom, rgba(0, 0, 0, 0.12) 0, rgba(0, 0, 0, 0.3) 30%, transparent 100%); + background-image: -ms-linear-gradient(bottom, rgba(0, 0, 0, 0.12) 0, rgba(0, 0, 0, 0.3) 30%, transparent 100%); + background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.12) 0, rgba(0, 0, 0, 0.3) 30%, transparent 100%); + background-image: linear-gradient(to top, rgba(0, 0, 0, 0.12) 0, rgba(0, 0, 0, 0.3) 30%, transparent 100%); } + .blog-showcase .pics .pic img { + display: block; + margin: 0 auto; + border-radius: 5px; } + .blog-showcase .pics .pic p { + text-align: left; + color: #fff; + font-size: 22px; + position: absolute; + line-height: 28px; + bottom: 7px; + left: 20px; + width: 75%; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.4); } + +.services-intro { + margin-top: 90px; } + @media (min-width: 992px) { + .services-intro .row { + border-bottom: 1px solid #E6E6E8; } } + @media (max-width: 991px) { + .services-intro .image img { + margin: 0 auto; } } + @media (min-width: 992px) { + .services-intro .info { + padding-left: 60px; } } + @media (max-width: 991px) { + .services-intro .info { + text-align: center; } } + .services-intro .info h3 { + font-weight: 400; + margin-top: 70px; + font-size: 28px; } + .services-intro .info p { + color: #666; + margin-top: 25px; + line-height: 23px; } + @media (min-width: 992px) { + .services-intro .info p { + width: 85%; } } + +.services-tabs { + margin-top: 130px; } + @media (max-width: 991px) { + .services-tabs { + margin-top: 70px; } } + .services-tabs .hexagons { + text-align: center; } + .services-tabs .hexagons .hexagon { + background: url("../../images/hexagon.png") 0 0 no-repeat; + width: 100px; + height: 113px; + position: relative; + display: inline-block; + margin-right: 60px; + cursor: pointer; } + @media (max-width: 991px) { + .services-tabs .hexagons .hexagon { + margin: 0; } } + .services-tabs .hexagons .hexagon:hover, .services-tabs .hexagons .hexagon.active { + background-position: 0 -117px; } + .services-tabs .hexagons .hexagon:hover .icon, .services-tabs .hexagons .hexagon.active .icon { + color: #fff; } + .services-tabs .hexagons .hexagon:last-child { + margin-right: 0px; } + .services-tabs .hexagons .hexagon .icon { + font-size: 48px; + color: #80939b; + position: absolute; + top: 32px; + left: 0; + right: 0; + text-align: center; } + .services-tabs .sections { + margin-top: 35px; + position: relative; + height: 220px; } + .services-tabs .sections .section { + display: none; + position: absolute; } + .services-tabs .sections .section.active { + display: block; } + .services-tabs .sections .section h4 { + margin-bottom: 18px; } + .services-tabs .sections .section p { + line-height: 25px; } + +.services-grid-section { + margin-top: 100px; } + .services-grid-section.with-border { + margin-top: 70px; } + .services-grid-section.with-border .header { + border-top: 1px solid #E6E6E8; + padding-top: 55px; } + .services-grid-section .header { + text-align: center; } + .services-grid-section .header h3 { + font-size: 26px; + color: #555C68; + line-height: 25px; + font-weight: 400; } + .services-grid-section .header p { + font-size: 16px; + font-weight: 400; + color: #888; } + .services-grid-section .sections { + margin-top: 45px; } + .services-grid-section .sections .section { + text-align: center; } + @media (max-width: 991px) { + .services-grid-section .sections .section { + margin-bottom: 40px; } } + .services-grid-section .sections .section .pic { + display: inline-block; + padding: 15px; + background: #f5f5f5; + box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.25), inset 0px 0px 1px 1px #fff; } + .services-grid-section .sections .section .info { + margin-top: 25px; + text-align: center; } + @media (min-width: 992px) { + .services-grid-section .sections .section .info { + margin-left: 45px; + width: 80%; + text-align: left; } } + .services-grid-section .sections .section .info strong { + font-weight: 500; + font-size: 18px; + color: #555; } + .services-grid-section .sections .section .info p { + color: #666; + margin-top: 15px; + line-height: 22px; } + +.services-showcase-section { + margin-top: 80px; } + @media (max-width: 991px) { + .services-showcase-section { + margin-top: 50px; } } + .services-showcase-section .header { + border-top: 1px solid #E6E6E8; + padding-top: 55px; + margin-bottom: 35px; } + .services-showcase-section .header h3 { + font-size: 27px; + color: #444; + line-height: 25px; + font-weight: 500; + margin-bottom: 7px; } + @media (max-width: 991px) { + .services-showcase-section .header h3 { + text-align: center; } } + .services-showcase-section .header p { + font-size: 15px; + font-weight: 400; + color: #666; + width: 50%; + line-height: 24px; + margin-top: 15px; } + @media (max-width: 991px) { + .services-showcase-section .header p { + margin: 0 auto; + width: 90%; + text-align: center; } } + .services-showcase-section .features { + margin-bottom: 20px; } + @media (max-width: 991px) { + .services-showcase-section .features .feature { + text-align: center; + margin-bottom: 30px; } } + .services-showcase-section .features .feature img { + max-width: 40px; + position: relative; + top: 10px; } + @media (min-width: 992px) { + .services-showcase-section .features .feature img { + float: left; } } + @media (min-width: 992px) { + .services-showcase-section .features .feature .info { + float: left; + width: 80%; + margin-left: 20px; } } + .services-showcase-section .features .feature .info strong { + display: block; + font-weight: 500; + font-size: 16px; + color: #444; + margin-top: 15px; } + .services-showcase-section .features .feature .info p { + font-weight: normal; + font-size: 14px; + color: #797979; + margin-top: 10px; + line-height: 24px; } + +.signup-cta { + margin-top: 120px; } + .signup-cta .wrapper { + background: #F7F8FB; + border: 1px solid #EAEDF7; + border-radius: 8px; + padding: 30px 60px; + box-shadow: inset rgba(100, 100, 100, 0.25) 0 1px 1px; + margin: 0 auto; } + @media (max-width: 991px) { + .signup-cta .wrapper { + text-align: center; } } + .signup-cta h4 { + font-size: 20px; + color: #5F6E7C; + font-weight: 400; + float: left; + text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.8); } + @media (max-width: 767px) { + .signup-cta h4 { + font-size: 17px; + line-height: 23px; } } + .signup-cta .button { + float: right; } + @media (max-width: 991px) { + .signup-cta .button { + float: none; + margin-top: 20px; } } + +.session-page { + min-height: 100vh; + background-attachment: fixed !important; + background: #5E7A9B; + background: -webkit-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -moz-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -o-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: linear-gradient(top, #355069 0, #5E7A9B 100%); } + .session-page .header .logo { + margin-top: 40px; + text-align: center; } + .session-page .header .logo a { + color: #fff; + font-size: 31px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.6); + -webkit-transition: color 0.25s linear; + -moz-transition: color 0.25s linear; + -ms-transition: color 0.25s linear; + -o-transition: color 0.25s linear; + transition: color 0.25s linear; } + .session-page .header .logo a:hover { + text-decoration: none; + color: #bbb; } + .session-page .header h4 { + color: #fff; + text-align: center; + font-size: 25px; + font-weight: 400; + margin-top: 45px; + margin-bottom: 5px; } + .session-page .header p { + color: #fff; + text-align: center; } + .session-page .wrapper { + margin: 0 auto; + width: 51%; + margin-top: 25px; + background: #fff; + padding: 15px 50px 25px 50px; + border-radius: 5px; + border-top: 6px solid #6ED5E4; } + @media (max-width: 991px) { + .session-page .wrapper { + width: 67%; } } + @media (max-width: 767px) { + .session-page .wrapper { + width: 100%; } } + .session-page .wrapper .formy { + margin-top: 22px; } + .session-page .wrapper .formy .form-group label { + color: #46515F; } + .session-page .wrapper .formy .checkbox label { + color: #666; + font-size: 13px; } + .session-page .wrapper .formy .checkbox input { + position: relative; + top: -1px; } + .session-page .wrapper .formy .submit { + text-align: center; } + .session-page .wrapper .formy .submit .button-clear { + margin-top: 35px; + display: inline-block; } + .session-page .wrapper .formy .info { + float: right; + width: 67%; } + .session-page .wrapper .formy .info .good-company strong { + font-size: 15px; + font-weight: 500; } + .session-page .wrapper .formy .info .good-company p { + color: #858585; + margin-top: 9px; } + .session-page .wrapper .formy .info .testimonial { + margin-top: 40px; } + .session-page .wrapper .formy .info .testimonial .quote { + font-style: italic; + font-size: 13px; + color: #555; + line-height: 20px; } + .session-page .wrapper .formy .info .testimonial .author { + margin-top: 20px; } + .session-page .wrapper .formy .info .testimonial .author .pic { + width: 55px; + height: 55px; + border-radius: 50px; + float: left; + position: relative; + top: -6px; + margin-right: 18px; } + .session-page .wrapper .formy .info .testimonial .author .name { + color: #3C92C5; + line-height: 23px; + font-weight: 500; } + .session-page .wrapper .formy .info .testimonial .author .company { + font-size: 14px; + color: #909090; + line-height: 23px; + font-weight: 400; } + .session-page .already-account { + text-align: center; + color: #fff; + margin-top: 25px; + margin-bottom: 70px; + font-size: 13px; + font-weight: 500; } + .session-page .already-account a { + color: #fff; + text-decoration: underline; } + .session-page .already-account .popover-content { + color: #000; + font-size: 17px; + font-weight: 400; } + +.signup-rotate { + min-height: 100vh; + background-attachment: fixed !important; + background: #5E7A9B; + background: -webkit-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -moz-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -o-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: linear-gradient(top, #355069 0, #5E7A9B 100%); } + .signup-rotate .header .logo { + margin-top: 40px; + text-align: center; } + .signup-rotate .header .logo a { + color: #fff; + font-size: 31px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.6); + -webkit-transition: color 0.25s linear; + -moz-transition: color 0.25s linear; + -ms-transition: color 0.25s linear; + -o-transition: color 0.25s linear; + transition: color 0.25s linear; } + .signup-rotate .header .logo a:hover { + text-decoration: none; + color: #bbb; } + .signup-rotate .header h4 { + color: #fff; + text-align: center; + font-size: 25px; + font-weight: 400; + margin-top: 45px; + margin-bottom: 5px; } + .signup-rotate .header p { + color: #fff; + text-align: center; } + .signup-rotate .rotate-container { + -webkit-perspective: 1000; + -moz-perspective: 1000; + -ms-perspective: 1000; + -o-perspective: 1000; + margin: 0 auto; } + .signup-rotate .wrappers { + min-height: 445px; + -webkit-transition: -webkit-transform 1s; + -moz-transition: -moz-transform 1s; + -ms-transition: -ms-transform 1s; + -o-transition: -o-transform 1s; + transition: transform 1s; + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; } + .signup-rotate .wrappers.flipped { + -moz-transform: rotateY(180deg); + -o-transform: rotateY(180deg); + -ms-transform: rotateY(180deg); + -webkit-transform: rotateY(180deg); + transform: rotateY(180deg); } + .signup-rotate .wrappers.flipped-ended .front { + z-index: 1; } + .signup-rotate .wrappers.flipped-ended .back { + z-index: 3; } + .signup-rotate .wrapper { + margin: 0 auto; + width: 51%; + margin-top: 25px; + background: #fff; + padding: 15px 50px 25px 50px; + border-radius: 5px; + border-top: 6px solid #6ED5E4; + position: absolute; + left: 0; + right: 0; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -o-backface-visibility: hidden; + /* These are commented out because they break the rotation on IE */ + /*-ms-backface-visibility: hidden;*/ + /*backface-visibility: hidden;*/ + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; } + @media (max-width: 991px) { + .signup-rotate .wrapper { + width: 67%; } } + @media (max-width: 767px) { + .signup-rotate .wrapper { + width: 100%; } } + .signup-rotate .wrapper.front { + z-index: 3; } + .signup-rotate .wrapper.back { + z-index: 1; + -moz-transform: rotateY(180deg); + -o-transform: rotateY(180deg); + -ms-transform: rotateY(180deg); + -webkit-transform: rotateY(180deg); + transform: rotateY(180deg); } + .signup-rotate .wrapper.back h3 { + margin-top: -5px; + margin-bottom: 45px; + text-align: center; + font-weight: 400; } + .signup-rotate .wrapper .formy { + margin-top: 22px; } + .signup-rotate .wrapper .formy .form-group label { + color: #46515F; } + .signup-rotate .wrapper .formy .checkbox label { + color: #666; + font-size: 13px; } + .signup-rotate .wrapper .formy .checkbox input { + position: relative; + top: -1px; } + .signup-rotate .wrapper .formy .submit { + text-align: center; } + .signup-rotate .wrapper .formy .submit .button-clear { + margin-top: 35px; + display: inline-block; } + .signup-rotate .change-view { + text-align: center; + color: #fff; + margin-top: 25px; + margin-bottom: 70px; + font-size: 13px; + font-weight: 500; + display: none; } + .signup-rotate .change-view.active { + display: block; } + .signup-rotate .change-view a { + color: #fff; + text-decoration: underline; } + .signup-rotate .change-view .popover-content { + color: #000; + font-size: 17px; + font-weight: 400; } + +.blog-posts { + margin-top: 60px; } + .blog-posts .post { + margin-bottom: 90px; } + .blog-posts .post .pic { + border: 0px; } + .blog-posts .post .pic:hover img { + opacity: 0.9; + filter: alpha(opacity=90); } + .blog-posts .post .pic img { + opacity: 1; + filter: alpha(opacity=100); + -webkit-transition: all 0.25s linear; + -moz-transition: all 0.25s linear; + -ms-transition: all 0.25s linear; + -o-transition: all 0.25s linear; + transition: all 0.25s linear; } + @media (max-width: 991px) { + .blog-posts .post .pic img { + margin: 0 auto; } } + .blog-posts .post .video { + /* make video fluid for responsiveness */ } + @media (min-width: 992px) { + .blog-posts .post .video { + max-width: 635px; } } + .blog-posts .post .video .iframe-wrapper { + position: relative; + padding-bottom: 56%; + height: 0; } + .blog-posts .post .video .iframe-wrapper iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; } + .blog-posts .post .title { + font-family: Myriad Pro, Lato, Helvetica Neue, Arial; + font-size: 28px; + font-weight: 600; + margin-top: 33px; } + @media (max-width: 991px) { + .blog-posts .post .title { + text-align: center; + margin-bottom: 20px; } } + @media (max-width: 767px) { + .blog-posts .post .title { + font-size: 23px; } } + .blog-posts .post .title a { + color: #111; + -webkit-transition: color 0.15s linear; + -moz-transition: color 0.15s linear; + -ms-transition: color 0.15s linear; + -o-transition: color 0.15s linear; + transition: color 0.15s linear; } + .blog-posts .post .title a:hover { + text-decoration: none; + color: #428bca; } + .blog-posts .post .author { + color: #888; + margin-top: 4px; + position: relative; } + .blog-posts .post .author .avatar { + max-width: 60px; + border-radius: 50px; + position: absolute; + left: -75px; + top: -15px; + border: 1px solid #e0e0e0; } + .blog-posts .post .intro { + font-family: Source Sans Pro, Helvetica Neue, Arial; + margin-top: 18px; + font-size: 16px; + line-height: 27px; + color: #4d4d4d; } + @media (min-width: 992px) { + .blog-posts .post .intro { + width: 90%; } } + .blog-posts .post .continue-reading { + font-family: Source Sans Pro, Helvetica Neue, Arial; + font-size: 15px; + display: inline-block; + margin-top: 8px; + -webkit-transition: color 0.25s linear; + -moz-transition: color 0.25s linear; + -ms-transition: color 0.25s linear; + -o-transition: color 0.25s linear; + transition: color 0.25s linear; } + @media (max-width: 991px) { + .blog-posts .pages { + text-align: center; } } + @media (max-width: 991px) { + .blog-posts .sidebar { + margin-top: 70px; + text-align: center; } } + .blog-posts .sidebar .search { + margin-bottom: 40px; } + .blog-posts .sidebar .search form { + position: relative; + left: -20px; } + .blog-posts .sidebar .search .icomoon-search { + font-size: 16px; + color: #B9B9B9; + position: relative; + left: 25px; + top: 1px; + -webkit-transition: all 0.25s linear; + -moz-transition: all 0.25s linear; + -ms-transition: all 0.25s linear; + -o-transition: all 0.25s linear; + transition: all 0.25s linear; } + .blog-posts .sidebar .search .icomoon-search.active { + color: #555; } + .blog-posts .sidebar .search input { + border: 0px; + border-bottom: 1px solid #DFDFDF; + padding-left: 30px; + padding-bottom: 6px; + -webkit-transition: all 0.25s linear; + -moz-transition: all 0.25s linear; + -ms-transition: all 0.25s linear; + -o-transition: all 0.25s linear; + transition: all 0.25s linear; + color: #777; + font-weight: 300; } + @media (max-width: 991px) { + .blog-posts .sidebar .search input { + width: 95%; } } + .blog-posts .sidebar .search input:focus { + border-bottom-color: #888; } + .blog-posts .sidebar .search input::-webkit-input-placeholder { + color: #a5a5a5; + font-weight: 300; + font-size: 13px; } + .blog-posts .sidebar .search input:-moz-placeholder { + color: #a5a5a5; + font-weight: 300; + font-size: 13px; } + .blog-posts .sidebar .search input::-moz-placeholder { + color: #a5a5a5; + font-weight: 300; + font-size: 13px; } + .blog-posts .sidebar .search input:-ms-input-placeholder { + color: #a5a5a5; + font-weight: 300; + font-size: 13px; } + .blog-posts .sidebar .updates { + padding: 17px; + box-shadow: 0px 0px 3px 0px rgba(0, 0, 0, 0.2); + border-radius: 5px; } + @media (min-width: 992px) { + .blog-posts .sidebar .updates { + width: 85%; } } + .blog-posts .sidebar .updates strong { + color: #444; } + .blog-posts .sidebar .updates .fa-rss { + color: #428bca; + font-size: 16px; + position: relative; + margin-left: 5px; } + .blog-posts .sidebar .updates p { + font-size: 13px; + margin-top: 9px; + color: #777; + margin-bottom: 5px; } + .blog-posts .sidebar .follow-tw { + margin-top: 20px; } + .blog-posts .sidebar .follow-tw img { + cursor: pointer; } + .blog-posts .sidebar .best-hits { + margin-top: 35px; + padding-left: 5px; } + @media (max-width: 991px) { + .blog-posts .sidebar .best-hits { + margin-top: 40px; } } + .blog-posts .sidebar .best-hits strong { + font-weight: 500; + color: #444; + margin-bottom: 15px; + font-size: 15px; + display: block; } + .blog-posts .sidebar .best-hits a { + font-size: 13px; + display: inline-block; + margin-bottom: 5px; } + @media (max-width: 991px) { + .blog-posts .sidebar .best-hits a { + display: block; + margin-bottom: 10px; } } + +.blog-cols-page { + background: #FCFCFC; } + +.blog-cols-header { + margin-top: 60px; + position: relative; } + .blog-cols-header h1 { + font-size: 23px; + margin-top: 0; + color: #555; } + .blog-cols-header p { + color: #757575; + font-size: 17px; + margin-top: 12px; } + +.blog-cols-wrapper { + margin-top: 40px; } + @media (max-width: 767px) { + .blog-cols-wrapper { + text-align: center; } } + .blog-cols-wrapper .card { + display: inline-block; } + @media (min-width: 992px) { + .blog-cols-wrapper .card:nth-child(3n+3) .card-wrapper { + margin: 20px 0; } } + @media (min-width: 768px) and (max-width: 991px) { + .blog-cols-wrapper .card:nth-child(2n+2) .card-wrapper { + margin: 20px 0; } } + .blog-cols-wrapper .card .card-wrapper { + display: inline-block; + position: relative; + width: 295px; + background-color: #fff; + vertical-align: top; + text-align: left; + color: #4B4F56; + height: 480px; + margin: 20px 20px 20px 0; + box-shadow: 0 20px 20px rgba(0, 0, 0, 0.08); + -webkit-transition: all 250ms cubic-bezier(0.02, 0.01, 0.47, 1); + -moz-transition: all 250ms cubic-bezier(0.02, 0.01, 0.47, 1); + -ms-transition: all 250ms cubic-bezier(0.02, 0.01, 0.47, 1); + -o-transition: all 250ms cubic-bezier(0.02, 0.01, 0.47, 1); + transition: all 250ms cubic-bezier(0.02, 0.01, 0.47, 1); } + @media (max-width: 991px) { + .blog-cols-wrapper .card .card-wrapper { + width: 340px; } } + @media (max-width: 767px) { + .blog-cols-wrapper .card .card-wrapper { + margin: 20px 0; + width: 290px; } } + .blog-cols-wrapper .card .card-wrapper:hover { + box-shadow: 0 40px 40px rgba(0, 0, 0, 0.16); + transform: translate(0, -20px); } + .blog-cols-wrapper .card .card-bg { + background-size: cover; + background-position: center center; + background-repeat: no-repeat; + width: 100%; + height: 295px; } + @media (max-width: 1199px) { + .blog-cols-wrapper .card .card-bg { + height: 260px; } } + .blog-cols-wrapper .card .card-intro { + padding: 20px 20px 0; } + .blog-cols-wrapper .card .card-title { + font-size: 22px; + line-height: 32px; } + .blog-cols-wrapper .card .card-min-read { + margin-top: 5px; + font-size: 12px; + color: #777; } + .blog-cols-wrapper .card .card-description { + font-size: 15px; + margin-top: 13px; + line-height: 23px; + color: #90949C; } + +.blog-pager { + margin-top: 80px; } + .blog-pager li > a { + padding: 9px 20px; + box-shadow: 0 1px 0px 0 rgba(0, 0, 0, 0.15); + border-radius: 30px; + margin: 0 10px; + font-weight: 500; + font-size: 15px; + color: #5F8AB0; + display: inline-block; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .blog-pager li > a:hover { + background-color: #4a556b; + color: #fff; + box-shadow: none; } + +.timeline-page { + background: #f7f8fa; } + +.blog-timeline-header { + margin-top: 55px; + position: relative; } + .blog-timeline-header h1 { + text-align: center; + text-transform: uppercase; + font-weight: 500; + font-size: 24px; + margin-top: 0; + letter-spacing: 1px; } + .blog-timeline-header h1 a { + color: #222; + text-decoration: none; } + .blog-timeline-header .slogan { + text-align: center; + color: #777; + font-size: 16px; } + +.blog-timeline-wrapper { + margin-top: 40px; + position: relative; } + .blog-timeline-wrapper:before { + content: ''; + position: absolute; + background: #e7e8ec; + width: 5px; + height: 96%; + left: 0; + right: 0; + top: 95px; + margin: 0 auto; + z-index: -1; } + .blog-timeline-wrapper .post { + position: relative; + float: right; + clear: right; + width: 44%; + margin: 40px 0; + border-radius: 5px; } + @media (max-width: 767px) { + .blog-timeline-wrapper .post { + width: 100%; } } + .blog-timeline-wrapper .post:before { + content: ''; + position: absolute; + width: 70px; + height: 4px; + background: #E7E8EC; + left: -60px; + top: 62px; } + @media (max-width: 991px) { + .blog-timeline-wrapper .post:before { + left: -42px; + width: 43px; } } + @media (max-width: 767px) { + .blog-timeline-wrapper .post:before { + display: none; } } + .blog-timeline-wrapper .post:nth-child(2) { + margin-top: 100px; } + .blog-timeline-wrapper .post.left { + float: left; + clear: left; } + .blog-timeline-wrapper .post.left:before { + right: -51px; + left: inherit; } + @media (max-width: 991px) { + .blog-timeline-wrapper .post.left:before { + right: -42px; + width: 43px; } } + .blog-timeline-wrapper .post.left .marker { + left: inherit; + right: -65px; } + @media (max-width: 991px) { + .blog-timeline-wrapper .post.left .marker { + right: -52px; } } + .blog-timeline-wrapper .post .marker { + position: absolute; + width: 17px; + height: 17px; + border-radius: 25px; + background: #e7e8ec; + left: -65px; + top: 55px; + border: 3px solid #F7F8FA; } + @media (max-width: 991px) { + .blog-timeline-wrapper .post .marker { + left: -51px; } } + @media (max-width: 767px) { + .blog-timeline-wrapper .post .marker { + display: none; } } + .blog-timeline-wrapper .post .entry { + position: relative; + padding: 20px; + height: 400px; + background-size: cover; + background-position: center center; + border-radius: 5px; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.26); } + .blog-timeline-wrapper .post .entry:before { + position: absolute; + top: 50%; + bottom: 0; + left: 0; + right: 0; + content: ''; + border-radius: 0 0 5px 5px; + background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.94) 100%); + background: -moz-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.94) 100%); + background: -o-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.94) 100%); + background: linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.94) 100%); } + .blog-timeline-wrapper .post .entry.smallish { + height: 320px; } + .blog-timeline-wrapper .post .entry.smallish .intro { + top: 68%; } + .blog-timeline-wrapper .post .entry .intro { + position: relative; + top: 75%; + color: #FFF; + z-index: 9; + letter-spacing: .3px; } + .blog-timeline-wrapper .post .entry .intro h4 { + font-size: 19px; + font-weight: 600; + text-transform: uppercase; + text-shadow: 1px 1px rgba(0, 0, 0, 0.4); + letter-spacing: .5px; } + @media (max-width: 767px) { + .blog-timeline-wrapper .post .entry .intro h4 { + font-size: 17px; } } + @media (max-width: 767px) { + .blog-timeline-wrapper .post .entry .intro p { + font-size: 13px; } } + .blog-timeline-wrapper .post .news { + position: relative; + background-size: cover; + background-position: center center; + border-radius: 5px; + box-shadow: 0 1px 5px rgba(12, 26, 36, 0.25); + background: #fff; } + .blog-timeline-wrapper .post .news .author { + position: absolute; + left: 0; + top: -35px; + right: 0; + text-align: center; } + .blog-timeline-wrapper .post .news .author img { + border-radius: 50%; + width: 68px; } + .blog-timeline-wrapper .post .news section { + padding: 60px 25px 75px 25px; } + .blog-timeline-wrapper .post .news section h3 { + margin-top: 0; } + .blog-timeline-wrapper .post .news section h3 a { + color: #333; + text-decoration: none; + font-size: 21px; + text-align: center; + display: block; + line-height: 31px; + -webkit-transition: all 0.15s; + -moz-transition: all 0.15s; + -ms-transition: all 0.15s; + -o-transition: all 0.15s; + transition: all 0.15s; } + .blog-timeline-wrapper .post .news section h3 a:hover { + color: #459CE7; } + .blog-timeline-wrapper .post .news section p { + margin-top: 21px; + line-height: 24px; + color: #555; } + .blog-timeline-wrapper .post .news section a.read-more { + position: relative; + text-decoration: none; + display: inline-block; + margin-top: 10px; + font-size: 15px; + -webkit-transition: all 0.2s; + -moz-transition: all 0.2s; + -ms-transition: all 0.2s; + -o-transition: all 0.2s; + transition: all 0.2s; } + .blog-timeline-wrapper .post .news section a.read-more:hover:after { + right: -18px; } + .blog-timeline-wrapper .post .news section a.read-more:after { + content: "▸"; + position: absolute; + right: -15px; + top: 0; + -webkit-transition: all 0.2s; + -moz-transition: all 0.2s; + -ms-transition: all 0.2s; + -o-transition: all 0.2s; + transition: all 0.2s; } + .blog-timeline-wrapper .post .news footer { + position: absolute; + bottom: 0; + padding: 12px 25px; + width: 100%; + font-weight: 500; + background: #EEF1F4; + color: #92A2B2; } + .blog-timeline-wrapper .post .news footer .tag { + position: relative; + padding-left: 27px; + text-transform: uppercase; + font-weight: 600; + letter-spacing: 1px; + font-size: 11px; + top: 3px; } + .blog-timeline-wrapper .post .news footer .tag span { + font-size: 24px; + position: absolute; + top: -7px; + left: 0; } + .blog-timeline-wrapper .post .news footer .date { + font-weight: 600; + font-size: 14px; } + .blog-timeline-wrapper .pager { + text-align: center; + margin-top: 50px; + margin-bottom: 0; } + .blog-timeline-wrapper .pager a { + display: inline-block; + position: relative; + top: -10px; + background: #E7E8EC; + text-decoration: none; + text-transform: uppercase; + font-weight: 600; + letter-spacing: 1px; + padding: 6px 23px; + border-radius: 3px; + color: #444; + -webkit-transition: all 0.2s; + -moz-transition: all 0.2s; + -ms-transition: all 0.2s; + -o-transition: all 0.2s; + transition: all 0.2s; } + .blog-timeline-wrapper .pager a:hover { + box-shadow: 0 6px 15px -1px rgba(0, 0, 0, 0.15); } + +.blog-post-hero { + height: 500px; + background-image: url("../../images/photo-1470753937643-efeb931202a9.jpeg"); + background-size: cover; + background-position: center center; + position: relative; + top: -20px; } + @media (max-width: 991px) { + .blog-post-hero { + height: 400px; } } + .blog-post-hero:after { + content: ''; + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 0; + background: rgba(64, 64, 64, 0.5); } + .blog-post-hero .container { + position: relative; + z-index: 1; + text-align: center; } + .blog-post-hero h1 { + width: 60%; + margin: 190px auto 0; + color: #fff; + font-family: "Karla", "Lato", "Helvetica Neue", Arial; + font-size: 38px; + line-height: 46px; + text-shadow: 1px 1px rgba(0, 0, 0, 0.2); } + @media (max-width: 991px) { + .blog-post-hero h1 { + margin-top: 150px; + font-size: 35px; + line-height: 40px; + width: 70%; } } + @media (max-width: 767px) { + .blog-post-hero h1 { + width: 100%; + font-size: 28px; + line-height: 35px; } } + +.blog-post-author { + color: #888; + display: inline-block; } + .blog-post-author img { + border-radius: 100%; + width: 55px; + margin-right: 17px; + position: relative; + top: -2px; } + .blog-post-author span { + color: #333; } + +.blog-post-date { + display: inline-block; + margin-left: 35px; + color: #888; } + @media (max-width: 767px) { + .blog-post-date { + margin-left: 15px; } } + .blog-post-date span { + color: #333; } + +.blog-post-share { + float: right; + color: #888; } + @media (max-width: 767px) { + .blog-post-share { + float: none; } } + .blog-post-share a { + margin-left: 13px; + position: relative; + top: 3px; + text-decoration: none; } + .blog-post-share i { + font-size: 25px; } + .blog-post-share i.ion-social-twitter { + color: #1da1f2; } + .blog-post-share i.ion-social-facebook { + color: #3b5998; + font-size: 28px; + margin-right: 3px; } + .blog-post-share i.ion-social-buffer { + color: #2d2d2d; } + +.blog-post-wrapper { + margin-top: 30px; } + .blog-post-wrapper .post { + float: none; + margin: 0 auto; + margin-bottom: 50px; } + .blog-post-wrapper .post .title { + font-size: 31px; + font-weight: 600; + margin-top: 40px; + color: #252525; } + @media (max-width: 767px) { + .blog-post-wrapper .post .title { + font-size: 26px; + line-height: 28px; } } + .blog-post-wrapper .post .content { + margin-top: 45px; + font-size: 15px; + line-height: 30px; + color: #454545; + margin-bottom: 25px; } + .blog-post-wrapper .post .content p { + margin-top: 28px; } + .blog-post-wrapper .post .content blockquote { + border-left: 2px solid #c0c9dc; + color: rgba(51, 51, 51, 0.55); + margin: 35px 0; + padding: 5px 20px; + padding-left: 23px; } + .blog-post-wrapper .post .content blockquote p { + margin: 0; + line-height: 30px; + font-weight: normal; } + .blog-post-wrapper .post .content blockquote .quote-author { + margin-top: 14px; } + .blog-post-wrapper .post .content img { + margin: 0 auto; + margin-top: 55px; + margin-bottom: 55px; } + .blog-post-wrapper .post .content .divider { + border-bottom: 1px solid #DEDEDC; + width: 20%; + margin: 0 auto; + margin-top: 35px; + margin-bottom: 35px; } + .blog-post-wrapper .post .share { + margin-top: 50px; } + .blog-post-wrapper .post .other-posts { + margin-top: 50px; } + +.pricing-3-options-section { + margin-top: 70px; } + .pricing-3-options-section .header { + text-align: center; } + .pricing-3-options-section .header h3 { + font-size: 24px; + color: #444; + line-height: 25px; + font-weight: 500; } + .pricing-3-options-section .header p { + font-size: 16px; + font-weight: 400; + color: #888; } + .pricing-3-options-section .charts { + margin-top: 45px; } + .pricing-3-options-section .charts .chart { + background-color: #fff; + border: 1px solid #D8D8D8; + border-radius: 5px; + box-shadow: 0px 0px 2px 0px rgba(181, 181, 181, 0.3); + padding: 20px 40px; + position: relative; + text-align: center; + width: 97%; + min-height: 315px; + position: relative; + top: 20px; } + @media (min-width: 992px) { + .pricing-3-options-section .charts .chart.first { + float: right; + left: 45px; } + .pricing-3-options-section .charts .chart.last { + left: -45px; } } + @media (max-width: 991px) { + .pricing-3-options-section .charts .chart { + float: none !important; + left: 0px !important; + top: 0px !important; + margin: 0 auto; + width: 55%; + margin-bottom: 25px !important; } + .pricing-3-options-section .charts .chart.last { + margin-bottom: 0px !important; } } + @media (max-width: 600px) { + .pricing-3-options-section .charts .chart { + width: 90% !important; } } + .pricing-3-options-section .charts .chart.featured { + z-index: 999; } + @media (min-width: 992px) { + .pricing-3-options-section .charts .chart.featured { + margin: 0 auto; + top: 0px; + min-height: 445px; } + .pricing-3-options-section .charts .chart.featured .btn-signup { + margin-top: 32px; } } + .pricing-3-options-section .charts .chart.featured .popular { + position: absolute; + top: 0px; + left: 0px; } + .pricing-3-options-section .charts .chart.featured .quantity { + margin-top: 15px; + padding-bottom: 5px; } + .pricing-3-options-section .charts .chart .plan-name { + text-align: center; + font-size: 20px; + font-weight: 400; + color: #444; + width: 90%; + margin: 0 auto; + margin-top: 5px; } + .pricing-3-options-section .charts .chart .quantity { + text-align: center; + border-bottom: 1px solid #d5d5d5; + margin-top: 10px; } + .pricing-3-options-section .charts .chart .quantity .dollar { + font-size: 19px; + position: relative; + top: -18px; } + .pricing-3-options-section .charts .chart .quantity .price { + font-size: 49px; } + .pricing-3-options-section .charts .chart .quantity .period { + font-size: 17px; + position: relative; + top: -8px; + margin-left: 4px; } + .pricing-3-options-section .charts .chart .specs { + margin-top: 20px; } + .pricing-3-options-section .charts .chart .specs .spec { + font-size: 15px; + color: #474747; + text-align: center; + font-weight: 300; + margin-bottom: 13px; } + .pricing-3-options-section .charts .chart .specs .spec .variable { + color: #1FBEE7; + font-weight: 500; } + .pricing-3-options-section .charts .chart .btn-signup { + margin-top: 20px; + height: 38px; } + .pricing-3-options-section .message p { + text-align: center; + font-size: 13px; + color: #656565; + margin-top: 23px; } + .pricing-3-options-section .faq { + margin-top: 40px; } + .pricing-3-options-section .faq .header h3 { + font-size: 20px; + color: #454545; + text-align: left; } + .pricing-3-options-section .faq .questions { + margin-top: 25px; } + .pricing-3-options-section .faq .questions .question { + margin-bottom: 40px; } + @media (min-width: 992px) { + .pricing-3-options-section .faq .questions .question { + width: 90%; } } + .pricing-3-options-section .faq .questions .question strong { + font-weight: 500; + font-size: 16px; + color: #454545; } + .pricing-3-options-section .faq .questions .question p { + color: #555; + margin-top: 10px; + font-size: 13px; + line-height: 22px; } + .pricing-3-options-section .contact { + margin-top: 40px; } + .pricing-3-options-section .contact .wrapper { + background: #F7F8FB; + border: 1px solid #EAEDF7; + border-radius: 8px; + padding: 25px 60px; + box-shadow: inset rgba(100, 100, 100, 0.25) 0 1px 1px; + margin: 0 auto; } + .pricing-3-options-section .contact h4 { + font-size: 15px; + position: relative; + color: #696E72; + text-align: center; + font-weight: 500; + text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.8); } + @media (max-width: 991px) { + .pricing-3-options-section .contact h4 { + line-height: 26px; } } + .pricing-3-options-section .contact h4 span { + position: absolute; + font-size: 23px; + top: -5px; + left: 72px; + color: #626E7A; } + @media (max-width: 991px) { + .pricing-3-options-section .contact h4 span { + position: relative; + left: 0px; + top: 5px; } } + +.pricing-dark-section { + border-top: 1px solid #EAEAEA; + border-bottom: 1px solid #EAEAEA; + background: #5E7A9B; + background: -webkit-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -moz-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -o-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: linear-gradient(top, #355069 0, #5E7A9B 100%); + margin-top: 120px; + padding-top: 45px; + padding-bottom: 70px; } + .pricing-dark-section .header { + text-align: center; } + @media (max-width: 991px) { + .pricing-dark-section .header { + margin-bottom: 25px; } } + .pricing-dark-section .header h3 { + font-size: 27px; + color: #fff; + line-height: 25px; + font-weight: 400; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } + @media (max-width: 767px) { + .pricing-dark-section .header h3 { + font-size: 24px; + line-height: 29px; } } + .pricing-dark-section .header p { + font-size: 16px; + margin-top: 15px; + color: #F0F0F0; + font-weight: 400; + line-height: 25px; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } + .pricing-dark-section .charts { + margin-top: 35px; } + @media (max-width: 991px) { + .pricing-dark-section .charts { + margin-top: 10px; } } + .pricing-dark-section .charts .chart { + background-color: #fff; + border: 1px solid #E6E6E6; + border-radius: 5px; + box-shadow: 0px 0px 2px 0px rgba(181, 181, 181, 0.3); + padding: 20px 40px; + position: relative; + text-align: center; + width: 97%; + min-height: 315px; + position: relative; + top: 37px; } + @media (max-width: 991px) { + .pricing-dark-section .charts .chart { + float: none !important; + left: 0px !important; + top: 0px !important; + margin: 0 auto; + width: 55%; + margin-bottom: 25px !important; } + .pricing-dark-section .charts .chart.last { + margin-bottom: 0px !important; } } + @media (max-width: 600px) { + .pricing-dark-section .charts .chart { + width: 90% !important; } } + .pricing-dark-section .charts .chart.first { + float: right; + left: 12px; } + .pricing-dark-section .charts .chart.last { + left: -12px; } + .pricing-dark-section .charts .chart.featured { + min-height: 350px; + top: 0px; + margin: 0 auto; } + .pricing-dark-section .charts .chart.featured .popular { + text-align: center; + text-transform: uppercase; + font-size: 16px; + letter-spacing: 1px; + color: #B1B1B1; + font-weight: 400; } + .pricing-dark-section .charts .chart.featured .quantity { + margin-top: 15px; } + .pricing-dark-section .charts .chart .quantity { + text-align: center; } + .pricing-dark-section .charts .chart .quantity .dollar { + font-size: 19px; + position: relative; + top: -18px; } + .pricing-dark-section .charts .chart .quantity .price { + font-size: 49px; } + .pricing-dark-section .charts .chart .quantity .period { + font-size: 17px; + position: relative; + top: -8px; + margin-left: 4px; } + .pricing-dark-section .charts .chart .plan-name { + text-align: center; + font-size: 20px; + font-weight: 400; + color: #777; + border-bottom: 1px solid #d5d5d5; + padding-bottom: 15px; + width: 90%; + margin: 0 auto; + margin-top: 8px; } + .pricing-dark-section .charts .chart .specs { + margin-top: 20px; } + .pricing-dark-section .charts .chart .specs .spec { + font-size: 15px; + color: #353535; + text-align: center; + font-weight: 300; + margin-bottom: 13px; } + .pricing-dark-section .charts .chart .specs .spec .variable { + color: #1FBEE7; + font-weight: 400; } + .pricing-dark-section .charts .chart .btn-signup { + margin-top: 20px; + height: 38px; } + +.pricing-4-options-section { + margin-top: 55px; + margin-bottom: 150px; } + .pricing-4-options-section .header { + text-align: center; } + .pricing-4-options-section .header h3 { + font-size: 24px; + color: #444; + line-height: 25px; + font-weight: 500; } + .pricing-4-options-section .header p { + font-size: 16px; + font-weight: 400; + color: #888; } + @media (min-width: 992px) { + .pricing-4-options-section .container { + width: 1060px; } } + .pricing-4-options-section .charts { + margin-top: 50px; } + .pricing-4-options-section .charts .basic-plan { + background-color: #fff; + border: 1px solid #E6E6E6; + border-radius: 5px; + box-shadow: 0px 0px 2px 0px rgba(181, 181, 181, 0.3); + padding: 20px 30px 10px 30px; + text-align: center; + width: 220px; + position: absolute; + right: 0px; + top: 20px; } + @media (max-width: 991px) { + .pricing-4-options-section .charts .basic-plan { + float: none !important; + left: 0px !important; + top: 0px !important; + margin: 0 auto; + width: 55%; + margin-bottom: 25px !important; + position: relative; + margin-top: 30px; } + .pricing-4-options-section .charts .basic-plan.last { + margin-bottom: 0px !important; } } + @media (max-width: 600px) { + .pricing-4-options-section .charts .basic-plan { + width: 90% !important; } } + .pricing-4-options-section .charts .basic-plan .plan-name { + text-align: center; + font-size: 17px; + font-weight: 400; + color: #444; + width: 90%; + margin: 0 auto; + margin-top: 5px; } + .pricing-4-options-section .charts .basic-plan .quantity { + text-align: center; + border-bottom: 1px solid #d5d5d5; + margin-top: 5px; } + .pricing-4-options-section .charts .basic-plan .quantity .dollar { + font-size: 19px; + position: relative; + top: -18px; } + .pricing-4-options-section .charts .basic-plan .quantity .price { + font-size: 42px; } + .pricing-4-options-section .charts .basic-plan .quantity .period { + font-size: 17px; + position: relative; + top: -8px; + margin-left: 4px; } + .pricing-4-options-section .charts .basic-plan .description { + margin-top: 15px; + font-size: 13px; + color: #444; + line-height: 20px; } + .pricing-4-options-section .charts .basic-plan .description a { + display: block; + margin-top: 20px; + font-weight: 500; + font-size: 15px; } + .pricing-4-options-section .charts .chart { + background-color: #fff; + border: 1px solid #E6E6E6; + border-radius: 5px; + box-shadow: 0px 0px 2px 0px rgba(181, 181, 181, 0.3); + padding: 20px 40px; + position: relative; + text-align: center; + width: 280px; + float: left; + min-height: 315px; + position: relative; + top: 20px; } + @media (min-width: 992px) { + .pricing-4-options-section .charts .chart.featured { + left: -25px; } + .pricing-4-options-section .charts .chart.last { + left: -45px; } } + @media (max-width: 991px) { + .pricing-4-options-section .charts .chart { + float: none !important; + left: 0px !important; + top: 0px !important; + margin: 0 auto; + width: 55%; + margin-bottom: 25px !important; } + .pricing-4-options-section .charts .chart.last { + margin-bottom: 0px !important; } } + @media (max-width: 600px) { + .pricing-4-options-section .charts .chart { + width: 90% !important; } } + .pricing-4-options-section .charts .chart.featured { + z-index: 999; } + @media (min-width: 992px) { + .pricing-4-options-section .charts .chart.featured { + margin: 0 auto; + top: 0px; + min-height: 445px; } + .pricing-4-options-section .charts .chart.featured .btn-signup { + margin-top: 32px; } } + .pricing-4-options-section .charts .chart.featured .popular { + position: absolute; + top: 0px; + left: 0px; } + .pricing-4-options-section .charts .chart.featured .quantity { + margin-top: 15px; + padding-bottom: 5px; } + .pricing-4-options-section .charts .chart .plan-name { + text-align: center; + font-size: 20px; + font-weight: 400; + color: #444; + width: 90%; + margin: 0 auto; + margin-top: 5px; } + .pricing-4-options-section .charts .chart .quantity { + text-align: center; + border-bottom: 1px solid #d5d5d5; + margin-top: 10px; } + .pricing-4-options-section .charts .chart .quantity .dollar { + font-size: 19px; + position: relative; + top: -18px; } + .pricing-4-options-section .charts .chart .quantity .price { + font-size: 49px; } + .pricing-4-options-section .charts .chart .quantity .period { + font-size: 17px; + position: relative; + top: -8px; + margin-left: 4px; } + .pricing-4-options-section .charts .chart .specs { + margin-top: 20px; } + .pricing-4-options-section .charts .chart .specs .spec { + font-size: 15px; + color: #353535; + text-align: center; + font-weight: 300; + margin-bottom: 13px; } + .pricing-4-options-section .charts .chart .specs .spec .variable { + color: #1FBEE7; + font-weight: 400; } + .pricing-4-options-section .charts .chart .btn-signup { + margin-top: 20px; + height: 38px; } + +.pricing-tabs-section { + margin-top: 60px; } + .pricing-tabs-section .header { + text-align: center; } + .pricing-tabs-section .header h3 { + font-size: 23px; + color: #444; + line-height: 25px; + font-weight: 500; } + .pricing-tabs-section .header p { + font-size: 16px; + font-weight: 400; + color: #888; } + .pricing-tabs-section .tabs { + background: #F8F8F8; + text-align: center; + border-radius: 3px; + margin-top: 40px; } + .pricing-tabs-section .tabs .tab { + background-color: #F8F8F8; + font-weight: 500; + font-size: 15px; + color: #555; + display: inline-block; + padding: 18px 25px; + margin-top: 10px; + cursor: pointer; + -webkit-transition: background-color 0.2s linear; + -moz-transition: background-color 0.2s linear; + -ms-transition: background-color 0.2s linear; + -o-transition: background-color 0.2s linear; + transition: background-color 0.2s linear; } + .pricing-tabs-section .tabs .tab.anually { + padding: 18px 18px 18px 23px; } + .pricing-tabs-section .tabs .tab.active { + background-color: #fff; + border: 1px solid #E8E8E8; + border-radius: 5px 5px 0px 0px; + border-bottom: 0px; } + .pricing-tabs-section .tabs .tab span { + position: relative; + top: -2px; } + .pricing-tabs-section .tabs .tab small { + color: #32ACDA; + margin-left: 3px; } + .pricing-tabs-section .plans { + margin-top: 30px; + border: 1px solid #E3E3E3; + border-radius: 5px; } + .pricing-tabs-section .plans .plan { + border-right: 0px; + min-height: 220px; } + .pricing-tabs-section .plans .plan.middle { + border-right: 1px solid #E3E3E3; + border-left: 1px solid #E3E3E3; } + .pricing-tabs-section .plans .plan .header { + text-align: left; + padding: 18px 25px; + border-bottom: 1px solid #E3E3E3; + margin: 0px -15px; + font-weight: 500; + font-size: 15px; } + .pricing-tabs-section .plans .plan .header .icon { + color: #B7C5D8; + font-size: 18px; + position: relative; + top: 2px; + left: -4px; } + .pricing-tabs-section .plans .plan .header .price { + float: right; + color: #3CA2E5; } + .pricing-tabs-section .plans .plan .specs { + margin-top: 25px; + padding: 0px 10px 17px 10px; } + .pricing-tabs-section .plans .plan .specs .spec { + font-size: 15px; + color: #666; + margin-bottom: 13px; } + .pricing-tabs-section .plans .plan .specs .spec .variable { + color: #1FBEE7; + font-weight: 400; } + .pricing-tabs-section .signup { + margin-top: 50px; + text-align: center; } + .pricing-tabs-section .signup .button { + padding: 16px 38px; + font-size: 15px; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4ABCF3), color-stop(100%, #1a80d9)); + background: -webkit-linear-gradient(#4ABCF3, #1a80d9); + background: -moz-linear-gradient(#4ABCF3, #1a80d9); + background: -o-linear-gradient(#4ABCF3, #1a80d9); + background: linear-gradient(#4ABCF3, #1a80d9); } + .pricing-tabs-section .signup .message { + text-align: center; + margin-top: 20px; + font-size: 12px; + color: #888; } + +.pricing-comparison-section .divider { + height: 1px; + width: 100%; + background-color: #ddd; + position: relative; + margin: 120px 0 60px; } + .pricing-comparison-section .divider:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 2px; + background-image: -webkit-gradient(linear, left top, right top, color-stop(0, rgba(255, 255, 255, 0.75)), color-stop(0.5, rgba(250, 250, 250, 0)), color-stop(1, rgba(255, 255, 255, 0.75))); + background-image: -webkit-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -moz-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -o-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -ms-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); } +.pricing-comparison-section .header { + text-align: center; } + .pricing-comparison-section .header h3 { + font-size: 24px; + color: #444; + line-height: 25px; + font-weight: 500; } + .pricing-comparison-section .header p { + font-size: 16px; + font-weight: 400; + color: #888; } +.pricing-comparison-section .chart { + margin-top: 40px; + border: 1px solid #dfdfdf; + border-radius: 5px; + box-shadow: 0px 2px 3px 1px rgba(0, 0, 0, 0.1); } + .pricing-comparison-section .chart .header { + text-align: center; + background: #fbfbfb; + margin: 0px -15px; + padding: 20px 35px; + font-weight: 500; + font-size: 17px; + color: #444; + border-bottom: 1px solid #dfdfdf; + height: 73px; } + @media (max-width: 991px) { + .pricing-comparison-section .chart .header { + font-size: 15px; } } + @media (max-width: 767px) { + .pricing-comparison-section .chart .header { + font-size: 13px; } } + .pricing-comparison-section .chart .header .price { + color: #1a80d9; + position: relative; + top: 3px; + font-size: 14px; } + @media (max-width: 767px) { + .pricing-comparison-section .chart .header .price { + font-size: 13px; } } + .pricing-comparison-section .chart .features-col .header { + text-align: left; + border-radius: 5px 0px 0px 0px; + margin-bottom: 30px; + padding: 23px 30px; + font-size: 18px; } + @media (max-width: 991px) { + .pricing-comparison-section .chart .features-col .header { + font-size: 16px; } } + .pricing-comparison-section .chart .features-col .spec { + margin-bottom: 32px; + padding-left: 40px; + position: relative; } + .pricing-comparison-section .chart .features-col .spec .icon { + position: absolute; + font-size: 27px; + color: #849FC4; + left: 0px; + top: -4px; } + .pricing-comparison-section .chart .plan-col { + border-left: 1px solid #dfdfdf; } + .pricing-comparison-section .chart .plan-col.last .header { + border-radius: 0px 5px 0px 0px; } + .pricing-comparison-section .chart .plan-col .header { + padding: 13px 0px; } + .pricing-comparison-section .chart .plan-col .spec { + margin-bottom: 34px; + margin-top: 25px; } + .pricing-comparison-section .chart .plan-col .spec .check { + margin: 0 auto; + display: block; + max-width: 20px; } + .pricing-comparison-section .chart .plan-col .button { + margin-top: 20px; + margin-bottom: 15px; + font-size: 13px; + padding: 11px 24px; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4ABCF3), color-stop(100%, #1a80d9)); + background: -webkit-linear-gradient(#4ABCF3, #1a80d9); + background: -moz-linear-gradient(#4ABCF3, #1a80d9); + background: -o-linear-gradient(#4ABCF3, #1a80d9); + background: linear-gradient(#4ABCF3, #1a80d9); } + @media (max-width: 991px) { + .pricing-comparison-section .chart .plan-col .button { + padding: 6px 10px; + text-align: center; } } +.pricing-comparison-section .message p { + text-align: center; + font-size: 13px; + color: #656565; + margin-top: 30px; } +.pricing-comparison-section .faq { + margin-top: 50px; } + .pricing-comparison-section .faq .header h3 { + font-size: 20px; + color: #454545; + text-align: left; } + .pricing-comparison-section .faq .questions { + margin-top: 25px; } + .pricing-comparison-section .faq .questions .question { + margin-bottom: 40px; } + @media (min-width: 992px) { + .pricing-comparison-section .faq .questions .question { + width: 90%; } } + .pricing-comparison-section .faq .questions .question strong { + font-weight: 500; + font-size: 16px; + color: #454545; } + .pricing-comparison-section .faq .questions .question p { + color: #555; + margin-top: 10px; + font-size: 13px; + line-height: 22px; } + +.about-us-slider { + margin-top: 60px; } + .about-us-slider .header { + text-align: left; } + .about-us-slider .header h3 { + font-size: 26px; + color: #444; + line-height: 25px; + font-weight: 500; } + .about-us-slider .header p { + font-size: 15px; + font-weight: 400; + color: #666; + margin-top: 20px; + line-height: 24px; } + @media (min-width: 992px) { + .about-us-slider .header p { + width: 48%; } } + .about-us-slider .flexslider { + margin-top: 40px; + box-shadow: none; + border-radius: 0px; } + .about-us-slider .flexslider .slides img { + max-height: 400px; } + .about-us-slider .flexslider .flex-control-paging { + bottom: -35px; } + .about-us-slider .flexslider .flex-control-paging li { + margin: 0 7px; } + .about-us-slider .flexslider .flex-control-paging li a { + background: #e6e6e6; + box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.3); + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .about-us-slider .flexslider .flex-control-paging li a.flex-active { + background: #3785b9; } + +.about-us-team { + margin-top: 40px; } + .about-us-team h1 { + font-size: 24px; + color: #444; + line-height: 25px; + font-weight: 500; + margin-bottom: 25px; } + .about-us-team p { + color: #666; + line-height: 23px; + margin-bottom: 15px; } + @media (min-width: 992px) { + .about-us-team p { + width: 88%; } } + .about-us-team .join-team { + padding: 8px 26px; + font-size: 13px; + margin-top: 10px; } + .about-us-team .stats { + margin-top: 60px; + font-size: 16px; + color: #757575; } + .about-us-team .stats strong { + font-size: 33px; + color: #656565; + font-weight: 500; + position: relative; + top: 1px; + margin-right: 5px; } + .about-us-team .stats .col-sm-3 { + border-bottom: 1px solid #efefef; + padding-bottom: 25px; } + @media (max-width: 767px) { + .about-us-team .stats .col-sm-3 { + padding-bottom: 10px; + margin-bottom: 20px; } } + .about-us-team .team { + margin-top: 90px; } + .about-us-team .team .team-row { + text-align: center; + margin-bottom: 35px; } + .about-us-team .team img { + margin: 0px 20px; + max-width: 90px; + border-radius: 10px; + position: relative; + top: 0px; + box-shadow: 0px 2px 1px 0px rgba(0, 0, 0, 0.4); + -webkit-transition: top 0.15s linear; + -moz-transition: top 0.15s linear; + -ms-transition: top 0.15s linear; + -o-transition: top 0.15s linear; + transition: top 0.15s linear; } + @media (max-width: 991px) { + .about-us-team .team img { + margin: 0px 10px 20px 0; } } + .about-us-team .team img:hover { + top: -5px; + box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.5); } + .about-us-team .team .tooltip-inner { + padding: 12px 18px; + font-size: 13px; + background: rgba(0, 0, 0, 0.8); + border: 1px solid #000; + border-bottom: 0px; } + .about-us-team .team .tooltip-arrow { + border-top-color: rgba(0, 0, 0, 0.8); } + +.contact-us-map { + position: relative; + top: -20px; + box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.35); } + .contact-us-map #map { + height: 450px; + width: 100%; } + .contact-us-map #directions { + position: absolute; + top: 50px; + left: 13%; + text-align: center; + width: 300px; + background: rgba(255, 255, 255, 0.9); + border-radius: 5px; + box-shadow: 0px 4px 15px 0px rgba(0, 0, 0, 0.2); + padding: 30px 20px 30px 20px; } + @media (max-width: 767px) { + .contact-us-map #directions { + display: none; } } + .contact-us-map #directions p { + font-size: 19px; + color: #333; + margin-bottom: 15px; } + .contact-us-map #directions button { + margin-top: 15px; } + +.contact-us-info { + margin-top: 50px; } + .contact-us-info .message h3 { + color: #444; + font-size: 24px; + font-weight: 500; } + .contact-us-info .message p { + font-size: 15px; + font-weight: 400; + color: #777; } + .contact-us-info .message form { + margin-top: 35px; + width: 80%; + /* error messages from jquery validate */ } + @media (max-width: 767px) { + .contact-us-info .message form { + width: 100%; } } + .contact-us-info .message form input[type="text"], + .contact-us-info .message form input[type="email"] { + width: 70%; } + @media (max-width: 767px) { + .contact-us-info .message form input[type="text"], + .contact-us-info .message form input[type="email"] { + width: 100%; } } + .contact-us-info .message form label { + color: #555; + font-weight: 500; + margin-bottom: 7px; } + .contact-us-info .message form .button { + margin-top: 20px; } + .contact-us-info .message form label.error { + position: relative !important; + display: inline-block !important; + margin-top: -2px !important; + margin-bottom: -8px !important; + color: #fff !important; + font-weight: normal !important; + font-size: 15px !important; + padding: 5px 7px !important; + background: #4B9FCF !important; + border-radius: 4px !important; } + .contact-us-info .message form label.error.valid { + display: none !important; } + .contact-us-info .message form label.error:after { + bottom: 100%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; + border-bottom-color: #4B9FCF; + border-width: 5px; + left: 30px; + margin-left: -5px; } + @media (max-width: 991px) { + .contact-us-info .contact { + margin-top: 50px; } } + .contact-us-info .contact .address { + margin-bottom: 30px; } + .contact-us-info .contact h3 { + color: #444; + font-size: 18px; + font-weight: 500; } + .contact-us-info .contact p { + font-size: 15px; + font-weight: 400; + color: #777; } + .contact-us-info .contact .online-support { + background: #f8fdfe; + border: 1px solid #bee1f3; + margin-top: 40px; + border-radius: 6px; + padding: 20px 22px 18px 22px; + width: 70%; } + .contact-us-info .contact .online-support strong { + font-weight: 500; + color: #333; + font-size: 15px; } + .contact-us-info .contact .online-support p { + color: #1f95d0; + margin-top: 14px; + line-height: 18px; } + .contact-us-info .contact .social { + margin-top: 25px; } + .contact-us-info .contact .social a { + border: 0px; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .contact-us-info .contact .social a.tw { + position: relative; + top: 2px; } + .contact-us-info .contact .social a:hover { + opacity: 0.8; + filter: alpha(opacity=80); } + +.status-page { + margin-top: 40px; + margin-bottom: 130px; } + .status-page .header { + text-align: center; } + .status-page .header h3 { + font-size: 22px; + color: #444; + line-height: 25px; + font-weight: 500; + margin-bottom: 7px; } + .status-page .header p { + font-size: 16px; + font-weight: 400; + color: #888; } + .status-page .current-status { + background: #F7F8FB; + border: 1px solid #EAEDF7; + border-radius: 8px; + box-shadow: inset rgba(100, 100, 100, 0.25) 0 1px 1px; + padding: 20px 30px; + margin: 0 auto; + margin-top: 35px; } + .status-page .current-status .updated { + float: right; + color: #616A72; + font-size: 13px; } + @media (max-width: 767px) { + .status-page .current-status .updated { + float: none; + text-align: center; + display: block; + margin-bottom: 20px; } } + .status-page .current-status .status { + font-size: 18px; + font-weight: 500; } + .status-page .current-status .status .color { + width: 15px; + height: 15px; + border-radius: 50px; + float: left; + position: relative; + top: 5px; + margin-right: 20px; } + .status-page .current-status .status .color.green { + background: #96cb4c; + border: 1px solid #8BC43D; + box-shadow: 0px 0px 7px 2px #B3E074, inset 0px 2px 1px -1px rgba(255, 255, 255, 0.8); } + .status-page .current-status .status .color.yellow { + background: #F0D775; + border: 1px solid #E0CC7E; + box-shadow: 0px 0px 7px 2px #F0D775, inset 0px 2px 1px -1px rgba(255, 255, 255, 0.8); } + .status-page .current-status .status .color.red { + background: #F56B65; + border: 1px solid #FC7D77; + box-shadow: 0px 0px 7px 2px #FF9B96, inset 0px 2px 1px -1px rgba(255, 255, 255, 0.8); } + .status-page .current-status .help { + margin-top: 7px; + margin-left: 35px; } + .status-page .modules { + margin-top: 40px; + border-radius: 5px; } + .status-page .modules > .list-group .list-group-item { + padding: 13px 15px; } + .status-page .modules > .list-group .list-group-item:first-child { + border-top: 0px; + border-top-right-radius: 5px; + border-top-left-radius: 5px; } + .status-page .modules > .list-group .list-group-item .status { + float: right; + color: #0F9B0F; + font-size: 13px; + font-weight: 500; } + .status-page .modules > .list-group .list-group-item .status.down { + color: #D88C1B; } + .status-page .messages { + margin-top: 35px; } + .status-page .messages h3 { + font-size: 18px; + color: #444; + margin-bottom: 25px; } + .status-page .messages .date { + margin-bottom: 25px; } + .status-page .messages .date .day { + font-size: 13px; + font-weight: bold; + color: #454545; + padding-bottom: 6px; + margin-bottom: 6px; + border-bottom: 1px solid #eee; } + .status-page .messages .date .ok { + color: #0F9B0F; + font-size: 13px; + font-weight: 500; } + .status-page .messages .date .issues { + color: #D88C1B; + font-size: 13px; + font-weight: 500; + margin-bottom: 18px; } + .status-page .messages .date .update { + color: #333; + font-size: 13px; } + .status-page .messages .date .update strong { + font-size: 13px; + font-weight: bold; + color: #454545; + min-width: 93px; + display: inline-block; } + .status-page .full-history { + margin-top: 50px; } + +.gallery-showcase { + margin-top: 60px; } + .gallery-showcase .header { + text-align: left; } + .gallery-showcase .header h3 { + font-size: 26px; + color: #596166; + line-height: 25px; + font-weight: 500; } + .gallery-showcase .header p { + font-size: 15px; + font-weight: 400; + color: #666; + margin-top: 12px; + line-height: 24px; } + @media (min-width: 992px) { + .gallery-showcase .header p { + width: 48%; } } + .gallery-showcase .filtering { + margin-top: 35px; + margin-bottom: 35px; } + .gallery-showcase .filtering #filters { + padding-left: 20px; + text-align: center; + border-bottom: 2px solid #EDEDED; } + @media (max-width: 767px) { + .gallery-showcase .filtering #filters { + display: none; } } + .gallery-showcase .filtering #filters li { + list-style-type: none; + display: inline-block; + margin: 0px 8px; } + .gallery-showcase .filtering #filters li:first-child { + margin-left: 0px; } + .gallery-showcase .filtering #filters li a { + color: #888; + font-weight: 400; + border: 0px; + padding: 10px 22px; + font-size: 16px; + position: relative; + -webkit-transition: color 0.25s linear; + -moz-transition: color 0.25s linear; + -ms-transition: color 0.25s linear; + -o-transition: color 0.25s linear; + transition: color 0.25s linear; } + .gallery-showcase .filtering #filters li a.active { + color: #2B69A2; + font-weight: 400; + border-bottom: 0px; + display: inline-block; } + .gallery-showcase .filtering #filters li a.active:after { + content: ''; + position: absolute; + width: 100%; + height: auto; + border-bottom: 2px solid #7BA3C9; + left: 1px; + bottom: -2px; } + .gallery-showcase .filtering #filters li a:hover { + color: #2B69A2; + background: none; + text-decoration: none; } + .gallery-showcase .gallery_container { + overflow: visible !important; } + .gallery-showcase .pic { + margin-bottom: 40px; + position: relative; + display: block; + -webkit-transition: 0.5s cubic-bezier(0.25, 1.45, 0.51, 1.13); + -moz-transition: 0.5s cubic-bezier(0.25, 1.45, 0.51, 1.13); + -ms-transition: 0.5s cubic-bezier(0.25, 1.45, 0.51, 1.13); + -o-transition: 0.5s cubic-bezier(0.25, 1.45, 0.51, 1.13); + transition: 0.5s cubic-bezier(0.25, 1.45, 0.51, 1.13); } + .gallery-showcase .pic.fluidbox-opened:hover .layer { + background: transparent; } + .gallery-showcase .pic.fluidbox-opened:hover .layer p { + opacity: 0; + filter: alpha(opacity=0); } + .gallery-showcase .pic:hover { + text-decoration: none; } + .gallery-showcase .pic:hover .layer { + background: rgba(33, 33, 33, 0.8); } + .gallery-showcase .pic:hover .layer p { + margin-top: -20px; + opacity: 1; + filter: alpha(opacity=100); } + .gallery-showcase .pic .layer { + width: 100%; + height: 100%; + position: absolute; + z-index: 9; + top: 0px; + left: 0px; + background: transparent; + -webkit-transition: all 0.25s ease-out; + -moz-transition: all 0.25s ease-out; + -ms-transition: all 0.25s ease-out; + -o-transition: all 0.25s ease-out; + transition: all 0.25s ease-out; } + .gallery-showcase .pic .layer p { + transition: margin-top .35s ease-out, opacity .55s ease-out; + color: #fff; + font-size: 15px; + text-align: center; + top: 50%; + width: 100%; + position: absolute; + font-weight: 600; + margin-top: 25px; + opacity: 0; + filter: alpha(opacity=0); } + .gallery-showcase .pic .layer p span { + position: relative; + top: 1px; + margin-right: 2px; } + .gallery-showcase .pic img { + margin: 0 auto; } + +/* Fluidbox styling starts here */ +a[data-fluidbox] { + background-color: #eee; + border: none; + cursor: -webkit-zoom-in; + cursor: -moz-zoom-in; + margin-bottom: 1.5rem; } + a[data-fluidbox].fluidbox-opened { + cursor: -webkit-zoom-out; + cursor: -moz-zoom-out; } + a[data-fluidbox] img { + display: block; + margin: 0 auto; + opacity: 0; + filter: alpha(opacity=0); + max-width: 100%; + transition: all .25s ease-in-out; } + +a[class^='float'] { + margin: 1rem; + margin-top: 0; + width: 33.33333%; } + a[class^='float'].float-left { + float: left; + margin-left: 0; } + a[class^='float'].float-right { + float: right; + margin-right: 0; } + +#fluidbox-overlay { + background-color: rgba(255, 255, 255, 0.85); + cursor: pointer; + cursor: -webkit-zoom-out; + cursor: -moz-zoom-out; + display: none; + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + z-index: 500; } + +.fluidbox-wrap { + background-position: center center; + background-size: cover; + margin: 0 auto; + position: relative; + z-index: 400; + transition: all .25s ease-in-out; } + .fluidbox-opened .fluidbox-wrap { + z-index: 600; } + +.fluidbox-ghost { + background-size: cover; + background-position: center center; + position: absolute; + transition: all .25s ease-in-out; } + +html.portfolio-page { + background: #F5F9FF; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, rgba(255, 255, 255, 0)), color-stop(1, rgba(255, 255, 255, 0.5))); + background-image: -webkit-linear-gradient(top, rgba(255, 255, 255, 0) 0, rgba(255, 255, 255, 0.5) 100%); + background-image: -moz-linear-gradient(top, rgba(255, 255, 255, 0) 0, rgba(255, 255, 255, 0.5) 100%); + background-image: -o-linear-gradient(top, rgba(255, 255, 255, 0) 0, rgba(255, 255, 255, 0.5) 100%); + background-image: -ms-linear-gradient(top, rgba(255, 255, 255, 0) 0, rgba(255, 255, 255, 0.5) 100%); + background-image: linear-gradient(top, rgba(255, 255, 255, 0) 0, rgba(255, 255, 255, 0.5) 100%); + -webkit-background-size: 100% 30%; + -moz-background-size: 100% 30%; + background-size: 100% 30%; + background-repeat: no-repeat; + background-position: 0 100%; } + +.portfolio-body { + background: none; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(25%, rgba(255, 255, 255, 0))); + background-image: -webkit-linear-gradient(top, #fff 0, rgba(255, 255, 255, 0) 25%); + background-image: -moz-linear-gradient(top, #fff 0, rgba(255, 255, 255, 0) 25%); + background-image: -o-linear-gradient(top, #fff 0, rgba(255, 255, 255, 0) 25%); + background-image: -ms-linear-gradient(top, #fff 0, rgba(255, 255, 255, 0) 25%); + background-image: linear-gradient(top, #fff 0, rgba(255, 255, 255, 0) 25%); } + +.portfolio-showcase { + margin-top: 50px; } + .portfolio-showcase .header { + text-align: left; + margin-bottom: 40px; } + .portfolio-showcase .header h3 { + font-size: 28px; + color: #596166; + line-height: 25px; + font-weight: 500; } + .portfolio-showcase .header p { + font-size: 16px; + font-weight: 400; + color: #8D959B; + line-height: 24px; } + @media (min-width: 992px) { + .portfolio-showcase .header p { + width: 48%; } } + .portfolio-showcase .project { + background: #fff; + padding: 40px 60px; + border-radius: 5px; + margin-bottom: 35px; + box-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05), 0 1px 0 rgba(0, 0, 0, 0.05), -1px 0 0 rgba(0, 0, 0, 0.04), 1px 0 0 rgba(0, 0, 0, 0.04), 0 1px 3px rgba(0, 0, 0, 0.12); } + @media (max-width: 767px) { + .portfolio-showcase .project { + padding: 40px 35px 35px 35px; } } + .portfolio-showcase .project h3 { + color: #585F64; + font-size: 22px; + margin-top: 0px; + text-align: center; } + .portfolio-showcase .project .screen { + margin-top: 45px; + text-align: center; } + .portfolio-showcase .project .screen img { + margin: 0 auto; } + .portfolio-showcase .project .description { + margin-top: 40px; + color: #7D8186; + line-height: 21px; } + .portfolio-showcase .project .divider { + height: 1px; + width: 100%; + background-color: #ddd; + position: relative; + margin-top: 45px; } + .portfolio-showcase .project .divider:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 2px; + background-image: -webkit-gradient(linear, left top, right top, color-stop(0, rgba(255, 255, 255, 0.75)), color-stop(0.5, rgba(250, 250, 250, 0)), color-stop(1, rgba(255, 255, 255, 0.75))); + background-image: -webkit-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -moz-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -o-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -ms-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); } + .portfolio-showcase .project .visit { + margin-top: 30px; + text-align: center; } + +.portfolio-item-showcase { + margin-top: 40px; + margin-bottom: -30px; } + .portfolio-item-showcase .header { + text-align: left; + margin-bottom: 25px; } + .portfolio-item-showcase .header h3 { + display: inline-block; + font-size: 17px; + font-family: Myriad Pro, Lato, Helvetica Neue, Arial; + color: #53A6DA; + margin-top: 0px; + line-height: 25px; + font-weight: 500; + margin-bottom: 5px; + cursor: pointer; } + .portfolio-item-showcase .project h1 { + text-align: center; + font-size: 25px; + color: #647583; + margin-top: 10px; + margin-bottom: 70px; } + .portfolio-item-showcase .project .screens img { + margin: 0 auto; + margin-bottom: 80px; + margin-top: 10px; } + .portfolio-item-showcase .project .screens img.magnifier { + width: 490px; + margin-bottom: 100px; } + .portfolio-item-showcase .project .screens img.mobile { + margin-bottom: 110px; } + .portfolio-item-showcase .project .screens .text { + color: #7D8186; + font-size: 15px; + line-height: 22px; + margin-bottom: 80px; } + .portfolio-item-showcase .project .description .info { + margin-top: 25px; } + @media (min-width: 992px) { + .portfolio-item-showcase .project .description .info.stick { + position: fixed; + top: 10px; } } + .portfolio-item-showcase .project .description .info .icons { + margin-bottom: 20px; } + .portfolio-item-showcase .project .description .info .icons .ion-icon:before { + color: #b2c3cb; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #b2c3cb), color-stop(100%, #DBE3E7)); + background: -webkit-linear-gradient(#b2c3cb, #DBE3E7); + font-size: 60px; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + margin: 0 9px; } + .portfolio-item-showcase .project .description .info .icons .ion-social-windows:before { + font-size: 50px; } + .portfolio-item-showcase .project .description .info p { + color: #7D8186; + line-height: 22px; + margin-bottom: 22px; } + .portfolio-item-showcase .project .description .info .tweet-it { + color: #00A7DD; + margin-top: 3px; + display: inline-block; + position: relative; + padding-left: 29px; + text-decoration: none; } + .portfolio-item-showcase .project .description .info .tweet-it:hover .ion-social-twitter:before { + content: "\f242"; } + .portfolio-item-showcase .project .description .info .tweet-it .ion-social-twitter { + margin-right: 8px; + font-size: 21px; + position: absolute; + top: 0px; + left: 0px; } + +.support-header { + margin-top: -20px; + background: #F4F7FA; + border-bottom: 1px solid #DCE4EC; + padding: 50px 0px; } + @media (max-width: 767px) { + .support-header { + padding: 30px 0px; + text-align: center; } } + .support-header h2, .support-header p { + text-shadow: 1px 1px 1px #fff; } + @media (max-width: 767px) { + .support-header h2 { + font-size: 27px; } } + .support-header h2 .entypo-lifebuoy { + position: absolute; + left: -25px; + top: 22px; + font-size: 29px; + color: #7AA3C5; } + @media (max-width: 767px) { + .support-header h2 .entypo-lifebuoy { + position: relative; + left: 0px; } } + .support-header p { + font-size: 17px; + color: #5A5A5A; } + @media (max-width: 767px) { + .support-header p { + font-size: 15px; } } + .support-header form { + margin-top: 30px; } + .support-header form .input-group:before { + display: inline-block; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + line-height: 1; + content: "\f002"; + position: absolute; + top: 14px; + left: 13px; + font-size: 20px; + z-index: 99; + color: #d0dae4; } + .support-header form .form-control { + height: 50px; + font-size: 17px; + line-height: 20px; + padding-left: 42px; } + .support-header form .form-control::-webkit-input-placeholder { + color: #BCC8D6; + font-size: 17px; + font-weight: 300; } + .support-header form .form-control:-moz-placeholder { + color: #BCC8D6; + font-size: 17px; + font-weight: 300; } + .support-header form .form-control::-moz-placeholder { + color: #BCC8D6; + font-size: 17px; + font-weight: 300; } + .support-header form .form-control:-ms-input-placeholder { + color: #BCC8D6; + font-size: 17px; + font-weight: 300; } + .support-header form .input-group-btn .btn { + padding: 14px 18px; } + +.support-topics { + margin-top: 40px; } + .support-topics h4 { + font-weight: 400; + margin-bottom: 50px; + font-size: 25px; } + .support-topics .topic { + margin-bottom: 45px; } + @media (max-width: 767px) { + .support-topics .topic { + text-align: center; } } + .support-topics .topic .icon { + display: block; + font-size: 45px; + color: #70CBF5; } + .support-topics .topic a { + color: #454545; + text-decoration: none; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .support-topics .topic a strong { + display: block; + margin-top: 15px; + font-size: 16px; } + .support-topics .topic a:hover { + color: #5CB9E4; } + .support-topics .topic p { + margin-top: 17px; + color: #838383; } + +.not-found-page { + height: 100%; + background: #3A4F68; + background: -moz-radial-gradient(center, ellipse cover, #4D6077 0%, #3A4F68 100%); + background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #4D6077), color-stop(100%, #3A4F68)); + background: -webkit-radial-gradient(center, ellipse cover, #4D6077 0%, #3A4F68 100%); + background: -o-radial-gradient(center, ellipse cover, #4D6077 0%, #3A4F68 100%); + background: -ms-radial-gradient(center, ellipse cover, #4D6077 0%, #3A4F68 100%); + background: radial-gradient(ellipse at center, #4D6077 0%, #3A4F68 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#4D6077', endColorstr = '#3A4F68', GradientType = 1); } + +#not-found { + overflow: hidden; } + #not-found .info { + text-align: center; + padding-top: 100px; } + #not-found .info h1 { + color: #fff; + font-size: 13em; + margin-bottom: 20px; + font-weight: 200; + letter-spacing: -3px; + text-shadow: 1px 1px rgba(0, 0, 0, 0.35); } + #not-found .info p { + font-size: 23px; + color: #FFF; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.35); + margin-bottom: 0; } + #not-found .info .go-back { + font-size: 16px; + text-shadow: none; + color: #9BB2CE; + z-index: 999; + position: absolute; + left: 0; + right: 0; + padding: 25px 0; + max-width: 400px; + margin: auto; + margin-top: -15px; } + #not-found .info .go-back a { + color: #fff; } + #not-found #container canvas { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; } + +#not-found-alt { + overflow: hidden; } + #not-found-alt .info { + text-align: center; + margin-top: 30px; + position: absolute; + width: 100%; } + #not-found-alt .info h1 { + color: #fff; + font-size: 11em; + margin-bottom: 20px; + font-weight: 200; + letter-spacing: -3px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.15); } + #not-found-alt .info p { + font-size: 25px; + color: #4D728A; + margin-bottom: 0; } + #not-found-alt .info .go-back { + font-size: 16px; + text-shadow: none; + letter-spacing: 0px; + color: #506379; + z-index: 999; + position: absolute; + left: 0; + right: 0; + padding: 25px 0; + max-width: 400px; + margin: auto; + margin-top: -15px; } + #not-found-alt .info .go-back a { + color: #429AD5; + text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.4); + font-size: 18px; } + #not-found-alt canvas { + background: linear-gradient(#b3d4e6 0%, #eef4f6 75%); + display: block; } + #not-found-alt #container { + height: 100%; + left: 0; + position: fixed; + top: 0; + width: 100%; } + +.coming-soon-page { + border-top: 5px solid #4DB2E7; + height: 100vh; + background: #fff; + background: -moz-radial-gradient(center, ellipse cover, #fff 0%, #F4F9FF 100%); + background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #fff), color-stop(100%, #F4F9FF)); + background: -webkit-radial-gradient(center, ellipse cover, #fff 0%, #F4F9FF 100%); + background: -o-radial-gradient(center, ellipse cover, #fff 0%, #F4F9FF 100%); + background: -ms-radial-gradient(center, ellipse cover, #fff 0%, #F4F9FF 100%); + background: radial-gradient(ellipse at center, #fff 0%, #F4F9FF 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#fff', endColorstr = '#F4F9FF', GradientType = 1); } + .coming-soon-page.dark { + border-top: 5px solid #DAEEF8; + background: #4D576D !important; } + .coming-soon-page.dark .info a { + color: #fff; } + .coming-soon-page.dark .info h3 { + color: #fff; + font-weight: 300; } + .coming-soon-page.dark #countdown #clock .flip-clock-divider .flip-clock-label { + color: #fff; } + .coming-soon-page.dark form .button { + display: inline-block; + vertical-align: middle; + zoom: 1; + color: #fff; + padding: 9px 27px; + border: 2px solid #fff; + border-radius: 4px; + font-size: 15px; + font-weight: 400; + background: rgba(0, 0, 0, 0.08); + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: none; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .coming-soon-page.dark form .button:hover { + text-decoration: none; + color: #ddd; + border-color: #ddd; } + .coming-soon-page.dark .social .ion span { + color: #AEDCFF; } + .coming-soon-page .skins-nav { + opacity: 1; + -webkit-transition: left 0.3s; + -moz-transition: left 0.3s; + -ms-transition: left 0.3s; + -o-transition: left 0.3s; + transition: left 0.3s; + position: fixed; + left: -40px; + top: 135px; + font-size: 13px; + z-index: 9999; } + .coming-soon-page .skins-nav:hover { + left: 0px; } + .coming-soon-page .skins-nav a { + display: block; + color: #FFF; + text-decoration: none; + padding-right: 30px; + height: 37px; + border-radius: 0 4px 4px 0; + margin-bottom: 3px; + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -ms-transition: all 0.5s; + -o-transition: all 0.5s; + transition: all 0.5s; + text-align: right; + position: relative; + box-shadow: inset 0 1px rgba(255, 255, 255, 0.21); } + .coming-soon-page .skins-nav a.light { + background: #9BD4F5; } + .coming-soon-page .skins-nav a.dark { + background: #444; } + .coming-soon-page .skins-nav a.active .ion { + display: block; } + .coming-soon-page .skins-nav a .text { + white-space: nowrap; + display: block; + width: 85px; + position: relative; + top: 9px; + -webkit-transition: width 0.2s; + -moz-transition: width 0.2s; + -ms-transition: width 0.2s; + -o-transition: width 0.2s; + transition: width 0.2s; } + .coming-soon-page .skins-nav a .ion { + position: absolute; + top: 11px; + right: 8px; + display: none; } + .coming-soon-page .info { + margin-top: 60px; + text-align: center; + color: #fff; } + .coming-soon-page .info a { + color: #5F5F5F; + text-decoration: none; + font-family: Myriad Pro, Lato, Helvetica Neue, Arial; + font-size: 46px; } + .coming-soon-page .info a:hover { + text-decoration: none; } + .coming-soon-page .info h3 { + text-align: center; + color: #4DB2E7; + text-transform: uppercase; + letter-spacing: 2px; + font-weight: 400; + font-size: 18px; + margin-top: 25px; } + .coming-soon-page #countdown { + margin-top: 35px; } + .coming-soon-page #countdown #clock { + width: 100%; + margin: 0 auto; } + @media (min-width: 992px) { + .coming-soon-page #countdown #clock { + width: 47%; } } + @media (max-width: 991px) { + .coming-soon-page #countdown #clock { + max-width: 142px; } + .coming-soon-page #countdown #clock ul { + margin-bottom: 50px; } + .coming-soon-page #countdown #clock .flip-clock-divider { + height: inherit; + display: block; } + .coming-soon-page #countdown #clock .flip-clock-divider:before, .coming-soon-page #countdown #clock .flip-clock-divider:after { + display: table; + content: ""; } + .coming-soon-page #countdown #clock .flip-clock-divider.minutes .flip-clock-label, .coming-soon-page #countdown #clock .flip-clock-divider.seconds .flip-clock-label { + right: -74px !important; } + .coming-soon-page #countdown #clock .flip-clock-divider .flip-clock-label { + bottom: -8.5em !important; } } + .coming-soon-page #countdown #clock .flip-clock-divider.minutes .flip-clock-label, .coming-soon-page #countdown #clock .flip-clock-divider.seconds .flip-clock-label { + right: -102px; } + .coming-soon-page #countdown #clock .flip-clock-divider .flip-clock-label { + color: #555; + bottom: -1.5em; + top: inherit; + right: -92px; + font-size: 15px; } + .coming-soon-page #countdown #clock .flip-clock-divider .flip-clock-dot { + display: none; } + .coming-soon-page form { + margin-top: 110px; + text-align: center; } + @media (max-width: 767px) { + .coming-soon-page form { + margin-top: 70px; } } + .coming-soon-page form input[type="email"] { + width: 250px; + height: 43px; } + @media (max-width: 767px) { + .coming-soon-page form input[type="email"] { + margin: 0 auto; } } + .coming-soon-page form .button { + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #38BAFF), color-stop(100%, #37ADEB)); + background: -webkit-linear-gradient(#38BAFF, #37ADEB); + background: -moz-linear-gradient(#38BAFF, #37ADEB); + background: -o-linear-gradient(#38BAFF, #37ADEB); + background: linear-gradient(#38BAFF, #37ADEB); + padding: 10px 19px; + font-size: 15px; + font-weight: 500; + border: 1px solid #54AEF5; } + .coming-soon-page .social { + margin-top: 100px; + text-align: center; + margin-bottom: 20px; } + .coming-soon-page .social .ion { + font-size: 34px; + margin: 0 10px; + display: inline-block; } + .coming-soon-page .social .ion span { + color: #9DBDD6; } + .coming-soon-page .social .ion .ion-social-facebook { + font-size: 25px; } + .coming-soon-page .social .tm { + margin-top: 15px; + color: #B1B9C4; } + +#docs #guide { + background: #F4F8FA; + border-right: 1px solid #DADFE5; + left: 0; + top: 0; + position: fixed; + overflow: hidden; + overflow-y: auto; + width: 210px; + z-index: 25; + height: 100%; } + #docs #guide .logo { + margin-top: 0; + font-size: 29px; } + #docs #guide .logo a { + color: #000; + font-family: Myriad Pro, Lato, Helvetica Neue, Arial; + padding: 20px 0 15px 23px; + display: block; + border-bottom: 1px solid #D6DCE0; + box-shadow: 0px 1px #FFF; + -webkit-transition: color 0.15s linear; + -moz-transition: color 0.15s linear; + -ms-transition: color 0.15s linear; + -o-transition: color 0.15s linear; + transition: color 0.15s linear; } + #docs #guide .logo a:hover { + color: #858585; + text-decoration: none; } + #docs #guide .menu > li.active > .nav { + display: block; } + #docs #guide .menu > li.active > a { + background: #DEEAF1; } + #docs #guide .menu > li a { + color: #3391C9; + font-weight: 500; + font-size: 13px; + padding: 10px 15px 10px 25px; + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + -ms-transition: all 0.15s linear; + -o-transition: all 0.15s linear; + transition: all 0.15s linear; } + #docs #guide .menu > li a:hover { + background: #DEEAF1; } + #docs #guide .menu > li > .nav { + margin-bottom: 7px; + display: none; } + #docs #guide .menu > li > .nav li a { + font-weight: 400; + color: #48A0D6; + padding: 6px 15px 5px 35px; } +#docs #api-docs { + background: #FFF; + margin-left: 210px; + min-width: 750px; } + #docs #api-docs #methods { + background: #292E33; + position: relative; + margin-left: 50%; } + #docs #api-docs #methods .languages { + position: fixed; + top: 0; + width: 100%; + padding: 5px 0 5px 20px; + background: #3B4249; + box-shadow: 2px 1px 3px #000; + z-index: 999; } + #docs #api-docs #methods .languages .language { + display: inline-block; + color: #C0CEDD; + padding: 5px 15px; + font-size: 13px; } + #docs #api-docs #methods .languages .language.selected { + color: #fff; } + #docs #api-docs #methods .method:nth-child(2) .method-section .method-description { + padding-top: 0px; + border-top: 0px; } + #docs #api-docs #methods .method:nth-child(2) .method-section .method-example { + padding-top: 35px; + border-top: 0; + box-shadow: none; } + #docs #api-docs #methods .method:last-child .method-section { + padding-bottom: 70px; } + #docs #api-docs #methods .method .method-section { + margin-left: -100%; + position: relative; + padding-top: 50px; } + #docs #api-docs #methods .method .method-section .method-description { + width: 50%; + float: left; + padding: 0 30px; + border-top: 1px solid #E5E7EB; + padding-top: 40px; } + #docs #api-docs #methods .method .method-section .method-description h3 { + font-size: 21px; + margin-top: 0; + margin-bottom: 20px; } + #docs #api-docs #methods .method .method-section .method-description p { + font-size: 13px; + color: #666; + line-height: 21px; + margin-bottom: 20px; } + #docs #api-docs #methods .method .method-section .method-description .info { + margin-top: 45px; + margin-bottom: 40px; } + #docs #api-docs #methods .method .method-section .method-description .info h4 { + font-size: 14px; + border-bottom: 1px solid #E4E4E4; + padding-bottom: 15px; } + #docs #api-docs #methods .method .method-section .method-description .info .field { + margin-top: 17px; + font-size: 13px; } + #docs #api-docs #methods .method .method-section .method-description .info .field .key { + width: 40%; + float: left; + text-align: right; + padding-right: 10px; + font-weight: bold; + color: #333; } + #docs #api-docs #methods .method .method-section .method-description .info .field .desc { + width: 60%; + float: right; + padding-left: 10px; + color: #555; + line-height: 21px; } + #docs #api-docs #methods .method .method-section .method-description .info .field .desc strong { + display: block; + color: #333; + margin-bottom: 5px; } + #docs #api-docs #methods .method .method-section .method-example { + margin-left: 50%; + width: 50%; + padding: 75px 30px 0; + border-top: 1px solid #000; + box-shadow: inset 0px 1px rgba(255, 255, 255, 0.17); + color: #fff; } + #docs #api-docs #methods .method .method-section .method-example pre { + background: none; + border: none; + margin: 0; + padding: 0; } + #docs #api-docs #methods .method .method-section .method-example pre code { + background: none; + font-family: Monaco, Consolas, Menlo; + font-size: 12px; + display: none; + color: #DAE4F2; } + #docs #api-docs #methods .method .method-section .method-example pre code.always-visible { + display: block !important; } + #docs #api-docs #methods .method .method-section .method-example pre code.ruby { + display: block; } + #docs #api-docs #methods .method .method-section .method-example pre code > * { + color: #DAE4F2; + line-height: 20px; } + #docs #api-docs #methods .method .method-section .method-example pre .ruby { + color: #DAE4F2; } + #docs #api-docs #methods .method .method-section .method-example pre .ruby > * { + color: #DAE4F2; + line-height: 20px; } + #docs #api-docs #methods .method .method-section .method-example pre .ruby [class*=keyword] { + color: #9AB4DB; } + #docs #api-docs #methods .method .method-section .method-example pre .ruby [class*=string] { + color: #DAD0C6; } + #docs #api-docs #methods .method .method-section .method-example pre .ruby [class*=comment] { + color: #B4B4B4; } + #docs #api-docs #methods .method .method-section .method-example pre .ruby [class*=constant] { + color: #FFDF9D; } + #docs #api-docs #methods .method .method-section .method-example pre .ruby [class*=symbol] { + color: #9ECBEE; } + #docs #api-docs #methods .method .method-section .method-example pre .python { + color: #DAE4F2; } + #docs #api-docs #methods .method .method-section .method-example pre .python > * { + color: #DAE4F2; + line-height: 20px; } + #docs #api-docs #methods .method .method-section .method-example pre .python [class*=keyword] { + color: #9AB4DB; } + #docs #api-docs #methods .method .method-section .method-example pre .python [class*=string] { + color: #DAD0C6; } + #docs #api-docs #methods .method .method-section .method-example pre .python [class*=comment] { + color: #B4B4B4; } + #docs #api-docs #methods .method .method-section .method-example pre .python [class*=class] { + color: #FFDF9D; } + #docs #api-docs #methods .method .method-section .method-example pre .python [class*=params] { + color: #9ECBEE; } + #docs #api-docs #methods .method .method-section .method-example pre .php { + color: #DAE4F2; } + #docs #api-docs #methods .method .method-section .method-example pre .php > * { + color: #DAE4F2; + line-height: 20px; } + #docs #api-docs #methods .method .method-section .method-example pre .php [class*=keyword] { + color: #9AB4DB; } + #docs #api-docs #methods .method .method-section .method-example pre .php [class*=string] { + color: #DAD0C6; } + #docs #api-docs #methods .method .method-section .method-example pre .php [class*=comment] { + color: #B4B4B4; } + +.invoice-wrapper { + background: #eeeff1; + padding-top: 60px; } + @media (min-width: 1200px) { + .invoice-wrapper .container { + width: 900px; } } + .invoice-wrapper .logo { + text-align: center; } + .invoice-wrapper .logo a { + font-size: 36px; + color: #555; + font-weight: 300; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .invoice-wrapper .logo a:hover { + text-decoration: none; + color: #7793C4; } + .invoice-wrapper .invoice-wrapper { + background: #FFF; + border: 1px solid #CDD3E2; + box-shadow: 0px 0px 1px #CCC; + padding: 40px 40px 60px; + margin-top: 40px; + border-radius: 4px; } + .invoice-wrapper .invoice-wrapper .intro { + line-height: 25px; + color: #444; } + .invoice-wrapper .invoice-wrapper .payment-info { + margin-top: 25px; + padding-top: 15px; } + .invoice-wrapper .invoice-wrapper .payment-info span { + color: #A9B0BB; } + .invoice-wrapper .invoice-wrapper .payment-info strong { + display: block; + color: #444; + margin-top: 3px; } + @media (max-width: 767px) { + .invoice-wrapper .invoice-wrapper .payment-info .text-right { + text-align: left; + margin-top: 20px; } } + .invoice-wrapper .invoice-wrapper .payment-details { + border-top: 2px solid #EBECEE; + margin-top: 30px; + padding-top: 20px; + line-height: 22px; } + .invoice-wrapper .invoice-wrapper .payment-details span { + color: #A9B0BB; + display: block; } + .invoice-wrapper .invoice-wrapper .payment-details a { + display: inline-block; + margin-top: 5px; } + @media (max-width: 767px) { + .invoice-wrapper .invoice-wrapper .payment-details .text-right { + text-align: left; + margin-top: 20px; } } + .invoice-wrapper .invoice-wrapper .line-items { + margin-top: 40px; } + .invoice-wrapper .invoice-wrapper .line-items .headers { + color: #A9B0BB; + font-size: 13px; + letter-spacing: .3px; + border-bottom: 2px solid #EBECEE; + padding-bottom: 4px; } + .invoice-wrapper .invoice-wrapper .line-items .items { + margin-top: 8px; + border-bottom: 2px solid #EBECEE; + padding-bottom: 8px; } + .invoice-wrapper .invoice-wrapper .line-items .items .item { + padding: 10px 0; + color: #696969; + font-size: 15px; } + @media (max-width: 767px) { + .invoice-wrapper .invoice-wrapper .line-items .items .item { + font-size: 13px; } } + .invoice-wrapper .invoice-wrapper .line-items .items .item .amount { + letter-spacing: 0.1px; + color: #84868A; + font-size: 16px; } + @media (max-width: 767px) { + .invoice-wrapper .invoice-wrapper .line-items .items .item .amount { + font-size: 13px; } } + .invoice-wrapper .invoice-wrapper .line-items .total { + margin-top: 30px; } + .invoice-wrapper .invoice-wrapper .line-items .total .extra-notes { + float: left; + width: 40%; + text-align: left; + font-size: 13px; + color: #7A7A7A; + line-height: 20px; } + @media (max-width: 767px) { + .invoice-wrapper .invoice-wrapper .line-items .total .extra-notes { + width: 100%; + margin-bottom: 30px; + float: none; } } + .invoice-wrapper .invoice-wrapper .line-items .total .extra-notes strong { + display: block; + margin-bottom: 5px; + color: #454545; } + .invoice-wrapper .invoice-wrapper .line-items .total .field { + margin-bottom: 7px; + font-size: 14px; + color: #555; } + .invoice-wrapper .invoice-wrapper .line-items .total .field.grand-total { + margin-top: 10px; + font-size: 16px; + font-weight: 500; } + .invoice-wrapper .invoice-wrapper .line-items .total .field.grand-total span { + color: #20A720; + font-size: 16px; } + .invoice-wrapper .invoice-wrapper .line-items .total .field span { + display: inline-block; + margin-left: 20px; + min-width: 85px; + color: #84868A; + font-size: 15px; } + .invoice-wrapper .invoice-wrapper .line-items .print { + margin-top: 50px; + text-align: center; } + .invoice-wrapper .invoice-wrapper .line-items .print a { + display: inline-block; + border: 1px solid #9CB5D6; + padding: 13px 13px; + border-radius: 5px; + color: #708DC0; + font-size: 13px; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .invoice-wrapper .invoice-wrapper .line-items .print a:hover { + text-decoration: none; + border-color: #333; + color: #333; } + .invoice-wrapper .invoice-wrapper .line-items .print a i { + margin-right: 3px; + font-size: 14px; } + .invoice-wrapper .footer { + margin-top: 40px; + margin-bottom: 110px; + text-align: center; + font-size: 12px; + color: #969CAD; } + +.timeline-bg { + background: #f7f8fa; } + +.timeline-wrapper { + margin-top: 60px; + position: relative; + /* the first node that comes right next to a year */ } + .timeline-wrapper:before { + content: ''; + position: absolute; + width: 5px; + height: 100%; + left: 0; + background: #e7e8ec; + right: 0; + margin: 0 auto; + z-index: -1; } + .timeline-wrapper .year { + text-align: center; + margin-bottom: 50px; + font-weight: 600; + margin-top: 50px; + font-size: 16px; } + .timeline-wrapper .year:nth-child(1) { + margin-top: 0px; + margin-bottom: 60px; } + .timeline-wrapper .year.last { + margin-bottom: 0; + font-size: 21px; } + .timeline-wrapper .year span { + display: inline-block; + background: #E7E8EC; + padding: 6px 20px; + color: #5A5A5A; + border-radius: 3px; } + .timeline-wrapper .year + .node { + margin-top: -20px; } + .timeline-wrapper .node { + position: relative; + float: right; + clear: right; + width: 44%; + margin: 35px 0; + border-radius: 5px; } + @media (max-width: 767px) { + .timeline-wrapper .node { + width: 100%; } } + .timeline-wrapper .node.left { + float: left; + clear: left; } + .timeline-wrapper .node.left:before { + right: -51px; + left: inherit; } + @media (max-width: 991px) { + .timeline-wrapper .node.left:before { + right: -42px; + width: 43px; } } + .timeline-wrapper .node.left .marker { + left: inherit; + right: -65px; } + @media (max-width: 991px) { + .timeline-wrapper .node.left .marker { + right: -52px; } } + .timeline-wrapper .node:before { + content: ''; + position: absolute; + width: 50px; + height: 4px; + background: #E7E8EC; + left: -51px; + top: 62px; } + @media (max-width: 991px) { + .timeline-wrapper .node:before { + left: -42px; + width: 43px; } } + @media (max-width: 767px) { + .timeline-wrapper .node:before { + display: none; } } + .timeline-wrapper .node .marker { + position: absolute; + width: 17px; + height: 17px; + border-radius: 25px; + background: #e7e8ec; + left: -65px; + top: 55px; + border: 3px solid #F7F8FA; } + @media (max-width: 991px) { + .timeline-wrapper .node .marker { + left: -51px; } } + @media (max-width: 767px) { + .timeline-wrapper .node .marker { + display: none; } } + .timeline-wrapper .node .entry { + position: relative; + padding: 20px; + height: 400px; + background-size: cover; + background-position: center center; + border-radius: 5px; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.26); } + .timeline-wrapper .node .entry:before { + position: absolute; + top: 50%; + bottom: 0; + left: 0; + right: 0; + content: ''; + border-radius: 0 0 5px 5px; + background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.89) 100%); + background: -moz-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.89) 100%); + background: -o-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.89) 100%); + background: linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.89) 100%); } + .timeline-wrapper .node .entry.smallish { + height: 320px; } + .timeline-wrapper .node .entry.smallish .intro { + top: 68%; } + .timeline-wrapper .node .entry.short-entry { + background: #E7E8EC; + color: #5c6269; + height: inherit; + padding: 13px; + box-shadow: none; + position: relative; + top: 41px; + left: -1px; + margin-bottom: 20px; + text-shadow: 1px 1px rgba(255, 255, 255, 0.4); } + .timeline-wrapper .node .entry.short-entry:before { + background: none; } + .timeline-wrapper .node .entry .intro { + position: relative; + top: 75%; + color: #FFF; + z-index: 9; + letter-spacing: .3px; } + .timeline-wrapper .node .entry .intro h4 { + font-size: 20px; + text-shadow: 1px 1px rgba(0, 0, 0, 0.69); + letter-spacing: .5px; } + @media (max-width: 767px) { + .timeline-wrapper .node .entry .intro h4 { + font-size: 17px; } } + .timeline-wrapper .node .entry .intro p { + font-weight: 300; } + @media (max-width: 767px) { + .timeline-wrapper .node .entry .intro p { + font-size: 13px; } } + .timeline-wrapper .node .news { + position: relative; + background-size: cover; + background-position: center center; + border-radius: 5px; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.26); + background: #fff; } + .timeline-wrapper .node .news section { + padding: 30px 20px 60px 20px; } + .timeline-wrapper .node .news section h3 { + margin-top: 0; + font-size: 17px; + line-height: 22px; } + .timeline-wrapper .node .news section p { + margin-top: 21px; + line-height: 22px; + font-size: 13px; + color: #7A7979; } + .timeline-wrapper .node .news footer { + position: absolute; + bottom: 0; + padding: 12px 20px; + width: 100%; + font-size: 12px; + font-weight: 500; + color: #9EAEBE; } + .timeline-wrapper .node .news footer .tag { + position: relative; + padding-left: 27px; + text-transform: uppercase; } + .timeline-wrapper .node .news footer .tag span { + font-size: 24px; + position: absolute; + top: -4px; + left: 0; } + +/*# sourceMappingURL=theme.css.map */ diff --git a/_sass/compiled/theme.css.map b/_sass/compiled/theme.css.map new file mode 100755 index 0000000..1563640 --- /dev/null +++ b/_sass/compiled/theme.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["../partials/_config.scss","../modules/_elements.scss","../modules/_mixins.scss","../modules/_buttons.scss","../bootstrap/bootstrap.scss","../bootstrap/_overrides.scss","../partials/_layout.scss","../partials/snippets/_features.scss","../partials/snippets/_slider.scss","../partials/pages/_index.scss","../partials/pages/_index2.scss","../partials/pages/_index3.scss","../partials/pages/_features.scss","../partials/pages/_services.scss","../partials/pages/_signup.scss","../partials/pages/_signup_rotate.scss","../partials/pages/_blog.scss","../partials/pages/_blog_cols.scss","../partials/pages/_blog_timeline.scss","../partials/pages/_blogpost.scss","../partials/pages/_pricing.scss","../partials/pages/_charts.scss","../partials/pages/_aboutus.scss","../partials/pages/_contactus.scss","../partials/pages/_status.scss","../partials/pages/_gallery.scss","../partials/pages/_portfolio.scss","../partials/pages/_portfolio_item.scss","../partials/pages/_support.scss","../partials/pages/_404.scss","../partials/pages/_coming_soon.scss","../partials/pages/_docs.scss","../partials/pages/_invoice.scss","../partials/pages/_timeline.scss"], +"names": [], +"file": "theme.css" +} \ No newline at end of file diff --git a/_sass/modules/_buttons.scss b/_sass/modules/_buttons.scss new file mode 100755 index 0000000..f9b6186 --- /dev/null +++ b/_sass/modules/_buttons.scss @@ -0,0 +1,65 @@ +.btn-shadow { + border: 0; + font-weight: 600; + color: #fff; + display: inline-block; + box-shadow: rgba(23, 43, 99, 0.24) 0 7px 28px; + text-transform: uppercase; + letter-spacing: 1px; + font-size: 13px; + padding: 12px 23px; + text-shadow: 1px 1px rgba(0, 0, 0, 0.09); + border-radius: 4px; + + @include transition(all .2s); + + &:hover, + &:focus { + color: #fff; + text-decoration: none; + } + + &:active { + box-shadow: rgba(23, 43, 99, 0.24) 0 7px 28px, inset 0 2px 3px rgba(0, 0, 0, 0.3); + } + + /* sizes */ + + &.btn-shadow-sm { + font-size: 11px; + padding: 7px 14px; + } + + &.btn-shadow-lg { + font-size: 14px; + padding: 16px 31px; + } + + /* colors */ + + &.btn-shadow-default { + background: #fff; + color: #444; + text-shadow: none; + } + + &.btn-shadow-primary { + background: linear-gradient(#2083fe, #1d7bf0); + } + + &.btn-shadow-dark { + background: #2C394D; + } + + &.btn-shadow-info { + background: #42B1E2; + } + + &.btn-shadow-warning { + background: #E2B477; + } + + &.btn-shadow-success { + background: #0ad6bc; + } +} diff --git a/_sass/modules/_elements.scss b/_sass/modules/_elements.scss new file mode 100755 index 0000000..ce59f20 --- /dev/null +++ b/_sass/modules/_elements.scss @@ -0,0 +1,186 @@ +*:focus { + outline: 0; +} + +.button { + display: inline-block; + vertical-align: middle; + zoom: 1; + padding: 13px 32px; + font-weight: 400; + font-size: 17px; + color: #fff !important; + text-shadow: rgba(0,0,0,0.2) 0 -1px 0; + border: 0px; + border-radius: 5px; + box-shadow: rgba(0, 0, 0, 0.3) 0 1px 2px, inset rgba(255, 255, 255, 0.88) 0px 1px 3px -1px; + background-color: #4589E3; + + @include background-gradient(#5DA4FF, #417BFF); + @include transition(all 0.2s linear); + + &:hover { + color: #fff; + text-decoration: none; + } + + &:active { + box-shadow: inset 0px 3px 3px rgba(0, 0, 0, 0.29); + } + + &.button-small { + padding: 10px 33px; + border: 1px solid #68A2EE; + font-size: 14px; + font-weight: 500; + } +} + +.button-outline { + display: inline-block; + vertical-align: middle; + zoom: 1; + color: #fff; + padding: 12px 31px; + border: 2px solid #fff; + border-radius: 4px; + font-size: 16px; + font-weight: 400; + background: rgba(0, 0, 0, 0.15); + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + + @include transition(all 0.2s linear); + + &:hover { + text-decoration: none; + color: #ddd; + border-color: #ddd; + } +} + +.button-clear { + border: 0; + outline: none; + padding: 1px; + display: inline-block; + text-decoration: none; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075); + -ms-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075); + -o-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075); + + background: #adb2bb; + background: -webkit-linear-gradient(#ccd0d6, #adb2bb); + background: -moz-linear-gradient(#ccd0d6, #adb2bb); + background: -ms-linear-gradient(#ccd0d6, #adb2bb); + background: -o-linear-gradient(#ccd0d6, #adb2bb); + background: linear-gradient(#ccd0d6, #adb2bb); + + span { + display: block; + font-size: 14px; + padding-left: 23px; + padding-right: 23px; + height: 36px; + line-height: 33px; + border-radius: 4px; + font-weight: bold; + + color: #444; + text-shadow: 0 1px 0 white; + background: #eff1f4; + background: -webkit-linear-gradient(#f7f8fa, #eff1f4); + background: -moz-linear-gradient(#f7f8fa, #eff1f4); + background: -ms-linear-gradient(#f7f8fa, #eff1f4); + background: -o-linear-gradient(#f7f8fa, #eff1f4); + background: linear-gradient(#f7f8fa, #eff1f4); + -webkit-box-shadow: inset 0 1px 0 white; + -moz-box-shadow: inset 0 1px 0 white; + -ms-box-shadow: inset 0 1px 0 white; + -o-box-shadow: inset 0 1px 0 white; + box-shadow: inset 0 1px 0 white; + } + + &:hover { + text-decoration: none; + } + + &:active, + &.active { + background: #b5bac2; + background: -webkit-linear-gradient(#b5bac2, #b5bac2); + background: -moz-linear-gradient(#b5bac2, #b5bac2); + background: -ms-linear-gradient(#b5bac2, #b5bac2); + background: -o-linear-gradient(#b5bac2, #b5bac2); + background: linear-gradient(#b5bac2, #b5bac2); + + span { + color: #444; + background: #eff1f4; + background: -webkit-linear-gradient(#e6e8eb, #eff1f4); + background: -moz-linear-gradient(#e6e8eb, #eff1f4); + background: -ms-linear-gradient(#e6e8eb, #eff1f4); + background: -o-linear-gradient(#e6e8eb, #eff1f4); + background: linear-gradient(#e6e8eb, #eff1f4); + -webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,0.1); + -moz-box-shadow: inset 0 1px 0 rgba(0,0,0,0.1); + -ms-box-shadow: inset 0 1px 0 rgba(0,0,0,0.1); + -o-box-shadow: inset 0 1px 0 rgba(0,0,0,0.1); + box-shadow: inset 0 1px 0 rgba(0,0,0,0.1); + } + } +} + + +/* form controls */ + +input[type="text"], +input[type="email"], +input[type="password"] { + + &.form-control { + box-shadow: inset 0 1px 1px rgba(0,0,0,0.2); + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.2); + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,0.2); + height: 39px; + + @include placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; + } + &:focus { + border-color: #98D2FF; + outline: 0; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px rgba(166, 205, 236, 0.6); + } + } +} + +textarea { + &.form-control { + box-shadow: inset 0 1px 1px rgba(0,0,0,0.2); + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.2); + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,0.2); + + @include placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; + } + + &:focus { + border-color: #98D2FF; + outline: 0; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px rgba(166, 205, 236, 0.6); + } + } +} + + diff --git a/_sass/modules/_mixins.scss b/_sass/modules/_mixins.scss new file mode 100755 index 0000000..33ee8df --- /dev/null +++ b/_sass/modules/_mixins.scss @@ -0,0 +1,81 @@ +@mixin font-smoothing { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +@mixin font-smoothing-none { + -webkit-font-smoothing: auto; + -moz-osx-font-smoothing: auto; +} + +@mixin transition($transitions) { + -webkit-transition: $transitions; + -moz-transition: $transitions; + -ms-transition: $transitions; + -o-transition: $transitions; + transition: $transitions; +} + +/* this mixin makes possible to add transition to a specific vendor, example: */ +/* -webkit-transition: -webkit-transform 0.5s linear; */ +@mixin transitionPrefix($property, $values) { + -webkit-transition: -webkit-#{$property} #{$values}; + -moz-transition: -moz-#{$property} #{$values}; + -ms-transition: -ms-#{$property} #{$values}; + -o-transition: -o-#{$property} #{$values}; + transition: #{$property} #{$values}; +} + +@mixin background-gradient($from, $to) { + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, $from), color-stop(100%, $to)); + background: -webkit-linear-gradient($from, $to); + background: -moz-linear-gradient($from, $to); + background: -o-linear-gradient($from, $to); + background: linear-gradient($from, $to); +} + +@mixin transform ($transforms) { + -moz-transform: $transforms; + -o-transform: $transforms; + -ms-transform: $transforms; + -webkit-transform: $transforms; + transform: $transforms; +} + +@mixin placeholder { + &::-webkit-input-placeholder {@content} + &:-moz-placeholder {@content} + &::-moz-placeholder {@content} + &:-ms-input-placeholder {@content} +} + +@mixin animation($animations) { + -webkit-animation: $animations; + -moz-animation: $animations; + -o-animation: $animations; + -ms-animation: $animations; + animation: $animations; +} + +@mixin animationDelay($value) { + -webkit-animation-delay: $value; + -moz-animation-delay: $value; + -o-animation-delay: $value; + -ms-animation-delay: $value; + animation-delay: $value; +} + +@mixin keyFrame($name) { + @-webkit-keyframes $name{ + @content + } + @-moz-keyframes $name{ + @content + } + @-o-keyframes $name{ + @content + } + @keyframes $name{ + @content + } +} diff --git a/_sass/partials/_config.scss b/_sass/partials/_config.scss new file mode 100755 index 0000000..d4930a6 --- /dev/null +++ b/_sass/partials/_config.scss @@ -0,0 +1,18 @@ +/* roboto font */ +@import url(https://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300italic,300,400italic,500,500italic,700,700italic,900,900italic); +/* source sans pro */ +@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600,700,900,200italic,300italic,400italic,600italic,700italic,900italic); +/* lato */ +@import url(https://fonts.googleapis.com/css?family=Lato:100,300,400,700,900,100italic,300italic,400italic,700italic,900italic); +/* merriweather */ +@import url(https://fonts.googleapis.com/css?family=Merriweather:400,300italic,300,400italic,700,700italic); +/* karla */ +@import url(https://fonts.googleapis.com/css?family=Karla:400,700); + +$roboto: "Roboto"; +$lato: 'Lato', 'Helvetica Neue', Arial; +$helvetica: "Helvetica Neue", Helvetica, Arial; +$myriad: Myriad Pro, Lato, Helvetica Neue, Arial; +$sourceSans: Source Sans Pro, Helvetica Neue, Arial; +$merriweather: "Merriweather", Georgia; +$karla: 'Karla', 'Lato', 'Helvetica Neue', Arial; \ No newline at end of file diff --git a/_sass/partials/_layout.scss b/_sass/partials/_layout.scss new file mode 100755 index 0000000..fa46ed5 --- /dev/null +++ b/_sass/partials/_layout.scss @@ -0,0 +1,544 @@ +body { + font-family: $roboto; + @include font-smoothing; +} + +a, button { + &:focus { + outline: none; + } +} + +.navbar { + &.normal { + min-height: 70px; + background: #223741; + border-radius: 0px; + box-shadow: 0px 1px 3px 1px rgba(46,46,46,0.3), inset rgba(255, 255, 255, 0.2) 0 1px 1px; + border: none; + z-index: 9999; + + .navbar-header { + .navbar-brand { + color: #fff; + padding: 25px 15px; + font-weight: 400; + font-size: 23px; + } + + .navbar-toggle { + margin-top: 17px; + } + } + + .navbar-collapse { + @media(min-width: 768px) { + text-align: center; + } + + .navbar-nav { + @media(min-width: 768px) { + float: none; + display: inline-block; + } + + > li { + float: none; + display: inline-block; + + @media(max-width: 767px) { + display: block; + } + + &.active { + > a { + background: none; + color: #fff; + } + } + + > a { + padding: 25px 20px; + color: #d5d5d5; + font-weight: 500; + z-index: 1001; + + @include transition(color 0.2s linear); + + @media(max-width: 767px) { + padding: 18px 20px; + } + + &:hover { + color: #fff; + } + } + + &.open { + ul.dropdown-menu { + a { + @media(max-width: 767px) { + color: #fff; + padding: 12px 18px 12px 30px; + } + } + } + } + + ul.dropdown-menu { + text-align: left; + padding: 9px 0; + + li a { + padding: 8px 18px; + } + } + } + + .button { + padding: 8px 18px; + font-size: 13px; + position: relative; + top: 17px; + + @media(max-width: 767px) { + box-shadow: none; + background: none; + top: 0; + margin-bottom: 20px; + color: #d5d5d5 !important; + font-size: 15px; + } + } + } + } + } + + &.hero { + margin: 0px; + border-radius: 0px; + border: 0px; + z-index: 999; + position: absolute; + width: 100%; + top: 0; + + @media (min-width: 768px) { + background: transparent; + padding-top: 10px; + + .navbar-nav >.active > a { + background: transparent; + color: #fff; + } + } + + .navbar-brand { + color: #fff; + font-weight: 400; + font-size: 26px; + } + + .navbar-nav { + > li { + &.dropdown > a .caret { + border-top-color: #EBEBEB; + } + + > a { + color: #fff; + font-size: 15px; + padding: 15px 20px; + font-weight: 500; + + @include transition(color 0.2s linear); + + &:hover { + color: #fff; + } + } + + &.open { + > a { + color: #fff !important; + background-color: rgba(0, 0, 0, 0.8); + border-radius: 4px 4px 0 0; + } + + ul.dropdown-menu { + a { + @media(max-width: 767px) { + color: #fff; + padding: 12px 18px 12px 30px; + } + } + } + } + + ul.dropdown-menu { + text-align: left; + background: rgba(0, 0, 0, 0.8); + box-shadow: none; + padding: 5px 0 8px 0; + border-radius: 4px 0 4px 4px; + border: 0px; + + li a { + color: #fff; + padding: 10px 18px; + + &:hover { + color: #e9e9e9; + background: none; + } + } + } + } + } + } + + &.white { + min-height: 70px; + margin-bottom: 0; + border-radius: 0; + border: 0; + z-index: 999; + + @media (min-width: 768px) { + background: #fff; + box-shadow: 0px 1px 5px rgba(0, 0, 0, .75); + } + + .container { + @media (min-width: 1200px) { + width: 1000px; + } + } + + .navbar-header { + .navbar-brand { + color: #333; + font-weight: 400; + font-size: 26px; + padding-top: 24px; + + @media (max-width: 767px) { + color: #fff; + font-size: 20px; + } + } + + .navbar-toggle { + margin-top: 17px; + } + } + + .navbar-collapse { + + @media(min-width: 768px) { + text-align: center; + } + + .navbar-nav { + @media(min-width: 768px) { + float: none; + display: inline-block; + } + + > li { + float: none; + display: inline-block; + + @media(max-width: 767px) { + display: block; + } + + &.active { + > a { + background: none; + color: #333; + } + } + + > a { + padding: 25px 20px; + color: #555; + z-index: 1001; + + @include transition(color 0.2s linear); + + &.signup { + border: 1px solid #CED7DF; + border-radius: 5px; + padding: 8px 11px; + font-size: 13px; + color: #333; + margin-left: 20px; + } + + @media(max-width: 767px) { + padding: 18px 20px; + color: #fff; + } + + .fa-chevron-down { + color: #777; + font-size: 8px; + margin-left: 2px; + position: relative; + top: -1px; + } + + &:hover { + color: #333; + + @media(max-width: 767px) { + color: #fff; + } + } + } + + &.open { + > a { + @media(min-width: 768px) { + background: #fff; + color: #333; + } + + .caret { + border-top-color: #999; + border-bottom-color: #999; + } + } + + ul.dropdown-menu { + a { + @media(max-width: 767px) { + color: #fff; + padding: 12px 18px 12px 30px; + } + } + } + } + + ul.dropdown-menu { + text-align: left; + border: 0; + padding: 0 0 10px; + box-shadow: 0 8px 12px rgba(0, 0, 0, 0.175); + + li a { + padding: 8px 18px; + } + } + } + } + } + } +} + +.main-footer { + background: #414B5B; + margin-top: 120px; + padding-top: 60px; + padding-bottom: 30px; + + @media(max-width: 991px) { + padding-top: 30px; + } + + .menu { + @media(max-width: 767px) { + text-align: center; + margin-top: 40px; + } + + h3 { + margin-top: 0; + color: #ced5e0; + text-transform: uppercase; + letter-spacing: 4px; + font-size: 14px; + font-weight: 600; + } + + ul { + list-style-type: none; + padding: 0; + margin-top: 30px; + + li { + display: block; + margin-bottom: 9px; + + a { + color: #fff; + display: inline-block; + font-weight: 500; + font-size: 13px; + + @include transition(all 0.2s linear); + + &:hover { + color: #f7f7f7; + text-decoration: none; + } + + @media(max-width: 991px) { + padding: 0; + } + } + + .hiring { + font-weight: 700; + letter-spacing: .3px; + text-transform: uppercase; + word-spacing: 1.5px; + font-size: 11px; + margin-left: 4px; + padding: 3px 8px; + border-radius: 4px; + color: #fff; + background: #49B7E2; + + &:hover { + color: #fff; + background: #0E82AF; + } + } + } + } + } + + .newsletter { + text-align: right; + + @media(max-width: 767px) { + text-align: center; + margin-top: 40px; + } + + .signup { + margin-bottom: 40px; + + p { + font-size: 13px; + color: #fff; + width: 90%; + float: right; + text-align: left; + line-height: 20px; + + @media(max-width: 767px) { + float: none; + text-align: center; + width: 100%; + } + } + + form { + float: right; + width: 90%; + position: relative; + + @media(max-width: 767px) { + float: none; + width: 100%; + } + + input[type="text"] { + font-size: 13px; + + @include placeholder { + font-size: 13px; + line-height: 17px; + } + } + + input[type="submit"] { + border: 0; + background: #84B0E2; + color: #FFF; + border-radius: 3px; + padding: 6px 10px; + position: absolute; + top: 5px; + text-shadow: 1px 1px rgba(0, 0, 0, 0.28); + right: 5px; + font-size: 13px; + + @include transition(all .2s linear); + + &:hover { + background: #6284AC; + } + } + } + } + + a { + border: 0; + text-decoration: none; + opacity: 1; + filter: alpha(opacity=100); + margin-left: 15px; + position: relative; + top: -10px; + + @include transition(all .3s ease); + + &:hover { + opacity: 0.7; + filter: alpha(opacity=70); + } + } + } + + .credits { + margin-top: 30px; + + .col-md-12 { + padding-top: 20px; + font-size: 13px; + text-align: center; + color: #a3aab5; + } + } + + &--white { + background: #fff; + margin-top: 0; + + .menu { + h3 { + color: #888; + } + + ul { + li { + a { + color: #89A1C0; + + &:hover { + color: #000; + } + } + } + } + } + + .newsletter { + .signup { + p { + color: #666; + } + } + } + + .credits { + .col-md-12 { + color: #A1AAB6; + } + } + } +} diff --git a/_sass/partials/pages/_404.scss b/_sass/partials/pages/_404.scss new file mode 100755 index 0000000..53a7330 --- /dev/null +++ b/_sass/partials/pages/_404.scss @@ -0,0 +1,124 @@ +.not-found-page { + height: 100%; + background: #3A4F68; + background: -moz-radial-gradient(center, ellipse cover, #4D6077 0%, #3A4F68 100%); + background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #4D6077), color-stop(100%, #3A4F68)); + background: -webkit-radial-gradient(center, ellipse cover, #4D6077 0%, #3A4F68 100%); + background: -o-radial-gradient(center, ellipse cover, #4D6077 0%, #3A4F68 100%); + background: -ms-radial-gradient(center, ellipse cover, #4D6077 0%, #3A4F68 100%); + background: radial-gradient(ellipse at center, #4D6077 0%, #3A4F68 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#4D6077', endColorstr = '#3A4F68', GradientType = 1); +} + +#not-found { + overflow: hidden; + + .info { + text-align: center; + padding-top: 100px; + + h1 { + color: #fff; + font-size: 13em; + margin-bottom: 20px; + font-weight: 200; + letter-spacing: -3px; + text-shadow: 1px 1px rgba(0, 0, 0, 0.35); + } + + p { + font-size: 23px; + color: #FFF; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.35); + margin-bottom: 0; + } + + .go-back { + font-size: 16px; + text-shadow: none; + color: #9BB2CE; + z-index: 999; + position: absolute; + left: 0; + right: 0; + padding: 25px 0; + max-width: 400px; + margin: auto; + margin-top: -15px; + + a { + color: #fff; + } + } + } + + #container { + canvas { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + } + } +} + +#not-found-alt { + overflow: hidden; + + .info { + text-align: center; + margin-top: 30px; + position: absolute; + width: 100%; + + h1 { + color: #fff; + font-size: 11em; + margin-bottom: 20px; + font-weight: 200; + letter-spacing: -3px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.15); + } + + p { + font-size: 25px; + color: #4D728A; + margin-bottom: 0; + } + + .go-back { + font-size: 16px; + text-shadow: none; + letter-spacing: 0px; + color: #506379; + z-index: 999; + position: absolute; + left: 0; + right: 0; + padding: 25px 0; + max-width: 400px; + margin: auto; + margin-top: -15px; + + a { + color: #429AD5; + text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.4); + font-size: 18px; + } + } + } + + canvas { + background: linear-gradient(hsl(200, 50%, 80%) 0%, hsl(200, 30%, 95%) 75%); + display: block; + } + + #container { + height: 100%; + left: 0; + position: fixed; + top: 0; + width: 100%; + } +} diff --git a/_sass/partials/pages/_aboutus.scss b/_sass/partials/pages/_aboutus.scss new file mode 100755 index 0000000..a022974 --- /dev/null +++ b/_sass/partials/pages/_aboutus.scss @@ -0,0 +1,151 @@ +.about-us-slider { + margin-top: 60px; + + .header { + text-align: left; + + h3 { + font-size: 26px; + color: #444; + line-height: 25px; + font-weight: 500; + } + + p { + font-size: 15px; + font-weight: 400; + color: #666; + margin-top: 20px; + line-height: 24px; + + @media(min-width: 992px) { + width: 48%; + } + } + } + + .flexslider { + margin-top: 40px; + box-shadow: none; + border-radius: 0px; + + .slides { + img { + max-height: 400px; + } + } + + .flex-control-paging { + bottom: -35px; + + li { + margin: 0 7px; + + a { + background: #e6e6e6; + box-shadow: inset 0 0 2px rgba(0,0,0,0.3); + + @include transition(all 0.2s linear); + + &.flex-active { + background: #3785b9; + } + } + } + } + } +} + +.about-us-team { + margin-top: 40px; + + h1 { + font-size: 24px; + color: #444; + line-height: 25px; + font-weight: 500; + margin-bottom: 25px; + } + + p { + color: #666; + line-height: 23px; + margin-bottom: 15px; + + @media(min-width: 992px) { + width: 88%; + } + } + + .join-team { + padding: 8px 26px; + font-size: 13px; + margin-top: 10px; + } + + .stats { + margin-top: 60px; + font-size: 16px; + color: #757575; + + strong { + font-size: 33px; + color: #656565; + font-weight: 500; + position: relative; + top: 1px; + margin-right: 5px; + } + + .col-sm-3 { + border-bottom: 1px solid #efefef; + padding-bottom: 25px; + + @media(max-width: 767px) { + padding-bottom: 10px; + margin-bottom: 20px; + } + } + } + + .team { + margin-top: 90px; + + .team-row { + text-align: center; + margin-bottom: 35px; + } + + img { + margin: 0px 20px; + max-width: 90px; + border-radius: 10px; + position: relative; + top: 0px; + box-shadow: 0px 2px 1px 0px rgba(0, 0, 0, 0.4); + + @include transition(top 0.15s linear); + + @media(max-width: 991px) { + margin: 0px 10px 20px 0; + } + + &:hover { + top: -5px; + box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.5); + } + } + + .tooltip-inner { + padding: 12px 18px; + font-size: 13px; + background: rgba(0, 0, 0, .8); + border: 1px solid #000; + border-bottom: 0px; + } + + .tooltip-arrow { + border-top-color: rgba(0, 0, 0, .8); + } + } +} diff --git a/_sass/partials/pages/_blog.scss b/_sass/partials/pages/_blog.scss new file mode 100755 index 0000000..a11125f --- /dev/null +++ b/_sass/partials/pages/_blog.scss @@ -0,0 +1,235 @@ +.blog-posts { + margin-top: 60px; + + .post { + margin-bottom: 90px; + + .pic { + border: 0px; + + &:hover { + img { + opacity: 0.9; + filter: alpha(opacity=90); + } + } + + img { + opacity: 1; + filter: alpha(opacity=100); + @include transition(all 0.25s linear); + + @media(max-width: 991px) { + margin: 0 auto; + } + } + } + + .video { + @media(min-width: 992px) { + max-width: 635px; + } + + /* make video fluid for responsiveness */ + .iframe-wrapper { + position: relative; + padding-bottom: 56%; + height: 0; + + iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + } + } + + .title { + font-family: $myriad; + font-size: 28px; + font-weight: 600; + margin-top: 33px; + + @media(max-width: 991px) { + text-align: center; + margin-bottom: 20px; + } + + @media(max-width: 767px) { + font-size: 23px; + } + + a { + color: #111; + + @include transition(color 0.15s linear); + + &:hover { + text-decoration: none; + color: #428bca; + } + } + } + + .author { + color: #888; + margin-top: 4px; + position: relative; + + .avatar { + max-width: 60px; + border-radius: 50px; + position: absolute; + left: -75px; + top: -15px; + border: 1px solid #e0e0e0; + } + } + + .intro { + font-family: $sourceSans; + margin-top: 18px; + font-size: 16px; + line-height: 27px; + color: #4d4d4d; + + @media(min-width: 992px) { + width: 90%; + } + } + + .continue-reading { + font-family: $sourceSans; + font-size: 15px; + display: inline-block; + margin-top: 8px; + @include transition(color 0.25s linear); + } + } + + .pages { + @media(max-width: 991px) { + text-align: center; + } + } + + .sidebar { + @media(max-width: 991px) { + margin-top: 70px; + text-align: center; + } + + .search { + margin-bottom: 40px; + + form { + position: relative; + left: -20px; + } + + .icomoon-search { + font-size: 16px; + color: #B9B9B9; + position: relative; + left: 25px; + top: 1px; + + @include transition(all 0.25s linear); + + &.active { + color: #555; + } + } + + input { + border: 0px; + border-bottom: 1px solid #DFDFDF; + padding-left: 30px; + padding-bottom: 6px; + @include transition(all 0.25s linear); + color: #777; + font-weight: 300; + + @media(max-width: 991px) { + width: 95%; + } + + &:focus { + border-bottom-color: #888; + } + + @include placeholder { + color: #a5a5a5; + font-weight: 300; + font-size: 13px; + } + } + } + + .updates { + padding: 17px; + box-shadow: 0px 0px 3px 0px rgba(0, 0, 0, 0.2); + border-radius: 5px; + + @media(min-width: 992px) { + width: 85%; + } + + strong { + color: #444; + } + + .fa-rss { + color: #428bca; + font-size: 16px; + position: relative; + margin-left: 5px; + } + + p { + font-size: 13px; + margin-top: 9px; + color: #777; + margin-bottom: 5px; + } + } + + .follow-tw { + margin-top: 20px; + + img { + cursor: pointer; + } + } + + .best-hits { + margin-top: 35px; + padding-left: 5px; + + @media(max-width: 991px) { + margin-top: 40px; + } + + strong { + font-weight: 500; + color: #444; + margin-bottom: 15px; + font-size: 15px; + display: block; + } + + a { + font-size: 13px; + display: inline-block; + margin-bottom: 5px; + + @media(max-width: 991px) { + display: block; + margin-bottom: 10px; + } + } + } + } +} diff --git a/_sass/partials/pages/_blog_cols.scss b/_sass/partials/pages/_blog_cols.scss new file mode 100755 index 0000000..2db7689 --- /dev/null +++ b/_sass/partials/pages/_blog_cols.scss @@ -0,0 +1,134 @@ +.blog-cols-page { + background: #FCFCFC; +} + +.blog-cols-header { + margin-top: 60px; + position: relative; + + h1 { + font-size: 23px; + margin-top: 0; + color: #555; + } + + p { + color: #757575; + font-size: 17px; + margin-top: 12px; + } +} + +.blog-cols-wrapper { + margin-top: 40px; + + @media(max-width: 767px) { + text-align: center; + } + + .card { + display: inline-block; + + @media(min-width: 992px) { + &:nth-child(3n+3) { + .card-wrapper { + margin: 20px 0; + } + } + } + + @media(min-width: 768px) and (max-width: 991px) { + &:nth-child(2n+2) { + .card-wrapper { + margin: 20px 0; + } + } + } + + .card-wrapper { + display: inline-block; + position: relative; + width: 295px; + background-color: #fff; + vertical-align: top; + text-align: left; + color: #4B4F56; + height: 480px; + margin: 20px 20px 20px 0; + box-shadow: 0 20px 20px rgba(0,0,0,.08); + + @include transition(all 250ms cubic-bezier(.02, .01, .47, 1)); + + @media(max-width: 991px) { + width: 340px; + } + + @media(max-width: 767px) { + margin: 20px 0; + width: 290px; + } + + &:hover { + box-shadow: 0 40px 40px rgba(0,0,0,.16); + transform: translate(0,-20px); + } + } + + .card-bg { + background-size: cover; + background-position: center center; + background-repeat: no-repeat; + width: 100%; + height: 295px; + + @media(max-width: 1199px) { + height: 260px; + } + } + + .card-intro { + padding: 20px 20px 0; + } + + .card-title { + font-size: 22px; + line-height: 32px; + } + + .card-min-read { + margin-top: 5px; + font-size: 12px; + color: #777; + } + + .card-description { + font-size: 15px; + margin-top: 13px; + line-height: 23px; + color: #90949C; + } + } +} + +.blog-pager { + margin-top: 80px; + + li>a { + padding: 9px 20px; + box-shadow: 0 1px 0px 0 rgba(0, 0, 0, 0.15); + border-radius: 30px; + margin: 0 10px; + font-weight: 500; + font-size: 15px; + color: #5F8AB0; + display: inline-block; + + @include transition(all .2s linear); + + &:hover { + background-color: #4a556b; + color: #fff; + box-shadow: none; + } + } +} diff --git a/_sass/partials/pages/_blog_timeline.scss b/_sass/partials/pages/_blog_timeline.scss new file mode 100755 index 0000000..bcd4859 --- /dev/null +++ b/_sass/partials/pages/_blog_timeline.scss @@ -0,0 +1,317 @@ +.timeline-page { + background: #f7f8fa; +} + +.blog-timeline-header { + margin-top: 55px; + position: relative; + + h1 { + text-align: center; + text-transform: uppercase; + font-weight: 500; + font-size: 24px; + margin-top: 0; + letter-spacing: 1px; + + a { + color: #222; + text-decoration: none; + } + } + + .slogan { + text-align: center; + color: #777; + font-size: 16px; + } +} + +.blog-timeline-wrapper { + margin-top: 40px; + position: relative; + + &:before { + content: ''; + position: absolute; + background: #e7e8ec; + width: 5px; + height: 96%; + left: 0; + right: 0; + top: 95px; + margin: 0 auto; + z-index: -1; + } + + .post { + position: relative; + float: right; + clear: right; + width: 44%; + margin: 40px 0; + border-radius: 5px; + + @media(max-width: 767px) { + width: 100%; + } + + &:before { + content: ''; + position: absolute; + width: 70px; + height: 4px; + background: #E7E8EC; + left: -60px; + top: 62px; + + @media(max-width: 991px) { + left: -42px; + width: 43px; + } + + @media(max-width: 767px) { + display: none; + } + } + + &:nth-child(2) { + margin-top: 100px; + } + + &.left { + float: left; + clear: left; + + &:before { + right: -51px; + left: inherit; + + @media(max-width: 991px) { + right: -42px; + width: 43px; + } + } + + .marker { + left: inherit; + right: -65px; + + @media(max-width: 991px) { + right: -52px; + } + } + } + + .marker { + position: absolute; + width: 17px; + height: 17px; + border-radius: 25px; + background: #e7e8ec; + left: -65px; + top: 55px; + border: 3px solid #F7F8FA; + + @media(max-width: 991px) { + left: -51px; + } + + @media(max-width: 767px) { + display: none; + } + } + + .entry { + position: relative; + padding: 20px; + height: 400px; + background-size: cover; + background-position: center center; + border-radius: 5px; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.26); + + &:before { + position: absolute; + top: 50%; + bottom: 0; + left: 0; + right: 0; + content: ''; + border-radius: 0 0 5px 5px; + background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.94) 100%); + background: -moz-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.94) 100%); + background: -o-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.94) 100%); + background: linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.94) 100%); + } + + &.smallish { + height: 320px; + + .intro { + top: 68%; + } + } + + .intro { + position: relative; + top: 75%; + color: #FFF; + z-index: 9; + letter-spacing: .3px; + + h4 { + font-size: 19px; + font-weight: 600; + text-transform: uppercase; + text-shadow: 1px 1px rgba(0, 0, 0, 0.4); + letter-spacing: .5px; + + @media(max-width: 767px) { + font-size: 17px; + } + } + + p { + @media(max-width: 767px) { + font-size: 13px; + } + } + } + } + + .news { + position: relative; + background-size: cover; + background-position: center center; + border-radius: 5px; + box-shadow: 0 1px 5px rgba(12, 26, 36, 0.25); + background: #fff; + + .author { + position: absolute; + left: 0; + top: -35px; + right: 0; + text-align: center; + + img { + border-radius: 50%; + width: 68px; + } + } + + section { + padding: 60px 25px 75px 25px; + + h3 { + margin-top: 0; + + a { + color: #333; + text-decoration: none; + font-size: 21px; + text-align: center; + display: block; + line-height: 31px; + + @include transition(all .15s); + + &:hover { + color: #459CE7; + } + } + } + + p { + margin-top: 21px; + line-height: 24px; + color: #555; + } + + a.read-more { + position: relative; + text-decoration: none; + display: inline-block; + margin-top: 10px; + font-size: 15px; + + @include transition(all .2s); + + &:hover { + &:after { + right: -18px; + } + } + + &:after { + content: "▸"; + position: absolute; + right: -15px; + top: 0; + + @include transition(all .2s); + } + } + } + + footer { + position: absolute; + bottom: 0; + padding: 12px 25px; + width: 100%; + font-weight: 500; + background: #EEF1F4; + color: #92A2B2; + + .tag { + position: relative; + padding-left: 27px; + text-transform: uppercase; + font-weight: 600; + letter-spacing: 1px; + font-size: 11px; + top: 3px; + + span { + font-size: 24px; + position: absolute; + top: -7px; + left: 0; + } + } + + .date { + font-weight: 600; + font-size: 14px; + } + } + } + } + + .pager { + text-align: center; + margin-top: 50px; + margin-bottom: 0; + + a { + display: inline-block; + position: relative; + top: -10px; + background: #E7E8EC; + text-decoration: none; + text-transform: uppercase; + font-weight: 600; + letter-spacing: 1px; + padding: 6px 23px; + border-radius: 3px; + color: #444; + + @include transition(all .2s); + + &:hover { + box-shadow: 0 6px 15px -1px rgba(0, 0, 0, 0.15); + } + } + } +} diff --git a/_sass/partials/pages/_blogpost.scss b/_sass/partials/pages/_blogpost.scss new file mode 100755 index 0000000..aed421f --- /dev/null +++ b/_sass/partials/pages/_blogpost.scss @@ -0,0 +1,190 @@ +.blog-post-hero { + height: 500px; + background-image: url('../../images/photo-1470753937643-efeb931202a9.jpeg'); + background-size: cover; + background-position: center center; + position: relative; + top: -20px; + + @media(max-width: 991px) { + height: 400px; + } + + &:after { + content: ''; + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 0; + background: rgba(64, 64, 64, 0.5); + } + + .container { + position: relative; + z-index: 1; + text-align: center; + } + + h1 { + width: 60%; + margin: 190px auto 0; + color: #fff; + font-family: $karla; + font-size: 38px; + line-height: 46px; + text-shadow: 1px 1px rgba(0, 0, 0, 0.2); + + @media(max-width: 991px) { + margin-top: 150px; + font-size: 35px; + line-height: 40px; + width: 70%; + } + + @media(max-width: 767px) { + width: 100%; + font-size: 28px; + line-height: 35px; + } + } +} + +.blog-post-author { + color: #888; + display: inline-block; + + img { + border-radius: 100%; + width: 55px; + margin-right: 17px; + position: relative; + top: -2px; + } + + span { + color: #333; + } +} + +.blog-post-date { + display: inline-block; + margin-left: 35px; + color: #888; + + @media(max-width: 767px) { + margin-left: 15px; + } + + span { + color: #333; + } +} + +.blog-post-share { + float: right; + color: #888; + + @media(max-width: 767px) { + float: none; + } + + a { + margin-left: 13px; + position: relative; + top: 3px; + text-decoration: none; + } + + i { + font-size: 25px; + + &.ion-social-twitter { + color: #1da1f2; + } + + &.ion-social-facebook { + color: #3b5998; + font-size: 28px; + margin-right: 3px; + } + + &.ion-social-buffer { + color: #2d2d2d; + } + } +} + +.blog-post-wrapper { + margin-top: 30px; + + .post { + float: none; + margin: 0 auto; + margin-bottom: 50px; + + .title { + font-size: 31px; + font-weight: 600; + margin-top: 40px; + color: #252525; + + @media(max-width: 767px) { + font-size: 26px; + line-height: 28px; + } + } + + .content { + margin-top: 45px; + font-size: 15px; + line-height: 30px; + color: #454545; + margin-bottom: 25px; + + p { + margin-top: 28px; + } + + blockquote { + border-left: 2px solid #c0c9dc; + color: rgba(51, 51, 51, 0.55); + margin: 35px 0; + padding: 5px 20px; + padding-left: 23px; + + p { + margin: 0; + line-height: 30px; + font-weight: normal; + } + + .quote-author { + margin-top: 14px; + } + } + + img { + margin: 0 auto; + margin-top: 55px; + margin-bottom: 55px; + } + + .divider { + border-bottom: 1px solid #DEDEDC; + width: 20%; + margin: 0 auto; + margin-top: 35px; + margin-bottom: 35px; + } + } + + .share { + margin-top: 50px; + } + + .other-posts { + margin-top: 50px; + } + } +} diff --git a/_sass/partials/pages/_charts.scss b/_sass/partials/pages/_charts.scss new file mode 100755 index 0000000..f447420 --- /dev/null +++ b/_sass/partials/pages/_charts.scss @@ -0,0 +1,325 @@ +.pricing-tabs-section { + margin-top: 60px; + + .header { + text-align: center; + + h3 { + font-size: 23px; + color: #444; + line-height: 25px; + font-weight: 500; + } + + p { + font-size: 16px; + font-weight: 400; + color: #888; + } + } + + .tabs { + background: #F8F8F8; + text-align: center; + border-radius: 3px; + margin-top: 40px; + + .tab { + background-color: #F8F8F8; + font-weight: 500; + font-size: 15px; + color: #555; + display: inline-block; + padding: 18px 25px; + margin-top: 10px; + cursor: pointer; + + @include transition(background-color 0.2s linear); + + &.anually { + padding: 18px 18px 18px 23px; + } + + &.active { + background-color: #fff; + border: 1px solid #E8E8E8; + border-radius: 5px 5px 0px 0px; + border-bottom: 0px; + } + + span { + position: relative; + top: -2px; + } + + small { + color: #32ACDA; + margin-left: 3px; + } + } + } + + .plans { + margin-top: 30px; + border: 1px solid #E3E3E3; + border-radius: 5px; + + .plan { + border-right: 0px; + min-height: 220px; + + &.middle { + border-right: 1px solid #E3E3E3; + border-left: 1px solid #E3E3E3; + } + + .header { + text-align: left; + padding: 18px 25px; + border-bottom: 1px solid #E3E3E3; + margin: 0px -15px; + font-weight: 500; + font-size: 15px; + + .icon { + color: #B7C5D8; + font-size: 18px; + position: relative; + top: 2px; + left: -4px; + } + + .price { + float: right; + color: #3CA2E5; + } + } + + .specs { + margin-top: 25px; + padding: 0px 10px 17px 10px; + + .spec { + font-size: 15px; + color: #666; + margin-bottom: 13px; + + .variable { + color: #1FBEE7; + font-weight: 400; + } + } + } + } + } + + .signup { + margin-top: 50px; + text-align: center; + + .button { + padding: 16px 38px; + font-size: 15px; + + @include background-gradient(#4ABCF3, #1a80d9); + } + + .message { + text-align: center; + margin-top: 20px; + font-size: 12px; + color: #888; + } + } +} + +.pricing-comparison-section { + .divider { + height: 1px; + width: 100%; + background-color: #ddd; + position: relative; + margin: 120px 0 60px; + + &:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 2px; + background-image: -webkit-gradient(linear, left top, right top, color-stop(0, rgba(255, 255, 255, 0.75)), color-stop(0.5, rgba(250,250,250,0)), color-stop(1, rgba(255, 255, 255, 0.75))); + background-image: -webkit-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250,250,250,0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -moz-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250,250,250,0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -o-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250,250,250,0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -ms-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250,250,250,0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250,250,250,0) 50%, rgba(255, 255, 255, 0.75) 100%); + } + } + + .header { + text-align: center; + + h3 { + font-size: 24px; + color: #444; + line-height: 25px; + font-weight: 500; + } + + p { + font-size: 16px; + font-weight: 400; + color: #888; + } + } + + .chart { + margin-top: 40px; + border: 1px solid #dfdfdf; + border-radius: 5px; + box-shadow: 0px 2px 3px 1px rgba(0, 0, 0, 0.1); + + .header { + text-align: center; + background: #fbfbfb; + margin: 0px -15px; + padding: 20px 35px; + font-weight: 500; + font-size: 17px; + color: #444; + border-bottom: 1px solid #dfdfdf; + height: 73px; + + @media(max-width: 991px) { + font-size: 15px; + } + + @media(max-width: 767px) { + font-size: 13px; + } + + .price { + color: #1a80d9; + position: relative; + top: 3px; + font-size: 14px; + + @media(max-width: 767px) { + font-size: 13px; + } + } + } + + .features-col { + .header { + text-align: left; + border-radius: 5px 0px 0px 0px; + margin-bottom: 30px; + padding: 23px 30px; + font-size: 18px; + + @media(max-width: 991px) { + font-size: 16px; + } + } + + .spec { + margin-bottom: 32px; + padding-left: 40px; + position: relative; + + .icon { + position: absolute; + font-size: 27px; + color: #849FC4; + left: 0px; + top: -4px; + } + } + } + + .plan-col { + border-left: 1px solid #dfdfdf; + + &.last { + .header { + border-radius: 0px 5px 0px 0px; + } + } + + .header { + padding: 13px 0px; + } + + .spec { + margin-bottom: 34px; + margin-top: 25px; + + .check { + margin: 0 auto; + display: block; + max-width: 20px; + } + } + + .button { + margin-top: 20px; + margin-bottom: 15px; + font-size: 13px; + padding: 11px 24px; + + @include background-gradient(#4ABCF3, #1a80d9); + + @media(max-width: 991px) { + padding: 6px 10px; + text-align: center; + } + } + } + } + + .message { + p { + text-align: center; + font-size: 13px; + color: #656565; + margin-top: 30px; + } + } + + .faq { + margin-top: 50px; + + .header h3 { + font-size: 20px; + color: #454545; + text-align: left; + } + + .questions { + margin-top: 25px; + + .question { + margin-bottom: 40px; + + @media(min-width: 992px) { + width: 90%; + } + + strong { + font-weight: 500; + font-size: 16px; + color: #454545; + } + + p { + color: #555; + margin-top: 10px; + font-size: 13px; + line-height: 22px; + } + } + } + } +} diff --git a/_sass/partials/pages/_coming_soon.scss b/_sass/partials/pages/_coming_soon.scss new file mode 100755 index 0000000..9da4db3 --- /dev/null +++ b/_sass/partials/pages/_coming_soon.scss @@ -0,0 +1,275 @@ +.coming-soon-page { + border-top: 5px solid #4DB2E7; + height: 100vh; + background: #fff; + background: -moz-radial-gradient(center, ellipse cover, #fff 0%, #F4F9FF 100%); + background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #fff), color-stop(100%, #F4F9FF)); + background: -webkit-radial-gradient(center, ellipse cover, #fff 0%, #F4F9FF 100%); + background: -o-radial-gradient(center, ellipse cover, #fff 0%, #F4F9FF 100%); + background: -ms-radial-gradient(center, ellipse cover, #fff 0%, #F4F9FF 100%); + background: radial-gradient(ellipse at center, #fff 0%, #F4F9FF 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#fff', endColorstr = '#F4F9FF', GradientType = 1); + + &.dark { + border-top: 5px solid #DAEEF8; + background: #4D576D !important; + + .info { + a { + color: #fff; + } + + h3 { + color: #fff; + font-weight: 300; + } + } + + #countdown { + #clock { + .flip-clock-divider { + .flip-clock-label { + color: #fff; + } + } + } + } + + form { + .button { + display: inline-block; + vertical-align: middle; + zoom: 1; + color: #fff; + padding: 9px 27px; + border: 2px solid #fff; + border-radius: 4px; + font-size: 15px; + font-weight: 400; + background: rgba(0, 0, 0, 0.08); + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: none; + + @include transition(all 0.2s linear); + + &:hover { + text-decoration: none; + color: #ddd; + border-color: #ddd; + } + } + } + + .social { + .ion { + span { + color: #AEDCFF; + } + } + } + } + + .skins-nav { + opacity: 1; + @include transition(left .3s); + position: fixed; + left: -40px; + top: 135px; + font-size: 13px; + z-index: 9999; + + &:hover { + left: 0px; + } + + a { + display: block; + color: #FFF; + text-decoration: none; + padding-right: 30px; + height: 37px; + border-radius: 0 4px 4px 0; + margin-bottom: 3px; + @include transition(all .5s); + text-align: right; + position: relative; + box-shadow: inset 0 1px rgba(255, 255, 255, 0.21); + + &.light { + background: #9BD4F5; + } + + &.dark { + background: #444; + } + + &.active { + .ion { + display: block; + } + } + + .text { + white-space: nowrap; + display: block; + width: 85px; + position: relative; + top: 9px; + @include transition(width .2s); + } + + .ion { + position: absolute; + top: 11px; + right: 8px; + display: none; + } + } + } + + .info { + margin-top: 60px; + text-align: center; + color: #fff; + + a { + color: #5F5F5F; + text-decoration: none; + font-family: $myriad; + font-size: 46px; + + &:hover { + text-decoration: none; + } + } + + h3 { + text-align: center; + color: #4DB2E7; + text-transform: uppercase; + letter-spacing: 2px; + font-weight: 400; + font-size: 18px; + margin-top: 25px; + } + } + + #countdown { + margin-top: 35px; + + #clock { + width: 100%; + margin: 0 auto; + + @media(min-width: 992px) { + width: 47%; + } + + @media(max-width: 991px) { + max-width: 142px; + + ul { + margin-bottom: 50px; + } + + .flip-clock-divider { + height: inherit; + display: block; + + &:before, + &:after { + display: table; + content: ""; + } + + &.minutes, + &.seconds { + .flip-clock-label { + right: -74px !important; + } + } + + .flip-clock-label { + bottom: -8.5em !important; + } + } + } + + .flip-clock-divider { + + &.minutes, + &.seconds { + .flip-clock-label { + right: -102px; + } + } + + .flip-clock-label { + color: #555; + bottom: -1.5em; + top: inherit; + right: -92px; + font-size: 15px; + } + + .flip-clock-dot { + display: none; + } + } + } + } + + form { + margin-top: 110px; + text-align: center; + + @media(max-width: 767px) { + margin-top: 70px; + } + + input[type="email"] { + width: 250px; + height: 43px; + + @media(max-width: 767px) { + margin: 0 auto; + } + } + + .button { + @include background-gradient(#38BAFF, #37ADEB); + padding: 10px 19px; + font-size: 15px; + font-weight: 500; + border: 1px solid #54AEF5; + } + } + + .social { + margin-top: 100px; + text-align: center; + margin-bottom: 20px; + + .ion { + font-size: 34px; + margin: 0 10px; + display: inline-block; + + span { + color: #9DBDD6; + } + + .ion-social-twitter { + } + + .ion-social-facebook { + font-size: 25px; + } + } + + .tm { + margin-top: 15px; + color: #B1B9C4; + } + } +} diff --git a/_sass/partials/pages/_contactus.scss b/_sass/partials/pages/_contactus.scss new file mode 100755 index 0000000..8b15968 --- /dev/null +++ b/_sass/partials/pages/_contactus.scss @@ -0,0 +1,177 @@ +.contact-us-map { + position: relative; + top: -20px; + box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.35); + + #map { + height: 450px; + width: 100%; + } + + #directions { + position: absolute; + top: 50px; + left: 13%; + text-align: center; + width: 300px; + background: rgba(255, 255, 255, 0.9); + border-radius: 5px; + box-shadow: 0px 4px 15px 0px rgba(0, 0, 0, 0.2); + padding: 30px 20px 30px 20px; + + @media(max-width: 767px) { + display: none; + } + + p { + font-size: 19px; + color: #333; + margin-bottom: 15px; + } + + button { + margin-top: 15px; + } + } +} + +.contact-us-info { + margin-top: 50px; + + .message { + h3 { + color: #444; + font-size: 24px; + font-weight: 500; + } + + p { + font-size: 15px; + font-weight: 400; + color: #777; + } + + form { + margin-top: 35px; + width: 80%; + + @media(max-width: 767px) { + width: 100%; + } + + input[type="text"], + input[type="email"] { + width: 70%; + + @media(max-width: 767px) { + width: 100%; + } + } + + label { + color: #555; + font-weight: 500; + margin-bottom: 7px; + } + + .button { + margin-top: 20px; + } + + /* error messages from jquery validate */ + label.error { + position: relative !important; + display: inline-block !important; + margin-top: -2px !important; + margin-bottom: -8px !important; + color: #fff !important; + font-weight: normal !important; + font-size: 15px !important; + padding: 5px 7px !important; + background: #4B9FCF !important; + border-radius: 4px !important; + + &.valid { + display: none !important; + } + + &:after { + bottom: 100%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; + border-bottom-color: #4B9FCF; + border-width: 5px; + left: 30px; + margin-left: -5px; + } + } + } + } + + .contact { + @media(max-width: 991px) { + margin-top: 50px; + } + + .address { + margin-bottom: 30px; + } + + h3 { + color: #444; + font-size: 18px; + font-weight: 500; + } + + p { + font-size: 15px; + font-weight: 400; + color: #777; + } + + .online-support { + background: #f8fdfe; + border: 1px solid #bee1f3; + margin-top: 40px; + border-radius: 6px; + padding: 20px 22px 18px 22px; + width: 70%; + + strong { + font-weight: 500; + color: #333; + font-size: 15px; + } + + p { + color: #1f95d0; + margin-top: 14px; + line-height: 18px; + } + } + + .social { + margin-top: 25px; + + a { + border: 0px; + + @include transition(all 0.2s linear); + + &.tw { + position: relative; + top: 2px; + } + + &:hover { + opacity: 0.8; + filter: alpha(opacity=80); + } + } + } + } +} diff --git a/_sass/partials/pages/_docs.scss b/_sass/partials/pages/_docs.scss new file mode 100755 index 0000000..d11bfac --- /dev/null +++ b/_sass/partials/pages/_docs.scss @@ -0,0 +1,306 @@ +#docs { + + #guide { + background: #F4F8FA; + border-right: 1px solid #DADFE5; + left: 0; + top: 0; + position: fixed; + overflow: hidden; + overflow-y: auto; + width: 210px; + z-index: 25; + height: 100%; + + .logo { + margin-top: 0; + font-size: 29px; + + a { + color: #000; + font-family: $myriad; + padding: 20px 0 15px 23px; + display: block; + border-bottom: 1px solid #D6DCE0; + box-shadow: 0px 1px #FFF; + @include transition(color .15s linear); + + &:hover { + color: #858585; + text-decoration: none; + } + } + } + + .menu { + > li { + + &.active { + > .nav { + display: block; + } + + > a { + background: #DEEAF1; + } + } + + a { + color: #3391C9; + font-weight: 500; + font-size: 13px; + padding: 10px 15px 10px 25px; + + @include transition(all .15s linear); + + &:hover { + background: #DEEAF1; + } + } + + > .nav { + margin-bottom: 7px; + display: none; + + li { + a { + font-weight: 400; + color: #48A0D6; + padding: 6px 15px 5px 35px; + } + } + } + } + } + } + + + #api-docs { + background: #FFF; + margin-left: 210px !important; + min-width: 750px; + + #methods { + background: #292E33; + position: relative; + margin-left: 50%; + + .languages { + position: fixed; + top: 0; + width: 100%; + padding: 5px 0 5px 20px; + background: #3B4249; + box-shadow: 2px 1px 3px #000; + z-index: 999; + + .language { + display: inline-block; + color: #C0CEDD; + padding: 5px 15px; + font-size: 13px; + + &.selected { + color: #fff; + } + } + } + + .method { + + /*&:nth-child(2) {*/ + /*.method-section {*/ + /*.method-description {*/ + /*padding-top: 0px;*/ + /*border-top: 0px;*/ + /*}*/ + + /*.method-example {*/ + /*padding-top: 35px;*/ + /*border-top: 0;*/ + /*box-shadow: none;*/ + /*}*/ + /*}*/ + /*}*/ + + &:last-child { + .method-section { + padding-bottom: 70px; + } + } + + .method-section { + margin-left: -100%; + position: relative; + padding-top: 50px; + + .method-description { + width: 50%; + float: left; + padding: 0 30px; + border-top: 1px solid #E5E7EB; + padding-top: 40px; + + h3 { + font-size: 21px; + margin-top: 0; + margin-bottom: 20px; + } + + p { + font-size: 13px; + color: #666; + line-height: 21px; + margin-bottom: 20px; + } + + .info { + margin-top: 45px; + margin-bottom: 40px; + + h4 { + font-size: 14px; + border-bottom: 1px solid #E4E4E4; + padding-bottom: 15px; + } + + .field { + margin-top: 17px; + font-size: 13px; + + .key { + width: 40%; + float: left; + text-align: right; + padding-right: 10px; + font-weight: bold; + color: #333; + } + + .desc { + width: 60%; + float: right; + padding-left: 10px; + color: #555; + line-height: 21px; + + strong { + display: block; + color: #333; + margin-bottom: 5px; + } + } + } + } + } + + .method-example { + margin-left: 50%; + width: 50%; + padding: 0px 30px 0; + border-top: 1px solid #000; + box-shadow: inset 0px 1px rgba(255, 255, 255, 0.17); + color: #fff; + + pre { + background: none; + border: none; + margin: 0; + padding: 20px; + + code { + background: none; + font-family: Monaco, Consolas, Menlo; + font-size: 14px; + + &.always-visible { + display: block !important; + } + + &.ruby { + display: block; + } + + color: #DAE4F2; + + /*> * {*/ + /*color: #DAE4F2;*/ + /*line-height: 20px;*/ + /*}*/ + } + + .ruby { + /*color: #DAE4F2;*/ + + /*> * {*/ + /*color: #DAE4F2;*/ + /*line-height: 20px;*/ + /*}*/ + + /*[class*=keyword] {*/ + /*color: #9AB4DB;*/ + /*}*/ + /*[class*=string] {*/ + /*color: #DAD0C6;*/ + /*}*/ + /*[class*=comment] {*/ + /*color: #B4B4B4;*/ + /*}*/ + /*[class*=constant] {*/ + /*color: #FFDF9D;*/ + /*}*/ + /*[class*=symbol] {*/ + /*color: #9ECBEE;*/ + /*}*/ + } + .python { + color: #DAE4F2; + + > * { + color: #DAE4F2; + line-height: 20px; + } + + [class*=keyword] { + color: #9AB4DB; + } + [class*=string] { + color: #DAD0C6; + } + [class*=comment] { + color: #B4B4B4; + } + [class*=class] { + color: #FFDF9D; + } + [class*=params] { + color: #9ECBEE; + } + } + .php { + color: #DAE4F2; + + > * { + color: #DAE4F2; + line-height: 20px; + } + + [class*=keyword] { + color: #9AB4DB; + } + [class*=string] { + color: #DAD0C6; + } + [class*=comment] { + color: #B4B4B4; + } + } + } + } + } + } + } + } +} + + diff --git a/_sass/partials/pages/_features.scss b/_sass/partials/pages/_features.scss new file mode 100755 index 0000000..c21d300 --- /dev/null +++ b/_sass/partials/pages/_features.scss @@ -0,0 +1,250 @@ +.features-tabs-section { + margin-top: 60px; + + @media(max-width: 991px) { + margin-bottom: 20px; + } + + .header { + text-align: center; + + h3 { + font-size: 23px; + color: #55565d; + line-height: 25px; + font-weight: 500; + } + + p { + font-size: 16px; + font-weight: 400; + color: #888; + } + } + + .tabs-wrapper { + margin-top: 45px; + + .nav-tabs { + text-align: center; + border-bottom: 2px solid #EDEDED; + + @media(max-width: 991px) { + display: none; + } + + li { + float: none; + display: inline-block; + + &.active { + a { + color: #2B69A2; + font-weight: 400; + border-bottom: 0px; + + &:after { + content: ''; + position: absolute; + width: 100%; + height: auto; + border-bottom: 2px solid #7BA3C9; + left: 1px; + bottom: -1px; + } + } + } + + a { + color: #888; + font-weight: 400; + border: 0px; + padding: 10px 20px; + font-size: 15px; + + @include transition(color 0.25s linear); + + &:hover { + color: #2B69A2; + background: none; + } + } + } + } + + .tab-content { + margin-top: 60px; + + .tab-pane { + height: 325px; + + @media(max-width: 991px) { + display: block !important; + opacity: 1; + filter: alpha(opacity=100); + height: auto; + text-align: center; + margin-bottom: 70px; + } + + .info { + @media(max-width: 991px) { + margin-bottom: 35px; + } + + h4 { + color: #3B88B6; + font-weight: normal; + font-size: 19px; + line-height: 25px; + margin-top: 35px; + } + + p { + color: #6C7279; + font-size: 15px; + margin-top: 20px; + line-height: 24px; + width: 83%; + font-weight: normal; + + @media(max-width: 991px) { + margin: 0 auto; + width: 95%; + } + } + } + + .image { + img { + display: inline-block; + margin: 0 auto; + } + } + } + } + } +} + +.features-grid-section { + margin-top: 100px; + + @media(max-width: 991px) { + margin-top: 50px; + } + + .row { + @media(min-width: 992px) { + margin-bottom: 50px; + } + } + + .feature { + @media(max-width: 991px) { + text-align: center; + margin-bottom: 35px; + } + + img { + max-width: 40px; + } + + .icon { + font-size: 32px; + color: #4187ba; + } + + strong { + display: block; + font-weight: 400; + font-size: 17px; + color: #354E75; + margin-top: 15px; + } + + p { + font-weight: normal; + font-size: 14px; + color: #797979; + margin-top: 10px; + line-height: 24px; + } + } +} + +.blog-showcase { + margin-top: 120px; + + .header { + text-align: center; + margin-bottom: 45px; + + h3 { + font-size: 25px; + color: #444; + line-height: 25px; + font-weight: 400; + } + } + + .pics { + text-align: center; + + .pic { + position: relative; + width: 250px; + height: 258px; + margin: 0 auto; + margin-left: 10px; + margin-right: 10px; + display: inline-block; + opacity: 1; + filter: alpha(opacity=100); + + @include transition(all 0.25s linear); + + @media(max-width: 991px) { + margin-bottom: 35px; + } + + &:hover { + opacity: 0.7; + filter: alpha(opacity=70); + text-decoration: none; + } + + .bg { + position: absolute; + padding: 80px 20px 20px; + bottom: 0; + left: 0; + right: 0; + border-radius: 0px 5px 5px 0px; + background-repeat: repeat-x; + background-image: -webkit-linear-gradient(bottom, rgba(0, 0, 0, 0.12) 0, rgba(0, 0, 0, 0.3) 30%, rgba(0, 0, 0, 0) 100%); + background-image: -moz-linear-gradient(bottom, rgba(0, 0, 0, 0.12) 0, rgba(0, 0, 0, 0.3) 30%, rgba(0, 0, 0, 0) 100%); + background-image: -ms-linear-gradient(bottom, rgba(0, 0, 0, 0.12) 0, rgba(0, 0, 0, 0.3) 30%, rgba(0, 0, 0, 0) 100%); + background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.12) 0, rgba(0, 0, 0, 0.3) 30%, rgba(0, 0, 0, 0) 100%); + background-image: linear-gradient(to top, rgba(0, 0, 0, 0.12) 0, rgba(0, 0, 0, 0.3) 30%, rgba(0, 0, 0, 0) 100%); + } + + img { + display: block; + margin: 0 auto; + border-radius: 5px; + } + + p { + text-align: left; + color: #fff; + font-size: 22px; + position: absolute; + line-height: 28px; + bottom: 7px; + left: 20px; + width: 75%; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.4); + } + } + } +} diff --git a/_sass/partials/pages/_gallery.scss b/_sass/partials/pages/_gallery.scss new file mode 100755 index 0000000..7c3958f --- /dev/null +++ b/_sass/partials/pages/_gallery.scss @@ -0,0 +1,231 @@ +.gallery-showcase { + margin-top: 60px; + + .header { + text-align: left; + + h3 { + font-size: 26px; + color: #596166; + line-height: 25px; + font-weight: 500; + } + + p { + font-size: 15px; + font-weight: 400; + color: #666; + margin-top: 12px; + line-height: 24px; + + @media(min-width: 992px) { + width: 48%; + } + } + } + + .filtering { + margin-top: 35px; + margin-bottom: 35px; + + #filters { + padding-left: 20px; + text-align: center; + border-bottom: 2px solid #EDEDED; + + @media(max-width: 767px) { + display: none; + } + + li { + list-style-type: none; + display: inline-block; + margin: 0px 8px; + + &:first-child { + margin-left: 0px; + } + + a { + color: #888; + font-weight: 400; + border: 0px; + padding: 10px 22px; + font-size: 16px; + position: relative; + + @include transition(color 0.25s linear); + + &.active { + color: #2B69A2; + font-weight: 400; + border-bottom: 0px; + display: inline-block; + + &:after { + content: ''; + position: absolute; + width: 100%; + height: auto; + border-bottom: 2px solid #7BA3C9; + left: 1px; + bottom: -2px; + } + } + + &:hover { + color: #2B69A2; + background: none; + text-decoration: none; + } + } + } + } + } + + .gallery_container { + overflow: visible !important; + } + + .pic { + margin-bottom: 40px; + position: relative; + display: block; + + @include transition(.5s cubic-bezier(.25,1.45,.51,1.13)); + + &.fluidbox-opened:hover { + .layer { + background: rgba(0, 0, 0, 0); + + p { + opacity: 0; + filter: alpha(opacity=0); + } + } + } + + &:hover { + text-decoration: none; + + .layer { + background: rgba(33,33,33,.8); + + p { + margin-top: -20px; + opacity: 1; + filter: alpha(opacity=100); + } + } + } + + .layer { + width: 100%; + height: 100%; + position: absolute; + z-index: 9; + top: 0px; + left: 0px; + background: rgba(0, 0, 0, 0); + + @include transition(all 0.25s ease-out); + + p { + transition: margin-top .35s ease-out, opacity .55s ease-out; + color: #fff; + font-size: 15px; + text-align: center; + top: 50%; + width: 100%; + position: absolute; + font-weight: 600; + margin-top: 25px; + opacity: 0; + filter: alpha(opacity=0); + + span { + position: relative; + top: 1px; + margin-right: 2px; + } + } + } + + img { + margin: 0 auto; + } + } +} + +/* Fluidbox styling starts here */ +a[data-fluidbox] { + background-color: #eee; + border: none; + cursor: -webkit-zoom-in; + cursor: -moz-zoom-in; + margin-bottom: 1.5rem; + + &.fluidbox-opened { + cursor: -webkit-zoom-out; + cursor: -moz-zoom-out; + } + + & img { + display: block; + margin: 0 auto; + opacity: 0; + filter: alpha(opacity=0); + max-width: 100%; + transition: all .25s ease-in-out; + } +} + +a[class^='float'] { + margin: 1rem; + margin-top: 0; + width: 33.33333%; + + &.float-left { + float: left; + margin-left: 0; + } + + &.float-right { + float: right; + margin-right: 0; + } +} + +#fluidbox-overlay { + background-color: rgba(255,255,255,.85); + cursor: pointer; + cursor: -webkit-zoom-out; + cursor: -moz-zoom-out; + display: none; + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + z-index: 500; +} + +.fluidbox-wrap { + background-position: center center; + background-size: cover; + margin: 0 auto; + position: relative; + z-index: 400; + transition: all .25s ease-in-out; + + .fluidbox-opened & { + z-index: 600; + } +} + +.fluidbox-ghost { + background-size: cover; + background-position: center center; + position: absolute; + transition: all .25s ease-in-out; +} diff --git a/_sass/partials/pages/_index.scss b/_sass/partials/pages/_index.scss new file mode 100755 index 0000000..6a6ab99 --- /dev/null +++ b/_sass/partials/pages/_index.scss @@ -0,0 +1,294 @@ +.index-hero { + overflow: hidden; + background: #4B4848; + background-size: cover; + background-image: url("../../images/8254861601_1fbf969a14_b.jpg"); + /*background: -webkit-radial-gradient(closest-corner, rgba(16, 47, 70, 0) 60%, rgba(16, 47, 70, 0.26)), -webkit-linear-gradient(108deg, #5E8199, #153752 90%);*/ + + background-position: center 16%; + height: 580px; + position: relative; + padding-top: 150px; + box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.4); + + @media (max-width: 991px) { + padding-top: 100px; + } + + @media (max-width: 767px) { + height: 550px; + } + + &:before { + position: absolute; + content: ''; + left: 0; + bottom: 0; + width: 100%; + height: 100%; + background: -webkit-linear-gradient(right, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0) 1%, rgba(0, 0, 0, 0.1) 26%, rgba(0, 0, 0, 0.35) 71%, rgba(0, 0, 0, 0.5) 100%); + background: -moz-linear-gradient(right, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0) 1%, rgba(0, 0, 0, 0.1) 26%, rgba(0, 0, 0, 0.35) 71%, rgba(0, 0, 0, 0.5) 100%); + background: -o-linear-gradient(right, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0) 1%, rgba(0, 0, 0, 0.1) 26%, rgba(0, 0, 0, 0.35) 71%, rgba(0, 0, 0, 0.5) 100%); + background: linear-gradient(right, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0) 1%, rgba(0, 0, 0, 0.1) 26%, rgba(0, 0, 0, 0.35) 71%, rgba(0, 0, 0, 0.5) 100%); + } + + &:after { + position: absolute; + content: ''; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: rgba(32, 54, 114, 0.29); + } + + .container { + position: relative; + z-index: 33; + } + + h1.hero-text { + line-height: 52px; + text-align: left; + font-size: 37px; + text-transform: uppercase; + font-weight: 300; + letter-spacing: .3px; + color: #FFF; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); + + -webkit-animation-duration: 1s; + + @media (max-width: 767px) { + font-size: 25px; + line-height: 38px; + margin-top: 0; + text-align: center; + } + } + + .sub-text { + width: 50%; + margin-top: 25px; + color: #fff; + font-weight: 400; + font-size: 17px; + line-height: 28px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3); + + -webkit-animation-duration: 1s; + + @media (max-width: 991px) { + width: 70%; + } + + @media (max-width: 767px) { + font-size: 15px; + width: 100%; + text-align: center; + } + } + + .cta { + @include animationDelay(0.6s); + margin-top: 60px; + + @media (max-width: 767px) { + text-align: center; + } + + a { + margin-right: 20px; + padding: 15px 31px; + + @media (max-width: 767px) { + font-size: 14px; + padding: 12px 25px; + margin: 0px 15px 15px 0px; + } + } + } + + .img { + position: absolute; + top: 15px; + left: 625px; + width: 570px; + height: 333px; + background-image: url("../../images/static-hero.png"); + background-repeat: no-repeat; + + @media(max-width: 991px) { + display: none; + } + } +} + +.testimonials-section { + margin-top: 100px; + + .header { + text-align: center; + + h3 { + font-size: 23px; + color: #656565; + font-weight: 400; + line-height: 25px; + margin-bottom: 45px; + } + } + + .testimonial { + width: 90%; + + @media (max-width: 767px) { + float: none !important; + margin: 0 auto; + margin-bottom: 45px; + } + + .quote { + color: #53565f; + line-height: 26px; + border: 1px solid #E2E2E2; + padding: 16px 25px; + border-radius: 5px; + width: 95%; + position: relative; + + @media (max-width: 767px) { + margin: 0 auto; + } + + .arrow-down { + position: absolute; + bottom: 3px; + left: 30px; + + .arrow, .arrow-border { + border-color: #fff transparent transparent; + border-style: solid; + border-width: 11px; + cursor: pointer; + position: absolute; + top: 3px; + z-index: 1002; + } + + .arrow-border { + border-color: #E2E2E2 transparent transparent; + border-width: 12px; + top: 3px; + z-index: 1001; + left: -1px; + } + } + } + + .author { + margin-top: 40px; + margin-left: 10px; + + @media (max-width: 767px) { + margin-left: 6%; + } + + .pic { + width: 71px; + height: 71px; + border-radius: 50px; + float: left; + position: relative; + top: -12px; + margin-right: 18px; + border: 1px solid #ccc; + } + + .name { + color: #3C92C5; + line-height: 23px; + font-weight: 500; + } + + .company { + font-size: 14px; + color: #909090; + line-height: 23px; + font-weight: 400; + } + } + } +} + +.cta-section { + text-align: center; + margin-top: 120px; + + p { + font-size: 18px; + color: #7A7D81; + letter-spacing: 0.1px; + } + + a { + display: inline-block; + margin-top: 30px; + background: #6CAAE4; + color: #FFF; + padding: 23px 40px; + font-size: 16px; + letter-spacing: 1px; + font-weight: 500; + text-transform: uppercase; + border-radius: 5px; + box-shadow: rgba(23, 43, 99, 0.3) 0 7px 28px; + + @include transition(all .2s linear); + + &:hover { + text-decoration: none; + background: #3FD8DF; + } + } +} + +.clients-section { + background: #5E7A9B; + background: radial-gradient(#36414E, #253241); + margin-top: 120px; + padding: 65px 0 80px; + text-align: center; + + h3 { + color: #FFF; + margin-top: 0; + font-weight: 300; + font-size: 35px; + letter-spacing: .3px; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); + } + + p { + font-size: 16px; + color: #f8f8f8; + margin-top: 17px; + font-weight: 300; + line-height: 25px; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); + } + + .logos { + margin-top: 35px; + + img { + margin: 0 16px; + + @media(max-width: 767px) { + margin: 0 auto; + display: block; + margin-bottom: 15px; + } + } + } +} diff --git a/_sass/partials/pages/_index2.scss b/_sass/partials/pages/_index2.scss new file mode 100755 index 0000000..5f1bf7d --- /dev/null +++ b/_sass/partials/pages/_index2.scss @@ -0,0 +1,550 @@ +@include keyFrame(slideLeft) { + 0% { + left: 0; + } + 100% { + left: -15px; + } +} + +.slider-hero { + background: #4B4848; + height: 585px; + position: relative; + + @media (max-width: 991px) { + padding-top: 100px; + } + + @media (max-width: 767px) { + height: 550px; + } + + /* prev & next arrows */ + .slide-nav { + position: absolute; + top: 0; + bottom: 0; + width: 140px; + z-index: 200; + text-indent: 100%; + overflow: hidden; + opacity: 0.5; + filter:alpha(opacity=50); + + @include transition(opacity .2s linear); + + &:hover { + opacity: 1; + filter:alpha(opacity=100); + } + + &.prev { + &:after { + content: ""; + display: block; + position: absolute; + top: 0; + bottom: 0; + margin: auto 0; + width: 19px; + height: 58px; + background: url("../../images/slide-arrow.png") no-repeat; + left: 30px; + + @include transform(rotate(180deg)); + } + } + + &.next { + right: 0; + + &:after { + content: ""; + display: block; + position: absolute; + top: 0; + bottom: 0; + margin: auto 0; + width: 19px; + height: 58px; + background: url("../../images/slide-arrow.png") no-repeat; + right: 30px; + } + } + } + + /* navigation dots */ + nav { + z-index: 999; + position: absolute; + bottom: 20px; + width: 100%; + text-align: center; + + a { + display: inline-block; + width: 10px; + height: 10px; + background: #a2a2a2; + border-radius: 50%; + margin: 0 3px; + + &.active { + background: #fff; + } + } + } + + /* slides */ + .slides { + overflow: hidden; + position: absolute; + top: 0px; + width: 100%; + height: 100%; + + /* each slide */ + .slide { + display: none; + z-index: 80; + height: 100%; + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + padding-top: 90px; + + &.active { + opacity: 1; + filter: alpha(opacity=100); + display: block; + z-index: 100; + } + + &.next { + .bg { + @media(min-width: 768px) { + @include animation(slideLeft 700ms linear); + } + } + + z-index: 90; + } + + .container { + position: relative; + z-index: 3; + height: 100%; + } + + .bg { + position: absolute; + top: 0; + left: -15px; + width: 102%; + height: 100%; + background-position: center center; + background-size: cover; + + @media(max-width: 767px) { + left: 0px; + } + + &:before { + position: absolute; + top: 10%; + bottom: 0; + left: 0; + right: 0; + content: ''; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(0,0,0,0)), color-stop(100%, rgba(0,0,0,0.25))); + background: -webkit-linear-gradient(top, rgba(255,255,255,0) 0%, rgba(0,0,0,0.25) 100%); + background: -moz-linear-gradient(top, rgba(0,0,0,0),rgba(0,0,0,0.25)); + background: -o-linear-gradient(top, rgba(0,0,0,0),rgba(0,0,0,0.25)); + background: linear-gradient(top, rgba(0,0,0,0),rgba(0,0,0,0.25)); + } + + &:after { + content: ''; + position: absolute; + display: block; + height: 100%; + left: 0; + width: 100%; + top: 0; + } + } + + &.first { + @media(max-width: 767px) { + padding-top: 40px; + } + + .bg { + background-image: url('../../images/bgs/photo-1467703834117-04386e3dadd8.jpeg'); + background-position: center 29%; + + &:after { + background: rgba(5, 11, 29, 0.4); + } + } + + h1.hero-text { + text-align: center; + font-family: $lato; + font-size: 37px; + font-weight: 400; + color: #fff; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.65); + + @media (max-width: 767px) { + font-size: 25px; + } + } + + .sub-text { + margin: 0 auto; + font-family: $lato; + line-height: 26px; + margin-top: 25px; + text-align: center; + color: #fff; + font-weight: 400; + font-size: 17px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.2); + width: 50%; + + @include animationDelay(0.6s); + + @media (max-width: 991px) { + width: 70%; + } + + @media (max-width: 767px) { + font-size: 15px; + } + } + + .video-wrapper { + text-align: center; + margin-top: 50px; + + @media(max-width: 767px) { + margin-top: 25px; + } + + .video { + display: inline-block; + padding: 6px; + background: rgba(255, 255, 255, 0.5); + border-radius: 5px; + -webkit-animation-duration: 1.2s; + -moz-animation-duration: 1.2s; + -o-animation-duration: 1.2s; + animation-duration: 1.2s; + + img { + max-width: 280px; + cursor: pointer; + + @media(max-width: 767px) { + max-width: 200px; + } + } + } + } + } + + &.second { + @media(max-width: 767px) { + padding-top: 50px; + } + + .bg { + background-image: url("../../images/bgs/photo-1472132858735-6313c7962473.jpeg"); + background-position: center 18%; + + &:after { + background: rgba(52, 52, 58, 0.5); + } + } + + .info { + h1.hero-text { + margin-top: 65px; + font-family: $lato; + font-size: 40px; + line-height: 45px; + font-weight: 400; + color: #fff; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8); + + @media (max-width: 767px) { + font-size: 28px; + text-align: center; + } + } + + p { + color: rgba(255, 255, 255, 0.94); + font-family: $lato; + letter-spacing: 0.3px; + margin-top: 25px; + font-size: 17px; + line-height: 26px; + } + + .cta { + @include animationDelay(0.6s); + margin-top: 40px; + + @media (max-width: 767px) { + text-align: center; + } + + a { + position: relative; + margin: 0px 30px 0 0; + padding: 16px 25px; + letter-spacing: 1px; + font-weight: 500; + text-transform: uppercase; + border: 2px solid rgba(255, 255, 255, 0.8); + background: rgba(0, 0, 0, 0.4); + + &:hover { + color: #252525; + background: #fff; + padding-right: 45px; + + .fa { + opacity: 1; + } + } + + .fa { + opacity: 0; + font-size: 13px; + position: absolute; + color: #252525; + top: 21px; + right: 20px; + + @include transition(all 0.15s linear); + } + + @media (max-width: 767px) { + font-size: 14px; + padding: 12px 25px; + margin: 0px 15px 15px 0px; + } + } + } + } + + .mobiles { + img { + display: block; + margin: 0 auto; + width: 360px; + -webkit-animation-duration: 1.2s; + -moz-animation-duration: 1.2s; + -o-animation-duration: 1.2s; + animation-duration: 1.2s; + } + } + } + + &.third { + padding-top: 115px; + + @media(max-width: 767px) { + padding-top: 50px; + } + + .bg { + background-image: url('../../images/bgs/photo-1467659226669-a1360d97be2d.jpeg'); + background-position: center 15%; + + &:after { + background: rgba(3, 9, 27, 0.5); + } + } + + h1, .sub-text { + -webkit-animation-duration: 1s; + -moz-animation-duration: 1s; + -o-animation-duration: 1s; + animation-duration: 1s; + } + + h1.hero-text { + text-align: center; + font-size: 38px; + font-weight: 400; + color: #fff; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); + + @media (max-width: 767px) { + font-size: 28px; + } + } + + .sub-text { + margin: 0 auto; + margin-top: 25px; + text-align: center; + color: #f7f7f7; + font-weight: 400; + font-size: 17px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.2); + width: 50%; + + @media (max-width: 991px) { + width: 70%; + } + + @media (max-width: 767px) { + font-size: 15px; + } + } + + .cta { + @include animationDelay(0.6s); + text-align: center; + margin-top: 60px; + + a { + margin: 0px 20px; + + @media (max-width: 767px) { + font-size: 14px; + padding: 12px 25px; + margin: 0px 15px 15px 0px; + } + } + } + } + } + } + + /* video modal */ + .video-modal { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 999; + opacity: 0; + filter:alpha(opacity=0); + visibility: hidden; + + @include transition(all 0.25s linear); + + &.active { + opacity: 1; + filter:alpha(opacity=100); + visibility: visible; + background: rgba(44, 44, 45, 0.8); + + .wrap { + @include transform(scale3d(1, 1, 1)); + opacity: 1; + filter:alpha(opacity=100); + } + } + + .wrap { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + margin: auto; + padding: 5px; + background: rgba(255, 255, 255, 0.65); + border-radius: 5px; + width: 630px; + height: 360px; + opacity: 0; + filter:alpha(opacity=0); + + @include transform(scale3d(.3, .3, .3)); + @include transition(all 0.4s ease-out); + } + } +} + +.features-hover-section { + margin-top: 120px; + + @media(max-width: 991px) { + margin-top: 60px; + } + + .images { + height: 355px; + + @media(max-width: 767px) { + height: 300px; + } + + img { + margin: 0 auto; + position: absolute; + left: 0; + right: 0; + display: none; + + &.active { + display: block; + } + } + } + + .features { + margin-top: 50px; + + @media(max-width: 991px) { + margin-top: 0px; + } + + .feature { + cursor: pointer; + + @media(min-width: 992px) { + width: 85%; + margin: 0 auto; + } + + &.active, + &:hover { + strong { + color: #58B0D5; + } + + p { + color: #555; + } + } + + strong { + color: #b6b6b6; + font-size: 16px; + + @include transition(color 0.2s linear); + } + + p { + margin-top: 15px; + line-height: 25px; + color: #b6b6b6; + + @include transition(color 0.2s linear); + } + } + } +} diff --git a/_sass/partials/pages/_index3.scss b/_sass/partials/pages/_index3.scss new file mode 100755 index 0000000..f1ba7b9 --- /dev/null +++ b/_sass/partials/pages/_index3.scss @@ -0,0 +1,464 @@ +.sidebar-toggle { + width: 30px; + float: right; + margin-top: 15px; + cursor: pointer; + + .line { + background: #fff; + width: 100%; + height: 3px; + margin-bottom: 6px; + border-radius: 1px; + } +} + +.st-container { + position: relative; + overflow: hidden; + + &--right-side { + .nav-menu { + right: 0; + @include transform(translate3d(50%, 0, 0)); + } + + /* show hidden navbar */ + &.nav-effect { + .nav-menu { + @include transform(translate3d(0, 0, 0)); + } + + .st-pusher { + @include transform(translate3d(-320px, 0, 0)); + box-shadow: 5px 0px 20px 0px rgba(0, 0, 0, 0.5); + + @media(max-width: 767px) { + @include transform(translate3d(-220px, 0, 0)); + } + } + } + } + + &--left-side { + .nav-menu { + left: 0; + @include transform(translate3d(-50%, 0, 0)); + } + + /* show hidden navbar */ + &.nav-effect { + .nav-menu { + @include transform(translate3d(0, 0, 0)); + } + + .st-pusher { + @include transform(translate3d(300px, 0, 0)); + box-shadow: -5px 0px 20px 0px rgba(0, 0, 0, 0.5); + + @media(max-width: 767px) { + @include transform(translate3d(220px, 0, 0)); + } + } + } + } +} + +.st-pusher { + position: relative; + left: 0; + z-index: 99; + background: #fff; + + @include transitionPrefix(transform, 0.35s ease-out); +} + +.nav-menu { + position: fixed; + top: 0; + z-index: 1; + width: 320px; + height: 100%; + background: #2a313a; + padding-top: 30px; + + @include transitionPrefix(transform, 0.35s ease-out); + + @media(max-width: 767px) { + width: 220px; + position: absolute; + } + + .main-menu { + h3 { + color: #fff; + font-size: 26px; + margin-left: 50px; + margin-bottom: 30px; + + @media(max-width: 767px) { + margin-left: 30px; + font-size: 23px; + } + } + + a { + display: block; + padding: 5px 30px 5px 50px; + margin-bottom: 10px; + text-decoration: none; + color: #fff; + font-size: 15px; + + @include transition(all 0.15s linear); + + @media(max-width: 767px) { + padding-left: 30px; + font-size: 16px; + } + + &:hover { + color: #82C4F8; + } + } + + .social { + margin-left: 45px; + margin-top: 50px; + + @media(max-width: 767px) { + margin-left: 30px; + } + + a { + padding: 0px; + display: inline-block; + margin-right: 22px; + &:hover { + i { + color: #7EBDE7; + } + } + + i { + font-size: 22px; + color: #fff; + + @include transition(all 0.15s linear); + } + } + } + } + + .projects { + .back { + margin-top: 10px; + font-weight: 500; + font-size: 21px; + color: #fff; + margin-bottom: 20px; + } + + a { + display: block; + position: relative; + left: 0px; + padding: 15px 40px; + text-decoration: none; + color: #fff; + font-size: 16px; + font-weight: 400; + + @include transition(all 0.15s linear); + + @media(max-width: 767px) { + padding-left: 20px; + } + + &:hover { + left: 10px; + } + + p { + color: #A2B1C2; + font-size: 14px; + margin-top: 5px; + } + } + } +} + +.index-sidebar-hero { + background: #3D4046; + height: 630px; + position: relative; + overflow: hidden; + box-shadow: 0px 1px 3px -1px rgba(0, 0, 0, 0.35); + padding-top: 130px; + + @media (max-width: 991px) { + padding-top: 100px; + height: 550px; + } + + #cover-image { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + padding-top: 105px; + background-position: center center; + background-size: cover; + @include animationDelay(0.15s); + background-image: url("../../images/bg4.png"); + + @media (max-width: 991px) { + padding-top: 65px; + } + + &:after { + content: ''; + position: absolute; + display: block; + height: 100%; + left: 0; + width: 100%; + top: 0; + background: rgba(24, 22, 19, 0.4); + } + + &:before { + position: absolute; + top: 10%; + bottom: 0; + left: 0; + right: 0; + content: ''; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(0,0,0,0)), color-stop(100%, rgba(0,0,0,0.25))); + background: -webkit-linear-gradient(top, rgba(255,255,255,0) 0%, rgba(0,0,0,0.25) 100%); + background: -moz-linear-gradient(top, rgba(0,0,0,0),rgba(0,0,0,0.25)); + background: -o-linear-gradient(top, rgba(0,0,0,0),rgba(0,0,0,0.25)); + background: linear-gradient(top, rgba(0,0,0,0),rgba(0,0,0,0.25)); + } + } + + .container { + position: relative; + z-index: 3; + height: 100%; + } + + .hero-text { + text-align: center; + font-size: 35px; + font-weight: 400; + color: #fff; + margin-top: 50px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.55); + + @include animationDelay(0.6s); + + @media (max-width: 991px) { + font-size: 30px; + } + + @media (max-width: 767px) { + font-size: 27px; + } + } + + .cta { + text-align: center; + margin-top: 40px; + + @include animationDelay(0.6s); + + a { + margin: 0px 20px; + + @media (max-width: 400px) { + display: block; + } + + &.button { + border-radius: 50px; + padding: 12px 36px; + font-size: 18px; + @include transition(all 0.3s linear); + + @media (max-width: 767px) { + font-size: 16px; + } + + @media (max-width: 400px) { + width: 65%; + margin: 0 auto; + margin-bottom: 25px; + } + + &:hover { + box-shadow: rgba(0, 0, 0, 0.3) 0 1px 2px, inset rgba(255, 255, 255, 0.88) 0px 1px 3px -1px, rgba(0,0,0,0.3) 0 1px 2px, #69B1F3 0 1px 30px; + } + } + + &.demo { + color: #fff; + font-size: 17px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3); + + @media (max-width: 767px) { + font-size: 16px; + } + } + } + } + + .screenshot { + position: absolute; + bottom: 0; + left: 0; + right: 0; + + img { + margin: 0 auto; + } + } +} + +.cta-mobile-section { + background: #F7F8FB; + border: 1px solid #EAEDF7; + box-shadow: inset rgba(100, 100, 100, 0.25) 0 1px 1px; + margin-top: 100px; + + @media(min-width: 992px) { + .container { + width: 870px; + } + } + + .device { + margin: -30px 0px 0px 0px; + position: relative; + top: 2px; + } + + .info { + margin-top: 50px; + + @media (max-width: 767px) { + margin: 35px; + text-align: center; + } + + h3 { + font-weight: 400; + color: #616974; + font-size: 26px; + } + + p { + font-size: 15px; + margin-top: 20px; + color: #6a6e7b; + line-height: 23px; + } + + .app-store { + margin-top: 18px; + border: none; + display: inline-block; + + img { + max-width: 135px; + } + } + } +} + +.call-to-action-signup { + margin-top: 110px; + margin-bottom: -120px; + background: #fafafa; + padding: 60px 0 70px; + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; + + @media (min-width: 1200px) { + .container { + width: 1170px; + } + } + + h3 { + margin: 0; + font-size: 20px; + letter-spacing: 2px; + text-align: center; + color: #4c4c4c; + text-transform: uppercase; + font-weight: 600; + text-shadow: 1px 1px #fff; + } + + form { + margin-top: 40px; + position: relative; + text-align: center; + + .form-group { + margin-right: 7px; + width: 250px; + + @media(max-width: 991px) { + width: 220px; + } + + @media(max-width: 767px) { + width: 100%; + } + } + + input { + box-shadow: 0 1px 1px #fff; + height: 42px; + width: 100% !important; + font-size: 15px; + + &:focus { + box-shadow: none; + } + } + + [type="submit"] { + @media(max-width: 1199px) { + margin-top: 30px; + } + } + + .agree { + top: 20px; + position: relative; + display: block; + text-align: right; + padding-right: 95px; + color: #555; + + @media(max-width: 1199px) { + text-align: center; + padding: 0; + } + } + } +} + +#demo { + .modal-dialog { + padding-top: 100px; + width: 650px; + } + .modal-body { + padding: 0px; + } +} diff --git a/_sass/partials/pages/_invoice.scss b/_sass/partials/pages/_invoice.scss new file mode 100755 index 0000000..8c34ca4 --- /dev/null +++ b/_sass/partials/pages/_invoice.scss @@ -0,0 +1,210 @@ +.invoice-wrapper { + background: #eeeff1; + padding-top: 60px; + + .container { + @media (min-width: 1200px) { + width: 900px; + } + } + + .logo { + text-align: center; + + a { + font-size: 36px; + color: #555; + font-weight: 300; + + @include transition(all .2s linear); + + &:hover { + text-decoration: none; + color: #7793C4; + } + } + } + + .invoice-wrapper { + background: #FFF; + border: 1px solid #CDD3E2; + box-shadow: 0px 0px 1px #CCC; + padding: 40px 40px 60px; + margin-top: 40px; + border-radius: 4px; + + .intro { + line-height: 25px; + color: #444; + } + + .payment-info { + margin-top: 25px; + padding-top: 15px; + + span { + color: #A9B0BB; + } + + strong { + display: block; + color: #444; + margin-top: 3px; + } + + @media(max-width: 767px) { + .text-right { + text-align: left; + margin-top: 20px; + } + } + } + + .payment-details { + border-top: 2px solid #EBECEE; + margin-top: 30px; + padding-top: 20px; + line-height: 22px; + + span { + color: #A9B0BB; + display: block; + } + + a { + display: inline-block; + margin-top: 5px; + } + + @media(max-width: 767px) { + .text-right { + text-align: left; + margin-top: 20px; + } + } + } + + .line-items { + margin-top: 40px; + + .headers { + color: #A9B0BB; + font-size: 13px; + letter-spacing: .3px; + border-bottom: 2px solid #EBECEE; + padding-bottom: 4px; + } + + .items { + margin-top: 8px; + border-bottom: 2px solid #EBECEE; + padding-bottom: 8px; + + .item { + padding: 10px 0; + color: #696969; + font-size: 15px; + + @media(max-width: 767px) { + font-size: 13px; + } + + .amount { + letter-spacing: 0.1px; + color: #84868A; + font-size: 16px; + + @media(max-width: 767px) { + font-size: 13px; + } + } + } + } + + .total { + margin-top: 30px; + + .extra-notes { + float: left; + width: 40%; + text-align: left; + font-size: 13px; + color: #7A7A7A; + line-height: 20px; + + @media(max-width: 767px) { + width: 100%; + margin-bottom: 30px; + float: none; + } + + strong { + display: block; + margin-bottom: 5px; + color: #454545; + } + } + + .field { + margin-bottom: 7px; + font-size: 14px; + color: #555; + + &.grand-total { + margin-top: 10px; + font-size: 16px; + font-weight: 500; + + span { + color: #20A720; + font-size: 16px; + } + } + + span { + display: inline-block; + margin-left: 20px; + min-width: 85px; + color: #84868A; + font-size: 15px; + } + } + } + + .print { + margin-top: 50px; + text-align: center; + + a { + display: inline-block; + border: 1px solid #9CB5D6; + padding: 13px 13px; + border-radius: 5px; + color: #708DC0; + font-size: 13px; + + @include transition(all .2s linear); + + &:hover { + text-decoration: none; + border-color: #333; + color: #333; + } + + i { + margin-right: 3px; + font-size: 14px; + } + } + } + } + } + + .footer { + margin-top: 40px; + margin-bottom: 110px; + text-align: center; + font-size: 12px; + color: #969CAD; + } +} diff --git a/_sass/partials/pages/_portfolio.scss b/_sass/partials/pages/_portfolio.scss new file mode 100755 index 0000000..62f6ade --- /dev/null +++ b/_sass/partials/pages/_portfolio.scss @@ -0,0 +1,113 @@ +html.portfolio-page { + background: #F5F9FF; + background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,0)),color-stop(1,rgba(255,255,255,0.5))); + background-image: -webkit-linear-gradient(top,rgba(255,255,255,0) 0,rgba(255,255,255,0.5) 100%); + background-image: -moz-linear-gradient(top,rgba(255,255,255,0) 0,rgba(255,255,255,0.5) 100%); + background-image: -o-linear-gradient(top,rgba(255,255,255,0) 0,rgba(255,255,255,0.5) 100%); + background-image: -ms-linear-gradient(top,rgba(255,255,255,0) 0,rgba(255,255,255,0.5) 100%); + background-image: linear-gradient(top,rgba(255,255,255,0) 0,rgba(255,255,255,0.5) 100%); + -webkit-background-size: 100% 30%; + -moz-background-size: 100% 30%; + background-size: 100% 30%; + background-repeat: no-repeat; + background-position: 0 100%; +} + +.portfolio-body { + background: none; + background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(25%,rgba(255,255,255,0))); + background-image: -webkit-linear-gradient(top,#fff 0,rgba(255,255,255,0) 25%); + background-image: -moz-linear-gradient(top,#fff 0,rgba(255,255,255,0) 25%); + background-image: -o-linear-gradient(top,#fff 0,rgba(255,255,255,0) 25%); + background-image: -ms-linear-gradient(top,#fff 0,rgba(255,255,255,0) 25%); + background-image: linear-gradient(top,#fff 0,rgba(255,255,255,0) 25%); +} + +.portfolio-showcase { + margin-top: 50px; + + .header { + text-align: left; + margin-bottom: 40px; + + h3 { + font-size: 28px; + color: #596166; + line-height: 25px; + font-weight: 500; + } + + p { + font-size: 16px; + font-weight: 400; + color: #8D959B; + line-height: 24px; + + @media(min-width: 992px) { + width: 48%; + } + } + } + + .project { + background: #fff; + padding: 40px 60px; + border-radius: 5px; + margin-bottom: 35px; + box-shadow: 0 -1px 0 rgba(0,0,0,0.05), 0 1px 0 rgba(0,0,0,0.05), -1px 0 0 rgba(0,0,0,0.04), 1px 0 0 rgba(0,0,0,0.04), 0 1px 3px rgba(0,0,0,0.12); + + @media(max-width: 767px) { + padding: 40px 35px 35px 35px;; + } + + h3 { + color: #585F64; + font-size: 22px; + margin-top: 0px; + text-align: center; + } + + .screen { + margin-top: 45px; + text-align: center; + + img { + margin: 0 auto; + } + } + + .description { + margin-top: 40px; + color: #7D8186; + line-height: 21px; + } + + .divider { + height: 1px; + width: 100%; + background-color: #ddd; + position: relative; + margin-top: 45px; + + &:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 2px; + background-image: -webkit-gradient(linear, left top, right top, color-stop(0, rgba(255, 255, 255, 0.75)), color-stop(0.5, rgba(250,250,250,0)), color-stop(1, rgba(255, 255, 255, 0.75))); + background-image: -webkit-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250,250,250,0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -moz-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250,250,250,0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -o-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250,250,250,0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -ms-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250,250,250,0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250,250,250,0) 50%, rgba(255, 255, 255, 0.75) 100%); + } + } + + .visit { + margin-top: 30px; + text-align: center; + } + } +} diff --git a/_sass/partials/pages/_portfolio_item.scss b/_sass/partials/pages/_portfolio_item.scss new file mode 100755 index 0000000..27a2f56 --- /dev/null +++ b/_sass/partials/pages/_portfolio_item.scss @@ -0,0 +1,115 @@ +.portfolio-item-showcase { + margin-top: 40px; + margin-bottom: -30px; + + .header { + text-align: left; + margin-bottom: 25px; + + h3 { + display: inline-block; + font-size: 17px; + font-family: $myriad; + color: #53A6DA; + margin-top: 0px; + line-height: 25px; + font-weight: 500; + margin-bottom: 5px; + cursor: pointer; + } + } + + .project { + h1 { + text-align: center; + font-size: 25px; + color: #647583; + margin-top: 10px; + margin-bottom: 70px; + } + + .screens { + img { + margin: 0 auto; + margin-bottom: 80px; + margin-top: 10px; + + &.magnifier { + width: 490px; + margin-bottom: 100px; + } + + &.mobile { + margin-bottom: 110px; + } + } + + .text { + color: #7D8186; + font-size: 15px; + line-height: 22px; + margin-bottom: 80px; + } + } + + .description { + .info { + margin-top: 25px; + + &.stick { + @media(min-width: 992px) { + position: fixed; + top: 10px; + } + } + + .icons { + margin-bottom: 20px; + + .ion-icon:before { + color: #b2c3cb; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #b2c3cb), color-stop(100%, #DBE3E7)); + background: -webkit-linear-gradient(#b2c3cb, #DBE3E7); + font-size: 60px; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + margin: 0 9px; + } + + .ion-social-windows:before { + font-size: 50px; + } + } + + p { + color: #7D8186; + line-height: 22px; + margin-bottom: 22px; + } + + .tweet-it { + color: #00A7DD; + margin-top: 3px; + display: inline-block; + position: relative; + padding-left: 29px; + text-decoration: none; + + &:hover { + .ion-social-twitter:before { + content: "\f242"; + } + } + + .ion-social-twitter { + margin-right: 8px; + font-size: 21px; + position: absolute; + top: 0px; + left: 0px; + } + } + } + } + } +} diff --git a/_sass/partials/pages/_pricing.scss b/_sass/partials/pages/_pricing.scss new file mode 100755 index 0000000..17af391 --- /dev/null +++ b/_sass/partials/pages/_pricing.scss @@ -0,0 +1,628 @@ +.pricing-3-options-section { + margin-top: 70px; + + .header { + text-align: center; + + h3 { + font-size: 24px; + color: #444; + line-height: 25px; + font-weight: 500; + } + + p { + font-size: 16px; + font-weight: 400; + color: #888; + } + } + + .charts { + margin-top: 45px; + + .chart { + background-color: #fff; + border: 1px solid #D8D8D8; + border-radius: 5px; + box-shadow: 0px 0px 2px 0px rgba(181, 181, 181, 0.3); + padding: 20px 40px; + position: relative; + text-align: center; + width: 97%; + min-height: 315px; + position: relative; + top: 20px; + + @media(min-width: 992px) { + &.first { + float: right; + left: 45px; + } + + &.last { + left: -45px; + } + } + + @media (max-width: 991px) { + float: none !important; + left: 0px !important; + top: 0px !important; + margin: 0 auto; + width: 55%; + margin-bottom: 25px !important; + + &.last { + margin-bottom: 0px !important; + } + } + + @media (max-width: 600px) { + width: 90% !important; + } + + &.featured { + z-index: 999; + + @media(min-width: 992px) { + margin: 0 auto; + top: 0px; + min-height: 445px; + + .btn-signup { + margin-top: 32px; + } + } + + .popular { + position: absolute; + top: 0px; + left: 0px; + } + + .quantity { + margin-top: 15px; + padding-bottom: 5px; + } + } + + .plan-name { + text-align: center; + font-size: 20px; + font-weight: 400; + color: #444; + width: 90%; + margin: 0 auto; + margin-top: 5px; + } + + .quantity { + text-align: center; + border-bottom: 1px solid #d5d5d5; + margin-top: 10px; + + .dollar { + font-size: 19px; + position: relative; + top: -18px; + } + + .price { + font-size: 49px; + } + + .period { + font-size: 17px; + position: relative; + top: -8px; + margin-left: 4px; + } + } + + .specs { + margin-top: 20px; + + .spec { + font-size: 15px; + color: #474747; + text-align: center; + font-weight: 300; + margin-bottom: 13px; + + .variable { + color: #1FBEE7; + font-weight: 500; + } + } + } + + .btn-signup { + margin-top: 20px; + height: 38px; + } + } + } + + .message { + p { + text-align: center; + font-size: 13px; + color: #656565; + margin-top: 23px; + } + } + + .faq { + margin-top: 40px; + + .header h3 { + font-size: 20px; + color: #454545; + text-align: left; + } + + .questions { + margin-top: 25px; + + .question { + margin-bottom: 40px; + + @media(min-width: 992px) { + width: 90%; + } + + strong { + font-weight: 500; + font-size: 16px; + color: #454545; + } + + p { + color: #555; + margin-top: 10px; + font-size: 13px; + line-height: 22px; + } + } + } + } + + .contact { + margin-top: 40px; + + .wrapper { + background: #F7F8FB; + border: 1px solid #EAEDF7; + border-radius: 8px; + padding: 25px 60px; + box-shadow: inset rgba(100, 100, 100, 0.25) 0 1px 1px; + margin: 0 auto; + } + + h4 { + font-size: 15px; + position: relative; + color: #696E72; + text-align: center; + font-weight: 500; + text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.8); + + @media (max-width: 991px) { + line-height: 26px; + } + + span { + position: absolute; + font-size: 23px; + top: -5px; + left: 72px; + color: #626E7A; + + @media (max-width: 991px) { + position: relative; + left: 0px; + top: 5px; + } + } + } + } +} + +.pricing-dark-section { + border-top: 1px solid #EAEAEA; + border-bottom: 1px solid #EAEAEA; + background: #5E7A9B; + background: -webkit-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -moz-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -o-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: linear-gradient(top, #355069 0, #5E7A9B 100%); + margin-top: 120px; + padding-top: 45px; + padding-bottom: 70px; + + .header { + text-align: center; + + @media (max-width: 991px) { + margin-bottom: 25px; + } + + h3 { + font-size: 27px; + color: #fff; + line-height: 25px; + font-weight: 400; + text-shadow: 0 1px 2px rgba(0,0,0,0.2); + + @media(max-width: 767px) { + font-size: 24px; + line-height: 29px; + } + } + + p { + font-size: 16px; + margin-top: 15px; + color: #F0F0F0; + font-weight: 400; + line-height: 25px; + text-shadow: 0 1px 2px rgba(0,0,0,0.2); + } + } + + .charts { + margin-top: 35px; + + @media (max-width: 991px) { + margin-top: 10px; + } + + .chart { + background-color: #fff; + border: 1px solid #E6E6E6; + border-radius: 5px; + box-shadow: 0px 0px 2px 0px rgba(181, 181, 181, 0.3); + padding: 20px 40px; + position: relative; + text-align: center; + width: 97%; + + min-height: 315px; + position: relative; + top: 37px; + + @media (max-width: 991px) { + float: none !important; + left: 0px !important; + top: 0px !important; + margin: 0 auto; + width: 55%; + margin-bottom: 25px !important; + + &.last { + margin-bottom: 0px !important; + } + } + + @media (max-width: 600px) { + width: 90% !important; + } + + &.first { + float: right; + left: 12px; + } + + &.last { + left: -12px; + } + + &.featured { + min-height: 350px; + top: 0px; + margin: 0 auto; + + .popular { + text-align: center; + text-transform: uppercase; + font-size: 16px; + letter-spacing: 1px; + color: #B1B1B1; + font-weight: 400; + } + + .quantity { + margin-top: 15px; + } + } + + .quantity { + text-align: center; + + .dollar { + font-size: 19px; + position: relative; + top: -18px; + } + + .price { + font-size: 49px; + } + + .period { + font-size: 17px; + position: relative; + top: -8px; + margin-left: 4px; + } + } + + .plan-name { + text-align: center; + font-size: 20px; + font-weight: 400; + color: #777; + border-bottom: 1px solid #d5d5d5; + padding-bottom: 15px; + width: 90%; + margin: 0 auto; + margin-top: 8px; + } + + .specs { + margin-top: 20px; + + .spec { + font-size: 15px; + color: #353535; + text-align: center; + font-weight: 300; + margin-bottom: 13px; + + .variable { + color: #1FBEE7; + font-weight: 400; + } + } + } + + .btn-signup { + margin-top: 20px; + height: 38px; + } + } + } +} + +.pricing-4-options-section { + margin-top: 55px; + margin-bottom: 150px; + + .header { + text-align: center; + + h3 { + font-size: 24px; + color: #444; + line-height: 25px; + font-weight: 500; + } + + p { + font-size: 16px; + font-weight: 400; + color: #888; + } + } + + @media(min-width: 992px) { + .container { + width: 1060px; + } + } + + .charts { + margin-top: 50px; + + .basic-plan { + background-color: #fff; + border: 1px solid #E6E6E6; + border-radius: 5px; + box-shadow: 0px 0px 2px 0px rgba(181, 181, 181, 0.3); + padding: 20px 30px 10px 30px; + text-align: center; + width: 220px; + position: absolute; + right: 0px; + top: 20px; + + @media (max-width: 991px) { + float: none !important; + left: 0px !important; + top: 0px !important; + margin: 0 auto; + width: 55%; + margin-bottom: 25px !important; + position: relative; + margin-top: 30px; + + &.last { + margin-bottom: 0px !important; + } + } + + @media (max-width: 600px) { + width: 90% !important; + } + + .plan-name { + text-align: center; + font-size: 17px; + font-weight: 400; + color: #444; + width: 90%; + margin: 0 auto; + margin-top: 5px; + } + + .quantity { + text-align: center; + border-bottom: 1px solid #d5d5d5; + margin-top: 5px; + + .dollar { + font-size: 19px; + position: relative; + top: -18px; + } + + .price { + font-size: 42px; + } + + .period { + font-size: 17px; + position: relative; + top: -8px; + margin-left: 4px; + } + } + + .description { + margin-top: 15px; + font-size: 13px; + color: #444; + line-height: 20px; + + a { + display: block; + margin-top: 20px; + font-weight: 500; + font-size: 15px; + } + } + } + + .chart { + background-color: #fff; + border: 1px solid #E6E6E6; + border-radius: 5px; + box-shadow: 0px 0px 2px 0px rgba(181, 181, 181, 0.3); + padding: 20px 40px; + position: relative; + text-align: center; + width: 280px; + float: left; + min-height: 315px; + position: relative; + top: 20px; + + @media(min-width: 992px) { + &.featured { + left: -25px; + } + + &.last { + left: -45px; + } + } + + @media (max-width: 991px) { + float: none !important; + left: 0px !important; + top: 0px !important; + margin: 0 auto; + width: 55%; + margin-bottom: 25px !important; + + &.last { + margin-bottom: 0px !important; + } + } + + @media (max-width: 600px) { + width: 90% !important; + } + + &.featured { + z-index: 999; + + @media(min-width: 992px) { + margin: 0 auto; + top: 0px; + min-height: 445px; + .btn-signup { + margin-top: 32px; + } + } + + .popular { + position: absolute; + top: 0px; + left: 0px; + } + + .quantity { + margin-top: 15px; + padding-bottom: 5px; + } + } + + .plan-name { + text-align: center; + font-size: 20px; + font-weight: 400; + color: #444; + width: 90%; + margin: 0 auto; + margin-top: 5px; + } + + .quantity { + text-align: center; + border-bottom: 1px solid #d5d5d5; + margin-top: 10px; + + .dollar { + font-size: 19px; + position: relative; + top: -18px; + } + + .price { + font-size: 49px; + } + + .period { + font-size: 17px; + position: relative; + top: -8px; + margin-left: 4px; + } + } + + .specs { + margin-top: 20px; + + .spec { + font-size: 15px; + color: #353535; + text-align: center; + font-weight: 300; + margin-bottom: 13px; + + .variable { + color: #1FBEE7; + font-weight: 400; + } + } + } + + .btn-signup { + margin-top: 20px; + height: 38px; + } + } + } +} diff --git a/_sass/partials/pages/_services.scss b/_sass/partials/pages/_services.scss new file mode 100755 index 0000000..08f53c5 --- /dev/null +++ b/_sass/partials/pages/_services.scss @@ -0,0 +1,311 @@ +.services-intro { + margin-top: 90px; + + @media(min-width: 992px) { + .row { + border-bottom: 1px solid #E6E6E8; + } + } + + .image { + img { + @media(max-width: 991px) { + margin: 0 auto; + } + } + } + + .info { + @media(min-width: 992px) { + padding-left: 60px; + } + + @media(max-width: 991px) { + text-align: center + } + + h3 { + font-weight: 400; + margin-top: 70px; + font-size: 28px; + } + + p { + color: #666; + margin-top: 25px; + line-height: 23px; + + @media(min-width: 992px) { + width: 85%; + } + } + } +} + +.services-tabs { + margin-top: 130px; + + @media(max-width: 991px) { + margin-top: 70px; + } + + .hexagons { + text-align: center; + + .hexagon { + background: url("../../images/hexagon.png") 0 0 no-repeat; + width: 100px; + height: 113px; + position: relative; + display: inline-block; + margin-right: 60px; + cursor: pointer; + + @media(max-width: 991px) { + margin: 0; + } + + &:hover, + &.active { + background-position: 0 -117px; + .icon { + color: #fff; + } + } + + &:last-child { + margin-right: 0px; + } + + .icon { + font-size: 48px; + color: #80939b; + position: absolute; + top: 32px; + left: 0; + right: 0; + text-align: center; + } + } + } + + .sections { + margin-top: 35px; + position: relative; + height: 220px; + + .section { + display: none; + position: absolute; + + &.active { + display: block; + } + + h4 { + margin-bottom: 18px; + } + + p { + line-height: 25px; + } + } + } +} + +.services-grid-section { + margin-top: 100px; + + &.with-border { + margin-top: 70px; + + .header { + border-top: 1px solid #E6E6E8; + padding-top: 55px; + } + } + + .header { + text-align: center; + + h3 { + font-size: 26px; + color: #555C68; + line-height: 25px; + font-weight: 400; + } + + p { + font-size: 16px; + font-weight: 400; + color: #888; + } + } + + .sections { + margin-top: 45px; + + .section { + text-align: center; + + @media(max-width: 991px) { + margin-bottom: 40px; + } + + .pic { + display: inline-block; + padding: 15px; + background: #f5f5f5; + box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.25), inset 0px 0px 1px 1px #fff; + } + + .info { + margin-top: 25px; + text-align: center; + + @media(min-width: 992px) { + margin-left: 45px; + width: 80%; + text-align: left; + } + + strong { + font-weight: 500; + font-size: 18px; + color: #555; + } + + p { + color: #666; + margin-top: 15px; + line-height: 22px; + } + } + } + } +} + +.services-showcase-section { + margin-top: 80px; + + @media(max-width: 991px) { + margin-top: 50px; + } + + .header { + border-top: 1px solid #E6E6E8; + padding-top: 55px; + margin-bottom: 35px; + + h3 { + font-size: 27px; + color: #444; + line-height: 25px; + font-weight: 500; + margin-bottom: 7px; + + @media(max-width: 991px) { + text-align: center; + } + } + + p { + font-size: 15px; + font-weight: 400; + color: #666; + width: 50%; + line-height: 24px; + margin-top: 15px; + + @media(max-width: 991px) { + margin: 0 auto; + width: 90%; + text-align: center; + } + } + } + + .features { + margin-bottom: 20px; + + .feature { + @media(max-width: 991px) { + text-align: center; + margin-bottom: 30px; + } + + img { + max-width: 40px; + position: relative; + top: 10px; + + @media(min-width: 992px) { + float: left; + } + } + + .info { + @media(min-width: 992px) { + float: left; + width: 80%; + margin-left: 20px; + } + + strong { + display: block; + font-weight: 500; + font-size: 16px; + color: #444; + margin-top: 15px; + } + + p { + font-weight: normal; + font-size: 14px; + color: #797979; + margin-top: 10px; + line-height: 24px; + } + } + } + } +} + +.signup-cta { + margin-top: 120px; + + .wrapper { + background: #F7F8FB; + border: 1px solid #EAEDF7; + border-radius: 8px; + padding: 30px 60px; + box-shadow: inset rgba(100, 100, 100, 0.25) 0 1px 1px; + margin: 0 auto; + + @media(max-width: 991px) { + text-align: center; + } + } + + h4 { + font-size: 20px; + color: #5F6E7C; + font-weight: 400; + float: left; + text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.8); + + @media(max-width: 767px) { + font-size: 17px; + line-height: 23px; + } + } + + .button { + float: right; + + @media(max-width: 991px) { + float: none; + margin-top: 20px; + } + } +} diff --git a/_sass/partials/pages/_signup.scss b/_sass/partials/pages/_signup.scss new file mode 100755 index 0000000..1ddfc87 --- /dev/null +++ b/_sass/partials/pages/_signup.scss @@ -0,0 +1,167 @@ +.session-page { + min-height: 100vh; + background-attachment: fixed !important; + background: #5E7A9B; + background: -webkit-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -moz-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -o-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: linear-gradient(top, #355069 0, #5E7A9B 100%); + + .header { + .logo { + margin-top: 40px; + text-align: center; + + a { + color: #fff; + font-size: 31px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.6); + + @include transition(color .25s linear); + + &:hover { + text-decoration: none; + color: #bbb; + } + } + } + + h4 { + color: #fff; + text-align: center; + font-size: 25px; + font-weight: 400; + margin-top: 45px; + margin-bottom: 5px; + } + + p { + color: #fff; + text-align: center; + } + } + + .wrapper { + margin: 0 auto; + width: 51%; + margin-top: 25px; + background: #fff; + padding: 15px 50px 25px 50px; + border-radius: 5px; + border-top: 6px solid #6ED5E4; + + @media(max-width: 991px) { + width: 67%; + } + + @media(max-width: 767px) { + width: 100%; + } + + .formy { + margin-top: 22px; + + .form-group { + label { + color: #46515F; + } + } + + .checkbox { + label { + color: #666; + font-size: 13px; + } + + input { + position: relative; + top: -1px; + } + } + + .submit { + text-align: center; + + .button-clear { + margin-top: 35px; + display: inline-block; + } + } + + .info { + float: right; + width: 67%; + + .good-company { + strong { + font-size: 15px; + font-weight: 500; + } + + p { + color: #858585; + margin-top: 9px; + } + } + + .testimonial { + margin-top: 40px; + + .quote { + font-style: italic; + font-size: 13px; + color: #555; + line-height: 20px; + } + + .author { + margin-top: 20px; + + .pic { + width: 55px; + height: 55px; + border-radius: 50px; + float: left; + position: relative; + top: -6px; + margin-right: 18px; + } + + .name { + color: #3C92C5; + line-height: 23px; + font-weight: 500; + } + + .company { + font-size: 14px; + color: #909090; + line-height: 23px; + font-weight: 400; + } + } + } + } + } + } + + .already-account { + text-align: center; + color: #fff; + margin-top: 25px; + margin-bottom: 70px; + font-size: 13px; + font-weight: 500; + + a { + color: #fff; + text-decoration: underline; + } + + .popover-content { + color: #000; + font-size: 17px; + font-weight: 400; + } + } +} diff --git a/_sass/partials/pages/_signup_rotate.scss b/_sass/partials/pages/_signup_rotate.scss new file mode 100755 index 0000000..74fe802 --- /dev/null +++ b/_sass/partials/pages/_signup_rotate.scss @@ -0,0 +1,186 @@ +.signup-rotate { + min-height: 100vh; + background-attachment: fixed !important; + + background: #5E7A9B; + background: -webkit-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -moz-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -o-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: linear-gradient(top, #355069 0, #5E7A9B 100%); + + .header { + .logo { + margin-top: 40px; + text-align: center; + + a { + color: #fff; + font-size: 31px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.6); + + @include transition(color .25s linear); + + &:hover { + text-decoration: none; + color: #bbb; + } + } + } + + h4 { + color: #fff; + text-align: center; + font-size: 25px; + font-weight: 400; + margin-top: 45px; + margin-bottom: 5px; + } + + p { + color: #fff; + text-align: center; + } + } + + .rotate-container { + -webkit-perspective: 1000; + -moz-perspective: 1000; + -ms-perspective: 1000; + -o-perspective: 1000; + margin: 0 auto; + } + + .wrappers { + min-height: 445px; + + @include transitionPrefix(transform, 1s); + + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; + + &.flipped { + @include transform(rotateY(180deg)); + } + + &.flipped-ended { + .front { + z-index: 1; + } + .back { + z-index: 3; + } + } + } + + .wrapper { + margin: 0 auto; + width: 51%; + margin-top: 25px; + background: #fff; + padding: 15px 50px 25px 50px; + border-radius: 5px; + border-top: 6px solid #6ED5E4; + + @media(max-width: 991px) { + width: 67%; + } + + @media(max-width: 767px) { + width: 100%; + } + + position: absolute; + left: 0; + right: 0; + + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -o-backface-visibility: hidden; + + /* These are commented out because they break the rotation on IE */ + /*-ms-backface-visibility: hidden;*/ + /*backface-visibility: hidden;*/ + + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; + + &.front { + z-index: 3; + } + + &.back { + z-index: 1; + + @include transform(rotateY(180deg)); + + h3 { + margin-top: -5px; + margin-bottom: 45px; + text-align: center; + font-weight: 400; + } + } + + .formy { + margin-top: 22px; + + .form-group { + label { + color: #46515F; + } + } + + .checkbox { + label { + color: #666; + font-size: 13px; + } + + input { + position: relative; + top: -1px; + } + } + + .submit { + text-align: center; + + .button-clear { + margin-top: 35px; + display: inline-block; + } + } + } + } + + .change-view { + text-align: center; + color: #fff; + margin-top: 25px; + margin-bottom: 70px; + font-size: 13px; + font-weight: 500; + display: none; + + &.active { + display: block; + } + + a { + color: #fff; + text-decoration: underline; + } + + .popover-content { + color: #000; + font-size: 17px; + font-weight: 400; + } + } +} diff --git a/_sass/partials/pages/_status.scss b/_sass/partials/pages/_status.scss new file mode 100755 index 0000000..2787e89 --- /dev/null +++ b/_sass/partials/pages/_status.scss @@ -0,0 +1,162 @@ +.status-page { + margin-top: 40px; + margin-bottom: 130px; + + .header { + text-align: center; + + h3 { + font-size: 22px; + color: #444; + line-height: 25px; + font-weight: 500; + margin-bottom: 7px; + } + + p { + font-size: 16px; + font-weight: 400; + color: #888; + } + } + + .current-status { + background: #F7F8FB; + border: 1px solid #EAEDF7; + border-radius: 8px; + box-shadow: inset rgba(100, 100, 100, 0.25) 0 1px 1px; + padding: 20px 30px; + margin: 0 auto; + margin-top: 35px; + + .updated { + float: right; + color: #616A72; + font-size: 13px; + + @media(max-width: 767px) { + float: none; + text-align: center; + display: block; + margin-bottom: 20px; + } + } + + .status { + font-size: 18px; + font-weight: 500; + + .color { + width: 15px; + height: 15px; + border-radius: 50px; + float: left; + position: relative; + top: 5px; + margin-right: 20px; + + &.green { + background: #96cb4c; + border: 1px solid #8BC43D; + box-shadow: 0px 0px 7px 2px #B3E074, inset 0px 2px 1px -1px rgba(255, 255, 255, 0.8); + } + + &.yellow { + background: #F0D775; + border: 1px solid #E0CC7E; + box-shadow: 0px 0px 7px 2px #F0D775, inset 0px 2px 1px -1px rgba(255, 255, 255, 0.8); + } + + &.red { + background: #F56B65; + border: 1px solid #FC7D77; + box-shadow: 0px 0px 7px 2px #FF9B96, inset 0px 2px 1px -1px rgba(255, 255, 255, 0.8); + } + } + } + + .help { + margin-top: 7px; + margin-left: 35px; + } + } + + .modules { + margin-top: 40px; + border-radius: 5px; + + >.list-group .list-group-item { + padding: 13px 15px; + + &:first-child { + border-top: 0px; + border-top-right-radius: 5px; + border-top-left-radius: 5px; + } + + .status { + float: right; + color: #0F9B0F; + font-size: 13px; + font-weight: 500; + + &.down { + color: #D88C1B; + } + } + } + } + + .messages { + margin-top: 35px; + + h3 { + font-size: 18px; + color: #444; + margin-bottom: 25px; + } + + .date { + margin-bottom: 25px; + + .day { + font-size: 13px; + font-weight: bold; + color: #454545; + padding-bottom: 6px; + margin-bottom: 6px; + border-bottom: 1px solid #eee; + } + + .ok { + color: #0F9B0F; + font-size: 13px; + font-weight: 500; + } + + .issues { + color: #D88C1B; + font-size: 13px; + font-weight: 500; + margin-bottom: 18px; + } + + .update { + color: #333; + font-size: 13px; + + strong { + font-size: 13px; + font-weight: bold; + color: #454545; + min-width: 93px; + display: inline-block; + } + } + } + } + + .full-history { + margin-top: 50px; + } +} diff --git a/_sass/partials/pages/_support.scss b/_sass/partials/pages/_support.scss new file mode 100755 index 0000000..5c82c9d --- /dev/null +++ b/_sass/partials/pages/_support.scss @@ -0,0 +1,128 @@ +.support-header { + margin-top: -20px; + background: #F4F7FA; + border-bottom: 1px solid #DCE4EC; + padding: 50px 0px; + + @media(max-width: 767px) { + padding: 30px 0px; + text-align: center; + } + + h2, p { + text-shadow: 1px 1px 1px #fff; + } + + h2 { + @media(max-width: 767px) { + font-size: 27px; + } + + .entypo-lifebuoy { + position: absolute; + left: -25px; + top: 22px; + font-size: 29px; + color: #7AA3C5; + + @media(max-width: 767px) { + position: relative; + left: 0px; + } + } + } + + p { + font-size: 17px; + color: #5A5A5A; + + @media(max-width: 767px) { + font-size: 15px; + } + } + + form { + margin-top: 30px; + + .input-group { + &:before { + display: inline-block; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + line-height: 1; + content: "\f002"; + position: absolute; + top: 14px; + left: 13px; + font-size: 20px; + z-index: 99; + color: rgb(208, 218, 228); + } + } + + .form-control { + height: 50px; + font-size: 17px; + line-height: 20px; + padding-left: 42px; + + @include placeholder { + color: #BCC8D6; + font-size: 17px; + font-weight: 300; + } + } + + .input-group-btn { + .btn { + padding: 14px 18px; + } + } + } +} + +.support-topics { + margin-top: 40px; + + h4 { + font-weight: 400; + margin-bottom: 50px; + font-size: 25px; + } + + .topic { + margin-bottom: 45px; + + @media(max-width: 767px) { + text-align: center; + } + + .icon { + display: block; + font-size: 45px; + color: #70CBF5; + } + + a { + color: #454545; + text-decoration: none; + @include transition(all 0.2s linear); + + strong { + display: block; + margin-top: 15px; + font-size: 16px; + } + + &:hover { + color: #5CB9E4; + } + } + + p { + margin-top: 17px; + color: #838383; + } + } +} diff --git a/_sass/partials/pages/_timeline.scss b/_sass/partials/pages/_timeline.scss new file mode 100755 index 0000000..bded439 --- /dev/null +++ b/_sass/partials/pages/_timeline.scss @@ -0,0 +1,251 @@ +.timeline-bg { + background: #f7f8fa; +} + +.timeline-wrapper { + margin-top: 60px; + position: relative; + + &:before { + content: ''; + position: absolute; + width: 5px; + height: 100%; + left: 0; + background: #e7e8ec; + right: 0; + margin: 0 auto; + z-index: -1; + } + + .year { + text-align: center; + margin-bottom: 50px; + font-weight: 600; + margin-top: 50px; + font-size: 16px; + + &:nth-child(1) { + margin-top: 0px; + margin-bottom: 60px; + } + + &.last { + margin-bottom: 0; + font-size: 21px; + } + + span { + display: inline-block; + background: #E7E8EC; + padding: 6px 20px; + color: #5A5A5A; + border-radius: 3px; + } + } + + /* the first node that comes right next to a year */ + .year + .node { + margin-top: -20px; + } + + .node { + position: relative; + float: right; + clear: right; + width: 44%; + margin: 35px 0; + border-radius: 5px; + + @media(max-width: 767px) { + width: 100%; + } + + &.left { + float: left; + clear: left; + + &:before { + right: -51px; + left: inherit; + + @media(max-width: 991px) { + right: -42px; + width: 43px; + } + } + + .marker { + left: inherit; + right: -65px; + + @media(max-width: 991px) { + right: -52px; + } + } + } + + &:before { + content: ''; + position: absolute; + width: 50px; + height: 4px; + background: #E7E8EC; + left: -51px; + top: 62px; + + @media(max-width: 991px) { + left: -42px; + width: 43px; + } + + @media(max-width: 767px) { + display: none; + } + } + + .marker { + position: absolute; + width: 17px; + height: 17px; + border-radius: 25px; + background: #e7e8ec; + left: -65px; + top: 55px; + border: 3px solid #F7F8FA; + + @media(max-width: 991px) { + left: -51px; + } + + @media(max-width: 767px) { + display: none; + } + } + + .entry { + position: relative; + padding: 20px; + height: 400px; + background-size: cover; + background-position: center center; + border-radius: 5px; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.26); + + &:before { + position: absolute; + top: 50%; + bottom: 0; + left: 0; + right: 0; + content: ''; + border-radius: 0 0 5px 5px; + background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.89) 100%); + background: -moz-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.89) 100%); + background: -o-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.89) 100%); + background: linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.89) 100%); + } + + &.smallish { + height: 320px; + + .intro { + top: 68%; + } + } + + &.short-entry { + background: #E7E8EC; + color: #5c6269; + height: inherit; + padding: 13px; + box-shadow: none; + position: relative; + top: 41px; + left: -1px; + margin-bottom: 20px; + text-shadow: 1px 1px rgba(255, 255, 255, 0.4); + + &:before { + background: none; + } + } + + .intro { + position: relative; + top: 75%; + color: #FFF; + z-index: 9; + letter-spacing: .3px; + + h4 { + font-size: 20px; + text-shadow: 1px 1px rgba(0, 0, 0, 0.69); + letter-spacing: .5px; + + @media(max-width: 767px) { + font-size: 17px; + } + } + + p { + font-weight: 300; + + @media(max-width: 767px) { + font-size: 13px; + } + } + } + } + + .news { + position: relative; + background-size: cover; + background-position: center center; + border-radius: 5px; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.26); + background: #fff; + + section { + padding: 30px 20px 60px 20px; + + h3 { + margin-top: 0; + font-size: 17px; + line-height: 22px; + } + + p { + margin-top: 21px; + line-height: 22px; + font-size: 13px; + color: #7A7979; + } + } + + footer { + position: absolute; + bottom: 0; + padding: 12px 20px; + width: 100%; + + font-size: 12px; + font-weight: 500; + color: #9EAEBE; + + .tag { + position: relative; + padding-left: 27px; + text-transform: uppercase; + + span { + font-size: 24px; + position: absolute; + top: -4px; + left: 0; + } + } + } + } + } +} diff --git a/_sass/partials/snippets/_features.scss b/_sass/partials/snippets/_features.scss new file mode 100755 index 0000000..7dd61c7 --- /dev/null +++ b/_sass/partials/snippets/_features.scss @@ -0,0 +1,133 @@ +.features-section { + margin-top: 90px; + + &--margin { + margin-top: 120px; + + .feature { + margin-bottom: 110px; + + &.last { + margin-bottom: 50px; + } + } + } + + @media(max-width: 991px) { + margin-top: 50px; + } + + .header { + text-align: center; + + h2 { + color: #555; + font-weight: 400; + font-size: 27px; + + @media (max-width: 767px) { + font-size: 25px; + } + } + + p { + font-size: 17px; + color: #757575; + } + } + + .feature { + margin-top: 60px; + + &.last { + .image img { + margin-left: 70px; + } + } + + @media (min-width: 992px) { + &.backwards { + .info { + float: right; + } + + .image { + float: left; + + img { + margin: 0 auto; + } + } + } + } + + @media (max-width: 991px) { + margin-top: 10px; + } + + .info { + h4 { + color: #3B88B6; + font-weight: normal; + font-size: 19px; + line-height: 25px; + margin-top: 35px; + + @media (max-width: 991px) { + text-align: center; + } + } + + p { + color: #6C7279; + font-size: 14px; + margin-top: 20px; + line-height: 24px; + width: 83%; + font-weight: normal; + + @media (max-width: 991px) { + text-align: center; + width: 100%; + font-size: 14px; + } + } + } + + .image { + @media (max-width: 991px) { + img { + margin: 0 auto !important; + margin-top: 20px; + } + } + } + } + + .divider { + height: 1px; + width: 100%; + background-color: #ddd; + position: relative; + margin: 70px 0 60px; + + &:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 2px; + background-image: -webkit-gradient(linear, left top, right top, color-stop(0, rgba(255, 255, 255, 0.75)), color-stop(0.5, rgba(250,250,250,0)), color-stop(1, rgba(255, 255, 255, 0.75))); + background-image: -webkit-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250,250,250,0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -moz-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250,250,250,0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -o-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250,250,250,0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -ms-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250,250,250,0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250,250,250,0) 50%, rgba(255, 255, 255, 0.75) 100%); + } + + @media (max-width: 991px) { + margin: 55px 0 35px; + } + } +} diff --git a/_sass/partials/snippets/_slider.scss b/_sass/partials/snippets/_slider.scss new file mode 100755 index 0000000..0117753 --- /dev/null +++ b/_sass/partials/snippets/_slider.scss @@ -0,0 +1,129 @@ +.slider-section { + margin-top: 70px; + + @media (max-width: 991px) { + margin-top: 30px; + } + + .header { + text-align: center; + + h3 { + font-size: 25px; + color: #555; + line-height: 25px; + font-weight: 400; + margin-bottom: 15px; + } + } + + .slide-wrapper { + border-bottom: 1px solid #E4E4E4; + + .slideshow { + background: url("../../images/slider-bg.png") 0 0 no-repeat; + margin: 0 auto; + margin-top: 35px; + width: 844px; + height: 418px; + position: relative; + overflow: hidden; + + @media(max-width: 991px) { + background: none; + width: inherit; + height: 340px; + } + + @media(max-width: 620px) { + height: 290px; + } + + @media(max-width: 530px) { + height: 240px; + } + + @media(max-width: 450px) { + height: 205px; + } + + .btn-nav { + width: 48px; + height: 51px; + position: absolute; + top: 55%; + z-index: 999; + cursor: pointer; + opacity: 0; + filter: alpha(opacity=0); + -webkit-transition: all .3s ease; + -moz-transition: all .3s ease; + -o-transition: all .3s ease; + -ms-transition: all .3s ease; + transition: all .3s ease; + + &.active { + opacity: 1; + filter: alpha(opacity=100); + @include transform(translateX(0px) !important); + } + + &.prev { + background: url("../../images/slider/slide-left.png") 0 0 no-repeat; + left: 91px; + @include transform(translateX(-48px)); + + @media(max-width: 991px) { + left: 30px; + } + } + + &.next { + background: url("../../images/slider/slide-right.png") 0 0 no-repeat; + right: 91px; + @include transform(translateX(48px)); + + @media(max-width: 991px) { + right: 29px; + } + } + } + + .slide { + width: 100%; + height: 100%; + position: absolute; + + &.active { + img { + opacity: 1; + filter: alpha(opacity=100); + @include transform(translateY(0px)); + } + } + + img { + position: absolute; + bottom: 0; + left: 0; + right: 0; + margin: auto; + + @include transform(translateY(300px)); + opacity: 0; + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + filter: alpha(opacity=0); + -webkit-transition: all .6s ease; + -moz-transition: all .6s ease; + -o-transition: all .6s ease; + -ms-transition: all .6s ease; + transition: all .6s ease; + + @media(max-width: 767px) { + width: 100%; + } + } + } + } + } +} \ No newline at end of file diff --git a/_sass/theme.scss b/_sass/theme.scss new file mode 100755 index 0000000..6a0ab8e --- /dev/null +++ b/_sass/theme.scss @@ -0,0 +1,579 @@ +@import "modules/mixins"; +@import "modules/elements"; +@import "modules/buttons"; + +/* vendor */ +@import "bootstrap/bootstrap"; +@import "bootstrap/overrides"; + +/* config variables */ +@import "partials/config"; + +/* layout */ +@import "partials/layout"; + +/* snippets */ +@import "partials/snippets/features"; +@import "partials/snippets/slider"; + +/* pages */ +@import "partials/pages/index"; +@import "partials/pages/index2"; +@import "partials/pages/index3"; +@import "partials/pages/features"; +@import "partials/pages/services"; +@import "partials/pages/signup"; +@import "partials/pages/signup_rotate"; +@import "partials/pages/blog"; +@import "partials/pages/blog_cols"; +@import "partials/pages/blog_timeline"; +@import "partials/pages/blogpost"; +@import "partials/pages/pricing"; +@import "partials/pages/charts"; +@import "partials/pages/aboutus"; +@import "partials/pages/contactus"; +@import "partials/pages/status"; +@import "partials/pages/gallery"; +@import "partials/pages/portfolio"; +@import "partials/pages/portfolio_item"; +@import "partials/pages/support"; +@import "partials/pages/404"; +@import "partials/pages/coming_soon"; +@import "partials/pages/docs"; +@import "partials/pages/invoice"; +@import "partials/pages/timeline"; + +#docs { + #guide { + margin-top: 70px; + } + + #api-docs { + margin-left: 200px !important; + margin-top: -20px !important; + } +} + +.index-sidebar-hero .cta a.button { + padding: 12px 30px; +} + +.nav-menu .main-menu { + h4 { + color: darken(white, 10%); + margin-left: 5rem; + } + + ul { + margin-top: 2rem; + } + + ul li a { + padding-left: 3rem; + } +} + +body { + background: #414B5B; + font-size: 15px; + line-height: 1.5; + + .page-content { + background: white; + } +} + +#next { + float: right; + margin: 40px 0 40px 0; +} + +h1, h2 { + color: black; + + a, a:hover { + color: black; + text-decoration: none; + position: relative; + } + + a { + &:hover { + &:before { + content: '\00b6'; + position: absolute; + left: -18px; + color: grey; + font-size: 18px; + font-family: sans-serif; + top: 4px; + } + } + } +} + +h3, h4, h5 { + color: #727272; + + a, a:hover { + color: #727272; + text-decoration: none; + + } +} + +h4 { + margin-top: 40px; + border-bottom: 1px solid #f0f0f0; +} + +.main-footer { + margin-top: 0; +} + +.get-started { + margin-top: 40px; + padding: 40px 20px; + background: -webkit-linear-gradient(top, #355069 0, #5E7A9B 100%); + /*background: radial-gradient(#36414E, #253241);*/ + + font-size: 16px; + color: #f8f8f8; + font-weight: 400; + line-height: 25px; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); + + h2 { + color: white; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); + } + + a { + color: #90CAF9; + } +} + +#docs #api-docs #methods .method .method-section { + padding-top: 0; +} + +// hack bc I can't get jekyll variables in sass atm +#cover-image { + &.prod-bg { + background-image: url("/jsonapi_suite/assets/img/sunrise.png") !important; + } + + &.dev-bg { + background-image: url("/assets/img/sunrise.png") !important; + } +} + +.solution { + img { + margin-left: 30px !important; + height: 300px; + } +} + +pre { + background: #292E33; + + code.hljs { + background: #292E33; + color: lighten(#DAE4F2, 5%); + line-height: 20px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } +} + +img[alt=github] { + margin-right: 5px; + width: 20px; + height: 20px; +} + +.js-toc, .ruby-toc, blockquote { + background: #f7f8fb; + border: 1px solid #eaedf7; + border-radius: 5px; + padding: 10px; + line-height: 1.8; +} + +.ruby-toc { + ul { + padding-left: 25px; + } +} + +.ruby-toc + div { + margin-bottom: 20px; + font-size: 16px; +} + +blockquote { + &.url { + font-size: 14px; + color: grey; + margin-top: -12px; + } +} + +ul ul { // toc + padding-left: 20px; +} + +pre.highlight, pre.hljs { + code { + &.coffeescript, &.cs, &.javascript, &.js, &.ts, &.php { + [class*=built_in] { + color: lighten(#9AB4DB, 5%); + } + [class*=string] { + color: lightgreen; + } + [class*=attribute] { + color: white; + } + [class*=keyword] { + color: lighten(brown, 30%); + font-weight: 600; + } + [class*=literal] { + color: lighten(red, 30%); + } + [class*=c1] { + color: #B4B4B4; + } + [class*=constant] { + color: #FFDF9D; + } + [class*=nx] { + color: saturate(#9ECBEE, 20%); + font-weight: 600; + } + } + + &.typescript { + [class*=kr] { + color: desaturate(yellow, 30%); + } + } + + &.ruby { + .class .title, .class .parent { + color: #FFDF9D; + } + + [class*=keyword] { + color: lighten(red, 25%); + } + [class*=kp] { + color: lighten(red, 25%); + } + [class*=string] { + color: lightgreen; + } + [class*=comment] { + color: #B4B4B4; + } + [class*=constant] { + color: #FFDF9D; + } + [class*=symbol] { + color: #9ECBEE; + } + } + } +} + +img[alt=glimmer_logo] { + margin: 0 auto; + width: 200px; + display: block; + margin-bottom: 4em; +} + +.tabs { + background: #f8f8f8; + border-radius: 3px; + + .tab { + background-color: #f8f8f8; + font-weight: 500; + color: #555; + display: inline-block; + padding: 18px 25px; + margin-top: 10px; + cursor: pointer; + -webkit-transition: background-color .2s linear; + -moz-transition: background-color .2s linear; + -ms-transition: background-color .2s linear; + -o-transition: background-color .2s linear; + transition: background-color .2s linear; + + &.active { + background-color: #fff; + border: 1px solid #e8e8e8; + border-radius: 5px 5px 0 0; + border-bottom: 0; + } + } +} + +.highlight { + $generic: #edf2f9; + $comment: #9c9c9c; + $yellow: #e6eb9d; + $blue: #a2dcff; + + pre { + code { + font-size: 14px; + line-height: 1.5; + } + } + + .language-ruby { + .n { + color: white; + } + + .c1 { + color: $comment; + } + + .ss { + color: $blue; + font-weight: 600; + } + + .k, .kp { + color: #ff8080; + } + + .p { + color: white; + } + + .nc, .no { + color: $yellow; + font-weight: 600; + } + + .o, .si, .nf { + color: white; + } + + .s1, .s2 { + color: lightgreen; + font-weight: 600; + } + + .vi, .mi, .nb { + color: lighten(#ff66d9, 10%); + font-weight: 600; + } + } + + .language-typescript, .language-javascript { + .kd { + color: $generic; + font-weight: 600; + } + + .o { + color: $generic; + } + + .p { + color: $generic; + } + + .nx, .nd { + color: $blue; + font-weight: 600; + } + + .nb { + color: white; + } + + .kc { + color: $yellow; + } + + .kr { + color: lighten(#008080, 20%); + } + + .c1 { + color: #9c9c9c; + } + + .k { + color: #ff66d9; + } + + .err { + font-weight: 600; + color: $yellow; + } + + .na, .nl { + color: #ff66d9; + } + + .s1, .s2 { + color: lightgreen; + font-weight: 600; + } + + .mi { + color: $yellow; + } + } + + .language-bash { + color: white; + } + + .language-javascript { + .k { + color: $yellow !important; + } + } +} + +// TODO +body { + background-color: white; +} + +.home { + $base: 16px; + + width: 95%; + margin: 0 auto; + text-align: center; + font-size: $base; + line-height: 1.4; + padding-top: 10px; + z-index: 20; + + @media (min-width: 569px) { + font-size: 18px; + } + + .skip-intro { + position: absolute; + right: 20px; + padding: 3px 6px; + font-size: 90%; + } + + .start { + margin-top: 40px; + } + + // unused + .img { + position: absolute; + background-repeat: no-repeat; + opacity: 0.1; + width: 100%; + height: 100%; + background-position: 70% 10%; + background-size: 40%; + } + + .sample { + .highlight pre code { + font-size: 14px !important; + + @media (min-width: 569px) { + font-size: 18px !important; + } + } + + &.s { + .highlight pre code { + font-size: 11px !important; + + @media (min-width: 569px) { + font-size: 18px !important; + } + } + } + + figure { + &:last-child { + margin-bottom: 18px; + } + } + } + + .mag { + color: darken(magenta, 5%); + } + + .lg { + color: grey; + } + + .p { + margin-bottom: 2.5rem; + } + + .bold { + font-weight: bold; + } + + .italic { + font-style: italic; + } + + .underline { + text-decoration: underline; + } + + .s { + font-size: $base*1.2; + } + + .m { + font-size: $base*1.6; + } + + .l { + font-size: $base*2; + } + + .xl { + font-size: $base*2.2; + } + + .quote { + margin-top: 5px; + font-size: $base*1.2; + + @media (min-width: 569px) { + font-size: 24px !important; + } + + &.yehuda { + @media (min-width: 569px) { + font-size: 30px !important; + } + } + } + + .highlight { + text-align: left; + + pre { + padding-bottom: 0; + } + } +} diff --git a/_sass/vendor/animate.css b/_sass/vendor/animate.css new file mode 100755 index 0000000..a41cf60 --- /dev/null +++ b/_sass/vendor/animate.css @@ -0,0 +1,3492 @@ +@charset "UTF-8"; +/* +Animate.css - http://daneden.me/animate +Licensed under the MIT license + +Copyright (c) 2013 Daniel Eden + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +body { /* Addresses a small issue in webkit: http://bit.ly/NEdoDq */ + -webkit-backface-visibility: hidden; +} +.animated { + -webkit-animation-duration: 0.7s; + -moz-animation-duration: 0.7s; + -o-animation-duration: 0.7s; + animation-duration: 0.7s; + -webkit-animation-fill-mode: both; + -moz-animation-fill-mode: both; + -o-animation-fill-mode: both; + animation-fill-mode: both; +} + +.animated.hinge { + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -o-animation-duration: 2s; + animation-duration: 2s; +} + +@-webkit-keyframes flash { + 0%, 50%, 100% {opacity: 1;} + 25%, 75% {opacity: 0;} +} + +@-moz-keyframes flash { + 0%, 50%, 100% {opacity: 1;} + 25%, 75% {opacity: 0;} +} + +@-o-keyframes flash { + 0%, 50%, 100% {opacity: 1;} + 25%, 75% {opacity: 0;} +} + +@keyframes flash { + 0%, 50%, 100% {opacity: 1;} + 25%, 75% {opacity: 0;} +} + +.animated.flash { + -webkit-animation-name: flash; + -moz-animation-name: flash; + -o-animation-name: flash; + animation-name: flash; +} +@-webkit-keyframes shake { + 0%, 100% {-webkit-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-webkit-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-webkit-transform: translateX(10px);} +} + +@-moz-keyframes shake { + 0%, 100% {-moz-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-moz-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-moz-transform: translateX(10px);} +} + +@-o-keyframes shake { + 0%, 100% {-o-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-o-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-o-transform: translateX(10px);} +} + +@keyframes shake { + 0%, 100% {transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {transform: translateX(-10px);} + 20%, 40%, 60%, 80% {transform: translateX(10px);} +} + +.animated.shake { + -webkit-animation-name: shake; + -moz-animation-name: shake; + -o-animation-name: shake; + animation-name: shake; +} +@-webkit-keyframes bounce { + 0%, 20%, 50%, 80%, 100% {-webkit-transform: translateY(0);} + 40% {-webkit-transform: translateY(-30px);} + 60% {-webkit-transform: translateY(-15px);} +} + +@-moz-keyframes bounce { + 0%, 20%, 50%, 80%, 100% {-moz-transform: translateY(0);} + 40% {-moz-transform: translateY(-30px);} + 60% {-moz-transform: translateY(-15px);} +} + +@-o-keyframes bounce { + 0%, 20%, 50%, 80%, 100% {-o-transform: translateY(0);} + 40% {-o-transform: translateY(-30px);} + 60% {-o-transform: translateY(-15px);} +} +@keyframes bounce { + 0%, 20%, 50%, 80%, 100% {transform: translateY(0);} + 40% {transform: translateY(-30px);} + 60% {transform: translateY(-15px);} +} + +.animated.bounce { + -webkit-animation-name: bounce; + -moz-animation-name: bounce; + -o-animation-name: bounce; + animation-name: bounce; +} +@-webkit-keyframes tada { + 0% {-webkit-transform: scale(1);} + 10%, 20% {-webkit-transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {-webkit-transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {-webkit-transform: scale(1.1) rotate(-3deg);} + 100% {-webkit-transform: scale(1) rotate(0);} +} + +@-moz-keyframes tada { + 0% {-moz-transform: scale(1);} + 10%, 20% {-moz-transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {-moz-transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {-moz-transform: scale(1.1) rotate(-3deg);} + 100% {-moz-transform: scale(1) rotate(0);} +} + +@-o-keyframes tada { + 0% {-o-transform: scale(1);} + 10%, 20% {-o-transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {-o-transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {-o-transform: scale(1.1) rotate(-3deg);} + 100% {-o-transform: scale(1) rotate(0);} +} + +@keyframes tada { + 0% {transform: scale(1);} + 10%, 20% {transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {transform: scale(1.1) rotate(-3deg);} + 100% {transform: scale(1) rotate(0);} +} + +.animated.tada { + -webkit-animation-name: tada; + -moz-animation-name: tada; + -o-animation-name: tada; + animation-name: tada; +} +@-webkit-keyframes swing { + 20%, 40%, 60%, 80%, 100% { -webkit-transform-origin: top center; } + 20% { -webkit-transform: rotate(15deg); } + 40% { -webkit-transform: rotate(-10deg); } + 60% { -webkit-transform: rotate(5deg); } + 80% { -webkit-transform: rotate(-5deg); } + 100% { -webkit-transform: rotate(0deg); } +} + +@-moz-keyframes swing { + 20% { -moz-transform: rotate(15deg); } + 40% { -moz-transform: rotate(-10deg); } + 60% { -moz-transform: rotate(5deg); } + 80% { -moz-transform: rotate(-5deg); } + 100% { -moz-transform: rotate(0deg); } +} + +@-o-keyframes swing { + 20% { -o-transform: rotate(15deg); } + 40% { -o-transform: rotate(-10deg); } + 60% { -o-transform: rotate(5deg); } + 80% { -o-transform: rotate(-5deg); } + 100% { -o-transform: rotate(0deg); } +} + +@keyframes swing { + 20% { transform: rotate(15deg); } + 40% { transform: rotate(-10deg); } + 60% { transform: rotate(5deg); } + 80% { transform: rotate(-5deg); } + 100% { transform: rotate(0deg); } +} + +.animated.swing { + -webkit-transform-origin: top center; + -moz-transform-origin: top center; + -o-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + -moz-animation-name: swing; + -o-animation-name: swing; + animation-name: swing; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes wobble { + 0% { -webkit-transform: translateX(0%); } + 15% { -webkit-transform: translateX(-25%) rotate(-5deg); } + 30% { -webkit-transform: translateX(20%) rotate(3deg); } + 45% { -webkit-transform: translateX(-15%) rotate(-3deg); } + 60% { -webkit-transform: translateX(10%) rotate(2deg); } + 75% { -webkit-transform: translateX(-5%) rotate(-1deg); } + 100% { -webkit-transform: translateX(0%); } +} + +@-moz-keyframes wobble { + 0% { -moz-transform: translateX(0%); } + 15% { -moz-transform: translateX(-25%) rotate(-5deg); } + 30% { -moz-transform: translateX(20%) rotate(3deg); } + 45% { -moz-transform: translateX(-15%) rotate(-3deg); } + 60% { -moz-transform: translateX(10%) rotate(2deg); } + 75% { -moz-transform: translateX(-5%) rotate(-1deg); } + 100% { -moz-transform: translateX(0%); } +} + +@-o-keyframes wobble { + 0% { -o-transform: translateX(0%); } + 15% { -o-transform: translateX(-25%) rotate(-5deg); } + 30% { -o-transform: translateX(20%) rotate(3deg); } + 45% { -o-transform: translateX(-15%) rotate(-3deg); } + 60% { -o-transform: translateX(10%) rotate(2deg); } + 75% { -o-transform: translateX(-5%) rotate(-1deg); } + 100% { -o-transform: translateX(0%); } +} + +@keyframes wobble { + 0% { transform: translateX(0%); } + 15% { transform: translateX(-25%) rotate(-5deg); } + 30% { transform: translateX(20%) rotate(3deg); } + 45% { transform: translateX(-15%) rotate(-3deg); } + 60% { transform: translateX(10%) rotate(2deg); } + 75% { transform: translateX(-5%) rotate(-1deg); } + 100% { transform: translateX(0%); } +} + +.animated.wobble { + -webkit-animation-name: wobble; + -moz-animation-name: wobble; + -o-animation-name: wobble; + animation-name: wobble; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes pulse { + 0% { -webkit-transform: scale(1); } + 50% { -webkit-transform: scale(1.1); } + 100% { -webkit-transform: scale(1); } +} +@-moz-keyframes pulse { + 0% { -moz-transform: scale(1); } + 50% { -moz-transform: scale(1.1); } + 100% { -moz-transform: scale(1); } +} +@-o-keyframes pulse { + 0% { -o-transform: scale(1); } + 50% { -o-transform: scale(1.1); } + 100% { -o-transform: scale(1); } +} +@keyframes pulse { + 0% { transform: scale(1); } + 50% { transform: scale(1.1); } + 100% { transform: scale(1); } +} + +.animated.pulse { + -webkit-animation-name: pulse; + -moz-animation-name: pulse; + -o-animation-name: pulse; + animation-name: pulse; +} +@-webkit-keyframes flip { + 0% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -webkit-animation-timing-function: ease-out; + } + 40% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -webkit-animation-timing-function: ease-out; + } + 50% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -webkit-animation-timing-function: ease-in; + } + 80% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + -webkit-animation-timing-function: ease-in; + } + 100% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -webkit-animation-timing-function: ease-in; + } +} +@-moz-keyframes flip { + 0% { + -moz-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -moz-animation-timing-function: ease-out; + } + 40% { + -moz-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -moz-animation-timing-function: ease-out; + } + 50% { + -moz-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -moz-animation-timing-function: ease-in; + } + 80% { + -moz-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + -moz-animation-timing-function: ease-in; + } + 100% { + -moz-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -moz-animation-timing-function: ease-in; + } +} +@-o-keyframes flip { + 0% { + -o-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -o-animation-timing-function: ease-out; + } + 40% { + -o-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -o-animation-timing-function: ease-out; + } + 50% { + -o-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -o-animation-timing-function: ease-in; + } + 80% { + -o-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + -o-animation-timing-function: ease-in; + } + 100% { + -o-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -o-animation-timing-function: ease-in; + } +} +@keyframes flip { + 0% { + transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + animation-timing-function: ease-out; + } + 40% { + transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + animation-timing-function: ease-out; + } + 50% { + transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + animation-timing-function: ease-in; + } + 80% { + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + animation-timing-function: ease-in; + } + 100% { + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + animation-timing-function: ease-in; + } +} + +.animated.flip { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flip; + -moz-backface-visibility: visible !important; + -moz-animation-name: flip; + -o-backface-visibility: visible !important; + -o-animation-name: flip; + backface-visibility: visible !important; + animation-name: flip; +} +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateX(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@-moz-keyframes flipInX { + 0% { + -moz-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -moz-transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -moz-transform: perspective(400px) rotateX(10deg); + } + + 100% { + -moz-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@-o-keyframes flipInX { + 0% { + -o-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -o-transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -o-transform: perspective(400px) rotateX(10deg); + } + + 100% { + -o-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@keyframes flipInX { + 0% { + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + transform: perspective(400px) rotateX(-10deg); + } + + 70% { + transform: perspective(400px) rotateX(10deg); + } + + 100% { + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} + +.animated.flipInX { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipInX; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipInX; + -o-backface-visibility: visible !important; + -o-animation-name: flipInX; + backface-visibility: visible !important; + animation-name: flipInX; +} +@-webkit-keyframes flipOutX { + 0% { + -webkit-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@-moz-keyframes flipOutX { + 0% { + -moz-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -moz-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@-o-keyframes flipOutX { + 0% { + -o-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -o-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@keyframes flipOutX { + 0% { + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +.animated.flipOutX { + -webkit-animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + -moz-animation-name: flipOutX; + -moz-backface-visibility: visible !important; + -o-animation-name: flipOutX; + -o-backface-visibility: visible !important; + animation-name: flipOutX; + backface-visibility: visible !important; +} +@-webkit-keyframes flipInY { + 0% { + -webkit-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateY(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@-moz-keyframes flipInY { + 0% { + -moz-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -moz-transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -moz-transform: perspective(400px) rotateY(10deg); + } + + 100% { + -moz-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@-o-keyframes flipInY { + 0% { + -o-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -o-transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -o-transform: perspective(400px) rotateY(10deg); + } + + 100% { + -o-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@keyframes flipInY { + 0% { + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + transform: perspective(400px) rotateY(-10deg); + } + + 70% { + transform: perspective(400px) rotateY(10deg); + } + + 100% { + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} + +.animated.flipInY { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipInY; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipInY; + -o-backface-visibility: visible !important; + -o-animation-name: flipInY; + backface-visibility: visible !important; + animation-name: flipInY; +} +@-webkit-keyframes flipOutY { + 0% { + -webkit-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@-moz-keyframes flipOutY { + 0% { + -moz-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -moz-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@-o-keyframes flipOutY { + 0% { + -o-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -o-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@keyframes flipOutY { + 0% { + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} + +.animated.flipOutY { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipOutY; + -o-backface-visibility: visible !important; + -o-animation-name: flipOutY; + backface-visibility: visible !important; + animation-name: flipOutY; +} +@-webkit-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@-moz-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@-o-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +.animated.fadeIn { + -webkit-animation-name: fadeIn; + -moz-animation-name: fadeIn; + -o-animation-name: fadeIn; + animation-name: fadeIn; +} +@-webkit-keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInUp { + 0% { + opacity: 0; + -moz-transform: translateY(20px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-o-keyframes fadeInUp { + 0% { + opacity: 0; + -o-transform: translateY(20px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInUp { + 0% { + opacity: 0; + transform: translateY(20px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.animated.fadeInUp { + -webkit-animation-name: fadeInUp; + -moz-animation-name: fadeInUp; + -o-animation-name: fadeInUp; + animation-name: fadeInUp; +} +@-webkit-keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInDown { + 0% { + opacity: 0; + -moz-transform: translateY(-20px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-o-keyframes fadeInDown { + 0% { + opacity: 0; + -o-transform: translateY(-20px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInDown { + 0% { + opacity: 0; + transform: translateY(-20px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.animated.fadeInDown { + -webkit-animation-name: fadeInDown; + -moz-animation-name: fadeInDown; + -o-animation-name: fadeInDown; + animation-name: fadeInDown; +} +@-webkit-keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes fadeInLeft { + 0% { + opacity: 0; + -moz-transform: translateX(-20px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} + +@-o-keyframes fadeInLeft { + 0% { + opacity: 0; + -o-transform: translateX(-20px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} + +@keyframes fadeInLeft { + 0% { + opacity: 0; + transform: translateX(-20px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.animated.fadeInLeft { + -webkit-animation-name: fadeInLeft; + -moz-animation-name: fadeInLeft; + -o-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} +@-webkit-keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes fadeInRight { + 0% { + opacity: 0; + -moz-transform: translateX(20px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} + +@-o-keyframes fadeInRight { + 0% { + opacity: 0; + -o-transform: translateX(20px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} + +@keyframes fadeInRight { + 0% { + opacity: 0; + transform: translateX(20px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.animated.fadeInRight { + -webkit-animation-name: fadeInRight; + -moz-animation-name: fadeInRight; + -o-animation-name: fadeInRight; + animation-name: fadeInRight; +} +@-webkit-keyframes fadeInUpBig { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInUpBig { + 0% { + opacity: 0; + -moz-transform: translateY(2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-o-keyframes fadeInUpBig { + 0% { + opacity: 0; + -o-transform: translateY(2000px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInUpBig { + 0% { + opacity: 0; + transform: translateY(2000px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.animated.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + -moz-animation-name: fadeInUpBig; + -o-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} +@-webkit-keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInDownBig { + 0% { + opacity: 0; + -moz-transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-o-keyframes fadeInDownBig { + 0% { + opacity: 0; + -o-transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInDownBig { + 0% { + opacity: 0; + transform: translateY(-2000px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.animated.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + -moz-animation-name: fadeInDownBig; + -o-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} +@-webkit-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} +@-moz-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -moz-transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} +@-o-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -o-transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} +@keyframes fadeInLeftBig { + 0% { + opacity: 0; + transform: translateX(-2000px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.animated.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + -moz-animation-name: fadeInLeftBig; + -o-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} +@-webkit-keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes fadeInRightBig { + 0% { + opacity: 0; + -moz-transform: translateX(2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} + +@-o-keyframes fadeInRightBig { + 0% { + opacity: 0; + -o-transform: translateX(2000px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} + +@keyframes fadeInRightBig { + 0% { + opacity: 0; + transform: translateX(2000px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.animated.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + -moz-animation-name: fadeInRightBig; + -o-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} +@-webkit-keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@-moz-keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@-o-keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +.animated.fadeOut { + -webkit-animation-name: fadeOut; + -moz-animation-name: fadeOut; + -o-animation-name: fadeOut; + animation-name: fadeOut; +} +@-webkit-keyframes fadeOutUp { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-20px); + } +} +@-moz-keyframes fadeOutUp { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(-20px); + } +} +@-o-keyframes fadeOutUp { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(-20px); + } +} +@keyframes fadeOutUp { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(-20px); + } +} + +.animated.fadeOutUp { + -webkit-animation-name: fadeOutUp; + -moz-animation-name: fadeOutUp; + -o-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} +@-webkit-keyframes fadeOutDown { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(20px); + } +} + +@-moz-keyframes fadeOutDown { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(20px); + } +} + +@-o-keyframes fadeOutDown { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(20px); + } +} + +@keyframes fadeOutDown { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(20px); + } +} + +.animated.fadeOutDown { + -webkit-animation-name: fadeOutDown; + -moz-animation-name: fadeOutDown; + -o-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} +@-webkit-keyframes fadeOutLeft { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-20px); + } +} + +@-moz-keyframes fadeOutLeft { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(-20px); + } +} + +@-o-keyframes fadeOutLeft { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(-20px); + } +} + +@keyframes fadeOutLeft { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(-20px); + } +} + +.animated.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + -moz-animation-name: fadeOutLeft; + -o-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} +@-webkit-keyframes fadeOutRight { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(20px); + } +} + +@-moz-keyframes fadeOutRight { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(20px); + } +} + +@-o-keyframes fadeOutRight { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(20px); + } +} + +@keyframes fadeOutRight { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(20px); + } +} + +.animated.fadeOutRight { + -webkit-animation-name: fadeOutRight; + -moz-animation-name: fadeOutRight; + -o-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} +@-webkit-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } +} + +@-moz-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(-2000px); + } +} + +@-o-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(-2000px); + } +} + +@keyframes fadeOutUpBig { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(-2000px); + } +} + +.animated.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + -moz-animation-name: fadeOutUpBig; + -o-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} +@-webkit-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + } +} + +@-moz-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(2000px); + } +} + +@-o-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(2000px); + } +} + +@keyframes fadeOutDownBig { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(2000px); + } +} + +.animated.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + -moz-animation-name: fadeOutDownBig; + -o-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} +@-webkit-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } +} + +@-moz-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(-2000px); + } +} + +@-o-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(-2000px); + } +} + +@keyframes fadeOutLeftBig { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(-2000px); + } +} + +.animated.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + -moz-animation-name: fadeOutLeftBig; + -o-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} +@-webkit-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + } +} +@-moz-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(2000px); + } +} +@-o-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(2000px); + } +} +@keyframes fadeOutRightBig { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(2000px); + } +} + +.animated.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + -moz-animation-name: fadeOutRightBig; + -o-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} +@-webkit-keyframes bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(.3); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.05); + } + + 70% { + -webkit-transform: scale(.9); + } + + 100% { + -webkit-transform: scale(1); + } +} + +@-moz-keyframes bounceIn { + 0% { + opacity: 0; + -moz-transform: scale(.3); + } + + 50% { + opacity: 1; + -moz-transform: scale(1.05); + } + + 70% { + -moz-transform: scale(.9); + } + + 100% { + -moz-transform: scale(1); + } +} + +@-o-keyframes bounceIn { + 0% { + opacity: 0; + -o-transform: scale(.3); + } + + 50% { + opacity: 1; + -o-transform: scale(1.05); + } + + 70% { + -o-transform: scale(.9); + } + + 100% { + -o-transform: scale(1); + } +} + +@keyframes bounceIn { + 0% { + opacity: 0; + transform: scale(.3); + } + + 50% { + opacity: 1; + transform: scale(1.05); + } + + 70% { + transform: scale(.9); + } + + 100% { + transform: scale(1); + } +} + +@-webkit-keyframes slideInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } + + 100% { + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes slideInDown { + 0% { + opacity: 0; + -moz-transform: translateY(-2000px); + } + + 100% { + -moz-transform: translateY(0); + } +} + +@-o-keyframes slideInDown { + 0% { + opacity: 0; + -o-transform: translateY(-2000px); + } + + 100% { + -o-transform: translateY(0); + } +} + +@keyframes slideInDown { + 0% { + opacity: 0; + transform: translateY(-2000px); + } + + 100% { + transform: translateY(0); + } +} + +.slideInDown { + -webkit-animation-name: slideInDown; + -moz-animation-name: slideInDown; + -o-animation-name: slideInDown; + animation-name: slideInDown; +} + +@-webkit-keyframes slideInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } + + 100% { + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes slideInLeft { + 0% { + opacity: 0; + -moz-transform: translateX(-2000px); + } + + 100% { + -moz-transform: translateX(0); + } +} + +@-o-keyframes slideInLeft { + 0% { + opacity: 0; + -o-transform: translateX(-2000px); + } + + 100% { + -o-transform: translateX(0); + } +} + +@keyframes slideInLeft { + 0% { + opacity: 0; + transform: translateX(-2000px); + } + + 100% { + transform: translateX(0); + } +} + +.slideInLeft { + -webkit-animation-name: slideInLeft; + -moz-animation-name: slideInLeft; + -o-animation-name: slideInLeft; + animation-name: slideInLeft; +} + +@-webkit-keyframes slideInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + } + + 100% { + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes slideInRight { + 0% { + opacity: 0; + -moz-transform: translateX(2000px); + } + + 100% { + -moz-transform: translateX(0); + } +} + +@-o-keyframes slideInRight { + 0% { + opacity: 0; + -o-transform: translateX(2000px); + } + + 100% { + -o-transform: translateX(0); + } +} + +@keyframes slideInRight { + 0% { + opacity: 0; + transform: translateX(2000px); + } + + 100% { + transform: translateX(0); + } +} + +.slideInRight { + -webkit-animation-name: slideInRight; + -moz-animation-name: slideInRight; + -o-animation-name: slideInRight; + animation-name: slideInRight; +} + +@-webkit-keyframes slideOutLeft { + 0% { + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } +} + +@-moz-keyframes slideOutLeft { + 0% { + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(-2000px); + } +} + +@-o-keyframes slideOutLeft { + 0% { + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(-2000px); + } +} + +@keyframes slideOutLeft { + 0% { + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(-2000px); + } +} + +.slideOutLeft { + -webkit-animation-name: slideOutLeft; + -moz-animation-name: slideOutLeft; + -o-animation-name: slideOutLeft; + animation-name: slideOutLeft; +} + +@-webkit-keyframes slideOutRight { + 0% { + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + } +} + +@-moz-keyframes slideOutRight { + 0% { + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(2000px); + } +} + +@-o-keyframes slideOutRight { + 0% { + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(2000px); + } +} + +@keyframes slideOutRight { + 0% { + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(2000px); + } +} + +.slideOutRight { + -webkit-animation-name: slideOutRight; + -moz-animation-name: slideOutRight; + -o-animation-name: slideOutRight; + animation-name: slideOutRight; +} + +@-webkit-keyframes slideOutUp { + 0% { + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } +} + +@-moz-keyframes slideOutUp { + 0% { + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(-2000px); + } +} + +@-o-keyframes slideOutUp { + 0% { + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(-2000px); + } +} + +@keyframes slideOutUp { + 0% { + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(-2000px); + } +} + +.slideOutUp { + -webkit-animation-name: slideOutUp; + -moz-animation-name: slideOutUp; + -o-animation-name: slideOutUp; + animation-name: slideOutUp; +} + +.animated.bounceIn { + -webkit-animation-name: bounceIn; + -moz-animation-name: bounceIn; + -o-animation-name: bounceIn; + animation-name: bounceIn; +} +@-webkit-keyframes bounceInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(-30px); + } + + 80% { + -webkit-transform: translateY(10px); + } + + 100% { + -webkit-transform: translateY(0); + } +} +@-moz-keyframes bounceInUp { + 0% { + opacity: 0; + -moz-transform: translateY(2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateY(-30px); + } + + 80% { + -moz-transform: translateY(10px); + } + + 100% { + -moz-transform: translateY(0); + } +} + +@-o-keyframes bounceInUp { + 0% { + opacity: 0; + -o-transform: translateY(2000px); + } + + 60% { + opacity: 1; + -o-transform: translateY(-30px); + } + + 80% { + -o-transform: translateY(10px); + } + + 100% { + -o-transform: translateY(0); + } +} + +@keyframes bounceInUp { + 0% { + opacity: 0; + transform: translateY(2000px); + } + + 60% { + opacity: 1; + transform: translateY(-30px); + } + + 80% { + transform: translateY(10px); + } + + 100% { + transform: translateY(0); + } +} + +.animated.bounceInUp { + -webkit-animation-name: bounceInUp; + -moz-animation-name: bounceInUp; + -o-animation-name: bounceInUp; + animation-name: bounceInUp; +} +@-webkit-keyframes bounceInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(30px); + } + + 80% { + -webkit-transform: translateY(-10px); + } + + 100% { + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes bounceInDown { + 0% { + opacity: 0; + -moz-transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateY(30px); + } + + 80% { + -moz-transform: translateY(-10px); + } + + 100% { + -moz-transform: translateY(0); + } +} + +@-o-keyframes bounceInDown { + 0% { + opacity: 0; + -o-transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -o-transform: translateY(30px); + } + + 80% { + -o-transform: translateY(-10px); + } + + 100% { + -o-transform: translateY(0); + } +} + +@keyframes bounceInDown { + 0% { + opacity: 0; + transform: translateY(-2000px); + } + + 60% { + opacity: 1; + transform: translateY(30px); + } + + 80% { + transform: translateY(-10px); + } + + 100% { + transform: translateY(0); + } +} + +.animated.bounceInDown { + -webkit-animation-name: bounceInDown; + -moz-animation-name: bounceInDown; + -o-animation-name: bounceInDown; + animation-name: bounceInDown; +} +@-webkit-keyframes bounceInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(30px); + } + + 80% { + -webkit-transform: translateX(-10px); + } + + 100% { + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes bounceInLeft { + 0% { + opacity: 0; + -moz-transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateX(30px); + } + + 80% { + -moz-transform: translateX(-10px); + } + + 100% { + -moz-transform: translateX(0); + } +} + +@-o-keyframes bounceInLeft { + 0% { + opacity: 0; + -o-transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -o-transform: translateX(30px); + } + + 80% { + -o-transform: translateX(-10px); + } + + 100% { + -o-transform: translateX(0); + } +} + +@keyframes bounceInLeft { + 0% { + opacity: 0; + transform: translateX(-2000px); + } + + 60% { + opacity: 1; + transform: translateX(30px); + } + + 80% { + transform: translateX(-10px); + } + + 100% { + transform: translateX(0); + } +} + +.animated.bounceInLeft { + -webkit-animation-name: bounceInLeft; + -moz-animation-name: bounceInLeft; + -o-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} +@-webkit-keyframes bounceInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(-30px); + } + + 80% { + -webkit-transform: translateX(10px); + } + + 100% { + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes bounceInRight { + 0% { + opacity: 0; + -moz-transform: translateX(2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateX(-30px); + } + + 80% { + -moz-transform: translateX(10px); + } + + 100% { + -moz-transform: translateX(0); + } +} + +@-o-keyframes bounceInRight { + 0% { + opacity: 0; + -o-transform: translateX(2000px); + } + + 60% { + opacity: 1; + -o-transform: translateX(-30px); + } + + 80% { + -o-transform: translateX(10px); + } + + 100% { + -o-transform: translateX(0); + } +} + +@keyframes bounceInRight { + 0% { + opacity: 0; + transform: translateX(2000px); + } + + 60% { + opacity: 1; + transform: translateX(-30px); + } + + 80% { + transform: translateX(10px); + } + + 100% { + transform: translateX(0); + } +} + +.animated.bounceInRight { + -webkit-animation-name: bounceInRight; + -moz-animation-name: bounceInRight; + -o-animation-name: bounceInRight; + animation-name: bounceInRight; +} +@-webkit-keyframes bounceOut { + 0% { + -webkit-transform: scale(1); + } + + 25% { + -webkit-transform: scale(.95); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.1); + } + + 100% { + opacity: 0; + -webkit-transform: scale(.3); + } +} + +@-moz-keyframes bounceOut { + 0% { + -moz-transform: scale(1); + } + + 25% { + -moz-transform: scale(.95); + } + + 50% { + opacity: 1; + -moz-transform: scale(1.1); + } + + 100% { + opacity: 0; + -moz-transform: scale(.3); + } +} + +@-o-keyframes bounceOut { + 0% { + -o-transform: scale(1); + } + + 25% { + -o-transform: scale(.95); + } + + 50% { + opacity: 1; + -o-transform: scale(1.1); + } + + 100% { + opacity: 0; + -o-transform: scale(.3); + } +} + +@keyframes bounceOut { + 0% { + transform: scale(1); + } + + 25% { + transform: scale(.95); + } + + 50% { + opacity: 1; + transform: scale(1.1); + } + + 100% { + opacity: 0; + transform: scale(.3); + } +} + +.animated.bounceOut { + -webkit-animation-name: bounceOut; + -moz-animation-name: bounceOut; + -o-animation-name: bounceOut; + animation-name: bounceOut; +} +@-webkit-keyframes bounceOutUp { + 0% { + -webkit-transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } +} + +@-moz-keyframes bounceOutUp { + 0% { + -moz-transform: translateY(0); + } + + 20% { + opacity: 1; + -moz-transform: translateY(20px); + } + + 100% { + opacity: 0; + -moz-transform: translateY(-2000px); + } +} + +@-o-keyframes bounceOutUp { + 0% { + -o-transform: translateY(0); + } + + 20% { + opacity: 1; + -o-transform: translateY(20px); + } + + 100% { + opacity: 0; + -o-transform: translateY(-2000px); + } +} + +@keyframes bounceOutUp { + 0% { + transform: translateY(0); + } + + 20% { + opacity: 1; + transform: translateY(20px); + } + + 100% { + opacity: 0; + transform: translateY(-2000px); + } +} + +.animated.bounceOutUp { + -webkit-animation-name: bounceOutUp; + -moz-animation-name: bounceOutUp; + -o-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} +@-webkit-keyframes bounceOutDown { + 0% { + -webkit-transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + } +} + +@-moz-keyframes bounceOutDown { + 0% { + -moz-transform: translateY(0); + } + + 20% { + opacity: 1; + -moz-transform: translateY(-20px); + } + + 100% { + opacity: 0; + -moz-transform: translateY(2000px); + } +} + +@-o-keyframes bounceOutDown { + 0% { + -o-transform: translateY(0); + } + + 20% { + opacity: 1; + -o-transform: translateY(-20px); + } + + 100% { + opacity: 0; + -o-transform: translateY(2000px); + } +} + +@keyframes bounceOutDown { + 0% { + transform: translateY(0); + } + + 20% { + opacity: 1; + transform: translateY(-20px); + } + + 100% { + opacity: 0; + transform: translateY(2000px); + } +} + +.animated.bounceOutDown { + -webkit-animation-name: bounceOutDown; + -moz-animation-name: bounceOutDown; + -o-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} +@-webkit-keyframes bounceOutLeft { + 0% { + -webkit-transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } +} + +@-moz-keyframes bounceOutLeft { + 0% { + -moz-transform: translateX(0); + } + + 20% { + opacity: 1; + -moz-transform: translateX(20px); + } + + 100% { + opacity: 0; + -moz-transform: translateX(-2000px); + } +} + +@-o-keyframes bounceOutLeft { + 0% { + -o-transform: translateX(0); + } + + 20% { + opacity: 1; + -o-transform: translateX(20px); + } + + 100% { + opacity: 0; + -o-transform: translateX(-2000px); + } +} + +@keyframes bounceOutLeft { + 0% { + transform: translateX(0); + } + + 20% { + opacity: 1; + transform: translateX(20px); + } + + 100% { + opacity: 0; + transform: translateX(-2000px); + } +} + +.animated.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + -moz-animation-name: bounceOutLeft; + -o-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} +@-webkit-keyframes bounceOutRight { + 0% { + -webkit-transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + } +} + +@-moz-keyframes bounceOutRight { + 0% { + -moz-transform: translateX(0); + } + + 20% { + opacity: 1; + -moz-transform: translateX(-20px); + } + + 100% { + opacity: 0; + -moz-transform: translateX(2000px); + } +} + +@-o-keyframes bounceOutRight { + 0% { + -o-transform: translateX(0); + } + + 20% { + opacity: 1; + -o-transform: translateX(-20px); + } + + 100% { + opacity: 0; + -o-transform: translateX(2000px); + } +} + +@keyframes bounceOutRight { + 0% { + transform: translateX(0); + } + + 20% { + opacity: 1; + transform: translateX(-20px); + } + + 100% { + opacity: 0; + transform: translateX(2000px); + } +} + +.animated.bounceOutRight { + -webkit-animation-name: bounceOutRight; + -moz-animation-name: bounceOutRight; + -o-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} +@-webkit-keyframes rotateIn { + 0% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(0); + opacity: 1; + } +} +@-moz-keyframes rotateIn { + 0% { + -moz-transform-origin: center center; + -moz-transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: center center; + -moz-transform: rotate(0); + opacity: 1; + } +} +@-o-keyframes rotateIn { + 0% { + -o-transform-origin: center center; + -o-transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -o-transform-origin: center center; + -o-transform: rotate(0); + opacity: 1; + } +} +@keyframes rotateIn { + 0% { + transform-origin: center center; + transform: rotate(-200deg); + opacity: 0; + } + + 100% { + transform-origin: center center; + transform: rotate(0); + opacity: 1; + } +} + +.animated.rotateIn { + -webkit-animation-name: rotateIn; + -moz-animation-name: rotateIn; + -o-animation-name: rotateIn; + animation-name: rotateIn; +} +@-webkit-keyframes rotateInUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInUpLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInUpLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInUpLeft { + 0% { + transform-origin: left bottom; + transform: rotate(90deg); + opacity: 0; + } + + 100% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } +} + +.animated.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + -moz-animation-name: rotateInUpLeft; + -o-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; +} +@-webkit-keyframes rotateInDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInDownLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInDownLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInDownLeft { + 0% { + transform-origin: left bottom; + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } +} + +.animated.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + -moz-animation-name: rotateInDownLeft; + -o-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; +} +@-webkit-keyframes rotateInUpRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInUpRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInUpRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInUpRight { + 0% { + transform-origin: right bottom; + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } +} + +.animated.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + -moz-animation-name: rotateInUpRight; + -o-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; +} +@-webkit-keyframes rotateInDownRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInDownRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInDownRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInDownRight { + 0% { + transform-origin: right bottom; + transform: rotate(90deg); + opacity: 0; + } + + 100% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } +} + +.animated.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + -moz-animation-name: rotateInDownRight; + -o-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; +} +@-webkit-keyframes rotateOut { + 0% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(200deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOut { + 0% { + -moz-transform-origin: center center; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: center center; + -moz-transform: rotate(200deg); + opacity: 0; + } +} + +@-o-keyframes rotateOut { + 0% { + -o-transform-origin: center center; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: center center; + -o-transform: rotate(200deg); + opacity: 0; + } +} + +@keyframes rotateOut { + 0% { + transform-origin: center center; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: center center; + transform: rotate(200deg); + opacity: 0; + } +} + +.animated.rotateOut { + -webkit-animation-name: rotateOut; + -moz-animation-name: rotateOut; + -o-animation-name: rotateOut; + animation-name: rotateOut; +} +@-webkit-keyframes rotateOutUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutUpLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutUpLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpLeft { + 0% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: left bottom; + transform: rotate(-90deg); + opacity: 0; + } +} + +.animated.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + -moz-animation-name: rotateOutUpLeft; + -o-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; +} +@-webkit-keyframes rotateOutDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutDownLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutDownLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(90deg); + opacity: 0; + } +} + +@keyframes rotateOutDownLeft { + 0% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: left bottom; + transform: rotate(90deg); + opacity: 0; + } +} + +.animated.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + -moz-animation-name: rotateOutDownLeft; + -o-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; +} +@-webkit-keyframes rotateOutUpRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutUpRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutUpRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpRight { + 0% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: right bottom; + transform: rotate(90deg); + opacity: 0; + } +} + +.animated.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + -moz-animation-name: rotateOutUpRight; + -o-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; +} +@-webkit-keyframes rotateOutDownRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutDownRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutDownRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } +} + +@keyframes rotateOutDownRight { + 0% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: right bottom; + transform: rotate(-90deg); + opacity: 0; + } +} + +.animated.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + -moz-animation-name: rotateOutDownRight; + -o-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; +} +@-webkit-keyframes hinge { + 0% { -webkit-transform: rotate(0); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 20%, 60% { -webkit-transform: rotate(80deg); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 40% { -webkit-transform: rotate(60deg); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 80% { -webkit-transform: rotate(60deg) translateY(0); opacity: 1; -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 100% { -webkit-transform: translateY(700px); opacity: 0; } +} + +@-moz-keyframes hinge { + 0% { -moz-transform: rotate(0); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 20%, 60% { -moz-transform: rotate(80deg); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 40% { -moz-transform: rotate(60deg); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 80% { -moz-transform: rotate(60deg) translateY(0); opacity: 1; -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 100% { -moz-transform: translateY(700px); opacity: 0; } +} + +@-o-keyframes hinge { + 0% { -o-transform: rotate(0); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 20%, 60% { -o-transform: rotate(80deg); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 40% { -o-transform: rotate(60deg); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 80% { -o-transform: rotate(60deg) translateY(0); opacity: 1; -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 100% { -o-transform: translateY(700px); opacity: 0; } +} + +@keyframes hinge { + 0% { transform: rotate(0); transform-origin: top left; animation-timing-function: ease-in-out; } + 20%, 60% { transform: rotate(80deg); transform-origin: top left; animation-timing-function: ease-in-out; } + 40% { transform: rotate(60deg); transform-origin: top left; animation-timing-function: ease-in-out; } + 80% { transform: rotate(60deg) translateY(0); opacity: 1; transform-origin: top left; animation-timing-function: ease-in-out; } + 100% { transform: translateY(700px); opacity: 0; } +} + +.animated.hinge { + -webkit-animation-name: hinge; + -moz-animation-name: hinge; + -o-animation-name: hinge; + animation-name: hinge; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollIn { + 0% { opacity: 0; -webkit-transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; -webkit-transform: translateX(0px) rotate(0deg); } +} + +@-moz-keyframes rollIn { + 0% { opacity: 0; -moz-transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; -moz-transform: translateX(0px) rotate(0deg); } +} + +@-o-keyframes rollIn { + 0% { opacity: 0; -o-transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; -o-transform: translateX(0px) rotate(0deg); } +} + +@keyframes rollIn { + 0% { opacity: 0; transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; transform: translateX(0px) rotate(0deg); } +} + +.animated.rollIn { + -webkit-animation-name: rollIn; + -moz-animation-name: rollIn; + -o-animation-name: rollIn; + animation-name: rollIn; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollOut { + 0% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(100%) rotate(120deg); + } +} + +@-moz-keyframes rollOut { + 0% { + opacity: 1; + -moz-transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -moz-transform: translateX(100%) rotate(120deg); + } +} + +@-o-keyframes rollOut { + 0% { + opacity: 1; + -o-transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -o-transform: translateX(100%) rotate(120deg); + } +} + +@keyframes rollOut { + 0% { + opacity: 1; + transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + transform: translateX(100%) rotate(120deg); + } +} + +.animated.rollOut { + -webkit-animation-name: rollOut; + -moz-animation-name: rollOut; + -o-animation-name: rollOut; + animation-name: rollOut; +} + +/* originally authored by Angelo Rohit - https://github.com/angelorohit */ + +@-webkit-keyframes lightSpeedIn { + 0% { -webkit-transform: translateX(100%) skewX(-30deg); opacity: 0; } + 60% { -webkit-transform: translateX(-20%) skewX(30deg); opacity: 1; } + 80% { -webkit-transform: translateX(0%) skewX(-15deg); opacity: 1; } + 100% { -webkit-transform: translateX(0%) skewX(0deg); opacity: 1; } +} + +@-moz-keyframes lightSpeedIn { + 0% { -moz-transform: translateX(100%) skewX(-30deg); opacity: 0; } + 60% { -moz-transform: translateX(-20%) skewX(30deg); opacity: 1; } + 80% { -moz-transform: translateX(0%) skewX(-15deg); opacity: 1; } + 100% { -moz-transform: translateX(0%) skewX(0deg); opacity: 1; } +} + +@-o-keyframes lightSpeedIn { + 0% { -o-transform: translateX(100%) skewX(-30deg); opacity: 0; } + 60% { -o-transform: translateX(-20%) skewX(30deg); opacity: 1; } + 80% { -o-transform: translateX(0%) skewX(-15deg); opacity: 1; } + 100% { -o-transform: translateX(0%) skewX(0deg); opacity: 1; } +} + +@keyframes lightSpeedIn { + 0% { transform: translateX(100%) skewX(-30deg); opacity: 0; } + 60% { transform: translateX(-20%) skewX(30deg); opacity: 1; } + 80% { transform: translateX(0%) skewX(-15deg); opacity: 1; } + 100% { transform: translateX(0%) skewX(0deg); opacity: 1; } +} + +.animated.lightSpeedIn { + -webkit-animation-name: lightSpeedIn; + -moz-animation-name: lightSpeedIn; + -o-animation-name: lightSpeedIn; + animation-name: lightSpeedIn; + + -webkit-animation-timing-function: ease-out; + -moz-animation-timing-function: ease-out; + -o-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} + +.animated.lightSpeedIn { + -webkit-animation-duration: 0.5s; + -moz-animation-duration: 0.5s; + -o-animation-duration: 0.5s; + animation-duration: 0.5s; +} + +/* originally authored by Angelo Rohit - https://github.com/angelorohit */ + +@-webkit-keyframes lightSpeedOut { + 0% { -webkit-transform: translateX(0%) skewX(0deg); opacity: 1; } + 100% { -webkit-transform: translateX(100%) skewX(-30deg); opacity: 0; } +} + +@-moz-keyframes lightSpeedOut { + 0% { -moz-transform: translateX(0%) skewX(0deg); opacity: 1; } + 100% { -moz-transform: translateX(100%) skewX(-30deg); opacity: 0; } +} + +@-o-keyframes lightSpeedOut { + 0% { -o-transform: translateX(0%) skewX(0deg); opacity: 1; } + 100% { -o-transform: translateX(100%) skewX(-30deg); opacity: 0; } +} + +@keyframes lightSpeedOut { + 0% { transform: translateX(0%) skewX(0deg); opacity: 1; } + 100% { transform: translateX(100%) skewX(-30deg); opacity: 0; } +} + +.animated.lightSpeedOut { + -webkit-animation-name: lightSpeedOut; + -moz-animation-name: lightSpeedOut; + -o-animation-name: lightSpeedOut; + animation-name: lightSpeedOut; + + -webkit-animation-timing-function: ease-in; + -moz-animation-timing-function: ease-in; + -o-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} + +.animated.lightSpeedOut { + -webkit-animation-duration: 0.25s; + -moz-animation-duration: 0.25s; + -o-animation-duration: 0.25s; + animation-duration: 0.25s; +} \ No newline at end of file diff --git a/_sass/vendor/brankic.css b/_sass/vendor/brankic.css new file mode 100755 index 0000000..2d3347d --- /dev/null +++ b/_sass/vendor/brankic.css @@ -0,0 +1,1075 @@ +@font-face { + font-family: 'brankic'; + src:url('../../fonts/brankic.eot'); + src:url('../../fonts/brankic.eot?#iefix') format('embedded-opentype'), + url('../../fonts/brankic.ttf') format('truetype'), + url('../../fonts/brankic.woff') format('woff'), + url('../../fonts/brankic.svg#brankic') format('svg'); + font-weight: normal; + font-style: normal; +} + +[class^="brankic-"], [class*=" brankic-"] { + font-family: 'brankic'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.brankic-number:before { + content: "\e600"; +} +.brankic-number2:before { + content: "\e601"; +} +.brankic-number3:before { + content: "\e602"; +} +.brankic-number4:before { + content: "\e603"; +} +.brankic-number5:before { + content: "\e604"; +} +.brankic-number6:before { + content: "\e605"; +} +.brankic-number7:before { + content: "\e606"; +} +.brankic-number8:before { + content: "\e607"; +} +.brankic-number9:before { + content: "\e608"; +} +.brankic-number10:before { + content: "\e609"; +} +.brankic-number11:before { + content: "\e60a"; +} +.brankic-number12:before { + content: "\e60b"; +} +.brankic-number13:before { + content: "\e60c"; +} +.brankic-number14:before { + content: "\e60d"; +} +.brankic-number15:before { + content: "\e60e"; +} +.brankic-number16:before { + content: "\e60f"; +} +.brankic-number17:before { + content: "\e610"; +} +.brankic-number18:before { + content: "\e611"; +} +.brankic-number19:before { + content: "\e612"; +} +.brankic-number20:before { + content: "\e613"; +} +.brankic-quote:before { + content: "\e614"; +} +.brankic-quote2:before { + content: "\e615"; +} +.brankic-tag:before { + content: "\e616"; +} +.brankic-tag2:before { + content: "\e617"; +} +.brankic-link:before { + content: "\e618"; +} +.brankic-link2:before { + content: "\e619"; +} +.brankic-cabinet:before { + content: "\e61a"; +} +.brankic-cabinet2:before { + content: "\e61b"; +} +.brankic-calendar:before { + content: "\e61c"; +} +.brankic-calendar2:before { + content: "\e61d"; +} +.brankic-calendar3:before { + content: "\e61e"; +} +.brankic-file:before { + content: "\e61f"; +} +.brankic-file2:before { + content: "\e620"; +} +.brankic-file3:before { + content: "\e621"; +} +.brankic-files:before { + content: "\e622"; +} +.brankic-phone:before { + content: "\e623"; +} +.brankic-tablet:before { + content: "\e624"; +} +.brankic-window:before { + content: "\e625"; +} +.brankic-monitor:before { + content: "\e626"; +} +.brankic-ipod:before { + content: "\e627"; +} +.brankic-tv:before { + content: "\e628"; +} +.brankic-camera:before { + content: "\e629"; +} +.brankic-camera2:before { + content: "\e62a"; +} +.brankic-camera3:before { + content: "\e62b"; +} +.brankic-film:before { + content: "\e62c"; +} +.brankic-film2:before { + content: "\e62d"; +} +.brankic-film3:before { + content: "\e62e"; +} +.brankic-microphone:before { + content: "\e62f"; +} +.brankic-microphone2:before { + content: "\e630"; +} +.brankic-microphone3:before { + content: "\e631"; +} +.brankic-drink:before { + content: "\e632"; +} +.brankic-drink2:before { + content: "\e633"; +} +.brankic-drink3:before { + content: "\e634"; +} +.brankic-drink4:before { + content: "\e635"; +} +.brankic-coffee:before { + content: "\e636"; +} +.brankic-mug:before { + content: "\e637"; +} +.brankic-ice-cream:before { + content: "\e638"; +} +.brankic-cake:before { + content: "\e639"; +} +.brankic-inbox:before { + content: "\e63a"; +} +.brankic-download:before { + content: "\e63b"; +} +.brankic-upload:before { + content: "\e63c"; +} +.brankic-inbox2:before { + content: "\e63d"; +} +.brankic-checkmark:before { + content: "\e63e"; +} +.brankic-checkmark2:before { + content: "\e63f"; +} +.brankic-cancel:before { + content: "\e640"; +} +.brankic-cancel2:before { + content: "\e641"; +} +.brankic-plus:before { + content: "\e642"; +} +.brankic-plus2:before { + content: "\e643"; +} +.brankic-minus:before { + content: "\e644"; +} +.brankic-minus2:before { + content: "\e645"; +} +.brankic-notice:before { + content: "\e646"; +} +.brankic-notice2:before { + content: "\e647"; +} +.brankic-cog:before { + content: "\e648"; +} +.brankic-cogs:before { + content: "\e649"; +} +.brankic-cog2:before { + content: "\e64a"; +} +.brankic-warning:before { + content: "\e64b"; +} +.brankic-health:before { + content: "\e64c"; +} +.brankic-suitcase:before { + content: "\e64d"; +} +.brankic-suitcase2:before { + content: "\e64e"; +} +.brankic-suitcase3:before { + content: "\e64f"; +} +.brankic-picture:before { + content: "\e650"; +} +.brankic-pictures:before { + content: "\e651"; +} +.brankic-pictures2:before { + content: "\e652"; +} +.brankic-android:before { + content: "\e653"; +} +.brankic-marvin:before { + content: "\e654"; +} +.brankic-pacman:before { + content: "\e655"; +} +.brankic-cassette:before { + content: "\e656"; +} +.brankic-watch:before { + content: "\e657"; +} +.brankic-chronometer:before { + content: "\e658"; +} +.brankic-watch2:before { + content: "\e659"; +} +.brankic-alarm-clock:before { + content: "\e65a"; +} +.brankic-time:before { + content: "\e65b"; +} +.brankic-time2:before { + content: "\e65c"; +} +.brankic-headphones:before { + content: "\e65d"; +} +.brankic-wallet:before { + content: "\e65e"; +} +.brankic-checkmark3:before { + content: "\e65f"; +} +.brankic-cancel3:before { + content: "\e660"; +} +.brankic-eye:before { + content: "\e661"; +} +.brankic-position:before { + content: "\e662"; +} +.brankic-site-map:before { + content: "\e663"; +} +.brankic-site-map2:before { + content: "\e664"; +} +.brankic-cloud:before { + content: "\e665"; +} +.brankic-upload2:before { + content: "\e666"; +} +.brankic-chart:before { + content: "\e667"; +} +.brankic-chart2:before { + content: "\e668"; +} +.brankic-chart3:before { + content: "\e669"; +} +.brankic-chart4:before { + content: "\e66a"; +} +.brankic-chart5:before { + content: "\e66b"; +} +.brankic-chart6:before { + content: "\e66c"; +} +.brankic-location:before { + content: "\e66d"; +} +.brankic-download2:before { + content: "\e66e"; +} +.brankic-basket:before { + content: "\e66f"; +} +.brankic-folder:before { + content: "\e670"; +} +.brankic-gamepad:before { + content: "\e671"; +} +.brankic-alarm:before { + content: "\e672"; +} +.brankic-alarm-cancel:before { + content: "\e673"; +} +.brankic-phone2:before { + content: "\e674"; +} +.brankic-phone3:before { + content: "\e675"; +} +.brankic-image:before { + content: "\e676"; +} +.brankic-open:before { + content: "\e677"; +} +.brankic-sale:before { + content: "\e678"; +} +.brankic-direction:before { + content: "\e679"; +} +.brankic-map:before { + content: "\e67a"; +} +.brankic-trashcan:before { + content: "\e67b"; +} +.brankic-vote:before { + content: "\e67c"; +} +.brankic-graduate:before { + content: "\e67d"; +} +.brankic-lab:before { + content: "\e67e"; +} +.brankic-tie:before { + content: "\e67f"; +} +.brankic-football:before { + content: "\e680"; +} +.brankic-eight-ball:before { + content: "\e681"; +} +.brankic-bowling:before { + content: "\e682"; +} +.brankic-bowling-pin:before { + content: "\e683"; +} +.brankic-baseball:before { + content: "\e684"; +} +.brankic-soccer:before { + content: "\e685"; +} +.brankic-3d-glasses:before { + content: "\e686"; +} +.brankic-microwave:before { + content: "\e687"; +} +.brankic-refrigerator:before { + content: "\e688"; +} +.brankic-oven:before { + content: "\e689"; +} +.brankic-washing-machine:before { + content: "\e68a"; +} +.brankic-mouse:before { + content: "\e68b"; +} +.brankic-smiley:before { + content: "\e68c"; +} +.brankic-sad:before { + content: "\e68d"; +} +.brankic-mute:before { + content: "\e68e"; +} +.brankic-hand:before { + content: "\e68f"; +} +.brankic-radio:before { + content: "\e690"; +} +.brankic-satellite:before { + content: "\e691"; +} +.brankic-medal:before { + content: "\e692"; +} +.brankic-medal2:before { + content: "\e693"; +} +.brankic-switch:before { + content: "\e694"; +} +.brankic-key:before { + content: "\e695"; +} +.brankic-cord:before { + content: "\e696"; +} +.brankic-locked:before { + content: "\e697"; +} +.brankic-unlocked:before { + content: "\e698"; +} +.brankic-locked2:before { + content: "\e699"; +} +.brankic-unlocked2:before { + content: "\e69a"; +} +.brankic-magnifier:before { + content: "\e69b"; +} +.brankic-zoom-in:before { + content: "\e69c"; +} +.brankic-zoom-out:before { + content: "\e69d"; +} +.brankic-stack:before { + content: "\e69e"; +} +.brankic-stack2:before { + content: "\e69f"; +} +.brankic-stack3:before { + content: "\e6a0"; +} +.brankic-david-star:before { + content: "\e6a1"; +} +.brankic-cross:before { + content: "\e6a2"; +} +.brankic-moon-andstar:before { + content: "\e6a3"; +} +.brankic-transformers:before { + content: "\e6a4"; +} +.brankic-batman:before { + content: "\e6a5"; +} +.brankic-space-invaders:before { + content: "\e6a6"; +} +.brankic-skeletor:before { + content: "\e6a7"; +} +.brankic-lamp:before { + content: "\e6a8"; +} +.brankic-lamp2:before { + content: "\e6a9"; +} +.brankic-umbrella:before { + content: "\e6aa"; +} +.brankic-street-light:before { + content: "\e6ab"; +} +.brankic-bomb:before { + content: "\e6ac"; +} +.brankic-archive:before { + content: "\e6ad"; +} +.brankic-battery:before { + content: "\e6ae"; +} +.brankic-battery2:before { + content: "\e6af"; +} +.brankic-battery3:before { + content: "\e6b0"; +} +.brankic-battery4:before { + content: "\e6b1"; +} +.brankic-battery5:before { + content: "\e6b2"; +} +.brankic-megaphone:before { + content: "\e6b3"; +} +.brankic-megaphone2:before { + content: "\e6b4"; +} +.brankic-patch:before { + content: "\e6b5"; +} +.brankic-pil:before { + content: "\e6b6"; +} +.brankic-injection:before { + content: "\e6b7"; +} +.brankic-thermometer:before { + content: "\e6b8"; +} +.brankic-lamp3:before { + content: "\e6b9"; +} +.brankic-lamp4:before { + content: "\e6ba"; +} +.brankic-lamp5:before { + content: "\e6bb"; +} +.brankic-cube:before { + content: "\e6bc"; +} +.brankic-box:before { + content: "\e6bd"; +} +.brankic-box2:before { + content: "\e6be"; +} +.brankic-diamond:before { + content: "\e6bf"; +} +.brankic-bag:before { + content: "\e6c0"; +} +.brankic-money-bag:before { + content: "\e6c1"; +} +.brankic-grid:before { + content: "\e6c2"; +} +.brankic-grid2:before { + content: "\e6c3"; +} +.brankic-list:before { + content: "\e6c4"; +} +.brankic-list2:before { + content: "\e6c5"; +} +.brankic-ruler:before { + content: "\e6c6"; +} +.brankic-ruler2:before { + content: "\e6c7"; +} +.brankic-layout:before { + content: "\e6c8"; +} +.brankic-layout2:before { + content: "\e6c9"; +} +.brankic-layout3:before { + content: "\e6ca"; +} +.brankic-layout4:before { + content: "\e6cb"; +} +.brankic-layout5:before { + content: "\e6cc"; +} +.brankic-layout6:before { + content: "\e6cd"; +} +.brankic-layout7:before { + content: "\e6ce"; +} +.brankic-layout8:before { + content: "\e6cf"; +} +.brankic-layout9:before { + content: "\e6d0"; +} +.brankic-layout10:before { + content: "\e6d1"; +} +.brankic-layout11:before { + content: "\e6d2"; +} +.brankic-layout12:before { + content: "\e6d3"; +} +.brankic-layout13:before { + content: "\e6d4"; +} +.brankic-layout14:before { + content: "\e6d5"; +} +.brankic-tools:before { + content: "\e6d6"; +} +.brankic-screwdriver:before { + content: "\e6d7"; +} +.brankic-paint:before { + content: "\e6d8"; +} +.brankic-hammer:before { + content: "\e6d9"; +} +.brankic-brush:before { + content: "\e6da"; +} +.brankic-pen:before { + content: "\e6db"; +} +.brankic-chat:before { + content: "\e6dc"; +} +.brankic-comments:before { + content: "\e6dd"; +} +.brankic-chat2:before { + content: "\e6de"; +} +.brankic-chat3:before { + content: "\e6df"; +} +.brankic-volume:before { + content: "\e6e0"; +} +.brankic-volume2:before { + content: "\e6e1"; +} +.brankic-volume3:before { + content: "\e6e2"; +} +.brankic-equalizer:before { + content: "\e6e3"; +} +.brankic-resize:before { + content: "\e6e4"; +} +.brankic-resize2:before { + content: "\e6e5"; +} +.brankic-stretch:before { + content: "\e6e6"; +} +.brankic-narrow:before { + content: "\e6e7"; +} +.brankic-resize3:before { + content: "\e6e8"; +} +.brankic-download3:before { + content: "\e6e9"; +} +.brankic-calculator:before { + content: "\e6ea"; +} +.brankic-library:before { + content: "\e6eb"; +} +.brankic-auction:before { + content: "\e6ec"; +} +.brankic-justice:before { + content: "\e6ed"; +} +.brankic-stats:before { + content: "\e6ee"; +} +.brankic-stats2:before { + content: "\e6ef"; +} +.brankic-attachment:before { + content: "\e6f0"; +} +.brankic-hourglass:before { + content: "\e6f1"; +} +.brankic-abacus:before { + content: "\e6f2"; +} +.brankic-pencil:before { + content: "\e6f3"; +} +.brankic-pen2:before { + content: "\e6f4"; +} +.brankic-pin:before { + content: "\e6f5"; +} +.brankic-pin2:before { + content: "\e6f6"; +} +.brankic-discout:before { + content: "\e6f7"; +} +.brankic-edit:before { + content: "\e6f8"; +} +.brankic-scissors:before { + content: "\e6f9"; +} +.brankic-profile:before { + content: "\e6fa"; +} +.brankic-profile2:before { + content: "\e6fb"; +} +.brankic-profile3:before { + content: "\e6fc"; +} +.brankic-rotate:before { + content: "\e6fd"; +} +.brankic-rotate2:before { + content: "\e6fe"; +} +.brankic-reply:before { + content: "\e6ff"; +} +.brankic-forward:before { + content: "\e700"; +} +.brankic-retweet:before { + content: "\e701"; +} +.brankic-shuffle:before { + content: "\e702"; +} +.brankic-loop:before { + content: "\e703"; +} +.brankic-crop:before { + content: "\e704"; +} +.brankic-square:before { + content: "\e705"; +} +.brankic-square2:before { + content: "\e706"; +} +.brankic-circle:before { + content: "\e707"; +} +.brankic-dollar:before { + content: "\e708"; +} +.brankic-dollar2:before { + content: "\e709"; +} +.brankic-coins:before { + content: "\e70a"; +} +.brankic-pig:before { + content: "\e70b"; +} +.brankic-bookmark:before { + content: "\e70c"; +} +.brankic-bookmark2:before { + content: "\e70d"; +} +.brankic-address-book:before { + content: "\e70e"; +} +.brankic-address-book2:before { + content: "\e70f"; +} +.brankic-safe:before { + content: "\e710"; +} +.brankic-envelope:before { + content: "\e711"; +} +.brankic-envelope2:before { + content: "\e712"; +} +.brankic-radio-active:before { + content: "\e713"; +} +.brankic-music:before { + content: "\e714"; +} +.brankic-presentation:before { + content: "\e715"; +} +.brankic-male:before { + content: "\e716"; +} +.brankic-female:before { + content: "\e717"; +} +.brankic-aids:before { + content: "\e718"; +} +.brankic-heart:before { + content: "\e719"; +} +.brankic-info:before { + content: "\e71a"; +} +.brankic-info2:before { + content: "\e71b"; +} +.brankic-piano:before { + content: "\e71c"; +} +.brankic-rain:before { + content: "\e71d"; +} +.brankic-snow:before { + content: "\e71e"; +} +.brankic-lightning:before { + content: "\e71f"; +} +.brankic-sun:before { + content: "\e720"; +} +.brankic-moon:before { + content: "\e721"; +} +.brankic-cloudy:before { + content: "\e722"; +} +.brankic-cloudy2:before { + content: "\e723"; +} +.brankic-car:before { + content: "\e724"; +} +.brankic-bike:before { + content: "\e725"; +} +.brankic-truck:before { + content: "\e726"; +} +.brankic-bus:before { + content: "\e727"; +} +.brankic-bike2:before { + content: "\e728"; +} +.brankic-plane:before { + content: "\e729"; +} +.brankic-paper-plane:before { + content: "\e72a"; +} +.brankic-rocket:before { + content: "\e72b"; +} +.brankic-book:before { + content: "\e72c"; +} +.brankic-book2:before { + content: "\e72d"; +} +.brankic-barcode:before { + content: "\e72e"; +} +.brankic-barcode2:before { + content: "\e72f"; +} +.brankic-expand:before { + content: "\e730"; +} +.brankic-collapse:before { + content: "\e731"; +} +.brankic-pop-out:before { + content: "\e732"; +} +.brankic-pop-in:before { + content: "\e733"; +} +.brankic-target:before { + content: "\e734"; +} +.brankic-badge:before { + content: "\e735"; +} +.brankic-badge2:before { + content: "\e736"; +} +.brankic-ticket:before { + content: "\e737"; +} +.brankic-ticket2:before { + content: "\e738"; +} +.brankic-ticket3:before { + content: "\e739"; +} +.brankic-microphone4:before { + content: "\e73a"; +} +.brankic-cone:before { + content: "\e73b"; +} +.brankic-blocked:before { + content: "\e73c"; +} +.brankic-stop:before { + content: "\e73d"; +} +.brankic-keyboard:before { + content: "\e73e"; +} +.brankic-keyboard2:before { + content: "\e73f"; +} +.brankic-radio2:before { + content: "\e740"; +} +.brankic-printer:before { + content: "\e741"; +} +.brankic-checked:before { + content: "\e742"; +} +.brankic-error:before { + content: "\e743"; +} +.brankic-add:before { + content: "\e744"; +} +.brankic-minus3:before { + content: "\e745"; +} +.brankic-alert:before { + content: "\e746"; +} +.brankic-pictures3:before { + content: "\e747"; +} +.brankic-atom:before { + content: "\e748"; +} +.brankic-eyedropper:before { + content: "\e749"; +} +.brankic-globe:before { + content: "\e74a"; +} +.brankic-globe2:before { + content: "\e74b"; +} +.brankic-shipping:before { + content: "\e74c"; +} +.brankic-ying-yang:before { + content: "\e74d"; +} +.brankic-compass:before { + content: "\e74e"; +} +.brankic-zip:before { + content: "\e74f"; +} +.brankic-zip2:before { + content: "\e750"; +} +.brankic-anchor:before { + content: "\e751"; +} +.brankic-locked-heart:before { + content: "\e752"; +} +.brankic-magnet:before { + content: "\e753"; +} +.brankic-navigation:before { + content: "\e754"; +} +.brankic-tags:before { + content: "\e755"; +} +.brankic-heart2:before { + content: "\e756"; +} +.brankic-heart3:before { + content: "\e757"; +} +.brankic-usb:before { + content: "\e758"; +} +.brankic-clipboard:before { + content: "\e759"; +} +.brankic-clipboard2:before { + content: "\e75a"; +} +.brankic-clipboard3:before { + content: "\e75b"; +} +.brankic-switch2:before { + content: "\e75c"; +} +.brankic-ruler3:before { + content: "\e75d"; +} diff --git a/_sass/vendor/entypo.css b/_sass/vendor/entypo.css new file mode 100755 index 0000000..05cd1cd --- /dev/null +++ b/_sass/vendor/entypo.css @@ -0,0 +1,877 @@ +@font-face { + font-family: 'entypo'; + src:url('../../fonts/entypo.eot'); + src:url('../../fonts/entypo.eot?#iefix') format('embedded-opentype'), + url('../../fonts/entypo.ttf') format('truetype'), + url('../../fonts/entypo.woff') format('woff'), + url('../../fonts/entypo.svg#entypo') format('svg'); + font-weight: normal; + font-style: normal; +} + +[class^="entypo-"], [class*=" entypo-"] { + font-family: 'entypo'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.entypo-phone:before { + content: "\e609"; +} +.entypo-mobile:before { + content: "\e60a"; +} +.entypo-mouse:before { + content: "\e60b"; +} +.entypo-directions:before { + content: "\e60c"; +} +.entypo-mail:before { + content: "\e60d"; +} +.entypo-paperplane:before { + content: "\e60e"; +} +.entypo-pencil:before { + content: "\e60f"; +} +.entypo-feather:before { + content: "\e610"; +} +.entypo-paperclip:before { + content: "\e611"; +} +.entypo-drawer:before { + content: "\e612"; +} +.entypo-reply:before { + content: "\e613"; +} +.entypo-reply-all:before { + content: "\e614"; +} +.entypo-forward:before { + content: "\e615"; +} +.entypo-user:before { + content: "\e616"; +} +.entypo-users:before { + content: "\e617"; +} +.entypo-user-add:before { + content: "\e618"; +} +.entypo-vcard:before { + content: "\e619"; +} +.entypo-export:before { + content: "\e604"; +} +.entypo-location:before { + content: "\e61a"; +} +.entypo-map:before { + content: "\e61b"; +} +.entypo-compass:before { + content: "\e61c"; +} +.entypo-location2:before { + content: "\e61d"; +} +.entypo-target:before { + content: "\e61e"; +} +.entypo-share:before { + content: "\e61f"; +} +.entypo-sharable:before { + content: "\e620"; +} +.entypo-heart:before { + content: "\e621"; +} +.entypo-heart2:before { + content: "\e622"; +} +.entypo-star:before { + content: "\e623"; +} +.entypo-star2:before { + content: "\e624"; +} +.entypo-thumbs-up:before { + content: "\e625"; +} +.entypo-thumbs-down:before { + content: "\e626"; +} +.entypo-chat:before { + content: "\e606"; +} +.entypo-comment:before { + content: "\e627"; +} +.entypo-quote:before { + content: "\e628"; +} +.entypo-house:before { + content: "\e629"; +} +.entypo-popup:before { + content: "\e62a"; +} +.entypo-search:before { + content: "\e62b"; +} +.entypo-flashlight:before { + content: "\e62c"; +} +.entypo-printer:before { + content: "\e62d"; +} +.entypo-bell:before { + content: "\e62e"; +} +.entypo-link:before { + content: "\e62f"; +} +.entypo-flag:before { + content: "\e630"; +} +.entypo-cog:before { + content: "\e631"; +} +.entypo-tools:before { + content: "\e603"; +} +.entypo-trophy:before { + content: "\e632"; +} +.entypo-tag:before { + content: "\e633"; +} +.entypo-camera:before { + content: "\e634"; +} +.entypo-megaphone:before { + content: "\e635"; +} +.entypo-moon:before { + content: "\e636"; +} +.entypo-palette:before { + content: "\e637"; +} +.entypo-leaf:before { + content: "\e638"; +} +.entypo-music:before { + content: "\e639"; +} +.entypo-music2:before { + content: "\e63a"; +} +.entypo-new:before { + content: "\e63b"; +} +.entypo-graduation:before { + content: "\e63c"; +} +.entypo-book:before { + content: "\e63d"; +} +.entypo-newspaper:before { + content: "\e63e"; +} +.entypo-bag:before { + content: "\e63f"; +} +.entypo-airplane:before { + content: "\e640"; +} +.entypo-lifebuoy:before { + content: "\e641"; +} +.entypo-eye:before { + content: "\e605"; +} +.entypo-clock:before { + content: "\e642"; +} +.entypo-microphone:before { + content: "\e643"; +} +.entypo-calendar:before { + content: "\e644"; +} +.entypo-bolt:before { + content: "\e645"; +} +.entypo-thunder:before { + content: "\e646"; +} +.entypo-droplet:before { + content: "\e647"; +} +.entypo-cd:before { + content: "\e648"; +} +.entypo-briefcase:before { + content: "\e649"; +} +.entypo-air:before { + content: "\e64a"; +} +.entypo-hourglass:before { + content: "\e64b"; +} +.entypo-gauge:before { + content: "\e64c"; +} +.entypo-language:before { + content: "\e64d"; +} +.entypo-network:before { + content: "\e64e"; +} +.entypo-key:before { + content: "\e64f"; +} +.entypo-battery:before { + content: "\e650"; +} +.entypo-bucket:before { + content: "\e651"; +} +.entypo-magnet:before { + content: "\e652"; +} +.entypo-drive:before { + content: "\e653"; +} +.entypo-cup:before { + content: "\e654"; +} +.entypo-rocket:before { + content: "\e655"; +} +.entypo-brush:before { + content: "\e656"; +} +.entypo-suitcase:before { + content: "\e657"; +} +.entypo-cone:before { + content: "\e658"; +} +.entypo-earth:before { + content: "\e602"; +} +.entypo-keyboard:before { + content: "\e659"; +} +.entypo-browser:before { + content: "\e65a"; +} +.entypo-publish:before { + content: "\e600"; +} +.entypo-progress-3:before { + content: "\e65b"; +} +.entypo-progress-2:before { + content: "\e65c"; +} +.entypo-brogress-1:before { + content: "\e65d"; +} +.entypo-progress-0:before { + content: "\e65e"; +} +.entypo-sun:before { + content: "\e65f"; +} +.entypo-sun2:before { + content: "\e660"; +} +.entypo-adjust:before { + content: "\e661"; +} +.entypo-code:before { + content: "\e662"; +} +.entypo-screen:before { + content: "\e601"; +} +.entypo-infinity:before { + content: "\e663"; +} +.entypo-light-bulb:before { + content: "\e664"; +} +.entypo-credit-card:before { + content: "\e665"; +} +.entypo-database:before { + content: "\e666"; +} +.entypo-voicemail:before { + content: "\e667"; +} +.entypo-clipboard:before { + content: "\e668"; +} +.entypo-cart:before { + content: "\e669"; +} +.entypo-box:before { + content: "\e66a"; +} +.entypo-ticket:before { + content: "\e66b"; +} +.entypo-rss:before { + content: "\e66c"; +} +.entypo-signal:before { + content: "\e66d"; +} +.entypo-thermometer:before { + content: "\e66e"; +} +.entypo-droplets:before { + content: "\e66f"; +} +.entypo-uniE670:before { + content: "\e670"; +} +.entypo-statistics:before { + content: "\e671"; +} +.entypo-pie:before { + content: "\e672"; +} +.entypo-bars:before { + content: "\e673"; +} +.entypo-graph:before { + content: "\e674"; +} +.entypo-lock:before { + content: "\e608"; +} +.entypo-lock-open:before { + content: "\e675"; +} +.entypo-logout:before { + content: "\e676"; +} +.entypo-login:before { + content: "\e677"; +} +.entypo-checkmark:before { + content: "\e678"; +} +.entypo-cross:before { + content: "\e679"; +} +.entypo-minus:before { + content: "\e67a"; +} +.entypo-plus:before { + content: "\e67b"; +} +.entypo-cross2:before { + content: "\e67c"; +} +.entypo-minus2:before { + content: "\e67d"; +} +.entypo-plus2:before { + content: "\e67e"; +} +.entypo-cross3:before { + content: "\e67f"; +} +.entypo-minus3:before { + content: "\e680"; +} +.entypo-plus3:before { + content: "\e681"; +} +.entypo-erase:before { + content: "\e682"; +} +.entypo-blocked:before { + content: "\e683"; +} +.entypo-info:before { + content: "\e684"; +} +.entypo-info2:before { + content: "\e685"; +} +.entypo-question:before { + content: "\e686"; +} +.entypo-help:before { + content: "\e687"; +} +.entypo-warning:before { + content: "\e688"; +} +.entypo-cycle:before { + content: "\e689"; +} +.entypo-cw:before { + content: "\e68a"; +} +.entypo-ccw:before { + content: "\e68b"; +} +.entypo-shuffle:before { + content: "\e68c"; +} +.entypo-arrow:before { + content: "\e68d"; +} +.entypo-arrow2:before { + content: "\e68e"; +} +.entypo-retweet:before { + content: "\e68f"; +} +.entypo-loop:before { + content: "\e690"; +} +.entypo-history:before { + content: "\e691"; +} +.entypo-back:before { + content: "\e692"; +} +.entypo-switch:before { + content: "\e693"; +} +.entypo-list:before { + content: "\e694"; +} +.entypo-add-to-list:before { + content: "\e695"; +} +.entypo-layout:before { + content: "\e696"; +} +.entypo-list2:before { + content: "\e697"; +} +.entypo-text:before { + content: "\e698"; +} +.entypo-text2:before { + content: "\e699"; +} +.entypo-document:before { + content: "\e69a"; +} +.entypo-docs:before { + content: "\e69b"; +} +.entypo-landscape:before { + content: "\e69c"; +} +.entypo-pictures:before { + content: "\e69d"; +} +.entypo-video:before { + content: "\e69e"; +} +.entypo-music3:before { + content: "\e69f"; +} +.entypo-folder:before { + content: "\e6a0"; +} +.entypo-archive:before { + content: "\e6a1"; +} +.entypo-trash:before { + content: "\e6a2"; +} +.entypo-upload:before { + content: "\e607"; +} +.entypo-download:before { + content: "\e6a3"; +} +.entypo-disk:before { + content: "\e6a4"; +} +.entypo-install:before { + content: "\e6a5"; +} +.entypo-cloud:before { + content: "\e6a6"; +} +.entypo-upload:before { + content: "\e6a7"; +} +.entypo-bookmark:before { + content: "\e6a8"; +} +.entypo-bookmarks:before { + content: "\e6a9"; +} +.entypo-book2:before { + content: "\e6aa"; +} +.entypo-play:before { + content: "\e6ab"; +} +.entypo-pause:before { + content: "\e6ac"; +} +.entypo-record:before { + content: "\e6ad"; +} +.entypo-stop:before { + content: "\e6ae"; +} +.entypo-next:before { + content: "\e6af"; +} +.entypo-previous:before { + content: "\e6b0"; +} +.entypo-first:before { + content: "\e6b1"; +} +.entypo-last:before { + content: "\e6b2"; +} +.entypo-resize-enlarge:before { + content: "\e6b3"; +} +.entypo-resize-shrink:before { + content: "\e6b4"; +} +.entypo-volume:before { + content: "\e6b5"; +} +.entypo-sound:before { + content: "\e6b6"; +} +.entypo-mute:before { + content: "\e6b7"; +} +.entypo-flow-cascade:before { + content: "\e6b8"; +} +.entypo-flow-branch:before { + content: "\e6b9"; +} +.entypo-flow-tree:before { + content: "\e6ba"; +} +.entypo-flow-line:before { + content: "\e6bb"; +} +.entypo-flow-parallel:before { + content: "\e6bc"; +} +.entypo-arrow-left:before { + content: "\e6bd"; +} +.entypo-arrow-down:before { + content: "\e6be"; +} +.entypo-arrow-up--upload:before { + content: "\e6bf"; +} +.entypo-arrow-right:before { + content: "\e6c0"; +} +.entypo-arrow-left2:before { + content: "\e6c1"; +} +.entypo-arrow-down2:before { + content: "\e6c2"; +} +.entypo-arrow-up:before { + content: "\e6c3"; +} +.entypo-arrow-right2:before { + content: "\e6c4"; +} +.entypo-arrow-left3:before { + content: "\e6c5"; +} +.entypo-arrow-down3:before { + content: "\e6c6"; +} +.entypo-arrow-up2:before { + content: "\e6c7"; +} +.entypo-arrow-right3:before { + content: "\e6c8"; +} +.entypo-arrow-left4:before { + content: "\e6c9"; +} +.entypo-arrow-down4:before { + content: "\e6ca"; +} +.entypo-arrow-up3:before { + content: "\e6cb"; +} +.entypo-arrow-right4:before { + content: "\e6cc"; +} +.entypo-arrow-left5:before { + content: "\e6cd"; +} +.entypo-arrow-down5:before { + content: "\e6ce"; +} +.entypo-arrow-up4:before { + content: "\e6cf"; +} +.entypo-arrow-right5:before { + content: "\e6d0"; +} +.entypo-arrow-left6:before { + content: "\e6d1"; +} +.entypo-arrow-down6:before { + content: "\e6d2"; +} +.entypo-arrow-up5:before { + content: "\e6d3"; +} +.entypo-arrow-right6:before { + content: "\e6d4"; +} +.entypo-arrow-left7:before { + content: "\e6d5"; +} +.entypo-arrow-down7:before { + content: "\e6d6"; +} +.entypo-arrow-up6:before { + content: "\e6d7"; +} +.entypo-uniE6D8:before { + content: "\e6d8"; +} +.entypo-arrow-left8:before { + content: "\e6d9"; +} +.entypo-arrow-down8:before { + content: "\e6da"; +} +.entypo-arrow-up7:before { + content: "\e6db"; +} +.entypo-arrow-right7:before { + content: "\e6dc"; +} +.entypo-menu:before { + content: "\e6dd"; +} +.entypo-ellipsis:before { + content: "\e6de"; +} +.entypo-dots:before { + content: "\e6df"; +} +.entypo-dot:before { + content: "\e6e0"; +} +.entypo-cc:before { + content: "\e6e1"; +} +.entypo-cc-by:before { + content: "\e6e2"; +} +.entypo-cc-nc:before { + content: "\e6e3"; +} +.entypo-cc-nc-eu:before { + content: "\e6e4"; +} +.entypo-cc-nc-jp:before { + content: "\e6e5"; +} +.entypo-cc-sa:before { + content: "\e6e6"; +} +.entypo-cc-nd:before { + content: "\e6e7"; +} +.entypo-cc-pd:before { + content: "\e6e8"; +} +.entypo-cc-zero:before { + content: "\e6e9"; +} +.entypo-cc-share:before { + content: "\e6ea"; +} +.entypo-cc-share2:before { + content: "\e6eb"; +} +.entypo-daniel-bruce:before { + content: "\e6ec"; +} +.entypo-daniel-bruce2:before { + content: "\e6ed"; +} +.entypo-github:before { + content: "\e6ee"; +} +.entypo-github2:before { + content: "\e6ef"; +} +.entypo-flickr:before { + content: "\e6f0"; +} +.entypo-flickr2:before { + content: "\e6f1"; +} +.entypo-vimeo:before { + content: "\e6f2"; +} +.entypo-vimeo2:before { + content: "\e6f3"; +} +.entypo-twitter:before { + content: "\e6f4"; +} +.entypo-twitter2:before { + content: "\e6f5"; +} +.entypo-facebook:before { + content: "\e6f6"; +} +.entypo-facebook2:before { + content: "\e6f7"; +} +.entypo-facebook3:before { + content: "\e6f8"; +} +.entypo-googleplus:before { + content: "\e6f9"; +} +.entypo-googleplus2:before { + content: "\e6fa"; +} +.entypo-pinterest:before { + content: "\e6fb"; +} +.entypo-pinterest2:before { + content: "\e6fc"; +} +.entypo-tumblr:before { + content: "\e6fd"; +} +.entypo-tumblr2:before { + content: "\e6fe"; +} +.entypo-linkedin:before { + content: "\e6ff"; +} +.entypo-linkedin2:before { + content: "\e700"; +} +.entypo-dribbble:before { + content: "\e701"; +} +.entypo-dribbble2:before { + content: "\e702"; +} +.entypo-stumbleupon:before { + content: "\e703"; +} +.entypo-stumbleupon2:before { + content: "\e704"; +} +.entypo-lastfm:before { + content: "\e705"; +} +.entypo-lastfm2:before { + content: "\e706"; +} +.entypo-rdio:before { + content: "\e707"; +} +.entypo-rdio2:before { + content: "\e708"; +} +.entypo-spotify:before { + content: "\e709"; +} +.entypo-spotify2:before { + content: "\e70a"; +} +.entypo-qq:before { + content: "\e70b"; +} +.entypo-instagram:before { + content: "\e70c"; +} +.entypo-dropbox:before { + content: "\e70d"; +} +.entypo-evernote:before { + content: "\e70e"; +} +.entypo-flattr:before { + content: "\e70f"; +} +.entypo-skype:before { + content: "\e710"; +} +.entypo-skype2:before { + content: "\e711"; +} +.entypo-renren:before { + content: "\e712"; +} +.entypo-sina-weibo:before { + content: "\e713"; +} +.entypo-paypal:before { + content: "\e714"; +} +.entypo-picasa:before { + content: "\e715"; +} +.entypo-soundcloud:before { + content: "\e716"; +} +.entypo-mixi:before { + content: "\e717"; +} +.entypo-behance:before { + content: "\e718"; +} +.entypo-circles:before { + content: "\e719"; +} +.entypo-vk:before { + content: "\e71a"; +} +.entypo-smashing:before { + content: "\e71b"; +} diff --git a/_sass/vendor/flexslider.css b/_sass/vendor/flexslider.css new file mode 100755 index 0000000..55de7b5 --- /dev/null +++ b/_sass/vendor/flexslider.css @@ -0,0 +1,96 @@ +/* + * jQuery FlexSlider v2.2.0 + * http://www.woothemes.com/flexslider/ + * + * Copyright 2012 WooThemes + * Free to use under the GPLv2 license. + * http://www.gnu.org/licenses/gpl-2.0.html + * + * Contributing author: Tyler Smith (@mbmufffin) + */ + + +/* Browser Resets +*********************************/ +.flex-container a:active, +.flexslider a:active, +.flex-container a:focus, +.flexslider a:focus {outline: none;} +.slides, +.flex-control-nav, +.flex-direction-nav {margin: 0; padding: 0; list-style: none;} + +/* Icon Fonts +*********************************/ +/* Font-face Icons */ +@font-face { + font-family: 'flexslider-icon'; + src:url('../../fonts/flexslider-icon.eot'); + src:url('../../fonts/flexslider-icon.eot?#iefix') format('embedded-opentype'), + url('../../fonts/flexslider-icon.woff') format('woff'), + url('../../fonts/flexslider-icon.ttf') format('truetype'), + url('../../fonts/flexslider-icon.svg#flexslider-icon') format('svg'); + font-weight: normal; + font-style: normal; +} + +/* FlexSlider Necessary Styles +*********************************/ +.flexslider {margin: 0; padding: 0;} +.flexslider .slides > li {display: none; -webkit-backface-visibility: hidden;} /* Hide the slides before the JS is loaded. Avoids image jumping */ +.flexslider .slides img {width: 100%; display: block;} +.flex-pauseplay span {text-transform: capitalize;} + +/* Clearfix for the .slides element */ +.slides:after {content: "\0020"; display: block; clear: both; visibility: hidden; line-height: 0; height: 0;} +html[xmlns] .slides {display: block;} +* html .slides {height: 1%;} + +/* No JavaScript Fallback */ +/* If you are not using another script, such as Modernizr, make sure you + * include js that eliminates this class on page load */ +.no-js .slides > li:first-child {display: block;} + +/* FlexSlider Default Theme +*********************************/ +.flexslider { margin: 0 0 60px; background: #fff; border: 4px solid #fff; position: relative; -webkit-border-radius: 4px; -moz-border-radius: 4px; -o-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.2); -moz-box-shadow: 0 1px 4px rgba(0,0,0,.2); -o-box-shadow: 0 1px 4px rgba(0,0,0,.2); box-shadow: 0 1px 4px rgba(0,0,0,.2); zoom: 1; } +.flex-viewport { max-height: 2000px; -webkit-transition: all 1s ease; -moz-transition: all 1s ease; -o-transition: all 1s ease; transition: all 1s ease; } +.loading .flex-viewport { max-height: 300px; } +.flexslider .slides { zoom: 1; } +.carousel li { margin-right: 5px; } + +/* Direction Nav */ +.flex-direction-nav {*height: 0;} +.flex-direction-nav a { display: block; width: 40px; height: 40px; margin: -20px 0 0; position: absolute; top: 50%; z-index: 10; overflow: hidden; opacity: 0; cursor: pointer; color: rgba(0,0,0,0.8); text-shadow: 1px 1px 0 rgba(255,255,255,0.3); -webkit-transition: all .3s ease; -moz-transition: all .3s ease; transition: all .3s ease; } +.flex-direction-nav .flex-prev { left: -50px; } +.flex-direction-nav .flex-next { right: -50px; text-align: right; } +.flexslider:hover .flex-prev { opacity: 0.7; left: 10px; } +.flexslider:hover .flex-next { opacity: 0.7; right: 10px; } +.flexslider:hover .flex-next:hover, .flexslider:hover .flex-prev:hover { opacity: 1; } +.flex-direction-nav .flex-disabled { opacity: 0!important; filter:alpha(opacity=0); cursor: default; } +.flex-direction-nav a:before { font-family: "flexslider-icon"; font-size: 40px; display: inline-block; content: '\f001'; } +.flex-direction-nav a.flex-next:before { content: '\f002'; } + +/* Pause/Play */ +.flex-pauseplay a { display: block; width: 20px; height: 20px; position: absolute; bottom: 5px; left: 10px; opacity: 0.8; z-index: 10; overflow: hidden; cursor: pointer; color: #000; } +.flex-pauseplay a:before { font-family: "flexslider-icon"; font-size: 20px; display: inline-block; content: '\f004'; } +.flex-pauseplay a:hover { opacity: 1; } +.flex-pauseplay a.flex-play:before { content: '\f003'; } + +/* Control Nav */ +.flex-control-nav {width: 100%; position: absolute; bottom: -40px; text-align: center;} +.flex-control-nav li {margin: 0 6px; display: inline-block; zoom: 1; *display: inline;} +.flex-control-paging li a {width: 11px; height: 11px; display: block; background: #666; background: rgba(0,0,0,0.5); cursor: pointer; text-indent: -9999px; -webkit-border-radius: 20px; -moz-border-radius: 20px; -o-border-radius: 20px; border-radius: 20px; -webkit-box-shadow: inset 0 0 3px rgba(0,0,0,0.3); -moz-box-shadow: inset 0 0 3px rgba(0,0,0,0.3); -o-box-shadow: inset 0 0 3px rgba(0,0,0,0.3); box-shadow: inset 0 0 3px rgba(0,0,0,0.3); } +.flex-control-paging li a:hover { background: #333; background: rgba(0,0,0,0.7); } +.flex-control-paging li a.flex-active { background: #000; background: rgba(0,0,0,0.9); cursor: default; } + +.flex-control-thumbs {margin: 5px 0 0; position: static; overflow: hidden;} +.flex-control-thumbs li {width: 25%; float: left; margin: 0;} +.flex-control-thumbs img {width: 100%; display: block; opacity: .7; cursor: pointer;} +.flex-control-thumbs img:hover {opacity: 1;} +.flex-control-thumbs .flex-active {opacity: 1; cursor: default;} + +@media screen and (max-width: 860px) { + .flex-direction-nav .flex-prev { opacity: 1; left: 10px;} + .flex-direction-nav .flex-next { opacity: 1; right: 10px;} +} \ No newline at end of file diff --git a/_sass/vendor/flipclock.css b/_sass/vendor/flipclock.css new file mode 100755 index 0000000..6ee9458 --- /dev/null +++ b/_sass/vendor/flipclock.css @@ -0,0 +1,426 @@ +/* Get the bourbon mixin from http://bourbon.io */ +/* Reset */ +.flip-clock-wrapper * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + -o-backface-visibility: hidden; + backface-visibility: hidden; +} + +.flip-clock-wrapper a { + cursor: pointer; + text-decoration: none; + color: #ccc; } + +.flip-clock-wrapper a:hover { + color: #fff; } + +.flip-clock-wrapper ul { + list-style: none; } + +.flip-clock-wrapper.clearfix:before, +.flip-clock-wrapper.clearfix:after { + content: " "; + display: table; } + +.flip-clock-wrapper.clearfix:after { + clear: both; } + +.flip-clock-wrapper.clearfix { + *zoom: 1; } + +/* Main */ +.flip-clock-wrapper { + font: normal 11px "Helvetica Neue", Helvetica, sans-serif; + -webkit-user-select: none; } + +.flip-clock-meridium { + background: none !important; + box-shadow: 0 0 0 !important; + font-size: 36px !important; } + +.flip-clock-meridium a { color: #313333; } + +.flip-clock-wrapper { + text-align: center; + position: relative; + width: 100%; + margin: 1em; +} + +.flip-clock-wrapper:before, +.flip-clock-wrapper:after { + content: " "; /* 1 */ + display: table; /* 2 */ +} +.flip-clock-wrapper:after { + clear: both; +} + +/* Skeleton */ +.flip-clock-wrapper ul { + position: relative; + float: left; + margin: 5px; + width: 55px; + height: 86px; + font-size: 80px; + font-weight: bold; + line-height: 87px; + border-radius: 6px; + background: #000; +} + +.flip-clock-wrapper ul li { + z-index: 1; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + text-decoration: none !important; +} + +.flip-clock-wrapper ul li:first-child { + z-index: 2; } + +.flip-clock-wrapper ul li a { + display: block; + height: 100%; + -webkit-perspective: 200px; + -moz-perspective: 200px; + perspective: 200px; + margin: 0 !important; + overflow: visible !important; + cursor: default !important; } + +.flip-clock-wrapper ul li a div { + z-index: 1; + position: absolute; + left: 0; + width: 100%; + height: 50%; + font-size: 80px; + overflow: hidden; } + +.flip-clock-wrapper ul li a div .shadow { + position: absolute; + width: 100%; + height: 100%; + z-index: 2; } + +.flip-clock-wrapper ul li a div.up { + -webkit-transform-origin: 50% 100%; + -moz-transform-origin: 50% 100%; + -ms-transform-origin: 50% 100%; + -o-transform-origin: 50% 100%; + transform-origin: 50% 100%; + top: 0; } + +.flip-clock-wrapper ul li a div.up:after { + content: ""; + position: absolute; + top: 42px; + left: 0; + z-index: 5; + width: 100%; + height: 3px; + background-color: #000; + background-color: rgba(0, 0, 0, 0.4); } + +.flip-clock-wrapper ul li a div.down { + -webkit-transform-origin: 50% 0; + -moz-transform-origin: 50% 0; + -ms-transform-origin: 50% 0; + -o-transform-origin: 50% 0; + transform-origin: 50% 0; + bottom: 0; } + +.flip-clock-wrapper ul li a div div.inn { + position: absolute; + left: 0; + z-index: 1; + width: 100%; + height: 200%; + color: #ccc; + text-shadow: 0 1px 2px #000; + text-align: center; + background-color: #333; + border-radius: 6px; + font-size: 50px; } + +.flip-clock-wrapper ul li a div.up div.inn { + top: 0; } + +.flip-clock-wrapper ul li a div.down div.inn { + bottom: 0; } + +/* PLAY */ +.flip-clock-wrapper ul.play li.flip-clock-before { + z-index: 3; } + +.flip-clock-wrapper .flip { box-shadow: 0 2px 5px rgba(0, 0, 0, 0.7); } + +.flip-clock-wrapper ul.play li.flip-clock-active { + -webkit-animation: asd 0.5s 0.5s linear both; + -moz-animation: asd 0.5s 0.5s linear both; + animation: asd 0.5s 0.5s linear both; + z-index: 5; } + +.flip-clock-divider { + float: left; + display: inline-block; + position: relative; + width: 20px; + height: 100px; } + +.flip-clock-divider:first-child { + width: 0; } + +.flip-clock-dot { + display: block; + background: #323434; + width: 10px; + height: 10px; + position: absolute; + border-radius: 50%; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.5); + left: 5px; } + +.flip-clock-divider .flip-clock-label { + position: absolute; + top: -1.5em; + right: -86px; + color: black; + text-shadow: none; } + +.flip-clock-divider.minutes .flip-clock-label { + right: -88px; } + +.flip-clock-divider.seconds .flip-clock-label { + right: -91px; } + +.flip-clock-dot.top { + top: 30px; } + +.flip-clock-dot.bottom { + bottom: 30px; } + +@-webkit-keyframes asd { + 0% { + z-index: 2; } + + 20% { + z-index: 4; } + + 100% { + z-index: 4; } } + +@-moz-keyframes asd { + 0% { + z-index: 2; } + + 20% { + z-index: 4; } + + 100% { + z-index: 4; } } + +@-o-keyframes asd { + 0% { + z-index: 2; } + + 20% { + z-index: 4; } + + 100% { + z-index: 4; } } + +@keyframes asd { + 0% { + z-index: 2; } + + 20% { + z-index: 4; } + + 100% { + z-index: 4; } } + +.flip-clock-wrapper ul.play li.flip-clock-active .down { + z-index: 2; + -webkit-animation: turn 0.5s 0.5s linear both; + -moz-animation: turn 0.5s 0.5s linear both; + animation: turn 0.5s 0.5s linear both; } + +@-webkit-keyframes turn { + 0% { + -webkit-transform: rotateX(90deg); } + + 100% { + -webkit-transform: rotateX(0deg); } } + +@-moz-keyframes turn { + 0% { + -moz-transform: rotateX(90deg); } + + 100% { + -moz-transform: rotateX(0deg); } } + +@-o-keyframes turn { + 0% { + -o-transform: rotateX(90deg); } + + 100% { + -o-transform: rotateX(0deg); } } + +@keyframes turn { + 0% { + transform: rotateX(90deg); } + + 100% { + transform: rotateX(0deg); } } + +.flip-clock-wrapper ul.play li.flip-clock-before .up { + z-index: 2; + -webkit-animation: turn2 0.5s linear both; + -moz-animation: turn2 0.5s linear both; + animation: turn2 0.5s linear both; } + +@-webkit-keyframes turn2 { + 0% { + -webkit-transform: rotateX(0deg); } + + 100% { + -webkit-transform: rotateX(-90deg); } } + +@-moz-keyframes turn2 { + 0% { + -moz-transform: rotateX(0deg); } + + 100% { + -moz-transform: rotateX(-90deg); } } + +@-o-keyframes turn2 { + 0% { + -o-transform: rotateX(0deg); } + + 100% { + -o-transform: rotateX(-90deg); } } + +@keyframes turn2 { + 0% { + transform: rotateX(0deg); } + + 100% { + transform: rotateX(-90deg); } } + +.flip-clock-wrapper ul li.flip-clock-active { + z-index: 3; } + +/* SHADOW */ +.flip-clock-wrapper ul.play li.flip-clock-before .up .shadow { + background: -moz-linear-gradient(top, rgba(0, 0, 0, 0.1) 0%, black 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0, 0, 0, 0.1)), color-stop(100%, black)); + background: linear, top, rgba(0, 0, 0, 0.1) 0%, black 100%; + background: -o-linear-gradient(top, rgba(0, 0, 0, 0.1) 0%, black 100%); + background: -ms-linear-gradient(top, rgba(0, 0, 0, 0.1) 0%, black 100%); + background: linear, to bottom, rgba(0, 0, 0, 0.1) 0%, black 100%; + -webkit-animation: show 0.5s linear both; + -moz-animation: show 0.5s linear both; + animation: show 0.5s linear both; } + +.flip-clock-wrapper ul.play li.flip-clock-active .up .shadow { + background: -moz-linear-gradient(top, rgba(0, 0, 0, 0.1) 0%, black 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0, 0, 0, 0.1)), color-stop(100%, black)); + background: linear, top, rgba(0, 0, 0, 0.1) 0%, black 100%; + background: -o-linear-gradient(top, rgba(0, 0, 0, 0.1) 0%, black 100%); + background: -ms-linear-gradient(top, rgba(0, 0, 0, 0.1) 0%, black 100%); + background: linear, to bottom, rgba(0, 0, 0, 0.1) 0%, black 100%; + -webkit-animation: hide 0.5s 0.3s linear both; + -moz-animation: hide 0.5s 0.3s linear both; + animation: hide 0.5s 0.3s linear both; } + +/*DOWN*/ +.flip-clock-wrapper ul.play li.flip-clock-before .down .shadow { + background: -moz-linear-gradient(top, black 0%, rgba(0, 0, 0, 0.1) 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, black), color-stop(100%, rgba(0, 0, 0, 0.1))); + background: linear, top, black 0%, rgba(0, 0, 0, 0.1) 100%; + background: -o-linear-gradient(top, black 0%, rgba(0, 0, 0, 0.1) 100%); + background: -ms-linear-gradient(top, black 0%, rgba(0, 0, 0, 0.1) 100%); + background: linear, to bottom, black 0%, rgba(0, 0, 0, 0.1) 100%; + -webkit-animation: show 0.5s linear both; + -moz-animation: show 0.5s linear both; + animation: show 0.5s linear both; } + +.flip-clock-wrapper ul.play li.flip-clock-active .down .shadow { + background: -moz-linear-gradient(top, black 0%, rgba(0, 0, 0, 0.1) 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, black), color-stop(100%, rgba(0, 0, 0, 0.1))); + background: linear, top, black 0%, rgba(0, 0, 0, 0.1) 100%; + background: -o-linear-gradient(top, black 0%, rgba(0, 0, 0, 0.1) 100%); + background: -ms-linear-gradient(top, black 0%, rgba(0, 0, 0, 0.1) 100%); + background: linear, to bottom, black 0%, rgba(0, 0, 0, 0.1) 100%; + -webkit-animation: hide 0.5s 0.3s linear both; + -moz-animation: hide 0.5s 0.3s linear both; + animation: hide 0.5s 0.2s linear both; } + +@-webkit-keyframes show { + 0% { + opacity: 0; } + + 100% { + opacity: 1; } } + +@-moz-keyframes show { + 0% { + opacity: 0; } + + 100% { + opacity: 1; } } + +@-o-keyframes show { + 0% { + opacity: 0; } + + 100% { + opacity: 1; } } + +@keyframes show { + 0% { + opacity: 0; } + + 100% { + opacity: 1; } } + +@-webkit-keyframes hide { + 0% { + opacity: 1; } + + 100% { + opacity: 0; } } + +@-moz-keyframes hide { + 0% { + opacity: 1; } + + 100% { + opacity: 0; } } + +@-o-keyframes hide { + 0% { + opacity: 1; } + + 100% { + opacity: 0; } } + +@keyframes hide { + 0% { + opacity: 1; } + + 100% { + opacity: 0; } } diff --git a/_sass/vendor/font-awesome.css b/_sass/vendor/font-awesome.css new file mode 100755 index 0000000..fb34dc3 --- /dev/null +++ b/_sass/vendor/font-awesome.css @@ -0,0 +1,2337 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../../fonts/fontawesome-webfont.eot?v=4.7.0'); + src: url('../../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.fa-pull-left { + float: left; +} +.fa-pull-right { + float: right; +} +.fa.fa-pull-left { + margin-right: .3em; +} +.fa.fa-pull-right { + margin-left: .3em; +} +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook-f:before, +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before, +.fa-gratipay:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper-pp:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-intersex:before, +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} +.fa-yc:before, +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: "\f240"; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-sticky-note:before { + content: "\f249"; +} +.fa-sticky-note-o:before { + content: "\f24a"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-balance-scale:before { + content: "\f24e"; +} +.fa-hourglass-o:before { + content: "\f250"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-hourglass:before { + content: "\f254"; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: "\f255"; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: "\f256"; +} +.fa-hand-scissors-o:before { + content: "\f257"; +} +.fa-hand-lizard-o:before { + content: "\f258"; +} +.fa-hand-spock-o:before { + content: "\f259"; +} +.fa-hand-pointer-o:before { + content: "\f25a"; +} +.fa-hand-peace-o:before { + content: "\f25b"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-tripadvisor:before { + content: "\f262"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-odnoklassniki-square:before { + content: "\f264"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-tv:before, +.fa-television:before { + content: "\f26c"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-calendar-plus-o:before { + content: "\f271"; +} +.fa-calendar-minus-o:before { + content: "\f272"; +} +.fa-calendar-times-o:before { + content: "\f273"; +} +.fa-calendar-check-o:before { + content: "\f274"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-map-signs:before { + content: "\f277"; +} +.fa-map-o:before { + content: "\f278"; +} +.fa-map:before { + content: "\f279"; +} +.fa-commenting:before { + content: "\f27a"; +} +.fa-commenting-o:before { + content: "\f27b"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-vimeo:before { + content: "\f27d"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-credit-card-alt:before { + content: "\f283"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-pause-circle-o:before { + content: "\f28c"; +} +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-stop-circle-o:before { + content: "\f28e"; +} +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-hashtag:before { + content: "\f292"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-percent:before { + content: "\f295"; +} +.fa-gitlab:before { + content: "\f296"; +} +.fa-wpbeginner:before { + content: "\f297"; +} +.fa-wpforms:before { + content: "\f298"; +} +.fa-envira:before { + content: "\f299"; +} +.fa-universal-access:before { + content: "\f29a"; +} +.fa-wheelchair-alt:before { + content: "\f29b"; +} +.fa-question-circle-o:before { + content: "\f29c"; +} +.fa-blind:before { + content: "\f29d"; +} +.fa-audio-description:before { + content: "\f29e"; +} +.fa-volume-control-phone:before { + content: "\f2a0"; +} +.fa-braille:before { + content: "\f2a1"; +} +.fa-assistive-listening-systems:before { + content: "\f2a2"; +} +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; +} +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: "\f2a4"; +} +.fa-glide:before { + content: "\f2a5"; +} +.fa-glide-g:before { + content: "\f2a6"; +} +.fa-signing:before, +.fa-sign-language:before { + content: "\f2a7"; +} +.fa-low-vision:before { + content: "\f2a8"; +} +.fa-viadeo:before { + content: "\f2a9"; +} +.fa-viadeo-square:before { + content: "\f2aa"; +} +.fa-snapchat:before { + content: "\f2ab"; +} +.fa-snapchat-ghost:before { + content: "\f2ac"; +} +.fa-snapchat-square:before { + content: "\f2ad"; +} +.fa-pied-piper:before { + content: "\f2ae"; +} +.fa-first-order:before { + content: "\f2b0"; +} +.fa-yoast:before { + content: "\f2b1"; +} +.fa-themeisle:before { + content: "\f2b2"; +} +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: "\f2b3"; +} +.fa-fa:before, +.fa-font-awesome:before { + content: "\f2b4"; +} +.fa-handshake-o:before { + content: "\f2b5"; +} +.fa-envelope-open:before { + content: "\f2b6"; +} +.fa-envelope-open-o:before { + content: "\f2b7"; +} +.fa-linode:before { + content: "\f2b8"; +} +.fa-address-book:before { + content: "\f2b9"; +} +.fa-address-book-o:before { + content: "\f2ba"; +} +.fa-vcard:before, +.fa-address-card:before { + content: "\f2bb"; +} +.fa-vcard-o:before, +.fa-address-card-o:before { + content: "\f2bc"; +} +.fa-user-circle:before { + content: "\f2bd"; +} +.fa-user-circle-o:before { + content: "\f2be"; +} +.fa-user-o:before { + content: "\f2c0"; +} +.fa-id-badge:before { + content: "\f2c1"; +} +.fa-drivers-license:before, +.fa-id-card:before { + content: "\f2c2"; +} +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: "\f2c3"; +} +.fa-quora:before { + content: "\f2c4"; +} +.fa-free-code-camp:before { + content: "\f2c5"; +} +.fa-telegram:before { + content: "\f2c6"; +} +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: "\f2c7"; +} +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: "\f2c8"; +} +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: "\f2c9"; +} +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: "\f2ca"; +} +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: "\f2cb"; +} +.fa-shower:before { + content: "\f2cc"; +} +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: "\f2cd"; +} +.fa-podcast:before { + content: "\f2ce"; +} +.fa-window-maximize:before { + content: "\f2d0"; +} +.fa-window-minimize:before { + content: "\f2d1"; +} +.fa-window-restore:before { + content: "\f2d2"; +} +.fa-times-rectangle:before, +.fa-window-close:before { + content: "\f2d3"; +} +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: "\f2d4"; +} +.fa-bandcamp:before { + content: "\f2d5"; +} +.fa-grav:before { + content: "\f2d6"; +} +.fa-etsy:before { + content: "\f2d7"; +} +.fa-imdb:before { + content: "\f2d8"; +} +.fa-ravelry:before { + content: "\f2d9"; +} +.fa-eercast:before { + content: "\f2da"; +} +.fa-microchip:before { + content: "\f2db"; +} +.fa-snowflake-o:before { + content: "\f2dc"; +} +.fa-superpowers:before { + content: "\f2dd"; +} +.fa-wpexplorer:before { + content: "\f2de"; +} +.fa-meetup:before { + content: "\f2e0"; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} diff --git a/_sass/vendor/font-awesome.min.css b/_sass/vendor/font-awesome.min.css new file mode 100755 index 0000000..4d70f96 --- /dev/null +++ b/_sass/vendor/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/_sass/vendor/icomoon.css b/_sass/vendor/icomoon.css new file mode 100755 index 0000000..49a527b --- /dev/null +++ b/_sass/vendor/icomoon.css @@ -0,0 +1,1378 @@ +@font-face { + font-family: 'icomoon'; + src:url('../../fonts/icomoon.eot'); + src:url('../../fonts/icomoon.eot?#iefix') format('embedded-opentype'), + url('../../fonts/icomoon.ttf') format('truetype'), + url('../../fonts/icomoon.woff') format('woff'), + url('../../fonts/icomoon.svg#icomoon') format('svg'); + font-weight: normal; + font-style: normal; +} + +[class^="icomoon-"], [class*=" icomoon-"] { + font-family: 'icomoon'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icomoon-home:before { + content: "\e609"; +} +.icomoon-home2:before { + content: "\e60a"; +} +.icomoon-home3:before { + content: "\e60b"; +} +.icomoon-office:before { + content: "\e60c"; +} +.icomoon-newspaper:before { + content: "\e60d"; +} +.icomoon-pencil:before { + content: "\e60e"; +} +.icomoon-pencil2:before { + content: "\e60f"; +} +.icomoon-quill:before { + content: "\e610"; +} +.icomoon-pen:before { + content: "\e611"; +} +.icomoon-blog:before { + content: "\e612"; +} +.icomoon-droplet:before { + content: "\e613"; +} +.icomoon-paint-format:before { + content: "\e614"; +} +.icomoon-image:before { + content: "\e615"; +} +.icomoon-image2:before { + content: "\e616"; +} +.icomoon-images:before { + content: "\e617"; +} +.icomoon-camera:before { + content: "\e618"; +} +.icomoon-music:before { + content: "\e619"; +} +.icomoon-headphones:before { + content: "\e61a"; +} +.icomoon-play:before { + content: "\e61b"; +} +.icomoon-film:before { + content: "\e61c"; +} +.icomoon-camera2:before { + content: "\e61d"; +} +.icomoon-dice:before { + content: "\e61e"; +} +.icomoon-pacman:before { + content: "\e61f"; +} +.icomoon-spades:before { + content: "\e620"; +} +.icomoon-clubs:before { + content: "\e621"; +} +.icomoon-diamonds:before { + content: "\e622"; +} +.icomoon-pawn:before { + content: "\e623"; +} +.icomoon-bullhorn:before { + content: "\e624"; +} +.icomoon-connection:before { + content: "\e625"; +} +.icomoon-podcast:before { + content: "\e626"; +} +.icomoon-feed:before { + content: "\e627"; +} +.icomoon-book:before { + content: "\e628"; +} +.icomoon-books:before { + content: "\e629"; +} +.icomoon-library:before { + content: "\e62a"; +} +.icomoon-file:before { + content: "\e62b"; +} +.icomoon-profile:before { + content: "\e62c"; +} +.icomoon-file2:before { + content: "\e62d"; +} +.icomoon-file3:before { + content: "\e62e"; +} +.icomoon-file4:before { + content: "\e62f"; +} +.icomoon-copy:before { + content: "\e630"; +} +.icomoon-copy2:before { + content: "\e631"; +} +.icomoon-copy3:before { + content: "\e632"; +} +.icomoon-paste:before { + content: "\e633"; +} +.icomoon-paste2:before { + content: "\e634"; +} +.icomoon-paste3:before { + content: "\e635"; +} +.icomoon-stack:before { + content: "\e636"; +} +.icomoon-folder:before { + content: "\e637"; +} +.icomoon-folder-open:before { + content: "\e638"; +} +.icomoon-tag:before { + content: "\e639"; +} +.icomoon-tags:before { + content: "\e63a"; +} +.icomoon-barcode:before { + content: "\e63b"; +} +.icomoon-qrcode:before { + content: "\e63c"; +} +.icomoon-ticket:before { + content: "\e63d"; +} +.icomoon-cart:before { + content: "\e63e"; +} +.icomoon-cart2:before { + content: "\e63f"; +} +.icomoon-cart3:before { + content: "\e640"; +} +.icomoon-coin:before { + content: "\e641"; +} +.icomoon-credit:before { + content: "\e642"; +} +.icomoon-calculate:before { + content: "\e643"; +} +.icomoon-support:before { + content: "\e644"; +} +.icomoon-phone:before { + content: "\e645"; +} +.icomoon-phone-hang-up:before { + content: "\e646"; +} +.icomoon-address-book:before { + content: "\e647"; +} +.icomoon-notebook:before { + content: "\e648"; +} +.icomoon-envelop:before { + content: "\e649"; +} +.icomoon-pushpin:before { + content: "\e64a"; +} +.icomoon-location:before { + content: "\e64b"; +} +.icomoon-location2:before { + content: "\e64c"; +} +.icomoon-compass:before { + content: "\e64d"; +} +.icomoon-map:before { + content: "\e64e"; +} +.icomoon-map2:before { + content: "\e64f"; +} +.icomoon-history:before { + content: "\e650"; +} +.icomoon-clock:before { + content: "\e651"; +} +.icomoon-clock2:before { + content: "\e652"; +} +.icomoon-alarm:before { + content: "\e653"; +} +.icomoon-alarm2:before { + content: "\e654"; +} +.icomoon-bell:before { + content: "\e655"; +} +.icomoon-stopwatch:before { + content: "\e656"; +} +.icomoon-calendar:before { + content: "\e657"; +} +.icomoon-calendar2:before { + content: "\e658"; +} +.icomoon-print:before { + content: "\e659"; +} +.icomoon-keyboard:before { + content: "\e65a"; +} +.icomoon-screen2:before { + content: "\e65b"; +} +.icomoon-laptop:before { + content: "\e65c"; +} +.icomoon-mobile:before { + content: "\e65d"; +} +.icomoon-mobile2:before { + content: "\e65e"; +} +.icomoon-tablet:before { + content: "\e65f"; +} +.icomoon-tv:before { + content: "\e660"; +} +.icomoon-cabinet:before { + content: "\e661"; +} +.icomoon-drawer:before { + content: "\e662"; +} +.icomoon-drawer2:before { + content: "\e663"; +} +.icomoon-drawer3:before { + content: "\e664"; +} +.icomoon-box-add:before { + content: "\e665"; +} +.icomoon-box-remove:before { + content: "\e666"; +} +.icomoon-download:before { + content: "\e667"; +} +.icomoon-upload2:before { + content: "\e668"; +} +.icomoon-disk:before { + content: "\e669"; +} +.icomoon-storage:before { + content: "\e66a"; +} +.icomoon-undo:before { + content: "\e66b"; +} +.icomoon-redo:before { + content: "\e66c"; +} +.icomoon-flip:before { + content: "\e66d"; +} +.icomoon-flip2:before { + content: "\e66e"; +} +.icomoon-undo2:before { + content: "\e66f"; +} +.icomoon-redo2:before { + content: "\e670"; +} +.icomoon-forward:before { + content: "\e671"; +} +.icomoon-reply:before { + content: "\e672"; +} +.icomoon-bubble:before { + content: "\e673"; +} +.icomoon-bubbles:before { + content: "\e674"; +} +.icomoon-bubbles2:before { + content: "\e675"; +} +.icomoon-bubble2:before { + content: "\e676"; +} +.icomoon-bubbles3:before { + content: "\e677"; +} +.icomoon-bubbles4:before { + content: "\e678"; +} +.icomoon-user:before { + content: "\e679"; +} +.icomoon-users:before { + content: "\e67a"; +} +.icomoon-user2:before { + content: "\e67b"; +} +.icomoon-users2:before { + content: "\e67c"; +} +.icomoon-user3:before { + content: "\e67d"; +} +.icomoon-user4:before { + content: "\e67e"; +} +.icomoon-quotes-left:before { + content: "\e67f"; +} +.icomoon-busy:before { + content: "\e680"; +} +.icomoon-spinner:before { + content: "\e681"; +} +.icomoon-spinner2:before { + content: "\e682"; +} +.icomoon-spinner3:before { + content: "\e683"; +} +.icomoon-spinner4:before { + content: "\e684"; +} +.icomoon-spinner5:before { + content: "\e685"; +} +.icomoon-spinner6:before { + content: "\e686"; +} +.icomoon-binoculars:before { + content: "\e687"; +} +.icomoon-search:before { + content: "\e688"; +} +.icomoon-zoom-in:before { + content: "\e689"; +} +.icomoon-zoom-out:before { + content: "\e68a"; +} +.icomoon-expand:before { + content: "\e68b"; +} +.icomoon-contract:before { + content: "\e68c"; +} +.icomoon-expand2:before { + content: "\e68d"; +} +.icomoon-contract2:before { + content: "\e68e"; +} +.icomoon-key:before { + content: "\e68f"; +} +.icomoon-key2:before { + content: "\e690"; +} +.icomoon-lock2:before { + content: "\e691"; +} +.icomoon-lock3:before { + content: "\e692"; +} +.icomoon-unlocked:before { + content: "\e693"; +} +.icomoon-wrench:before { + content: "\e694"; +} +.icomoon-settings:before { + content: "\e695"; +} +.icomoon-equalizer:before { + content: "\e696"; +} +.icomoon-cog:before { + content: "\e697"; +} +.icomoon-cogs:before { + content: "\e698"; +} +.icomoon-cog2:before { + content: "\e699"; +} +.icomoon-hammer:before { + content: "\e69a"; +} +.icomoon-wand:before { + content: "\e69b"; +} +.icomoon-aid:before { + content: "\e69c"; +} +.icomoon-bug:before { + content: "\e69d"; +} +.icomoon-pie:before { + content: "\e69e"; +} +.icomoon-stats:before { + content: "\e69f"; +} +.icomoon-bars:before { + content: "\e6a0"; +} +.icomoon-bars2:before { + content: "\e6a1"; +} +.icomoon-gift:before { + content: "\e6a2"; +} +.icomoon-trophy:before { + content: "\e6a3"; +} +.icomoon-glass:before { + content: "\e6a4"; +} +.icomoon-mug:before { + content: "\e6a5"; +} +.icomoon-food:before { + content: "\e6a6"; +} +.icomoon-leaf:before { + content: "\e6a7"; +} +.icomoon-rocket:before { + content: "\e6a8"; +} +.icomoon-meter:before { + content: "\e6a9"; +} +.icomoon-meter2:before { + content: "\e6aa"; +} +.icomoon-dashboard:before { + content: "\e6ab"; +} +.icomoon-hammer2:before { + content: "\e6ac"; +} +.icomoon-fire:before { + content: "\e6ad"; +} +.icomoon-lab:before { + content: "\e6ae"; +} +.icomoon-magnet:before { + content: "\e6af"; +} +.icomoon-remove:before { + content: "\e6b0"; +} +.icomoon-remove2:before { + content: "\e6b1"; +} +.icomoon-briefcase:before { + content: "\e6b2"; +} +.icomoon-airplane:before { + content: "\e6b3"; +} +.icomoon-truck:before { + content: "\e6b4"; +} +.icomoon-road:before { + content: "\e6b5"; +} +.icomoon-accessibility:before { + content: "\e6b6"; +} +.icomoon-target:before { + content: "\e6b7"; +} +.icomoon-shield:before { + content: "\e6b8"; +} +.icomoon-lightning:before { + content: "\e6b9"; +} +.icomoon-switch:before { + content: "\e6ba"; +} +.icomoon-power-cord:before { + content: "\e6bb"; +} +.icomoon-signup:before { + content: "\e6bc"; +} +.icomoon-list:before { + content: "\e6bd"; +} +.icomoon-list2:before { + content: "\e6be"; +} +.icomoon-numbered-list:before { + content: "\e6bf"; +} +.icomoon-menu:before { + content: "\e6c0"; +} +.icomoon-menu2:before { + content: "\e6c1"; +} +.icomoon-tree:before { + content: "\e6c2"; +} +.icomoon-cloud:before { + content: "\e6c3"; +} +.icomoon-cloud-download:before { + content: "\e6c4"; +} +.icomoon-cloud-upload:before { + content: "\e6c5"; +} +.icomoon-download2:before { + content: "\e6c6"; +} +.icomoon-upload3:before { + content: "\e6c7"; +} +.icomoon-download3:before { + content: "\e6c8"; +} +.icomoon-upload4:before { + content: "\e6c9"; +} +.icomoon-globe:before { + content: "\e6ca"; +} +.icomoon-earth2:before { + content: "\e6cb"; +} +.icomoon-link:before { + content: "\e6cc"; +} +.icomoon-flag:before { + content: "\e6cd"; +} +.icomoon-attachment:before { + content: "\e6ce"; +} +.icomoon-eye2:before { + content: "\e6cf"; +} +.icomoon-eye-blocked:before { + content: "\e6d0"; +} +.icomoon-eye3:before { + content: "\e6d1"; +} +.icomoon-bookmark:before { + content: "\e6d2"; +} +.icomoon-bookmarks:before { + content: "\e6d3"; +} +.icomoon-brightness-medium:before { + content: "\e6d4"; +} +.icomoon-brightness-contrast:before { + content: "\e6d5"; +} +.icomoon-contrast:before { + content: "\e6d6"; +} +.icomoon-star:before { + content: "\e6d7"; +} +.icomoon-star2:before { + content: "\e6d8"; +} +.icomoon-star3:before { + content: "\e6d9"; +} +.icomoon-heart:before { + content: "\e6da"; +} +.icomoon-heart2:before { + content: "\e6db"; +} +.icomoon-heart-broken:before { + content: "\e6dc"; +} +.icomoon-thumbs-up:before { + content: "\e6dd"; +} +.icomoon-thumbs-up2:before { + content: "\e6de"; +} +.icomoon-happy:before { + content: "\e6df"; +} +.icomoon-happy2:before { + content: "\e6e0"; +} +.icomoon-smiley:before { + content: "\e6e1"; +} +.icomoon-smiley2:before { + content: "\e6e2"; +} +.icomoon-tongue:before { + content: "\e6e3"; +} +.icomoon-tongue2:before { + content: "\e6e4"; +} +.icomoon-sad:before { + content: "\e6e5"; +} +.icomoon-sad2:before { + content: "\e6e6"; +} +.icomoon-wink:before { + content: "\e6e7"; +} +.icomoon-wink2:before { + content: "\e6e8"; +} +.icomoon-grin:before { + content: "\e6e9"; +} +.icomoon-grin2:before { + content: "\e6ea"; +} +.icomoon-cool:before { + content: "\e6eb"; +} +.icomoon-cool2:before { + content: "\e6ec"; +} +.icomoon-angry:before { + content: "\e6ed"; +} +.icomoon-angry2:before { + content: "\e6ee"; +} +.icomoon-evil:before { + content: "\e6ef"; +} +.icomoon-evil2:before { + content: "\e6f0"; +} +.icomoon-shocked:before { + content: "\e6f1"; +} +.icomoon-shocked2:before { + content: "\e6f2"; +} +.icomoon-confused:before { + content: "\e6f3"; +} +.icomoon-confused2:before { + content: "\e6f4"; +} +.icomoon-neutral:before { + content: "\e6f5"; +} +.icomoon-neutral2:before { + content: "\e6f6"; +} +.icomoon-wondering:before { + content: "\e6f7"; +} +.icomoon-wondering2:before { + content: "\e6f8"; +} +.icomoon-point-up:before { + content: "\e6f9"; +} +.icomoon-point-right:before { + content: "\e6fa"; +} +.icomoon-point-down:before { + content: "\e6fb"; +} +.icomoon-point-left:before { + content: "\e6fc"; +} +.icomoon-warning:before { + content: "\e6fd"; +} +.icomoon-notification:before { + content: "\e6fe"; +} +.icomoon-question:before { + content: "\e6ff"; +} +.icomoon-info:before { + content: "\e700"; +} +.icomoon-info2:before { + content: "\e701"; +} +.icomoon-blocked:before { + content: "\e702"; +} +.icomoon-cancel-circle:before { + content: "\e703"; +} +.icomoon-checkmark-circle:before { + content: "\e704"; +} +.icomoon-spam:before { + content: "\e705"; +} +.icomoon-close:before { + content: "\e706"; +} +.icomoon-checkmark:before { + content: "\e707"; +} +.icomoon-checkmark2:before { + content: "\e708"; +} +.icomoon-spell-check:before { + content: "\e709"; +} +.icomoon-minus:before { + content: "\e70a"; +} +.icomoon-plus:before { + content: "\e70b"; +} +.icomoon-enter:before { + content: "\e70c"; +} +.icomoon-exit:before { + content: "\e70d"; +} +.icomoon-play2:before { + content: "\e70e"; +} +.icomoon-pause:before { + content: "\e70f"; +} +.icomoon-stop:before { + content: "\e710"; +} +.icomoon-backward:before { + content: "\e711"; +} +.icomoon-forward2:before { + content: "\e712"; +} +.icomoon-play3:before { + content: "\e713"; +} +.icomoon-pause2:before { + content: "\e714"; +} +.icomoon-stop2:before { + content: "\e715"; +} +.icomoon-backward2:before { + content: "\e716"; +} +.icomoon-forward3:before { + content: "\e717"; +} +.icomoon-first:before { + content: "\e718"; +} +.icomoon-last:before { + content: "\e719"; +} +.icomoon-previous:before { + content: "\e71a"; +} +.icomoon-next:before { + content: "\e71b"; +} +.icomoon-eject:before { + content: "\e71c"; +} +.icomoon-volume-high:before { + content: "\e71d"; +} +.icomoon-volume-medium:before { + content: "\e71e"; +} +.icomoon-volume-low:before { + content: "\e71f"; +} +.icomoon-volume-mute:before { + content: "\e720"; +} +.icomoon-volume-mute2:before { + content: "\e721"; +} +.icomoon-volume-increase:before { + content: "\e722"; +} +.icomoon-volume-decrease:before { + content: "\e723"; +} +.icomoon-loop:before { + content: "\e724"; +} +.icomoon-loop2:before { + content: "\e725"; +} +.icomoon-loop3:before { + content: "\e726"; +} +.icomoon-shuffle:before { + content: "\e727"; +} +.icomoon-arrow-up-left:before { + content: "\e728"; +} +.icomoon-arrow-up:before { + content: "\e729"; +} +.icomoon-arrow-up-right:before { + content: "\e72a"; +} +.icomoon-arrow-right:before { + content: "\e72b"; +} +.icomoon-arrow-down-right:before { + content: "\e72c"; +} +.icomoon-arrow-down:before { + content: "\e72d"; +} +.icomoon-arrow-down-left:before { + content: "\e72e"; +} +.icomoon-arrow-left:before { + content: "\e72f"; +} +.icomoon-arrow-up-left2:before { + content: "\e730"; +} +.icomoon-arrow-up2:before { + content: "\e731"; +} +.icomoon-arrow-up-right2:before { + content: "\e732"; +} +.icomoon-arrow-right2:before { + content: "\e733"; +} +.icomoon-arrow-down-right2:before { + content: "\e734"; +} +.icomoon-arrow-down2:before { + content: "\e735"; +} +.icomoon-arrow-down-left2:before { + content: "\e736"; +} +.icomoon-arrow-left2:before { + content: "\e737"; +} +.icomoon-arrow-up-left3:before { + content: "\e738"; +} +.icomoon-arrow-up3:before { + content: "\e739"; +} +.icomoon-arrow-up-right3:before { + content: "\e73a"; +} +.icomoon-arrow-right3:before { + content: "\e73b"; +} +.icomoon-arrow-down-right3:before { + content: "\e73c"; +} +.icomoon-arrow-down3:before { + content: "\e73d"; +} +.icomoon-arrow-down-left3:before { + content: "\e73e"; +} +.icomoon-arrow-left3:before { + content: "\e73f"; +} +.icomoon-tab:before { + content: "\e740"; +} +.icomoon-checkbox-checked:before { + content: "\e741"; +} +.icomoon-checkbox-unchecked:before { + content: "\e742"; +} +.icomoon-checkbox-partial:before { + content: "\e743"; +} +.icomoon-radio-checked:before { + content: "\e744"; +} +.icomoon-radio-unchecked:before { + content: "\e745"; +} +.icomoon-crop:before { + content: "\e746"; +} +.icomoon-scissors:before { + content: "\e747"; +} +.icomoon-filter:before { + content: "\e748"; +} +.icomoon-filter2:before { + content: "\e749"; +} +.icomoon-font:before { + content: "\e74a"; +} +.icomoon-text-height:before { + content: "\e74b"; +} +.icomoon-text-width:before { + content: "\e74c"; +} +.icomoon-bold:before { + content: "\e74d"; +} +.icomoon-underline:before { + content: "\e74e"; +} +.icomoon-italic:before { + content: "\e74f"; +} +.icomoon-strikethrough:before { + content: "\e750"; +} +.icomoon-omega:before { + content: "\e751"; +} +.icomoon-sigma:before { + content: "\e752"; +} +.icomoon-table:before { + content: "\e753"; +} +.icomoon-table2:before { + content: "\e754"; +} +.icomoon-insert-template:before { + content: "\e755"; +} +.icomoon-pilcrow:before { + content: "\e756"; +} +.icomoon-left-toright:before { + content: "\e757"; +} +.icomoon-right-toleft:before { + content: "\e758"; +} +.icomoon-paragraph-left:before { + content: "\e759"; +} +.icomoon-paragraph-center:before { + content: "\e75a"; +} +.icomoon-paragraph-right:before { + content: "\e75b"; +} +.icomoon-paragraph-justify:before { + content: "\e75c"; +} +.icomoon-paragraph-left2:before { + content: "\e75d"; +} +.icomoon-paragraph-center2:before { + content: "\e75e"; +} +.icomoon-paragraph-right2:before { + content: "\e75f"; +} +.icomoon-paragraph-justify2:before { + content: "\e760"; +} +.icomoon-indent-increase:before { + content: "\e761"; +} +.icomoon-indent-decrease:before { + content: "\e762"; +} +.icomoon-new-tab:before { + content: "\e763"; +} +.icomoon-embed:before { + content: "\e764"; +} +.icomoon-code:before { + content: "\e765"; +} +.icomoon-console:before { + content: "\e766"; +} +.icomoon-share:before { + content: "\e767"; +} +.icomoon-mail:before { + content: "\e768"; +} +.icomoon-mail2:before { + content: "\e769"; +} +.icomoon-mail3:before { + content: "\e76a"; +} +.icomoon-mail4:before { + content: "\e76b"; +} +.icomoon-google:before { + content: "\e76c"; +} +.icomoon-google-plus:before { + content: "\e76d"; +} +.icomoon-google-plus2:before { + content: "\e76e"; +} +.icomoon-google-plus3:before { + content: "\e76f"; +} +.icomoon-google-plus4:before { + content: "\e770"; +} +.icomoon-google-drive:before { + content: "\e771"; +} +.icomoon-facebook:before { + content: "\e772"; +} +.icomoon-facebook2:before { + content: "\e773"; +} +.icomoon-facebook3:before { + content: "\e774"; +} +.icomoon-instagram:before { + content: "\e775"; +} +.icomoon-twitter:before { + content: "\e776"; +} +.icomoon-twitter2:before { + content: "\e777"; +} +.icomoon-twitter3:before { + content: "\e778"; +} +.icomoon-feed2:before { + content: "\e779"; +} +.icomoon-feed3:before { + content: "\e77a"; +} +.icomoon-feed4:before { + content: "\e77b"; +} +.icomoon-youtube:before { + content: "\e77c"; +} +.icomoon-youtube2:before { + content: "\e77d"; +} +.icomoon-vimeo:before { + content: "\e77e"; +} +.icomoon-vimeo2:before { + content: "\e77f"; +} +.icomoon-vimeo3:before { + content: "\e780"; +} +.icomoon-lanyrd:before { + content: "\e781"; +} +.icomoon-flickr:before { + content: "\e782"; +} +.icomoon-flickr2:before { + content: "\e783"; +} +.icomoon-flickr3:before { + content: "\e784"; +} +.icomoon-flickr4:before { + content: "\e785"; +} +.icomoon-picassa:before { + content: "\e786"; +} +.icomoon-picassa2:before { + content: "\e787"; +} +.icomoon-dribbble:before { + content: "\e788"; +} +.icomoon-dribbble2:before { + content: "\e789"; +} +.icomoon-dribbble3:before { + content: "\e78a"; +} +.icomoon-forrst:before { + content: "\e78b"; +} +.icomoon-forrst2:before { + content: "\e78c"; +} +.icomoon-deviantart:before { + content: "\e78d"; +} +.icomoon-deviantart2:before { + content: "\e78e"; +} +.icomoon-steam:before { + content: "\e78f"; +} +.icomoon-steam2:before { + content: "\e790"; +} +.icomoon-github:before { + content: "\e791"; +} +.icomoon-github2:before { + content: "\e792"; +} +.icomoon-github3:before { + content: "\e793"; +} +.icomoon-github4:before { + content: "\e794"; +} +.icomoon-github5:before { + content: "\e795"; +} +.icomoon-wordpress:before { + content: "\e796"; +} +.icomoon-wordpress2:before { + content: "\e797"; +} +.icomoon-joomla:before { + content: "\e798"; +} +.icomoon-blogger:before { + content: "\e799"; +} +.icomoon-blogger2:before { + content: "\e79a"; +} +.icomoon-tumblr:before { + content: "\e79b"; +} +.icomoon-tumblr2:before { + content: "\e79c"; +} +.icomoon-yahoo:before { + content: "\e79d"; +} +.icomoon-tux:before { + content: "\e79e"; +} +.icomoon-apple:before { + content: "\e79f"; +} +.icomoon-finder:before { + content: "\e7a0"; +} +.icomoon-android:before { + content: "\e7a1"; +} +.icomoon-windows:before { + content: "\e7a2"; +} +.icomoon-windows8:before { + content: "\e7a3"; +} +.icomoon-soundcloud:before { + content: "\e7a4"; +} +.icomoon-soundcloud2:before { + content: "\e7a5"; +} +.icomoon-skype:before { + content: "\e7a6"; +} +.icomoon-reddit:before { + content: "\e7a7"; +} +.icomoon-linkedin:before { + content: "\e7a8"; +} +.icomoon-lastfm:before { + content: "\e7a9"; +} +.icomoon-lastfm2:before { + content: "\e7aa"; +} +.icomoon-delicious:before { + content: "\e7ab"; +} +.icomoon-stumbleupon:before { + content: "\e7ac"; +} +.icomoon-stumbleupon2:before { + content: "\e7ad"; +} +.icomoon-stackoverflow:before { + content: "\e7ae"; +} +.icomoon-pinterest:before { + content: "\e7af"; +} +.icomoon-pinterest2:before { + content: "\e7b0"; +} +.icomoon-xing:before { + content: "\e7b1"; +} +.icomoon-xing2:before { + content: "\e7b2"; +} +.icomoon-flattr:before { + content: "\e7b3"; +} +.icomoon-foursquare:before { + content: "\e7b4"; +} +.icomoon-foursquare2:before { + content: "\e7b5"; +} +.icomoon-paypal:before { + content: "\e7b6"; +} +.icomoon-paypal2:before { + content: "\e7b7"; +} +.icomoon-paypal3:before { + content: "\e7b8"; +} +.icomoon-yelp:before { + content: "\e7b9"; +} +.icomoon-libreoffice:before { + content: "\e7ba"; +} +.icomoon-file-pdf:before { + content: "\e7bb"; +} +.icomoon-file-openoffice:before { + content: "\e7bc"; +} +.icomoon-file-word:before { + content: "\e7bd"; +} +.icomoon-file-excel:before { + content: "\e7be"; +} +.icomoon-file-zip:before { + content: "\e7bf"; +} +.icomoon-file-powerpoint:before { + content: "\e7c0"; +} +.icomoon-file-xml:before { + content: "\e7c1"; +} +.icomoon-file-css:before { + content: "\e7c2"; +} +.icomoon-html5:before { + content: "\e7c3"; +} +.icomoon-html52:before { + content: "\e7c4"; +} +.icomoon-css3:before { + content: "\e7c5"; +} +.icomoon-chrome:before { + content: "\e7c6"; +} +.icomoon-firefox:before { + content: "\e7c7"; +} +.icomoon-IE:before { + content: "\e7c8"; +} +.icomoon-opera:before { + content: "\e7c9"; +} +.icomoon-safari:before { + content: "\e7ca"; +} +.icomoon-IcoMoon:before { + content: "\e7cb"; +} diff --git a/_sass/vendor/ionicons.css b/_sass/vendor/ionicons.css new file mode 100755 index 0000000..2c6b57a --- /dev/null +++ b/_sass/vendor/ionicons.css @@ -0,0 +1,1480 @@ +@charset "UTF-8"; +/*! + Ionicons, v2.0.0 + Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ + https://twitter.com/benjsperry https://twitter.com/ionicframework + MIT License: https://github.com/driftyco/ionicons + + Android-style icons originally built by Google’s + Material Design Icons: https://github.com/google/material-design-icons + used under CC BY http://creativecommons.org/licenses/by/4.0/ + Modified icons to fit ionicon’s grid from original. +*/ +@font-face { font-family: "Ionicons"; src: url("../../fonts/ionicons.eot?v=2.0.0"); src: url("../../fonts/ionicons.eot?v=2.0.0#iefix") format("embedded-opentype"), url("../../fonts/ionicons.ttf?v=2.0.0") format("truetype"), url("../../fonts/ionicons.woff?v=2.0.0") format("woff"), url("../../fonts/ionicons.svg?v=2.0.0#Ionicons") format("svg"); font-weight: normal; font-style: normal; } +.ion, .ionicons, .ion-alert:before, .ion-alert-circled:before, .ion-android-add:before, .ion-android-add-circle:before, .ion-android-alarm-clock:before, .ion-android-alert:before, .ion-android-apps:before, .ion-android-archive:before, .ion-android-arrow-back:before, .ion-android-arrow-down:before, .ion-android-arrow-dropdown:before, .ion-android-arrow-dropdown-circle:before, .ion-android-arrow-dropleft:before, .ion-android-arrow-dropleft-circle:before, .ion-android-arrow-dropright:before, .ion-android-arrow-dropright-circle:before, .ion-android-arrow-dropup:before, .ion-android-arrow-dropup-circle:before, .ion-android-arrow-forward:before, .ion-android-arrow-up:before, .ion-android-attach:before, .ion-android-bar:before, .ion-android-bicycle:before, .ion-android-boat:before, .ion-android-bookmark:before, .ion-android-bulb:before, .ion-android-bus:before, .ion-android-calendar:before, .ion-android-call:before, .ion-android-camera:before, .ion-android-cancel:before, .ion-android-car:before, .ion-android-cart:before, .ion-android-chat:before, .ion-android-checkbox:before, .ion-android-checkbox-blank:before, .ion-android-checkbox-outline:before, .ion-android-checkbox-outline-blank:before, .ion-android-checkmark-circle:before, .ion-android-clipboard:before, .ion-android-close:before, .ion-android-cloud:before, .ion-android-cloud-circle:before, .ion-android-cloud-done:before, .ion-android-cloud-outline:before, .ion-android-color-palette:before, .ion-android-compass:before, .ion-android-contact:before, .ion-android-contacts:before, .ion-android-contract:before, .ion-android-create:before, .ion-android-delete:before, .ion-android-desktop:before, .ion-android-document:before, .ion-android-done:before, .ion-android-done-all:before, .ion-android-download:before, .ion-android-drafts:before, .ion-android-exit:before, .ion-android-expand:before, .ion-android-favorite:before, .ion-android-favorite-outline:before, .ion-android-film:before, .ion-android-folder:before, .ion-android-folder-open:before, .ion-android-funnel:before, .ion-android-globe:before, .ion-android-hand:before, .ion-android-hangout:before, .ion-android-happy:before, .ion-android-home:before, .ion-android-image:before, .ion-android-laptop:before, .ion-android-list:before, .ion-android-locate:before, .ion-android-lock:before, .ion-android-mail:before, .ion-android-map:before, .ion-android-menu:before, .ion-android-microphone:before, .ion-android-microphone-off:before, .ion-android-more-horizontal:before, .ion-android-more-vertical:before, .ion-android-navigate:before, .ion-android-notifications:before, .ion-android-notifications-none:before, .ion-android-notifications-off:before, .ion-android-open:before, .ion-android-options:before, .ion-android-people:before, .ion-android-person:before, .ion-android-person-add:before, .ion-android-phone-landscape:before, .ion-android-phone-portrait:before, .ion-android-pin:before, .ion-android-plane:before, .ion-android-playstore:before, .ion-android-print:before, .ion-android-radio-button-off:before, .ion-android-radio-button-on:before, .ion-android-refresh:before, .ion-android-remove:before, .ion-android-remove-circle:before, .ion-android-restaurant:before, .ion-android-sad:before, .ion-android-search:before, .ion-android-send:before, .ion-android-settings:before, .ion-android-share:before, .ion-android-share-alt:before, .ion-android-star:before, .ion-android-star-half:before, .ion-android-star-outline:before, .ion-android-stopwatch:before, .ion-android-subway:before, .ion-android-sunny:before, .ion-android-sync:before, .ion-android-textsms:before, .ion-android-time:before, .ion-android-train:before, .ion-android-unlock:before, .ion-android-upload:before, .ion-android-volume-down:before, .ion-android-volume-mute:before, .ion-android-volume-off:before, .ion-android-volume-up:before, .ion-android-walk:before, .ion-android-warning:before, .ion-android-watch:before, .ion-android-wifi:before, .ion-aperture:before, .ion-archive:before, .ion-arrow-down-a:before, .ion-arrow-down-b:before, .ion-arrow-down-c:before, .ion-arrow-expand:before, .ion-arrow-graph-down-left:before, .ion-arrow-graph-down-right:before, .ion-arrow-graph-up-left:before, .ion-arrow-graph-up-right:before, .ion-arrow-left-a:before, .ion-arrow-left-b:before, .ion-arrow-left-c:before, .ion-arrow-move:before, .ion-arrow-resize:before, .ion-arrow-return-left:before, .ion-arrow-return-right:before, .ion-arrow-right-a:before, .ion-arrow-right-b:before, .ion-arrow-right-c:before, .ion-arrow-shrink:before, .ion-arrow-swap:before, .ion-arrow-up-a:before, .ion-arrow-up-b:before, .ion-arrow-up-c:before, .ion-asterisk:before, .ion-at:before, .ion-backspace:before, .ion-backspace-outline:before, .ion-bag:before, .ion-battery-charging:before, .ion-battery-empty:before, .ion-battery-full:before, .ion-battery-half:before, .ion-battery-low:before, .ion-beaker:before, .ion-beer:before, .ion-bluetooth:before, .ion-bonfire:before, .ion-bookmark:before, .ion-bowtie:before, .ion-briefcase:before, .ion-bug:before, .ion-calculator:before, .ion-calendar:before, .ion-camera:before, .ion-card:before, .ion-cash:before, .ion-chatbox:before, .ion-chatbox-working:before, .ion-chatboxes:before, .ion-chatbubble:before, .ion-chatbubble-working:before, .ion-chatbubbles:before, .ion-checkmark:before, .ion-checkmark-circled:before, .ion-checkmark-round:before, .ion-chevron-down:before, .ion-chevron-left:before, .ion-chevron-right:before, .ion-chevron-up:before, .ion-clipboard:before, .ion-clock:before, .ion-close:before, .ion-close-circled:before, .ion-close-round:before, .ion-closed-captioning:before, .ion-cloud:before, .ion-code:before, .ion-code-download:before, .ion-code-working:before, .ion-coffee:before, .ion-compass:before, .ion-compose:before, .ion-connection-bars:before, .ion-contrast:before, .ion-crop:before, .ion-cube:before, .ion-disc:before, .ion-document:before, .ion-document-text:before, .ion-drag:before, .ion-earth:before, .ion-easel:before, .ion-edit:before, .ion-egg:before, .ion-eject:before, .ion-email:before, .ion-email-unread:before, .ion-erlenmeyer-flask:before, .ion-erlenmeyer-flask-bubbles:before, .ion-eye:before, .ion-eye-disabled:before, .ion-female:before, .ion-filing:before, .ion-film-marker:before, .ion-fireball:before, .ion-flag:before, .ion-flame:before, .ion-flash:before, .ion-flash-off:before, .ion-folder:before, .ion-fork:before, .ion-fork-repo:before, .ion-forward:before, .ion-funnel:before, .ion-gear-a:before, .ion-gear-b:before, .ion-grid:before, .ion-hammer:before, .ion-happy:before, .ion-happy-outline:before, .ion-headphone:before, .ion-heart:before, .ion-heart-broken:before, .ion-help:before, .ion-help-buoy:before, .ion-help-circled:before, .ion-home:before, .ion-icecream:before, .ion-image:before, .ion-images:before, .ion-information:before, .ion-information-circled:before, .ion-ionic:before, .ion-ios-alarm:before, .ion-ios-alarm-outline:before, .ion-ios-albums:before, .ion-ios-albums-outline:before, .ion-ios-americanfootball:before, .ion-ios-americanfootball-outline:before, .ion-ios-analytics:before, .ion-ios-analytics-outline:before, .ion-ios-arrow-back:before, .ion-ios-arrow-down:before, .ion-ios-arrow-forward:before, .ion-ios-arrow-left:before, .ion-ios-arrow-right:before, .ion-ios-arrow-thin-down:before, .ion-ios-arrow-thin-left:before, .ion-ios-arrow-thin-right:before, .ion-ios-arrow-thin-up:before, .ion-ios-arrow-up:before, .ion-ios-at:before, .ion-ios-at-outline:before, .ion-ios-barcode:before, .ion-ios-barcode-outline:before, .ion-ios-baseball:before, .ion-ios-baseball-outline:before, .ion-ios-basketball:before, .ion-ios-basketball-outline:before, .ion-ios-bell:before, .ion-ios-bell-outline:before, .ion-ios-body:before, .ion-ios-body-outline:before, .ion-ios-bolt:before, .ion-ios-bolt-outline:before, .ion-ios-book:before, .ion-ios-book-outline:before, .ion-ios-bookmarks:before, .ion-ios-bookmarks-outline:before, .ion-ios-box:before, .ion-ios-box-outline:before, .ion-ios-briefcase:before, .ion-ios-briefcase-outline:before, .ion-ios-browsers:before, .ion-ios-browsers-outline:before, .ion-ios-calculator:before, .ion-ios-calculator-outline:before, .ion-ios-calendar:before, .ion-ios-calendar-outline:before, .ion-ios-camera:before, .ion-ios-camera-outline:before, .ion-ios-cart:before, .ion-ios-cart-outline:before, .ion-ios-chatboxes:before, .ion-ios-chatboxes-outline:before, .ion-ios-chatbubble:before, .ion-ios-chatbubble-outline:before, .ion-ios-checkmark:before, .ion-ios-checkmark-empty:before, .ion-ios-checkmark-outline:before, .ion-ios-circle-filled:before, .ion-ios-circle-outline:before, .ion-ios-clock:before, .ion-ios-clock-outline:before, .ion-ios-close:before, .ion-ios-close-empty:before, .ion-ios-close-outline:before, .ion-ios-cloud:before, .ion-ios-cloud-download:before, .ion-ios-cloud-download-outline:before, .ion-ios-cloud-outline:before, .ion-ios-cloud-upload:before, .ion-ios-cloud-upload-outline:before, .ion-ios-cloudy:before, .ion-ios-cloudy-night:before, .ion-ios-cloudy-night-outline:before, .ion-ios-cloudy-outline:before, .ion-ios-cog:before, .ion-ios-cog-outline:before, .ion-ios-color-filter:before, .ion-ios-color-filter-outline:before, .ion-ios-color-wand:before, .ion-ios-color-wand-outline:before, .ion-ios-compose:before, .ion-ios-compose-outline:before, .ion-ios-contact:before, .ion-ios-contact-outline:before, .ion-ios-copy:before, .ion-ios-copy-outline:before, .ion-ios-crop:before, .ion-ios-crop-strong:before, .ion-ios-download:before, .ion-ios-download-outline:before, .ion-ios-drag:before, .ion-ios-email:before, .ion-ios-email-outline:before, .ion-ios-eye:before, .ion-ios-eye-outline:before, .ion-ios-fastforward:before, .ion-ios-fastforward-outline:before, .ion-ios-filing:before, .ion-ios-filing-outline:before, .ion-ios-film:before, .ion-ios-film-outline:before, .ion-ios-flag:before, .ion-ios-flag-outline:before, .ion-ios-flame:before, .ion-ios-flame-outline:before, .ion-ios-flask:before, .ion-ios-flask-outline:before, .ion-ios-flower:before, .ion-ios-flower-outline:before, .ion-ios-folder:before, .ion-ios-folder-outline:before, .ion-ios-football:before, .ion-ios-football-outline:before, .ion-ios-game-controller-a:before, .ion-ios-game-controller-a-outline:before, .ion-ios-game-controller-b:before, .ion-ios-game-controller-b-outline:before, .ion-ios-gear:before, .ion-ios-gear-outline:before, .ion-ios-glasses:before, .ion-ios-glasses-outline:before, .ion-ios-grid-view:before, .ion-ios-grid-view-outline:before, .ion-ios-heart:before, .ion-ios-heart-outline:before, .ion-ios-help:before, .ion-ios-help-empty:before, .ion-ios-help-outline:before, .ion-ios-home:before, .ion-ios-home-outline:before, .ion-ios-infinite:before, .ion-ios-infinite-outline:before, .ion-ios-information:before, .ion-ios-information-empty:before, .ion-ios-information-outline:before, .ion-ios-ionic-outline:before, .ion-ios-keypad:before, .ion-ios-keypad-outline:before, .ion-ios-lightbulb:before, .ion-ios-lightbulb-outline:before, .ion-ios-list:before, .ion-ios-list-outline:before, .ion-ios-location:before, .ion-ios-location-outline:before, .ion-ios-locked:before, .ion-ios-locked-outline:before, .ion-ios-loop:before, .ion-ios-loop-strong:before, .ion-ios-medical:before, .ion-ios-medical-outline:before, .ion-ios-medkit:before, .ion-ios-medkit-outline:before, .ion-ios-mic:before, .ion-ios-mic-off:before, .ion-ios-mic-outline:before, .ion-ios-minus:before, .ion-ios-minus-empty:before, .ion-ios-minus-outline:before, .ion-ios-monitor:before, .ion-ios-monitor-outline:before, .ion-ios-moon:before, .ion-ios-moon-outline:before, .ion-ios-more:before, .ion-ios-more-outline:before, .ion-ios-musical-note:before, .ion-ios-musical-notes:before, .ion-ios-navigate:before, .ion-ios-navigate-outline:before, .ion-ios-nutrition:before, .ion-ios-nutrition-outline:before, .ion-ios-paper:before, .ion-ios-paper-outline:before, .ion-ios-paperplane:before, .ion-ios-paperplane-outline:before, .ion-ios-partlysunny:before, .ion-ios-partlysunny-outline:before, .ion-ios-pause:before, .ion-ios-pause-outline:before, .ion-ios-paw:before, .ion-ios-paw-outline:before, .ion-ios-people:before, .ion-ios-people-outline:before, .ion-ios-person:before, .ion-ios-person-outline:before, .ion-ios-personadd:before, .ion-ios-personadd-outline:before, .ion-ios-photos:before, .ion-ios-photos-outline:before, .ion-ios-pie:before, .ion-ios-pie-outline:before, .ion-ios-pint:before, .ion-ios-pint-outline:before, .ion-ios-play:before, .ion-ios-play-outline:before, .ion-ios-plus:before, .ion-ios-plus-empty:before, .ion-ios-plus-outline:before, .ion-ios-pricetag:before, .ion-ios-pricetag-outline:before, .ion-ios-pricetags:before, .ion-ios-pricetags-outline:before, .ion-ios-printer:before, .ion-ios-printer-outline:before, .ion-ios-pulse:before, .ion-ios-pulse-strong:before, .ion-ios-rainy:before, .ion-ios-rainy-outline:before, .ion-ios-recording:before, .ion-ios-recording-outline:before, .ion-ios-redo:before, .ion-ios-redo-outline:before, .ion-ios-refresh:before, .ion-ios-refresh-empty:before, .ion-ios-refresh-outline:before, .ion-ios-reload:before, .ion-ios-reverse-camera:before, .ion-ios-reverse-camera-outline:before, .ion-ios-rewind:before, .ion-ios-rewind-outline:before, .ion-ios-rose:before, .ion-ios-rose-outline:before, .ion-ios-search:before, .ion-ios-search-strong:before, .ion-ios-settings:before, .ion-ios-settings-strong:before, .ion-ios-shuffle:before, .ion-ios-shuffle-strong:before, .ion-ios-skipbackward:before, .ion-ios-skipbackward-outline:before, .ion-ios-skipforward:before, .ion-ios-skipforward-outline:before, .ion-ios-snowy:before, .ion-ios-speedometer:before, .ion-ios-speedometer-outline:before, .ion-ios-star:before, .ion-ios-star-half:before, .ion-ios-star-outline:before, .ion-ios-stopwatch:before, .ion-ios-stopwatch-outline:before, .ion-ios-sunny:before, .ion-ios-sunny-outline:before, .ion-ios-telephone:before, .ion-ios-telephone-outline:before, .ion-ios-tennisball:before, .ion-ios-tennisball-outline:before, .ion-ios-thunderstorm:before, .ion-ios-thunderstorm-outline:before, .ion-ios-time:before, .ion-ios-time-outline:before, .ion-ios-timer:before, .ion-ios-timer-outline:before, .ion-ios-toggle:before, .ion-ios-toggle-outline:before, .ion-ios-trash:before, .ion-ios-trash-outline:before, .ion-ios-undo:before, .ion-ios-undo-outline:before, .ion-ios-unlocked:before, .ion-ios-unlocked-outline:before, .ion-ios-upload:before, .ion-ios-upload-outline:before, .ion-ios-videocam:before, .ion-ios-videocam-outline:before, .ion-ios-volume-high:before, .ion-ios-volume-low:before, .ion-ios-wineglass:before, .ion-ios-wineglass-outline:before, .ion-ios-world:before, .ion-ios-world-outline:before, .ion-ipad:before, .ion-iphone:before, .ion-ipod:before, .ion-jet:before, .ion-key:before, .ion-knife:before, .ion-laptop:before, .ion-leaf:before, .ion-levels:before, .ion-lightbulb:before, .ion-link:before, .ion-load-a:before, .ion-load-b:before, .ion-load-c:before, .ion-load-d:before, .ion-location:before, .ion-lock-combination:before, .ion-locked:before, .ion-log-in:before, .ion-log-out:before, .ion-loop:before, .ion-magnet:before, .ion-male:before, .ion-man:before, .ion-map:before, .ion-medkit:before, .ion-merge:before, .ion-mic-a:before, .ion-mic-b:before, .ion-mic-c:before, .ion-minus:before, .ion-minus-circled:before, .ion-minus-round:before, .ion-model-s:before, .ion-monitor:before, .ion-more:before, .ion-mouse:before, .ion-music-note:before, .ion-navicon:before, .ion-navicon-round:before, .ion-navigate:before, .ion-network:before, .ion-no-smoking:before, .ion-nuclear:before, .ion-outlet:before, .ion-paintbrush:before, .ion-paintbucket:before, .ion-paper-airplane:before, .ion-paperclip:before, .ion-pause:before, .ion-person:before, .ion-person-add:before, .ion-person-stalker:before, .ion-pie-graph:before, .ion-pin:before, .ion-pinpoint:before, .ion-pizza:before, .ion-plane:before, .ion-planet:before, .ion-play:before, .ion-playstation:before, .ion-plus:before, .ion-plus-circled:before, .ion-plus-round:before, .ion-podium:before, .ion-pound:before, .ion-power:before, .ion-pricetag:before, .ion-pricetags:before, .ion-printer:before, .ion-pull-request:before, .ion-qr-scanner:before, .ion-quote:before, .ion-radio-waves:before, .ion-record:before, .ion-refresh:before, .ion-reply:before, .ion-reply-all:before, .ion-ribbon-a:before, .ion-ribbon-b:before, .ion-sad:before, .ion-sad-outline:before, .ion-scissors:before, .ion-search:before, .ion-settings:before, .ion-share:before, .ion-shuffle:before, .ion-skip-backward:before, .ion-skip-forward:before, .ion-social-android:before, .ion-social-android-outline:before, .ion-social-angular:before, .ion-social-angular-outline:before, .ion-social-apple:before, .ion-social-apple-outline:before, .ion-social-bitcoin:before, .ion-social-bitcoin-outline:before, .ion-social-buffer:before, .ion-social-buffer-outline:before, .ion-social-chrome:before, .ion-social-chrome-outline:before, .ion-social-codepen:before, .ion-social-codepen-outline:before, .ion-social-css3:before, .ion-social-css3-outline:before, .ion-social-designernews:before, .ion-social-designernews-outline:before, .ion-social-dribbble:before, .ion-social-dribbble-outline:before, .ion-social-dropbox:before, .ion-social-dropbox-outline:before, .ion-social-euro:before, .ion-social-euro-outline:before, .ion-social-facebook:before, .ion-social-facebook-outline:before, .ion-social-foursquare:before, .ion-social-foursquare-outline:before, .ion-social-freebsd-devil:before, .ion-social-github:before, .ion-social-github-outline:before, .ion-social-google:before, .ion-social-google-outline:before, .ion-social-googleplus:before, .ion-social-googleplus-outline:before, .ion-social-hackernews:before, .ion-social-hackernews-outline:before, .ion-social-html5:before, .ion-social-html5-outline:before, .ion-social-instagram:before, .ion-social-instagram-outline:before, .ion-social-javascript:before, .ion-social-javascript-outline:before, .ion-social-linkedin:before, .ion-social-linkedin-outline:before, .ion-social-markdown:before, .ion-social-nodejs:before, .ion-social-octocat:before, .ion-social-pinterest:before, .ion-social-pinterest-outline:before, .ion-social-python:before, .ion-social-reddit:before, .ion-social-reddit-outline:before, .ion-social-rss:before, .ion-social-rss-outline:before, .ion-social-sass:before, .ion-social-skype:before, .ion-social-skype-outline:before, .ion-social-snapchat:before, .ion-social-snapchat-outline:before, .ion-social-tumblr:before, .ion-social-tumblr-outline:before, .ion-social-tux:before, .ion-social-twitch:before, .ion-social-twitch-outline:before, .ion-social-twitter:before, .ion-social-twitter-outline:before, .ion-social-usd:before, .ion-social-usd-outline:before, .ion-social-vimeo:before, .ion-social-vimeo-outline:before, .ion-social-whatsapp:before, .ion-social-whatsapp-outline:before, .ion-social-windows:before, .ion-social-windows-outline:before, .ion-social-wordpress:before, .ion-social-wordpress-outline:before, .ion-social-yahoo:before, .ion-social-yahoo-outline:before, .ion-social-yen:before, .ion-social-yen-outline:before, .ion-social-youtube:before, .ion-social-youtube-outline:before, .ion-soup-can:before, .ion-soup-can-outline:before, .ion-speakerphone:before, .ion-speedometer:before, .ion-spoon:before, .ion-star:before, .ion-stats-bars:before, .ion-steam:before, .ion-stop:before, .ion-thermometer:before, .ion-thumbsdown:before, .ion-thumbsup:before, .ion-toggle:before, .ion-toggle-filled:before, .ion-transgender:before, .ion-trash-a:before, .ion-trash-b:before, .ion-trophy:before, .ion-tshirt:before, .ion-tshirt-outline:before, .ion-umbrella:before, .ion-university:before, .ion-unlocked:before, .ion-upload:before, .ion-usb:before, .ion-videocamera:before, .ion-volume-high:before, .ion-volume-low:before, .ion-volume-medium:before, .ion-volume-mute:before, .ion-wand:before, .ion-waterdrop:before, .ion-wifi:before, .ion-wineglass:before, .ion-woman:before, .ion-wrench:before, .ion-xbox:before { display: inline-block; font-family: "Ionicons"; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; text-rendering: auto; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } + +.ion-alert:before { content: "\f101"; } + +.ion-alert-circled:before { content: "\f100"; } + +.ion-android-add:before { content: "\f2c7"; } + +.ion-android-add-circle:before { content: "\f359"; } + +.ion-android-alarm-clock:before { content: "\f35a"; } + +.ion-android-alert:before { content: "\f35b"; } + +.ion-android-apps:before { content: "\f35c"; } + +.ion-android-archive:before { content: "\f2c9"; } + +.ion-android-arrow-back:before { content: "\f2ca"; } + +.ion-android-arrow-down:before { content: "\f35d"; } + +.ion-android-arrow-dropdown:before { content: "\f35f"; } + +.ion-android-arrow-dropdown-circle:before { content: "\f35e"; } + +.ion-android-arrow-dropleft:before { content: "\f361"; } + +.ion-android-arrow-dropleft-circle:before { content: "\f360"; } + +.ion-android-arrow-dropright:before { content: "\f363"; } + +.ion-android-arrow-dropright-circle:before { content: "\f362"; } + +.ion-android-arrow-dropup:before { content: "\f365"; } + +.ion-android-arrow-dropup-circle:before { content: "\f364"; } + +.ion-android-arrow-forward:before { content: "\f30f"; } + +.ion-android-arrow-up:before { content: "\f366"; } + +.ion-android-attach:before { content: "\f367"; } + +.ion-android-bar:before { content: "\f368"; } + +.ion-android-bicycle:before { content: "\f369"; } + +.ion-android-boat:before { content: "\f36a"; } + +.ion-android-bookmark:before { content: "\f36b"; } + +.ion-android-bulb:before { content: "\f36c"; } + +.ion-android-bus:before { content: "\f36d"; } + +.ion-android-calendar:before { content: "\f2d1"; } + +.ion-android-call:before { content: "\f2d2"; } + +.ion-android-camera:before { content: "\f2d3"; } + +.ion-android-cancel:before { content: "\f36e"; } + +.ion-android-car:before { content: "\f36f"; } + +.ion-android-cart:before { content: "\f370"; } + +.ion-android-chat:before { content: "\f2d4"; } + +.ion-android-checkbox:before { content: "\f374"; } + +.ion-android-checkbox-blank:before { content: "\f371"; } + +.ion-android-checkbox-outline:before { content: "\f373"; } + +.ion-android-checkbox-outline-blank:before { content: "\f372"; } + +.ion-android-checkmark-circle:before { content: "\f375"; } + +.ion-android-clipboard:before { content: "\f376"; } + +.ion-android-close:before { content: "\f2d7"; } + +.ion-android-cloud:before { content: "\f37a"; } + +.ion-android-cloud-circle:before { content: "\f377"; } + +.ion-android-cloud-done:before { content: "\f378"; } + +.ion-android-cloud-outline:before { content: "\f379"; } + +.ion-android-color-palette:before { content: "\f37b"; } + +.ion-android-compass:before { content: "\f37c"; } + +.ion-android-contact:before { content: "\f2d8"; } + +.ion-android-contacts:before { content: "\f2d9"; } + +.ion-android-contract:before { content: "\f37d"; } + +.ion-android-create:before { content: "\f37e"; } + +.ion-android-delete:before { content: "\f37f"; } + +.ion-android-desktop:before { content: "\f380"; } + +.ion-android-document:before { content: "\f381"; } + +.ion-android-done:before { content: "\f383"; } + +.ion-android-done-all:before { content: "\f382"; } + +.ion-android-download:before { content: "\f2dd"; } + +.ion-android-drafts:before { content: "\f384"; } + +.ion-android-exit:before { content: "\f385"; } + +.ion-android-expand:before { content: "\f386"; } + +.ion-android-favorite:before { content: "\f388"; } + +.ion-android-favorite-outline:before { content: "\f387"; } + +.ion-android-film:before { content: "\f389"; } + +.ion-android-folder:before { content: "\f2e0"; } + +.ion-android-folder-open:before { content: "\f38a"; } + +.ion-android-funnel:before { content: "\f38b"; } + +.ion-android-globe:before { content: "\f38c"; } + +.ion-android-hand:before { content: "\f2e3"; } + +.ion-android-hangout:before { content: "\f38d"; } + +.ion-android-happy:before { content: "\f38e"; } + +.ion-android-home:before { content: "\f38f"; } + +.ion-android-image:before { content: "\f2e4"; } + +.ion-android-laptop:before { content: "\f390"; } + +.ion-android-list:before { content: "\f391"; } + +.ion-android-locate:before { content: "\f2e9"; } + +.ion-android-lock:before { content: "\f392"; } + +.ion-android-mail:before { content: "\f2eb"; } + +.ion-android-map:before { content: "\f393"; } + +.ion-android-menu:before { content: "\f394"; } + +.ion-android-microphone:before { content: "\f2ec"; } + +.ion-android-microphone-off:before { content: "\f395"; } + +.ion-android-more-horizontal:before { content: "\f396"; } + +.ion-android-more-vertical:before { content: "\f397"; } + +.ion-android-navigate:before { content: "\f398"; } + +.ion-android-notifications:before { content: "\f39b"; } + +.ion-android-notifications-none:before { content: "\f399"; } + +.ion-android-notifications-off:before { content: "\f39a"; } + +.ion-android-open:before { content: "\f39c"; } + +.ion-android-options:before { content: "\f39d"; } + +.ion-android-people:before { content: "\f39e"; } + +.ion-android-person:before { content: "\f3a0"; } + +.ion-android-person-add:before { content: "\f39f"; } + +.ion-android-phone-landscape:before { content: "\f3a1"; } + +.ion-android-phone-portrait:before { content: "\f3a2"; } + +.ion-android-pin:before { content: "\f3a3"; } + +.ion-android-plane:before { content: "\f3a4"; } + +.ion-android-playstore:before { content: "\f2f0"; } + +.ion-android-print:before { content: "\f3a5"; } + +.ion-android-radio-button-off:before { content: "\f3a6"; } + +.ion-android-radio-button-on:before { content: "\f3a7"; } + +.ion-android-refresh:before { content: "\f3a8"; } + +.ion-android-remove:before { content: "\f2f4"; } + +.ion-android-remove-circle:before { content: "\f3a9"; } + +.ion-android-restaurant:before { content: "\f3aa"; } + +.ion-android-sad:before { content: "\f3ab"; } + +.ion-android-search:before { content: "\f2f5"; } + +.ion-android-send:before { content: "\f2f6"; } + +.ion-android-settings:before { content: "\f2f7"; } + +.ion-android-share:before { content: "\f2f8"; } + +.ion-android-share-alt:before { content: "\f3ac"; } + +.ion-android-star:before { content: "\f2fc"; } + +.ion-android-star-half:before { content: "\f3ad"; } + +.ion-android-star-outline:before { content: "\f3ae"; } + +.ion-android-stopwatch:before { content: "\f2fd"; } + +.ion-android-subway:before { content: "\f3af"; } + +.ion-android-sunny:before { content: "\f3b0"; } + +.ion-android-sync:before { content: "\f3b1"; } + +.ion-android-textsms:before { content: "\f3b2"; } + +.ion-android-time:before { content: "\f3b3"; } + +.ion-android-train:before { content: "\f3b4"; } + +.ion-android-unlock:before { content: "\f3b5"; } + +.ion-android-upload:before { content: "\f3b6"; } + +.ion-android-volume-down:before { content: "\f3b7"; } + +.ion-android-volume-mute:before { content: "\f3b8"; } + +.ion-android-volume-off:before { content: "\f3b9"; } + +.ion-android-volume-up:before { content: "\f3ba"; } + +.ion-android-walk:before { content: "\f3bb"; } + +.ion-android-warning:before { content: "\f3bc"; } + +.ion-android-watch:before { content: "\f3bd"; } + +.ion-android-wifi:before { content: "\f305"; } + +.ion-aperture:before { content: "\f313"; } + +.ion-archive:before { content: "\f102"; } + +.ion-arrow-down-a:before { content: "\f103"; } + +.ion-arrow-down-b:before { content: "\f104"; } + +.ion-arrow-down-c:before { content: "\f105"; } + +.ion-arrow-expand:before { content: "\f25e"; } + +.ion-arrow-graph-down-left:before { content: "\f25f"; } + +.ion-arrow-graph-down-right:before { content: "\f260"; } + +.ion-arrow-graph-up-left:before { content: "\f261"; } + +.ion-arrow-graph-up-right:before { content: "\f262"; } + +.ion-arrow-left-a:before { content: "\f106"; } + +.ion-arrow-left-b:before { content: "\f107"; } + +.ion-arrow-left-c:before { content: "\f108"; } + +.ion-arrow-move:before { content: "\f263"; } + +.ion-arrow-resize:before { content: "\f264"; } + +.ion-arrow-return-left:before { content: "\f265"; } + +.ion-arrow-return-right:before { content: "\f266"; } + +.ion-arrow-right-a:before { content: "\f109"; } + +.ion-arrow-right-b:before { content: "\f10a"; } + +.ion-arrow-right-c:before { content: "\f10b"; } + +.ion-arrow-shrink:before { content: "\f267"; } + +.ion-arrow-swap:before { content: "\f268"; } + +.ion-arrow-up-a:before { content: "\f10c"; } + +.ion-arrow-up-b:before { content: "\f10d"; } + +.ion-arrow-up-c:before { content: "\f10e"; } + +.ion-asterisk:before { content: "\f314"; } + +.ion-at:before { content: "\f10f"; } + +.ion-backspace:before { content: "\f3bf"; } + +.ion-backspace-outline:before { content: "\f3be"; } + +.ion-bag:before { content: "\f110"; } + +.ion-battery-charging:before { content: "\f111"; } + +.ion-battery-empty:before { content: "\f112"; } + +.ion-battery-full:before { content: "\f113"; } + +.ion-battery-half:before { content: "\f114"; } + +.ion-battery-low:before { content: "\f115"; } + +.ion-beaker:before { content: "\f269"; } + +.ion-beer:before { content: "\f26a"; } + +.ion-bluetooth:before { content: "\f116"; } + +.ion-bonfire:before { content: "\f315"; } + +.ion-bookmark:before { content: "\f26b"; } + +.ion-bowtie:before { content: "\f3c0"; } + +.ion-briefcase:before { content: "\f26c"; } + +.ion-bug:before { content: "\f2be"; } + +.ion-calculator:before { content: "\f26d"; } + +.ion-calendar:before { content: "\f117"; } + +.ion-camera:before { content: "\f118"; } + +.ion-card:before { content: "\f119"; } + +.ion-cash:before { content: "\f316"; } + +.ion-chatbox:before { content: "\f11b"; } + +.ion-chatbox-working:before { content: "\f11a"; } + +.ion-chatboxes:before { content: "\f11c"; } + +.ion-chatbubble:before { content: "\f11e"; } + +.ion-chatbubble-working:before { content: "\f11d"; } + +.ion-chatbubbles:before { content: "\f11f"; } + +.ion-checkmark:before { content: "\f122"; } + +.ion-checkmark-circled:before { content: "\f120"; } + +.ion-checkmark-round:before { content: "\f121"; } + +.ion-chevron-down:before { content: "\f123"; } + +.ion-chevron-left:before { content: "\f124"; } + +.ion-chevron-right:before { content: "\f125"; } + +.ion-chevron-up:before { content: "\f126"; } + +.ion-clipboard:before { content: "\f127"; } + +.ion-clock:before { content: "\f26e"; } + +.ion-close:before { content: "\f12a"; } + +.ion-close-circled:before { content: "\f128"; } + +.ion-close-round:before { content: "\f129"; } + +.ion-closed-captioning:before { content: "\f317"; } + +.ion-cloud:before { content: "\f12b"; } + +.ion-code:before { content: "\f271"; } + +.ion-code-download:before { content: "\f26f"; } + +.ion-code-working:before { content: "\f270"; } + +.ion-coffee:before { content: "\f272"; } + +.ion-compass:before { content: "\f273"; } + +.ion-compose:before { content: "\f12c"; } + +.ion-connection-bars:before { content: "\f274"; } + +.ion-contrast:before { content: "\f275"; } + +.ion-crop:before { content: "\f3c1"; } + +.ion-cube:before { content: "\f318"; } + +.ion-disc:before { content: "\f12d"; } + +.ion-document:before { content: "\f12f"; } + +.ion-document-text:before { content: "\f12e"; } + +.ion-drag:before { content: "\f130"; } + +.ion-earth:before { content: "\f276"; } + +.ion-easel:before { content: "\f3c2"; } + +.ion-edit:before { content: "\f2bf"; } + +.ion-egg:before { content: "\f277"; } + +.ion-eject:before { content: "\f131"; } + +.ion-email:before { content: "\f132"; } + +.ion-email-unread:before { content: "\f3c3"; } + +.ion-erlenmeyer-flask:before { content: "\f3c5"; } + +.ion-erlenmeyer-flask-bubbles:before { content: "\f3c4"; } + +.ion-eye:before { content: "\f133"; } + +.ion-eye-disabled:before { content: "\f306"; } + +.ion-female:before { content: "\f278"; } + +.ion-filing:before { content: "\f134"; } + +.ion-film-marker:before { content: "\f135"; } + +.ion-fireball:before { content: "\f319"; } + +.ion-flag:before { content: "\f279"; } + +.ion-flame:before { content: "\f31a"; } + +.ion-flash:before { content: "\f137"; } + +.ion-flash-off:before { content: "\f136"; } + +.ion-folder:before { content: "\f139"; } + +.ion-fork:before { content: "\f27a"; } + +.ion-fork-repo:before { content: "\f2c0"; } + +.ion-forward:before { content: "\f13a"; } + +.ion-funnel:before { content: "\f31b"; } + +.ion-gear-a:before { content: "\f13d"; } + +.ion-gear-b:before { content: "\f13e"; } + +.ion-grid:before { content: "\f13f"; } + +.ion-hammer:before { content: "\f27b"; } + +.ion-happy:before { content: "\f31c"; } + +.ion-happy-outline:before { content: "\f3c6"; } + +.ion-headphone:before { content: "\f140"; } + +.ion-heart:before { content: "\f141"; } + +.ion-heart-broken:before { content: "\f31d"; } + +.ion-help:before { content: "\f143"; } + +.ion-help-buoy:before { content: "\f27c"; } + +.ion-help-circled:before { content: "\f142"; } + +.ion-home:before { content: "\f144"; } + +.ion-icecream:before { content: "\f27d"; } + +.ion-image:before { content: "\f147"; } + +.ion-images:before { content: "\f148"; } + +.ion-information:before { content: "\f14a"; } + +.ion-information-circled:before { content: "\f149"; } + +.ion-ionic:before { content: "\f14b"; } + +.ion-ios-alarm:before { content: "\f3c8"; } + +.ion-ios-alarm-outline:before { content: "\f3c7"; } + +.ion-ios-albums:before { content: "\f3ca"; } + +.ion-ios-albums-outline:before { content: "\f3c9"; } + +.ion-ios-americanfootball:before { content: "\f3cc"; } + +.ion-ios-americanfootball-outline:before { content: "\f3cb"; } + +.ion-ios-analytics:before { content: "\f3ce"; } + +.ion-ios-analytics-outline:before { content: "\f3cd"; } + +.ion-ios-arrow-back:before { content: "\f3cf"; } + +.ion-ios-arrow-down:before { content: "\f3d0"; } + +.ion-ios-arrow-forward:before { content: "\f3d1"; } + +.ion-ios-arrow-left:before { content: "\f3d2"; } + +.ion-ios-arrow-right:before { content: "\f3d3"; } + +.ion-ios-arrow-thin-down:before { content: "\f3d4"; } + +.ion-ios-arrow-thin-left:before { content: "\f3d5"; } + +.ion-ios-arrow-thin-right:before { content: "\f3d6"; } + +.ion-ios-arrow-thin-up:before { content: "\f3d7"; } + +.ion-ios-arrow-up:before { content: "\f3d8"; } + +.ion-ios-at:before { content: "\f3da"; } + +.ion-ios-at-outline:before { content: "\f3d9"; } + +.ion-ios-barcode:before { content: "\f3dc"; } + +.ion-ios-barcode-outline:before { content: "\f3db"; } + +.ion-ios-baseball:before { content: "\f3de"; } + +.ion-ios-baseball-outline:before { content: "\f3dd"; } + +.ion-ios-basketball:before { content: "\f3e0"; } + +.ion-ios-basketball-outline:before { content: "\f3df"; } + +.ion-ios-bell:before { content: "\f3e2"; } + +.ion-ios-bell-outline:before { content: "\f3e1"; } + +.ion-ios-body:before { content: "\f3e4"; } + +.ion-ios-body-outline:before { content: "\f3e3"; } + +.ion-ios-bolt:before { content: "\f3e6"; } + +.ion-ios-bolt-outline:before { content: "\f3e5"; } + +.ion-ios-book:before { content: "\f3e8"; } + +.ion-ios-book-outline:before { content: "\f3e7"; } + +.ion-ios-bookmarks:before { content: "\f3ea"; } + +.ion-ios-bookmarks-outline:before { content: "\f3e9"; } + +.ion-ios-box:before { content: "\f3ec"; } + +.ion-ios-box-outline:before { content: "\f3eb"; } + +.ion-ios-briefcase:before { content: "\f3ee"; } + +.ion-ios-briefcase-outline:before { content: "\f3ed"; } + +.ion-ios-browsers:before { content: "\f3f0"; } + +.ion-ios-browsers-outline:before { content: "\f3ef"; } + +.ion-ios-calculator:before { content: "\f3f2"; } + +.ion-ios-calculator-outline:before { content: "\f3f1"; } + +.ion-ios-calendar:before { content: "\f3f4"; } + +.ion-ios-calendar-outline:before { content: "\f3f3"; } + +.ion-ios-camera:before { content: "\f3f6"; } + +.ion-ios-camera-outline:before { content: "\f3f5"; } + +.ion-ios-cart:before { content: "\f3f8"; } + +.ion-ios-cart-outline:before { content: "\f3f7"; } + +.ion-ios-chatboxes:before { content: "\f3fa"; } + +.ion-ios-chatboxes-outline:before { content: "\f3f9"; } + +.ion-ios-chatbubble:before { content: "\f3fc"; } + +.ion-ios-chatbubble-outline:before { content: "\f3fb"; } + +.ion-ios-checkmark:before { content: "\f3ff"; } + +.ion-ios-checkmark-empty:before { content: "\f3fd"; } + +.ion-ios-checkmark-outline:before { content: "\f3fe"; } + +.ion-ios-circle-filled:before { content: "\f400"; } + +.ion-ios-circle-outline:before { content: "\f401"; } + +.ion-ios-clock:before { content: "\f403"; } + +.ion-ios-clock-outline:before { content: "\f402"; } + +.ion-ios-close:before { content: "\f406"; } + +.ion-ios-close-empty:before { content: "\f404"; } + +.ion-ios-close-outline:before { content: "\f405"; } + +.ion-ios-cloud:before { content: "\f40c"; } + +.ion-ios-cloud-download:before { content: "\f408"; } + +.ion-ios-cloud-download-outline:before { content: "\f407"; } + +.ion-ios-cloud-outline:before { content: "\f409"; } + +.ion-ios-cloud-upload:before { content: "\f40b"; } + +.ion-ios-cloud-upload-outline:before { content: "\f40a"; } + +.ion-ios-cloudy:before { content: "\f410"; } + +.ion-ios-cloudy-night:before { content: "\f40e"; } + +.ion-ios-cloudy-night-outline:before { content: "\f40d"; } + +.ion-ios-cloudy-outline:before { content: "\f40f"; } + +.ion-ios-cog:before { content: "\f412"; } + +.ion-ios-cog-outline:before { content: "\f411"; } + +.ion-ios-color-filter:before { content: "\f414"; } + +.ion-ios-color-filter-outline:before { content: "\f413"; } + +.ion-ios-color-wand:before { content: "\f416"; } + +.ion-ios-color-wand-outline:before { content: "\f415"; } + +.ion-ios-compose:before { content: "\f418"; } + +.ion-ios-compose-outline:before { content: "\f417"; } + +.ion-ios-contact:before { content: "\f41a"; } + +.ion-ios-contact-outline:before { content: "\f419"; } + +.ion-ios-copy:before { content: "\f41c"; } + +.ion-ios-copy-outline:before { content: "\f41b"; } + +.ion-ios-crop:before { content: "\f41e"; } + +.ion-ios-crop-strong:before { content: "\f41d"; } + +.ion-ios-download:before { content: "\f420"; } + +.ion-ios-download-outline:before { content: "\f41f"; } + +.ion-ios-drag:before { content: "\f421"; } + +.ion-ios-email:before { content: "\f423"; } + +.ion-ios-email-outline:before { content: "\f422"; } + +.ion-ios-eye:before { content: "\f425"; } + +.ion-ios-eye-outline:before { content: "\f424"; } + +.ion-ios-fastforward:before { content: "\f427"; } + +.ion-ios-fastforward-outline:before { content: "\f426"; } + +.ion-ios-filing:before { content: "\f429"; } + +.ion-ios-filing-outline:before { content: "\f428"; } + +.ion-ios-film:before { content: "\f42b"; } + +.ion-ios-film-outline:before { content: "\f42a"; } + +.ion-ios-flag:before { content: "\f42d"; } + +.ion-ios-flag-outline:before { content: "\f42c"; } + +.ion-ios-flame:before { content: "\f42f"; } + +.ion-ios-flame-outline:before { content: "\f42e"; } + +.ion-ios-flask:before { content: "\f431"; } + +.ion-ios-flask-outline:before { content: "\f430"; } + +.ion-ios-flower:before { content: "\f433"; } + +.ion-ios-flower-outline:before { content: "\f432"; } + +.ion-ios-folder:before { content: "\f435"; } + +.ion-ios-folder-outline:before { content: "\f434"; } + +.ion-ios-football:before { content: "\f437"; } + +.ion-ios-football-outline:before { content: "\f436"; } + +.ion-ios-game-controller-a:before { content: "\f439"; } + +.ion-ios-game-controller-a-outline:before { content: "\f438"; } + +.ion-ios-game-controller-b:before { content: "\f43b"; } + +.ion-ios-game-controller-b-outline:before { content: "\f43a"; } + +.ion-ios-gear:before { content: "\f43d"; } + +.ion-ios-gear-outline:before { content: "\f43c"; } + +.ion-ios-glasses:before { content: "\f43f"; } + +.ion-ios-glasses-outline:before { content: "\f43e"; } + +.ion-ios-grid-view:before { content: "\f441"; } + +.ion-ios-grid-view-outline:before { content: "\f440"; } + +.ion-ios-heart:before { content: "\f443"; } + +.ion-ios-heart-outline:before { content: "\f442"; } + +.ion-ios-help:before { content: "\f446"; } + +.ion-ios-help-empty:before { content: "\f444"; } + +.ion-ios-help-outline:before { content: "\f445"; } + +.ion-ios-home:before { content: "\f448"; } + +.ion-ios-home-outline:before { content: "\f447"; } + +.ion-ios-infinite:before { content: "\f44a"; } + +.ion-ios-infinite-outline:before { content: "\f449"; } + +.ion-ios-information:before { content: "\f44d"; } + +.ion-ios-information-empty:before { content: "\f44b"; } + +.ion-ios-information-outline:before { content: "\f44c"; } + +.ion-ios-ionic-outline:before { content: "\f44e"; } + +.ion-ios-keypad:before { content: "\f450"; } + +.ion-ios-keypad-outline:before { content: "\f44f"; } + +.ion-ios-lightbulb:before { content: "\f452"; } + +.ion-ios-lightbulb-outline:before { content: "\f451"; } + +.ion-ios-list:before { content: "\f454"; } + +.ion-ios-list-outline:before { content: "\f453"; } + +.ion-ios-location:before { content: "\f456"; } + +.ion-ios-location-outline:before { content: "\f455"; } + +.ion-ios-locked:before { content: "\f458"; } + +.ion-ios-locked-outline:before { content: "\f457"; } + +.ion-ios-loop:before { content: "\f45a"; } + +.ion-ios-loop-strong:before { content: "\f459"; } + +.ion-ios-medical:before { content: "\f45c"; } + +.ion-ios-medical-outline:before { content: "\f45b"; } + +.ion-ios-medkit:before { content: "\f45e"; } + +.ion-ios-medkit-outline:before { content: "\f45d"; } + +.ion-ios-mic:before { content: "\f461"; } + +.ion-ios-mic-off:before { content: "\f45f"; } + +.ion-ios-mic-outline:before { content: "\f460"; } + +.ion-ios-minus:before { content: "\f464"; } + +.ion-ios-minus-empty:before { content: "\f462"; } + +.ion-ios-minus-outline:before { content: "\f463"; } + +.ion-ios-monitor:before { content: "\f466"; } + +.ion-ios-monitor-outline:before { content: "\f465"; } + +.ion-ios-moon:before { content: "\f468"; } + +.ion-ios-moon-outline:before { content: "\f467"; } + +.ion-ios-more:before { content: "\f46a"; } + +.ion-ios-more-outline:before { content: "\f469"; } + +.ion-ios-musical-note:before { content: "\f46b"; } + +.ion-ios-musical-notes:before { content: "\f46c"; } + +.ion-ios-navigate:before { content: "\f46e"; } + +.ion-ios-navigate-outline:before { content: "\f46d"; } + +.ion-ios-nutrition:before { content: "\f470"; } + +.ion-ios-nutrition-outline:before { content: "\f46f"; } + +.ion-ios-paper:before { content: "\f472"; } + +.ion-ios-paper-outline:before { content: "\f471"; } + +.ion-ios-paperplane:before { content: "\f474"; } + +.ion-ios-paperplane-outline:before { content: "\f473"; } + +.ion-ios-partlysunny:before { content: "\f476"; } + +.ion-ios-partlysunny-outline:before { content: "\f475"; } + +.ion-ios-pause:before { content: "\f478"; } + +.ion-ios-pause-outline:before { content: "\f477"; } + +.ion-ios-paw:before { content: "\f47a"; } + +.ion-ios-paw-outline:before { content: "\f479"; } + +.ion-ios-people:before { content: "\f47c"; } + +.ion-ios-people-outline:before { content: "\f47b"; } + +.ion-ios-person:before { content: "\f47e"; } + +.ion-ios-person-outline:before { content: "\f47d"; } + +.ion-ios-personadd:before { content: "\f480"; } + +.ion-ios-personadd-outline:before { content: "\f47f"; } + +.ion-ios-photos:before { content: "\f482"; } + +.ion-ios-photos-outline:before { content: "\f481"; } + +.ion-ios-pie:before { content: "\f484"; } + +.ion-ios-pie-outline:before { content: "\f483"; } + +.ion-ios-pint:before { content: "\f486"; } + +.ion-ios-pint-outline:before { content: "\f485"; } + +.ion-ios-play:before { content: "\f488"; } + +.ion-ios-play-outline:before { content: "\f487"; } + +.ion-ios-plus:before { content: "\f48b"; } + +.ion-ios-plus-empty:before { content: "\f489"; } + +.ion-ios-plus-outline:before { content: "\f48a"; } + +.ion-ios-pricetag:before { content: "\f48d"; } + +.ion-ios-pricetag-outline:before { content: "\f48c"; } + +.ion-ios-pricetags:before { content: "\f48f"; } + +.ion-ios-pricetags-outline:before { content: "\f48e"; } + +.ion-ios-printer:before { content: "\f491"; } + +.ion-ios-printer-outline:before { content: "\f490"; } + +.ion-ios-pulse:before { content: "\f493"; } + +.ion-ios-pulse-strong:before { content: "\f492"; } + +.ion-ios-rainy:before { content: "\f495"; } + +.ion-ios-rainy-outline:before { content: "\f494"; } + +.ion-ios-recording:before { content: "\f497"; } + +.ion-ios-recording-outline:before { content: "\f496"; } + +.ion-ios-redo:before { content: "\f499"; } + +.ion-ios-redo-outline:before { content: "\f498"; } + +.ion-ios-refresh:before { content: "\f49c"; } + +.ion-ios-refresh-empty:before { content: "\f49a"; } + +.ion-ios-refresh-outline:before { content: "\f49b"; } + +.ion-ios-reload:before { content: "\f49d"; } + +.ion-ios-reverse-camera:before { content: "\f49f"; } + +.ion-ios-reverse-camera-outline:before { content: "\f49e"; } + +.ion-ios-rewind:before { content: "\f4a1"; } + +.ion-ios-rewind-outline:before { content: "\f4a0"; } + +.ion-ios-rose:before { content: "\f4a3"; } + +.ion-ios-rose-outline:before { content: "\f4a2"; } + +.ion-ios-search:before { content: "\f4a5"; } + +.ion-ios-search-strong:before { content: "\f4a4"; } + +.ion-ios-settings:before { content: "\f4a7"; } + +.ion-ios-settings-strong:before { content: "\f4a6"; } + +.ion-ios-shuffle:before { content: "\f4a9"; } + +.ion-ios-shuffle-strong:before { content: "\f4a8"; } + +.ion-ios-skipbackward:before { content: "\f4ab"; } + +.ion-ios-skipbackward-outline:before { content: "\f4aa"; } + +.ion-ios-skipforward:before { content: "\f4ad"; } + +.ion-ios-skipforward-outline:before { content: "\f4ac"; } + +.ion-ios-snowy:before { content: "\f4ae"; } + +.ion-ios-speedometer:before { content: "\f4b0"; } + +.ion-ios-speedometer-outline:before { content: "\f4af"; } + +.ion-ios-star:before { content: "\f4b3"; } + +.ion-ios-star-half:before { content: "\f4b1"; } + +.ion-ios-star-outline:before { content: "\f4b2"; } + +.ion-ios-stopwatch:before { content: "\f4b5"; } + +.ion-ios-stopwatch-outline:before { content: "\f4b4"; } + +.ion-ios-sunny:before { content: "\f4b7"; } + +.ion-ios-sunny-outline:before { content: "\f4b6"; } + +.ion-ios-telephone:before { content: "\f4b9"; } + +.ion-ios-telephone-outline:before { content: "\f4b8"; } + +.ion-ios-tennisball:before { content: "\f4bb"; } + +.ion-ios-tennisball-outline:before { content: "\f4ba"; } + +.ion-ios-thunderstorm:before { content: "\f4bd"; } + +.ion-ios-thunderstorm-outline:before { content: "\f4bc"; } + +.ion-ios-time:before { content: "\f4bf"; } + +.ion-ios-time-outline:before { content: "\f4be"; } + +.ion-ios-timer:before { content: "\f4c1"; } + +.ion-ios-timer-outline:before { content: "\f4c0"; } + +.ion-ios-toggle:before { content: "\f4c3"; } + +.ion-ios-toggle-outline:before { content: "\f4c2"; } + +.ion-ios-trash:before { content: "\f4c5"; } + +.ion-ios-trash-outline:before { content: "\f4c4"; } + +.ion-ios-undo:before { content: "\f4c7"; } + +.ion-ios-undo-outline:before { content: "\f4c6"; } + +.ion-ios-unlocked:before { content: "\f4c9"; } + +.ion-ios-unlocked-outline:before { content: "\f4c8"; } + +.ion-ios-upload:before { content: "\f4cb"; } + +.ion-ios-upload-outline:before { content: "\f4ca"; } + +.ion-ios-videocam:before { content: "\f4cd"; } + +.ion-ios-videocam-outline:before { content: "\f4cc"; } + +.ion-ios-volume-high:before { content: "\f4ce"; } + +.ion-ios-volume-low:before { content: "\f4cf"; } + +.ion-ios-wineglass:before { content: "\f4d1"; } + +.ion-ios-wineglass-outline:before { content: "\f4d0"; } + +.ion-ios-world:before { content: "\f4d3"; } + +.ion-ios-world-outline:before { content: "\f4d2"; } + +.ion-ipad:before { content: "\f1f9"; } + +.ion-iphone:before { content: "\f1fa"; } + +.ion-ipod:before { content: "\f1fb"; } + +.ion-jet:before { content: "\f295"; } + +.ion-key:before { content: "\f296"; } + +.ion-knife:before { content: "\f297"; } + +.ion-laptop:before { content: "\f1fc"; } + +.ion-leaf:before { content: "\f1fd"; } + +.ion-levels:before { content: "\f298"; } + +.ion-lightbulb:before { content: "\f299"; } + +.ion-link:before { content: "\f1fe"; } + +.ion-load-a:before { content: "\f29a"; } + +.ion-load-b:before { content: "\f29b"; } + +.ion-load-c:before { content: "\f29c"; } + +.ion-load-d:before { content: "\f29d"; } + +.ion-location:before { content: "\f1ff"; } + +.ion-lock-combination:before { content: "\f4d4"; } + +.ion-locked:before { content: "\f200"; } + +.ion-log-in:before { content: "\f29e"; } + +.ion-log-out:before { content: "\f29f"; } + +.ion-loop:before { content: "\f201"; } + +.ion-magnet:before { content: "\f2a0"; } + +.ion-male:before { content: "\f2a1"; } + +.ion-man:before { content: "\f202"; } + +.ion-map:before { content: "\f203"; } + +.ion-medkit:before { content: "\f2a2"; } + +.ion-merge:before { content: "\f33f"; } + +.ion-mic-a:before { content: "\f204"; } + +.ion-mic-b:before { content: "\f205"; } + +.ion-mic-c:before { content: "\f206"; } + +.ion-minus:before { content: "\f209"; } + +.ion-minus-circled:before { content: "\f207"; } + +.ion-minus-round:before { content: "\f208"; } + +.ion-model-s:before { content: "\f2c1"; } + +.ion-monitor:before { content: "\f20a"; } + +.ion-more:before { content: "\f20b"; } + +.ion-mouse:before { content: "\f340"; } + +.ion-music-note:before { content: "\f20c"; } + +.ion-navicon:before { content: "\f20e"; } + +.ion-navicon-round:before { content: "\f20d"; } + +.ion-navigate:before { content: "\f2a3"; } + +.ion-network:before { content: "\f341"; } + +.ion-no-smoking:before { content: "\f2c2"; } + +.ion-nuclear:before { content: "\f2a4"; } + +.ion-outlet:before { content: "\f342"; } + +.ion-paintbrush:before { content: "\f4d5"; } + +.ion-paintbucket:before { content: "\f4d6"; } + +.ion-paper-airplane:before { content: "\f2c3"; } + +.ion-paperclip:before { content: "\f20f"; } + +.ion-pause:before { content: "\f210"; } + +.ion-person:before { content: "\f213"; } + +.ion-person-add:before { content: "\f211"; } + +.ion-person-stalker:before { content: "\f212"; } + +.ion-pie-graph:before { content: "\f2a5"; } + +.ion-pin:before { content: "\f2a6"; } + +.ion-pinpoint:before { content: "\f2a7"; } + +.ion-pizza:before { content: "\f2a8"; } + +.ion-plane:before { content: "\f214"; } + +.ion-planet:before { content: "\f343"; } + +.ion-play:before { content: "\f215"; } + +.ion-playstation:before { content: "\f30a"; } + +.ion-plus:before { content: "\f218"; } + +.ion-plus-circled:before { content: "\f216"; } + +.ion-plus-round:before { content: "\f217"; } + +.ion-podium:before { content: "\f344"; } + +.ion-pound:before { content: "\f219"; } + +.ion-power:before { content: "\f2a9"; } + +.ion-pricetag:before { content: "\f2aa"; } + +.ion-pricetags:before { content: "\f2ab"; } + +.ion-printer:before { content: "\f21a"; } + +.ion-pull-request:before { content: "\f345"; } + +.ion-qr-scanner:before { content: "\f346"; } + +.ion-quote:before { content: "\f347"; } + +.ion-radio-waves:before { content: "\f2ac"; } + +.ion-record:before { content: "\f21b"; } + +.ion-refresh:before { content: "\f21c"; } + +.ion-reply:before { content: "\f21e"; } + +.ion-reply-all:before { content: "\f21d"; } + +.ion-ribbon-a:before { content: "\f348"; } + +.ion-ribbon-b:before { content: "\f349"; } + +.ion-sad:before { content: "\f34a"; } + +.ion-sad-outline:before { content: "\f4d7"; } + +.ion-scissors:before { content: "\f34b"; } + +.ion-search:before { content: "\f21f"; } + +.ion-settings:before { content: "\f2ad"; } + +.ion-share:before { content: "\f220"; } + +.ion-shuffle:before { content: "\f221"; } + +.ion-skip-backward:before { content: "\f222"; } + +.ion-skip-forward:before { content: "\f223"; } + +.ion-social-android:before { content: "\f225"; } + +.ion-social-android-outline:before { content: "\f224"; } + +.ion-social-angular:before { content: "\f4d9"; } + +.ion-social-angular-outline:before { content: "\f4d8"; } + +.ion-social-apple:before { content: "\f227"; } + +.ion-social-apple-outline:before { content: "\f226"; } + +.ion-social-bitcoin:before { content: "\f2af"; } + +.ion-social-bitcoin-outline:before { content: "\f2ae"; } + +.ion-social-buffer:before { content: "\f229"; } + +.ion-social-buffer-outline:before { content: "\f228"; } + +.ion-social-chrome:before { content: "\f4db"; } + +.ion-social-chrome-outline:before { content: "\f4da"; } + +.ion-social-codepen:before { content: "\f4dd"; } + +.ion-social-codepen-outline:before { content: "\f4dc"; } + +.ion-social-css3:before { content: "\f4df"; } + +.ion-social-css3-outline:before { content: "\f4de"; } + +.ion-social-designernews:before { content: "\f22b"; } + +.ion-social-designernews-outline:before { content: "\f22a"; } + +.ion-social-dribbble:before { content: "\f22d"; } + +.ion-social-dribbble-outline:before { content: "\f22c"; } + +.ion-social-dropbox:before { content: "\f22f"; } + +.ion-social-dropbox-outline:before { content: "\f22e"; } + +.ion-social-euro:before { content: "\f4e1"; } + +.ion-social-euro-outline:before { content: "\f4e0"; } + +.ion-social-facebook:before { content: "\f231"; } + +.ion-social-facebook-outline:before { content: "\f230"; } + +.ion-social-foursquare:before { content: "\f34d"; } + +.ion-social-foursquare-outline:before { content: "\f34c"; } + +.ion-social-freebsd-devil:before { content: "\f2c4"; } + +.ion-social-github:before { content: "\f233"; } + +.ion-social-github-outline:before { content: "\f232"; } + +.ion-social-google:before { content: "\f34f"; } + +.ion-social-google-outline:before { content: "\f34e"; } + +.ion-social-googleplus:before { content: "\f235"; } + +.ion-social-googleplus-outline:before { content: "\f234"; } + +.ion-social-hackernews:before { content: "\f237"; } + +.ion-social-hackernews-outline:before { content: "\f236"; } + +.ion-social-html5:before { content: "\f4e3"; } + +.ion-social-html5-outline:before { content: "\f4e2"; } + +.ion-social-instagram:before { content: "\f351"; } + +.ion-social-instagram-outline:before { content: "\f350"; } + +.ion-social-javascript:before { content: "\f4e5"; } + +.ion-social-javascript-outline:before { content: "\f4e4"; } + +.ion-social-linkedin:before { content: "\f239"; } + +.ion-social-linkedin-outline:before { content: "\f238"; } + +.ion-social-markdown:before { content: "\f4e6"; } + +.ion-social-nodejs:before { content: "\f4e7"; } + +.ion-social-octocat:before { content: "\f4e8"; } + +.ion-social-pinterest:before { content: "\f2b1"; } + +.ion-social-pinterest-outline:before { content: "\f2b0"; } + +.ion-social-python:before { content: "\f4e9"; } + +.ion-social-reddit:before { content: "\f23b"; } + +.ion-social-reddit-outline:before { content: "\f23a"; } + +.ion-social-rss:before { content: "\f23d"; } + +.ion-social-rss-outline:before { content: "\f23c"; } + +.ion-social-sass:before { content: "\f4ea"; } + +.ion-social-skype:before { content: "\f23f"; } + +.ion-social-skype-outline:before { content: "\f23e"; } + +.ion-social-snapchat:before { content: "\f4ec"; } + +.ion-social-snapchat-outline:before { content: "\f4eb"; } + +.ion-social-tumblr:before { content: "\f241"; } + +.ion-social-tumblr-outline:before { content: "\f240"; } + +.ion-social-tux:before { content: "\f2c5"; } + +.ion-social-twitch:before { content: "\f4ee"; } + +.ion-social-twitch-outline:before { content: "\f4ed"; } + +.ion-social-twitter:before { content: "\f243"; } + +.ion-social-twitter-outline:before { content: "\f242"; } + +.ion-social-usd:before { content: "\f353"; } + +.ion-social-usd-outline:before { content: "\f352"; } + +.ion-social-vimeo:before { content: "\f245"; } + +.ion-social-vimeo-outline:before { content: "\f244"; } + +.ion-social-whatsapp:before { content: "\f4f0"; } + +.ion-social-whatsapp-outline:before { content: "\f4ef"; } + +.ion-social-windows:before { content: "\f247"; } + +.ion-social-windows-outline:before { content: "\f246"; } + +.ion-social-wordpress:before { content: "\f249"; } + +.ion-social-wordpress-outline:before { content: "\f248"; } + +.ion-social-yahoo:before { content: "\f24b"; } + +.ion-social-yahoo-outline:before { content: "\f24a"; } + +.ion-social-yen:before { content: "\f4f2"; } + +.ion-social-yen-outline:before { content: "\f4f1"; } + +.ion-social-youtube:before { content: "\f24d"; } + +.ion-social-youtube-outline:before { content: "\f24c"; } + +.ion-soup-can:before { content: "\f4f4"; } + +.ion-soup-can-outline:before { content: "\f4f3"; } + +.ion-speakerphone:before { content: "\f2b2"; } + +.ion-speedometer:before { content: "\f2b3"; } + +.ion-spoon:before { content: "\f2b4"; } + +.ion-star:before { content: "\f24e"; } + +.ion-stats-bars:before { content: "\f2b5"; } + +.ion-steam:before { content: "\f30b"; } + +.ion-stop:before { content: "\f24f"; } + +.ion-thermometer:before { content: "\f2b6"; } + +.ion-thumbsdown:before { content: "\f250"; } + +.ion-thumbsup:before { content: "\f251"; } + +.ion-toggle:before { content: "\f355"; } + +.ion-toggle-filled:before { content: "\f354"; } + +.ion-transgender:before { content: "\f4f5"; } + +.ion-trash-a:before { content: "\f252"; } + +.ion-trash-b:before { content: "\f253"; } + +.ion-trophy:before { content: "\f356"; } + +.ion-tshirt:before { content: "\f4f7"; } + +.ion-tshirt-outline:before { content: "\f4f6"; } + +.ion-umbrella:before { content: "\f2b7"; } + +.ion-university:before { content: "\f357"; } + +.ion-unlocked:before { content: "\f254"; } + +.ion-upload:before { content: "\f255"; } + +.ion-usb:before { content: "\f2b8"; } + +.ion-videocamera:before { content: "\f256"; } + +.ion-volume-high:before { content: "\f257"; } + +.ion-volume-low:before { content: "\f258"; } + +.ion-volume-medium:before { content: "\f259"; } + +.ion-volume-mute:before { content: "\f25a"; } + +.ion-wand:before { content: "\f358"; } + +.ion-waterdrop:before { content: "\f25b"; } + +.ion-wifi:before { content: "\f25c"; } + +.ion-wineglass:before { content: "\f2b9"; } + +.ion-woman:before { content: "\f25d"; } + +.ion-wrench:before { content: "\f2ba"; } + +.ion-xbox:before { content: "\f30c"; } diff --git a/_sass/vendor/ionicons.min.css b/_sass/vendor/ionicons.min.css new file mode 100755 index 0000000..9a15027 --- /dev/null +++ b/_sass/vendor/ionicons.min.css @@ -0,0 +1,11 @@ +@charset "UTF-8";/*! + Ionicons, v2.0.0 + Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ + https://twitter.com/benjsperry https://twitter.com/ionicframework + MIT License: https://github.com/driftyco/ionicons + + Android-style icons originally built by Google’s + Material Design Icons: https://github.com/google/material-design-icons + used under CC BY http://creativecommons.org/licenses/by/4.0/ + Modified icons to fit ionicon’s grid from original. +*/@font-face{font-family:"Ionicons";src:url("../../fonts/ionicons.eot?v=2.0.0");src:url("../../fonts/ionicons.eot?v=2.0.0#iefix") format("embedded-opentype"),url("../../fonts/ionicons.ttf?v=2.0.0") format("truetype"),url("../../fonts/ionicons.woff?v=2.0.0") format("woff"),url("../../fonts/ionicons.svg?v=2.0.0#Ionicons") format("svg");font-weight:normal;font-style:normal}.ion,.ionicons,.ion-alert:before,.ion-alert-circled:before,.ion-android-add:before,.ion-android-add-circle:before,.ion-android-alarm-clock:before,.ion-android-alert:before,.ion-android-apps:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down:before,.ion-android-arrow-dropdown:before,.ion-android-arrow-dropdown-circle:before,.ion-android-arrow-dropleft:before,.ion-android-arrow-dropleft-circle:before,.ion-android-arrow-dropright:before,.ion-android-arrow-dropright-circle:before,.ion-android-arrow-dropup:before,.ion-android-arrow-dropup-circle:before,.ion-android-arrow-forward:before,.ion-android-arrow-up:before,.ion-android-attach:before,.ion-android-bar:before,.ion-android-bicycle:before,.ion-android-boat:before,.ion-android-bookmark:before,.ion-android-bulb:before,.ion-android-bus:before,.ion-android-calendar:before,.ion-android-call:before,.ion-android-camera:before,.ion-android-cancel:before,.ion-android-car:before,.ion-android-cart:before,.ion-android-chat:before,.ion-android-checkbox:before,.ion-android-checkbox-blank:before,.ion-android-checkbox-outline:before,.ion-android-checkbox-outline-blank:before,.ion-android-checkmark-circle:before,.ion-android-clipboard:before,.ion-android-close:before,.ion-android-cloud:before,.ion-android-cloud-circle:before,.ion-android-cloud-done:before,.ion-android-cloud-outline:before,.ion-android-color-palette:before,.ion-android-compass:before,.ion-android-contact:before,.ion-android-contacts:before,.ion-android-contract:before,.ion-android-create:before,.ion-android-delete:before,.ion-android-desktop:before,.ion-android-document:before,.ion-android-done:before,.ion-android-done-all:before,.ion-android-download:before,.ion-android-drafts:before,.ion-android-exit:before,.ion-android-expand:before,.ion-android-favorite:before,.ion-android-favorite-outline:before,.ion-android-film:before,.ion-android-folder:before,.ion-android-folder-open:before,.ion-android-funnel:before,.ion-android-globe:before,.ion-android-hand:before,.ion-android-hangout:before,.ion-android-happy:before,.ion-android-home:before,.ion-android-image:before,.ion-android-laptop:before,.ion-android-list:before,.ion-android-locate:before,.ion-android-lock:before,.ion-android-mail:before,.ion-android-map:before,.ion-android-menu:before,.ion-android-microphone:before,.ion-android-microphone-off:before,.ion-android-more-horizontal:before,.ion-android-more-vertical:before,.ion-android-navigate:before,.ion-android-notifications:before,.ion-android-notifications-none:before,.ion-android-notifications-off:before,.ion-android-open:before,.ion-android-options:before,.ion-android-people:before,.ion-android-person:before,.ion-android-person-add:before,.ion-android-phone-landscape:before,.ion-android-phone-portrait:before,.ion-android-pin:before,.ion-android-plane:before,.ion-android-playstore:before,.ion-android-print:before,.ion-android-radio-button-off:before,.ion-android-radio-button-on:before,.ion-android-refresh:before,.ion-android-remove:before,.ion-android-remove-circle:before,.ion-android-restaurant:before,.ion-android-sad:before,.ion-android-search:before,.ion-android-send:before,.ion-android-settings:before,.ion-android-share:before,.ion-android-share-alt:before,.ion-android-star:before,.ion-android-star-half:before,.ion-android-star-outline:before,.ion-android-stopwatch:before,.ion-android-subway:before,.ion-android-sunny:before,.ion-android-sync:before,.ion-android-textsms:before,.ion-android-time:before,.ion-android-train:before,.ion-android-unlock:before,.ion-android-upload:before,.ion-android-volume-down:before,.ion-android-volume-mute:before,.ion-android-volume-off:before,.ion-android-volume-up:before,.ion-android-walk:before,.ion-android-warning:before,.ion-android-watch:before,.ion-android-wifi:before,.ion-aperture:before,.ion-archive:before,.ion-arrow-down-a:before,.ion-arrow-down-b:before,.ion-arrow-down-c:before,.ion-arrow-expand:before,.ion-arrow-graph-down-left:before,.ion-arrow-graph-down-right:before,.ion-arrow-graph-up-left:before,.ion-arrow-graph-up-right:before,.ion-arrow-left-a:before,.ion-arrow-left-b:before,.ion-arrow-left-c:before,.ion-arrow-move:before,.ion-arrow-resize:before,.ion-arrow-return-left:before,.ion-arrow-return-right:before,.ion-arrow-right-a:before,.ion-arrow-right-b:before,.ion-arrow-right-c:before,.ion-arrow-shrink:before,.ion-arrow-swap:before,.ion-arrow-up-a:before,.ion-arrow-up-b:before,.ion-arrow-up-c:before,.ion-asterisk:before,.ion-at:before,.ion-backspace:before,.ion-backspace-outline:before,.ion-bag:before,.ion-battery-charging:before,.ion-battery-empty:before,.ion-battery-full:before,.ion-battery-half:before,.ion-battery-low:before,.ion-beaker:before,.ion-beer:before,.ion-bluetooth:before,.ion-bonfire:before,.ion-bookmark:before,.ion-bowtie:before,.ion-briefcase:before,.ion-bug:before,.ion-calculator:before,.ion-calendar:before,.ion-camera:before,.ion-card:before,.ion-cash:before,.ion-chatbox:before,.ion-chatbox-working:before,.ion-chatboxes:before,.ion-chatbubble:before,.ion-chatbubble-working:before,.ion-chatbubbles:before,.ion-checkmark:before,.ion-checkmark-circled:before,.ion-checkmark-round:before,.ion-chevron-down:before,.ion-chevron-left:before,.ion-chevron-right:before,.ion-chevron-up:before,.ion-clipboard:before,.ion-clock:before,.ion-close:before,.ion-close-circled:before,.ion-close-round:before,.ion-closed-captioning:before,.ion-cloud:before,.ion-code:before,.ion-code-download:before,.ion-code-working:before,.ion-coffee:before,.ion-compass:before,.ion-compose:before,.ion-connection-bars:before,.ion-contrast:before,.ion-crop:before,.ion-cube:before,.ion-disc:before,.ion-document:before,.ion-document-text:before,.ion-drag:before,.ion-earth:before,.ion-easel:before,.ion-edit:before,.ion-egg:before,.ion-eject:before,.ion-email:before,.ion-email-unread:before,.ion-erlenmeyer-flask:before,.ion-erlenmeyer-flask-bubbles:before,.ion-eye:before,.ion-eye-disabled:before,.ion-female:before,.ion-filing:before,.ion-film-marker:before,.ion-fireball:before,.ion-flag:before,.ion-flame:before,.ion-flash:before,.ion-flash-off:before,.ion-folder:before,.ion-fork:before,.ion-fork-repo:before,.ion-forward:before,.ion-funnel:before,.ion-gear-a:before,.ion-gear-b:before,.ion-grid:before,.ion-hammer:before,.ion-happy:before,.ion-happy-outline:before,.ion-headphone:before,.ion-heart:before,.ion-heart-broken:before,.ion-help:before,.ion-help-buoy:before,.ion-help-circled:before,.ion-home:before,.ion-icecream:before,.ion-image:before,.ion-images:before,.ion-information:before,.ion-information-circled:before,.ion-ionic:before,.ion-ios-alarm:before,.ion-ios-alarm-outline:before,.ion-ios-albums:before,.ion-ios-albums-outline:before,.ion-ios-americanfootball:before,.ion-ios-americanfootball-outline:before,.ion-ios-analytics:before,.ion-ios-analytics-outline:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-left:before,.ion-ios-arrow-right:before,.ion-ios-arrow-thin-down:before,.ion-ios-arrow-thin-left:before,.ion-ios-arrow-thin-right:before,.ion-ios-arrow-thin-up:before,.ion-ios-arrow-up:before,.ion-ios-at:before,.ion-ios-at-outline:before,.ion-ios-barcode:before,.ion-ios-barcode-outline:before,.ion-ios-baseball:before,.ion-ios-baseball-outline:before,.ion-ios-basketball:before,.ion-ios-basketball-outline:before,.ion-ios-bell:before,.ion-ios-bell-outline:before,.ion-ios-body:before,.ion-ios-body-outline:before,.ion-ios-bolt:before,.ion-ios-bolt-outline:before,.ion-ios-book:before,.ion-ios-book-outline:before,.ion-ios-bookmarks:before,.ion-ios-bookmarks-outline:before,.ion-ios-box:before,.ion-ios-box-outline:before,.ion-ios-briefcase:before,.ion-ios-briefcase-outline:before,.ion-ios-browsers:before,.ion-ios-browsers-outline:before,.ion-ios-calculator:before,.ion-ios-calculator-outline:before,.ion-ios-calendar:before,.ion-ios-calendar-outline:before,.ion-ios-camera:before,.ion-ios-camera-outline:before,.ion-ios-cart:before,.ion-ios-cart-outline:before,.ion-ios-chatboxes:before,.ion-ios-chatboxes-outline:before,.ion-ios-chatbubble:before,.ion-ios-chatbubble-outline:before,.ion-ios-checkmark:before,.ion-ios-checkmark-empty:before,.ion-ios-checkmark-outline:before,.ion-ios-circle-filled:before,.ion-ios-circle-outline:before,.ion-ios-clock:before,.ion-ios-clock-outline:before,.ion-ios-close:before,.ion-ios-close-empty:before,.ion-ios-close-outline:before,.ion-ios-cloud:before,.ion-ios-cloud-download:before,.ion-ios-cloud-download-outline:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloud-upload-outline:before,.ion-ios-cloudy:before,.ion-ios-cloudy-night:before,.ion-ios-cloudy-night-outline:before,.ion-ios-cloudy-outline:before,.ion-ios-cog:before,.ion-ios-cog-outline:before,.ion-ios-color-filter:before,.ion-ios-color-filter-outline:before,.ion-ios-color-wand:before,.ion-ios-color-wand-outline:before,.ion-ios-compose:before,.ion-ios-compose-outline:before,.ion-ios-contact:before,.ion-ios-contact-outline:before,.ion-ios-copy:before,.ion-ios-copy-outline:before,.ion-ios-crop:before,.ion-ios-crop-strong:before,.ion-ios-download:before,.ion-ios-download-outline:before,.ion-ios-drag:before,.ion-ios-email:before,.ion-ios-email-outline:before,.ion-ios-eye:before,.ion-ios-eye-outline:before,.ion-ios-fastforward:before,.ion-ios-fastforward-outline:before,.ion-ios-filing:before,.ion-ios-filing-outline:before,.ion-ios-film:before,.ion-ios-film-outline:before,.ion-ios-flag:before,.ion-ios-flag-outline:before,.ion-ios-flame:before,.ion-ios-flame-outline:before,.ion-ios-flask:before,.ion-ios-flask-outline:before,.ion-ios-flower:before,.ion-ios-flower-outline:before,.ion-ios-folder:before,.ion-ios-folder-outline:before,.ion-ios-football:before,.ion-ios-football-outline:before,.ion-ios-game-controller-a:before,.ion-ios-game-controller-a-outline:before,.ion-ios-game-controller-b:before,.ion-ios-game-controller-b-outline:before,.ion-ios-gear:before,.ion-ios-gear-outline:before,.ion-ios-glasses:before,.ion-ios-glasses-outline:before,.ion-ios-grid-view:before,.ion-ios-grid-view-outline:before,.ion-ios-heart:before,.ion-ios-heart-outline:before,.ion-ios-help:before,.ion-ios-help-empty:before,.ion-ios-help-outline:before,.ion-ios-home:before,.ion-ios-home-outline:before,.ion-ios-infinite:before,.ion-ios-infinite-outline:before,.ion-ios-information:before,.ion-ios-information-empty:before,.ion-ios-information-outline:before,.ion-ios-ionic-outline:before,.ion-ios-keypad:before,.ion-ios-keypad-outline:before,.ion-ios-lightbulb:before,.ion-ios-lightbulb-outline:before,.ion-ios-list:before,.ion-ios-list-outline:before,.ion-ios-location:before,.ion-ios-location-outline:before,.ion-ios-locked:before,.ion-ios-locked-outline:before,.ion-ios-loop:before,.ion-ios-loop-strong:before,.ion-ios-medical:before,.ion-ios-medical-outline:before,.ion-ios-medkit:before,.ion-ios-medkit-outline:before,.ion-ios-mic:before,.ion-ios-mic-off:before,.ion-ios-mic-outline:before,.ion-ios-minus:before,.ion-ios-minus-empty:before,.ion-ios-minus-outline:before,.ion-ios-monitor:before,.ion-ios-monitor-outline:before,.ion-ios-moon:before,.ion-ios-moon-outline:before,.ion-ios-more:before,.ion-ios-more-outline:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate:before,.ion-ios-navigate-outline:before,.ion-ios-nutrition:before,.ion-ios-nutrition-outline:before,.ion-ios-paper:before,.ion-ios-paper-outline:before,.ion-ios-paperplane:before,.ion-ios-paperplane-outline:before,.ion-ios-partlysunny:before,.ion-ios-partlysunny-outline:before,.ion-ios-pause:before,.ion-ios-pause-outline:before,.ion-ios-paw:before,.ion-ios-paw-outline:before,.ion-ios-people:before,.ion-ios-people-outline:before,.ion-ios-person:before,.ion-ios-person-outline:before,.ion-ios-personadd:before,.ion-ios-personadd-outline:before,.ion-ios-photos:before,.ion-ios-photos-outline:before,.ion-ios-pie:before,.ion-ios-pie-outline:before,.ion-ios-pint:before,.ion-ios-pint-outline:before,.ion-ios-play:before,.ion-ios-play-outline:before,.ion-ios-plus:before,.ion-ios-plus-empty:before,.ion-ios-plus-outline:before,.ion-ios-pricetag:before,.ion-ios-pricetag-outline:before,.ion-ios-pricetags:before,.ion-ios-pricetags-outline:before,.ion-ios-printer:before,.ion-ios-printer-outline:before,.ion-ios-pulse:before,.ion-ios-pulse-strong:before,.ion-ios-rainy:before,.ion-ios-rainy-outline:before,.ion-ios-recording:before,.ion-ios-recording-outline:before,.ion-ios-redo:before,.ion-ios-redo-outline:before,.ion-ios-refresh:before,.ion-ios-refresh-empty:before,.ion-ios-refresh-outline:before,.ion-ios-reload:before,.ion-ios-reverse-camera:before,.ion-ios-reverse-camera-outline:before,.ion-ios-rewind:before,.ion-ios-rewind-outline:before,.ion-ios-rose:before,.ion-ios-rose-outline:before,.ion-ios-search:before,.ion-ios-search-strong:before,.ion-ios-settings:before,.ion-ios-settings-strong:before,.ion-ios-shuffle:before,.ion-ios-shuffle-strong:before,.ion-ios-skipbackward:before,.ion-ios-skipbackward-outline:before,.ion-ios-skipforward:before,.ion-ios-skipforward-outline:before,.ion-ios-snowy:before,.ion-ios-speedometer:before,.ion-ios-speedometer-outline:before,.ion-ios-star:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-stopwatch:before,.ion-ios-stopwatch-outline:before,.ion-ios-sunny:before,.ion-ios-sunny-outline:before,.ion-ios-telephone:before,.ion-ios-telephone-outline:before,.ion-ios-tennisball:before,.ion-ios-tennisball-outline:before,.ion-ios-thunderstorm:before,.ion-ios-thunderstorm-outline:before,.ion-ios-time:before,.ion-ios-time-outline:before,.ion-ios-timer:before,.ion-ios-timer-outline:before,.ion-ios-toggle:before,.ion-ios-toggle-outline:before,.ion-ios-trash:before,.ion-ios-trash-outline:before,.ion-ios-undo:before,.ion-ios-undo-outline:before,.ion-ios-unlocked:before,.ion-ios-unlocked-outline:before,.ion-ios-upload:before,.ion-ios-upload-outline:before,.ion-ios-videocam:before,.ion-ios-videocam-outline:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-wineglass:before,.ion-ios-wineglass-outline:before,.ion-ios-world:before,.ion-ios-world-outline:before,.ion-ipad:before,.ion-iphone:before,.ion-ipod:before,.ion-jet:before,.ion-key:before,.ion-knife:before,.ion-laptop:before,.ion-leaf:before,.ion-levels:before,.ion-lightbulb:before,.ion-link:before,.ion-load-a:before,.ion-load-b:before,.ion-load-c:before,.ion-load-d:before,.ion-location:before,.ion-lock-combination:before,.ion-locked:before,.ion-log-in:before,.ion-log-out:before,.ion-loop:before,.ion-magnet:before,.ion-male:before,.ion-man:before,.ion-map:before,.ion-medkit:before,.ion-merge:before,.ion-mic-a:before,.ion-mic-b:before,.ion-mic-c:before,.ion-minus:before,.ion-minus-circled:before,.ion-minus-round:before,.ion-model-s:before,.ion-monitor:before,.ion-more:before,.ion-mouse:before,.ion-music-note:before,.ion-navicon:before,.ion-navicon-round:before,.ion-navigate:before,.ion-network:before,.ion-no-smoking:before,.ion-nuclear:before,.ion-outlet:before,.ion-paintbrush:before,.ion-paintbucket:before,.ion-paper-airplane:before,.ion-paperclip:before,.ion-pause:before,.ion-person:before,.ion-person-add:before,.ion-person-stalker:before,.ion-pie-graph:before,.ion-pin:before,.ion-pinpoint:before,.ion-pizza:before,.ion-plane:before,.ion-planet:before,.ion-play:before,.ion-playstation:before,.ion-plus:before,.ion-plus-circled:before,.ion-plus-round:before,.ion-podium:before,.ion-pound:before,.ion-power:before,.ion-pricetag:before,.ion-pricetags:before,.ion-printer:before,.ion-pull-request:before,.ion-qr-scanner:before,.ion-quote:before,.ion-radio-waves:before,.ion-record:before,.ion-refresh:before,.ion-reply:before,.ion-reply-all:before,.ion-ribbon-a:before,.ion-ribbon-b:before,.ion-sad:before,.ion-sad-outline:before,.ion-scissors:before,.ion-search:before,.ion-settings:before,.ion-share:before,.ion-shuffle:before,.ion-skip-backward:before,.ion-skip-forward:before,.ion-social-android:before,.ion-social-android-outline:before,.ion-social-angular:before,.ion-social-angular-outline:before,.ion-social-apple:before,.ion-social-apple-outline:before,.ion-social-bitcoin:before,.ion-social-bitcoin-outline:before,.ion-social-buffer:before,.ion-social-buffer-outline:before,.ion-social-chrome:before,.ion-social-chrome-outline:before,.ion-social-codepen:before,.ion-social-codepen-outline:before,.ion-social-css3:before,.ion-social-css3-outline:before,.ion-social-designernews:before,.ion-social-designernews-outline:before,.ion-social-dribbble:before,.ion-social-dribbble-outline:before,.ion-social-dropbox:before,.ion-social-dropbox-outline:before,.ion-social-euro:before,.ion-social-euro-outline:before,.ion-social-facebook:before,.ion-social-facebook-outline:before,.ion-social-foursquare:before,.ion-social-foursquare-outline:before,.ion-social-freebsd-devil:before,.ion-social-github:before,.ion-social-github-outline:before,.ion-social-google:before,.ion-social-google-outline:before,.ion-social-googleplus:before,.ion-social-googleplus-outline:before,.ion-social-hackernews:before,.ion-social-hackernews-outline:before,.ion-social-html5:before,.ion-social-html5-outline:before,.ion-social-instagram:before,.ion-social-instagram-outline:before,.ion-social-javascript:before,.ion-social-javascript-outline:before,.ion-social-linkedin:before,.ion-social-linkedin-outline:before,.ion-social-markdown:before,.ion-social-nodejs:before,.ion-social-octocat:before,.ion-social-pinterest:before,.ion-social-pinterest-outline:before,.ion-social-python:before,.ion-social-reddit:before,.ion-social-reddit-outline:before,.ion-social-rss:before,.ion-social-rss-outline:before,.ion-social-sass:before,.ion-social-skype:before,.ion-social-skype-outline:before,.ion-social-snapchat:before,.ion-social-snapchat-outline:before,.ion-social-tumblr:before,.ion-social-tumblr-outline:before,.ion-social-tux:before,.ion-social-twitch:before,.ion-social-twitch-outline:before,.ion-social-twitter:before,.ion-social-twitter-outline:before,.ion-social-usd:before,.ion-social-usd-outline:before,.ion-social-vimeo:before,.ion-social-vimeo-outline:before,.ion-social-whatsapp:before,.ion-social-whatsapp-outline:before,.ion-social-windows:before,.ion-social-windows-outline:before,.ion-social-wordpress:before,.ion-social-wordpress-outline:before,.ion-social-yahoo:before,.ion-social-yahoo-outline:before,.ion-social-yen:before,.ion-social-yen-outline:before,.ion-social-youtube:before,.ion-social-youtube-outline:before,.ion-soup-can:before,.ion-soup-can-outline:before,.ion-speakerphone:before,.ion-speedometer:before,.ion-spoon:before,.ion-star:before,.ion-stats-bars:before,.ion-steam:before,.ion-stop:before,.ion-thermometer:before,.ion-thumbsdown:before,.ion-thumbsup:before,.ion-toggle:before,.ion-toggle-filled:before,.ion-transgender:before,.ion-trash-a:before,.ion-trash-b:before,.ion-trophy:before,.ion-tshirt:before,.ion-tshirt-outline:before,.ion-umbrella:before,.ion-university:before,.ion-unlocked:before,.ion-upload:before,.ion-usb:before,.ion-videocamera:before,.ion-volume-high:before,.ion-volume-low:before,.ion-volume-medium:before,.ion-volume-mute:before,.ion-wand:before,.ion-waterdrop:before,.ion-wifi:before,.ion-wineglass:before,.ion-woman:before,.ion-wrench:before,.ion-xbox:before{display:inline-block;font-family:"Ionicons";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-alert:before{content:"\f101"}.ion-alert-circled:before{content:"\f100"}.ion-android-add:before{content:"\f2c7"}.ion-android-add-circle:before{content:"\f359"}.ion-android-alarm-clock:before{content:"\f35a"}.ion-android-alert:before{content:"\f35b"}.ion-android-apps:before{content:"\f35c"}.ion-android-archive:before{content:"\f2c9"}.ion-android-arrow-back:before{content:"\f2ca"}.ion-android-arrow-down:before{content:"\f35d"}.ion-android-arrow-dropdown:before{content:"\f35f"}.ion-android-arrow-dropdown-circle:before{content:"\f35e"}.ion-android-arrow-dropleft:before{content:"\f361"}.ion-android-arrow-dropleft-circle:before{content:"\f360"}.ion-android-arrow-dropright:before{content:"\f363"}.ion-android-arrow-dropright-circle:before{content:"\f362"}.ion-android-arrow-dropup:before{content:"\f365"}.ion-android-arrow-dropup-circle:before{content:"\f364"}.ion-android-arrow-forward:before{content:"\f30f"}.ion-android-arrow-up:before{content:"\f366"}.ion-android-attach:before{content:"\f367"}.ion-android-bar:before{content:"\f368"}.ion-android-bicycle:before{content:"\f369"}.ion-android-boat:before{content:"\f36a"}.ion-android-bookmark:before{content:"\f36b"}.ion-android-bulb:before{content:"\f36c"}.ion-android-bus:before{content:"\f36d"}.ion-android-calendar:before{content:"\f2d1"}.ion-android-call:before{content:"\f2d2"}.ion-android-camera:before{content:"\f2d3"}.ion-android-cancel:before{content:"\f36e"}.ion-android-car:before{content:"\f36f"}.ion-android-cart:before{content:"\f370"}.ion-android-chat:before{content:"\f2d4"}.ion-android-checkbox:before{content:"\f374"}.ion-android-checkbox-blank:before{content:"\f371"}.ion-android-checkbox-outline:before{content:"\f373"}.ion-android-checkbox-outline-blank:before{content:"\f372"}.ion-android-checkmark-circle:before{content:"\f375"}.ion-android-clipboard:before{content:"\f376"}.ion-android-close:before{content:"\f2d7"}.ion-android-cloud:before{content:"\f37a"}.ion-android-cloud-circle:before{content:"\f377"}.ion-android-cloud-done:before{content:"\f378"}.ion-android-cloud-outline:before{content:"\f379"}.ion-android-color-palette:before{content:"\f37b"}.ion-android-compass:before{content:"\f37c"}.ion-android-contact:before{content:"\f2d8"}.ion-android-contacts:before{content:"\f2d9"}.ion-android-contract:before{content:"\f37d"}.ion-android-create:before{content:"\f37e"}.ion-android-delete:before{content:"\f37f"}.ion-android-desktop:before{content:"\f380"}.ion-android-document:before{content:"\f381"}.ion-android-done:before{content:"\f383"}.ion-android-done-all:before{content:"\f382"}.ion-android-download:before{content:"\f2dd"}.ion-android-drafts:before{content:"\f384"}.ion-android-exit:before{content:"\f385"}.ion-android-expand:before{content:"\f386"}.ion-android-favorite:before{content:"\f388"}.ion-android-favorite-outline:before{content:"\f387"}.ion-android-film:before{content:"\f389"}.ion-android-folder:before{content:"\f2e0"}.ion-android-folder-open:before{content:"\f38a"}.ion-android-funnel:before{content:"\f38b"}.ion-android-globe:before{content:"\f38c"}.ion-android-hand:before{content:"\f2e3"}.ion-android-hangout:before{content:"\f38d"}.ion-android-happy:before{content:"\f38e"}.ion-android-home:before{content:"\f38f"}.ion-android-image:before{content:"\f2e4"}.ion-android-laptop:before{content:"\f390"}.ion-android-list:before{content:"\f391"}.ion-android-locate:before{content:"\f2e9"}.ion-android-lock:before{content:"\f392"}.ion-android-mail:before{content:"\f2eb"}.ion-android-map:before{content:"\f393"}.ion-android-menu:before{content:"\f394"}.ion-android-microphone:before{content:"\f2ec"}.ion-android-microphone-off:before{content:"\f395"}.ion-android-more-horizontal:before{content:"\f396"}.ion-android-more-vertical:before{content:"\f397"}.ion-android-navigate:before{content:"\f398"}.ion-android-notifications:before{content:"\f39b"}.ion-android-notifications-none:before{content:"\f399"}.ion-android-notifications-off:before{content:"\f39a"}.ion-android-open:before{content:"\f39c"}.ion-android-options:before{content:"\f39d"}.ion-android-people:before{content:"\f39e"}.ion-android-person:before{content:"\f3a0"}.ion-android-person-add:before{content:"\f39f"}.ion-android-phone-landscape:before{content:"\f3a1"}.ion-android-phone-portrait:before{content:"\f3a2"}.ion-android-pin:before{content:"\f3a3"}.ion-android-plane:before{content:"\f3a4"}.ion-android-playstore:before{content:"\f2f0"}.ion-android-print:before{content:"\f3a5"}.ion-android-radio-button-off:before{content:"\f3a6"}.ion-android-radio-button-on:before{content:"\f3a7"}.ion-android-refresh:before{content:"\f3a8"}.ion-android-remove:before{content:"\f2f4"}.ion-android-remove-circle:before{content:"\f3a9"}.ion-android-restaurant:before{content:"\f3aa"}.ion-android-sad:before{content:"\f3ab"}.ion-android-search:before{content:"\f2f5"}.ion-android-send:before{content:"\f2f6"}.ion-android-settings:before{content:"\f2f7"}.ion-android-share:before{content:"\f2f8"}.ion-android-share-alt:before{content:"\f3ac"}.ion-android-star:before{content:"\f2fc"}.ion-android-star-half:before{content:"\f3ad"}.ion-android-star-outline:before{content:"\f3ae"}.ion-android-stopwatch:before{content:"\f2fd"}.ion-android-subway:before{content:"\f3af"}.ion-android-sunny:before{content:"\f3b0"}.ion-android-sync:before{content:"\f3b1"}.ion-android-textsms:before{content:"\f3b2"}.ion-android-time:before{content:"\f3b3"}.ion-android-train:before{content:"\f3b4"}.ion-android-unlock:before{content:"\f3b5"}.ion-android-upload:before{content:"\f3b6"}.ion-android-volume-down:before{content:"\f3b7"}.ion-android-volume-mute:before{content:"\f3b8"}.ion-android-volume-off:before{content:"\f3b9"}.ion-android-volume-up:before{content:"\f3ba"}.ion-android-walk:before{content:"\f3bb"}.ion-android-warning:before{content:"\f3bc"}.ion-android-watch:before{content:"\f3bd"}.ion-android-wifi:before{content:"\f305"}.ion-aperture:before{content:"\f313"}.ion-archive:before{content:"\f102"}.ion-arrow-down-a:before{content:"\f103"}.ion-arrow-down-b:before{content:"\f104"}.ion-arrow-down-c:before{content:"\f105"}.ion-arrow-expand:before{content:"\f25e"}.ion-arrow-graph-down-left:before{content:"\f25f"}.ion-arrow-graph-down-right:before{content:"\f260"}.ion-arrow-graph-up-left:before{content:"\f261"}.ion-arrow-graph-up-right:before{content:"\f262"}.ion-arrow-left-a:before{content:"\f106"}.ion-arrow-left-b:before{content:"\f107"}.ion-arrow-left-c:before{content:"\f108"}.ion-arrow-move:before{content:"\f263"}.ion-arrow-resize:before{content:"\f264"}.ion-arrow-return-left:before{content:"\f265"}.ion-arrow-return-right:before{content:"\f266"}.ion-arrow-right-a:before{content:"\f109"}.ion-arrow-right-b:before{content:"\f10a"}.ion-arrow-right-c:before{content:"\f10b"}.ion-arrow-shrink:before{content:"\f267"}.ion-arrow-swap:before{content:"\f268"}.ion-arrow-up-a:before{content:"\f10c"}.ion-arrow-up-b:before{content:"\f10d"}.ion-arrow-up-c:before{content:"\f10e"}.ion-asterisk:before{content:"\f314"}.ion-at:before{content:"\f10f"}.ion-backspace:before{content:"\f3bf"}.ion-backspace-outline:before{content:"\f3be"}.ion-bag:before{content:"\f110"}.ion-battery-charging:before{content:"\f111"}.ion-battery-empty:before{content:"\f112"}.ion-battery-full:before{content:"\f113"}.ion-battery-half:before{content:"\f114"}.ion-battery-low:before{content:"\f115"}.ion-beaker:before{content:"\f269"}.ion-beer:before{content:"\f26a"}.ion-bluetooth:before{content:"\f116"}.ion-bonfire:before{content:"\f315"}.ion-bookmark:before{content:"\f26b"}.ion-bowtie:before{content:"\f3c0"}.ion-briefcase:before{content:"\f26c"}.ion-bug:before{content:"\f2be"}.ion-calculator:before{content:"\f26d"}.ion-calendar:before{content:"\f117"}.ion-camera:before{content:"\f118"}.ion-card:before{content:"\f119"}.ion-cash:before{content:"\f316"}.ion-chatbox:before{content:"\f11b"}.ion-chatbox-working:before{content:"\f11a"}.ion-chatboxes:before{content:"\f11c"}.ion-chatbubble:before{content:"\f11e"}.ion-chatbubble-working:before{content:"\f11d"}.ion-chatbubbles:before{content:"\f11f"}.ion-checkmark:before{content:"\f122"}.ion-checkmark-circled:before{content:"\f120"}.ion-checkmark-round:before{content:"\f121"}.ion-chevron-down:before{content:"\f123"}.ion-chevron-left:before{content:"\f124"}.ion-chevron-right:before{content:"\f125"}.ion-chevron-up:before{content:"\f126"}.ion-clipboard:before{content:"\f127"}.ion-clock:before{content:"\f26e"}.ion-close:before{content:"\f12a"}.ion-close-circled:before{content:"\f128"}.ion-close-round:before{content:"\f129"}.ion-closed-captioning:before{content:"\f317"}.ion-cloud:before{content:"\f12b"}.ion-code:before{content:"\f271"}.ion-code-download:before{content:"\f26f"}.ion-code-working:before{content:"\f270"}.ion-coffee:before{content:"\f272"}.ion-compass:before{content:"\f273"}.ion-compose:before{content:"\f12c"}.ion-connection-bars:before{content:"\f274"}.ion-contrast:before{content:"\f275"}.ion-crop:before{content:"\f3c1"}.ion-cube:before{content:"\f318"}.ion-disc:before{content:"\f12d"}.ion-document:before{content:"\f12f"}.ion-document-text:before{content:"\f12e"}.ion-drag:before{content:"\f130"}.ion-earth:before{content:"\f276"}.ion-easel:before{content:"\f3c2"}.ion-edit:before{content:"\f2bf"}.ion-egg:before{content:"\f277"}.ion-eject:before{content:"\f131"}.ion-email:before{content:"\f132"}.ion-email-unread:before{content:"\f3c3"}.ion-erlenmeyer-flask:before{content:"\f3c5"}.ion-erlenmeyer-flask-bubbles:before{content:"\f3c4"}.ion-eye:before{content:"\f133"}.ion-eye-disabled:before{content:"\f306"}.ion-female:before{content:"\f278"}.ion-filing:before{content:"\f134"}.ion-film-marker:before{content:"\f135"}.ion-fireball:before{content:"\f319"}.ion-flag:before{content:"\f279"}.ion-flame:before{content:"\f31a"}.ion-flash:before{content:"\f137"}.ion-flash-off:before{content:"\f136"}.ion-folder:before{content:"\f139"}.ion-fork:before{content:"\f27a"}.ion-fork-repo:before{content:"\f2c0"}.ion-forward:before{content:"\f13a"}.ion-funnel:before{content:"\f31b"}.ion-gear-a:before{content:"\f13d"}.ion-gear-b:before{content:"\f13e"}.ion-grid:before{content:"\f13f"}.ion-hammer:before{content:"\f27b"}.ion-happy:before{content:"\f31c"}.ion-happy-outline:before{content:"\f3c6"}.ion-headphone:before{content:"\f140"}.ion-heart:before{content:"\f141"}.ion-heart-broken:before{content:"\f31d"}.ion-help:before{content:"\f143"}.ion-help-buoy:before{content:"\f27c"}.ion-help-circled:before{content:"\f142"}.ion-home:before{content:"\f144"}.ion-icecream:before{content:"\f27d"}.ion-image:before{content:"\f147"}.ion-images:before{content:"\f148"}.ion-information:before{content:"\f14a"}.ion-information-circled:before{content:"\f149"}.ion-ionic:before{content:"\f14b"}.ion-ios-alarm:before{content:"\f3c8"}.ion-ios-alarm-outline:before{content:"\f3c7"}.ion-ios-albums:before{content:"\f3ca"}.ion-ios-albums-outline:before{content:"\f3c9"}.ion-ios-americanfootball:before{content:"\f3cc"}.ion-ios-americanfootball-outline:before{content:"\f3cb"}.ion-ios-analytics:before{content:"\f3ce"}.ion-ios-analytics-outline:before{content:"\f3cd"}.ion-ios-arrow-back:before{content:"\f3cf"}.ion-ios-arrow-down:before{content:"\f3d0"}.ion-ios-arrow-forward:before{content:"\f3d1"}.ion-ios-arrow-left:before{content:"\f3d2"}.ion-ios-arrow-right:before{content:"\f3d3"}.ion-ios-arrow-thin-down:before{content:"\f3d4"}.ion-ios-arrow-thin-left:before{content:"\f3d5"}.ion-ios-arrow-thin-right:before{content:"\f3d6"}.ion-ios-arrow-thin-up:before{content:"\f3d7"}.ion-ios-arrow-up:before{content:"\f3d8"}.ion-ios-at:before{content:"\f3da"}.ion-ios-at-outline:before{content:"\f3d9"}.ion-ios-barcode:before{content:"\f3dc"}.ion-ios-barcode-outline:before{content:"\f3db"}.ion-ios-baseball:before{content:"\f3de"}.ion-ios-baseball-outline:before{content:"\f3dd"}.ion-ios-basketball:before{content:"\f3e0"}.ion-ios-basketball-outline:before{content:"\f3df"}.ion-ios-bell:before{content:"\f3e2"}.ion-ios-bell-outline:before{content:"\f3e1"}.ion-ios-body:before{content:"\f3e4"}.ion-ios-body-outline:before{content:"\f3e3"}.ion-ios-bolt:before{content:"\f3e6"}.ion-ios-bolt-outline:before{content:"\f3e5"}.ion-ios-book:before{content:"\f3e8"}.ion-ios-book-outline:before{content:"\f3e7"}.ion-ios-bookmarks:before{content:"\f3ea"}.ion-ios-bookmarks-outline:before{content:"\f3e9"}.ion-ios-box:before{content:"\f3ec"}.ion-ios-box-outline:before{content:"\f3eb"}.ion-ios-briefcase:before{content:"\f3ee"}.ion-ios-briefcase-outline:before{content:"\f3ed"}.ion-ios-browsers:before{content:"\f3f0"}.ion-ios-browsers-outline:before{content:"\f3ef"}.ion-ios-calculator:before{content:"\f3f2"}.ion-ios-calculator-outline:before{content:"\f3f1"}.ion-ios-calendar:before{content:"\f3f4"}.ion-ios-calendar-outline:before{content:"\f3f3"}.ion-ios-camera:before{content:"\f3f6"}.ion-ios-camera-outline:before{content:"\f3f5"}.ion-ios-cart:before{content:"\f3f8"}.ion-ios-cart-outline:before{content:"\f3f7"}.ion-ios-chatboxes:before{content:"\f3fa"}.ion-ios-chatboxes-outline:before{content:"\f3f9"}.ion-ios-chatbubble:before{content:"\f3fc"}.ion-ios-chatbubble-outline:before{content:"\f3fb"}.ion-ios-checkmark:before{content:"\f3ff"}.ion-ios-checkmark-empty:before{content:"\f3fd"}.ion-ios-checkmark-outline:before{content:"\f3fe"}.ion-ios-circle-filled:before{content:"\f400"}.ion-ios-circle-outline:before{content:"\f401"}.ion-ios-clock:before{content:"\f403"}.ion-ios-clock-outline:before{content:"\f402"}.ion-ios-close:before{content:"\f406"}.ion-ios-close-empty:before{content:"\f404"}.ion-ios-close-outline:before{content:"\f405"}.ion-ios-cloud:before{content:"\f40c"}.ion-ios-cloud-download:before{content:"\f408"}.ion-ios-cloud-download-outline:before{content:"\f407"}.ion-ios-cloud-outline:before{content:"\f409"}.ion-ios-cloud-upload:before{content:"\f40b"}.ion-ios-cloud-upload-outline:before{content:"\f40a"}.ion-ios-cloudy:before{content:"\f410"}.ion-ios-cloudy-night:before{content:"\f40e"}.ion-ios-cloudy-night-outline:before{content:"\f40d"}.ion-ios-cloudy-outline:before{content:"\f40f"}.ion-ios-cog:before{content:"\f412"}.ion-ios-cog-outline:before{content:"\f411"}.ion-ios-color-filter:before{content:"\f414"}.ion-ios-color-filter-outline:before{content:"\f413"}.ion-ios-color-wand:before{content:"\f416"}.ion-ios-color-wand-outline:before{content:"\f415"}.ion-ios-compose:before{content:"\f418"}.ion-ios-compose-outline:before{content:"\f417"}.ion-ios-contact:before{content:"\f41a"}.ion-ios-contact-outline:before{content:"\f419"}.ion-ios-copy:before{content:"\f41c"}.ion-ios-copy-outline:before{content:"\f41b"}.ion-ios-crop:before{content:"\f41e"}.ion-ios-crop-strong:before{content:"\f41d"}.ion-ios-download:before{content:"\f420"}.ion-ios-download-outline:before{content:"\f41f"}.ion-ios-drag:before{content:"\f421"}.ion-ios-email:before{content:"\f423"}.ion-ios-email-outline:before{content:"\f422"}.ion-ios-eye:before{content:"\f425"}.ion-ios-eye-outline:before{content:"\f424"}.ion-ios-fastforward:before{content:"\f427"}.ion-ios-fastforward-outline:before{content:"\f426"}.ion-ios-filing:before{content:"\f429"}.ion-ios-filing-outline:before{content:"\f428"}.ion-ios-film:before{content:"\f42b"}.ion-ios-film-outline:before{content:"\f42a"}.ion-ios-flag:before{content:"\f42d"}.ion-ios-flag-outline:before{content:"\f42c"}.ion-ios-flame:before{content:"\f42f"}.ion-ios-flame-outline:before{content:"\f42e"}.ion-ios-flask:before{content:"\f431"}.ion-ios-flask-outline:before{content:"\f430"}.ion-ios-flower:before{content:"\f433"}.ion-ios-flower-outline:before{content:"\f432"}.ion-ios-folder:before{content:"\f435"}.ion-ios-folder-outline:before{content:"\f434"}.ion-ios-football:before{content:"\f437"}.ion-ios-football-outline:before{content:"\f436"}.ion-ios-game-controller-a:before{content:"\f439"}.ion-ios-game-controller-a-outline:before{content:"\f438"}.ion-ios-game-controller-b:before{content:"\f43b"}.ion-ios-game-controller-b-outline:before{content:"\f43a"}.ion-ios-gear:before{content:"\f43d"}.ion-ios-gear-outline:before{content:"\f43c"}.ion-ios-glasses:before{content:"\f43f"}.ion-ios-glasses-outline:before{content:"\f43e"}.ion-ios-grid-view:before{content:"\f441"}.ion-ios-grid-view-outline:before{content:"\f440"}.ion-ios-heart:before{content:"\f443"}.ion-ios-heart-outline:before{content:"\f442"}.ion-ios-help:before{content:"\f446"}.ion-ios-help-empty:before{content:"\f444"}.ion-ios-help-outline:before{content:"\f445"}.ion-ios-home:before{content:"\f448"}.ion-ios-home-outline:before{content:"\f447"}.ion-ios-infinite:before{content:"\f44a"}.ion-ios-infinite-outline:before{content:"\f449"}.ion-ios-information:before{content:"\f44d"}.ion-ios-information-empty:before{content:"\f44b"}.ion-ios-information-outline:before{content:"\f44c"}.ion-ios-ionic-outline:before{content:"\f44e"}.ion-ios-keypad:before{content:"\f450"}.ion-ios-keypad-outline:before{content:"\f44f"}.ion-ios-lightbulb:before{content:"\f452"}.ion-ios-lightbulb-outline:before{content:"\f451"}.ion-ios-list:before{content:"\f454"}.ion-ios-list-outline:before{content:"\f453"}.ion-ios-location:before{content:"\f456"}.ion-ios-location-outline:before{content:"\f455"}.ion-ios-locked:before{content:"\f458"}.ion-ios-locked-outline:before{content:"\f457"}.ion-ios-loop:before{content:"\f45a"}.ion-ios-loop-strong:before{content:"\f459"}.ion-ios-medical:before{content:"\f45c"}.ion-ios-medical-outline:before{content:"\f45b"}.ion-ios-medkit:before{content:"\f45e"}.ion-ios-medkit-outline:before{content:"\f45d"}.ion-ios-mic:before{content:"\f461"}.ion-ios-mic-off:before{content:"\f45f"}.ion-ios-mic-outline:before{content:"\f460"}.ion-ios-minus:before{content:"\f464"}.ion-ios-minus-empty:before{content:"\f462"}.ion-ios-minus-outline:before{content:"\f463"}.ion-ios-monitor:before{content:"\f466"}.ion-ios-monitor-outline:before{content:"\f465"}.ion-ios-moon:before{content:"\f468"}.ion-ios-moon-outline:before{content:"\f467"}.ion-ios-more:before{content:"\f46a"}.ion-ios-more-outline:before{content:"\f469"}.ion-ios-musical-note:before{content:"\f46b"}.ion-ios-musical-notes:before{content:"\f46c"}.ion-ios-navigate:before{content:"\f46e"}.ion-ios-navigate-outline:before{content:"\f46d"}.ion-ios-nutrition:before{content:"\f470"}.ion-ios-nutrition-outline:before{content:"\f46f"}.ion-ios-paper:before{content:"\f472"}.ion-ios-paper-outline:before{content:"\f471"}.ion-ios-paperplane:before{content:"\f474"}.ion-ios-paperplane-outline:before{content:"\f473"}.ion-ios-partlysunny:before{content:"\f476"}.ion-ios-partlysunny-outline:before{content:"\f475"}.ion-ios-pause:before{content:"\f478"}.ion-ios-pause-outline:before{content:"\f477"}.ion-ios-paw:before{content:"\f47a"}.ion-ios-paw-outline:before{content:"\f479"}.ion-ios-people:before{content:"\f47c"}.ion-ios-people-outline:before{content:"\f47b"}.ion-ios-person:before{content:"\f47e"}.ion-ios-person-outline:before{content:"\f47d"}.ion-ios-personadd:before{content:"\f480"}.ion-ios-personadd-outline:before{content:"\f47f"}.ion-ios-photos:before{content:"\f482"}.ion-ios-photos-outline:before{content:"\f481"}.ion-ios-pie:before{content:"\f484"}.ion-ios-pie-outline:before{content:"\f483"}.ion-ios-pint:before{content:"\f486"}.ion-ios-pint-outline:before{content:"\f485"}.ion-ios-play:before{content:"\f488"}.ion-ios-play-outline:before{content:"\f487"}.ion-ios-plus:before{content:"\f48b"}.ion-ios-plus-empty:before{content:"\f489"}.ion-ios-plus-outline:before{content:"\f48a"}.ion-ios-pricetag:before{content:"\f48d"}.ion-ios-pricetag-outline:before{content:"\f48c"}.ion-ios-pricetags:before{content:"\f48f"}.ion-ios-pricetags-outline:before{content:"\f48e"}.ion-ios-printer:before{content:"\f491"}.ion-ios-printer-outline:before{content:"\f490"}.ion-ios-pulse:before{content:"\f493"}.ion-ios-pulse-strong:before{content:"\f492"}.ion-ios-rainy:before{content:"\f495"}.ion-ios-rainy-outline:before{content:"\f494"}.ion-ios-recording:before{content:"\f497"}.ion-ios-recording-outline:before{content:"\f496"}.ion-ios-redo:before{content:"\f499"}.ion-ios-redo-outline:before{content:"\f498"}.ion-ios-refresh:before{content:"\f49c"}.ion-ios-refresh-empty:before{content:"\f49a"}.ion-ios-refresh-outline:before{content:"\f49b"}.ion-ios-reload:before{content:"\f49d"}.ion-ios-reverse-camera:before{content:"\f49f"}.ion-ios-reverse-camera-outline:before{content:"\f49e"}.ion-ios-rewind:before{content:"\f4a1"}.ion-ios-rewind-outline:before{content:"\f4a0"}.ion-ios-rose:before{content:"\f4a3"}.ion-ios-rose-outline:before{content:"\f4a2"}.ion-ios-search:before{content:"\f4a5"}.ion-ios-search-strong:before{content:"\f4a4"}.ion-ios-settings:before{content:"\f4a7"}.ion-ios-settings-strong:before{content:"\f4a6"}.ion-ios-shuffle:before{content:"\f4a9"}.ion-ios-shuffle-strong:before{content:"\f4a8"}.ion-ios-skipbackward:before{content:"\f4ab"}.ion-ios-skipbackward-outline:before{content:"\f4aa"}.ion-ios-skipforward:before{content:"\f4ad"}.ion-ios-skipforward-outline:before{content:"\f4ac"}.ion-ios-snowy:before{content:"\f4ae"}.ion-ios-speedometer:before{content:"\f4b0"}.ion-ios-speedometer-outline:before{content:"\f4af"}.ion-ios-star:before{content:"\f4b3"}.ion-ios-star-half:before{content:"\f4b1"}.ion-ios-star-outline:before{content:"\f4b2"}.ion-ios-stopwatch:before{content:"\f4b5"}.ion-ios-stopwatch-outline:before{content:"\f4b4"}.ion-ios-sunny:before{content:"\f4b7"}.ion-ios-sunny-outline:before{content:"\f4b6"}.ion-ios-telephone:before{content:"\f4b9"}.ion-ios-telephone-outline:before{content:"\f4b8"}.ion-ios-tennisball:before{content:"\f4bb"}.ion-ios-tennisball-outline:before{content:"\f4ba"}.ion-ios-thunderstorm:before{content:"\f4bd"}.ion-ios-thunderstorm-outline:before{content:"\f4bc"}.ion-ios-time:before{content:"\f4bf"}.ion-ios-time-outline:before{content:"\f4be"}.ion-ios-timer:before{content:"\f4c1"}.ion-ios-timer-outline:before{content:"\f4c0"}.ion-ios-toggle:before{content:"\f4c3"}.ion-ios-toggle-outline:before{content:"\f4c2"}.ion-ios-trash:before{content:"\f4c5"}.ion-ios-trash-outline:before{content:"\f4c4"}.ion-ios-undo:before{content:"\f4c7"}.ion-ios-undo-outline:before{content:"\f4c6"}.ion-ios-unlocked:before{content:"\f4c9"}.ion-ios-unlocked-outline:before{content:"\f4c8"}.ion-ios-upload:before{content:"\f4cb"}.ion-ios-upload-outline:before{content:"\f4ca"}.ion-ios-videocam:before{content:"\f4cd"}.ion-ios-videocam-outline:before{content:"\f4cc"}.ion-ios-volume-high:before{content:"\f4ce"}.ion-ios-volume-low:before{content:"\f4cf"}.ion-ios-wineglass:before{content:"\f4d1"}.ion-ios-wineglass-outline:before{content:"\f4d0"}.ion-ios-world:before{content:"\f4d3"}.ion-ios-world-outline:before{content:"\f4d2"}.ion-ipad:before{content:"\f1f9"}.ion-iphone:before{content:"\f1fa"}.ion-ipod:before{content:"\f1fb"}.ion-jet:before{content:"\f295"}.ion-key:before{content:"\f296"}.ion-knife:before{content:"\f297"}.ion-laptop:before{content:"\f1fc"}.ion-leaf:before{content:"\f1fd"}.ion-levels:before{content:"\f298"}.ion-lightbulb:before{content:"\f299"}.ion-link:before{content:"\f1fe"}.ion-load-a:before{content:"\f29a"}.ion-load-b:before{content:"\f29b"}.ion-load-c:before{content:"\f29c"}.ion-load-d:before{content:"\f29d"}.ion-location:before{content:"\f1ff"}.ion-lock-combination:before{content:"\f4d4"}.ion-locked:before{content:"\f200"}.ion-log-in:before{content:"\f29e"}.ion-log-out:before{content:"\f29f"}.ion-loop:before{content:"\f201"}.ion-magnet:before{content:"\f2a0"}.ion-male:before{content:"\f2a1"}.ion-man:before{content:"\f202"}.ion-map:before{content:"\f203"}.ion-medkit:before{content:"\f2a2"}.ion-merge:before{content:"\f33f"}.ion-mic-a:before{content:"\f204"}.ion-mic-b:before{content:"\f205"}.ion-mic-c:before{content:"\f206"}.ion-minus:before{content:"\f209"}.ion-minus-circled:before{content:"\f207"}.ion-minus-round:before{content:"\f208"}.ion-model-s:before{content:"\f2c1"}.ion-monitor:before{content:"\f20a"}.ion-more:before{content:"\f20b"}.ion-mouse:before{content:"\f340"}.ion-music-note:before{content:"\f20c"}.ion-navicon:before{content:"\f20e"}.ion-navicon-round:before{content:"\f20d"}.ion-navigate:before{content:"\f2a3"}.ion-network:before{content:"\f341"}.ion-no-smoking:before{content:"\f2c2"}.ion-nuclear:before{content:"\f2a4"}.ion-outlet:before{content:"\f342"}.ion-paintbrush:before{content:"\f4d5"}.ion-paintbucket:before{content:"\f4d6"}.ion-paper-airplane:before{content:"\f2c3"}.ion-paperclip:before{content:"\f20f"}.ion-pause:before{content:"\f210"}.ion-person:before{content:"\f213"}.ion-person-add:before{content:"\f211"}.ion-person-stalker:before{content:"\f212"}.ion-pie-graph:before{content:"\f2a5"}.ion-pin:before{content:"\f2a6"}.ion-pinpoint:before{content:"\f2a7"}.ion-pizza:before{content:"\f2a8"}.ion-plane:before{content:"\f214"}.ion-planet:before{content:"\f343"}.ion-play:before{content:"\f215"}.ion-playstation:before{content:"\f30a"}.ion-plus:before{content:"\f218"}.ion-plus-circled:before{content:"\f216"}.ion-plus-round:before{content:"\f217"}.ion-podium:before{content:"\f344"}.ion-pound:before{content:"\f219"}.ion-power:before{content:"\f2a9"}.ion-pricetag:before{content:"\f2aa"}.ion-pricetags:before{content:"\f2ab"}.ion-printer:before{content:"\f21a"}.ion-pull-request:before{content:"\f345"}.ion-qr-scanner:before{content:"\f346"}.ion-quote:before{content:"\f347"}.ion-radio-waves:before{content:"\f2ac"}.ion-record:before{content:"\f21b"}.ion-refresh:before{content:"\f21c"}.ion-reply:before{content:"\f21e"}.ion-reply-all:before{content:"\f21d"}.ion-ribbon-a:before{content:"\f348"}.ion-ribbon-b:before{content:"\f349"}.ion-sad:before{content:"\f34a"}.ion-sad-outline:before{content:"\f4d7"}.ion-scissors:before{content:"\f34b"}.ion-search:before{content:"\f21f"}.ion-settings:before{content:"\f2ad"}.ion-share:before{content:"\f220"}.ion-shuffle:before{content:"\f221"}.ion-skip-backward:before{content:"\f222"}.ion-skip-forward:before{content:"\f223"}.ion-social-android:before{content:"\f225"}.ion-social-android-outline:before{content:"\f224"}.ion-social-angular:before{content:"\f4d9"}.ion-social-angular-outline:before{content:"\f4d8"}.ion-social-apple:before{content:"\f227"}.ion-social-apple-outline:before{content:"\f226"}.ion-social-bitcoin:before{content:"\f2af"}.ion-social-bitcoin-outline:before{content:"\f2ae"}.ion-social-buffer:before{content:"\f229"}.ion-social-buffer-outline:before{content:"\f228"}.ion-social-chrome:before{content:"\f4db"}.ion-social-chrome-outline:before{content:"\f4da"}.ion-social-codepen:before{content:"\f4dd"}.ion-social-codepen-outline:before{content:"\f4dc"}.ion-social-css3:before{content:"\f4df"}.ion-social-css3-outline:before{content:"\f4de"}.ion-social-designernews:before{content:"\f22b"}.ion-social-designernews-outline:before{content:"\f22a"}.ion-social-dribbble:before{content:"\f22d"}.ion-social-dribbble-outline:before{content:"\f22c"}.ion-social-dropbox:before{content:"\f22f"}.ion-social-dropbox-outline:before{content:"\f22e"}.ion-social-euro:before{content:"\f4e1"}.ion-social-euro-outline:before{content:"\f4e0"}.ion-social-facebook:before{content:"\f231"}.ion-social-facebook-outline:before{content:"\f230"}.ion-social-foursquare:before{content:"\f34d"}.ion-social-foursquare-outline:before{content:"\f34c"}.ion-social-freebsd-devil:before{content:"\f2c4"}.ion-social-github:before{content:"\f233"}.ion-social-github-outline:before{content:"\f232"}.ion-social-google:before{content:"\f34f"}.ion-social-google-outline:before{content:"\f34e"}.ion-social-googleplus:before{content:"\f235"}.ion-social-googleplus-outline:before{content:"\f234"}.ion-social-hackernews:before{content:"\f237"}.ion-social-hackernews-outline:before{content:"\f236"}.ion-social-html5:before{content:"\f4e3"}.ion-social-html5-outline:before{content:"\f4e2"}.ion-social-instagram:before{content:"\f351"}.ion-social-instagram-outline:before{content:"\f350"}.ion-social-javascript:before{content:"\f4e5"}.ion-social-javascript-outline:before{content:"\f4e4"}.ion-social-linkedin:before{content:"\f239"}.ion-social-linkedin-outline:before{content:"\f238"}.ion-social-markdown:before{content:"\f4e6"}.ion-social-nodejs:before{content:"\f4e7"}.ion-social-octocat:before{content:"\f4e8"}.ion-social-pinterest:before{content:"\f2b1"}.ion-social-pinterest-outline:before{content:"\f2b0"}.ion-social-python:before{content:"\f4e9"}.ion-social-reddit:before{content:"\f23b"}.ion-social-reddit-outline:before{content:"\f23a"}.ion-social-rss:before{content:"\f23d"}.ion-social-rss-outline:before{content:"\f23c"}.ion-social-sass:before{content:"\f4ea"}.ion-social-skype:before{content:"\f23f"}.ion-social-skype-outline:before{content:"\f23e"}.ion-social-snapchat:before{content:"\f4ec"}.ion-social-snapchat-outline:before{content:"\f4eb"}.ion-social-tumblr:before{content:"\f241"}.ion-social-tumblr-outline:before{content:"\f240"}.ion-social-tux:before{content:"\f2c5"}.ion-social-twitch:before{content:"\f4ee"}.ion-social-twitch-outline:before{content:"\f4ed"}.ion-social-twitter:before{content:"\f243"}.ion-social-twitter-outline:before{content:"\f242"}.ion-social-usd:before{content:"\f353"}.ion-social-usd-outline:before{content:"\f352"}.ion-social-vimeo:before{content:"\f245"}.ion-social-vimeo-outline:before{content:"\f244"}.ion-social-whatsapp:before{content:"\f4f0"}.ion-social-whatsapp-outline:before{content:"\f4ef"}.ion-social-windows:before{content:"\f247"}.ion-social-windows-outline:before{content:"\f246"}.ion-social-wordpress:before{content:"\f249"}.ion-social-wordpress-outline:before{content:"\f248"}.ion-social-yahoo:before{content:"\f24b"}.ion-social-yahoo-outline:before{content:"\f24a"}.ion-social-yen:before{content:"\f4f2"}.ion-social-yen-outline:before{content:"\f4f1"}.ion-social-youtube:before{content:"\f24d"}.ion-social-youtube-outline:before{content:"\f24c"}.ion-soup-can:before{content:"\f4f4"}.ion-soup-can-outline:before{content:"\f4f3"}.ion-speakerphone:before{content:"\f2b2"}.ion-speedometer:before{content:"\f2b3"}.ion-spoon:before{content:"\f2b4"}.ion-star:before{content:"\f24e"}.ion-stats-bars:before{content:"\f2b5"}.ion-steam:before{content:"\f30b"}.ion-stop:before{content:"\f24f"}.ion-thermometer:before{content:"\f2b6"}.ion-thumbsdown:before{content:"\f250"}.ion-thumbsup:before{content:"\f251"}.ion-toggle:before{content:"\f355"}.ion-toggle-filled:before{content:"\f354"}.ion-transgender:before{content:"\f4f5"}.ion-trash-a:before{content:"\f252"}.ion-trash-b:before{content:"\f253"}.ion-trophy:before{content:"\f356"}.ion-tshirt:before{content:"\f4f7"}.ion-tshirt-outline:before{content:"\f4f6"}.ion-umbrella:before{content:"\f2b7"}.ion-university:before{content:"\f357"}.ion-unlocked:before{content:"\f254"}.ion-upload:before{content:"\f255"}.ion-usb:before{content:"\f2b8"}.ion-videocamera:before{content:"\f256"}.ion-volume-high:before{content:"\f257"}.ion-volume-low:before{content:"\f258"}.ion-volume-medium:before{content:"\f259"}.ion-volume-mute:before{content:"\f25a"}.ion-wand:before{content:"\f358"}.ion-waterdrop:before{content:"\f25b"}.ion-wifi:before{content:"\f25c"}.ion-wineglass:before{content:"\f2b9"}.ion-woman:before{content:"\f25d"}.ion-wrench:before{content:"\f2ba"}.ion-xbox:before{content:"\f30c"} diff --git a/_sass/vendor/isotope.css b/_sass/vendor/isotope.css new file mode 100755 index 0000000..30d0f2e --- /dev/null +++ b/_sass/vendor/isotope.css @@ -0,0 +1,62 @@ +/**** Isotope Filtering ****/ + +.isotope-item { + z-index: 2; +} + +.isotope-hidden.isotope-item { + pointer-events: none; + z-index: 1; +} + +/**** Isotope CSS3 transitions ****/ + +.isotope, +.isotope .isotope-item { + -webkit-transition-duration: 0.8s; + -moz-transition-duration: 0.8s; + -ms-transition-duration: 0.8s; + -o-transition-duration: 0.8s; + transition-duration: 0.8s; +} + +.isotope { + -webkit-transition-property: height, width; + -moz-transition-property: height, width; + -ms-transition-property: height, width; + -o-transition-property: height, width; + transition-property: height, width; +} + +.isotope .isotope-item { + -webkit-transition-property: -webkit-transform, opacity; + -moz-transition-property: -moz-transform, opacity; + -ms-transition-property: -ms-transform, opacity; + -o-transition-property: -o-transform, opacity; + transition-property: transform, opacity; +} + +/**** disabling Isotope CSS3 transitions ****/ + +.isotope.no-transition, +.isotope.no-transition .isotope-item, +.isotope .isotope-item.no-transition { + -webkit-transition-duration: 0s; + -moz-transition-duration: 0s; + -ms-transition-duration: 0s; + -o-transition-duration: 0s; + transition-duration: 0s; +} + +/* End: Recommended Isotope styles */ + + + +/* disable CSS transitions for containers with infinite scrolling*/ +.isotope.infinite-scrolling { + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} \ No newline at end of file diff --git a/_site/README.md b/_site/README.md new file mode 100644 index 0000000..0b0b6e4 --- /dev/null +++ b/_site/README.md @@ -0,0 +1,17 @@ +JSONAPI Suite Documentation +========== + +This is a static website generated by [jekyll](https://jekyllrb.com). To +contribute: + +```bash +$ git checkout gh-pages +$ bundle install --binstubs +$ bin/jekyll serve +``` + +To add a how-to, edit `_data/how-tos`, and add a corresponding markdown +file. See the existing how-tos for reference. + +Always make sure files are compiled before pushing. You can do this with +`jekyll serve` or `jekyll build` diff --git a/_site/assets/css/syntax.css b/_site/assets/css/syntax.css new file mode 100644 index 0000000..2774b76 --- /dev/null +++ b/_site/assets/css/syntax.css @@ -0,0 +1,60 @@ +.highlight { background: #ffffff; } +.highlight .c { color: #999988; font-style: italic } /* Comment */ +.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +.highlight .k { font-weight: bold } /* Keyword */ +.highlight .o { font-weight: bold } /* Operator */ +.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ +.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ +.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #aa0000 } /* Generic.Error */ +.highlight .gh { color: #999999 } /* Generic.Heading */ +.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ +.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #555555 } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #aaaaaa } /* Generic.Subheading */ +.highlight .gt { color: #aa0000 } /* Generic.Traceback */ +.highlight .kc { font-weight: bold } /* Keyword.Constant */ +.highlight .kd { font-weight: bold } /* Keyword.Declaration */ +.highlight .kp { font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #009999 } /* Literal.Number */ +.highlight .s { color: #d14 } /* Literal.String */ +.highlight .na { color: #008080 } /* Name.Attribute */ +.highlight .nb { color: #0086B3 } /* Name.Builtin */ +.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ +.highlight .no { color: #008080 } /* Name.Constant */ +.highlight .ni { color: #800080 } /* Name.Entity */ +.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ +.highlight .nn { color: #555555 } /* Name.Namespace */ +.highlight .nt { color: #000080 } /* Name.Tag */ +.highlight .nv { color: #008080 } /* Name.Variable */ +.highlight .ow { font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #009999 } /* Literal.Number.Float */ +.highlight .mh { color: #009999 } /* Literal.Number.Hex */ +.highlight .mi { color: #009999 } /* Literal.Number.Integer */ +.highlight .mo { color: #009999 } /* Literal.Number.Oct */ +.highlight .sb { color: #d14 } /* Literal.String.Backtick */ +.highlight .sc { color: #d14 } /* Literal.String.Char */ +.highlight .sd { color: #d14 } /* Literal.String.Doc */ +.highlight .s2 { color: #d14 } /* Literal.String.Double */ +.highlight .se { color: #d14 } /* Literal.String.Escape */ +.highlight .sh { color: #d14 } /* Literal.String.Heredoc */ +.highlight .si { color: #d14 } /* Literal.String.Interpol */ +.highlight .sx { color: #d14 } /* Literal.String.Other */ +.highlight .sr { color: #009926 } /* Literal.String.Regex */ +.highlight .s1 { color: #d14 } /* Literal.String.Single */ +.highlight .ss { color: #990073 } /* Literal.String.Symbol */ +.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #008080 } /* Name.Variable.Class */ +.highlight .vg { color: #008080 } /* Name.Variable.Global */ +.highlight .vi { color: #008080 } /* Name.Variable.Instance */ +.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ diff --git a/_site/assets/img/3_posts_json.png b/_site/assets/img/3_posts_json.png new file mode 100644 index 0000000..574d858 Binary files /dev/null and b/_site/assets/img/3_posts_json.png differ diff --git a/_site/assets/img/GitHub-Mark-32px.png b/_site/assets/img/GitHub-Mark-32px.png new file mode 100644 index 0000000..8b25551 Binary files /dev/null and b/_site/assets/img/GitHub-Mark-32px.png differ diff --git a/_site/assets/img/bg.png b/_site/assets/img/bg.png new file mode 100755 index 0000000..b0d07bd Binary files /dev/null and b/_site/assets/img/bg.png differ diff --git a/_site/assets/img/bg2.png b/_site/assets/img/bg2.png new file mode 100755 index 0000000..b03cd34 Binary files /dev/null and b/_site/assets/img/bg2.png differ diff --git a/_site/assets/img/bg3.png b/_site/assets/img/bg3.png new file mode 100755 index 0000000..5350254 Binary files /dev/null and b/_site/assets/img/bg3.png differ diff --git a/_site/assets/img/bg4.png b/_site/assets/img/bg4.png new file mode 100755 index 0000000..3cbbbc3 Binary files /dev/null and b/_site/assets/img/bg4.png differ diff --git a/_site/assets/img/bg_play_pause.png b/_site/assets/img/bg_play_pause.png new file mode 100755 index 0000000..aa3eb56 Binary files /dev/null and b/_site/assets/img/bg_play_pause.png differ diff --git a/_site/assets/img/circle-icons/full-color/anchor.png b/_site/assets/img/circle-icons/full-color/anchor.png new file mode 100755 index 0000000..f62df6f Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/anchor.png differ diff --git a/_site/assets/img/circle-icons/full-color/arrow-down.png b/_site/assets/img/circle-icons/full-color/arrow-down.png new file mode 100755 index 0000000..4abf2be Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/arrow-down.png differ diff --git a/_site/assets/img/circle-icons/full-color/arrow-up.png b/_site/assets/img/circle-icons/full-color/arrow-up.png new file mode 100755 index 0000000..7c803ed Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/arrow-up.png differ diff --git a/_site/assets/img/circle-icons/full-color/art.png b/_site/assets/img/circle-icons/full-color/art.png new file mode 100755 index 0000000..c2a4cd5 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/art.png differ diff --git a/_site/assets/img/circle-icons/full-color/barchart.png b/_site/assets/img/circle-icons/full-color/barchart.png new file mode 100755 index 0000000..e843fbc Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/barchart.png differ diff --git a/_site/assets/img/circle-icons/full-color/bike.png b/_site/assets/img/circle-icons/full-color/bike.png new file mode 100755 index 0000000..dace4a3 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/bike.png differ diff --git a/_site/assets/img/circle-icons/full-color/biker.png b/_site/assets/img/circle-icons/full-color/biker.png new file mode 100755 index 0000000..9b93e12 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/biker.png differ diff --git a/_site/assets/img/circle-icons/full-color/bikewheel.png b/_site/assets/img/circle-icons/full-color/bikewheel.png new file mode 100755 index 0000000..88f7ed0 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/bikewheel.png differ diff --git a/_site/assets/img/circle-icons/full-color/blimp.png b/_site/assets/img/circle-icons/full-color/blimp.png new file mode 100755 index 0000000..1f27905 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/blimp.png differ diff --git a/_site/assets/img/circle-icons/full-color/bomb.png b/_site/assets/img/circle-icons/full-color/bomb.png new file mode 100755 index 0000000..43eacb3 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/bomb.png differ diff --git a/_site/assets/img/circle-icons/full-color/booklet.png b/_site/assets/img/circle-icons/full-color/booklet.png new file mode 100755 index 0000000..b7d5db9 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/booklet.png differ diff --git a/_site/assets/img/circle-icons/full-color/bookshelf.png b/_site/assets/img/circle-icons/full-color/bookshelf.png new file mode 100755 index 0000000..9fa1bbe Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/bookshelf.png differ diff --git a/_site/assets/img/circle-icons/full-color/briefcase.png b/_site/assets/img/circle-icons/full-color/briefcase.png new file mode 100755 index 0000000..da4916f Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/briefcase.png differ diff --git a/_site/assets/img/circle-icons/full-color/browser.png b/_site/assets/img/circle-icons/full-color/browser.png new file mode 100755 index 0000000..4fde478 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/browser.png differ diff --git a/_site/assets/img/circle-icons/full-color/calculator.png b/_site/assets/img/circle-icons/full-color/calculator.png new file mode 100755 index 0000000..643013b Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/calculator.png differ diff --git a/_site/assets/img/circle-icons/full-color/calendar.png b/_site/assets/img/circle-icons/full-color/calendar.png new file mode 100755 index 0000000..bf1aa52 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/calendar.png differ diff --git a/_site/assets/img/circle-icons/full-color/camera.png b/_site/assets/img/circle-icons/full-color/camera.png new file mode 100755 index 0000000..c09ab78 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/camera.png differ diff --git a/_site/assets/img/circle-icons/full-color/car.png b/_site/assets/img/circle-icons/full-color/car.png new file mode 100755 index 0000000..c8f3376 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/car.png differ diff --git a/_site/assets/img/circle-icons/full-color/cart.png b/_site/assets/img/circle-icons/full-color/cart.png new file mode 100755 index 0000000..1cfd510 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/cart.png differ diff --git a/_site/assets/img/circle-icons/full-color/carwheel.png b/_site/assets/img/circle-icons/full-color/carwheel.png new file mode 100755 index 0000000..a91d5f2 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/carwheel.png differ diff --git a/_site/assets/img/circle-icons/full-color/caution.png b/_site/assets/img/circle-icons/full-color/caution.png new file mode 100755 index 0000000..f2ca795 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/caution.png differ diff --git a/_site/assets/img/circle-icons/full-color/chat.png b/_site/assets/img/circle-icons/full-color/chat.png new file mode 100755 index 0000000..cf2d194 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/chat.png differ diff --git a/_site/assets/img/circle-icons/full-color/check.png b/_site/assets/img/circle-icons/full-color/check.png new file mode 100755 index 0000000..641c02a Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/check.png differ diff --git a/_site/assets/img/circle-icons/full-color/clipboard.png b/_site/assets/img/circle-icons/full-color/clipboard.png new file mode 100755 index 0000000..6a0412c Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/clipboard.png differ diff --git a/_site/assets/img/circle-icons/full-color/clock.png b/_site/assets/img/circle-icons/full-color/clock.png new file mode 100755 index 0000000..f069bdb Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/clock.png differ diff --git a/_site/assets/img/circle-icons/full-color/cloud.png b/_site/assets/img/circle-icons/full-color/cloud.png new file mode 100755 index 0000000..688055d Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/cloud.png differ diff --git a/_site/assets/img/circle-icons/full-color/compass.png b/_site/assets/img/circle-icons/full-color/compass.png new file mode 100755 index 0000000..98d463f Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/compass.png differ diff --git a/_site/assets/img/circle-icons/full-color/compose.png b/_site/assets/img/circle-icons/full-color/compose.png new file mode 100755 index 0000000..e8faa03 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/compose.png differ diff --git a/_site/assets/img/circle-icons/full-color/computer.png b/_site/assets/img/circle-icons/full-color/computer.png new file mode 100755 index 0000000..f6c28e7 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/computer.png differ diff --git a/_site/assets/img/circle-icons/full-color/cone.png b/_site/assets/img/circle-icons/full-color/cone.png new file mode 100755 index 0000000..1f6812c Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/cone.png differ diff --git a/_site/assets/img/circle-icons/full-color/contacts.png b/_site/assets/img/circle-icons/full-color/contacts.png new file mode 100755 index 0000000..fc5306c Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/contacts.png differ diff --git a/_site/assets/img/circle-icons/full-color/creditcard.png b/_site/assets/img/circle-icons/full-color/creditcard.png new file mode 100755 index 0000000..45dc32b Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/creditcard.png differ diff --git a/_site/assets/img/circle-icons/full-color/crossroads.png b/_site/assets/img/circle-icons/full-color/crossroads.png new file mode 100755 index 0000000..64117b9 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/crossroads.png differ diff --git a/_site/assets/img/circle-icons/full-color/cruise.png b/_site/assets/img/circle-icons/full-color/cruise.png new file mode 100755 index 0000000..8bdab3d Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/cruise.png differ diff --git a/_site/assets/img/circle-icons/full-color/denied.png b/_site/assets/img/circle-icons/full-color/denied.png new file mode 100755 index 0000000..b357048 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/denied.png differ diff --git a/_site/assets/img/circle-icons/full-color/dev.png b/_site/assets/img/circle-icons/full-color/dev.png new file mode 100755 index 0000000..fd92d66 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/dev.png differ diff --git a/_site/assets/img/circle-icons/full-color/die.png b/_site/assets/img/circle-icons/full-color/die.png new file mode 100755 index 0000000..ad7fdaf Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/die.png differ diff --git a/_site/assets/img/circle-icons/full-color/document.png b/_site/assets/img/circle-icons/full-color/document.png new file mode 100755 index 0000000..9b120cf Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/document.png differ diff --git a/_site/assets/img/circle-icons/full-color/dolly.png b/_site/assets/img/circle-icons/full-color/dolly.png new file mode 100755 index 0000000..651a225 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/dolly.png differ diff --git a/_site/assets/img/circle-icons/full-color/door.png b/_site/assets/img/circle-icons/full-color/door.png new file mode 100755 index 0000000..59b5d5d Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/door.png differ diff --git a/_site/assets/img/circle-icons/full-color/download.png b/_site/assets/img/circle-icons/full-color/download.png new file mode 100755 index 0000000..f2f6686 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/download.png differ diff --git a/_site/assets/img/circle-icons/full-color/email.png b/_site/assets/img/circle-icons/full-color/email.png new file mode 100755 index 0000000..53a3601 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/email.png differ diff --git a/_site/assets/img/circle-icons/full-color/eye.png b/_site/assets/img/circle-icons/full-color/eye.png new file mode 100755 index 0000000..f2dd2aa Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/eye.png differ diff --git a/_site/assets/img/circle-icons/full-color/fashion.png b/_site/assets/img/circle-icons/full-color/fashion.png new file mode 100755 index 0000000..58e3680 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/fashion.png differ diff --git a/_site/assets/img/circle-icons/full-color/flag.png b/_site/assets/img/circle-icons/full-color/flag.png new file mode 100755 index 0000000..67a699b Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/flag.png differ diff --git a/_site/assets/img/circle-icons/full-color/flame.png b/_site/assets/img/circle-icons/full-color/flame.png new file mode 100755 index 0000000..f9b4488 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/flame.png differ diff --git a/_site/assets/img/circle-icons/full-color/folder.png b/_site/assets/img/circle-icons/full-color/folder.png new file mode 100755 index 0000000..860e866 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/folder.png differ diff --git a/_site/assets/img/circle-icons/full-color/gas.png b/_site/assets/img/circle-icons/full-color/gas.png new file mode 100755 index 0000000..7b9f04b Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/gas.png differ diff --git a/_site/assets/img/circle-icons/full-color/gear.png b/_site/assets/img/circle-icons/full-color/gear.png new file mode 100755 index 0000000..766883b Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/gear.png differ diff --git a/_site/assets/img/circle-icons/full-color/genius.png b/_site/assets/img/circle-icons/full-color/genius.png new file mode 100755 index 0000000..cfe0c75 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/genius.png differ diff --git a/_site/assets/img/circle-icons/full-color/global.png b/_site/assets/img/circle-icons/full-color/global.png new file mode 100755 index 0000000..25fe37a Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/global.png differ diff --git a/_site/assets/img/circle-icons/full-color/globe.png b/_site/assets/img/circle-icons/full-color/globe.png new file mode 100755 index 0000000..63416dc Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/globe.png differ diff --git a/_site/assets/img/circle-icons/full-color/gps.png b/_site/assets/img/circle-icons/full-color/gps.png new file mode 100755 index 0000000..f4d4a4e Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/gps.png differ diff --git a/_site/assets/img/circle-icons/full-color/hazard.png b/_site/assets/img/circle-icons/full-color/hazard.png new file mode 100755 index 0000000..13cbcf3 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/hazard.png differ diff --git a/_site/assets/img/circle-icons/full-color/heart.png b/_site/assets/img/circle-icons/full-color/heart.png new file mode 100755 index 0000000..fb62d2b Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/heart.png differ diff --git a/_site/assets/img/circle-icons/full-color/helicopter.png b/_site/assets/img/circle-icons/full-color/helicopter.png new file mode 100755 index 0000000..e1e1c83 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/helicopter.png differ diff --git a/_site/assets/img/circle-icons/full-color/hotair.png b/_site/assets/img/circle-icons/full-color/hotair.png new file mode 100755 index 0000000..7b61505 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/hotair.png differ diff --git a/_site/assets/img/circle-icons/full-color/hourglass.png b/_site/assets/img/circle-icons/full-color/hourglass.png new file mode 100755 index 0000000..f50c7c2 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/hourglass.png differ diff --git a/_site/assets/img/circle-icons/full-color/image.png b/_site/assets/img/circle-icons/full-color/image.png new file mode 100755 index 0000000..d96234b Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/image.png differ diff --git a/_site/assets/img/circle-icons/full-color/interstate.png b/_site/assets/img/circle-icons/full-color/interstate.png new file mode 100755 index 0000000..1bbc1af Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/interstate.png differ diff --git a/_site/assets/img/circle-icons/full-color/key.png b/_site/assets/img/circle-icons/full-color/key.png new file mode 100755 index 0000000..dafc1f5 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/key.png differ diff --git a/_site/assets/img/circle-icons/full-color/lightbulb.png b/_site/assets/img/circle-icons/full-color/lightbulb.png new file mode 100755 index 0000000..b7fdd80 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/lightbulb.png differ diff --git a/_site/assets/img/circle-icons/full-color/location.png b/_site/assets/img/circle-icons/full-color/location.png new file mode 100755 index 0000000..ecbba02 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/location.png differ diff --git a/_site/assets/img/circle-icons/full-color/locked.png b/_site/assets/img/circle-icons/full-color/locked.png new file mode 100755 index 0000000..bd06c21 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/locked.png differ diff --git a/_site/assets/img/circle-icons/full-color/magnifyingglass.png b/_site/assets/img/circle-icons/full-color/magnifyingglass.png new file mode 100755 index 0000000..c0f154a Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/magnifyingglass.png differ diff --git a/_site/assets/img/circle-icons/full-color/mail.png b/_site/assets/img/circle-icons/full-color/mail.png new file mode 100755 index 0000000..3d715bc Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/mail.png differ diff --git a/_site/assets/img/circle-icons/full-color/map.png b/_site/assets/img/circle-icons/full-color/map.png new file mode 100755 index 0000000..da9b202 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/map.png differ diff --git a/_site/assets/img/circle-icons/full-color/merge.png b/_site/assets/img/circle-icons/full-color/merge.png new file mode 100755 index 0000000..0c2c813 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/merge.png differ diff --git a/_site/assets/img/circle-icons/full-color/mic.png b/_site/assets/img/circle-icons/full-color/mic.png new file mode 100755 index 0000000..28a3cd1 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/mic.png differ diff --git a/_site/assets/img/circle-icons/full-color/money.png b/_site/assets/img/circle-icons/full-color/money.png new file mode 100755 index 0000000..ae873a8 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/money.png differ diff --git a/_site/assets/img/circle-icons/full-color/motorcycle.png b/_site/assets/img/circle-icons/full-color/motorcycle.png new file mode 100755 index 0000000..7f0db95 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/motorcycle.png differ diff --git a/_site/assets/img/circle-icons/full-color/music.png b/_site/assets/img/circle-icons/full-color/music.png new file mode 100755 index 0000000..6bee856 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/music.png differ diff --git a/_site/assets/img/circle-icons/full-color/news.png b/_site/assets/img/circle-icons/full-color/news.png new file mode 100755 index 0000000..58802ff Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/news.png differ diff --git a/_site/assets/img/circle-icons/full-color/parachute.png b/_site/assets/img/circle-icons/full-color/parachute.png new file mode 100755 index 0000000..a488bbf Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/parachute.png differ diff --git a/_site/assets/img/circle-icons/full-color/pencil.png b/_site/assets/img/circle-icons/full-color/pencil.png new file mode 100755 index 0000000..8b49189 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/pencil.png differ diff --git a/_site/assets/img/circle-icons/full-color/phone.png b/_site/assets/img/circle-icons/full-color/phone.png new file mode 100755 index 0000000..9d1ee39 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/phone.png differ diff --git a/_site/assets/img/circle-icons/full-color/pie-chart.png b/_site/assets/img/circle-icons/full-color/pie-chart.png new file mode 100755 index 0000000..068764d Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/pie-chart.png differ diff --git a/_site/assets/img/circle-icons/full-color/pin.png b/_site/assets/img/circle-icons/full-color/pin.png new file mode 100755 index 0000000..2e909f2 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/pin.png differ diff --git a/_site/assets/img/circle-icons/full-color/pin2.png b/_site/assets/img/circle-icons/full-color/pin2.png new file mode 100755 index 0000000..8e7a20a Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/pin2.png differ diff --git a/_site/assets/img/circle-icons/full-color/plane.png b/_site/assets/img/circle-icons/full-color/plane.png new file mode 100755 index 0000000..67842a4 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/plane.png differ diff --git a/_site/assets/img/circle-icons/full-color/present.png b/_site/assets/img/circle-icons/full-color/present.png new file mode 100755 index 0000000..785d1e9 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/present.png differ diff --git a/_site/assets/img/circle-icons/full-color/profle.png b/_site/assets/img/circle-icons/full-color/profle.png new file mode 100755 index 0000000..4d46ece Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/profle.png differ diff --git a/_site/assets/img/circle-icons/full-color/quote.png b/_site/assets/img/circle-icons/full-color/quote.png new file mode 100755 index 0000000..47c84bb Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/quote.png differ diff --git a/_site/assets/img/circle-icons/full-color/racingflags.png b/_site/assets/img/circle-icons/full-color/racingflags.png new file mode 100755 index 0000000..ff503c0 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/racingflags.png differ diff --git a/_site/assets/img/circle-icons/full-color/rainbow.png b/_site/assets/img/circle-icons/full-color/rainbow.png new file mode 100755 index 0000000..e4abd3a Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/rainbow.png differ diff --git a/_site/assets/img/circle-icons/full-color/recycle.png b/_site/assets/img/circle-icons/full-color/recycle.png new file mode 100755 index 0000000..6117333 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/recycle.png differ diff --git a/_site/assets/img/circle-icons/full-color/ribbon.png b/_site/assets/img/circle-icons/full-color/ribbon.png new file mode 100755 index 0000000..391db0e Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/ribbon.png differ diff --git a/_site/assets/img/circle-icons/full-color/roadblock.png b/_site/assets/img/circle-icons/full-color/roadblock.png new file mode 100755 index 0000000..e6d4217 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/roadblock.png differ diff --git a/_site/assets/img/circle-icons/full-color/rocket.png b/_site/assets/img/circle-icons/full-color/rocket.png new file mode 100755 index 0000000..3960f0f Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/rocket.png differ diff --git a/_site/assets/img/circle-icons/full-color/running.png b/_site/assets/img/circle-icons/full-color/running.png new file mode 100755 index 0000000..967eb4a Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/running.png differ diff --git a/_site/assets/img/circle-icons/full-color/sailboat.png b/_site/assets/img/circle-icons/full-color/sailboat.png new file mode 100755 index 0000000..50c317b Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/sailboat.png differ diff --git a/_site/assets/img/circle-icons/full-color/schooolbus.png b/_site/assets/img/circle-icons/full-color/schooolbus.png new file mode 100755 index 0000000..4f5ce72 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/schooolbus.png differ diff --git a/_site/assets/img/circle-icons/full-color/scissors.png b/_site/assets/img/circle-icons/full-color/scissors.png new file mode 100755 index 0000000..2f5c20c Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/scissors.png differ diff --git a/_site/assets/img/circle-icons/full-color/scooter.png b/_site/assets/img/circle-icons/full-color/scooter.png new file mode 100755 index 0000000..978c23b Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/scooter.png differ diff --git a/_site/assets/img/circle-icons/full-color/security.png b/_site/assets/img/circle-icons/full-color/security.png new file mode 100755 index 0000000..0f0e5b8 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/security.png differ diff --git a/_site/assets/img/circle-icons/full-color/settings.png b/_site/assets/img/circle-icons/full-color/settings.png new file mode 100755 index 0000000..aed6879 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/settings.png differ diff --git a/_site/assets/img/circle-icons/full-color/shipwheel.png b/_site/assets/img/circle-icons/full-color/shipwheel.png new file mode 100755 index 0000000..4c83ad7 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/shipwheel.png differ diff --git a/_site/assets/img/circle-icons/full-color/shoeprints.png b/_site/assets/img/circle-icons/full-color/shoeprints.png new file mode 100755 index 0000000..b3a70a3 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/shoeprints.png differ diff --git a/_site/assets/img/circle-icons/full-color/shop.png b/_site/assets/img/circle-icons/full-color/shop.png new file mode 100755 index 0000000..ee24d07 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/shop.png differ diff --git a/_site/assets/img/circle-icons/full-color/skateboard.png b/_site/assets/img/circle-icons/full-color/skateboard.png new file mode 100755 index 0000000..d75997e Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/skateboard.png differ diff --git a/_site/assets/img/circle-icons/full-color/smartphone.png b/_site/assets/img/circle-icons/full-color/smartphone.png new file mode 100755 index 0000000..33bfb00 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/smartphone.png differ diff --git a/_site/assets/img/circle-icons/full-color/spaceshuttle.png b/_site/assets/img/circle-icons/full-color/spaceshuttle.png new file mode 100755 index 0000000..6b7cf1e Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/spaceshuttle.png differ diff --git a/_site/assets/img/circle-icons/full-color/speedometer.png b/_site/assets/img/circle-icons/full-color/speedometer.png new file mode 100755 index 0000000..755ff7d Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/speedometer.png differ diff --git a/_site/assets/img/circle-icons/full-color/stack.png b/_site/assets/img/circle-icons/full-color/stack.png new file mode 100755 index 0000000..7333a12 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/stack.png differ diff --git a/_site/assets/img/circle-icons/full-color/star.png b/_site/assets/img/circle-icons/full-color/star.png new file mode 100755 index 0000000..6eb95e7 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/star.png differ diff --git a/_site/assets/img/circle-icons/full-color/steeringwheel.png b/_site/assets/img/circle-icons/full-color/steeringwheel.png new file mode 100755 index 0000000..25b7a38 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/steeringwheel.png differ diff --git a/_site/assets/img/circle-icons/full-color/stop.png b/_site/assets/img/circle-icons/full-color/stop.png new file mode 100755 index 0000000..10884cd Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/stop.png differ diff --git a/_site/assets/img/circle-icons/full-color/submarine.png b/_site/assets/img/circle-icons/full-color/submarine.png new file mode 100755 index 0000000..0ed0d5a Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/submarine.png differ diff --git a/_site/assets/img/circle-icons/full-color/support.png b/_site/assets/img/circle-icons/full-color/support.png new file mode 100755 index 0000000..2b6b434 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/support.png differ diff --git a/_site/assets/img/circle-icons/full-color/takeoff.png b/_site/assets/img/circle-icons/full-color/takeoff.png new file mode 100755 index 0000000..85d1ef3 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/takeoff.png differ diff --git a/_site/assets/img/circle-icons/full-color/target.png b/_site/assets/img/circle-icons/full-color/target.png new file mode 100755 index 0000000..78b3ab6 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/target.png differ diff --git a/_site/assets/img/circle-icons/full-color/taxi.png b/_site/assets/img/circle-icons/full-color/taxi.png new file mode 100755 index 0000000..1ce9e96 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/taxi.png differ diff --git a/_site/assets/img/circle-icons/full-color/toolbox.png b/_site/assets/img/circle-icons/full-color/toolbox.png new file mode 100755 index 0000000..87c2c4a Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/toolbox.png differ diff --git a/_site/assets/img/circle-icons/full-color/tools.png b/_site/assets/img/circle-icons/full-color/tools.png new file mode 100755 index 0000000..e23b404 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/tools.png differ diff --git a/_site/assets/img/circle-icons/full-color/tractor.png b/_site/assets/img/circle-icons/full-color/tractor.png new file mode 100755 index 0000000..4423633 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/tractor.png differ diff --git a/_site/assets/img/circle-icons/full-color/traffic.png b/_site/assets/img/circle-icons/full-color/traffic.png new file mode 100755 index 0000000..dda066f Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/traffic.png differ diff --git a/_site/assets/img/circle-icons/full-color/train.png b/_site/assets/img/circle-icons/full-color/train.png new file mode 100755 index 0000000..6bd5542 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/train.png differ diff --git a/_site/assets/img/circle-icons/full-color/travelerbag.png b/_site/assets/img/circle-icons/full-color/travelerbag.png new file mode 100755 index 0000000..fffb88f Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/travelerbag.png differ diff --git a/_site/assets/img/circle-icons/full-color/trends.png b/_site/assets/img/circle-icons/full-color/trends.png new file mode 100755 index 0000000..54db560 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/trends.png differ diff --git a/_site/assets/img/circle-icons/full-color/trophy.png b/_site/assets/img/circle-icons/full-color/trophy.png new file mode 100755 index 0000000..0e671e5 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/trophy.png differ diff --git a/_site/assets/img/circle-icons/full-color/truck.png b/_site/assets/img/circle-icons/full-color/truck.png new file mode 100755 index 0000000..c88a9bf Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/truck.png differ diff --git a/_site/assets/img/circle-icons/full-color/ufo.png b/_site/assets/img/circle-icons/full-color/ufo.png new file mode 100755 index 0000000..43a7664 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/ufo.png differ diff --git a/_site/assets/img/circle-icons/full-color/umbrella.png b/_site/assets/img/circle-icons/full-color/umbrella.png new file mode 100755 index 0000000..9b215a7 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/umbrella.png differ diff --git a/_site/assets/img/circle-icons/full-color/unicycle.png b/_site/assets/img/circle-icons/full-color/unicycle.png new file mode 100755 index 0000000..a25d1af Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/unicycle.png differ diff --git a/_site/assets/img/circle-icons/full-color/unlocked.png b/_site/assets/img/circle-icons/full-color/unlocked.png new file mode 100755 index 0000000..4058113 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/unlocked.png differ diff --git a/_site/assets/img/circle-icons/full-color/upload.png b/_site/assets/img/circle-icons/full-color/upload.png new file mode 100755 index 0000000..3ce606b Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/upload.png differ diff --git a/_site/assets/img/circle-icons/full-color/video.png b/_site/assets/img/circle-icons/full-color/video.png new file mode 100755 index 0000000..9af0e5e Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/video.png differ diff --git a/_site/assets/img/circle-icons/full-color/water.png b/_site/assets/img/circle-icons/full-color/water.png new file mode 100755 index 0000000..3fcec30 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/water.png differ diff --git a/_site/assets/img/circle-icons/full-color/weather.png b/_site/assets/img/circle-icons/full-color/weather.png new file mode 100755 index 0000000..fcb492a Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/weather.png differ diff --git a/_site/assets/img/circle-icons/full-color/windsock.png b/_site/assets/img/circle-icons/full-color/windsock.png new file mode 100755 index 0000000..6e9e53f Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/windsock.png differ diff --git a/_site/assets/img/circle-icons/full-color/windy.png b/_site/assets/img/circle-icons/full-color/windy.png new file mode 100755 index 0000000..dd85d30 Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/windy.png differ diff --git a/_site/assets/img/circle-icons/full-color/x.png b/_site/assets/img/circle-icons/full-color/x.png new file mode 100755 index 0000000..fea300a Binary files /dev/null and b/_site/assets/img/circle-icons/full-color/x.png differ diff --git a/_site/assets/img/circle-icons/one-color/anchor.png b/_site/assets/img/circle-icons/one-color/anchor.png new file mode 100755 index 0000000..9352d4a Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/anchor.png differ diff --git a/_site/assets/img/circle-icons/one-color/arrow-down.png b/_site/assets/img/circle-icons/one-color/arrow-down.png new file mode 100755 index 0000000..5c35885 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/arrow-down.png differ diff --git a/_site/assets/img/circle-icons/one-color/arrow-up.png b/_site/assets/img/circle-icons/one-color/arrow-up.png new file mode 100755 index 0000000..43b8261 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/arrow-up.png differ diff --git a/_site/assets/img/circle-icons/one-color/art.png b/_site/assets/img/circle-icons/one-color/art.png new file mode 100755 index 0000000..03147ed Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/art.png differ diff --git a/_site/assets/img/circle-icons/one-color/barchart.png b/_site/assets/img/circle-icons/one-color/barchart.png new file mode 100755 index 0000000..ec3d93b Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/barchart.png differ diff --git a/_site/assets/img/circle-icons/one-color/bike.png b/_site/assets/img/circle-icons/one-color/bike.png new file mode 100755 index 0000000..bed02cf Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/bike.png differ diff --git a/_site/assets/img/circle-icons/one-color/biker.png b/_site/assets/img/circle-icons/one-color/biker.png new file mode 100755 index 0000000..e5c47bf Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/biker.png differ diff --git a/_site/assets/img/circle-icons/one-color/bikewheel.png b/_site/assets/img/circle-icons/one-color/bikewheel.png new file mode 100755 index 0000000..cba1a31 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/bikewheel.png differ diff --git a/_site/assets/img/circle-icons/one-color/blimp.png b/_site/assets/img/circle-icons/one-color/blimp.png new file mode 100755 index 0000000..7153145 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/blimp.png differ diff --git a/_site/assets/img/circle-icons/one-color/bomb.png b/_site/assets/img/circle-icons/one-color/bomb.png new file mode 100755 index 0000000..1172cfc Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/bomb.png differ diff --git a/_site/assets/img/circle-icons/one-color/booklet.png b/_site/assets/img/circle-icons/one-color/booklet.png new file mode 100755 index 0000000..ad3c728 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/booklet.png differ diff --git a/_site/assets/img/circle-icons/one-color/bookshelf.png b/_site/assets/img/circle-icons/one-color/bookshelf.png new file mode 100755 index 0000000..b78ae6c Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/bookshelf.png differ diff --git a/_site/assets/img/circle-icons/one-color/briefcase.png b/_site/assets/img/circle-icons/one-color/briefcase.png new file mode 100755 index 0000000..3498bfd Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/briefcase.png differ diff --git a/_site/assets/img/circle-icons/one-color/browser.png b/_site/assets/img/circle-icons/one-color/browser.png new file mode 100755 index 0000000..cc9b29f Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/browser.png differ diff --git a/_site/assets/img/circle-icons/one-color/calculator.png b/_site/assets/img/circle-icons/one-color/calculator.png new file mode 100755 index 0000000..594ddc7 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/calculator.png differ diff --git a/_site/assets/img/circle-icons/one-color/calendar.png b/_site/assets/img/circle-icons/one-color/calendar.png new file mode 100755 index 0000000..61ce994 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/calendar.png differ diff --git a/_site/assets/img/circle-icons/one-color/camera.png b/_site/assets/img/circle-icons/one-color/camera.png new file mode 100755 index 0000000..b92e238 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/camera.png differ diff --git a/_site/assets/img/circle-icons/one-color/car.png b/_site/assets/img/circle-icons/one-color/car.png new file mode 100755 index 0000000..37a6993 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/car.png differ diff --git a/_site/assets/img/circle-icons/one-color/cart.png b/_site/assets/img/circle-icons/one-color/cart.png new file mode 100755 index 0000000..137ed3d Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/cart.png differ diff --git a/_site/assets/img/circle-icons/one-color/carwheel.png b/_site/assets/img/circle-icons/one-color/carwheel.png new file mode 100755 index 0000000..eaca243 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/carwheel.png differ diff --git a/_site/assets/img/circle-icons/one-color/caution.png b/_site/assets/img/circle-icons/one-color/caution.png new file mode 100755 index 0000000..61f01e2 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/caution.png differ diff --git a/_site/assets/img/circle-icons/one-color/chat.png b/_site/assets/img/circle-icons/one-color/chat.png new file mode 100755 index 0000000..952de63 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/chat.png differ diff --git a/_site/assets/img/circle-icons/one-color/check.png b/_site/assets/img/circle-icons/one-color/check.png new file mode 100755 index 0000000..39fe6b8 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/check.png differ diff --git a/_site/assets/img/circle-icons/one-color/clipboard.png b/_site/assets/img/circle-icons/one-color/clipboard.png new file mode 100755 index 0000000..a735d61 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/clipboard.png differ diff --git a/_site/assets/img/circle-icons/one-color/clock.png b/_site/assets/img/circle-icons/one-color/clock.png new file mode 100755 index 0000000..266eff9 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/clock.png differ diff --git a/_site/assets/img/circle-icons/one-color/cloud.png b/_site/assets/img/circle-icons/one-color/cloud.png new file mode 100755 index 0000000..975bd30 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/cloud.png differ diff --git a/_site/assets/img/circle-icons/one-color/compass.png b/_site/assets/img/circle-icons/one-color/compass.png new file mode 100755 index 0000000..2a1fbd2 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/compass.png differ diff --git a/_site/assets/img/circle-icons/one-color/compose.png b/_site/assets/img/circle-icons/one-color/compose.png new file mode 100755 index 0000000..2f6738e Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/compose.png differ diff --git a/_site/assets/img/circle-icons/one-color/computer.png b/_site/assets/img/circle-icons/one-color/computer.png new file mode 100755 index 0000000..3dca9b5 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/computer.png differ diff --git a/_site/assets/img/circle-icons/one-color/cone.png b/_site/assets/img/circle-icons/one-color/cone.png new file mode 100755 index 0000000..c1b1cbe Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/cone.png differ diff --git a/_site/assets/img/circle-icons/one-color/contacts.png b/_site/assets/img/circle-icons/one-color/contacts.png new file mode 100755 index 0000000..b3bcbda Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/contacts.png differ diff --git a/_site/assets/img/circle-icons/one-color/creditcard.png b/_site/assets/img/circle-icons/one-color/creditcard.png new file mode 100755 index 0000000..c329cf3 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/creditcard.png differ diff --git a/_site/assets/img/circle-icons/one-color/crossroads.png b/_site/assets/img/circle-icons/one-color/crossroads.png new file mode 100755 index 0000000..d86bb66 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/crossroads.png differ diff --git a/_site/assets/img/circle-icons/one-color/cruise.png b/_site/assets/img/circle-icons/one-color/cruise.png new file mode 100755 index 0000000..2b6b429 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/cruise.png differ diff --git a/_site/assets/img/circle-icons/one-color/denied.png b/_site/assets/img/circle-icons/one-color/denied.png new file mode 100755 index 0000000..ff7b8fa Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/denied.png differ diff --git a/_site/assets/img/circle-icons/one-color/dev.png b/_site/assets/img/circle-icons/one-color/dev.png new file mode 100755 index 0000000..ca4826e Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/dev.png differ diff --git a/_site/assets/img/circle-icons/one-color/die.png b/_site/assets/img/circle-icons/one-color/die.png new file mode 100755 index 0000000..0236924 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/die.png differ diff --git a/_site/assets/img/circle-icons/one-color/document.png b/_site/assets/img/circle-icons/one-color/document.png new file mode 100755 index 0000000..0838606 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/document.png differ diff --git a/_site/assets/img/circle-icons/one-color/dolly.png b/_site/assets/img/circle-icons/one-color/dolly.png new file mode 100755 index 0000000..a62313a Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/dolly.png differ diff --git a/_site/assets/img/circle-icons/one-color/door.png b/_site/assets/img/circle-icons/one-color/door.png new file mode 100755 index 0000000..8904e3f Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/door.png differ diff --git a/_site/assets/img/circle-icons/one-color/download.png b/_site/assets/img/circle-icons/one-color/download.png new file mode 100755 index 0000000..166a60d Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/download.png differ diff --git a/_site/assets/img/circle-icons/one-color/email.png b/_site/assets/img/circle-icons/one-color/email.png new file mode 100755 index 0000000..76c32a0 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/email.png differ diff --git a/_site/assets/img/circle-icons/one-color/eye.png b/_site/assets/img/circle-icons/one-color/eye.png new file mode 100755 index 0000000..b4a0d8f Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/eye.png differ diff --git a/_site/assets/img/circle-icons/one-color/fashion.png b/_site/assets/img/circle-icons/one-color/fashion.png new file mode 100755 index 0000000..c3d85dd Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/fashion.png differ diff --git a/_site/assets/img/circle-icons/one-color/flag.png b/_site/assets/img/circle-icons/one-color/flag.png new file mode 100755 index 0000000..be2d955 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/flag.png differ diff --git a/_site/assets/img/circle-icons/one-color/flame.png b/_site/assets/img/circle-icons/one-color/flame.png new file mode 100755 index 0000000..7f7c6ad Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/flame.png differ diff --git a/_site/assets/img/circle-icons/one-color/folder.png b/_site/assets/img/circle-icons/one-color/folder.png new file mode 100755 index 0000000..858986c Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/folder.png differ diff --git a/_site/assets/img/circle-icons/one-color/gas.png b/_site/assets/img/circle-icons/one-color/gas.png new file mode 100755 index 0000000..d323fc9 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/gas.png differ diff --git a/_site/assets/img/circle-icons/one-color/gear.png b/_site/assets/img/circle-icons/one-color/gear.png new file mode 100755 index 0000000..b346e5c Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/gear.png differ diff --git a/_site/assets/img/circle-icons/one-color/genius.png b/_site/assets/img/circle-icons/one-color/genius.png new file mode 100755 index 0000000..aee5d6b Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/genius.png differ diff --git a/_site/assets/img/circle-icons/one-color/global.png b/_site/assets/img/circle-icons/one-color/global.png new file mode 100755 index 0000000..6a66c6f Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/global.png differ diff --git a/_site/assets/img/circle-icons/one-color/globe.png b/_site/assets/img/circle-icons/one-color/globe.png new file mode 100755 index 0000000..15a88fc Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/globe.png differ diff --git a/_site/assets/img/circle-icons/one-color/gps.png b/_site/assets/img/circle-icons/one-color/gps.png new file mode 100755 index 0000000..00fa0f3 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/gps.png differ diff --git a/_site/assets/img/circle-icons/one-color/hazard.png b/_site/assets/img/circle-icons/one-color/hazard.png new file mode 100755 index 0000000..006b367 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/hazard.png differ diff --git a/_site/assets/img/circle-icons/one-color/heart.png b/_site/assets/img/circle-icons/one-color/heart.png new file mode 100755 index 0000000..cab18a2 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/heart.png differ diff --git a/_site/assets/img/circle-icons/one-color/helicopter.png b/_site/assets/img/circle-icons/one-color/helicopter.png new file mode 100755 index 0000000..36c62df Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/helicopter.png differ diff --git a/_site/assets/img/circle-icons/one-color/hotair.png b/_site/assets/img/circle-icons/one-color/hotair.png new file mode 100755 index 0000000..49346de Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/hotair.png differ diff --git a/_site/assets/img/circle-icons/one-color/hourglass.png b/_site/assets/img/circle-icons/one-color/hourglass.png new file mode 100755 index 0000000..1d49d27 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/hourglass.png differ diff --git a/_site/assets/img/circle-icons/one-color/image.png b/_site/assets/img/circle-icons/one-color/image.png new file mode 100755 index 0000000..6b3aea3 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/image.png differ diff --git a/_site/assets/img/circle-icons/one-color/interstate.png b/_site/assets/img/circle-icons/one-color/interstate.png new file mode 100755 index 0000000..914f7c8 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/interstate.png differ diff --git a/_site/assets/img/circle-icons/one-color/key.png b/_site/assets/img/circle-icons/one-color/key.png new file mode 100755 index 0000000..02d3dc3 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/key.png differ diff --git a/_site/assets/img/circle-icons/one-color/lightbulb.png b/_site/assets/img/circle-icons/one-color/lightbulb.png new file mode 100755 index 0000000..2cef7ac Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/lightbulb.png differ diff --git a/_site/assets/img/circle-icons/one-color/location.png b/_site/assets/img/circle-icons/one-color/location.png new file mode 100755 index 0000000..c08b4a0 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/location.png differ diff --git a/_site/assets/img/circle-icons/one-color/locked.png b/_site/assets/img/circle-icons/one-color/locked.png new file mode 100755 index 0000000..12720a7 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/locked.png differ diff --git a/_site/assets/img/circle-icons/one-color/magnifyingglass.png b/_site/assets/img/circle-icons/one-color/magnifyingglass.png new file mode 100755 index 0000000..e754047 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/magnifyingglass.png differ diff --git a/_site/assets/img/circle-icons/one-color/mail.png b/_site/assets/img/circle-icons/one-color/mail.png new file mode 100755 index 0000000..84397d0 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/mail.png differ diff --git a/_site/assets/img/circle-icons/one-color/map.png b/_site/assets/img/circle-icons/one-color/map.png new file mode 100755 index 0000000..c3e21de Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/map.png differ diff --git a/_site/assets/img/circle-icons/one-color/merge.png b/_site/assets/img/circle-icons/one-color/merge.png new file mode 100755 index 0000000..3580590 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/merge.png differ diff --git a/_site/assets/img/circle-icons/one-color/mic.png b/_site/assets/img/circle-icons/one-color/mic.png new file mode 100755 index 0000000..9d79d2b Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/mic.png differ diff --git a/_site/assets/img/circle-icons/one-color/money.png b/_site/assets/img/circle-icons/one-color/money.png new file mode 100755 index 0000000..6595a20 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/money.png differ diff --git a/_site/assets/img/circle-icons/one-color/motorcycle.png b/_site/assets/img/circle-icons/one-color/motorcycle.png new file mode 100755 index 0000000..ab70102 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/motorcycle.png differ diff --git a/_site/assets/img/circle-icons/one-color/music.png b/_site/assets/img/circle-icons/one-color/music.png new file mode 100755 index 0000000..90fa294 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/music.png differ diff --git a/_site/assets/img/circle-icons/one-color/news.png b/_site/assets/img/circle-icons/one-color/news.png new file mode 100755 index 0000000..fc65f73 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/news.png differ diff --git a/_site/assets/img/circle-icons/one-color/parachute.png b/_site/assets/img/circle-icons/one-color/parachute.png new file mode 100755 index 0000000..cbcf9ec Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/parachute.png differ diff --git a/_site/assets/img/circle-icons/one-color/pencil.png b/_site/assets/img/circle-icons/one-color/pencil.png new file mode 100755 index 0000000..9e02e5b Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/pencil.png differ diff --git a/_site/assets/img/circle-icons/one-color/phone.png b/_site/assets/img/circle-icons/one-color/phone.png new file mode 100755 index 0000000..9d5d4f7 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/phone.png differ diff --git a/_site/assets/img/circle-icons/one-color/piechart.png b/_site/assets/img/circle-icons/one-color/piechart.png new file mode 100755 index 0000000..e9c1a73 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/piechart.png differ diff --git a/_site/assets/img/circle-icons/one-color/pin.png b/_site/assets/img/circle-icons/one-color/pin.png new file mode 100755 index 0000000..6e7c535 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/pin.png differ diff --git a/_site/assets/img/circle-icons/one-color/pin2.png b/_site/assets/img/circle-icons/one-color/pin2.png new file mode 100755 index 0000000..968e6de Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/pin2.png differ diff --git a/_site/assets/img/circle-icons/one-color/plane.png b/_site/assets/img/circle-icons/one-color/plane.png new file mode 100755 index 0000000..207f969 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/plane.png differ diff --git a/_site/assets/img/circle-icons/one-color/present.png b/_site/assets/img/circle-icons/one-color/present.png new file mode 100755 index 0000000..7755738 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/present.png differ diff --git a/_site/assets/img/circle-icons/one-color/profle.png b/_site/assets/img/circle-icons/one-color/profle.png new file mode 100755 index 0000000..61d47f1 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/profle.png differ diff --git a/_site/assets/img/circle-icons/one-color/quote.png b/_site/assets/img/circle-icons/one-color/quote.png new file mode 100755 index 0000000..ef00adc Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/quote.png differ diff --git a/_site/assets/img/circle-icons/one-color/racingflags.png b/_site/assets/img/circle-icons/one-color/racingflags.png new file mode 100755 index 0000000..87ec674 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/racingflags.png differ diff --git a/_site/assets/img/circle-icons/one-color/rainbow.png b/_site/assets/img/circle-icons/one-color/rainbow.png new file mode 100755 index 0000000..85e2df6 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/rainbow.png differ diff --git a/_site/assets/img/circle-icons/one-color/recycle.png b/_site/assets/img/circle-icons/one-color/recycle.png new file mode 100755 index 0000000..efa53b3 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/recycle.png differ diff --git a/_site/assets/img/circle-icons/one-color/ribbon.png b/_site/assets/img/circle-icons/one-color/ribbon.png new file mode 100755 index 0000000..1db7e08 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/ribbon.png differ diff --git a/_site/assets/img/circle-icons/one-color/roadblock.png b/_site/assets/img/circle-icons/one-color/roadblock.png new file mode 100755 index 0000000..551d90d Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/roadblock.png differ diff --git a/_site/assets/img/circle-icons/one-color/rocket.png b/_site/assets/img/circle-icons/one-color/rocket.png new file mode 100755 index 0000000..cfd2611 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/rocket.png differ diff --git a/_site/assets/img/circle-icons/one-color/running.png b/_site/assets/img/circle-icons/one-color/running.png new file mode 100755 index 0000000..e0fb770 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/running.png differ diff --git a/_site/assets/img/circle-icons/one-color/sailboat.png b/_site/assets/img/circle-icons/one-color/sailboat.png new file mode 100755 index 0000000..74e9cb1 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/sailboat.png differ diff --git a/_site/assets/img/circle-icons/one-color/schooolbus.png b/_site/assets/img/circle-icons/one-color/schooolbus.png new file mode 100755 index 0000000..fec9f67 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/schooolbus.png differ diff --git a/_site/assets/img/circle-icons/one-color/scissors.png b/_site/assets/img/circle-icons/one-color/scissors.png new file mode 100755 index 0000000..b21275e Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/scissors.png differ diff --git a/_site/assets/img/circle-icons/one-color/scooter.png b/_site/assets/img/circle-icons/one-color/scooter.png new file mode 100755 index 0000000..730d98d Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/scooter.png differ diff --git a/_site/assets/img/circle-icons/one-color/security.png b/_site/assets/img/circle-icons/one-color/security.png new file mode 100755 index 0000000..2ba6234 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/security.png differ diff --git a/_site/assets/img/circle-icons/one-color/settings.png b/_site/assets/img/circle-icons/one-color/settings.png new file mode 100755 index 0000000..0292027 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/settings.png differ diff --git a/_site/assets/img/circle-icons/one-color/shipwheel.png b/_site/assets/img/circle-icons/one-color/shipwheel.png new file mode 100755 index 0000000..0f4f69f Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/shipwheel.png differ diff --git a/_site/assets/img/circle-icons/one-color/shoeprints.png b/_site/assets/img/circle-icons/one-color/shoeprints.png new file mode 100755 index 0000000..3dd5f22 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/shoeprints.png differ diff --git a/_site/assets/img/circle-icons/one-color/shop.png b/_site/assets/img/circle-icons/one-color/shop.png new file mode 100755 index 0000000..33784a1 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/shop.png differ diff --git a/_site/assets/img/circle-icons/one-color/skateboard.png b/_site/assets/img/circle-icons/one-color/skateboard.png new file mode 100755 index 0000000..38a8a9a Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/skateboard.png differ diff --git a/_site/assets/img/circle-icons/one-color/smartphone.png b/_site/assets/img/circle-icons/one-color/smartphone.png new file mode 100755 index 0000000..d272c39 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/smartphone.png differ diff --git a/_site/assets/img/circle-icons/one-color/spaceshuttle.png b/_site/assets/img/circle-icons/one-color/spaceshuttle.png new file mode 100755 index 0000000..c7ae179 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/spaceshuttle.png differ diff --git a/_site/assets/img/circle-icons/one-color/speedometer.png b/_site/assets/img/circle-icons/one-color/speedometer.png new file mode 100755 index 0000000..ed6adb9 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/speedometer.png differ diff --git a/_site/assets/img/circle-icons/one-color/stack.png b/_site/assets/img/circle-icons/one-color/stack.png new file mode 100755 index 0000000..425e9f4 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/stack.png differ diff --git a/_site/assets/img/circle-icons/one-color/star.png b/_site/assets/img/circle-icons/one-color/star.png new file mode 100755 index 0000000..dae7aae Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/star.png differ diff --git a/_site/assets/img/circle-icons/one-color/steeringwheel.png b/_site/assets/img/circle-icons/one-color/steeringwheel.png new file mode 100755 index 0000000..f47ffbd Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/steeringwheel.png differ diff --git a/_site/assets/img/circle-icons/one-color/stop.png b/_site/assets/img/circle-icons/one-color/stop.png new file mode 100755 index 0000000..91a97a1 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/stop.png differ diff --git a/_site/assets/img/circle-icons/one-color/submarine.png b/_site/assets/img/circle-icons/one-color/submarine.png new file mode 100755 index 0000000..d82f339 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/submarine.png differ diff --git a/_site/assets/img/circle-icons/one-color/support.png b/_site/assets/img/circle-icons/one-color/support.png new file mode 100755 index 0000000..8e70422 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/support.png differ diff --git a/_site/assets/img/circle-icons/one-color/takeoff.png b/_site/assets/img/circle-icons/one-color/takeoff.png new file mode 100755 index 0000000..c39b9fd Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/takeoff.png differ diff --git a/_site/assets/img/circle-icons/one-color/target.png b/_site/assets/img/circle-icons/one-color/target.png new file mode 100755 index 0000000..a9062af Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/target.png differ diff --git a/_site/assets/img/circle-icons/one-color/taxi.png b/_site/assets/img/circle-icons/one-color/taxi.png new file mode 100755 index 0000000..cba2c05 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/taxi.png differ diff --git a/_site/assets/img/circle-icons/one-color/toolbox.png b/_site/assets/img/circle-icons/one-color/toolbox.png new file mode 100755 index 0000000..a56df6e Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/toolbox.png differ diff --git a/_site/assets/img/circle-icons/one-color/tools.png b/_site/assets/img/circle-icons/one-color/tools.png new file mode 100755 index 0000000..b50e4f5 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/tools.png differ diff --git a/_site/assets/img/circle-icons/one-color/tractor.png b/_site/assets/img/circle-icons/one-color/tractor.png new file mode 100755 index 0000000..700083d Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/tractor.png differ diff --git a/_site/assets/img/circle-icons/one-color/traffic.png b/_site/assets/img/circle-icons/one-color/traffic.png new file mode 100755 index 0000000..bea1ae1 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/traffic.png differ diff --git a/_site/assets/img/circle-icons/one-color/train.png b/_site/assets/img/circle-icons/one-color/train.png new file mode 100755 index 0000000..59792ce Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/train.png differ diff --git a/_site/assets/img/circle-icons/one-color/travelerbag.png b/_site/assets/img/circle-icons/one-color/travelerbag.png new file mode 100755 index 0000000..8464a7b Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/travelerbag.png differ diff --git a/_site/assets/img/circle-icons/one-color/trends.png b/_site/assets/img/circle-icons/one-color/trends.png new file mode 100755 index 0000000..1556260 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/trends.png differ diff --git a/_site/assets/img/circle-icons/one-color/trophy.png b/_site/assets/img/circle-icons/one-color/trophy.png new file mode 100755 index 0000000..efc93cd Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/trophy.png differ diff --git a/_site/assets/img/circle-icons/one-color/truck.png b/_site/assets/img/circle-icons/one-color/truck.png new file mode 100755 index 0000000..4690363 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/truck.png differ diff --git a/_site/assets/img/circle-icons/one-color/ufo.png b/_site/assets/img/circle-icons/one-color/ufo.png new file mode 100755 index 0000000..0c99ee5 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/ufo.png differ diff --git a/_site/assets/img/circle-icons/one-color/umbrella.png b/_site/assets/img/circle-icons/one-color/umbrella.png new file mode 100755 index 0000000..2d1cfcb Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/umbrella.png differ diff --git a/_site/assets/img/circle-icons/one-color/unicycle.png b/_site/assets/img/circle-icons/one-color/unicycle.png new file mode 100755 index 0000000..d101616 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/unicycle.png differ diff --git a/_site/assets/img/circle-icons/one-color/unlocked.png b/_site/assets/img/circle-icons/one-color/unlocked.png new file mode 100755 index 0000000..f3a70d4 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/unlocked.png differ diff --git a/_site/assets/img/circle-icons/one-color/upload.png b/_site/assets/img/circle-icons/one-color/upload.png new file mode 100755 index 0000000..04af4fa Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/upload.png differ diff --git a/_site/assets/img/circle-icons/one-color/video.png b/_site/assets/img/circle-icons/one-color/video.png new file mode 100755 index 0000000..a04849a Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/video.png differ diff --git a/_site/assets/img/circle-icons/one-color/water.png b/_site/assets/img/circle-icons/one-color/water.png new file mode 100755 index 0000000..a6825e8 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/water.png differ diff --git a/_site/assets/img/circle-icons/one-color/weather.png b/_site/assets/img/circle-icons/one-color/weather.png new file mode 100755 index 0000000..d2e0410 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/weather.png differ diff --git a/_site/assets/img/circle-icons/one-color/windsock.png b/_site/assets/img/circle-icons/one-color/windsock.png new file mode 100755 index 0000000..53be506 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/windsock.png differ diff --git a/_site/assets/img/circle-icons/one-color/windy.png b/_site/assets/img/circle-icons/one-color/windy.png new file mode 100755 index 0000000..0315b95 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/windy.png differ diff --git a/_site/assets/img/circle-icons/one-color/x.png b/_site/assets/img/circle-icons/one-color/x.png new file mode 100755 index 0000000..ad09af3 Binary files /dev/null and b/_site/assets/img/circle-icons/one-color/x.png differ diff --git a/_site/assets/img/customize.png b/_site/assets/img/customize.png new file mode 100644 index 0000000..9bf9156 Binary files /dev/null and b/_site/assets/img/customize.png differ diff --git a/_site/assets/img/customize2.png b/_site/assets/img/customize2.png new file mode 100644 index 0000000..6134604 Binary files /dev/null and b/_site/assets/img/customize2.png differ diff --git a/_site/assets/img/easy.jpg b/_site/assets/img/easy.jpg new file mode 100644 index 0000000..9021c43 Binary files /dev/null and b/_site/assets/img/easy.jpg differ diff --git a/_site/assets/img/employee_directory.gif b/_site/assets/img/employee_directory.gif new file mode 100644 index 0000000..17a45d8 Binary files /dev/null and b/_site/assets/img/employee_directory.gif differ diff --git a/_site/assets/img/error_payload.png b/_site/assets/img/error_payload.png new file mode 100644 index 0000000..da98605 Binary files /dev/null and b/_site/assets/img/error_payload.png differ diff --git a/_site/assets/img/generator.png b/_site/assets/img/generator.png new file mode 100644 index 0000000..95cc960 Binary files /dev/null and b/_site/assets/img/generator.png differ diff --git a/_site/assets/img/generator2.png b/_site/assets/img/generator2.png new file mode 100644 index 0000000..b470a83 Binary files /dev/null and b/_site/assets/img/generator2.png differ diff --git a/_site/assets/img/generator3.png b/_site/assets/img/generator3.png new file mode 100644 index 0000000..c922dca Binary files /dev/null and b/_site/assets/img/generator3.png differ diff --git a/_site/assets/img/glimmer_logo.png b/_site/assets/img/glimmer_logo.png new file mode 100644 index 0000000..6e0c660 Binary files /dev/null and b/_site/assets/img/glimmer_logo.png differ diff --git a/_site/assets/img/jsonapi-rb-logo.png b/_site/assets/img/jsonapi-rb-logo.png new file mode 100644 index 0000000..d20e58e Binary files /dev/null and b/_site/assets/img/jsonapi-rb-logo.png differ diff --git a/_site/assets/img/meta_total_count.png b/_site/assets/img/meta_total_count.png new file mode 100644 index 0000000..1cfcaf7 Binary files /dev/null and b/_site/assets/img/meta_total_count.png differ diff --git a/_site/assets/img/mountain_river_bg.jpeg b/_site/assets/img/mountain_river_bg.jpeg new file mode 100755 index 0000000..cbc63ae Binary files /dev/null and b/_site/assets/img/mountain_river_bg.jpeg differ diff --git a/_site/assets/img/photographer.png b/_site/assets/img/photographer.png new file mode 100755 index 0000000..097d928 Binary files /dev/null and b/_site/assets/img/photographer.png differ diff --git a/_site/assets/img/rspec.png b/_site/assets/img/rspec.png new file mode 100644 index 0000000..6873322 Binary files /dev/null and b/_site/assets/img/rspec.png differ diff --git a/_site/assets/img/rspec2.png b/_site/assets/img/rspec2.png new file mode 100644 index 0000000..98987ad Binary files /dev/null and b/_site/assets/img/rspec2.png differ diff --git a/_site/assets/img/solutions.jpeg b/_site/assets/img/solutions.jpeg new file mode 100644 index 0000000..66177f3 Binary files /dev/null and b/_site/assets/img/solutions.jpeg differ diff --git a/_site/assets/img/solutions.png b/_site/assets/img/solutions.png new file mode 100644 index 0000000..61dabe1 Binary files /dev/null and b/_site/assets/img/solutions.png differ diff --git a/_site/assets/img/ss2.png b/_site/assets/img/ss2.png new file mode 100644 index 0000000..2962ec2 Binary files /dev/null and b/_site/assets/img/ss2.png differ diff --git a/_site/assets/img/sunrise.png b/_site/assets/img/sunrise.png new file mode 100755 index 0000000..a0fa479 Binary files /dev/null and b/_site/assets/img/sunrise.png differ diff --git a/_site/assets/img/vue_logo.png b/_site/assets/img/vue_logo.png new file mode 100644 index 0000000..b4c9066 Binary files /dev/null and b/_site/assets/img/vue_logo.png differ diff --git a/_site/assets/img/windmill_bg.png b/_site/assets/img/windmill_bg.png new file mode 100755 index 0000000..9b6fab8 Binary files /dev/null and b/_site/assets/img/windmill_bg.png differ diff --git a/_site/assets/js/highlight.pack.js b/_site/assets/js/highlight.pack.js new file mode 100644 index 0000000..fdba04e --- /dev/null +++ b/_site/assets/js/highlight.pack.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.12.0 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/g,"&").replace(//g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function u(e){s+=""}function c(e){("start"===e.event?o:u)(e.node)}for(var l=0,s="",f=[];e.length||r.length;){var g=i();if(s+=n(a.substring(l,g[0].offset)),l=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===l);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return s+n(a.substr(l))}function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},u=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?u("keyword",a.k):x(a.k).forEach(function(e){u(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return l("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var c=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=c.length?t(c.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function l(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?"":I.classPrefix,i='',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=l(E,r),e?(B+=e[1],a+=p(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!y[E.sL])return n(k);var t=e?f(E.sL,k,!0,x[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(B+=t.r),e&&(x[E.sL]=t.top),p(t.language,t.value,!1,!0)}function b(){L+=null!=E.sL?d():h(),k=""}function v(e){L+=e.cN?p(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(k+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),b(),t.rB||t.eB||(k=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),b(),a.eE&&(k=n));do E.cN&&(L+=C),E.skip||(B+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return k+=n,n.length||1}var N=w(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var R,E=i||N,x={},L="";for(R=E;R!==N;R=R.parent)R.cN&&(L=p(R.cN,"",!0)+L);var k="",B=0;try{for(var M,j,O=0;;){if(E.t.lastIndex=O,M=E.t.exec(t),!M)break;j=m(t.substring(O,M.index),M[0]),O=M.index+j}for(m(t.substr(O)),R=E;R.parent;R=R.parent)R.cN&&(L+=C);return{r:B,value:L,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function g(e,t){t=t||I.languages||x(y);var r={r:0,value:n(e)},a=r;return t.filter(w).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return I.tabReplace||I.useBR?e.replace(M,function(e,n){return I.useBR&&"\n"===e?"
":I.tabReplace?n.replace(/\t/g,I.tabReplace):""}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function d(e){var n,t,r,o,l,s=i(e);a(s)||(I.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,l=n.textContent,r=s?f(s,l,!0):g(l),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),l)),r.value=p(r.value),e.innerHTML=r.value,e.className=h(e.className,s,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){I=o(I,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,d)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=y[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function R(){return x(y)}function w(e){return e=(e||"").toLowerCase(),y[e]||y[L[e]]}var E=[],x=Object.keys,y={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="
",I={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=d,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("javascript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},n={cN:"subst",b:"\\$\\{",e:"\\}",k:t,c:[]},c={cN:"string",b:"`",e:"`",c:[e.BE,n]};n.c=[e.ASM,e.QSM,c,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:t,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,c,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:r+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:r,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+r+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0}]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[t],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"meta",v:[{b:/<\?xml/,e:/\?>/,r:10},{b:/<\?\w+/,e:/\?>/}]},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("ruby",function(e){var b="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",r={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},c={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},s=[e.C("#","$",{c:[c]}),e.C("^\\=begin","^\\=end",{c:[c],r:10}),e.C("^__END__","\\n$")],n={cN:"subst",b:"#\\{",e:"}",k:r},t={cN:"string",c:[e.BE,n],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{b:/<<(-?)\w+$/,e:/^\s*\w+$/}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:r},d=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(s)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:b}),i].concat(s)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":(?!\\s)",c:[t,{b:b}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:r},{b:"("+e.RSR+"|unless)\\s*",k:"unless",c:[a,{cN:"regexp",c:[e.BE,n],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(s),r:0}].concat(s);n.c=d,i.c=d;var l="[>?]>",o="[\\w#]+\\(\\w+\\):\\d+:\\d+>",u="(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>",w=[{b:/^\s*=>/,starts:{e:"$",c:d}},{cN:"meta",b:"^("+l+"|"+o+"|"+u+")",starts:{e:"$",c:d}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:r,i:/\/\*/,c:s.concat(w).concat(d)}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*#]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}});hljs.registerLanguage("python",function(e){var r={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},b={cN:"meta",b:/^(>>>|\.\.\.) /},c={cN:"subst",b:/\{/,e:/\}/,k:r,i:/#/},a={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[b],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[b],r:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[b,c]},{b:/(fr|rf|f)"""/,e:/"""/,c:[b,c]},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},{b:/(fr|rf|f)'/,e:/'/,c:[c]},{b:/(fr|rf|f)"/,e:/"/,c:[c]},e.ASM,e.QSM]},s={cN:"number",r:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},i={cN:"params",b:/\(/,e:/\)/,c:["self",b,s,a]};return c.c=[a,s,b],{aliases:["py","gyp"],k:r,i:/(<\/|->|\?)|=>/,c:[b,s,a,e.HCM,{v:[{cN:"function",bK:"def"},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,i,{b:/->/,eW:!0,k:"None"}]},{cN:"meta",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}}); \ No newline at end of file diff --git a/_site/assets/main.css b/_site/assets/main.css new file mode 100644 index 0000000..10117cb --- /dev/null +++ b/_site/assets/main.css @@ -0,0 +1,12434 @@ +@charset "UTF-8"; +/* this mixin makes possible to add transition to a specific vendor, example: */ +/* -webkit-transition: -webkit-transform 0.5s linear; */ +@import url(https://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300italic,300,400italic,500,500italic,700,700italic,900,900italic); +@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600,700,900,200italic,300italic,400italic,600italic,700italic,900italic); +@import url(https://fonts.googleapis.com/css?family=Lato:100,300,400,700,900,100italic,300italic,400italic,700italic,900italic); +@import url(https://fonts.googleapis.com/css?family=Merriweather:400,300italic,300,400italic,700,700italic); +@import url(https://fonts.googleapis.com/css?family=Karla:400,700); +*:focus { + outline: 0; } + +.button { + display: inline-block; + vertical-align: middle; + zoom: 1; + padding: 13px 32px; + font-weight: 400; + font-size: 17px; + color: #fff !important; + text-shadow: rgba(0, 0, 0, 0.2) 0 -1px 0; + border: 0px; + border-radius: 5px; + box-shadow: rgba(0, 0, 0, 0.3) 0 1px 2px, inset rgba(255, 255, 255, 0.88) 0px 1px 3px -1px; + background-color: #4589E3; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5DA4FF), color-stop(100%, #417BFF)); + background: -webkit-linear-gradient(#5DA4FF, #417BFF); + background: -moz-linear-gradient(#5DA4FF, #417BFF); + background: -o-linear-gradient(#5DA4FF, #417BFF); + background: linear-gradient(#5DA4FF, #417BFF); + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .button:hover { + color: #fff; + text-decoration: none; } + .button:active { + box-shadow: inset 0px 3px 3px rgba(0, 0, 0, 0.29); } + .button.button-small { + padding: 10px 33px; + border: 1px solid #68A2EE; + font-size: 14px; + font-weight: 500; } + +.button-outline { + display: inline-block; + vertical-align: middle; + zoom: 1; + color: #fff; + padding: 12px 31px; + border: 2px solid #fff; + border-radius: 4px; + font-size: 16px; + font-weight: 400; + background: rgba(0, 0, 0, 0.15); + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .button-outline:hover { + text-decoration: none; + color: #ddd; + border-color: #ddd; } + +.button-clear { + border: 0; + outline: none; + padding: 1px; + display: inline-block; + text-decoration: none; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075); + -ms-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075); + -o-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075); + background: #adb2bb; + background: -webkit-linear-gradient(#ccd0d6, #adb2bb); + background: -moz-linear-gradient(#ccd0d6, #adb2bb); + background: -ms-linear-gradient(#ccd0d6, #adb2bb); + background: -o-linear-gradient(#ccd0d6, #adb2bb); + background: linear-gradient(#ccd0d6, #adb2bb); } + .button-clear span { + display: block; + font-size: 14px; + padding-left: 23px; + padding-right: 23px; + height: 36px; + line-height: 33px; + border-radius: 4px; + font-weight: bold; + color: #444; + text-shadow: 0 1px 0 white; + background: #eff1f4; + background: -webkit-linear-gradient(#f7f8fa, #eff1f4); + background: -moz-linear-gradient(#f7f8fa, #eff1f4); + background: -ms-linear-gradient(#f7f8fa, #eff1f4); + background: -o-linear-gradient(#f7f8fa, #eff1f4); + background: linear-gradient(#f7f8fa, #eff1f4); + -webkit-box-shadow: inset 0 1px 0 white; + -moz-box-shadow: inset 0 1px 0 white; + -ms-box-shadow: inset 0 1px 0 white; + -o-box-shadow: inset 0 1px 0 white; + box-shadow: inset 0 1px 0 white; } + .button-clear:hover { + text-decoration: none; } + .button-clear:active, .button-clear.active { + background: #b5bac2; + background: -webkit-linear-gradient(#b5bac2, #b5bac2); + background: -moz-linear-gradient(#b5bac2, #b5bac2); + background: -ms-linear-gradient(#b5bac2, #b5bac2); + background: -o-linear-gradient(#b5bac2, #b5bac2); + background: linear-gradient(#b5bac2, #b5bac2); } + .button-clear:active span, .button-clear.active span { + color: #444; + background: #eff1f4; + background: -webkit-linear-gradient(#e6e8eb, #eff1f4); + background: -moz-linear-gradient(#e6e8eb, #eff1f4); + background: -ms-linear-gradient(#e6e8eb, #eff1f4); + background: -o-linear-gradient(#e6e8eb, #eff1f4); + background: linear-gradient(#e6e8eb, #eff1f4); + -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1); + -ms-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1); + -o-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1); } + +/* form controls */ +input[type="text"].form-control, +input[type="email"].form-control, +input[type="password"].form-control { + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); + height: 39px; } + input[type="text"].form-control::-webkit-input-placeholder, + input[type="email"].form-control::-webkit-input-placeholder, + input[type="password"].form-control::-webkit-input-placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; } + input[type="text"].form-control:-moz-placeholder, + input[type="email"].form-control:-moz-placeholder, + input[type="password"].form-control:-moz-placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; } + input[type="text"].form-control::-moz-placeholder, + input[type="email"].form-control::-moz-placeholder, + input[type="password"].form-control::-moz-placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; } + input[type="text"].form-control:-ms-input-placeholder, + input[type="email"].form-control:-ms-input-placeholder, + input[type="password"].form-control:-ms-input-placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; } + input[type="text"].form-control:focus, + input[type="email"].form-control:focus, + input[type="password"].form-control:focus { + border-color: #98D2FF; + outline: 0; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px rgba(166, 205, 236, 0.6); } + +textarea.form-control { + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); } + textarea.form-control::-webkit-input-placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; } + textarea.form-control:-moz-placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; } + textarea.form-control::-moz-placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; } + textarea.form-control:-ms-input-placeholder { + color: #B1B1B1; + font-weight: 400; + font-size: 14px; } + textarea.form-control:focus { + border-color: #98D2FF; + outline: 0; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px rgba(166, 205, 236, 0.6); } + +.btn-shadow { + border: 0; + font-weight: 600; + color: #fff; + display: inline-block; + box-shadow: rgba(23, 43, 99, 0.24) 0 7px 28px; + text-transform: uppercase; + letter-spacing: 1px; + font-size: 13px; + padding: 12px 23px; + text-shadow: 1px 1px rgba(0, 0, 0, 0.09); + border-radius: 4px; + -webkit-transition: all 0.2s; + -moz-transition: all 0.2s; + -ms-transition: all 0.2s; + -o-transition: all 0.2s; + transition: all 0.2s; + /* sizes */ + /* colors */ } + .btn-shadow:hover, .btn-shadow:focus { + color: #fff; + text-decoration: none; } + .btn-shadow:active { + box-shadow: rgba(23, 43, 99, 0.24) 0 7px 28px, inset 0 2px 3px rgba(0, 0, 0, 0.3); } + .btn-shadow.btn-shadow-sm { + font-size: 11px; + padding: 7px 14px; } + .btn-shadow.btn-shadow-lg { + font-size: 14px; + padding: 16px 31px; } + .btn-shadow.btn-shadow-default { + background: #fff; + color: #444; + text-shadow: none; } + .btn-shadow.btn-shadow-primary { + background: linear-gradient(#2083fe, #1d7bf0); } + .btn-shadow.btn-shadow-dark { + background: #2C394D; } + .btn-shadow.btn-shadow-info { + background: #42B1E2; } + .btn-shadow.btn-shadow-warning { + background: #E2B477; } + .btn-shadow.btn-shadow-success { + background: #0ad6bc; } + +/* vendor */ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; } + +body { + margin: 0; } + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; } + +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; } + +audio:not([controls]) { + display: none; + height: 0; } + +[hidden], +template { + display: none; } + +a { + background-color: transparent; } + +a:active, +a:hover { + outline: 0; } + +abbr[title] { + border-bottom: 1px dotted; } + +b, +strong { + font-weight: bold; } + +dfn { + font-style: italic; } + +h1 { + margin: .67em 0; + font-size: 2em; } + +mark { + color: #000; + background: #ff0; } + +small { + font-size: 80%; } + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; } + +sup { + top: -.5em; } + +sub { + bottom: -.25em; } + +img { + border: 0; } + +svg:not(:root) { + overflow: hidden; } + +figure { + margin: 1em 40px; } + +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; } + +pre { + overflow: auto; } + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; } + +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; } + +button { + overflow: visible; } + +button, +select { + text-transform: none; } + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; } + +button[disabled], +html input[disabled] { + cursor: default; } + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; } + +input { + line-height: normal; } + +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; } + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; } + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; } + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; } + +legend { + padding: 0; + border: 0; } + +textarea { + overflow: auto; } + +optgroup { + font-weight: bold; } + +table { + border-spacing: 0; + border-collapse: collapse; } + +td, +th { + padding: 0; } + +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; } + + a, + a:visited { + text-decoration: underline; } + + a[href]:after { + content: " (" attr(href) ")"; } + + abbr[title]:after { + content: " (" attr(title) ")"; } + + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; } + + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; } + + thead { + display: table-header-group; } + + tr, + img { + page-break-inside: avoid; } + + img { + max-width: 100% !important; } + + p, + h2, + h3 { + orphans: 3; + widows: 3; } + + h2, + h3 { + page-break-after: avoid; } + + .navbar { + display: none; } + + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; } + + .label { + border: 1px solid #000; } + + .table { + border-collapse: collapse !important; } + + .table td, + .table th { + background-color: #fff !important; } + + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; } } +@font-face { + font-family: 'Glyphicons Halflings'; + src: url("../../fonts/glyphicons-halflings-regular.eot"); + src: url("../../fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../../fonts/glyphicons-halflings-regular.woff2") format("woff2"), url("../../fonts/glyphicons-halflings-regular.woff") format("woff"), url("../../fonts/glyphicons-halflings-regular.ttf") format("truetype"), url("../../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg"); } +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +.glyphicon-asterisk:before { + content: "\002a"; } + +.glyphicon-plus:before { + content: "\002b"; } + +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; } + +.glyphicon-minus:before { + content: "\2212"; } + +.glyphicon-cloud:before { + content: "\2601"; } + +.glyphicon-envelope:before { + content: "\2709"; } + +.glyphicon-pencil:before { + content: "\270f"; } + +.glyphicon-glass:before { + content: "\e001"; } + +.glyphicon-music:before { + content: "\e002"; } + +.glyphicon-search:before { + content: "\e003"; } + +.glyphicon-heart:before { + content: "\e005"; } + +.glyphicon-star:before { + content: "\e006"; } + +.glyphicon-star-empty:before { + content: "\e007"; } + +.glyphicon-user:before { + content: "\e008"; } + +.glyphicon-film:before { + content: "\e009"; } + +.glyphicon-th-large:before { + content: "\e010"; } + +.glyphicon-th:before { + content: "\e011"; } + +.glyphicon-th-list:before { + content: "\e012"; } + +.glyphicon-ok:before { + content: "\e013"; } + +.glyphicon-remove:before { + content: "\e014"; } + +.glyphicon-zoom-in:before { + content: "\e015"; } + +.glyphicon-zoom-out:before { + content: "\e016"; } + +.glyphicon-off:before { + content: "\e017"; } + +.glyphicon-signal:before { + content: "\e018"; } + +.glyphicon-cog:before { + content: "\e019"; } + +.glyphicon-trash:before { + content: "\e020"; } + +.glyphicon-home:before { + content: "\e021"; } + +.glyphicon-file:before { + content: "\e022"; } + +.glyphicon-time:before { + content: "\e023"; } + +.glyphicon-road:before { + content: "\e024"; } + +.glyphicon-download-alt:before { + content: "\e025"; } + +.glyphicon-download:before { + content: "\e026"; } + +.glyphicon-upload:before { + content: "\e027"; } + +.glyphicon-inbox:before { + content: "\e028"; } + +.glyphicon-play-circle:before { + content: "\e029"; } + +.glyphicon-repeat:before { + content: "\e030"; } + +.glyphicon-refresh:before { + content: "\e031"; } + +.glyphicon-list-alt:before { + content: "\e032"; } + +.glyphicon-lock:before { + content: "\e033"; } + +.glyphicon-flag:before { + content: "\e034"; } + +.glyphicon-headphones:before { + content: "\e035"; } + +.glyphicon-volume-off:before { + content: "\e036"; } + +.glyphicon-volume-down:before { + content: "\e037"; } + +.glyphicon-volume-up:before { + content: "\e038"; } + +.glyphicon-qrcode:before { + content: "\e039"; } + +.glyphicon-barcode:before { + content: "\e040"; } + +.glyphicon-tag:before { + content: "\e041"; } + +.glyphicon-tags:before { + content: "\e042"; } + +.glyphicon-book:before { + content: "\e043"; } + +.glyphicon-bookmark:before { + content: "\e044"; } + +.glyphicon-print:before { + content: "\e045"; } + +.glyphicon-camera:before { + content: "\e046"; } + +.glyphicon-font:before { + content: "\e047"; } + +.glyphicon-bold:before { + content: "\e048"; } + +.glyphicon-italic:before { + content: "\e049"; } + +.glyphicon-text-height:before { + content: "\e050"; } + +.glyphicon-text-width:before { + content: "\e051"; } + +.glyphicon-align-left:before { + content: "\e052"; } + +.glyphicon-align-center:before { + content: "\e053"; } + +.glyphicon-align-right:before { + content: "\e054"; } + +.glyphicon-align-justify:before { + content: "\e055"; } + +.glyphicon-list:before { + content: "\e056"; } + +.glyphicon-indent-left:before { + content: "\e057"; } + +.glyphicon-indent-right:before { + content: "\e058"; } + +.glyphicon-facetime-video:before { + content: "\e059"; } + +.glyphicon-picture:before { + content: "\e060"; } + +.glyphicon-map-marker:before { + content: "\e062"; } + +.glyphicon-adjust:before { + content: "\e063"; } + +.glyphicon-tint:before { + content: "\e064"; } + +.glyphicon-edit:before { + content: "\e065"; } + +.glyphicon-share:before { + content: "\e066"; } + +.glyphicon-check:before { + content: "\e067"; } + +.glyphicon-move:before { + content: "\e068"; } + +.glyphicon-step-backward:before { + content: "\e069"; } + +.glyphicon-fast-backward:before { + content: "\e070"; } + +.glyphicon-backward:before { + content: "\e071"; } + +.glyphicon-play:before { + content: "\e072"; } + +.glyphicon-pause:before { + content: "\e073"; } + +.glyphicon-stop:before { + content: "\e074"; } + +.glyphicon-forward:before { + content: "\e075"; } + +.glyphicon-fast-forward:before { + content: "\e076"; } + +.glyphicon-step-forward:before { + content: "\e077"; } + +.glyphicon-eject:before { + content: "\e078"; } + +.glyphicon-chevron-left:before { + content: "\e079"; } + +.glyphicon-chevron-right:before { + content: "\e080"; } + +.glyphicon-plus-sign:before { + content: "\e081"; } + +.glyphicon-minus-sign:before { + content: "\e082"; } + +.glyphicon-remove-sign:before { + content: "\e083"; } + +.glyphicon-ok-sign:before { + content: "\e084"; } + +.glyphicon-question-sign:before { + content: "\e085"; } + +.glyphicon-info-sign:before { + content: "\e086"; } + +.glyphicon-screenshot:before { + content: "\e087"; } + +.glyphicon-remove-circle:before { + content: "\e088"; } + +.glyphicon-ok-circle:before { + content: "\e089"; } + +.glyphicon-ban-circle:before { + content: "\e090"; } + +.glyphicon-arrow-left:before { + content: "\e091"; } + +.glyphicon-arrow-right:before { + content: "\e092"; } + +.glyphicon-arrow-up:before { + content: "\e093"; } + +.glyphicon-arrow-down:before { + content: "\e094"; } + +.glyphicon-share-alt:before { + content: "\e095"; } + +.glyphicon-resize-full:before { + content: "\e096"; } + +.glyphicon-resize-small:before { + content: "\e097"; } + +.glyphicon-exclamation-sign:before { + content: "\e101"; } + +.glyphicon-gift:before { + content: "\e102"; } + +.glyphicon-leaf:before { + content: "\e103"; } + +.glyphicon-fire:before { + content: "\e104"; } + +.glyphicon-eye-open:before { + content: "\e105"; } + +.glyphicon-eye-close:before { + content: "\e106"; } + +.glyphicon-warning-sign:before { + content: "\e107"; } + +.glyphicon-plane:before { + content: "\e108"; } + +.glyphicon-calendar:before { + content: "\e109"; } + +.glyphicon-random:before { + content: "\e110"; } + +.glyphicon-comment:before { + content: "\e111"; } + +.glyphicon-magnet:before { + content: "\e112"; } + +.glyphicon-chevron-up:before { + content: "\e113"; } + +.glyphicon-chevron-down:before { + content: "\e114"; } + +.glyphicon-retweet:before { + content: "\e115"; } + +.glyphicon-shopping-cart:before { + content: "\e116"; } + +.glyphicon-folder-close:before { + content: "\e117"; } + +.glyphicon-folder-open:before { + content: "\e118"; } + +.glyphicon-resize-vertical:before { + content: "\e119"; } + +.glyphicon-resize-horizontal:before { + content: "\e120"; } + +.glyphicon-hdd:before { + content: "\e121"; } + +.glyphicon-bullhorn:before { + content: "\e122"; } + +.glyphicon-bell:before { + content: "\e123"; } + +.glyphicon-certificate:before { + content: "\e124"; } + +.glyphicon-thumbs-up:before { + content: "\e125"; } + +.glyphicon-thumbs-down:before { + content: "\e126"; } + +.glyphicon-hand-right:before { + content: "\e127"; } + +.glyphicon-hand-left:before { + content: "\e128"; } + +.glyphicon-hand-up:before { + content: "\e129"; } + +.glyphicon-hand-down:before { + content: "\e130"; } + +.glyphicon-circle-arrow-right:before { + content: "\e131"; } + +.glyphicon-circle-arrow-left:before { + content: "\e132"; } + +.glyphicon-circle-arrow-up:before { + content: "\e133"; } + +.glyphicon-circle-arrow-down:before { + content: "\e134"; } + +.glyphicon-globe:before { + content: "\e135"; } + +.glyphicon-wrench:before { + content: "\e136"; } + +.glyphicon-tasks:before { + content: "\e137"; } + +.glyphicon-filter:before { + content: "\e138"; } + +.glyphicon-briefcase:before { + content: "\e139"; } + +.glyphicon-fullscreen:before { + content: "\e140"; } + +.glyphicon-dashboard:before { + content: "\e141"; } + +.glyphicon-paperclip:before { + content: "\e142"; } + +.glyphicon-heart-empty:before { + content: "\e143"; } + +.glyphicon-link:before { + content: "\e144"; } + +.glyphicon-phone:before { + content: "\e145"; } + +.glyphicon-pushpin:before { + content: "\e146"; } + +.glyphicon-usd:before { + content: "\e148"; } + +.glyphicon-gbp:before { + content: "\e149"; } + +.glyphicon-sort:before { + content: "\e150"; } + +.glyphicon-sort-by-alphabet:before { + content: "\e151"; } + +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; } + +.glyphicon-sort-by-order:before { + content: "\e153"; } + +.glyphicon-sort-by-order-alt:before { + content: "\e154"; } + +.glyphicon-sort-by-attributes:before { + content: "\e155"; } + +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; } + +.glyphicon-unchecked:before { + content: "\e157"; } + +.glyphicon-expand:before { + content: "\e158"; } + +.glyphicon-collapse-down:before { + content: "\e159"; } + +.glyphicon-collapse-up:before { + content: "\e160"; } + +.glyphicon-log-in:before { + content: "\e161"; } + +.glyphicon-flash:before { + content: "\e162"; } + +.glyphicon-log-out:before { + content: "\e163"; } + +.glyphicon-new-window:before { + content: "\e164"; } + +.glyphicon-record:before { + content: "\e165"; } + +.glyphicon-save:before { + content: "\e166"; } + +.glyphicon-open:before { + content: "\e167"; } + +.glyphicon-saved:before { + content: "\e168"; } + +.glyphicon-import:before { + content: "\e169"; } + +.glyphicon-export:before { + content: "\e170"; } + +.glyphicon-send:before { + content: "\e171"; } + +.glyphicon-floppy-disk:before { + content: "\e172"; } + +.glyphicon-floppy-saved:before { + content: "\e173"; } + +.glyphicon-floppy-remove:before { + content: "\e174"; } + +.glyphicon-floppy-save:before { + content: "\e175"; } + +.glyphicon-floppy-open:before { + content: "\e176"; } + +.glyphicon-credit-card:before { + content: "\e177"; } + +.glyphicon-transfer:before { + content: "\e178"; } + +.glyphicon-cutlery:before { + content: "\e179"; } + +.glyphicon-header:before { + content: "\e180"; } + +.glyphicon-compressed:before { + content: "\e181"; } + +.glyphicon-earphone:before { + content: "\e182"; } + +.glyphicon-phone-alt:before { + content: "\e183"; } + +.glyphicon-tower:before { + content: "\e184"; } + +.glyphicon-stats:before { + content: "\e185"; } + +.glyphicon-sd-video:before { + content: "\e186"; } + +.glyphicon-hd-video:before { + content: "\e187"; } + +.glyphicon-subtitles:before { + content: "\e188"; } + +.glyphicon-sound-stereo:before { + content: "\e189"; } + +.glyphicon-sound-dolby:before { + content: "\e190"; } + +.glyphicon-sound-5-1:before { + content: "\e191"; } + +.glyphicon-sound-6-1:before { + content: "\e192"; } + +.glyphicon-sound-7-1:before { + content: "\e193"; } + +.glyphicon-copyright-mark:before { + content: "\e194"; } + +.glyphicon-registration-mark:before { + content: "\e195"; } + +.glyphicon-cloud-download:before { + content: "\e197"; } + +.glyphicon-cloud-upload:before { + content: "\e198"; } + +.glyphicon-tree-conifer:before { + content: "\e199"; } + +.glyphicon-tree-deciduous:before { + content: "\e200"; } + +.glyphicon-cd:before { + content: "\e201"; } + +.glyphicon-save-file:before { + content: "\e202"; } + +.glyphicon-open-file:before { + content: "\e203"; } + +.glyphicon-level-up:before { + content: "\e204"; } + +.glyphicon-copy:before { + content: "\e205"; } + +.glyphicon-paste:before { + content: "\e206"; } + +.glyphicon-alert:before { + content: "\e209"; } + +.glyphicon-equalizer:before { + content: "\e210"; } + +.glyphicon-king:before { + content: "\e211"; } + +.glyphicon-queen:before { + content: "\e212"; } + +.glyphicon-pawn:before { + content: "\e213"; } + +.glyphicon-bishop:before { + content: "\e214"; } + +.glyphicon-knight:before { + content: "\e215"; } + +.glyphicon-baby-formula:before { + content: "\e216"; } + +.glyphicon-tent:before { + content: "\26fa"; } + +.glyphicon-blackboard:before { + content: "\e218"; } + +.glyphicon-bed:before { + content: "\e219"; } + +.glyphicon-apple:before { + content: "\f8ff"; } + +.glyphicon-erase:before { + content: "\e221"; } + +.glyphicon-hourglass:before { + content: "\231b"; } + +.glyphicon-lamp:before { + content: "\e223"; } + +.glyphicon-duplicate:before { + content: "\e224"; } + +.glyphicon-piggy-bank:before { + content: "\e225"; } + +.glyphicon-scissors:before { + content: "\e226"; } + +.glyphicon-bitcoin:before { + content: "\e227"; } + +.glyphicon-btc:before { + content: "\e227"; } + +.glyphicon-xbt:before { + content: "\e227"; } + +.glyphicon-yen:before { + content: "\00a5"; } + +.glyphicon-jpy:before { + content: "\00a5"; } + +.glyphicon-ruble:before { + content: "\20bd"; } + +.glyphicon-rub:before { + content: "\20bd"; } + +.glyphicon-scale:before { + content: "\e230"; } + +.glyphicon-ice-lolly:before { + content: "\e231"; } + +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; } + +.glyphicon-education:before { + content: "\e233"; } + +.glyphicon-option-horizontal:before { + content: "\e234"; } + +.glyphicon-option-vertical:before { + content: "\e235"; } + +.glyphicon-menu-hamburger:before { + content: "\e236"; } + +.glyphicon-modal-window:before { + content: "\e237"; } + +.glyphicon-oil:before { + content: "\e238"; } + +.glyphicon-grain:before { + content: "\e239"; } + +.glyphicon-sunglasses:before { + content: "\e240"; } + +.glyphicon-text-size:before { + content: "\e241"; } + +.glyphicon-text-color:before { + content: "\e242"; } + +.glyphicon-text-background:before { + content: "\e243"; } + +.glyphicon-object-align-top:before { + content: "\e244"; } + +.glyphicon-object-align-bottom:before { + content: "\e245"; } + +.glyphicon-object-align-horizontal:before { + content: "\e246"; } + +.glyphicon-object-align-left:before { + content: "\e247"; } + +.glyphicon-object-align-vertical:before { + content: "\e248"; } + +.glyphicon-object-align-right:before { + content: "\e249"; } + +.glyphicon-triangle-right:before { + content: "\e250"; } + +.glyphicon-triangle-left:before { + content: "\e251"; } + +.glyphicon-triangle-bottom:before { + content: "\e252"; } + +.glyphicon-triangle-top:before { + content: "\e253"; } + +.glyphicon-console:before { + content: "\e254"; } + +.glyphicon-superscript:before { + content: "\e255"; } + +.glyphicon-subscript:before { + content: "\e256"; } + +.glyphicon-menu-left:before { + content: "\e257"; } + +.glyphicon-menu-right:before { + content: "\e258"; } + +.glyphicon-menu-down:before { + content: "\e259"; } + +.glyphicon-menu-up:before { + content: "\e260"; } + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } + +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; } + +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; } + +a { + color: #337ab7; + text-decoration: none; } + +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; } + +a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } + +figure { + margin: 0; } + +img { + vertical-align: middle; } + +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; } + +.img-rounded { + border-radius: 6px; } + +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; } + +.img-circle { + border-radius: 50%; } + +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; } + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; } + +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; } + +[role="button"] { + cursor: pointer; } + +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; } + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; } + +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; } + +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; } + +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; } + +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; } + +h1, +.h1 { + font-size: 36px; } + +h2, +.h2 { + font-size: 30px; } + +h3, +.h3 { + font-size: 24px; } + +h4, +.h4 { + font-size: 18px; } + +h5, +.h5 { + font-size: 14px; } + +h6, +.h6 { + font-size: 12px; } + +p { + margin: 0 0 10px; } + +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; } + +@media (min-width: 768px) { + .lead { + font-size: 21px; } } +small, +.small { + font-size: 85%; } + +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; } + +.text-left { + text-align: left; } + +.text-right { + text-align: right; } + +.text-center { + text-align: center; } + +.text-justify { + text-align: justify; } + +.text-nowrap { + white-space: nowrap; } + +.text-lowercase { + text-transform: lowercase; } + +.text-uppercase { + text-transform: uppercase; } + +.text-capitalize { + text-transform: capitalize; } + +.text-muted { + color: #777; } + +.text-primary { + color: #337ab7; } + +a.text-primary:hover, +a.text-primary:focus { + color: #286090; } + +.text-success { + color: #3c763d; } + +a.text-success:hover, +a.text-success:focus { + color: #2b542c; } + +.text-info { + color: #31708f; } + +a.text-info:hover, +a.text-info:focus { + color: #245269; } + +.text-warning { + color: #8a6d3b; } + +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; } + +.text-danger { + color: #a94442; } + +a.text-danger:hover, +a.text-danger:focus { + color: #843534; } + +.bg-primary { + color: #fff; + background-color: #337ab7; } + +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; } + +.bg-success { + background-color: #dff0d8; } + +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; } + +.bg-info { + background-color: #d9edf7; } + +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; } + +.bg-warning { + background-color: #fcf8e3; } + +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; } + +.bg-danger { + background-color: #f2dede; } + +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; } + +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; } + +ul, +ol { + margin-top: 0; + margin-bottom: 10px; } + +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; } + +.list-unstyled { + padding-left: 0; + list-style: none; } + +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; } + +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; } + +dl { + margin-top: 0; + margin-bottom: 20px; } + +dt, +dd { + line-height: 1.42857143; } + +dt { + font-weight: bold; } + +dd { + margin-left: 0; } + +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; } + + .dl-horizontal dd { + margin-left: 180px; } } +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; } + +.initialism { + font-size: 90%; + text-transform: uppercase; } + +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; } + +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; } + +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; } + +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; } + +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; } + +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; } + +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; } + +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; } + +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } + +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; } + +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } + +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; } + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; } + +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; } + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; } + +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; } + +@media (min-width: 768px) { + .container { + width: 750px; } } +@media (min-width: 992px) { + .container { + width: 970px; } } +@media (min-width: 1200px) { + .container { + width: 1170px; } } +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; } + +.row { + margin-right: -15px; + margin-left: -15px; } + +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; } + +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; } + +.col-xs-12 { + width: 100%; } + +.col-xs-11 { + width: 91.66666667%; } + +.col-xs-10 { + width: 83.33333333%; } + +.col-xs-9 { + width: 75%; } + +.col-xs-8 { + width: 66.66666667%; } + +.col-xs-7 { + width: 58.33333333%; } + +.col-xs-6 { + width: 50%; } + +.col-xs-5 { + width: 41.66666667%; } + +.col-xs-4 { + width: 33.33333333%; } + +.col-xs-3 { + width: 25%; } + +.col-xs-2 { + width: 16.66666667%; } + +.col-xs-1 { + width: 8.33333333%; } + +.col-xs-pull-12 { + right: 100%; } + +.col-xs-pull-11 { + right: 91.66666667%; } + +.col-xs-pull-10 { + right: 83.33333333%; } + +.col-xs-pull-9 { + right: 75%; } + +.col-xs-pull-8 { + right: 66.66666667%; } + +.col-xs-pull-7 { + right: 58.33333333%; } + +.col-xs-pull-6 { + right: 50%; } + +.col-xs-pull-5 { + right: 41.66666667%; } + +.col-xs-pull-4 { + right: 33.33333333%; } + +.col-xs-pull-3 { + right: 25%; } + +.col-xs-pull-2 { + right: 16.66666667%; } + +.col-xs-pull-1 { + right: 8.33333333%; } + +.col-xs-pull-0 { + right: auto; } + +.col-xs-push-12 { + left: 100%; } + +.col-xs-push-11 { + left: 91.66666667%; } + +.col-xs-push-10 { + left: 83.33333333%; } + +.col-xs-push-9 { + left: 75%; } + +.col-xs-push-8 { + left: 66.66666667%; } + +.col-xs-push-7 { + left: 58.33333333%; } + +.col-xs-push-6 { + left: 50%; } + +.col-xs-push-5 { + left: 41.66666667%; } + +.col-xs-push-4 { + left: 33.33333333%; } + +.col-xs-push-3 { + left: 25%; } + +.col-xs-push-2 { + left: 16.66666667%; } + +.col-xs-push-1 { + left: 8.33333333%; } + +.col-xs-push-0 { + left: auto; } + +.col-xs-offset-12 { + margin-left: 100%; } + +.col-xs-offset-11 { + margin-left: 91.66666667%; } + +.col-xs-offset-10 { + margin-left: 83.33333333%; } + +.col-xs-offset-9 { + margin-left: 75%; } + +.col-xs-offset-8 { + margin-left: 66.66666667%; } + +.col-xs-offset-7 { + margin-left: 58.33333333%; } + +.col-xs-offset-6 { + margin-left: 50%; } + +.col-xs-offset-5 { + margin-left: 41.66666667%; } + +.col-xs-offset-4 { + margin-left: 33.33333333%; } + +.col-xs-offset-3 { + margin-left: 25%; } + +.col-xs-offset-2 { + margin-left: 16.66666667%; } + +.col-xs-offset-1 { + margin-left: 8.33333333%; } + +.col-xs-offset-0 { + margin-left: 0; } + +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; } + + .col-sm-12 { + width: 100%; } + + .col-sm-11 { + width: 91.66666667%; } + + .col-sm-10 { + width: 83.33333333%; } + + .col-sm-9 { + width: 75%; } + + .col-sm-8 { + width: 66.66666667%; } + + .col-sm-7 { + width: 58.33333333%; } + + .col-sm-6 { + width: 50%; } + + .col-sm-5 { + width: 41.66666667%; } + + .col-sm-4 { + width: 33.33333333%; } + + .col-sm-3 { + width: 25%; } + + .col-sm-2 { + width: 16.66666667%; } + + .col-sm-1 { + width: 8.33333333%; } + + .col-sm-pull-12 { + right: 100%; } + + .col-sm-pull-11 { + right: 91.66666667%; } + + .col-sm-pull-10 { + right: 83.33333333%; } + + .col-sm-pull-9 { + right: 75%; } + + .col-sm-pull-8 { + right: 66.66666667%; } + + .col-sm-pull-7 { + right: 58.33333333%; } + + .col-sm-pull-6 { + right: 50%; } + + .col-sm-pull-5 { + right: 41.66666667%; } + + .col-sm-pull-4 { + right: 33.33333333%; } + + .col-sm-pull-3 { + right: 25%; } + + .col-sm-pull-2 { + right: 16.66666667%; } + + .col-sm-pull-1 { + right: 8.33333333%; } + + .col-sm-pull-0 { + right: auto; } + + .col-sm-push-12 { + left: 100%; } + + .col-sm-push-11 { + left: 91.66666667%; } + + .col-sm-push-10 { + left: 83.33333333%; } + + .col-sm-push-9 { + left: 75%; } + + .col-sm-push-8 { + left: 66.66666667%; } + + .col-sm-push-7 { + left: 58.33333333%; } + + .col-sm-push-6 { + left: 50%; } + + .col-sm-push-5 { + left: 41.66666667%; } + + .col-sm-push-4 { + left: 33.33333333%; } + + .col-sm-push-3 { + left: 25%; } + + .col-sm-push-2 { + left: 16.66666667%; } + + .col-sm-push-1 { + left: 8.33333333%; } + + .col-sm-push-0 { + left: auto; } + + .col-sm-offset-12 { + margin-left: 100%; } + + .col-sm-offset-11 { + margin-left: 91.66666667%; } + + .col-sm-offset-10 { + margin-left: 83.33333333%; } + + .col-sm-offset-9 { + margin-left: 75%; } + + .col-sm-offset-8 { + margin-left: 66.66666667%; } + + .col-sm-offset-7 { + margin-left: 58.33333333%; } + + .col-sm-offset-6 { + margin-left: 50%; } + + .col-sm-offset-5 { + margin-left: 41.66666667%; } + + .col-sm-offset-4 { + margin-left: 33.33333333%; } + + .col-sm-offset-3 { + margin-left: 25%; } + + .col-sm-offset-2 { + margin-left: 16.66666667%; } + + .col-sm-offset-1 { + margin-left: 8.33333333%; } + + .col-sm-offset-0 { + margin-left: 0; } } +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; } + + .col-md-12 { + width: 100%; } + + .col-md-11 { + width: 91.66666667%; } + + .col-md-10 { + width: 83.33333333%; } + + .col-md-9 { + width: 75%; } + + .col-md-8 { + width: 66.66666667%; } + + .col-md-7 { + width: 58.33333333%; } + + .col-md-6 { + width: 50%; } + + .col-md-5 { + width: 41.66666667%; } + + .col-md-4 { + width: 33.33333333%; } + + .col-md-3 { + width: 25%; } + + .col-md-2 { + width: 16.66666667%; } + + .col-md-1 { + width: 8.33333333%; } + + .col-md-pull-12 { + right: 100%; } + + .col-md-pull-11 { + right: 91.66666667%; } + + .col-md-pull-10 { + right: 83.33333333%; } + + .col-md-pull-9 { + right: 75%; } + + .col-md-pull-8 { + right: 66.66666667%; } + + .col-md-pull-7 { + right: 58.33333333%; } + + .col-md-pull-6 { + right: 50%; } + + .col-md-pull-5 { + right: 41.66666667%; } + + .col-md-pull-4 { + right: 33.33333333%; } + + .col-md-pull-3 { + right: 25%; } + + .col-md-pull-2 { + right: 16.66666667%; } + + .col-md-pull-1 { + right: 8.33333333%; } + + .col-md-pull-0 { + right: auto; } + + .col-md-push-12 { + left: 100%; } + + .col-md-push-11 { + left: 91.66666667%; } + + .col-md-push-10 { + left: 83.33333333%; } + + .col-md-push-9 { + left: 75%; } + + .col-md-push-8 { + left: 66.66666667%; } + + .col-md-push-7 { + left: 58.33333333%; } + + .col-md-push-6 { + left: 50%; } + + .col-md-push-5 { + left: 41.66666667%; } + + .col-md-push-4 { + left: 33.33333333%; } + + .col-md-push-3 { + left: 25%; } + + .col-md-push-2 { + left: 16.66666667%; } + + .col-md-push-1 { + left: 8.33333333%; } + + .col-md-push-0 { + left: auto; } + + .col-md-offset-12 { + margin-left: 100%; } + + .col-md-offset-11 { + margin-left: 91.66666667%; } + + .col-md-offset-10 { + margin-left: 83.33333333%; } + + .col-md-offset-9 { + margin-left: 75%; } + + .col-md-offset-8 { + margin-left: 66.66666667%; } + + .col-md-offset-7 { + margin-left: 58.33333333%; } + + .col-md-offset-6 { + margin-left: 50%; } + + .col-md-offset-5 { + margin-left: 41.66666667%; } + + .col-md-offset-4 { + margin-left: 33.33333333%; } + + .col-md-offset-3 { + margin-left: 25%; } + + .col-md-offset-2 { + margin-left: 16.66666667%; } + + .col-md-offset-1 { + margin-left: 8.33333333%; } + + .col-md-offset-0 { + margin-left: 0; } } +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; } + + .col-lg-12 { + width: 100%; } + + .col-lg-11 { + width: 91.66666667%; } + + .col-lg-10 { + width: 83.33333333%; } + + .col-lg-9 { + width: 75%; } + + .col-lg-8 { + width: 66.66666667%; } + + .col-lg-7 { + width: 58.33333333%; } + + .col-lg-6 { + width: 50%; } + + .col-lg-5 { + width: 41.66666667%; } + + .col-lg-4 { + width: 33.33333333%; } + + .col-lg-3 { + width: 25%; } + + .col-lg-2 { + width: 16.66666667%; } + + .col-lg-1 { + width: 8.33333333%; } + + .col-lg-pull-12 { + right: 100%; } + + .col-lg-pull-11 { + right: 91.66666667%; } + + .col-lg-pull-10 { + right: 83.33333333%; } + + .col-lg-pull-9 { + right: 75%; } + + .col-lg-pull-8 { + right: 66.66666667%; } + + .col-lg-pull-7 { + right: 58.33333333%; } + + .col-lg-pull-6 { + right: 50%; } + + .col-lg-pull-5 { + right: 41.66666667%; } + + .col-lg-pull-4 { + right: 33.33333333%; } + + .col-lg-pull-3 { + right: 25%; } + + .col-lg-pull-2 { + right: 16.66666667%; } + + .col-lg-pull-1 { + right: 8.33333333%; } + + .col-lg-pull-0 { + right: auto; } + + .col-lg-push-12 { + left: 100%; } + + .col-lg-push-11 { + left: 91.66666667%; } + + .col-lg-push-10 { + left: 83.33333333%; } + + .col-lg-push-9 { + left: 75%; } + + .col-lg-push-8 { + left: 66.66666667%; } + + .col-lg-push-7 { + left: 58.33333333%; } + + .col-lg-push-6 { + left: 50%; } + + .col-lg-push-5 { + left: 41.66666667%; } + + .col-lg-push-4 { + left: 33.33333333%; } + + .col-lg-push-3 { + left: 25%; } + + .col-lg-push-2 { + left: 16.66666667%; } + + .col-lg-push-1 { + left: 8.33333333%; } + + .col-lg-push-0 { + left: auto; } + + .col-lg-offset-12 { + margin-left: 100%; } + + .col-lg-offset-11 { + margin-left: 91.66666667%; } + + .col-lg-offset-10 { + margin-left: 83.33333333%; } + + .col-lg-offset-9 { + margin-left: 75%; } + + .col-lg-offset-8 { + margin-left: 66.66666667%; } + + .col-lg-offset-7 { + margin-left: 58.33333333%; } + + .col-lg-offset-6 { + margin-left: 50%; } + + .col-lg-offset-5 { + margin-left: 41.66666667%; } + + .col-lg-offset-4 { + margin-left: 33.33333333%; } + + .col-lg-offset-3 { + margin-left: 25%; } + + .col-lg-offset-2 { + margin-left: 16.66666667%; } + + .col-lg-offset-1 { + margin-left: 8.33333333%; } + + .col-lg-offset-0 { + margin-left: 0; } } +table { + background-color: transparent; } + +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; } + +th { + text-align: left; } + +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; } + +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; } + +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; } + +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; } + +.table > tbody + tbody { + border-top: 2px solid #ddd; } + +.table .table { + background-color: #fff; } + +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; } + +.table-bordered { + border: 1px solid #ddd; } + +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; } + +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; } + +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; } + +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; } + +table col[class*="col-"] { + position: static; + display: table-column; + float: none; } + +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; } + +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; } + +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; } + +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; } + +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; } + +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; } + +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; } + +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; } + +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; } + +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; } + +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; } + +.table-responsive { + min-height: .01%; + overflow-x: auto; } + +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; } + + .table-responsive > .table { + margin-bottom: 0; } + + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; } + + .table-responsive > .table-bordered { + border: 0; } + + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; } + + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; } + + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; } } +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; } + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; } + +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; } + +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; } + +input[type="file"] { + display: block; } + +input[type="range"] { + display: block; + width: 100%; } + +select[multiple], +select[size] { + height: auto; } + +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } + +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; } + +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } + +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); } + +.form-control::-moz-placeholder { + color: #999; + opacity: 1; } + +.form-control:-ms-input-placeholder { + color: #999; } + +.form-control::-webkit-input-placeholder { + color: #999; } + +.form-control::-ms-expand { + background-color: transparent; + border: 0; } + +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; } + +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; } + +textarea.form-control { + height: auto; } + +input[type="search"] { + -webkit-appearance: none; } + +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; } + + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; } + + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; } } +.form-group { + margin-bottom: 15px; } + +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; } + +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; } + +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; } + +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; } + +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; } + +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; } + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; } + +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; } + +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; } + +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; } + +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; } + +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + +select.input-sm { + height: 30px; + line-height: 30px; } + +textarea.input-sm, +select[multiple].input-sm { + height: auto; } + +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; } + +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; } + +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; } + +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; } + +select.input-lg { + height: 46px; + line-height: 46px; } + +textarea.input-lg, +select[multiple].input-lg { + height: auto; } + +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; } + +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; } + +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; } + +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; } + +.has-feedback { + position: relative; } + +.has-feedback .form-control { + padding-right: 42.5px; } + +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; } + +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; } + +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; } + +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; } + +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } + +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; } + +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; } + +.has-success .form-control-feedback { + color: #3c763d; } + +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; } + +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } + +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; } + +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; } + +.has-warning .form-control-feedback { + color: #8a6d3b; } + +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; } + +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } + +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; } + +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; } + +.has-error .form-control-feedback { + color: #a94442; } + +.has-feedback label ~ .form-control-feedback { + top: 25px; } + +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; } + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; } + +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; } + + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; } + + .form-inline .form-control-static { + display: inline-block; } + + .form-inline .input-group { + display: inline-table; + vertical-align: middle; } + + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; } + + .form-inline .input-group > .form-control { + width: 100%; } + + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; } + + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; } + + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; } + + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; } + + .form-inline .has-feedback .form-control-feedback { + top: 0; } } +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; } + +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; } + +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; } + +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; } } +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; } + +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; } } +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; } } +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; } + +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } + +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; } + +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } + +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; } + +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; } + +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; } + +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; } + +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; } + +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; } + +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; } + +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; } + +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; } + +.btn-default .badge { + color: #fff; + background-color: #333; } + +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; } + +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; } + +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; } + +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; } + +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; } + +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; } + +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #337ab7; + border-color: #2e6da4; } + +.btn-primary .badge { + color: #337ab7; + background-color: #fff; } + +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; } + +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; } + +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; } + +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; } + +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; } + +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; } + +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus { + background-color: #5cb85c; + border-color: #4cae4c; } + +.btn-success .badge { + color: #5cb85c; + background-color: #fff; } + +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; } + +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; } + +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; } + +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; } + +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; } + +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; } + +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #5bc0de; + border-color: #46b8da; } + +.btn-info .badge { + color: #5bc0de; + background-color: #fff; } + +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; } + +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; } + +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; } + +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; } + +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; } + +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; } + +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus { + background-color: #f0ad4e; + border-color: #eea236; } + +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; } + +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; } + +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; } + +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; } + +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; } + +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; } + +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; } + +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: #d43f3a; } + +.btn-danger .badge { + color: #d9534f; + background-color: #fff; } + +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; } + +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; } + +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; } + +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; } + +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; } + +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; } + +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + +.btn-block { + display: block; + width: 100%; } + +.btn-block + .btn-block { + margin-top: 5px; } + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; } + +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; } + +.fade.in { + opacity: 1; } + +.collapse { + display: none; } + +.collapse.in { + display: block; } + +tr.collapse.in { + display: table-row; } + +tbody.collapse.in { + display: table-row-group; } + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; } + +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; } + +.dropup, +.dropdown { + position: relative; } + +.dropdown-toggle:focus { + outline: 0; } + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); } + +.dropdown-menu.pull-right { + right: 0; + left: auto; } + +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; } + +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; } + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; } + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; } + +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; } + +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } + +.open > .dropdown-menu { + display: block; } + +.open > a { + outline: 0; } + +.dropdown-menu-right { + right: 0; + left: auto; } + +.dropdown-menu-left { + right: auto; + left: 0; } + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; } + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; } + +.pull-right > .dropdown-menu { + right: 0; + left: auto; } + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; } + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; } + +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; } + + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; } } +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; } + +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; } + +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; } + +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; } + +.btn-toolbar { + margin-left: -5px; } + +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; } + +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; } + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; } + +.btn-group > .btn:first-child { + margin-left: 0; } + +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + +.btn-group > .btn-group { + float: left; } + +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; } + +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; } + +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; } + +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; } + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } + +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; } + +.btn .caret { + margin-left: 0; } + +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; } + +.dropup .btn-lg .caret { + border-width: 0 5px 5px; } + +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; } + +.btn-group-vertical > .btn-group > .btn { + float: none; } + +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; } + +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; } + +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; } + +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; } + +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; } + +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; } + +.btn-group-justified > .btn-group .btn { + width: 100%; } + +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; } + +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; } + +.input-group { + position: relative; + display: table; + border-collapse: separate; } + +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; } + +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; } + +.input-group .form-control:focus { + z-index: 3; } + +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; } + +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; } + +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; } + +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; } + +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; } + +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; } + +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; } + +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; } + +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; } + +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; } + +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; } + +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; } + +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + +.input-group-addon:first-child { + border-right: 0; } + +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + +.input-group-addon:last-child { + border-left: 0; } + +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; } + +.input-group-btn > .btn { + position: relative; } + +.input-group-btn > .btn + .btn { + margin-left: -1px; } + +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; } + +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; } + +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; } + +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; } + +.nav > li { + position: relative; + display: block; } + +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; } + +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; } + +.nav > li.disabled > a { + color: #777; } + +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; } + +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; } + +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; } + +.nav > li > a > img { + max-width: none; } + +.nav-tabs { + border-bottom: 1px solid #ddd; } + +.nav-tabs > li { + float: left; + margin-bottom: -1px; } + +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; } + +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; } + +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; } + +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; } + +.nav-tabs.nav-justified > li { + float: none; } + +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; } + +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; } + +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; } + + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; } } +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; } + +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; } + +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; } + + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; } } +.nav-pills > li { + float: left; } + +.nav-pills > li > a { + border-radius: 4px; } + +.nav-pills > li + li { + margin-left: 2px; } + +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; } + +.nav-stacked > li { + float: none; } + +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; } + +.nav-justified { + width: 100%; } + +.nav-justified > li { + float: none; } + +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; } + +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; } + +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; } + + .nav-justified > li > a { + margin-bottom: 0; } } +.nav-tabs-justified { + border-bottom: 0; } + +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; } + +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; } + +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; } + + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; } } +.tab-content > .tab-pane { + display: none; } + +.tab-content > .active { + display: block; } + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; } + +@media (min-width: 768px) { + .navbar { + border-radius: 4px; } } +@media (min-width: 768px) { + .navbar-header { + float: left; } } +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); } + +.navbar-collapse.in { + overflow-y: auto; } + +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; } + + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; } + + .navbar-collapse.in { + overflow-y: visible; } + + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; } } +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; } + +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; } } +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; } + +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; } } +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; } + +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; } } +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; } + +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; } } +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; } + +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; } + +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; } + +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; } + +.navbar-brand > img { + display: block; } + +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; } } +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; } + +.navbar-toggle:focus { + outline: 0; } + +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; } + +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; } + +@media (min-width: 768px) { + .navbar-toggle { + display: none; } } +.navbar-nav { + margin: 7.5px -15px; } + +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; } + +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; } + + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; } + + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; } + + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; } } +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; } + + .navbar-nav > li { + float: left; } + + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; } } +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); } + +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; } + + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; } + + .navbar-form .form-control-static { + display: inline-block; } + + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; } + + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; } + + .navbar-form .input-group > .form-control { + width: 100%; } + + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; } + + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; } + + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; } + + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; } + + .navbar-form .has-feedback .form-control-feedback { + top: 0; } } +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; } + + .navbar-form .form-group:last-child { + margin-bottom: 0; } } +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; } } +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; } + +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; } + +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; } + +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; } + +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; } } +@media (min-width: 768px) { + .navbar-left { + float: left !important; } + + .navbar-right { + float: right !important; + margin-right: -15px; } + + .navbar-right ~ .navbar-right { + margin-right: 0; } } +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; } + +.navbar-default .navbar-brand { + color: #777; } + +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; } + +.navbar-default .navbar-text { + color: #777; } + +.navbar-default .navbar-nav > li > a { + color: #777; } + +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; } + +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; } + +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; } + +.navbar-default .navbar-toggle { + border-color: #ddd; } + +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; } + +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; } + +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; } + +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; } + +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; } + + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; } + + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; } + + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; } } +.navbar-default .navbar-link { + color: #777; } + +.navbar-default .navbar-link:hover { + color: #333; } + +.navbar-default .btn-link { + color: #777; } + +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; } + +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; } + +.navbar-inverse { + background-color: #222; + border-color: #080808; } + +.navbar-inverse .navbar-brand { + color: #9d9d9d; } + +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; } + +.navbar-inverse .navbar-text { + color: #9d9d9d; } + +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; } + +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; } + +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; } + +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; } + +.navbar-inverse .navbar-toggle { + border-color: #333; } + +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; } + +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; } + +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; } + +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; } + +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; } + + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; } + + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; } + + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; } + + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; } + + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; } } +.navbar-inverse .navbar-link { + color: #9d9d9d; } + +.navbar-inverse .navbar-link:hover { + color: #fff; } + +.navbar-inverse .btn-link { + color: #9d9d9d; } + +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; } + +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; } + +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; } + +.breadcrumb > li { + display: inline-block; } + +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; } + +.breadcrumb > .active { + color: #777; } + +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; } + +.pagination > li { + display: inline; } + +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; } + +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; } + +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; } + +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eee; + border-color: #ddd; } + +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; } + +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; } + +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; } + +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; } + +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; } + +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; } + +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; } + +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; } + +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; } + +.pager li { + display: inline; } + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; } + +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; } + +.pager .next > a, +.pager .next > span { + float: right; } + +.pager .previous > a, +.pager .previous > span { + float: left; } + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; } + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; } + +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; } + +.label:empty { + display: none; } + +.btn .label { + position: relative; + top: -1px; } + +.label-default { + background-color: #777; } + +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; } + +.label-primary { + background-color: #337ab7; } + +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; } + +.label-success { + background-color: #5cb85c; } + +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; } + +.label-info { + background-color: #5bc0de; } + +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; } + +.label-warning { + background-color: #f0ad4e; } + +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; } + +.label-danger { + background-color: #d9534f; } + +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; } + +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; } + +.badge:empty { + display: none; } + +.btn .badge { + position: relative; + top: -1px; } + +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; } + +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; } + +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; } + +.list-group-item > .badge { + float: right; } + +.list-group-item > .badge + .badge { + margin-right: 5px; } + +.nav-pills > li > a > .badge { + margin-left: 3px; } + +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; } + +.jumbotron h1, +.jumbotron .h1 { + color: inherit; } + +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; } + +.jumbotron > hr { + border-top-color: #d5d5d5; } + +.container .jumbotron, +.container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; } + +.jumbotron .container { + max-width: 100%; } + +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; } + + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; } + + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; } } +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; } + +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; } + +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; } + +.thumbnail .caption { + padding: 9px; + color: #333; } + +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; } + +.alert h4 { + margin-top: 0; + color: inherit; } + +.alert .alert-link { + font-weight: bold; } + +.alert > p, +.alert > ul { + margin-bottom: 0; } + +.alert > p + p { + margin-top: 5px; } + +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; } + +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; } + +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; } + +.alert-success hr { + border-top-color: #c9e2b3; } + +.alert-success .alert-link { + color: #2b542c; } + +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; } + +.alert-info hr { + border-top-color: #a6e1ec; } + +.alert-info .alert-link { + color: #245269; } + +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; } + +.alert-warning hr { + border-top-color: #f7e1b5; } + +.alert-warning .alert-link { + color: #66512c; } + +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; } + +.alert-danger hr { + border-top-color: #e4b9c0; } + +.alert-danger .alert-link { + color: #843534; } + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; } + to { + background-position: 0 0; } } +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; } + to { + background-position: 0 0; } } +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; } + to { + background-position: 0 0; } } +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } + +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; } + +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; } + +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; } + +.progress-bar-success { + background-color: #5cb85c; } + +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.progress-bar-info { + background-color: #5bc0de; } + +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.progress-bar-warning { + background-color: #f0ad4e; } + +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.progress-bar-danger { + background-color: #d9534f; } + +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.media { + margin-top: 15px; } + +.media:first-child { + margin-top: 0; } + +.media, +.media-body { + overflow: hidden; + zoom: 1; } + +.media-body { + width: 10000px; } + +.media-object { + display: block; } + +.media-object.img-thumbnail { + max-width: none; } + +.media-right, +.media > .pull-right { + padding-left: 10px; } + +.media-left, +.media > .pull-left { + padding-right: 10px; } + +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; } + +.media-middle { + vertical-align: middle; } + +.media-bottom { + vertical-align: bottom; } + +.media-heading { + margin-top: 0; + margin-bottom: 5px; } + +.media-list { + padding-left: 0; + list-style: none; } + +.list-group { + padding-left: 0; + margin-bottom: 20px; } + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; } + +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; } + +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; } + +a.list-group-item, +button.list-group-item { + color: #555; } + +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; } + +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; } + +button.list-group-item { + width: 100%; + text-align: left; } + +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; } + +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; } + +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; } + +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; } + +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; } + +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; } + +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; } + +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; } + +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; } + +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; } + +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; } + +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; } + +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; } + +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; } + +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; } + +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; } + +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; } + +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; } + +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; } + +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; } + +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; } + +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; } + +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; } + +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; } + +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; } + +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; } + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; } + +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; } + +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } + +.panel-body { + padding: 15px; } + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; } + +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; } + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; } + +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; } + +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; } + +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; } + +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; } + +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; } + +.list-group + .panel-footer { + border-top-width: 0; } + +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; } + +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; } + +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; } + +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; } + +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; } + +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; } + +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; } + +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; } + +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; } + +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; } + +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; } + +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; } + +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; } + +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; } + +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; } + +.panel > .table-responsive { + margin-bottom: 0; + border: 0; } + +.panel-group { + margin-bottom: 20px; } + +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; } + +.panel-group .panel + .panel { + margin-top: 5px; } + +.panel-group .panel-heading { + border-bottom: 0; } + +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; } + +.panel-group .panel-footer { + border-top: 0; } + +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; } + +.panel-default { + border-color: #ddd; } + +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; } + +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; } + +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; } + +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; } + +.panel-primary { + border-color: #337ab7; } + +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; } + +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; } + +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; } + +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; } + +.panel-success { + border-color: #d6e9c6; } + +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; } + +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; } + +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; } + +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; } + +.panel-info { + border-color: #bce8f1; } + +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; } + +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; } + +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; } + +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; } + +.panel-warning { + border-color: #faebcc; } + +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; } + +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; } + +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; } + +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; } + +.panel-danger { + border-color: #ebccd1; } + +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; } + +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; } + +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; } + +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; } + +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; } + +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; } + +.embed-responsive-16by9 { + padding-bottom: 56.25%; } + +.embed-responsive-4by3 { + padding-bottom: 75%; } + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); } + +.well-lg { + padding: 24px; + border-radius: 6px; } + +.well-sm { + padding: 9px; + border-radius: 3px; } + +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; } + +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; } + +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; } + +.modal-open { + overflow: hidden; } + +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; } + +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); } + +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); } + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; } + +.modal-dialog { + position: relative; + width: auto; + margin: 10px; } + +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); } + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; } + +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; } + +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; } + +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; } + +.modal-header .close { + margin-top: -2px; } + +.modal-title { + margin: 0; + line-height: 1.42857143; } + +.modal-body { + position: relative; + padding: 15px; } + +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; } + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; } + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; } + +.modal-footer .btn-block + .btn-block { + margin-left: 0; } + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; } + +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; } + + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } + + .modal-sm { + width: 300px; } } +@media (min-width: 992px) { + .modal-lg { + width: 900px; } } +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + line-break: auto; } + +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; } + +.tooltip.top { + padding: 5px 0; + margin-top: -3px; } + +.tooltip.right { + padding: 0 5px; + margin-left: 3px; } + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; } + +.tooltip.left { + padding: 0 5px; + margin-left: -3px; } + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; } + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; } + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; } + +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; } + +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; } + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; } + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; } + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } + +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } + +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + line-break: auto; } + +.popover.top { + margin-top: -10px; } + +.popover.right { + margin-left: 10px; } + +.popover.bottom { + margin-top: 10px; } + +.popover.left { + margin-left: -10px; } + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; } + +.popover-content { + padding: 9px 14px; } + +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; } + +.popover > .arrow { + border-width: 11px; } + +.popover > .arrow:after { + content: ""; + border-width: 10px; } + +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; } + +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; } + +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; } + +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; } + +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); } + +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; } + +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); } + +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; } + +.carousel { + position: relative; } + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; } + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; } + +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; } + +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; } + + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); } + + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); } + + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } } +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; } + +.carousel-inner > .active { + left: 0; } + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; } + +.carousel-inner > .next { + left: 100%; } + +.carousel-inner > .prev { + left: -100%; } + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; } + +.carousel-inner > .active.left { + left: -100%; } + +.carousel-inner > .active.right { + left: 100%; } + +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity=50); + opacity: .5; } + +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; } + +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; } + +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; } + +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; } + +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; } + +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; } + +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; } + +.carousel-control .icon-prev:before { + content: '\2039'; } + +.carousel-control .icon-next:before { + content: '\203a'; } + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; } + +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; } + +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; } + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } + +.carousel-caption .btn { + text-shadow: none; } + +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; } + + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; } + + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; } + + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; } + + .carousel-indicators { + bottom: 20px; } } +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; } + +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; } + +.center-block { + display: block; + margin-right: auto; + margin-left: auto; } + +.pull-right { + float: right !important; } + +.pull-left { + float: left !important; } + +.hide { + display: none !important; } + +.show { + display: block !important; } + +.invisible { + visibility: hidden; } + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; } + +.hidden { + display: none !important; } + +.affix { + position: fixed; } + +@-ms-viewport { + width: device-width; } +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; } + +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; } + +@media (max-width: 767px) { + .visible-xs { + display: block !important; } + + table.visible-xs { + display: table !important; } + + tr.visible-xs { + display: table-row !important; } + + th.visible-xs, + td.visible-xs { + display: table-cell !important; } } +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; } } +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; } } +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; } } +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; } + + table.visible-sm { + display: table !important; } + + tr.visible-sm { + display: table-row !important; } + + th.visible-sm, + td.visible-sm { + display: table-cell !important; } } +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; } } +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; } } +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; } } +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; } + + table.visible-md { + display: table !important; } + + tr.visible-md { + display: table-row !important; } + + th.visible-md, + td.visible-md { + display: table-cell !important; } } +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; } } +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; } } +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; } } +@media (min-width: 1200px) { + .visible-lg { + display: block !important; } + + table.visible-lg { + display: table !important; } + + tr.visible-lg { + display: table-row !important; } + + th.visible-lg, + td.visible-lg { + display: table-cell !important; } } +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; } } +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; } } +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; } } +@media (max-width: 767px) { + .hidden-xs { + display: none !important; } } +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; } } +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; } } +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; } } +.visible-print { + display: none !important; } + +@media print { + .visible-print { + display: block !important; } + + table.visible-print { + display: table !important; } + + tr.visible-print { + display: table-row !important; } + + th.visible-print, + td.visible-print { + display: table-cell !important; } } +.visible-print-block { + display: none !important; } + +@media print { + .visible-print-block { + display: block !important; } } +.visible-print-inline { + display: none !important; } + +@media print { + .visible-print-inline { + display: inline !important; } } +.visible-print-inline-block { + display: none !important; } + +@media print { + .visible-print-inline-block { + display: inline-block !important; } } +@media print { + .hidden-print { + display: none !important; } } +/*# sourceMappingURL=bootstrap.css.map */ +@media (min-width: 1200px) { + .container { + width: 970px; } } +a { + color: #459CE7; } + +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + background-color: #5585B3; + border-color: #4477A3; } + +.pagination > li > a, +.pagination > li > span { + -webkit-transition: all 0.25s linear; + -moz-transition: all 0.25s linear; + -ms-transition: all 0.25s linear; + -o-transition: all 0.25s linear; + transition: all 0.25s linear; } + +/* config variables */ +/* roboto font */ +/* source sans pro */ +/* lato */ +/* merriweather */ +/* karla */ +/* layout */ +body { + font-family: "Roboto"; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +a:focus, button:focus { + outline: none; } + +.navbar.normal { + min-height: 70px; + background: #223741; + border-radius: 0px; + box-shadow: 0px 1px 3px 1px rgba(46, 46, 46, 0.3), inset rgba(255, 255, 255, 0.2) 0 1px 1px; + border: none; + z-index: 9999; } + .navbar.normal .navbar-header .navbar-brand { + color: #fff; + padding: 25px 15px; + font-weight: 400; + font-size: 23px; } + .navbar.normal .navbar-header .navbar-toggle { + margin-top: 17px; } + @media (min-width: 768px) { + .navbar.normal .navbar-collapse { + text-align: center; } } + @media (min-width: 768px) { + .navbar.normal .navbar-collapse .navbar-nav { + float: none; + display: inline-block; } } + .navbar.normal .navbar-collapse .navbar-nav > li { + float: none; + display: inline-block; } + @media (max-width: 767px) { + .navbar.normal .navbar-collapse .navbar-nav > li { + display: block; } } + .navbar.normal .navbar-collapse .navbar-nav > li.active > a { + background: none; + color: #fff; } + .navbar.normal .navbar-collapse .navbar-nav > li > a { + padding: 25px 20px; + color: #d5d5d5; + font-weight: 500; + z-index: 1001; + -webkit-transition: color 0.2s linear; + -moz-transition: color 0.2s linear; + -ms-transition: color 0.2s linear; + -o-transition: color 0.2s linear; + transition: color 0.2s linear; } + @media (max-width: 767px) { + .navbar.normal .navbar-collapse .navbar-nav > li > a { + padding: 18px 20px; } } + .navbar.normal .navbar-collapse .navbar-nav > li > a:hover { + color: #fff; } + @media (max-width: 767px) { + .navbar.normal .navbar-collapse .navbar-nav > li.open ul.dropdown-menu a { + color: #fff; + padding: 12px 18px 12px 30px; } } + .navbar.normal .navbar-collapse .navbar-nav > li ul.dropdown-menu { + text-align: left; + padding: 9px 0; } + .navbar.normal .navbar-collapse .navbar-nav > li ul.dropdown-menu li a { + padding: 8px 18px; } + .navbar.normal .navbar-collapse .navbar-nav .button { + padding: 8px 18px; + font-size: 13px; + position: relative; + top: 17px; } + @media (max-width: 767px) { + .navbar.normal .navbar-collapse .navbar-nav .button { + box-shadow: none; + background: none; + top: 0; + margin-bottom: 20px; + color: #d5d5d5 !important; + font-size: 15px; } } +.navbar.hero { + margin: 0px; + border-radius: 0px; + border: 0px; + z-index: 999; + position: absolute; + width: 100%; + top: 0; } + @media (min-width: 768px) { + .navbar.hero { + background: transparent; + padding-top: 10px; } + .navbar.hero .navbar-nav > .active > a { + background: transparent; + color: #fff; } } + .navbar.hero .navbar-brand { + color: #fff; + font-weight: 400; + font-size: 26px; } + .navbar.hero .navbar-nav > li.dropdown > a .caret { + border-top-color: #EBEBEB; } + .navbar.hero .navbar-nav > li > a { + color: #fff; + font-size: 15px; + padding: 15px 20px; + font-weight: 500; + -webkit-transition: color 0.2s linear; + -moz-transition: color 0.2s linear; + -ms-transition: color 0.2s linear; + -o-transition: color 0.2s linear; + transition: color 0.2s linear; } + .navbar.hero .navbar-nav > li > a:hover { + color: #fff; } + .navbar.hero .navbar-nav > li.open > a { + color: #fff !important; + background-color: rgba(0, 0, 0, 0.8); + border-radius: 4px 4px 0 0; } + @media (max-width: 767px) { + .navbar.hero .navbar-nav > li.open ul.dropdown-menu a { + color: #fff; + padding: 12px 18px 12px 30px; } } + .navbar.hero .navbar-nav > li ul.dropdown-menu { + text-align: left; + background: rgba(0, 0, 0, 0.8); + box-shadow: none; + padding: 5px 0 8px 0; + border-radius: 4px 0 4px 4px; + border: 0px; } + .navbar.hero .navbar-nav > li ul.dropdown-menu li a { + color: #fff; + padding: 10px 18px; } + .navbar.hero .navbar-nav > li ul.dropdown-menu li a:hover { + color: #e9e9e9; + background: none; } +.navbar.white { + min-height: 70px; + margin-bottom: 0; + border-radius: 0; + border: 0; + z-index: 999; } + @media (min-width: 768px) { + .navbar.white { + background: #fff; + box-shadow: 0px 1px 5px rgba(0, 0, 0, 0.75); } } + @media (min-width: 1200px) { + .navbar.white .container { + width: 1000px; } } + .navbar.white .navbar-header .navbar-brand { + color: #333; + font-weight: 400; + font-size: 26px; + padding-top: 24px; } + @media (max-width: 767px) { + .navbar.white .navbar-header .navbar-brand { + color: #fff; + font-size: 20px; } } + .navbar.white .navbar-header .navbar-toggle { + margin-top: 17px; } + @media (min-width: 768px) { + .navbar.white .navbar-collapse { + text-align: center; } } + @media (min-width: 768px) { + .navbar.white .navbar-collapse .navbar-nav { + float: none; + display: inline-block; } } + .navbar.white .navbar-collapse .navbar-nav > li { + float: none; + display: inline-block; } + @media (max-width: 767px) { + .navbar.white .navbar-collapse .navbar-nav > li { + display: block; } } + .navbar.white .navbar-collapse .navbar-nav > li.active > a { + background: none; + color: #333; } + .navbar.white .navbar-collapse .navbar-nav > li > a { + padding: 25px 20px; + color: #555; + z-index: 1001; + -webkit-transition: color 0.2s linear; + -moz-transition: color 0.2s linear; + -ms-transition: color 0.2s linear; + -o-transition: color 0.2s linear; + transition: color 0.2s linear; } + .navbar.white .navbar-collapse .navbar-nav > li > a.signup { + border: 1px solid #CED7DF; + border-radius: 5px; + padding: 8px 11px; + font-size: 13px; + color: #333; + margin-left: 20px; } + @media (max-width: 767px) { + .navbar.white .navbar-collapse .navbar-nav > li > a { + padding: 18px 20px; + color: #fff; } } + .navbar.white .navbar-collapse .navbar-nav > li > a .fa-chevron-down { + color: #777; + font-size: 8px; + margin-left: 2px; + position: relative; + top: -1px; } + .navbar.white .navbar-collapse .navbar-nav > li > a:hover { + color: #333; } + @media (max-width: 767px) { + .navbar.white .navbar-collapse .navbar-nav > li > a:hover { + color: #fff; } } + @media (min-width: 768px) { + .navbar.white .navbar-collapse .navbar-nav > li.open > a { + background: #fff; + color: #333; } } + .navbar.white .navbar-collapse .navbar-nav > li.open > a .caret { + border-top-color: #999; + border-bottom-color: #999; } + @media (max-width: 767px) { + .navbar.white .navbar-collapse .navbar-nav > li.open ul.dropdown-menu a { + color: #fff; + padding: 12px 18px 12px 30px; } } + .navbar.white .navbar-collapse .navbar-nav > li ul.dropdown-menu { + text-align: left; + border: 0; + padding: 0 0 10px; + box-shadow: 0 8px 12px rgba(0, 0, 0, 0.175); } + .navbar.white .navbar-collapse .navbar-nav > li ul.dropdown-menu li a { + padding: 8px 18px; } + +.main-footer { + background: #414B5B; + margin-top: 120px; + padding-top: 60px; + padding-bottom: 30px; } + @media (max-width: 991px) { + .main-footer { + padding-top: 30px; } } + @media (max-width: 767px) { + .main-footer .menu { + text-align: center; + margin-top: 40px; } } + .main-footer .menu h3 { + margin-top: 0; + color: #ced5e0; + text-transform: uppercase; + letter-spacing: 4px; + font-size: 14px; + font-weight: 600; } + .main-footer .menu ul { + list-style-type: none; + padding: 0; + margin-top: 30px; } + .main-footer .menu ul li { + display: block; + margin-bottom: 9px; } + .main-footer .menu ul li a { + color: #fff; + display: inline-block; + font-weight: 500; + font-size: 13px; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .main-footer .menu ul li a:hover { + color: #f7f7f7; + text-decoration: none; } + @media (max-width: 991px) { + .main-footer .menu ul li a { + padding: 0; } } + .main-footer .menu ul li .hiring { + font-weight: 700; + letter-spacing: .3px; + text-transform: uppercase; + word-spacing: 1.5px; + font-size: 11px; + margin-left: 4px; + padding: 3px 8px; + border-radius: 4px; + color: #fff; + background: #49B7E2; } + .main-footer .menu ul li .hiring:hover { + color: #fff; + background: #0E82AF; } + .main-footer .newsletter { + text-align: right; } + @media (max-width: 767px) { + .main-footer .newsletter { + text-align: center; + margin-top: 40px; } } + .main-footer .newsletter .signup { + margin-bottom: 40px; } + .main-footer .newsletter .signup p { + font-size: 13px; + color: #fff; + width: 90%; + float: right; + text-align: left; + line-height: 20px; } + @media (max-width: 767px) { + .main-footer .newsletter .signup p { + float: none; + text-align: center; + width: 100%; } } + .main-footer .newsletter .signup form { + float: right; + width: 90%; + position: relative; } + @media (max-width: 767px) { + .main-footer .newsletter .signup form { + float: none; + width: 100%; } } + .main-footer .newsletter .signup form input[type="text"] { + font-size: 13px; } + .main-footer .newsletter .signup form input[type="text"]::-webkit-input-placeholder { + font-size: 13px; + line-height: 17px; } + .main-footer .newsletter .signup form input[type="text"]:-moz-placeholder { + font-size: 13px; + line-height: 17px; } + .main-footer .newsletter .signup form input[type="text"]::-moz-placeholder { + font-size: 13px; + line-height: 17px; } + .main-footer .newsletter .signup form input[type="text"]:-ms-input-placeholder { + font-size: 13px; + line-height: 17px; } + .main-footer .newsletter .signup form input[type="submit"] { + border: 0; + background: #84B0E2; + color: #FFF; + border-radius: 3px; + padding: 6px 10px; + position: absolute; + top: 5px; + text-shadow: 1px 1px rgba(0, 0, 0, 0.28); + right: 5px; + font-size: 13px; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .main-footer .newsletter .signup form input[type="submit"]:hover { + background: #6284AC; } + .main-footer .newsletter a { + border: 0; + text-decoration: none; + opacity: 1; + filter: alpha(opacity=100); + margin-left: 15px; + position: relative; + top: -10px; + -webkit-transition: all 0.3s ease; + -moz-transition: all 0.3s ease; + -ms-transition: all 0.3s ease; + -o-transition: all 0.3s ease; + transition: all 0.3s ease; } + .main-footer .newsletter a:hover { + opacity: 0.7; + filter: alpha(opacity=70); } + .main-footer .credits { + margin-top: 30px; } + .main-footer .credits .col-md-12 { + padding-top: 20px; + font-size: 13px; + text-align: center; + color: #a3aab5; } + .main-footer--white { + background: #fff; + margin-top: 0; } + .main-footer--white .menu h3 { + color: #888; } + .main-footer--white .menu ul li a { + color: #89A1C0; } + .main-footer--white .menu ul li a:hover { + color: #000; } + .main-footer--white .newsletter .signup p { + color: #666; } + .main-footer--white .credits .col-md-12 { + color: #A1AAB6; } + +/* snippets */ +.features-section { + margin-top: 90px; } + .features-section--margin { + margin-top: 120px; } + .features-section--margin .feature { + margin-bottom: 110px; } + .features-section--margin .feature.last { + margin-bottom: 50px; } + @media (max-width: 991px) { + .features-section { + margin-top: 50px; } } + .features-section .header { + text-align: center; } + .features-section .header h2 { + color: #555; + font-weight: 400; + font-size: 27px; } + @media (max-width: 767px) { + .features-section .header h2 { + font-size: 25px; } } + .features-section .header p { + font-size: 17px; + color: #757575; } + .features-section .feature { + margin-top: 60px; } + .features-section .feature.last .image img { + margin-left: 70px; } + @media (min-width: 992px) { + .features-section .feature.backwards .info { + float: right; } + .features-section .feature.backwards .image { + float: left; } + .features-section .feature.backwards .image img { + margin: 0 auto; } } + @media (max-width: 991px) { + .features-section .feature { + margin-top: 10px; } } + .features-section .feature .info h4 { + color: #3B88B6; + font-weight: normal; + font-size: 19px; + line-height: 25px; + margin-top: 35px; } + @media (max-width: 991px) { + .features-section .feature .info h4 { + text-align: center; } } + .features-section .feature .info p { + color: #6C7279; + font-size: 14px; + margin-top: 20px; + line-height: 24px; + width: 83%; + font-weight: normal; } + @media (max-width: 991px) { + .features-section .feature .info p { + text-align: center; + width: 100%; + font-size: 14px; } } + @media (max-width: 991px) { + .features-section .feature .image img { + margin: 0 auto !important; + margin-top: 20px; } } + .features-section .divider { + height: 1px; + width: 100%; + background-color: #ddd; + position: relative; + margin: 70px 0 60px; } + .features-section .divider:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 2px; + background-image: -webkit-gradient(linear, left top, right top, color-stop(0, rgba(255, 255, 255, 0.75)), color-stop(0.5, rgba(250, 250, 250, 0)), color-stop(1, rgba(255, 255, 255, 0.75))); + background-image: -webkit-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -moz-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -o-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -ms-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); } + @media (max-width: 991px) { + .features-section .divider { + margin: 55px 0 35px; } } + +.slider-section { + margin-top: 70px; } + @media (max-width: 991px) { + .slider-section { + margin-top: 30px; } } + .slider-section .header { + text-align: center; } + .slider-section .header h3 { + font-size: 25px; + color: #555; + line-height: 25px; + font-weight: 400; + margin-bottom: 15px; } + .slider-section .slide-wrapper { + border-bottom: 1px solid #E4E4E4; } + .slider-section .slide-wrapper .slideshow { + background: url("../../images/slider-bg.png") 0 0 no-repeat; + margin: 0 auto; + margin-top: 35px; + width: 844px; + height: 418px; + position: relative; + overflow: hidden; } + @media (max-width: 991px) { + .slider-section .slide-wrapper .slideshow { + background: none; + width: inherit; + height: 340px; } } + @media (max-width: 620px) { + .slider-section .slide-wrapper .slideshow { + height: 290px; } } + @media (max-width: 530px) { + .slider-section .slide-wrapper .slideshow { + height: 240px; } } + @media (max-width: 450px) { + .slider-section .slide-wrapper .slideshow { + height: 205px; } } + .slider-section .slide-wrapper .slideshow .btn-nav { + width: 48px; + height: 51px; + position: absolute; + top: 55%; + z-index: 999; + cursor: pointer; + opacity: 0; + filter: alpha(opacity=0); + -webkit-transition: all .3s ease; + -moz-transition: all .3s ease; + -o-transition: all .3s ease; + -ms-transition: all .3s ease; + transition: all .3s ease; } + .slider-section .slide-wrapper .slideshow .btn-nav.active { + opacity: 1; + filter: alpha(opacity=100); + -moz-transform: translateX(0px) !important; + -o-transform: translateX(0px) !important; + -ms-transform: translateX(0px) !important; + -webkit-transform: translateX(0px) !important; + transform: translateX(0px) !important; } + .slider-section .slide-wrapper .slideshow .btn-nav.prev { + background: url("../../images/slider/slide-left.png") 0 0 no-repeat; + left: 91px; + -moz-transform: translateX(-48px); + -o-transform: translateX(-48px); + -ms-transform: translateX(-48px); + -webkit-transform: translateX(-48px); + transform: translateX(-48px); } + @media (max-width: 991px) { + .slider-section .slide-wrapper .slideshow .btn-nav.prev { + left: 30px; } } + .slider-section .slide-wrapper .slideshow .btn-nav.next { + background: url("../../images/slider/slide-right.png") 0 0 no-repeat; + right: 91px; + -moz-transform: translateX(48px); + -o-transform: translateX(48px); + -ms-transform: translateX(48px); + -webkit-transform: translateX(48px); + transform: translateX(48px); } + @media (max-width: 991px) { + .slider-section .slide-wrapper .slideshow .btn-nav.next { + right: 29px; } } + .slider-section .slide-wrapper .slideshow .slide { + width: 100%; + height: 100%; + position: absolute; } + .slider-section .slide-wrapper .slideshow .slide.active img { + opacity: 1; + filter: alpha(opacity=100); + -moz-transform: translateY(0px); + -o-transform: translateY(0px); + -ms-transform: translateY(0px); + -webkit-transform: translateY(0px); + transform: translateY(0px); } + .slider-section .slide-wrapper .slideshow .slide img { + position: absolute; + bottom: 0; + left: 0; + right: 0; + margin: auto; + -moz-transform: translateY(300px); + -o-transform: translateY(300px); + -ms-transform: translateY(300px); + -webkit-transform: translateY(300px); + transform: translateY(300px); + opacity: 0; + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + filter: alpha(opacity=0); + -webkit-transition: all .6s ease; + -moz-transition: all .6s ease; + -o-transition: all .6s ease; + -ms-transition: all .6s ease; + transition: all .6s ease; } + @media (max-width: 767px) { + .slider-section .slide-wrapper .slideshow .slide img { + width: 100%; } } + +/* pages */ +.index-hero { + overflow: hidden; + background: #4B4848; + background-size: cover; + background-image: url("../../images/8254861601_1fbf969a14_b.jpg"); + /*background: -webkit-radial-gradient(closest-corner, rgba(16, 47, 70, 0) 60%, rgba(16, 47, 70, 0.26)), -webkit-linear-gradient(108deg, #5E8199, #153752 90%);*/ + background-position: center 16%; + height: 580px; + position: relative; + padding-top: 150px; + box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.4); } + @media (max-width: 991px) { + .index-hero { + padding-top: 100px; } } + @media (max-width: 767px) { + .index-hero { + height: 550px; } } + .index-hero:before { + position: absolute; + content: ''; + left: 0; + bottom: 0; + width: 100%; + height: 100%; + background: -webkit-linear-gradient(right, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0) 1%, rgba(0, 0, 0, 0.1) 26%, rgba(0, 0, 0, 0.35) 71%, rgba(0, 0, 0, 0.5) 100%); + background: -moz-linear-gradient(right, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0) 1%, rgba(0, 0, 0, 0.1) 26%, rgba(0, 0, 0, 0.35) 71%, rgba(0, 0, 0, 0.5) 100%); + background: -o-linear-gradient(right, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0) 1%, rgba(0, 0, 0, 0.1) 26%, rgba(0, 0, 0, 0.35) 71%, rgba(0, 0, 0, 0.5) 100%); + background: linear-gradient(right, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0) 1%, rgba(0, 0, 0, 0.1) 26%, rgba(0, 0, 0, 0.35) 71%, rgba(0, 0, 0, 0.5) 100%); } + .index-hero:after { + position: absolute; + content: ''; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: rgba(32, 54, 114, 0.29); } + .index-hero .container { + position: relative; + z-index: 33; } + .index-hero h1.hero-text { + line-height: 52px; + text-align: left; + font-size: 37px; + text-transform: uppercase; + font-weight: 300; + letter-spacing: .3px; + color: #FFF; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); + -webkit-animation-duration: 1s; } + @media (max-width: 767px) { + .index-hero h1.hero-text { + font-size: 25px; + line-height: 38px; + margin-top: 0; + text-align: center; } } + .index-hero .sub-text { + width: 50%; + margin-top: 25px; + color: #fff; + font-weight: 400; + font-size: 17px; + line-height: 28px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3); + -webkit-animation-duration: 1s; } + @media (max-width: 991px) { + .index-hero .sub-text { + width: 70%; } } + @media (max-width: 767px) { + .index-hero .sub-text { + font-size: 15px; + width: 100%; + text-align: center; } } + .index-hero .cta { + -webkit-animation-delay: 0.6s; + -moz-animation-delay: 0.6s; + -o-animation-delay: 0.6s; + -ms-animation-delay: 0.6s; + animation-delay: 0.6s; + margin-top: 60px; } + @media (max-width: 767px) { + .index-hero .cta { + text-align: center; } } + .index-hero .cta a { + margin-right: 20px; + padding: 15px 31px; } + @media (max-width: 767px) { + .index-hero .cta a { + font-size: 14px; + padding: 12px 25px; + margin: 0px 15px 15px 0px; } } + .index-hero .img { + position: absolute; + top: 15px; + left: 625px; + width: 570px; + height: 333px; + background-image: url("../../images/static-hero.png"); + background-repeat: no-repeat; } + @media (max-width: 991px) { + .index-hero .img { + display: none; } } + +.testimonials-section { + margin-top: 100px; } + .testimonials-section .header { + text-align: center; } + .testimonials-section .header h3 { + font-size: 23px; + color: #656565; + font-weight: 400; + line-height: 25px; + margin-bottom: 45px; } + .testimonials-section .testimonial { + width: 90%; } + @media (max-width: 767px) { + .testimonials-section .testimonial { + float: none !important; + margin: 0 auto; + margin-bottom: 45px; } } + .testimonials-section .testimonial .quote { + color: #53565f; + line-height: 26px; + border: 1px solid #E2E2E2; + padding: 16px 25px; + border-radius: 5px; + width: 95%; + position: relative; } + @media (max-width: 767px) { + .testimonials-section .testimonial .quote { + margin: 0 auto; } } + .testimonials-section .testimonial .quote .arrow-down { + position: absolute; + bottom: 3px; + left: 30px; } + .testimonials-section .testimonial .quote .arrow-down .arrow, .testimonials-section .testimonial .quote .arrow-down .arrow-border { + border-color: #fff transparent transparent; + border-style: solid; + border-width: 11px; + cursor: pointer; + position: absolute; + top: 3px; + z-index: 1002; } + .testimonials-section .testimonial .quote .arrow-down .arrow-border { + border-color: #E2E2E2 transparent transparent; + border-width: 12px; + top: 3px; + z-index: 1001; + left: -1px; } + .testimonials-section .testimonial .author { + margin-top: 40px; + margin-left: 10px; } + @media (max-width: 767px) { + .testimonials-section .testimonial .author { + margin-left: 6%; } } + .testimonials-section .testimonial .author .pic { + width: 71px; + height: 71px; + border-radius: 50px; + float: left; + position: relative; + top: -12px; + margin-right: 18px; + border: 1px solid #ccc; } + .testimonials-section .testimonial .author .name { + color: #3C92C5; + line-height: 23px; + font-weight: 500; } + .testimonials-section .testimonial .author .company { + font-size: 14px; + color: #909090; + line-height: 23px; + font-weight: 400; } + +.cta-section { + text-align: center; + margin-top: 120px; } + .cta-section p { + font-size: 18px; + color: #7A7D81; + letter-spacing: 0.1px; } + .cta-section a { + display: inline-block; + margin-top: 30px; + background: #6CAAE4; + color: #FFF; + padding: 23px 40px; + font-size: 16px; + letter-spacing: 1px; + font-weight: 500; + text-transform: uppercase; + border-radius: 5px; + box-shadow: rgba(23, 43, 99, 0.3) 0 7px 28px; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .cta-section a:hover { + text-decoration: none; + background: #3FD8DF; } + +.clients-section { + background: #5E7A9B; + background: radial-gradient(#36414E, #253241); + margin-top: 120px; + padding: 65px 0 80px; + text-align: center; } + .clients-section h3 { + color: #FFF; + margin-top: 0; + font-weight: 300; + font-size: 35px; + letter-spacing: .3px; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } + .clients-section p { + font-size: 16px; + color: #f8f8f8; + margin-top: 17px; + font-weight: 300; + line-height: 25px; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } + .clients-section .logos { + margin-top: 35px; } + .clients-section .logos img { + margin: 0 16px; } + @media (max-width: 767px) { + .clients-section .logos img { + margin: 0 auto; + display: block; + margin-bottom: 15px; } } + +@-webkit-keyframes $name { + 0% { + left: 0; } + 100% { + left: -15px; } } +@-moz-keyframes $name { + 0% { + left: 0; } + 100% { + left: -15px; } } +@-o-keyframes $name { + 0% { + left: 0; } + 100% { + left: -15px; } } +@keyframes $name { + 0% { + left: 0; } + 100% { + left: -15px; } } +.slider-hero { + background: #4B4848; + height: 585px; + position: relative; + /* prev & next arrows */ + /* navigation dots */ + /* slides */ + /* video modal */ } + @media (max-width: 991px) { + .slider-hero { + padding-top: 100px; } } + @media (max-width: 767px) { + .slider-hero { + height: 550px; } } + .slider-hero .slide-nav { + position: absolute; + top: 0; + bottom: 0; + width: 140px; + z-index: 200; + text-indent: 100%; + overflow: hidden; + opacity: 0.5; + filter: alpha(opacity=50); + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + -ms-transition: opacity 0.2s linear; + -o-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; } + .slider-hero .slide-nav:hover { + opacity: 1; + filter: alpha(opacity=100); } + .slider-hero .slide-nav.prev:after { + content: ""; + display: block; + position: absolute; + top: 0; + bottom: 0; + margin: auto 0; + width: 19px; + height: 58px; + background: url("../../images/slide-arrow.png") no-repeat; + left: 30px; + -moz-transform: rotate(180deg); + -o-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + .slider-hero .slide-nav.next { + right: 0; } + .slider-hero .slide-nav.next:after { + content: ""; + display: block; + position: absolute; + top: 0; + bottom: 0; + margin: auto 0; + width: 19px; + height: 58px; + background: url("../../images/slide-arrow.png") no-repeat; + right: 30px; } + .slider-hero nav { + z-index: 999; + position: absolute; + bottom: 20px; + width: 100%; + text-align: center; } + .slider-hero nav a { + display: inline-block; + width: 10px; + height: 10px; + background: #a2a2a2; + border-radius: 50%; + margin: 0 3px; } + .slider-hero nav a.active { + background: #fff; } + .slider-hero .slides { + overflow: hidden; + position: absolute; + top: 0px; + width: 100%; + height: 100%; + /* each slide */ } + .slider-hero .slides .slide { + display: none; + z-index: 80; + height: 100%; + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + padding-top: 90px; } + .slider-hero .slides .slide.active { + opacity: 1; + filter: alpha(opacity=100); + display: block; + z-index: 100; } + .slider-hero .slides .slide.next { + z-index: 90; } + @media (min-width: 768px) { + .slider-hero .slides .slide.next .bg { + -webkit-animation: slideLeft 700ms linear; + -moz-animation: slideLeft 700ms linear; + -o-animation: slideLeft 700ms linear; + -ms-animation: slideLeft 700ms linear; + animation: slideLeft 700ms linear; } } + .slider-hero .slides .slide .container { + position: relative; + z-index: 3; + height: 100%; } + .slider-hero .slides .slide .bg { + position: absolute; + top: 0; + left: -15px; + width: 102%; + height: 100%; + background-position: center center; + background-size: cover; } + @media (max-width: 767px) { + .slider-hero .slides .slide .bg { + left: 0px; } } + .slider-hero .slides .slide .bg:before { + position: absolute; + top: 10%; + bottom: 0; + left: 0; + right: 0; + content: ''; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(100%, rgba(0, 0, 0, 0.25))); + background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.25) 100%); + background: -moz-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.25)); + background: -o-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.25)); + background: linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.25)); } + .slider-hero .slides .slide .bg:after { + content: ''; + position: absolute; + display: block; + height: 100%; + left: 0; + width: 100%; + top: 0; } + @media (max-width: 767px) { + .slider-hero .slides .slide.first { + padding-top: 40px; } } + .slider-hero .slides .slide.first .bg { + background-image: url("../../images/bgs/photo-1467703834117-04386e3dadd8.jpeg"); + background-position: center 29%; } + .slider-hero .slides .slide.first .bg:after { + background: rgba(5, 11, 29, 0.4); } + .slider-hero .slides .slide.first h1.hero-text { + text-align: center; + font-family: "Lato", "Helvetica Neue", Arial; + font-size: 37px; + font-weight: 400; + color: #fff; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.65); } + @media (max-width: 767px) { + .slider-hero .slides .slide.first h1.hero-text { + font-size: 25px; } } + .slider-hero .slides .slide.first .sub-text { + margin: 0 auto; + font-family: "Lato", "Helvetica Neue", Arial; + line-height: 26px; + margin-top: 25px; + text-align: center; + color: #fff; + font-weight: 400; + font-size: 17px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.2); + width: 50%; + -webkit-animation-delay: 0.6s; + -moz-animation-delay: 0.6s; + -o-animation-delay: 0.6s; + -ms-animation-delay: 0.6s; + animation-delay: 0.6s; } + @media (max-width: 991px) { + .slider-hero .slides .slide.first .sub-text { + width: 70%; } } + @media (max-width: 767px) { + .slider-hero .slides .slide.first .sub-text { + font-size: 15px; } } + .slider-hero .slides .slide.first .video-wrapper { + text-align: center; + margin-top: 50px; } + @media (max-width: 767px) { + .slider-hero .slides .slide.first .video-wrapper { + margin-top: 25px; } } + .slider-hero .slides .slide.first .video-wrapper .video { + display: inline-block; + padding: 6px; + background: rgba(255, 255, 255, 0.5); + border-radius: 5px; + -webkit-animation-duration: 1.2s; + -moz-animation-duration: 1.2s; + -o-animation-duration: 1.2s; + animation-duration: 1.2s; } + .slider-hero .slides .slide.first .video-wrapper .video img { + max-width: 280px; + cursor: pointer; } + @media (max-width: 767px) { + .slider-hero .slides .slide.first .video-wrapper .video img { + max-width: 200px; } } + @media (max-width: 767px) { + .slider-hero .slides .slide.second { + padding-top: 50px; } } + .slider-hero .slides .slide.second .bg { + background-image: url("../../images/bgs/photo-1472132858735-6313c7962473.jpeg"); + background-position: center 18%; } + .slider-hero .slides .slide.second .bg:after { + background: rgba(52, 52, 58, 0.5); } + .slider-hero .slides .slide.second .info h1.hero-text { + margin-top: 65px; + font-family: "Lato", "Helvetica Neue", Arial; + font-size: 40px; + line-height: 45px; + font-weight: 400; + color: #fff; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8); } + @media (max-width: 767px) { + .slider-hero .slides .slide.second .info h1.hero-text { + font-size: 28px; + text-align: center; } } + .slider-hero .slides .slide.second .info p { + color: rgba(255, 255, 255, 0.94); + font-family: "Lato", "Helvetica Neue", Arial; + letter-spacing: 0.3px; + margin-top: 25px; + font-size: 17px; + line-height: 26px; } + .slider-hero .slides .slide.second .info .cta { + -webkit-animation-delay: 0.6s; + -moz-animation-delay: 0.6s; + -o-animation-delay: 0.6s; + -ms-animation-delay: 0.6s; + animation-delay: 0.6s; + margin-top: 40px; } + @media (max-width: 767px) { + .slider-hero .slides .slide.second .info .cta { + text-align: center; } } + .slider-hero .slides .slide.second .info .cta a { + position: relative; + margin: 0px 30px 0 0; + padding: 16px 25px; + letter-spacing: 1px; + font-weight: 500; + text-transform: uppercase; + border: 2px solid rgba(255, 255, 255, 0.8); + background: rgba(0, 0, 0, 0.4); } + .slider-hero .slides .slide.second .info .cta a:hover { + color: #252525; + background: #fff; + padding-right: 45px; } + .slider-hero .slides .slide.second .info .cta a:hover .fa { + opacity: 1; } + .slider-hero .slides .slide.second .info .cta a .fa { + opacity: 0; + font-size: 13px; + position: absolute; + color: #252525; + top: 21px; + right: 20px; + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + -ms-transition: all 0.15s linear; + -o-transition: all 0.15s linear; + transition: all 0.15s linear; } + @media (max-width: 767px) { + .slider-hero .slides .slide.second .info .cta a { + font-size: 14px; + padding: 12px 25px; + margin: 0px 15px 15px 0px; } } + .slider-hero .slides .slide.second .mobiles img { + display: block; + margin: 0 auto; + width: 360px; + -webkit-animation-duration: 1.2s; + -moz-animation-duration: 1.2s; + -o-animation-duration: 1.2s; + animation-duration: 1.2s; } + .slider-hero .slides .slide.third { + padding-top: 115px; } + @media (max-width: 767px) { + .slider-hero .slides .slide.third { + padding-top: 50px; } } + .slider-hero .slides .slide.third .bg { + background-image: url("../../images/bgs/photo-1467659226669-a1360d97be2d.jpeg"); + background-position: center 15%; } + .slider-hero .slides .slide.third .bg:after { + background: rgba(3, 9, 27, 0.5); } + .slider-hero .slides .slide.third h1, .slider-hero .slides .slide.third .sub-text { + -webkit-animation-duration: 1s; + -moz-animation-duration: 1s; + -o-animation-duration: 1s; + animation-duration: 1s; } + .slider-hero .slides .slide.third h1.hero-text { + text-align: center; + font-size: 38px; + font-weight: 400; + color: #fff; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); } + @media (max-width: 767px) { + .slider-hero .slides .slide.third h1.hero-text { + font-size: 28px; } } + .slider-hero .slides .slide.third .sub-text { + margin: 0 auto; + margin-top: 25px; + text-align: center; + color: #f7f7f7; + font-weight: 400; + font-size: 17px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.2); + width: 50%; } + @media (max-width: 991px) { + .slider-hero .slides .slide.third .sub-text { + width: 70%; } } + @media (max-width: 767px) { + .slider-hero .slides .slide.third .sub-text { + font-size: 15px; } } + .slider-hero .slides .slide.third .cta { + -webkit-animation-delay: 0.6s; + -moz-animation-delay: 0.6s; + -o-animation-delay: 0.6s; + -ms-animation-delay: 0.6s; + animation-delay: 0.6s; + text-align: center; + margin-top: 60px; } + .slider-hero .slides .slide.third .cta a { + margin: 0px 20px; } + @media (max-width: 767px) { + .slider-hero .slides .slide.third .cta a { + font-size: 14px; + padding: 12px 25px; + margin: 0px 15px 15px 0px; } } + .slider-hero .video-modal { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 999; + opacity: 0; + filter: alpha(opacity=0); + visibility: hidden; + -webkit-transition: all 0.25s linear; + -moz-transition: all 0.25s linear; + -ms-transition: all 0.25s linear; + -o-transition: all 0.25s linear; + transition: all 0.25s linear; } + .slider-hero .video-modal.active { + opacity: 1; + filter: alpha(opacity=100); + visibility: visible; + background: rgba(44, 44, 45, 0.8); } + .slider-hero .video-modal.active .wrap { + -moz-transform: scale3d(1, 1, 1); + -o-transform: scale3d(1, 1, 1); + -ms-transform: scale3d(1, 1, 1); + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + opacity: 1; + filter: alpha(opacity=100); } + .slider-hero .video-modal .wrap { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + margin: auto; + padding: 5px; + background: rgba(255, 255, 255, 0.65); + border-radius: 5px; + width: 630px; + height: 360px; + opacity: 0; + filter: alpha(opacity=0); + -moz-transform: scale3d(0.3, 0.3, 0.3); + -o-transform: scale3d(0.3, 0.3, 0.3); + -ms-transform: scale3d(0.3, 0.3, 0.3); + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + -webkit-transition: all 0.4s ease-out; + -moz-transition: all 0.4s ease-out; + -ms-transition: all 0.4s ease-out; + -o-transition: all 0.4s ease-out; + transition: all 0.4s ease-out; } + +.features-hover-section { + margin-top: 120px; } + @media (max-width: 991px) { + .features-hover-section { + margin-top: 60px; } } + .features-hover-section .images { + height: 355px; } + @media (max-width: 767px) { + .features-hover-section .images { + height: 300px; } } + .features-hover-section .images img { + margin: 0 auto; + position: absolute; + left: 0; + right: 0; + display: none; } + .features-hover-section .images img.active { + display: block; } + .features-hover-section .features { + margin-top: 50px; } + @media (max-width: 991px) { + .features-hover-section .features { + margin-top: 0px; } } + .features-hover-section .features .feature { + cursor: pointer; } + @media (min-width: 992px) { + .features-hover-section .features .feature { + width: 85%; + margin: 0 auto; } } + .features-hover-section .features .feature.active strong, .features-hover-section .features .feature:hover strong { + color: #58B0D5; } + .features-hover-section .features .feature.active p, .features-hover-section .features .feature:hover p { + color: #555; } + .features-hover-section .features .feature strong { + color: #b6b6b6; + font-size: 16px; + -webkit-transition: color 0.2s linear; + -moz-transition: color 0.2s linear; + -ms-transition: color 0.2s linear; + -o-transition: color 0.2s linear; + transition: color 0.2s linear; } + .features-hover-section .features .feature p { + margin-top: 15px; + line-height: 25px; + color: #b6b6b6; + -webkit-transition: color 0.2s linear; + -moz-transition: color 0.2s linear; + -ms-transition: color 0.2s linear; + -o-transition: color 0.2s linear; + transition: color 0.2s linear; } + +.sidebar-toggle { + width: 30px; + float: right; + margin-top: 15px; + cursor: pointer; } + .sidebar-toggle .line { + background: #fff; + width: 100%; + height: 3px; + margin-bottom: 6px; + border-radius: 1px; } + +.st-container { + position: relative; + overflow: hidden; } + .st-container--right-side { + /* show hidden navbar */ } + .st-container--right-side .nav-menu { + right: 0; + -moz-transform: translate3d(50%, 0, 0); + -o-transform: translate3d(50%, 0, 0); + -ms-transform: translate3d(50%, 0, 0); + -webkit-transform: translate3d(50%, 0, 0); + transform: translate3d(50%, 0, 0); } + .st-container--right-side.nav-effect .nav-menu { + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + .st-container--right-side.nav-effect .st-pusher { + -moz-transform: translate3d(-320px, 0, 0); + -o-transform: translate3d(-320px, 0, 0); + -ms-transform: translate3d(-320px, 0, 0); + -webkit-transform: translate3d(-320px, 0, 0); + transform: translate3d(-320px, 0, 0); + box-shadow: 5px 0px 20px 0px rgba(0, 0, 0, 0.5); } + @media (max-width: 767px) { + .st-container--right-side.nav-effect .st-pusher { + -moz-transform: translate3d(-220px, 0, 0); + -o-transform: translate3d(-220px, 0, 0); + -ms-transform: translate3d(-220px, 0, 0); + -webkit-transform: translate3d(-220px, 0, 0); + transform: translate3d(-220px, 0, 0); } } + .st-container--left-side { + /* show hidden navbar */ } + .st-container--left-side .nav-menu { + left: 0; + -moz-transform: translate3d(-50%, 0, 0); + -o-transform: translate3d(-50%, 0, 0); + -ms-transform: translate3d(-50%, 0, 0); + -webkit-transform: translate3d(-50%, 0, 0); + transform: translate3d(-50%, 0, 0); } + .st-container--left-side.nav-effect .nav-menu { + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + .st-container--left-side.nav-effect .st-pusher { + -moz-transform: translate3d(300px, 0, 0); + -o-transform: translate3d(300px, 0, 0); + -ms-transform: translate3d(300px, 0, 0); + -webkit-transform: translate3d(300px, 0, 0); + transform: translate3d(300px, 0, 0); + box-shadow: -5px 0px 20px 0px rgba(0, 0, 0, 0.5); } + @media (max-width: 767px) { + .st-container--left-side.nav-effect .st-pusher { + -moz-transform: translate3d(220px, 0, 0); + -o-transform: translate3d(220px, 0, 0); + -ms-transform: translate3d(220px, 0, 0); + -webkit-transform: translate3d(220px, 0, 0); + transform: translate3d(220px, 0, 0); } } + +.st-pusher { + position: relative; + left: 0; + z-index: 99; + background: #fff; + -webkit-transition: -webkit-transform 0.35s ease-out; + -moz-transition: -moz-transform 0.35s ease-out; + -ms-transition: -ms-transform 0.35s ease-out; + -o-transition: -o-transform 0.35s ease-out; + transition: transform 0.35s ease-out; } + +.nav-menu { + position: fixed; + top: 0; + z-index: 1; + width: 320px; + height: 100%; + background: #2a313a; + padding-top: 30px; + -webkit-transition: -webkit-transform 0.35s ease-out; + -moz-transition: -moz-transform 0.35s ease-out; + -ms-transition: -ms-transform 0.35s ease-out; + -o-transition: -o-transform 0.35s ease-out; + transition: transform 0.35s ease-out; } + @media (max-width: 767px) { + .nav-menu { + width: 220px; + position: absolute; } } + .nav-menu .main-menu h3 { + color: #fff; + font-size: 26px; + margin-left: 50px; + margin-bottom: 30px; } + @media (max-width: 767px) { + .nav-menu .main-menu h3 { + margin-left: 30px; + font-size: 23px; } } + .nav-menu .main-menu a { + display: block; + padding: 5px 30px 5px 50px; + margin-bottom: 10px; + text-decoration: none; + color: #fff; + font-size: 15px; + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + -ms-transition: all 0.15s linear; + -o-transition: all 0.15s linear; + transition: all 0.15s linear; } + @media (max-width: 767px) { + .nav-menu .main-menu a { + padding-left: 30px; + font-size: 16px; } } + .nav-menu .main-menu a:hover { + color: #82C4F8; } + .nav-menu .main-menu .social { + margin-left: 45px; + margin-top: 50px; } + @media (max-width: 767px) { + .nav-menu .main-menu .social { + margin-left: 30px; } } + .nav-menu .main-menu .social a { + padding: 0px; + display: inline-block; + margin-right: 22px; } + .nav-menu .main-menu .social a:hover i { + color: #7EBDE7; } + .nav-menu .main-menu .social a i { + font-size: 22px; + color: #fff; + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + -ms-transition: all 0.15s linear; + -o-transition: all 0.15s linear; + transition: all 0.15s linear; } + .nav-menu .projects .back { + margin-top: 10px; + font-weight: 500; + font-size: 21px; + color: #fff; + margin-bottom: 20px; } + .nav-menu .projects a { + display: block; + position: relative; + left: 0px; + padding: 15px 40px; + text-decoration: none; + color: #fff; + font-size: 16px; + font-weight: 400; + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + -ms-transition: all 0.15s linear; + -o-transition: all 0.15s linear; + transition: all 0.15s linear; } + @media (max-width: 767px) { + .nav-menu .projects a { + padding-left: 20px; } } + .nav-menu .projects a:hover { + left: 10px; } + .nav-menu .projects a p { + color: #A2B1C2; + font-size: 14px; + margin-top: 5px; } + +.index-sidebar-hero { + background: #3D4046; + height: 630px; + position: relative; + overflow: hidden; + box-shadow: 0px 1px 3px -1px rgba(0, 0, 0, 0.35); + padding-top: 130px; } + @media (max-width: 991px) { + .index-sidebar-hero { + padding-top: 100px; + height: 550px; } } + .index-sidebar-hero #cover-image { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + padding-top: 105px; + background-position: center center; + background-size: cover; + -webkit-animation-delay: 0.15s; + -moz-animation-delay: 0.15s; + -o-animation-delay: 0.15s; + -ms-animation-delay: 0.15s; + animation-delay: 0.15s; + background-image: url("../../images/bg4.png"); } + @media (max-width: 991px) { + .index-sidebar-hero #cover-image { + padding-top: 65px; } } + .index-sidebar-hero #cover-image:after { + content: ''; + position: absolute; + display: block; + height: 100%; + left: 0; + width: 100%; + top: 0; + background: rgba(24, 22, 19, 0.4); } + .index-sidebar-hero #cover-image:before { + position: absolute; + top: 10%; + bottom: 0; + left: 0; + right: 0; + content: ''; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(100%, rgba(0, 0, 0, 0.25))); + background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.25) 100%); + background: -moz-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.25)); + background: -o-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.25)); + background: linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.25)); } + .index-sidebar-hero .container { + position: relative; + z-index: 3; + height: 100%; } + .index-sidebar-hero .hero-text { + text-align: center; + font-size: 35px; + font-weight: 400; + color: #fff; + margin-top: 50px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.55); + -webkit-animation-delay: 0.6s; + -moz-animation-delay: 0.6s; + -o-animation-delay: 0.6s; + -ms-animation-delay: 0.6s; + animation-delay: 0.6s; } + @media (max-width: 991px) { + .index-sidebar-hero .hero-text { + font-size: 30px; } } + @media (max-width: 767px) { + .index-sidebar-hero .hero-text { + font-size: 27px; } } + .index-sidebar-hero .cta { + text-align: center; + margin-top: 40px; + -webkit-animation-delay: 0.6s; + -moz-animation-delay: 0.6s; + -o-animation-delay: 0.6s; + -ms-animation-delay: 0.6s; + animation-delay: 0.6s; } + .index-sidebar-hero .cta a { + margin: 0px 20px; } + @media (max-width: 400px) { + .index-sidebar-hero .cta a { + display: block; } } + .index-sidebar-hero .cta a.button { + border-radius: 50px; + padding: 12px 36px; + font-size: 18px; + -webkit-transition: all 0.3s linear; + -moz-transition: all 0.3s linear; + -ms-transition: all 0.3s linear; + -o-transition: all 0.3s linear; + transition: all 0.3s linear; } + @media (max-width: 767px) { + .index-sidebar-hero .cta a.button { + font-size: 16px; } } + @media (max-width: 400px) { + .index-sidebar-hero .cta a.button { + width: 65%; + margin: 0 auto; + margin-bottom: 25px; } } + .index-sidebar-hero .cta a.button:hover { + box-shadow: rgba(0, 0, 0, 0.3) 0 1px 2px, inset rgba(255, 255, 255, 0.88) 0px 1px 3px -1px, rgba(0, 0, 0, 0.3) 0 1px 2px, #69B1F3 0 1px 30px; } + .index-sidebar-hero .cta a.demo { + color: #fff; + font-size: 17px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3); } + @media (max-width: 767px) { + .index-sidebar-hero .cta a.demo { + font-size: 16px; } } + .index-sidebar-hero .screenshot { + position: absolute; + bottom: 0; + left: 0; + right: 0; } + .index-sidebar-hero .screenshot img { + margin: 0 auto; } + +.cta-mobile-section { + background: #F7F8FB; + border: 1px solid #EAEDF7; + box-shadow: inset rgba(100, 100, 100, 0.25) 0 1px 1px; + margin-top: 100px; } + @media (min-width: 992px) { + .cta-mobile-section .container { + width: 870px; } } + .cta-mobile-section .device { + margin: -30px 0px 0px 0px; + position: relative; + top: 2px; } + .cta-mobile-section .info { + margin-top: 50px; } + @media (max-width: 767px) { + .cta-mobile-section .info { + margin: 35px; + text-align: center; } } + .cta-mobile-section .info h3 { + font-weight: 400; + color: #616974; + font-size: 26px; } + .cta-mobile-section .info p { + font-size: 15px; + margin-top: 20px; + color: #6a6e7b; + line-height: 23px; } + .cta-mobile-section .info .app-store { + margin-top: 18px; + border: none; + display: inline-block; } + .cta-mobile-section .info .app-store img { + max-width: 135px; } + +.call-to-action-signup { + margin-top: 110px; + margin-bottom: -120px; + background: #fafafa; + padding: 60px 0 70px; + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; } + @media (min-width: 1200px) { + .call-to-action-signup .container { + width: 1170px; } } + .call-to-action-signup h3 { + margin: 0; + font-size: 20px; + letter-spacing: 2px; + text-align: center; + color: #4c4c4c; + text-transform: uppercase; + font-weight: 600; + text-shadow: 1px 1px #fff; } + .call-to-action-signup form { + margin-top: 40px; + position: relative; + text-align: center; } + .call-to-action-signup form .form-group { + margin-right: 7px; + width: 250px; } + @media (max-width: 991px) { + .call-to-action-signup form .form-group { + width: 220px; } } + @media (max-width: 767px) { + .call-to-action-signup form .form-group { + width: 100%; } } + .call-to-action-signup form input { + box-shadow: 0 1px 1px #fff; + height: 42px; + width: 100% !important; + font-size: 15px; } + .call-to-action-signup form input:focus { + box-shadow: none; } + @media (max-width: 1199px) { + .call-to-action-signup form [type="submit"] { + margin-top: 30px; } } + .call-to-action-signup form .agree { + top: 20px; + position: relative; + display: block; + text-align: right; + padding-right: 95px; + color: #555; } + @media (max-width: 1199px) { + .call-to-action-signup form .agree { + text-align: center; + padding: 0; } } + +#demo .modal-dialog { + padding-top: 100px; + width: 650px; } +#demo .modal-body { + padding: 0px; } + +.features-tabs-section { + margin-top: 60px; } + @media (max-width: 991px) { + .features-tabs-section { + margin-bottom: 20px; } } + .features-tabs-section .header { + text-align: center; } + .features-tabs-section .header h3 { + font-size: 23px; + color: #55565d; + line-height: 25px; + font-weight: 500; } + .features-tabs-section .header p { + font-size: 16px; + font-weight: 400; + color: #888; } + .features-tabs-section .tabs-wrapper { + margin-top: 45px; } + .features-tabs-section .tabs-wrapper .nav-tabs { + text-align: center; + border-bottom: 2px solid #EDEDED; } + @media (max-width: 991px) { + .features-tabs-section .tabs-wrapper .nav-tabs { + display: none; } } + .features-tabs-section .tabs-wrapper .nav-tabs li { + float: none; + display: inline-block; } + .features-tabs-section .tabs-wrapper .nav-tabs li.active a { + color: #2B69A2; + font-weight: 400; + border-bottom: 0px; } + .features-tabs-section .tabs-wrapper .nav-tabs li.active a:after { + content: ''; + position: absolute; + width: 100%; + height: auto; + border-bottom: 2px solid #7BA3C9; + left: 1px; + bottom: -1px; } + .features-tabs-section .tabs-wrapper .nav-tabs li a { + color: #888; + font-weight: 400; + border: 0px; + padding: 10px 20px; + font-size: 15px; + -webkit-transition: color 0.25s linear; + -moz-transition: color 0.25s linear; + -ms-transition: color 0.25s linear; + -o-transition: color 0.25s linear; + transition: color 0.25s linear; } + .features-tabs-section .tabs-wrapper .nav-tabs li a:hover { + color: #2B69A2; + background: none; } + .features-tabs-section .tabs-wrapper .tab-content { + margin-top: 60px; } + .features-tabs-section .tabs-wrapper .tab-content .tab-pane { + height: 325px; } + @media (max-width: 991px) { + .features-tabs-section .tabs-wrapper .tab-content .tab-pane { + display: block !important; + opacity: 1; + filter: alpha(opacity=100); + height: auto; + text-align: center; + margin-bottom: 70px; } } + @media (max-width: 991px) { + .features-tabs-section .tabs-wrapper .tab-content .tab-pane .info { + margin-bottom: 35px; } } + .features-tabs-section .tabs-wrapper .tab-content .tab-pane .info h4 { + color: #3B88B6; + font-weight: normal; + font-size: 19px; + line-height: 25px; + margin-top: 35px; } + .features-tabs-section .tabs-wrapper .tab-content .tab-pane .info p { + color: #6C7279; + font-size: 15px; + margin-top: 20px; + line-height: 24px; + width: 83%; + font-weight: normal; } + @media (max-width: 991px) { + .features-tabs-section .tabs-wrapper .tab-content .tab-pane .info p { + margin: 0 auto; + width: 95%; } } + .features-tabs-section .tabs-wrapper .tab-content .tab-pane .image img { + display: inline-block; + margin: 0 auto; } + +.features-grid-section { + margin-top: 100px; } + @media (max-width: 991px) { + .features-grid-section { + margin-top: 50px; } } + @media (min-width: 992px) { + .features-grid-section .row { + margin-bottom: 50px; } } + @media (max-width: 991px) { + .features-grid-section .feature { + text-align: center; + margin-bottom: 35px; } } + .features-grid-section .feature img { + max-width: 40px; } + .features-grid-section .feature .icon { + font-size: 32px; + color: #4187ba; } + .features-grid-section .feature strong { + display: block; + font-weight: 400; + font-size: 17px; + color: #354E75; + margin-top: 15px; } + .features-grid-section .feature p { + font-weight: normal; + font-size: 14px; + color: #797979; + margin-top: 10px; + line-height: 24px; } + +.blog-showcase { + margin-top: 120px; } + .blog-showcase .header { + text-align: center; + margin-bottom: 45px; } + .blog-showcase .header h3 { + font-size: 25px; + color: #444; + line-height: 25px; + font-weight: 400; } + .blog-showcase .pics { + text-align: center; } + .blog-showcase .pics .pic { + position: relative; + width: 250px; + height: 258px; + margin: 0 auto; + margin-left: 10px; + margin-right: 10px; + display: inline-block; + opacity: 1; + filter: alpha(opacity=100); + -webkit-transition: all 0.25s linear; + -moz-transition: all 0.25s linear; + -ms-transition: all 0.25s linear; + -o-transition: all 0.25s linear; + transition: all 0.25s linear; } + @media (max-width: 991px) { + .blog-showcase .pics .pic { + margin-bottom: 35px; } } + .blog-showcase .pics .pic:hover { + opacity: 0.7; + filter: alpha(opacity=70); + text-decoration: none; } + .blog-showcase .pics .pic .bg { + position: absolute; + padding: 80px 20px 20px; + bottom: 0; + left: 0; + right: 0; + border-radius: 0px 5px 5px 0px; + background-repeat: repeat-x; + background-image: -webkit-linear-gradient(bottom, rgba(0, 0, 0, 0.12) 0, rgba(0, 0, 0, 0.3) 30%, rgba(0, 0, 0, 0) 100%); + background-image: -moz-linear-gradient(bottom, rgba(0, 0, 0, 0.12) 0, rgba(0, 0, 0, 0.3) 30%, rgba(0, 0, 0, 0) 100%); + background-image: -ms-linear-gradient(bottom, rgba(0, 0, 0, 0.12) 0, rgba(0, 0, 0, 0.3) 30%, rgba(0, 0, 0, 0) 100%); + background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.12) 0, rgba(0, 0, 0, 0.3) 30%, rgba(0, 0, 0, 0) 100%); + background-image: linear-gradient(to top, rgba(0, 0, 0, 0.12) 0, rgba(0, 0, 0, 0.3) 30%, rgba(0, 0, 0, 0) 100%); } + .blog-showcase .pics .pic img { + display: block; + margin: 0 auto; + border-radius: 5px; } + .blog-showcase .pics .pic p { + text-align: left; + color: #fff; + font-size: 22px; + position: absolute; + line-height: 28px; + bottom: 7px; + left: 20px; + width: 75%; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.4); } + +.services-intro { + margin-top: 90px; } + @media (min-width: 992px) { + .services-intro .row { + border-bottom: 1px solid #E6E6E8; } } + @media (max-width: 991px) { + .services-intro .image img { + margin: 0 auto; } } + @media (min-width: 992px) { + .services-intro .info { + padding-left: 60px; } } + @media (max-width: 991px) { + .services-intro .info { + text-align: center; } } + .services-intro .info h3 { + font-weight: 400; + margin-top: 70px; + font-size: 28px; } + .services-intro .info p { + color: #666; + margin-top: 25px; + line-height: 23px; } + @media (min-width: 992px) { + .services-intro .info p { + width: 85%; } } + +.services-tabs { + margin-top: 130px; } + @media (max-width: 991px) { + .services-tabs { + margin-top: 70px; } } + .services-tabs .hexagons { + text-align: center; } + .services-tabs .hexagons .hexagon { + background: url("../../images/hexagon.png") 0 0 no-repeat; + width: 100px; + height: 113px; + position: relative; + display: inline-block; + margin-right: 60px; + cursor: pointer; } + @media (max-width: 991px) { + .services-tabs .hexagons .hexagon { + margin: 0; } } + .services-tabs .hexagons .hexagon:hover, .services-tabs .hexagons .hexagon.active { + background-position: 0 -117px; } + .services-tabs .hexagons .hexagon:hover .icon, .services-tabs .hexagons .hexagon.active .icon { + color: #fff; } + .services-tabs .hexagons .hexagon:last-child { + margin-right: 0px; } + .services-tabs .hexagons .hexagon .icon { + font-size: 48px; + color: #80939b; + position: absolute; + top: 32px; + left: 0; + right: 0; + text-align: center; } + .services-tabs .sections { + margin-top: 35px; + position: relative; + height: 220px; } + .services-tabs .sections .section { + display: none; + position: absolute; } + .services-tabs .sections .section.active { + display: block; } + .services-tabs .sections .section h4 { + margin-bottom: 18px; } + .services-tabs .sections .section p { + line-height: 25px; } + +.services-grid-section { + margin-top: 100px; } + .services-grid-section.with-border { + margin-top: 70px; } + .services-grid-section.with-border .header { + border-top: 1px solid #E6E6E8; + padding-top: 55px; } + .services-grid-section .header { + text-align: center; } + .services-grid-section .header h3 { + font-size: 26px; + color: #555C68; + line-height: 25px; + font-weight: 400; } + .services-grid-section .header p { + font-size: 16px; + font-weight: 400; + color: #888; } + .services-grid-section .sections { + margin-top: 45px; } + .services-grid-section .sections .section { + text-align: center; } + @media (max-width: 991px) { + .services-grid-section .sections .section { + margin-bottom: 40px; } } + .services-grid-section .sections .section .pic { + display: inline-block; + padding: 15px; + background: #f5f5f5; + box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.25), inset 0px 0px 1px 1px #fff; } + .services-grid-section .sections .section .info { + margin-top: 25px; + text-align: center; } + @media (min-width: 992px) { + .services-grid-section .sections .section .info { + margin-left: 45px; + width: 80%; + text-align: left; } } + .services-grid-section .sections .section .info strong { + font-weight: 500; + font-size: 18px; + color: #555; } + .services-grid-section .sections .section .info p { + color: #666; + margin-top: 15px; + line-height: 22px; } + +.services-showcase-section { + margin-top: 80px; } + @media (max-width: 991px) { + .services-showcase-section { + margin-top: 50px; } } + .services-showcase-section .header { + border-top: 1px solid #E6E6E8; + padding-top: 55px; + margin-bottom: 35px; } + .services-showcase-section .header h3 { + font-size: 27px; + color: #444; + line-height: 25px; + font-weight: 500; + margin-bottom: 7px; } + @media (max-width: 991px) { + .services-showcase-section .header h3 { + text-align: center; } } + .services-showcase-section .header p { + font-size: 15px; + font-weight: 400; + color: #666; + width: 50%; + line-height: 24px; + margin-top: 15px; } + @media (max-width: 991px) { + .services-showcase-section .header p { + margin: 0 auto; + width: 90%; + text-align: center; } } + .services-showcase-section .features { + margin-bottom: 20px; } + @media (max-width: 991px) { + .services-showcase-section .features .feature { + text-align: center; + margin-bottom: 30px; } } + .services-showcase-section .features .feature img { + max-width: 40px; + position: relative; + top: 10px; } + @media (min-width: 992px) { + .services-showcase-section .features .feature img { + float: left; } } + @media (min-width: 992px) { + .services-showcase-section .features .feature .info { + float: left; + width: 80%; + margin-left: 20px; } } + .services-showcase-section .features .feature .info strong { + display: block; + font-weight: 500; + font-size: 16px; + color: #444; + margin-top: 15px; } + .services-showcase-section .features .feature .info p { + font-weight: normal; + font-size: 14px; + color: #797979; + margin-top: 10px; + line-height: 24px; } + +.signup-cta { + margin-top: 120px; } + .signup-cta .wrapper { + background: #F7F8FB; + border: 1px solid #EAEDF7; + border-radius: 8px; + padding: 30px 60px; + box-shadow: inset rgba(100, 100, 100, 0.25) 0 1px 1px; + margin: 0 auto; } + @media (max-width: 991px) { + .signup-cta .wrapper { + text-align: center; } } + .signup-cta h4 { + font-size: 20px; + color: #5F6E7C; + font-weight: 400; + float: left; + text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.8); } + @media (max-width: 767px) { + .signup-cta h4 { + font-size: 17px; + line-height: 23px; } } + .signup-cta .button { + float: right; } + @media (max-width: 991px) { + .signup-cta .button { + float: none; + margin-top: 20px; } } + +.session-page { + min-height: 100vh; + background-attachment: fixed !important; + background: #5E7A9B; + background: -webkit-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -moz-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -o-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: linear-gradient(top, #355069 0, #5E7A9B 100%); } + .session-page .header .logo { + margin-top: 40px; + text-align: center; } + .session-page .header .logo a { + color: #fff; + font-size: 31px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.6); + -webkit-transition: color 0.25s linear; + -moz-transition: color 0.25s linear; + -ms-transition: color 0.25s linear; + -o-transition: color 0.25s linear; + transition: color 0.25s linear; } + .session-page .header .logo a:hover { + text-decoration: none; + color: #bbb; } + .session-page .header h4 { + color: #fff; + text-align: center; + font-size: 25px; + font-weight: 400; + margin-top: 45px; + margin-bottom: 5px; } + .session-page .header p { + color: #fff; + text-align: center; } + .session-page .wrapper { + margin: 0 auto; + width: 51%; + margin-top: 25px; + background: #fff; + padding: 15px 50px 25px 50px; + border-radius: 5px; + border-top: 6px solid #6ED5E4; } + @media (max-width: 991px) { + .session-page .wrapper { + width: 67%; } } + @media (max-width: 767px) { + .session-page .wrapper { + width: 100%; } } + .session-page .wrapper .formy { + margin-top: 22px; } + .session-page .wrapper .formy .form-group label { + color: #46515F; } + .session-page .wrapper .formy .checkbox label { + color: #666; + font-size: 13px; } + .session-page .wrapper .formy .checkbox input { + position: relative; + top: -1px; } + .session-page .wrapper .formy .submit { + text-align: center; } + .session-page .wrapper .formy .submit .button-clear { + margin-top: 35px; + display: inline-block; } + .session-page .wrapper .formy .info { + float: right; + width: 67%; } + .session-page .wrapper .formy .info .good-company strong { + font-size: 15px; + font-weight: 500; } + .session-page .wrapper .formy .info .good-company p { + color: #858585; + margin-top: 9px; } + .session-page .wrapper .formy .info .testimonial { + margin-top: 40px; } + .session-page .wrapper .formy .info .testimonial .quote { + font-style: italic; + font-size: 13px; + color: #555; + line-height: 20px; } + .session-page .wrapper .formy .info .testimonial .author { + margin-top: 20px; } + .session-page .wrapper .formy .info .testimonial .author .pic { + width: 55px; + height: 55px; + border-radius: 50px; + float: left; + position: relative; + top: -6px; + margin-right: 18px; } + .session-page .wrapper .formy .info .testimonial .author .name { + color: #3C92C5; + line-height: 23px; + font-weight: 500; } + .session-page .wrapper .formy .info .testimonial .author .company { + font-size: 14px; + color: #909090; + line-height: 23px; + font-weight: 400; } + .session-page .already-account { + text-align: center; + color: #fff; + margin-top: 25px; + margin-bottom: 70px; + font-size: 13px; + font-weight: 500; } + .session-page .already-account a { + color: #fff; + text-decoration: underline; } + .session-page .already-account .popover-content { + color: #000; + font-size: 17px; + font-weight: 400; } + +.signup-rotate { + min-height: 100vh; + background-attachment: fixed !important; + background: #5E7A9B; + background: -webkit-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -moz-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -o-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: linear-gradient(top, #355069 0, #5E7A9B 100%); } + .signup-rotate .header .logo { + margin-top: 40px; + text-align: center; } + .signup-rotate .header .logo a { + color: #fff; + font-size: 31px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.6); + -webkit-transition: color 0.25s linear; + -moz-transition: color 0.25s linear; + -ms-transition: color 0.25s linear; + -o-transition: color 0.25s linear; + transition: color 0.25s linear; } + .signup-rotate .header .logo a:hover { + text-decoration: none; + color: #bbb; } + .signup-rotate .header h4 { + color: #fff; + text-align: center; + font-size: 25px; + font-weight: 400; + margin-top: 45px; + margin-bottom: 5px; } + .signup-rotate .header p { + color: #fff; + text-align: center; } + .signup-rotate .rotate-container { + -webkit-perspective: 1000; + -moz-perspective: 1000; + -ms-perspective: 1000; + -o-perspective: 1000; + margin: 0 auto; } + .signup-rotate .wrappers { + min-height: 445px; + -webkit-transition: -webkit-transform 1s; + -moz-transition: -moz-transform 1s; + -ms-transition: -ms-transform 1s; + -o-transition: -o-transform 1s; + transition: transform 1s; + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; } + .signup-rotate .wrappers.flipped { + -moz-transform: rotateY(180deg); + -o-transform: rotateY(180deg); + -ms-transform: rotateY(180deg); + -webkit-transform: rotateY(180deg); + transform: rotateY(180deg); } + .signup-rotate .wrappers.flipped-ended .front { + z-index: 1; } + .signup-rotate .wrappers.flipped-ended .back { + z-index: 3; } + .signup-rotate .wrapper { + margin: 0 auto; + width: 51%; + margin-top: 25px; + background: #fff; + padding: 15px 50px 25px 50px; + border-radius: 5px; + border-top: 6px solid #6ED5E4; + position: absolute; + left: 0; + right: 0; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -o-backface-visibility: hidden; + /* These are commented out because they break the rotation on IE */ + /*-ms-backface-visibility: hidden;*/ + /*backface-visibility: hidden;*/ + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; } + @media (max-width: 991px) { + .signup-rotate .wrapper { + width: 67%; } } + @media (max-width: 767px) { + .signup-rotate .wrapper { + width: 100%; } } + .signup-rotate .wrapper.front { + z-index: 3; } + .signup-rotate .wrapper.back { + z-index: 1; + -moz-transform: rotateY(180deg); + -o-transform: rotateY(180deg); + -ms-transform: rotateY(180deg); + -webkit-transform: rotateY(180deg); + transform: rotateY(180deg); } + .signup-rotate .wrapper.back h3 { + margin-top: -5px; + margin-bottom: 45px; + text-align: center; + font-weight: 400; } + .signup-rotate .wrapper .formy { + margin-top: 22px; } + .signup-rotate .wrapper .formy .form-group label { + color: #46515F; } + .signup-rotate .wrapper .formy .checkbox label { + color: #666; + font-size: 13px; } + .signup-rotate .wrapper .formy .checkbox input { + position: relative; + top: -1px; } + .signup-rotate .wrapper .formy .submit { + text-align: center; } + .signup-rotate .wrapper .formy .submit .button-clear { + margin-top: 35px; + display: inline-block; } + .signup-rotate .change-view { + text-align: center; + color: #fff; + margin-top: 25px; + margin-bottom: 70px; + font-size: 13px; + font-weight: 500; + display: none; } + .signup-rotate .change-view.active { + display: block; } + .signup-rotate .change-view a { + color: #fff; + text-decoration: underline; } + .signup-rotate .change-view .popover-content { + color: #000; + font-size: 17px; + font-weight: 400; } + +.blog-posts { + margin-top: 60px; } + .blog-posts .post { + margin-bottom: 90px; } + .blog-posts .post .pic { + border: 0px; } + .blog-posts .post .pic:hover img { + opacity: 0.9; + filter: alpha(opacity=90); } + .blog-posts .post .pic img { + opacity: 1; + filter: alpha(opacity=100); + -webkit-transition: all 0.25s linear; + -moz-transition: all 0.25s linear; + -ms-transition: all 0.25s linear; + -o-transition: all 0.25s linear; + transition: all 0.25s linear; } + @media (max-width: 991px) { + .blog-posts .post .pic img { + margin: 0 auto; } } + .blog-posts .post .video { + /* make video fluid for responsiveness */ } + @media (min-width: 992px) { + .blog-posts .post .video { + max-width: 635px; } } + .blog-posts .post .video .iframe-wrapper { + position: relative; + padding-bottom: 56%; + height: 0; } + .blog-posts .post .video .iframe-wrapper iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; } + .blog-posts .post .title { + font-family: Myriad Pro, Lato, Helvetica Neue, Arial; + font-size: 28px; + font-weight: 600; + margin-top: 33px; } + @media (max-width: 991px) { + .blog-posts .post .title { + text-align: center; + margin-bottom: 20px; } } + @media (max-width: 767px) { + .blog-posts .post .title { + font-size: 23px; } } + .blog-posts .post .title a { + color: #111; + -webkit-transition: color 0.15s linear; + -moz-transition: color 0.15s linear; + -ms-transition: color 0.15s linear; + -o-transition: color 0.15s linear; + transition: color 0.15s linear; } + .blog-posts .post .title a:hover { + text-decoration: none; + color: #428bca; } + .blog-posts .post .author { + color: #888; + margin-top: 4px; + position: relative; } + .blog-posts .post .author .avatar { + max-width: 60px; + border-radius: 50px; + position: absolute; + left: -75px; + top: -15px; + border: 1px solid #e0e0e0; } + .blog-posts .post .intro { + font-family: Source Sans Pro, Helvetica Neue, Arial; + margin-top: 18px; + font-size: 16px; + line-height: 27px; + color: #4d4d4d; } + @media (min-width: 992px) { + .blog-posts .post .intro { + width: 90%; } } + .blog-posts .post .continue-reading { + font-family: Source Sans Pro, Helvetica Neue, Arial; + font-size: 15px; + display: inline-block; + margin-top: 8px; + -webkit-transition: color 0.25s linear; + -moz-transition: color 0.25s linear; + -ms-transition: color 0.25s linear; + -o-transition: color 0.25s linear; + transition: color 0.25s linear; } + @media (max-width: 991px) { + .blog-posts .pages { + text-align: center; } } + @media (max-width: 991px) { + .blog-posts .sidebar { + margin-top: 70px; + text-align: center; } } + .blog-posts .sidebar .search { + margin-bottom: 40px; } + .blog-posts .sidebar .search form { + position: relative; + left: -20px; } + .blog-posts .sidebar .search .icomoon-search { + font-size: 16px; + color: #B9B9B9; + position: relative; + left: 25px; + top: 1px; + -webkit-transition: all 0.25s linear; + -moz-transition: all 0.25s linear; + -ms-transition: all 0.25s linear; + -o-transition: all 0.25s linear; + transition: all 0.25s linear; } + .blog-posts .sidebar .search .icomoon-search.active { + color: #555; } + .blog-posts .sidebar .search input { + border: 0px; + border-bottom: 1px solid #DFDFDF; + padding-left: 30px; + padding-bottom: 6px; + -webkit-transition: all 0.25s linear; + -moz-transition: all 0.25s linear; + -ms-transition: all 0.25s linear; + -o-transition: all 0.25s linear; + transition: all 0.25s linear; + color: #777; + font-weight: 300; } + @media (max-width: 991px) { + .blog-posts .sidebar .search input { + width: 95%; } } + .blog-posts .sidebar .search input:focus { + border-bottom-color: #888; } + .blog-posts .sidebar .search input::-webkit-input-placeholder { + color: #a5a5a5; + font-weight: 300; + font-size: 13px; } + .blog-posts .sidebar .search input:-moz-placeholder { + color: #a5a5a5; + font-weight: 300; + font-size: 13px; } + .blog-posts .sidebar .search input::-moz-placeholder { + color: #a5a5a5; + font-weight: 300; + font-size: 13px; } + .blog-posts .sidebar .search input:-ms-input-placeholder { + color: #a5a5a5; + font-weight: 300; + font-size: 13px; } + .blog-posts .sidebar .updates { + padding: 17px; + box-shadow: 0px 0px 3px 0px rgba(0, 0, 0, 0.2); + border-radius: 5px; } + @media (min-width: 992px) { + .blog-posts .sidebar .updates { + width: 85%; } } + .blog-posts .sidebar .updates strong { + color: #444; } + .blog-posts .sidebar .updates .fa-rss { + color: #428bca; + font-size: 16px; + position: relative; + margin-left: 5px; } + .blog-posts .sidebar .updates p { + font-size: 13px; + margin-top: 9px; + color: #777; + margin-bottom: 5px; } + .blog-posts .sidebar .follow-tw { + margin-top: 20px; } + .blog-posts .sidebar .follow-tw img { + cursor: pointer; } + .blog-posts .sidebar .best-hits { + margin-top: 35px; + padding-left: 5px; } + @media (max-width: 991px) { + .blog-posts .sidebar .best-hits { + margin-top: 40px; } } + .blog-posts .sidebar .best-hits strong { + font-weight: 500; + color: #444; + margin-bottom: 15px; + font-size: 15px; + display: block; } + .blog-posts .sidebar .best-hits a { + font-size: 13px; + display: inline-block; + margin-bottom: 5px; } + @media (max-width: 991px) { + .blog-posts .sidebar .best-hits a { + display: block; + margin-bottom: 10px; } } + +.blog-cols-page { + background: #FCFCFC; } + +.blog-cols-header { + margin-top: 60px; + position: relative; } + .blog-cols-header h1 { + font-size: 23px; + margin-top: 0; + color: #555; } + .blog-cols-header p { + color: #757575; + font-size: 17px; + margin-top: 12px; } + +.blog-cols-wrapper { + margin-top: 40px; } + @media (max-width: 767px) { + .blog-cols-wrapper { + text-align: center; } } + .blog-cols-wrapper .card { + display: inline-block; } + @media (min-width: 992px) { + .blog-cols-wrapper .card:nth-child(3n+3) .card-wrapper { + margin: 20px 0; } } + @media (min-width: 768px) and (max-width: 991px) { + .blog-cols-wrapper .card:nth-child(2n+2) .card-wrapper { + margin: 20px 0; } } + .blog-cols-wrapper .card .card-wrapper { + display: inline-block; + position: relative; + width: 295px; + background-color: #fff; + vertical-align: top; + text-align: left; + color: #4B4F56; + height: 480px; + margin: 20px 20px 20px 0; + box-shadow: 0 20px 20px rgba(0, 0, 0, 0.08); + -webkit-transition: all 250ms cubic-bezier(0.02, 0.01, 0.47, 1); + -moz-transition: all 250ms cubic-bezier(0.02, 0.01, 0.47, 1); + -ms-transition: all 250ms cubic-bezier(0.02, 0.01, 0.47, 1); + -o-transition: all 250ms cubic-bezier(0.02, 0.01, 0.47, 1); + transition: all 250ms cubic-bezier(0.02, 0.01, 0.47, 1); } + @media (max-width: 991px) { + .blog-cols-wrapper .card .card-wrapper { + width: 340px; } } + @media (max-width: 767px) { + .blog-cols-wrapper .card .card-wrapper { + margin: 20px 0; + width: 290px; } } + .blog-cols-wrapper .card .card-wrapper:hover { + box-shadow: 0 40px 40px rgba(0, 0, 0, 0.16); + transform: translate(0, -20px); } + .blog-cols-wrapper .card .card-bg { + background-size: cover; + background-position: center center; + background-repeat: no-repeat; + width: 100%; + height: 295px; } + @media (max-width: 1199px) { + .blog-cols-wrapper .card .card-bg { + height: 260px; } } + .blog-cols-wrapper .card .card-intro { + padding: 20px 20px 0; } + .blog-cols-wrapper .card .card-title { + font-size: 22px; + line-height: 32px; } + .blog-cols-wrapper .card .card-min-read { + margin-top: 5px; + font-size: 12px; + color: #777; } + .blog-cols-wrapper .card .card-description { + font-size: 15px; + margin-top: 13px; + line-height: 23px; + color: #90949C; } + +.blog-pager { + margin-top: 80px; } + .blog-pager li > a { + padding: 9px 20px; + box-shadow: 0 1px 0px 0 rgba(0, 0, 0, 0.15); + border-radius: 30px; + margin: 0 10px; + font-weight: 500; + font-size: 15px; + color: #5F8AB0; + display: inline-block; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .blog-pager li > a:hover { + background-color: #4a556b; + color: #fff; + box-shadow: none; } + +.timeline-page { + background: #f7f8fa; } + +.blog-timeline-header { + margin-top: 55px; + position: relative; } + .blog-timeline-header h1 { + text-align: center; + text-transform: uppercase; + font-weight: 500; + font-size: 24px; + margin-top: 0; + letter-spacing: 1px; } + .blog-timeline-header h1 a { + color: #222; + text-decoration: none; } + .blog-timeline-header .slogan { + text-align: center; + color: #777; + font-size: 16px; } + +.blog-timeline-wrapper { + margin-top: 40px; + position: relative; } + .blog-timeline-wrapper:before { + content: ''; + position: absolute; + background: #e7e8ec; + width: 5px; + height: 96%; + left: 0; + right: 0; + top: 95px; + margin: 0 auto; + z-index: -1; } + .blog-timeline-wrapper .post { + position: relative; + float: right; + clear: right; + width: 44%; + margin: 40px 0; + border-radius: 5px; } + @media (max-width: 767px) { + .blog-timeline-wrapper .post { + width: 100%; } } + .blog-timeline-wrapper .post:before { + content: ''; + position: absolute; + width: 70px; + height: 4px; + background: #E7E8EC; + left: -60px; + top: 62px; } + @media (max-width: 991px) { + .blog-timeline-wrapper .post:before { + left: -42px; + width: 43px; } } + @media (max-width: 767px) { + .blog-timeline-wrapper .post:before { + display: none; } } + .blog-timeline-wrapper .post:nth-child(2) { + margin-top: 100px; } + .blog-timeline-wrapper .post.left { + float: left; + clear: left; } + .blog-timeline-wrapper .post.left:before { + right: -51px; + left: inherit; } + @media (max-width: 991px) { + .blog-timeline-wrapper .post.left:before { + right: -42px; + width: 43px; } } + .blog-timeline-wrapper .post.left .marker { + left: inherit; + right: -65px; } + @media (max-width: 991px) { + .blog-timeline-wrapper .post.left .marker { + right: -52px; } } + .blog-timeline-wrapper .post .marker { + position: absolute; + width: 17px; + height: 17px; + border-radius: 25px; + background: #e7e8ec; + left: -65px; + top: 55px; + border: 3px solid #F7F8FA; } + @media (max-width: 991px) { + .blog-timeline-wrapper .post .marker { + left: -51px; } } + @media (max-width: 767px) { + .blog-timeline-wrapper .post .marker { + display: none; } } + .blog-timeline-wrapper .post .entry { + position: relative; + padding: 20px; + height: 400px; + background-size: cover; + background-position: center center; + border-radius: 5px; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.26); } + .blog-timeline-wrapper .post .entry:before { + position: absolute; + top: 50%; + bottom: 0; + left: 0; + right: 0; + content: ''; + border-radius: 0 0 5px 5px; + background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.94) 100%); + background: -moz-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.94) 100%); + background: -o-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.94) 100%); + background: linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.94) 100%); } + .blog-timeline-wrapper .post .entry.smallish { + height: 320px; } + .blog-timeline-wrapper .post .entry.smallish .intro { + top: 68%; } + .blog-timeline-wrapper .post .entry .intro { + position: relative; + top: 75%; + color: #FFF; + z-index: 9; + letter-spacing: .3px; } + .blog-timeline-wrapper .post .entry .intro h4 { + font-size: 19px; + font-weight: 600; + text-transform: uppercase; + text-shadow: 1px 1px rgba(0, 0, 0, 0.4); + letter-spacing: .5px; } + @media (max-width: 767px) { + .blog-timeline-wrapper .post .entry .intro h4 { + font-size: 17px; } } + @media (max-width: 767px) { + .blog-timeline-wrapper .post .entry .intro p { + font-size: 13px; } } + .blog-timeline-wrapper .post .news { + position: relative; + background-size: cover; + background-position: center center; + border-radius: 5px; + box-shadow: 0 1px 5px rgba(12, 26, 36, 0.25); + background: #fff; } + .blog-timeline-wrapper .post .news .author { + position: absolute; + left: 0; + top: -35px; + right: 0; + text-align: center; } + .blog-timeline-wrapper .post .news .author img { + border-radius: 50%; + width: 68px; } + .blog-timeline-wrapper .post .news section { + padding: 60px 25px 75px 25px; } + .blog-timeline-wrapper .post .news section h3 { + margin-top: 0; } + .blog-timeline-wrapper .post .news section h3 a { + color: #333; + text-decoration: none; + font-size: 21px; + text-align: center; + display: block; + line-height: 31px; + -webkit-transition: all 0.15s; + -moz-transition: all 0.15s; + -ms-transition: all 0.15s; + -o-transition: all 0.15s; + transition: all 0.15s; } + .blog-timeline-wrapper .post .news section h3 a:hover { + color: #459CE7; } + .blog-timeline-wrapper .post .news section p { + margin-top: 21px; + line-height: 24px; + color: #555; } + .blog-timeline-wrapper .post .news section a.read-more { + position: relative; + text-decoration: none; + display: inline-block; + margin-top: 10px; + font-size: 15px; + -webkit-transition: all 0.2s; + -moz-transition: all 0.2s; + -ms-transition: all 0.2s; + -o-transition: all 0.2s; + transition: all 0.2s; } + .blog-timeline-wrapper .post .news section a.read-more:hover:after { + right: -18px; } + .blog-timeline-wrapper .post .news section a.read-more:after { + content: "▸"; + position: absolute; + right: -15px; + top: 0; + -webkit-transition: all 0.2s; + -moz-transition: all 0.2s; + -ms-transition: all 0.2s; + -o-transition: all 0.2s; + transition: all 0.2s; } + .blog-timeline-wrapper .post .news footer { + position: absolute; + bottom: 0; + padding: 12px 25px; + width: 100%; + font-weight: 500; + background: #EEF1F4; + color: #92A2B2; } + .blog-timeline-wrapper .post .news footer .tag { + position: relative; + padding-left: 27px; + text-transform: uppercase; + font-weight: 600; + letter-spacing: 1px; + font-size: 11px; + top: 3px; } + .blog-timeline-wrapper .post .news footer .tag span { + font-size: 24px; + position: absolute; + top: -7px; + left: 0; } + .blog-timeline-wrapper .post .news footer .date { + font-weight: 600; + font-size: 14px; } + .blog-timeline-wrapper .pager { + text-align: center; + margin-top: 50px; + margin-bottom: 0; } + .blog-timeline-wrapper .pager a { + display: inline-block; + position: relative; + top: -10px; + background: #E7E8EC; + text-decoration: none; + text-transform: uppercase; + font-weight: 600; + letter-spacing: 1px; + padding: 6px 23px; + border-radius: 3px; + color: #444; + -webkit-transition: all 0.2s; + -moz-transition: all 0.2s; + -ms-transition: all 0.2s; + -o-transition: all 0.2s; + transition: all 0.2s; } + .blog-timeline-wrapper .pager a:hover { + box-shadow: 0 6px 15px -1px rgba(0, 0, 0, 0.15); } + +.blog-post-hero { + height: 500px; + background-image: url("../../images/photo-1470753937643-efeb931202a9.jpeg"); + background-size: cover; + background-position: center center; + position: relative; + top: -20px; } + @media (max-width: 991px) { + .blog-post-hero { + height: 400px; } } + .blog-post-hero:after { + content: ''; + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 0; + background: rgba(64, 64, 64, 0.5); } + .blog-post-hero .container { + position: relative; + z-index: 1; + text-align: center; } + .blog-post-hero h1 { + width: 60%; + margin: 190px auto 0; + color: #fff; + font-family: "Karla", "Lato", "Helvetica Neue", Arial; + font-size: 38px; + line-height: 46px; + text-shadow: 1px 1px rgba(0, 0, 0, 0.2); } + @media (max-width: 991px) { + .blog-post-hero h1 { + margin-top: 150px; + font-size: 35px; + line-height: 40px; + width: 70%; } } + @media (max-width: 767px) { + .blog-post-hero h1 { + width: 100%; + font-size: 28px; + line-height: 35px; } } + +.blog-post-author { + color: #888; + display: inline-block; } + .blog-post-author img { + border-radius: 100%; + width: 55px; + margin-right: 17px; + position: relative; + top: -2px; } + .blog-post-author span { + color: #333; } + +.blog-post-date { + display: inline-block; + margin-left: 35px; + color: #888; } + @media (max-width: 767px) { + .blog-post-date { + margin-left: 15px; } } + .blog-post-date span { + color: #333; } + +.blog-post-share { + float: right; + color: #888; } + @media (max-width: 767px) { + .blog-post-share { + float: none; } } + .blog-post-share a { + margin-left: 13px; + position: relative; + top: 3px; + text-decoration: none; } + .blog-post-share i { + font-size: 25px; } + .blog-post-share i.ion-social-twitter { + color: #1da1f2; } + .blog-post-share i.ion-social-facebook { + color: #3b5998; + font-size: 28px; + margin-right: 3px; } + .blog-post-share i.ion-social-buffer { + color: #2d2d2d; } + +.blog-post-wrapper { + margin-top: 30px; } + .blog-post-wrapper .post { + float: none; + margin: 0 auto; + margin-bottom: 50px; } + .blog-post-wrapper .post .title { + font-size: 31px; + font-weight: 600; + margin-top: 40px; + color: #252525; } + @media (max-width: 767px) { + .blog-post-wrapper .post .title { + font-size: 26px; + line-height: 28px; } } + .blog-post-wrapper .post .content { + margin-top: 45px; + font-size: 15px; + line-height: 30px; + color: #454545; + margin-bottom: 25px; } + .blog-post-wrapper .post .content p { + margin-top: 28px; } + .blog-post-wrapper .post .content blockquote { + border-left: 2px solid #c0c9dc; + color: rgba(51, 51, 51, 0.55); + margin: 35px 0; + padding: 5px 20px; + padding-left: 23px; } + .blog-post-wrapper .post .content blockquote p { + margin: 0; + line-height: 30px; + font-weight: normal; } + .blog-post-wrapper .post .content blockquote .quote-author { + margin-top: 14px; } + .blog-post-wrapper .post .content img { + margin: 0 auto; + margin-top: 55px; + margin-bottom: 55px; } + .blog-post-wrapper .post .content .divider { + border-bottom: 1px solid #DEDEDC; + width: 20%; + margin: 0 auto; + margin-top: 35px; + margin-bottom: 35px; } + .blog-post-wrapper .post .share { + margin-top: 50px; } + .blog-post-wrapper .post .other-posts { + margin-top: 50px; } + +.pricing-3-options-section { + margin-top: 70px; } + .pricing-3-options-section .header { + text-align: center; } + .pricing-3-options-section .header h3 { + font-size: 24px; + color: #444; + line-height: 25px; + font-weight: 500; } + .pricing-3-options-section .header p { + font-size: 16px; + font-weight: 400; + color: #888; } + .pricing-3-options-section .charts { + margin-top: 45px; } + .pricing-3-options-section .charts .chart { + background-color: #fff; + border: 1px solid #D8D8D8; + border-radius: 5px; + box-shadow: 0px 0px 2px 0px rgba(181, 181, 181, 0.3); + padding: 20px 40px; + position: relative; + text-align: center; + width: 97%; + min-height: 315px; + position: relative; + top: 20px; } + @media (min-width: 992px) { + .pricing-3-options-section .charts .chart.first { + float: right; + left: 45px; } + .pricing-3-options-section .charts .chart.last { + left: -45px; } } + @media (max-width: 991px) { + .pricing-3-options-section .charts .chart { + float: none !important; + left: 0px !important; + top: 0px !important; + margin: 0 auto; + width: 55%; + margin-bottom: 25px !important; } + .pricing-3-options-section .charts .chart.last { + margin-bottom: 0px !important; } } + @media (max-width: 600px) { + .pricing-3-options-section .charts .chart { + width: 90% !important; } } + .pricing-3-options-section .charts .chart.featured { + z-index: 999; } + @media (min-width: 992px) { + .pricing-3-options-section .charts .chart.featured { + margin: 0 auto; + top: 0px; + min-height: 445px; } + .pricing-3-options-section .charts .chart.featured .btn-signup { + margin-top: 32px; } } + .pricing-3-options-section .charts .chart.featured .popular { + position: absolute; + top: 0px; + left: 0px; } + .pricing-3-options-section .charts .chart.featured .quantity { + margin-top: 15px; + padding-bottom: 5px; } + .pricing-3-options-section .charts .chart .plan-name { + text-align: center; + font-size: 20px; + font-weight: 400; + color: #444; + width: 90%; + margin: 0 auto; + margin-top: 5px; } + .pricing-3-options-section .charts .chart .quantity { + text-align: center; + border-bottom: 1px solid #d5d5d5; + margin-top: 10px; } + .pricing-3-options-section .charts .chart .quantity .dollar { + font-size: 19px; + position: relative; + top: -18px; } + .pricing-3-options-section .charts .chart .quantity .price { + font-size: 49px; } + .pricing-3-options-section .charts .chart .quantity .period { + font-size: 17px; + position: relative; + top: -8px; + margin-left: 4px; } + .pricing-3-options-section .charts .chart .specs { + margin-top: 20px; } + .pricing-3-options-section .charts .chart .specs .spec { + font-size: 15px; + color: #474747; + text-align: center; + font-weight: 300; + margin-bottom: 13px; } + .pricing-3-options-section .charts .chart .specs .spec .variable { + color: #1FBEE7; + font-weight: 500; } + .pricing-3-options-section .charts .chart .btn-signup { + margin-top: 20px; + height: 38px; } + .pricing-3-options-section .message p { + text-align: center; + font-size: 13px; + color: #656565; + margin-top: 23px; } + .pricing-3-options-section .faq { + margin-top: 40px; } + .pricing-3-options-section .faq .header h3 { + font-size: 20px; + color: #454545; + text-align: left; } + .pricing-3-options-section .faq .questions { + margin-top: 25px; } + .pricing-3-options-section .faq .questions .question { + margin-bottom: 40px; } + @media (min-width: 992px) { + .pricing-3-options-section .faq .questions .question { + width: 90%; } } + .pricing-3-options-section .faq .questions .question strong { + font-weight: 500; + font-size: 16px; + color: #454545; } + .pricing-3-options-section .faq .questions .question p { + color: #555; + margin-top: 10px; + font-size: 13px; + line-height: 22px; } + .pricing-3-options-section .contact { + margin-top: 40px; } + .pricing-3-options-section .contact .wrapper { + background: #F7F8FB; + border: 1px solid #EAEDF7; + border-radius: 8px; + padding: 25px 60px; + box-shadow: inset rgba(100, 100, 100, 0.25) 0 1px 1px; + margin: 0 auto; } + .pricing-3-options-section .contact h4 { + font-size: 15px; + position: relative; + color: #696E72; + text-align: center; + font-weight: 500; + text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.8); } + @media (max-width: 991px) { + .pricing-3-options-section .contact h4 { + line-height: 26px; } } + .pricing-3-options-section .contact h4 span { + position: absolute; + font-size: 23px; + top: -5px; + left: 72px; + color: #626E7A; } + @media (max-width: 991px) { + .pricing-3-options-section .contact h4 span { + position: relative; + left: 0px; + top: 5px; } } + +.pricing-dark-section { + border-top: 1px solid #EAEAEA; + border-bottom: 1px solid #EAEAEA; + background: #5E7A9B; + background: -webkit-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -moz-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: -o-linear-gradient(top, #355069 0, #5E7A9B 100%); + background: linear-gradient(top, #355069 0, #5E7A9B 100%); + margin-top: 120px; + padding-top: 45px; + padding-bottom: 70px; } + .pricing-dark-section .header { + text-align: center; } + @media (max-width: 991px) { + .pricing-dark-section .header { + margin-bottom: 25px; } } + .pricing-dark-section .header h3 { + font-size: 27px; + color: #fff; + line-height: 25px; + font-weight: 400; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } + @media (max-width: 767px) { + .pricing-dark-section .header h3 { + font-size: 24px; + line-height: 29px; } } + .pricing-dark-section .header p { + font-size: 16px; + margin-top: 15px; + color: #F0F0F0; + font-weight: 400; + line-height: 25px; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } + .pricing-dark-section .charts { + margin-top: 35px; } + @media (max-width: 991px) { + .pricing-dark-section .charts { + margin-top: 10px; } } + .pricing-dark-section .charts .chart { + background-color: #fff; + border: 1px solid #E6E6E6; + border-radius: 5px; + box-shadow: 0px 0px 2px 0px rgba(181, 181, 181, 0.3); + padding: 20px 40px; + position: relative; + text-align: center; + width: 97%; + min-height: 315px; + position: relative; + top: 37px; } + @media (max-width: 991px) { + .pricing-dark-section .charts .chart { + float: none !important; + left: 0px !important; + top: 0px !important; + margin: 0 auto; + width: 55%; + margin-bottom: 25px !important; } + .pricing-dark-section .charts .chart.last { + margin-bottom: 0px !important; } } + @media (max-width: 600px) { + .pricing-dark-section .charts .chart { + width: 90% !important; } } + .pricing-dark-section .charts .chart.first { + float: right; + left: 12px; } + .pricing-dark-section .charts .chart.last { + left: -12px; } + .pricing-dark-section .charts .chart.featured { + min-height: 350px; + top: 0px; + margin: 0 auto; } + .pricing-dark-section .charts .chart.featured .popular { + text-align: center; + text-transform: uppercase; + font-size: 16px; + letter-spacing: 1px; + color: #B1B1B1; + font-weight: 400; } + .pricing-dark-section .charts .chart.featured .quantity { + margin-top: 15px; } + .pricing-dark-section .charts .chart .quantity { + text-align: center; } + .pricing-dark-section .charts .chart .quantity .dollar { + font-size: 19px; + position: relative; + top: -18px; } + .pricing-dark-section .charts .chart .quantity .price { + font-size: 49px; } + .pricing-dark-section .charts .chart .quantity .period { + font-size: 17px; + position: relative; + top: -8px; + margin-left: 4px; } + .pricing-dark-section .charts .chart .plan-name { + text-align: center; + font-size: 20px; + font-weight: 400; + color: #777; + border-bottom: 1px solid #d5d5d5; + padding-bottom: 15px; + width: 90%; + margin: 0 auto; + margin-top: 8px; } + .pricing-dark-section .charts .chart .specs { + margin-top: 20px; } + .pricing-dark-section .charts .chart .specs .spec { + font-size: 15px; + color: #353535; + text-align: center; + font-weight: 300; + margin-bottom: 13px; } + .pricing-dark-section .charts .chart .specs .spec .variable { + color: #1FBEE7; + font-weight: 400; } + .pricing-dark-section .charts .chart .btn-signup { + margin-top: 20px; + height: 38px; } + +.pricing-4-options-section { + margin-top: 55px; + margin-bottom: 150px; } + .pricing-4-options-section .header { + text-align: center; } + .pricing-4-options-section .header h3 { + font-size: 24px; + color: #444; + line-height: 25px; + font-weight: 500; } + .pricing-4-options-section .header p { + font-size: 16px; + font-weight: 400; + color: #888; } + @media (min-width: 992px) { + .pricing-4-options-section .container { + width: 1060px; } } + .pricing-4-options-section .charts { + margin-top: 50px; } + .pricing-4-options-section .charts .basic-plan { + background-color: #fff; + border: 1px solid #E6E6E6; + border-radius: 5px; + box-shadow: 0px 0px 2px 0px rgba(181, 181, 181, 0.3); + padding: 20px 30px 10px 30px; + text-align: center; + width: 220px; + position: absolute; + right: 0px; + top: 20px; } + @media (max-width: 991px) { + .pricing-4-options-section .charts .basic-plan { + float: none !important; + left: 0px !important; + top: 0px !important; + margin: 0 auto; + width: 55%; + margin-bottom: 25px !important; + position: relative; + margin-top: 30px; } + .pricing-4-options-section .charts .basic-plan.last { + margin-bottom: 0px !important; } } + @media (max-width: 600px) { + .pricing-4-options-section .charts .basic-plan { + width: 90% !important; } } + .pricing-4-options-section .charts .basic-plan .plan-name { + text-align: center; + font-size: 17px; + font-weight: 400; + color: #444; + width: 90%; + margin: 0 auto; + margin-top: 5px; } + .pricing-4-options-section .charts .basic-plan .quantity { + text-align: center; + border-bottom: 1px solid #d5d5d5; + margin-top: 5px; } + .pricing-4-options-section .charts .basic-plan .quantity .dollar { + font-size: 19px; + position: relative; + top: -18px; } + .pricing-4-options-section .charts .basic-plan .quantity .price { + font-size: 42px; } + .pricing-4-options-section .charts .basic-plan .quantity .period { + font-size: 17px; + position: relative; + top: -8px; + margin-left: 4px; } + .pricing-4-options-section .charts .basic-plan .description { + margin-top: 15px; + font-size: 13px; + color: #444; + line-height: 20px; } + .pricing-4-options-section .charts .basic-plan .description a { + display: block; + margin-top: 20px; + font-weight: 500; + font-size: 15px; } + .pricing-4-options-section .charts .chart { + background-color: #fff; + border: 1px solid #E6E6E6; + border-radius: 5px; + box-shadow: 0px 0px 2px 0px rgba(181, 181, 181, 0.3); + padding: 20px 40px; + position: relative; + text-align: center; + width: 280px; + float: left; + min-height: 315px; + position: relative; + top: 20px; } + @media (min-width: 992px) { + .pricing-4-options-section .charts .chart.featured { + left: -25px; } + .pricing-4-options-section .charts .chart.last { + left: -45px; } } + @media (max-width: 991px) { + .pricing-4-options-section .charts .chart { + float: none !important; + left: 0px !important; + top: 0px !important; + margin: 0 auto; + width: 55%; + margin-bottom: 25px !important; } + .pricing-4-options-section .charts .chart.last { + margin-bottom: 0px !important; } } + @media (max-width: 600px) { + .pricing-4-options-section .charts .chart { + width: 90% !important; } } + .pricing-4-options-section .charts .chart.featured { + z-index: 999; } + @media (min-width: 992px) { + .pricing-4-options-section .charts .chart.featured { + margin: 0 auto; + top: 0px; + min-height: 445px; } + .pricing-4-options-section .charts .chart.featured .btn-signup { + margin-top: 32px; } } + .pricing-4-options-section .charts .chart.featured .popular { + position: absolute; + top: 0px; + left: 0px; } + .pricing-4-options-section .charts .chart.featured .quantity { + margin-top: 15px; + padding-bottom: 5px; } + .pricing-4-options-section .charts .chart .plan-name { + text-align: center; + font-size: 20px; + font-weight: 400; + color: #444; + width: 90%; + margin: 0 auto; + margin-top: 5px; } + .pricing-4-options-section .charts .chart .quantity { + text-align: center; + border-bottom: 1px solid #d5d5d5; + margin-top: 10px; } + .pricing-4-options-section .charts .chart .quantity .dollar { + font-size: 19px; + position: relative; + top: -18px; } + .pricing-4-options-section .charts .chart .quantity .price { + font-size: 49px; } + .pricing-4-options-section .charts .chart .quantity .period { + font-size: 17px; + position: relative; + top: -8px; + margin-left: 4px; } + .pricing-4-options-section .charts .chart .specs { + margin-top: 20px; } + .pricing-4-options-section .charts .chart .specs .spec { + font-size: 15px; + color: #353535; + text-align: center; + font-weight: 300; + margin-bottom: 13px; } + .pricing-4-options-section .charts .chart .specs .spec .variable { + color: #1FBEE7; + font-weight: 400; } + .pricing-4-options-section .charts .chart .btn-signup { + margin-top: 20px; + height: 38px; } + +.pricing-tabs-section { + margin-top: 60px; } + .pricing-tabs-section .header { + text-align: center; } + .pricing-tabs-section .header h3 { + font-size: 23px; + color: #444; + line-height: 25px; + font-weight: 500; } + .pricing-tabs-section .header p { + font-size: 16px; + font-weight: 400; + color: #888; } + .pricing-tabs-section .tabs { + background: #F8F8F8; + text-align: center; + border-radius: 3px; + margin-top: 40px; } + .pricing-tabs-section .tabs .tab { + background-color: #F8F8F8; + font-weight: 500; + font-size: 15px; + color: #555; + display: inline-block; + padding: 18px 25px; + margin-top: 10px; + cursor: pointer; + -webkit-transition: background-color 0.2s linear; + -moz-transition: background-color 0.2s linear; + -ms-transition: background-color 0.2s linear; + -o-transition: background-color 0.2s linear; + transition: background-color 0.2s linear; } + .pricing-tabs-section .tabs .tab.anually { + padding: 18px 18px 18px 23px; } + .pricing-tabs-section .tabs .tab.active { + background-color: #fff; + border: 1px solid #E8E8E8; + border-radius: 5px 5px 0px 0px; + border-bottom: 0px; } + .pricing-tabs-section .tabs .tab span { + position: relative; + top: -2px; } + .pricing-tabs-section .tabs .tab small { + color: #32ACDA; + margin-left: 3px; } + .pricing-tabs-section .plans { + margin-top: 30px; + border: 1px solid #E3E3E3; + border-radius: 5px; } + .pricing-tabs-section .plans .plan { + border-right: 0px; + min-height: 220px; } + .pricing-tabs-section .plans .plan.middle { + border-right: 1px solid #E3E3E3; + border-left: 1px solid #E3E3E3; } + .pricing-tabs-section .plans .plan .header { + text-align: left; + padding: 18px 25px; + border-bottom: 1px solid #E3E3E3; + margin: 0px -15px; + font-weight: 500; + font-size: 15px; } + .pricing-tabs-section .plans .plan .header .icon { + color: #B7C5D8; + font-size: 18px; + position: relative; + top: 2px; + left: -4px; } + .pricing-tabs-section .plans .plan .header .price { + float: right; + color: #3CA2E5; } + .pricing-tabs-section .plans .plan .specs { + margin-top: 25px; + padding: 0px 10px 17px 10px; } + .pricing-tabs-section .plans .plan .specs .spec { + font-size: 15px; + color: #666; + margin-bottom: 13px; } + .pricing-tabs-section .plans .plan .specs .spec .variable { + color: #1FBEE7; + font-weight: 400; } + .pricing-tabs-section .signup { + margin-top: 50px; + text-align: center; } + .pricing-tabs-section .signup .button { + padding: 16px 38px; + font-size: 15px; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4ABCF3), color-stop(100%, #1a80d9)); + background: -webkit-linear-gradient(#4ABCF3, #1a80d9); + background: -moz-linear-gradient(#4ABCF3, #1a80d9); + background: -o-linear-gradient(#4ABCF3, #1a80d9); + background: linear-gradient(#4ABCF3, #1a80d9); } + .pricing-tabs-section .signup .message { + text-align: center; + margin-top: 20px; + font-size: 12px; + color: #888; } + +.pricing-comparison-section .divider { + height: 1px; + width: 100%; + background-color: #ddd; + position: relative; + margin: 120px 0 60px; } + .pricing-comparison-section .divider:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 2px; + background-image: -webkit-gradient(linear, left top, right top, color-stop(0, rgba(255, 255, 255, 0.75)), color-stop(0.5, rgba(250, 250, 250, 0)), color-stop(1, rgba(255, 255, 255, 0.75))); + background-image: -webkit-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -moz-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -o-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -ms-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); } +.pricing-comparison-section .header { + text-align: center; } + .pricing-comparison-section .header h3 { + font-size: 24px; + color: #444; + line-height: 25px; + font-weight: 500; } + .pricing-comparison-section .header p { + font-size: 16px; + font-weight: 400; + color: #888; } +.pricing-comparison-section .chart { + margin-top: 40px; + border: 1px solid #dfdfdf; + border-radius: 5px; + box-shadow: 0px 2px 3px 1px rgba(0, 0, 0, 0.1); } + .pricing-comparison-section .chart .header { + text-align: center; + background: #fbfbfb; + margin: 0px -15px; + padding: 20px 35px; + font-weight: 500; + font-size: 17px; + color: #444; + border-bottom: 1px solid #dfdfdf; + height: 73px; } + @media (max-width: 991px) { + .pricing-comparison-section .chart .header { + font-size: 15px; } } + @media (max-width: 767px) { + .pricing-comparison-section .chart .header { + font-size: 13px; } } + .pricing-comparison-section .chart .header .price { + color: #1a80d9; + position: relative; + top: 3px; + font-size: 14px; } + @media (max-width: 767px) { + .pricing-comparison-section .chart .header .price { + font-size: 13px; } } + .pricing-comparison-section .chart .features-col .header { + text-align: left; + border-radius: 5px 0px 0px 0px; + margin-bottom: 30px; + padding: 23px 30px; + font-size: 18px; } + @media (max-width: 991px) { + .pricing-comparison-section .chart .features-col .header { + font-size: 16px; } } + .pricing-comparison-section .chart .features-col .spec { + margin-bottom: 32px; + padding-left: 40px; + position: relative; } + .pricing-comparison-section .chart .features-col .spec .icon { + position: absolute; + font-size: 27px; + color: #849FC4; + left: 0px; + top: -4px; } + .pricing-comparison-section .chart .plan-col { + border-left: 1px solid #dfdfdf; } + .pricing-comparison-section .chart .plan-col.last .header { + border-radius: 0px 5px 0px 0px; } + .pricing-comparison-section .chart .plan-col .header { + padding: 13px 0px; } + .pricing-comparison-section .chart .plan-col .spec { + margin-bottom: 34px; + margin-top: 25px; } + .pricing-comparison-section .chart .plan-col .spec .check { + margin: 0 auto; + display: block; + max-width: 20px; } + .pricing-comparison-section .chart .plan-col .button { + margin-top: 20px; + margin-bottom: 15px; + font-size: 13px; + padding: 11px 24px; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4ABCF3), color-stop(100%, #1a80d9)); + background: -webkit-linear-gradient(#4ABCF3, #1a80d9); + background: -moz-linear-gradient(#4ABCF3, #1a80d9); + background: -o-linear-gradient(#4ABCF3, #1a80d9); + background: linear-gradient(#4ABCF3, #1a80d9); } + @media (max-width: 991px) { + .pricing-comparison-section .chart .plan-col .button { + padding: 6px 10px; + text-align: center; } } +.pricing-comparison-section .message p { + text-align: center; + font-size: 13px; + color: #656565; + margin-top: 30px; } +.pricing-comparison-section .faq { + margin-top: 50px; } + .pricing-comparison-section .faq .header h3 { + font-size: 20px; + color: #454545; + text-align: left; } + .pricing-comparison-section .faq .questions { + margin-top: 25px; } + .pricing-comparison-section .faq .questions .question { + margin-bottom: 40px; } + @media (min-width: 992px) { + .pricing-comparison-section .faq .questions .question { + width: 90%; } } + .pricing-comparison-section .faq .questions .question strong { + font-weight: 500; + font-size: 16px; + color: #454545; } + .pricing-comparison-section .faq .questions .question p { + color: #555; + margin-top: 10px; + font-size: 13px; + line-height: 22px; } + +.about-us-slider { + margin-top: 60px; } + .about-us-slider .header { + text-align: left; } + .about-us-slider .header h3 { + font-size: 26px; + color: #444; + line-height: 25px; + font-weight: 500; } + .about-us-slider .header p { + font-size: 15px; + font-weight: 400; + color: #666; + margin-top: 20px; + line-height: 24px; } + @media (min-width: 992px) { + .about-us-slider .header p { + width: 48%; } } + .about-us-slider .flexslider { + margin-top: 40px; + box-shadow: none; + border-radius: 0px; } + .about-us-slider .flexslider .slides img { + max-height: 400px; } + .about-us-slider .flexslider .flex-control-paging { + bottom: -35px; } + .about-us-slider .flexslider .flex-control-paging li { + margin: 0 7px; } + .about-us-slider .flexslider .flex-control-paging li a { + background: #e6e6e6; + box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.3); + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .about-us-slider .flexslider .flex-control-paging li a.flex-active { + background: #3785b9; } + +.about-us-team { + margin-top: 40px; } + .about-us-team h1 { + font-size: 24px; + color: #444; + line-height: 25px; + font-weight: 500; + margin-bottom: 25px; } + .about-us-team p { + color: #666; + line-height: 23px; + margin-bottom: 15px; } + @media (min-width: 992px) { + .about-us-team p { + width: 88%; } } + .about-us-team .join-team { + padding: 8px 26px; + font-size: 13px; + margin-top: 10px; } + .about-us-team .stats { + margin-top: 60px; + font-size: 16px; + color: #757575; } + .about-us-team .stats strong { + font-size: 33px; + color: #656565; + font-weight: 500; + position: relative; + top: 1px; + margin-right: 5px; } + .about-us-team .stats .col-sm-3 { + border-bottom: 1px solid #efefef; + padding-bottom: 25px; } + @media (max-width: 767px) { + .about-us-team .stats .col-sm-3 { + padding-bottom: 10px; + margin-bottom: 20px; } } + .about-us-team .team { + margin-top: 90px; } + .about-us-team .team .team-row { + text-align: center; + margin-bottom: 35px; } + .about-us-team .team img { + margin: 0px 20px; + max-width: 90px; + border-radius: 10px; + position: relative; + top: 0px; + box-shadow: 0px 2px 1px 0px rgba(0, 0, 0, 0.4); + -webkit-transition: top 0.15s linear; + -moz-transition: top 0.15s linear; + -ms-transition: top 0.15s linear; + -o-transition: top 0.15s linear; + transition: top 0.15s linear; } + @media (max-width: 991px) { + .about-us-team .team img { + margin: 0px 10px 20px 0; } } + .about-us-team .team img:hover { + top: -5px; + box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.5); } + .about-us-team .team .tooltip-inner { + padding: 12px 18px; + font-size: 13px; + background: rgba(0, 0, 0, 0.8); + border: 1px solid #000; + border-bottom: 0px; } + .about-us-team .team .tooltip-arrow { + border-top-color: rgba(0, 0, 0, 0.8); } + +.contact-us-map { + position: relative; + top: -20px; + box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.35); } + .contact-us-map #map { + height: 450px; + width: 100%; } + .contact-us-map #directions { + position: absolute; + top: 50px; + left: 13%; + text-align: center; + width: 300px; + background: rgba(255, 255, 255, 0.9); + border-radius: 5px; + box-shadow: 0px 4px 15px 0px rgba(0, 0, 0, 0.2); + padding: 30px 20px 30px 20px; } + @media (max-width: 767px) { + .contact-us-map #directions { + display: none; } } + .contact-us-map #directions p { + font-size: 19px; + color: #333; + margin-bottom: 15px; } + .contact-us-map #directions button { + margin-top: 15px; } + +.contact-us-info { + margin-top: 50px; } + .contact-us-info .message h3 { + color: #444; + font-size: 24px; + font-weight: 500; } + .contact-us-info .message p { + font-size: 15px; + font-weight: 400; + color: #777; } + .contact-us-info .message form { + margin-top: 35px; + width: 80%; + /* error messages from jquery validate */ } + @media (max-width: 767px) { + .contact-us-info .message form { + width: 100%; } } + .contact-us-info .message form input[type="text"], + .contact-us-info .message form input[type="email"] { + width: 70%; } + @media (max-width: 767px) { + .contact-us-info .message form input[type="text"], + .contact-us-info .message form input[type="email"] { + width: 100%; } } + .contact-us-info .message form label { + color: #555; + font-weight: 500; + margin-bottom: 7px; } + .contact-us-info .message form .button { + margin-top: 20px; } + .contact-us-info .message form label.error { + position: relative !important; + display: inline-block !important; + margin-top: -2px !important; + margin-bottom: -8px !important; + color: #fff !important; + font-weight: normal !important; + font-size: 15px !important; + padding: 5px 7px !important; + background: #4B9FCF !important; + border-radius: 4px !important; } + .contact-us-info .message form label.error.valid { + display: none !important; } + .contact-us-info .message form label.error:after { + bottom: 100%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; + border-bottom-color: #4B9FCF; + border-width: 5px; + left: 30px; + margin-left: -5px; } + @media (max-width: 991px) { + .contact-us-info .contact { + margin-top: 50px; } } + .contact-us-info .contact .address { + margin-bottom: 30px; } + .contact-us-info .contact h3 { + color: #444; + font-size: 18px; + font-weight: 500; } + .contact-us-info .contact p { + font-size: 15px; + font-weight: 400; + color: #777; } + .contact-us-info .contact .online-support { + background: #f8fdfe; + border: 1px solid #bee1f3; + margin-top: 40px; + border-radius: 6px; + padding: 20px 22px 18px 22px; + width: 70%; } + .contact-us-info .contact .online-support strong { + font-weight: 500; + color: #333; + font-size: 15px; } + .contact-us-info .contact .online-support p { + color: #1f95d0; + margin-top: 14px; + line-height: 18px; } + .contact-us-info .contact .social { + margin-top: 25px; } + .contact-us-info .contact .social a { + border: 0px; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .contact-us-info .contact .social a.tw { + position: relative; + top: 2px; } + .contact-us-info .contact .social a:hover { + opacity: 0.8; + filter: alpha(opacity=80); } + +.status-page { + margin-top: 40px; + margin-bottom: 130px; } + .status-page .header { + text-align: center; } + .status-page .header h3 { + font-size: 22px; + color: #444; + line-height: 25px; + font-weight: 500; + margin-bottom: 7px; } + .status-page .header p { + font-size: 16px; + font-weight: 400; + color: #888; } + .status-page .current-status { + background: #F7F8FB; + border: 1px solid #EAEDF7; + border-radius: 8px; + box-shadow: inset rgba(100, 100, 100, 0.25) 0 1px 1px; + padding: 20px 30px; + margin: 0 auto; + margin-top: 35px; } + .status-page .current-status .updated { + float: right; + color: #616A72; + font-size: 13px; } + @media (max-width: 767px) { + .status-page .current-status .updated { + float: none; + text-align: center; + display: block; + margin-bottom: 20px; } } + .status-page .current-status .status { + font-size: 18px; + font-weight: 500; } + .status-page .current-status .status .color { + width: 15px; + height: 15px; + border-radius: 50px; + float: left; + position: relative; + top: 5px; + margin-right: 20px; } + .status-page .current-status .status .color.green { + background: #96cb4c; + border: 1px solid #8BC43D; + box-shadow: 0px 0px 7px 2px #B3E074, inset 0px 2px 1px -1px rgba(255, 255, 255, 0.8); } + .status-page .current-status .status .color.yellow { + background: #F0D775; + border: 1px solid #E0CC7E; + box-shadow: 0px 0px 7px 2px #F0D775, inset 0px 2px 1px -1px rgba(255, 255, 255, 0.8); } + .status-page .current-status .status .color.red { + background: #F56B65; + border: 1px solid #FC7D77; + box-shadow: 0px 0px 7px 2px #FF9B96, inset 0px 2px 1px -1px rgba(255, 255, 255, 0.8); } + .status-page .current-status .help { + margin-top: 7px; + margin-left: 35px; } + .status-page .modules { + margin-top: 40px; + border-radius: 5px; } + .status-page .modules > .list-group .list-group-item { + padding: 13px 15px; } + .status-page .modules > .list-group .list-group-item:first-child { + border-top: 0px; + border-top-right-radius: 5px; + border-top-left-radius: 5px; } + .status-page .modules > .list-group .list-group-item .status { + float: right; + color: #0F9B0F; + font-size: 13px; + font-weight: 500; } + .status-page .modules > .list-group .list-group-item .status.down { + color: #D88C1B; } + .status-page .messages { + margin-top: 35px; } + .status-page .messages h3 { + font-size: 18px; + color: #444; + margin-bottom: 25px; } + .status-page .messages .date { + margin-bottom: 25px; } + .status-page .messages .date .day { + font-size: 13px; + font-weight: bold; + color: #454545; + padding-bottom: 6px; + margin-bottom: 6px; + border-bottom: 1px solid #eee; } + .status-page .messages .date .ok { + color: #0F9B0F; + font-size: 13px; + font-weight: 500; } + .status-page .messages .date .issues { + color: #D88C1B; + font-size: 13px; + font-weight: 500; + margin-bottom: 18px; } + .status-page .messages .date .update { + color: #333; + font-size: 13px; } + .status-page .messages .date .update strong { + font-size: 13px; + font-weight: bold; + color: #454545; + min-width: 93px; + display: inline-block; } + .status-page .full-history { + margin-top: 50px; } + +.gallery-showcase { + margin-top: 60px; } + .gallery-showcase .header { + text-align: left; } + .gallery-showcase .header h3 { + font-size: 26px; + color: #596166; + line-height: 25px; + font-weight: 500; } + .gallery-showcase .header p { + font-size: 15px; + font-weight: 400; + color: #666; + margin-top: 12px; + line-height: 24px; } + @media (min-width: 992px) { + .gallery-showcase .header p { + width: 48%; } } + .gallery-showcase .filtering { + margin-top: 35px; + margin-bottom: 35px; } + .gallery-showcase .filtering #filters { + padding-left: 20px; + text-align: center; + border-bottom: 2px solid #EDEDED; } + @media (max-width: 767px) { + .gallery-showcase .filtering #filters { + display: none; } } + .gallery-showcase .filtering #filters li { + list-style-type: none; + display: inline-block; + margin: 0px 8px; } + .gallery-showcase .filtering #filters li:first-child { + margin-left: 0px; } + .gallery-showcase .filtering #filters li a { + color: #888; + font-weight: 400; + border: 0px; + padding: 10px 22px; + font-size: 16px; + position: relative; + -webkit-transition: color 0.25s linear; + -moz-transition: color 0.25s linear; + -ms-transition: color 0.25s linear; + -o-transition: color 0.25s linear; + transition: color 0.25s linear; } + .gallery-showcase .filtering #filters li a.active { + color: #2B69A2; + font-weight: 400; + border-bottom: 0px; + display: inline-block; } + .gallery-showcase .filtering #filters li a.active:after { + content: ''; + position: absolute; + width: 100%; + height: auto; + border-bottom: 2px solid #7BA3C9; + left: 1px; + bottom: -2px; } + .gallery-showcase .filtering #filters li a:hover { + color: #2B69A2; + background: none; + text-decoration: none; } + .gallery-showcase .gallery_container { + overflow: visible !important; } + .gallery-showcase .pic { + margin-bottom: 40px; + position: relative; + display: block; + -webkit-transition: 0.5s cubic-bezier(0.25, 1.45, 0.51, 1.13); + -moz-transition: 0.5s cubic-bezier(0.25, 1.45, 0.51, 1.13); + -ms-transition: 0.5s cubic-bezier(0.25, 1.45, 0.51, 1.13); + -o-transition: 0.5s cubic-bezier(0.25, 1.45, 0.51, 1.13); + transition: 0.5s cubic-bezier(0.25, 1.45, 0.51, 1.13); } + .gallery-showcase .pic.fluidbox-opened:hover .layer { + background: rgba(0, 0, 0, 0); } + .gallery-showcase .pic.fluidbox-opened:hover .layer p { + opacity: 0; + filter: alpha(opacity=0); } + .gallery-showcase .pic:hover { + text-decoration: none; } + .gallery-showcase .pic:hover .layer { + background: rgba(33, 33, 33, 0.8); } + .gallery-showcase .pic:hover .layer p { + margin-top: -20px; + opacity: 1; + filter: alpha(opacity=100); } + .gallery-showcase .pic .layer { + width: 100%; + height: 100%; + position: absolute; + z-index: 9; + top: 0px; + left: 0px; + background: rgba(0, 0, 0, 0); + -webkit-transition: all 0.25s ease-out; + -moz-transition: all 0.25s ease-out; + -ms-transition: all 0.25s ease-out; + -o-transition: all 0.25s ease-out; + transition: all 0.25s ease-out; } + .gallery-showcase .pic .layer p { + transition: margin-top .35s ease-out, opacity .55s ease-out; + color: #fff; + font-size: 15px; + text-align: center; + top: 50%; + width: 100%; + position: absolute; + font-weight: 600; + margin-top: 25px; + opacity: 0; + filter: alpha(opacity=0); } + .gallery-showcase .pic .layer p span { + position: relative; + top: 1px; + margin-right: 2px; } + .gallery-showcase .pic img { + margin: 0 auto; } + +/* Fluidbox styling starts here */ +a[data-fluidbox] { + background-color: #eee; + border: none; + cursor: -webkit-zoom-in; + cursor: -moz-zoom-in; + margin-bottom: 1.5rem; } + a[data-fluidbox].fluidbox-opened { + cursor: -webkit-zoom-out; + cursor: -moz-zoom-out; } + a[data-fluidbox] img { + display: block; + margin: 0 auto; + opacity: 0; + filter: alpha(opacity=0); + max-width: 100%; + transition: all .25s ease-in-out; } + +a[class^='float'] { + margin: 1rem; + margin-top: 0; + width: 33.33333%; } + a[class^='float'].float-left { + float: left; + margin-left: 0; } + a[class^='float'].float-right { + float: right; + margin-right: 0; } + +#fluidbox-overlay { + background-color: rgba(255, 255, 255, 0.85); + cursor: pointer; + cursor: -webkit-zoom-out; + cursor: -moz-zoom-out; + display: none; + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + z-index: 500; } + +.fluidbox-wrap { + background-position: center center; + background-size: cover; + margin: 0 auto; + position: relative; + z-index: 400; + transition: all .25s ease-in-out; } + .fluidbox-opened .fluidbox-wrap { + z-index: 600; } + +.fluidbox-ghost { + background-size: cover; + background-position: center center; + position: absolute; + transition: all .25s ease-in-out; } + +html.portfolio-page { + background: #F5F9FF; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, rgba(255, 255, 255, 0)), color-stop(1, rgba(255, 255, 255, 0.5))); + background-image: -webkit-linear-gradient(top, rgba(255, 255, 255, 0) 0, rgba(255, 255, 255, 0.5) 100%); + background-image: -moz-linear-gradient(top, rgba(255, 255, 255, 0) 0, rgba(255, 255, 255, 0.5) 100%); + background-image: -o-linear-gradient(top, rgba(255, 255, 255, 0) 0, rgba(255, 255, 255, 0.5) 100%); + background-image: -ms-linear-gradient(top, rgba(255, 255, 255, 0) 0, rgba(255, 255, 255, 0.5) 100%); + background-image: linear-gradient(top, rgba(255, 255, 255, 0) 0, rgba(255, 255, 255, 0.5) 100%); + -webkit-background-size: 100% 30%; + -moz-background-size: 100% 30%; + background-size: 100% 30%; + background-repeat: no-repeat; + background-position: 0 100%; } + +.portfolio-body { + background: none; + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(25%, rgba(255, 255, 255, 0))); + background-image: -webkit-linear-gradient(top, #fff 0, rgba(255, 255, 255, 0) 25%); + background-image: -moz-linear-gradient(top, #fff 0, rgba(255, 255, 255, 0) 25%); + background-image: -o-linear-gradient(top, #fff 0, rgba(255, 255, 255, 0) 25%); + background-image: -ms-linear-gradient(top, #fff 0, rgba(255, 255, 255, 0) 25%); + background-image: linear-gradient(top, #fff 0, rgba(255, 255, 255, 0) 25%); } + +.portfolio-showcase { + margin-top: 50px; } + .portfolio-showcase .header { + text-align: left; + margin-bottom: 40px; } + .portfolio-showcase .header h3 { + font-size: 28px; + color: #596166; + line-height: 25px; + font-weight: 500; } + .portfolio-showcase .header p { + font-size: 16px; + font-weight: 400; + color: #8D959B; + line-height: 24px; } + @media (min-width: 992px) { + .portfolio-showcase .header p { + width: 48%; } } + .portfolio-showcase .project { + background: #fff; + padding: 40px 60px; + border-radius: 5px; + margin-bottom: 35px; + box-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05), 0 1px 0 rgba(0, 0, 0, 0.05), -1px 0 0 rgba(0, 0, 0, 0.04), 1px 0 0 rgba(0, 0, 0, 0.04), 0 1px 3px rgba(0, 0, 0, 0.12); } + @media (max-width: 767px) { + .portfolio-showcase .project { + padding: 40px 35px 35px 35px; } } + .portfolio-showcase .project h3 { + color: #585F64; + font-size: 22px; + margin-top: 0px; + text-align: center; } + .portfolio-showcase .project .screen { + margin-top: 45px; + text-align: center; } + .portfolio-showcase .project .screen img { + margin: 0 auto; } + .portfolio-showcase .project .description { + margin-top: 40px; + color: #7D8186; + line-height: 21px; } + .portfolio-showcase .project .divider { + height: 1px; + width: 100%; + background-color: #ddd; + position: relative; + margin-top: 45px; } + .portfolio-showcase .project .divider:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 2px; + background-image: -webkit-gradient(linear, left top, right top, color-stop(0, rgba(255, 255, 255, 0.75)), color-stop(0.5, rgba(250, 250, 250, 0)), color-stop(1, rgba(255, 255, 255, 0.75))); + background-image: -webkit-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -moz-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -o-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: -ms-linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); + background-image: linear-gradient(left, rgba(255, 255, 255, 0.75) 0%, rgba(250, 250, 250, 0) 50%, rgba(255, 255, 255, 0.75) 100%); } + .portfolio-showcase .project .visit { + margin-top: 30px; + text-align: center; } + +.portfolio-item-showcase { + margin-top: 40px; + margin-bottom: -30px; } + .portfolio-item-showcase .header { + text-align: left; + margin-bottom: 25px; } + .portfolio-item-showcase .header h3 { + display: inline-block; + font-size: 17px; + font-family: Myriad Pro, Lato, Helvetica Neue, Arial; + color: #53A6DA; + margin-top: 0px; + line-height: 25px; + font-weight: 500; + margin-bottom: 5px; + cursor: pointer; } + .portfolio-item-showcase .project h1 { + text-align: center; + font-size: 25px; + color: #647583; + margin-top: 10px; + margin-bottom: 70px; } + .portfolio-item-showcase .project .screens img { + margin: 0 auto; + margin-bottom: 80px; + margin-top: 10px; } + .portfolio-item-showcase .project .screens img.magnifier { + width: 490px; + margin-bottom: 100px; } + .portfolio-item-showcase .project .screens img.mobile { + margin-bottom: 110px; } + .portfolio-item-showcase .project .screens .text { + color: #7D8186; + font-size: 15px; + line-height: 22px; + margin-bottom: 80px; } + .portfolio-item-showcase .project .description .info { + margin-top: 25px; } + @media (min-width: 992px) { + .portfolio-item-showcase .project .description .info.stick { + position: fixed; + top: 10px; } } + .portfolio-item-showcase .project .description .info .icons { + margin-bottom: 20px; } + .portfolio-item-showcase .project .description .info .icons .ion-icon:before { + color: #b2c3cb; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #b2c3cb), color-stop(100%, #DBE3E7)); + background: -webkit-linear-gradient(#b2c3cb, #DBE3E7); + font-size: 60px; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + margin: 0 9px; } + .portfolio-item-showcase .project .description .info .icons .ion-social-windows:before { + font-size: 50px; } + .portfolio-item-showcase .project .description .info p { + color: #7D8186; + line-height: 22px; + margin-bottom: 22px; } + .portfolio-item-showcase .project .description .info .tweet-it { + color: #00A7DD; + margin-top: 3px; + display: inline-block; + position: relative; + padding-left: 29px; + text-decoration: none; } + .portfolio-item-showcase .project .description .info .tweet-it:hover .ion-social-twitter:before { + content: "\f242"; } + .portfolio-item-showcase .project .description .info .tweet-it .ion-social-twitter { + margin-right: 8px; + font-size: 21px; + position: absolute; + top: 0px; + left: 0px; } + +.support-header { + margin-top: -20px; + background: #F4F7FA; + border-bottom: 1px solid #DCE4EC; + padding: 50px 0px; } + @media (max-width: 767px) { + .support-header { + padding: 30px 0px; + text-align: center; } } + .support-header h2, .support-header p { + text-shadow: 1px 1px 1px #fff; } + @media (max-width: 767px) { + .support-header h2 { + font-size: 27px; } } + .support-header h2 .entypo-lifebuoy { + position: absolute; + left: -25px; + top: 22px; + font-size: 29px; + color: #7AA3C5; } + @media (max-width: 767px) { + .support-header h2 .entypo-lifebuoy { + position: relative; + left: 0px; } } + .support-header p { + font-size: 17px; + color: #5A5A5A; } + @media (max-width: 767px) { + .support-header p { + font-size: 15px; } } + .support-header form { + margin-top: 30px; } + .support-header form .input-group:before { + display: inline-block; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + line-height: 1; + content: "\f002"; + position: absolute; + top: 14px; + left: 13px; + font-size: 20px; + z-index: 99; + color: #d0dae4; } + .support-header form .form-control { + height: 50px; + font-size: 17px; + line-height: 20px; + padding-left: 42px; } + .support-header form .form-control::-webkit-input-placeholder { + color: #BCC8D6; + font-size: 17px; + font-weight: 300; } + .support-header form .form-control:-moz-placeholder { + color: #BCC8D6; + font-size: 17px; + font-weight: 300; } + .support-header form .form-control::-moz-placeholder { + color: #BCC8D6; + font-size: 17px; + font-weight: 300; } + .support-header form .form-control:-ms-input-placeholder { + color: #BCC8D6; + font-size: 17px; + font-weight: 300; } + .support-header form .input-group-btn .btn { + padding: 14px 18px; } + +.support-topics { + margin-top: 40px; } + .support-topics h4 { + font-weight: 400; + margin-bottom: 50px; + font-size: 25px; } + .support-topics .topic { + margin-bottom: 45px; } + @media (max-width: 767px) { + .support-topics .topic { + text-align: center; } } + .support-topics .topic .icon { + display: block; + font-size: 45px; + color: #70CBF5; } + .support-topics .topic a { + color: #454545; + text-decoration: none; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .support-topics .topic a strong { + display: block; + margin-top: 15px; + font-size: 16px; } + .support-topics .topic a:hover { + color: #5CB9E4; } + .support-topics .topic p { + margin-top: 17px; + color: #838383; } + +.not-found-page { + height: 100%; + background: #3A4F68; + background: -moz-radial-gradient(center, ellipse cover, #4D6077 0%, #3A4F68 100%); + background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #4D6077), color-stop(100%, #3A4F68)); + background: -webkit-radial-gradient(center, ellipse cover, #4D6077 0%, #3A4F68 100%); + background: -o-radial-gradient(center, ellipse cover, #4D6077 0%, #3A4F68 100%); + background: -ms-radial-gradient(center, ellipse cover, #4D6077 0%, #3A4F68 100%); + background: radial-gradient(ellipse at center, #4D6077 0%, #3A4F68 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#4D6077', endColorstr = '#3A4F68', GradientType = 1); } + +#not-found { + overflow: hidden; } + #not-found .info { + text-align: center; + padding-top: 100px; } + #not-found .info h1 { + color: #fff; + font-size: 13em; + margin-bottom: 20px; + font-weight: 200; + letter-spacing: -3px; + text-shadow: 1px 1px rgba(0, 0, 0, 0.35); } + #not-found .info p { + font-size: 23px; + color: #FFF; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.35); + margin-bottom: 0; } + #not-found .info .go-back { + font-size: 16px; + text-shadow: none; + color: #9BB2CE; + z-index: 999; + position: absolute; + left: 0; + right: 0; + padding: 25px 0; + max-width: 400px; + margin: auto; + margin-top: -15px; } + #not-found .info .go-back a { + color: #fff; } + #not-found #container canvas { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; } + +#not-found-alt { + overflow: hidden; } + #not-found-alt .info { + text-align: center; + margin-top: 30px; + position: absolute; + width: 100%; } + #not-found-alt .info h1 { + color: #fff; + font-size: 11em; + margin-bottom: 20px; + font-weight: 200; + letter-spacing: -3px; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.15); } + #not-found-alt .info p { + font-size: 25px; + color: #4D728A; + margin-bottom: 0; } + #not-found-alt .info .go-back { + font-size: 16px; + text-shadow: none; + letter-spacing: 0px; + color: #506379; + z-index: 999; + position: absolute; + left: 0; + right: 0; + padding: 25px 0; + max-width: 400px; + margin: auto; + margin-top: -15px; } + #not-found-alt .info .go-back a { + color: #429AD5; + text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.4); + font-size: 18px; } + #not-found-alt canvas { + background: linear-gradient(#b3d5e6 0%, #eef4f6 75%); + display: block; } + #not-found-alt #container { + height: 100%; + left: 0; + position: fixed; + top: 0; + width: 100%; } + +.coming-soon-page { + border-top: 5px solid #4DB2E7; + height: 100vh; + background: #fff; + background: -moz-radial-gradient(center, ellipse cover, #fff 0%, #F4F9FF 100%); + background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #fff), color-stop(100%, #F4F9FF)); + background: -webkit-radial-gradient(center, ellipse cover, #fff 0%, #F4F9FF 100%); + background: -o-radial-gradient(center, ellipse cover, #fff 0%, #F4F9FF 100%); + background: -ms-radial-gradient(center, ellipse cover, #fff 0%, #F4F9FF 100%); + background: radial-gradient(ellipse at center, #fff 0%, #F4F9FF 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#fff', endColorstr = '#F4F9FF', GradientType = 1); } + .coming-soon-page.dark { + border-top: 5px solid #DAEEF8; + background: #4D576D !important; } + .coming-soon-page.dark .info a { + color: #fff; } + .coming-soon-page.dark .info h3 { + color: #fff; + font-weight: 300; } + .coming-soon-page.dark #countdown #clock .flip-clock-divider .flip-clock-label { + color: #fff; } + .coming-soon-page.dark form .button { + display: inline-block; + vertical-align: middle; + zoom: 1; + color: #fff; + padding: 9px 27px; + border: 2px solid #fff; + border-radius: 4px; + font-size: 15px; + font-weight: 400; + background: rgba(0, 0, 0, 0.08); + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: none; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .coming-soon-page.dark form .button:hover { + text-decoration: none; + color: #ddd; + border-color: #ddd; } + .coming-soon-page.dark .social .ion span { + color: #AEDCFF; } + .coming-soon-page .skins-nav { + opacity: 1; + -webkit-transition: left 0.3s; + -moz-transition: left 0.3s; + -ms-transition: left 0.3s; + -o-transition: left 0.3s; + transition: left 0.3s; + position: fixed; + left: -40px; + top: 135px; + font-size: 13px; + z-index: 9999; } + .coming-soon-page .skins-nav:hover { + left: 0px; } + .coming-soon-page .skins-nav a { + display: block; + color: #FFF; + text-decoration: none; + padding-right: 30px; + height: 37px; + border-radius: 0 4px 4px 0; + margin-bottom: 3px; + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -ms-transition: all 0.5s; + -o-transition: all 0.5s; + transition: all 0.5s; + text-align: right; + position: relative; + box-shadow: inset 0 1px rgba(255, 255, 255, 0.21); } + .coming-soon-page .skins-nav a.light { + background: #9BD4F5; } + .coming-soon-page .skins-nav a.dark { + background: #444; } + .coming-soon-page .skins-nav a.active .ion { + display: block; } + .coming-soon-page .skins-nav a .text { + white-space: nowrap; + display: block; + width: 85px; + position: relative; + top: 9px; + -webkit-transition: width 0.2s; + -moz-transition: width 0.2s; + -ms-transition: width 0.2s; + -o-transition: width 0.2s; + transition: width 0.2s; } + .coming-soon-page .skins-nav a .ion { + position: absolute; + top: 11px; + right: 8px; + display: none; } + .coming-soon-page .info { + margin-top: 60px; + text-align: center; + color: #fff; } + .coming-soon-page .info a { + color: #5F5F5F; + text-decoration: none; + font-family: Myriad Pro, Lato, Helvetica Neue, Arial; + font-size: 46px; } + .coming-soon-page .info a:hover { + text-decoration: none; } + .coming-soon-page .info h3 { + text-align: center; + color: #4DB2E7; + text-transform: uppercase; + letter-spacing: 2px; + font-weight: 400; + font-size: 18px; + margin-top: 25px; } + .coming-soon-page #countdown { + margin-top: 35px; } + .coming-soon-page #countdown #clock { + width: 100%; + margin: 0 auto; } + @media (min-width: 992px) { + .coming-soon-page #countdown #clock { + width: 47%; } } + @media (max-width: 991px) { + .coming-soon-page #countdown #clock { + max-width: 142px; } + .coming-soon-page #countdown #clock ul { + margin-bottom: 50px; } + .coming-soon-page #countdown #clock .flip-clock-divider { + height: inherit; + display: block; } + .coming-soon-page #countdown #clock .flip-clock-divider:before, .coming-soon-page #countdown #clock .flip-clock-divider:after { + display: table; + content: ""; } + .coming-soon-page #countdown #clock .flip-clock-divider.minutes .flip-clock-label, .coming-soon-page #countdown #clock .flip-clock-divider.seconds .flip-clock-label { + right: -74px !important; } + .coming-soon-page #countdown #clock .flip-clock-divider .flip-clock-label { + bottom: -8.5em !important; } } + .coming-soon-page #countdown #clock .flip-clock-divider.minutes .flip-clock-label, .coming-soon-page #countdown #clock .flip-clock-divider.seconds .flip-clock-label { + right: -102px; } + .coming-soon-page #countdown #clock .flip-clock-divider .flip-clock-label { + color: #555; + bottom: -1.5em; + top: inherit; + right: -92px; + font-size: 15px; } + .coming-soon-page #countdown #clock .flip-clock-divider .flip-clock-dot { + display: none; } + .coming-soon-page form { + margin-top: 110px; + text-align: center; } + @media (max-width: 767px) { + .coming-soon-page form { + margin-top: 70px; } } + .coming-soon-page form input[type="email"] { + width: 250px; + height: 43px; } + @media (max-width: 767px) { + .coming-soon-page form input[type="email"] { + margin: 0 auto; } } + .coming-soon-page form .button { + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #38BAFF), color-stop(100%, #37ADEB)); + background: -webkit-linear-gradient(#38BAFF, #37ADEB); + background: -moz-linear-gradient(#38BAFF, #37ADEB); + background: -o-linear-gradient(#38BAFF, #37ADEB); + background: linear-gradient(#38BAFF, #37ADEB); + padding: 10px 19px; + font-size: 15px; + font-weight: 500; + border: 1px solid #54AEF5; } + .coming-soon-page .social { + margin-top: 100px; + text-align: center; + margin-bottom: 20px; } + .coming-soon-page .social .ion { + font-size: 34px; + margin: 0 10px; + display: inline-block; } + .coming-soon-page .social .ion span { + color: #9DBDD6; } + .coming-soon-page .social .ion .ion-social-facebook { + font-size: 25px; } + .coming-soon-page .social .tm { + margin-top: 15px; + color: #B1B9C4; } + +#docs #guide { + background: #F4F8FA; + border-right: 1px solid #DADFE5; + left: 0; + top: 0; + position: fixed; + overflow: hidden; + overflow-y: auto; + width: 210px; + z-index: 25; + height: 100%; } + #docs #guide .logo { + margin-top: 0; + font-size: 29px; } + #docs #guide .logo a { + color: #000; + font-family: Myriad Pro, Lato, Helvetica Neue, Arial; + padding: 20px 0 15px 23px; + display: block; + border-bottom: 1px solid #D6DCE0; + box-shadow: 0px 1px #FFF; + -webkit-transition: color 0.15s linear; + -moz-transition: color 0.15s linear; + -ms-transition: color 0.15s linear; + -o-transition: color 0.15s linear; + transition: color 0.15s linear; } + #docs #guide .logo a:hover { + color: #858585; + text-decoration: none; } + #docs #guide .menu > li.active > .nav { + display: block; } + #docs #guide .menu > li.active > a { + background: #DEEAF1; } + #docs #guide .menu > li a { + color: #3391C9; + font-weight: 500; + font-size: 13px; + padding: 10px 15px 10px 25px; + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + -ms-transition: all 0.15s linear; + -o-transition: all 0.15s linear; + transition: all 0.15s linear; } + #docs #guide .menu > li a:hover { + background: #DEEAF1; } + #docs #guide .menu > li > .nav { + margin-bottom: 7px; + display: none; } + #docs #guide .menu > li > .nav li a { + font-weight: 400; + color: #48A0D6; + padding: 6px 15px 5px 35px; } +#docs #api-docs { + background: #FFF; + margin-left: 210px !important; + min-width: 750px; } + #docs #api-docs #methods { + background: #292E33; + position: relative; + margin-left: 50%; } + #docs #api-docs #methods .languages { + position: fixed; + top: 0; + width: 100%; + padding: 5px 0 5px 20px; + background: #3B4249; + box-shadow: 2px 1px 3px #000; + z-index: 999; } + #docs #api-docs #methods .languages .language { + display: inline-block; + color: #C0CEDD; + padding: 5px 15px; + font-size: 13px; } + #docs #api-docs #methods .languages .language.selected { + color: #fff; } + #docs #api-docs #methods .method { + /*&:nth-child(2) {*/ + /*.method-section {*/ + /*.method-description {*/ + /*padding-top: 0px;*/ + /*border-top: 0px;*/ + /*}*/ + /*.method-example {*/ + /*padding-top: 35px;*/ + /*border-top: 0;*/ + /*box-shadow: none;*/ + /*}*/ + /*}*/ + /*}*/ } + #docs #api-docs #methods .method:last-child .method-section { + padding-bottom: 70px; } + #docs #api-docs #methods .method .method-section { + margin-left: -100%; + position: relative; + padding-top: 50px; } + #docs #api-docs #methods .method .method-section .method-description { + width: 50%; + float: left; + padding: 0 30px; + border-top: 1px solid #E5E7EB; + padding-top: 40px; } + #docs #api-docs #methods .method .method-section .method-description h3 { + font-size: 21px; + margin-top: 0; + margin-bottom: 20px; } + #docs #api-docs #methods .method .method-section .method-description p { + font-size: 13px; + color: #666; + line-height: 21px; + margin-bottom: 20px; } + #docs #api-docs #methods .method .method-section .method-description .info { + margin-top: 45px; + margin-bottom: 40px; } + #docs #api-docs #methods .method .method-section .method-description .info h4 { + font-size: 14px; + border-bottom: 1px solid #E4E4E4; + padding-bottom: 15px; } + #docs #api-docs #methods .method .method-section .method-description .info .field { + margin-top: 17px; + font-size: 13px; } + #docs #api-docs #methods .method .method-section .method-description .info .field .key { + width: 40%; + float: left; + text-align: right; + padding-right: 10px; + font-weight: bold; + color: #333; } + #docs #api-docs #methods .method .method-section .method-description .info .field .desc { + width: 60%; + float: right; + padding-left: 10px; + color: #555; + line-height: 21px; } + #docs #api-docs #methods .method .method-section .method-description .info .field .desc strong { + display: block; + color: #333; + margin-bottom: 5px; } + #docs #api-docs #methods .method .method-section .method-example { + margin-left: 50%; + width: 50%; + padding: 0px 30px 0; + border-top: 1px solid #000; + box-shadow: inset 0px 1px rgba(255, 255, 255, 0.17); + color: #fff; } + #docs #api-docs #methods .method .method-section .method-example pre { + background: none; + border: none; + margin: 0; + padding: 20px; } + #docs #api-docs #methods .method .method-section .method-example pre code { + background: none; + font-family: Monaco, Consolas, Menlo; + font-size: 14px; + color: #DAE4F2; + /*> * {*/ + /*color: #DAE4F2;*/ + /*line-height: 20px;*/ + /*}*/ } + #docs #api-docs #methods .method .method-section .method-example pre code.always-visible { + display: block !important; } + #docs #api-docs #methods .method .method-section .method-example pre code.ruby { + display: block; } + #docs #api-docs #methods .method .method-section .method-example pre .ruby { + /*color: #DAE4F2;*/ + /*> * {*/ + /*color: #DAE4F2;*/ + /*line-height: 20px;*/ + /*}*/ + /*[class*=keyword] {*/ + /*color: #9AB4DB;*/ + /*}*/ + /*[class*=string] {*/ + /*color: #DAD0C6;*/ + /*}*/ + /*[class*=comment] {*/ + /*color: #B4B4B4;*/ + /*}*/ + /*[class*=constant] {*/ + /*color: #FFDF9D;*/ + /*}*/ + /*[class*=symbol] {*/ + /*color: #9ECBEE;*/ + /*}*/ } + #docs #api-docs #methods .method .method-section .method-example pre .python { + color: #DAE4F2; } + #docs #api-docs #methods .method .method-section .method-example pre .python > * { + color: #DAE4F2; + line-height: 20px; } + #docs #api-docs #methods .method .method-section .method-example pre .python [class*=keyword] { + color: #9AB4DB; } + #docs #api-docs #methods .method .method-section .method-example pre .python [class*=string] { + color: #DAD0C6; } + #docs #api-docs #methods .method .method-section .method-example pre .python [class*=comment] { + color: #B4B4B4; } + #docs #api-docs #methods .method .method-section .method-example pre .python [class*=class] { + color: #FFDF9D; } + #docs #api-docs #methods .method .method-section .method-example pre .python [class*=params] { + color: #9ECBEE; } + #docs #api-docs #methods .method .method-section .method-example pre .php { + color: #DAE4F2; } + #docs #api-docs #methods .method .method-section .method-example pre .php > * { + color: #DAE4F2; + line-height: 20px; } + #docs #api-docs #methods .method .method-section .method-example pre .php [class*=keyword] { + color: #9AB4DB; } + #docs #api-docs #methods .method .method-section .method-example pre .php [class*=string] { + color: #DAD0C6; } + #docs #api-docs #methods .method .method-section .method-example pre .php [class*=comment] { + color: #B4B4B4; } + +.invoice-wrapper { + background: #eeeff1; + padding-top: 60px; } + @media (min-width: 1200px) { + .invoice-wrapper .container { + width: 900px; } } + .invoice-wrapper .logo { + text-align: center; } + .invoice-wrapper .logo a { + font-size: 36px; + color: #555; + font-weight: 300; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .invoice-wrapper .logo a:hover { + text-decoration: none; + color: #7793C4; } + .invoice-wrapper .invoice-wrapper { + background: #FFF; + border: 1px solid #CDD3E2; + box-shadow: 0px 0px 1px #CCC; + padding: 40px 40px 60px; + margin-top: 40px; + border-radius: 4px; } + .invoice-wrapper .invoice-wrapper .intro { + line-height: 25px; + color: #444; } + .invoice-wrapper .invoice-wrapper .payment-info { + margin-top: 25px; + padding-top: 15px; } + .invoice-wrapper .invoice-wrapper .payment-info span { + color: #A9B0BB; } + .invoice-wrapper .invoice-wrapper .payment-info strong { + display: block; + color: #444; + margin-top: 3px; } + @media (max-width: 767px) { + .invoice-wrapper .invoice-wrapper .payment-info .text-right { + text-align: left; + margin-top: 20px; } } + .invoice-wrapper .invoice-wrapper .payment-details { + border-top: 2px solid #EBECEE; + margin-top: 30px; + padding-top: 20px; + line-height: 22px; } + .invoice-wrapper .invoice-wrapper .payment-details span { + color: #A9B0BB; + display: block; } + .invoice-wrapper .invoice-wrapper .payment-details a { + display: inline-block; + margin-top: 5px; } + @media (max-width: 767px) { + .invoice-wrapper .invoice-wrapper .payment-details .text-right { + text-align: left; + margin-top: 20px; } } + .invoice-wrapper .invoice-wrapper .line-items { + margin-top: 40px; } + .invoice-wrapper .invoice-wrapper .line-items .headers { + color: #A9B0BB; + font-size: 13px; + letter-spacing: .3px; + border-bottom: 2px solid #EBECEE; + padding-bottom: 4px; } + .invoice-wrapper .invoice-wrapper .line-items .items { + margin-top: 8px; + border-bottom: 2px solid #EBECEE; + padding-bottom: 8px; } + .invoice-wrapper .invoice-wrapper .line-items .items .item { + padding: 10px 0; + color: #696969; + font-size: 15px; } + @media (max-width: 767px) { + .invoice-wrapper .invoice-wrapper .line-items .items .item { + font-size: 13px; } } + .invoice-wrapper .invoice-wrapper .line-items .items .item .amount { + letter-spacing: 0.1px; + color: #84868A; + font-size: 16px; } + @media (max-width: 767px) { + .invoice-wrapper .invoice-wrapper .line-items .items .item .amount { + font-size: 13px; } } + .invoice-wrapper .invoice-wrapper .line-items .total { + margin-top: 30px; } + .invoice-wrapper .invoice-wrapper .line-items .total .extra-notes { + float: left; + width: 40%; + text-align: left; + font-size: 13px; + color: #7A7A7A; + line-height: 20px; } + @media (max-width: 767px) { + .invoice-wrapper .invoice-wrapper .line-items .total .extra-notes { + width: 100%; + margin-bottom: 30px; + float: none; } } + .invoice-wrapper .invoice-wrapper .line-items .total .extra-notes strong { + display: block; + margin-bottom: 5px; + color: #454545; } + .invoice-wrapper .invoice-wrapper .line-items .total .field { + margin-bottom: 7px; + font-size: 14px; + color: #555; } + .invoice-wrapper .invoice-wrapper .line-items .total .field.grand-total { + margin-top: 10px; + font-size: 16px; + font-weight: 500; } + .invoice-wrapper .invoice-wrapper .line-items .total .field.grand-total span { + color: #20A720; + font-size: 16px; } + .invoice-wrapper .invoice-wrapper .line-items .total .field span { + display: inline-block; + margin-left: 20px; + min-width: 85px; + color: #84868A; + font-size: 15px; } + .invoice-wrapper .invoice-wrapper .line-items .print { + margin-top: 50px; + text-align: center; } + .invoice-wrapper .invoice-wrapper .line-items .print a { + display: inline-block; + border: 1px solid #9CB5D6; + padding: 13px 13px; + border-radius: 5px; + color: #708DC0; + font-size: 13px; + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; } + .invoice-wrapper .invoice-wrapper .line-items .print a:hover { + text-decoration: none; + border-color: #333; + color: #333; } + .invoice-wrapper .invoice-wrapper .line-items .print a i { + margin-right: 3px; + font-size: 14px; } + .invoice-wrapper .footer { + margin-top: 40px; + margin-bottom: 110px; + text-align: center; + font-size: 12px; + color: #969CAD; } + +.timeline-bg { + background: #f7f8fa; } + +.timeline-wrapper { + margin-top: 60px; + position: relative; + /* the first node that comes right next to a year */ } + .timeline-wrapper:before { + content: ''; + position: absolute; + width: 5px; + height: 100%; + left: 0; + background: #e7e8ec; + right: 0; + margin: 0 auto; + z-index: -1; } + .timeline-wrapper .year { + text-align: center; + margin-bottom: 50px; + font-weight: 600; + margin-top: 50px; + font-size: 16px; } + .timeline-wrapper .year:nth-child(1) { + margin-top: 0px; + margin-bottom: 60px; } + .timeline-wrapper .year.last { + margin-bottom: 0; + font-size: 21px; } + .timeline-wrapper .year span { + display: inline-block; + background: #E7E8EC; + padding: 6px 20px; + color: #5A5A5A; + border-radius: 3px; } + .timeline-wrapper .year + .node { + margin-top: -20px; } + .timeline-wrapper .node { + position: relative; + float: right; + clear: right; + width: 44%; + margin: 35px 0; + border-radius: 5px; } + @media (max-width: 767px) { + .timeline-wrapper .node { + width: 100%; } } + .timeline-wrapper .node.left { + float: left; + clear: left; } + .timeline-wrapper .node.left:before { + right: -51px; + left: inherit; } + @media (max-width: 991px) { + .timeline-wrapper .node.left:before { + right: -42px; + width: 43px; } } + .timeline-wrapper .node.left .marker { + left: inherit; + right: -65px; } + @media (max-width: 991px) { + .timeline-wrapper .node.left .marker { + right: -52px; } } + .timeline-wrapper .node:before { + content: ''; + position: absolute; + width: 50px; + height: 4px; + background: #E7E8EC; + left: -51px; + top: 62px; } + @media (max-width: 991px) { + .timeline-wrapper .node:before { + left: -42px; + width: 43px; } } + @media (max-width: 767px) { + .timeline-wrapper .node:before { + display: none; } } + .timeline-wrapper .node .marker { + position: absolute; + width: 17px; + height: 17px; + border-radius: 25px; + background: #e7e8ec; + left: -65px; + top: 55px; + border: 3px solid #F7F8FA; } + @media (max-width: 991px) { + .timeline-wrapper .node .marker { + left: -51px; } } + @media (max-width: 767px) { + .timeline-wrapper .node .marker { + display: none; } } + .timeline-wrapper .node .entry { + position: relative; + padding: 20px; + height: 400px; + background-size: cover; + background-position: center center; + border-radius: 5px; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.26); } + .timeline-wrapper .node .entry:before { + position: absolute; + top: 50%; + bottom: 0; + left: 0; + right: 0; + content: ''; + border-radius: 0 0 5px 5px; + background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.89) 100%); + background: -moz-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.89) 100%); + background: -o-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.89) 100%); + background: linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(15, 24, 49, 0.89) 100%); } + .timeline-wrapper .node .entry.smallish { + height: 320px; } + .timeline-wrapper .node .entry.smallish .intro { + top: 68%; } + .timeline-wrapper .node .entry.short-entry { + background: #E7E8EC; + color: #5c6269; + height: inherit; + padding: 13px; + box-shadow: none; + position: relative; + top: 41px; + left: -1px; + margin-bottom: 20px; + text-shadow: 1px 1px rgba(255, 255, 255, 0.4); } + .timeline-wrapper .node .entry.short-entry:before { + background: none; } + .timeline-wrapper .node .entry .intro { + position: relative; + top: 75%; + color: #FFF; + z-index: 9; + letter-spacing: .3px; } + .timeline-wrapper .node .entry .intro h4 { + font-size: 20px; + text-shadow: 1px 1px rgba(0, 0, 0, 0.69); + letter-spacing: .5px; } + @media (max-width: 767px) { + .timeline-wrapper .node .entry .intro h4 { + font-size: 17px; } } + .timeline-wrapper .node .entry .intro p { + font-weight: 300; } + @media (max-width: 767px) { + .timeline-wrapper .node .entry .intro p { + font-size: 13px; } } + .timeline-wrapper .node .news { + position: relative; + background-size: cover; + background-position: center center; + border-radius: 5px; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.26); + background: #fff; } + .timeline-wrapper .node .news section { + padding: 30px 20px 60px 20px; } + .timeline-wrapper .node .news section h3 { + margin-top: 0; + font-size: 17px; + line-height: 22px; } + .timeline-wrapper .node .news section p { + margin-top: 21px; + line-height: 22px; + font-size: 13px; + color: #7A7979; } + .timeline-wrapper .node .news footer { + position: absolute; + bottom: 0; + padding: 12px 20px; + width: 100%; + font-size: 12px; + font-weight: 500; + color: #9EAEBE; } + .timeline-wrapper .node .news footer .tag { + position: relative; + padding-left: 27px; + text-transform: uppercase; } + .timeline-wrapper .node .news footer .tag span { + font-size: 24px; + position: absolute; + top: -4px; + left: 0; } + +#docs #guide { + margin-top: 70px; } +#docs #api-docs { + margin-left: 200px !important; + margin-top: -20px !important; } + +.index-sidebar-hero .cta a.button { + padding: 12px 30px; } + +.nav-menu .main-menu h4 { + color: #e6e6e6; + margin-left: 5rem; } +.nav-menu .main-menu ul { + margin-top: 2rem; } +.nav-menu .main-menu ul li a { + padding-left: 3rem; } + +body { + background: #414B5B; + font-size: 15px; + line-height: 1.5; } + body .page-content { + background: white; } + +#next { + float: right; + margin: 40px 0 40px 0; } + +h1, h2 { + color: black; } + h1 a, h1 a:hover, h2 a, h2 a:hover { + color: black; + text-decoration: none; + position: relative; } + h1 a:hover:before, h2 a:hover:before { + content: '\00b6'; + position: absolute; + left: -18px; + color: grey; + font-size: 18px; + font-family: sans-serif; + top: 4px; } + +h3, h4, h5 { + color: #727272; } + h3 a, h3 a:hover, h4 a, h4 a:hover, h5 a, h5 a:hover { + color: #727272; + text-decoration: none; } + +h4 { + margin-top: 40px; + border-bottom: 1px solid #f0f0f0; } + +.main-footer { + margin-top: 0; } + +.get-started { + margin-top: 40px; + padding: 40px 20px; + background: -webkit-linear-gradient(top, #355069 0, #5E7A9B 100%); + /*background: radial-gradient(#36414E, #253241);*/ + font-size: 16px; + color: #f8f8f8; + font-weight: 400; + line-height: 25px; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } + .get-started h2 { + color: white; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } + .get-started a { + color: #90CAF9; } + +#docs #api-docs #methods .method .method-section { + padding-top: 0; } + +#cover-image.prod-bg { + background-image: url("/jsonapi_suite/assets/img/sunrise.png") !important; } +#cover-image.dev-bg { + background-image: url("/assets/img/sunrise.png") !important; } + +.solution img { + margin-left: 30px !important; + height: 300px; } + +pre { + background: #292E33; } + pre code.hljs { + background: #292E33; + color: #edf2f9; + line-height: 20px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +img[alt=github] { + margin-right: 5px; + width: 20px; + height: 20px; } + +.js-toc, .ruby-toc, blockquote { + background: #f7f8fb; + border: 1px solid #eaedf7; + border-radius: 5px; + padding: 10px; + line-height: 1.8; } + +.ruby-toc ul { + padding-left: 25px; } + +.ruby-toc + div { + margin-bottom: 20px; + font-size: 16px; } + +blockquote.url { + font-size: 14px; + color: grey; + margin-top: -12px; } + +ul ul { + padding-left: 20px; } + +pre.highlight code.coffeescript [class*=built_in], pre.highlight code.cs [class*=built_in], pre.highlight code.javascript [class*=built_in], pre.highlight code.js [class*=built_in], pre.highlight code.ts [class*=built_in], pre.highlight code.php [class*=built_in], pre.hljs code.coffeescript [class*=built_in], pre.hljs code.cs [class*=built_in], pre.hljs code.javascript [class*=built_in], pre.hljs code.js [class*=built_in], pre.hljs code.ts [class*=built_in], pre.hljs code.php [class*=built_in] { + color: #adc2e2; } +pre.highlight code.coffeescript [class*=string], pre.highlight code.cs [class*=string], pre.highlight code.javascript [class*=string], pre.highlight code.js [class*=string], pre.highlight code.ts [class*=string], pre.highlight code.php [class*=string], pre.hljs code.coffeescript [class*=string], pre.hljs code.cs [class*=string], pre.hljs code.javascript [class*=string], pre.hljs code.js [class*=string], pre.hljs code.ts [class*=string], pre.hljs code.php [class*=string] { + color: lightgreen; } +pre.highlight code.coffeescript [class*=attribute], pre.highlight code.cs [class*=attribute], pre.highlight code.javascript [class*=attribute], pre.highlight code.js [class*=attribute], pre.highlight code.ts [class*=attribute], pre.highlight code.php [class*=attribute], pre.hljs code.coffeescript [class*=attribute], pre.hljs code.cs [class*=attribute], pre.hljs code.javascript [class*=attribute], pre.hljs code.js [class*=attribute], pre.hljs code.ts [class*=attribute], pre.hljs code.php [class*=attribute] { + color: white; } +pre.highlight code.coffeescript [class*=keyword], pre.highlight code.cs [class*=keyword], pre.highlight code.javascript [class*=keyword], pre.highlight code.js [class*=keyword], pre.highlight code.ts [class*=keyword], pre.highlight code.php [class*=keyword], pre.hljs code.coffeescript [class*=keyword], pre.hljs code.cs [class*=keyword], pre.hljs code.javascript [class*=keyword], pre.hljs code.js [class*=keyword], pre.hljs code.ts [class*=keyword], pre.hljs code.php [class*=keyword] { + color: #e18787; + font-weight: 600; } +pre.highlight code.coffeescript [class*=literal], pre.highlight code.cs [class*=literal], pre.highlight code.javascript [class*=literal], pre.highlight code.js [class*=literal], pre.highlight code.ts [class*=literal], pre.highlight code.php [class*=literal], pre.hljs code.coffeescript [class*=literal], pre.hljs code.cs [class*=literal], pre.hljs code.javascript [class*=literal], pre.hljs code.js [class*=literal], pre.hljs code.ts [class*=literal], pre.hljs code.php [class*=literal] { + color: #ff9999; } +pre.highlight code.coffeescript [class*=c1], pre.highlight code.cs [class*=c1], pre.highlight code.javascript [class*=c1], pre.highlight code.js [class*=c1], pre.highlight code.ts [class*=c1], pre.highlight code.php [class*=c1], pre.hljs code.coffeescript [class*=c1], pre.hljs code.cs [class*=c1], pre.hljs code.javascript [class*=c1], pre.hljs code.js [class*=c1], pre.hljs code.ts [class*=c1], pre.hljs code.php [class*=c1] { + color: #B4B4B4; } +pre.highlight code.coffeescript [class*=constant], pre.highlight code.cs [class*=constant], pre.highlight code.javascript [class*=constant], pre.highlight code.js [class*=constant], pre.highlight code.ts [class*=constant], pre.highlight code.php [class*=constant], pre.hljs code.coffeescript [class*=constant], pre.hljs code.cs [class*=constant], pre.hljs code.javascript [class*=constant], pre.hljs code.js [class*=constant], pre.hljs code.ts [class*=constant], pre.hljs code.php [class*=constant] { + color: #FFDF9D; } +pre.highlight code.coffeescript [class*=nx], pre.highlight code.cs [class*=nx], pre.highlight code.javascript [class*=nx], pre.highlight code.js [class*=nx], pre.highlight code.ts [class*=nx], pre.highlight code.php [class*=nx], pre.hljs code.coffeescript [class*=nx], pre.hljs code.cs [class*=nx], pre.hljs code.javascript [class*=nx], pre.hljs code.js [class*=nx], pre.hljs code.ts [class*=nx], pre.hljs code.php [class*=nx] { + color: #93ccf9; + font-weight: 600; } +pre.highlight code.typescript [class*=kr], pre.hljs code.typescript [class*=kr] { + color: #d9d926; } +pre.highlight code.ruby .class .title, pre.highlight code.ruby .class .parent, pre.hljs code.ruby .class .title, pre.hljs code.ruby .class .parent { + color: #FFDF9D; } +pre.highlight code.ruby [class*=keyword], pre.hljs code.ruby [class*=keyword] { + color: #ff8080; } +pre.highlight code.ruby [class*=kp], pre.hljs code.ruby [class*=kp] { + color: #ff8080; } +pre.highlight code.ruby [class*=string], pre.hljs code.ruby [class*=string] { + color: lightgreen; } +pre.highlight code.ruby [class*=comment], pre.hljs code.ruby [class*=comment] { + color: #B4B4B4; } +pre.highlight code.ruby [class*=constant], pre.hljs code.ruby [class*=constant] { + color: #FFDF9D; } +pre.highlight code.ruby [class*=symbol], pre.hljs code.ruby [class*=symbol] { + color: #9ECBEE; } + +img[alt=glimmer_logo] { + margin: 0 auto; + width: 200px; + display: block; + margin-bottom: 4em; } + +.tabs { + background: #f8f8f8; + border-radius: 3px; } + .tabs .tab { + background-color: #f8f8f8; + font-weight: 500; + color: #555; + display: inline-block; + padding: 18px 25px; + margin-top: 10px; + cursor: pointer; + -webkit-transition: background-color .2s linear; + -moz-transition: background-color .2s linear; + -ms-transition: background-color .2s linear; + -o-transition: background-color .2s linear; + transition: background-color .2s linear; } + .tabs .tab.active { + background-color: #fff; + border: 1px solid #e8e8e8; + border-radius: 5px 5px 0 0; + border-bottom: 0; } + +.highlight pre code { + font-size: 14px; + line-height: 1.5; } +.highlight .language-ruby .n { + color: white; } +.highlight .language-ruby .c1 { + color: #9c9c9c; } +.highlight .language-ruby .ss { + color: #a2dcff; + font-weight: 600; } +.highlight .language-ruby .k, .highlight .language-ruby .kp { + color: #ff8080; } +.highlight .language-ruby .p { + color: white; } +.highlight .language-ruby .nc, .highlight .language-ruby .no { + color: #e6eb9d; + font-weight: 600; } +.highlight .language-ruby .o, .highlight .language-ruby .si, .highlight .language-ruby .nf { + color: white; } +.highlight .language-ruby .s1, .highlight .language-ruby .s2 { + color: lightgreen; + font-weight: 600; } +.highlight .language-ruby .vi, .highlight .language-ruby .mi, .highlight .language-ruby .nb { + color: #ff99e6; + font-weight: 600; } +.highlight .language-typescript .kd, .highlight .language-javascript .kd { + color: #edf2f9; + font-weight: 600; } +.highlight .language-typescript .o, .highlight .language-javascript .o { + color: #edf2f9; } +.highlight .language-typescript .p, .highlight .language-javascript .p { + color: #edf2f9; } +.highlight .language-typescript .nx, .highlight .language-typescript .nd, .highlight .language-javascript .nx, .highlight .language-javascript .nd { + color: #a2dcff; + font-weight: 600; } +.highlight .language-typescript .nb, .highlight .language-javascript .nb { + color: white; } +.highlight .language-typescript .kc, .highlight .language-javascript .kc { + color: #e6eb9d; } +.highlight .language-typescript .kr, .highlight .language-javascript .kr { + color: #00e6e6; } +.highlight .language-typescript .c1, .highlight .language-javascript .c1 { + color: #9c9c9c; } +.highlight .language-typescript .k, .highlight .language-javascript .k { + color: #ff66d9; } +.highlight .language-typescript .err, .highlight .language-javascript .err { + font-weight: 600; + color: #e6eb9d; } +.highlight .language-typescript .na, .highlight .language-typescript .nl, .highlight .language-javascript .na, .highlight .language-javascript .nl { + color: #ff66d9; } +.highlight .language-typescript .s1, .highlight .language-typescript .s2, .highlight .language-javascript .s1, .highlight .language-javascript .s2 { + color: lightgreen; + font-weight: 600; } +.highlight .language-typescript .mi, .highlight .language-javascript .mi { + color: #e6eb9d; } +.highlight .language-bash { + color: white; } +.highlight .language-javascript .k { + color: #e6eb9d !important; } + +body { + background-color: white; } + +.home { + width: 95%; + margin: 0 auto; + text-align: center; + font-size: 16px; + line-height: 1.4; + padding-top: 10px; + z-index: 20; } + @media (min-width: 569px) { + .home { + font-size: 18px; } } + .home .skip-intro { + position: absolute; + right: 20px; + padding: 3px 6px; + font-size: 90%; } + .home .start { + margin-top: 40px; } + .home .img { + position: absolute; + background-repeat: no-repeat; + opacity: 0.1; + width: 100%; + height: 100%; + background-position: 70% 10%; + background-size: 40%; } + .home .sample .highlight pre code { + font-size: 14px !important; } + @media (min-width: 569px) { + .home .sample .highlight pre code { + font-size: 18px !important; } } + .home .sample.s .highlight pre code { + font-size: 11px !important; } + @media (min-width: 569px) { + .home .sample.s .highlight pre code { + font-size: 18px !important; } } + .home .sample figure:last-child { + margin-bottom: 18px; } + .home .mag { + color: #e600e6; } + .home .lg { + color: grey; } + .home .p { + margin-bottom: 2.5rem; } + .home .bold { + font-weight: bold; } + .home .italic { + font-style: italic; } + .home .underline { + text-decoration: underline; } + .home .s { + font-size: 19.2px; } + .home .m { + font-size: 25.6px; } + .home .l { + font-size: 32px; } + .home .xl { + font-size: 35.2px; } + .home .quote { + margin-top: 5px; + font-size: 19.2px; } + @media (min-width: 569px) { + .home .quote { + font-size: 24px !important; } } + @media (min-width: 569px) { + .home .quote.yehuda { + font-size: 30px !important; } } + .home .highlight { + text-align: left; } + .home .highlight pre { + padding-bottom: 0; } diff --git a/_site/bin/jekyll b/_site/bin/jekyll new file mode 100755 index 0000000..ab42abe --- /dev/null +++ b/_site/bin/jekyll @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'jekyll' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require "pathname" +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", + Pathname.new(__FILE__).realpath) + +bundle_binstub = File.expand_path("../bundle", __FILE__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 150) =~ /This file was generated by Bundler/ + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("jekyll", "jekyll") diff --git a/_site/concepts.html b/_site/concepts.html new file mode 100644 index 0000000..522e2ce --- /dev/null +++ b/_site/concepts.html @@ -0,0 +1,522 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+
+

+ JSONAPI Suite +

+ +
+ +
+
+ +
+
+
+

Resources

+

+ Resources are where you define how to query and persist a given Model. + We'll wire-up the JSONAPI contract for you, so you can customize hooks rather + than spend your time parsing query parameters. +

+ +

+To the right, you'll see potential overrides of default behavior. Our defaults are based on ActiveRecord + and Rails conventions - so customizations like this are often not required. +

+ +

+ If you find yourself writing the same customizations over and over again, DRY them up by writing an + Adapter. +

+ +

+ See also: +

+

+ +
+
+ +
class PostResource < ApplicationResource
+  # Use default logic (specified in adapter)
+  # when no block passed
+  allow_filter :active
+
+  allow_filter :title_prefix do |scope, value|
+    # Example:
+    # scope.where(["title LIKE ?", "#{value}%"])
+  end
+
+  sort do |scope, att, dir|
+    # Example:
+    # scope.order(att => dir)
+  end
+
+  paginate do |scope, current_page, per_page|
+    # Example:
+    # scope.per(per_page).page(current_page)
+  end
+
+  # Example: let's say we're hitting an HTTP
+  # service instead of ActiveRecord. Maybe our
+  # scope is a big hash we build up, and now
+  # we need to use a client to take that hash and
+  # execute the HTTP request.
+  def resolve(scope)
+    MyHTTPClient.request(scope)
+  end
+end
+ + +
+
+
+ +
+
+
+

Serializers

+

+ Serializers define the structure of the response. +

+ +

+ We use jsonapi-rb for serialization. If you're familiar + with active_model_serializers, + the interface will seem very familiar. In fact, jsonapi-rb was created by one of the owners of that + project. +

+ +

+ See also: +

+

+ +
+
+ +
class PostSerializer < ApplicationSerializer
+  type 'foos'
+
+  attribute :title
+
+  attribute :description do
+    @object.active? ? 'Active Post' : 'Inactive Post'
+  end
+
+  extra_attribute :net_worth do
+    @object.assets.sum(&:value)
+  end
+
+  has_many :comments do
+    data do
+      @object.published_comments
+    end
+
+    link :related do
+      @url_helpers.comments_url(filter: { post_id: @object.id })
+    end
+  end
+
+  meta do
+    { featured: true }
+  end
+end
+ + +
+
+
+ +
+
+
+

Sideloading

+

+ You're probably already familiar with the concept of "sideloading", documented in + the + + "Inclusion of Related Resources" + + section of the JSONPI spec. +

+ +

+ If using an + + Adapter + , such as the default + ActiveRecord adapter, + you can do this with simple + has_many-style macros. +

+ +

+ If not using an adapter, or to implement a one-off customization, + you can drop down to the lower-level + allow_sideload DSL. Adapter + macros are simply wrapping this DSL. +

+ +

+ allow_sideload specifies two simple + configuration options: +

    +
  • + scope: specifies how to build a scope that satisifes the + association. +
  • +
  • + assign: specifies how to associate the resulting records with + their parent association. +
  • +
+ +

+ You can see the default + ActiveRecord implementation on the right. +

+

+ +

+ See also: + +

+

+ +
+
+ +
# Adapter example
+has_many :comments,
+  foreign_key: :post_id,
+  resource: CommentResource,
+  scope: -> { Comment.all } # base scope, like you'd see in a controller
+
+
+
+# Lower-level customization example
+allow_sideload :blog, resource: BlogResource do
+  # Return a scope so further query parameters can be applied
+  # and the Resource logic can be re-used
+  scope do |posts|
+    Blog.where(id: posts.map(&:blog_id))
+  end
+
+  assign do |posts, blogs|
+    posts.each do |p|
+      p.blog = blogs.find { |b| b.id == p.blog_id }
+    end
+  end
+end
+ + +
+
+
+ +
+
+
+

Sideposting

+

+ We want to be able to *write* a nested relationship graph. + You can do this by mirroring the same + sideloading payload + you see in read requests. To the right, you'll see we're updating a + Post, changing the name of its associated + Blog, creating a + Tag, deleting one + Comment, and disassociating (null foreign key) a different + Comment, all in a single request. +

+ +

+ When we send RESTful resources to the server, we typically send a corresponding HTTP verb. + That's the + method section of the payload. + method can be either + create, + update, + destroy, or + disassociate. +

+ +

+ When creating, there is no + id to pass. Instead, pass + temp-id, a random uuid used to + link the relevant sections of the payload, and which tells clients how to associate + their in-memory objects with the + ids returned from the server. Clients like + JSORM will take care of this for you automatically. +

+ +

+ When we actually perform these operations, everything will run within a transaction. The + transaction will be rolled back if an error is raised or the + Models, do not pass validation. +

+ +

+ See also: + +

+

+ +
+
+ +
{
+  data: {
+    type: 'posts',
+    id: 123,
+    attributes: { title: 'Updated!' },
+    relationships: {
+      blog: {
+        data: { type: 'blogs', id: 123, method: 'update' }
+      },
+      tags: {
+        data: [{ type: 'tags', temp-id: 's0m3uu1d', method: 'create' }]
+      },
+      comments: {
+        data: [
+          { type: 'comments', id: 123, method: 'destroy' }
+          { type: 'comments', id: 456, method: 'disassociate' }
+        ]
+      }
+    }
+  },
+  included: [
+    { type: 'tags', temp-id: 's0m3uu1d', attributes: { name: 'Important' } },
+    { type: 'blogs', id: 123, attributes: { name: 'Updated!' } }
+  ]
+}
+ + +
+
+
+ +
+
+
+ + + + + + +
+
+ + + + diff --git a/_site/dump.rdb b/_site/dump.rdb new file mode 100644 index 0000000..56af04e --- /dev/null +++ b/_site/dump.rdb @@ -0,0 +1 @@ +REDIS0006ܳCZV \ No newline at end of file diff --git a/_site/features.html b/_site/features.html new file mode 100644 index 0000000..e909e48 --- /dev/null +++ b/_site/features.html @@ -0,0 +1,233 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+
+
+
+

Formats to showcase features

+

Choose your favorite formats for your own sites

+
+
+
+ + +
+
+
+

You don't need to have any advanced technical

+

+ Whether you want to fill this paragraph with some text like I'm doing right now, this place is perfect to describe some features or anything you want - React has a complete solution for you. +

+

+ You have complete control over the look & feel of your website, we offer the best quality so you take your site up and running in no time. +

+
+
+ picture1 +
+
+
+
+ picture2 +
+
+

You don't need to have any advanced technical

+

+ Whether you want to fill this paragraph with some text like I'm doing right now, this place is perfect to describe some features or anything you want - React has a complete solution for you. +

+
+
+
+
+

You don't need to have any advanced technical

+

+ Whether you want to fill this paragraph with some text like I'm doing right now, this place is perfect to describe some features or anything you want - React has a complete solution for you. +

+

+ You have complete control over the look & feel of your website, we offer the best quality so you take your site up and running in no time. +

+
+
+ picture3 +
+
+
+
+ picture4 +
+
+

You don't need to have any advanced technical

+

+ Whether you want to fill this paragraph with some text like I'm doing right now, this place is perfect to describe some features or anything you want - React has a complete solution for you. +

+
+
+
+
+
+
+
+ +
+
+
+ + + + + + diff --git a/_site/feed.xml b/_site/feed.xml new file mode 100644 index 0000000..7ec58e5 --- /dev/null +++ b/_site/feed.xml @@ -0,0 +1,2 @@ +Jekyll2019-01-06T14:12:19-05:00/JSONAPI SuiteCollection of Ruby libraries for powering JSONAPI-compliant APIs. + \ No newline at end of file diff --git a/_site/how-to-add-defaults.html b/_site/how-to-add-defaults.html new file mode 100644 index 0000000..dc128dc --- /dev/null +++ b/_site/how-to-add-defaults.html @@ -0,0 +1,201 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

How to Add Defaults

+ +

You may need to change the default behavior or your API - perhaps you +want a default of 10 per page instead of 20. JSONAPI Suite provides +facilities that enable defaults that can be overridden - 10 per +page, unless elsewise specified by the user.

+ +

You can see these defaults in the Resource documentation:

+ +
default_filter :active do |scope|
+  scope.where(active: true)
+end
+
+default_page_size(10)
+
+default_sort([{ created_at: :desc }])
+ +

These can all be overriden by the user. In other words, hitting +/posts will only show active Posts, hitting +/posts?filter[active]=false will show inactive Posts. The same applies +for sorting and pagination.

+ +

A common pattern is for default filters to apply for all users, but +allow overrides for administrators. You can use the :if option to +restrict the override:

+ +
# app/resources/post_resource.rb
+allow_filter :active, if: :admin?
+
+# app/controllers/posts_controller.rb
+def admin?
+  current_user.admin?
+end
+ +

Now the default behavior is to view only active Posts, but +administrators can override this default.

+ +


+

+ +
+
+
+ + + + + + diff --git a/_site/how-to-autodocument.html b/_site/how-to-autodocument.html new file mode 100644 index 0000000..29fc02d --- /dev/null +++ b/_site/how-to-autodocument.html @@ -0,0 +1,282 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

How to Autodocument with Swagger

+ +

You can follow the steps below, or view the diff on github

+ +

This suite uses DSLs to specify inputs (strong_resources, filters, etc), and outputs (jsonapi-rb serializers). +We can introspect that DSL to provide automatic documentation. Not only +does this save a lot of time, it ensures your code and documentation are +never out of sync.

+ +

Here we’ll be using swagger, a popular open-source +documentation framework. +
+

+ +

+ +


+To get this UI, we need to install two things: a controller that +generates a schema (swagger.json), and a static website +in public. Let’s start by adding dependencies: +
+

+ +
# Gemfile
+# Below 'jsonapi_suite'
+gem 'jsonapi_spec_helpers'
+gem 'jsonapi_swagger_helpers'
+ +

+ Note: here we’re moving jsonapi_spec_helpers out of the + test-specific bundle group. Introspecting spec helpers is part of + autodocumenting, so we’ll require them manually when our documentation + controller is loaded. +

+ +

Our web UI is a Glimmer App, +but we’ll only deal with the already-compiled static files glimmer builds. +Let’s copy those files and expose them to the web by putting them in +public:

+ +
$ mkdir -p public/api/docs && cd public/api/docs
+$ git clone https://github.com/jsonapi-suite/swagger-ui.git && cp swagger-ui/prod-dist/* . && rm -rf swagger-ui
+ +

Our documentation will be accessible at /api/docs, so we put the files +in public/api/docs. You may want a different directory depending on +your own routing rules. In either case, our next step is to edit +index.html: make sure any javascript and css has the correct URL. +There are also a few configuration options, such as providing a link to +Github.

+ +
window.CONFIG = {
+  githubURL: "http://github.com/user/repo",
+  basePath: "/api" // basePath/swagger.json, basePath/v1/employees, etc
+}
+ +

This static website will make a request to /api/swagger.json. Let’s +build that endpoint now:

+ +
$ touch app/controllers/docs_controller.rb
+ +
# config/routes.rb
+scope path: '/api' do
+  resources :docs, only: [:index], path: '/swagger'
+  # ... code ...
+end
+ +

Our DocsController uses swagger-blocks to generate +the swagger schema. Here’s the minimal setup needed to configure +swagger:

+ +
require 'jsonapi_swagger_helpers'
+
+class DocsController < ActionController::API
+  include JsonapiSwaggerHelpers::DocsControllerMixin
+
+  swagger_root do
+    key :swagger, '2.0'
+    info do
+      key :version, '1.0.0'
+      key :title, '<YOUR APP NAME>'
+      key :description, '<YOUR APP DESCRIPTION>'
+      contact do
+      key :name, '<YOU>'
+      end
+    end
+    key :basePath, '/api'
+    key :consumes, ['application/json']
+    key :produces, ['application/json']
+  end
+end
+ +

That’s it. Now, every time we add an endpoint, we can autodocument with +one line of code (below the swagger_root block):

+ +
jsonapi_resource '/v1/employees'
+ +

This endpoint will be introspected for all RESTful actions, outputting +the full configuration. There are a few customization options:

+ +
jsonapi_resource '/v1/employees',
+  only: [:create, :index],
+  except: [:destroy],
+  descriptions: {
+    index: "Some <b>additional</b> documentation"
+  }
+ +

If you want additional attribute-level documentation, you can add this +to your spec payloads:

+ +
key(:name, String, description: 'The full name, e.g. "John Doe"')
+ +


+Will give you an output similar to: +
+

+ +

+ +


+

+ +
+
+
+ + + + + + diff --git a/_site/how-to-build-an-adapter.html b/_site/how-to-build-an-adapter.html new file mode 100644 index 0000000..ebfec9c --- /dev/null +++ b/_site/how-to-build-an-adapter.html @@ -0,0 +1,263 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

Building an Adapter

+ +

If you find yourself repeatedly making customizations to a group of +Resources and seek DRYer code, package those customizations into an +Adapter. Here we’ll be starting from a previous how-to, How to Use +Alternate ORMs.

+ +

You can follow along with the below code snippets, or view the diff on +github.

+ +

Adapters are simpler than you might think. It’s little more than +copy-pasting those low-level customizations into a common class.

+ +

Start by creating lib/elasticsearch_adapter.rb. Cut/past the sorting, +pagination, and #resolve overrides from EmployeeResource into the adapter, +turning into def methods along the way:

+ +
# lib/elasticsearch_adapter.rb
+class ElasticsearchAdapter
+  def paginate(scope, current_page, per_page)
+    scope.metadata.pagination.current_page = current_page
+    scope.metadata.pagination.per_page = per_page
+    scope
+  end
+
+  def order(scope, att, dir)
+    scope.metadata.sort = [{att: att, dir: dir}]
+    scope
+  end
+
+  def resolve(scope)
+    scope.query!
+    scope.results
+  end
+end
+ +

Ensure our adapter gets loaded:

+ +
# config/initializers/jsonapi.rb
+require 'elasticsearch_adapter'
+ +

And switch to that adapter in EmployeeResource:

+ +
use_adapter ElasticsearchAdapter
+ +

Bounce your server. You can still hit the /api/v1/employees endpoint +with the same sort and paginate functionality, but the code has been +moved to an adapter.

+ +

Let’s ensure our users can filter as well:

+ +
def filter(scope, att, val)
+  scope.condition(att).eq(val)
+end
+ +

For all the methods and functionality an adapter supports, see the +Adapter documenation.

+ +

We probably also want has_many-style macros to avoid writing similar +allow_sideload code time after time. Start by specifying where this +functionality is defined, and add a has_many macro:

+ +
module Sideloading
+  def has_many(association_name,
+               scope:,
+               resource:,
+               foreign_key:,
+               primary_key: :id,
+               &blk)
+    # our code will go here
+    instance_eval(&blk) if blk
+  end
+end
+
+def sideloading_module
+  Sideloading
+end
+ +

The instance_eval is there so we can always drop down to a lower-level +customization in our Resource.

+ +

We can basically cut/paste our existing sideload code and rewrite it as +variables:

+ +
scope do |parents|
+  parent_ids = parents.map { |p| p.send(primary_key) }
+  scope.call.condition(foreign_key).or(parent_ids.uniq.compact)
+end
+
+assign do |parents, children|
+  parents.each do |p|
+    relevant_children = children.select do |c|
+      c.send(foreign_key) == p.send(primary_key)
+    end
+    p.send(:"#{association_name}=", relevant_children)
+  end
+end
+ +

You can now remove any customizations from your Resource classes. You +can continue to build the adapter, adding belongs_to, statistics, and +more. View the adapter documentation for the full API.

+ +
+
+
+ + + + + + diff --git a/_site/how-to-cause-side-effects.html b/_site/how-to-cause-side-effects.html new file mode 100644 index 0000000..da96d83 --- /dev/null +++ b/_site/how-to-cause-side-effects.html @@ -0,0 +1,242 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

Side Effects

+ +

Side effects scenarios come up often. What if we want to send an email +notification every time a Comment is created?

+ +

It’s important to note that there are three overall categories of side effects, +and each requires a different solution:

+ +
    +
  • Side effects internal to the Model: For example, setting a +published_at attribute.
  • +
  • Side effects that should only occur on a specific request: For +example, only send an email update if we’re creating a Post for the +first time, at the /posts endpoint.
  • +
  • Side effects that should occur on every type of request: For +example, send an email notification every time a Comment is created - +but not updated - whether it was created at the /comments endpoint or sideposted at the +/posts endpoint.
  • +
+ +

Internal Side-Effects

+ +

For the first scenario, it’s OK to use ActiveRecord callbacks (or the +equivalent functionality in a different ORM):

+ +
# app/models/user.rb
+class Post < ApplicationRecord
+  before_save :set_published_at,
+    on: :update,
+    if: :publishing?
+
+  private
+
+  def set_published_at
+    self.published_at = Time.now
+  end
+
+  def publishing?
+    status_changed? && status == 'published'
+  end
+end
+ +

Side-Effects on Specific Action

+ +

Just like you would with vanilla Rails, use the controller. Here we’ll +only send an email to our subscribers when the Post is first created. +Keep in mind we could also “sidepost” Post objects at the /blogs +endpoint, but this will only fire at the /posts endpoint.

+ +
class PostsController < ApplicationController
+  def create
+    post, success = jsonapi_create.to_a
+
+    if success
+      PostMailer.published_email.deliver_later
+      render_jsonapi(post, scope: false)
+    else
+      render_errors_for(post)
+    end
+  end
+end
+ +

Side-Effects on Every Request of a Given Type

+ +

Let’s add some special logging every time we create a Post. Note this +will fire every time we create a Post - whether we create it at the +/posts endpoint or “sidepost” at the /blogs endpoint.

+ +

We do not need to worry about this side-effect in our model specs, +or rake tasks, as the functionality is only relevant to the API.

+ +

Edit your Resource:

+ +
# app/resources/post_resource.rb
+def create(attributes)
+  Rails.logger.info "Post begin created by #{context.current_user.email}..."
+  super
+  Rails.logger.info "Success!"
+end
+ + +
+
+
+ + + + + + diff --git a/_site/how-to-code-many-to-many-associations.html b/_site/how-to-code-many-to-many-associations.html new file mode 100644 index 0000000..b354a57 --- /dev/null +++ b/_site/how-to-code-many-to-many-associations.html @@ -0,0 +1,194 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

Many-to-Many Associations

+ +

has_and_belongs_to_many are possible, but maybe not desirable +depending on your use case. Following the example from the tutorial, +let’s say an Employee has many Teams and a Team has many +Employees. We could wire-up our EmployeeResource like so:

+ +
has_and_belongs_to_many :teams,
+  scope: -> { Team.all },
+  foreign_key: { employee_teams: :employee_id },
+  resource: TeamResource
+ +

The only difference here is the foreign_key - we’re passing a hash +instead of a symbol. employee_teams is our join table, and +employee_id is the true foreign key.

+ +

This will work, and for simple many-to-many relationships you can move +on. But what if we want to add the property primary, a boolean, to the +employee_teams table?

+ +

As this is metadata about the relationship it should go on the meta +section of the corresponding relationship object. +While supporting such an approach is on the JSONAPI Suite roadmap, many +clients do not currently support this per-object level of functionality.

+ +

For now, it might be best to simply expose the intermediate table to the +API. Using a client like +JSORM, the overhead of this +approach is minimal.

+ +


+

+ +
+
+
+ + + + + + diff --git a/_site/how-to-code-polymorphic-associations.html b/_site/how-to-code-polymorphic-associations.html new file mode 100644 index 0000000..ef7399d --- /dev/null +++ b/_site/how-to-code-polymorphic-associations.html @@ -0,0 +1,215 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

Polymorphic Associations

+ +

Let’s say an Employee belongs to a Workspace. Workspaces have +different types - HomeOffice, Office, CoworkingSpace, etc.

+ +

Assuming we’ve already set up our database, let’s add the associations +to our Models:

+ +
# app/models/employee.rb
+belongs_to :workspace, polymorphic: true
+ +
# app/models/workspace.rb
+has_many :employees, as: :workspace
+ +

Now we need to wire-up our resource. Usually you’d see something like +has_many with a few options. But here, we may actually want to change +our configuration based on Workspace#type - maybe each type of data is +stored in a separate table, for instance.

+ +

We want to pass the same configuration, but on a type-by-type basis. In +other words, we need to group workspaces and define how to associate +each group:

+ +
# app/resources/employee_resource.rb
+polymorphic_belongs_to :workspace,
+  group_by: :workspace_type,
+  groups: {
+    'Office' => {
+      scope: -> { Office.all },
+      resource: OfficeResource,
+      foreign_key: :workspace_id
+    },
+    'HomeOffice' => {
+      scope: -> { HomeOffice.all },
+      resource: HomeOfficeResource,
+      foreign_key: :workspace_id
+    }
+  }
+ +

Let’s say our API was returning 10 Employees, sideloading their +corresponding Workspace. The underlying code would:

+ +
    +
  • Fetch the employees
  • +
  • Group the employees by the given key: employees.group_by { |e| +e.workspace_type }
  • +
  • Use the Office configuration for all Employees where +workspace_type is Office, and use the HomeOffice configuration +for all Employees where workspace_type is HomeOffice.
  • +
+ +


+

+ +
+
+
+ + + + + + diff --git a/_site/how-to-conditionally-render-fields.html b/_site/how-to-conditionally-render-fields.html new file mode 100644 index 0000000..75394a5 --- /dev/null +++ b/_site/how-to-conditionally-render-fields.html @@ -0,0 +1,203 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

Extra Attributes

+ +

Of course, JSONAPI already has the concept of sparse fieldsets built-in. +This behavior comes out-of-the-box at URLs like +/people?fields[people]=title,active.

+ +

Sometimes it’s necessary to conditionally render an extra field as +well. For instance, maybe rendering out the net_worth attribute is +computationally expensive and not often requested.

+ +

Let’s add a simple extra attribute:

+ +
# app/serializers/serializable_person.rb
+extra_attribute :net_worth do
+  1_000_000
+end
+ +

This field will not be rendered when we hit /people. It will only be +rendered when we hit /people?extra_fields[people]=net_worth. The URL +signature is the same as sparse fieldsets.

+ +

We may want to eager load some data, only when a specific extra field is +requested. We can do that by customizing the Resource:

+ +
# app/resources/person_resource.rb
+extra_field :net_worth do |scope|
+  scope.includes(:assets)
+end
+ +

We will now eager load assets only when the net_worth extra field is +specified in the request.

+ +

Finally, additional conditionals can still be applied:

+ +
# app/serializers/serializable_person.rb
+extra_attribute :net_worth, if: proc { @context.allow_net_worth? } do
+ +

If using Rails, @context is your controller.

+ +


+

+ +
+
+
+ + + + + + diff --git a/_site/how-to-customize-error-responses.html b/_site/how-to-customize-error-responses.html new file mode 100644 index 0000000..dee418c --- /dev/null +++ b/_site/how-to-customize-error-responses.html @@ -0,0 +1,228 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

Customizing Error Responses

+ +

Your application will automatically return a JSONAPI-compliant error +object whenever an error is raised. +That’s due to this code in ApplicationController:

+ +
# app/controllers/application_controller.rb
+rescue_from Exception do |e|
+  handle_exception(e)
+end
+ +

If we put raise 'foo' in a controller somewhere, we’d see the +response:

+ +
{
+  errors: [
+    code: 'internal_server_error',
+    status: '500',
+    title: 'Error',
+    detail: "We've notified our engineers and hope to address this issue shortly.",
+    meta: {}
+  ]
+}
+ +

This can all be customized. Let’s say for all +ActiveRecord::RecordNotFound errors we want a 404 response code, with +the error detail providing a custom message:

+ +
# app/controllers/application_controlle.rb
+register_exception ActiveRecord::RecordNotFound,
+  status: 422,
+  message: ->(e) { "Couldn't find record with id #{e.id}" }
+ +

Would output:

+ +
{
+  errors: [
+    code: 'not_found',
+    status: '404',
+    title: 'Error',
+    detail: "Couldn't find record with id 123",
+    meta: {}
+  ]
+}
+ +

You can register exceptions in ApplicationController, or any subclass +if you want a specific controller to handle a given error differently.

+ +

For more customization options, see the jsonapi_errorable gem.

+ +

You may want your test suite to throw errors, instead of returning +this friendly output. Configure this using JsonapiErrorable.disable!:

+ +
# spec/rails_helper.rb
+config.before :each do
+  JsonapiErrorable.disable!
+end
+
+# enable for specific test
+it 'does something' do
+  JsonapiErrorable.enable!
+  # ... code ...
+end
+ +


+

+ +
+
+
+ + + + + + diff --git a/_site/how-to-return-statistics.html b/_site/how-to-return-statistics.html new file mode 100644 index 0000000..2de422c --- /dev/null +++ b/_site/how-to-return-statistics.html @@ -0,0 +1,213 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

Statistics

+ +

Imagine a grid listing records. What if we want “X total records”, +above that grid, or “average cost” elsewhere in our UI?

+ +

These calculations are supported via allow_stat:

+ +
# app/resources/employee_resource.rb
+allow_stat total: [:count]
+ +

A GET to /api/employees?stats[total]=count would return:

+ +
{
+  data: [...],
+  meta: {
+    stats: {
+      total: {
+        count: 100
+      }
+    }
+  }
+}
+ +

A few ‘default calculations’ are provided: count, sum, average, +maximum and minimum. These will work out-of-the-box with ActiveRecord. +Alternatively, override these calculation functions:

+ +
allow_stat :salary do
+  average { |scope, attr| scope.average(attr) }
+end
+ +

Or support your own custom calculations:

+ +
allow_stat salary: [:average] do
+  standard_deviation { |scope, attr| ... }
+end
+ +

Multiple stats are supported with one request:

+ +
+

GET /api/employees?stats[salary]=average,maximum&stats[total]=count

+
+ +

If you want only stats, and no records (for performance), simple pass page size 0:

+ +
+

GET /api/employees?stats[salary]=average&page[size]=0

+
+ +


+

+ +
+
+
+ + + + + + diff --git a/_site/how-to-scope-to-current-user.html b/_site/how-to-scope-to-current-user.html new file mode 100644 index 0000000..b4a0bf7 --- /dev/null +++ b/_site/how-to-scope-to-current-user.html @@ -0,0 +1,245 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

Scoping to Current User

+ +

Scenario: Scoping Queries

+ +
+

Given a Post model with hidden attribute, only allow administrators +to view hidden Posts.

+
+ +

Let’s start by adding a visible scope to Post, so we can easily +retrive only Posts where hidden is false:

+ +
# app/models/post.rb
+scope :visible, -> { where(hidden: false) }
+ +

As you know, we would typically use the base scope Post.all like so:

+ +
def index
+  render_jsonapi(Post.all)
+end
+ +

Let’s instead use the base scope Post.visible when the user is not an +administrator:

+ +
def index
+  scope = current_user.admin? ? Post.all : Post.visible
+  render_jsonapi(scope)
+end
+ +

That’s it! Now only administrators can view hidden Posts.

+ +

Privileged Writes

+ +
+

Given Posts that have an internal attribute, only allow +internal users to publish internal posts.

+
+ +

Our controller context is available in our resource. Let’s override +Resource#create to ensure correct privileging:

+ +
def create(attributes)
+  if !internal_user? && attributes[:internal] == true
+    raise "Hey you! YOU can't publish internal posts!"
+  else
+    super
+  end
+end
+
+private
+
+def internal_user?
+  context.current_user.internal?
+end
+ +

Guarding Filters

+ +
+

Given Employees with attribute under_performance_review, do not allow clients to find all employees under performance review.

+
+ +

Occasionally you need to guard filters based on the current user. Use +the :if option on allow_filter. This will execute in the context of +your controller:

+ +
# app/resources/employee_resource.rb
+allow_filter :name, if: :admin?
+ +
# app/controllers/employees_controller.rb
+class EmployeesController < ApplicationController
+  jsonapi resource: EmployeeResource
+
+  def index
+    render_jsonapi(Employee.all)
+  end
+
+  private
+
+  def admin?
+    current_user.admin?
+  end
+end
+ + +
+
+
+ + + + + + diff --git a/_site/how-to-use-without-activerecord.html b/_site/how-to-use-without-activerecord.html new file mode 100644 index 0000000..d63d803 --- /dev/null +++ b/_site/how-to-use-without-activerecord.html @@ -0,0 +1,330 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

Usage Without ActiveRecord: ElasticSearch

+ +

Though we’ll be hitting elasticsearch in this +example, remember that this is just an HTTP API underneath the hood. The +same pattern applies to a variety of use cases.

+ +

First we need a Client for elasticsearch. Though you can feel free +to use a variety of clients, this example will use trample.

+ +

Though we’ll show code snippets below, feel free to view the diff on +github.

+ +

Also keep in mind, we’ll be showing a one-off customization here. You +probably want to extract this code into an Adapter if this is going to +become a core component of your application.

+ +

Start by installing trample:

+ +
# Gemfile
+gem 'trample_search', require: 'trample'
+ +

Tell searchkick that we want to +index Employees and Positions:

+ +
# app/models/employee.rb
+searchkick text_start: [:first_name]
+
+# app/models/position.rb
+searchkick text_start: [:title]
+ +

Define our search classes. These tell trample the configuration of the +search:

+ +
# app/models/employee_search.rb
+class EmployeeSearch < Trample::Search
+  model Employee
+
+  condition :first_name, single: true
+  condition :last_name, single: true
+end
+
+# app/models/position_search.rb
+class PositionSearch < Trample::Search
+  model Position
+
+  condition :title, single: true
+  condition :employee_id
+end
+ +

In our controller, we need to pass a base scope. Before, we were passing +an ActiveRecord::Relation (Post.all). Let’s pass an instance +of Trample::Search instead. Since by default search results come back +as Hashie::Mashes, we’ll also specify our serializer directly. You +could also use a generic SearchResult serializer, it’s up to you.

+ +
# app/controllers/employees_controller.rb
+def index
+  render_jsonapi EmployeeSearch.new,
+    class: SerializableEmployeeSearchResult
+end
+ +
# app/serializers/serializable_employee_search_result.rb
+class SerializableEmployeeSearchResult < JSONAPI::Serializable::Resource
+  type :employees
+
+  attribute :first_name
+  attribute :last_name
+  attribute :created_at
+  attribute :updated_at
+
+  has_many :positions, class: 'SerializablePositionSearchResult'
+end
+ +

Since we are now passing a non-default base scope, we need to tell our +Resource how to query and resolve this new scope. Start by switching to +the pass-through adapter, and resolve using trample’s query API:

+ +
# app/resources/employee_resource.rb
+use_adapter JsonapiCompliable::Adapters::Null
+# ... code ...
+def resolve(scope)
+  scope.query!
+  scope.results
+end
+
+# remove the belongs_to for now
+ +

You can now hit http://localhost:3000/api/v1/employees - the exact +same payload is coming back, but is now sourced from elasticsearch!

+ +

Let’s add a prefix filter:

+ +
# app/resources/employee_resource.rb
+allow_filter :first_name_prefix do |scope, value|
+  scope.condition(:first_name).starts_with(value)
+end
+ +

Hit http://localhost:3000/api/v1/employees?filter[first_name]=hom. +You’re now successfully querying the elasticsearch index.

+ +

If we want sorting and pagination, we need to tell the Resource + how to deal with that, too:

+ +
# app/resources/employee_resource.rb
+paginate do |scope, current_page, per_page|
+  scope.metadata.pagination.current_page = current_page
+  scope.metadata.pagination.per_page = per_page
+  scope
+end
+
+sort do |scope, att, dir|
+  scope.metadata.sort = [{att: att, dir: dir}]
+  scope
+end
+ +

View the Resource and Adapter documentation for additional overrides, like statistics.

+ +

The last step is adding the positions association. If we want +has_many-style macros we need to create an Adapter, but for now +let’s simply use the lower-level allow_sideload DSL. We need to define +two functions: how to build a scope for the association, and how to +associate the resulting objects:

+ +
# app/resources/employee_resource.rb
+allow_sideload :positions, resource: PositionResource do
+  scope do |employees|
+    scope = PositionSearch.new
+    scope.condition(:employee_id).or(employees.map(&:id))
+  end
+
+  assign do |employees, positions|
+    employees.each do |e|
+      e.positions = positions.select { |p| p.employee_id = e.id }
+    end
+  end
+end
+ +

Convert the PositionResource to use elasticsearch, just like we did +for Employee:

+ +
# app/resources/position_resource.rb
+use_adapter JsonapiCompliable::Adapters::Null
+
+def resolve(scope)
+  scope.query!
+  scope.results
+end
+ +

Create the SerializablePositionSearchResult class that we referenced +in app/serializers/serializable_employee.rb:

+ +
class SerializablePositionSearchResult < JSONAPI::Serializable::Resource
+  type :positions
+
+  attribute :title
+end
+ +

We can now sideload positions - check out the results at +http://localhost:3000/api/v1/employees?include=positions. We’re +fetching employees and their corresponding positions in a single +request, via elasticsearch. Any filters/changes/default sort/etc that +apply to PositionResource can be re-used at this endpoint.

+ +

If this was a one-off section of our application, we can call this good +enough and move on. But as we continue to use this pattern, it’s going +to get monotonous writing the same filter overrides, allow_sideload +wiring code, etc. To DRY up this code, we can package our changes into +an Adapter.

+ +
+
+
+ + + + + + diff --git a/_site/how-to-write-specs.html b/_site/how-to-write-specs.html new file mode 100644 index 0000000..bae02b3 --- /dev/null +++ b/_site/how-to-write-specs.html @@ -0,0 +1,269 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

Writing Specs

+ +
+

NB: before writing specs, make sure you are set up correctly by +following the Quickstart

+
+ +

Validating verbose JSON API responses in tests can be a pain. We could +use something like json_matchers to validate a schema, but we hope to do one better - let’s validate full payloads with a few simple helpers, using full-stack rspec request specs.

+ +

Let’s say we’re testing the show action of our employees controller, sideloading the employee’s department. Follow the Quickstart to make sure your rails_helper.rb is setup correctly first.

+ +

Let’s say we’re testing the show action of our employees controller, sideloading the employee’s department.

+ +

Let’s begin with vanilla RSpec of what the test might look like:

+ +
require 'rails_helper'
+
+RSpec.describe 'employees#show', type: :request do
+  let!(:homer)  { Employee.create!(name: 'Homer Simpson') }
+  let!(:safety) { employee.create_department!(name: 'Safety') }
+
+  it 'renders an employee, sideloading department' do
+    get "/api/employees/#{homer.id}", params: {
+      include: 'department'
+    }
+    # ... code asserting json response ...
+  end
+end
+ +

To avoid painful json assertions, let’s use jsonapi_spec_helpers. Start by adding some setup code:

+ +
# spec/rails_helper.rb
+require 'jsonapi_spec_helpers'
+
+RSpec.configure do |config|
+  config.include JsonapiSpecHelpers
+end
+ +

And now to validate the response, we’ll call assert_payload:

+ +
assert_payload(:employee, homer, json_item)
+assert_payload(:department, safety, json_include('departments'))
+ +

assert_payload takes three arguments:

+
    +
  • The name of a payload we’ve defined (we haven’t done this yet).
  • +
  • The record we want to compare against
  • +
  • The relevant slice of json. json_item and json_includes are +helpful methods to target the right slice. You can see all helpers in +the documentation for jsonapi_spec_helpers.
  • +
+ +

OK, so we want to take a record, response JSON, and compare them against +something pre-defined. Let’s write those definitions; they look very similar to +something you’d write for factory_girl:

+ +
# spec/payloads/employee.rb
+JsonapiSpecHelpers::Payload.register(:employee) do
+  key(:name)
+  key(:email)
+
+  timestamps!
+end
+
+# spec/payloads/department.rb
+JsonapiSpecHelpers::Payload.register(:department) do
+  key(:name)
+end
+ +

assert_payload will do four things:

+ +
    +
  • Ensure keys that are not in the payload definition are not present.
  • +
  • Ensure all keys in the registered payload are present.
  • +
  • Ensures no value in a key/value pair is nil (this is overrideable).
  • +
  • Ensures each key matches the expected record value. In other words, +we’re doing something like expect(json['email']).to eq(homer.email).
  • +
+ +

The comparison value can be customized. Let’s say we serialize the +name attribute as a combination of the employee’s first_name and +last_name:

+ +
key(:name) { |record| "#{record.first_name} #{record.last_name}" }
+ +

Optionally, validate against a type as well. If both the expected and +actual values match, but are the incorrect type, the test will fail:

+ +
key(:salary, Integer)
+ +

You can also customize/override payloads at runtime in your test. Let’s +say we only serialize salary when the current user is an admin. Your +test could look something like:

+ +
sign_in(:user)
+assert_payload(:employee, homer, json_item)
+sign_in(:admin)
+assert_payload(:employee, homer, json_item) do
+  key(:salary)
+end
+ +

For documentation on all the spec helpers we provide, check out the +jsonapi_spec_helpers gem.

+ +


+

+ +
+
+
+ + + + + + diff --git a/_site/index.html b/_site/index.html new file mode 100644 index 0000000..5d7bafe --- /dev/null +++ b/_site/index.html @@ -0,0 +1,298 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+
+ Skip Intro » + +
+ JSONAPI SUITE + is a collection of + ruby libraries + that facilitate the + jsonapi.org + specification. +
+ +
+ If you're + unfamiliar + with + JSONAPI, + think + +
"RESTful GraphQL created by Yehuda Katz"
+
+ +
+ Here's a simple Suite app: +
+ + + +
# controllers/posts_controller.rb
+class PostsController
+  jsonapi resource: PostResource
+
+  def index
+    posts = Post.all
+    render_jsonapi(posts)
+  end
+end
+  
+ + + +
# resources/post_resource.rb
+class PostResource
+  type :posts
+  model Post
+
+  allow_filter :title
+  allow_stat total: [:count]
+end
+  
+ + + +
# serializers/serializable_posts.rb
+class SerializablePosts
+  type :posts
+
+  attribute :title
+  attribute :created_at
+  attribute :updated_at
+end
+  
+ +
+ +
+ This API now supports + Sparse Fieldsets, + Sorting, + Pagination, + statistics, and + Filtering. + + Though we're using + ActiveRecord + in these examples, the same patterns + apply to + ANY ORM or DATASTORE + including + HTTP calls. + Blend SQL and NoSQL in a + single + request. +
+ +
+ Let's access the API using our + Javascript Client, + which you can think of as +
+ "ActiveRecord in the browser" +
+
+ + + +
await Post
+  .where({ title: "Hello!" })
+  .order({ created_at: "desc" })
+  .per(10).page(2)
+  .stats({ total: "count" })
+  .fields(["title", "byline"])
+  
+ +
+ + + + + + + +
+ Associations are simple and customizable: + + + +
# app/resources/post_resource.rb
+has_many :comments,
+  scope: -> { Comment.all },
+  resource: CommentResource,
+  foreign_key: :post_id
+  
+ + + +
// In your JS app
+Post.includes("comments")
+  
+ +
+
+ +
+ Associations are + deep queryable. In other words, + you could fetch the Post and only its + active comments, + sorted by + created_at descending. + This applies to your + entire graph of data. + The server-side code would be nothing more than: +
+ + + +
allow_filter :active
+  
+ +
+ +
+ At this point, You may be thinking: + +
+ + "Is this just a bunch of incomprehensible ruby magic + + 😬 + + ?" + +
+ +
+ No. +
+ + We're simply parsing the request, removing boilerplate, and supplying + sensible defaults because we believe in + convention over configuration. +
+ +
+ Let's make our filter a prefix query: +
+ + + +
allow_filter :title_prefix do |scope, value|
+  scope.where(["title LIKE ?", "#{value}%"])
+end
+  
+ +
+ +
+ From filtering to pagination, these are all just + customizable lambdas. + You have + complete control + of the query. +
+ +
+ Just as you can + Query + the full graph of data, you can also + Persist + the full graph of data in a + single request: +
+ + + +
post = new Post({ title: "JSONAPI Rocks!" })
+comment = new Comment({ body: "I agree!" })
+post.comments.push(comment)
+post.save({ with: "comments" })
+  
+ +
+ +
+ All of this is easily validated with + end-to-end + integration test patterns + that ensure + backwards-compatibility: +
+ + + +
let(:post1) { create(:post, title: "Hello") }
+let(:post2) { create(:post, title: "Hiya") }
+
+it "filters correctly" do
+  jsonapi_get '/api/v1/posts', params: {
+    filter: { title_prefix: 'He' }
+  }
+  expect(json_ids(true)).to eq([post1.id])
+  assert_payload(:post, post1, json_items[0])
+end
+  
+ +
+ +
+ ...and + automatically documented + in Swagger: +
+ +
+ +
+ +
+ There's + so much more + to talk about. To get your feet wet, check out + our + Quickstart, + or step-by-step + Tutorial. + We also have + comprehensive documentation + on the + Server + and on the + Client. + Join our + Slack Chat + to ask questions or say hi - we'd + love to meet you and hear what you think ❤️ +
+
+ +
+
+ + diff --git a/_site/js/authentication.html b/_site/js/authentication.html new file mode 100644 index 0000000..5fe214a --- /dev/null +++ b/_site/js/authentication.html @@ -0,0 +1,276 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

Authentication

+ +

JSORM supports JSON Web Tokens. These can +be set manually, or automatically fetched from localStorage.

+ +

To set manually:

+ +
ApplicationRecord.jwt = 'myt0k3n'
+ +
+

All requests will now send the header:
+Authorization: Token token="myt0k3n".

+
+ +

To set via localStorage, simply store the token with a key of jwt +and it will be set automatically. To customize the localStorage key:

+ +
ApplicationRecord.jwtStorage = "authtoken"
+ +

…or to opt-out of localStorage altogether:

+ +
ApplicationRecord.jwtStorage = false
+ +

You can control the format of the header that is sent to the +server:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
  class ApplicationRecord extends JSORMBase {
+    // ... code ...
+    static generateAuthHeader(token) {
+      return `Bearer ${token}`
+    }
+  }
+  
+ +
  var ApplicationRecord = JSORMBase.extend({
+    // ... code ...
+    static: {
+      generateAuthHeader: function(token) {
+        return "Bearer " + token;
+      }
+    }
+  });
+  
+ +
+ +

Finally, if your server returns a refreshed JWT within the X-JWT +header, it will be used in all subsequent requests (and localStorage +will be updated automatically if you’re using it).

+ + +
+ +
+
+
+ + + + + + diff --git a/_site/js/ddau.html b/_site/js/ddau.html new file mode 100644 index 0000000..caea8b7 --- /dev/null +++ b/_site/js/ddau.html @@ -0,0 +1,219 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

Data Down, Actions Up

+ +

It’s a popular pattern to pass data down to components, avoid modifying state within the component, and instead pass actions up to modify state. This can make complex applications easier to track and reason about, and you’ll see it in client-side frameworks from React to Ember.

+ +

To follow this pattern, use #dup() when passing down to your component:

+ +
<my-component something="model.dup()" />
+ +

This will create a new instance of the model with all the same state. +Avoid modifying this instance in your component and instead pass +actions up.

+ +

When opting-in to state-syncing these instances will sync-up whenever one of these is instances is persisted. You won’t have to worry about updating the child component when the parent instance is saved.

+
+ +
+
+
+ + + + + + diff --git a/_site/js/home.html b/_site/js/home.html new file mode 100644 index 0000000..2dc6638 --- /dev/null +++ b/_site/js/home.html @@ -0,0 +1,302 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+
+

Start here: Why JSORM?

+
+ +
+
+ Typescript +
+
+ Javascript +
+
+
+ +
// JSORM is like "ActiveRecord in Javascript". It can:
+//
+// * Deeply nest reads and writes
+// * Automatically handle validation errors
+// * Replace *ux patterns
+// * ...and much more!
+
+// define models
+@Model()
+class ApplicationRecord extends JSORMBase {
+  static baseUrl = "http://my-api.com"
+  static apiNamespace = "/api/v1"
+}
+
+@Model()
+class Person extends ApplicationRecord {
+  static jsonapiType = "people"
+
+  @Attr() firstName: string
+  @Attr() lastName: string
+
+  get fullName() {
+    return `${this.firstName} ${this.lastName}`
+  }
+}
+
+// execute queries
+Person
+  .where({ first_name: 'John' })
+  .order({ created_at: 'desc' })
+  .per(10).page(2)
+  .includes({ jobs: 'company' })
+  .select({ people: ['first_name', 'last_name'] })
+
+// persist data
+let person = new Person({ firstName: 'Jane' })
+person.save()
+    
+ +
// JSORM is like "ActiveRecord in Javascript". It can:
+//
+// * Deeply nest reads and writes
+// * Automatically handle validation errors
+// * Replace *ux patterns
+// * ...and much more!
+
+var jsorm = require('jsorm')
+
+// define models
+const ApplicationRecord = jsorm.JSORMBase.extend({
+  static: {
+    baseUrl: 'http://my-api.com',
+    apiNamespace: '/api/v1'
+  }
+})
+
+const Person = ApplicationRecord.extend({
+  attrs: {
+    firstName: jsorm.attr(),
+    lastName: jsorm.attr()
+  },
+  methods: {
+    fullName: function() {
+      return this.firstName + ' ' + this.lastName;
+    }
+  }
+})
+
+// execute queries
+Person
+  .where({ first_name: 'John' })
+  .order({ created_at: 'desc' })
+  .per(10).page(2)
+  .includes({ jobs: 'company' })
+  .select({ people: ['first_name', 'last_name'] })
+
+// persist data
+var person = new Person({ firstName: 'Jane' })
+person.save()
+    
+ +
+
+ +
+
+
+ + + + + + diff --git a/_site/js/installation.html b/_site/js/installation.html new file mode 100644 index 0000000..d09d46a --- /dev/null +++ b/_site/js/installation.html @@ -0,0 +1,565 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

Installation

+ +

Installation is straightforward. Since we use fetch underneath the +hood, we recommend installing alongside a fetch polyfill.

+ +

If using yarn:

+ +
$ yarn add jsorm isomorphic-fetch
+ +

If using npm:

+ +
$ npm install jsorm isomorphic-fetch
+ +

Now import it:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
import {
+  Model,
+  JSORMBase,
+  Attr,
+  BelongsTo,
+  HasMany
+  // etc
+} from "jsorm"
+ +
const {
+  JSORMBase,
+  attr,
+  belongsTo,
+  hasMany
+  // etc
+} = require("jsorm/dist/jsorm")
+ +
+ +

…or, if you’re avoiding JS modules, jsorm will be available as a global in +the browser.

+ +

Defining Models

+ +

Connecting to the API

+ +

Just like ActiveRecord, our models will inherit from a base class that +holds connection information (ApplicationRecord, or +ActiveRecord::Base in Rails < 5):

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
class ApplicationRecord extends JSORMBase {
+  static baseUrl = "http://my-api.com"
+  static apiNamespace = "/api/v1"
+}
+ +
const ApplicationRecord = JSORMBase.extend({
+  static: {
+    baseUrl: "http://my-api.com",
+    apiNamespace: "/api/v1"
+  }
+})
+ +

All URLs follow the following pattern:

+ +
    +
  • baseUrl + apiNamespace + jsonapiType
  • +
+ +

As you can see above, typically baseUrl and apiNamespace are set on +a top-level ApplicationRecord (though any subclass can override). +jsonapiType, however, is set per-model:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
class Person extends ApplicationRecord {
+  static jsonapiType = "people"
+}
+ +
const Person = ApplicationRecord.extend({
+  static: {
+    jsonapiType: "people"
+  }
+})
+ +
+ +

With the above configuration, all Person endpoints will begin +http://my-api.com/api/v1/people.

+ +
+

TIP: Avoid CORS and use relative paths by simply setting baseUrl to +""

+
+ +
+

TIP: You can always use the endpoint option to override this pattern +and set the endpoint manually.

+
+ +

Defining Attributes

+ +

ActiveRecord automatically sets attributes by introspecting database +columns. We could do the same - swagger.json is our schema - but tend +to agree with those who feel this aspect of ActiveRecord is a bit too +“magical”. In addition, explicitly defining our attributes can be used +to track which applications are using which attributes of the API.

+ +

Though this is configurable, by default we expect the API to be +under_scored and attributes to be camelCased.

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
class Person extends ApplicationRecord {
+  // ... code ...
+  @Attr() firstName: string
+  @Attr() lastName: string
+  @Attr() age: number
+
+  get fullName() : string {
+    return `${this.firstName} ${this.lastName}`
+  }
+}
+
+let person = new Person({ firstName: "John" })
+person.firstName // "John"
+person.lastName = "Doe"
+person.attributes // { firstName: "John", lastName: "Doe" }
+person.fullName // "John Doe"
+ +
const attr = jsorm.attr
+const Person = ApplicationRecord.extend({
+  // ... code ...
+  attrs: {
+    firstName: attr(),
+    lastName: attr(),
+    age: attr()
+    },}
+  methods: {
+    fullName: function() {
+      return this.firstName + " " + this.lastName;
+    }
+  }
+})
+
+var person = new Person({ firstName: "John" })
+person.firstName // "John"
+person.lastName = "Doe"
+person.attributes // { firstName: "John", lastName: "Doe" }
+person.fullName() // "John Doe"
+ +
+ +

Attributes can be marked read-only, so they are never sent to the server +on a write request:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
@Attr({ persist: false }) createdAt: string
+@Attr({ persist: false }) updatedAt: string
+ +
attrs: {
+  createdAt: attr({ persist: false }),
+  updatedAt: attr({ persist: false })
+}
+ +
+ +

Defining Relationships

+ +

Just like ActiveRecord, there are HasMany, BelongsTo, and +HasOne relationships:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
class Dog extends ApplicationRecord {
+  // ... code ...
+  @BelongsTo() person: Person[]
+}
+
+class Person extends ApplicationRecord {
+  // ... code ...
+  @HasMany() dogs: Dog[]
+}
+ +
const hasMany = jsorm.hasMany
+const belongsTo = jsorm.belongsTo
+
+const Person = ApplicationRecord.extend({
+  // ... code ...
+  attrs: {
+    dogs: hasMany()
+  }
+})
+
+const Dog = ApplicationRecord.extend({
+  // ... code ...
+  attrs: {
+    person: belongsTo()
+  }
+})
+ +
+ +

By default, we expect the relationship name to correspond to a +pluralized jsonapiType on a separate Model. If your models don’t +use this convention, feel free to supply it explicitly:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
class Dog extends ApplicationRecord {
+  // ... code ...
+  @BelongsTo('people') owner: Person[]
+}
+
+// alternatively, specify the class directly
+
+class Dog extends ApplicationRecord {
+  // ... code ...
+  @BelongsTo(Person) owner: Person[]
+}
+ +
const Dog = ApplicationRecord.extend({
+  // ... code ...
+  attrs: {
+    owner: belongsTo('people')
+  }
+})
+ +
+ +

Relationships can be:

+ +
    +
  • Assigned via constructor
  • +
  • Assigned directly
  • +
  • Automatically loaded via .includes() (see reads)
  • +
  • Saved in a single request .save({ with: 'dogs' }) (see +writes)
  • +
+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
let dog = new Dog({ name: "Fido" })
+let person = new Person({ dogs: [dog] })
+person.dogs[0].name // "Fido"
+
+let person = new Person()
+person.dogs = [dog]
+person.dogs[0].name // "Fido"
+
+// Will auto-create Dog instance
+let person = new Person({ dogs: [{ name: "Scooby" }] })
+person.dogs[0].name // "Scooby"
+
+let person = (await Person.includes('dogs')).data
+person.dogs // array of Dog instances from the server
+  
+ +
var dog = new Dog({ name: "Fido" })
+var person = new Person({ dogs: [dog] })
+person.dogs[0].name // "Fido"
+
+let person = new Person()
+person.dogs = [dog]
+person.dogs[0].name // "Fido"
+
+// Will auto-create Dog instance
+var person = new Person({ dogs: [{ name: "Scooby" }] })
+person.dogs[0].name // "Scooby"
+
+Person.includes('dogs').then((response) => {
+  var person = response.data
+  person.dogs // array of Dog instances from the server
+})
+  
+ +
+ + +
+
+ +
+
+
+ + + + + + diff --git a/_site/js/introduction.html b/_site/js/introduction.html new file mode 100644 index 0000000..b4d0e7a --- /dev/null +++ b/_site/js/introduction.html @@ -0,0 +1,238 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

Why JSORM?

+ +

Contracts like JSONAPI and GraphQL treat the API like a database. When querying a +database, we have two options:

+ +
    +
  • Type the low-level query language directly (in the database world, +this would be hand-typing SQL).
  • +
  • Use an ORM (like Rails’s ActiveRecord, Phoenix’s Ecto, Django’s +DjangoORM, or Node’s Sequelize).
  • +
+ +

While both options have pros and cons, we tend to think ORMs +have two overwhelming benefits: ease of use and composable queries. +We’ll explore both these concepts in other sections.

+ +

So, we want a javascript ORM for our JSONAPI “database”. Because +ActiveRecord is arguably the most well-known ORM, we’ve tried to match +its interface to make this library accessible to new users. That said, +you’ll find we’ve tried to favor explicitness over implicitness in +order to avoid common ActiveRecord pitfalls.

+ +
+ + + +
+
+
+ + + + + + diff --git a/_site/js/middleware.html b/_site/js/middleware.html new file mode 100644 index 0000000..f18ccff --- /dev/null +++ b/_site/js/middleware.html @@ -0,0 +1,299 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

Middleware

+ +

Middleware is helpful whenever you want to globally intercept request. +This is accomplished by assigning a MiddlewareStack to your +ApplicationRecord. Each stack has beforeFilters and afterFilters +where you can globally modify requests. If you throw("abort"), the +promise will be rejected.

+ +

Example: redirecting to the login page every time the server returns 401:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
  import { MiddlewareStack } from 'jsorm'
+
+  let middleware = new MiddlewareStack()
+  middleware.afterFilters.push((response, json) => {
+    if (response.status === 401) {
+      window.location.href = "/login"
+      throw("abort")
+    }
+  })
+
+  ApplicationRecord.middlewareStack = middleware
+  
+ +
  var MiddlewareStack = jsorm.MiddlewareStack;
+
+  var middleware = new MiddlewareStack();
+  middleware.afterFilters.push(function(response, json) {
+    if (response.status === 401) {
+      window.location.href = "/login";
+      throw("abort");
+    }
+  });
+
+  ApplicationRecord.middlewareStack = middleware;
+  
+ +
+ +

Example: adding a custom header before the request is sent:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
  import { MiddlewareStack } from 'jsorm'
+
+  let middleware = new MiddlewareStack()
+  middleware.beforeFilters.push((url, options) => {
+    options.headers["CUSTOM-HEADER"] = "whatever"
+  })
+
+  ApplicationRecord.middlewareStack = middleware
+  
+ +
  var MiddlewareStack = jsorm.MiddlewareStack;
+
+  var middleware = new MiddlewareStack();
+  middleware.beforeFilters.push(function(url, options) {
+    options.headers["CUSTOM-HEADER"] = "whatever";
+  });
+
+  ApplicationRecord.middlewareStack = middleware;
+  
+ +
+ + +
+ +
+
+
+ + + + + + diff --git a/_site/js/reads/fieldsets.html b/_site/js/reads/fieldsets.html new file mode 100644 index 0000000..84b2e05 --- /dev/null +++ b/_site/js/reads/fieldsets.html @@ -0,0 +1,252 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

Sparse Fieldsets

+ +

Use #select() to limit the fields returned by the server:

+ +
Post.select(['title', 'status']).all()
+ +
+

/posts?fields[posts]=title,status

+
+ +

When dealing with relationships, it may be easier to pass an object, +where the key is the corresponding JSONAPI type. This will be exactly +what’s sent to the server in ?fields:

+ +
Post.select({
+  posts: ['title', 'status'],
+  comments: ['created_at']
+}).all()
+ +
+

/posts?fields[posts]=title,status&fields[comments]=created_at

+
+ +

Extra Fieldsets

+ +

Use #selectExtra() to explicitly request a field that doesn’t usually +come back (often computationally expensive):

+ +
Post.selectExtra(['highlights', 'cumulative_ranking']).all()
+ +
+

/posts?extra_fields[posts]=highlights,cumulative_ranking

+
+ +

Just like the select example above, feel free to pass an object +specifying the fields for each relationship.

+ + +
+ +
+
+
+ + + + + + diff --git a/_site/js/reads/filtering.html b/_site/js/reads/filtering.html new file mode 100644 index 0000000..b2cbb7b --- /dev/null +++ b/_site/js/reads/filtering.html @@ -0,0 +1,263 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

Filtering

+ +

Use #where() to apply filters:

+ +
Post.where({ important: true }).all()
+ +
+

/posts?filter[important]=true

+
+ +

#where() clauses can be chained together. If the same key is seen +twice, it will be overridden:

+ +
Post
+  .where({ important: true })
+  .where({ ranking: 10 })
+  .where({ important: false })
+  .all()
+ +
+

/posts?filter[important]=false&filter[ranking]=10

+
+ +

#where() clauses are based on server implementation. The key +should be exactly as the server understands it. Here are some common +conventions we promote:

+ +
// id greater than 5
+Post.where({ id_gt: 5 }).all()
+
+// id greater than or equal to 5
+Post.where({ id_gte: 5 }).all()
+
+// id less than 5
+Post.where({ id_lt: 5 }).all()
+
+// id less or equal to 5
+Post.where({ id_lte: 5 }).all()
+
+// title starts with "foo"
+Post.where({ title_prefix: "foo" }).all()
+
+// OR these two values
+Post.where({ status_or: ['draft', 'review'] })
+
+// AND these two values (default)
+Post.where({ status: ['draft', 'review'] })
+ + +
+ +
+
+
+ + + + + + diff --git a/_site/js/reads/includes.html b/_site/js/reads/includes.html new file mode 100644 index 0000000..b3ee088 --- /dev/null +++ b/_site/js/reads/includes.html @@ -0,0 +1,241 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

Includes

+ +

Use #includes() to “sideload” associations:

+ +
Post.includes("comments").all()
+ +
+

/posts?include=comments

+
+ +

You can also pass an array of associations:

+ +
Post.includes(["blog, "comments"]).all()
+ +
+

/posts?include=blog,comments

+
+ +

Or an object for nested associations:

+ +
Post.includes(["blog", { comments: "author" }]).all()
+ +
+

/posts?include=blog,comments.author

+
+ + +
+ +
+
+
+ + + + + + diff --git a/_site/js/reads/index.html b/_site/js/reads/index.html new file mode 100644 index 0000000..4c62b56 --- /dev/null +++ b/_site/js/reads/index.html @@ -0,0 +1,478 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

Reads

+ +

The interface for read operations is a simpler version of the +ActiveRecord Query Interface. +Instead of generating SQL, we’ll be generating JSONAPI requests.

+ +

Basic Finders

+ +

Execute queries with .all(), find(), or .first():

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
let response = await Post.all()
+response.data // array of Post instances
+  
+ +
Post.all().then(function(response) {
+  response.data // array of Post instances
+});
+  
+ +
+
+

GET /posts

+
+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
let response = await Post.find(123)
+response.data // Post instance
+  
+ +
Post.find(123).then(function(response) {
+  response.data // Post instance
+});
+  
+ +
+
+

GET /posts/123

+
+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
let response = await Post.first()
+response.data // Post instance
+  
+ +
Post.first().then(function(response) {
+  response.data // Post instance
+});
+  
+ +
+
+

GET /posts?page[size]=1

+
+ +

Composable Queries with Scopes

+ +

The beauty of ORMs is their ability to compose queries. We’ll be doing +this by chaining together Scopes (query fragments). All of the methods +you see on this page can be chained together - the request will not fire +until the chain ends with all(), first(), or find. Example:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
let scope = Post.order({ name: "desc" })
+
+if (someCheckboxIsChecked) {
+  scope = scope.where({ important: true })
+} else {
+  scope = scope.where({ important: false })
+}
+
+scope.all() // request fires
+  
+ +
var scope = Post.order({ name: "desc" });
+
+if (someCheckboxIsChecked) {
+  scope = scope.where({ important: true });
+} else {
+  scope = scope.where({ important: false });
+}
+
+scope.all() // request fires
+  
+ +
+
+

/posts?sort=-name&filter[important]=true

+

/posts?sort=-name&filter[important]=false

+
+ +

In practice, you’ll probably have some scopes you want to re-use across +different contexts. A best practice is to store these scopes as class +methods (static methods) in the model:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
class Post extends ApplicationRecord {
+  // ... code ...
+  static superImportant() {
+    return this
+      .where({ ranking_gt: 8 })
+      .order({ ranking: 'desc' })
+      .stats({ total 'count' })
+  }
+}
+
+// get 10 super important posts
+let scope = Post.superImportant().per(10)
+scope.all() // fire query
+  
+ +
const Post = ApplicationRecord.extend({
+  // ... code ...
+  static: {
+    superImportant() {
+      return this
+        .where({ ranking_gt: 8 })
+        .order({ ranking: 'desc' })
+        .stats({ total 'count' })
+    }
+  }
+})
+
+// get 10 super important posts
+var scope = Post.superImportant().per(10);
+scope.all() // fire query
+  
+ +
+
+

/posts?sort=-ranking&stats[total]=count&page[size]=10&filter[ranking_gt]=8

+
+ +

Metadata

+ +

The meta information of the +JSONAPI response is available as a POJO on the response:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
let response = await Post.all()
+response.meta // { stats: { total: { count: 100 } } }
+  
+ +
await Post.all().then(function(response) {
+  response.meta // { stats: { total: { count: 100 } } }
+})
+  
+ +
+ +

Promises and Async/Await

+ +

The result of all(), first() or find is a Promise. The promise will resolve to a Response object.

+ +

A Response object has three keys - data, meta, and raw. data - the one +you’ll be using the most - will be a Model instance (or array of +Model) instances. meta will be the Meta Information returned by the API (mostly used for statistics in our case). raw is only used to introspect the raw response document.

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
Post.all().then((response) => {
+  response.data // array of Post instances
+  response.meta // js object from the server
+  response.raw // js response document
+})
+  
+ +
Post.all().then(function(response) {
+  response.data // array of Post instances
+  response.meta // js object from the server
+  response.raw // js response document
+});
+  
+ +
+
+

/posts

+
+ +

Hopefully you’re running in an environment that supports +ES7’s Async/Await. This makes things even easier:

+ +
let { data } = await Post.all()
+data // array of Post instances
+
+// alternatively
+
+let posts = (await Post.all()).data
+posts // array of Post instances
+ +
+

/posts

+
+ + +
+ +
+
+
+ + + + + + diff --git a/_site/js/reads/nested-queries.html b/_site/js/reads/nested-queries.html new file mode 100644 index 0000000..af4420c --- /dev/null +++ b/_site/js/reads/nested-queries.html @@ -0,0 +1,334 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

Nested Queries

+ +

We can nest all read operations at any level of the graph. Let’s say we wanted to +fetch all Posts and their Comments…but only return comments that +are active, sorted by created_at descending. We can create a +Comment scope as normal, then #merge() it into our Post scope:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
let commentScope = Comment
+  .where({ active: true })
+  .order({ created_at: "desc" })
+Post
+  .includes("comments")
+  .merge({ comments: commentScope })
+  .all()
+ +
var commentScope = Comment
+  .where({ active: true })
+  .order({ created_at: "desc" })
+Post
+  .includes("comments")
+  .merge({ comments: commentScope })
+  .all()
+ +
+
+

/posts?include=comments&filter[comments][active]=true&sort=-comments.active

+
+ +

Because this can get verbose, it’s often desirable to store it on +the class:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
class Comment extends ApplicationRecord {
+  // ... code ...
+  static recent() {
+    return this
+      .where({ active: true })
+      .order({ created_at: "desc" })
+  }
+}
+
+Post.merge({ comments: Comment.recent() }).all()
+ +
const Comment = ApplicationRecord.extend({
+  // ... code ...
+  static: {
+    recent: function() {
+      return this
+        .where({ active: true })
+        .order({ created_at: "desc" })
+    }
+  }
+})
+
+Post
+  .includes("comments")
+  .merge({ comments: Comment.recent() })
+  .all()
+ +
+ +

Any number of scopes can be merged in. Just remember to #include() +and #merge() relationship names as the server understands them:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
class Dog extends ApplicationRecord {
+  @BelongsTo() person: Person
+}
+
+// We've modeled this as Dog > person in javascript
+// And Person is jsonapiType "people"
+// But the server defined the relationship as "owner"
+Dog.includes("owner").merge({ owner: Person.limitedFields() })
+ +
const Dog = ApplicationRecord.extend({
+  // ... code ...
+  methods: {
+    person: belongsTo()
+  }
+})
+
+// We've modeled this as Dog > person in javascript
+// And Person is jsonapiType "people"
+// But the server defined the relationship as "owner"
+Dog.includes("owner").merge({ owner: Person.limitedFields() })
+ +
+ + +
+ +
+
+
+ + + + + + diff --git a/_site/js/reads/pagination.html b/_site/js/reads/pagination.html new file mode 100644 index 0000000..b2556fa --- /dev/null +++ b/_site/js/reads/pagination.html @@ -0,0 +1,241 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

Pagination

+ +

Use #per() to set the limit per page:

+ +
Post.per(10).all()
+ +
+

/posts?page[size]=10

+
+ +

Use #page() to set the current page:

+ +
Post.page(5).all()
+ +
+

/posts?page[number]=5

+
+ +

When chained together (10 per page, the 5th page):

+ +
Post.page(5).per(10).all()
+ +
+

/posts?page[size]=10&page[number]=5

+
+ + +
+ +
+
+
+ + + + + + diff --git a/_site/js/reads/sorting.html b/_site/js/reads/sorting.html new file mode 100644 index 0000000..de4d89a --- /dev/null +++ b/_site/js/reads/sorting.html @@ -0,0 +1,246 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

Sorting

+ +

Use #order() to sort.

+ +

If passed a string, it will default to ascending:

+ +
Post.order("title").all()
+ +
+

/posts?sort=title

+
+ +

Otherwise, pass an object:

+ +
Post.order({ title: "desc" }).all()
+ +
+

/posts?sort=-title

+
+ +

For multisort, simply chain multiple #order() clauses:

+ +
Post
+  .order({ title: "desc" })
+  .order("ranking")
+  .all()
+ +
+

/posts?sort=-title,ranking

+
+ + +
+ +
+
+
+ + + + + + diff --git a/_site/js/reads/statistics.html b/_site/js/reads/statistics.html new file mode 100644 index 0000000..cc3f5c3 --- /dev/null +++ b/_site/js/reads/statistics.html @@ -0,0 +1,270 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

Statistics

+ +

Use #stats() to request statistics. Access stats within meta:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
let { data } = await Post.stats({ total: "count" }).all()
+data.meta.stats.total.count // the total count
+ +
Post.stats({ total: "count" }).all().then(function(response) {
+  response.meta.stats.total.count // the total count
+})
+ +
+
+

/posts?stats[total]=count

+
+ +

Stats are always independent of pagination. If you request the total count, you’ll get the total count even if you’re limiting to 10 per page. This means to get only statistics - avoid returning Post instances altogether - simply request 0 results per page:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
let { data } = await Post.per(0)stats({ total: "count" }).all()
+data.meta.stats.total.count // the total count
+ +
Post
+  .per(0)
+  .stats({ total: "count" })
+  .all().then(function(response) {
+    response.meta.stats.total.count // the total count
+  })
+ +
+
+

/posts?stats[total]=count&page[size]=0

+
+ + +
+ +
+
+
+ + + + + + diff --git a/_site/js/state-syncing.html b/_site/js/state-syncing.html new file mode 100644 index 0000000..8bf5366 --- /dev/null +++ b/_site/js/state-syncing.html @@ -0,0 +1,321 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

State Syncing

+ +

You may have encountered state management libraries like Flux, +Redux or Vuex. These are fantastic libraries, but you likely won’t need them with JSORM. As a full-fledged model layer, JSORM manages state for you, automatically.

+ +

If you opt-in to this feature:

+ +
ApplicationRecord.sync = true
+ +

Instances will sync up whenever the server tells us about updated state. +Consider the scenario where an instance is initially loaded, then separately polled in the background:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
  let person = (await Person.find(1)).data
+
+  let poll = () => {
+    await Person.find(1)
+    setTimeout(poll, 1000)
+  }
+  poll()
+  
+ +
  Person.find(1).then(function(response) {
+    var person = response.data;
+  });
+
+  var poll = function() {
+    Person.find(1);
+    setTimeout(poll, 1000);
+  }
+  poll()
+  
+ +
+ +

Note that our poll() function never assigns or updates person. +But if the server returns an updated name attribute, person.name +will be automatically updated. This is true even if person.name +is bound in 17 different nested components.

+ +

Instances can still update their attributes independently - we only sync +when the server returns updated data:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
  let instanceA = (await Person.find(1)).data
+  let instanceB = (await Person.find(1)).data
+
+  instanceA.name // "Jane"
+  instanceB.name // "Jane"
+
+  instanceB.name = "Silvia"
+  instanceA.name // "Jane"
+  instanceB.name // "Silvia"
+
+  await instanceB.save()
+  instanceA.name // "Silvia"
+  instanceB.name // "Silvia"
+  
+ +
  var instanceA, instanceB;
+  Person.find(1).then(function(response) {
+    instanceA = response.data;
+  });
+  Person.find(1).then(function(response) {
+    instanceB = response.data;
+  });
+
+  instanceA.name // "Jane"
+  instanceB.name // "Jane"
+
+  instanceB.name = "Silvia"
+  instanceA.name // "Jane"
+  instanceB.name // "Silvia"
+
+  instanceB.save().then(function() {
+    instanceA.name // "Silvia"
+    instanceB.name // "Silvia"
+  });
+  
+ +
+ +

Gotchas

+ +

Under the hood, instances are listening for updates from a central data +store. This means that you’ll want to remove listeners whenever you no +longer need the instance - otherwise it will never be garbage collected +properly. To remove a listener:

+ +
instance.unlisten()
+ +

In practice, when developing in a SPA, you’ll want to #unlisten() +whenever a view is destroyed and model instances no longer need to be referenced. If +you are using VueJS, this is done automatically by adding jsorm-vue +to your application.

+
+ +
+
+
+ + + + + + diff --git a/_site/js/writes/dirty-tracking.html b/_site/js/writes/dirty-tracking.html new file mode 100644 index 0000000..25c0bbd --- /dev/null +++ b/_site/js/writes/dirty-tracking.html @@ -0,0 +1,348 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

Dirty Tracking

+ +

When an attribute has been modified, but has not yet been saved to the +server, it is considered “dirty”. Use #isDirty() to see if any attribute is dirty, use the #changes() method to see all dirty attributes.

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
  let post = await Post.first()
+  post.title // "original"
+  post.isDirty() // false
+  post.changes() // {}
+
+  post.title = "changed"
+  post.isDirty() // true
+  post.changes() // { title: ["original", "changed"] }
+
+  await post.save()
+  post.isDirty() // false
+  post.changes() // {}
+  
+ +
  Post.first().then(function(response) {
+    var post = response.data;
+
+    post.title; // "original"
+    post.isDirty(); // false
+    post.changes(); // {}
+
+    post.title = "changed";
+    post.isDirty(); // true
+    post.changes(); // { title: ["original", "changed"] }
+
+    post.save().then(function(success) { // true
+      post.isDirty(); // false
+      post.changes(); // {}
+    });
+  });
+  
+ +
+ +
+

Remember, only dirty attributes are sent to the server when #save() +is called.

+
+ +

#isDirty() can take into account relationships - just pass a +string, array, or object or relationship names. A relationship is +considered dirty if:

+ +
    +
  • Any objects in the relationship have dirty attributes
  • +
  • An object was removed from a hasMany relationship
  • +
  • An object was added to a hasMany relationship
  • +
  • Any object within the relationship was replaced with a different +object.
  • +
+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
  let post = await Post.first()
+  post.comments[0].text = "my comment"
+  post.isDirty("comments") // true
+
+  post = await Post.first()
+  post.comments.push(new Comment())
+  post.isDirty("comments") // true
+
+  post = await Post.first()
+  post.comments.splice(1, 1)
+  post.isDirty("comments") // true
+
+  post = await Post.first()
+  post.blog // an existing Blog instance
+  post.blog = (await Blog.first()).data
+  post.isDirty("blog") // true
+
+  // check nested relationships
+  post.isDirty(["blog", { comments: "author" }])
+  
+ +
  Post.first().then(function(response) {
+    var post = response.data;
+    post.comments[0].text = "my comment";
+    post.isDirty("comments"); // true
+  });
+
+  Post.first().then(function(response) {
+    var post = response.data;
+    post.comments.push(new Comment());
+    post.isDirty("comments"); // true
+  });
+
+  Post.first().then(function(response) {
+    var post = response.data;
+    post.comments.splice(1, 1);
+    post.isDirty("comments"); // true
+  });
+
+  Post.first().then(function(response) {
+    var post = response.data;
+    post.blog; // an existing Blog instance
+
+    Blog.first().then(function(blog) {
+      post.blog = (await Blog.first()).data
+      post.isDirty("blog") // true
+    });
+  });
+
+  // check nested relationships
+  post.isDirty(["blog", { comments: "author" }])
+  
+ +
+ + +
+ +
+
+
+ + + + + + diff --git a/_site/js/writes/index.html b/_site/js/writes/index.html new file mode 100644 index 0000000..0f48fe7 --- /dev/null +++ b/_site/js/writes/index.html @@ -0,0 +1,372 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

Writes

+ +

Similar to ActiveRecord, you can simply call #save() on a model +instance. JSORM will create (POST) or update (PATCH) as needed.

+ +

#save() returns a Promise that will resolve a boolean - true +when the server returns a 200-ish response code, false when the server +returns a 422 response code (see +validations). As always, anything else will +reject the promise.

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
  let blog = new Blog({ title: "My Blog" })
+  let success = await blog.save() // POST /blogs
+  console.log(success) // true/false
+
+  blog.title = "Updated Title"
+  success = await blog.save() // PUT /blogs/:id
+  console.log(success) // true/false
+  
+ +
  var blog = new Blog({ title: "My Blog" });
+  // POST /blogs
+  blog.save().then(function(success) {
+    console.log(success); // true/false
+
+    blog.title = "Updated Title":
+    // PUT /blogs/:id
+    blog.save().then(function(success) {
+      console.log(success) // true/false
+    });
+  });
+  
+ +
+ +

After saving, the instance will automatically pick up any +server-assigned attributes:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
  let post = new Post()
+  await post.save()
+  post.id // server-assigned value
+  post.createdAt // server-assigned value
+  
+ +
  var post = new Post();
+  post.save().then(function(success) {
+    post.id // server-assigned value
+    post.createdAt // server-assigned value
+  });
+  
+ +
+ +

If a Model was instantiated with data from the server, isPersisted +will return true. This means that we can assign IDs on the client +without any adverse behavior; we can also manually mark objects as +persisted for testing purposes:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
  let blog = new Blog({ id: 123 })
+  blog.isPersisted // false
+  await blog.save() // POST /blogs
+  blog.isPersisted // true
+  blog.id // 123
+
+  // Manually mark an instance as persisted
+  blog = new Blog({ id: 123 })
+  blog.isPersisted = true
+  await blog.save() // PUT /blogs/123
+  
+ +
  var blog = new Blog({ id: 123 });
+  blog.isPersisted // false
+  // POST /blogs
+  blog.save().then(function(response) {
+    blog.isPersisted // true
+    blog.id // 123
+  });
+
+  // Manually mark an instance as persisted
+  var blog = new Blog({ id: 123 });
+  blog.isPersisted = true
+  blog.save() // PUT /blogs/123
+  
+ +
+ +

Notably, only dirty (changed) attributes will be sent to the server. This prevents race conditions and unexpected side-effects. In the following example, Post has attributes title, description, and createdAt:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
  let post = (await Post.first())
+  post.title = "updated"
+  // ONLY title sent to the server
+  await post.save()
+  // Title is now synced with the server
+  post.description = "updated"
+  // ONLY description sent to the server
+  await post.save()
+  
+ +
  Post.first().then(function(response) {
+    var post = response.data;
+    post.title = "updated";
+    // ONLY title sent to the server
+    post.save().then(function(response) {
+      // Title is now synced with the server
+      post.description = "updated";
+      // ONLY description sent to the server
+      post.save();
+    });
+  });
+  
+ +
+ + +
+ +
+
+
+ + + + + + diff --git a/_site/js/writes/nested.html b/_site/js/writes/nested.html new file mode 100644 index 0000000..e6a265c --- /dev/null +++ b/_site/js/writes/nested.html @@ -0,0 +1,311 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

Nested Writes

+ +

You can write a Model and all of its relationships in a single +request. Keep in mind normal dirty tracking rules still apply - nothing +is sent to the server unless it is dirty.

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
  let author = new Author()
+  let comment = new Comment({ author })
+  let post = new Post({ comments: [comment] })
+
+  // post.save({ with: "comments" })
+  // post.save({ with: ["comments", "blog"] })
+  post.save({ with: { comments: 'author' }})
+  
+ +
  var author = new Author();
+  var comment = new Comment({ author: author });
+  var post = new Post({ comments: [comment] });
+
+  // post.save({ with: "comments" })
+  // post.save({ with: ["comments", "blog"] })
+  post.save({ with: { comments: "author" }});
+  
+ +
+ +

Use model.isMarkedForDestruction = true to delete the associated +object. Use model.isMarkedForDisassociation = true to remove the association +without deleting the underlying object:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
  let post = (await Post.includes("comments").first()).data
+  post.comments[0].isMarkedForDestruction = true
+  post.comments[1].isMarkedForDisassociation = true
+
+  // destroys the first comment
+  // disassociates the second comment
+  await post.save({ with: "comments" })
+  
+ +
  Post.includes("comments").first().then(function(response) {
+    var post = response.data;
+    post.comments[0].isMarkedForDestruction = true;
+    post.comments[1].isMarkedForDisassociation = true;
+
+    // destroys the first comment
+    // disassociates the second comment
+    post.save({ with: "comments" })
+  });
+  
+ +
+ +

You may want to send only the id of the related object to the server - ensuring the models are associated without updating attributes by +accident. Just add .id to the relationship name:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
  post.save({ with: "comments.id" })
+  
+ +
  post.save({ with: "comments.id" })
+  
+ +
+ + +
+ +
+
+
+ + + + + + diff --git a/_site/js/writes/validations.html b/_site/js/writes/validations.html new file mode 100644 index 0000000..67b887f --- /dev/null +++ b/_site/js/writes/validations.html @@ -0,0 +1,253 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ + + +
+

Validations

+ +

JSONAPI Suite is already set up to return validation errors with a +422 response code and JSONAPI-compliant errors payload. Those errors will be automatically assigned, and removed on subsequent requests:

+ +
+
+ Typescript +
+
+ Javascript +
+
+ +
+ +
  let success = await post.save()
+  console.log(success) // false
+  post.errors.title // { message: "Can't be blank", ... }
+  post.title = "no longer blank"
+  success = await post.save()
+  console.log(success) // true
+  post.errors // {}
+  
+ +
  post.save().then(function(success) {
+    console.log(success) // false
+    post.errors.title // { message: "Can't be blank", ... }
+    post.title = "no longer blank"
+    post.save().then(function(success) {
+      console.log(success); // true
+      post.errors // {}
+    });
+  })
+  
+ +
+ + +
+ +
+
+
+ + + + + + diff --git a/_site/pkg/jsonapi_suite-0.7.0.gem b/_site/pkg/jsonapi_suite-0.7.0.gem new file mode 100644 index 0000000..cb54069 Binary files /dev/null and b/_site/pkg/jsonapi_suite-0.7.0.gem differ diff --git a/_site/quickstart.html b/_site/quickstart.html new file mode 100644 index 0000000..5d47bb7 --- /dev/null +++ b/_site/quickstart.html @@ -0,0 +1,799 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

Quickstart

+ +
Zero to API in 5 minutes
+ +

This quickstart will use Rails with ActiveRecord. Head to the guides +section for usage with alternate ORMs or avoiding Rails +completely.

+ +

If the below seems too “magical”, don’t worry - we’re just applying some +sensible defaults to get started quickly.

+ +

Installation

+ +

Let’s start with a classic Rails blog. We’ll use a template to handle some of the boilerplate. Just run this command and accept all the defaults for now:

+ +
$ rails new blog --api -m https://raw.githubusercontent.com/jsonapi-suite/rails_template/master/all.rb
+ +

Feel free to run git diff if you’re interested in the +particulars; this is mostly just installing gems and including modules.

+ +
+

Note: if a network issue prevents you from pointing to this URL +directly, you can download the file and and run this command as -m +/path/to/all.rb

+
+ +

Defining a Resource

+ +

A Resource defines how to query and persist your Model. In other +words: a Model is to the database as Resource is to the API. So +first, let’s define our model:

+ +
$ bundle exec rails generate model Post title:string active:boolean
+$ bundle exec rake db:migrate
+ +

Now we can use the built-in generator to define our Resource, +controller, and specs:

+ +
$ bundle exec rails g jsonapi:resource Post title:string active:boolean
+ +

You’ll see a number of files created. If you open each one, you’ll see +comments explaining what’s going on. Head over to the +tutorial for a more in-depth understanding. For now, let’s +focus on two key concepts you’ll see over and over again: inputs (via +strong_resources), +and outputs (via jsonapi-rb).

+ +

Our API Inputs are defined in +config/initializers/strong_resources.rb. You can think of these as +strong parameter templates.

+ +
# config/initializers/strong_resources.rb
+strong_resource :post do
+  attribute :title, :string
+  attribute :active, :boolean
+end
+ +

Our API Outputs are defined in +app/serializers/serializable_post.rb. The DSL is very similar to +active_model_serializers and full documentation can be found at jsonapi-rb.org:

+ +
# app/serializers/serializable_post.rb
+class SerializablePost < JSONAPI::Serializable::Resource
+  type :posts
+
+  attribute :title
+  attribute :active
+end
+ +

Now run your app!:

+ +
$ bundle exec rails s
+ +

Verify http://localhost:3000/api/v1/posts renders JSON correctly. +Now we just need data.

+ +

Seeding Data

+ +

We can seed data in two ways: the usual db/seeds.rb, or using an HTTP +client. Using the client helps get your feet wet with client-side +development, or you can avoid the detour and plow right ahead.

+ +

Seeding With Ruby

+ +

Edit db/seeds.rb to create a few Posts:

+ +
Post.create!(title: 'My title!', active: true)
+Post.create!(title: 'Another title!', active: false)
+Post.create!(title: 'OMG! A title!', active: true)
+ +

And run the script:

+ +
$ bundle exec rake db:seed
+ +

Seeding With JS Client

+ +

There are a variety of JSONAPI Clients +out there. We’ll be using JSORM +which is built to work with Suite-specific functionality like nested +payloads. It can be used from the browser, but for now we’ll call +it using a simple Node script.

+ +

Create the project:

+ +
$ mkdir node-seed && cd node-seed && touch index.js && npm init
+ +

Accept the default for all prompts. Now add the JSORM dependency, as +well as a polyfill for fetch:

+ +
$ npm install --save jsorm isomorphic-fetch
+ +

Add this seed code to index.js:

+ +
require("isomorphic-fetch");
+var jsorm = require("jsorm/dist/jsorm");
+
+// setup code
+
+var ApplicationRecord = jsorm.JSORMBase.extend({
+  static: {
+    baseUrl: "http://localhost:3000",
+    apiNamespace: "/api/v1"
+  }
+});
+
+var Post = ApplicationRecord.extend({
+  static: {
+    jsonapiType: "posts"
+  },
+
+  attrs: {
+    title: jsorm.attr(),
+    active: jsorm.attr()
+  }
+});
+
+// seed code
+
+var post1 = new Post({
+  title: "My title!",
+  active: true
+});
+
+var post2 = new Post({
+  title: "Another title!",
+  active: false
+});
+
+var post3 = new Post({
+  title: "OMG! A title!",
+  active: true
+});
+
+// Save sequentially only due to local development env
+post1.save().then(() => {
+  post2.save().then(() => {
+    post3.save();
+  });
+});
+ +

This should be pretty straightforward if you’re familiar with +ActiveRecord. We define Model objects, putting configuration on +class attributes. We instatiating instances of those Models, and call +save() to persist. For more information, see the JSORM Documentation.

+ +

Run the script:

+ +
$ node index.js
+ +

Now load http://localhost:3000/api/v1/posts. You should have 3 Posts in +your database!

+ +

3_posts

+ +

Querying

+ +

Now that we’ve defined our Resource and seeded some data, let’s see +what query functionality we have. We’ve listed all Posts at +http://localhost:3000/api/v1/posts. Let’s see what we can do:

+ +
    +
  • Sort +
      +
    • By title, ascending: +
        +
      • URL: /api/v1/posts?sort=title
      • +
      • SQL: SELECT * FROM posts ORDER BY title ASC
      • +
      +
    • +
    • By title, descending: +
        +
      • URL: /api/v1/posts?sort=-title
      • +
      • SQL: SELECT * FROM posts ORDER BY title DESC
      • +
      +
    • +
    +
  • +
  • Paginate: +
      +
    • 2 Per page: +
        +
      • URL: /api/v1/posts?page[size]=2
      • +
      • SQL: SELECT * FROM posts LIMIT 2
      • +
      +
    • +
    • 2 Per page, second page: +
        +
      • URL: /api/v1/posts?page[size]=2&page[number]=2
      • +
      • SQL: SELECT * FROM posts LIMIT 2 OFFSET 2
      • +
      +
    • +
    +
  • +
  • Sparse Fieldsets: +
      +
    • Only render title, not active: +
        +
      • URL: /api/v1/posts?fields[posts]=title
      • +
      • SQL: SELECT * from posts (optimizing this query is on the roadmap)
      • +
      +
    • +
    +
  • +
  • Filter: +
      +
    • Add one line of code:
    • +
    +
  • +
+ +
# app/resources/post_resource.rb
+allow_filter :title
+ +
    +
  • URL: /api/v1/posts?filter[title]=My title!
  • +
  • SQL: SELECT * FROM posts WHERE title = "My title!"
  • +
  • Any filter not whitelisted will raise JsonapiCompliable::BadFilter + error.
  • +
  • All filter logic can be customized:
  • +
+ +
# SELECT * from posts WHERE title LIKE 'My%'
+allow_filter :title_prefix do |scope, value|
+  scope.where(["title LIKE ?", "#{value}%"])
+end
+ +
    +
  • +

    Customizations can be DRYed up and packaged into Adapters.

    +
  • +
  • +

    Extra Fields:

    +
      +
    • Sometimes you want to request additional fields not part of a normal +response (perhaps they are computationally expensive).
    • +
    • This can be done like so:
    • +
    +
  • +
+ +
# app/serializers/serializable_post.rb
+extra_attribute :description do
+  @object.active? ? 'Active Post' : 'Inactive Post'
+end
+ +
    +
  • URL: /api/v1/posts?extra_fields[posts]=description
  • +
  • SQL: SELECT * FROM posts
  • +
  • +

    You can conditionally eager load data or further customize this + logic. See the tutorial for more.

    +
  • +
  • Statistics: +
      +
    • Useful for search grids - “Find me the first 10 active posts, and +the total count of all posts”.
    • +
    • One line of code to whitelist the stat:
    • +
    +
  • +
+ +
# app/resources/post_resource.rb
+allow_stat total: [:count]
+ +
    +
  • URL: /api/v1/posts?stats[total]=count
  • +
  • SQL: SELECT count(*) from posts
  • +
  • Combine with filters and the count will adjust accordingly.
  • +
  • There are a number of built-in stats, you can also add your own.
  • +
  • +

    This is rendered in the meta section of the response:

    + +

    meta_total_count

    +
  • +
  • Error Handling: +
      +
    • Your app will always render a JSONAPI-compliable error response.
    • +
    • Cause an error:
    • +
    +
  • +
+ +
# app/controllers/posts_controller.rb
+def index
+  raise 'foo'
+end
+ +
    +
  • +

    View the default payload:

    + +

    error_payload

    +
  • +
  • +

    Different errors can be customized with different response codes, + JSON, and side-effects. View jsonapi_errorable for more.

    +
  • +
+ +

Adding Relationships

+ +

JSONAPI Suite supports full querying of relationships (“fetch me this +Post and 3 active Comments sorted by creation date”), as well as +persistence (“save this Post and 3 Comments in a single request”).

+ +

Adding Relationships

+ +

Let’s start by defining our model:

+ +
$ bundle exec rails g model Comment post_id:integer body:text active:boolean
+$ bundle exec rake db:migrate
+ +
# app/models/post.rb
+has_many :comments
+
+# app/models/comment.rb
+belongs_to :post, optional: true
+ +

…and corresponding Resource object:

+ +
$ bundle exec rails g jsonapi:resource Comment body:text active:boolean
+ +

Configure the relationship in PostResource:

+ +
has_many :comments,
+  foreign_key: :post_id,
+  resource: CommentResource,
+  scope: -> { Comment.all }
+ +

This code:

+ +
    +
  • Whitelists the relationship.
  • +
  • Knows to link the objects via post_id.
  • +
  • Will use CommentResource for querying logic (so we can say things +like “only return the latest 3 active comments”)
  • +
  • Uses an unfiltered base scope (Comment.all). If we wanted, we could +do things like Comment.active here to ensure only active comments are +ever returned.
  • +
+ +

You should now be able to hit /api/v1/comments with all the same +functionality as before. We just need to seed data.

+ +

Start by clearing out your database:

+ +
$ bundle exec rake db:migrate:reset
+ +

Again, you can seed your data using a NodeJS client or the traditional +db/seeds.rb.

+ +

Seeding with NodeJS

+ +

Let’s edit our node-seed/index.js. First add a Comment model:

+ +
var Comment = ApplicationRecord.extend({
+  static: {
+    jsonapiType: 'comments'
+  },
+
+  attrs: {
+    body: jsorm.attr(),
+    active: jsorm.attr(),
+    createdAt: jsorm.attr()
+  }
+});
+ +

…and add the relationship to Post:

+ +
// within attrs
+// ... code ...
+comments: jsorm.hasMany()
+// ... code...
+ +

Replace the existing Post instances with one Post and three +Comments:

+ +
var comment1 = new Comment({
+  body: "comment one",
+  active: true
+});
+
+var comment2 = new Comment({
+  body: "comment two",
+  active: false
+});
+
+var comment3 = new Comment({
+  body: "comment three",
+  active: true
+});
+
+var post = new Post({
+  title: "My title!",
+  active: true,
+  comments: [comment1, comment2, comment3]
+});
+
+post.save({ with: ["comments"] });
+ +

Tell our controller it’s OK to sidepost comments:

+ +
# app/controllers/posts_controller.rb
+strong_resource :post do
+  has_many :comments
+end
+ +

And tell our serializer it’s OK to render comments:

+ +
# app/serializers/serializable_post.rb
+has_many :comments
+ +

Now run the script to persist the Post and its three Comments in a +single request:

+ +
$ node node-seed/index.js
+ +

Seeding with Ruby

+ +

Replace your db/seeds.rb with this code to persist one Post and +three Comments:

+ +
comment1 = Comment.new(body: 'comment one', active: true)
+comment2 = Comment.new(body: 'comment two', active: false)
+comment3 = Comment.new(body: 'comment three', active: true)
+
+Post.create! \
+  title: 'My title!',
+  active: true,
+  comments: [comment1, comment2, comment3]
+ +

Usage

+ +

Now let’s fetch a Post and filtered Comments in a single request: /api/v1/posts?include=comments.

+ +

Any logic in CommentResource is available to us. Let’s sort the +comments by created_at descending: /api/v1/posts?include=comments&sort=-comments.created_at. This should work out-of-the-box.

+ +

Now add a filter to CommentResource:

+ +
allow_filter :active
+ +

That filter now works in two places:

+ +
    +
  • /api/v1/comments?filter[active]=true
  • +
  • /api/v1/posts?include=comments&filter[comments][active]=true
  • +
+ +

This is why Resource objects exist: they provide an interface to +functionality shared across many different endpoints, with no extra +code.

+ +

What’s Next

+ +

We have a full CRUD API with robust querying functionality, and the +ability to combine relationships for both reads and writes. But what +happens when you need to customize the sorting logic? What about replacing +ActiveRecord with an alternate persistence layer, or avoiding Rails +altogether?

+ +

These are important topics that JSONAPI Suite was built to address. To +learn more about advanced usage and customization, we suggest following +the tutorial. There are also a number of how-tos on this +site, a good one to start with is How +to Use without ActiveRecord

+ +

For additional documentation, view the YARD Docs.

+ +

For help with specific use cases, join our Slack chat!

+ +

Bonus: Testing

+ +

Installation

+ +

Our generator applied some sensible defaults:

+ +
    +
  • Rspec Test runner
  • +
  • jsonapi_spec_helpers Helpers to parse and assert on JSONAPI payloads.
  • +
  • factory_girl for + seeding our test database with fake data.
  • +
  • faker for generating fake values, + such as e-mail addresses, names, avatar URLs, etc.
  • +
  • database_cleaner + to ensure our fake data gets cleaned up between test runs.
  • +
+ +

By default we rescue exceptions and return a valid error response. +In tests, this can be confusing - we probably want to raise errors in +tests. So note our exception handling is disabled by default:

+ +
# spec/rails_helper.rb
+config.before :each do
+  JsonapiErrorable.disable!
+end
+ +

But you can enable it on a per-test basis:

+ +
it "renders validation errors" do
+  JsonapiErrorable.enable!
+  post "/api/v1/employees", payload
+  expect(validation_errors[:name]).to eq("can't be blank")
+end
+ +

In following this guide, we generated Post and +Comment resources. Let’s edit our factories to seed randomized data:

+ +
# spec/factories/post.rb
+FactoryGirl.define do
+  factory :post do
+    title { Faker::Lorem.sentence }
+    active { [true, false].sample }
+  end
+end
+
+# spec/factories/comment.rb
+FactoryGirl.define do
+  factory :comment do
+    body { Faker::Lorem.paragraph }
+    active { [true, false].sample }
+  end
+end
+ +

Finally, we need to define a Payload. Payloads use a +factory_girl-style DSL to define expected JSON. A Payload compares a +Model instance and JSON output, ensuring:

+ +
    +
  • No unexpected keys
  • +
  • No missing keys
  • +
  • No unexpected value types
  • +
  • No null values (this is overrideable)
  • +
  • Model attribute matches JSON attribute
  • +
  • This can all be customized. See jsonapi_spec_helpers for more.
  • +
+ +

Let’s define our payloads now:

+ +
# spec/payloads/post.rb
+JsonapiSpecHelpers::Payload.register(:post) do
+  key(:title, String)
+  key(:active, [TrueClass, FalseClass])
+end
+
+# spec/payloads/comment.rb
+JsonapiSpecHelpers::Payload.register(:comment) do
+  key(:body, String)
+  key(:active, [TrueClass, FalseClass])
+  key(:created_at, Time)
+end
+ +

Run

+ +

We can now run specs. Let’s start with the Post specs:

+ +
$ bundle exec rspec spec/api/v1/posts
+ +

You should see five specs, with one failing (spec/api/v1/posts/create_spec.rb), +and one pending (spec/api/v1/posts/update_spec.rb).

+ +

The reason for the failure is simple: our payload defined in +spec/payloads/post.rb specifies that a Post JSON should include the +key title. However, that spec is currently creating a Post with no +attributes…which means in the response JSON, title is null. null +values will fail assert_payload unless elsewise configured.

+ +

So, let’s update our spec to POST attributes, not just an empty object:

+ +
let(:payload) do
+  {
+    data: {
+      type: 'posts',
+      attributes: {
+        title: 'My title!',
+        active: true
+      }
+    }
+  }
+end
+ +

Your specs should now pass. The only pending spec is due to a similar +issue - we need to specify attributes in spec/api/v1/posts/update_spec.rb as +well. Follow the comments in that file to apply a similar change.

+ +

You should now have 5 passing request specs! These specs spin up a fake +server, then execute full-stack requests that hit the database and +return JSON. You’re asserting that JSON matches predefined payloads, +without nulls or unknown key/values.

+ +

Go ahead and make the same changes to Comment specs to get 10 passing +request specs.

+ +

It’s up to you how far you’d like to go with testing. Should you add a +new spec to spec/api/v1/posts/index_spec.rb every time you add a +filter with allow_filter? This boils down to personal preference and +tolerance of failures. Try adding a few specs following the generated +patterns to get a feel for what’s right for you.

+ +

Bonus: Documentation

+ +

We can autodocument our code using swagger documentation. Documenting an endpoint is one line of code:

+ +
jsonapi_resource '/v1/employees'
+ +

Visit http://localhost:3000/api/docs to see the swagger documentation. Our custom UI will show all possible query parameters (including nested +relationships), as well as schemas for request/responses:

+ +

+ +

Our generator set up some boilerplate to enable this functionality, you +can learn more at: How +to Autodocument with Swagger

+ +


+
+

+ +
+
+
+ + + + + + diff --git a/_site/ruby-toc.html b/_site/ruby-toc.html new file mode 100644 index 0000000..2243bc6 --- /dev/null +++ b/_site/ruby-toc.html @@ -0,0 +1,254 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Filtering

+ +

asdf

+ + + +
+ +
+
+
+ + + + + + diff --git a/_site/ruby/alternate-datastores/adapters.html b/_site/ruby/alternate-datastores/adapters.html new file mode 100644 index 0000000..0012b11 --- /dev/null +++ b/_site/ruby/alternate-datastores/adapters.html @@ -0,0 +1,322 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Adapters

+ +
+

Read First: Resources Overview

+
+ +
+

View the Sample App

+
+ +
+

View the YARD Documentation

+
+ +

If you find yourself repeatedly making customizations to a group of +Resources and seek DRYer code, package those customizations into an +Adapter. Here we’ll be starting from a previous example, +ElasticSearch.

+ +

Adapters are simpler than you might think. It’s little more than +copy-pasting those low-level customizations into a common class.

+ +

Start by creating lib/elasticsearch_adapter.rb. Cut/past the sorting, +pagination, and #resolve overrides from EmployeeResource into the adapter, +turning into def methods along the way:

+ +
# lib/elasticsearch_adapter.rb
+class ElasticsearchAdapter
+  def paginate(scope, current_page, per_page)
+    scope.metadata.pagination.current_page = current_page
+    scope.metadata.pagination.per_page = per_page
+    scope
+  end
+
+  def order(scope, att, dir)
+    scope.metadata.sort = [{att: att, dir: dir}]
+    scope
+  end
+
+  def resolve(scope)
+    scope.query!
+    scope.results
+  end
+end
+ +

Ensure our adapter gets loaded:

+ +
# config/initializers/jsonapi.rb
+require 'elasticsearch_adapter'
+ +

And switch to that adapter in EmployeeResource:

+ +
use_adapter ElasticsearchAdapter
+ +

Bounce your server. You can still hit the /api/v1/employees endpoint +with the same sort and paginate functionality, but the code has been +moved to an adapter.

+ +

Let’s ensure our users can filter as well:

+ +
def filter(scope, att, val)
+  scope.condition(att).eq(val)
+end
+ +

For all the methods and functionality an adapter supports, see the +Adapter documenation.

+ +

Association Macros

+ +
+

Read First: Nested Queries

+
+ +

We probably also want has_many-style macros to avoid writing similar +allow_sideload code time after time. Start by specifying where this +functionality is defined, and add a has_many macro:

+ +
module Sideloading
+  def has_many(association_name,
+               scope:,
+               resource:,
+               foreign_key:,
+               primary_key: :id,
+               &blk)
+    # our code will go here
+    instance_eval(&blk) if blk
+  end
+end
+
+def sideloading_module
+  Sideloading
+end
+ +

The instance_eval is there so we can always drop down to a lower-level +customization in our Resource.

+ +

We can basically cut/paste our existing sideload code and rewrite it as +variables:

+ +
scope do |parents|
+  parent_ids = parents.map { |p| p.send(primary_key) }
+  scope.call.condition(foreign_key).or(parent_ids.uniq.compact)
+end
+
+assign do |parents, children|
+  parents.each do |p|
+    relevant_children = children.select do |c|
+      c.send(foreign_key) == p.send(primary_key)
+    end
+    p.send(:"#{association_name}=", relevant_children)
+  end
+end
+ +

You can now remove any customizations from your Resource classes. You +can continue to build the adapter, adding belongs_to, statistics, and +more. View the adapter documentation for the full API.

+
+ +
+
+
+ + + + + + diff --git a/_site/ruby/alternate-datastores/elasticsearch.html b/_site/ruby/alternate-datastores/elasticsearch.html new file mode 100644 index 0000000..08379fa --- /dev/null +++ b/_site/ruby/alternate-datastores/elasticsearch.html @@ -0,0 +1,396 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Usage Without ActiveRecord: ElasticSearch

+ +
+

Read First: Resources Overview

+
+ +
+

View the Sample App

+
+ +
+

View the YARD Documentation

+
+ +

Though we’ll be hitting elasticsearch in this +example, remember that this is just an HTTP API underneath the hood. The +same pattern applies to a variety of use cases.

+ +

First we need a Client for elasticsearch. Though you can feel free +to use a variety of clients, this example will use trample.

+ +

Also keep in mind, we’ll be showing a one-off customization here. You +probably want to extract this code into an +Adapter if this is going to +become a core component of your application.

+ +

Pre-JSONAPI Setup

+ +

Start by installing trample:

+ +
# Gemfile
+gem 'trample_search', require: 'trample'
+ +

Tell searchkick that we want to +index Employees and Positions:

+ +
# app/models/employee.rb
+searchkick text_start: [:first_name]
+
+# app/models/position.rb
+searchkick text_start: [:title]
+ +

Define our search classes. These tell trample the configuration of the +search:

+ +
# app/models/employee_search.rb
+class EmployeeSearch < Trample::Search
+  model Employee
+
+  condition :first_name, single: true
+  condition :last_name, single: true
+end
+
+# app/models/position_search.rb
+class PositionSearch < Trample::Search
+  model Position
+
+  condition :title, single: true
+  condition :employee_id
+end
+ +

Finally, seed some data:

+ +
# db/seeds.rb
+[Employee, Position].each(&:delete_all)
+bart = Employee.create!(first_name: 'Bart', last_name: 'Simpson')
+homer = Employee.create!(first_name: 'Homer', last_name: 'Simpson')
+monty = Employee.create!(first_name: 'Monty', last_name: 'Burns')
+
+bart.positions.create!(title: 'Junior Engineer')
+homer.positions.create!(title: 'Senior Engineer')
+monty.positions.create!(title: 'Manager')
+ +

JSONAPI Integration

+ +

In our controller, we need to pass a base scope. In ActiveRecord examples, we’d pass an ActiveRecord::Relation (e.g. Post.all). Let’s pass an instance +of Trample::Search instead.

+ +
# app/controllers/employees_controller.rb
+def index
+  render_jsonapi(EmployeeSearch.new)
+end
+ +
# app/serializers/serializable_employee.rb
+class SerializableEmployee < JSONAPI::Serializable::Resource
+  type :employees
+
+  attribute :first_name
+  attribute :last_name
+  attribute :created_at
+  attribute :updated_at
+
+  has_many :positions
+end
+ +

Since we are now passing a non-default base scope, we need to tell our +Resource how to query and resolve this new scope. Start by switching to +the pass-through adapter, and resolve using trample’s query API:

+ +
# app/resources/employee_resource.rb
+use_adapter JsonapiCompliable::Adapters::Null
+# ... code ...
+def resolve(scope)
+  scope.query!
+  scope.records.compact
+end
+
+# no belongs_to for now
+ +

You can now hit http://localhost:3000/api/v1/employees - the exact +same payload is coming back, but is now sourced from elasticsearch!

+ +

Let’s add a prefix filter:

+ +
# app/resources/employee_resource.rb
+allow_filter :first_name_prefix do |scope, value|
+  scope.condition(:first_name).starts_with(value)
+end
+ +

Hit http://localhost:3000/api/v1/employees?filter[first_name]=hom. +You’re now successfully querying the elasticsearch index.

+ +

If we want sorting and pagination, we need to tell the Resource + how to deal with that, too:

+ +
# app/resources/employee_resource.rb
+paginate do |scope, current_page, per_page|
+  scope.metadata.pagination.current_page = current_page
+  scope.metadata.pagination.per_page = per_page
+  scope
+end
+
+sort do |scope, att, dir|
+  scope.metadata.sort = [{att: att, dir: dir}]
+  scope
+end
+ +

View the Resource and Adapter documentation for additional overrides, like statistics.

+ +

The last step is adding the positions association. If we want +has_many-style macros we need to create an +Adapter, but for now +let’s simply use the lower-level allow_sideload DSL. We need to define +two functions: how to build a scope for the association, and how to +associate the resulting objects:

+ +
# app/resources/employee_resource.rb
+allow_sideload :positions, resource: PositionResource do
+  scope do |employees|
+    scope = PositionSearch.new
+    scope.condition(:employee_id).or(employees.map(&:id))
+  end
+
+  assign do |employees, positions|
+    employees.each do |e|
+      e.positions = positions.select { |p| p.employee_id = e.id }
+    end
+  end
+end
+ +

Convert the PositionResource to use elasticsearch, just like we did +for Employee:

+ +
# app/resources/position_resource.rb
+use_adapter JsonapiCompliable::Adapters::Null
+
+def resolve(scope)
+  scope.query!
+  scope.results
+end
+ +

Create the SerializablePosition class:

+ +
class SerializablePosition < JSONAPI::Serializable::Resource
+  type :positions
+
+  attribute :title
+end
+ +

We can now sideload positions - check out the results at +http://localhost:3000/api/v1/employees?include=positions. We’re +fetching employees and their corresponding positions in a single +request, via elasticsearch. Any filters/changes/default sort/etc that +apply to PositionResource can be re-used at this endpoint.

+ +

If this was a one-off section of our application, we can call this good +enough and move on. But as we continue to use this pattern, it’s going +to get monotonous writing the same filter overrides, allow_sideload +wiring code, etc. To DRY up this code, we can package our changes into +an Adapter.

+
+ +
+
+
+ + + + + + diff --git a/_site/ruby/alternate-datastores/http.html b/_site/ruby/alternate-datastores/http.html new file mode 100644 index 0000000..49e20e4 --- /dev/null +++ b/_site/ruby/alternate-datastores/http.html @@ -0,0 +1,292 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Usage Without ActiveRecord: HTTP Services

+ +
+

Read First: Resources Overview

+
+ +
+

View the YARD Documentation

+
+ +

This is a commonly requested example. Instead of using a full-fledged +client like ActiveRecord or Trample, we’ll show low-level usage that +could apply to a variety of HTTP clients.

+ +

Remember, we always start with a “base scope” and modify that scope +depending on incoming request parameters. This same pattern could apply +to simply ruby hashes.

+ +
def index
+  render_jsonapi({})
+end
+ +

Let’s start by specifying a Null adapter - a pass-through adapter that +won’t do anything without us explicitly overriding:

+ +
# config/initializers/jsonapi.rb
+require 'jsonapi_compliable/adapters/null'
+ +
# app/resources/post_resource.rb
+use_adapter JsonapiCompliable::Adapters::Null
+ +

Every time we get a request to sort, paginate, etc we’ll need to modify +our hash. Here we’ll simply merge parameters in the format our HTTP +client will accept:

+ +
# app/resources/post_resource.rb
+allow_filter :title do |scope, value|
+  scope.merge!(conditions: { title: value })
+end
+
+sort do |scope, attribute, direction|
+  scope.merge!(order: { attribute => direction })
+end
+
+paginate do |scope, current_page, per_page|
+  offset = (current_page * per_page) - per_page
+  scope.merge!(limit: per_page, offset: offset)
+end
+ +

Finally, we need to tell the resorce how to resolve the query. In our +case, this means passing the built-up parameters into a method on our +HTTP client.

+ +
# app/resources/post_resource.rb
+
+# Remember, 'scope' here is a hash
+def resolve(scope)
+  results = MyHTTPClient.get(scope)
+  results.map { |r| Post.new(r) }
+end
+ +

Note that #resolve must return an array of Model instances. These +can be simple POROs, as you see above.

+ +

The final request would look something like this:

+ +
HTTPClient.get \
+  conditions: { title: "Hello World!" },
+  order: { created_at: :desc },
+  limit: 10,
+  offset: 20
+ +

In our controller, if we used the lower-level jsonapi_scope method to introspect our results, we’d see an array of Post instances:

+ +
# app/controllers/posts_controller.rb
+def index
+  scope = jsonapi_scope({})
+  posts = scope.resolve
+  puts posts # [#<Post:0x001>, #<Post:0x002>, ...]
+  render_jsonapi(posts, scope: false)
+end
+ +

If we found ourselves typing similar Resource code - always merging in +the same paramters to the hash - we’d probably want to package all this +up into an +Adapter.

+
+ +
+
+
+ + + + + + diff --git a/_site/ruby/alternate-datastores/index.html b/_site/ruby/alternate-datastores/index.html new file mode 100644 index 0000000..6f31cd1 --- /dev/null +++ b/_site/ruby/alternate-datastores/index.html @@ -0,0 +1,238 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Alternate Datastores

+ +

It’s important to note that ActiveRecord is nothing but a sensible +default. Because you have full control over the +query JSONAPI Suite can be +used with any datastore, from MongoDB to HTTP service calls.

+ +

In this section, we’ll show examples customizing resource logic, then +packaging that logic into reusable Adapters.

+ +
+

Keep in mind, multiple datastores can be blended in a single request. +We can load Posts from a SQL database, and “sideload” Comments +from MongoDB seamlessly.

+
+ + +
+ +
+
+
+ + + + + + diff --git a/_site/ruby/backwards-compatibility.html b/_site/ruby/backwards-compatibility.html new file mode 100644 index 0000000..fa60c6b --- /dev/null +++ b/_site/ruby/backwards-compatibility.html @@ -0,0 +1,239 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Backwards Compatibility

+ +

Before we deploy our code to production, we want to ensure we +aren’t introducing any backwards incompatibilities that will break +existing clients. Of course, tests are our first line of defense here. +But a developer could always simply update the test and introduce a +backwards-incompatibility. This is why JSONAPI Suite comes with an +additional backwards-compatibility check you can run in your Continuous +Integration pipeline.

+ +

In the course of writing our application, we autodocumented +with Swagger. That means our +swagger.json is effectively a schema - a definition of +attributes, types, query parameters and payloads. We can compare the +swagger.json of a given commit to what’s running in production to +see if any backwards-incompatibilities were introduced.

+ +

If you used our generator to set up your application, you’ll have noticed this line added to Rakefile:

+ +
require 'jsonapi_swagger_helpers'
+ +

This allows us to run the rake task

+ +
rake swagger_diff['my_api','http://example.com']
+ +

This task will:

+ +
    +
  • Pull down the schema from http://example.com/my_api/swagger.json.
  • +
  • Compare it to the swagger.json generated locally.
  • +
+ +

This uses swagger-diff underneath the hood. You’ll get helpful output noting any missing filters, incorrect types, or other backwards incompatibilities.

+
+ +
+
+
+ + + + + + diff --git a/_site/ruby/error-handling.html b/_site/ruby/error-handling.html new file mode 100644 index 0000000..920b0eb --- /dev/null +++ b/_site/ruby/error-handling.html @@ -0,0 +1,237 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Error Handling

+ +
+

View the jsonapi_errorable documentation

+
+ +

We want to follow the common best-practice of raising a specific error class:

+ +
raise Errors::NotAuthorized
+ +

The problem is, this error would cause our server to return a 500 +status code, without much helpful detail. Instead, we want to +customize our responses based on the error thrown.

+ +

Enter jsonapi_errorable, which provides a simple DSL to do just that:

+ +
# app/controllers/application_controller.rb
+register_exception Errors::NotAuthorized, status: 403
+ +

Here we’ve customized the error response to send the HTTP status code 403 (forbidden) whenever this particular exception class is raised.

+ +

Maybe our error class already has a message we want to display to the +user:

+ +
register_exception Errors::NotAuthorized,
+  status: 403,
+  title: "Not Authorized",
+  message: true,
+ +

For full documentation on everything you can do here, head over to +the jsonapi_errorable documentation.

+
+ +
+
+
+ + + + + + diff --git a/_site/ruby/index.html b/_site/ruby/index.html new file mode 100644 index 0000000..27e363f --- /dev/null +++ b/_site/ruby/index.html @@ -0,0 +1,220 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Server-Side

+ +

JSONAPI Suite is a collection of ruby libraries that facilitate adhering +to the jsonapi.org specification. At its heart is +a query builder that supports fully nested reads and writes, adaptable +to any datastore, from ActiveRecord to MongoDB to raw HTTP service calls. We’ll autodocument those endpoints for you with Swagger, provide an error handling pattern, and test everything will full-stack integration request specs.

+ +

If you just want to get rolling quickly, check out the +Quickstart. For step-by-step examples, +check out the Tutorial. Or, for +client-side usage, check out JSORM.

+ +

For any questions not addressed here, feel free to ask in our Slack +Chat.

+
+ +
+
+
+ + + + + + diff --git a/_site/ruby/installation.html b/_site/ruby/installation.html new file mode 100644 index 0000000..aafd938 --- /dev/null +++ b/_site/ruby/installation.html @@ -0,0 +1,309 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Installation

+ +

JSONAPI Suite comes with a Rails Application Template to get you up and running quickly. To apply a template, you can pass either a URL or path to a file.

+ +

To generate a new application with the template:

+ +
$ rails new myapp --api -m https://raw.githubusercontent.com/jsonapi-suite/rails_template/master/all.rb
+ +

If needed, this command can be run by downloading all.rb and +pointing to it on your filesystem:

+ +
$ rails new myapp --api -m /path/to/all.rb
+ +

Run git status to see what the generator did.

+ +

Breaking down the generator

+ +

The generator mostly installs gems and types some boilerplate for you. +But it can be helpful to understand everything that’s going on and +customize to your needs (these are all customizable defaults). +Here’s a line-by-line breakdown to explain what’s going on. Use git +status to follow along.

+ +
    +
  • app/controllers/application_controller.rb +
      +
    • Mixes in JsonapiSuite::ControllerMixin. This includes relevant +modules that decorate our controllers with methods like +render_jsonapi.
    • +
    • Sets up global error handling, ensuring that we always render a +JSONAPI-compliant errors payload. +Errors are handled through a DSL provided by jsonapi_errorable - throw an error and use the DSL to customize response codes, messages, etc. In this code we’ll follow a common Rails pattern and respond with 404 from show endpoints when a record is not found in the datastore.
    • +
    +
  • +
  • config/routes.rb +
      +
    • Configures routing so all our endpoints will be under /<api_namespace>/v1. The <api_namespace> is so you can point something like HAProxy to various microservices based on the path. The v1 sets up a simple versioning pattern.
    • +
    • Adds a docs resource. This for automatic Swagger documentation. Swagger requires a schema - swagger.json - that is generated from our DocsController. For more on this, see the Autodocumentation section.
    • +
    +
  • +
  • spec/rails_helper.rb +
      +
    • Adds jsonapi_spec_helpers. This gives us helper methods like json_item and assert_payload that lower the overhead of dealing with verbose JSONAPI responses. See more in the Testing section.
    • +
    • JsonapiErrorable.disable! disables global error handling before +each test. This is because we usually don’t want errors to be +swallowed during tests. You can always turn it back on in a per-test +basis with JsonapiErrorable.enable!
    • +
    • Adds database_cleaner to ensure a clean database between tests.
    • +
    • Mixes in factory_bot methods. This gives us syntactic sugar of saying create(:person) instead of FactoryBot.create(:person). See more in the Testing section.
    • +
    • Removes some fixture-specific configuration that is now handled by +database_cleaner.
    • +
    +
  • +
  • app/controllers/docs_controller/rb + +
  • +
  • public/api + +
  • +
  • config/initializers/jsonapi.rb +
      +
    • Requires the ActiveRecord adapter, which comes with the Suite. Comment this line if you’d like +to avoid ActiveRecord. Learn more in the Adapters section.
    • +
    +
  • +
  • config/initializers/strong_resources.rb +
      +
    • Stores templates that whitelist API inputs. Learn more in the +Strong Resources section.
    • +
    +
  • +
  • Rakefile + +
  • +
  • Gemfile +
      +
    • We’ve added some dependencies, most of which are discussed in other +sections: +
        +
      • jsonapi-rails: used for serialization, this is the +rails-specific extension for jsonapi-rb
      • +
      • jsonapi_swagger_helpers: used automatically generating Swagger +documentation.
      • +
      • jsonapi_spec_helpers: easily deal with complex JSONAPI responses +in tests.
      • +
      • kaminari: Default pagination gem.
      • +
      • rspec-rails: Testing framework.
      • +
      • factory_bot_rails: For easily seeding data in tests.
      • +
      • faker: for randomizing factory data.
      • +
      • swagger-diff: for backwards-compatibility checks.
      • +
      • database_cleaner: for cleaning the DB between tests.
      • +
      +
    • +
    +
  • +
+
+ +
+
+
+ + + + + + diff --git a/_site/ruby/reads/activerecord-associations.html b/_site/ruby/reads/activerecord-associations.html new file mode 100644 index 0000000..c631bab --- /dev/null +++ b/_site/ruby/reads/activerecord-associations.html @@ -0,0 +1,333 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

ActiveRecord Associations

+ +
+

View the Sample App

+
+ +
+

Understanding Nested Queries

+
+ +

JSONAPI Suite comes with an ActiveRecord adapter. Though other +adapters can mimic this same interface, here’s what you’ll get +out-of-the-box. The SQL here is roughly the same as using #includes.

+ +
+

Note: make sure to whitelist associations in your serializers or nothing will render!

+
+ +

has_many

+ +
/posts?include=comments
+ +
# app/resources/post_resource.rb
+has_many :comments,
+  scope: -> { Comment.all },
+  resource: CommentResource,
+  foreign_key: :post_id
+ +

belongs_to

+ +
/comments?include=posts
+ +
# app/resources/comment_resource.rb
+belongs_to :post,
+  scope: -> { Post.all },
+  resource: PostResource,
+  foreign_key: :post_id
+ +

has_one

+ +
/posts?include=detail
+ +
# app/resources/post_resource.rb
+has_one :detail,
+  scope: -> { PostDetail.all },
+  resource: PostDetailResource,
+  foreign_key: :post_id
+ +

has_and_belongs_to_many

+ +
/posts?include=tags
+ +
# app/resources/post_resource.rb
+has_and_belongs_to_many :tags,
+  scope: -> { Tag.all },
+  resource: TagResource,
+  foreign_key: { taggings: :tag_id }
+ +

The only difference here is the foreign_key - we’re passing a hash instead of a symbol. taggings is our join table, and tag_id is the true foreign key.

+ +

This will work, and for simple many-to-many relationships you can move on. But what if we want to add the property primary, a boolean, to the taggings table? Since we hid this relationship from the API, how will clients access it?

+ +

As this is metadata about the relationship it should go on the meta section of the corresponding relationship object. While supporting such an approach is on the JSONAPI Suite roadmap, we haven’t done so yet.

+ +

For now, it might be best to simply expose the intermediate table to the API. Using a client like JSORM, the overhead of this approach is minimal.

+ +

polymorphic_belongs_to

+ +
# app/models/employee.rb
+belongs_to :workspace, polymorphic: true
+ +
# app/models/workspace.rb
+has_many :employees, as: :workspace
+ +
# app/resources/employee_resource.rb
+polymorphic_belongs_to :workspace,
+  group_by: :workspace_type,
+  groups: {
+    'Office' => {
+      scope: -> { Office.all },
+      resource: OfficeResource,
+      foreign_key: :workspace_id
+    },
+    'HomeOffice' => {
+      scope: -> { HomeOffice.all },
+      resource: HomeOfficeResource,
+      foreign_key: :workspace_id
+    }
+  }
+ +
/employees?include=workspace
+ +

Here an Employee belongs to a Workspace. Workspaces have +different types - HomeOffice, Office, CoworkingSpace, etc. The +employees table has workspace_id and workspace_type columns +to support this relationship.

+ +

We may need to query each workspace_type differently - perhaps +they live in separate tables (home_offices, coworking_spaces, etc). So, when fetching the relationship, we’ll need to group our Employees by workspace_type and query differently for each group:

+ +
# app/resources/employee_resource.rb
+polymorphic_belongs_to :workspace,
+  group_by: :workspace_type,
+  groups: {
+    'Office' => {
+      scope: -> { Office.all },
+      resource: OfficeResource,
+      foreign_key: :workspace_id
+    },
+    'HomeOffice' => {
+      scope: -> { HomeOffice.all },
+      resource: HomeOfficeResource,
+      foreign_key: :workspace_id
+    }
+  }
+ +

Let’s say our API was returning 10 Employees, sideloading their corresponding Workspace. The underlying code would:

+ +
    +
  • Fetch the employees
  • +
  • Group the employees by the given key: employees.group_by { |e| +e.workspace_type }
  • +
  • Use the Office configuration for all Employees where +workspace_type is Office, and use the HomeOffice configuration +for all Employees where workspace_type is HomeOffice, and so +forth.
  • +
+
+ +
+
+
+ + + + + + diff --git a/_site/ruby/reads/adapters.html b/_site/ruby/reads/adapters.html new file mode 100644 index 0000000..363fd4b --- /dev/null +++ b/_site/ruby/reads/adapters.html @@ -0,0 +1,215 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+ +
+ + + + + + diff --git a/_site/ruby/reads/basic-reads.html b/_site/ruby/reads/basic-reads.html new file mode 100644 index 0000000..ff83638 --- /dev/null +++ b/_site/ruby/reads/basic-reads.html @@ -0,0 +1,344 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Basic Reads

+ +

Here’s the full code for a JSONAPI endpoint that supports sorting, +pagination, sparse fieldsets and a JSONAPI-compliant response:

+ +
# app/models/post.rb
+class Post < ApplicationRecord
+end
+ +
# config/routes.rb
+scope path: '/api' do
+  scope path: '/v1' do
+    resources :posts, only: [:index]
+  end
+end
+ +
# app/serializers/serializable_post.rb
+class SerializablePost < JSONAPI::Serializable::Resource
+  type :posts
+
+  attribute :title
+  attribute :description
+  attribute :body
+end
+ +
# app/resources/post_resource.rb
+class PostResource < ApplicationResource
+  type :posts
+  model Post
+end
+ +
# app/controllers/posts_controller.rb
+class PostsController < ApplicationController
+  jsonapi resource: PostResource
+
+  def index
+    posts = Post.all
+    render_jsonapi(posts)
+  end
+end
+ +

Let’s walk through each of these files:

+ +
    +
  • app/models/post.rb +
      +
    • Our Model. As Martin Fowler puts it, “An object model of the domain that incorporates both behavior and data.”. In this case we’re using ActiveRecord, though other model patterns can be used. This is the M of MVC.
    • +
    +
  • +
  • config/routes.rb + +
  • +
  • app/serializers/serializable_post.rb +
      +
    • Given a Model, how do we want to represent that model as JSON? We +might want to avoid exposing certain attributes, normalize values, +or compute something specific to the view. This is the V of MVC.
    • +
    • We use the excellent jsonapi-rb library for +serialization. If you’re familiar with active_model_serializers, this code will look very familiar.
    • +
    +
  • +
  • app/resources/post_resource.rb + +
  • +
  • app/controllers/posts_controller.rb +
      +
    • This is a typical Rails Controller, the C of MVC.
    • +
    • We’ve added jsonapi resource: PostResource to tell our controller +to use query and persistence logic defined in our Resource.
    • +
    +
  • +
+ +

All of this leads up to the all-important render_jsonapi method.

+ +

render_jsonapi

+ +
+

View the YARD documentation

+
+ +

This method does two things: builds and resolves the “base scope”, and passes relevant options to the serialization layer.

+ +

In other words, this lower-level code would be the equivalent:

+ +
scope = jsonapi_scope(Post.all) # build up the scope
+posts = scope.resolve # fire the query
+render json: posts,
+  fields: params[:fields].split(','),
+  bunch: 'of',
+  other: 'options'
+ +
    +
  • We’ve started with a base scope - Post.all - and passed it into our +Resource, which will +modify the scope based on incoming parameters.
  • +
  • We’ve passed a number of boilerplate options to the underlying +jsonapi-rb serialization library.
  • +
+ +

There are times we want to manually build and resolve the scope prior to +calling render_jsonapi. The show action is one example.

+ +

The #show action

+ +

Our #show action fetches one specific post by ID, rather than a list of posts. To accomodate this, we manually build and resolve the scope instead of applying the default logic in #render_jsonapi:

+ +
scope = jsonapi_scope(Post.where(id: params[:id]))
+post = scope.resolve.first
+render_jsonapi(post, scope: false)
+ +

Note the scope: false option - we’ve already resolved our models, so +we tell render_jsonapi not to run the scoping logic again.

+ +
+

View the YARD documentation for #jsonapi_scope

+
+ +

It’s a common convention in Rails to return a 404 response code from +the show action when a record is not found. Typically you’d raise and +rescue ActiveRecord::RecordNotFound…but we want to be agnostic to +the database. Instead:

+ +
raise JsonapiCompliable::Errors::RecordNotFound unless post
+ +
# app/controllers/application_controller.rb
+rescue_exception JsonapiCompliable::Errors::RecordNotFound,
+  status: 404
+ +

We’re throwing an exception, and using our error handling +library to +customize the status code when that particular error is thrown.

+
+ +
+
+
+ + + + + + diff --git a/_site/ruby/reads/default-behavior.html b/_site/ruby/reads/default-behavior.html new file mode 100644 index 0000000..58917f6 --- /dev/null +++ b/_site/ruby/reads/default-behavior.html @@ -0,0 +1,250 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Default Behavior

+ +

You may need to change the default behavior or your API - perhaps you +want a default of 10 per page instead of 20. JSONAPI Suite provides +facilities that enable defaults that can be overridden - 10 per +page, unless elsewise specified by the user.

+ +

You can see these defaults in the Resource documentation:

+ +
default_filter :active do |scope|
+  scope.where(active: true)
+end
+
+default_page_size(10)
+
+default_sort([{ created_at: :desc }])
+ +

These can all be overriden by the user. In other words, hitting +/posts will only show active Posts, hitting +/posts?filter[active]=false will show inactive Posts. The same applies +for sorting and pagination.

+ +

A common pattern is for default filters to apply for all users, but +allow overrides for administrators. You can use the :if option to +restrict the override:

+ +
# app/resources/post_resource.rb
+allow_filter :active, if: :admin?
+
+# app/controllers/posts_controller.rb
+def admin?
+  current_user.admin?
+end
+ +

Now the default behavior is to view only active Posts, but +administrators can override this default.

+ +

You also have access to the context (in Rails, the controller) as the +last argument to default_filter:

+ +
default_filter :by_user do |scope, context|
+  scope.where(user_id: context.current_user.id)
+end
+ +
+ +
+
+
+ + + + + + diff --git a/_site/ruby/reads/fieldsets.html b/_site/ruby/reads/fieldsets.html new file mode 100644 index 0000000..cb56bc7 --- /dev/null +++ b/_site/ruby/reads/fieldsets.html @@ -0,0 +1,271 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Fieldsets

+ +
+

View the JSONAPI specification

+
+ +
+

View the JS Documentation

+
+ +

Sparse Fieldsets

+ +

You’ll get this for free. Given a serializer:

+ +
# app/serializers/serializable_post.rb
+class SerializablePost < JSONAPI::Serializable::Resource
+  type :posts
+
+  attribute :title
+  attribute :description
+  attribute :comment_count
+end
+ +

And the request:

+ +
/posts?fields[posts]=title,comment_count
+ +

The description field will not be returned in the response.

+ +

Extra Fieldsets

+ +
+

View the YARD documentation

+
+ +

The opposite of a “sparse fieldset” is an “extra fieldset”. Perhaps you +have an attribute that is computationally expensive and should only be +returned when explicitly requested. Perhaps the majority of your clients +need the same fields (and can share the same cache) but one client needs +extra data (and you’ll accept the cache miss).

+ +

To request an extra field, just specify it in your serializer:

+ +
# app/serializers/serializable_employee.rb
+
+extra_attribute :net_worth do
+  1_000_000
+end
+ +

In the URL, replace fields with extra_fields:

+ +
/posts?extra_fields[employees]=net_worth
+ +

The net_worth attribute will only be returned when explicitly +requested.

+ +

You may want to eager load some data only when a specific extra field is +requested. There’s a hook for this in your Resource;

+ +
# app/resources/employee_resource.rb
+
+extra_field(employees: [:net_worth]) do |scope|
+  scope.includes(:assets)
+end
+ +
+ +
+
+
+ + + + + + diff --git a/_site/ruby/reads/filtering.html b/_site/ruby/reads/filtering.html new file mode 100644 index 0000000..5986367 --- /dev/null +++ b/_site/ruby/reads/filtering.html @@ -0,0 +1,341 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Filtering

+ +
+

View the JSONAPI specification

+
+ +
+

View the YARD Documentation

+
+ +
+

View the Sample App: Server1Server2Client

+
+ +
+

View the JS Documentation

+
+ +

Filters are usually one-liners, with the logic delegated to an Adapter.

+ +
allow_filter :title
+ +

You can view allow_filter like a whitelist. We wouldn’t want to +automatically support filters - otherwise sneaky users might filter our +Employees to only those making a certain salary. Hence the whitelist.

+ +

To customize a filter:

+ +
allow_filter :title do |scope, value|
+  scope.where(title: value)
+end
+ +

A real-life example might be a prefix query:

+ +
allow_filter do |scope, value|
+  scope.where(["title LIKE ?", "#{value}%"])
+end
+ +

Filtering Relationships

+ +

Prefix the filter parameter with the relevant JSONAPI Type like so:

+ +
/blogs?include=posts&filter[posts][title]=foo
+ +

Default Filters

+ +
+

View the YARD Documentation

+
+ +

You may want your scope to be filtered any time it is accessed - Perhaps +you only want to show active posts by default:

+ +
default_filter :active do |scope|
+  scope.where(active: true)
+end
+ +

Default filters can be overridden if there is a corresponding +allow_filter. Given a Resource:

+ +
allow_filter :active
+
+default_filter :active do |scope|
+  scope.where(active: true)
+end
+ +

And the following requests:

+ +
/posts
+/posts?filter[active]=false
+ +

The first will display only active posts, the second will display only +inactive posts.

+ +

Filter Conventions

+ +

There are some common naming conventions for supporting more complex filters:

+ +
# greater than
+allow_filter :id_gt
+
+# greater than or equal to
+allow_filter :id_gte
+
+# less than
+allow_filter :id_lt
+
+# less than or equal to
+allow_filter :id_lte
+
+# prefix queries
+allow_filter :title_prefix
+
+# OR queries
+allow_filter :active_or # true or false
+ +
+

NOTE: AND queries are supported by default - just pass a +comma-delimited list of values.

+
+ +

Filter Guards

+ +

You can conditionally allow filters based on runtime context. +Let’s say only managers should be allowed to filter employees by salary:

+ +
allow_filter :salary, if: :manager?
+
+def manager?
+  current_user.role == 'manager'
+end
+ +

Filter Aliases

+ +

Aliases mostly come into play when supporting backwards +compatibility. Let’s say we originally called the filter fname then +later wanted the more-expressive first_name. An alias allows is to +keep a one-liner with the correct naming, while still responding correctly +to fname:

+ +
allow_filter :first_name, aliases: [:fname]
+ +

Accessing Runtime Context

+ +

allow_filter can access runtime context (in Rails, the controller) as +the last argument:

+ +
allow_filter :my_siblings do |scope, value, context|
+  if value == true
+    scope.where(family_id: context.current_user.family_id)
+  else
+    scope
+  end
+end
+ +
+ +
+
+
+ + + + + + diff --git a/_site/ruby/reads/nested.html b/_site/ruby/reads/nested.html new file mode 100644 index 0000000..a18cd3a --- /dev/null +++ b/_site/ruby/reads/nested.html @@ -0,0 +1,326 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Relationships and Nested Queries

+ +
+

View the JSONAPI Specification

+
+ +
+

View the Sample App

+
+ +
+

View the JS Documentation

+
+ +

Let’s say we want to fetch a Post and all of its Comments:

+ +
/posts?include=comments
+ +

Using the default ActiveRecord Adapter, we would add this code to our +PostResource:

+ +
# app/resources/post_resource.rb
+has_many :comments,
+  scope: -> { Comment.all },
+  resource: CommentResource,
+  foreign_key: :post_id
+ +
+

Note: we’d have to whitelist comments in our serializer as well.

+
+ +

To understand this code, we first have to realize that this is a Macro - +code that is generating lower-level code for the purposes of removing +boilerplate. Let’s understand the lower-level DSL before breaking +down the macro.

+ +
allow_sideload :comments, resource: CommentResource do
+  scope do |posts|
+    # ... code ...
+  end
+
+  assign do |posts, comments|
+    # ... code ...
+  end
+end
+ +

This is the lower-level allow_sideload DSL. There are four things +going on. To begin with:

+ +
    +
  • We’ve whitelisted comments. Without this, the request would raise +the error JsonapiCompliable::Errors::InvalidInclude. This ensures +clients can’t arbitrarily pull back data that could introduce performance +problems or security risks.
  • +
  • We’ve said, “when retrieving comments, re-use the logic defined in +CommentResource”. This way all the filter, sorting, etc query logic +at the /comments endpoint can be reused when sideloading comments from +the /posts?include=comments endpoint.
  • +
+ +

That brings us to the scope and assign hooks. When querying a +relationship, we need to answer two questions:

+ +
    +
  • Given a list of parents (posts), how should we scope the request for +children (comments)? This is the scope block. In a relational +database, we’d usually scope based on foreign and primary keys.
  • +
  • Given a list of parents (posts) and a list of children (comments), +how do you want to assign these objects together? This is the assign +block. In a relational database, we’d usually compare foreign and +primary keys.
  • +
+ +

In other words, the code would look similar to this for ActiveRecord:

+ +
scope do |posts|
+  Comment.where(post_id: posts.map(&:id))
+end
+
+assign do |posts, comments|
+  posts.each do |post|
+    post.comments = comments.select { |c| c.post_id == post.id }
+  end
+end
+ +

Note that scope hasn’t actually fired a query - we take the result of +this block and pass it to CommentResource so that further query logic +(filtering, sorting, etc) can be applied and re-used across endpoints.

+ +

Of course, the code above would be very tedious to write by hand every +time. That’s why we have Macros like has_many, belongs_to etc - +configure only the parts you need, and avoid the boilerplate:

+ +
# app/resources/post_resource.rb
+has_many :comments,
+  scope: -> { Comment.all },
+  resource: CommentResource,
+  foreign_key: :post_id
+  # primary_key defaults to 'id'
+ +

Given the above options, we can auto-generate allow_sideload code. You +can always write allow_sideload directly if you have highly customized +logic. You can also pass a block to the macros to customize:

+ +
# app/resources/post_resource.rb
+has_many :comments,
+  scope: -> { Comment.all },
+  resource: CommentResource,
+  foreign_key: :post_id do
+    assign do |posts, comments|
+      # some custom code to associate these objects
+      Post.associate(posts, comments)
+    end
+  end
+ +

Again, nested queries come for free. This code allows for nested queries +like “give me the post, and its active comments”:

+ +
/posts/1?include=comments&filter[comments][active]=true
+ +
+ +
+
+
+ + + + + + diff --git a/_site/ruby/reads/pagination.html b/_site/ruby/reads/pagination.html new file mode 100644 index 0000000..b353c7e --- /dev/null +++ b/_site/ruby/reads/pagination.html @@ -0,0 +1,238 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Pagination

+ +
+

View the JSONAPI specification

+
+ +
+

View the YARD Documentation

+
+ +
+

View the Sample App: Server1Server2Client

+
+ +
+

View the JS Documentation

+
+ +

Pagination usually happens with no developer intervention, instead handled +automatically by an Adapter. To +customize:

+ +
paginate do |scope, current_page, per_page|
+  scope.page(current_page).per(per_page)
+end
+ +

A real-life example might be replacing the default Kaminari gem with will_paginate:

+ +
paginate do |scope, current_page, per_page|
+  scope.paginate(page: current_page, per_page: per_page)
+end
+ +
+ +
+
+
+ + + + + + diff --git a/_site/ruby/reads/serializers.html b/_site/ruby/reads/serializers.html new file mode 100644 index 0000000..083edd9 --- /dev/null +++ b/_site/ruby/reads/serializers.html @@ -0,0 +1,309 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Serializers

+ +
+

View the Sample App

+
+ +
+

View additional documentation at jsonapi-rb.org

+
+ +

+ +

We use jsonapi-rb for serialization. If you’ve used active_model_serializers before, it will look incredibly familiar:

+ +
# app/serializers/serializable_post.rb
+class SerializablePost < JSONAPI::Serializable::Resource
+  type :posts
+
+  attribute :title
+  attribute :description
+  attribute :body
+end
+ +

Would render the JSONAPI Document:

+ +
{
+  data: {
+    type: "posts",
+    id: "123",
+    attributes: {
+      title: "My Post",
+      description: "Some description",
+      body: "Blah blah blah"
+    }
+  }
+}
+ +

Associations

+ +

To add an association:

+ +
has_many :comments
+ +

Assuming there is a corresponding SerializableComment, you’d see:

+ +
{
+  data: {
+    type: "posts",
+    id: "123",
+    attributes: { ... },
+    relationships: {
+      comments: {
+        data: [
+          { id: "1", type: "comments" }
+        ]
+      }
+    }
+  },
+  included: [
+    {
+      type: "comments",
+      id: "1"
+    }
+  ]
+}
+ +
+

Note: Your Resource must whitelist this sideload as well.

+
+ +

Customizing Serializers

+ +

Occasionally you may need to normalize, format, or elsewise transform +your Model into an effective JSON representation. To do this, pass a +block to attribute and reference the underlying @object being +serialized:

+ +
attribute :title do
+  @object.title.upcase
+end
+ +
+

Why not methods like AMS? To avoid collissions with native ruby methods like tap.

+
+ +

Keep in mind all serializers have access to @context - the calling +controller in Rails.

+ +

Conditional Fields

+ +

You may want to render a field based on runtime context - for instance, +only show the salary field if the user is a manager. Keeping in mind +that @context will always be available as the calling controller:

+ +
attribute :salary, if: -> { @context.current_user.manager? }
+ +
+

View additional documentation at jsonapi-rb.org

+
+ +
+

Visit the jsonapi-rb Gitter chatroom

+
+
+ +
+
+
+ + + + + + diff --git a/_site/ruby/reads/sorting.html b/_site/ruby/reads/sorting.html new file mode 100644 index 0000000..7ee5b87 --- /dev/null +++ b/_site/ruby/reads/sorting.html @@ -0,0 +1,254 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Sorting

+ +
+

View the JSONAPI specification

+
+ +
+

View the YARD Documentation

+
+ +
+

View the Sample App: Server1Server2Client

+
+ +
+

View the JS Documentation

+
+ +

Sorting usually happens with no developer intervention, instead handled +automatically by an Adapter. To +customize:

+ +
sort do |scope, attribute, direction|
+  scope.order(attribute => direction)
+end
+ +

A real-life example might be sorting on a different table. Let’s say an +Employee has many Positions, and title lives in the positions table:

+ +
sort do |scope, attribute, direction|
+  if attribute == :title
+    scope.joins(:positions).order("positions.title #{direction}")
+  else
+    scope.order(attribute => direction)
+  end
+end
+ +
+

Note: the same sort proc will fire for every sort parameter supplied +in the request. In other words, yes - you can multisort!

+
+ +

Sorting Relationships

+ +

Prefix the sort parameter with the relevant JSONAPI Type like so:

+ +
/blogs?include=posts&sort=posts.title
+ +
+ +
+
+
+ + + + + + diff --git a/_site/ruby/reads/statistics.html b/_site/ruby/reads/statistics.html new file mode 100644 index 0000000..86885fa --- /dev/null +++ b/_site/ruby/reads/statistics.html @@ -0,0 +1,260 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Statistics

+ +
+

View the JS Documentation

+
+ +
+

View the YARD Documentation

+
+ +
+

View the Sample App: Server1Server2Client

+
+ +

Statistics are useful and common. Consider a datagrid listing posts - we +might want a “Total Posts” count displayed above the grid without firing +an additional request. Notably, that statistic should take into +account filtering, but should not take into account pagination.

+ +

You can whitelist stats in your Resource:

+ +
allow_stat total: [:count]
+ +

And request them like so:

+ +
/posts?stats[total]=count
+ +

They will be returned in the meta section of the response:

+ +
{
+  # ...
+  meta: {
+    stats: {
+      total: {
+        count: 100
+      }
+    }
+  }
+}
+ +

You can run stats over specific attributes rather than total:

+ +
allow_stat rating: [:average]
+ +

Adapters support the following statistics out-of-the-box: count, +average, sum, maximum, and minimum. You can also define custom +statistics:

+ +
allow_stat rating: [:average] do
+  standard_deviation do |scope, attr|
+    # your standard deviation code here
+  end
+end
+ +
+ +
+
+
+ + + + + + diff --git a/_site/ruby/resources.html b/_site/ruby/resources.html new file mode 100644 index 0000000..8919352 --- /dev/null +++ b/_site/ruby/resources.html @@ -0,0 +1,536 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Resources

+ +
+

“A Model is to the Database what a Resource is to the API

+
+ +

Resources might look magical at first, but they are actually just a +simple collection of a few common hooks.

+ +

Consider a traditional Rails controller:

+ +
def index
+  posts = Post.all
+  render json: posts
+end
+ +

Imagine if we had to implement the JSONAPI specification by hand, ensuring our endpoints supported sorting, pagination, filtering, etc. You’d start seeing something along these lines:

+ +
# No query has fired yet, this is a blank ActiveRecord scope
+posts = Post.all
+
+if title = params[:filter].try(:title)
+  # Alter the scope if we're filtering
+  posts = posts.where(title: title)
+end
+
+# ... etc ...
+
+if sort = params[:sort]
+  # Alter the scope if we're sorting
+  sort_dir = :asc
+  if sort.starts_with?('-')
+    sort_dir = :desc
+  end
+  sort_att = sort.split('-')[1]
+  posts = posts.order(sort_att => sort_dir)
+end
+
+# ... etc ...
+
+render json: posts.to_a # Finally!
+ +

In other words…it’d be a gross mess, especially when dealing with +inclusion of related +resources or swapping +datastores. But the basic pattern - starting with a scope and then +decorating it based on incoming parameters - is incredibly powerful.

+ +

Instead of writing this code by hand every time, let’s move the +boilerplate into a library and leave developers with only the part they +care about - how to modify the scope:

+ +
allow_filter :title do |scope, value|
+  scope.where(title: value)
+end
+
+sort do |att, dir|
+  scope.order(att => dir)
+end
+ +

This code lives in a Resource. All we’re doing here is specifying Procs that modify the scope, leaving boilerplate to the underlying jsonapi_suite library.

+ +

Of course, with ActiveRecord, you’d see the same logic repeated here over +and over again. Let’s supply defaults to DRY up this code and end +with:

+ +
# Whitelist the filter
+allow_filter :title
+ +

…but allow developers to override those defaults whenever they’d like:

+ +
allow_filter :title do |scope, value|
+  scope.where(["title LIKE ?", "#{value}%"])
+end
+
+sort do |attribute, direction|
+  # ... your custom sort logic ...
+end
+ +

The important thing is: you still have full control of the query. +This is why JSONAPI Suite can easily work with any datastore, from SQL +to MongoDB to HTTP requests. The “behind-the-scenes defaults” are stored +in an Adapter. +Supply blocks for one-off customizations, or package them up into an +Adapter once those customizations become commonplace.

+ +

By default, JSONAPI Suite comes with an ActiveRecordAdapter.

+ +

Scopes - a Generic Query-Building Pattern

+ +

If you look closely at the above examples, you can see our code breaks +down into three key parts:

+ +
    +
  • Step 1: Start with a “base scope” - a default query object.
  • +
  • Step 2: Modify that scope based on incoming parameters.
  • +
  • Step 3: Actually fire the query.
  • +
+ +

This pattern applies to any ORM or datastore. Let’s try it with an HTTP +client that accepts a hash of options. A generic Rails controller might +look something like:

+ +
def index
+  # Step 1: Our "base scope"
+  scope = {}
+
+  # Step 2: Modify that scope based on the request
+  if title = params[:filter].try(:[], :title)
+    scope[:title] = title
+  end
+
+  # Step 3: actually fire the request + build some models
+  # Post here is a PORO (plain old ruby object)
+  hashes = HTTP.get('/posts', scope)
+  posts = hashes.map { |attr| Post.new(attrs) }
+
+  # render
+  render json: posts
+end
+ +

So our JSONAPI Suite equivalent would be:

+ +
# Step 1: Define the base scope in the controller
+def index
+  base_scope = {}
+  # Pass the base scope to the resource, which will
+  # build + fire the query.
+  #
+  # Then, render the results.
+  render_jsonapi(base_scope)
+end
+ +
# app/resources/post_resource.rb
+#
+# Step 2: Modify the scope in the Resource
+allow_filter :title do |scope, value|
+  scope[:title] = value
+end
+
+# Step 3: Actually fire the query
+# This method must return an array of Model instances
+def resolve(scope)
+  hashes = HTTP.get('/posts', scope)
+  hashes.map { |attr| Post.new(attrs) }
+end
+ +

Again, you can package this logic into an Adapter if you found yourself repeating the same logic +over and over. Adapters DRY-up Resources.

+ +

This pattern applies to sorting, pagination, statistics and such as +well - view the Reads documentation +for more.

+ +

Associations

+ +

In the prior section, we noted the 3 key parts of query building. For +associations, we need to answer 2 key questions:

+ +
    +
  • Question 1: Given an array of parents, what should the “base scope” be +in order to query only relevant children?
  • +
  • Question 2: Once we’ve resolved both the parents and the children, how do +we associate these objects together?
  • +
+ +

Let’s switch back to vanilla ActiveRecord for a second. We’ve resolved +the Posts and need to fetch the Comments. Here’s how we’d answer +these questions:

+ +
allow_sideload :comments, resource: CommentResource do
+  # Question 1: What's a "base scope" that will return only
+  # relevant comments?
+  scope do |posts|
+    Comment.where(post_id: posts.map(&:id))
+  end
+
+  # Question 2: How do we assign these objects together?
+  assign do |posts, comments|
+    posts.each do |post|
+      post.comments = comments.select { |c| c.post_id == post.id }
+    end
+  end
+end
+ +

Just like in our prior sections, we can see the same logic would repeat +over and over again each time we added a new relationship…with some slight tweaks based on +has_many/belongs_to, non-standard foreign keys and such. So our +default ActiveRecord adapter comes with macros that generate this +lower-level code for us:

+ +
has_many :comments,
+  resource: CommentResource,
+  scope: -> { Comment.all },
+  foreign_key: :post_id
+ +

You can dig deeper into the various ActiveRecord Association Macros here.

+ +

Let’s go back to HTTP calls. Imagine the CommentResource worked just +like our HTTP-based PostResource from the prior section. Let’s see how +those same questions would be answered:

+ +
# Step 1: What's a base scope that will return only
+# relevant comments?
+#
+# In the case of our HTTP client, the "base scope" is
+# nothing more than a ruby hash.
+#
+# Our final query would end up something like:
+#
+# HTTP.get('/comments', { post_id: [1,2,3] })
+scope do |posts|
+  { post_id: posts.map(&:id) }
+end
+
+# Step 2: How do we assign these objects together?
+# This code is unchanged from the prior example
+assign do |posts, comments|
+  posts.each do |post|
+    post.comments = comments.select { |c| c.post_id == post.id }
+  end
+end
+ +

The key lessons here:

+ +
    +
  • scope must return a “base scope” that can be further modified. +This way we can apply additional “deep query” logic - maybe we +want to sort these comments - and re-use the query-building code +defined in CommentResource. This allows the same logic at the +/comments endpoint to apply to the /posts?include=comments +endpoint.
  • +
  • If you’re not sure what the scope should be, look into the relevant +Resource, particularly the #resolve method, +to see how the query will actually be executed. If there is no +#resolve method, it’s using the default of the relevant Adapter. +
      +
    • Typically, you’d define an ApplicationRecord who specifies the + Adapter. You’ll see this pattern if you use our generators.
    • +
    +
  • +
  • Adapters can +DRY-up this logic with has_many-style macros.
  • +
+ +

Writes

+ +

In the prior sections, we removed boilerplate and dropped down to only +the important code of scope modification. The same basic premise applies to write operations as well. Rather than +dealing with parsing the incoming payload and associating the graph of +objects, Suite supplies hooks for just the parts you care about: +actually persisting objects.

+ +
def create(attributes)
+  post = Post.new(attributes)
+  post.save
+  post
+end
+
+def update(attributes)
+  post = Post.find(attributes.delete(:id))
+  post.update_attributes(attributes)
+  post
+end
+
+# ... etc ...
+ +

Just like reads, this logic is usually extracted into an Adapter, but +you can always use super to override, handle side effects, etc.

+ +
def create(attributes)
+  model = super
+  Rails.logger.info "#{model.class} created with id #{model.id}!"
+  model
+end
+ +

See the Writes section for +more.

+ +

Generators

+ +

If you’re unsure of how a “default project” should look, use the +bin/rails g jsonapi:resource generator:

+ +
bin/rails g jsonapi:resource Post title:string
+
+
+ +

This generator can also limit the controller actions:

+ +
bin/rails g jsonapi:resource Post title:string -a index
+
+
+ +

It’s highly encouraged you run these generators at least once, as +you’ll get a bunch of helpful comments and understand baseline +scenarios. You’re getting:

+ +
    +
  • A controller (e.g. PostsController)
  • +
  • A route (/<api_namespace>/v1/posts)
  • +
  • A Resource (PostResource)
  • +
  • Integration spec boilerplate +
      +
    • including Factories
    • +
    • …and Payloads
    • +
    +
  • +
  • A whitelist of incoming parameters for writes + (config/initializer/strong_resource.rb)
  • +
+ +

Type bin/rails g jsonapi:resource --help for details.

+ +

Wrapping Up

+ +

There’s more to learn about various ways Resources can be customized, +but that’s the basic premise: no magic, just removal of boilerplate.

+ +
+

Note: the same Resource logic can be re-used across endpoints, to +support logic like “fetch this Post and its Comments that are +active”. Whether you’re sideloading comments from the /posts +endpoint or accessing the /comments endpoint directly, the same +Resource logic applies.

+
+ +
+

See the Resource documentation for more.

+
+
+ +
+
+
+ + + + + + diff --git a/_site/ruby/scoping-to-current-user.html b/_site/ruby/scoping-to-current-user.html new file mode 100644 index 0000000..5f447db --- /dev/null +++ b/_site/ruby/scoping-to-current-user.html @@ -0,0 +1,295 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Scoping to Current User

+ +
+

Given a Post model with hidden attribute, only allow administrators +to view hidden Posts.

+
+ +

Let’s start by adding a visible scope to Post, so we can easily +retrive only Posts where hidden is false:

+ +
# app/models/post.rb
+scope :visible, -> { where(hidden: false) }
+ +

As you know, we would typically use the base scope Post.all like so:

+ +
def index
+  render_jsonapi(Post.all)
+end
+ +

Let’s instead use the base scope Post.visible when the user is not an +administrator:

+ +
def index
+  scope = current_user.admin? ? Post.all : Post.visible
+  render_jsonapi(scope)
+end
+ +

That’s it! Now only administrators can view hidden Posts.

+ +

Of course, this logic would only apply to the /posts endpoint and +would not apply when we are sideloading from /blogs?include=posts. To +ensure this logic runs all the time, add a default filter:

+ +
default_filter :visible do |scope, context|
+  context.current_user.admin? ? scope : scope.visible
+end
+ +

Privileged Writes

+ +
+

Given Posts that have an internal attribute, only allow +internal users to publish internal posts.

+
+ +

Our controller context is available in our resource. Let’s override +Resource#create to ensure correct privileging:

+ +
def create(attributes)
+  if !internal_user? && attributes[:internal] == true
+    raise "Hey you! YOU can't publish internal posts!"
+  else
+    super
+  end
+end
+
+private
+
+def internal_user?
+  context.current_user.internal?
+end
+ +

Guarding Filters

+ +
+

Given Employees with attribute under_performance_review, do not allow clients to find all employees under performance review.

+
+ +

Occasionally you need to guard filters based on the current user. Use +the :if option on allow_filter. This will execute in the context of +your controller:

+ +
# app/resources/employee_resource.rb
+allow_filter :under_performance_review, if: :admin?
+ +
# app/controllers/employees_controller.rb
+class EmployeesController < ApplicationController
+  jsonapi resource: EmployeeResource
+
+  def index
+    render_jsonapi(Employee.all)
+  end
+
+  private
+
+  def admin?
+    current_user.admin?
+  end
+end
+ +
+ +
+
+
+ + + + + + diff --git a/_site/ruby/swagger.html b/_site/ruby/swagger.html new file mode 100644 index 0000000..733b2fa --- /dev/null +++ b/_site/ruby/swagger.html @@ -0,0 +1,331 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Autodocumenting with Swagger

+ +
+

View the Sample App

+
+ +

This suite uses DSLs to specify inputs (strong_resources, filters, etc), and outputs (jsonapi-rb serializers). +We can introspect that DSL to provide automatic documentation. Not only +does this save a lot of time, it ensures your code and documentation are +never out of sync.

+ +

Here we’ll be using swagger, a popular open-source +documentation framework. +
+

+ +

+ +


+To get this UI, we need to install two things: a controller that +generates a schema (swagger.json), and a static website +in public. Our generator installs these dependencies: +
+

+ +
# Gemfile
+# Below 'jsonapi_suite'
+gem 'jsonapi_spec_helpers'
+gem 'jsonapi_swagger_helpers'
+ +

+ Note: here we’re moving jsonapi_spec_helpers out of the + test-specific bundle group. Introspecting spec helpers is part of + autodocumenting, so we’ll require them manually when our documentation + controller is loaded. +

+ +

The generator also installs a Swagger UI in your Rails app’s public +directory. If you haven’t already done so:

+ +
$ mkdir -p public/api/docs && cd public/api/docs
+$ git clone https://github.com/jsonapi-suite/swagger-ui.git && cp swagger-ui/prod-dist/* . && rm -rf swagger-ui
+ +

Our documentation will be accessible at /api/docs, so we put the files +in public/api/docs. You may want a different directory depending on +your own routing rules. In either case, our next step is to edit +index.html: make sure any javascript and css has the correct URL. +There are also a few configuration options, such as providing a link to +Github.

+ +
window.CONFIG = {
+  githubURL: "http://github.com/user/repo",
+  basePath: "/api" // basePath/swagger.json, basePath/v1/employees, etc
+}
+ +

This static website will make a request to /api/swagger.json. Again, +if not using the generator you’ll have to add that endpoint:

+ +
$ touch app/controllers/docs_controller.rb
+ +
# config/routes.rb
+scope path: '/api' do
+  resources :docs, only: [:index], path: '/swagger'
+  # ... code ...
+end
+ +

Our DocsController uses swagger-blocks to generate +the swagger schema. Here’s the minimal setup needed to configure +swagger:

+ +
require 'jsonapi_swagger_helpers'
+
+class DocsController < ActionController::API
+  include JsonapiSwaggerHelpers::DocsControllerMixin
+
+  swagger_root do
+    key :swagger, '2.0'
+    info do
+      key :version, '1.0.0'
+      key :title, '<YOUR APP NAME>'
+      key :description, '<YOUR APP DESCRIPTION>'
+      contact do
+      key :name, '<YOU>'
+      end
+    end
+    key :basePath, '/api'
+    key :consumes, ['application/json']
+    key :produces, ['application/json']
+  end
+end
+ +

That’s it. Now, every time we add an endpoint, we can autodocument with +one line of code (below the swagger_root block):

+ +
jsonapi_resource '/v1/employees'
+ +

This endpoint will be introspected for all RESTful actions, outputting +the full configuration. There are a few customization options:

+ +
jsonapi_resource '/v1/employees',
+  only: [:create, :index],
+  except: [:destroy],
+  descriptions: {
+    index: "Some <b>additional</b> documentation"
+  }
+ +

If you want additional attribute-level documentation, you can add this +to your spec payloads:

+ +
key(:name, String, description: 'The full name, e.g. "John Doe"')
+ +


+Will give you an output similar to: +
+

+ +

+ +


+ +

Authentication

+ +

Your site may require authentication - for instance, sending a +Authorization header in every request. We suggest using something like +Request.ly to modify headers for every request to a given URL.

+
+ +
+
+
+ + + + + + diff --git a/_site/ruby/testing.html b/_site/ruby/testing.html new file mode 100644 index 0000000..22bccbf --- /dev/null +++ b/_site/ruby/testing.html @@ -0,0 +1,305 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Writing Integration Tests

+ +

Validating verbose JSON API responses in tests can be a pain. We could +use something like json_matchers to validate a schema, but we hope to do one better - let’s validate full payloads with a few simple helpers, using full-stack rspec request specs.

+ +

Let’s say we’re testing the show action of our employees controller, sideloading the employee’s department. Follow the Quickstart to make sure your rails_helper.rb is setup correctly first.

+ +

Let’s say we’re testing the show action of our employees controller, sideloading the employee’s department.

+ +

Let’s begin with vanilla RSpec of what the test might look like:

+ +
require 'rails_helper'
+
+RSpec.describe 'employees#show', type: :request do
+  let!(:homer)  { Employee.create!(name: 'Homer Simpson') }
+  let!(:safety) { employee.create_department!(name: 'Safety') }
+
+  it 'renders an employee, sideloading department' do
+    get "/api/employees/#{homer.id}", params: {
+      include: 'department'
+    }
+    # ... code asserting json response ...
+  end
+end
+ +

To avoid painful json assertions, let’s use jsonapi_spec_helpers. Start by adding some setup code:

+ +
# spec/rails_helper.rb
+require 'jsonapi_spec_helpers'
+
+RSpec.configure do |config|
+  config.include JsonapiSpecHelpers
+end
+ +

And now to validate the response, we’ll call assert_payload:

+ +
assert_payload(:employee, homer, json_item)
+assert_payload(:department, safety, json_include('departments'))
+ +

assert_payload takes three arguments:

+
    +
  • The name of a payload we’ve defined (we haven’t done this yet).
  • +
  • The record we want to compare against
  • +
  • The relevant slice of json. json_item and json_includes are +helpful methods to target the right slice. You can see all helpers in +the documentation for jsonapi_spec_helpers.
  • +
+ +

OK, so we want to take a record, response JSON, and compare them against +something pre-defined. Let’s write those definitions; they look very similar to +something you’d write for factory_girl:

+ +
# spec/payloads/employee.rb
+JsonapiSpecHelpers::Payload.register(:employee) do
+  key(:name)
+  key(:email)
+
+  timestamps!
+end
+
+# spec/payloads/department.rb
+JsonapiSpecHelpers::Payload.register(:department) do
+  key(:name)
+end
+ +

assert_payload will do four things:

+ +
    +
  • Ensure keys that are not in the payload definition are not present.
  • +
  • Ensure all keys in the registered payload are present.
  • +
  • Ensures no value in a key/value pair is nil (this is overrideable).
  • +
  • Ensures each key matches the expected record value. In other words, +we’re doing something like expect(json['email']).to eq(homer.email).
  • +
+ +

The comparison value can be customized. Let’s say we serialize the +name attribute as a combination of the employee’s first_name and +last_name:

+ +
key(:name) { |record| "#{record.first_name} #{record.last_name}" }
+ +

Optionally, validate against a type as well. If both the expected and +actual values match, but are the incorrect type, the test will fail:

+ +
key(:salary, Integer)
+ +

You can also customize/override payloads at runtime in your test. Let’s +say we only serialize salary when the current user is an admin. Your +test could look something like:

+ +
sign_in(:user)
+assert_payload(:employee, homer, json_item)
+sign_in(:admin)
+assert_payload(:employee, homer, json_item) do
+  key(:salary)
+end
+ +

For documentation on all the spec helpers we provide, check out the +jsonapi_spec_helpers gem.

+
+ +
+
+
+ + + + + + diff --git a/_site/ruby/writes/basic-writes.html b/_site/ruby/writes/basic-writes.html new file mode 100644 index 0000000..6cbf407 --- /dev/null +++ b/_site/ruby/writes/basic-writes.html @@ -0,0 +1,346 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Basic Writes

+ +

Here’s the code for a JSONAPI endpoint that supports creating, +updating, and deleting resources, complete with validation errors. Keep in mind a small modification will +enable nested creates/updates/deletes/disassociations as well.

+ +

We’ll be adding on to the code from the Basic +Reads section.

+ +
# config/routes.rb
+resources :posts, only: [:create, :update, :destroy]
+ +
# config/initializers/strong_resources.rb
+StrongResources.configure do
+  strong_resource :post do
+    attribute title: :string
+    attribute body: :string
+    attribute rating: :integer
+  end
+end
+ +
# app/controllers/posts_controller.rb
+
+strong_resource :employee
+
+before_action :apply_strong_params, only: [:create, :update]
+
+def create
+  post, success = jsonapi_create.to_a
+
+  if success
+    render_jsonapi(post, scope: false)
+  else
+    render_errors_for(post)
+  end
+end
+
+def update
+  post, success = jsonapi_update.to_a
+
+  if success
+    render_jsonapi(post, scope: false)
+  else
+    render_errors_for(post)
+  end
+end
+
+def destroy
+  post, success = jsonapi_destroy.to_a
+
+  if success
+    render json: { meta: {} }
+  else
+    render_errors_for(post)
+  end
+end
+ +

You’ll see these controller methods all look very similar. Let’s walk +through what’s going on.

+ +
    +
  • jsonapi_create/update/destroy +
      +
    • Parses the incoming request (including nested associations) and +delegates logic to the correct Resource classes.
    • +
    • Wraps everything in a transaction.
    • +
    • Handles validation errors.
    • +
    +
  • +
  • post, success +
      +
    • post is our model instance. Keep in mind, this may be an +unpersisted instance if our request had validation errors.
    • +
    • success is a boolean indicating if the transaction was successful. +Mostly used to determine if we had validation errors.
    • +
    +
  • +
  • render_jsonapi is explained in Basic +Reads
  • +
  • render_errors_for collects any validation errors and formats them +into a JSONAPI-compliant errors object. This includes nested validation errors.
  • +
  • render json: { meta: {} } (destroy only) + +
  • +
+ +

We’ll expand on these topics in the rest of the “Writes” section.

+ +

Delegating Logic to Resources

+ +

With read operations, we supply hooks, essentially asking the developer +“How do you want to modify the scope when a sort parameter comes in? How +about when the title filter comes in?”.

+ +

The same logic applies to write operations - but instead of “how do you +want to modify the scope?” the question is “how do you want to persist +this data”?

+ +
def create(attributes)
+  puts attributes # { title: "Some Post" }
+end
+ +

In ActiveRecord’s case, you can imagine the defaults look something +like this:

+ +
def create(attributes)
+  post = Post.new(attributes)
+  post.save
+  post
+end
+
+def update(attributes)
+  post = Post.find(attributes.delete(:id))
+  post.update_attributes(attributes)
+  post
+end
+
+def destroy(id)
+  post = Post.find(id)
+  post.destroy
+  post
+end
+ +
+

Note: create/update/destroy must always return the model instance

+
+ +

Similar to read operations, we package this logic into an +Adapter to +DRY-up the boilerplate.

+ +

For additional documentation:

+ + +
+ +
+
+
+ + + + + + diff --git a/_site/ruby/writes/nested-writes.html b/_site/ruby/writes/nested-writes.html new file mode 100644 index 0000000..2081c55 --- /dev/null +++ b/_site/ruby/writes/nested-writes.html @@ -0,0 +1,297 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Nested Writes

+ +
+

View the Sample App: Server  |  Client

+
+ +

Nested writes occur via “sideposting”. Using the same example from the +strong resources section, let’s “sidepost” a Person at the /accounts endpoint:

+ +
# PUT /accounts/123
+
+{
+  data: {
+    type: "accounts",
+    id: "123",
+    attributes: { name: "updated" }
+    relationships: {
+      people: {
+        data: [
+          { id: "1", type: "people", method: "update" }
+        ]
+      }
+    }
+  },
+  included: [
+    {
+      type: "people",
+      id: "1",
+      attributes: { name: "updated" }
+    }
+  ]
+}
+ +

Here we’ve update the Account and associated Person in a single +request. You’ll see this is nothing more than a mirror of a +“sideloading” payload, with one key addition - because HTTP verbs only apply to the top-level resource, we add a method key for all associated resources. Because we’re sticking to the convention of pairing a Resource with a verb, we call this “REST with Relationships”. Verbs can be one of create, update, destroy or disassociate.

+ +
+

Read more about the Sideposting Concept

+
+ +

There’s not much code to satisfy this document. Make sure the +relationship is defined in your Resource:

+ +
# app/resources/account_resource.rb
+
+has_many :people,
+  resource: PersonResource,
+  foreign_key: :account_id,
+  scope: -> { Person.all }
+ +

And whitelisted in your controller:

+ +
# app/controllers/accounts_controller.rb
+
+strong_resource :account do
+  has_many :people
+end
+ +

That’s it!

+ +

temp-id

+ +

There’s one final concept in sideposting, specific to create. We need +to tell our clients how to update an in-memory object with the +newly-minted id from the server. To do this, we pass temp-id (a random uuid) in the +request instead of id:

+ +
# create an Account with a Person in a single request
+{
+  data: {
+    type "accounts",
+    attributes: { name: "new account" },
+    relationships: {
+    people: {
+      data: [
+        { :'temp-id' => "abc123", type: "people" }
+      ]
+    }
+  },
+  included: [
+    {
+      type: "people",
+      :"temp-id" => "abc123",
+      attributes: { name: "John Doe" }
+    }
+  ]
+}
+ +

Clients like JSORM will handle this for you +automatically.

+
+ +
+
+
+ + + + + + diff --git a/_site/ruby/writes/side-effects.html b/_site/ruby/writes/side-effects.html new file mode 100644 index 0000000..c241841 --- /dev/null +++ b/_site/ruby/writes/side-effects.html @@ -0,0 +1,286 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Side Effects

+ +

Side effects scenarios come up often. What if we want to send an email +notification every time a Comment is created?

+ +

It’s important to note that there are three overall categories of side effects, +and each requires a different solution:

+ +
    +
  • Side effects internal to the Model: For example, setting a +published_at attribute.
  • +
  • Side effects that should only occur on a specific request: For +example, only send an email update if we’re creating a Post for the +first time, at the /posts endpoint.
  • +
  • Side effects that should occur on every type of request: For +example, send an email notification every time a Comment is created - +but not updated - whether it was created at the /comments endpoint or sideposted at the +/posts endpoint.
  • +
+ +

Internal Side-Effects

+ +

For the first scenario, it’s OK to use ActiveRecord callbacks (or the +equivalent functionality in a different ORM):

+ +
# app/models/user.rb
+class Post < ApplicationRecord
+  before_save :set_published_at,
+    on: :update,
+    if: :publishing?
+
+  private
+
+  def set_published_at
+    self.published_at = Time.now
+  end
+
+  def publishing?
+    status_changed? && status == 'published'
+  end
+end
+ +

Side-Effects on Specific Action

+ +

Just like you would with vanilla Rails, use the controller. Here we’ll +only send an email to our subscribers when the Post is first created. +Keep in mind we could also “sidepost” Post objects at the /blogs +endpoint, but this will only fire at the /posts endpoint.

+ +
class PostsController < ApplicationController
+  def create
+    post, success = jsonapi_create.to_a
+
+    if success
+      PostMailer.published_email.deliver_later
+      render_jsonapi(post, scope: false)
+    else
+      render_errors_for(post)
+    end
+  end
+end
+ +

Side-Effects on Every Request of a Given Type

+ +

Let’s add some special logging every time we create a Post. Note this +will fire every time we create a Post - whether we create it at the +/posts endpoint or “sidepost” at the /blogs endpoint.

+ +

We do not need to worry about this side-effect in our model specs, +or rake tasks, as the functionality is only relevant to the API.

+ +

Edit your Resource:

+ +
# app/resources/post_resource.rb
+def create(attributes)
+  Rails.logger.info "Post begin created by #{context.current_user.email}..."
+  super
+  Rails.logger.info "Success!"
+end
+ +
+ +
+
+
+ + + + + + diff --git a/_site/ruby/writes/strong-resources.html b/_site/ruby/writes/strong-resources.html new file mode 100644 index 0000000..03e5e4a --- /dev/null +++ b/_site/ruby/writes/strong-resources.html @@ -0,0 +1,288 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Strong Resources

+ +
+

View the Sample App: Basic  | Nested

+
+ +
+

View the Strong Resources Github Documentation

+
+ +

Rails 4 introduced the concept of Strong Parameters, a way to whitelist incoming parameters for a given write operation. The folks at Zendesk took it a step further with Stronger Parameters, which added type-checking to the strong parameter checks.

+ +

This works well for traditional REST endpoints that can put the logic in +the controller. But JSONAPI Suite endpoints can “sidepost” objects at +multiple endpoints - we might save a Person at the /people endpoint, +but also sidepost from the /accounts endpoint. The strong parameters +logic would need to be duplicated across controllers.

+ +

Enter Strong Resources. Define whitelist templates in one place, and re-use them across your application:

+ +
# config/initializers/strong_resources.rb
+StrongResources.configure do
+  strong_resource :account do
+    attribute :name, :string
+    attribute :active, :boolean
+  end
+end
+ +
# app/controllers/accounts_controller.rb
+
+before_action :apply_strong_params, only: [:create, :update]
+
+strong_resource :account
+ +

Now, whenever we POST or PUT to /accounts, the request +attributes must come in this format. If an extra attribute is given - +perhaps a read-only rate_limit attribute - the request will be +rejected. If active comes in as a string instead of a boolean, the +request will be rejected.

+ +

Let’s sidepost a Person record to the /accounts endpoint:

+ +
# config/initializers/strong_resources.rb
+
+# ... code ...
+strong_resource :person do
+  attribute :name, :string
+  attribute :age, :integer
+end
+ +
# app/controllers/accounts_controller.rb
+
+strong_resource :account do
+  has_many :people
+end
+ +

We can now sidepost Person records - via the people relationship - +to the /accounts endpoint. If the Person attributes don’t match the +:person strong resource template, the request will be rejected.

+ +

By default, we only allow create and update of associations, but you +can opt-in to destroy and disassociate as well:

+ +
# app/controllers/accounts_controller.rb
+
+strong_resource :account do
+  has_many :people, destroy: true, disassociate: true
+end
+ +

There are a variety of ways to customize strong resource templates - +like allowing certain parameters only on update but not create. Head +over to the strong_resources documentation for a more in-depth +overview.

+ +
+Note: a common issue is allowing an input to be null. You can define your own types, or + +
# config/initializers/strong_resources.rb
+ActionController::Parameters.allow_nil_for_everything = true
+  
+ +
+
+ +
+
+
+ + + + + + diff --git a/_site/ruby/writes/validations.html b/_site/ruby/writes/validations.html new file mode 100644 index 0000000..0676f8d --- /dev/null +++ b/_site/ruby/writes/validations.html @@ -0,0 +1,275 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+ + +
+

Validations

+ +
+

View the JSONAPI Errors Spec

+
+ +
+

View the Sample App: Server  |  Client

+
+ +
+

View the JS Documentation

+
+ +

Validation errors are handled automatically for any models adhering to +the ActiveModel::Validations API.

+ +

After we’ve run the persistence logic - but before we close the +transaction - we check model.errors. If errors are present anywhere in +the graph, we rollback the transaction and return a JSONAPI-compliant Error response:

+ +
[
+  {
+    code: "unprocessable_entity",
+    detail: "Name can't be blank",
+    meta: {
+      attribute: "name",
+      message: "can't be blank"
+    },
+    source: {
+      pointer: "/data/attributes/name"
+    },
+    status: "422",
+    title: "Validation Error"
+  }
+]
+ +

This is true for nested write operations as well. Let’s say we were +saving an Employee and their Positions in a single request, but one +of the positions had a validation error on a missing title:

+ +
[
+  {
+    code:  'unprocessable_entity',
+    status: '422',
+    title: 'Validation Error',
+    detail: "Title can't be blank",
+    source: { pointer: '/data/attributes/title' },
+    meta: {
+      relationship: {
+        attribute: :title,
+        message: "can't be blank",
+        code: :blank,
+        name: :positions,
+        id: '123',
+        type: 'positions'
+      }
+    }
+  }
+]
+ +

This is enough information for a client to apply errors to the relevant +objects. In JSORM’s case, you’d see:

+ +
let success = await employee.save({ with: "positions" })
+console.log(employee.errors) // # {}
+let position = employee.positions[0]
+console.log(position.errors.title.message) // # "Can't be blank"
+ +
+ +
+
+
+ + + + + + diff --git a/_site/tutorial.html b/_site/tutorial.html new file mode 100644 index 0000000..f0f7455 --- /dev/null +++ b/_site/tutorial.html @@ -0,0 +1,764 @@ + + + + + + + + + JSONAPI Suite + + + + + + + + + + + + + + +
+
+ + +
+

Tutorial

+ +
Walking Through Customization and Real-World Scenarios
+ +

In this section, we’ll build an employee directory application. +If you’re looking for a brief overview, head to the +Quickstart +instead.

+ +

employee_directory

+ +

If you get lost, you can view the code on Github:

+ + + +

Note: each of these repos has a separate branch for step one, +step two, etc. View the latest branch for final code, or follow along +step-by-step

+ +

The intent is to illustrate a variety of real-world use cases:

+ +
    +
  • Turning 3 database tables into one cohesive search grid.
  • +
  • Customizing SQL queries.
  • +
  • Ability to filter, sort, and paginate data.
  • +
  • Total count
  • +
  • Custom Serialization
  • +
  • Nested CRUD of relationships, including validation errors.
  • +
+ +

Note: to better understand the underlying code, we’ll be avoiding use +of generators. Head to the Quickstart for a guide on how +to automate much of the legwork here.

+ +

Reads

+

Setup

+ +

We’ll be creating an API for an Employee Directory. An Employee has many Positions (one of which is the current position), and a Position belongs to a Department.

+ +

Let’s start with a basic foundation: an index endpoint (list multiple +entities) and a show (single entity) endpoint for an Employee model.

+ +

Code:

+ +
# app/controllers/employees_controller.rb
+class EmployeesController < ApplicationController
+  jsonapi resource: EmployeeResource
+
+  def index
+    render_jsonapi(Employee.all)
+  end
+
+  def show
+    scope = jsonapi_scope(Employee.where(id: params[:id]))
+    render_jsonapi(scope.resolve.first, scope: false)
+  end
+end
+ +
# app/resources/employee_resource.rb
+class EmployeeResource < ApplicationResource
+  type :employees
+end
+ +
# app/serializers/serializable_employee.rb
+class SerializableEmployee < JSONAPI::Serializable::Resource
+  type :employees
+
+  attribute :first_name
+  attribute :last_name
+  attribute :age
+end
+ +

Tests:

+ +
# spec/api/v1/employees/index_spec.rb
+RSpec.describe 'v1/employees#index', type: :request do
+  let!(:employee1) { create(:employee) }
+  let!(:employee2) { create(:employee) }
+
+  it 'lists employees' do
+    get '/api/v1/employees'
+    expect(json_ids(true)).to eq([employee1.id, employee2.id])
+    assert_payload(:employee, employee1, json_items[0])
+  end
+end
+ +
# spec/api/v1/employees/show_spec.rb
+RSpec.describe 'v1/employees#show', type: :request do
+  let!(:employee) { create(:employee) }
+
+  it 'returns relevant employee' do
+    get "/api/v1/employees/#{employee.id}"
+    assert_payload(:employee, employee, json_item)
+  end
+end
+ +

A note on testing: these are full-stack request specs. We seed the database using factory_girl, randomizing data with faker, then assert on the resulting JSON using spec helpers.

+ +

You won’t have to write all the tests you see here, some are simply for demonstrating the functionality.

+ +

Filtering

+ +

One line of code allows simple WHERE clauses. If the user tried to filter on something not whitelisted here, an error would be raised.

+ +

github +View the Diff on Github

+ +

Custom Filtering

+ +

Sometimes WHERE clauses are more complex, such as prefix queries. Here we’ll query all employees whose age is greater than or equal to a given number.

+ +

github +View the Diff on Github

+ +

Sorting

+ +

Sorting comes for free, but here’s a test for it. Decide as a team if we actually need to write a spec here, or if it’s considered tested within the libraries.

+ +

github +View the Diff on Github

+ +

Custom Sorting

+ +

Sometimes we need more than a simple ORDER BY clause, for example maybe we need to join on another table. In this example, we switch from Postgres’s default case-sensitive query to a case in-sensitive one…but only for the first_name field.

+ +

github +View the Diff on Github

+ +

Pagination

+ +

Pagination also comes for free, so once again we’ll have to decide if writing a spec like this is worth the bother.

+ +

github +View the Diff on Github

+ +

Custom Pagination

+ +

By default we use the Kaminari library for pagination. This shows how we could instead sub-out Kaminari and replace it with will_paginate

+ +

github +View the Diff on Github

+ +

Statistics

+ +

For default statistics, (count, sum, average, maximum and minimum), simply specify the field and statistic.

+ +

github +View the Diff on Github

+ +

Custom Statistics

+ +

Here we add a median statistic to show non-standard custom statistic usage.

+ +

github +View the Diff on Github

+ +

Custom Serialization

+ +

Let’s say we wanted the employee’s age to serialize Thirty-Two instead of 32 in JSON. Here we use a library to get the friendly-word doppleganger, and change the test to recognize this custom logic.

+ +

github +View the Diff on Github

+ +

Has-Many Association

+ +

Get employees and their positions in one call.

+ +

github +View the Diff on Github

+ +

Belongs-To Association

+ +

Get employees, positions, and the department for those positions in one call:

+ +

github +View the Diff on Github

+ +

Many-to-Many

+ +

In this example an Employee has many Teams and a Team has many Employees.

+ +

github +View the Diff on Github

+ +

Resource Re-Use

+ +

In prior steps we created PositionResource and DepartmentResource. These objects may have custom sort logic, filter whitelists, etc - this configuration can be re-used if we need to add /api/v1/positions and /api/v1/departments endpoints.

+ +

github +View the Diff on Github

+ +

Filter/Sort/Paginate Associations

+ +

This comes for free. As long as the associated Resource knows how to do something, we can re-use that logic.

+ +

github +View the Diff on Github

+ +

Error Handling

+ +

In this example we add global error handling, so any random error will return a JSONAPI-compatible error response. Then we customize that response for a specific scenario (the requested employee does not exist).

+ +

github +View the Diff on Github

+ +

Writes

+ +

Basic Create

+ +

Basic example without validations or strong parameters.

+ +

github +View the Diff on Github

+ +

Validations

+ +

Validations are basic, vanilla Rails code. When there is a validation error, we return a jsonapi-compatible error respone.

+ +

github +View the Diff on Github

+ +

Strong Resources

+ +

The biggest problem with strong_parameters is that we might want to create an employee from the /employees endpoint, or we might want to create a position with an employee at the same time from /positions. Maintaining the same strong parameter hash across a number of places is difficult.

+ +

Instead we use strong_resources to define the parameter template once, and re-use. This has the added benefit of being built on top of stronger_parameters, which gives us type checking and coercion.

+ +

Note: strong_resources requires Rails.

+ +

github +View the Diff on Github

+ +

Basic Update

+ +

Looks very similar to create.

+ +

github +View the Diff on Github

+ +

Basic Destroy

+ +

More or less basic Rails.

+ +

github +View the Diff on Github

+ +

Customizing Persistence

+ +

So far we’ve shown ActiveRecord. What if we wanted to use a different ORM, or ElasticSearch? What if we wanted ‘side effects’ such as “send a confirmation email after creating the user”?

+ +

This code shows how to customize create/update/destroy. In this example we’re simply logging the action, but you could do whatever you want here as long as you return an instance of the object. Just like with reads, if any of this code becomes duplicative across Resource objects you could move it into a common Adapter.

+ +

github +View the Diff on Github

+ +

Association Writes

+ +

Nested Creates

+ +

Think Rails’ accepts_nested_attributes_for, but not coupled to Rails or ActiveRecord. Here we create an Employee, a Position for the employee, and a Department for the position in one call. This is helpful when dealing with nested forms!

+ +

Once again, note how our strong_resources can be shared across controllers.

+ +

github +View the Diff on Github

+ +

Nested Updates

+ +

We got this for free, here’s a spec!

+ +

github +View the Diff on Github

+ +

Nested Destroys

+ +

We get this for free, though we have to explicitly tell strong_resources that destroys are allowed from this endpoint.

+ +

Note destroy will do two things: delete the object, and make the foreign key on the corresponding child in the payload null.

+ +

github +View the Diff on Github

+ +

Disassociations

+ +

destroy actually deletes objects, what if we want to simply disassociate the objects by making the foreign key null? We get this for free, too.

+ +

github +View the Diff on Github

+ +

Usage without ActiveRecord

+ +

Let’s say the departments come from a service call. Here’s the change to +the /departments endpoint.

+ +

Make the model a PORO:

+ +
# app/models/position.rb
+
+# belongs_to :department, optional: true
+attr_accessor :department
+ +

Use {} as our base scope instead of ActiveRecord::Relation:

+ +
# app/controllers/departments_controller.rb
+def index
+  # render_jsonapi(Department.all)
+  render_jsonapi({})
+end
+ +

Customize resolve for the new hash-based scope:

+ +
# app/resources/department_resource.rb
+use_adapter JsonapiCompliable::Adapters::Null
+
+def resolve(scope)
+  Department.where(scope)
+end
+ +

Department.where is our contract for resolving the scope. The underlying Department code could use an HTTP client, alternate datastore, what-have-you.

+ +

Let’s also change our code for sideloading departments at /api/v1/employees?include=departments:

+ +
# app/resources/position_resource.rb
+
+# belongs_to :department,
+#   scope: -> { Department.all },
+#   foreign_key: :department_id,
+#   resource: DepartmentResource
+
+allow_sideload :department, resource: DepartmentResource do
+  scope do |employees|
+    Department.where(employee_id: employees.map(&:id))
+  end
+
+  assign do |employees, departments|
+    employees.each do |e|
+      e.department = departments.find { |d| d.employee_id == e.id }
+    end
+  end
+end
+ +

As you can see, we’re delving into a lower-level DSL to customize. You +probably want to package up these changes into an Adapter. The ActiveRecord adapter is simple packaging up similar low-level defaults. Your app may require an HTTPAdapter or ServiceAdapter, or you can make one-off customizations as shown above.

+ +

ElasticSearch

+ +

Similar to a service call, here’s how we might incorporate the elasticsearch trample gem.

+ +

Make our base scope an instance of our Trample client:

+ +
# app/controllers/employees_controller.rb
+  def index
+    # render_jsonapi(Employee.all)
+    render_jsonapi(Search::Employee.new)
+  end
+end
+ +

Customize the resource using the Trample Client API:

+ +
# app/resources/employee_resource.rb
+use_adapter JsonapiCompliable::Adapters::Null
+
+allow_filter :first_name do |scope, value|
+  scope.condition(:first_name).eq(value)
+end
+
+allow_filter :first_name_prefix do |scope, value|
+  scope.condition(:first_name).starts_with(value)
+end
+
+def resolve(scope)
+  scope.query!
+  scope.results
+end
+ +

Once again, you probably want to package these changes into an Adapter.

+ +

Client-Side

+ +

JSORM

+ +

There are number of jsonapi clients in a variety of languages. Here we’ll be using JSORM - an ActiveRecord-style ORM that can be used from Node or the browser. It’s been custom-built to work with JSONAPI Suite enhancements.

+ +

This will fetch an employee with id 123, their last 3 positions where the title starts with ‘dev’, and the departments for those positions.

+ +

We’ll use typescript for this example, though we could use vanilla JS just as well. First define our models (additional client-side business logic can go in these classes):

+ +
import { JSORMBase, Model, Attr, HasMany, BelongsTo } from "jsorm"
+
+@Model()
+class ApplicationRecord extends JSORMBase {
+  static baseUrl = "http://localhost:3000"
+  static apiNamespace = "/api/v1"
+}
+
+@Model()
+class Employee extends ApplicationRecord {
+  static jsonapiType = "people"
+
+  @Attr() firstName: string
+  @Attr() lastName: string
+  @Attr() age: number
+
+  @HasMany() positions: Position[]
+}
+
+@Model()
+class Position extends ApplicationRecord {
+  static jsonapiType = "positions"
+
+  @Attr() title: string
+
+  @BelongsTo() department: Department[]
+}
+
+@Model()
+class Department extends ApplicationRecord {
+  static jsonapiType = "departments"
+
+  @Attr() name: string
+}
+ +

Now fetch the data in one call:

+ +
let positionScope = Position
+  .where({ title_prefix: "dev" })
+  .order({ created_at: "desc" })
+
+let scope = Employee
+  .includes({ positions: "department" })
+  .merge({ positions: positionScope })
+
+let employee = (await scope.find(123)).data
+// access data like so in HTML:
+// employee.positions[0].department.name
+}
+ +

Read the JSORM documentation here

+ +

VueJS Sample Application

+ +

vue

+ +

JSORM can be used with the client-side framework of your choice. To give an example of real-world usage, we’ve created a demo application using +VueJS. Vue is lightweight and provides the +bare-bones we need to illustrate JSONAPI and JSORM in action.

+ +

This will point to a slightly-tweaked branch of the server-side API +above.

+ +

Let’s create our app.

+ +

Step 0: Setup

+ +

We’ve started with a basic Vue app configured with Webpack. None of this +is JSONAPI-specific, just boilerplate to get started quickly.

+ +

github +View the Branch on Github

+ +

Step 1: Models

+ +

We’ll start by defining our models, which should look very familiar if +you’ve worked with ActiveRecord. Again, see the JSORM +documentation if any of this looks confusing to you.

+ +

github +View the Diff on Github

+ +

Step 2: Data Grid

+ +

We’ll add a simple data grid to our page listing all Employees. This +will turn into a search grid, but for now we’re simply loading employees +via Employee.all()

+ +

github +View the Diff on Github

+ +

Step 3: Adding Relationships

+ +

Here we’ve added a currentPosition relationship to avoid fetching +excess data from the server. When the page loads we fetch the +employees, current positions for those employees, and the departments for those positions.

+ +

github +View the Diff on Github

+ +

Step 4: Filtering

+ +

Here we’ve added a bit of state to the page, query, which will be +bound to the form inputs. We pass query to Employee.where to +successfully query employees by first and last name.

+ +

github +View the Diff on Github

+ +

Step 5: Sorting

+ +

Just like with filters, we add a bit of state to our page to track +sorting parameters. When the user clicks a table header, we’ll update +that state and pass it to our query.

+ +

github +View the Diff on Github

+ +

Step 6: Stats

+ +

A JSORM promise returns a response object with a data key - the +model instance(s) we’ve been referencing so far. It also returns a +meta key that reflects the meta section of the JSONAPI response.

+ +

Here we’ll request the total count of employees in our query to the +server, grab that total count from meta, and bind it to the page as +totalCount

+ +

github +View the Diff on Github

+ +

Step 7: Pagination

+ +

Building on what we’ve already done, we can apply a similar pattern for +pagination. We add the currentPage state and alter it when the user +clicks pagination links. We use currentPage and totalCount to figure +out if we should display previous/next page links.

+ +

github +View the Diff on Github

+ +

Step 8: Basic Form Setup

+ +

We’ll be adding a form to create and update employees. This step just +adds the relevant HTML and Vue code to get set up, before involving +JSORM.

+ +

github +View the Diff on Github

+ +

Step 9: Dropdowns

+ +

Our form will submit employees, positions and departments in a single +request. We associate a position to an existing department through a +select dropdown. To populate that dropdown, we fetch all departments +from the server and bind it to the select.

+ +

github +View the Diff on Github

+ +

Step 10: Nested Create/Update

+ +

This step simply binds our instantiated models to the form. When the +form is submitted, we save everything in a single one-line request.

+ +

After the form submission, we could edit the form and submit again - +JSORM will know to PATCH an update to the appropriate URL +automatically.

+ +

Note we could also edit our search to immediately reflect the new +data…but this is more Vue-specific than anything to do with JSORM, so +we’ll hold off until the last step.

+ +

github +View the Diff on Github

+ +

Step 11: Validations

+ +

Our server-side code will automatically handle validation errors and +give us a well-formatted response. JSORM will read that response and +automatically apply error objects to our model instances. Here we +display simple error messages without involving any JS code.

+ +

github +View the Diff on Github

+ +

Step 12: Nested Destroy

+ +

This step adds buttons to our form that will add and remove positions +for a given employee. To add, we simply push a new Employee onto the +relationship array. To remove, we set isMarkedForDestruction = true, +which allows for “unsaved deleted records”. This follows a similar +pattern to one introduced in Ember Data, explained here.

+ +

Note that if we wanted to disassociate the position rather than +destroying the underlying record, we could use +position.isMarkedForDisassociation = true.

+ +

github +View the Diff on Github

+ +

Step 13: VueJS Wrap-up

+ +

Our final step adds some Vue-specific functionality - we add an +EventBus to allow selecting an employee from the grid and binding it +to the form, and refresh the search grid after each form submission.

+ +

github +View the Diff on Github

+ +


+

+ +
+
+
+ + + + + + diff --git a/assets/css/syntax.css b/assets/css/syntax.css new file mode 100644 index 0000000..2774b76 --- /dev/null +++ b/assets/css/syntax.css @@ -0,0 +1,60 @@ +.highlight { background: #ffffff; } +.highlight .c { color: #999988; font-style: italic } /* Comment */ +.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +.highlight .k { font-weight: bold } /* Keyword */ +.highlight .o { font-weight: bold } /* Operator */ +.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ +.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ +.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #aa0000 } /* Generic.Error */ +.highlight .gh { color: #999999 } /* Generic.Heading */ +.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ +.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #555555 } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #aaaaaa } /* Generic.Subheading */ +.highlight .gt { color: #aa0000 } /* Generic.Traceback */ +.highlight .kc { font-weight: bold } /* Keyword.Constant */ +.highlight .kd { font-weight: bold } /* Keyword.Declaration */ +.highlight .kp { font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #009999 } /* Literal.Number */ +.highlight .s { color: #d14 } /* Literal.String */ +.highlight .na { color: #008080 } /* Name.Attribute */ +.highlight .nb { color: #0086B3 } /* Name.Builtin */ +.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ +.highlight .no { color: #008080 } /* Name.Constant */ +.highlight .ni { color: #800080 } /* Name.Entity */ +.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ +.highlight .nn { color: #555555 } /* Name.Namespace */ +.highlight .nt { color: #000080 } /* Name.Tag */ +.highlight .nv { color: #008080 } /* Name.Variable */ +.highlight .ow { font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #009999 } /* Literal.Number.Float */ +.highlight .mh { color: #009999 } /* Literal.Number.Hex */ +.highlight .mi { color: #009999 } /* Literal.Number.Integer */ +.highlight .mo { color: #009999 } /* Literal.Number.Oct */ +.highlight .sb { color: #d14 } /* Literal.String.Backtick */ +.highlight .sc { color: #d14 } /* Literal.String.Char */ +.highlight .sd { color: #d14 } /* Literal.String.Doc */ +.highlight .s2 { color: #d14 } /* Literal.String.Double */ +.highlight .se { color: #d14 } /* Literal.String.Escape */ +.highlight .sh { color: #d14 } /* Literal.String.Heredoc */ +.highlight .si { color: #d14 } /* Literal.String.Interpol */ +.highlight .sx { color: #d14 } /* Literal.String.Other */ +.highlight .sr { color: #009926 } /* Literal.String.Regex */ +.highlight .s1 { color: #d14 } /* Literal.String.Single */ +.highlight .ss { color: #990073 } /* Literal.String.Symbol */ +.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #008080 } /* Name.Variable.Class */ +.highlight .vg { color: #008080 } /* Name.Variable.Global */ +.highlight .vi { color: #008080 } /* Name.Variable.Instance */ +.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ diff --git a/assets/img/3_posts_json.png b/assets/img/3_posts_json.png new file mode 100644 index 0000000..574d858 Binary files /dev/null and b/assets/img/3_posts_json.png differ diff --git a/assets/img/GitHub-Mark-32px.png b/assets/img/GitHub-Mark-32px.png new file mode 100644 index 0000000..8b25551 Binary files /dev/null and b/assets/img/GitHub-Mark-32px.png differ diff --git a/assets/img/bg.png b/assets/img/bg.png new file mode 100755 index 0000000..b0d07bd Binary files /dev/null and b/assets/img/bg.png differ diff --git a/assets/img/bg2.png b/assets/img/bg2.png new file mode 100755 index 0000000..b03cd34 Binary files /dev/null and b/assets/img/bg2.png differ diff --git a/assets/img/bg3.png b/assets/img/bg3.png new file mode 100755 index 0000000..5350254 Binary files /dev/null and b/assets/img/bg3.png differ diff --git a/assets/img/bg4.png b/assets/img/bg4.png new file mode 100755 index 0000000..3cbbbc3 Binary files /dev/null and b/assets/img/bg4.png differ diff --git a/assets/img/bg_play_pause.png b/assets/img/bg_play_pause.png new file mode 100755 index 0000000..aa3eb56 Binary files /dev/null and b/assets/img/bg_play_pause.png differ diff --git a/assets/img/circle-icons/full-color/anchor.png b/assets/img/circle-icons/full-color/anchor.png new file mode 100755 index 0000000..f62df6f Binary files /dev/null and b/assets/img/circle-icons/full-color/anchor.png differ diff --git a/assets/img/circle-icons/full-color/arrow-down.png b/assets/img/circle-icons/full-color/arrow-down.png new file mode 100755 index 0000000..4abf2be Binary files /dev/null and b/assets/img/circle-icons/full-color/arrow-down.png differ diff --git a/assets/img/circle-icons/full-color/arrow-up.png b/assets/img/circle-icons/full-color/arrow-up.png new file mode 100755 index 0000000..7c803ed Binary files /dev/null and b/assets/img/circle-icons/full-color/arrow-up.png differ diff --git a/assets/img/circle-icons/full-color/art.png b/assets/img/circle-icons/full-color/art.png new file mode 100755 index 0000000..c2a4cd5 Binary files /dev/null and b/assets/img/circle-icons/full-color/art.png differ diff --git a/assets/img/circle-icons/full-color/barchart.png b/assets/img/circle-icons/full-color/barchart.png new file mode 100755 index 0000000..e843fbc Binary files /dev/null and b/assets/img/circle-icons/full-color/barchart.png differ diff --git a/assets/img/circle-icons/full-color/bike.png b/assets/img/circle-icons/full-color/bike.png new file mode 100755 index 0000000..dace4a3 Binary files /dev/null and b/assets/img/circle-icons/full-color/bike.png differ diff --git a/assets/img/circle-icons/full-color/biker.png b/assets/img/circle-icons/full-color/biker.png new file mode 100755 index 0000000..9b93e12 Binary files /dev/null and b/assets/img/circle-icons/full-color/biker.png differ diff --git a/assets/img/circle-icons/full-color/bikewheel.png b/assets/img/circle-icons/full-color/bikewheel.png new file mode 100755 index 0000000..88f7ed0 Binary files /dev/null and b/assets/img/circle-icons/full-color/bikewheel.png differ diff --git a/assets/img/circle-icons/full-color/blimp.png b/assets/img/circle-icons/full-color/blimp.png new file mode 100755 index 0000000..1f27905 Binary files /dev/null and b/assets/img/circle-icons/full-color/blimp.png differ diff --git a/assets/img/circle-icons/full-color/bomb.png b/assets/img/circle-icons/full-color/bomb.png new file mode 100755 index 0000000..43eacb3 Binary files /dev/null and b/assets/img/circle-icons/full-color/bomb.png differ diff --git a/assets/img/circle-icons/full-color/booklet.png b/assets/img/circle-icons/full-color/booklet.png new file mode 100755 index 0000000..b7d5db9 Binary files /dev/null and b/assets/img/circle-icons/full-color/booklet.png differ diff --git a/assets/img/circle-icons/full-color/bookshelf.png b/assets/img/circle-icons/full-color/bookshelf.png new file mode 100755 index 0000000..9fa1bbe Binary files /dev/null and b/assets/img/circle-icons/full-color/bookshelf.png differ diff --git a/assets/img/circle-icons/full-color/briefcase.png b/assets/img/circle-icons/full-color/briefcase.png new file mode 100755 index 0000000..da4916f Binary files /dev/null and b/assets/img/circle-icons/full-color/briefcase.png differ diff --git a/assets/img/circle-icons/full-color/browser.png b/assets/img/circle-icons/full-color/browser.png new file mode 100755 index 0000000..4fde478 Binary files /dev/null and b/assets/img/circle-icons/full-color/browser.png differ diff --git a/assets/img/circle-icons/full-color/calculator.png b/assets/img/circle-icons/full-color/calculator.png new file mode 100755 index 0000000..643013b Binary files /dev/null and b/assets/img/circle-icons/full-color/calculator.png differ diff --git a/assets/img/circle-icons/full-color/calendar.png b/assets/img/circle-icons/full-color/calendar.png new file mode 100755 index 0000000..bf1aa52 Binary files /dev/null and b/assets/img/circle-icons/full-color/calendar.png differ diff --git a/assets/img/circle-icons/full-color/camera.png b/assets/img/circle-icons/full-color/camera.png new file mode 100755 index 0000000..c09ab78 Binary files /dev/null and b/assets/img/circle-icons/full-color/camera.png differ diff --git a/assets/img/circle-icons/full-color/car.png b/assets/img/circle-icons/full-color/car.png new file mode 100755 index 0000000..c8f3376 Binary files /dev/null and b/assets/img/circle-icons/full-color/car.png differ diff --git a/assets/img/circle-icons/full-color/cart.png b/assets/img/circle-icons/full-color/cart.png new file mode 100755 index 0000000..1cfd510 Binary files /dev/null and b/assets/img/circle-icons/full-color/cart.png differ diff --git a/assets/img/circle-icons/full-color/carwheel.png b/assets/img/circle-icons/full-color/carwheel.png new file mode 100755 index 0000000..a91d5f2 Binary files /dev/null and b/assets/img/circle-icons/full-color/carwheel.png differ diff --git a/assets/img/circle-icons/full-color/caution.png b/assets/img/circle-icons/full-color/caution.png new file mode 100755 index 0000000..f2ca795 Binary files /dev/null and b/assets/img/circle-icons/full-color/caution.png differ diff --git a/assets/img/circle-icons/full-color/chat.png b/assets/img/circle-icons/full-color/chat.png new file mode 100755 index 0000000..cf2d194 Binary files /dev/null and b/assets/img/circle-icons/full-color/chat.png differ diff --git a/assets/img/circle-icons/full-color/check.png b/assets/img/circle-icons/full-color/check.png new file mode 100755 index 0000000..641c02a Binary files /dev/null and b/assets/img/circle-icons/full-color/check.png differ diff --git a/assets/img/circle-icons/full-color/clipboard.png b/assets/img/circle-icons/full-color/clipboard.png new file mode 100755 index 0000000..6a0412c Binary files /dev/null and b/assets/img/circle-icons/full-color/clipboard.png differ diff --git a/assets/img/circle-icons/full-color/clock.png b/assets/img/circle-icons/full-color/clock.png new file mode 100755 index 0000000..f069bdb Binary files /dev/null and b/assets/img/circle-icons/full-color/clock.png differ diff --git a/assets/img/circle-icons/full-color/cloud.png b/assets/img/circle-icons/full-color/cloud.png new file mode 100755 index 0000000..688055d Binary files /dev/null and b/assets/img/circle-icons/full-color/cloud.png differ diff --git a/assets/img/circle-icons/full-color/compass.png b/assets/img/circle-icons/full-color/compass.png new file mode 100755 index 0000000..98d463f Binary files /dev/null and b/assets/img/circle-icons/full-color/compass.png differ diff --git a/assets/img/circle-icons/full-color/compose.png b/assets/img/circle-icons/full-color/compose.png new file mode 100755 index 0000000..e8faa03 Binary files /dev/null and b/assets/img/circle-icons/full-color/compose.png differ diff --git a/assets/img/circle-icons/full-color/computer.png b/assets/img/circle-icons/full-color/computer.png new file mode 100755 index 0000000..f6c28e7 Binary files /dev/null and b/assets/img/circle-icons/full-color/computer.png differ diff --git a/assets/img/circle-icons/full-color/cone.png b/assets/img/circle-icons/full-color/cone.png new file mode 100755 index 0000000..1f6812c Binary files /dev/null and b/assets/img/circle-icons/full-color/cone.png differ diff --git a/assets/img/circle-icons/full-color/contacts.png b/assets/img/circle-icons/full-color/contacts.png new file mode 100755 index 0000000..fc5306c Binary files /dev/null and b/assets/img/circle-icons/full-color/contacts.png differ diff --git a/assets/img/circle-icons/full-color/creditcard.png b/assets/img/circle-icons/full-color/creditcard.png new file mode 100755 index 0000000..45dc32b Binary files /dev/null and b/assets/img/circle-icons/full-color/creditcard.png differ diff --git a/assets/img/circle-icons/full-color/crossroads.png b/assets/img/circle-icons/full-color/crossroads.png new file mode 100755 index 0000000..64117b9 Binary files /dev/null and b/assets/img/circle-icons/full-color/crossroads.png differ diff --git a/assets/img/circle-icons/full-color/cruise.png b/assets/img/circle-icons/full-color/cruise.png new file mode 100755 index 0000000..8bdab3d Binary files /dev/null and b/assets/img/circle-icons/full-color/cruise.png differ diff --git a/assets/img/circle-icons/full-color/denied.png b/assets/img/circle-icons/full-color/denied.png new file mode 100755 index 0000000..b357048 Binary files /dev/null and b/assets/img/circle-icons/full-color/denied.png differ diff --git a/assets/img/circle-icons/full-color/dev.png b/assets/img/circle-icons/full-color/dev.png new file mode 100755 index 0000000..fd92d66 Binary files /dev/null and b/assets/img/circle-icons/full-color/dev.png differ diff --git a/assets/img/circle-icons/full-color/die.png b/assets/img/circle-icons/full-color/die.png new file mode 100755 index 0000000..ad7fdaf Binary files /dev/null and b/assets/img/circle-icons/full-color/die.png differ diff --git a/assets/img/circle-icons/full-color/document.png b/assets/img/circle-icons/full-color/document.png new file mode 100755 index 0000000..9b120cf Binary files /dev/null and b/assets/img/circle-icons/full-color/document.png differ diff --git a/assets/img/circle-icons/full-color/dolly.png b/assets/img/circle-icons/full-color/dolly.png new file mode 100755 index 0000000..651a225 Binary files /dev/null and b/assets/img/circle-icons/full-color/dolly.png differ diff --git a/assets/img/circle-icons/full-color/door.png b/assets/img/circle-icons/full-color/door.png new file mode 100755 index 0000000..59b5d5d Binary files /dev/null and b/assets/img/circle-icons/full-color/door.png differ diff --git a/assets/img/circle-icons/full-color/download.png b/assets/img/circle-icons/full-color/download.png new file mode 100755 index 0000000..f2f6686 Binary files /dev/null and b/assets/img/circle-icons/full-color/download.png differ diff --git a/assets/img/circle-icons/full-color/email.png b/assets/img/circle-icons/full-color/email.png new file mode 100755 index 0000000..53a3601 Binary files /dev/null and b/assets/img/circle-icons/full-color/email.png differ diff --git a/assets/img/circle-icons/full-color/eye.png b/assets/img/circle-icons/full-color/eye.png new file mode 100755 index 0000000..f2dd2aa Binary files /dev/null and b/assets/img/circle-icons/full-color/eye.png differ diff --git a/assets/img/circle-icons/full-color/fashion.png b/assets/img/circle-icons/full-color/fashion.png new file mode 100755 index 0000000..58e3680 Binary files /dev/null and b/assets/img/circle-icons/full-color/fashion.png differ diff --git a/assets/img/circle-icons/full-color/flag.png b/assets/img/circle-icons/full-color/flag.png new file mode 100755 index 0000000..67a699b Binary files /dev/null and b/assets/img/circle-icons/full-color/flag.png differ diff --git a/assets/img/circle-icons/full-color/flame.png b/assets/img/circle-icons/full-color/flame.png new file mode 100755 index 0000000..f9b4488 Binary files /dev/null and b/assets/img/circle-icons/full-color/flame.png differ diff --git a/assets/img/circle-icons/full-color/folder.png b/assets/img/circle-icons/full-color/folder.png new file mode 100755 index 0000000..860e866 Binary files /dev/null and b/assets/img/circle-icons/full-color/folder.png differ diff --git a/assets/img/circle-icons/full-color/gas.png b/assets/img/circle-icons/full-color/gas.png new file mode 100755 index 0000000..7b9f04b Binary files /dev/null and b/assets/img/circle-icons/full-color/gas.png differ diff --git a/assets/img/circle-icons/full-color/gear.png b/assets/img/circle-icons/full-color/gear.png new file mode 100755 index 0000000..766883b Binary files /dev/null and b/assets/img/circle-icons/full-color/gear.png differ diff --git a/assets/img/circle-icons/full-color/genius.png b/assets/img/circle-icons/full-color/genius.png new file mode 100755 index 0000000..cfe0c75 Binary files /dev/null and b/assets/img/circle-icons/full-color/genius.png differ diff --git a/assets/img/circle-icons/full-color/global.png b/assets/img/circle-icons/full-color/global.png new file mode 100755 index 0000000..25fe37a Binary files /dev/null and b/assets/img/circle-icons/full-color/global.png differ diff --git a/assets/img/circle-icons/full-color/globe.png b/assets/img/circle-icons/full-color/globe.png new file mode 100755 index 0000000..63416dc Binary files /dev/null and b/assets/img/circle-icons/full-color/globe.png differ diff --git a/assets/img/circle-icons/full-color/gps.png b/assets/img/circle-icons/full-color/gps.png new file mode 100755 index 0000000..f4d4a4e Binary files /dev/null and b/assets/img/circle-icons/full-color/gps.png differ diff --git a/assets/img/circle-icons/full-color/hazard.png b/assets/img/circle-icons/full-color/hazard.png new file mode 100755 index 0000000..13cbcf3 Binary files /dev/null and b/assets/img/circle-icons/full-color/hazard.png differ diff --git a/assets/img/circle-icons/full-color/heart.png b/assets/img/circle-icons/full-color/heart.png new file mode 100755 index 0000000..fb62d2b Binary files /dev/null and b/assets/img/circle-icons/full-color/heart.png differ diff --git a/assets/img/circle-icons/full-color/helicopter.png b/assets/img/circle-icons/full-color/helicopter.png new file mode 100755 index 0000000..e1e1c83 Binary files /dev/null and b/assets/img/circle-icons/full-color/helicopter.png differ diff --git a/assets/img/circle-icons/full-color/hotair.png b/assets/img/circle-icons/full-color/hotair.png new file mode 100755 index 0000000..7b61505 Binary files /dev/null and b/assets/img/circle-icons/full-color/hotair.png differ diff --git a/assets/img/circle-icons/full-color/hourglass.png b/assets/img/circle-icons/full-color/hourglass.png new file mode 100755 index 0000000..f50c7c2 Binary files /dev/null and b/assets/img/circle-icons/full-color/hourglass.png differ diff --git a/assets/img/circle-icons/full-color/image.png b/assets/img/circle-icons/full-color/image.png new file mode 100755 index 0000000..d96234b Binary files /dev/null and b/assets/img/circle-icons/full-color/image.png differ diff --git a/assets/img/circle-icons/full-color/interstate.png b/assets/img/circle-icons/full-color/interstate.png new file mode 100755 index 0000000..1bbc1af Binary files /dev/null and b/assets/img/circle-icons/full-color/interstate.png differ diff --git a/assets/img/circle-icons/full-color/key.png b/assets/img/circle-icons/full-color/key.png new file mode 100755 index 0000000..dafc1f5 Binary files /dev/null and b/assets/img/circle-icons/full-color/key.png differ diff --git a/assets/img/circle-icons/full-color/lightbulb.png b/assets/img/circle-icons/full-color/lightbulb.png new file mode 100755 index 0000000..b7fdd80 Binary files /dev/null and b/assets/img/circle-icons/full-color/lightbulb.png differ diff --git a/assets/img/circle-icons/full-color/location.png b/assets/img/circle-icons/full-color/location.png new file mode 100755 index 0000000..ecbba02 Binary files /dev/null and b/assets/img/circle-icons/full-color/location.png differ diff --git a/assets/img/circle-icons/full-color/locked.png b/assets/img/circle-icons/full-color/locked.png new file mode 100755 index 0000000..bd06c21 Binary files /dev/null and b/assets/img/circle-icons/full-color/locked.png differ diff --git a/assets/img/circle-icons/full-color/magnifyingglass.png b/assets/img/circle-icons/full-color/magnifyingglass.png new file mode 100755 index 0000000..c0f154a Binary files /dev/null and b/assets/img/circle-icons/full-color/magnifyingglass.png differ diff --git a/assets/img/circle-icons/full-color/mail.png b/assets/img/circle-icons/full-color/mail.png new file mode 100755 index 0000000..3d715bc Binary files /dev/null and b/assets/img/circle-icons/full-color/mail.png differ diff --git a/assets/img/circle-icons/full-color/map.png b/assets/img/circle-icons/full-color/map.png new file mode 100755 index 0000000..da9b202 Binary files /dev/null and b/assets/img/circle-icons/full-color/map.png differ diff --git a/assets/img/circle-icons/full-color/merge.png b/assets/img/circle-icons/full-color/merge.png new file mode 100755 index 0000000..0c2c813 Binary files /dev/null and b/assets/img/circle-icons/full-color/merge.png differ diff --git a/assets/img/circle-icons/full-color/mic.png b/assets/img/circle-icons/full-color/mic.png new file mode 100755 index 0000000..28a3cd1 Binary files /dev/null and b/assets/img/circle-icons/full-color/mic.png differ diff --git a/assets/img/circle-icons/full-color/money.png b/assets/img/circle-icons/full-color/money.png new file mode 100755 index 0000000..ae873a8 Binary files /dev/null and b/assets/img/circle-icons/full-color/money.png differ diff --git a/assets/img/circle-icons/full-color/motorcycle.png b/assets/img/circle-icons/full-color/motorcycle.png new file mode 100755 index 0000000..7f0db95 Binary files /dev/null and b/assets/img/circle-icons/full-color/motorcycle.png differ diff --git a/assets/img/circle-icons/full-color/music.png b/assets/img/circle-icons/full-color/music.png new file mode 100755 index 0000000..6bee856 Binary files /dev/null and b/assets/img/circle-icons/full-color/music.png differ diff --git a/assets/img/circle-icons/full-color/news.png b/assets/img/circle-icons/full-color/news.png new file mode 100755 index 0000000..58802ff Binary files /dev/null and b/assets/img/circle-icons/full-color/news.png differ diff --git a/assets/img/circle-icons/full-color/parachute.png b/assets/img/circle-icons/full-color/parachute.png new file mode 100755 index 0000000..a488bbf Binary files /dev/null and b/assets/img/circle-icons/full-color/parachute.png differ diff --git a/assets/img/circle-icons/full-color/pencil.png b/assets/img/circle-icons/full-color/pencil.png new file mode 100755 index 0000000..8b49189 Binary files /dev/null and b/assets/img/circle-icons/full-color/pencil.png differ diff --git a/assets/img/circle-icons/full-color/phone.png b/assets/img/circle-icons/full-color/phone.png new file mode 100755 index 0000000..9d1ee39 Binary files /dev/null and b/assets/img/circle-icons/full-color/phone.png differ diff --git a/assets/img/circle-icons/full-color/pie-chart.png b/assets/img/circle-icons/full-color/pie-chart.png new file mode 100755 index 0000000..068764d Binary files /dev/null and b/assets/img/circle-icons/full-color/pie-chart.png differ diff --git a/assets/img/circle-icons/full-color/pin.png b/assets/img/circle-icons/full-color/pin.png new file mode 100755 index 0000000..2e909f2 Binary files /dev/null and b/assets/img/circle-icons/full-color/pin.png differ diff --git a/assets/img/circle-icons/full-color/pin2.png b/assets/img/circle-icons/full-color/pin2.png new file mode 100755 index 0000000..8e7a20a Binary files /dev/null and b/assets/img/circle-icons/full-color/pin2.png differ diff --git a/assets/img/circle-icons/full-color/plane.png b/assets/img/circle-icons/full-color/plane.png new file mode 100755 index 0000000..67842a4 Binary files /dev/null and b/assets/img/circle-icons/full-color/plane.png differ diff --git a/assets/img/circle-icons/full-color/present.png b/assets/img/circle-icons/full-color/present.png new file mode 100755 index 0000000..785d1e9 Binary files /dev/null and b/assets/img/circle-icons/full-color/present.png differ diff --git a/assets/img/circle-icons/full-color/profle.png b/assets/img/circle-icons/full-color/profle.png new file mode 100755 index 0000000..4d46ece Binary files /dev/null and b/assets/img/circle-icons/full-color/profle.png differ diff --git a/assets/img/circle-icons/full-color/quote.png b/assets/img/circle-icons/full-color/quote.png new file mode 100755 index 0000000..47c84bb Binary files /dev/null and b/assets/img/circle-icons/full-color/quote.png differ diff --git a/assets/img/circle-icons/full-color/racingflags.png b/assets/img/circle-icons/full-color/racingflags.png new file mode 100755 index 0000000..ff503c0 Binary files /dev/null and b/assets/img/circle-icons/full-color/racingflags.png differ diff --git a/assets/img/circle-icons/full-color/rainbow.png b/assets/img/circle-icons/full-color/rainbow.png new file mode 100755 index 0000000..e4abd3a Binary files /dev/null and b/assets/img/circle-icons/full-color/rainbow.png differ diff --git a/assets/img/circle-icons/full-color/recycle.png b/assets/img/circle-icons/full-color/recycle.png new file mode 100755 index 0000000..6117333 Binary files /dev/null and b/assets/img/circle-icons/full-color/recycle.png differ diff --git a/assets/img/circle-icons/full-color/ribbon.png b/assets/img/circle-icons/full-color/ribbon.png new file mode 100755 index 0000000..391db0e Binary files /dev/null and b/assets/img/circle-icons/full-color/ribbon.png differ diff --git a/assets/img/circle-icons/full-color/roadblock.png b/assets/img/circle-icons/full-color/roadblock.png new file mode 100755 index 0000000..e6d4217 Binary files /dev/null and b/assets/img/circle-icons/full-color/roadblock.png differ diff --git a/assets/img/circle-icons/full-color/rocket.png b/assets/img/circle-icons/full-color/rocket.png new file mode 100755 index 0000000..3960f0f Binary files /dev/null and b/assets/img/circle-icons/full-color/rocket.png differ diff --git a/assets/img/circle-icons/full-color/running.png b/assets/img/circle-icons/full-color/running.png new file mode 100755 index 0000000..967eb4a Binary files /dev/null and b/assets/img/circle-icons/full-color/running.png differ diff --git a/assets/img/circle-icons/full-color/sailboat.png b/assets/img/circle-icons/full-color/sailboat.png new file mode 100755 index 0000000..50c317b Binary files /dev/null and b/assets/img/circle-icons/full-color/sailboat.png differ diff --git a/assets/img/circle-icons/full-color/schooolbus.png b/assets/img/circle-icons/full-color/schooolbus.png new file mode 100755 index 0000000..4f5ce72 Binary files /dev/null and b/assets/img/circle-icons/full-color/schooolbus.png differ diff --git a/assets/img/circle-icons/full-color/scissors.png b/assets/img/circle-icons/full-color/scissors.png new file mode 100755 index 0000000..2f5c20c Binary files /dev/null and b/assets/img/circle-icons/full-color/scissors.png differ diff --git a/assets/img/circle-icons/full-color/scooter.png b/assets/img/circle-icons/full-color/scooter.png new file mode 100755 index 0000000..978c23b Binary files /dev/null and b/assets/img/circle-icons/full-color/scooter.png differ diff --git a/assets/img/circle-icons/full-color/security.png b/assets/img/circle-icons/full-color/security.png new file mode 100755 index 0000000..0f0e5b8 Binary files /dev/null and b/assets/img/circle-icons/full-color/security.png differ diff --git a/assets/img/circle-icons/full-color/settings.png b/assets/img/circle-icons/full-color/settings.png new file mode 100755 index 0000000..aed6879 Binary files /dev/null and b/assets/img/circle-icons/full-color/settings.png differ diff --git a/assets/img/circle-icons/full-color/shipwheel.png b/assets/img/circle-icons/full-color/shipwheel.png new file mode 100755 index 0000000..4c83ad7 Binary files /dev/null and b/assets/img/circle-icons/full-color/shipwheel.png differ diff --git a/assets/img/circle-icons/full-color/shoeprints.png b/assets/img/circle-icons/full-color/shoeprints.png new file mode 100755 index 0000000..b3a70a3 Binary files /dev/null and b/assets/img/circle-icons/full-color/shoeprints.png differ diff --git a/assets/img/circle-icons/full-color/shop.png b/assets/img/circle-icons/full-color/shop.png new file mode 100755 index 0000000..ee24d07 Binary files /dev/null and b/assets/img/circle-icons/full-color/shop.png differ diff --git a/assets/img/circle-icons/full-color/skateboard.png b/assets/img/circle-icons/full-color/skateboard.png new file mode 100755 index 0000000..d75997e Binary files /dev/null and b/assets/img/circle-icons/full-color/skateboard.png differ diff --git a/assets/img/circle-icons/full-color/smartphone.png b/assets/img/circle-icons/full-color/smartphone.png new file mode 100755 index 0000000..33bfb00 Binary files /dev/null and b/assets/img/circle-icons/full-color/smartphone.png differ diff --git a/assets/img/circle-icons/full-color/spaceshuttle.png b/assets/img/circle-icons/full-color/spaceshuttle.png new file mode 100755 index 0000000..6b7cf1e Binary files /dev/null and b/assets/img/circle-icons/full-color/spaceshuttle.png differ diff --git a/assets/img/circle-icons/full-color/speedometer.png b/assets/img/circle-icons/full-color/speedometer.png new file mode 100755 index 0000000..755ff7d Binary files /dev/null and b/assets/img/circle-icons/full-color/speedometer.png differ diff --git a/assets/img/circle-icons/full-color/stack.png b/assets/img/circle-icons/full-color/stack.png new file mode 100755 index 0000000..7333a12 Binary files /dev/null and b/assets/img/circle-icons/full-color/stack.png differ diff --git a/assets/img/circle-icons/full-color/star.png b/assets/img/circle-icons/full-color/star.png new file mode 100755 index 0000000..6eb95e7 Binary files /dev/null and b/assets/img/circle-icons/full-color/star.png differ diff --git a/assets/img/circle-icons/full-color/steeringwheel.png b/assets/img/circle-icons/full-color/steeringwheel.png new file mode 100755 index 0000000..25b7a38 Binary files /dev/null and b/assets/img/circle-icons/full-color/steeringwheel.png differ diff --git a/assets/img/circle-icons/full-color/stop.png b/assets/img/circle-icons/full-color/stop.png new file mode 100755 index 0000000..10884cd Binary files /dev/null and b/assets/img/circle-icons/full-color/stop.png differ diff --git a/assets/img/circle-icons/full-color/submarine.png b/assets/img/circle-icons/full-color/submarine.png new file mode 100755 index 0000000..0ed0d5a Binary files /dev/null and b/assets/img/circle-icons/full-color/submarine.png differ diff --git a/assets/img/circle-icons/full-color/support.png b/assets/img/circle-icons/full-color/support.png new file mode 100755 index 0000000..2b6b434 Binary files /dev/null and b/assets/img/circle-icons/full-color/support.png differ diff --git a/assets/img/circle-icons/full-color/takeoff.png b/assets/img/circle-icons/full-color/takeoff.png new file mode 100755 index 0000000..85d1ef3 Binary files /dev/null and b/assets/img/circle-icons/full-color/takeoff.png differ diff --git a/assets/img/circle-icons/full-color/target.png b/assets/img/circle-icons/full-color/target.png new file mode 100755 index 0000000..78b3ab6 Binary files /dev/null and b/assets/img/circle-icons/full-color/target.png differ diff --git a/assets/img/circle-icons/full-color/taxi.png b/assets/img/circle-icons/full-color/taxi.png new file mode 100755 index 0000000..1ce9e96 Binary files /dev/null and b/assets/img/circle-icons/full-color/taxi.png differ diff --git a/assets/img/circle-icons/full-color/toolbox.png b/assets/img/circle-icons/full-color/toolbox.png new file mode 100755 index 0000000..87c2c4a Binary files /dev/null and b/assets/img/circle-icons/full-color/toolbox.png differ diff --git a/assets/img/circle-icons/full-color/tools.png b/assets/img/circle-icons/full-color/tools.png new file mode 100755 index 0000000..e23b404 Binary files /dev/null and b/assets/img/circle-icons/full-color/tools.png differ diff --git a/assets/img/circle-icons/full-color/tractor.png b/assets/img/circle-icons/full-color/tractor.png new file mode 100755 index 0000000..4423633 Binary files /dev/null and b/assets/img/circle-icons/full-color/tractor.png differ diff --git a/assets/img/circle-icons/full-color/traffic.png b/assets/img/circle-icons/full-color/traffic.png new file mode 100755 index 0000000..dda066f Binary files /dev/null and b/assets/img/circle-icons/full-color/traffic.png differ diff --git a/assets/img/circle-icons/full-color/train.png b/assets/img/circle-icons/full-color/train.png new file mode 100755 index 0000000..6bd5542 Binary files /dev/null and b/assets/img/circle-icons/full-color/train.png differ diff --git a/assets/img/circle-icons/full-color/travelerbag.png b/assets/img/circle-icons/full-color/travelerbag.png new file mode 100755 index 0000000..fffb88f Binary files /dev/null and b/assets/img/circle-icons/full-color/travelerbag.png differ diff --git a/assets/img/circle-icons/full-color/trends.png b/assets/img/circle-icons/full-color/trends.png new file mode 100755 index 0000000..54db560 Binary files /dev/null and b/assets/img/circle-icons/full-color/trends.png differ diff --git a/assets/img/circle-icons/full-color/trophy.png b/assets/img/circle-icons/full-color/trophy.png new file mode 100755 index 0000000..0e671e5 Binary files /dev/null and b/assets/img/circle-icons/full-color/trophy.png differ diff --git a/assets/img/circle-icons/full-color/truck.png b/assets/img/circle-icons/full-color/truck.png new file mode 100755 index 0000000..c88a9bf Binary files /dev/null and b/assets/img/circle-icons/full-color/truck.png differ diff --git a/assets/img/circle-icons/full-color/ufo.png b/assets/img/circle-icons/full-color/ufo.png new file mode 100755 index 0000000..43a7664 Binary files /dev/null and b/assets/img/circle-icons/full-color/ufo.png differ diff --git a/assets/img/circle-icons/full-color/umbrella.png b/assets/img/circle-icons/full-color/umbrella.png new file mode 100755 index 0000000..9b215a7 Binary files /dev/null and b/assets/img/circle-icons/full-color/umbrella.png differ diff --git a/assets/img/circle-icons/full-color/unicycle.png b/assets/img/circle-icons/full-color/unicycle.png new file mode 100755 index 0000000..a25d1af Binary files /dev/null and b/assets/img/circle-icons/full-color/unicycle.png differ diff --git a/assets/img/circle-icons/full-color/unlocked.png b/assets/img/circle-icons/full-color/unlocked.png new file mode 100755 index 0000000..4058113 Binary files /dev/null and b/assets/img/circle-icons/full-color/unlocked.png differ diff --git a/assets/img/circle-icons/full-color/upload.png b/assets/img/circle-icons/full-color/upload.png new file mode 100755 index 0000000..3ce606b Binary files /dev/null and b/assets/img/circle-icons/full-color/upload.png differ diff --git a/assets/img/circle-icons/full-color/video.png b/assets/img/circle-icons/full-color/video.png new file mode 100755 index 0000000..9af0e5e Binary files /dev/null and b/assets/img/circle-icons/full-color/video.png differ diff --git a/assets/img/circle-icons/full-color/water.png b/assets/img/circle-icons/full-color/water.png new file mode 100755 index 0000000..3fcec30 Binary files /dev/null and b/assets/img/circle-icons/full-color/water.png differ diff --git a/assets/img/circle-icons/full-color/weather.png b/assets/img/circle-icons/full-color/weather.png new file mode 100755 index 0000000..fcb492a Binary files /dev/null and b/assets/img/circle-icons/full-color/weather.png differ diff --git a/assets/img/circle-icons/full-color/windsock.png b/assets/img/circle-icons/full-color/windsock.png new file mode 100755 index 0000000..6e9e53f Binary files /dev/null and b/assets/img/circle-icons/full-color/windsock.png differ diff --git a/assets/img/circle-icons/full-color/windy.png b/assets/img/circle-icons/full-color/windy.png new file mode 100755 index 0000000..dd85d30 Binary files /dev/null and b/assets/img/circle-icons/full-color/windy.png differ diff --git a/assets/img/circle-icons/full-color/x.png b/assets/img/circle-icons/full-color/x.png new file mode 100755 index 0000000..fea300a Binary files /dev/null and b/assets/img/circle-icons/full-color/x.png differ diff --git a/assets/img/circle-icons/one-color/anchor.png b/assets/img/circle-icons/one-color/anchor.png new file mode 100755 index 0000000..9352d4a Binary files /dev/null and b/assets/img/circle-icons/one-color/anchor.png differ diff --git a/assets/img/circle-icons/one-color/arrow-down.png b/assets/img/circle-icons/one-color/arrow-down.png new file mode 100755 index 0000000..5c35885 Binary files /dev/null and b/assets/img/circle-icons/one-color/arrow-down.png differ diff --git a/assets/img/circle-icons/one-color/arrow-up.png b/assets/img/circle-icons/one-color/arrow-up.png new file mode 100755 index 0000000..43b8261 Binary files /dev/null and b/assets/img/circle-icons/one-color/arrow-up.png differ diff --git a/assets/img/circle-icons/one-color/art.png b/assets/img/circle-icons/one-color/art.png new file mode 100755 index 0000000..03147ed Binary files /dev/null and b/assets/img/circle-icons/one-color/art.png differ diff --git a/assets/img/circle-icons/one-color/barchart.png b/assets/img/circle-icons/one-color/barchart.png new file mode 100755 index 0000000..ec3d93b Binary files /dev/null and b/assets/img/circle-icons/one-color/barchart.png differ diff --git a/assets/img/circle-icons/one-color/bike.png b/assets/img/circle-icons/one-color/bike.png new file mode 100755 index 0000000..bed02cf Binary files /dev/null and b/assets/img/circle-icons/one-color/bike.png differ diff --git a/assets/img/circle-icons/one-color/biker.png b/assets/img/circle-icons/one-color/biker.png new file mode 100755 index 0000000..e5c47bf Binary files /dev/null and b/assets/img/circle-icons/one-color/biker.png differ diff --git a/assets/img/circle-icons/one-color/bikewheel.png b/assets/img/circle-icons/one-color/bikewheel.png new file mode 100755 index 0000000..cba1a31 Binary files /dev/null and b/assets/img/circle-icons/one-color/bikewheel.png differ diff --git a/assets/img/circle-icons/one-color/blimp.png b/assets/img/circle-icons/one-color/blimp.png new file mode 100755 index 0000000..7153145 Binary files /dev/null and b/assets/img/circle-icons/one-color/blimp.png differ diff --git a/assets/img/circle-icons/one-color/bomb.png b/assets/img/circle-icons/one-color/bomb.png new file mode 100755 index 0000000..1172cfc Binary files /dev/null and b/assets/img/circle-icons/one-color/bomb.png differ diff --git a/assets/img/circle-icons/one-color/booklet.png b/assets/img/circle-icons/one-color/booklet.png new file mode 100755 index 0000000..ad3c728 Binary files /dev/null and b/assets/img/circle-icons/one-color/booklet.png differ diff --git a/assets/img/circle-icons/one-color/bookshelf.png b/assets/img/circle-icons/one-color/bookshelf.png new file mode 100755 index 0000000..b78ae6c Binary files /dev/null and b/assets/img/circle-icons/one-color/bookshelf.png differ diff --git a/assets/img/circle-icons/one-color/briefcase.png b/assets/img/circle-icons/one-color/briefcase.png new file mode 100755 index 0000000..3498bfd Binary files /dev/null and b/assets/img/circle-icons/one-color/briefcase.png differ diff --git a/assets/img/circle-icons/one-color/browser.png b/assets/img/circle-icons/one-color/browser.png new file mode 100755 index 0000000..cc9b29f Binary files /dev/null and b/assets/img/circle-icons/one-color/browser.png differ diff --git a/assets/img/circle-icons/one-color/calculator.png b/assets/img/circle-icons/one-color/calculator.png new file mode 100755 index 0000000..594ddc7 Binary files /dev/null and b/assets/img/circle-icons/one-color/calculator.png differ diff --git a/assets/img/circle-icons/one-color/calendar.png b/assets/img/circle-icons/one-color/calendar.png new file mode 100755 index 0000000..61ce994 Binary files /dev/null and b/assets/img/circle-icons/one-color/calendar.png differ diff --git a/assets/img/circle-icons/one-color/camera.png b/assets/img/circle-icons/one-color/camera.png new file mode 100755 index 0000000..b92e238 Binary files /dev/null and b/assets/img/circle-icons/one-color/camera.png differ diff --git a/assets/img/circle-icons/one-color/car.png b/assets/img/circle-icons/one-color/car.png new file mode 100755 index 0000000..37a6993 Binary files /dev/null and b/assets/img/circle-icons/one-color/car.png differ diff --git a/assets/img/circle-icons/one-color/cart.png b/assets/img/circle-icons/one-color/cart.png new file mode 100755 index 0000000..137ed3d Binary files /dev/null and b/assets/img/circle-icons/one-color/cart.png differ diff --git a/assets/img/circle-icons/one-color/carwheel.png b/assets/img/circle-icons/one-color/carwheel.png new file mode 100755 index 0000000..eaca243 Binary files /dev/null and b/assets/img/circle-icons/one-color/carwheel.png differ diff --git a/assets/img/circle-icons/one-color/caution.png b/assets/img/circle-icons/one-color/caution.png new file mode 100755 index 0000000..61f01e2 Binary files /dev/null and b/assets/img/circle-icons/one-color/caution.png differ diff --git a/assets/img/circle-icons/one-color/chat.png b/assets/img/circle-icons/one-color/chat.png new file mode 100755 index 0000000..952de63 Binary files /dev/null and b/assets/img/circle-icons/one-color/chat.png differ diff --git a/assets/img/circle-icons/one-color/check.png b/assets/img/circle-icons/one-color/check.png new file mode 100755 index 0000000..39fe6b8 Binary files /dev/null and b/assets/img/circle-icons/one-color/check.png differ diff --git a/assets/img/circle-icons/one-color/clipboard.png b/assets/img/circle-icons/one-color/clipboard.png new file mode 100755 index 0000000..a735d61 Binary files /dev/null and b/assets/img/circle-icons/one-color/clipboard.png differ diff --git a/assets/img/circle-icons/one-color/clock.png b/assets/img/circle-icons/one-color/clock.png new file mode 100755 index 0000000..266eff9 Binary files /dev/null and b/assets/img/circle-icons/one-color/clock.png differ diff --git a/assets/img/circle-icons/one-color/cloud.png b/assets/img/circle-icons/one-color/cloud.png new file mode 100755 index 0000000..975bd30 Binary files /dev/null and b/assets/img/circle-icons/one-color/cloud.png differ diff --git a/assets/img/circle-icons/one-color/compass.png b/assets/img/circle-icons/one-color/compass.png new file mode 100755 index 0000000..2a1fbd2 Binary files /dev/null and b/assets/img/circle-icons/one-color/compass.png differ diff --git a/assets/img/circle-icons/one-color/compose.png b/assets/img/circle-icons/one-color/compose.png new file mode 100755 index 0000000..2f6738e Binary files /dev/null and b/assets/img/circle-icons/one-color/compose.png differ diff --git a/assets/img/circle-icons/one-color/computer.png b/assets/img/circle-icons/one-color/computer.png new file mode 100755 index 0000000..3dca9b5 Binary files /dev/null and b/assets/img/circle-icons/one-color/computer.png differ diff --git a/assets/img/circle-icons/one-color/cone.png b/assets/img/circle-icons/one-color/cone.png new file mode 100755 index 0000000..c1b1cbe Binary files /dev/null and b/assets/img/circle-icons/one-color/cone.png differ diff --git a/assets/img/circle-icons/one-color/contacts.png b/assets/img/circle-icons/one-color/contacts.png new file mode 100755 index 0000000..b3bcbda Binary files /dev/null and b/assets/img/circle-icons/one-color/contacts.png differ diff --git a/assets/img/circle-icons/one-color/creditcard.png b/assets/img/circle-icons/one-color/creditcard.png new file mode 100755 index 0000000..c329cf3 Binary files /dev/null and b/assets/img/circle-icons/one-color/creditcard.png differ diff --git a/assets/img/circle-icons/one-color/crossroads.png b/assets/img/circle-icons/one-color/crossroads.png new file mode 100755 index 0000000..d86bb66 Binary files /dev/null and b/assets/img/circle-icons/one-color/crossroads.png differ diff --git a/assets/img/circle-icons/one-color/cruise.png b/assets/img/circle-icons/one-color/cruise.png new file mode 100755 index 0000000..2b6b429 Binary files /dev/null and b/assets/img/circle-icons/one-color/cruise.png differ diff --git a/assets/img/circle-icons/one-color/denied.png b/assets/img/circle-icons/one-color/denied.png new file mode 100755 index 0000000..ff7b8fa Binary files /dev/null and b/assets/img/circle-icons/one-color/denied.png differ diff --git a/assets/img/circle-icons/one-color/dev.png b/assets/img/circle-icons/one-color/dev.png new file mode 100755 index 0000000..ca4826e Binary files /dev/null and b/assets/img/circle-icons/one-color/dev.png differ diff --git a/assets/img/circle-icons/one-color/die.png b/assets/img/circle-icons/one-color/die.png new file mode 100755 index 0000000..0236924 Binary files /dev/null and b/assets/img/circle-icons/one-color/die.png differ diff --git a/assets/img/circle-icons/one-color/document.png b/assets/img/circle-icons/one-color/document.png new file mode 100755 index 0000000..0838606 Binary files /dev/null and b/assets/img/circle-icons/one-color/document.png differ diff --git a/assets/img/circle-icons/one-color/dolly.png b/assets/img/circle-icons/one-color/dolly.png new file mode 100755 index 0000000..a62313a Binary files /dev/null and b/assets/img/circle-icons/one-color/dolly.png differ diff --git a/assets/img/circle-icons/one-color/door.png b/assets/img/circle-icons/one-color/door.png new file mode 100755 index 0000000..8904e3f Binary files /dev/null and b/assets/img/circle-icons/one-color/door.png differ diff --git a/assets/img/circle-icons/one-color/download.png b/assets/img/circle-icons/one-color/download.png new file mode 100755 index 0000000..166a60d Binary files /dev/null and b/assets/img/circle-icons/one-color/download.png differ diff --git a/assets/img/circle-icons/one-color/email.png b/assets/img/circle-icons/one-color/email.png new file mode 100755 index 0000000..76c32a0 Binary files /dev/null and b/assets/img/circle-icons/one-color/email.png differ diff --git a/assets/img/circle-icons/one-color/eye.png b/assets/img/circle-icons/one-color/eye.png new file mode 100755 index 0000000..b4a0d8f Binary files /dev/null and b/assets/img/circle-icons/one-color/eye.png differ diff --git a/assets/img/circle-icons/one-color/fashion.png b/assets/img/circle-icons/one-color/fashion.png new file mode 100755 index 0000000..c3d85dd Binary files /dev/null and b/assets/img/circle-icons/one-color/fashion.png differ diff --git a/assets/img/circle-icons/one-color/flag.png b/assets/img/circle-icons/one-color/flag.png new file mode 100755 index 0000000..be2d955 Binary files /dev/null and b/assets/img/circle-icons/one-color/flag.png differ diff --git a/assets/img/circle-icons/one-color/flame.png b/assets/img/circle-icons/one-color/flame.png new file mode 100755 index 0000000..7f7c6ad Binary files /dev/null and b/assets/img/circle-icons/one-color/flame.png differ diff --git a/assets/img/circle-icons/one-color/folder.png b/assets/img/circle-icons/one-color/folder.png new file mode 100755 index 0000000..858986c Binary files /dev/null and b/assets/img/circle-icons/one-color/folder.png differ diff --git a/assets/img/circle-icons/one-color/gas.png b/assets/img/circle-icons/one-color/gas.png new file mode 100755 index 0000000..d323fc9 Binary files /dev/null and b/assets/img/circle-icons/one-color/gas.png differ diff --git a/assets/img/circle-icons/one-color/gear.png b/assets/img/circle-icons/one-color/gear.png new file mode 100755 index 0000000..b346e5c Binary files /dev/null and b/assets/img/circle-icons/one-color/gear.png differ diff --git a/assets/img/circle-icons/one-color/genius.png b/assets/img/circle-icons/one-color/genius.png new file mode 100755 index 0000000..aee5d6b Binary files /dev/null and b/assets/img/circle-icons/one-color/genius.png differ diff --git a/assets/img/circle-icons/one-color/global.png b/assets/img/circle-icons/one-color/global.png new file mode 100755 index 0000000..6a66c6f Binary files /dev/null and b/assets/img/circle-icons/one-color/global.png differ diff --git a/assets/img/circle-icons/one-color/globe.png b/assets/img/circle-icons/one-color/globe.png new file mode 100755 index 0000000..15a88fc Binary files /dev/null and b/assets/img/circle-icons/one-color/globe.png differ diff --git a/assets/img/circle-icons/one-color/gps.png b/assets/img/circle-icons/one-color/gps.png new file mode 100755 index 0000000..00fa0f3 Binary files /dev/null and b/assets/img/circle-icons/one-color/gps.png differ diff --git a/assets/img/circle-icons/one-color/hazard.png b/assets/img/circle-icons/one-color/hazard.png new file mode 100755 index 0000000..006b367 Binary files /dev/null and b/assets/img/circle-icons/one-color/hazard.png differ diff --git a/assets/img/circle-icons/one-color/heart.png b/assets/img/circle-icons/one-color/heart.png new file mode 100755 index 0000000..cab18a2 Binary files /dev/null and b/assets/img/circle-icons/one-color/heart.png differ diff --git a/assets/img/circle-icons/one-color/helicopter.png b/assets/img/circle-icons/one-color/helicopter.png new file mode 100755 index 0000000..36c62df Binary files /dev/null and b/assets/img/circle-icons/one-color/helicopter.png differ diff --git a/assets/img/circle-icons/one-color/hotair.png b/assets/img/circle-icons/one-color/hotair.png new file mode 100755 index 0000000..49346de Binary files /dev/null and b/assets/img/circle-icons/one-color/hotair.png differ diff --git a/assets/img/circle-icons/one-color/hourglass.png b/assets/img/circle-icons/one-color/hourglass.png new file mode 100755 index 0000000..1d49d27 Binary files /dev/null and b/assets/img/circle-icons/one-color/hourglass.png differ diff --git a/assets/img/circle-icons/one-color/image.png b/assets/img/circle-icons/one-color/image.png new file mode 100755 index 0000000..6b3aea3 Binary files /dev/null and b/assets/img/circle-icons/one-color/image.png differ diff --git a/assets/img/circle-icons/one-color/interstate.png b/assets/img/circle-icons/one-color/interstate.png new file mode 100755 index 0000000..914f7c8 Binary files /dev/null and b/assets/img/circle-icons/one-color/interstate.png differ diff --git a/assets/img/circle-icons/one-color/key.png b/assets/img/circle-icons/one-color/key.png new file mode 100755 index 0000000..02d3dc3 Binary files /dev/null and b/assets/img/circle-icons/one-color/key.png differ diff --git a/assets/img/circle-icons/one-color/lightbulb.png b/assets/img/circle-icons/one-color/lightbulb.png new file mode 100755 index 0000000..2cef7ac Binary files /dev/null and b/assets/img/circle-icons/one-color/lightbulb.png differ diff --git a/assets/img/circle-icons/one-color/location.png b/assets/img/circle-icons/one-color/location.png new file mode 100755 index 0000000..c08b4a0 Binary files /dev/null and b/assets/img/circle-icons/one-color/location.png differ diff --git a/assets/img/circle-icons/one-color/locked.png b/assets/img/circle-icons/one-color/locked.png new file mode 100755 index 0000000..12720a7 Binary files /dev/null and b/assets/img/circle-icons/one-color/locked.png differ diff --git a/assets/img/circle-icons/one-color/magnifyingglass.png b/assets/img/circle-icons/one-color/magnifyingglass.png new file mode 100755 index 0000000..e754047 Binary files /dev/null and b/assets/img/circle-icons/one-color/magnifyingglass.png differ diff --git a/assets/img/circle-icons/one-color/mail.png b/assets/img/circle-icons/one-color/mail.png new file mode 100755 index 0000000..84397d0 Binary files /dev/null and b/assets/img/circle-icons/one-color/mail.png differ diff --git a/assets/img/circle-icons/one-color/map.png b/assets/img/circle-icons/one-color/map.png new file mode 100755 index 0000000..c3e21de Binary files /dev/null and b/assets/img/circle-icons/one-color/map.png differ diff --git a/assets/img/circle-icons/one-color/merge.png b/assets/img/circle-icons/one-color/merge.png new file mode 100755 index 0000000..3580590 Binary files /dev/null and b/assets/img/circle-icons/one-color/merge.png differ diff --git a/assets/img/circle-icons/one-color/mic.png b/assets/img/circle-icons/one-color/mic.png new file mode 100755 index 0000000..9d79d2b Binary files /dev/null and b/assets/img/circle-icons/one-color/mic.png differ diff --git a/assets/img/circle-icons/one-color/money.png b/assets/img/circle-icons/one-color/money.png new file mode 100755 index 0000000..6595a20 Binary files /dev/null and b/assets/img/circle-icons/one-color/money.png differ diff --git a/assets/img/circle-icons/one-color/motorcycle.png b/assets/img/circle-icons/one-color/motorcycle.png new file mode 100755 index 0000000..ab70102 Binary files /dev/null and b/assets/img/circle-icons/one-color/motorcycle.png differ diff --git a/assets/img/circle-icons/one-color/music.png b/assets/img/circle-icons/one-color/music.png new file mode 100755 index 0000000..90fa294 Binary files /dev/null and b/assets/img/circle-icons/one-color/music.png differ diff --git a/assets/img/circle-icons/one-color/news.png b/assets/img/circle-icons/one-color/news.png new file mode 100755 index 0000000..fc65f73 Binary files /dev/null and b/assets/img/circle-icons/one-color/news.png differ diff --git a/assets/img/circle-icons/one-color/parachute.png b/assets/img/circle-icons/one-color/parachute.png new file mode 100755 index 0000000..cbcf9ec Binary files /dev/null and b/assets/img/circle-icons/one-color/parachute.png differ diff --git a/assets/img/circle-icons/one-color/pencil.png b/assets/img/circle-icons/one-color/pencil.png new file mode 100755 index 0000000..9e02e5b Binary files /dev/null and b/assets/img/circle-icons/one-color/pencil.png differ diff --git a/assets/img/circle-icons/one-color/phone.png b/assets/img/circle-icons/one-color/phone.png new file mode 100755 index 0000000..9d5d4f7 Binary files /dev/null and b/assets/img/circle-icons/one-color/phone.png differ diff --git a/assets/img/circle-icons/one-color/piechart.png b/assets/img/circle-icons/one-color/piechart.png new file mode 100755 index 0000000..e9c1a73 Binary files /dev/null and b/assets/img/circle-icons/one-color/piechart.png differ diff --git a/assets/img/circle-icons/one-color/pin.png b/assets/img/circle-icons/one-color/pin.png new file mode 100755 index 0000000..6e7c535 Binary files /dev/null and b/assets/img/circle-icons/one-color/pin.png differ diff --git a/assets/img/circle-icons/one-color/pin2.png b/assets/img/circle-icons/one-color/pin2.png new file mode 100755 index 0000000..968e6de Binary files /dev/null and b/assets/img/circle-icons/one-color/pin2.png differ diff --git a/assets/img/circle-icons/one-color/plane.png b/assets/img/circle-icons/one-color/plane.png new file mode 100755 index 0000000..207f969 Binary files /dev/null and b/assets/img/circle-icons/one-color/plane.png differ diff --git a/assets/img/circle-icons/one-color/present.png b/assets/img/circle-icons/one-color/present.png new file mode 100755 index 0000000..7755738 Binary files /dev/null and b/assets/img/circle-icons/one-color/present.png differ diff --git a/assets/img/circle-icons/one-color/profle.png b/assets/img/circle-icons/one-color/profle.png new file mode 100755 index 0000000..61d47f1 Binary files /dev/null and b/assets/img/circle-icons/one-color/profle.png differ diff --git a/assets/img/circle-icons/one-color/quote.png b/assets/img/circle-icons/one-color/quote.png new file mode 100755 index 0000000..ef00adc Binary files /dev/null and b/assets/img/circle-icons/one-color/quote.png differ diff --git a/assets/img/circle-icons/one-color/racingflags.png b/assets/img/circle-icons/one-color/racingflags.png new file mode 100755 index 0000000..87ec674 Binary files /dev/null and b/assets/img/circle-icons/one-color/racingflags.png differ diff --git a/assets/img/circle-icons/one-color/rainbow.png b/assets/img/circle-icons/one-color/rainbow.png new file mode 100755 index 0000000..85e2df6 Binary files /dev/null and b/assets/img/circle-icons/one-color/rainbow.png differ diff --git a/assets/img/circle-icons/one-color/recycle.png b/assets/img/circle-icons/one-color/recycle.png new file mode 100755 index 0000000..efa53b3 Binary files /dev/null and b/assets/img/circle-icons/one-color/recycle.png differ diff --git a/assets/img/circle-icons/one-color/ribbon.png b/assets/img/circle-icons/one-color/ribbon.png new file mode 100755 index 0000000..1db7e08 Binary files /dev/null and b/assets/img/circle-icons/one-color/ribbon.png differ diff --git a/assets/img/circle-icons/one-color/roadblock.png b/assets/img/circle-icons/one-color/roadblock.png new file mode 100755 index 0000000..551d90d Binary files /dev/null and b/assets/img/circle-icons/one-color/roadblock.png differ diff --git a/assets/img/circle-icons/one-color/rocket.png b/assets/img/circle-icons/one-color/rocket.png new file mode 100755 index 0000000..cfd2611 Binary files /dev/null and b/assets/img/circle-icons/one-color/rocket.png differ diff --git a/assets/img/circle-icons/one-color/running.png b/assets/img/circle-icons/one-color/running.png new file mode 100755 index 0000000..e0fb770 Binary files /dev/null and b/assets/img/circle-icons/one-color/running.png differ diff --git a/assets/img/circle-icons/one-color/sailboat.png b/assets/img/circle-icons/one-color/sailboat.png new file mode 100755 index 0000000..74e9cb1 Binary files /dev/null and b/assets/img/circle-icons/one-color/sailboat.png differ diff --git a/assets/img/circle-icons/one-color/schooolbus.png b/assets/img/circle-icons/one-color/schooolbus.png new file mode 100755 index 0000000..fec9f67 Binary files /dev/null and b/assets/img/circle-icons/one-color/schooolbus.png differ diff --git a/assets/img/circle-icons/one-color/scissors.png b/assets/img/circle-icons/one-color/scissors.png new file mode 100755 index 0000000..b21275e Binary files /dev/null and b/assets/img/circle-icons/one-color/scissors.png differ diff --git a/assets/img/circle-icons/one-color/scooter.png b/assets/img/circle-icons/one-color/scooter.png new file mode 100755 index 0000000..730d98d Binary files /dev/null and b/assets/img/circle-icons/one-color/scooter.png differ diff --git a/assets/img/circle-icons/one-color/security.png b/assets/img/circle-icons/one-color/security.png new file mode 100755 index 0000000..2ba6234 Binary files /dev/null and b/assets/img/circle-icons/one-color/security.png differ diff --git a/assets/img/circle-icons/one-color/settings.png b/assets/img/circle-icons/one-color/settings.png new file mode 100755 index 0000000..0292027 Binary files /dev/null and b/assets/img/circle-icons/one-color/settings.png differ diff --git a/assets/img/circle-icons/one-color/shipwheel.png b/assets/img/circle-icons/one-color/shipwheel.png new file mode 100755 index 0000000..0f4f69f Binary files /dev/null and b/assets/img/circle-icons/one-color/shipwheel.png differ diff --git a/assets/img/circle-icons/one-color/shoeprints.png b/assets/img/circle-icons/one-color/shoeprints.png new file mode 100755 index 0000000..3dd5f22 Binary files /dev/null and b/assets/img/circle-icons/one-color/shoeprints.png differ diff --git a/assets/img/circle-icons/one-color/shop.png b/assets/img/circle-icons/one-color/shop.png new file mode 100755 index 0000000..33784a1 Binary files /dev/null and b/assets/img/circle-icons/one-color/shop.png differ diff --git a/assets/img/circle-icons/one-color/skateboard.png b/assets/img/circle-icons/one-color/skateboard.png new file mode 100755 index 0000000..38a8a9a Binary files /dev/null and b/assets/img/circle-icons/one-color/skateboard.png differ diff --git a/assets/img/circle-icons/one-color/smartphone.png b/assets/img/circle-icons/one-color/smartphone.png new file mode 100755 index 0000000..d272c39 Binary files /dev/null and b/assets/img/circle-icons/one-color/smartphone.png differ diff --git a/assets/img/circle-icons/one-color/spaceshuttle.png b/assets/img/circle-icons/one-color/spaceshuttle.png new file mode 100755 index 0000000..c7ae179 Binary files /dev/null and b/assets/img/circle-icons/one-color/spaceshuttle.png differ diff --git a/assets/img/circle-icons/one-color/speedometer.png b/assets/img/circle-icons/one-color/speedometer.png new file mode 100755 index 0000000..ed6adb9 Binary files /dev/null and b/assets/img/circle-icons/one-color/speedometer.png differ diff --git a/assets/img/circle-icons/one-color/stack.png b/assets/img/circle-icons/one-color/stack.png new file mode 100755 index 0000000..425e9f4 Binary files /dev/null and b/assets/img/circle-icons/one-color/stack.png differ diff --git a/assets/img/circle-icons/one-color/star.png b/assets/img/circle-icons/one-color/star.png new file mode 100755 index 0000000..dae7aae Binary files /dev/null and b/assets/img/circle-icons/one-color/star.png differ diff --git a/assets/img/circle-icons/one-color/steeringwheel.png b/assets/img/circle-icons/one-color/steeringwheel.png new file mode 100755 index 0000000..f47ffbd Binary files /dev/null and b/assets/img/circle-icons/one-color/steeringwheel.png differ diff --git a/assets/img/circle-icons/one-color/stop.png b/assets/img/circle-icons/one-color/stop.png new file mode 100755 index 0000000..91a97a1 Binary files /dev/null and b/assets/img/circle-icons/one-color/stop.png differ diff --git a/assets/img/circle-icons/one-color/submarine.png b/assets/img/circle-icons/one-color/submarine.png new file mode 100755 index 0000000..d82f339 Binary files /dev/null and b/assets/img/circle-icons/one-color/submarine.png differ diff --git a/assets/img/circle-icons/one-color/support.png b/assets/img/circle-icons/one-color/support.png new file mode 100755 index 0000000..8e70422 Binary files /dev/null and b/assets/img/circle-icons/one-color/support.png differ diff --git a/assets/img/circle-icons/one-color/takeoff.png b/assets/img/circle-icons/one-color/takeoff.png new file mode 100755 index 0000000..c39b9fd Binary files /dev/null and b/assets/img/circle-icons/one-color/takeoff.png differ diff --git a/assets/img/circle-icons/one-color/target.png b/assets/img/circle-icons/one-color/target.png new file mode 100755 index 0000000..a9062af Binary files /dev/null and b/assets/img/circle-icons/one-color/target.png differ diff --git a/assets/img/circle-icons/one-color/taxi.png b/assets/img/circle-icons/one-color/taxi.png new file mode 100755 index 0000000..cba2c05 Binary files /dev/null and b/assets/img/circle-icons/one-color/taxi.png differ diff --git a/assets/img/circle-icons/one-color/toolbox.png b/assets/img/circle-icons/one-color/toolbox.png new file mode 100755 index 0000000..a56df6e Binary files /dev/null and b/assets/img/circle-icons/one-color/toolbox.png differ diff --git a/assets/img/circle-icons/one-color/tools.png b/assets/img/circle-icons/one-color/tools.png new file mode 100755 index 0000000..b50e4f5 Binary files /dev/null and b/assets/img/circle-icons/one-color/tools.png differ diff --git a/assets/img/circle-icons/one-color/tractor.png b/assets/img/circle-icons/one-color/tractor.png new file mode 100755 index 0000000..700083d Binary files /dev/null and b/assets/img/circle-icons/one-color/tractor.png differ diff --git a/assets/img/circle-icons/one-color/traffic.png b/assets/img/circle-icons/one-color/traffic.png new file mode 100755 index 0000000..bea1ae1 Binary files /dev/null and b/assets/img/circle-icons/one-color/traffic.png differ diff --git a/assets/img/circle-icons/one-color/train.png b/assets/img/circle-icons/one-color/train.png new file mode 100755 index 0000000..59792ce Binary files /dev/null and b/assets/img/circle-icons/one-color/train.png differ diff --git a/assets/img/circle-icons/one-color/travelerbag.png b/assets/img/circle-icons/one-color/travelerbag.png new file mode 100755 index 0000000..8464a7b Binary files /dev/null and b/assets/img/circle-icons/one-color/travelerbag.png differ diff --git a/assets/img/circle-icons/one-color/trends.png b/assets/img/circle-icons/one-color/trends.png new file mode 100755 index 0000000..1556260 Binary files /dev/null and b/assets/img/circle-icons/one-color/trends.png differ diff --git a/assets/img/circle-icons/one-color/trophy.png b/assets/img/circle-icons/one-color/trophy.png new file mode 100755 index 0000000..efc93cd Binary files /dev/null and b/assets/img/circle-icons/one-color/trophy.png differ diff --git a/assets/img/circle-icons/one-color/truck.png b/assets/img/circle-icons/one-color/truck.png new file mode 100755 index 0000000..4690363 Binary files /dev/null and b/assets/img/circle-icons/one-color/truck.png differ diff --git a/assets/img/circle-icons/one-color/ufo.png b/assets/img/circle-icons/one-color/ufo.png new file mode 100755 index 0000000..0c99ee5 Binary files /dev/null and b/assets/img/circle-icons/one-color/ufo.png differ diff --git a/assets/img/circle-icons/one-color/umbrella.png b/assets/img/circle-icons/one-color/umbrella.png new file mode 100755 index 0000000..2d1cfcb Binary files /dev/null and b/assets/img/circle-icons/one-color/umbrella.png differ diff --git a/assets/img/circle-icons/one-color/unicycle.png b/assets/img/circle-icons/one-color/unicycle.png new file mode 100755 index 0000000..d101616 Binary files /dev/null and b/assets/img/circle-icons/one-color/unicycle.png differ diff --git a/assets/img/circle-icons/one-color/unlocked.png b/assets/img/circle-icons/one-color/unlocked.png new file mode 100755 index 0000000..f3a70d4 Binary files /dev/null and b/assets/img/circle-icons/one-color/unlocked.png differ diff --git a/assets/img/circle-icons/one-color/upload.png b/assets/img/circle-icons/one-color/upload.png new file mode 100755 index 0000000..04af4fa Binary files /dev/null and b/assets/img/circle-icons/one-color/upload.png differ diff --git a/assets/img/circle-icons/one-color/video.png b/assets/img/circle-icons/one-color/video.png new file mode 100755 index 0000000..a04849a Binary files /dev/null and b/assets/img/circle-icons/one-color/video.png differ diff --git a/assets/img/circle-icons/one-color/water.png b/assets/img/circle-icons/one-color/water.png new file mode 100755 index 0000000..a6825e8 Binary files /dev/null and b/assets/img/circle-icons/one-color/water.png differ diff --git a/assets/img/circle-icons/one-color/weather.png b/assets/img/circle-icons/one-color/weather.png new file mode 100755 index 0000000..d2e0410 Binary files /dev/null and b/assets/img/circle-icons/one-color/weather.png differ diff --git a/assets/img/circle-icons/one-color/windsock.png b/assets/img/circle-icons/one-color/windsock.png new file mode 100755 index 0000000..53be506 Binary files /dev/null and b/assets/img/circle-icons/one-color/windsock.png differ diff --git a/assets/img/circle-icons/one-color/windy.png b/assets/img/circle-icons/one-color/windy.png new file mode 100755 index 0000000..0315b95 Binary files /dev/null and b/assets/img/circle-icons/one-color/windy.png differ diff --git a/assets/img/circle-icons/one-color/x.png b/assets/img/circle-icons/one-color/x.png new file mode 100755 index 0000000..ad09af3 Binary files /dev/null and b/assets/img/circle-icons/one-color/x.png differ diff --git a/assets/img/customize.png b/assets/img/customize.png new file mode 100644 index 0000000..9bf9156 Binary files /dev/null and b/assets/img/customize.png differ diff --git a/assets/img/customize2.png b/assets/img/customize2.png new file mode 100644 index 0000000..6134604 Binary files /dev/null and b/assets/img/customize2.png differ diff --git a/assets/img/easy.jpg b/assets/img/easy.jpg new file mode 100644 index 0000000..9021c43 Binary files /dev/null and b/assets/img/easy.jpg differ diff --git a/assets/img/employee_directory.gif b/assets/img/employee_directory.gif new file mode 100644 index 0000000..17a45d8 Binary files /dev/null and b/assets/img/employee_directory.gif differ diff --git a/assets/img/error_payload.png b/assets/img/error_payload.png new file mode 100644 index 0000000..da98605 Binary files /dev/null and b/assets/img/error_payload.png differ diff --git a/assets/img/generator.png b/assets/img/generator.png new file mode 100644 index 0000000..95cc960 Binary files /dev/null and b/assets/img/generator.png differ diff --git a/assets/img/generator2.png b/assets/img/generator2.png new file mode 100644 index 0000000..b470a83 Binary files /dev/null and b/assets/img/generator2.png differ diff --git a/assets/img/generator3.png b/assets/img/generator3.png new file mode 100644 index 0000000..c922dca Binary files /dev/null and b/assets/img/generator3.png differ diff --git a/assets/img/glimmer_logo.png b/assets/img/glimmer_logo.png new file mode 100644 index 0000000..6e0c660 Binary files /dev/null and b/assets/img/glimmer_logo.png differ diff --git a/assets/img/jsonapi-rb-logo.png b/assets/img/jsonapi-rb-logo.png new file mode 100644 index 0000000..d20e58e Binary files /dev/null and b/assets/img/jsonapi-rb-logo.png differ diff --git a/assets/img/meta_total_count.png b/assets/img/meta_total_count.png new file mode 100644 index 0000000..1cfcaf7 Binary files /dev/null and b/assets/img/meta_total_count.png differ diff --git a/assets/img/mountain_river_bg.jpeg b/assets/img/mountain_river_bg.jpeg new file mode 100755 index 0000000..cbc63ae Binary files /dev/null and b/assets/img/mountain_river_bg.jpeg differ diff --git a/assets/img/photographer.png b/assets/img/photographer.png new file mode 100755 index 0000000..097d928 Binary files /dev/null and b/assets/img/photographer.png differ diff --git a/assets/img/rspec.png b/assets/img/rspec.png new file mode 100644 index 0000000..6873322 Binary files /dev/null and b/assets/img/rspec.png differ diff --git a/assets/img/rspec2.png b/assets/img/rspec2.png new file mode 100644 index 0000000..98987ad Binary files /dev/null and b/assets/img/rspec2.png differ diff --git a/assets/img/solutions.jpeg b/assets/img/solutions.jpeg new file mode 100644 index 0000000..66177f3 Binary files /dev/null and b/assets/img/solutions.jpeg differ diff --git a/assets/img/solutions.png b/assets/img/solutions.png new file mode 100644 index 0000000..61dabe1 Binary files /dev/null and b/assets/img/solutions.png differ diff --git a/assets/img/ss2.png b/assets/img/ss2.png new file mode 100644 index 0000000..2962ec2 Binary files /dev/null and b/assets/img/ss2.png differ diff --git a/assets/img/sunrise.png b/assets/img/sunrise.png new file mode 100755 index 0000000..a0fa479 Binary files /dev/null and b/assets/img/sunrise.png differ diff --git a/assets/img/vue_logo.png b/assets/img/vue_logo.png new file mode 100644 index 0000000..b4c9066 Binary files /dev/null and b/assets/img/vue_logo.png differ diff --git a/assets/img/windmill_bg.png b/assets/img/windmill_bg.png new file mode 100755 index 0000000..9b6fab8 Binary files /dev/null and b/assets/img/windmill_bg.png differ diff --git a/assets/js/highlight.pack.js b/assets/js/highlight.pack.js new file mode 100644 index 0000000..fdba04e --- /dev/null +++ b/assets/js/highlight.pack.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.12.0 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/g,"&").replace(//g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function u(e){s+=""}function c(e){("start"===e.event?o:u)(e.node)}for(var l=0,s="",f=[];e.length||r.length;){var g=i();if(s+=n(a.substring(l,g[0].offset)),l=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===l);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return s+n(a.substr(l))}function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},u=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?u("keyword",a.k):x(a.k).forEach(function(e){u(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return l("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var c=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=c.length?t(c.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function l(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?"":I.classPrefix,i='',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=l(E,r),e?(B+=e[1],a+=p(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!y[E.sL])return n(k);var t=e?f(E.sL,k,!0,x[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(B+=t.r),e&&(x[E.sL]=t.top),p(t.language,t.value,!1,!0)}function b(){L+=null!=E.sL?d():h(),k=""}function v(e){L+=e.cN?p(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(k+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),b(),t.rB||t.eB||(k=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),b(),a.eE&&(k=n));do E.cN&&(L+=C),E.skip||(B+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return k+=n,n.length||1}var N=w(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var R,E=i||N,x={},L="";for(R=E;R!==N;R=R.parent)R.cN&&(L=p(R.cN,"",!0)+L);var k="",B=0;try{for(var M,j,O=0;;){if(E.t.lastIndex=O,M=E.t.exec(t),!M)break;j=m(t.substring(O,M.index),M[0]),O=M.index+j}for(m(t.substr(O)),R=E;R.parent;R=R.parent)R.cN&&(L+=C);return{r:B,value:L,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function g(e,t){t=t||I.languages||x(y);var r={r:0,value:n(e)},a=r;return t.filter(w).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return I.tabReplace||I.useBR?e.replace(M,function(e,n){return I.useBR&&"\n"===e?"
":I.tabReplace?n.replace(/\t/g,I.tabReplace):""}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function d(e){var n,t,r,o,l,s=i(e);a(s)||(I.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,l=n.textContent,r=s?f(s,l,!0):g(l),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),l)),r.value=p(r.value),e.innerHTML=r.value,e.className=h(e.className,s,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){I=o(I,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,d)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=y[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function R(){return x(y)}function w(e){return e=(e||"").toLowerCase(),y[e]||y[L[e]]}var E=[],x=Object.keys,y={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="
",I={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=d,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("javascript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},n={cN:"subst",b:"\\$\\{",e:"\\}",k:t,c:[]},c={cN:"string",b:"`",e:"`",c:[e.BE,n]};n.c=[e.ASM,e.QSM,c,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:t,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,c,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:r+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:r,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+r+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0}]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[t],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"meta",v:[{b:/<\?xml/,e:/\?>/,r:10},{b:/<\?\w+/,e:/\?>/}]},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("ruby",function(e){var b="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",r={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},c={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},s=[e.C("#","$",{c:[c]}),e.C("^\\=begin","^\\=end",{c:[c],r:10}),e.C("^__END__","\\n$")],n={cN:"subst",b:"#\\{",e:"}",k:r},t={cN:"string",c:[e.BE,n],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{b:/<<(-?)\w+$/,e:/^\s*\w+$/}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:r},d=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(s)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:b}),i].concat(s)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":(?!\\s)",c:[t,{b:b}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:r},{b:"("+e.RSR+"|unless)\\s*",k:"unless",c:[a,{cN:"regexp",c:[e.BE,n],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(s),r:0}].concat(s);n.c=d,i.c=d;var l="[>?]>",o="[\\w#]+\\(\\w+\\):\\d+:\\d+>",u="(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>",w=[{b:/^\s*=>/,starts:{e:"$",c:d}},{cN:"meta",b:"^("+l+"|"+o+"|"+u+")",starts:{e:"$",c:d}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:r,i:/\/\*/,c:s.concat(w).concat(d)}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*#]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}});hljs.registerLanguage("python",function(e){var r={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},b={cN:"meta",b:/^(>>>|\.\.\.) /},c={cN:"subst",b:/\{/,e:/\}/,k:r,i:/#/},a={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[b],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[b],r:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[b,c]},{b:/(fr|rf|f)"""/,e:/"""/,c:[b,c]},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},{b:/(fr|rf|f)'/,e:/'/,c:[c]},{b:/(fr|rf|f)"/,e:/"/,c:[c]},e.ASM,e.QSM]},s={cN:"number",r:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},i={cN:"params",b:/\(/,e:/\)/,c:["self",b,s,a]};return c.c=[a,s,b],{aliases:["py","gyp"],k:r,i:/(<\/|->|\?)|=>/,c:[b,s,a,e.HCM,{v:[{cN:"function",bK:"def"},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,i,{b:/->/,eW:!0,k:"None"}]},{cN:"meta",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}}); \ No newline at end of file diff --git a/assets/main.scss b/assets/main.scss new file mode 100644 index 0000000..ab36d08 --- /dev/null +++ b/assets/main.scss @@ -0,0 +1,5 @@ +--- +# Only the main Sass file needs front matter (the dashes are enough) +--- + +@import "theme"; diff --git a/bin/console b/bin/console deleted file mode 100755 index 1152bb2..0000000 --- a/bin/console +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env ruby - -require "bundler/setup" -require "jsonapi_suite" - -# You can add fixtures and/or initialization code here to make experimenting -# with your gem easier. You can also use a different console, if you like. - -# (If you use this, don't forget to add pry to your Gemfile!) -# require "pry" -# Pry.start - -require "irb" -IRB.start diff --git a/bin/jekyll b/bin/jekyll new file mode 100755 index 0000000..ab42abe --- /dev/null +++ b/bin/jekyll @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'jekyll' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require "pathname" +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", + Pathname.new(__FILE__).realpath) + +bundle_binstub = File.expand_path("../bundle", __FILE__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 150) =~ /This file was generated by Bundler/ + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("jekyll", "jekyll") diff --git a/bin/setup b/bin/setup deleted file mode 100755 index dce67d8..0000000 --- a/bin/setup +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail -IFS=$'\n\t' -set -vx - -bundle install - -# Do any other automated setup that you need to do here diff --git a/concepts.md b/concepts.md new file mode 100644 index 0000000..51bc90a --- /dev/null +++ b/concepts.md @@ -0,0 +1,49 @@ +--- +layout: docs +--- +
+
+

+ JSONAPI Suite +

+ +
+ +
+
+ {% for doc in site.data.docs %} +
+
+
+

{{ doc.title }}

+ {% include docs/{{doc.id}}/description.html %} +
+
+{% include docs/{{doc.id}}/example.html %} +
+
+
+ {% endfor %} +
+
+
+ + + +{% include highlight.html %} diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000..56af04e --- /dev/null +++ b/dump.rdb @@ -0,0 +1 @@ +REDIS0006ܳCZV \ No newline at end of file diff --git a/features.md b/features.md new file mode 100644 index 0000000..e6ea2c2 --- /dev/null +++ b/features.md @@ -0,0 +1,75 @@ +--- +layout: page +--- + +
+
+
+

Formats to showcase features

+

Choose your favorite formats for your own sites

+
+
+
+ + +
+
+
+

You don't need to have any advanced technical

+

+ Whether you want to fill this paragraph with some text like I'm doing right now, this place is perfect to describe some features or anything you want - React has a complete solution for you. +

+

+ You have complete control over the look & feel of your website, we offer the best quality so you take your site up and running in no time. +

+
+
+ picture1 +
+
+
+
+ picture2 +
+
+

You don't need to have any advanced technical

+

+ Whether you want to fill this paragraph with some text like I'm doing right now, this place is perfect to describe some features or anything you want - React has a complete solution for you. +

+
+
+
+
+

You don't need to have any advanced technical

+

+ Whether you want to fill this paragraph with some text like I'm doing right now, this place is perfect to describe some features or anything you want - React has a complete solution for you. +

+

+ You have complete control over the look & feel of your website, we offer the best quality so you take your site up and running in no time. +

+
+
+ picture3 +
+
+
+
+ picture4 +
+
+

You don't need to have any advanced technical

+

+ Whether you want to fill this paragraph with some text like I'm doing right now, this place is perfect to describe some features or anything you want - React has a complete solution for you. +

+
+
+
+
+
+
+
diff --git a/how-to-add-defaults.md b/how-to-add-defaults.md new file mode 100644 index 0000000..a2f710a --- /dev/null +++ b/how-to-add-defaults.md @@ -0,0 +1,48 @@ +--- +layout: page +--- + +How to Add Defaults +========== + +You may need to change the default behavior or your API - perhaps you +want a default of 10 per page instead of 20. JSONAPI Suite provides +facilities that enable ***defaults*** that can be ***overridden*** - 10 per +page, unless elsewise specified by the user. + +You can see these defaults in the [Resource documentation](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Resource.html): + +{% highlight ruby %} +default_filter :active do |scope| + scope.where(active: true) +end + +default_page_size(10) + +default_sort([{ created_at: :desc }]) +{% endhighlight %} + +These can all be overriden by the user. In other words, hitting +`/posts` will only show active `Post`s, hitting +`/posts?filter[active]=false` will show inactive `Post`s. The same applies +for sorting and pagination. + +A common pattern is for default filters to apply for all users, but +allow overrides for administrators. You can use the `:if` option to +restrict the override: + +{% highlight ruby %} +# app/resources/post_resource.rb +allow_filter :active, if: :admin? + +# app/controllers/posts_controller.rb +def admin? + current_user.admin? +end +{% endhighlight %} + +Now the default behavior is to view only active `Post`s, but +*administrators* can override this default. + +
+
diff --git a/how-to-autodocument.md b/how-to-autodocument.md new file mode 100644 index 0000000..c050f31 --- /dev/null +++ b/how-to-autodocument.md @@ -0,0 +1,143 @@ +--- +layout: page +--- + +How to Autodocument with Swagger +========== + +You can follow the steps below, or [view the diff on github](https://github.com/jsonapi-suite/employee_directory/compare/step_23_disassociation...step_24_autodocumentation) + +This suite uses DSLs to specify inputs (`strong_resources`, filters, etc), and outputs (`jsonapi-rb` serializers). +We can introspect that DSL to provide automatic documentation. Not only +does this save a lot of time, it ensures your code and documentation are +never out of sync. + +Here we'll be using [swagger](https://swagger.io), a popular open-source +documentation framework. +
+
+ + + +
+To get this UI, we need to install two things: a controller that +generates a schema (`swagger.json`), and a static website +in `public`. Let's start by adding dependencies: +
+
+ +{% highlight ruby %} +# Gemfile +# Below 'jsonapi_suite' +gem 'jsonapi_spec_helpers' +gem 'jsonapi_swagger_helpers' +{% endhighlight %} + + + Note: here we're moving `jsonapi_spec_helpers` out of the + test-specific bundle group. Introspecting spec helpers is part of + autodocumenting, so we'll `require` them manually when our documentation + controller is loaded. + + +Our web UI is a Glimmer App, +but we'll only deal with the already-compiled static files glimmer builds. +Let's copy those files and expose them to the web by putting them in +`public`: + +{% highlight bash %} +$ mkdir -p public/api/docs && cd public/api/docs +$ git clone https://github.com/jsonapi-suite/swagger-ui.git && cp swagger-ui/prod-dist/* . && rm -rf swagger-ui +{% endhighlight %} + +Our documentation will be accessible at `/api/docs`, so we put the files +in `public/api/docs`. You may want a different directory depending on +your own routing rules. In either case, our next step is to edit +`index.html`: make sure any javascript and css has the correct URL. +There are also a few configuration options, such as providing a link to +Github. + +{% highlight javascript %} +window.CONFIG = { + githubURL: "http://github.com/user/repo", + basePath: "/api" // basePath/swagger.json, basePath/v1/employees, etc +} +{% endhighlight %} + +This static website will make a request to `/api/swagger.json`. Let's +build that endpoint now: + +{% highlight bash %} +$ touch app/controllers/docs_controller.rb +{% endhighlight %} + +{% highlight ruby %} +# config/routes.rb +scope path: '/api' do + resources :docs, only: [:index], path: '/swagger' + # ... code ... +end +{% endhighlight %} + +Our `DocsController` uses [swagger-blocks](https://github.com/fotinakis/swagger-blocks) to generate +the swagger schema. Here's the minimal setup needed to configure +swagger: + +{% highlight ruby %} +require 'jsonapi_swagger_helpers' + +class DocsController < ActionController::API + include JsonapiSwaggerHelpers::DocsControllerMixin + + swagger_root do + key :swagger, '2.0' + info do + key :version, '1.0.0' + key :title, '' + key :description, '' + contact do + key :name, '' + end + end + key :basePath, '/api' + key :consumes, ['application/json'] + key :produces, ['application/json'] + end +end +{% endhighlight %} + +That's it. Now, every time we add an endpoint, we can autodocument with +one line of code (below the `swagger_root` block): + +{% highlight ruby %} +jsonapi_resource '/v1/employees' +{% endhighlight %} + +This endpoint will be introspected for all RESTful actions, outputting +the full configuration. There are a few customization options: + +{% highlight ruby %} +jsonapi_resource '/v1/employees', + only: [:create, :index], + except: [:destroy], + descriptions: { + index: "Some additional documentation" + } +{% endhighlight %} + +If you want additional attribute-level documentation, you can add this +to your spec payloads: + +{% highlight ruby %} +key(:name, String, description: 'The full name, e.g. "John Doe"') +{% endhighlight %} + +
+Will give you an output similar to: +
+
+ + + +
+
diff --git a/how-to-build-an-adapter.md b/how-to-build-an-adapter.md new file mode 100644 index 0000000..a4ad488 --- /dev/null +++ b/how-to-build-an-adapter.md @@ -0,0 +1,118 @@ +--- +layout: page +--- + +Building an Adapter +========== + +If you find yourself repeatedly making customizations to a group of +`Resource`s and seek DRYer code, package those customizations into an +`Adapter`. Here we'll be starting from a previous how-to, [How to Use +Alternate ORMs](how-to-use-without-activerecord). + +You can follow along with the below code snippets, or [view the diff on +github](https://github.com/jsonapi-suite/employee_directory/compare/step_23_disassociation...elasticsearch_adapter). + +Adapters are simpler than you might think. It's little more than +copy-pasting those low-level customizations into a common class. + +Start by creating `lib/elasticsearch_adapter.rb`. Cut/past the sorting, +pagination, and `#resolve` overrides from `EmployeeResource` into the adapter, +turning into `def` methods along the way: + +{% highlight ruby %} +# lib/elasticsearch_adapter.rb +class ElasticsearchAdapter + def paginate(scope, current_page, per_page) + scope.metadata.pagination.current_page = current_page + scope.metadata.pagination.per_page = per_page + scope + end + + def order(scope, att, dir) + scope.metadata.sort = [{att: att, dir: dir}] + scope + end + + def resolve(scope) + scope.query! + scope.results + end +end +{% endhighlight %} + +Ensure our adapter gets loaded: + +{% highlight ruby %} +# config/initializers/jsonapi.rb +require 'elasticsearch_adapter' +{% endhighlight %} + +And switch to that adapter in `EmployeeResource`: + +{% highlight ruby %} +use_adapter ElasticsearchAdapter +{% endhighlight %} + +Bounce your server. You can still hit the `/api/v1/employees` endpoint +with the same sort and paginate functionality, but the code has been +moved to an adapter. + +Let's ensure our users can filter as well: + +{% highlight ruby %} +def filter(scope, att, val) + scope.condition(att).eq(val) +end +{% endhighlight %} + +For all the methods and functionality an adapter supports, see the +[Adapter documenation](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Adapters/Abstract.html). + +We probably also want `has_many`-style macros to avoid writing similar +`allow_sideload` code time after time. Start by specifying where this +functionality is defined, and add a `has_many` macro: + +{% highlight ruby %} +module Sideloading + def has_many(association_name, + scope:, + resource:, + foreign_key:, + primary_key: :id, + &blk) + # our code will go here + instance_eval(&blk) if blk + end +end + +def sideloading_module + Sideloading +end +{% endhighlight %} + +The `instance_eval` is there so we can always drop down to a lower-level +customization in our `Resource`. + +We can basically cut/paste our existing sideload code and rewrite it as +variables: + +{% highlight ruby %} +scope do |parents| + parent_ids = parents.map { |p| p.send(primary_key) } + scope.call.condition(foreign_key).or(parent_ids.uniq.compact) +end + +assign do |parents, children| + parents.each do |p| + relevant_children = children.select do |c| + c.send(foreign_key) == p.send(primary_key) + end + p.send(:"#{association_name}=", relevant_children) + end +end +{% endhighlight %} + +You can now remove any customizations from your `Resource` classes. You +can continue to build the adapter, adding `belongs_to`, statistics, and +more. [View the adapter documentation for the full API](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Adapters/Abstract.html). diff --git a/how-to-cause-side-effects.md b/how-to-cause-side-effects.md new file mode 100644 index 0000000..db35fa5 --- /dev/null +++ b/how-to-cause-side-effects.md @@ -0,0 +1,88 @@ +--- +layout: page +--- + +Side Effects +========== + +Side effects scenarios come up often. What if we want to send an email +notification every time a `Comment` is created? + +It's important to note that there are three overall categories of side effects, +and each requires a different solution: + +* Side effects internal to the `Model`: For example, setting a + `published_at` attribute. +* Side effects that should only occur on a specific request: For + example, only send an email update if we're creating a `Post` for the + first time, at the `/posts` endpoint. +* Side effects that should occur on every *type* of request: For +example, send an email notification every time a `Comment` is created - +but not updated - whether it was created at the `/comments` endpoint or sideposted at the +`/posts` endpoint. + +#### Internal Side-Effects + +For the first scenario, it's OK to use `ActiveRecord` callbacks (or the +equivalent functionality in a different ORM): + +{% highlight ruby %} +# app/models/user.rb +class Post < ApplicationRecord + before_save :set_published_at, + on: :update, + if: :publishing? + + private + + def set_published_at + self.published_at = Time.now + end + + def publishing? + status_changed? && status == 'published' + end +end +{% endhighlight %} + +#### Side-Effects on Specific Action + +Just like you would with vanilla Rails, use the controller. Here we'll +only send an email to our subscribers when the `Post` is first created. +Keep in mind we could also "sidepost" `Post` objects at the `/blogs` +endpoint, but this will only fire at the `/posts` endpoint. + +{% highlight ruby %} +class PostsController < ApplicationController + def create + post, success = jsonapi_create.to_a + + if success + PostMailer.published_email.deliver_later + render_jsonapi(post, scope: false) + else + render_errors_for(post) + end + end +end +{% endhighlight %} + +#### Side-Effects on Every Request of a Given Type + +Let's add some special logging every time we create a `Post`. Note this +will fire *every* time we create a `Post` - whether we create it at the +`/posts` endpoint or "sidepost" at the `/blogs` endpoint. + +We **do not** need to worry about this side-effect in our model specs, +or rake tasks, as the functionality is only relevant to the API. + +Edit your `Resource`: + +{% highlight ruby %} +# app/resources/post_resource.rb +def create(attributes) + Rails.logger.info "Post begin created by #{context.current_user.email}..." + super + Rails.logger.info "Success!" +end +{% endhighlight %} diff --git a/how-to-code-many-to-many-associations.md b/how-to-code-many-to-many-associations.md new file mode 100644 index 0000000..5cef123 --- /dev/null +++ b/how-to-code-many-to-many-associations.md @@ -0,0 +1,39 @@ +--- +layout: page +--- + +Many-to-Many Associations +========================= + +`has_and_belongs_to_many` are *possible*, but maybe not desirable +depending on your use case. Following the example from the [tutorial](/tutorial#many-to-many), +let's say an `Employee` has many `Team`s and a `Team` has many +`Employee`s. We could wire-up our `EmployeeResource` like so: + +{% highlight ruby %} +has_and_belongs_to_many :teams, + scope: -> { Team.all }, + foreign_key: { employee_teams: :employee_id }, + resource: TeamResource +{% endhighlight %} + +The only difference here is the `foreign_key` - we're passing a hash +instead of a symbol. `employee_teams` is our join table, and +`employee_id` is the true foreign key. + +This will work, and for simple many-to-many relationships you can move +on. But what if we want to add the property `primary`, a boolean, to the +`employee_teams` table? + +As this is *metadata about the relationship* it should go on the `meta` +section of the corresponding [relationship object](http://jsonapi.org/format/#document-resource-object-relationships). +While supporting such an approach is on the JSONAPI Suite roadmap, many +clients do not currently support this per-object level of functionality. + +For now, it might be best to simply expose the intermediate table to the +API. Using a client like +[JSORM](https://github.com/jsonapi-suite/jsorm), the overhead of this +approach is minimal. + +
+
diff --git a/how-to-code-polymorphic-associations.md b/how-to-code-polymorphic-associations.md new file mode 100644 index 0000000..125829e --- /dev/null +++ b/how-to-code-polymorphic-associations.md @@ -0,0 +1,62 @@ +--- +layout: page +--- + +Polymorphic Associations +========================= + +Let's say an `Employee` belongs to a `Workspace`. `Workspace`s have +different `type`s - `HomeOffice`, `Office`, `CoworkingSpace`, etc. + +Assuming we've already set up our database, let's add the associations +to our `Model`s: + +{% highlight ruby %} +# app/models/employee.rb +belongs_to :workspace, polymorphic: true +{% endhighlight %} + +{% highlight ruby %} +# app/models/workspace.rb +has_many :employees, as: :workspace +{% endhighlight %} + +Now we need to wire-up our resource. Usually you'd see something like +`has_many` with a few options. But here, we may actually want to change +our configuration based on `Workspace#type` - maybe each type of data is +stored in a separate table, for instance. + +We want to pass the same configuration, but on a type-by-type basis. In +other words, we need to group workspaces and define how to associate +each group: + +{% highlight ruby %} +# app/resources/employee_resource.rb +polymorphic_belongs_to :workspace, + group_by: :workspace_type, + groups: { + 'Office' => { + scope: -> { Office.all }, + resource: OfficeResource, + foreign_key: :workspace_id + }, + 'HomeOffice' => { + scope: -> { HomeOffice.all }, + resource: HomeOfficeResource, + foreign_key: :workspace_id + } + } +{% endhighlight %} + +Let's say our API was returning 10 `Employees`, sideloading their +corresponding `Workspace`. The underlying code would: + +* Fetch the employees +* Group the employees by the given key: `employees.group_by { |e| + e.workspace_type }` +* Use the `Office` configuration for all `Employee`s where + `workspace_type` is `Office`, and use the `HomeOffice` configuration +for all `Employee`s where `workspace_type` is `HomeOffice`. + +
+
diff --git a/how-to-conditionally-render-fields.md b/how-to-conditionally-render-fields.md new file mode 100644 index 0000000..5f55d59 --- /dev/null +++ b/how-to-conditionally-render-fields.md @@ -0,0 +1,52 @@ +--- +layout: page +--- + +Extra Attributes +========== + +Of course, JSONAPI already has the concept of sparse fieldsets built-in. +This behavior comes out-of-the-box at URLs like +`/people?fields[people]=title,active`. + +Sometimes it's necessary to conditionally render an *extra* field as +well. For instance, maybe rendering out the `net_worth` attribute is +computationally expensive and not often requested. + +Let's add a simple *extra attribute*: + +{% highlight ruby %} +# app/serializers/serializable_person.rb +extra_attribute :net_worth do + 1_000_000 +end +{% endhighlight %} + +This field will not be rendered when we hit `/people`. It will only be +rendered when we hit `/people?extra_fields[people]=net_worth`. The URL +signature is the same as [sparse fieldsets](http://jsonapi.org/format/#fetching-sparse-fieldsets). + +We may want to eager load some data, only when a specific extra field is +requested. We can do that by customizing the `Resource`: + +{% highlight ruby %} +# app/resources/person_resource.rb +extra_field :net_worth do |scope| + scope.includes(:assets) +end +{% endhighlight %} + +We will now eager load assets only when the `net_worth` extra field is +specified in the request. + +Finally, additional conditionals can still be applied: + +{% highlight ruby %} +# app/serializers/serializable_person.rb +extra_attribute :net_worth, if: proc { @context.allow_net_worth? } do +{% endhighlight %} + +If using Rails, `@context` is your controller. + +
+
diff --git a/how-to-customize-error-responses.md b/how-to-customize-error-responses.md new file mode 100644 index 0000000..c18430c --- /dev/null +++ b/how-to-customize-error-responses.md @@ -0,0 +1,81 @@ +--- +layout: page +--- + +Customizing Error Responses +========== + +Your application will automatically return a JSONAPI-compliant [error +object](http://jsonapi.org/format/#errors) whenever an error is raised. +That's due to this code in `ApplicationController`: + +{% highlight ruby %} +# app/controllers/application_controller.rb +rescue_from Exception do |e| + handle_exception(e) +end +{% endhighlight %} + +If we put `raise 'foo'` in a controller somewhere, we'd see the +response: + +{% highlight ruby %} +{ + errors: [ + code: 'internal_server_error', + status: '500', + title: 'Error', + detail: "We've notified our engineers and hope to address this issue shortly.", + meta: {} + ] +} +{% endhighlight %} + +This can all be customized. Let's say for all +`ActiveRecord::RecordNotFound` errors we want a 404 response code, with +the error `detail` providing a custom message: + +{% highlight ruby %} +# app/controllers/application_controlle.rb +register_exception ActiveRecord::RecordNotFound, + status: 422, + message: ->(e) { "Couldn't find record with id #{e.id}" } +{% endhighlight %} + +Would output: + +{% highlight ruby %} +{ + errors: [ + code: 'not_found', + status: '404', + title: 'Error', + detail: "Couldn't find record with id 123", + meta: {} + ] +} +{% endhighlight %} + +You can register exceptions in `ApplicationController`, or any subclass +if you want a specific controller to handle a given error differently. + +For more customization options, see the [jsonapi_errorable](https://github.com/jsonapi-suite/jsonapi_errorable) gem. + +You may want your test suite to throw errors, instead of returning +this friendly output. Configure this using `JsonapiErrorable.disable!`: + +{% highlight ruby %} +# spec/rails_helper.rb +config.before :each do + JsonapiErrorable.disable! +end + +# enable for specific test +it 'does something' do + JsonapiErrorable.enable! + # ... code ... +end +{% endhighlight %} + +
+
diff --git a/how-to-return-statistics.md b/how-to-return-statistics.md new file mode 100644 index 0000000..16d4b0a --- /dev/null +++ b/how-to-return-statistics.md @@ -0,0 +1,60 @@ +--- +layout: page +--- + +Statistics +========== + +Imagine a grid listing records. What if we want "X total records", +above that grid, or "average cost" elsewhere in our UI? + +These calculations are supported via `allow_stat`: + +{% highlight ruby %} +# app/resources/employee_resource.rb +allow_stat total: [:count] +{% endhighlight %} + +A GET to `/api/employees?stats[total]=count` would return: + +{% highlight ruby %} +{ + data: [...], + meta: { + stats: { + total: { + count: 100 + } + } + } +} +{% endhighlight %} + +A few 'default calculations' are provided: `count`, `sum`, `average`, +`maximum` and `minimum`. These will work out-of-the-box with `ActiveRecord`. +Alternatively, override these calculation functions: + +{% highlight ruby %} +allow_stat :salary do + average { |scope, attr| scope.average(attr) } +end +{% endhighlight %} + +Or support your own custom calculations: + +{% highlight ruby %} +allow_stat salary: [:average] do + standard_deviation { |scope, attr| ... } +end +{% endhighlight %} + +Multiple stats are supported with one request: + +> GET /api/employees?stats[salary]=average,maximum&stats[total]=count + +If you want **only** stats, and no records (for performance), simple pass page size 0: + +> GET /api/employees?stats[salary]=average&page[size]=0 + +
+
diff --git a/how-to-scope-to-current-user.md b/how-to-scope-to-current-user.md new file mode 100644 index 0000000..2c47c7c --- /dev/null +++ b/how-to-scope-to-current-user.md @@ -0,0 +1,93 @@ +--- +layout: page +--- + +Scoping to Current User +========== + +### Scenario: Scoping Queries + +> Given a `Post` model with `hidden` attribute, only allow administrators +to view hidden `Posts`. + +Let's start by adding a `visible` scope to `Post`, so we can easily +retrive only `Post`s where `hidden` is `false`: + +{% highlight ruby %} +# app/models/post.rb +scope :visible, -> { where(hidden: false) } +{% endhighlight %} + +As you know, we would typically use the base scope `Post.all` like so: + +{% highlight ruby %} +def index + render_jsonapi(Post.all) +end +{% endhighlight %} + +Let's instead use the base scope `Post.visible` when the user is not an +administrator: + +{% highlight ruby %} +def index + scope = current_user.admin? ? Post.all : Post.visible + render_jsonapi(scope) +end +{% endhighlight %} + +That's it! Now only administrators can view hidden `Post`s. + +### Privileged Writes + +> Given `Post`s that have an `internal` attribute, only allow +internal users to publish internal posts. + +Our controller context is available in our resource. Let's override +`Resource#create` to ensure correct privileging: + +{% highlight ruby %} +def create(attributes) + if !internal_user? && attributes[:internal] == true + raise "Hey you! YOU can't publish internal posts!" + else + super + end +end + +private + +def internal_user? + context.current_user.internal? +end +{% endhighlight %} + +### Guarding Filters + +> Given `Employee`s with attribute `under_performance_review`, do not allow clients to find all employees under performance review. + +Occasionally you need to guard filters based on the current user. Use +the `:if` option on `allow_filter`. This will execute in the context of +your controller: + +{% highlight ruby %} +# app/resources/employee_resource.rb +allow_filter :name, if: :admin? +{% endhighlight %} + +{% highlight ruby %} +# app/controllers/employees_controller.rb +class EmployeesController < ApplicationController + jsonapi resource: EmployeeResource + + def index + render_jsonapi(Employee.all) + end + + private + + def admin? + current_user.admin? + end +end +{% endhighlight %} diff --git a/how-to-use-without-activerecord.md b/how-to-use-without-activerecord.md new file mode 100644 index 0000000..89c7c0a --- /dev/null +++ b/how-to-use-without-activerecord.md @@ -0,0 +1,197 @@ +--- +layout: page +--- + +Usage Without ActiveRecord: ElasticSearch +========== + +Though we'll be hitting [elasticsearch](https://www.elastic.co) in this +example, remember that this is just an HTTP API underneath the hood. The +same pattern applies to a variety of use cases. + +First we need a **Client** for `elasticsearch`. Though you can feel free +to use a variety of clients, this example will use [trample](http://richmolj.github.io/trample). + +Though we'll show code snippets below, feel free to [view the diff on +github](https://github.com/jsonapi-suite/employee_directory/compare/step_23_disassociation...elasticsearch). + +Also keep in mind, we'll be showing a one-off customization here. You +probably want to extract this code into an `Adapter` if this is going to +become a core component of your application. + +Start by installing trample: + +{% highlight ruby %} +# Gemfile +gem 'trample_search', require: 'trample' +{% endhighlight %} + +Tell [searchkick](https://github.com/ankane/searchkick) that we want to +index `Employee`s and `Position`s: + +{% highlight ruby %} +# app/models/employee.rb +searchkick text_start: [:first_name] + +# app/models/position.rb +searchkick text_start: [:title] +{% endhighlight %} + +Define our search classes. These tell trample the configuration of the +search: + +{% highlight ruby %} +# app/models/employee_search.rb +class EmployeeSearch < Trample::Search + model Employee + + condition :first_name, single: true + condition :last_name, single: true +end + +# app/models/position_search.rb +class PositionSearch < Trample::Search + model Position + + condition :title, single: true + condition :employee_id +end +{% endhighlight %} + +In our controller, we need to pass a base scope. Before, we were passing +an `ActiveRecord::Relation` (`Post.all`). Let's pass an instance +of `Trample::Search` instead. Since by default search results come back +as `Hashie::Mash`es, we'll also specify our serializer directly. You +could also use a generic `SearchResult` serializer, it's up to you. + +{% highlight ruby %} +# app/controllers/employees_controller.rb +def index + render_jsonapi EmployeeSearch.new, + class: SerializableEmployeeSearchResult +end +{% endhighlight %} + +{% highlight ruby %} +# app/serializers/serializable_employee_search_result.rb +class SerializableEmployeeSearchResult < JSONAPI::Serializable::Resource + type :employees + + attribute :first_name + attribute :last_name + attribute :created_at + attribute :updated_at + + has_many :positions, class: 'SerializablePositionSearchResult' +end +{% endhighlight %} + +Since we are now passing a non-default base scope, we need to tell our +`Resource` how to query and resolve this new scope. Start by switching to +the pass-through adapter, and resolve using `trample`'s query API: + +{% highlight ruby %} +# app/resources/employee_resource.rb +use_adapter JsonapiCompliable::Adapters::Null +# ... code ... +def resolve(scope) + scope.query! + scope.results +end + +# remove the belongs_to for now +{% endhighlight %} + + + +You can now hit `http://localhost:3000/api/v1/employees` - the exact +same payload is coming back, but is now sourced from `elasticsearch`! + +Let's add a prefix filter: + +{% highlight ruby %} +# app/resources/employee_resource.rb +allow_filter :first_name_prefix do |scope, value| + scope.condition(:first_name).starts_with(value) +end +{% endhighlight %} + +Hit `http://localhost:3000/api/v1/employees?filter[first_name]=hom`. +You're now successfully querying the `elasticsearch` index. + + If we want sorting and pagination, we need to tell the `Resource` + how to deal with that, too: + +{% highlight ruby %} +# app/resources/employee_resource.rb +paginate do |scope, current_page, per_page| + scope.metadata.pagination.current_page = current_page + scope.metadata.pagination.per_page = per_page + scope +end + +sort do |scope, att, dir| + scope.metadata.sort = [{att: att, dir: dir}] + scope +end +{% endhighlight %} + +View the [Resource](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Resource.html) and [Adapter](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Adapters/Abstract.html) documentation for additional overrides, like statistics. + +The last step is adding the `positions` association. If we want +`has_many`-style macros we need to create an `Adapter`, but for now +let's simply use the lower-level `allow_sideload` DSL. We need to define +two functions: how to build a scope for the association, and how to +associate the resulting objects: + +{% highlight ruby %} +# app/resources/employee_resource.rb +allow_sideload :positions, resource: PositionResource do + scope do |employees| + scope = PositionSearch.new + scope.condition(:employee_id).or(employees.map(&:id)) + end + + assign do |employees, positions| + employees.each do |e| + e.positions = positions.select { |p| p.employee_id = e.id } + end + end +end +{% endhighlight %} + +Convert the `PositionResource` to use `elasticsearch`, just like we did +for `Employee`: + +{% highlight ruby %} +# app/resources/position_resource.rb +use_adapter JsonapiCompliable::Adapters::Null + +def resolve(scope) + scope.query! + scope.results +end +{% endhighlight %} + +Create the `SerializablePositionSearchResult` class that we referenced +in `app/serializers/serializable_employee.rb`: + +{% highlight ruby %} +class SerializablePositionSearchResult < JSONAPI::Serializable::Resource + type :positions + + attribute :title +end +{% endhighlight %} + +We can now sideload `positions` - check out the results at +`http://localhost:3000/api/v1/employees?include=positions`. We're +fetching employees and their corresponding `positions` in a single +request, via `elasticsearch`. Any filters/changes/default sort/etc that +apply to `PositionResource` can be re-used at this endpoint. + +If this was a one-off section of our application, we can call this good +enough and move on. But as we continue to use this pattern, it's going +to get monotonous writing the same filter overrides, `allow_sideload` +wiring code, etc. To DRY up this code, we can package our changes into +an [Adapter](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Adapters/Abstract.html). diff --git a/how-to-write-specs.md b/how-to-write-specs.md new file mode 100644 index 0000000..b732933 --- /dev/null +++ b/how-to-write-specs.md @@ -0,0 +1,120 @@ +--- +layout: page +--- + +Writing Specs +========== + +> NB: before writing specs, make sure you are set up correctly by +> following the [Quickstart]({{site.github.url}}/quickstart) + +Validating verbose JSON API responses in tests can be a pain. We could +use something like [json_matchers](https://github.com/thoughtbot/json_matchers) to validate a schema, but we hope to do one better - let's validate full payloads with a few simple helpers, using full-stack [rspec request specs](https://github.com/rspec/rspec-rails#request-specs). + +Let's say we're testing the `show` action of our employees controller, sideloading the employee's department. Follow the [Quickstart]({{site.github.url}}/quickstart) to make sure your `rails_helper.rb` is setup correctly first. + +Let's say we're testing the `show` action of our employees controller, sideloading the employee's department. + +Let's begin with vanilla RSpec of what the test might look like: + +{% highlight ruby %} +require 'rails_helper' + +RSpec.describe 'employees#show', type: :request do + let!(:homer) { Employee.create!(name: 'Homer Simpson') } + let!(:safety) { employee.create_department!(name: 'Safety') } + + it 'renders an employee, sideloading department' do + get "/api/employees/#{homer.id}", params: { + include: 'department' + } + # ... code asserting json response ... + end +end +{% endhighlight %} + +To avoid painful json assertions, let's use [jsonapi_spec_helpers](https://github.com/jsonapi-suite/jsonapi_spec_helpers). Start by adding some setup code: + +{% highlight ruby %} +# spec/rails_helper.rb +require 'jsonapi_spec_helpers' + +RSpec.configure do |config| + config.include JsonapiSpecHelpers +end +{% endhighlight %} + +And now to validate the response, we'll call `assert_payload`: + +{% highlight ruby %} +assert_payload(:employee, homer, json_item) +assert_payload(:department, safety, json_include('departments')) +{% endhighlight %} + +`assert_payload` takes three arguments: +* The name of a payload we've defined (we haven't done this yet). +* The record we want to compare against +* The relevant slice of json. `json_item` and `json_includes` are + helpful methods to target the right slice. You can see all helpers in +the documentation for `jsonapi_spec_helpers`. + +OK, so we want to take a record, response JSON, and compare them against +something pre-defined. Let's write those definitions; they look very similar to +something you'd write for [factory_girl](https://github.com/thoughtbot/factory_girl): + +{% highlight ruby %} +# spec/payloads/employee.rb +JsonapiSpecHelpers::Payload.register(:employee) do + key(:name) + key(:email) + + timestamps! +end + +# spec/payloads/department.rb +JsonapiSpecHelpers::Payload.register(:department) do + key(:name) +end +{% endhighlight %} + +`assert_payload` will do four things: + +* Ensure keys that are not in the payload definition are **not** present. +* Ensure all keys in the registered payload **are** present. +* Ensures no value in a key/value pair is `nil` (this is overrideable). +* Ensures each key matches the expected record value. In other words, + we're doing something like `expect(json['email']).to eq(homer.email)`. + +The comparison value can be customized. Let's say we serialize the +`name` attribute as a combination of the employee's `first_name` and +`last_name`: + +{% highlight ruby %} +key(:name) { |record| "#{record.first_name} #{record.last_name}" } +{% endhighlight %} + +Optionally, validate against a type as well. If both the expected and +actual values match, but are the incorrect type, the test will fail: + +{% highlight ruby %} +key(:salary, Integer) +{% endhighlight %} + +You can also customize/override payloads at runtime in your test. Let's +say we only serialize `salary` when the current user is an admin. Your +test could look something like: + +{% highlight ruby %} +sign_in(:user) +assert_payload(:employee, homer, json_item) +sign_in(:admin) +assert_payload(:employee, homer, json_item) do + key(:salary) +end +{% endhighlight %} + +For documentation on all the spec helpers we provide, check out the +[jsonapi_spec_helpers](https://github.com/jsonapi-suite/jsonapi_spec_helpers) gem. + +
+
diff --git a/index.md b/index.md new file mode 100644 index 0000000..1eb5d67 --- /dev/null +++ b/index.md @@ -0,0 +1,6 @@ +--- +# You don't need to edit this file, it's empty on purpose. +# Edit theme's home layout instead if you wanna make some changes +# See: https://jekyllrb.com/docs/themes/#overriding-theme-defaults +layout: home +--- diff --git a/js/authentication.md b/js/authentication.md new file mode 100644 index 0000000..fa8578b --- /dev/null +++ b/js/authentication.md @@ -0,0 +1,73 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### Authentication + +JSORM supports [JSON Web Tokens](https://jwt.io/introduction). These can +be set manually, or automatically fetched from `localStorage`. + +To set manually: + +{% highlight typescript %} +ApplicationRecord.jwt = 'myt0k3n' +{% endhighlight %} +> All requests will now send the header:
+> `Authorization: Token token="myt0k3n"`. + +To set via `localStorage`, simply store the token with a key of `jwt` +and it will be set automatically. To customize the `localStorage` key: + +{% highlight typescript %} +ApplicationRecord.jwtStorage = "authtoken" +{% endhighlight %} + +...or to opt-out of `localStorage` altogether: + +{% highlight typescript %} +ApplicationRecord.jwtStorage = false +{% endhighlight %} + +You can control the format of the header that is sent to the +server: + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} + class ApplicationRecord extends JSORMBase { + // ... code ... + static generateAuthHeader(token) { + return `Bearer ${token}` + } + } + {% endhighlight %} + + {% highlight javascript %} + var ApplicationRecord = JSORMBase.extend({ + // ... code ... + static: { + generateAuthHeader: function(token) { + return "Bearer " + token; + } + } + }); + {% endhighlight %} +
+ +Finally, if your server returns a refreshed JWT within the `X-JWT` +header, it will be used in all subsequent requests (and `localStorage` +will be updated automatically if you're using it). + + diff --git a/js/ddau.md b/js/ddau.md new file mode 100644 index 0000000..46db22d --- /dev/null +++ b/js/ddau.md @@ -0,0 +1,23 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### Data Down, Actions Up + +It's a [popular pattern](http://www.samselikoff.com/blog/data-down-actions-up) to pass data **down** to components, avoid modifying state within the component, and instead pass **actions up** to modify state. This can make complex applications easier to track and reason about, and you'll see it in client-side frameworks from React to Ember. + +To follow this pattern, use `#dup()` when passing down to your component: + +{% highlight bash %} + +{% endhighlight %} + +This will create a new instance of the model with all the same state. +Avoid modifying this instance in your component and instead pass +**actions up**. + +When opting-in to [state-syncing]({{ site.github.url }}/js/state-syncing) these instances will sync-up whenever one of these is instances is persisted. You won't have to worry about updating the child component when the parent instance is saved. diff --git a/js/home.md b/js/home.md new file mode 100644 index 0000000..1d4725f --- /dev/null +++ b/js/home.md @@ -0,0 +1,107 @@ +--- +layout: page +--- + +

+ JSORM + the isomorphic, framework-agnostic Javascript ORM +

+ +{% include js-toc.html %} + +
+ > **Start here**: [Why JSORM?]({{ site.github.url }}/js/introduction) + +
+
+ Typescript +
+
+ Javascript +
+
+
+ {% highlight typescript %} +// JSORM is like "ActiveRecord in Javascript". It can: +// +// * Deeply nest reads and writes +// * Automatically handle validation errors +// * Replace *ux patterns +// * ...and much more! + +// define models +@Model() +class ApplicationRecord extends JSORMBase { + static baseUrl = "http://my-api.com" + static apiNamespace = "/api/v1" +} + +@Model() +class Person extends ApplicationRecord { + static jsonapiType = "people" + + @Attr() firstName: string + @Attr() lastName: string + + get fullName() { + return `${this.firstName} ${this.lastName}` + } +} + +// execute queries +Person + .where({ first_name: 'John' }) + .order({ created_at: 'desc' }) + .per(10).page(2) + .includes({ jobs: 'company' }) + .select({ people: ['first_name', 'last_name'] }) + +// persist data +let person = new Person({ firstName: 'Jane' }) +person.save() + {% endhighlight %} + + {% highlight javascript %} +// JSORM is like "ActiveRecord in Javascript". It can: +// +// * Deeply nest reads and writes +// * Automatically handle validation errors +// * Replace *ux patterns +// * ...and much more! + +var jsorm = require('jsorm') + +// define models +const ApplicationRecord = jsorm.JSORMBase.extend({ + static: { + baseUrl: 'http://my-api.com', + apiNamespace: '/api/v1' + } +}) + +const Person = ApplicationRecord.extend({ + attrs: { + firstName: jsorm.attr(), + lastName: jsorm.attr() + }, + methods: { + fullName: function() { + return this.firstName + ' ' + this.lastName; + } + } +}) + +// execute queries +Person + .where({ first_name: 'John' }) + .order({ created_at: 'desc' }) + .per(10).page(2) + .includes({ jobs: 'company' }) + .select({ people: ['first_name', 'last_name'] }) + +// persist data +var person = new Person({ firstName: 'Jane' }) +person.save() + {% endhighlight %} +
+
diff --git a/js/installation.md b/js/installation.md new file mode 100644 index 0000000..883117c --- /dev/null +++ b/js/installation.md @@ -0,0 +1,313 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### Installation + +Installation is straightforward. Since we use `fetch` underneath the +hood, we recommend installing alongside a `fetch` polyfill. + +If using `yarn`: + +{% highlight bash %} +$ yarn add jsorm isomorphic-fetch +{% endhighlight %} + +If using `npm`: + +{% highlight bash %} +$ npm install jsorm isomorphic-fetch +{% endhighlight %} + +Now import it: + +{% include js-code-tabs.html %} +
+{% highlight typescript %} +import { + Model, + JSORMBase, + Attr, + BelongsTo, + HasMany + // etc +} from "jsorm" +{% endhighlight %} + +{% highlight javascript %} +const { + JSORMBase, + attr, + belongsTo, + hasMany + // etc +} = require("jsorm/dist/jsorm") +{% endhighlight %} +
+ +...or, if you're avoiding JS modules, `jsorm` will be available as a global in +the browser. + +### Defining Models + +#### Connecting to the API + +Just like `ActiveRecord`, our models will inherit from a base class that +holds connection information (`ApplicationRecord`, or +`ActiveRecord::Base` in Rails < 5): + +{% include js-code-tabs.html %} +
+{% highlight typescript %} +class ApplicationRecord extends JSORMBase { + static baseUrl = "http://my-api.com" + static apiNamespace = "/api/v1" +} +{% endhighlight %} + +{% highlight javascript %} +const ApplicationRecord = JSORMBase.extend({ + static: { + baseUrl: "http://my-api.com", + apiNamespace: "/api/v1" + } +}) +{% endhighlight %} + +All URLs follow the following pattern: + + * `baseUrl` + `apiNamespace` + `jsonapiType` + +As you can see above, typically `baseUrl` and `apiNamespace` are set on +a top-level `ApplicationRecord` (though any subclass can override). +`jsonapiType`, however, is set per-model: + +{% include js-code-tabs.html %} +
+{% highlight typescript %} +class Person extends ApplicationRecord { + static jsonapiType = "people" +} +{% endhighlight %} + +{% highlight javascript %} +const Person = ApplicationRecord.extend({ + static: { + jsonapiType: "people" + } +}) +{% endhighlight %} +
+ +With the above configuration, all `Person` endpoints will begin +`http://my-api.com/api/v1/people`. + +> **TIP**: Avoid CORS and use relative paths by simply setting `baseUrl` to +`""` + +> **TIP**: You can always use the `endpoint` option to override this pattern +and set the endpoint manually. + +#### Defining Attributes + +`ActiveRecord` automatically sets attributes by introspecting database +columns. We could do the same - `swagger.json` is our schema - but tend +to agree with those who feel this aspect of `ActiveRecord` is a bit too +"magical". In addition, explicitly defining our attributes can be used +to track which applications are using which attributes of the API. + +Though this is configurable, by default we expect the API to be +`under_scored` and attributes to be `camelCased`. + +{% include js-code-tabs.html %} +
+{% highlight typescript %} +class Person extends ApplicationRecord { + // ... code ... + @Attr() firstName: string + @Attr() lastName: string + @Attr() age: number + + get fullName() : string { + return `${this.firstName} ${this.lastName}` + } +} + +let person = new Person({ firstName: "John" }) +person.firstName // "John" +person.lastName = "Doe" +person.attributes // { firstName: "John", lastName: "Doe" } +person.fullName // "John Doe" +{% endhighlight %} + +{% highlight javascript %} +const attr = jsorm.attr +const Person = ApplicationRecord.extend({ + // ... code ... + attrs: { + firstName: attr(), + lastName: attr(), + age: attr() + },} + methods: { + fullName: function() { + return this.firstName + " " + this.lastName; + } + } +}) + +var person = new Person({ firstName: "John" }) +person.firstName // "John" +person.lastName = "Doe" +person.attributes // { firstName: "John", lastName: "Doe" } +person.fullName() // "John Doe" +{% endhighlight %} +
+ +Attributes can be marked read-only, so they are never sent to the server +on a write request: + +{% include js-code-tabs.html %} +
+{% highlight typescript %} +@Attr({ persist: false }) createdAt: string +@Attr({ persist: false }) updatedAt: string +{% endhighlight %} + +{% highlight javascript %} +attrs: { + createdAt: attr({ persist: false }), + updatedAt: attr({ persist: false }) +} +{% endhighlight %} +
+ +#### Defining Relationships + +Just like `ActiveRecord`, there are `HasMany`, `BelongsTo`, and +`HasOne` relationships: + +{% include js-code-tabs.html %} +
+{% highlight typescript %} +class Dog extends ApplicationRecord { + // ... code ... + @BelongsTo() person: Person[] +} + +class Person extends ApplicationRecord { + // ... code ... + @HasMany() dogs: Dog[] +} +{% endhighlight %} + +{% highlight javascript %} +const hasMany = jsorm.hasMany +const belongsTo = jsorm.belongsTo + +const Person = ApplicationRecord.extend({ + // ... code ... + attrs: { + dogs: hasMany() + } +}) + +const Dog = ApplicationRecord.extend({ + // ... code ... + attrs: { + person: belongsTo() + } +}) +{% endhighlight %} +
+ +By default, we expect the relationship name to correspond to a +pluralized `jsonapiType` on a separate `Model`. If your models don't +use this convention, feel free to supply it explicitly: + +{% include js-code-tabs.html %} +
+{% highlight typescript %} +class Dog extends ApplicationRecord { + // ... code ... + @BelongsTo('people') owner: Person[] +} + +// alternatively, specify the class directly + +class Dog extends ApplicationRecord { + // ... code ... + @BelongsTo(Person) owner: Person[] +} +{% endhighlight %} + +{% highlight javascript %} +const Dog = ApplicationRecord.extend({ + // ... code ... + attrs: { + owner: belongsTo('people') + } +}) +{% endhighlight %} +
+ +Relationships can be: + +* Assigned via constructor +* Assigned directly +* Automatically loaded via `.includes()` (see [reads](/js/reads)) +* Saved in a single request `.save({ with: 'dogs' })` (see +[writes](/js/writes)) + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} +let dog = new Dog({ name: "Fido" }) +let person = new Person({ dogs: [dog] }) +person.dogs[0].name // "Fido" + +let person = new Person() +person.dogs = [dog] +person.dogs[0].name // "Fido" + +// Will auto-create Dog instance +let person = new Person({ dogs: [{ name: "Scooby" }] }) +person.dogs[0].name // "Scooby" + +let person = (await Person.includes('dogs')).data +person.dogs // array of Dog instances from the server + {% endhighlight %} + + {% highlight javascript %} +var dog = new Dog({ name: "Fido" }) +var person = new Person({ dogs: [dog] }) +person.dogs[0].name // "Fido" + +let person = new Person() +person.dogs = [dog] +person.dogs[0].name // "Fido" + +// Will auto-create Dog instance +var person = new Person({ dogs: [{ name: "Scooby" }] }) +person.dogs[0].name // "Scooby" + +Person.includes('dogs').then((response) => { + var person = response.data + person.dogs // array of Dog instances from the server +}) + {% endhighlight %} +
+ + diff --git a/js/introduction.md b/js/introduction.md new file mode 100644 index 0000000..b83e069 --- /dev/null +++ b/js/introduction.md @@ -0,0 +1,39 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### Why JSORM? + +Contracts like JSONAPI and GraphQL treat the API like a database. When querying a +database, we have two options: + + * Type the low-level query language directly (in the database world, + this would be hand-typing SQL). + * Use an ORM (like Rails's `ActiveRecord`, Phoenix's `Ecto`, Django's + `DjangoORM`, or Node's `Sequelize`). + +While both options have pros and cons, we tend to think ORMs +have two overwhelming benefits: ***ease of use*** and ***composable queries***. +We'll explore both these concepts in other sections. + +So, we want a javascript ORM for our JSONAPI "database". Because +`ActiveRecord` is arguably the most well-known ORM, we've tried to match +its interface to make this library accessible to new users. That said, +you'll find we've tried to favor *explicitness* over *implicitness* in +order to avoid common `ActiveRecord` pitfalls. + +
+ + diff --git a/js/middleware.md b/js/middleware.md new file mode 100644 index 0000000..afb9f3f --- /dev/null +++ b/js/middleware.md @@ -0,0 +1,85 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### Middleware + +Middleware is helpful whenever you want to globally intercept request. +This is accomplished by assigning a `MiddlewareStack` to your +`ApplicationRecord`. Each stack has `beforeFilters` and `afterFilters` +where you can globally modify requests. If you `throw("abort")`, the +promise will be rejected. + +Example: redirecting to the login page every time the server returns `401`: + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} + import { MiddlewareStack } from 'jsorm' + + let middleware = new MiddlewareStack() + middleware.afterFilters.push((response, json) => { + if (response.status === 401) { + window.location.href = "/login" + throw("abort") + } + }) + + ApplicationRecord.middlewareStack = middleware + {% endhighlight %} + + {% highlight javascript %} + var MiddlewareStack = jsorm.MiddlewareStack; + + var middleware = new MiddlewareStack(); + middleware.afterFilters.push(function(response, json) { + if (response.status === 401) { + window.location.href = "/login"; + throw("abort"); + } + }); + + ApplicationRecord.middlewareStack = middleware; + {% endhighlight %} +
+ +Example: adding a custom header before the request is sent: + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} + import { MiddlewareStack } from 'jsorm' + + let middleware = new MiddlewareStack() + middleware.beforeFilters.push((url, options) => { + options.headers["CUSTOM-HEADER"] = "whatever" + }) + + ApplicationRecord.middlewareStack = middleware + {% endhighlight %} + + {% highlight javascript %} + var MiddlewareStack = jsorm.MiddlewareStack; + + var middleware = new MiddlewareStack(); + middleware.beforeFilters.push(function(url, options) { + options.headers["CUSTOM-HEADER"] = "whatever"; + }); + + ApplicationRecord.middlewareStack = middleware; + {% endhighlight %} +
+ + diff --git a/js/reads/fieldsets.md b/js/reads/fieldsets.md new file mode 100644 index 0000000..2fd9144 --- /dev/null +++ b/js/reads/fieldsets.md @@ -0,0 +1,58 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### Sparse Fieldsets + +Use `#select()` to limit the fields returned by the server: + +{% highlight typescript %} +Post.select(['title', 'status']).all() +{% endhighlight %} +
+

/posts?fields[posts]=title,status

+
+ +When dealing with relationships, it may be easier to pass an object, +where the key is the corresponding JSONAPI type. This will be exactly +what's sent to the server in `?fields`: + +{% highlight typescript %} +Post.select({ + posts: ['title', 'status'], + comments: ['created_at'] +}).all() +{% endhighlight %} +
+

/posts?fields[posts]=title,status&fields[comments]=created_at

+
+ + +### Extra Fieldsets + +Use `#selectExtra()` to explicitly request a field that doesn't usually +come back (often computationally expensive): + +{% highlight typescript %} +Post.selectExtra(['highlights', 'cumulative_ranking']).all() +{% endhighlight %} +
+

/posts?extra_fields[posts]=highlights,cumulative_ranking

+
+ +Just like the `select` example above, feel free to pass an object +specifying the fields for each relationship. + + diff --git a/js/reads/filtering.md b/js/reads/filtering.md new file mode 100644 index 0000000..0675b04 --- /dev/null +++ b/js/reads/filtering.md @@ -0,0 +1,69 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### Filtering + +Use `#where()` to apply filters: + +{% highlight typescript %} +Post.where({ important: true }).all() +{% endhighlight %} +
+

/posts?filter[important]=true

+
+ +`#where()` clauses can be chained together. If the same key is seen +twice, it will be overridden: + +{% highlight typescript %} +Post + .where({ important: true }) + .where({ ranking: 10 }) + .where({ important: false }) + .all() +{% endhighlight %} +
+

/posts?filter[important]=false&filter[ranking]=10

+
+ +`#where()` clauses are based on **server implementation**. The key +should be exactly as the server understands it. Here are some common +conventions we promote: + +{% highlight typescript %} +// id greater than 5 +Post.where({ id_gt: 5 }).all() + +// id greater than or equal to 5 +Post.where({ id_gte: 5 }).all() + +// id less than 5 +Post.where({ id_lt: 5 }).all() + +// id less or equal to 5 +Post.where({ id_lte: 5 }).all() + +// title starts with "foo" +Post.where({ title_prefix: "foo" }).all() + +// OR these two values +Post.where({ status_or: ['draft', 'review'] }) + +// AND these two values (default) +Post.where({ status: ['draft', 'review'] }) +{% endhighlight %} + + diff --git a/js/reads/includes.md b/js/reads/includes.md new file mode 100644 index 0000000..401cffc --- /dev/null +++ b/js/reads/includes.md @@ -0,0 +1,46 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### Includes + +Use `#includes()` to ["sideload"](http://jsonapi.org/format/#fetching-includes) associations: + +{% highlight typescript %} +Post.includes("comments").all() +{% endhighlight %} +
+

/posts?include=comments

+
+ +You can also pass an array of associations: + +{% highlight typescript %} +Post.includes(["blog, "comments"]).all() +{% endhighlight %} +
+

/posts?include=blog,comments

+
+ +Or an object for nested associations: + +{% highlight typescript %} +Post.includes(["blog", { comments: "author" }]).all() +{% endhighlight %} +
+

/posts?include=blog,comments.author

+
+ + diff --git a/js/reads/index.md b/js/reads/index.md new file mode 100644 index 0000000..15082f8 --- /dev/null +++ b/js/reads/index.md @@ -0,0 +1,221 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### Reads + +The interface for read operations is a simpler version of the +[ActiveRecord Query Interface](http://guides.rubyonrails.org/active_record_querying.html). +Instead of generating SQL, we'll be generating JSONAPI requests. + +### Basic Finders + +Execute queries with `.all()`, `find()`, or `.first()`: + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} +let response = await Post.all() +response.data // array of Post instances + {% endhighlight %} + {% highlight javascript %} +Post.all().then(function(response) { + response.data // array of Post instances +}); + {% endhighlight %} +
+
+

GET /posts

+
+ +{% include js-code-tabs.html %} +
+ {% highlight typescript %} +let response = await Post.find(123) +response.data // Post instance + {% endhighlight %} + {% highlight javascript %} +Post.find(123).then(function(response) { + response.data // Post instance +}); + {% endhighlight %} +
+
+

GET /posts/123

+
+ +{% include js-code-tabs.html %} +
+ {% highlight typescript %} +let response = await Post.first() +response.data // Post instance + {% endhighlight %} + {% highlight javascript %} +Post.first().then(function(response) { + response.data // Post instance +}); + {% endhighlight %} +
+
+

GET /posts?page[size]=1

+
+ +### Composable Queries with Scopes + +The beauty of ORMs is their ability to compose queries. We'll be doing +this by chaining together `Scope`s (query fragments). All of the methods +you see on this page can be chained together - the request will not fire +until the chain ends with `all()`, `first()`, or `find`. Example: + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} +let scope = Post.order({ name: "desc" }) + +if (someCheckboxIsChecked) { + scope = scope.where({ important: true }) +} else { + scope = scope.where({ important: false }) +} + +scope.all() // request fires + {% endhighlight %} + + {% highlight javascript %} +var scope = Post.order({ name: "desc" }); + +if (someCheckboxIsChecked) { + scope = scope.where({ important: true }); +} else { + scope = scope.where({ important: false }); +} + +scope.all() // request fires + {% endhighlight %} +
+
+

/posts?sort=-name&filter[important]=true

+

/posts?sort=-name&filter[important]=false

+
+ +In practice, you'll probably have some scopes you want to re-use across +different contexts. A best practice is to store these scopes as class +methods (static methods) in the model: + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} +class Post extends ApplicationRecord { + // ... code ... + static superImportant() { + return this + .where({ ranking_gt: 8 }) + .order({ ranking: 'desc' }) + .stats({ total 'count' }) + } +} + +// get 10 super important posts +let scope = Post.superImportant().per(10) +scope.all() // fire query + {% endhighlight %} + + {% highlight javascript %} +const Post = ApplicationRecord.extend({ + // ... code ... + static: { + superImportant() { + return this + .where({ ranking_gt: 8 }) + .order({ ranking: 'desc' }) + .stats({ total 'count' }) + } + } +}) + +// get 10 super important posts +var scope = Post.superImportant().per(10); +scope.all() // fire query + {% endhighlight %} +
+
+

/posts?sort=-ranking&stats[total]=count&page[size]=10&filter[ranking_gt]=8

+
+ +### Metadata + +The [meta information](http://jsonapi.org/format/#document-meta) of the +JSONAPI response is available as a POJO on the response: + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} +let response = await Post.all() +response.meta // { stats: { total: { count: 100 } } } + {% endhighlight %} + {% highlight javascript %} +await Post.all().then(function(response) { + response.meta // { stats: { total: { count: 100 } } } +}) + {% endhighlight %} +
+ +### Promises and Async/Await + +The result of `all()`, `first()` or `find` is a [Promise](https://developers.google.com/web/fundamentals/primers/promises). The promise will resolve to a `Response` object. + +A `Response` object has three keys - `data`, `meta`, and `raw`. `data` - the one +you'll be using the most - will be a `Model` instance (or array of +`Model`) instances. `meta` will be the [Meta Information](http://jsonapi.org/format/#document-meta) returned by the API (mostly used for statistics in our case). `raw` is only used to introspect the raw response document. + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} +Post.all().then((response) => { + response.data // array of Post instances + response.meta // js object from the server + response.raw // js response document +}) + {% endhighlight %} + + {% highlight javascript %} +Post.all().then(function(response) { + response.data // array of Post instances + response.meta // js object from the server + response.raw // js response document +}); + {% endhighlight %} +
+
+

/posts

+
+ +Hopefully you're running in an environment that supports +ES7's [Async/Await](https://hackernoon.com/6-reasons-why-javascripts-async-await-blows-promises-away-tutorial-c7ec10518dd9). This makes things even easier: + +{% highlight typescript %} +let { data } = await Post.all() +data // array of Post instances + +// alternatively + +let posts = (await Post.all()).data +posts // array of Post instances +{% endhighlight %} +
+

/posts

+
+ + diff --git a/js/reads/nested-queries.md b/js/reads/nested-queries.md new file mode 100644 index 0000000..c371689 --- /dev/null +++ b/js/reads/nested-queries.md @@ -0,0 +1,118 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### Nested Queries + +We can nest all read operations at any level of the graph. Let's say we wanted to +fetch all `Post`s and their `Comment`s...but only return comments that +are `active`, sorted by `created_at` descending. We can create a +`Comment` scope as normal, then `#merge()` it into our `Post` scope: + +{% include js-code-tabs.html %} +
+{% highlight typescript %} +let commentScope = Comment + .where({ active: true }) + .order({ created_at: "desc" }) +Post + .includes("comments") + .merge({ comments: commentScope }) + .all() +{% endhighlight %} + +{% highlight javascript %} +var commentScope = Comment + .where({ active: true }) + .order({ created_at: "desc" }) +Post + .includes("comments") + .merge({ comments: commentScope }) + .all() +{% endhighlight %} +
+
+

/posts?include=comments&filter[comments][active]=true&sort=-comments.active

+
+ +Because this can get verbose, it's often desirable to store it on +the class: + +{% include js-code-tabs.html %} +
+{% highlight typescript %} +class Comment extends ApplicationRecord { + // ... code ... + static recent() { + return this + .where({ active: true }) + .order({ created_at: "desc" }) + } +} + +Post.merge({ comments: Comment.recent() }).all() +{% endhighlight %} + +{% highlight javascript %} +const Comment = ApplicationRecord.extend({ + // ... code ... + static: { + recent: function() { + return this + .where({ active: true }) + .order({ created_at: "desc" }) + } + } +}) + +Post + .includes("comments") + .merge({ comments: Comment.recent() }) + .all() +{% endhighlight %} +
+ +Any number of scopes can be merged in. Just remember to `#include()` +and `#merge()` relationship names **as the server understands them**: + +{% include js-code-tabs.html %} +
+{% highlight typescript %} +class Dog extends ApplicationRecord { + @BelongsTo() person: Person +} + +// We've modeled this as Dog > person in javascript +// And Person is jsonapiType "people" +// But the server defined the relationship as "owner" +Dog.includes("owner").merge({ owner: Person.limitedFields() }) +{% endhighlight %} + +{% highlight javascript %} +const Dog = ApplicationRecord.extend({ + // ... code ... + methods: { + person: belongsTo() + } +}) + +// We've modeled this as Dog > person in javascript +// And Person is jsonapiType "people" +// But the server defined the relationship as "owner" +Dog.includes("owner").merge({ owner: Person.limitedFields() }) +{% endhighlight %} +
+ + diff --git a/js/reads/pagination.md b/js/reads/pagination.md new file mode 100644 index 0000000..3b304f8 --- /dev/null +++ b/js/reads/pagination.md @@ -0,0 +1,46 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### Pagination + +Use `#per()` to set the limit per page: + +{% highlight typescript %} +Post.per(10).all() +{% endhighlight %} +
+

/posts?page[size]=10

+
+ +Use `#page()` to set the current page: + +{% highlight typescript %} +Post.page(5).all() +{% endhighlight %} +
+

/posts?page[number]=5

+
+ +When chained together (10 per page, the 5th page): + +{% highlight typescript %} +Post.page(5).per(10).all() +{% endhighlight %} +
+

/posts?page[size]=10&page[number]=5

+
+ + diff --git a/js/reads/sorting.md b/js/reads/sorting.md new file mode 100644 index 0000000..a665a53 --- /dev/null +++ b/js/reads/sorting.md @@ -0,0 +1,52 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### Sorting + +Use `#order()` to sort. + +If passed a string, it will default to **ascending**: + +{% highlight typescript %} +Post.order("title").all() +{% endhighlight %} +
+

/posts?sort=title

+
+ + +Otherwise, pass an object: + +{% highlight typescript %} +Post.order({ title: "desc" }).all() +{% endhighlight %} +
+

/posts?sort=-title

+
+ +For multisort, simply chain multiple `#order()` clauses: + +{% highlight typescript %} +Post + .order({ title: "desc" }) + .order("ranking") + .all() +{% endhighlight %} +
+

/posts?sort=-title,ranking

+
+ + diff --git a/js/reads/statistics.md b/js/reads/statistics.md new file mode 100644 index 0000000..4ac3d1e --- /dev/null +++ b/js/reads/statistics.md @@ -0,0 +1,60 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### Statistics + +Use `#stats()` to request statistics. Access stats within `meta`: + +{% include js-code-tabs.html %} +
+{% highlight typescript %} +let { data } = await Post.stats({ total: "count" }).all() +data.meta.stats.total.count // the total count +{% endhighlight %} + +{% highlight javascript %} +Post.stats({ total: "count" }).all().then(function(response) { + response.meta.stats.total.count // the total count +}) +{% endhighlight %} +
+
+

/posts?stats[total]=count

+
+ +Stats are always independent of pagination. If you request the total count, you'll get the total count even if you're limiting to 10 per page. This means to get **only** statistics - avoid returning `Post` instances altogether - simply request `0` results per page: + +{% include js-code-tabs.html %} +
+{% highlight typescript %} +let { data } = await Post.per(0)stats({ total: "count" }).all() +data.meta.stats.total.count // the total count +{% endhighlight %} + +{% highlight javascript %} +Post + .per(0) + .stats({ total: "count" }) + .all().then(function(response) { + response.meta.stats.total.count // the total count + }) +{% endhighlight %} +
+
+

/posts?stats[total]=count&page[size]=0

+
+ + diff --git a/js/state-syncing.md b/js/state-syncing.md new file mode 100644 index 0000000..1021744 --- /dev/null +++ b/js/state-syncing.md @@ -0,0 +1,111 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### State Syncing + +You may have encountered state management libraries like [Flux](https://facebook.github.io/flux/docs/overview.html), +[Redux](https://redux.js.org) or [Vuex](https://vuex.vuejs.org/en/intro.html). These are fantastic libraries, but you likely won't need them with JSORM. As a full-fledged model layer, JSORM manages state for you, automatically. + +If you opt-in to this feature: + +{% highlight typescript %} +ApplicationRecord.sync = true +{% endhighlight %} + +Instances will sync up whenever the server tells us about updated state. +Consider the scenario where an instance is initially loaded, then separately polled in the background: + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} + let person = (await Person.find(1)).data + + let poll = () => { + await Person.find(1) + setTimeout(poll, 1000) + } + poll() + {% endhighlight %} + + {% highlight javascript %} + Person.find(1).then(function(response) { + var person = response.data; + }); + + var poll = function() { + Person.find(1); + setTimeout(poll, 1000); + } + poll() + {% endhighlight %} +
+ +Note that our `poll()` function **never assigns or updates `person`**. +But if the server returns an updated `name` attribute, **`person.name` +will be automatically updated**. This is true even if `person.name` +is bound in 17 different nested components. + +Instances can still update their attributes independently - we only sync +when the server returns updated data: + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} + let instanceA = (await Person.find(1)).data + let instanceB = (await Person.find(1)).data + + instanceA.name // "Jane" + instanceB.name // "Jane" + + instanceB.name = "Silvia" + instanceA.name // "Jane" + instanceB.name // "Silvia" + + await instanceB.save() + instanceA.name // "Silvia" + instanceB.name // "Silvia" + {% endhighlight %} + + {% highlight javascript %} + var instanceA, instanceB; + Person.find(1).then(function(response) { + instanceA = response.data; + }); + Person.find(1).then(function(response) { + instanceB = response.data; + }); + + instanceA.name // "Jane" + instanceB.name // "Jane" + + instanceB.name = "Silvia" + instanceA.name // "Jane" + instanceB.name // "Silvia" + + instanceB.save().then(function() { + instanceA.name // "Silvia" + instanceB.name // "Silvia" + }); + {% endhighlight %} +
+ +#### Gotchas + +Under the hood, instances are listening for updates from a central data +store. This means that you'll want to remove listeners whenever you no +longer need the instance - otherwise it will never be garbage collected +properly. To remove a listener: + +{% highlight typescript %} +instance.unlisten() +{% endhighlight %} + +In practice, when developing in a SPA, you'll want to `#unlisten()` +whenever a view is destroyed and model instances no longer need to be referenced. If +you are using VueJS, this is done automatically by adding [jsorm-vue](https://github.com/jsonapi-suite/jsorm-vue) +to your application. diff --git a/js/writes/dirty-tracking.md b/js/writes/dirty-tracking.md new file mode 100644 index 0000000..5c65768 --- /dev/null +++ b/js/writes/dirty-tracking.md @@ -0,0 +1,130 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### Dirty Tracking + +When an attribute has been modified, but has not yet been saved to the +server, it is considered "dirty". Use `#isDirty()` to see if any attribute is dirty, use the `#changes()` method to see all dirty attributes. + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} + let post = await Post.first() + post.title // "original" + post.isDirty() // false + post.changes() // {} + + post.title = "changed" + post.isDirty() // true + post.changes() // { title: ["original", "changed"] } + + await post.save() + post.isDirty() // false + post.changes() // {} + {% endhighlight %} + + {% highlight javascript %} + Post.first().then(function(response) { + var post = response.data; + + post.title; // "original" + post.isDirty(); // false + post.changes(); // {} + + post.title = "changed"; + post.isDirty(); // true + post.changes(); // { title: ["original", "changed"] } + + post.save().then(function(success) { // true + post.isDirty(); // false + post.changes(); // {} + }); + }); + {% endhighlight %} +
+ +> Remember, only dirty attributes are sent to the server when `#save()` +> is called. + +`#isDirty()` *can* take into account relationships - just pass a +string, array, or object or relationship names. A relationship is +considered dirty if: + +* Any objects in the relationship have dirty attributes +* An object was removed from a `hasMany` relationship +* An object was added to a `hasMany` relationship +* Any object within the relationship was replaced with a different +object. + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} + let post = await Post.first() + post.comments[0].text = "my comment" + post.isDirty("comments") // true + + post = await Post.first() + post.comments.push(new Comment()) + post.isDirty("comments") // true + + post = await Post.first() + post.comments.splice(1, 1) + post.isDirty("comments") // true + + post = await Post.first() + post.blog // an existing Blog instance + post.blog = (await Blog.first()).data + post.isDirty("blog") // true + + // check nested relationships + post.isDirty(["blog", { comments: "author" }]) + {% endhighlight %} + + {% highlight javascript %} + Post.first().then(function(response) { + var post = response.data; + post.comments[0].text = "my comment"; + post.isDirty("comments"); // true + }); + + Post.first().then(function(response) { + var post = response.data; + post.comments.push(new Comment()); + post.isDirty("comments"); // true + }); + + Post.first().then(function(response) { + var post = response.data; + post.comments.splice(1, 1); + post.isDirty("comments"); // true + }); + + Post.first().then(function(response) { + var post = response.data; + post.blog; // an existing Blog instance + + Blog.first().then(function(blog) { + post.blog = (await Blog.first()).data + post.isDirty("blog") // true + }); + }); + + // check nested relationships + post.isDirty(["blog", { comments: "author" }]) + {% endhighlight %} +
+ + diff --git a/js/writes/index.md b/js/writes/index.md new file mode 100644 index 0000000..2470b55 --- /dev/null +++ b/js/writes/index.md @@ -0,0 +1,142 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### Writes + +Similar to `ActiveRecord`, you can simply call `#save()` on a model +instance. JSORM will [create](http://jsonapi.org/format/#crud-creating) (`POST`) or [update](http://jsonapi.org/format/#crud-updating) (`PATCH`) as needed. + +`#save()` returns a `Promise` that will resolve a `boolean` - `true` +when the server returns a 200-ish response code, `false` when the server +returns a `422` response code (see +[validations](/js/writes/validations)). As always, anything else will +reject the promise. + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} + let blog = new Blog({ title: "My Blog" }) + let success = await blog.save() // POST /blogs + console.log(success) // true/false + + blog.title = "Updated Title" + success = await blog.save() // PUT /blogs/:id + console.log(success) // true/false + {% endhighlight %} + + {% highlight javascript %} + var blog = new Blog({ title: "My Blog" }); + // POST /blogs + blog.save().then(function(success) { + console.log(success); // true/false + + blog.title = "Updated Title": + // PUT /blogs/:id + blog.save().then(function(success) { + console.log(success) // true/false + }); + }); + {% endhighlight %} +
+ +After saving, the instance will automatically pick up any +server-assigned attributes: + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} + let post = new Post() + await post.save() + post.id // server-assigned value + post.createdAt // server-assigned value + {% endhighlight %} + + {% highlight javascript %} + var post = new Post(); + post.save().then(function(success) { + post.id // server-assigned value + post.createdAt // server-assigned value + }); + {% endhighlight %} +
+ +If a `Model` was instantiated with data from the server, `isPersisted` +will return `true`. This means that we can assign IDs on the client +without any adverse behavior; we can also manually mark objects as +persisted for testing purposes: + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} + let blog = new Blog({ id: 123 }) + blog.isPersisted // false + await blog.save() // POST /blogs + blog.isPersisted // true + blog.id // 123 + + // Manually mark an instance as persisted + blog = new Blog({ id: 123 }) + blog.isPersisted = true + await blog.save() // PUT /blogs/123 + {% endhighlight %} + + {% highlight javascript %} + var blog = new Blog({ id: 123 }); + blog.isPersisted // false + // POST /blogs + blog.save().then(function(response) { + blog.isPersisted // true + blog.id // 123 + }); + + // Manually mark an instance as persisted + var blog = new Blog({ id: 123 }); + blog.isPersisted = true + blog.save() // PUT /blogs/123 + {% endhighlight %} +
+ +Notably, **only dirty (changed) attributes will be sent to the server**. This prevents race conditions and unexpected side-effects. In the following example, `Post` has attributes `title`, `description`, and `createdAt`: + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} + let post = (await Post.first()) + post.title = "updated" + // ONLY title sent to the server + await post.save() + // Title is now synced with the server + post.description = "updated" + // ONLY description sent to the server + await post.save() + {% endhighlight %} + + {% highlight javascript %} + Post.first().then(function(response) { + var post = response.data; + post.title = "updated"; + // ONLY title sent to the server + post.save().then(function(response) { + // Title is now synced with the server + post.description = "updated"; + // ONLY description sent to the server + post.save(); + }); + }); + {% endhighlight %} +
+ + diff --git a/js/writes/nested.md b/js/writes/nested.md new file mode 100644 index 0000000..c2d2b4a --- /dev/null +++ b/js/writes/nested.md @@ -0,0 +1,90 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### Nested Writes + +You can write a `Model` and all of its relationships in a single +request. Keep in mind normal dirty tracking rules still apply - nothing +is sent to the server unless it is dirty. + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} + let author = new Author() + let comment = new Comment({ author }) + let post = new Post({ comments: [comment] }) + + // post.save({ with: "comments" }) + // post.save({ with: ["comments", "blog"] }) + post.save({ with: { comments: 'author' }}) + {% endhighlight %} + + {% highlight javascript %} + var author = new Author(); + var comment = new Comment({ author: author }); + var post = new Post({ comments: [comment] }); + + // post.save({ with: "comments" }) + // post.save({ with: ["comments", "blog"] }) + post.save({ with: { comments: "author" }}); + {% endhighlight %} +
+ +Use `model.isMarkedForDestruction = true` to delete the associated +object. Use `model.isMarkedForDisassociation = true` to remove the association +without deleting the underlying object: + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} + let post = (await Post.includes("comments").first()).data + post.comments[0].isMarkedForDestruction = true + post.comments[1].isMarkedForDisassociation = true + + // destroys the first comment + // disassociates the second comment + await post.save({ with: "comments" }) + {% endhighlight %} + + {% highlight javascript %} + Post.includes("comments").first().then(function(response) { + var post = response.data; + post.comments[0].isMarkedForDestruction = true; + post.comments[1].isMarkedForDisassociation = true; + + // destroys the first comment + // disassociates the second comment + post.save({ with: "comments" }) + }); + {% endhighlight %} +
+ +You may want to send *only* the `id` of the related object to the server - ensuring the models are associated without updating attributes by +accident. Just add `.id` to the relationship name: + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} + post.save({ with: "comments.id" }) + {% endhighlight %} + + {% highlight javascript %} + post.save({ with: "comments.id" }) + {% endhighlight %} +
+ + + diff --git a/js/writes/validations.md b/js/writes/validations.md new file mode 100644 index 0000000..84f938c --- /dev/null +++ b/js/writes/validations.md @@ -0,0 +1,47 @@ +--- +layout: page +--- + +{% include js-header.html %} +{% include js-toc.html %} + +
+### Validations + +JSONAPI Suite is already set up to return validation errors with a +`422` response code and JSONAPI-compliant [errors payload](http://jsonapi.org/format/#errors). Those errors will be automatically assigned, and removed on subsequent requests: + +{% include js-code-tabs.html %} +
+ {% highlight typescript %} + let success = await post.save() + console.log(success) // false + post.errors.title // { message: "Can't be blank", ... } + post.title = "no longer blank" + success = await post.save() + console.log(success) // true + post.errors // {} + {% endhighlight %} + + {% highlight javascript %} + post.save().then(function(success) { + console.log(success) // false + post.errors.title // { message: "Can't be blank", ... } + post.title = "no longer blank" + post.save().then(function(success) { + console.log(success); // true + post.errors // {} + }); + }) + {% endhighlight %} +
+ + diff --git a/jsonapi_suite.gemspec b/jsonapi_suite.gemspec deleted file mode 100644 index f37ac45..0000000 --- a/jsonapi_suite.gemspec +++ /dev/null @@ -1,41 +0,0 @@ -# coding: utf-8 -lib = File.expand_path('../lib', __FILE__) -$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require 'jsonapi_suite/version' - -Gem::Specification.new do |spec| - spec.name = "jsonapi_suite" - spec.version = JsonapiSuite::VERSION - spec.authors = ["Lee Richmond"] - spec.email = ["lrichmond1@bloomberg.net"] - - spec.summary = %q{Collection of gems for jsonapi.org-compatible APIs} - spec.description = %q{Handles automatic swagger documentation, error handling, serialization, etc} - spec.license = "MIT" - - # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host' - # to allow pushing to a single host or delete this section to allow pushing to any host. - if spec.respond_to?(:metadata) - spec.metadata['allowed_push_host'] = "http://artprod.dev.bloomberg.com/artifactory/api/gems/bb-gems-local" - else - raise "RubyGems 2.0 or newer is required to protect against public gem pushes." - end - - spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } - spec.bindir = "exe" - spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } - spec.require_paths = ["lib"] - - spec.add_dependency 'strong_resources', '~> 0.1' - spec.add_dependency 'jsonapi_compliable', '~> 0.3' - spec.add_dependency 'jsonapi_errorable', '~> 0.1' - spec.add_dependency 'jsonapi_spec_helpers', '~> 0.2' - spec.add_dependency 'jsonapi_ams_extensions', '~> 0.1' - spec.add_dependency 'jsonapi_swagger_helpers', '~> 0.1' - spec.add_dependency 'active_model_serializers', '~> 0.10.x' - spec.add_dependency 'nested_attribute_reassignable', '~> 0.6' - - spec.add_development_dependency "bundler", "~> 1.12" - spec.add_development_dependency "rake", "~> 10.0" - spec.add_development_dependency "rspec", "~> 3.0" -end diff --git a/lib/jsonapi_suite.rb b/lib/jsonapi_suite.rb deleted file mode 100644 index 47aa205..0000000 --- a/lib/jsonapi_suite.rb +++ /dev/null @@ -1,17 +0,0 @@ -require 'active_model_serializers' -require 'strong_resources' -require 'jsonapi_compliable' -require 'jsonapi_errorable' -require 'jsonapi_ams_extensions' -require 'jsonapi_swagger_helpers' -require 'nested_attribute_reassignable' - -if ENV['RAILS_ENV'] == 'test' - require 'rspec-rails' - require 'jsonapi_spec_helpers' -end - -require "jsonapi_suite/version" - -module JsonapiSuite -end diff --git a/lib/jsonapi_suite/version.rb b/lib/jsonapi_suite/version.rb deleted file mode 100644 index 03d35b5..0000000 --- a/lib/jsonapi_suite/version.rb +++ /dev/null @@ -1,3 +0,0 @@ -module JsonapiSuite - VERSION = "0.1.0" -end diff --git a/quickstart.md b/quickstart.md new file mode 100644 index 0000000..30076cd --- /dev/null +++ b/quickstart.md @@ -0,0 +1,652 @@ +--- +layout: page +--- + +Quickstart +========== + +##### Zero to API in 5 minutes + +This quickstart will use Rails with ActiveRecord. Head to the guides +section for usage with alternate ORMs or avoiding Rails +completely. + +If the below seems too "magical", don't worry - we're just applying some +sensible defaults to get started quickly. + +# Installation + +Let's start with a classic Rails blog. We'll use a [template](http://guides.rubyonrails.org/rails_application_templates.html) to handle some of the boilerplate. Just run this command and accept all the defaults for now: + +{% highlight bash %} +$ rails new blog --api -m https://raw.githubusercontent.com/jsonapi-suite/rails_template/master/all.rb +{% endhighlight %} + +Feel free to run `git diff` if you're interested in the +particulars; this is mostly just installing gems and including modules. + +> Note: if a network issue prevents you from pointing to this URL +> directly, you can download the file and and run this command as `-m +> /path/to/all.rb` + +# Defining a Resource + +A `Resource` defines how to query and persist your `Model`. In other +words: a `Model` is to the database as `Resource` is to the API. So +first, let's define our model: + +{% highlight bash %} +$ bundle exec rails generate model Post title:string active:boolean +$ bundle exec rake db:migrate +{% endhighlight %} + +Now we can use the built-in generator to define our `Resource`, +controller, and specs: + +{% highlight bash %} +$ bundle exec rails g jsonapi:resource Post title:string active:boolean +{% endhighlight %} + +You'll see a number of files created. If you open each one, you'll see +comments explaining what's going on. Head over to the +[tutorial]({{site.github.url}}/tutorial) for a more in-depth understanding. For now, let's +focus on two key concepts you'll see over and over again: inputs (via +[strong_resources](https://jsonapi-suite.github.io/strong_resources/)), +and outputs (via [jsonapi-rb](http://jsonapi-rb.org)). + +Our **API Inputs** are defined in +`config/initializers/strong_resources.rb`. You can think of these as +[strong parameter](http://api.rubyonrails.org/v5.0/classes/ActionController/StrongParameters.html) templates. + +{% highlight ruby %} +# config/initializers/strong_resources.rb +strong_resource :post do + attribute :title, :string + attribute :active, :boolean +end +{% endhighlight %} + +Our **API Outputs** are defined in +`app/serializers/serializable_post.rb`. The DSL is very similar to +[active_model_serializers](https://github.com/rails-api/active_model_serializers) and full documentation can be found at [jsonapi-rb.org](http://jsonapi-rb.org): + +{% highlight ruby %} +# app/serializers/serializable_post.rb +class SerializablePost < JSONAPI::Serializable::Resource + type :posts + + attribute :title + attribute :active +end +{% endhighlight %} + +Now run your app!: + +{% highlight bash %} +$ bundle exec rails s +{% endhighlight %} + +Verify `http://localhost:3000/api/v1/posts` renders JSON correctly. +Now we just need data. + +# Seeding Data + +We can seed data in two ways: the usual `db/seeds.rb`, or using an HTTP +client. Using the client helps get your feet wet with client-side +development, or you can avoid the detour and plow right ahead. + +### Seeding With Ruby + +Edit `db/seeds.rb` to create a few `Post`s: + +{% highlight ruby %} +Post.create!(title: 'My title!', active: true) +Post.create!(title: 'Another title!', active: false) +Post.create!(title: 'OMG! A title!', active: true) +{% endhighlight %} + +And run the script: + +{% highlight bash %} +$ bundle exec rake db:seed +{% endhighlight %} + +### Seeding With JS Client + +There are a variety of [JSONAPI Clients](http://jsonapi.org/implementations/#client-libraries) +out there. We'll be using [JSORM](/js/home) +which is built to work with Suite-specific functionality like nested +payloads. It can be used from the browser, but for now we'll call +it using a simple Node script. + +Create the project: + +{% highlight bash %} +$ mkdir node-seed && cd node-seed && touch index.js && npm init +{% endhighlight %} + +Accept the default for all prompts. Now add the `JSORM` dependency, as +well as a polyfill for `fetch`: + +{% highlight bash %} +$ npm install --save jsorm isomorphic-fetch +{% endhighlight %} + +Add this seed code to `index.js`: + +{% highlight javascript %} +require("isomorphic-fetch"); +var jsorm = require("jsorm/dist/jsorm"); + +// setup code + +var ApplicationRecord = jsorm.JSORMBase.extend({ + static: { + baseUrl: "http://localhost:3000", + apiNamespace: "/api/v1" + } +}); + +var Post = ApplicationRecord.extend({ + static: { + jsonapiType: "posts" + }, + + attrs: { + title: jsorm.attr(), + active: jsorm.attr() + } +}); + +// seed code + +var post1 = new Post({ + title: "My title!", + active: true +}); + +var post2 = new Post({ + title: "Another title!", + active: false +}); + +var post3 = new Post({ + title: "OMG! A title!", + active: true +}); + +// Save sequentially only due to local development env +post1.save().then(() => { + post2.save().then(() => { + post3.save(); + }); +}); +{% endhighlight %} + +This should be pretty straightforward if you're familiar with +`ActiveRecord`. We define `Model` objects, putting configuration on +class attributes. We instatiating instances of those Models, and call +`save()` to persist. For more information, see the [JSORM Documentation](https://jsonapi-suite.github.io/jsorm/). + +Run the script: + +{% highlight bash %} +$ node index.js +{% endhighlight %} + +Now load `http://localhost:3000/api/v1/posts`. You should have 3 `Post`s in +your database! + +![3_posts]({{site.github.url}}/assets/img/3_posts_json.png) + +# Querying + +Now that we've defined our `Resource` and seeded some data, let's see +what query functionality we have. We've listed all `Post`s at +`http://localhost:3000/api/v1/posts`. Let's see what we can do: + +* **Sort** + * By title, ascending: + * URL: `/api/v1/posts?sort=title` + * SQL: `SELECT * FROM posts ORDER BY title ASC` + * By title, descending: + * URL: `/api/v1/posts?sort=-title` + * SQL: `SELECT * FROM posts ORDER BY title DESC` + +* **Paginate**: + * 2 Per page: + * URL: `/api/v1/posts?page[size]=2` + * SQL: `SELECT * FROM posts LIMIT 2` + * 2 Per page, second page: + * URL: `/api/v1/posts?page[size]=2&page[number]=2` + * SQL: `SELECT * FROM posts LIMIT 2 OFFSET 2` + +* **Sparse Fieldsets**: + * Only render `title`, not `active`: + * URL: `/api/v1/posts?fields[posts]=title` + * SQL: `SELECT * from posts` (*optimizing this query is on the roadmap*) + +* **Filter**: + * Add one line of code: + +{% highlight ruby %} +# app/resources/post_resource.rb +allow_filter :title +{% endhighlight %} + * URL: `/api/v1/posts?filter[title]=My title!` + * SQL: `SELECT * FROM posts WHERE title = "My title!"` + * Any filter not whitelisted will raise `JsonapiCompliable::BadFilter` + error. + * All filter logic can be customized: + +{% highlight ruby %} +# SELECT * from posts WHERE title LIKE 'My%' +allow_filter :title_prefix do |scope, value| + scope.where(["title LIKE ?", "#{value}%"]) +end +{% endhighlight %} + * Customizations can be DRYed up and packaged into `Adapter`s. + +* **Extra Fields**: + * Sometimes you want to request additional fields not part of a normal + response (perhaps they are computationally expensive). + * This can be done like so: + +{% highlight ruby %} +# app/serializers/serializable_post.rb +extra_attribute :description do + @object.active? ? 'Active Post' : 'Inactive Post' +end +{% endhighlight %} + + * URL: `/api/v1/posts?extra_fields[posts]=description` + * SQL: `SELECT * FROM posts` + * You can conditionally eager load data or further customize this + logic. See the tutorial for more. + +* **Statistics**: + * Useful for search grids - "Find me the first 10 active posts, and + the total count of all posts". + * One line of code to whitelist the stat: + +{% highlight ruby %} +# app/resources/post_resource.rb +allow_stat total: [:count] +{% endhighlight %} + + * URL: `/api/v1/posts?stats[total]=count` + * SQL: `SELECT count(*) from posts` + * Combine with filters and the count will adjust accordingly. + * There are a number of built-in stats, you can also add your own. + * This is rendered in the `meta` section of the response: + + ![meta_total_count]({{site.github.url}}/assets/img/meta_total_count.png) + +* **Error Handling**: + * Your app will always render a JSONAPI-compliable error response. + * Cause an error: + +{% highlight ruby %} +# app/controllers/posts_controller.rb +def index + raise 'foo' +end +{% endhighlight %} + + * View the default payload: + + ![error_payload]({{site.github.url}}/assets/img/error_payload.png) + + * Different errors can be customized with different response codes, + JSON, and side-effects. View [jsonapi_errorable](https://jsonapi-suite.github.io/jsonapi_errorable/) for more. + +# Adding Relationships + +JSONAPI Suite supports full querying of relationships ("fetch me this +`Post` and 3 active `Comment`s sorted by creation date"), as well as +persistence ("save this `Post` and 3 `Comment`s in a single request"). + +### Adding Relationships + +Let's start by defining our model: + +{% highlight bash %} +$ bundle exec rails g model Comment post_id:integer body:text active:boolean +$ bundle exec rake db:migrate +{% endhighlight %} + +{% highlight ruby %} +# app/models/post.rb +has_many :comments + +# app/models/comment.rb +belongs_to :post, optional: true +{% endhighlight %} + +...and corresponding `Resource` object: + +{% highlight bash %} +$ bundle exec rails g jsonapi:resource Comment body:text active:boolean +{% endhighlight %} + +Configure the relationship in `PostResource`: + +{% highlight ruby %} +has_many :comments, + foreign_key: :post_id, + resource: CommentResource, + scope: -> { Comment.all } +{% endhighlight %} + +This code: + +* Whitelists the relationship. +* Knows to link the objects via `post_id`. +* Will use `CommentResource` for querying logic (so we can say things +like "only return the latest 3 active comments") +* Uses an unfiltered base scope (`Comment.all`). If we wanted, we could +do things like `Comment.active` here to ensure only active comments are +ever returned. + +You should now be able to hit `/api/v1/comments` with all the same +functionality as before. We just need to seed data. + +Start by clearing out your database: + +{% highlight bash %} +$ bundle exec rake db:migrate:reset +{% endhighlight %} + +Again, you can seed your data using a NodeJS client or the traditional +`db/seeds.rb`. + +#### Seeding with NodeJS + +Let's edit our `node-seed/index.js`. First add a `Comment` model: + +{% highlight javascript %} +var Comment = ApplicationRecord.extend({ + static: { + jsonapiType: 'comments' + }, + + attrs: { + body: jsorm.attr(), + active: jsorm.attr(), + createdAt: jsorm.attr() + } +}); +{% endhighlight %} + +...and add the relationship to `Post`: + +{% highlight javascript %} +// within attrs +// ... code ... +comments: jsorm.hasMany() +// ... code... +{% endhighlight %} + +Replace the existing `Post` instances with one `Post` and three +`Comment`s: + +{% highlight javascript %} +var comment1 = new Comment({ + body: "comment one", + active: true +}); + +var comment2 = new Comment({ + body: "comment two", + active: false +}); + +var comment3 = new Comment({ + body: "comment three", + active: true +}); + +var post = new Post({ + title: "My title!", + active: true, + comments: [comment1, comment2, comment3] +}); + +post.save({ with: ["comments"] }); +{% endhighlight %} + +Tell our controller it's OK to sidepost comments: + +{% highlight ruby %} +# app/controllers/posts_controller.rb +strong_resource :post do + has_many :comments +end +{% endhighlight %} + +And tell our serializer it's OK to render comments: + +{% highlight ruby %} +# app/serializers/serializable_post.rb +has_many :comments +{% endhighlight %} + +Now run the script to persist the `Post` and its three `Comment`s in a +single request: + +{% highlight bash %} +$ node node-seed/index.js +{% endhighlight %} + +#### Seeding with Ruby + +Replace your `db/seeds.rb` with this code to persist one `Post` and +three `Comment`s: + +{% highlight ruby %} +comment1 = Comment.new(body: 'comment one', active: true) +comment2 = Comment.new(body: 'comment two', active: false) +comment3 = Comment.new(body: 'comment three', active: true) + +Post.create! \ + title: 'My title!', + active: true, + comments: [comment1, comment2, comment3] +{% endhighlight %} + +## Usage + +Now let's fetch a `Post` and filtered `Comment`s in a single request: `/api/v1/posts?include=comments`. + +Any logic in `CommentResource` is available to us. Let's sort the +comments by `created_at` descending: `/api/v1/posts?include=comments&sort=-comments.created_at`. This should work out-of-the-box. + +Now add a filter to `CommentResource`: + +{% highlight ruby %} +allow_filter :active +{% endhighlight %} + +That filter now works in two places: + +* `/api/v1/comments?filter[active]=true` +* `/api/v1/posts?include=comments&filter[comments][active]=true` + +This is why `Resource` objects exist: they provide an interface to +functionality shared across many different endpoints, with no extra +code. + +# What's Next + +We have a full CRUD API with robust querying functionality, and the +ability to combine relationships for both reads and writes. But what +happens when you need to customize the sorting logic? What about replacing +`ActiveRecord` with an alternate persistence layer, or avoiding Rails +altogether? + +These are important topics that JSONAPI Suite was built to address. To +learn more about advanced usage and customization, we suggest following +the [tutorial](/tutorial). There are also a number of how-tos on this +site, a good one to start with is How +to Use without ActiveRecord + +For additional documentation, view the [YARD Docs](https://jsonapi-suite.github.io/jsonapi_compliable/). + +For help with specific use cases, [join our Slack chat](https://join.slack.com/t/jsonapi-suite/shared_invite/enQtMjkyMTA3MDgxNTQzLWVkMDM3NTlmNTIwODY2YWFkMGNiNzUzZGMzOTY3YmNmZjBhYzIyZWZlZTk4YmI1YTI0Y2M0OTZmZGYwN2QxZjg)! + +# Bonus: Testing + +### Installation + +Our generator applied some sensible defaults: + + * [Rspec](https://github.com/rspec/rspec-rails) Test runner + * [jsonapi_spec_helpers](https://jsonapi-suite.github.io/jsonapi_spec_helpers) Helpers to parse and assert on JSONAPI payloads. + * [factory_girl](https://github.com/thoughtbot/factory_girl) for + seeding our test database with fake data. + * [faker](https://github.com/stympy/faker) for generating fake values, + such as e-mail addresses, names, avatar URLs, etc. + * [database_cleaner](https://github.com/DatabaseCleaner/database_cleaner) + to ensure our fake data gets cleaned up between test runs. + +By default we rescue exceptions and return a valid [error response](http://jsonapi.org/format/#errors). +In tests, this can be confusing - we probably want to raise errors in +tests. So note our exception handling is disabled by default: + +{% highlight ruby %} +# spec/rails_helper.rb +config.before :each do + JsonapiErrorable.disable! +end +{% endhighlight %} + +But you can enable it on a per-test basis: + +{% highlight ruby %} +it "renders validation errors" do + JsonapiErrorable.enable! + post "/api/v1/employees", payload + expect(validation_errors[:name]).to eq("can't be blank") +end +{% endhighlight %} + +In following this guide, we generated `Post` and +`Comment` resources. Let's edit our [factories](https://github.com/thoughtbot/factory_bot) to seed randomized data: + +{% highlight ruby %} +# spec/factories/post.rb +FactoryGirl.define do + factory :post do + title { Faker::Lorem.sentence } + active { [true, false].sample } + end +end + +# spec/factories/comment.rb +FactoryGirl.define do + factory :comment do + body { Faker::Lorem.paragraph } + active { [true, false].sample } + end +end +{% endhighlight %} + +Finally, we need to define a `Payload`. `Payload`s use a +`factory_girl`-style DSL to define expected JSON. A `Payload` compares a +`Model` instance and JSON output, ensuring: + +* No unexpected keys +* No missing keys +* No unexpected value types +* No `null` values (this is overrideable) +* Model attribute matches JSON attribute +* This can all be customized. See [jsonapi_spec_helpers](https://github.com/jsonapi-suite/jsonapi_spec_helpers) for more. + +Let's define our payloads now: + +{% highlight ruby %} +# spec/payloads/post.rb +JsonapiSpecHelpers::Payload.register(:post) do + key(:title, String) + key(:active, [TrueClass, FalseClass]) +end + +# spec/payloads/comment.rb +JsonapiSpecHelpers::Payload.register(:comment) do + key(:body, String) + key(:active, [TrueClass, FalseClass]) + key(:created_at, Time) +end +{% endhighlight %} + +### Run + +We can now run specs. Let's start with the `Post` specs: + +{% highlight bash %} +$ bundle exec rspec spec/api/v1/posts +{% endhighlight %} + +You should see five specs, with one failing (`spec/api/v1/posts/create_spec.rb`), +and one pending (`spec/api/v1/posts/update_spec.rb`). + +The reason for the failure is simple: our payload defined in +`spec/payloads/post.rb` specifies that a `Post` JSON should include the +key `title`. However, that spec is currently creating a `Post` with no +attributes...which means in the response JSON, `title` is `null`. `null` +values will fail `assert_payload` unless elsewise configured. + +So, let's update our spec to POST attributes, not just an empty object: + +{% highlight ruby %} +let(:payload) do + { + data: { + type: 'posts', + attributes: { + title: 'My title!', + active: true + } + } + } +end +{% endhighlight %} + +Your specs should now pass. The only pending spec is due to a similar +issue - we need to specify attributes in `spec/api/v1/posts/update_spec.rb` as +well. Follow the comments in that file to apply a similar change. + +You should now have 5 passing request specs! These specs spin up a fake +server, then execute full-stack requests that hit the database and +return JSON. You're asserting that JSON matches predefined payloads, +without `null`s or unknown key/values. + +Go ahead and make the same changes to `Comment` specs to get 10 passing +request specs. + +It's up to you how far you'd like to go with testing. Should you add a +new spec to `spec/api/v1/posts/index_spec.rb` every time you add a +filter with `allow_filter`? This boils down to personal preference and +tolerance of failures. Try adding a few specs following the generated +patterns to get a feel for what's right for you. + +### Bonus: Documentation + +We can autodocument our code using [swagger documentation](https://swagger.io). Documenting an endpoint is one line of code: + +{% highlight ruby %} +jsonapi_resource '/v1/employees' +{% endhighlight %} + +Visit `http://localhost:3000/api/docs` to see the swagger documentation. Our custom UI will show all possible query parameters (including nested +relationships), as well as schemas for request/responses: + + + +Our generator set up some boilerplate to enable this functionality, you +can learn more at: How +to Autodocument with Swagger + +
+
+
diff --git a/ruby-toc.md b/ruby-toc.md new file mode 100644 index 0000000..85e6c14 --- /dev/null +++ b/ruby-toc.md @@ -0,0 +1,12 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Filtering + +asdf + +{% include highlight.html %} diff --git a/ruby/alternate-datastores/adapters.md b/ruby/alternate-datastores/adapters.md new file mode 100644 index 0000000..1f1d642 --- /dev/null +++ b/ruby/alternate-datastores/adapters.md @@ -0,0 +1,127 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Adapters + +> [Read First: Resources Overview]({{site.github.url}}/ruby/resources) + +> [View the Sample App](https://github.com/jsonapi-suite/employee_directory/compare/step_23_disassociation...elasticsearch_adapter) + +> [View the YARD Documentation](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Adapters/Abstract.html) + +If you find yourself repeatedly making customizations to a group of +`Resource`s and seek DRYer code, package those customizations into an +`Adapter`. Here we'll be starting from a previous example, +[ElasticSearch]({{site.github.url}}/ruby/alternate-datastores/elasticsearch). + +Adapters are simpler than you might think. It's little more than +copy-pasting those low-level customizations into a common class. + +Start by creating `lib/elasticsearch_adapter.rb`. Cut/past the sorting, +pagination, and `#resolve` overrides from `EmployeeResource` into the adapter, +turning into `def` methods along the way: + +{% highlight ruby %} +# lib/elasticsearch_adapter.rb +class ElasticsearchAdapter + def paginate(scope, current_page, per_page) + scope.metadata.pagination.current_page = current_page + scope.metadata.pagination.per_page = per_page + scope + end + + def order(scope, att, dir) + scope.metadata.sort = [{att: att, dir: dir}] + scope + end + + def resolve(scope) + scope.query! + scope.results + end +end +{% endhighlight %} + +Ensure our adapter gets loaded: + +{% highlight ruby %} +# config/initializers/jsonapi.rb +require 'elasticsearch_adapter' +{% endhighlight %} + +And switch to that adapter in `EmployeeResource`: + +{% highlight ruby %} +use_adapter ElasticsearchAdapter +{% endhighlight %} + +Bounce your server. You can still hit the `/api/v1/employees` endpoint +with the same sort and paginate functionality, but the code has been +moved to an adapter. + +Let's ensure our users can filter as well: + +{% highlight ruby %} +def filter(scope, att, val) + scope.condition(att).eq(val) +end +{% endhighlight %} + +For all the methods and functionality an adapter supports, see the +[Adapter documenation](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Adapters/Abstract.html). + +#### Association Macros + +> [Read First: Nested Queries]({{site.github.url}}/ruby/reads/nested) + +We probably also want `has_many`-style macros to avoid writing similar +`allow_sideload` code time after time. Start by specifying where this +functionality is defined, and add a `has_many` macro: + +{% highlight ruby %} +module Sideloading + def has_many(association_name, + scope:, + resource:, + foreign_key:, + primary_key: :id, + &blk) + # our code will go here + instance_eval(&blk) if blk + end +end + +def sideloading_module + Sideloading +end +{% endhighlight %} + +The `instance_eval` is there so we can always drop down to a lower-level +customization in our `Resource`. + +We can basically cut/paste our existing sideload code and rewrite it as +variables: + +{% highlight ruby %} +scope do |parents| + parent_ids = parents.map { |p| p.send(primary_key) } + scope.call.condition(foreign_key).or(parent_ids.uniq.compact) +end + +assign do |parents, children| + parents.each do |p| + relevant_children = children.select do |c| + c.send(foreign_key) == p.send(primary_key) + end + p.send(:"#{association_name}=", relevant_children) + end +end +{% endhighlight %} + +You can now remove any customizations from your `Resource` classes. You +can continue to build the adapter, adding `belongs_to`, statistics, and +more. [View the adapter documentation for the full API](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Adapters/Abstract.html). diff --git a/ruby/alternate-datastores/elasticsearch.md b/ruby/alternate-datastores/elasticsearch.md new file mode 100644 index 0000000..a60798f --- /dev/null +++ b/ruby/alternate-datastores/elasticsearch.md @@ -0,0 +1,215 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Usage Without ActiveRecord: ElasticSearch + +> [Read First: Resources Overview]({{site.github.url}}/ruby/resources) + +> [View the Sample App](https://github.com/jsonapi-suite/employee_directory/compare/step_23_disassociation...elasticsearch) + +> [View the YARD Documentation](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Resource.html) + +Though we'll be hitting [elasticsearch](https://www.elastic.co) in this +example, remember that this is just an HTTP API underneath the hood. The +same pattern applies to a variety of use cases. + +First we need a **Client** for `elasticsearch`. Though you can feel free +to use a variety of clients, this example will use [trample](http://richmolj.github.io/trample). + +Also keep in mind, we'll be showing a one-off customization here. You +probably want to extract this code into an +[Adapter]({{site.github.url}}/ruby/alternate-datastores/adapters) if this is going to +become a core component of your application. + +#### Pre-JSONAPI Setup + +Start by installing trample: + +{% highlight ruby %} +# Gemfile +gem 'trample_search', require: 'trample' +{% endhighlight %} + +Tell [searchkick](https://github.com/ankane/searchkick) that we want to +index `Employee`s and `Position`s: + +{% highlight ruby %} +# app/models/employee.rb +searchkick text_start: [:first_name] + +# app/models/position.rb +searchkick text_start: [:title] +{% endhighlight %} + +Define our search classes. These tell trample the configuration of the +search: + +{% highlight ruby %} +# app/models/employee_search.rb +class EmployeeSearch < Trample::Search + model Employee + + condition :first_name, single: true + condition :last_name, single: true +end + +# app/models/position_search.rb +class PositionSearch < Trample::Search + model Position + + condition :title, single: true + condition :employee_id +end +{% endhighlight %} + +Finally, seed some data: + +{% highlight ruby %} +# db/seeds.rb +[Employee, Position].each(&:delete_all) +bart = Employee.create!(first_name: 'Bart', last_name: 'Simpson') +homer = Employee.create!(first_name: 'Homer', last_name: 'Simpson') +monty = Employee.create!(first_name: 'Monty', last_name: 'Burns') + +bart.positions.create!(title: 'Junior Engineer') +homer.positions.create!(title: 'Senior Engineer') +monty.positions.create!(title: 'Manager') +{% endhighlight %} + +#### JSONAPI Integration + +In our controller, we need to pass a base scope. In `ActiveRecord` examples, we'd pass an `ActiveRecord::Relation` (e.g. `Post.all`). Let's pass an instance +of `Trample::Search` instead. + +{% highlight ruby %} +# app/controllers/employees_controller.rb +def index + render_jsonapi(EmployeeSearch.new) +end +{% endhighlight %} + +{% highlight ruby %} +# app/serializers/serializable_employee.rb +class SerializableEmployee < JSONAPI::Serializable::Resource + type :employees + + attribute :first_name + attribute :last_name + attribute :created_at + attribute :updated_at + + has_many :positions +end +{% endhighlight %} + +Since we are now passing a non-default base scope, we need to tell our +`Resource` how to query and resolve this new scope. Start by switching to +the pass-through adapter, and resolve using `trample`'s query API: + +{% highlight ruby %} +# app/resources/employee_resource.rb +use_adapter JsonapiCompliable::Adapters::Null +# ... code ... +def resolve(scope) + scope.query! + scope.records.compact +end + +# no belongs_to for now +{% endhighlight %} + +You can now hit `http://localhost:3000/api/v1/employees` - the exact +same payload is coming back, but is now sourced from `elasticsearch`! + +Let's add a prefix filter: + +{% highlight ruby %} +# app/resources/employee_resource.rb +allow_filter :first_name_prefix do |scope, value| + scope.condition(:first_name).starts_with(value) +end +{% endhighlight %} + +Hit `http://localhost:3000/api/v1/employees?filter[first_name]=hom`. +You're now successfully querying the `elasticsearch` index. + + If we want sorting and pagination, we need to tell the `Resource` + how to deal with that, too: + +{% highlight ruby %} +# app/resources/employee_resource.rb +paginate do |scope, current_page, per_page| + scope.metadata.pagination.current_page = current_page + scope.metadata.pagination.per_page = per_page + scope +end + +sort do |scope, att, dir| + scope.metadata.sort = [{att: att, dir: dir}] + scope +end +{% endhighlight %} + +View the [Resource](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Resource.html) and [Adapter](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Adapters/Abstract.html) documentation for additional overrides, like statistics. + +The last step is adding the `positions` association. If we want +`has_many`-style macros we need to create an +[Adapter]({{site.github.url}}/ruby/alternate-datastores/adapters), but for now +let's simply use the lower-level [allow_sideload]({{site.github.url}}/) DSL. We need to define +two functions: how to build a scope for the association, and how to +associate the resulting objects: + +{% highlight ruby %} +# app/resources/employee_resource.rb +allow_sideload :positions, resource: PositionResource do + scope do |employees| + scope = PositionSearch.new + scope.condition(:employee_id).or(employees.map(&:id)) + end + + assign do |employees, positions| + employees.each do |e| + e.positions = positions.select { |p| p.employee_id = e.id } + end + end +end +{% endhighlight %} + +Convert the `PositionResource` to use `elasticsearch`, just like we did +for `Employee`: + +{% highlight ruby %} +# app/resources/position_resource.rb +use_adapter JsonapiCompliable::Adapters::Null + +def resolve(scope) + scope.query! + scope.results +end +{% endhighlight %} + +Create the `SerializablePosition` class: + +{% highlight ruby %} +class SerializablePosition < JSONAPI::Serializable::Resource + type :positions + + attribute :title +end +{% endhighlight %} + +We can now sideload `positions` - check out the results at +`http://localhost:3000/api/v1/employees?include=positions`. We're +fetching employees and their corresponding `positions` in a single +request, via `elasticsearch`. Any filters/changes/default sort/etc that +apply to `PositionResource` can be re-used at this endpoint. + +If this was a one-off section of our application, we can call this good +enough and move on. But as we continue to use this pattern, it's going +to get monotonous writing the same filter overrides, `allow_sideload` +wiring code, etc. To DRY up this code, we can package our changes into +an [Adapter]({{site.github.url}}/ruby/alternate-datastores/adapters). diff --git a/ruby/alternate-datastores/http.md b/ruby/alternate-datastores/http.md new file mode 100644 index 0000000..58c9b43 --- /dev/null +++ b/ruby/alternate-datastores/http.md @@ -0,0 +1,103 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Usage Without ActiveRecord: HTTP Services + +> [Read First: Resources Overview]({{site.github.url}}/ruby/resources) + +> [View the YARD Documentation](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Resource.html) + +This is a commonly requested example. Instead of using a full-fledged +client like `ActiveRecord` or `Trample`, we'll show low-level usage that +could apply to a variety of HTTP clients. + +Remember, we always start with a "base scope" and modify that scope +depending on incoming request parameters. This same pattern could apply +to simply ruby hashes. + +{% highlight ruby %} +def index + render_jsonapi({}) +end +{% endhighlight %} + +Let's start by specifying a `Null` adapter - a pass-through adapter that +won't do anything without us explicitly overriding: + +{% highlight ruby %} +# config/initializers/jsonapi.rb +require 'jsonapi_compliable/adapters/null' +{% endhighlight %} + +{% highlight ruby %} +# app/resources/post_resource.rb +use_adapter JsonapiCompliable::Adapters::Null +{% endhighlight %} + +Every time we get a request to sort, paginate, etc we'll need to modify +our hash. Here we'll simply merge parameters in the format our HTTP +client will accept: + +{% highlight ruby %} +# app/resources/post_resource.rb +allow_filter :title do |scope, value| + scope.merge!(conditions: { title: value }) +end + +sort do |scope, attribute, direction| + scope.merge!(order: { attribute => direction }) +end + +paginate do |scope, current_page, per_page| + offset = (current_page * per_page) - per_page + scope.merge!(limit: per_page, offset: offset) +end +{% endhighlight %} + +Finally, we need to tell the resorce how to resolve the query. In our +case, this means passing the built-up parameters into a method on our +HTTP client. + +{% highlight ruby %} +# app/resources/post_resource.rb + +# Remember, 'scope' here is a hash +def resolve(scope) + results = MyHTTPClient.get(scope) + results.map { |r| Post.new(r) } +end +{% endhighlight %} + +Note that [#resolve](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Resource.html#resolve-instance_method) must return an array of `Model` instances. These +can be simple POROs, as you see above. + +The final request would look something like this: + +{% highlight ruby %} +HTTPClient.get \ + conditions: { title: "Hello World!" }, + order: { created_at: :desc }, + limit: 10, + offset: 20 +{% endhighlight %} + +In our controller, if we used the lower-level [jsonapi_scope](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Base.html#jsonapi_scope-instance_method) method to introspect our results, we'd see an array of `Post` instances: + +{% highlight ruby %} +# app/controllers/posts_controller.rb +def index + scope = jsonapi_scope({}) + posts = scope.resolve + puts posts # [#, #, ...] + render_jsonapi(posts, scope: false) +end +{% endhighlight %} + +If we found ourselves typing similar `Resource` code - always merging in +the same paramters to the hash - we'd probably want to package all this +up into an +[Adapter]({{site.github.url}}/ruby/alternate-datastores/adapters). diff --git a/ruby/alternate-datastores/index.md b/ruby/alternate-datastores/index.md new file mode 100644 index 0000000..90c4952 --- /dev/null +++ b/ruby/alternate-datastores/index.md @@ -0,0 +1,30 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Alternate Datastores + +It's important to note that `ActiveRecord` is nothing but a sensible +default. Because you have [full control over the +query]({{site.github.url}}/ruby/reads/resources) JSONAPI Suite can be +used with any datastore, from MongoDB to HTTP service calls. + +In this section, we'll show examples customizing resource logic, then +packaging that logic into reusable `Adapter`s. + +> Keep in mind, multiple datastores can be blended in a single request. +> We can load `Post`s from a SQL database, and "sideload" `Comment`s +> from MongoDB seamlessly. + +* [ElasticSearch + Example]({{site.github.url}}/ruby/alternate-datastores/elasticsearch) + +* [PORO Example]({{site.github.url}}/ruby/alternate-datastores/poro) + +* [HTTP Service + Example]({{site.github.url}}/ruby/alternate-datastores/http) + +* [Adapters]({{site.github.url}}/ruby/alternate-datastores/adapters) diff --git a/ruby/backwards-compatibility.md b/ruby/backwards-compatibility.md new file mode 100644 index 0000000..c7d0fa7 --- /dev/null +++ b/ruby/backwards-compatibility.md @@ -0,0 +1,42 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Backwards Compatibility + +Before we deploy our code to production, we want to ensure we +aren't introducing any backwards incompatibilities that will break +existing clients. Of course, tests are our first line of defense here. +But a developer could always simply update the test and introduce a +backwards-incompatibility. This is why JSONAPI Suite comes with an +additional backwards-compatibility check you can run in your Continuous +Integration pipeline. + +In the course of writing our application, we [autodocumented +with Swagger]({{site.github.url}}/ruby/swagger). That means our +`swagger.json` is effectively a **schema** - a definition of +attributes, types, query parameters and payloads. We can compare the +`swagger.json` of a given commit to what's running in production to +see if any backwards-incompatibilities were introduced. + +If you used our [generator]({{site.github.url}}/ruby/installation) to set up your application, you'll have noticed this line added to `Rakefile`: + +{% highlight ruby %} +require 'jsonapi_swagger_helpers' +{% endhighlight %} + +This allows us to run the rake task + +{% highlight bash %} +rake swagger_diff['my_api','http://example.com'] +{% endhighlight %} + +This task will: + + * Pull down the schema from `http://example.com/my_api/swagger.json`. + * Compare it to the `swagger.json` generated locally. + +This uses [swagger-diff](https://github.com/civisanalytics/swagger-diff) underneath the hood. You'll get helpful output noting any missing filters, incorrect types, or other backwards incompatibilities. diff --git a/ruby/error-handling.md b/ruby/error-handling.md new file mode 100644 index 0000000..d839dd3 --- /dev/null +++ b/ruby/error-handling.md @@ -0,0 +1,42 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Error Handling + +> [View the jsonapi_errorable documentation](https://jsonapi-suite.github.io/jsonapi_errorable) + +We want to follow the common best-practice of raising a specific error class: + +{% highlight ruby %} +raise Errors::NotAuthorized +{% endhighlight %} + +The problem is, this error would cause our server to return a `500` +status code, without much helpful detail. Instead, we want to +customize our responses based on the error thrown. + +Enter [jsonapi_errorable](https://jsonapi-suite.github.io/jsonapi_errorable), which provides a simple DSL to do just that: + +{% highlight ruby %} +# app/controllers/application_controller.rb +register_exception Errors::NotAuthorized, status: 403 +{% endhighlight %} + +Here we've customized the [error response](http://jsonapi.org/format/#errors) to send the HTTP status code `403` ([forbidden](https://httpstatuses.com/403)) whenever this particular exception class is raised. + +Maybe our error class already has a message we want to display to the +user: + +{% highlight ruby %} +register_exception Errors::NotAuthorized, + status: 403, + title: "Not Authorized", + message: true, +{% endhighlight %} + +For full documentation on everything you can do here, head over to +the [jsonapi_errorable](https://jsonapi-suite.github.io/jsonapi_errorable/) documentation. diff --git a/ruby/index.md b/ruby/index.md new file mode 100644 index 0000000..2dfeb4d --- /dev/null +++ b/ruby/index.md @@ -0,0 +1,21 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Server-Side + +JSONAPI Suite is a collection of ruby libraries that facilitate adhering +to the [jsonapi.org](http://jsonapi.org) specification. At its heart is +a query builder that supports fully nested reads and writes, adaptable +to any datastore, from ActiveRecord to MongoDB to raw HTTP service calls. We'll autodocument those endpoints for you with [Swagger]({{site.github.url}}/ruby/swagger), provide an [error handling pattern]({{site.github.url}}/ruby/error-handling), and test everything will full-stack integration [request specs]({{site.github.url}}/ruby/testing). + +If you just want to get rolling quickly, check out the +[Quickstart]({{site.github.url}}/quickstart). For step-by-step examples, +check out the [Tutorial]({{site.github.url}}/tutorial). Or, for +client-side usage, check out [JSORM]({{site.github.url}}/js/home). + +For any questions not addressed here, feel free to ask in our [Slack +Chat](https://jsonapi-suite.slack.com/join/shared_invite/enQtMjkyMTA3MDgxNTQzLWVkMDM3NTlmNTIwODY2YWFkMGNiNzUzZGMzOTY3YmNmZjBhYzIyZWZlZTk4YmI1YTI0Y2M0OTZmZGYwN2QxZjg). diff --git a/ruby/installation.md b/ruby/installation.md new file mode 100644 index 0000000..380010c --- /dev/null +++ b/ruby/installation.md @@ -0,0 +1,90 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Installation + +JSONAPI Suite comes with a [Rails Application Template](http://guides.rubyonrails.org/rails_application_templates.html) to get you up and running quickly. To apply a template, you can pass either a URL or path to a file. + +To generate a new application with the template: + +{% highlight bash %} +$ rails new myapp --api -m https://raw.githubusercontent.com/jsonapi-suite/rails_template/master/all.rb +{% endhighlight %} + +If needed, this command can be run by downloading `all.rb` and +pointing to it on your filesystem: + +{% highlight bash %} +$ rails new myapp --api -m /path/to/all.rb +{% endhighlight %} + +Run `git status` to see what the generator did. + +### Breaking down the generator + +The generator mostly installs gems and types some boilerplate for you. +But it can be helpful to understand everything that's going on and +customize to your needs (these are all customizable defaults). +Here's a line-by-line breakdown to explain what's going on. Use `git +status` to follow along. + +* **app/controllers/application_controller.rb** + * Mixes in `JsonapiSuite::ControllerMixin`. This includes relevant + modules that decorate our controllers with methods like + `render_jsonapi`. + * Sets up global error handling, ensuring that we always render a + JSONAPI-compliant [errors payload](http://jsonapi.org/format/#errors). + Errors are handled through a DSL provided by [jsonapi_errorable](https://jsonapi-suite.github.io/jsonapi_errorable) - throw an error and use the DSL to customize response codes, messages, etc. In this code we'll follow a common Rails pattern and respond with `404` from `show` endpoints when a record is not found in the datastore. + +* **config/routes.rb** + * Configures routing so all our endpoints will be under `//v1`. The `` is so you can point something like [HAProxy](http://www.haproxy.org) to various microservices based on the path. The `v1` sets up a simple versioning pattern. + * Adds a `docs` resource. This for automatic [Swagger](https://swagger.io) documentation. Swagger requires a schema - `swagger.json` - that is generated from our `DocsController`. For more on this, see the [Autodocumentation]({{ site.github.url }}/ruby/swagger) section. + +* **spec/rails_helper.rb** + * Adds [jsonapi_spec_helpers](https://jsonapi-suite.github.io/jsonapi_spec_helpers). This gives us helper methods like `json_item` and `assert_payload` that lower the overhead of dealing with verbose JSONAPI responses. See more in the [Testing]({{ site.github.url }}/ruby/testing) section. + * `JsonapiErrorable.disable!` disables global error handling before + each test. This is because we usually don't want errors to be + swallowed during tests. You can always turn it back on in a per-test + basis with `JsonapiErrorable.enable!` + * Adds [database_cleaner](https://github.com/DatabaseCleaner/database_cleaner) to ensure a clean database between tests. + * Mixes in [factory_bot](https://github.com/thoughtbot/factory_bot_rails) methods. This gives us syntactic sugar of saying `create(:person)` instead of `FactoryBot.create(:person)`. See more in the [Testing]({{ site.github.url }}/ruby/testing) section. + * Removes some fixture-specific configuration that is now handled by + `database_cleaner`. + +* **app/controllers/docs_controller/rb** + * This is the controller that will generate our [Swagger](https://swagger.io) schema. It's using [Swagger Blocks](https://github.com/fotinakis/swagger-blocks) and [jsonapi_swagger_helpers](https://github.com/jsonapi-suite/jsonapi_swagger_helpers) under-the-hood. To learn more about Swagger documentation, see the the [Autodocumentation]({{ site.github.url }}/ruby/swagger) section. + +* **public/api** + * Adds a [Swagger UI]({{ site.github.url }}/ruby/swagger) to our project. + +* **config/initializers/jsonapi.rb** + * Requires the `ActiveRecord` adapter, which comes with the Suite. Comment this line if you'd like + to avoid `ActiveRecord`. Learn more in the [Adapters]({{ site.github.url }}/ruby/alternate-datastores/adapters) section. + +* **config/initializers/strong_resources.rb** + * Stores templates that whitelist API inputs. Learn more in the + [Strong Resources]({{ site.github.url }}/ruby/writes/strong-resources) section. + +* **Rakefile** + * Requires the swagger helpers library in order to run + [backwards-compatibility]({{ site.github.url }}/ruby/backwards-compatibility) checks against production. + +* **Gemfile** + * We've added some dependencies, most of which are discussed in other + sections: + * `jsonapi-rails`: used for serialization, this is the + rails-specific extension for [jsonapi-rb](http://jsonapi-rb.org) + * `jsonapi_swagger_helpers`: used automatically generating Swagger + documentation. + * `jsonapi_spec_helpers`: easily deal with complex JSONAPI responses + in tests. + * `kaminari`: Default pagination gem. + * `rspec-rails`: Testing framework. + * `factory_bot_rails`: For easily seeding data in tests. + * `faker`: for randomizing factory data. + * `swagger-diff`: for backwards-compatibility checks. + * `database_cleaner`: for cleaning the DB between tests. diff --git a/ruby/reads/activerecord-associations.md b/ruby/reads/activerecord-associations.md new file mode 100644 index 0000000..ac20647 --- /dev/null +++ b/ruby/reads/activerecord-associations.md @@ -0,0 +1,152 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### ActiveRecord Associations + +> [View the Sample App](https://github.com/jsonapi-suite/employee_directory/compare/step_9_associations...step_12_fsp_associations) + +> [Understanding Nested Queries]({{site.github.url}}/ruby/reads/nested}}) + +JSONAPI Suite comes with an `ActiveRecord` adapter. Though other +adapters can mimic this same interface, here's what you'll get +out-of-the-box. The SQL here is roughly the same as using [#includes](http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations). + +> Note: make sure to whitelist associations in your [serializers]({{site.github.url}}/ruby/reads/serializers) or nothing will render! + +#### has_many + +{% highlight bash %} +/posts?include=comments +{% endhighlight %} + +{% highlight ruby %} +# app/resources/post_resource.rb +has_many :comments, + scope: -> { Comment.all }, + resource: CommentResource, + foreign_key: :post_id +{% endhighlight %} + +#### belongs_to + +{% highlight bash %} +/comments?include=posts +{% endhighlight %} + +{% highlight ruby %} +# app/resources/comment_resource.rb +belongs_to :post, + scope: -> { Post.all }, + resource: PostResource, + foreign_key: :post_id +{% endhighlight %} + +#### has_one + +{% highlight bash %} +/posts?include=detail +{% endhighlight %} + +{% highlight ruby %} +# app/resources/post_resource.rb +has_one :detail, + scope: -> { PostDetail.all }, + resource: PostDetailResource, + foreign_key: :post_id +{% endhighlight %} + +#### has_and_belongs_to_many + +{% highlight bash %} +/posts?include=tags +{% endhighlight %} + +{% highlight ruby %} +# app/resources/post_resource.rb +has_and_belongs_to_many :tags, + scope: -> { Tag.all }, + resource: TagResource, + foreign_key: { taggings: :tag_id } +{% endhighlight %} + +The only difference here is the foreign_key - we’re passing a hash instead of a symbol. `taggings` is our join table, and `tag_id` is the true foreign key. + +This will work, and for simple many-to-many relationships you can move on. But what if we want to add the property `primary`, a boolean, to the `taggings` table? Since we hid this relationship from the API, how will clients access it? + +As this is metadata about the relationship it should go on the meta section of the corresponding relationship object. While supporting such an approach is on the JSONAPI Suite roadmap, we haven't done so yet. + +For now, it might be best to simply expose the intermediate table to the API. Using a client like [JSORM]({{site.github.url}}/js/home), the overhead of this approach is minimal. + +#### polymorphic_belongs_to + +{% highlight ruby %} +# app/models/employee.rb +belongs_to :workspace, polymorphic: true +{% endhighlight %} + +{% highlight ruby %} +# app/models/workspace.rb +has_many :employees, as: :workspace +{% endhighlight %} + +{% highlight ruby %} +# app/resources/employee_resource.rb +polymorphic_belongs_to :workspace, + group_by: :workspace_type, + groups: { + 'Office' => { + scope: -> { Office.all }, + resource: OfficeResource, + foreign_key: :workspace_id + }, + 'HomeOffice' => { + scope: -> { HomeOffice.all }, + resource: HomeOfficeResource, + foreign_key: :workspace_id + } + } +{% endhighlight %} + +{% highlight bash %} +/employees?include=workspace +{% endhighlight %} + +Here an `Employee` belongs to a `Workspace`. `Workspace`s have +different `type`s - `HomeOffice`, `Office`, `CoworkingSpace`, etc. The +`employees` table has `workspace_id` and `workspace_type` columns +to support this relationship. + +We may need to query each `workspace_type` differently - perhaps +they live in separate tables (`home_offices`, `coworking_spaces`, etc). So, when fetching the relationship, we'll need to group our `Employees` by `workspace_type` and query differently for each group: + +{% highlight ruby %} +# app/resources/employee_resource.rb +polymorphic_belongs_to :workspace, + group_by: :workspace_type, + groups: { + 'Office' => { + scope: -> { Office.all }, + resource: OfficeResource, + foreign_key: :workspace_id + }, + 'HomeOffice' => { + scope: -> { HomeOffice.all }, + resource: HomeOfficeResource, + foreign_key: :workspace_id + } + } +{% endhighlight %} + +Let's say our API was returning 10 `Employees`, sideloading their corresponding `Workspace`. The underlying code would: + +* Fetch the employees +* Group the employees by the given key: `employees.group_by { |e| + e.workspace_type }` +* Use the `Office` configuration for all `Employee`s where + `workspace_type` is `Office`, and use the `HomeOffice` configuration +for all `Employee`s where `workspace_type` is `HomeOffice`, and so +forth. diff --git a/ruby/reads/adapters.md b/ruby/reads/adapters.md new file mode 100644 index 0000000..e495a89 --- /dev/null +++ b/ruby/reads/adapters.md @@ -0,0 +1,12 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Adapters + +> [View the Sample App](https://github.com/jsonapi-suite/employee_directory/compare/step_23_disassociation...elasticsearch_adapter) + +> [View the YARD Documentation](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Adapters/Abstract.html) diff --git a/ruby/reads/basic-reads.md b/ruby/reads/basic-reads.md new file mode 100644 index 0000000..55a745b --- /dev/null +++ b/ruby/reads/basic-reads.md @@ -0,0 +1,145 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Basic Reads + +Here's the full code for a JSONAPI endpoint that supports sorting, +pagination, sparse fieldsets and a [JSONAPI-compliant](http://jsonapi.org/format/#document-structure) response: + +{% highlight ruby %} +# app/models/post.rb +class Post < ApplicationRecord +end +{% endhighlight %} + +{% highlight ruby %} +# config/routes.rb +scope path: '/api' do + scope path: '/v1' do + resources :posts, only: [:index] + end +end +{% endhighlight %} + +{% highlight ruby %} +# app/serializers/serializable_post.rb +class SerializablePost < JSONAPI::Serializable::Resource + type :posts + + attribute :title + attribute :description + attribute :body +end +{% endhighlight %} + +{% highlight ruby %} +# app/resources/post_resource.rb +class PostResource < ApplicationResource + type :posts + model Post +end +{% endhighlight %} + +{% highlight ruby %} +# app/controllers/posts_controller.rb +class PostsController < ApplicationController + jsonapi resource: PostResource + + def index + posts = Post.all + render_jsonapi(posts) + end +end +{% endhighlight %} + +Let's walk through each of these files: + +* **app/models/post.rb** + * Our [Model](https://martinfowler.com/eaaCatalog/domainModel.html). As Martin Fowler puts it, "*An object model of the domain that incorporates both behavior and data.*". In this case we're using [ActiveRecord](http://guides.rubyonrails.org/active_record_basics.html), though other model patterns can be used. This is the **M** of [MVC](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller). + +* **config/routes.rb** + * Sets up the endpoint `/api/v1/posts`, per [Rails Routing](http://guides.rubyonrails.org/routing.html). + +* **app/serializers/serializable_post.rb** + * Given a `Model`, how do we want to represent that model as JSON? We + might want to avoid exposing certain attributes, normalize values, +or compute something specific to the view. This is the **V** of [MVC](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller). + * We use the excellent [jsonapi-rb](http://jsonapi-rb.org) library for + serialization. If you're familiar with [active_model_serializers](https://github.com/rails-api/active_model_serializers), this code will look very familiar. + +* **app/resources/post_resource.rb** + * A `Resource` holds the logic for querying and persisting our + `Model`s based on the JSONAPI request. [Learn about Resources +here]({{site.github.url}}/ruby/reads/resources). + +* **app/controllers/posts_controller.rb** + * This is a typical [Rails Controller](http://guides.rubyonrails.org/action_controller_overview.html), the **C** of [MVC](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller). + * We've added `jsonapi resource: PostResource` to tell our controller + to use query and persistence logic defined in our [Resource]({{site.github.url}}/ruby/resources). + +All of this leads up to the all-important `render_jsonapi` method. + +#### render_jsonapi + +> [View the YARD documentation](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Base.html#render_jsonapi-instance_method) + +This method does two things: builds and resolves the "base scope", and passes relevant options to the serialization layer. + +In other words, this lower-level code would be the equivalent: + +{% highlight ruby %} +scope = jsonapi_scope(Post.all) # build up the scope +posts = scope.resolve # fire the query +render json: posts, + fields: params[:fields].split(','), + bunch: 'of', + other: 'options' +{% endhighlight %} + +* We've started with a base scope - `Post.all` - and passed it into our + [Resource]({{site.github.url}}/ruby/resources), which will + modify the scope based on incoming parameters. +* We've passed a number of boilerplate options to the underlying + [jsonapi-rb](http://jsonapi-rb.org) serialization library. + +There are times we want to manually build and resolve the scope prior to +calling `render_jsonapi`. The `show` action is one example. + +#### The `#show` action + + +Our [#show action](http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions) fetches one specific post by ID, rather than a list of posts. To accomodate this, we manually build and resolve the scope instead of applying the default logic in `#render_jsonapi`: + +{% highlight ruby %} +scope = jsonapi_scope(Post.where(id: params[:id])) +post = scope.resolve.first +render_jsonapi(post, scope: false) +{% endhighlight %} + +Note the `scope: false` option - we've already resolved our models, so +we tell `render_jsonapi` not to run the scoping logic again. + +> [View the YARD documentation for #jsonapi_scope](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Base.html#jsonapi_scope-instance_method) + +It's a common convention in Rails to return a `404` response code from +the `show` action when a record is not found. Typically you'd raise and +rescue `ActiveRecord::RecordNotFound`...but we want to be agnostic to +the database. Instead: + +{% highlight ruby %} +raise JsonapiCompliable::Errors::RecordNotFound unless post +{% endhighlight %} + +{% highlight ruby %} +# app/controllers/application_controller.rb +rescue_exception JsonapiCompliable::Errors::RecordNotFound, + status: 404 +{% endhighlight %} + +We're throwing an exception, and using our [error handling +library]({{site.github.url}}/ruby/error-handling) to +customize the status code when that particular error is thrown. diff --git a/ruby/reads/default-behavior.md b/ruby/reads/default-behavior.md new file mode 100644 index 0000000..fda6568 --- /dev/null +++ b/ruby/reads/default-behavior.md @@ -0,0 +1,56 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Default Behavior + +You may need to change the default behavior or your API - perhaps you +want a default of 10 per page instead of 20. JSONAPI Suite provides +facilities that enable ***defaults*** that can be ***overridden*** - 10 per +page, unless elsewise specified by the user. + +You can see these defaults in the [Resource documentation](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Resource.html): + +{% highlight ruby %} +default_filter :active do |scope| + scope.where(active: true) +end + +default_page_size(10) + +default_sort([{ created_at: :desc }]) +{% endhighlight %} + +These can all be overriden by the user. In other words, hitting +`/posts` will only show active `Post`s, hitting +`/posts?filter[active]=false` will show inactive `Post`s. The same applies +for sorting and pagination. + +A common pattern is for default filters to apply for all users, but +allow overrides for administrators. You can use the `:if` option to +restrict the override: + +{% highlight ruby %} +# app/resources/post_resource.rb +allow_filter :active, if: :admin? + +# app/controllers/posts_controller.rb +def admin? + current_user.admin? +end +{% endhighlight %} + +Now the default behavior is to view only active `Post`s, but +*administrators* can override this default. + +You also have access to the context (in Rails, the controller) as the +last argument to `default_filter`: + +{% highlight ruby %} +default_filter :by_user do |scope, context| + scope.where(user_id: context.current_user.id) +end +{% endhighlight %} diff --git a/ruby/reads/fieldsets.md b/ruby/reads/fieldsets.md new file mode 100644 index 0000000..b213489 --- /dev/null +++ b/ruby/reads/fieldsets.md @@ -0,0 +1,75 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Fieldsets + +> [View the JSONAPI specification](http://jsonapi.org/format/#fetching-sparse-fieldsets) + +> [View the JS Documentation]({{ site.github.url }}/js/reads/fieldsets) + +#### Sparse Fieldsets + +You'll get this for free. Given a serializer: + +{% highlight ruby %} +# app/serializers/serializable_post.rb +class SerializablePost < JSONAPI::Serializable::Resource + type :posts + + attribute :title + attribute :description + attribute :comment_count +end +{% endhighlight %} + +And the request: + +{% highlight bash %} +/posts?fields[posts]=title,comment_count +{% endhighlight %} + +The `description` field will not be returned in the response. + +#### Extra Fieldsets + +> [View the YARD documentation](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Scoping/ExtraFields.html) + +The opposite of a "sparse fieldset" is an "extra fieldset". Perhaps you +have an attribute that is computationally expensive and should only be +returned when explicitly requested. Perhaps the majority of your clients +need the same fields (and can share the same cache) but one client needs +extra data (and you'll accept the cache miss). + +To request an extra field, just specify it in your serializer: + +{% highlight ruby %} +# app/serializers/serializable_employee.rb + +extra_attribute :net_worth do + 1_000_000 +end +{% endhighlight %} + +In the URL, replace `fields` with `extra_fields`: + +{% highlight bash %} +/posts?extra_fields[employees]=net_worth +{% endhighlight %} + +The `net_worth` attribute will only be returned when explicitly +requested. + +You may want to eager load some data only when a specific extra field is +requested. There's a hook for this in your `Resource`; + +{% highlight ruby %} +# app/resources/employee_resource.rb + +extra_field(employees: [:net_worth]) do |scope| + scope.includes(:assets) +end +{% endhighlight %} diff --git a/ruby/reads/filtering.md b/ruby/reads/filtering.md new file mode 100644 index 0000000..f9e281b --- /dev/null +++ b/ruby/reads/filtering.md @@ -0,0 +1,151 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Filtering + +> [View the JSONAPI specification](http://jsonapi.org/format/#fetching-filtering) + +> [View the YARD Documentation](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Resource.html#allow_filter-class_method) + +> View the Sample App: [Server1](https://github.com/jsonapi-suite/employee_directory/commit/cf501dd95f8d4211973092a673a9a449bf467a46) \|  [Server2](https://github.com/jsonapi-suite/employee_directory/compare/step_1_add_filter...step_2_add_custom_filter) \|  [Client](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_3_includes...step_4_filtering) + +> [View the JS Documentation]({{ site.github.url }}/js/reads/filtering) + +Filters are usually one-liners, with the logic delegated to an [Adapter]({{ site.github.url }}/ruby/alternate-datastores/adapters). + +{% highlight ruby %} +allow_filter :title +{% endhighlight %} + +You can view `allow_filter` like a whitelist. We wouldn't want to +automatically support filters - otherwise sneaky users might filter our +`Employee`s to only those making a certain salary. Hence the whitelist. + +To customize a filter: + +{% highlight ruby %} +allow_filter :title do |scope, value| + scope.where(title: value) +end +{% endhighlight %} + +A real-life example might be a prefix query: + +{% highlight ruby %} +allow_filter do |scope, value| + scope.where(["title LIKE ?", "#{value}%"]) +end +{% endhighlight %} + +#### Filtering Relationships + +Prefix the filter parameter with the relevant [JSONAPI Type](http://jsonapi.org/format/#document-resource-identifier-objects) like so: + +{% highlight bash %} +/blogs?include=posts&filter[posts][title]=foo +{% endhighlight %} + +#### Default Filters + +> [View the YARD Documentation](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Scoping/DefaultFilter.html) + +You may want your scope to be filtered any time it is accessed - Perhaps +you only want to show `active` posts by default: + +{% highlight ruby %} +default_filter :active do |scope| + scope.where(active: true) +end +{% endhighlight %} + +Default filters can be overridden if there is a corresponding +`allow_filter`. Given a `Resource`: + +{% highlight ruby %} +allow_filter :active + +default_filter :active do |scope| + scope.where(active: true) +end +{% endhighlight %} + +And the following requests: + +{% highlight bash %} +/posts +/posts?filter[active]=false +{% endhighlight %} + +The first will display only active posts, the second will display only +inactive posts. + +#### Filter Conventions + +There are some common naming conventions for supporting more complex filters: + +{% highlight ruby %} +# greater than +allow_filter :id_gt + +# greater than or equal to +allow_filter :id_gte + +# less than +allow_filter :id_lt + +# less than or equal to +allow_filter :id_lte + +# prefix queries +allow_filter :title_prefix + +# OR queries +allow_filter :active_or # true or false +{% endhighlight %} + +> NOTE: **AND** queries are supported by default - just pass a +> comma-delimited list of values. + +#### Filter Guards + +You can conditionally allow filters based on runtime context. +Let's say only managers should be allowed to filter employees by salary: + +{% highlight ruby %} +allow_filter :salary, if: :manager? + +def manager? + current_user.role == 'manager' +end +{% endhighlight %} + +#### Filter Aliases + +Aliases mostly come into play when supporting backwards +compatibility. Let's say we originally called the filter `fname` then +later wanted the more-expressive `first_name`. An alias allows is to +keep a one-liner with the correct naming, while still responding correctly +to `fname`: + +{% highlight ruby %} +allow_filter :first_name, aliases: [:fname] +{% endhighlight %} + +#### Accessing Runtime Context + +`allow_filter` can access runtime context (in Rails, the controller) as +the last argument: + +{% highlight ruby %} +allow_filter :my_siblings do |scope, value, context| + if value == true + scope.where(family_id: context.current_user.family_id) + else + scope + end +end +{% endhighlight %} diff --git a/ruby/reads/nested.md b/ruby/reads/nested.md new file mode 100644 index 0000000..85602d0 --- /dev/null +++ b/ruby/reads/nested.md @@ -0,0 +1,128 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Relationships and Nested Queries + +> [View the JSONAPI Specification](http://jsonapi.org/format/#fetching-includes) + +> [View the Sample App](https://github.com/jsonapi-suite/employee_directory/compare/step_9_associations...step_12_fsp_associations) + +> [View the JS Documentation]({{site.github.url}}/js/reads/nested-queries) + +Let's say we want to fetch a `Post` and all of its `Comment`s: + +{% highlight bash %} +/posts?include=comments +{% endhighlight %} + +Using the default `ActiveRecord` Adapter, we would add this code to our +`PostResource`: + +{% highlight ruby %} +# app/resources/post_resource.rb +has_many :comments, + scope: -> { Comment.all }, + resource: CommentResource, + foreign_key: :post_id +{% endhighlight %} + +> Note: we'd have to whitelist `comments` in our [serializer]({{ site.github.url }}/ruby/reads/serializers) as well. + +To understand this code, we first have to realize that this is a Macro - +code that is generating lower-level code for the purposes of removing +boilerplate. Let's understand the lower-level DSL before breaking +down the macro. + +{% highlight ruby %} +allow_sideload :comments, resource: CommentResource do + scope do |posts| + # ... code ... + end + + assign do |posts, comments| + # ... code ... + end +end +{% endhighlight %} + +This is the lower-level `allow_sideload` DSL. There are four things +going on. To begin with: + +* We've whitelisted `comments`. Without this, the request would raise + the error `JsonapiCompliable::Errors::InvalidInclude`. This ensures + clients can't arbitrarily pull back data that could introduce performance + problems or security risks. +* We've said, "when retrieving comments, re-use the logic defined in + `CommentResource`". This way all the filter, sorting, etc query logic +at the `/comments` endpoint can be reused when sideloading comments from +the `/posts?include=comments` endpoint. + +That brings us to the `scope` and `assign` hooks. When querying a +relationship, we need to answer two questions: + +* Given a list of parents (`post`s), how should we scope the request for +children (`comment`s)? This is the `scope` block. In a relational +database, we'd usually scope based on foreign and primary keys. +* Given a list of parents (`post`s) and a list of children (`comment`s), +how do you want to assign these objects together? This is the `assign` +block. In a relational database, we'd usually compare foreign and +primary keys. + +In other words, the code would look similar to this for `ActiveRecord`: + +{% highlight ruby %} +scope do |posts| + Comment.where(post_id: posts.map(&:id)) +end + +assign do |posts, comments| + posts.each do |post| + post.comments = comments.select { |c| c.post_id == post.id } + end +end +{% endhighlight %} + +Note that `scope` hasn't actually fired a query - we take the result of +this block and pass it to `CommentResource` so that further query logic +(filtering, sorting, etc) can be applied and re-used across endpoints. + +Of course, the code above would be very tedious to write by hand every +time. That's why we have Macros like `has_many`, `belongs_to` etc - +configure only the parts you need, and avoid the boilerplate: + +{% highlight ruby %} +# app/resources/post_resource.rb +has_many :comments, + scope: -> { Comment.all }, + resource: CommentResource, + foreign_key: :post_id + # primary_key defaults to 'id' +{% endhighlight %} + +Given the above options, we can auto-generate `allow_sideload` code. You +can always write `allow_sideload` directly if you have highly customized +logic. You can also pass a block to the macros to customize: + +{% highlight ruby %} +# app/resources/post_resource.rb +has_many :comments, + scope: -> { Comment.all }, + resource: CommentResource, + foreign_key: :post_id do + assign do |posts, comments| + # some custom code to associate these objects + Post.associate(posts, comments) + end + end +{% endhighlight %} + +Again, nested queries come for free. This code allows for nested queries +like "give me the post, and its `active` comments": + +{% highlight bash %} +/posts/1?include=comments&filter[comments][active]=true +{% endhighlight %} diff --git a/ruby/reads/pagination.md b/ruby/reads/pagination.md new file mode 100644 index 0000000..9b1bf5b --- /dev/null +++ b/ruby/reads/pagination.md @@ -0,0 +1,34 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Pagination + +> [View the JSONAPI specification](http://jsonapi.org/format/#fetching-pagination) + +> [View the YARD Documentation](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Resource.html#paginate-class_method) + +> View the Sample App: [Server1](https://github.com/jsonapi-suite/employee_directory/compare/step_4_custom_sorting...step_5_pagination) \|  [Server2](https://github.com/jsonapi-suite/employee_directory/compare/step_5_pagination...step_6_custom_pagination) \|  [Client](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_6_stats...step_7_pagination) + +> [View the JS Documentation]({{ site.github.url }}/js/reads/pagination) + +Pagination usually happens with no developer intervention, instead handled +automatically by an [Adapter]({{ site.github.url }}/ruby/alternate-datastores/adapters). To +customize: + +{% highlight ruby %} +paginate do |scope, current_page, per_page| + scope.page(current_page).per(per_page) +end +{% endhighlight %} + +A real-life example might be replacing the default [Kaminari](https://github.com/kaminari/kaminari) gem with [will_paginate](https://github.com/mislav/will_paginate): + +{% highlight ruby %} +paginate do |scope, current_page, per_page| + scope.paginate(page: current_page, per_page: per_page) +end +{% endhighlight %} diff --git a/ruby/reads/serializers.md b/ruby/reads/serializers.md new file mode 100644 index 0000000..6174732 --- /dev/null +++ b/ruby/reads/serializers.md @@ -0,0 +1,110 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Serializers + +> [View the Sample App](https://github.com/jsonapi-suite/employee_directory/compare/step_24_autodocumentation...custom-serialization) + +> [View additional documentation at jsonapi-rb.org](http://jsonapi-rb.org) + + + +We use [jsonapi-rb](http://jsonapi-rb.org) for serialization. If you've used [active_model_serializers](https://github.com/rails-api/active_model_serializers) before, it will look incredibly familiar: + +{% highlight ruby %} +# app/serializers/serializable_post.rb +class SerializablePost < JSONAPI::Serializable::Resource + type :posts + + attribute :title + attribute :description + attribute :body +end +{% endhighlight %} + +Would render the [JSONAPI Document](http://jsonapi.org/format/#document-structure): + +{% highlight ruby %} +{ + data: { + type: "posts", + id: "123", + attributes: { + title: "My Post", + description: "Some description", + body: "Blah blah blah" + } + } +} +{% endhighlight %} + +#### Associations + +To add an association: + +{% highlight ruby %} +has_many :comments +{% endhighlight %} + +Assuming there is a corresponding `SerializableComment`, you'd see: + +{% highlight ruby %} +{ + data: { + type: "posts", + id: "123", + attributes: { ... }, + relationships: { + comments: { + data: [ + { id: "1", type: "comments" } + ] + } + } + }, + included: [ + { + type: "comments", + id: "1" + } + ] +} +{% endhighlight %} + +> Note: Your `Resource` must [whitelist this sideload]({{site.github.url}}/ruby/reads/nested) as well. + +#### Customizing Serializers + +Occasionally you may need to normalize, format, or elsewise transform +your `Model` into an effective JSON representation. To do this, pass a +block to `attribute` and reference the underlying `@object` being +serialized: + +{% highlight ruby %} +attribute :title do + @object.title.upcase +end +{% endhighlight %} + +> Why not methods like AMS? To avoid collissions with native ruby methods like `tap`. + +Keep in mind all serializers have access to `@context` - the calling +controller in Rails. + +#### Conditional Fields + +You may want to render a field based on runtime context - for instance, +only show the `salary` field if the user is a manager. Keeping in mind +that `@context` will always be available as the calling controller: + +{% highlight ruby %} +attribute :salary, if: -> { @context.current_user.manager? } +{% endhighlight %} + +> [View additional documentation at jsonapi-rb.org](http://jsonapi-rb.org) + +> [Visit the jsonapi-rb Gitter chatroom](https://gitter.im/jsonapi-rb) diff --git a/ruby/reads/sorting.md b/ruby/reads/sorting.md new file mode 100644 index 0000000..1ce259e --- /dev/null +++ b/ruby/reads/sorting.md @@ -0,0 +1,50 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Sorting + +> [View the JSONAPI specification](http://jsonapi.org/format/#fetching-sorting) + +> [View the YARD Documentation](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Resource.html#sort-class_method) + +> View the Sample App: [Server1](https://github.com/jsonapi-suite/employee_directory/compare/step_2_add_custom_filter...step_3_basic_sorting) \|  [Server2](https://github.com/jsonapi-suite/employee_directory/compare/step_3_basic_sorting...step_4_custom_sorting) \|  [Client](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_4_filtering...step_5_sorting) + +> [View the JS Documentation]({{ site.github.url }}/js/reads/sorting) + +Sorting usually happens with no developer intervention, instead handled +automatically by an [Adapter]({{ site.github.url }}/ruby/alternate-datastores/adapters). To +customize: + +{% highlight ruby %} +sort do |scope, attribute, direction| + scope.order(attribute => direction) +end +{% endhighlight %} + +A real-life example might be sorting on a different table. Let's say an +Employee has many Positions, and `title` lives in the `positions` table: + +{% highlight ruby %} +sort do |scope, attribute, direction| + if attribute == :title + scope.joins(:positions).order("positions.title #{direction}") + else + scope.order(attribute => direction) + end +end +{% endhighlight %} + +> Note: the same `sort` proc will fire for every sort parameter supplied +> in the request. In other words, yes - you can multisort! + +#### Sorting Relationships + +Prefix the sort parameter with the relevant [JSONAPI Type](http://jsonapi.org/format/#document-resource-identifier-objects) like so: + +{% highlight bash %} +/blogs?include=posts&sort=posts.title +{% endhighlight %} diff --git a/ruby/reads/statistics.md b/ruby/reads/statistics.md new file mode 100644 index 0000000..5671aa1 --- /dev/null +++ b/ruby/reads/statistics.md @@ -0,0 +1,64 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Statistics + +> [View the JS Documentation]({{ site.github.url }}/js/reads/statistics) + +> [View the YARD Documentation](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Resource.html#allow_stat-class_method) + +> View the Sample App: [Server1](https://github.com/jsonapi-suite/employee_directory/compare/step_6_custom_pagination...step_7_stats) \|  [Server2](https://github.com/jsonapi-suite/employee_directory/compare/step_7_stats...step_8_custom_stats) \|  [Client](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_5_sorting...step_6_stats) + +Statistics are useful and common. Consider a datagrid listing posts - we +might want a "Total Posts" count displayed above the grid without firing +an additional request. Notably, that statistic **should** take into +account filtering, but **should not** take into account pagination. + +You can whitelist stats in your `Resource`: + +{% highlight ruby %} +allow_stat total: [:count] +{% endhighlight %} + +And request them like so: + +{% highlight bash %} +/posts?stats[total]=count +{% endhighlight %} + +They will be returned in the [meta](http://jsonapi.org/format/#document-meta) section of the response: + +{% highlight ruby %} +{ + # ... + meta: { + stats: { + total: { + count: 100 + } + } + } +} +{% endhighlight %} + +You can run stats over specific attributes rather than `total`: + +{% highlight ruby %} +allow_stat rating: [:average] +{% endhighlight %} + +Adapters support the following statistics out-of-the-box: `count`, +`average`, `sum`, `maximum`, and `minimum`. You can also define custom +statistics: + +{% highlight ruby %} +allow_stat rating: [:average] do + standard_deviation do |scope, attr| + # your standard deviation code here + end +end +{% endhighlight %} diff --git a/ruby/resources.md b/ruby/resources.md new file mode 100644 index 0000000..a2fd56a --- /dev/null +++ b/ruby/resources.md @@ -0,0 +1,343 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Resources + +> "A `Model` is to the `Database` what a `Resource` is to the `API`" + +Resources might look magical at first, but they are actually just a +simple collection of a few common hooks. + +Consider a traditional Rails controller: + +{% highlight ruby %} +def index + posts = Post.all + render json: posts +end +{% endhighlight %} + +Imagine if we had to implement the [JSONAPI specification](http://jsonapi.org) by hand, ensuring our endpoints supported sorting, pagination, filtering, etc. You'd start seeing something along these lines: + +{% highlight ruby %} +# No query has fired yet, this is a blank ActiveRecord scope +posts = Post.all + +if title = params[:filter].try(:title) + # Alter the scope if we're filtering + posts = posts.where(title: title) +end + +# ... etc ... + +if sort = params[:sort] + # Alter the scope if we're sorting + sort_dir = :asc + if sort.starts_with?('-') + sort_dir = :desc + end + sort_att = sort.split('-')[1] + posts = posts.order(sort_att => sort_dir) +end + +# ... etc ... + +render json: posts.to_a # Finally! +{% endhighlight %} + +In other words...it'd be a gross mess, especially when dealing with +[inclusion of related +resources](http://jsonapi.org/format/#fetching-includes) or swapping +datastores. But the basic pattern - starting with a scope and then +decorating it based on incoming parameters - is incredibly powerful. + +Instead of writing this code by hand every time, let's move the +boilerplate into a library and leave developers with only the part they +care about - **how to modify the scope**: + +{% highlight ruby %} +allow_filter :title do |scope, value| + scope.where(title: value) +end + +sort do |att, dir| + scope.order(att => dir) +end +{% endhighlight %} + +This code lives in a `Resource`. All we're doing here is specifying [Procs](http://ruby-doc.org/core-2.1.1/Proc.html) that modify the scope, leaving boilerplate to the underlying `jsonapi_suite` library. + +Of course, with `ActiveRecord`, you'd see the same logic repeated here over +and over again. Let's supply defaults to DRY up this code and end +with: + +{% highlight ruby %} +# Whitelist the filter +allow_filter :title +{% endhighlight %} + +...but allow developers to override those defaults whenever they'd like: + +{% highlight ruby %} +allow_filter :title do |scope, value| + scope.where(["title LIKE ?", "#{value}%"]) +end + +sort do |attribute, direction| + # ... your custom sort logic ... +end +{% endhighlight %} + +The important thing is: **you still have full control of the query**. +This is why JSONAPI Suite can easily work with any datastore, from SQL +to MongoDB to HTTP requests. The "behind-the-scenes defaults" are stored +in an [Adapter]({{ site.github.url }}/ruby/alternate-datastores/adapters). +Supply blocks for one-off customizations, or package them up into an +`Adapter` once those customizations become commonplace. + +By default, JSONAPI Suite comes with an `ActiveRecordAdapter`. + +#### Scopes - a Generic Query-Building Pattern + +If you look closely at the above examples, you can see our code breaks +down into three key parts: + + * **Step 1**: Start with a "base scope" - a default query object. + * **Step 2**: Modify that scope based on incoming parameters. + * **Step 3**: Actually fire the query. + +This pattern applies to any ORM or datastore. Let's try it with an HTTP +client that accepts a hash of options. A generic Rails controller might +look something like: + +{% highlight ruby %} +def index + # Step 1: Our "base scope" + scope = {} + + # Step 2: Modify that scope based on the request + if title = params[:filter].try(:[], :title) + scope[:title] = title + end + + # Step 3: actually fire the request + build some models + # Post here is a PORO (plain old ruby object) + hashes = HTTP.get('/posts', scope) + posts = hashes.map { |attr| Post.new(attrs) } + + # render + render json: posts +end +{% endhighlight %} + +So our JSONAPI Suite equivalent would be: + +{% highlight ruby %} +# Step 1: Define the base scope in the controller +def index + base_scope = {} + # Pass the base scope to the resource, which will + # build + fire the query. + # + # Then, render the results. + render_jsonapi(base_scope) +end +{% endhighlight %} + +{% highlight ruby %} +# app/resources/post_resource.rb +# +# Step 2: Modify the scope in the Resource +allow_filter :title do |scope, value| + scope[:title] = value +end + +# Step 3: Actually fire the query +# This method must return an array of Model instances +def resolve(scope) + hashes = HTTP.get('/posts', scope) + hashes.map { |attr| Post.new(attrs) } +end +{% endhighlight %} + +Again, you can package this logic into an [Adapter]({{ site.github.url }}/ruby/alternate-datastores/adapters) if you found yourself repeating the same logic +over and over. Adapters DRY-up Resources. + +This pattern applies to sorting, pagination, statistics and such as +well - view the [Reads]({{ site.github.url }}/ruby/reads/basic-reads) documentation +for more. + +#### Associations + +In the prior section, we noted the 3 key parts of query building. For +associations, we need to answer 2 key questions: + + * **Question 1**: Given an array of parents, what should the "base scope" be + in order to query only relevant children? + * **Question 2**: Once we've resolved both the parents and the children, how do + we associate these objects together? + +Let's switch back to vanilla `ActiveRecord` for a second. We've resolved +the `Post`s and need to fetch the `Comment`s. Here's how we'd answer +these questions: + +{% highlight ruby %} +allow_sideload :comments, resource: CommentResource do + # Question 1: What's a "base scope" that will return only + # relevant comments? + scope do |posts| + Comment.where(post_id: posts.map(&:id)) + end + + # Question 2: How do we assign these objects together? + assign do |posts, comments| + posts.each do |post| + post.comments = comments.select { |c| c.post_id == post.id } + end + end +end +{% endhighlight %} + +Just like in our prior sections, we can see the same logic would repeat +over and over again each time we added a new relationship...with some slight tweaks based on +`has_many/belongs_to`, non-standard foreign keys and such. So our +default `ActiveRecord` adapter comes with **macros** that generate this +lower-level code for us: + +{% highlight ruby %} +has_many :comments, + resource: CommentResource, + scope: -> { Comment.all }, + foreign_key: :post_id +{% endhighlight %} + +You can dig deeper into the various [ActiveRecord Association Macros here]({{ site.github.url }}/ruby/reads/activerecord-associations). + +Let's go back to HTTP calls. Imagine the `CommentResource` worked just +like our HTTP-based `PostResource` from the prior section. Let's see how +those same questions would be answered: + +{% highlight ruby %} +# Step 1: What's a base scope that will return only +# relevant comments? +# +# In the case of our HTTP client, the "base scope" is +# nothing more than a ruby hash. +# +# Our final query would end up something like: +# +# HTTP.get('/comments', { post_id: [1,2,3] }) +scope do |posts| + { post_id: posts.map(&:id) } +end + +# Step 2: How do we assign these objects together? +# This code is unchanged from the prior example +assign do |posts, comments| + posts.each do |post| + post.comments = comments.select { |c| c.post_id == post.id } + end +end +{% endhighlight %} + +The key lessons here: + + * `scope` must return a "base scope" that can be further modified. + This way we can apply additional "deep query" logic - maybe we + want to sort these comments - and re-use the query-building code + defined in `CommentResource`. This allows the same logic at the + `/comments` endpoint to apply to the `/posts?include=comments` + endpoint. + * If you're not sure what the scope should be, look into the relevant + `Resource`, particularly the [#resolve](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Resource.html#resolve-instance_method) method, + to see how the query will actually be executed. If there is no + #resolve method, it's using the default of the relevant `Adapter`. + * Typically, you'd define an `ApplicationRecord` who specifies the + `Adapter`. You'll see this pattern if you use our generators. + * [Adapters]({{ site.github.url }}/ruby/alternate-datastores/adapters) can + DRY-up this logic with `has_many`-style macros. + +#### Writes + +In the prior sections, we removed boilerplate and dropped down to only +the important code of scope modification. The same basic premise applies to write operations as well. Rather than +dealing with parsing the incoming payload and associating the graph of +objects, Suite supplies hooks for just the parts you care about: +**actually persisting objects**. + +{% highlight ruby %} +def create(attributes) + post = Post.new(attributes) + post.save + post +end + +def update(attributes) + post = Post.find(attributes.delete(:id)) + post.update_attributes(attributes) + post +end + +# ... etc ... +{% endhighlight %} + +Just like reads, this logic is usually extracted into an `Adapter`, but +you can always use `super` to override, handle side effects, etc. + +{% highlight ruby %} +def create(attributes) + model = super + Rails.logger.info "#{model.class} created with id #{model.id}!" + model +end +{% endhighlight %} + +See the [Writes]({{ site.github.url }}/ruby/writes/basic-writes) section for +more. + +#### Generators + +If you're unsure of how a "default project" should look, use the +`bin/rails g jsonapi:resource` generator: + +```ruby +bin/rails g jsonapi:resource Post title:string +``` + +This generator can also limit the controller actions: + +```ruby +bin/rails g jsonapi:resource Post title:string -a index +``` + +It's **highly encouraged** you run these generators at least once, as +you'll get a bunch of helpful comments and understand baseline +scenarios. You're getting: + + * A controller (e.g. `PostsController`) + * A route (`//v1/posts`) + * A `Resource` (`PostResource`) + * Integration spec boilerplate + * including Factories + * ...and `Payload`s + * A whitelist of incoming parameters for writes + (`config/initializer/strong_resource.rb`) + +Type `bin/rails g jsonapi:resource --help for details`. + +#### Wrapping Up + +There's more to learn about various ways `Resource`s can be customized, +but that's the basic premise: no magic, just removal of boilerplate. + +> Note: the same `Resource` logic can be re-used across endpoints, to +> support logic like "fetch this `Post` and its `Comment`s that are +> `active`". Whether you're sideloading comments from the `/posts` +> endpoint or accessing the `/comments` endpoint directly, the same +> `Resource` logic applies. + +> See the [Resource](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Resource.html) documentation for more. diff --git a/ruby/scoping-to-current-user.md b/ruby/scoping-to-current-user.md new file mode 100644 index 0000000..d0bfa95 --- /dev/null +++ b/ruby/scoping-to-current-user.md @@ -0,0 +1,104 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Scoping to Current User + +> Given a `Post` model with `hidden` attribute, only allow administrators +to view hidden `Posts`. + +Let's start by adding a `visible` scope to `Post`, so we can easily +retrive only `Post`s where `hidden` is `false`: + +{% highlight ruby %} +# app/models/post.rb +scope :visible, -> { where(hidden: false) } +{% endhighlight %} + +As you know, we would typically use the base scope `Post.all` like so: + +{% highlight ruby %} +def index + render_jsonapi(Post.all) +end +{% endhighlight %} + +Let's instead use the base scope `Post.visible` when the user is not an +administrator: + +{% highlight ruby %} +def index + scope = current_user.admin? ? Post.all : Post.visible + render_jsonapi(scope) +end +{% endhighlight %} + +That's it! Now only administrators can view hidden `Post`s. + +Of course, this logic would only apply to the `/posts` endpoint and +would not apply when we are sideloading from `/blogs?include=posts`. To +ensure this logic runs *all the time*, add a default filter: + +{% highlight ruby %} +default_filter :visible do |scope, context| + context.current_user.admin? ? scope : scope.visible +end +{% endhighlight %} + +### Privileged Writes + +> Given `Post`s that have an `internal` attribute, only allow +internal users to publish internal posts. + +Our controller context is available in our resource. Let's override +`Resource#create` to ensure correct privileging: + +{% highlight ruby %} +def create(attributes) + if !internal_user? && attributes[:internal] == true + raise "Hey you! YOU can't publish internal posts!" + else + super + end +end + +private + +def internal_user? + context.current_user.internal? +end +{% endhighlight %} + +### Guarding Filters + +> Given `Employee`s with attribute `under_performance_review`, do not allow clients to find all employees under performance review. + +Occasionally you need to guard filters based on the current user. Use +the `:if` option on `allow_filter`. This will execute in the context of +your controller: + +{% highlight ruby %} +# app/resources/employee_resource.rb +allow_filter :under_performance_review, if: :admin? +{% endhighlight %} + +{% highlight ruby %} +# app/controllers/employees_controller.rb +class EmployeesController < ApplicationController + jsonapi resource: EmployeeResource + + def index + render_jsonapi(Employee.all) + end + + private + + def admin? + current_user.admin? + end +end +{% endhighlight %} + diff --git a/ruby/swagger.md b/ruby/swagger.md new file mode 100644 index 0000000..de28bb4 --- /dev/null +++ b/ruby/swagger.md @@ -0,0 +1,148 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Autodocumenting with Swagger + +> [View the Sample App](https://github.com/jsonapi-suite/employee_directory/compare/step_23_disassociation...step_24_autodocumentation) + +This suite uses DSLs to specify inputs (`strong_resources`, filters, etc), and outputs (`jsonapi-rb` serializers). +We can introspect that DSL to provide automatic documentation. Not only +does this save a lot of time, it ensures your code and documentation are +never out of sync. + +Here we'll be using [swagger](https://swagger.io), a popular open-source +documentation framework. +
+
+ + + +
+To get this UI, we need to install two things: a controller that +generates a schema (`swagger.json`), and a static website +in `public`. Our [generator]({{site.github.url}}/ruby/installation) installs these dependencies: +
+
+ +{% highlight ruby %} +# Gemfile +# Below 'jsonapi_suite' +gem 'jsonapi_spec_helpers' +gem 'jsonapi_swagger_helpers' +{% endhighlight %} + + + Note: here we're moving `jsonapi_spec_helpers` out of the + test-specific bundle group. Introspecting spec helpers is part of + autodocumenting, so we'll `require` them manually when our documentation + controller is loaded. + + +The generator also installs a Swagger UI in your Rails app's `public` +directory. If you haven't already done so: + +{% highlight bash %} +$ mkdir -p public/api/docs && cd public/api/docs +$ git clone https://github.com/jsonapi-suite/swagger-ui.git && cp swagger-ui/prod-dist/* . && rm -rf swagger-ui +{% endhighlight %} + +Our documentation will be accessible at `/api/docs`, so we put the files +in `public/api/docs`. You may want a different directory depending on +your own routing rules. In either case, our next step is to edit +`index.html`: make sure any javascript and css has the correct URL. +There are also a few configuration options, such as providing a link to +Github. + +{% highlight javascript %} +window.CONFIG = { + githubURL: "http://github.com/user/repo", + basePath: "/api" // basePath/swagger.json, basePath/v1/employees, etc +} +{% endhighlight %} + +This static website will make a request to `/api/swagger.json`. Again, +if not using the generator you'll have to add that endpoint: + +{% highlight bash %} +$ touch app/controllers/docs_controller.rb +{% endhighlight %} + +{% highlight ruby %} +# config/routes.rb +scope path: '/api' do + resources :docs, only: [:index], path: '/swagger' + # ... code ... +end +{% endhighlight %} + +Our `DocsController` uses [swagger-blocks](https://github.com/fotinakis/swagger-blocks) to generate +the swagger schema. Here's the minimal setup needed to configure +swagger: + +{% highlight ruby %} +require 'jsonapi_swagger_helpers' + +class DocsController < ActionController::API + include JsonapiSwaggerHelpers::DocsControllerMixin + + swagger_root do + key :swagger, '2.0' + info do + key :version, '1.0.0' + key :title, '' + key :description, '' + contact do + key :name, '' + end + end + key :basePath, '/api' + key :consumes, ['application/json'] + key :produces, ['application/json'] + end +end +{% endhighlight %} + +That's it. Now, every time we add an endpoint, we can autodocument with +one line of code (below the `swagger_root` block): + +{% highlight ruby %} +jsonapi_resource '/v1/employees' +{% endhighlight %} + +This endpoint will be introspected for all RESTful actions, outputting +the full configuration. There are a few customization options: + +{% highlight ruby %} +jsonapi_resource '/v1/employees', + only: [:create, :index], + except: [:destroy], + descriptions: { + index: "Some additional documentation" + } +{% endhighlight %} + +If you want additional attribute-level documentation, you can add this +to your spec payloads: + +{% highlight ruby %} +key(:name, String, description: 'The full name, e.g. "John Doe"') +{% endhighlight %} + +
+Will give you an output similar to: +
+
+ + + +
+ +### Authentication + +Your site may require authentication - for instance, sending a +`Authorization` header in every request. We suggest using something like +[Request.ly](https://chrome.google.com/webstore/detail/requestly-redirect-url-mo/mdnleldcmiljblolnjhpnblkcekpdkpa?hl=en) to modify headers for every request to a given URL. diff --git a/ruby/testing.md b/ruby/testing.md new file mode 100644 index 0000000..83ab504 --- /dev/null +++ b/ruby/testing.md @@ -0,0 +1,116 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Writing Integration Tests + +Validating verbose JSON API responses in tests can be a pain. We could +use something like [json_matchers](https://github.com/thoughtbot/json_matchers) to validate a schema, but we hope to do one better - let's validate full payloads with a few simple helpers, using full-stack [rspec request specs](https://github.com/rspec/rspec-rails#request-specs). + +Let's say we're testing the `show` action of our employees controller, sideloading the employee's department. Follow the [Quickstart](/quickstart) to make sure your `rails_helper.rb` is setup correctly first. + +Let's say we're testing the `show` action of our employees controller, sideloading the employee's department. + +Let's begin with vanilla RSpec of what the test might look like: + +{% highlight ruby %} +require 'rails_helper' + +RSpec.describe 'employees#show', type: :request do + let!(:homer) { Employee.create!(name: 'Homer Simpson') } + let!(:safety) { employee.create_department!(name: 'Safety') } + + it 'renders an employee, sideloading department' do + get "/api/employees/#{homer.id}", params: { + include: 'department' + } + # ... code asserting json response ... + end +end +{% endhighlight %} + +To avoid painful json assertions, let's use [jsonapi_spec_helpers](https://github.com/jsonapi-suite/jsonapi_spec_helpers). Start by adding some setup code: + +{% highlight ruby %} +# spec/rails_helper.rb +require 'jsonapi_spec_helpers' + +RSpec.configure do |config| + config.include JsonapiSpecHelpers +end +{% endhighlight %} + +And now to validate the response, we'll call `assert_payload`: + +{% highlight ruby %} +assert_payload(:employee, homer, json_item) +assert_payload(:department, safety, json_include('departments')) +{% endhighlight %} + +`assert_payload` takes three arguments: +* The name of a payload we've defined (we haven't done this yet). +* The record we want to compare against +* The relevant slice of json. `json_item` and `json_includes` are + helpful methods to target the right slice. You can see all helpers in +the documentation for `jsonapi_spec_helpers`. + +OK, so we want to take a record, response JSON, and compare them against +something pre-defined. Let's write those definitions; they look very similar to +something you'd write for [factory_girl](https://github.com/thoughtbot/factory_girl): + +{% highlight ruby %} +# spec/payloads/employee.rb +JsonapiSpecHelpers::Payload.register(:employee) do + key(:name) + key(:email) + + timestamps! +end + +# spec/payloads/department.rb +JsonapiSpecHelpers::Payload.register(:department) do + key(:name) +end +{% endhighlight %} + +`assert_payload` will do four things: + +* Ensure keys that are not in the payload definition are **not** present. +* Ensure all keys in the registered payload **are** present. +* Ensures no value in a key/value pair is `nil` (this is overrideable). +* Ensures each key matches the expected record value. In other words, + we're doing something like `expect(json['email']).to eq(homer.email)`. + +The comparison value can be customized. Let's say we serialize the +`name` attribute as a combination of the employee's `first_name` and +`last_name`: + +{% highlight ruby %} +key(:name) { |record| "#{record.first_name} #{record.last_name}" } +{% endhighlight %} + +Optionally, validate against a type as well. If both the expected and +actual values match, but are the incorrect type, the test will fail: + +{% highlight ruby %} +key(:salary, Integer) +{% endhighlight %} + +You can also customize/override payloads at runtime in your test. Let's +say we only serialize `salary` when the current user is an admin. Your +test could look something like: + +{% highlight ruby %} +sign_in(:user) +assert_payload(:employee, homer, json_item) +sign_in(:admin) +assert_payload(:employee, homer, json_item) do + key(:salary) +end +{% endhighlight %} + +For documentation on all the spec helpers we provide, check out the +[jsonapi_spec_helpers](https://github.com/jsonapi-suite/jsonapi_spec_helpers) gem. diff --git a/ruby/writes/basic-writes.md b/ruby/writes/basic-writes.md new file mode 100644 index 0000000..bb68de0 --- /dev/null +++ b/ruby/writes/basic-writes.md @@ -0,0 +1,143 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Basic Writes + +Here's the code for a JSONAPI endpoint that supports creating, +updating, and deleting resources, complete with validation errors. Keep in mind a small modification will +enable **nested** creates/updates/deletes/disassociations as well. + +We'll be adding on to the code from the [Basic +Reads]({{site.github.url}}/ruby/reads/basic-reads) section. + +{% highlight ruby %} +# config/routes.rb +resources :posts, only: [:create, :update, :destroy] +{% endhighlight %} + +{% highlight ruby %} +# config/initializers/strong_resources.rb +StrongResources.configure do + strong_resource :post do + attribute title: :string + attribute body: :string + attribute rating: :integer + end +end +{% endhighlight %} + + +{% highlight ruby %} +# app/controllers/posts_controller.rb + +strong_resource :employee + +before_action :apply_strong_params, only: [:create, :update] + +def create + post, success = jsonapi_create.to_a + + if success + render_jsonapi(post, scope: false) + else + render_errors_for(post) + end +end + +def update + post, success = jsonapi_update.to_a + + if success + render_jsonapi(post, scope: false) + else + render_errors_for(post) + end +end + +def destroy + post, success = jsonapi_destroy.to_a + + if success + render json: { meta: {} } + else + render_errors_for(post) + end +end +{% endhighlight %} + +You'll see these controller methods all look very similar. Let's walk +through what's going on. + +* `jsonapi_create/update/destroy` + * Parses the incoming request (including nested associations) and + delegates logic to the correct `Resource` classes. + * Wraps everything in a transaction. + * Handles validation errors. +* `post, success` + * `post` is our model instance. Keep in mind, this may be an + unpersisted instance if our request had validation errors. + * `success` is a boolean indicating if the transaction was successful. + Mostly used to determine if we had validation errors. +* `render_jsonapi` is explained in [Basic + Reads]({{site.github.url}}/ruby/reads/basic-reads) +* `render_errors_for` collects any validation errors and formats them + into a [JSONAPI-compliant errors object](http://jsonapi.org/format/#errors). This includes nested validation errors. +* `render json: { meta: {} }` (destroy only) + * Satisfied the [JSONAPI specification](http://jsonapi.org/format/#crud-deleting-responses-200) for deletes. + +We'll expand on these topics in the rest of the "Writes" section. + +#### Delegating Logic to Resources + +With read operations, we supply hooks, essentially asking the developer +"*How do you want to modify the scope when a sort parameter comes in? How +about when the `title` filter comes in?*". + +The same logic applies to write operations - but instead of "*how do you +want to modify the scope?*" the question is "***how do you want to persist +this data***"? + +{% highlight ruby %} +def create(attributes) + puts attributes # { title: "Some Post" } +end +{% endhighlight %} + +In `ActiveRecord`'s case, you can imagine the defaults look something +like this: + +{% highlight ruby %} +def create(attributes) + post = Post.new(attributes) + post.save + post +end + +def update(attributes) + post = Post.find(attributes.delete(:id)) + post.update_attributes(attributes) + post +end + +def destroy(id) + post = Post.find(id) + post.destroy + post +end +{% endhighlight %} + +> Note: create/update/destroy **must always** return the model instance + +Similar to read operations, we package this logic into an +[Adapter]({{site.github.url}}/ruby/alternate-datastores/adapters) to +DRY-up the boilerplate. + +For additional documentation: + +* [#create](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Resource.html#create-instance_method) +* [#update](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Resource.html#update-instance_method) +* [#destroy](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Resource.html#destroy-instance_method) diff --git a/ruby/writes/nested-writes.md b/ruby/writes/nested-writes.md new file mode 100644 index 0000000..d14af22 --- /dev/null +++ b/ruby/writes/nested-writes.md @@ -0,0 +1,102 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Nested Writes + +> View the Sample App: [Server](https://github.com/jsonapi-suite/employee_directory/compare/step_19_custom_persistence...step_23_disassociation)  \|  [Client](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_9_dropdown...step_10_nested_create) + +Nested writes occur via "sideposting". Using the same example from the +[strong resources section]({{site.github.url}}/ruby/writes/strong-resources), let's "sidepost" a `Person` at the `/accounts` endpoint: + +{% highlight ruby %} +# PUT /accounts/123 + +{ + data: { + type: "accounts", + id: "123", + attributes: { name: "updated" } + relationships: { + people: { + data: [ + { id: "1", type: "people", method: "update" } + ] + } + } + }, + included: [ + { + type: "people", + id: "1", + attributes: { name: "updated" } + } + ] +} +{% endhighlight %} + +Here we've update the `Account` and associated `Person` in a single +request. You'll see this is nothing more than a mirror of a +["sideloading" payload](http://jsonapi.org/format/#document-compound-documents), with one key addition - because HTTP verbs only apply to the top-level resource, we add a `method` key for all associated resources. Because we're sticking to the convention of pairing a Resource with a verb, we call this "REST with Relationships". Verbs can be one of `create`, `update`, `destroy` or `disassociate`. + +> Read more about the [Sideposting Concept]({{site.github.url}}/concepts#sideposting) + +There's not much code to satisfy this document. Make sure the +relationship is defined in your `Resource`: + +{% highlight ruby %} +# app/resources/account_resource.rb + +has_many :people, + resource: PersonResource, + foreign_key: :account_id, + scope: -> { Person.all } +{% endhighlight %} + +And whitelisted in your controller: + +{% highlight ruby %} +# app/controllers/accounts_controller.rb + +strong_resource :account do + has_many :people +end +{% endhighlight %} + +That's it! + +#### temp-id + +There's one final concept in sideposting, specific to `create`. We need +to tell our clients how to update an in-memory object with the +newly-minted `id` from the server. To do this, we pass `temp-id` (a random uuid) in the +request instead of `id`: + +{% highlight ruby %} +# create an Account with a Person in a single request +{ + data: { + type "accounts", + attributes: { name: "new account" }, + relationships: { + people: { + data: [ + { :'temp-id' => "abc123", type: "people" } + ] + } + }, + included: [ + { + type: "people", + :"temp-id" => "abc123", + attributes: { name: "John Doe" } + } + ] +} +{% endhighlight %} + +Clients like [JSORM]({{site.github.url}}/js/home) will handle this for you +automatically. diff --git a/ruby/writes/side-effects.md b/ruby/writes/side-effects.md new file mode 100644 index 0000000..646a9f8 --- /dev/null +++ b/ruby/writes/side-effects.md @@ -0,0 +1,90 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Side Effects + +Side effects scenarios come up often. What if we want to send an email +notification every time a `Comment` is created? + +It's important to note that there are three overall categories of side effects, +and each requires a different solution: + +* Side effects internal to the `Model`: For example, setting a + `published_at` attribute. +* Side effects that should only occur on a specific request: For + example, only send an email update if we're creating a `Post` for the + first time, at the `/posts` endpoint. +* Side effects that should occur on every *type* of request: For +example, send an email notification every time a `Comment` is created - +but not updated - whether it was created at the `/comments` endpoint or sideposted at the +`/posts` endpoint. + +#### Internal Side-Effects + +For the first scenario, it's OK to use `ActiveRecord` callbacks (or the +equivalent functionality in a different ORM): + +{% highlight ruby %} +# app/models/user.rb +class Post < ApplicationRecord + before_save :set_published_at, + on: :update, + if: :publishing? + + private + + def set_published_at + self.published_at = Time.now + end + + def publishing? + status_changed? && status == 'published' + end +end +{% endhighlight %} + +#### Side-Effects on Specific Action + +Just like you would with vanilla Rails, use the controller. Here we'll +only send an email to our subscribers when the `Post` is first created. +Keep in mind we could also "sidepost" `Post` objects at the `/blogs` +endpoint, but this will only fire at the `/posts` endpoint. + +{% highlight ruby %} +class PostsController < ApplicationController + def create + post, success = jsonapi_create.to_a + + if success + PostMailer.published_email.deliver_later + render_jsonapi(post, scope: false) + else + render_errors_for(post) + end + end +end +{% endhighlight %} + +#### Side-Effects on Every Request of a Given Type + +Let's add some special logging every time we create a `Post`. Note this +will fire *every* time we create a `Post` - whether we create it at the +`/posts` endpoint or "sidepost" at the `/blogs` endpoint. + +We **do not** need to worry about this side-effect in our model specs, +or rake tasks, as the functionality is only relevant to the API. + +Edit your `Resource`: + +{% highlight ruby %} +# app/resources/post_resource.rb +def create(attributes) + Rails.logger.info "Post begin created by #{context.current_user.email}..." + super + Rails.logger.info "Success!" +end +{% endhighlight %} diff --git a/ruby/writes/strong-resources.md b/ruby/writes/strong-resources.md new file mode 100644 index 0000000..861cf14 --- /dev/null +++ b/ruby/writes/strong-resources.md @@ -0,0 +1,94 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Strong Resources + +> View the Sample App: [Basic](https://github.com/jsonapi-suite/employee_directory/compare/step_15_validations...step_16_strong_resources)  \| [Nested](https://github.com/jsonapi-suite/employee_directory/compare/step_19_custom_persistence...step_20_association_create) + +> [View the Strong Resources Github Documentation](https://jsonapi-suite.github.io/strong_resources) + +Rails 4 introduced the concept of [Strong Parameters](http://edgeguides.rubyonrails.org/action_controller_overview.html#strong-parameters), a way to whitelist incoming parameters for a given write operation. The folks at Zendesk took it a step further with [Stronger Parameters](https://github.com/zendesk/stronger_parameters), which added type-checking to the strong parameter checks. + +This works well for traditional REST endpoints that can put the logic in +the controller. But JSONAPI Suite endpoints can "sidepost" objects at +multiple endpoints - we might save a `Person` at the `/people` endpoint, +but also sidepost from the `/accounts` endpoint. The strong parameters +logic would need to be duplicated across controllers. + +Enter [Strong Resources](https://jsonapi-suite.github.io/strong_resources). Define whitelist templates in one place, and re-use them across your application: + +{% highlight ruby %} +# config/initializers/strong_resources.rb +StrongResources.configure do + strong_resource :account do + attribute :name, :string + attribute :active, :boolean + end +end +{% endhighlight %} + +{% highlight ruby %} +# app/controllers/accounts_controller.rb + +before_action :apply_strong_params, only: [:create, :update] + +strong_resource :account +{% endhighlight %} + +Now, whenever we `POST` or `PUT` to `/accounts`, the request +`attributes` must come in this format. If an extra attribute is given - +perhaps a read-only `rate_limit` attribute - the request will be +rejected. If `active` comes in as a string instead of a boolean, the +request will be rejected. + +Let's sidepost a `Person` record to the `/accounts` endpoint: + +{% highlight ruby %} +# config/initializers/strong_resources.rb + +# ... code ... +strong_resource :person do + attribute :name, :string + attribute :age, :integer +end +{% endhighlight %} + +{% highlight ruby %} +# app/controllers/accounts_controller.rb + +strong_resource :account do + has_many :people +end +{% endhighlight %} + +We can now sidepost `Person` records - via the `people` relationship - +to the `/accounts` endpoint. If the `Person` attributes don't match the +`:person` strong resource template, the request will be rejected. + +By default, we only allow `create` and `update` of associations, but you +can opt-in to `destroy` and `disassociate` as well: + +{% highlight ruby %} +# app/controllers/accounts_controller.rb + +strong_resource :account do + has_many :people, destroy: true, disassociate: true +end +{% endhighlight %} + +There are a variety of ways to customize strong resource templates - +like allowing certain parameters only on `update` but not `create`. Head +over to the [strong_resources documentation](https://jsonapi-suite.github.io/strong_resources/) for a more in-depth +overview. + +
+Note: a common issue is allowing an input to be null. You can define your own types, or + {% highlight ruby %} +# config/initializers/strong_resources.rb +ActionController::Parameters.allow_nil_for_everything = true + {% endhighlight %} +
diff --git a/ruby/writes/validations.md b/ruby/writes/validations.md new file mode 100644 index 0000000..a5f3ae9 --- /dev/null +++ b/ruby/writes/validations.md @@ -0,0 +1,75 @@ +--- +layout: page +--- + +{% include ruby-toc.html %} + +
+### Validations + +> [View the JSONAPI Errors Spec](http://jsonapi.org/format/#errors) + +> View the Sample App: [Server](https://github.com/jsonapi-suite/employee_directory/compare/step_14_create...step_15_validations)  \|  [Client](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_10_nested_create...step_11_validations) + +> [View the JS Documentation]({{site.github.url}}/js/writes/validations) + +Validation errors are handled automatically for any models adhering to +the [ActiveModel::Validations API](http://api.rubyonrails.org/classes/ActiveModel/Validations.html). + +After we've run the persistence logic - but before we close the +transaction - we check `model.errors`. If errors are present anywhere in +the graph, we rollback the transaction and return a JSONAPI-compliant [Error response](http://jsonapi.org/format/#errors): + +{% highlight ruby %} +[ + { + code: "unprocessable_entity", + detail: "Name can't be blank", + meta: { + attribute: "name", + message: "can't be blank" + }, + source: { + pointer: "/data/attributes/name" + }, + status: "422", + title: "Validation Error" + } +] +{% endhighlight %} + +This is true for nested write operations as well. Let's say we were +saving an `Employee` and their `Position`s in a single request, but one +of the positions had a validation error on a missing `title`: + +{% highlight ruby %} +[ + { + code: 'unprocessable_entity', + status: '422', + title: 'Validation Error', + detail: "Title can't be blank", + source: { pointer: '/data/attributes/title' }, + meta: { + relationship: { + attribute: :title, + message: "can't be blank", + code: :blank, + name: :positions, + id: '123', + type: 'positions' + } + } + } +] +{% endhighlight %} + +This is enough information for a client to apply errors to the relevant +objects. In JSORM's case, you'd see: + +{% highlight typescript %} +let success = await employee.save({ with: "positions" }) +console.log(employee.errors) // # {} +let position = employee.positions[0] +console.log(position.errors.title.message) // # "Can't be blank" +{% endhighlight %} diff --git a/spec/jsonapi_suite_spec.rb b/spec/jsonapi_suite_spec.rb deleted file mode 100644 index 374cd4d..0000000 --- a/spec/jsonapi_suite_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'spec_helper' - -describe JsonapiSuite do - it 'has a version number' do - expect(JsonapiSuite::VERSION).not_to be nil - end - - it 'does something useful' do - expect(false).to eq(true) - end -end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb deleted file mode 100644 index 0ce59c8..0000000 --- a/spec/spec_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__) -require 'jsonapi_suite' diff --git a/tutorial.md b/tutorial.md new file mode 100644 index 0000000..5822b0d --- /dev/null +++ b/tutorial.md @@ -0,0 +1,630 @@ +--- +layout: page +--- + +Tutorial +========== + +##### Walking Through Customization and Real-World Scenarios + +In this section, we'll build an employee directory application. +If you're looking for a brief overview, head to the +[Quickstart]({{site.github.url}}/quickstart) +instead. + +![employee_directory]({{site.github.url}}/assets/img/employee_directory.gif) + +If you get lost, you can view the code on Github: + +* [Server](https://github.com/jsonapi-suite/employee_directory) +* [Client](https://github.com/jsonapi-suite/employee-directory) + +*Note: each of these repos has a separate branch for step one, +step two, etc. View the latest branch for final code, or follow along +step-by-step* + +The intent is to illustrate a variety of real-world use cases: + +* Turning 3 database tables into one cohesive search grid. +* Customizing SQL queries. +* Ability to filter, sort, and paginate data. +* Total count +* Custom Serialization +* Nested CRUD of relationships, including validation errors. + +*Note: to better understand the underlying code, we'll be avoiding use +of generators. Head to the [Quickstart]({{site.github.url}}/quickstart) for a guide on how +to automate much of the legwork here.* + +# Reads +## Setup + +We'll be creating an API for an Employee Directory. An `Employee` has many `Position`s (one of which is the *current* position), and a `Position` belongs to a `Department`. + +Let's start with a basic foundation: an index endpoint (list multiple +entities) and a show (single entity) endpoint for an Employee model. + +Code: + +{% highlight ruby %} +# app/controllers/employees_controller.rb +class EmployeesController < ApplicationController + jsonapi resource: EmployeeResource + + def index + render_jsonapi(Employee.all) + end + + def show + scope = jsonapi_scope(Employee.where(id: params[:id])) + render_jsonapi(scope.resolve.first, scope: false) + end +end +{% endhighlight %} + +{% highlight ruby %} +# app/resources/employee_resource.rb +class EmployeeResource < ApplicationResource + type :employees +end +{% endhighlight %} + +{% highlight ruby %} +# app/serializers/serializable_employee.rb +class SerializableEmployee < JSONAPI::Serializable::Resource + type :employees + + attribute :first_name + attribute :last_name + attribute :age +end +{% endhighlight %} + +Tests: + +{% highlight ruby %} +# spec/api/v1/employees/index_spec.rb +RSpec.describe 'v1/employees#index', type: :request do + let!(:employee1) { create(:employee) } + let!(:employee2) { create(:employee) } + + it 'lists employees' do + get '/api/v1/employees' + expect(json_ids(true)).to eq([employee1.id, employee2.id]) + assert_payload(:employee, employee1, json_items[0]) + end +end +{% endhighlight %} + +{% highlight ruby %} +# spec/api/v1/employees/show_spec.rb +RSpec.describe 'v1/employees#show', type: :request do + let!(:employee) { create(:employee) } + + it 'returns relevant employee' do + get "/api/v1/employees/#{employee.id}" + assert_payload(:employee, employee, json_item) + end +end +{% endhighlight %} + +A note on testing: these are full-stack [request specs](https://github.com/rspec/rspec-rails#request-specs). We seed the database using [factory_girl](https://github.com/thoughtbot/factory_girl), randomizing data with [faker](https://github.com/stympy/faker), then assert on the resulting JSON using [spec helpers](https://jsonapi-suite.github.io/jsonapi_spec_helpers). + +You won't have to write *all* the tests you see here, some are simply for demonstrating the functionality. + +## Filtering + +One line of code allows simple `WHERE` clauses. If the user tried to filter on something not whitelisted here, an error would be raised. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/master...step_1_add_filter) + +## Custom Filtering + +Sometimes `WHERE` clauses are more complex, such as prefix queries. Here we'll query all employees whose age is greater than or equal to a given number. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_1_add_filter...step_2_add_custom_filter) + +## Sorting + +Sorting comes for free, but here's a test for it. Decide as a team if we *actually* need to write a spec here, or if it's considered tested within the libraries. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_2_add_custom_filter...step_3_basic_sorting) + +## Custom Sorting + +Sometimes we need more than a simple `ORDER BY` clause, for example maybe we need to join on another table. In this example, we switch from Postgres's default case-sensitive query to a case in-sensitive one...but only for the `first_name` field. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_3_basic_sorting...step_4_custom_sorting) + +## Pagination + +Pagination also comes for free, so once again we'll have to decide if writing a spec like this is worth the bother. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_4_custom_sorting...step_5_pagination) + +## Custom Pagination + +By default we use the [Kaminari](https://github.com/kaminari/kaminari) library for pagination. This shows how we could instead sub-out Kaminari and replace it with [will_paginate](https://github.com/mislav/will_paginate) + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_5_pagination...step_6_custom_pagination) + +## Statistics + +For default statistics, (`count`, `sum`, `average`, `maximum` and `minimum`), simply specify the field and statistic. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_6_custom_pagination...step_7_stats) + +## Custom Statistics + +Here we add a `median` statistic to show non-standard custom statistic usage. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_7_stats...step_8_custom_stats) + +## Custom Serialization + +Let's say we wanted the employee's age to serialize `Thirty-Two` instead of `32` in JSON. Here we use a library to get the friendly-word doppleganger, and change the test to recognize this custom logic. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/master...custom-serialization) + +## Has-Many Association + +Get employees and their positions in one call. + +![github]({{site.github.url}}//assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/master...step_9_has_many) + +## Belongs-To Association + +Get employees, positions, and the department for those positions in one call: + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_9_has_many...step_10_belongs_to) + +## Many-to-Many + +In this example an `Employee` has many `Team`s and a `Team` has many `Employee`s. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_13_error_handling...many-to-many) + +## Resource Re-Use + +In prior steps we created `PositionResource` and `DepartmentResource`. These objects may have custom sort logic, filter whitelists, etc - this configuration can be re-used if we need to add `/api/v1/positions` and `/api/v1/departments` endpoints. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_10_belongs_to...step_11_resource_reuse) + +## Filter/Sort/Paginate Associations + +This comes for free. As long as the associated `Resource` knows how to do something, we can re-use that logic. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_11_resource_reuse...step_12_fsp_associations) + +## Error Handling + +In this example we add global error handling, so any random error will return a [JSONAPI-compatible error response](http://jsonapi.org/format/#errors). Then we customize that response for a specific scenario (the requested employee does not exist). + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_12_fsp_associations...step_13_error_handling) + +# Writes + +## Basic Create + +Basic example without validations or strong parameters. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/bump_gemfile_for_writes...step_14_create) + +## Validations + +Validations are basic, vanilla Rails code. When there is a validation error, we return a jsonapi-compatible error respone. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_14_create...step_15_validations) + +## Strong Resources + +The biggest problem with `strong_parameters` is that we might want to create an employee from the `/employees` endpoint, or we might want to create a position with an employee at the same time from `/positions`. Maintaining the same strong parameter hash across a number of places is difficult. + +Instead we use `strong_resources` to define the parameter template *once*, and re-use. This has the added benefit of being built on top of [stronger_parameters](https://github.com/zendesk/stronger_parameters), which gives us type checking and coercion. + +Note: `strong_resources` requires Rails. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_15_validations...step_16_strong_resources) + +## Basic Update + +Looks very similar to `create`. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_16_strong_resources...step_17_basic_update) + +## Basic Destroy + +More or less basic Rails. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_17_basic_update...step_18_basic_destroy) + +## Customizing Persistence + +So far we've shown `ActiveRecord`. What if we wanted to use a different ORM, or ElasticSearch? What if we wanted 'side effects' such as "send a confirmation email after creating the user"? + +This code shows how to customize `create/update/destroy`. In this example we're simply logging the action, but you could do whatever you want here as long as you return an instance of the object. Just like with reads, if any of this code becomes duplicative across `Resource` objects you could move it into a common `Adapter`. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_18_basic_destroy...step_19_custom_persistence) + +## Association Writes + +### Nested Creates + +Think Rails' `accepts_nested_attributes_for`, but not coupled to Rails or ActiveRecord. Here we create an `Employee`, a `Position` for the employee, and a `Department` for the position in one call. This is helpful when dealing with nested forms! + +Once again, note how our `strong_resources` can be shared across controllers. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_19_custom_persistence...step_20_association_create) + +### Nested Updates + +We got this for free, here's a spec! + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_20_association_create...step_21_association_update) + +### Nested Destroys + +We get this for free, though we have to explicitly tell `strong_resources` that destroys are allowed from this endpoint. + +Note destroy will do two things: delete the object, and make the foreign key on the corresponding child in the payload `null`. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_21_association_update...step_22_association_destroy) + +### Disassociations + +`destroy` actually deletes objects, what if we want to simply disassociate the objects by making the foreign key `null`? We get this for free, too. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee_directory/compare/step_22_association_destroy...step_23_disassociation) + +### Usage without ActiveRecord + +Let's say the departments come from a service call. Here's the change to +the `/departments` endpoint. + +Make the model a PORO: + +{% highlight ruby %} +# app/models/position.rb + +# belongs_to :department, optional: true +attr_accessor :department +{% endhighlight %} + +Use `{}` as our base scope instead of `ActiveRecord::Relation`: + +{% highlight ruby %} +# app/controllers/departments_controller.rb +def index + # render_jsonapi(Department.all) + render_jsonapi({}) +end +{% endhighlight %} + +Customize `resolve` for the new hash-based scope: + +{% highlight ruby %} +# app/resources/department_resource.rb +use_adapter JsonapiCompliable::Adapters::Null + +def resolve(scope) + Department.where(scope) +end +{% endhighlight %} + +`Department.where` is our contract for resolving the scope. The underlying `Department` code could use an HTTP client, alternate datastore, what-have-you. + +Let's also change our code for sideloading departments at `/api/v1/employees?include=departments`: + +{% highlight ruby %} +# app/resources/position_resource.rb + +# belongs_to :department, +# scope: -> { Department.all }, +# foreign_key: :department_id, +# resource: DepartmentResource + +allow_sideload :department, resource: DepartmentResource do + scope do |employees| + Department.where(employee_id: employees.map(&:id)) + end + + assign do |employees, departments| + employees.each do |e| + e.department = departments.find { |d| d.employee_id == e.id } + end + end +end +{% endhighlight %} + +As you can see, we're delving into a lower-level DSL to customize. You +probably want to package up these changes into an [Adapter](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Adapters/Abstract.html). The `ActiveRecord` adapter is simple packaging up similar low-level defaults. Your app may require an `HTTPAdapter` or `ServiceAdapter`, or you can make one-off customizations as shown above. + +# ElasticSearch + +Similar to a service call, here's how we might incorporate the elasticsearch [trample](https://github.com/richmolj/trample) gem. + +Make our base scope an instance of our Trample client: + +{% highlight ruby %} +# app/controllers/employees_controller.rb + def index + # render_jsonapi(Employee.all) + render_jsonapi(Search::Employee.new) + end +end +{% endhighlight %} + +Customize the resource using the Trample Client API: + +{% highlight ruby %} +# app/resources/employee_resource.rb +use_adapter JsonapiCompliable::Adapters::Null + +allow_filter :first_name do |scope, value| + scope.condition(:first_name).eq(value) +end + +allow_filter :first_name_prefix do |scope, value| + scope.condition(:first_name).starts_with(value) +end + +def resolve(scope) + scope.query! + scope.results +end +{% endhighlight %} + +Once again, you probably want to package these changes into an [Adapter](https://jsonapi-suite.github.io/jsonapi_compliable/JsonapiCompliable/Adapters/Abstract.html). + +# Client-Side + +## JSORM + +There are number of [jsonapi clients](http://jsonapi.org/implementations/) in a variety of languages. Here we'll be using [JSORM](/js/home) - an ActiveRecord-style ORM that can be used from Node or the browser. It's been custom-built to work with JSONAPI Suite enhancements. + +This will fetch an employee with id 123, their last 3 positions where the title starts with 'dev', and the departments for those positions. + +We'll use typescript for this example, though we could use vanilla JS just as well. First define our models (additional client-side business logic can go in these classes): + +{% highlight typescript %} +import { JSORMBase, Model, Attr, HasMany, BelongsTo } from "jsorm" + +@Model() +class ApplicationRecord extends JSORMBase { + static baseUrl = "http://localhost:3000" + static apiNamespace = "/api/v1" +} + +@Model() +class Employee extends ApplicationRecord { + static jsonapiType = "people" + + @Attr() firstName: string + @Attr() lastName: string + @Attr() age: number + + @HasMany() positions: Position[] +} + +@Model() +class Position extends ApplicationRecord { + static jsonapiType = "positions" + + @Attr() title: string + + @BelongsTo() department: Department[] +} + +@Model() +class Department extends ApplicationRecord { + static jsonapiType = "departments" + + @Attr() name: string +} +{% endhighlight %} + +Now fetch the data in one call: + +{% highlight javascript %} +let positionScope = Position + .where({ title_prefix: "dev" }) + .order({ created_at: "desc" }) + +let scope = Employee + .includes({ positions: "department" }) + .merge({ positions: positionScope }) + +let employee = (await scope.find(123)).data +// access data like so in HTML: +// employee.positions[0].department.name +} +{% endhighlight %} + +[Read the JSORM documentation here](/js/home) + +## VueJS Sample Application + +vue + +**JSORM can be used with the client-side framework of your choice**. To give an example of real-world usage, we've created a demo application using +[VueJS](https://vuejs.org/). Vue is lightweight and provides the +bare-bones we need to illustrate JSONAPI and JSORM in action. + +This will point to a [slightly-tweaked branch](https://github.com/jsonapi-suite/employee_directory/tree/prepare_clientside) of the server-side API +above. + +Let's create our app. + +### Step 0: Setup + +We've started with a basic Vue app configured with Webpack. None of this +is JSONAPI-specific, just boilerplate to get started quickly. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Branch on Github](https://github.com/jsonapi-suite/employee-directory-vue/tree/step_0_setup) + +### Step 1: Models + +We'll start by defining our models, which should look very familiar if +you've worked with `ActiveRecord`. Again, see the [JSORM +documentation](/js/home) if any of this looks confusing to you. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_0_setup...step_1_models) + +### Step 2: Data Grid + +We'll add a simple data grid to our page listing all `Employee`s. This +will turn into a search grid, but for now we're simply loading employees +via `Employee.all()` + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_1_models...step_2_data_grid) + +### Step 3: Adding Relationships + +Here we've added a `currentPosition` relationship to avoid fetching +excess data from the server. When the page loads we fetch the +employees, current positions for those employees, and the departments for those positions. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_2_data_grid...step_3_includes) + +### Step 4: Filtering + +Here we've added a bit of state to the page, `query`, which will be +bound to the form inputs. We pass `query` to `Employee.where` to +successfully query employees by first and last name. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_3_includes...step_4_filtering) + +### Step 5: Sorting + +Just like with filters, we add a bit of state to our page to track +sorting parameters. When the user clicks a table header, we'll update +that state and pass it to our query. + + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_4_filtering...step_5_sorting) + +### Step 6: Stats + +A JSORM promise returns a `response` object with a `data` key - the +model instance(s) we've been referencing so far. It also returns a +`meta` key that reflects the [meta](http://jsonapi.org/format/#document-meta) section of the JSONAPI response. + +Here we'll request the total count of employees in our query to the +server, grab that total count from `meta`, and bind it to the page as +`totalCount` + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_5_sorting...step_6_stats) + +### Step 7: Pagination + +Building on what we've already done, we can apply a similar pattern for +pagination. We add the `currentPage` state and alter it when the user +clicks pagination links. We use `currentPage` and `totalCount` to figure +out if we should display previous/next page links. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_6_stats...step_7_pagination) + +### Step 8: Basic Form Setup + +We'll be adding a form to create and update employees. This step just +adds the relevant HTML and Vue code to get set up, before involving +JSORM. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_7_pagination...step_8_basic_form_setup) + +### Step 9: Dropdowns + +Our form will submit employees, positions and departments in a single +request. We associate a position to an existing department through a +`select` dropdown. To populate that dropdown, we fetch all departments +from the server and bind it to the `select`. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_8_basic_form_setup...step_9_dropdown) + +### Step 10: Nested Create/Update + +This step simply binds our instantiated models to the form. When the +form is submitted, we save everything in a single one-line request. + +After the form submission, we could edit the form and submit again - +JSORM will know to `PATCH` an update to the appropriate URL +automatically. + +Note we could also edit our search to immediately reflect the new +data...but this is more Vue-specific than anything to do with JSORM, so +we'll hold off until the last step. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_9_dropdown...step_10_nested_create) + +### Step 11: Validations + +Our server-side code will automatically handle validation errors and +give us a well-formatted response. JSORM will read that response and +automatically apply `error` objects to our model instances. Here we +display simple error messages without involving any JS code. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_10_nested_create...step_11_validations) + +### Step 12: Nested Destroy + +This step adds buttons to our form that will add and remove positions +for a given employee. To add, we simply `push` a new `Employee` onto the +relationship array. To remove, we set `isMarkedForDestruction = true`, +which allows for "unsaved deleted records". This follows a similar +pattern to one introduced in Ember Data, [explained here](https://www.emberjs.com/blog/2015/09/02/ember-data-2-0-released.html#toc_unsaved-deleted-records). + +Note that if we wanted to **disassociate** the position rather than +**destroying** the underlying record, we could use +`position.isMarkedForDisassociation = true`. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_10_nested_create...step_11_validations) + +### Step 13: VueJS Wrap-up + +Our final step adds some Vue-specific functionality - we add an +`EventBus` to allow selecting an employee from the grid and binding it +to the form, and refresh the search grid after each form submission. + +![github]({{site.github.url}}/assets/img/GitHub-Mark-32px.png) +[View the Diff on Github](https://github.com/jsonapi-suite/employee-directory-vue/compare/step_12_nested_destroy...step_13_vue) + +
+