diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..59d68a1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile ~/.gitignore_global + +# Ignore bundler config +/.bundle + +# Ignore the build directory +/build + +# Ignore Sass' cache +/.sass-cache + +/node_modules +/bower_components +/tmp diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..89224f2 --- /dev/null +++ b/Gemfile @@ -0,0 +1,21 @@ +source "https://rubygems.org" + +def darwin_only(require_as) + RbConfig::CONFIG["host_os"] =~ /darwin/ && require_as +end + +def linux_only(require_as) + RbConfig::CONFIG["host_os"] =~ /linux/ && require_as +end + +gem "builder" +gem "kramdown" +gem "middleman" +gem "middleman-blog", ">= 4.0.0" +gem "middleman-deploy", ">= 2.0.0.pre.alpha" +gem "middleman-sprockets", ">= 4.0.0" +gem "middleman-syntax" +gem "sass" + +gem "rb-inotify", "~> 0.9", require: linux_only("rb-inotify") +gem "rb-fsevent", require: darwin_only("rb-fsevent") diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..d3d3e14 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,139 @@ +GEM + remote: https://rubygems.org/ + specs: + activesupport (5.0.7.2) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) + addressable (2.6.0) + public_suffix (>= 2.0.2, < 4.0) + backports (3.13.0) + builder (3.2.3) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.12.2) + concurrent-ruby (1.1.5) + contracts (0.13.0) + dotenv (2.7.2) + erubis (2.7.0) + execjs (2.7.0) + fast_blank (1.0.0) + fastimage (2.1.5) + ffi (1.10.0) + haml (5.0.4) + temple (>= 0.8.0) + tilt + hamster (3.0.0) + concurrent-ruby (~> 1.0) + hashie (3.6.0) + i18n (0.9.5) + concurrent-ruby (~> 1.0) + kramdown (1.17.0) + listen (3.0.8) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + memoist (0.16.0) + middleman (4.3.3) + coffee-script (~> 2.2) + haml (>= 4.0.5) + kramdown (~> 1.2) + middleman-cli (= 4.3.3) + middleman-core (= 4.3.3) + middleman-blog (4.0.3) + addressable (~> 2.3) + middleman-core (>= 4.0.0) + tzinfo (>= 0.3.0) + middleman-cli (4.3.3) + thor (>= 0.17.0, < 2.0) + middleman-core (4.3.3) + activesupport (>= 4.2, < 5.1) + addressable (~> 2.3) + backports (~> 3.6) + bundler + contracts (~> 0.13.0) + dotenv + erubis + execjs (~> 2.0) + fast_blank + fastimage (~> 2.0) + hamster (~> 3.0) + hashie (~> 3.4) + i18n (~> 0.9.0) + listen (~> 3.0.0) + memoist (~> 0.14) + padrino-helpers (~> 0.13.0) + parallel + rack (>= 1.4.5, < 3) + sassc (~> 2.0) + servolux + tilt (~> 2.0.9) + uglifier (~> 3.0) + middleman-deploy (2.0.0.pre.alpha) + middleman-core (>= 3.2) + net-sftp + ptools + middleman-sprockets (4.1.1) + middleman-core (~> 4.0) + sprockets (>= 3.0) + middleman-syntax (3.0.0) + middleman-core (>= 3.2) + rouge (~> 2.0) + minitest (5.11.3) + net-sftp (2.1.2) + net-ssh (>= 2.6.5) + net-ssh (5.2.0) + padrino-helpers (0.13.3.4) + i18n (~> 0.6, >= 0.6.7) + padrino-support (= 0.13.3.4) + tilt (>= 1.4.1, < 3) + padrino-support (0.13.3.4) + activesupport (>= 3.1) + parallel (1.17.0) + ptools (1.3.5) + public_suffix (3.0.3) + rack (2.0.7) + rake (12.3.2) + rb-fsevent (0.10.3) + rb-inotify (0.10.0) + ffi (~> 1.0) + rouge (2.2.1) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sassc (2.0.1) + ffi (~> 1.9) + rake + servolux (0.13.0) + sprockets (3.7.2) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + temple (0.8.1) + thor (0.20.3) + thread_safe (0.3.6) + tilt (2.0.9) + tzinfo (1.2.5) + thread_safe (~> 0.1) + uglifier (3.2.0) + execjs (>= 0.3.0, < 3) + +PLATFORMS + ruby + +DEPENDENCIES + builder + kramdown + middleman + middleman-blog (>= 4.0.0) + middleman-deploy (>= 2.0.0.pre.alpha) + middleman-sprockets (>= 4.0.0) + middleman-syntax + rb-fsevent + rb-inotify (~> 0.9) + sass + +BUNDLED WITH + 1.17.3 diff --git a/README.md b/README.md new file mode 100644 index 0000000..d55af0d --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +## Installation + +``` +bundle install +npm install -g bower +bower install +middleman server +``` + +## Deploying + +``` +middleman build +middleman deploy +``` diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..b38ad7f --- /dev/null +++ b/bower.json @@ -0,0 +1,10 @@ +{ + "name": "cowbell-labs.com", + "version": "0.0.0", + "dependencies": { + "jquery": "~1.12.2", + "bootstrap-sass": "3.4.1", + "html5shiv": "~3.7.0", + "respond": "~1.4.2" + } +} diff --git a/config.rb b/config.rb new file mode 100644 index 0000000..bbc3177 --- /dev/null +++ b/config.rb @@ -0,0 +1,34 @@ +activate :automatic_image_sizes + +set :css_dir, "stylesheets" +set :js_dir, "javascripts" +set :images_dir, "images" +set :images_dir, "assets" +set :markdown_engine, :kramdown +set :sass_assets_paths, ["#{root}/bower_components/bootstrap-sass/assets/stylesheets"] + +activate :sprockets +sprockets.append_path "#{root}/bower_components" +sprockets.append_path "#{root}/bower_components/bootstrap-sass/assets/stylesheets" + +configure :build do + activate :minify_css + activate :minify_javascript +end + +activate :syntax + +activate :deploy do |deploy| + deploy.deploy_method = :git + deploy.branch = "master" +end + +activate :blog do |blog| + blog.permalink = ":year-:month-:day-:title.html" + blog.sources = "articles/:title.html" + blog.layout = "article_layout" +end + +activate :asset_hash do |f| + f.ignore = ["stylesheets/wufoo.css"] +end diff --git a/data/people.yml b/data/people.yml new file mode 100644 index 0000000..aa3f7ee --- /dev/null +++ b/data/people.yml @@ -0,0 +1,28 @@ +- slug: "szymon-nowak" + name: "Szymon Nowak" + github: "szimek" + twitter: "szimek" + description: "Started working with Ruby on Rails back in 2006. Later worked briefly at IBM, but quickly returned to Ruby and web development. Likes to experiment with cutting-edge web technologies." +- slug: "wojciech-wnetrzak" + name: "Wojciech Wnętrzak" + github: "morgoth" + twitter: "morgoth85" + url: "http://urizen.pl/" + description: "Has been programming web applications using Ruby on Rails since 2008. Enjoys improving his logical thinking skills by playing contract bridge in a local league.

" +- slug: "tomasz-subik" + name: "Tomasz Subik" + github: "tsubik" + url: "http://tsubik.com/" + description: "Has been crafting web applications since 2007. Used to work with .NET platform, switched over to the Rails stack but also enjoys building mobile apps using Cordova, JavaScript and Angular. Amateur ice hockey player." +- slug: "miroslaw-boruta" + name: "Mirosław Boruta" + twitter: "m1rk00" + github: "MBO" + url: "http://mirobor.pl/" + description: "Former Linux admin, turned into Ruby on Rails developer in 2009. Likes digging into other people's source code to understand how and why it works. Amateur photographer." +- slug: "maciej-jarczok" + name: "Maciej Jarczok" + github: "jmak" + twitter: "maciej_jarczok" + url: "http://larxon.com/" + description: "Vector and raster graphic expert, highly experienced in HTML5 and CSS3. Has been working in the Ruby environment for years. Huge fan of SASS, COMPASS, HAML and SMACSS for front-end development." diff --git a/data/projects.yml b/data/projects.yml new file mode 100644 index 0000000..da21e56 --- /dev/null +++ b/data/projects.yml @@ -0,0 +1,29 @@ +- slug: "tiramizoo" + name: "tiramizoo" + url: "https://www.tiramizoo.com" + description: "German startup aiming to provide same-day local delivery services in Germany." + +- slug: "nurph" + name: "Nurph" + url: "http://nurph.com/" + description: "Real-time discussion platform for Twitter community." + +- slug: "cramlr" + name: "Cramlr" + url: "http://cramlr.com/" + description: "Flashcards application, part of Tutoria - a German e-learning platform." + +- slug: "socialguide" + name: "SocialGuide" + url: "http://www.socialguide.com/" + description: "Formerly Talkwit.TV. Identifies, captures and analyzes conversation on Twitter in real-time for almost every TV program aired in U.S." + +- slug: "freeletics" + name: "Freeletics" + url: "http://www.freeletics.com/" + description: "Personalized high intensity trainings and training plans." + +- slug: "sharedrop" + name: "ShareDrop" + url: "https://www.sharedrop.io/" + description: "Open source, peer to peer file sharing application. Lets you share files with others in the same local network." diff --git a/data/sitemap.yml b/data/sitemap.yml new file mode 100644 index 0000000..6aaa442 --- /dev/null +++ b/data/sitemap.yml @@ -0,0 +1 @@ +url: http://cowbell-labs.com/ diff --git a/data/testimonials.yml b/data/testimonials.yml new file mode 100644 index 0000000..6993e19 --- /dev/null +++ b/data/testimonials.yml @@ -0,0 +1,7 @@ +- text: "Szymon and Wojciech proved to be highly qualified software architects and developers, who can accurately advice the solution to challenging problems on all levels of project lifecycle." + signature: "Michael Loehr, tiramizoo CEO" + image: michael.jpg + +- text: "Wojciech and Szymon implemented many tricky Nurph features over a period when the code-base was spread across numerous technologies and dependencies, including Redis, Node.js, and Rails." + signature: "Neil Cauldwell, Nurph" + image: neil.jpg diff --git a/source/.htaccess b/source/.htaccess new file mode 100644 index 0000000..b311eee --- /dev/null +++ b/source/.htaccess @@ -0,0 +1 @@ +Errordocument 404 /404.html diff --git a/source/404.html.erb b/source/404.html.erb new file mode 100644 index 0000000..65fa35f --- /dev/null +++ b/source/404.html.erb @@ -0,0 +1,12 @@ +--- +title: Cowbell Labs - Page Not Found +description: The requested page has not been found. +--- + +
+
+

Page Not Found

+ +

The requested page has not been found.

+
+
diff --git a/source/CNAME b/source/CNAME new file mode 100644 index 0000000..f4a6dd9 --- /dev/null +++ b/source/CNAME @@ -0,0 +1 @@ +cowbell-labs.com diff --git a/source/articles.html.erb b/source/articles.html.erb new file mode 100644 index 0000000..51c0254 --- /dev/null +++ b/source/articles.html.erb @@ -0,0 +1,25 @@ +--- +title: Cowbell Labs - Ruby on Rails and JavaScript Development Experts +description: Cowbell Labs is a Ruby on Rails and JavaScript development agency that specializes in web and mobile applications. +--- + +
+
+

Articles

+ + +
+
diff --git a/source/articles/active-model-errors-details.html.markdown b/source/articles/active-model-errors-details.html.markdown new file mode 100644 index 0000000..127f761 --- /dev/null +++ b/source/articles/active-model-errors-details.html.markdown @@ -0,0 +1,44 @@ +--- +title: How to use ActiveModel errors details +date: 2015/01/22 +description: How to use ActiveModel::Errors#details to return type of used validator in Rails +author: Wojciech Wnętrzak +tags: rails +hacker_news_id: 8928939 +--- + +Rails just got a [new feature](https://github.com/rails/rails/commit/cb74473db68900d336844d840dda6e10dc03fde1) that allows for returning the type of a validator used on an invalid attribute. + +~~~ ruby +class User < ActiveRecord::Base + validates :name, presence: true +end + +user = User.new +user.valid? +user.errors.details +# => {name: [{error: :blank}]} +~~~ + +It will be useful in API applications, where you don't want to return translated error messages, but rather symbols that are then used by API clients to construct proper user notifications. + +You can also pass additional options to provide a context for an error object: + +~~~ ruby +class User < ActiveRecord::Base + validate :adulthood + + def adulthood + errors.add(:age, :too_young, years_limit: 18) if age < 18 + end +end + +user = User.new(age: 15) +user.valid? +user.errors.details +# => {age: [{error: :too_young, years_limit: 18}]} +~~~ + +All built in validators populate details hash by default. + +This feature will be available in Rails 5.0, but you don't have to wait for the release to start using it in your Rails 4.x application. All you have to do is install the [active_model-errors_details](https://github.com/cowbell/active_model-errors_details) gem which backports the feature. diff --git a/source/articles/capistrano-deploys-from-travis.html.markdown b/source/articles/capistrano-deploys-from-travis.html.markdown new file mode 100644 index 0000000..bc1c507 --- /dev/null +++ b/source/articles/capistrano-deploys-from-travis.html.markdown @@ -0,0 +1,50 @@ +--- +title: Capistrano deploys from Travis +date: 2014/03/06 +description: How to deploy an application from Travis after a successful build using Capistrano +author: Wojciech Wnętrzak +tags: travis, capistrano +hacker_news_id: 7359246 +--- + +Travis is integrated with many services that you can [deploy to](http://docs.travis-ci.com/user/deployment/) after a successful build. You may wonder however, how to do a deploy to your own server. If you are using [Capistrano](http://www.capistranorb.com/), that is a quite easy task. + +You need to have a pair of private and public RSA keys that will be used for authentication. +If you need to generate one, you may take a look at [this article](https://help.github.com/articles/generating-ssh-keys) that will guide you through the process. Make sure to add the generated public key to `~/.ssh/authorized_keys` file on your server. + +Next thing you want to do is to encrypt the RSA private key, that deploy script will use to authenticate on your server. You may have heard that Travis supports [encryption keys](http://docs.travis-ci.com/user/encryption-keys/), but as for now it is impossible to encode long strings (like private RSA keys). To workaround this issue, you can add an encrypted key file to the repository and decrypt it before deployment, using a password short enough that can be handled by Travis encryption. + +~~~ shell +# Install Travis CLI tool +gem install travis +# Authenticate to your account +travis login +# Encrypt password and add it to .travis.yml file +travis encrypt DEPLOY_KEY="encryption-password" --add +# Encrypt deploy_id_rsa private RSA key file, that will be used for deploy +openssl aes-256-cbc -k "encryption-password" -in deploy_id_rsa -out config/deploy_id_rsa_enc_travis -a +~~~ + +Add a script that will decrypt the RSA key and finally deploy your application to the server after a successful build. + +~~~ yaml +# .travis.yml +after_success: + - "openssl aes-256-cbc -k $DEPLOY_KEY -in config/deploy_id_rsa_enc_travis -d -a -out config/deploy_id_rsa" + - "bundle exec cap deploy" +~~~ + +Update Capistrano configuration to use your RSA key. + +~~~ ruby +# deploy.rb +set :ssh_options, keys: ["config/deploy_id_rsa"] if File.exist?("config/deploy_id_rsa") +~~~ + +If you want to deploy only the master branch, you can change the last line from `after_success` callback. + +~~~ shell +[[ $TRAVIS_BRANCH = 'master' ]] && bundle exec cap deploy +~~~ + +Commit all your changes to the repository and push it, so Travis can start a build. diff --git a/source/articles/cleanup-bugtracker-from-frequently-erroring-background-jobs.html.markdown b/source/articles/cleanup-bugtracker-from-frequently-erroring-background-jobs.html.markdown new file mode 100644 index 0000000..98d3883 --- /dev/null +++ b/source/articles/cleanup-bugtracker-from-frequently-erroring-background-jobs.html.markdown @@ -0,0 +1,64 @@ +--- +title: Cleanup bugtracker from frequently erroring background jobs +date: 2015/01/11 +description: To avoid noise in bugtracker, filter frequently raised errors and don't loose background processing library flexibility to handle exception in the best possible way +author: Wojciech Wnętrzak +tags: bugtracker, background-job +hacker_news_id: 8871568 +--- + +If you are using a background job for processing some third party service requests, you have probably noticed it happens quite often that a given service is not available 100% of the time. In such a case background job will fail with an error, reschedule itself, and finally process when the service is up again. + +You probably also use some bugtracker service to keep an eye on status of your application. Every time when a background job fails, you are notified about the issue. You look at the error and think _"Again, cannot reach their servers, this error can be ignored"_. + +This is bad -- mainly because it creates a lot of noise in the bugtracker, distracting you from errors that are mission critical in your business. +You might want to catch frequent errors in your worker and reschedule the job when an error appeared, but what is the best time of retry to use? 1 minute, 5 minutes, 30 minutes? It would be great to calculate it based on a failed attempts number. Also when rescheduling you don't know what exactly went wrong, you only see that the worker is processing something again after a period of time. + +All of these are already handled by the background processing library, but they need to raise an error to do that, so they need to be sent to the bugtracker, so you will be distracted again. Maybe filter out these specific errors in a global notification configuration? But what about other places in your application, where a similar error might not be frequent and when it appears you want to know that? + +There is a quite easy solution. Let's use [ActiveJob](http://guides.rubyonrails.org/active_job_basics.html), available in Rails 4.2 by default. + +~~~ ruby +class GetFacebookPictureJob < ActiveJob::Base + def perform(user) + user.picture = Facebook::API.picture_url(user.facebook_id) + user.save + end +end +~~~ + +When Facebook servers are down, you might see errors like `OpenURI::HTTPError` or `Errno::ENETUNREACH`. +To be able to not submit them to the bugtracker but still have failures handled by the background library, catch them and raise a custom error that you can filter out in a global configuration. + +~~~ ruby +class JobFrequentFailureError < Exception; end + +class GetFacebookPictureJob < ActiveJob::Base + def perform(user) + user.picture = Facebook::Api.picture_url(user.facebook_id) + user.save + + rescue Errno::ENETUNREACH, OpenURI::HTTPError + raise JobFrequentFailureError.new + end +end +~~~ + +This way, you decide which error is safe to catch in each worker. + +There is one thing left to improve. When you look at the failure error, you will notice that its backtrace is not from the original exception. +All you need is to update your proxy error class by using `Exception#cause` method, available since Ruby 2.1. + +~~~ ruby +class JobFrequentFailureError < Exception + def message + "#{self.class}(#{cause.class}) - #{cause.message}" + end + + def backtrace + cause.backtrace + end +end +~~~ + +That's it! You have a clean bugtracker and you have handled job exceptions in the best possible way. diff --git a/source/articles/sync-your-slides-in-realtime-with-your-audience-using-firebase.html.markdown b/source/articles/sync-your-slides-in-realtime-with-your-audience-using-firebase.html.markdown new file mode 100644 index 0000000..a6d9007 --- /dev/null +++ b/source/articles/sync-your-slides-in-realtime-with-your-audience-using-firebase.html.markdown @@ -0,0 +1,89 @@ +--- +title: Sync your HTML slide deck in real-time with your audience using Firebase +date: 2013/11/07 +tags: firebase +author: Szymon Nowak +hacker_news_id: 6720320 +--- + +Recently I gave a [talk about Firebase](http://szimek.github.io/presentation-firebase-intro/) and to show what can be done with it, I added real-time slide syncing in 24 lines of code including GitHub authentication for the presenter. I used [Google IO 2012](https://code.google.com/p/io-2012-slides/) slide template, but it's really easy to make it work with any other HTML slide template library. + +To broadcast slide changes you need to add `?broadcast=true` parameter to the URL and authenticate with GitHub. To follow slide changes just add `?follow=true`. + +Here's the code: + +~~~ javascript +(function () { + var database = 'presentations', + presentation = 'firebase-intro', + url = 'https://' + database + '.firebaseio.com/' + presentation, + ref = new Firebase(url), + params, auth, i, param; + + params = window.location.search.substring(1).split('&').map(function (el) { + return el.split('='); + }); + + for (i = 0; param = params[i]; ++i) { + if (param[0].toLowerCase() === 'broadcast') { + // Authenticate using GitHub unless already authenticated + auth = new FirebaseSimpleLogin(ref, function(error, user) { + if (!user) { auth.login('github', { rememberMe: true }); } + }); + + // Listen to slide change event and save slide number to Firebase + document.addEventListener('slideenter', function (event) { + ref.set(event.slideNumber); + }); + } else if (param[0].toLowerCase() === 'follow') { + // Fetch slide number from Firebase and update the current slide + ref.on('value', function (snapshot) { + window.slidedeck.loadSlide(snapshot.val()); + }); + } + } +})(); +~~~ + +Save it as `js/firebase-sync.js` and add it together with Firebase libraries to your HTML file: + +~~~ html + + + +~~~ + +and that's it. + +Well, almost. When you set it up for the first time, you'll need to do 2 more things. + +1. Create a GitHub application. +* Go to [Register a new OAuth application](https://github.com/settings/applications/new) page and fill out the form. Enter `https://auth.firebase.com/auth/github/callback` as __Authorization callback URL__. + +2. Setup your Firebase database. +* Register to Firebase - it will automatically create your first database for you. +* Go to "Auth" tab and in __Authorized Request Origins__ section add the domain where your presentation will be hosted - e.g. `.github.io` if you'll be hosting it using GitHub Pages. +* In __Authentication Providers__ click "GitHub". Check "Enabled" checkbox and copy GitHub Client ID and Secret from the application you created in the first step. +* Go to "Security" tab and paste the following rules: + +~~~ json +{ + "rules": { + ".read": true, + ".write": "auth.provider == 'github' && auth.username == ''" + } +} +~~~ + +This will grant read access to everyone, but only you'll have write access. + +When you open your slides for the first time with `?broadcast=true` parameter, remember to allow pop-ups from the domain you're running it on to allow pop-up from GitHub and you're all set. + + +#### A few notes + +* If you'd like to avoid creating a GitHub app, Firebase gives you 4 other authentication providers - email and password, Persona, Facebook and Twitter. You could simply use Persona (requires an additional JS library) or email and password provider. In the latter case just remember not to add your email and password to the repository. + +* This will of course require you and your audience to have internet access, which may not be available at a conference, especially at larger ones. On the other hand it does not require you to be in the same network, so you can use your mobile phone network, if WiFi is not available. + +* The free 'Development' plan allows up to 50 connections, so it might not be enough at larger conferences. diff --git a/source/articles/testing-apps-with-grunt-and-phantomjs-using-semaphore-ci.html.markdown b/source/articles/testing-apps-with-grunt-and-phantomjs-using-semaphore-ci.html.markdown new file mode 100644 index 0000000..f828a52 --- /dev/null +++ b/source/articles/testing-apps-with-grunt-and-phantomjs-using-semaphore-ci.html.markdown @@ -0,0 +1,22 @@ +--- +title: Testing apps with Grunt and PhantomJS using Semaphore CI +date: 2013/10/18 +description: How to set up Semaphore build steps to test apps with Grunt and PhantomJS +author: Szymon Nowak +tags: testing, grunt, semaphore +--- + +We've been using [Semaphore](https://semaphoreapp.com) for continuous integration and deployment of the Ruby on Rails based API that we're currently working on and recently we've decided to use it for the frontend app as well. + +The frontend app uses [Yeoman](http://yeoman.io) workflow, so it uses [Bower](http://bower.io) to install its dependencies and [Grunt](http://gruntjs.com) for running tests. We've had some issues with permissions when installing dependencies on Semaphore and finally came up with these build steps: + +1. `mkdir /home/runner/tmp` +2. `sudo chown -R runner:runner /home/runner/tmp` +3. `sudo chown -R runner:runner /home/runner/.local` +4. `sudo npm install -g grunt-cli bower` +5. `bundle install --without deployment` +6. `npm install` +7. `bower install` +8. `grunt test` + +The fifth step is of course optional - we're using Bundler to install compass framework, but you can simply skip it if you're not using any Ruby libraries. diff --git a/source/articles/using-twitter-bootstrap-js-widgets-with-ember.html.markdown b/source/articles/using-twitter-bootstrap-js-widgets-with-ember.html.markdown new file mode 100644 index 0000000..2182e48 --- /dev/null +++ b/source/articles/using-twitter-bootstrap-js-widgets-with-ember.html.markdown @@ -0,0 +1,34 @@ +--- +title: Using Twitter Bootstrap js widgets with Ember +date: 2013/10/20 +description: How to make Twitter Bootstrap JavaScript widgets work with Ember +author: Wojciech Wnętrzak +tags: ember, bootstrap +--- + +When starting Ember application, you may wonder where to put code that will initialize [Twitter Bootstrap javascript widgets](http://getbootstrap.com/javascript/). +Let's say that you want to add simple [popover](http://getbootstrap.com/javascript/#popovers) to your page. + +If you put popover element into static HTML file, the best place to initialize its functionality is in your application definition on `ready` event. + +~~~ javascript +Ember.Application.create({ + ready: function () { + Ember.$(".my-popover-element").popover(); + } +}); +~~~ + +However, it won't work in Handlebars templates, because Ember renders dynamic HTML after `ready` event is triggered. + +To fix this, you may create Ember view dedicated to display popovers, where Bootstrap function is called whenever this element is inserted into the DOM on `didInsertElement` event. + +~~~ javascript +PopoverView = Ember.View.extend({ + didInsertElement: function () { + this.$("button").popover(); + } +}); +~~~ + +You can see it in use [here](https://github.com/cowbell/bridge-points/blob/89a85d061f1ea6bb1c927ff3e5cace0aae0325bb/app/views/popover-view.coffee#L5-L6). diff --git a/source/favicon.ico b/source/favicon.ico new file mode 100644 index 0000000..c48d25b Binary files /dev/null and b/source/favicon.ico differ diff --git a/source/feed.xml.builder b/source/feed.xml.builder new file mode 100644 index 0000000..1bb61d6 --- /dev/null +++ b/source/feed.xml.builder @@ -0,0 +1,28 @@ +--- +layout: false +--- + +xml.instruct! +xml.feed "xmlns" => "http://www.w3.org/2005/Atom" do + site_url = "http://cowbell-labs.com/" + xml.title "Cowbell Labs Blog" + xml.subtitle "Our thoughts" + xml.id URI.join(site_url, blog.options.prefix.to_s) + xml.link "href" => URI.join(site_url, blog.options.prefix.to_s) + xml.link "href" => URI.join(site_url, current_page.path), "rel" => "self" + xml.updated blog.articles.first.date.to_time.iso8601 + xml.author { xml.name "Cowbell Labs" } + + blog.articles[0..5].each do |article| + xml.entry do + xml.title article.title + xml.link "rel" => "alternate", "href" => URI.join(site_url, article.url) + xml.id URI.join(site_url, article.url) + xml.published article.date.to_time.iso8601 + xml.updated File.mtime(article.source_file).iso8601 + xml.author { xml.name article.data["author"] } + # xml.summary article.summary, "type" => "html" + xml.content article.body, "type" => "html" + end + end +end diff --git a/source/fonts/Inconsolata-Bold-webfont.eot b/source/fonts/Inconsolata-Bold-webfont.eot new file mode 100644 index 0000000..5b6d547 Binary files /dev/null and b/source/fonts/Inconsolata-Bold-webfont.eot differ diff --git a/source/fonts/Inconsolata-Bold-webfont.svg b/source/fonts/Inconsolata-Bold-webfont.svg new file mode 100644 index 0000000..f338af4 --- /dev/null +++ b/source/fonts/Inconsolata-Bold-webfont.svg @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/fonts/Inconsolata-Bold-webfont.ttf b/source/fonts/Inconsolata-Bold-webfont.ttf new file mode 100644 index 0000000..40acbfc Binary files /dev/null and b/source/fonts/Inconsolata-Bold-webfont.ttf differ diff --git a/source/fonts/Inconsolata-Bold-webfont.woff b/source/fonts/Inconsolata-Bold-webfont.woff new file mode 100644 index 0000000..0e3e358 Binary files /dev/null and b/source/fonts/Inconsolata-Bold-webfont.woff differ diff --git a/source/fonts/Inconsolata-webfont.eot b/source/fonts/Inconsolata-webfont.eot new file mode 100644 index 0000000..4a04aea Binary files /dev/null and b/source/fonts/Inconsolata-webfont.eot differ diff --git a/source/fonts/Inconsolata-webfont.svg b/source/fonts/Inconsolata-webfont.svg new file mode 100644 index 0000000..5b9e5cf --- /dev/null +++ b/source/fonts/Inconsolata-webfont.svg @@ -0,0 +1,237 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/fonts/Inconsolata-webfont.ttf b/source/fonts/Inconsolata-webfont.ttf new file mode 100644 index 0000000..7ebd823 Binary files /dev/null and b/source/fonts/Inconsolata-webfont.ttf differ diff --git a/source/fonts/Inconsolata-webfont.woff b/source/fonts/Inconsolata-webfont.woff new file mode 100644 index 0000000..7795d78 Binary files /dev/null and b/source/fonts/Inconsolata-webfont.woff differ diff --git a/source/fonts/OpenSans-Bold-webfont.eot b/source/fonts/OpenSans-Bold-webfont.eot new file mode 100644 index 0000000..a3b7899 Binary files /dev/null and b/source/fonts/OpenSans-Bold-webfont.eot differ diff --git a/source/fonts/OpenSans-Bold-webfont.svg b/source/fonts/OpenSans-Bold-webfont.svg new file mode 100644 index 0000000..5729315 --- /dev/null +++ b/source/fonts/OpenSans-Bold-webfont.svg @@ -0,0 +1,845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/fonts/OpenSans-Bold-webfont.ttf b/source/fonts/OpenSans-Bold-webfont.ttf new file mode 100644 index 0000000..8a42c85 Binary files /dev/null and b/source/fonts/OpenSans-Bold-webfont.ttf differ diff --git a/source/fonts/OpenSans-Bold-webfont.woff b/source/fonts/OpenSans-Bold-webfont.woff new file mode 100644 index 0000000..980e354 Binary files /dev/null and b/source/fonts/OpenSans-Bold-webfont.woff differ diff --git a/source/fonts/OpenSans-BoldItalic-webfont.eot b/source/fonts/OpenSans-BoldItalic-webfont.eot new file mode 100644 index 0000000..3ed0030 Binary files /dev/null and b/source/fonts/OpenSans-BoldItalic-webfont.eot differ diff --git a/source/fonts/OpenSans-BoldItalic-webfont.svg b/source/fonts/OpenSans-BoldItalic-webfont.svg new file mode 100644 index 0000000..3871abf --- /dev/null +++ b/source/fonts/OpenSans-BoldItalic-webfont.svg @@ -0,0 +1,845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/fonts/OpenSans-BoldItalic-webfont.ttf b/source/fonts/OpenSans-BoldItalic-webfont.ttf new file mode 100644 index 0000000..f148c94 Binary files /dev/null and b/source/fonts/OpenSans-BoldItalic-webfont.ttf differ diff --git a/source/fonts/OpenSans-BoldItalic-webfont.woff b/source/fonts/OpenSans-BoldItalic-webfont.woff new file mode 100644 index 0000000..efe0fed Binary files /dev/null and b/source/fonts/OpenSans-BoldItalic-webfont.woff differ diff --git a/source/fonts/OpenSans-ExtraBold-webfont.eot b/source/fonts/OpenSans-ExtraBold-webfont.eot new file mode 100644 index 0000000..022db07 Binary files /dev/null and b/source/fonts/OpenSans-ExtraBold-webfont.eot differ diff --git a/source/fonts/OpenSans-ExtraBold-webfont.svg b/source/fonts/OpenSans-ExtraBold-webfont.svg new file mode 100644 index 0000000..950475f --- /dev/null +++ b/source/fonts/OpenSans-ExtraBold-webfont.svg @@ -0,0 +1,845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/fonts/OpenSans-ExtraBold-webfont.ttf b/source/fonts/OpenSans-ExtraBold-webfont.ttf new file mode 100644 index 0000000..1445d9f Binary files /dev/null and b/source/fonts/OpenSans-ExtraBold-webfont.ttf differ diff --git a/source/fonts/OpenSans-ExtraBold-webfont.woff b/source/fonts/OpenSans-ExtraBold-webfont.woff new file mode 100644 index 0000000..90513fb Binary files /dev/null and b/source/fonts/OpenSans-ExtraBold-webfont.woff differ diff --git a/source/fonts/OpenSans-ExtraBoldItalic-webfont.eot b/source/fonts/OpenSans-ExtraBoldItalic-webfont.eot new file mode 100644 index 0000000..3cc2721 Binary files /dev/null and b/source/fonts/OpenSans-ExtraBoldItalic-webfont.eot differ diff --git a/source/fonts/OpenSans-ExtraBoldItalic-webfont.svg b/source/fonts/OpenSans-ExtraBoldItalic-webfont.svg new file mode 100644 index 0000000..c615194 --- /dev/null +++ b/source/fonts/OpenSans-ExtraBoldItalic-webfont.svg @@ -0,0 +1,845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/fonts/OpenSans-ExtraBoldItalic-webfont.ttf b/source/fonts/OpenSans-ExtraBoldItalic-webfont.ttf new file mode 100644 index 0000000..ee9a701 Binary files /dev/null and b/source/fonts/OpenSans-ExtraBoldItalic-webfont.ttf differ diff --git a/source/fonts/OpenSans-ExtraBoldItalic-webfont.woff b/source/fonts/OpenSans-ExtraBoldItalic-webfont.woff new file mode 100644 index 0000000..74d86af Binary files /dev/null and b/source/fonts/OpenSans-ExtraBoldItalic-webfont.woff differ diff --git a/source/fonts/OpenSans-Italic-webfont.eot b/source/fonts/OpenSans-Italic-webfont.eot new file mode 100644 index 0000000..3f72e07 Binary files /dev/null and b/source/fonts/OpenSans-Italic-webfont.eot differ diff --git a/source/fonts/OpenSans-Italic-webfont.svg b/source/fonts/OpenSans-Italic-webfont.svg new file mode 100644 index 0000000..2b69a6e --- /dev/null +++ b/source/fonts/OpenSans-Italic-webfont.svg @@ -0,0 +1,845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/fonts/OpenSans-Italic-webfont.ttf b/source/fonts/OpenSans-Italic-webfont.ttf new file mode 100644 index 0000000..04c02ba Binary files /dev/null and b/source/fonts/OpenSans-Italic-webfont.ttf differ diff --git a/source/fonts/OpenSans-Italic-webfont.woff b/source/fonts/OpenSans-Italic-webfont.woff new file mode 100644 index 0000000..d0e49a1 Binary files /dev/null and b/source/fonts/OpenSans-Italic-webfont.woff differ diff --git a/source/fonts/OpenSans-Light-webfont.eot b/source/fonts/OpenSans-Light-webfont.eot new file mode 100644 index 0000000..481402b Binary files /dev/null and b/source/fonts/OpenSans-Light-webfont.eot differ diff --git a/source/fonts/OpenSans-Light-webfont.svg b/source/fonts/OpenSans-Light-webfont.svg new file mode 100644 index 0000000..4d90958 --- /dev/null +++ b/source/fonts/OpenSans-Light-webfont.svg @@ -0,0 +1,845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/fonts/OpenSans-Light-webfont.ttf b/source/fonts/OpenSans-Light-webfont.ttf new file mode 100644 index 0000000..f12ba26 Binary files /dev/null and b/source/fonts/OpenSans-Light-webfont.ttf differ diff --git a/source/fonts/OpenSans-Light-webfont.woff b/source/fonts/OpenSans-Light-webfont.woff new file mode 100644 index 0000000..f8b2ce6 Binary files /dev/null and b/source/fonts/OpenSans-Light-webfont.woff differ diff --git a/source/fonts/OpenSans-LightItalic-webfont.eot b/source/fonts/OpenSans-LightItalic-webfont.eot new file mode 100644 index 0000000..2414336 Binary files /dev/null and b/source/fonts/OpenSans-LightItalic-webfont.eot differ diff --git a/source/fonts/OpenSans-LightItalic-webfont.svg b/source/fonts/OpenSans-LightItalic-webfont.svg new file mode 100644 index 0000000..a646812 --- /dev/null +++ b/source/fonts/OpenSans-LightItalic-webfont.svg @@ -0,0 +1,845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/fonts/OpenSans-LightItalic-webfont.ttf b/source/fonts/OpenSans-LightItalic-webfont.ttf new file mode 100644 index 0000000..140046e Binary files /dev/null and b/source/fonts/OpenSans-LightItalic-webfont.ttf differ diff --git a/source/fonts/OpenSans-LightItalic-webfont.woff b/source/fonts/OpenSans-LightItalic-webfont.woff new file mode 100644 index 0000000..86f0680 Binary files /dev/null and b/source/fonts/OpenSans-LightItalic-webfont.woff differ diff --git a/source/fonts/OpenSans-Regular-webfont.eot b/source/fonts/OpenSans-Regular-webfont.eot new file mode 100644 index 0000000..a2ca168 Binary files /dev/null and b/source/fonts/OpenSans-Regular-webfont.eot differ diff --git a/source/fonts/OpenSans-Regular-webfont.svg b/source/fonts/OpenSans-Regular-webfont.svg new file mode 100644 index 0000000..5511b29 --- /dev/null +++ b/source/fonts/OpenSans-Regular-webfont.svg @@ -0,0 +1,845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/fonts/OpenSans-Regular-webfont.ttf b/source/fonts/OpenSans-Regular-webfont.ttf new file mode 100644 index 0000000..8835863 Binary files /dev/null and b/source/fonts/OpenSans-Regular-webfont.ttf differ diff --git a/source/fonts/OpenSans-Regular-webfont.woff b/source/fonts/OpenSans-Regular-webfont.woff new file mode 100644 index 0000000..a0fd2bf Binary files /dev/null and b/source/fonts/OpenSans-Regular-webfont.woff differ diff --git a/source/fonts/OpenSans-Semibold-webfont.eot b/source/fonts/OpenSans-Semibold-webfont.eot new file mode 100644 index 0000000..f780741 Binary files /dev/null and b/source/fonts/OpenSans-Semibold-webfont.eot differ diff --git a/source/fonts/OpenSans-Semibold-webfont.svg b/source/fonts/OpenSans-Semibold-webfont.svg new file mode 100644 index 0000000..3d87b9d --- /dev/null +++ b/source/fonts/OpenSans-Semibold-webfont.svg @@ -0,0 +1,845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/fonts/OpenSans-Semibold-webfont.ttf b/source/fonts/OpenSans-Semibold-webfont.ttf new file mode 100644 index 0000000..d63121f Binary files /dev/null and b/source/fonts/OpenSans-Semibold-webfont.ttf differ diff --git a/source/fonts/OpenSans-Semibold-webfont.woff b/source/fonts/OpenSans-Semibold-webfont.woff new file mode 100644 index 0000000..72428c9 Binary files /dev/null and b/source/fonts/OpenSans-Semibold-webfont.woff differ diff --git a/source/fonts/OpenSans-SemiboldItalic-webfont.eot b/source/fonts/OpenSans-SemiboldItalic-webfont.eot new file mode 100644 index 0000000..80c9c90 Binary files /dev/null and b/source/fonts/OpenSans-SemiboldItalic-webfont.eot differ diff --git a/source/fonts/OpenSans-SemiboldItalic-webfont.svg b/source/fonts/OpenSans-SemiboldItalic-webfont.svg new file mode 100644 index 0000000..3b0160a --- /dev/null +++ b/source/fonts/OpenSans-SemiboldItalic-webfont.svg @@ -0,0 +1,845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/fonts/OpenSans-SemiboldItalic-webfont.ttf b/source/fonts/OpenSans-SemiboldItalic-webfont.ttf new file mode 100644 index 0000000..3adf615 Binary files /dev/null and b/source/fonts/OpenSans-SemiboldItalic-webfont.ttf differ diff --git a/source/fonts/OpenSans-SemiboldItalic-webfont.woff b/source/fonts/OpenSans-SemiboldItalic-webfont.woff new file mode 100644 index 0000000..92d209f Binary files /dev/null and b/source/fonts/OpenSans-SemiboldItalic-webfont.woff differ diff --git a/source/fonts/fontawesome-webfont.eot b/source/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..0662cb9 Binary files /dev/null and b/source/fonts/fontawesome-webfont.eot differ diff --git a/source/fonts/fontawesome-webfont.svg b/source/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..2edb4ec --- /dev/null +++ b/source/fonts/fontawesome-webfont.svg @@ -0,0 +1,399 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/fonts/fontawesome-webfont.ttf b/source/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..d365924 Binary files /dev/null and b/source/fonts/fontawesome-webfont.ttf differ diff --git a/source/fonts/fontawesome-webfont.woff b/source/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..b9bd17e Binary files /dev/null and b/source/fonts/fontawesome-webfont.woff differ diff --git a/source/images/map.png b/source/images/map.png new file mode 100644 index 0000000..6219829 Binary files /dev/null and b/source/images/map.png differ diff --git a/source/images/pattern/cream_dust.png b/source/images/pattern/cream_dust.png new file mode 100644 index 0000000..b25acab Binary files /dev/null and b/source/images/pattern/cream_dust.png differ diff --git a/source/images/pattern/groovepaper.png b/source/images/pattern/groovepaper.png new file mode 100644 index 0000000..61f81a7 Binary files /dev/null and b/source/images/pattern/groovepaper.png differ diff --git a/source/images/pattern/low_contrast_linen.png b/source/images/pattern/low_contrast_linen.png new file mode 100644 index 0000000..17b491e Binary files /dev/null and b/source/images/pattern/low_contrast_linen.png differ diff --git a/source/images/projects/cleanmapper.png b/source/images/projects/cleanmapper.png new file mode 100644 index 0000000..b9e1575 Binary files /dev/null and b/source/images/projects/cleanmapper.png differ diff --git a/source/images/projects/cramlr.png b/source/images/projects/cramlr.png new file mode 100644 index 0000000..47f6b04 Binary files /dev/null and b/source/images/projects/cramlr.png differ diff --git a/source/images/projects/fakturama.png b/source/images/projects/fakturama.png new file mode 100644 index 0000000..5283e69 Binary files /dev/null and b/source/images/projects/fakturama.png differ diff --git a/source/images/projects/freeletics.png b/source/images/projects/freeletics.png new file mode 100644 index 0000000..a28c389 Binary files /dev/null and b/source/images/projects/freeletics.png differ diff --git a/source/images/projects/nurph.png b/source/images/projects/nurph.png new file mode 100644 index 0000000..629e98d Binary files /dev/null and b/source/images/projects/nurph.png differ diff --git a/source/images/projects/sharedrop.png b/source/images/projects/sharedrop.png new file mode 100644 index 0000000..24c15a8 Binary files /dev/null and b/source/images/projects/sharedrop.png differ diff --git a/source/images/projects/socialguide.png b/source/images/projects/socialguide.png new file mode 100644 index 0000000..b936cf3 Binary files /dev/null and b/source/images/projects/socialguide.png differ diff --git a/source/images/projects/strobe.png b/source/images/projects/strobe.png new file mode 100644 index 0000000..b1b94e7 Binary files /dev/null and b/source/images/projects/strobe.png differ diff --git a/source/images/projects/tiramizoo.png b/source/images/projects/tiramizoo.png new file mode 100644 index 0000000..f1bf748 Binary files /dev/null and b/source/images/projects/tiramizoo.png differ diff --git a/source/images/team/jakub-kuzma.png b/source/images/team/jakub-kuzma.png new file mode 100644 index 0000000..f5b21af Binary files /dev/null and b/source/images/team/jakub-kuzma.png differ diff --git a/source/images/team/maciej-jarczok.png b/source/images/team/maciej-jarczok.png new file mode 100644 index 0000000..6d0cc25 Binary files /dev/null and b/source/images/team/maciej-jarczok.png differ diff --git a/source/images/team/miroslaw-boruta.png b/source/images/team/miroslaw-boruta.png new file mode 100644 index 0000000..de1a4d0 Binary files /dev/null and b/source/images/team/miroslaw-boruta.png differ diff --git a/source/images/team/szymon-nowak.png b/source/images/team/szymon-nowak.png new file mode 100644 index 0000000..2fa61de Binary files /dev/null and b/source/images/team/szymon-nowak.png differ diff --git a/source/images/team/tomasz-subik.png b/source/images/team/tomasz-subik.png new file mode 100644 index 0000000..8dd23a2 Binary files /dev/null and b/source/images/team/tomasz-subik.png differ diff --git a/source/images/team/wojciech-wnetrzak.png b/source/images/team/wojciech-wnetrzak.png new file mode 100644 index 0000000..b1cbc2d Binary files /dev/null and b/source/images/team/wojciech-wnetrzak.png differ diff --git a/source/images/testimonials/jevin.jpg b/source/images/testimonials/jevin.jpg new file mode 100644 index 0000000..72cac2a Binary files /dev/null and b/source/images/testimonials/jevin.jpg differ diff --git a/source/images/testimonials/michael.jpg b/source/images/testimonials/michael.jpg new file mode 100644 index 0000000..d80a008 Binary files /dev/null and b/source/images/testimonials/michael.jpg differ diff --git a/source/images/testimonials/neil.jpg b/source/images/testimonials/neil.jpg new file mode 100644 index 0000000..f38fb50 Binary files /dev/null and b/source/images/testimonials/neil.jpg differ diff --git a/source/index.html.erb b/source/index.html.erb new file mode 100644 index 0000000..0e3cc29 --- /dev/null +++ b/source/index.html.erb @@ -0,0 +1,201 @@ +--- +title: Cowbell Labs - Ruby on Rails and JavaScript Development Experts +description: Cowbell Labs is a Ruby on Rails and JavaScript development agency that specializes in web and mobile applications. +--- +
+
+

+ We build web and mobile applications +

+ Get in touch +
+
+ +
+
+
+
+
+
+

Rapid Development

+

+ Our team is highly experienced in creating and maintaining Ruby on Rails applications in agile way. Taking the best from both, we are able to rapidly implement your ideas — from prototypes and MVPs to large scale applications. +

+
+
+
+

Single Page Applications

+

+ We have practical knowledge of building single page applications using Ember, AngularJS, Backbone and YUI. We focus on bringing the best user experience in every part of your application. +

+
+
+
+

Real Time Web

+

+ Sometimes it is important for you to have incoming data, like chat messages or notifications, available instantly in your application. We take advantage of the latest web technologies like WebSockets and Server-Sent Events to update crucial information in real-time. +

+
+
+
+
+
+ +
+
+

We Have Enjoyed Working On

+ +
+ <% data.projects.each do |project| %> +
+
+ <% if project.url.present? %> + <%= link_to image_tag("/images/projects/#{project.slug}.png", class: "img-thumbnail", alt: project.name), project.url %> + <% else %> + <%= image_tag "/images/projects/#{project.slug}.png", class: "img-thumbnail", alt: project.name %> + <% end %> + +

+ <% if project.url.present? %> + <%= link_to project.name, project.url %> + <% else %> + <%= project.name %> + <% end %> +

+ +

<%= project.description %>

+
+
+ <% end %> +
+
+
+ +
+
+
+ +
+ + <% data.testimonials.each.with_index do |testimonial, i| %> +
+

<%= testimonial.text %>

+

+ <%= testimonial.signature %> +   + +

+
+ <% end %> +
+
+ +
+
+ +

Who We Are

+ +
+ <% data.people.each do |person| %> +
+ <% if person.github.present? %> + + <%= image_tag "/images/team/#{person.slug}.png", class: "img-thumbnail", alt: person.name %> + + <% else %> + <%= image_tag "/images/team/#{person.slug}.png", class: "img-thumbnail", alt: person.name %> + <% end %> +

<%= person.name %>

+ +

<%= person.description %>

+
+ <% end %> +
+ +
+
+ +
+
+

Community

+ +
+
+ + + + + +

Open Source

+

+ We love contributing back to open source projects like + Ruby on Rails, + Foreman, + Factory Girl, + Liquid, + Resque, + three.js + and many more… +

+
+
+ + + + + + + + + +

Ruby

+

+ We have organized several Silesian + Ruby User Group meetings. +

+
+
+ + + + + + + + + +

JavaScript

+

+ In 2013 we launched + local meet.js + meet ups in Silesia. +

+
+
+
+
+ +
+
+
+
+

Contact Us

+ +
+
+
+
diff --git a/source/javascripts/application.js b/source/javascripts/application.js new file mode 100644 index 0000000..eda034f --- /dev/null +++ b/source/javascripts/application.js @@ -0,0 +1,21 @@ +//= require "jquery/dist/jquery" +//= require "bootstrap-sass/assets/javascripts/bootstrap/collapse" +//= require "bootstrap-sass/assets/javascripts/bootstrap/transition" + +jQuery(function ($) { + $("[data-target='#hire']").click(function () { + ga("send", "event", "button", "click", "hire"); + }); + + $("a.smooth").on("click", function (event) { + var href = $(event.currentTarget).attr("href"), + hash = href.substr(1); + + if (href.indexOf(window.location.pathname) == 0 && $(hash).length > 0) { + event.preventDefault(); + $("html,body").animate({ scrollTop: $(hash).offset().top }, 1000, function () { + window.location.hash = hash; + }); + } + }); +}); diff --git a/source/javascripts/ie.js b/source/javascripts/ie.js new file mode 100644 index 0000000..d30f3fa --- /dev/null +++ b/source/javascripts/ie.js @@ -0,0 +1,4 @@ +// HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries + +//= require "html5shiv/dist/html5shiv" +//= require "respond/src/respond.js" diff --git a/source/layouts/article_layout.erb b/source/layouts/article_layout.erb new file mode 100644 index 0000000..54d1b41 --- /dev/null +++ b/source/layouts/article_layout.erb @@ -0,0 +1,84 @@ + + + + + <%= current_page.data.title || "Cowbell Labs" %> + + + + + + + + + + + + + + + + + +
+
+
+
+
+

+ <%= link_to current_page.title, current_page.url %> +

+ +
+ + Published by <%= current_page.data.author %> on + + +
+
+ +
+ <%= yield %> + + <% if current_page.data.hacker_news_id %> +
+ + <% end %> +
+
+ +
+
+ + +

Hello

+ +
+

We are Cowbell Labs - team of Ruby on Rails and JavaScript experts

+ <%= link_to "Learn more", "/", class: "btn btn-lg btn-success" %> +
+
+
+
+
+
+ + <%= partial "shared/footer" %> + + diff --git a/source/layouts/layout.erb b/source/layouts/layout.erb new file mode 100644 index 0000000..54cdbf4 --- /dev/null +++ b/source/layouts/layout.erb @@ -0,0 +1,68 @@ + + + + + <%= current_page.data.title || "Cowbell Labs" %> + + + + + + + + + + <%= stylesheet_link_tag "application" %> + + + + + + + +
+
+ +
+ + <%= yield %> + +
+
+ + <%= partial "shared/footer" %> + + + + diff --git a/source/robots.txt b/source/robots.txt new file mode 100644 index 0000000..62ff5fc --- /dev/null +++ b/source/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Disallow: +Sitemap: http://cowbell-labs.com/sitemap.xml diff --git a/source/shared/_footer.html.erb b/source/shared/_footer.html.erb new file mode 100644 index 0000000..63f5320 --- /dev/null +++ b/source/shared/_footer.html.erb @@ -0,0 +1,15 @@ + diff --git a/source/shared/_logo.html.erb b/source/shared/_logo.html.erb new file mode 100644 index 0000000..fbce0e0 --- /dev/null +++ b/source/shared/_logo.html.erb @@ -0,0 +1,2 @@ + + diff --git a/source/shared/_nav.html.erb b/source/shared/_nav.html.erb new file mode 100644 index 0000000..139f5f1 --- /dev/null +++ b/source/shared/_nav.html.erb @@ -0,0 +1,11 @@ + + diff --git a/source/sitemap.xml.builder b/source/sitemap.xml.builder new file mode 100644 index 0000000..04a7d99 --- /dev/null +++ b/source/sitemap.xml.builder @@ -0,0 +1,15 @@ +--- +layout: false +--- + +xml.instruct! +xml.urlset "xmlns" => "http://www.sitemaps.org/schemas/sitemap/0.9" do + sitemap.resources.select { |page| page.path =~ /\.html/ }.each do |page| + xml.url do + xml.loc "#{data.sitemap.url}#{page.url[1..-1]}" + xml.lastmod Date.today.to_time.iso8601 + xml.changefreq page.data.changefreq || "monthly" + xml.priority page.data.priority || "0.5" + end + end +end diff --git a/source/stylesheets/_custom-bootstrap.scss b/source/stylesheets/_custom-bootstrap.scss new file mode 100644 index 0000000..36f2020 --- /dev/null +++ b/source/stylesheets/_custom-bootstrap.scss @@ -0,0 +1,57 @@ +// Core variables and mixins +@import "bootstrap/variables"; +@import "variables"; +@import "bootstrap/mixins"; + +// Reset and dependencies +@import "bootstrap/normalize"; +@import "bootstrap/print"; +// @import "bootstrap/glyphicons"; + +// Core CSS +@import "bootstrap/scaffolding"; +@import "bootstrap/type"; +@import "bootstrap/code"; +@import "bootstrap/grid"; +@import "bootstrap/tables"; +@import "bootstrap/forms"; +@import "bootstrap/buttons"; + +// Components +@import "bootstrap/component-animations"; +// @import "bootstrap/dropdowns"; +// @import "bootstrap/button-groups"; +// @import "bootstrap/input-groups"; +@import "bootstrap/navs"; +@import "bootstrap/navbar"; +// @import "bootstrap/breadcrumbs"; +// @import "bootstrap/pagination"; +// @import "bootstrap/pager"; +// @import "bootstrap/labels"; +// @import "bootstrap/badges"; +@import "bootstrap/jumbotron"; +@import "bootstrap/thumbnails"; +// @import "bootstrap/alerts"; +// @import "bootstrap/progress-bars"; +// @import "bootstrap/media"; +// @import "bootstrap/list-group"; +// @import "bootstrap/panels"; +// @import "bootstrap/responsive-embed"; +// @import "bootstrap/wells"; +// @import "bootstrap/close"; + +// Components w/ JavaScript +// @import "bootstrap/modals"; +// @import "bootstrap/tooltip"; +// @import "bootstrap/popovers"; +// @import "bootstrap/carousel"; + +// Utility classes +@import "bootstrap/utilities"; +@import "bootstrap/responsive-utilities"; + +// Custom stuff +@import "font-awesome"; +@import "open-sans"; +@import "inconsolata"; +@import "wrapper"; diff --git a/source/stylesheets/_font-awesome.scss b/source/stylesheets/_font-awesome.scss new file mode 100644 index 0000000..64cff79 --- /dev/null +++ b/source/stylesheets/_font-awesome.scss @@ -0,0 +1,1470 @@ +/*! + * Font Awesome 3.2.0 + * the iconic font designed for Bootstrap + * ------------------------------------------------------------------------------ + * The full suite of pictographic icons, examples, and documentation can be + * found at http://fontawesome.io. Stay up to date on Twitter at + * http://twitter.com/fontawesome. + * + * License + * ------------------------------------------------------------------------------ + * - The Font Awesome font is licensed under SIL OFL 1.1 - + * http://scripts.sil.org/OFL + * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License - + * http://opensource.org/licenses/mit-license.html + * - Font Awesome documentation licensed under CC BY 3.0 - + * http://creativecommons.org/licenses/by/3.0/ + * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: + * "Font Awesome by Dave Gandy - http://fontawesome.io" + * + * Author - Dave Gandy + * ------------------------------------------------------------------------------ + * Email: dave$fontawesome.io + * Twitter: http://twitter.com/byscuits + * Work: Lead Product Designer $ Kyruus - http://kyruus.com + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('/fonts/fontawesome-webfont.eot?v=3.2.0'); + src: url('/fonts/fontawesome-webfont.eot?#iefix&v=3.2.0') format('embedded-opentype'), url('/fonts/fontawesome-webfont.woff?v=3.2.0') format('woff'), url('/fonts/fontawesome-webfont.ttf?v=3.2.0') format('truetype'), url('/fonts/fontawesome-webfont.svg#fontawesomeregular?v=3.2.0') format('svg'); + font-weight: normal; + font-style: normal; +} +/* FONT AWESOME CORE + * -------------------------- */ +[class^="icon-"], +[class*=" icon-"] { + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + *margin-right: .3em; +} +[class^="icon-"]:before, +[class*=" icon-"]:before { + text-decoration: inherit; + display: inline-block; + speak: none; +} +/* makes the font 33% larger relative to the icon container */ +.icon-large:before { + vertical-align: -10%; + font-size: 1.3333333333333333em; +} +/* makes sure icons active on rollover in links */ +a [class^="icon-"], +a [class*=" icon-"] { + display: inline; +} +/* increased font size for icon-large */ +[class^="icon-"].icon-fixed-width, +[class*=" icon-"].icon-fixed-width { + display: inline-block; + width: 1.1428571428571428em; + text-align: right; + padding-right: 0.2857142857142857em; +} +[class^="icon-"].icon-fixed-width.icon-large, +[class*=" icon-"].icon-fixed-width.icon-large { + width: 1.4285714285714286em; +} +.icons-ul { + margin-left: 2.142857142857143em; + list-style-type: none; +} +.icons-ul > li { + position: relative; +} +.icons-ul .icon-li { + position: absolute; + left: -2.142857142857143em; + width: 2.142857142857143em; + text-align: center; + line-height: inherit; +} +[class^="icon-"].hide, +[class*=" icon-"].hide { + display: none; +} +.icon-muted { + color: #eeeeee; +} +.icon-light { + color: #ffffff; +} +.icon-dark { + color: #333333; +} +.icon-border { + border: solid 1px #eeeeee; + padding: .2em .25em .15em; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.icon-2x { + font-size: 2em; +} +.icon-2x.icon-border { + border-width: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.icon-3x { + font-size: 3em; +} +.icon-3x.icon-border { + border-width: 3px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.icon-4x { + font-size: 4em; +} +.icon-4x.icon-border { + border-width: 4px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.icon-5x { + font-size: 5em; +} +.icon-5x.icon-border { + border-width: 5px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + border-radius: 7px; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +[class^="icon-"].pull-left, +[class*=" icon-"].pull-left { + margin-right: .3em; +} +[class^="icon-"].pull-right, +[class*=" icon-"].pull-right { + margin-left: .3em; +} +/* BOOTSTRAP SPECIFIC CLASSES + * -------------------------- */ +/* Bootstrap 2.0 sprites.scss reset */ +[class^="icon-"], +[class*=" icon-"] { + display: inline; + width: auto; + height: auto; + line-height: normal; + vertical-align: baseline; + background-image: none; + background-position: 0% 0%; + background-repeat: repeat; + margin-top: 0; +} +/* more sprites.scss reset */ +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"] { + background-image: none; +} +/* keeps Bootstrap styles with and without icons the same */ +.btn [class^="icon-"].icon-large, +.nav [class^="icon-"].icon-large, +.btn [class*=" icon-"].icon-large, +.nav [class*=" icon-"].icon-large { + line-height: .9em; +} +.btn [class^="icon-"].icon-spin, +.nav [class^="icon-"].icon-spin, +.btn [class*=" icon-"].icon-spin, +.nav [class*=" icon-"].icon-spin { + display: inline-block; +} +.nav-tabs [class^="icon-"], +.nav-pills [class^="icon-"], +.nav-tabs [class*=" icon-"], +.nav-pills [class*=" icon-"], +.nav-tabs [class^="icon-"].icon-large, +.nav-pills [class^="icon-"].icon-large, +.nav-tabs [class*=" icon-"].icon-large, +.nav-pills [class*=" icon-"].icon-large { + line-height: .9em; +} +.btn [class^="icon-"].pull-left.icon-2x, +.btn [class*=" icon-"].pull-left.icon-2x, +.btn [class^="icon-"].pull-right.icon-2x, +.btn [class*=" icon-"].pull-right.icon-2x { + margin-top: .18em; +} +.btn [class^="icon-"].icon-spin.icon-large, +.btn [class*=" icon-"].icon-spin.icon-large { + line-height: .8em; +} +.btn.btn-small [class^="icon-"].pull-left.icon-2x, +.btn.btn-small [class*=" icon-"].pull-left.icon-2x, +.btn.btn-small [class^="icon-"].pull-right.icon-2x, +.btn.btn-small [class*=" icon-"].pull-right.icon-2x { + margin-top: .25em; +} +.btn.btn-large [class^="icon-"], +.btn.btn-large [class*=" icon-"] { + margin-top: 0; +} +.btn.btn-large [class^="icon-"].pull-left.icon-2x, +.btn.btn-large [class*=" icon-"].pull-left.icon-2x, +.btn.btn-large [class^="icon-"].pull-right.icon-2x, +.btn.btn-large [class*=" icon-"].pull-right.icon-2x { + margin-top: .05em; +} +.btn.btn-large [class^="icon-"].pull-left.icon-2x, +.btn.btn-large [class*=" icon-"].pull-left.icon-2x { + margin-right: .2em; +} +.btn.btn-large [class^="icon-"].pull-right.icon-2x, +.btn.btn-large [class*=" icon-"].pull-right.icon-2x { + margin-left: .2em; +} +/* EXTRAS + * -------------------------- */ +/* Stacked and layered icon */ +.icon-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: -35%; +} +.icon-stack [class^="icon-"], +.icon-stack [class*=" icon-"] { + display: block; + text-align: center; + position: absolute; + width: 100%; + height: 100%; + font-size: 1em; + line-height: inherit; + *line-height: 2em; +} +.icon-stack .icon-stack-base { + font-size: 2em; + *line-height: 1em; +} +/* Animated rotating icon */ +.icon-spin { + display: inline-block; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + -webkit-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; +} +a .icon-spin { + display: inline-block; + text-decoration: none; +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(359deg); + } +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } +} +@-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); + } + 100% { + -o-transform: rotate(359deg); + } +} +@-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + } + 100% { + -ms-transform: rotate(359deg); + } +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} +/* Icon rotations and mirroring */ +.icon-rotate-90:before { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); +} +.icon-rotate-180:before { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); +} +.icon-rotate-270:before { + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); +} +.icon-flip-horizontal:before { + -webkit-transform: scale(-1, 1); + -moz-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + -o-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.icon-flip-vertical:before { + -webkit-transform: scale(1, -1); + -moz-transform: scale(1, -1); + -ms-transform: scale(1, -1); + -o-transform: scale(1, -1); + transform: scale(1, -1); +} +/* ensure rotation occurs inside anchor tags */ +a .icon-rotate-90:before, +a .icon-rotate-180:before, +a .icon-rotate-270:before, +a .icon-flip-horizontal:before, +a .icon-flip-vertical:before { + display: inline-block; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.icon-glass:before { + content: "\f000"; +} +.icon-music:before { + content: "\f001"; +} +.icon-search:before { + content: "\f002"; +} +.icon-envelope-alt:before { + content: "\f003"; +} +.icon-heart:before { + content: "\f004"; +} +.icon-star:before { + content: "\f005"; +} +.icon-star-empty:before { + content: "\f006"; +} +.icon-user:before { + content: "\f007"; +} +.icon-film:before { + content: "\f008"; +} +.icon-th-large:before { + content: "\f009"; +} +.icon-th:before { + content: "\f00a"; +} +.icon-th-list:before { + content: "\f00b"; +} +.icon-ok:before { + content: "\f00c"; +} +.icon-remove:before { + content: "\f00d"; +} +.icon-zoom-in:before { + content: "\f00e"; +} +.icon-zoom-out:before { + content: "\f010"; +} +.icon-power-off:before, +.icon-off:before { + content: "\f011"; +} +.icon-signal:before { + content: "\f012"; +} +.icon-cog:before { + content: "\f013"; +} +.icon-trash:before { + content: "\f014"; +} +.icon-home:before { + content: "\f015"; +} +.icon-file-alt:before { + content: "\f016"; +} +.icon-time:before { + content: "\f017"; +} +.icon-road:before { + content: "\f018"; +} +.icon-download-alt:before { + content: "\f019"; +} +.icon-download:before { + content: "\f01a"; +} +.icon-upload:before { + content: "\f01b"; +} +.icon-inbox:before { + content: "\f01c"; +} +.icon-play-circle:before { + content: "\f01d"; +} +.icon-rotate-right:before, +.icon-repeat:before { + content: "\f01e"; +} +.icon-refresh:before { + content: "\f021"; +} +.icon-list-alt:before { + content: "\f022"; +} +.icon-lock:before { + content: "\f023"; +} +.icon-flag:before { + content: "\f024"; +} +.icon-headphones:before { + content: "\f025"; +} +.icon-volume-off:before { + content: "\f026"; +} +.icon-volume-down:before { + content: "\f027"; +} +.icon-volume-up:before { + content: "\f028"; +} +.icon-qrcode:before { + content: "\f029"; +} +.icon-barcode:before { + content: "\f02a"; +} +.icon-tag:before { + content: "\f02b"; +} +.icon-tags:before { + content: "\f02c"; +} +.icon-book:before { + content: "\f02d"; +} +.icon-bookmark:before { + content: "\f02e"; +} +.icon-print:before { + content: "\f02f"; +} +.icon-camera:before { + content: "\f030"; +} +.icon-font:before { + content: "\f031"; +} +.icon-bold:before { + content: "\f032"; +} +.icon-italic:before { + content: "\f033"; +} +.icon-text-height:before { + content: "\f034"; +} +.icon-text-width:before { + content: "\f035"; +} +.icon-align-left:before { + content: "\f036"; +} +.icon-align-center:before { + content: "\f037"; +} +.icon-align-right:before { + content: "\f038"; +} +.icon-align-justify:before { + content: "\f039"; +} +.icon-list:before { + content: "\f03a"; +} +.icon-indent-left:before { + content: "\f03b"; +} +.icon-indent-right:before { + content: "\f03c"; +} +.icon-facetime-video:before { + content: "\f03d"; +} +.icon-picture:before { + content: "\f03e"; +} +.icon-pencil:before { + content: "\f040"; +} +.icon-map-marker:before { + content: "\f041"; +} +.icon-adjust:before { + content: "\f042"; +} +.icon-tint:before { + content: "\f043"; +} +.icon-edit:before { + content: "\f044"; +} +.icon-share:before { + content: "\f045"; +} +.icon-check:before { + content: "\f046"; +} +.icon-move:before { + content: "\f047"; +} +.icon-step-backward:before { + content: "\f048"; +} +.icon-fast-backward:before { + content: "\f049"; +} +.icon-backward:before { + content: "\f04a"; +} +.icon-play:before { + content: "\f04b"; +} +.icon-pause:before { + content: "\f04c"; +} +.icon-stop:before { + content: "\f04d"; +} +.icon-forward:before { + content: "\f04e"; +} +.icon-fast-forward:before { + content: "\f050"; +} +.icon-step-forward:before { + content: "\f051"; +} +.icon-eject:before { + content: "\f052"; +} +.icon-chevron-left:before { + content: "\f053"; +} +.icon-chevron-right:before { + content: "\f054"; +} +.icon-plus-sign:before { + content: "\f055"; +} +.icon-minus-sign:before { + content: "\f056"; +} +.icon-remove-sign:before { + content: "\f057"; +} +.icon-ok-sign:before { + content: "\f058"; +} +.icon-question-sign:before { + content: "\f059"; +} +.icon-info-sign:before { + content: "\f05a"; +} +.icon-screenshot:before { + content: "\f05b"; +} +.icon-remove-circle:before { + content: "\f05c"; +} +.icon-ok-circle:before { + content: "\f05d"; +} +.icon-ban-circle:before { + content: "\f05e"; +} +.icon-arrow-left:before { + content: "\f060"; +} +.icon-arrow-right:before { + content: "\f061"; +} +.icon-arrow-up:before { + content: "\f062"; +} +.icon-arrow-down:before { + content: "\f063"; +} +.icon-mail-forward:before, +.icon-share-alt:before { + content: "\f064"; +} +.icon-resize-full:before { + content: "\f065"; +} +.icon-resize-small:before { + content: "\f066"; +} +.icon-plus:before { + content: "\f067"; +} +.icon-minus:before { + content: "\f068"; +} +.icon-asterisk:before { + content: "\f069"; +} +.icon-exclamation-sign:before { + content: "\f06a"; +} +.icon-gift:before { + content: "\f06b"; +} +.icon-leaf:before { + content: "\f06c"; +} +.icon-fire:before { + content: "\f06d"; +} +.icon-eye-open:before { + content: "\f06e"; +} +.icon-eye-close:before { + content: "\f070"; +} +.icon-warning-sign:before { + content: "\f071"; +} +.icon-plane:before { + content: "\f072"; +} +.icon-calendar:before { + content: "\f073"; +} +.icon-random:before { + content: "\f074"; +} +.icon-comment:before { + content: "\f075"; +} +.icon-magnet:before { + content: "\f076"; +} +.icon-chevron-up:before { + content: "\f077"; +} +.icon-chevron-down:before { + content: "\f078"; +} +.icon-retweet:before { + content: "\f079"; +} +.icon-shopping-cart:before { + content: "\f07a"; +} +.icon-folder-close:before { + content: "\f07b"; +} +.icon-folder-open:before { + content: "\f07c"; +} +.icon-resize-vertical:before { + content: "\f07d"; +} +.icon-resize-horizontal:before { + content: "\f07e"; +} +.icon-bar-chart:before { + content: "\f080"; +} +.icon-twitter-sign:before { + content: "\f081"; +} +.icon-facebook-sign:before { + content: "\f082"; +} +.icon-camera-retro:before { + content: "\f083"; +} +.icon-key:before { + content: "\f084"; +} +.icon-cogs:before { + content: "\f085"; +} +.icon-comments:before { + content: "\f086"; +} +.icon-thumbs-up-alt:before { + content: "\f087"; +} +.icon-thumbs-down-alt:before { + content: "\f088"; +} +.icon-star-half:before { + content: "\f089"; +} +.icon-heart-empty:before { + content: "\f08a"; +} +.icon-signout:before { + content: "\f08b"; +} +.icon-linkedin-sign:before { + content: "\f08c"; +} +.icon-pushpin:before { + content: "\f08d"; +} +.icon-external-link:before { + content: "\f08e"; +} +.icon-signin:before { + content: "\f090"; +} +.icon-trophy:before { + content: "\f091"; +} +.icon-github-sign:before { + content: "\f092"; +} +.icon-upload-alt:before { + content: "\f093"; +} +.icon-lemon:before { + content: "\f094"; +} +.icon-phone:before { + content: "\f095"; +} +.icon-unchecked:before, +.icon-check-empty:before { + content: "\f096"; +} +.icon-bookmark-empty:before { + content: "\f097"; +} +.icon-phone-sign:before { + content: "\f098"; +} +.icon-twitter:before { + content: "\f099"; +} +.icon-facebook:before { + content: "\f09a"; +} +.icon-github:before { + content: "\f09b"; +} +.icon-unlock:before { + content: "\f09c"; +} +.icon-credit-card:before { + content: "\f09d"; +} +.icon-rss:before { + content: "\f09e"; +} +.icon-hdd:before { + content: "\f0a0"; +} +.icon-bullhorn:before { + content: "\f0a1"; +} +.icon-bell:before { + content: "\f0a2"; +} +.icon-certificate:before { + content: "\f0a3"; +} +.icon-hand-right:before { + content: "\f0a4"; +} +.icon-hand-left:before { + content: "\f0a5"; +} +.icon-hand-up:before { + content: "\f0a6"; +} +.icon-hand-down:before { + content: "\f0a7"; +} +.icon-circle-arrow-left:before { + content: "\f0a8"; +} +.icon-circle-arrow-right:before { + content: "\f0a9"; +} +.icon-circle-arrow-up:before { + content: "\f0aa"; +} +.icon-circle-arrow-down:before { + content: "\f0ab"; +} +.icon-globe:before { + content: "\f0ac"; +} +.icon-wrench:before { + content: "\f0ad"; +} +.icon-tasks:before { + content: "\f0ae"; +} +.icon-filter:before { + content: "\f0b0"; +} +.icon-briefcase:before { + content: "\f0b1"; +} +.icon-fullscreen:before { + content: "\f0b2"; +} +.icon-group:before { + content: "\f0c0"; +} +.icon-link:before { + content: "\f0c1"; +} +.icon-cloud:before { + content: "\f0c2"; +} +.icon-beaker:before { + content: "\f0c3"; +} +.icon-cut:before { + content: "\f0c4"; +} +.icon-copy:before { + content: "\f0c5"; +} +.icon-paperclip:before, +.icon-paper-clip:before { + content: "\f0c6"; +} +.icon-save:before { + content: "\f0c7"; +} +.icon-sign-blank:before { + content: "\f0c8"; +} +.icon-reorder:before { + content: "\f0c9"; +} +.icon-list-ul:before { + content: "\f0ca"; +} +.icon-list-ol:before { + content: "\f0cb"; +} +.icon-strikethrough:before { + content: "\f0cc"; +} +.icon-underline:before { + content: "\f0cd"; +} +.icon-table:before { + content: "\f0ce"; +} +.icon-magic:before { + content: "\f0d0"; +} +.icon-truck:before { + content: "\f0d1"; +} +.icon-pinterest:before { + content: "\f0d2"; +} +.icon-pinterest-sign:before { + content: "\f0d3"; +} +.icon-google-plus-sign:before { + content: "\f0d4"; +} +.icon-google-plus:before { + content: "\f0d5"; +} +.icon-money:before { + content: "\f0d6"; +} +.icon-caret-down:before { + content: "\f0d7"; +} +.icon-caret-up:before { + content: "\f0d8"; +} +.icon-caret-left:before { + content: "\f0d9"; +} +.icon-caret-right:before { + content: "\f0da"; +} +.icon-columns:before { + content: "\f0db"; +} +.icon-sort:before { + content: "\f0dc"; +} +.icon-sort-down:before { + content: "\f0dd"; +} +.icon-sort-up:before { + content: "\f0de"; +} +.icon-envelope:before { + content: "\f0e0"; +} +.icon-linkedin:before { + content: "\f0e1"; +} +.icon-rotate-left:before, +.icon-undo:before { + content: "\f0e2"; +} +.icon-legal:before { + content: "\f0e3"; +} +.icon-dashboard:before { + content: "\f0e4"; +} +.icon-comment-alt:before { + content: "\f0e5"; +} +.icon-comments-alt:before { + content: "\f0e6"; +} +.icon-bolt:before { + content: "\f0e7"; +} +.icon-sitemap:before { + content: "\f0e8"; +} +.icon-umbrella:before { + content: "\f0e9"; +} +.icon-paste:before { + content: "\f0ea"; +} +.icon-lightbulb:before { + content: "\f0eb"; +} +.icon-exchange:before { + content: "\f0ec"; +} +.icon-cloud-download:before { + content: "\f0ed"; +} +.icon-cloud-upload:before { + content: "\f0ee"; +} +.icon-user-md:before { + content: "\f0f0"; +} +.icon-stethoscope:before { + content: "\f0f1"; +} +.icon-suitcase:before { + content: "\f0f2"; +} +.icon-bell-alt:before { + content: "\f0f3"; +} +.icon-coffee:before { + content: "\f0f4"; +} +.icon-food:before { + content: "\f0f5"; +} +.icon-file-text-alt:before { + content: "\f0f6"; +} +.icon-building:before { + content: "\f0f7"; +} +.icon-hospital:before { + content: "\f0f8"; +} +.icon-ambulance:before { + content: "\f0f9"; +} +.icon-medkit:before { + content: "\f0fa"; +} +.icon-fighter-jet:before { + content: "\f0fb"; +} +.icon-beer:before { + content: "\f0fc"; +} +.icon-h-sign:before { + content: "\f0fd"; +} +.icon-plus-sign-alt:before { + content: "\f0fe"; +} +.icon-double-angle-left:before { + content: "\f100"; +} +.icon-double-angle-right:before { + content: "\f101"; +} +.icon-double-angle-up:before { + content: "\f102"; +} +.icon-double-angle-down:before { + content: "\f103"; +} +.icon-angle-left:before { + content: "\f104"; +} +.icon-angle-right:before { + content: "\f105"; +} +.icon-angle-up:before { + content: "\f106"; +} +.icon-angle-down:before { + content: "\f107"; +} +.icon-desktop:before { + content: "\f108"; +} +.icon-laptop:before { + content: "\f109"; +} +.icon-tablet:before { + content: "\f10a"; +} +.icon-mobile-phone:before { + content: "\f10b"; +} +.icon-circle-blank:before { + content: "\f10c"; +} +.icon-quote-left:before { + content: "\f10d"; +} +.icon-quote-right:before { + content: "\f10e"; +} +.icon-spinner:before { + content: "\f110"; +} +.icon-circle:before { + content: "\f111"; +} +.icon-mail-reply:before, +.icon-reply:before { + content: "\f112"; +} +.icon-github-alt:before { + content: "\f113"; +} +.icon-folder-close-alt:before { + content: "\f114"; +} +.icon-folder-open-alt:before { + content: "\f115"; +} +.icon-expand-alt:before { + content: "\f116"; +} +.icon-collapse-alt:before { + content: "\f117"; +} +.icon-smile:before { + content: "\f118"; +} +.icon-frown:before { + content: "\f119"; +} +.icon-meh:before { + content: "\f11a"; +} +.icon-gamepad:before { + content: "\f11b"; +} +.icon-keyboard:before { + content: "\f11c"; +} +.icon-flag-alt:before { + content: "\f11d"; +} +.icon-flag-checkered:before { + content: "\f11e"; +} +.icon-terminal:before { + content: "\f120"; +} +.icon-code:before { + content: "\f121"; +} +.icon-reply-all:before { + content: "\f122"; +} +.icon-mail-reply-all:before { + content: "\f122"; +} +.icon-star-half-full:before, +.icon-star-half-empty:before { + content: "\f123"; +} +.icon-location-arrow:before { + content: "\f124"; +} +.icon-crop:before { + content: "\f125"; +} +.icon-code-fork:before { + content: "\f126"; +} +.icon-unlink:before { + content: "\f127"; +} +.icon-question:before { + content: "\f128"; +} +.icon-info:before { + content: "\f129"; +} +.icon-exclamation:before { + content: "\f12a"; +} +.icon-superscript:before { + content: "\f12b"; +} +.icon-subscript:before { + content: "\f12c"; +} +.icon-eraser:before { + content: "\f12d"; +} +.icon-puzzle-piece:before { + content: "\f12e"; +} +.icon-microphone:before { + content: "\f130"; +} +.icon-microphone-off:before { + content: "\f131"; +} +.icon-shield:before { + content: "\f132"; +} +.icon-calendar-empty:before { + content: "\f133"; +} +.icon-fire-extinguisher:before { + content: "\f134"; +} +.icon-rocket:before { + content: "\f135"; +} +.icon-maxcdn:before { + content: "\f136"; +} +.icon-chevron-sign-left:before { + content: "\f137"; +} +.icon-chevron-sign-right:before { + content: "\f138"; +} +.icon-chevron-sign-up:before { + content: "\f139"; +} +.icon-chevron-sign-down:before { + content: "\f13a"; +} +.icon-html5:before { + content: "\f13b"; +} +.icon-css3:before { + content: "\f13c"; +} +.icon-anchor:before { + content: "\f13d"; +} +.icon-unlock-alt:before { + content: "\f13e"; +} +.icon-bullseye:before { + content: "\f140"; +} +.icon-ellipsis-horizontal:before { + content: "\f141"; +} +.icon-ellipsis-vertical:before { + content: "\f142"; +} +.icon-rss-sign:before { + content: "\f143"; +} +.icon-play-sign:before { + content: "\f144"; +} +.icon-ticket:before { + content: "\f145"; +} +.icon-minus-sign-alt:before { + content: "\f146"; +} +.icon-check-minus:before { + content: "\f147"; +} +.icon-level-up:before { + content: "\f148"; +} +.icon-level-down:before { + content: "\f149"; +} +.icon-check-sign:before { + content: "\f14a"; +} +.icon-edit-sign:before { + content: "\f14b"; +} +.icon-external-link-sign:before { + content: "\f14c"; +} +.icon-share-sign:before { + content: "\f14d"; +} +.icon-compass:before { + content: "\f14e"; +} +.icon-collapse:before { + content: "\f150"; +} +.icon-collapse-top:before { + content: "\f151"; +} +.icon-expand:before { + content: "\f152"; +} +.icon-euro:before, +.icon-eur:before { + content: "\f153"; +} +.icon-gbp:before { + content: "\f154"; +} +.icon-dollar:before, +.icon-usd:before { + content: "\f155"; +} +.icon-rupee:before, +.icon-inr:before { + content: "\f156"; +} +.icon-yen:before, +.icon-jpy:before { + content: "\f157"; +} +.icon-renminbi:before, +.icon-cny:before { + content: "\f158"; +} +.icon-won:before, +.icon-krw:before { + content: "\f159"; +} +.icon-bitcoin:before, +.icon-btc:before { + content: "\f15a"; +} +.icon-file:before { + content: "\f15b"; +} +.icon-file-text:before { + content: "\f15c"; +} +.icon-sort-by-alphabet:before { + content: "\f15d"; +} +.icon-sort-by-alphabet-alt:before { + content: "\f15e"; +} +.icon-sort-by-attributes:before { + content: "\f160"; +} +.icon-sort-by-attributes-alt:before { + content: "\f161"; +} +.icon-sort-by-order:before { + content: "\f162"; +} +.icon-sort-by-order-alt:before { + content: "\f163"; +} +.icon-thumbs-up:before { + content: "\f164"; +} +.icon-thumbs-down:before { + content: "\f165"; +} +.icon-youtube-sign:before { + content: "\f166"; +} +.icon-youtube:before { + content: "\f167"; +} +.icon-xing:before { + content: "\f168"; +} +.icon-xing-sign:before { + content: "\f169"; +} +.icon-youtube-play:before { + content: "\f16a"; +} +.icon-dropbox:before { + content: "\f16b"; +} +.icon-stackexchange:before { + content: "\f16c"; +} +.icon-instagram:before { + content: "\f16d"; +} +.icon-flickr:before { + content: "\f16e"; +} +.icon-adn:before { + content: "\f170"; +} +.icon-bitbucket:before { + content: "\f171"; +} +.icon-bitbucket-sign:before { + content: "\f172"; +} +.icon-tumblr:before { + content: "\f173"; +} +.icon-tumblr-sign:before { + content: "\f174"; +} +.icon-long-arrow-down:before { + content: "\f175"; +} +.icon-long-arrow-up:before { + content: "\f176"; +} +.icon-long-arrow-left:before { + content: "\f177"; +} +.icon-long-arrow-right:before { + content: "\f178"; +} +.icon-apple:before { + content: "\f179"; +} +.icon-windows:before { + content: "\f17a"; +} +.icon-android:before { + content: "\f17b"; +} +.icon-linux:before { + content: "\f17c"; +} +.icon-dribble:before { + content: "\f17d"; +} +.icon-skype:before { + content: "\f17e"; +} +.icon-foursquare:before { + content: "\f180"; +} +.icon-trello:before { + content: "\f181"; +} +.icon-female:before { + content: "\f182"; +} +.icon-male:before { + content: "\f183"; +} +.icon-gittip:before { + content: "\f184"; +} +.icon-sun:before { + content: "\f185"; +} +.icon-moon:before { + content: "\f186"; +} +.icon-archive:before { + content: "\f187"; +} +.icon-bug:before { + content: "\f188"; +} +.icon-vk:before { + content: "\f189"; +} +.icon-weibo:before { + content: "\f18a"; +} +.icon-renren:before { + content: "\f18b"; +} diff --git a/source/stylesheets/_inconsolata.scss b/source/stylesheets/_inconsolata.scss new file mode 100644 index 0000000..08a3d15 --- /dev/null +++ b/source/stylesheets/_inconsolata.scss @@ -0,0 +1,21 @@ +@font-face { + font-family: Inconsolata; + src: url("/fonts/Inconsolata-webfont.eot"); + src: url("/fonts/Inconsolata-webfont.eot?#iefix") format("embedded-opentype"), + url("/fonts/Inconsolata-webfont.woff") format("woff"), + url("/fonts/Inconsolata-webfont.ttf") format("truetype"), + url("/fonts/Inconsolata-webfont.svg#webfont6txitxZN") format("svg"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: Inconsolata; + src: url("/fonts/Inconsolata-Bold-webfont.eot"); + src: url("/fonts/Inconsolata-Bold-webfont.eot?#iefix") format("embedded-opentype"), + url("/fonts/Inconsolata-Bold-webfont.woff") format("woff"), + url("/fonts/Inconsolata-Bold-webfont.ttf") format("truetype"), + url("/fonts/Inconsolata-Bold-webfont.svg#webfont6txitxZN") format("svg"); + font-weight: 700; + font-style: normal; +} diff --git a/source/stylesheets/_open-sans.scss b/source/stylesheets/_open-sans.scss new file mode 100644 index 0000000..6ef27ba --- /dev/null +++ b/source/stylesheets/_open-sans.scss @@ -0,0 +1,111 @@ +/* FONTS */ + +@font-face { + font-family: OpenSans; + src: url("/fonts/OpenSans-Regular-webfont.eot"); + src: url("/fonts/OpenSans-Regular-webfont.eot?#iefix") format("embedded-opentype"), + url("/fonts/OpenSans-Regular-webfont.woff") format("woff"), + url("/fonts/OpenSans-Regular-webfont.ttf") format("truetype"), + url("/fonts/OpenSans-Regular-webfont.svg#OpenSansRegular") format("svg"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: OpenSans; + src: url("/fonts/OpenSans-Bold-webfont.eot"); + src: url("/fonts/OpenSans-Bold-webfont.eot?#iefix") format("embedded-opentype"), + url("/fonts/OpenSans-Bold-webfont.woff") format("woff"), + url("/fonts/OpenSans-Bold-webfont.ttf") format("truetype"), + url("/fonts/OpenSans-Bold-webfont.svg#OpenSansBold") format("svg"); + font-weight: 700; + font-style: normal; +} + +@font-face { + font-family: OpenSans; + src: url("/fonts/OpenSans-Italic-webfont.eot"); + src: url("/fonts/OpenSans-Italic-webfont.eot?#iefix") format("embedded-opentype"), + url("/fonts/OpenSans-Italic-webfont.woff") format("woff"), + url("/fonts/OpenSans-Italic-webfont.ttf") format("truetype"), + url("/fonts/OpenSans-Italic-webfont.svg#OpenSansItalic") format("svg"); + font-weight: normal; + font-style: italic; +} + +@font-face { + font-family: OpenSans; + src: url("/fonts/OpenSans-BoldItalic-webfont.eot"); + src: url("/fonts/OpenSans-BoldItalic-webfont.eot?#iefix") format("embedded-opentype"), + url("/fonts/OpenSans-BoldItalic-webfont.woff") format("woff"), + url("/fonts/OpenSans-BoldItalic-webfont.ttf") format("truetype"), + url("/fonts/OpenSans-BoldItalic-webfont.svg#OpenSansBoldItalic") format("svg"); + font-weight: 700; + font-style: italic; +} + +@font-face { + font-family: OpenSans; + src: url("/fonts/OpenSans-ExtraBold-webfont.eot"); + src: url("/fonts/OpenSans-ExtraBold-webfont.eot?#iefix") format("embedded-opentype"), + url("/fonts/OpenSans-ExtraBold-webfont.woff") format("woff"), + url("/fonts/OpenSans-ExtraBold-webfont.ttf") format("truetype"), + url("/fonts/OpenSans-ExtraBold-webfont.svg#OpenSansExtraBold") format("svg"); + font-weight: 800; + font-style: normal; +} + +@font-face { + font-family: OpenSans; + src: url("/fonts/OpenSans-ExtraBoldItalic-webfont.eot"); + src: url("/fonts/OpenSans-ExtraBoldItalic-webfont.eot?#iefix") format("embedded-opentype"), + url("/fonts/OpenSans-ExtraBoldItalic-webfont.woff") format("woff"), + url("/fonts/OpenSans-ExtraBoldItalic-webfont.ttf") format("truetype"), + url("/fonts/OpenSans-ExtraBoldItalic-webfont.svg#OpenSansExtraBoldItalic") format("svg"); + font-weight: 800; + font-style: italic; +} + +@font-face { + font-family: OpenSans; + src: url("/fonts/OpenSans-Light-webfont.eot"); + src: url("/fonts/OpenSans-Light-webfont.eot?#iefix") format("embedded-opentype"), + url("/fonts/OpenSans-Light-webfont.woff") format("woff"), + url("/fonts/OpenSans-Light-webfont.ttf") format("truetype"), + url("/fonts/OpenSans-Light-webfont.svg#OpenSansLight") format("svg"); + font-weight: 300; + font-style: normal; +} + +@font-face { + font-family: OpenSans; + src: url("/fonts/OpenSans-LightItalic-webfont.eot"); + src: url("/fonts/OpenSans-LightItalic-webfont.eot?#iefix") format("embedded-opentype"), + url("/fonts/OpenSans-LightItalic-webfont.woff") format("woff"), + url("/fonts/OpenSans-LightItalic-webfont.ttf") format("truetype"), + url("/fonts/OpenSans-LightItalic-webfont.svg#OpenSansLightItalic") format("svg"); + font-weight: 300; + font-style: italic; +} + +@font-face { + font-family: OpenSans; + src: url("/fonts/OpenSans-Semibold-webfont.eot"); + src: url("/fonts/OpenSans-Semibold-webfont.eot?#iefix") format("embedded-opentype"), + url("/fonts/OpenSans-Semibold-webfont.woff") format("woff"), + url("/fonts/OpenSans-Semibold-webfont.ttf") format("truetype"), + url("/fonts/OpenSans-Semibold-webfont.svg#OpenSansSemibold") format("svg"); + font-weight: 600; + font-style: normal; +} + +@font-face { + font-family: OpenSans; + src: url("/fonts/OpenSans-SemiboldItalic-webfont.eot"); + src: url("/fonts/OpenSans-SemiboldItalic-webfont.eot?#iefix") format("embedded-opentype"), + url("/fonts/OpenSans-SemiboldItalic-webfont.woff") format("woff"), + url("/fonts/OpenSans-SemiboldItalic-webfont.ttf") format("truetype"), + url("/fonts/OpenSans-SemiboldItalic-webfont.svg#OpenSansSemiboldItalic") format("svg"); + font-weight: 600; + font-style: italic; +} diff --git a/source/stylesheets/_variables.scss b/source/stylesheets/_variables.scss new file mode 100644 index 0000000..e8d7fa4 --- /dev/null +++ b/source/stylesheets/_variables.scss @@ -0,0 +1,34 @@ +$brand-primary: #669933; +$brand-success: #7bad23; +$brand-warning: #f0ad4e; +$brand-danger: #d9534f; +$brand-info: #5bc0de; + +// Typography +// ------------------------- + +$font-family-sans-serif: OpenSans, "Helvetica Neue", Helvetica, Arial, sans-serif; +$font-size-base: 16px; + +// Navbar +// ------------------------- + +// Basics of a navbar +$navbar-height: 60px; +$navbar-padding-vertical: 0; + +// Navbar links +$navbar-default-link-color: #444; +$navbar-default-link-hover-color: $brand-primary; + +// Navbar brand label +$navbar-default-brand-color: #555; +$navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%); + +// Navbar toggle +$navbar-default-toggle-hover-bg: $brand-success; +$navbar-default-toggle-icon-bar-bg: white; +$navbar-default-toggle-border-color: darken($brand-success, 5%); + +// Other +$link-color: $brand-primary; diff --git a/source/stylesheets/_wrapper.scss b/source/stylesheets/_wrapper.scss new file mode 100644 index 0000000..67cda49 --- /dev/null +++ b/source/stylesheets/_wrapper.scss @@ -0,0 +1,18 @@ +html, +body { + height: 100%; +} + +.wrap { + min-height: 100%; + height: auto !important; + height: 100%; + /* Negative indent footer by it's height */ + margin: 0 auto -80px; +} + +/* Set the fixed height of the footer here */ +.push, +body > footer { + height: 80px; +} diff --git a/source/stylesheets/application.css.scss b/source/stylesheets/application.css.scss new file mode 100644 index 0000000..7d14661 --- /dev/null +++ b/source/stylesheets/application.css.scss @@ -0,0 +1,342 @@ +@import "custom-bootstrap"; + +body { + padding-top: 65px; + background: url("/images/pattern/cream_dust.png"); + + @media (max-width: $screen-xs-max) { + font-size: 14px; + } + @media (min-width: $screen-sm) and (max-width: $screen-sm-max) { + font-size: 14px; + } + @media (min-width: $screen-md) and (max-width: $screen-md-max) { + font-size: 15px; + } +} + +a:hover { + text-decoration: none !important; +} + +.title { + text-align: center; + margin: 10px 0 60px 0; + font-size: 36px; + font-weight: bold +} + +.social { + a { + color: $link-color; + cursor: pointer; + margin: 0 8px; + font-size: 1.6em; + transition: color .2s; + } + a:hover { + color: #404040; + } +} + +.img-thumbnail { + padding: 10px; +} + +.logo path { + fill: none; + stroke: $brand-primary; + stroke-width: 5; +} + +.navbar { + margin-bottom: 0; + border-bottom: 5px solid $brand-primary; + background: url("/images/pattern/groovepaper.png"); + box-shadow: inset rgba(0,0,0,.6) 0 3px 3px -3px, rgba(0,0,0,.3) 0 3px 5px; +} + +.navbar-brand { + font: 28px/60px OpenSans, sans-serif; + font-weight: bold; +} + +.navbar-brand:hover .logo path { + stroke: darken($brand-primary, 10%); +} + +.navbar-nav { + font-weight: bold; + text-transform: uppercase; +} + +.navbar-toggle { + background-color: $brand-primary; +} + +section { + padding: 60px 20px 40px; +} + +#home { + background: #444; + text-align: center; + h2 { + color: white; + font: 3.6em/1 OpenSans, sans-serif; + font-weight: 600; + margin-bottom: 1em; + text-shadow: #000 0 -1px 0; + color: #c8c8c8; + strong { + color: #fff + } + } + + h3 { + color: white; + font: 2.4em/1.2 OpenSans, sans-serif; + font-weight: 600; + color: #909090; + text-shadow: #000 0 -1px 0; + } + + .btn { + font-size: 2em; + padding: .6em 1.8em; + margin: 40px 0 + } +} + +#service { + .ico-service { + font-size: 8em; + color: $brand-primary; + } + + h2 { + margin: 30px 0; + font-size: 1.7em; + } +} + +#quote { + text-align: center; + font: 1.25em OpenSans, sans-serif; + font-style: italic; + + .title { + font-size: 3.6em; + color: $brand-primary; + } + + .quote { + margin: 60px 0; + line-height: 1.5em + } + + .signature { + color: $brand-primary; + margin-top: 20px; + } + + img { + border: 3px solid lighten($brand-primary, 20%); + } +} + +#work { + background: #e8e8e8; + box-shadow: inset rgba(0,0,0,.2) 0 3px 5px -3px, inset rgba(0,0,0,.2) 0 -3px 5px -3px; + + .thumb { + margin-bottom: 60px; + } + + h4 { + font-size: 1.4em; + margin: 20px 0; + } + + h4 a { + color: $gray-dark; + } + p { + line-height: 1.5em + } +} + +#about { + background: #e8e8e8; + text-align: center; + box-shadow: inset rgba(0,0,0,.2) 0 3px 5px -3px, inset rgba(0,0,0,.2) 0 -3px 5px -3px; + + .figure { + margin-bottom: 40px; + text-align: center; + } + h4 { + margin: 20px 0; + font-size: 1.4em; + } + + .social { + margin-bottom: 20px; + } + p { + line-height: 1.5em; + } + .title { + border-color: lighten($link-color, 5%); + } +} + +#article { + padding-top: 0; + background: none; + + header { + margin: 40px 0 40px 0; + + h1 { + font-size: 25px; + } + + a, + a:hover { + color: $gray-dark; + } + } + + article { + margin: 40px 0 80px 0; + + p { + margin: 25px 0; + } + + code, + pre { + font-family: Inconsolata; + font-size: 16px; + } + + footer { + font-style: italic; + } + } + + .jumbotron { + margin-top: 80px; + + h1 { + line-height: 72px; + margin: 0; + } + + p { + margin: 25px 0; + } + } +} + +#community { + .community { + margin-bottom: 40px; + text-align: center; + h2 { + margin: 20px 0; + } + p { + line-height: 1.5em + } + } + .osi { + path { + fill: $brand-primary; + stroke: $brand-primary; + stroke-width: 5; + } + } + + .ruby { + path { + fill: none; + stroke: $brand-primary; + stroke-width: 5; + stroke-linejoin: round; + } + } + + .javascript { + path { + fill: $brand-primary; + } + path:nth-child(2) { + fill: lighten($brand-primary, 15%); + } + polygon { + fill: white; + } + } +} + +#contact { + background: #e8e8e8; + text-align: center; + box-shadow: inset rgba(0,0,0,.2) 0 3px 5px -3px; +} + +body > footer { + background: $gray-dark; + color: $gray-light; + line-height: 80px; + box-shadow: inset rgba(0,0,0,.7) 0 3px 5px -3px; + overflow: hidden; + + small { + font-size: 14px + } + + .footer-logo { + svg path { + fill: #999; + } + svg:hover path { + fill: #fff; + } + } + + .social { + a { + color: #999; + color: rgba(255,255,255,.6); + } + a:hover { + color: #fff; + } + } +} + +@media (min-width: $screen-md-min) { + .navbar-nav > li > a { + padding-top: 19px; + padding-bottom: 19px; + } + + #article { + header { + margin: 80px 0 40px 0; + + h1 { + font-size: 41px; + } + } + + article { + pre { + font-size: 15px; + } + } + } +} diff --git a/source/stylesheets/syntax.css b/source/stylesheets/syntax.css new file mode 100644 index 0000000..7e28440 --- /dev/null +++ b/source/stylesheets/syntax.css @@ -0,0 +1,63 @@ +/* Take from: https://github.com/richleland/pygments-css/blob/master/github.css */ + +.hll { background-color: #ffffcc } +.c { color: #999988; font-style: italic } /* Comment */ +.err { color: #a61717; background-color: #e3d2d2 } /* Error */ +.k { color: #000000; font-weight: bold } /* Keyword */ +.o { color: #000000; font-weight: bold } /* Operator */ +.cm { color: #999988; font-style: italic } /* Comment.Multiline */ +.cp { color: #999999; font-weight: bold; font-style: italic } /* Comment.Preproc */ +.c1 { color: #999988; font-style: italic } /* Comment.Single */ +.cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ +.gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ +.ge { color: #000000; font-style: italic } /* Generic.Emph */ +.gr { color: #aa0000 } /* Generic.Error */ +.gh { color: #999999 } /* Generic.Heading */ +.gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ +.go { color: #888888 } /* Generic.Output */ +.gp { color: #555555 } /* Generic.Prompt */ +.gs { font-weight: bold } /* Generic.Strong */ +.gu { color: #aaaaaa } /* Generic.Subheading */ +.gt { color: #aa0000 } /* Generic.Traceback */ +.kc { color: #000000; font-weight: bold } /* Keyword.Constant */ +.kd { color: #000000; font-weight: bold } /* Keyword.Declaration */ +.kn { color: #000000; font-weight: bold } /* Keyword.Namespace */ +.kp { color: #000000; font-weight: bold } /* Keyword.Pseudo */ +.kr { color: #000000; font-weight: bold } /* Keyword.Reserved */ +.kt { color: #445588; font-weight: bold } /* Keyword.Type */ +.m { color: #009999 } /* Literal.Number */ +.s { color: #d01040 } /* Literal.String */ +.na { color: #008080 } /* Name.Attribute */ +.nb { color: #0086B3 } /* Name.Builtin */ +.nc { color: #445588; font-weight: bold } /* Name.Class */ +.no { color: #008080 } /* Name.Constant */ +.nd { color: #3c5d5d; font-weight: bold } /* Name.Decorator */ +.ni { color: #800080 } /* Name.Entity */ +.ne { color: #990000; font-weight: bold } /* Name.Exception */ +.nf { color: #990000; font-weight: bold } /* Name.Function */ +.nl { color: #990000; font-weight: bold } /* Name.Label */ +.nn { color: #555555 } /* Name.Namespace */ +.nt { color: #000080 } /* Name.Tag */ +.nv { color: #008080 } /* Name.Variable */ +.ow { color: #000000; font-weight: bold } /* Operator.Word */ +.w { color: #bbbbbb } /* Text.Whitespace */ +.mf { color: #009999 } /* Literal.Number.Float */ +.mh { color: #009999 } /* Literal.Number.Hex */ +.mi { color: #009999 } /* Literal.Number.Integer */ +.mo { color: #009999 } /* Literal.Number.Oct */ +.sb { color: #d01040 } /* Literal.String.Backtick */ +.sc { color: #d01040 } /* Literal.String.Char */ +.sd { color: #d01040 } /* Literal.String.Doc */ +.s2 { color: #d01040 } /* Literal.String.Double */ +.se { color: #d01040 } /* Literal.String.Escape */ +.sh { color: #d01040 } /* Literal.String.Heredoc */ +.si { color: #d01040 } /* Literal.String.Interpol */ +.sx { color: #d01040 } /* Literal.String.Other */ +.sr { color: #009926 } /* Literal.String.Regex */ +.s1 { color: #d01040 } /* Literal.String.Single */ +.ss { color: #990073 } /* Literal.String.Symbol */ +.bp { color: #999999 } /* Name.Builtin.Pseudo */ +.vc { color: #008080 } /* Name.Variable.Class */ +.vg { color: #008080 } /* Name.Variable.Global */ +.vi { color: #008080 } /* Name.Variable.Instance */ +.il { color: #009999 } /* Literal.Number.Integer.Long */ diff --git a/source/stylesheets/wufoo.css.scss b/source/stylesheets/wufoo.css.scss new file mode 100644 index 0000000..ec1598a --- /dev/null +++ b/source/stylesheets/wufoo.css.scss @@ -0,0 +1,97 @@ +// Core variables and mixins +@import "bootstrap/variables"; +@import "variables"; +@import "bootstrap/mixins"; + +// Reset +@import "bootstrap/normalize"; + +// Core CSS +@import "bootstrap/scaffolding"; +@import "bootstrap/type"; +@import "bootstrap/forms"; +@import "bootstrap/buttons"; + +html.embed, +body { + background-color: transparent; +} + +a { + color: $brand-primary; +} + +a:hover { + text-decoration: none !important; +} + +#header, +#errorLi, +.instruct { + display: none; +} + +form { + font-family: $font-family-sans-serif !important; + font-size: 16px !important; + + li { + padding: 0 !important; + } + + li.focused, + li.error { + background: none !important; + } + + #saveForm { + @include button-variant(#ffffff, $brand-success, #6c981f); + @include button-size(6px, 12px, 16px, 1.42857143, 4px); + border: none; + } + + #fo1li6 { + div { + padding: 0 !important; + } + } + + #fo1li1 { + margin-bottom: 15px; + width: 100% !important; + label { + float: none; + } + div { + width: 100% !important; + } + #Field1 { + width: 100% !important; + padding: 6px; + height: 180px; + } + } + + #fo1li4 { + margin-bottom: 15px; + width: 100% !important; + label { + float: none; + } + div { + width: 100% !important; + } + #Field4 { + padding: 6px; + width: 100% !important; + } + } + + .buttons { + div { + width: 100% !important; + margin: 0 !important; + padding: 0 !important; + } + } +}