infractores 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. checksums.yaml +7 -0
  2. data/.env.sample +8 -0
  3. data/.gitignore +22 -0
  4. data/.travis.yml +14 -0
  5. data/CODE_OF_CONDUCT.md +49 -0
  6. data/Gemfile +67 -0
  7. data/Gemfile.lock +417 -0
  8. data/Guardfile +8 -0
  9. data/LICENSE +21 -0
  10. data/Procfile +2 -0
  11. data/README.md +48 -0
  12. data/Rakefile +6 -0
  13. data/app/assets/images/.keep +0 -0
  14. data/app/assets/images/gallery-buttons.png +0 -0
  15. data/app/assets/images/logo-infractores.svg +10 -0
  16. data/app/assets/javascripts/application.js +18 -0
  17. data/app/assets/javascripts/bootstrap.js +4 -0
  18. data/app/assets/javascripts/index.js +82 -0
  19. data/app/assets/javascripts/twitter.js +18 -0
  20. data/app/assets/stylesheets/1-utilities/_variables.scss +12 -0
  21. data/app/assets/stylesheets/2-quarks/_typography.scss +32 -0
  22. data/app/assets/stylesheets/3-atoms/_buttons.scss +3 -0
  23. data/app/assets/stylesheets/4-molecules/_footer.scss +32 -0
  24. data/app/assets/stylesheets/4-molecules/_infraction-gallery.scss +101 -0
  25. data/app/assets/stylesheets/4-molecules/_navbar.scss +71 -0
  26. data/app/assets/stylesheets/5-pages/index.scss +165 -0
  27. data/app/assets/stylesheets/5-pages/show.scss +29 -0
  28. data/app/assets/stylesheets/application.css +18 -0
  29. data/app/assets/stylesheets/bootstrap_and_overrides.css +7 -0
  30. data/app/controllers/application_controller.rb +5 -0
  31. data/app/controllers/concerns/.keep +0 -0
  32. data/app/controllers/infractions_controller.rb +23 -0
  33. data/app/controllers/users_controller.rb +7 -0
  34. data/app/helpers/application_helper.rb +19 -0
  35. data/app/helpers/infractions_helper.rb +6 -0
  36. data/app/mailers/.keep +0 -0
  37. data/app/models/.keep +0 -0
  38. data/app/models/concerns/.keep +0 -0
  39. data/app/models/evidence.rb +23 -0
  40. data/app/models/infraction.rb +43 -0
  41. data/app/models/tweet.rb +54 -0
  42. data/app/models/user.rb +34 -0
  43. data/app/services/twitter_service.rb +51 -0
  44. data/app/uploaders/evidence_uploader.rb +62 -0
  45. data/app/views/infractions/_map.html.erb +17 -0
  46. data/app/views/infractions/_reported_by.html.erb +4 -0
  47. data/app/views/infractions/_summary.html.erb +23 -0
  48. data/app/views/infractions/index.html.erb +18 -0
  49. data/app/views/infractions/show.html.erb +24 -0
  50. data/app/views/layouts/application.html.erb +90 -0
  51. data/app/views/shared/_google_analytics.html.erb +12 -0
  52. data/app/views/users/index.html.erb +21 -0
  53. data/app/workers/tweet_inspector.rb +18 -0
  54. data/bin/bundle +3 -0
  55. data/bin/rails +8 -0
  56. data/bin/rake +8 -0
  57. data/bin/setup +29 -0
  58. data/bin/spring +15 -0
  59. data/config.ru +4 -0
  60. data/config/application.rb +27 -0
  61. data/config/boot.rb +3 -0
  62. data/config/database.yml.sample +85 -0
  63. data/config/environment.rb +5 -0
  64. data/config/environments/development.rb +50 -0
  65. data/config/environments/production.rb +79 -0
  66. data/config/environments/test.rb +42 -0
  67. data/config/initializers/assets.rb +15 -0
  68. data/config/initializers/backtrace_silencers.rb +7 -0
  69. data/config/initializers/carrierwave.rb +17 -0
  70. data/config/initializers/cookies_serializer.rb +3 -0
  71. data/config/initializers/filter_parameter_logging.rb +4 -0
  72. data/config/initializers/inflections.rb +16 -0
  73. data/config/initializers/mime_types.rb +4 -0
  74. data/config/initializers/session_store.rb +3 -0
  75. data/config/initializers/twitter.rb +1 -0
  76. data/config/initializers/wrap_parameters.rb +14 -0
  77. data/config/locales/en.bootstrap.yml +23 -0
  78. data/config/locales/en.yml +23 -0
  79. data/config/locales/es.yml +263 -0
  80. data/config/routes.rb +6 -0
  81. data/config/secrets.yml +22 -0
  82. data/db/migrate/20150824210535_add_tweets_table.rb +8 -0
  83. data/db/migrate/20150829133406_create_infractions.rb +11 -0
  84. data/db/migrate/20150829134520_create_users.rb +12 -0
  85. data/db/migrate/20150829141909_add_user_id_to_tweets.rb +5 -0
  86. data/db/migrate/20150829154430_create_locations.rb +10 -0
  87. data/db/migrate/20150830224603_create_evidences_table.rb +8 -0
  88. data/db/migrate/20150911020838_add_valid_column_to_infractions.rb +6 -0
  89. data/db/migrate/20150911025204_add_index_to_users_username.rb +5 -0
  90. data/db/migrate/20151102220702_add_lat_lon_to_infractions.rb +6 -0
  91. data/db/migrate/20151102221811_remove_locations.rb +5 -0
  92. data/db/migrate/20151117194703_add_reported_at_to_infractions.rb +5 -0
  93. data/db/migrate/20160229023500_change_lat_lon_precision.rb +6 -0
  94. data/db/seeds.rb +7 -0
  95. data/infractores.gemspec +25 -0
  96. data/lib/assets/.keep +0 -0
  97. data/lib/infractores.rb +1 -0
  98. data/lib/infractores/version.rb +3 -0
  99. data/lib/tasks/.keep +0 -0
  100. data/lib/tasks/twitter.rake +16 -0
  101. data/lib/tasks/users.rake +9 -0
  102. data/log/.keep +0 -0
  103. data/public/404.html +67 -0
  104. data/public/422.html +67 -0
  105. data/public/500.html +66 -0
  106. data/public/favicon.ico +0 -0
  107. data/public/robots.txt +5 -0
  108. data/vendor/assets/images/blank.gif +0 -0
  109. data/vendor/assets/images/fancybox_loading.gif +0 -0
  110. data/vendor/assets/images/fancybox_loading@2x.gif +0 -0
  111. data/vendor/assets/images/fancybox_overlay.png +0 -0
  112. data/vendor/assets/images/fancybox_sprite.png +0 -0
  113. data/vendor/assets/images/fancybox_sprite@2x.png +0 -0
  114. data/vendor/assets/images/glyphicons-halflings-white.png +0 -0
  115. data/vendor/assets/images/glyphicons-halflings.png +0 -0
  116. data/vendor/assets/javascripts/.keep +0 -0
  117. data/vendor/assets/javascripts/jquery.fancybox-buttons.js +122 -0
  118. data/vendor/assets/javascripts/jquery.fancybox.pack.js +46 -0
  119. data/vendor/assets/javascripts/livereload.js +1183 -0
  120. data/vendor/assets/stylesheets/.keep +0 -0
  121. data/vendor/assets/stylesheets/jquery.fancybox-buttons.css +97 -0
  122. data/vendor/assets/stylesheets/jquery.fancybox.css +274 -0
  123. metadata +215 -0
@@ -0,0 +1,8 @@
1
+ guard 'livereload' do
2
+ watch(%r{app/views/.+\.(erb|haml|slim)})
3
+ watch(%r{app/helpers/.+\.rb})
4
+ watch(%r{public/.+\.(css|js|html)})
5
+ watch(%r{config/locales/.+\.yml})
6
+ # Rails Assets Pipeline
7
+ watch(%r{(app|vendor)(/assets/\w+/(.+\.(scss|js|html))).*}) { |m| "/assets/#{m[3]}" }
8
+ end
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 OmbuLabs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,2 @@
1
+ web: bundle exec thin start -p $PORT
2
+ worker: bundle exec sidekiq -c 5 -v
@@ -0,0 +1,48 @@
1
+ # Infractores
2
+
3
+ Infractores is a tool that lets anyone with a Twitter account report a parking
4
+ violation with a tweet.
5
+
6
+ The violations are recorded and placed in a map along with evidence supporting
7
+ the report.
8
+
9
+ ## Considerations
10
+
11
+ The project uses a Twitter application to find the tweets that describe a
12
+ violation. It also uses Amazon Web Services to store the evidence related to the
13
+ violation.
14
+
15
+ ### Requirements
16
+
17
+ * Postgres 9.4.1+
18
+ * Redis 3.0.1+
19
+ * Ruby 2.2.1
20
+
21
+ ## Setup
22
+
23
+ ### Setup your environment
24
+
25
+ cp .env.sample .env
26
+
27
+ You **must enter** your AWS and Twitter credentials in this file.
28
+
29
+ ### Setup your database
30
+
31
+ rake db:create db:migrate
32
+
33
+ ### Get parking violations from Twitter
34
+
35
+ rake twitter:download_tweets
36
+
37
+ This task will download all the mentions for the user associated with the
38
+ Twitter credentials and its hashtag, for example: [#InfractoresBA](https://twitter.com/hashtag/infractoresba?f=tweets&src=hash)
39
+
40
+ ## Start
41
+
42
+ foreman start
43
+
44
+ This will start the Rails server and a Sidekiq worker to process the tweets.
45
+
46
+ ## License
47
+
48
+ See: [MIT License](LICENSE).
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require File.expand_path('../config/application', __FILE__)
5
+
6
+ Rails.application.load_tasks
File without changes
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+ width="218.25px" height="73.333px" viewBox="0 0 218.25 73.333" enable-background="new 0 0 218.25 73.333" xml:space="preserve">
6
+ <text transform="matrix(0.9953 -0.0973 0.0973 0.9953 22.3145 53.2031)" fill="#F7685C" font-family="'Rubik-Medium'" font-size="26">InfractoresBA</text>
7
+ <rect x="4.039" y="13.107" transform="matrix(0.9953 -0.0973 0.0973 0.9953 -3.0448 10.7845)" fill="none" stroke="#F7685C" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="210" height="47"/>
8
+ <text transform="matrix(1 0 0 1 479.8232 -62.4219)" fill="#F7685C" font-family="'Rubik-Medium'" font-size="26">InfractoresBA</text>
9
+ <rect x="462.75" y="-94" fill="none" stroke="#F7685C" stroke-width="3" stroke-miterlimit="10" width="210" height="47"/>
10
+ </svg>
@@ -0,0 +1,18 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require jquery
14
+ //= require jquery_ujs
15
+ //= require twitter/bootstrap
16
+ //= require jquery.fancybox.pack
17
+ //= require jquery.fancybox-buttons
18
+ //= require_tree .
@@ -0,0 +1,4 @@
1
+ jQuery(function() {
2
+ $("a[rel~=popover], .has-popover").popover();
3
+ $("a[rel~=tooltip], .has-tooltip").tooltip();
4
+ });
@@ -0,0 +1,82 @@
1
+ $(document).ready(function(){
2
+ var redMarker = 'http://maps.gstatic.com/mapfiles/markers2/marker.png';
3
+ var blueMarker = 'http://maps.gstatic.com/mapfiles/markers2/boost-marker-mapview.png';
4
+ var allMarkers = [];
5
+
6
+ $(".fancybox").fancybox({
7
+ openEffect : 'none',
8
+ closeEffect : 'none'
9
+ });
10
+
11
+ $( "h4 a.see-map" ).click(function(evt) {
12
+ event.preventDefault();
13
+ var infractionId = $(this).data().infractionId;
14
+ $("#map_canvas_" + infractionId).toggle();
15
+ var initMap = "initialize_" + infractionId;
16
+ window[initMap]();
17
+ });
18
+
19
+ $( "#info, #close" ).click(function(event) {
20
+ event.preventDefault();
21
+ $("body").toggleClass("overflow");
22
+ $("#description").toggle();
23
+ });
24
+
25
+ function resetMapAndPaintMarker(myMarker) {
26
+ $.each(allMarkers, function(i, marker) {
27
+ marker.setIcon(redMarker)
28
+ });
29
+ myMarker.setIcon(blueMarker);
30
+ }
31
+
32
+ function scrollToInfraction(infractionDiv) {
33
+ $('html, body').animate({
34
+ scrollTop: $(infractionDiv).offset().top
35
+ }, 300);
36
+ };
37
+
38
+ function scrollToPermalinkInfraction() {
39
+ var infraction = window.location.hash;
40
+ if(infraction != "") {
41
+ infraction = infraction.replace("#", "#ver-");
42
+ $(infraction).click();
43
+ }
44
+ }
45
+
46
+ function initializeMainMap() {
47
+ var myLatLng = {lat: -34.592894, lng: -58.452826 };
48
+ var mapCanvas = document.getElementById('map_canvas_main');
49
+ var mapOptions = {
50
+ center: myLatLng,
51
+ zoom: 13,
52
+ mapTypeId: google.maps.MapTypeId.ROADMAP
53
+ }
54
+ var map = new google.maps.Map(mapCanvas, mapOptions);
55
+ $.each(infractionMarkers, function(i, markerData) {
56
+ var latitude = parseFloat(markerData[0]);
57
+ var longitude = parseFloat(markerData[1]);
58
+ var infractionDiv = "#infraccion-" + markerData[2];
59
+ var latLng = new google.maps.LatLng(latitude, longitude);
60
+ var marker = new google.maps.Marker({
61
+ map: map,
62
+ position: latLng,
63
+ icon: redMarker
64
+ });
65
+ allMarkers.push(marker);
66
+ google.maps.event.addListener(marker, 'click', function() {
67
+ scrollToInfraction(infractionDiv);
68
+ window.location = "/" + infractionDiv;
69
+ resetMapAndPaintMarker(marker);
70
+ });
71
+ $("#ver-infraccion-" + markerData[2]).click(function(evt) {
72
+ scrollToInfraction(infractionDiv);
73
+ map.panTo(latLng);
74
+ map.setZoom(18);
75
+ resetMapAndPaintMarker(marker);
76
+ });
77
+ });
78
+ scrollToPermalinkInfraction();
79
+ }
80
+ google.maps.event.addDomListener(window, 'load', initializeMainMap);
81
+
82
+ });
@@ -0,0 +1,18 @@
1
+ window.onload = (function(){
2
+
3
+ $('.tweet').each(function(index, value) {
4
+ var tweet = value;
5
+ var id = tweet.getAttribute("tweetID");
6
+
7
+ twttr.widgets.createTweet(
8
+ id, tweet,
9
+ {
10
+ conversation : 'none', // or all
11
+ cards : 'hidden', // or visible
12
+ linkColor : '#cc0000', // default is blue
13
+ theme : 'light' // or dark
14
+ }
15
+ )
16
+ });
17
+
18
+ });
@@ -0,0 +1,12 @@
1
+ /* Colors */
2
+
3
+ $light_yellow: #F9F7EF;
4
+ $yellow: #FCE67A;
5
+ $blue: #253956;
6
+ $light_blue: #C7E2E5;
7
+ $dark_grey: #414141;
8
+ $light_grey: #969696;
9
+ $black: #1C1C1C;
10
+ $white: #fff;
11
+ $red: #F7685C;
12
+ $light_red: #FFDCD9;
@@ -0,0 +1,32 @@
1
+ /* Colors */
2
+
3
+ @import "1-utilities/variables";
4
+
5
+ body {
6
+ font-family: 'Rubik', 'Helvetica', 'Arial', sans-serif;
7
+ font-size: 12px;
8
+ line-height: 1.5;
9
+ margin-top: 0px;
10
+ color: $black;
11
+ background-color: $red;
12
+ }
13
+ h1{
14
+ font-size: 36px;
15
+ }
16
+ h2{
17
+ font-size: 24px;
18
+ }
19
+ h3{
20
+ font-size: 20px;
21
+ }
22
+ h4{
23
+ font-size: 14px;
24
+ }
25
+ a{
26
+ color: $red;
27
+ font-weight: 400;
28
+ &:hover{
29
+ color: $red;
30
+ text-decoration: underline;
31
+ }
32
+ }
@@ -0,0 +1,3 @@
1
+ /* Colors */
2
+
3
+ @import "1-utilities/variables";
@@ -0,0 +1,32 @@
1
+ /* Colors */
2
+
3
+ @import "1-utilities/variables";
4
+
5
+ footer{
6
+ position: relative;
7
+ z-index: 1;
8
+ width: 50%;
9
+ max-width: 550px;
10
+ background-color: $yellow;
11
+ padding: 2em 1em;
12
+ text-align: center;
13
+ p.pull-right{
14
+ margin: 0;
15
+ float: none !important;
16
+ margin-bottom: 20px;
17
+ a{
18
+ background: $red;
19
+ padding: 10px;
20
+ color: $yellow;
21
+ -webkit-border-radius: 50px;
22
+ -moz-border-radius: 50px;
23
+ border-radius: 50px;
24
+ }
25
+ }
26
+ }
27
+ @media screen and (max-width: 768px){
28
+ footer{
29
+ max-width: none;
30
+ width: 100%;
31
+ }
32
+ }
@@ -0,0 +1,101 @@
1
+ /* Infraction's slider */
2
+
3
+ @import "1-utilities/variables";
4
+
5
+ .gallery-container{
6
+ margin: 2%;
7
+ overflow: hidden;
8
+ h4{
9
+ margin-left: 2%;
10
+ }
11
+ .main-gallery-test{
12
+ margin-left: 2%;
13
+ a.fancybox{
14
+ cursor: pointer;
15
+ display: block !important;
16
+ position: relative;
17
+ position: relative;
18
+ float: left;
19
+ width: 32%;
20
+ margin: 0 1% 1% 0;
21
+ height: 100px;
22
+ overflow: hidden;
23
+ img{
24
+ width: 100%
25
+ }
26
+ &:before{
27
+ opacity: 0;
28
+ content: "\f00e";
29
+ font-family: 'FontAwesome';
30
+ position: absolute;
31
+ top: 43%;
32
+ left: 40%;
33
+ width: 30px;
34
+ background-color: #FCE67A;
35
+ -webkit-border-radius: 4px;
36
+ -moz-border-radius: 4px;
37
+ border-radius: 16px;
38
+ font-size: 16px;
39
+ text-align: center;
40
+ border: 3px solid #FCE67A;
41
+ }
42
+ &:hover{
43
+ &:before{
44
+ opacity: 1;
45
+ }
46
+ }
47
+ }
48
+ }
49
+ }
50
+ #fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span{
51
+ background: image-url("gallery-buttons.png");
52
+ }
53
+ #fancybox-loading{
54
+ background-position: 0 -130px;
55
+ }
56
+ .fancybox-prev span, .fancybox-next span{
57
+ height: 44px;
58
+ width: 44px;
59
+ }
60
+ .fancybox-next span{
61
+ background-position: 0 -45px;
62
+ }
63
+ .fancybox-prev span{
64
+ background-position: 0 -88px;
65
+ }
66
+ .fancybox-close{
67
+ height: 44px;
68
+ width: 44px;
69
+ top: 0;
70
+ right: 0;
71
+ }
72
+ .fancybox-skin{
73
+ background: $yellow;
74
+ }
75
+ .fancybox-nav span{
76
+ visibility: visible;
77
+ }
78
+ .fancybox-inner:before{
79
+ content: "";
80
+ position: absolute;
81
+ background: image-url("logo-infractores.svg");
82
+ background-size: 100%;
83
+ width: 130px;
84
+ height: 43px;
85
+ background-repeat: no-repeat;
86
+ bottom: 0;
87
+ right: 0;
88
+ margin: 10px;
89
+ }
90
+
91
+ @media screen and (max-width: 500px){
92
+ .gallery-container{
93
+ .main-gallery-test{
94
+ margin-left: 2%;
95
+ a.fancybox{
96
+ width: 49%;
97
+ height: 80px;
98
+ }
99
+ }
100
+ }
101
+ }
@@ -0,0 +1,71 @@
1
+ /* Colors */
2
+
3
+ @import "1-utilities/variables";
4
+
5
+ .navbar-inverse{
6
+ background: $blue;
7
+ border-radius: 0;
8
+ position: fixed;
9
+ z-index: 100;
10
+ top: 0;
11
+ //-webkit-box-shadow: rgba(0,0,0,0.3) 0 2px 3px;
12
+ //-moz-box-shadow: rgba(0,0,0,0.3) 0 2px 3px;
13
+ //box-shadow: rgba(0,0,0,0.3) 0 2px 3px;
14
+ padding: 1em 1em 0 1em;
15
+ border: 0;
16
+ max-width: 550px;
17
+ width: 50%;
18
+ .navbar-inner{
19
+ width: 90%;
20
+ margin: auto;
21
+ min-height: 40px;
22
+ }
23
+ .brand{
24
+ color: $red;
25
+ font-size: 18px;
26
+ margin: 0;
27
+ background-color: $red;
28
+ float: left;
29
+ padding: 5px 10px;
30
+ a{
31
+ color: $blue;
32
+ &:hover{
33
+ text-decoration: none;
34
+ }
35
+ }
36
+ }
37
+ #info{
38
+ line-height: 32px;
39
+ float: right;
40
+ font-size: 14px;
41
+ color: $white;
42
+ &:hover{
43
+ color: $red;
44
+ text-decoration: none;
45
+ }
46
+ }
47
+ }
48
+ #description{
49
+ display: none;
50
+ background-color: $light_yellow;
51
+ padding: 5%;
52
+ color: $blue;
53
+ line-height: 24px;
54
+ font-size: 14px;
55
+ position: fixed;
56
+ z-index: 2;
57
+ top: 52px;
58
+ height: 100%;
59
+ width: 50%;
60
+ max-width: 550px;
61
+ }
62
+
63
+ @media screen and (max-width:768px){
64
+ .navbar-inverse, #description{
65
+ width: 100%;
66
+ max-width: none;
67
+ &#description{
68
+ padding: 7%;
69
+ }
70
+ }
71
+ }