hullapp 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. data/.DS_Store +0 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +66 -0
  6. data/Rakefile +1 -0
  7. data/bin/hull +15 -0
  8. data/hullapp.gemspec +27 -0
  9. data/lib/hull.rb +6 -0
  10. data/lib/hull/cli.rb +124 -0
  11. data/lib/hull/version.rb +3 -0
  12. data/templates/.DS_Store +0 -0
  13. data/templates/hullenv.tt +4 -0
  14. data/templates/ruby/.gitignore +7 -0
  15. data/templates/ruby/.powenv +8 -0
  16. data/templates/ruby/.powrc +5 -0
  17. data/templates/ruby/.rvmrc.tt +1 -0
  18. data/templates/ruby/Gemfile +50 -0
  19. data/templates/ruby/Guardfile +8 -0
  20. data/templates/ruby/Procfile +4 -0
  21. data/templates/ruby/README.md +198 -0
  22. data/templates/ruby/Rakefile +40 -0
  23. data/templates/ruby/application/assets.rb +7 -0
  24. data/templates/ruby/application/assets/images/icons/facebook.png +0 -0
  25. data/templates/ruby/application/assets/images/icons/twitter.png +0 -0
  26. data/templates/ruby/application/assets/images/socialmedia/app-store.png +0 -0
  27. data/templates/ruby/application/assets/images/socialmedia/dribbble.png +0 -0
  28. data/templates/ruby/application/assets/images/socialmedia/facebook.png +0 -0
  29. data/templates/ruby/application/assets/images/socialmedia/flickr.png +0 -0
  30. data/templates/ruby/application/assets/images/socialmedia/forrst.png +0 -0
  31. data/templates/ruby/application/assets/images/socialmedia/foursquare.png +0 -0
  32. data/templates/ruby/application/assets/images/socialmedia/github.png +0 -0
  33. data/templates/ruby/application/assets/images/socialmedia/google-plus.png +0 -0
  34. data/templates/ruby/application/assets/images/socialmedia/google.png +0 -0
  35. data/templates/ruby/application/assets/images/socialmedia/instagram.png +0 -0
  36. data/templates/ruby/application/assets/images/socialmedia/linkedin.png +0 -0
  37. data/templates/ruby/application/assets/images/socialmedia/skype.png +0 -0
  38. data/templates/ruby/application/assets/images/socialmedia/social-email.png +0 -0
  39. data/templates/ruby/application/assets/images/socialmedia/social-rss.png +0 -0
  40. data/templates/ruby/application/assets/images/socialmedia/spotify.png +0 -0
  41. data/templates/ruby/application/assets/images/socialmedia/tumblr.png +0 -0
  42. data/templates/ruby/application/assets/images/socialmedia/twitter-2.png +0 -0
  43. data/templates/ruby/application/assets/images/socialmedia/twitter.png +0 -0
  44. data/templates/ruby/application/assets/images/socialmedia/vimeo.png +0 -0
  45. data/templates/ruby/application/assets/images/socialmedia/youtube.png +0 -0
  46. data/templates/ruby/application/assets/javascripts/app.js +11 -0
  47. data/templates/ruby/application/assets/javascripts/main.coffee +17 -0
  48. data/templates/ruby/application/assets/javascripts/template.js.erb +1 -0
  49. data/templates/ruby/application/assets/stylesheets/partials/_base.scss +17 -0
  50. data/templates/ruby/application/assets/stylesheets/partials/_boilerplate.scss +291 -0
  51. data/templates/ruby/application/assets/stylesheets/partials/_colors.scss +0 -0
  52. data/templates/ruby/application/assets/stylesheets/partials/_fonts.scss +1 -0
  53. data/templates/ruby/application/assets/stylesheets/partials/_h5bp.scss +298 -0
  54. data/templates/ruby/application/assets/stylesheets/partials/_layout.scss +12 -0
  55. data/templates/ruby/application/assets/stylesheets/partials/_normalize.scss +504 -0
  56. data/templates/ruby/application/assets/stylesheets/partials/_variables.scss +28 -0
  57. data/templates/ruby/application/assets/stylesheets/style.scss +16 -0
  58. data/templates/ruby/application/assets/templates/hello.hbs +1 -0
  59. data/templates/ruby/application/compass.rb +27 -0
  60. data/templates/ruby/application/core.rb +15 -0
  61. data/templates/ruby/application/core_extensions/blank.rb +111 -0
  62. data/templates/ruby/application/core_extensions/hash.rb +34 -0
  63. data/templates/ruby/application/core_extensions/sprockets.rb +74 -0
  64. data/templates/ruby/application/core_extensions/try.rb +57 -0
  65. data/templates/ruby/application/helpers.rb +121 -0
  66. data/templates/ruby/application/helpers/form_tag_helpers.rb +127 -0
  67. data/templates/ruby/application/helpers/notification_helpers.rb +20 -0
  68. data/templates/ruby/application/helpers/run_later.rb +111 -0
  69. data/templates/ruby/application/settings.rb +8 -0
  70. data/templates/ruby/application/views/demo.erb +27 -0
  71. data/templates/ruby/application/views/index.erb +9 -0
  72. data/templates/ruby/application/views/layout.erb +45 -0
  73. data/templates/ruby/application/workers.rb +0 -0
  74. data/templates/ruby/config.ru +84 -0
  75. data/templates/ruby/config/settings.yml +53 -0
  76. data/templates/ruby/config/sidekiq.yml +11 -0
  77. data/templates/ruby/config/unicorn.rb +91 -0
  78. data/templates/ruby/public/.htaccess +538 -0
  79. data/templates/ruby/public/404.html +157 -0
  80. data/templates/ruby/public/apple-touch-icon-114x114-precomposed.png +0 -0
  81. data/templates/ruby/public/apple-touch-icon-144x144-precomposed.png +0 -0
  82. data/templates/ruby/public/apple-touch-icon-57x57-precomposed.png +0 -0
  83. data/templates/ruby/public/apple-touch-icon-72x72-precomposed.png +0 -0
  84. data/templates/ruby/public/apple-touch-icon-precomposed.png +0 -0
  85. data/templates/ruby/public/apple-touch-icon.png +0 -0
  86. data/templates/ruby/public/crossdomain.xml +15 -0
  87. data/templates/ruby/public/favicon.ico +0 -0
  88. data/templates/ruby/public/humans.txt +15 -0
  89. data/templates/ruby/public/robots.txt +5 -0
  90. data/templates/ruby/vendor/assets/images/glyphicons-halflings-white.png +0 -0
  91. data/templates/ruby/vendor/assets/images/glyphicons-halflings.png +0 -0
  92. data/templates/ruby/vendor/assets/javascripts/backbone.js +1431 -0
  93. data/templates/ruby/vendor/assets/javascripts/bootstrap.js +2027 -0
  94. data/templates/ruby/vendor/assets/javascripts/index.js +0 -0
  95. data/templates/ruby/vendor/assets/javascripts/jquery.js +9227 -0
  96. data/templates/ruby/vendor/assets/javascripts/modernizr.js +11 -0
  97. data/templates/ruby/vendor/assets/javascripts/underscore.js +1059 -0
  98. data/templates/ruby/vendor/assets/javascripts/vendor.js +2 -0
  99. data/templates/ruby/vendor/assets/stylesheets/bootstrap-responsive.css +1040 -0
  100. data/templates/ruby/vendor/assets/stylesheets/bootstrap.css +5624 -0
  101. data/templates/ruby/vendor/assets/stylesheets/vendor.scss +2 -0
  102. metadata +243 -0
@@ -0,0 +1,40 @@
1
+ # Inspired from
2
+ # https://gist.github.com/1576435
3
+
4
+ require 'rubygems' if RUBY_VERSION < '1.9'
5
+ require 'bundler' # gem requires
6
+ require 'fileutils'
7
+ require 'rake'
8
+ require 'rake/sprocketstask'
9
+
10
+ PROJECT_ROOT = File.expand_path(File.dirname(__FILE__))
11
+ require './application/settings'
12
+ require './application/core_extensions/sprockets'
13
+
14
+ Bundler.require
15
+
16
+ %w(./application/settings ./application/core ./application/assets).each do |requirement|
17
+ require requirement
18
+ end
19
+
20
+
21
+ # The default, if you just run `rake` in this directory, will list all the available tasks
22
+ task :default do
23
+ puts "All available rake tasks"
24
+ system('rake -T')
25
+ end
26
+
27
+ desc "Start Unicorn in development mode and get memcached running"
28
+ task :s do
29
+ system("bundle exec foreman start")
30
+ end
31
+
32
+ desc "Precompile assets"
33
+ namespace :assets do
34
+
35
+ task :precompile do
36
+ puts "Precompiling assets...\n"
37
+ configure_sprockets :precompile => true
38
+ end
39
+
40
+ end
@@ -0,0 +1,7 @@
1
+ require "./application/core_extensions/sprockets"
2
+
3
+ set :sprockets, SPROCKETS
4
+ configure do
5
+ configure_sprockets
6
+ end
7
+
@@ -0,0 +1,11 @@
1
+ //= require template
2
+ //= require main
3
+
4
+ // Twitter widgets
5
+ !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src='http://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document,'script','twitter-wjs');
6
+
7
+ // Google Analytics
8
+ var _gaq=[['_setAccount','<?=Settings.google_analytics%>'],['_trackPageview']];
9
+ (function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
10
+ g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js';
11
+ s.parentNode.insertBefore(g,s)}(document,'script'));
@@ -0,0 +1,17 @@
1
+ # Avoid `console` errors in browsers that lack a console.
2
+ unless window.console and console.log
3
+ (->
4
+ noop = ->
5
+
6
+ methods = ["assert", "clear", "count", "debug", "dir", "dirxml", "error", "exception", "group", "groupCollapsed", "groupEnd", "info", "log", "markTimeline", "profile", "profileEnd", "markTimeline", "table", "time", "timeEnd", "timeStamp", "trace", "warn"]
7
+ length = methods.length
8
+ console = window.console = {}
9
+ console[methods[length]] = noop while length--
10
+ )()
11
+
12
+ body = {}
13
+
14
+ # woo jquery
15
+ jQuery ($) ->
16
+ # cache body reference. Faster lookups
17
+ body = $('body')
@@ -0,0 +1 @@
1
+ //=require_tree ../templates
@@ -0,0 +1,17 @@
1
+ /* baseline */
2
+ @include establish-baseline;
3
+
4
+ /* apply a natural box layout model to all elements */
5
+ * { @include box-sizing(border-box); }
6
+
7
+ /* styyyling */
8
+ body {
9
+ background: $bg-color;
10
+ color: $black;
11
+ font: {
12
+ family: "Helvetica Neue", Helvetica, Arial, sans-serif;
13
+ weight: 400;
14
+ }
15
+ padding: 0;
16
+ text-rendering: optimizeLegibility;
17
+ }
@@ -0,0 +1,291 @@
1
+ /*
2
+ * HTML5 Boilerplate
3
+ *
4
+ * What follows is the result of much research on cross-browser styling.
5
+ * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal,
6
+ * Kroc Camen, and the H5BP dev community and team.
7
+ */
8
+
9
+ /* ==========================================================================
10
+ Base styles: opinionated defaults
11
+ ========================================================================== */
12
+
13
+ html,
14
+ button,
15
+ input,
16
+ select,
17
+ textarea {
18
+ color: #222;
19
+ }
20
+
21
+ body {
22
+ font-size: 1em;
23
+ line-height: 1.4;
24
+ }
25
+
26
+ a {
27
+ color: #00e;
28
+ }
29
+
30
+ a:visited {
31
+ color: #551a8b;
32
+ }
33
+
34
+ a:hover {
35
+ color: #06e;
36
+ }
37
+
38
+ /*
39
+ * Remove text-shadow in selection highlight: h5bp.com/i
40
+ * These selection declarations have to be separate.
41
+ * Customize the background color to match your design.
42
+ */
43
+
44
+ ::-moz-selection {
45
+ background: #b3d4fc;
46
+ text-shadow: none;
47
+ }
48
+
49
+ ::selection {
50
+ background: #b3d4fc;
51
+ text-shadow: none;
52
+ }
53
+
54
+ /*
55
+ * A better looking default horizontal rule
56
+ */
57
+
58
+ hr {
59
+ display: block;
60
+ height: 1px;
61
+ border: 0;
62
+ border-top: 1px solid #ccc;
63
+ margin: 1em 0;
64
+ padding: 0;
65
+ }
66
+
67
+ /*
68
+ * Remove the gap between images and the bottom of their containers: h5bp.com/i/440
69
+ */
70
+
71
+ img {
72
+ vertical-align: middle;
73
+ }
74
+
75
+ /*
76
+ * Remove default fieldset styles.
77
+ */
78
+
79
+ fieldset {
80
+ border: 0;
81
+ margin: 0;
82
+ padding: 0;
83
+ }
84
+
85
+ /*
86
+ * Allow only vertical resizing of textareas.
87
+ */
88
+
89
+ textarea {
90
+ resize: vertical;
91
+ }
92
+
93
+ /* ==========================================================================
94
+ Chrome Frame prompt
95
+ ========================================================================== */
96
+
97
+ .chromeframe {
98
+ margin: 0.2em 0;
99
+ background: #ccc;
100
+ color: #000;
101
+ padding: 0.2em 0;
102
+ }
103
+
104
+ /* ==========================================================================
105
+ Author's custom styles
106
+ ========================================================================== */
107
+
108
+
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+
118
+
119
+
120
+
121
+
122
+
123
+
124
+ /* ==========================================================================
125
+ Helper classes
126
+ ========================================================================== */
127
+
128
+ /*
129
+ * Image replacement
130
+ */
131
+
132
+ .ir {
133
+ border: 0;
134
+ font: 0/0 a;
135
+ text-shadow: none;
136
+ color: transparent;
137
+ background-color: transparent;
138
+ }
139
+
140
+ /*
141
+ * Hide from both screenreaders and browsers: h5bp.com/u
142
+ */
143
+
144
+ .hidden {
145
+ display: none !important;
146
+ visibility: hidden;
147
+ }
148
+
149
+ /*
150
+ * Hide only visually, but have it available for screenreaders: h5bp.com/v
151
+ */
152
+
153
+ .visuallyhidden {
154
+ border: 0;
155
+ clip: rect(0 0 0 0);
156
+ height: 1px;
157
+ margin: -1px;
158
+ overflow: hidden;
159
+ padding: 0;
160
+ position: absolute;
161
+ width: 1px;
162
+ }
163
+
164
+ /*
165
+ * Extends the .visuallyhidden class to allow the element to be focusable
166
+ * when navigated to via the keyboard: h5bp.com/p
167
+ */
168
+
169
+ .visuallyhidden.focusable:active,
170
+ .visuallyhidden.focusable:focus {
171
+ clip: auto;
172
+ height: auto;
173
+ margin: 0;
174
+ overflow: visible;
175
+ position: static;
176
+ width: auto;
177
+ }
178
+
179
+ /*
180
+ * Hide visually and from screenreaders, but maintain layout
181
+ */
182
+
183
+ .invisible {
184
+ visibility: hidden;
185
+ }
186
+
187
+ /**
188
+ * Clearfix helper
189
+ * Used to contain floats: h5bp.com/q
190
+ */
191
+
192
+ .clearfix:before,
193
+ .clearfix:after {
194
+ content: "";
195
+ display: table;
196
+ }
197
+
198
+ .clearfix:after {
199
+ clear: both;
200
+ }
201
+
202
+ /*
203
+ * For IE 6/7 only
204
+ * Include this rule to trigger hasLayout and contain floats.
205
+ */
206
+
207
+ .clearfix {
208
+ *zoom: 1;
209
+ }
210
+
211
+ /* ==========================================================================
212
+ EXAMPLE Media Queries for Responsive Design.
213
+ Theses examples override the primary ('mobile first') styles.
214
+ Modify as content requires.
215
+ ========================================================================== */
216
+
217
+ @media only screen and (min-width: 35em) {
218
+ /* Style adjustments for viewports that meet the condition */
219
+ }
220
+
221
+ /* ==========================================================================
222
+ Print styles.
223
+ Inlined to avoid required HTTP connection: h5bp.com/r
224
+ ========================================================================== */
225
+
226
+ @media print {
227
+ * {
228
+ background: transparent !important;
229
+ color: #000 !important; /* Black prints faster: h5bp.com/s */
230
+ box-shadow:none !important;
231
+ text-shadow: none !important;
232
+ }
233
+
234
+ a,
235
+ a:visited {
236
+ text-decoration: underline;
237
+ }
238
+
239
+ a[href]:after {
240
+ content: " (" attr(href) ")";
241
+ }
242
+
243
+ abbr[title]:after {
244
+ content: " (" attr(title) ")";
245
+ }
246
+
247
+ /*
248
+ * Don't show links for images, or javascript/internal links
249
+ */
250
+
251
+ .ir a:after,
252
+ a[href^="javascript:"]:after,
253
+ a[href^="#"]:after {
254
+ content: "";
255
+ }
256
+
257
+ pre,
258
+ blockquote {
259
+ border: 1px solid #999;
260
+ page-break-inside: avoid;
261
+ }
262
+
263
+ thead {
264
+ display: table-header-group; /* h5bp.com/t */
265
+ }
266
+
267
+ tr,
268
+ img {
269
+ page-break-inside: avoid;
270
+ }
271
+
272
+ img {
273
+ max-width: 100% !important;
274
+ }
275
+
276
+ @page {
277
+ margin: 0.5cm;
278
+ }
279
+
280
+ p,
281
+ h2,
282
+ h3 {
283
+ orphans: 3;
284
+ widows: 3;
285
+ }
286
+
287
+ h2,
288
+ h3 {
289
+ page-break-after: avoid;
290
+ }
291
+ }
@@ -0,0 +1 @@
1
+ // @import 'fonts/font_name/stylesheet'
@@ -0,0 +1,298 @@
1
+ /*
2
+ * HTML5 Boilerplate
3
+ *
4
+ * What follows is the result of much research on cross-browser styling.
5
+ * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal,
6
+ * Kroc Camen, and the H5BP dev community and team.
7
+ */
8
+
9
+ /* ==========================================================================
10
+ Base styles: opinionated defaults
11
+ ========================================================================== */
12
+
13
+ html,
14
+ button,
15
+ input,
16
+ select,
17
+ textarea {
18
+ color: #222;
19
+ }
20
+
21
+ body {
22
+ font-size: 1em;
23
+ line-height: 1.4;
24
+ }
25
+
26
+ /*
27
+ * Remove text-shadow in selection highlight: h5bp.com/i
28
+ * These selection declarations have to be separate.
29
+ * Customize the background color to match your design.
30
+ */
31
+
32
+ ::-moz-selection {
33
+ background: #b3d4fc;
34
+ text-shadow: none;
35
+ }
36
+
37
+ ::selection {
38
+ background: #b3d4fc;
39
+ text-shadow: none;
40
+ }
41
+
42
+ /*
43
+ * A better looking default horizontal rule
44
+ */
45
+
46
+ hr {
47
+ display: block;
48
+ height: 1px;
49
+ border: 0;
50
+ border-top: 1px solid #ccc;
51
+ margin: 1em 0;
52
+ padding: 0;
53
+ }
54
+
55
+ /*
56
+ * Remove the gap between images and the bottom of their containers: h5bp.com/i/440
57
+ */
58
+
59
+ img {
60
+ vertical-align: middle;
61
+ }
62
+
63
+ /*
64
+ * Remove default fieldset styles.
65
+ */
66
+
67
+ fieldset {
68
+ border: 0;
69
+ margin: 0;
70
+ padding: 0;
71
+ }
72
+
73
+ /*
74
+ * Allow only vertical resizing of textareas.
75
+ */
76
+
77
+ textarea {
78
+ resize: vertical;
79
+ }
80
+
81
+ /* ==========================================================================
82
+ Chrome Frame prompt
83
+ ========================================================================== */
84
+
85
+ .chromeframe {
86
+ margin: 0.2em 0;
87
+ background: #ccc;
88
+ color: #000;
89
+ padding: 0.2em 0;
90
+ }
91
+
92
+ /* ==========================================================================
93
+ Author's custom styles
94
+ ========================================================================== */
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+
108
+
109
+
110
+
111
+
112
+ /* ==========================================================================
113
+ Helper classes
114
+ ========================================================================== */
115
+
116
+ /*
117
+ * Image replacement
118
+ */
119
+
120
+ .ir {
121
+ background-color: transparent;
122
+ border: 0;
123
+ overflow: hidden;
124
+ /* IE 6/7 fallback */
125
+ *text-indent: -9999px;
126
+ }
127
+
128
+ .ir:before {
129
+ content: "";
130
+ display: block;
131
+ width: 0;
132
+ height: 100%;
133
+ }
134
+
135
+ /*
136
+ * Hide from both screenreaders and browsers: h5bp.com/u
137
+ */
138
+
139
+ .hidden {
140
+ display: none !important;
141
+ visibility: hidden;
142
+ }
143
+
144
+ /*
145
+ * Hide only visually, but have it available for screenreaders: h5bp.com/v
146
+ */
147
+
148
+ .visuallyhidden {
149
+ border: 0;
150
+ clip: rect(0 0 0 0);
151
+ height: 1px;
152
+ margin: -1px;
153
+ overflow: hidden;
154
+ padding: 0;
155
+ position: absolute;
156
+ width: 1px;
157
+ }
158
+
159
+ /*
160
+ * Extends the .visuallyhidden class to allow the element to be focusable
161
+ * when navigated to via the keyboard: h5bp.com/p
162
+ */
163
+
164
+ .visuallyhidden.focusable:active,
165
+ .visuallyhidden.focusable:focus {
166
+ clip: auto;
167
+ height: auto;
168
+ margin: 0;
169
+ overflow: visible;
170
+ position: static;
171
+ width: auto;
172
+ }
173
+
174
+ /*
175
+ * Hide visually and from screenreaders, but maintain layout
176
+ */
177
+
178
+ .invisible {
179
+ visibility: hidden;
180
+ }
181
+
182
+ /*
183
+ * Clearfix: contain floats
184
+ *
185
+ * For modern browsers
186
+ * 1. The space content is one way to avoid an Opera bug when the
187
+ * `contenteditable` attribute is included anywhere else in the document.
188
+ * Otherwise it causes space to appear at the top and bottom of elements
189
+ * that receive the `clearfix` class.
190
+ * 2. The use of `table` rather than `block` is only necessary if using
191
+ * `:before` to contain the top-margins of child elements.
192
+ */
193
+
194
+ .clearfix:before,
195
+ .clearfix:after {
196
+ content: " "; /* 1 */
197
+ display: table; /* 2 */
198
+ }
199
+
200
+ .clearfix:after {
201
+ clear: both;
202
+ }
203
+
204
+ /*
205
+ * For IE 6/7 only
206
+ * Include this rule to trigger hasLayout and contain floats.
207
+ */
208
+
209
+ .clearfix {
210
+ *zoom: 1;
211
+ }
212
+
213
+ /* ==========================================================================
214
+ EXAMPLE Media Queries for Responsive Design.
215
+ Theses examples override the primary ('mobile first') styles.
216
+ Modify as content requires.
217
+ ========================================================================== */
218
+
219
+ @media only screen and (min-width: 35em) {
220
+ /* Style adjustments for viewports that meet the condition */
221
+ }
222
+
223
+ @media only screen and (-webkit-min-device-pixel-ratio: 1.5),
224
+ only screen and (min-resolution: 144dpi) {
225
+ /* Style adjustments for high resolution devices */
226
+ }
227
+
228
+ /* ==========================================================================
229
+ Print styles.
230
+ Inlined to avoid required HTTP connection: h5bp.com/r
231
+ ========================================================================== */
232
+
233
+ @media print {
234
+ * {
235
+ background: transparent !important;
236
+ color: #000 !important; /* Black prints faster: h5bp.com/s */
237
+ box-shadow:none !important;
238
+ text-shadow: none !important;
239
+ }
240
+
241
+ a,
242
+ a:visited {
243
+ text-decoration: underline;
244
+ }
245
+
246
+ a[href]:after {
247
+ content: " (" attr(href) ")";
248
+ }
249
+
250
+ abbr[title]:after {
251
+ content: " (" attr(title) ")";
252
+ }
253
+
254
+ /*
255
+ * Don't show links for images, or javascript/internal links
256
+ */
257
+
258
+ .ir a:after,
259
+ a[href^="javascript:"]:after,
260
+ a[href^="#"]:after {
261
+ content: "";
262
+ }
263
+
264
+ pre,
265
+ blockquote {
266
+ border: 1px solid #999;
267
+ page-break-inside: avoid;
268
+ }
269
+
270
+ thead {
271
+ display: table-header-group; /* h5bp.com/t */
272
+ }
273
+
274
+ tr,
275
+ img {
276
+ page-break-inside: avoid;
277
+ }
278
+
279
+ img {
280
+ max-width: 100% !important;
281
+ }
282
+
283
+ @page {
284
+ margin: 0.5cm;
285
+ }
286
+
287
+ p,
288
+ h2,
289
+ h3 {
290
+ orphans: 3;
291
+ widows: 3;
292
+ }
293
+
294
+ h2,
295
+ h3 {
296
+ page-break-after: avoid;
297
+ }
298
+ }