rollout_ui 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. data/README.markdown +70 -0
  2. data/Rakefile +12 -0
  3. data/lib/rollout_ui.rb +25 -0
  4. data/lib/rollout_ui/engine/Rakefile +12 -0
  5. data/lib/rollout_ui/engine/app/assets/images/rollout_ui/dark_brick_wall.png +0 -0
  6. data/lib/rollout_ui/engine/app/assets/images/rollout_ui/rollout.png +0 -0
  7. data/lib/rollout_ui/engine/app/assets/javascripts/rollout_ui/application.js +9 -0
  8. data/lib/rollout_ui/engine/app/assets/stylesheets/rollout_ui/application.css +9 -0
  9. data/lib/rollout_ui/engine/app/assets/stylesheets/rollout_ui/layout.css +108 -0
  10. data/lib/rollout_ui/engine/app/controllers/rollout_ui/application_controller.rb +4 -0
  11. data/lib/rollout_ui/engine/app/controllers/rollout_ui/features_controller.rb +25 -0
  12. data/lib/rollout_ui/engine/app/helpers/rollout_ui/application_helper.rb +4 -0
  13. data/lib/rollout_ui/engine/app/views/layouts/rollout_ui/application.html.erb +29 -0
  14. data/lib/rollout_ui/engine/app/views/rollout_ui/features/_feature.html.erb +34 -0
  15. data/lib/rollout_ui/engine/app/views/rollout_ui/features/index.html.erb +14 -0
  16. data/lib/rollout_ui/engine/config/routes.rb +5 -0
  17. data/lib/rollout_ui/engine/lib/rollout_ui/engine.rb +5 -0
  18. data/lib/rollout_ui/engine/lib/tasks/rollout_ui_tasks.rake +4 -0
  19. data/lib/rollout_ui/engine/script/rails +6 -0
  20. data/lib/rollout_ui/engine/vendor/assets/images/rollout_ui/chosen-sprite.png +0 -0
  21. data/lib/rollout_ui/engine/vendor/assets/javascripts/chosen.jquery.js +1011 -0
  22. data/lib/rollout_ui/engine/vendor/assets/javascripts/jquery-ujs.js +367 -0
  23. data/lib/rollout_ui/engine/vendor/assets/stylesheets/chosen.css +369 -0
  24. data/lib/rollout_ui/engine/vendor/assets/stylesheets/normalize.css +431 -0
  25. data/lib/rollout_ui/feature.rb +50 -0
  26. data/lib/rollout_ui/monkey_patch.rb +8 -0
  27. data/lib/rollout_ui/server.rb +71 -0
  28. data/lib/rollout_ui/server/public/rollout_ui/application.css +916 -0
  29. data/lib/rollout_ui/server/public/rollout_ui/application.js +45 -0
  30. data/lib/rollout_ui/server/public/rollout_ui/chosen-sprite.png +0 -0
  31. data/lib/rollout_ui/server/public/rollout_ui/dark_brick_wall.png +0 -0
  32. data/lib/rollout_ui/server/public/rollout_ui/rollout.png +0 -0
  33. data/lib/rollout_ui/server/views/feature.erb +34 -0
  34. data/lib/rollout_ui/server/views/index.erb +5 -0
  35. data/lib/rollout_ui/server/views/layout.erb +32 -0
  36. data/lib/rollout_ui/version.rb +3 -0
  37. data/lib/rollout_ui/wrapper.rb +28 -0
  38. data/spec/dummy/Rakefile +7 -0
  39. data/spec/dummy/app/assets/javascripts/application.js +7 -0
  40. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  41. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  42. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  43. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  44. data/spec/dummy/config.ru +12 -0
  45. data/spec/dummy/config/application.rb +45 -0
  46. data/spec/dummy/config/boot.rb +10 -0
  47. data/spec/dummy/config/database.yml +14 -0
  48. data/spec/dummy/config/environment.rb +5 -0
  49. data/spec/dummy/config/environments/development.rb +30 -0
  50. data/spec/dummy/config/environments/production.rb +60 -0
  51. data/spec/dummy/config/environments/test.rb +39 -0
  52. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  53. data/spec/dummy/config/initializers/inflections.rb +10 -0
  54. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  55. data/spec/dummy/config/initializers/rollout.rb +6 -0
  56. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  57. data/spec/dummy/config/initializers/session_store.rb +8 -0
  58. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  59. data/spec/dummy/config/locales/en.yml +5 -0
  60. data/spec/dummy/config/routes.rb +5 -0
  61. data/spec/dummy/log/development.log +15639 -0
  62. data/spec/dummy/log/production.log +19 -0
  63. data/spec/dummy/log/stdout.log +3186 -0
  64. data/spec/dummy/log/test.log +11115 -0
  65. data/spec/dummy/public/404.html +26 -0
  66. data/spec/dummy/public/422.html +26 -0
  67. data/spec/dummy/public/500.html +26 -0
  68. data/spec/dummy/public/favicon.ico +0 -0
  69. data/spec/dummy/script/rails +6 -0
  70. data/spec/dummy/tmp/cache/assets/C44/C60/sprockets%2F32619064c16276c9031bc469f111b6f1 +369 -0
  71. data/spec/dummy/tmp/cache/assets/CA9/290/sprockets%2Ffde33cd38c83e40045112ef236908326 +1012 -0
  72. data/spec/dummy/tmp/cache/assets/CB1/0F0/sprockets%2F097929f05538ada1621d2b34d0748fb8 +0 -0
  73. data/spec/dummy/tmp/cache/assets/D0C/460/sprockets%2Fbf6917215d0871b152f3d3ec4ece0486 +0 -0
  74. data/spec/dummy/tmp/cache/assets/D1E/9E0/sprockets%2Fb92e466db7d4e78f107d8386ea19560a +0 -0
  75. data/spec/dummy/tmp/cache/assets/D22/D60/sprockets%2F6c1d9d3c966b8286c00d8dd46bd54598 +371 -0
  76. data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  77. data/spec/dummy/tmp/cache/assets/D3E/870/sprockets%2F82e617ed3b33c78bb8340cdbd603d189 +1015 -0
  78. data/spec/dummy/tmp/cache/assets/D45/1B0/sprockets%2F89743b2dcefe650c86e16c60dc248a26 +0 -0
  79. data/spec/dummy/tmp/cache/assets/D54/ED0/sprockets%2F71c9fa01091d432b131da3bb73faf3d4 +0 -0
  80. data/spec/dummy/tmp/cache/assets/D62/900/sprockets%2F4d745068b58dab09efc05fd3bd030c05 +1387 -0
  81. data/spec/dummy/tmp/cache/assets/D71/220/sprockets%2Fd07f8aed535b53034c9a4489bd6cb45d +374 -0
  82. data/spec/dummy/tmp/cache/assets/D74/0C0/sprockets%2F28c2d3c4b8de13fe5b746c94d96042dd +0 -0
  83. data/spec/dummy/tmp/cache/assets/D7D/C20/sprockets%2Ff5f71be7464ea98757bc8e41df514a4b +433 -0
  84. data/spec/dummy/tmp/cache/assets/D84/210/sprockets%2Fabd0103ccec2b428ac62c94e4c40b384 +0 -0
  85. data/spec/dummy/tmp/cache/assets/D93/100/sprockets%2Ffd9e48a89d83e7b764e2de324ee888b6 +917 -0
  86. data/spec/dummy/tmp/cache/assets/DC2/770/sprockets%2F7f10ac108ce75bbb0e9877b50bcb22fe +0 -0
  87. data/spec/dummy/tmp/cache/assets/E00/850/sprockets%2Fd5e1f4415f71da50c8365f7ecdeca2ff +436 -0
  88. data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  89. data/spec/dummy/tmp/cache/assets/E3E/230/sprockets%2F8156dcfebf95ff75b117c7e5bffb71dc +372 -0
  90. data/spec/dummy/tmp/cache/assets/E7A/F10/sprockets%2Ff3d71fbeaa5fdddf600a0ac52af1d8e2 +0 -0
  91. data/spec/dummy/tmp/capybara/capybara-201110152250496494273346.html +141 -0
  92. data/spec/dummy/tmp/capybara/capybara-201110152251237384633452.html +141 -0
  93. data/spec/dummy/tmp/capybara/capybara-201110152253073784924369.html +141 -0
  94. data/spec/dummy/tmp/capybara/capybara-201110152255118447806623.html +141 -0
  95. data/spec/dummy/tmp/capybara/capybara-201110152257286050916603.html +141 -0
  96. data/spec/dummy/tmp/capybara/capybara-201110152258202877532249.html +139 -0
  97. data/spec/dummy/tmp/capybara/capybara-201110152259224345897143.html +139 -0
  98. data/spec/dummy/tmp/pids/server.pid +1 -0
  99. data/spec/lib/rollout_ui/feature_spec.rb +52 -0
  100. data/spec/lib/rollout_ui/wrapper_spec.rb +63 -0
  101. data/spec/requests/engine/engine_spec.rb +95 -0
  102. data/spec/spec_helper.rb +22 -0
  103. metadata +388 -0
@@ -0,0 +1,8 @@
1
+ class Rollout
2
+ alias_method :original_active?, :active?
3
+
4
+ def active?(feature, user)
5
+ RolloutUi::Wrapper.new(self).add_feature(feature)
6
+ original_active?(feature, user)
7
+ end
8
+ end
@@ -0,0 +1,71 @@
1
+ require 'sinatra/base'
2
+ require 'erb'
3
+ require 'time'
4
+
5
+ if defined? Encoding
6
+ Encoding.default_external = Encoding::UTF_8
7
+ end
8
+
9
+ module RolloutUi
10
+ User = Struct.new(:id)
11
+
12
+ class Server < Sinatra::Base
13
+ dir = File.dirname(File.expand_path(__FILE__))
14
+
15
+ set :views, "#{dir}/server/views"
16
+ set :public, "#{dir}/server/public"
17
+ set :static, true
18
+
19
+ helpers do
20
+ include Rack::Utils
21
+ alias_method :h, :escape_html
22
+
23
+ def partial?
24
+ @partial
25
+ end
26
+
27
+ def partial(template, local_vars = {})
28
+ @partial = true
29
+ erb(template.to_sym, {:layout => false}, local_vars)
30
+ ensure
31
+ @partial = false
32
+ end
33
+
34
+ def url_path(*path_parts)
35
+ [ path_prefix, path_parts ].join("/").squeeze('/')
36
+ end
37
+ alias_method :u, :url_path
38
+
39
+ def path_prefix
40
+ request.env['SCRIPT_NAME']
41
+ end
42
+
43
+ def section(key, *args, &block)
44
+ @sections ||= Hash.new{ |k,v| k[v] = [] }
45
+ if block_given?
46
+ @sections[key] << block
47
+ else
48
+ @sections[key].inject(''){ |content, block| content << block.call(*args) } if @sections.keys.include?(key)
49
+ end
50
+ end
51
+ end
52
+
53
+ get "/?" do
54
+ @wrapper = RolloutUi::Wrapper.new
55
+ @features = @wrapper.features.map{ |feature| RolloutUi::Feature.new(feature) }
56
+
57
+ response["Cache-Control"] = "max-age=0, private, must-revalidate"
58
+ erb :index, { :layout => true }
59
+ end
60
+
61
+ post '/:feature/update' do
62
+ @feature = RolloutUi::Feature.new(params["feature"])
63
+
64
+ @feature.percentage = params["percentage"] if params["percentage"]
65
+ @feature.groups = params["groups"] if params["groups"]
66
+ @feature.user_ids = params["users"] if params["users"]
67
+
68
+ redirect url_path
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,916 @@
1
+ /*! normalize.css 2011-09-22T17:42 UTC - http://github.com/necolas/normalize.css */
2
+
3
+ /* =============================================================================
4
+ HTML5 display definitions
5
+ ========================================================================== */
6
+
7
+ /*
8
+ * Corrects block display not defined in IE6/7/8/9 & FF3
9
+ */
10
+
11
+
12
+ article,
13
+ aside,
14
+ details,
15
+ figcaption,
16
+ figure,
17
+ footer,
18
+ header,
19
+ hgroup,
20
+ nav,
21
+ section {
22
+ display: block;
23
+ }
24
+
25
+ /*
26
+ * Corrects inline-block display not defined in IE6/7/8/9 & FF3
27
+ */
28
+
29
+ audio,
30
+ canvas,
31
+ video {
32
+ display: inline-block;
33
+ *display: inline;
34
+ *zoom: 1;
35
+ }
36
+
37
+ /*
38
+ * Prevents modern browsers from displaying 'audio' without controls
39
+ */
40
+
41
+ audio:not([controls]) {
42
+ display: none;
43
+ }
44
+
45
+ /*
46
+ * Addresses styling for 'hidden' attribute not present in IE7/8/9, FF3, S4
47
+ * Known issue: no IE6 support
48
+ */
49
+
50
+ [hidden] {
51
+ display: none;
52
+ }
53
+
54
+
55
+ /* =============================================================================
56
+ Base
57
+ ========================================================================== */
58
+
59
+ /*
60
+ * 1. Corrects text resizing oddly in IE6/7 when body font-size is set using em units
61
+ * http://clagnut.com/blog/348/#c790
62
+ * 2. Keeps page centred in all browsers regardless of content height
63
+ * 3. Prevents iOS text size adjust after orientation change, without disabling user zoom
64
+ * www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/
65
+ */
66
+
67
+ html {
68
+ font-size: 100%; /* 1 */
69
+ overflow-y: scroll; /* 2 */
70
+ -webkit-text-size-adjust: 100%; /* 3 */
71
+ -ms-text-size-adjust: 100%; /* 3 */
72
+ }
73
+
74
+ /*
75
+ * Addresses margins handled incorrectly in IE6/7
76
+ */
77
+
78
+ body {
79
+ margin: 0;
80
+ }
81
+
82
+ /*
83
+ * Addresses font-family inconsistency between 'textarea' and other form elements.
84
+ */
85
+
86
+ body,
87
+ button,
88
+ input,
89
+ select,
90
+ textarea {
91
+ font-family: sans-serif;
92
+ }
93
+
94
+
95
+ /* =============================================================================
96
+ Links
97
+ ========================================================================== */
98
+
99
+ a {
100
+ color: #00e;
101
+ }
102
+
103
+ a:visited {
104
+ color: #551a8b;
105
+ }
106
+
107
+ /*
108
+ * Addresses outline displayed oddly in Chrome
109
+ */
110
+
111
+ a:focus {
112
+ outline: thin dotted;
113
+ }
114
+
115
+ /*
116
+ * Improves readability when focused and also mouse hovered in all browsers
117
+ * people.opera.com/patrickl/experiments/keyboard/test
118
+ */
119
+
120
+ a:hover,
121
+ a:active {
122
+ outline: 0;
123
+ }
124
+
125
+
126
+ /* =============================================================================
127
+ Typography
128
+ ========================================================================== */
129
+
130
+ /*
131
+ * Addresses styling not present in IE7/8/9, S5, Chrome
132
+ */
133
+
134
+ abbr[title] {
135
+ border-bottom: 1px dotted;
136
+ }
137
+
138
+ /*
139
+ * Addresses style set to 'bolder' in FF3/4, S4/5, Chrome
140
+ */
141
+
142
+ b,
143
+ strong {
144
+ font-weight: bold;
145
+ }
146
+
147
+ blockquote {
148
+ margin: 1em 40px;
149
+ }
150
+
151
+ /*
152
+ * Addresses styling not present in S5, Chrome
153
+ */
154
+
155
+ dfn {
156
+ font-style: italic;
157
+ }
158
+
159
+ /*
160
+ * Addresses styling not present in IE6/7/8/9
161
+ */
162
+
163
+ mark {
164
+ background: #ff0;
165
+ color: #000;
166
+ }
167
+
168
+ /*
169
+ * Corrects font family set oddly in IE6, S4/5, Chrome
170
+ * en.wikipedia.org/wiki/User:Davidgothberg/Test59
171
+ */
172
+
173
+ pre,
174
+ code,
175
+ kbd,
176
+ samp {
177
+ font-family: monospace, serif;
178
+ _font-family: 'courier new', monospace;
179
+ font-size: 1em;
180
+ }
181
+
182
+ /*
183
+ * Improves readability of pre-formatted text in all browsers
184
+ */
185
+
186
+ pre {
187
+ white-space: pre;
188
+ white-space: pre-wrap;
189
+ word-wrap: break-word;
190
+ }
191
+
192
+ /*
193
+ * 1. Addresses CSS quotes not supported in IE6/7
194
+ * 2. Addresses quote property not supported in S4
195
+ */
196
+
197
+ /* 1 */
198
+
199
+ q {
200
+ quotes: none;
201
+ }
202
+
203
+ /* 2 */
204
+
205
+ q:before,
206
+ q:after {
207
+ content: '';
208
+ content: none;
209
+ }
210
+
211
+ small {
212
+ font-size: 75%;
213
+ }
214
+
215
+ /*
216
+ * Prevents sub and sup affecting line-height in all browsers
217
+ * gist.github.com/413930
218
+ */
219
+
220
+ sub,
221
+ sup {
222
+ font-size: 75%;
223
+ line-height: 0;
224
+ position: relative;
225
+ vertical-align: baseline;
226
+ }
227
+
228
+ sup {
229
+ top: -0.5em;
230
+ }
231
+
232
+ sub {
233
+ bottom: -0.25em;
234
+ }
235
+
236
+
237
+ /* =============================================================================
238
+ Lists
239
+ ========================================================================== */
240
+
241
+ ul,
242
+ ol {
243
+ margin: 1em 0;
244
+ padding: 0 0 0 40px;
245
+ }
246
+
247
+ dd {
248
+ margin: 0 0 0 40px;
249
+ }
250
+
251
+ nav ul,
252
+ nav ol {
253
+ list-style: none;
254
+ list-style-image: none;
255
+ }
256
+
257
+
258
+ /* =============================================================================
259
+ Embedded content
260
+ ========================================================================== */
261
+
262
+ /*
263
+ * 1. Removes border when inside 'a' element in IE6/7/8/9, FF3
264
+ * 2. Improves image quality when scaled in IE7
265
+ * code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/
266
+ */
267
+
268
+ img {
269
+ border: 0; /* 1 */
270
+ -ms-interpolation-mode: bicubic; /* 2 */
271
+ }
272
+
273
+ /*
274
+ * Corrects overflow displayed oddly in IE9
275
+ */
276
+
277
+ svg:not(:root) {
278
+ overflow: hidden;
279
+ }
280
+
281
+
282
+ /* =============================================================================
283
+ Figures
284
+ ========================================================================== */
285
+
286
+ /*
287
+ * Addresses margin not present in IE6/7/8/9, S5, O11
288
+ */
289
+
290
+ figure {
291
+ margin: 0;
292
+ }
293
+
294
+
295
+ /* =============================================================================
296
+ Forms
297
+ ========================================================================== */
298
+
299
+ /*
300
+ * Corrects margin displayed oddly in IE6/7
301
+ */
302
+
303
+ form {
304
+ margin: 0;
305
+ }
306
+
307
+ /*
308
+ * Define consistent border, margin, and padding
309
+ */
310
+
311
+ fieldset {
312
+ border: 1px solid #c0c0c0;
313
+ margin: 0 2px;
314
+ padding: 0.35em 0.625em 0.75em;
315
+ }
316
+
317
+ /*
318
+ * 1. Corrects color not being inherited in IE6/7/8/9
319
+ * 2. Corrects alignment displayed oddly in IE6/7
320
+ */
321
+
322
+ legend {
323
+ border: 0; /* 1 */
324
+ *margin-left: -7px; /* 2 */
325
+ }
326
+
327
+ /*
328
+ * 1. Corrects font size not being inherited in all browsers
329
+ * 2. Addresses margins set differently in IE6/7, FF3/4, S5, Chrome
330
+ * 3. Improves appearance and consistency in all browsers
331
+ */
332
+
333
+ button,
334
+ input,
335
+ select,
336
+ textarea {
337
+ font-size: 100%; /* 1 */
338
+ margin: 0; /* 2 */
339
+ vertical-align: baseline; /* 3 */
340
+ *vertical-align: middle; /* 3 */
341
+ }
342
+
343
+ /*
344
+ * Addresses FF3/4 setting line-height on 'input' using !important in the UA stylesheet
345
+ */
346
+
347
+ button,
348
+ input {
349
+ line-height: normal; /* 1 */
350
+ }
351
+
352
+ /*
353
+ * 1. Improves usability and consistency of cursor style between image-type 'input' and others
354
+ * 2. Corrects inability to style clickable 'input' types in iOS
355
+ * 3. Corrects inner spacing displayed oddly in IE7 without effecting normal text inputs
356
+ * Known issue: inner spacing remains in IE6
357
+ */
358
+
359
+ button,
360
+ input[type="button"],
361
+ input[type="reset"],
362
+ input[type="submit"] {
363
+ cursor: pointer; /* 1 */
364
+ -webkit-appearance: button; /* 2 */
365
+ *overflow: visible; /* 3 */
366
+ }
367
+
368
+ /*
369
+ * 1. Addresses box sizing set to content-box in IE8/9
370
+ * 2. Addresses excess padding in IE8/9
371
+ */
372
+
373
+ input[type="checkbox"],
374
+ input[type="radio"] {
375
+ box-sizing: border-box; /* 1 */
376
+ padding: 0; /* 2 */
377
+ }
378
+
379
+ /*
380
+ * 1. Addresses appearance set to searchfield in S5, Chrome
381
+ * 2. Addresses box sizing set to border-box in S5, Chrome (include -moz to future-proof)
382
+ */
383
+
384
+ input[type="search"] {
385
+ -webkit-appearance: textfield; /* 1 */
386
+ -moz-box-sizing: content-box;
387
+ -webkit-box-sizing: content-box; /* 2 */
388
+ box-sizing: content-box;
389
+ }
390
+
391
+ /*
392
+ * Corrects inner padding displayed oddly in S5, Chrome on OSX
393
+ */
394
+
395
+ input[type="search"]::-webkit-search-decoration {
396
+ -webkit-appearance: none;
397
+ }
398
+
399
+ /*
400
+ * Corrects inner padding and border displayed oddly in FF3/4
401
+ * www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/
402
+ */
403
+
404
+ button::-moz-focus-inner,
405
+ input::-moz-focus-inner {
406
+ border: 0;
407
+ padding: 0;
408
+ }
409
+
410
+ /*
411
+ * 1. Removes default vertical scrollbar in IE6/7/8/9
412
+ * 2. Improves readability and alignment in all browsers
413
+ */
414
+
415
+ textarea {
416
+ overflow: auto; /* 1 */
417
+ vertical-align: top; /* 2 */
418
+ }
419
+
420
+
421
+ /* =============================================================================
422
+ Tables
423
+ ========================================================================== */
424
+
425
+ /*
426
+ * Remove most spacing between table cells
427
+ */
428
+
429
+ table {
430
+ border-collapse: collapse;
431
+ border-spacing: 0;
432
+ }
433
+ /* @group Base */
434
+
435
+ .chzn-container {
436
+ font-size: 13px;
437
+ position: relative;
438
+ display: inline-block;
439
+ zoom: 1;
440
+ *display: inline;
441
+ }
442
+ .chzn-container .chzn-drop {
443
+ background: #fff;
444
+ border: 1px solid #aaa;
445
+ border-top: 0;
446
+ position: absolute;
447
+ top: 29px;
448
+ left: 0;
449
+ -webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15);
450
+ -moz-box-shadow : 0 4px 5px rgba(0,0,0,.15);
451
+ -o-box-shadow : 0 4px 5px rgba(0,0,0,.15);
452
+ box-shadow : 0 4px 5px rgba(0,0,0,.15);
453
+ z-index: 999;
454
+ }
455
+ /* @end */
456
+
457
+ /* @group Single Chosen */
458
+ .chzn-container-single .chzn-single {
459
+ background-color: #fff;
460
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white));
461
+ background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%);
462
+ background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%);
463
+ background-image: -o-linear-gradient(top, #eeeeee 0%,#ffffff 50%);
464
+ background-image: -ms-linear-gradient(top, #eeeeee 0%,#ffffff 50%);
465
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff',GradientType=0 );
466
+ background-image: linear-gradient(top, #eeeeee 0%,#ffffff 50%);
467
+ -webkit-border-radius: 4px;
468
+ -moz-border-radius : 4px;
469
+ border-radius : 4px;
470
+ -moz-background-clip : padding;
471
+ -webkit-background-clip: padding-box;
472
+ background-clip : padding-box;
473
+ border: 1px solid #aaa;
474
+ display: block;
475
+ overflow: hidden;
476
+ white-space: nowrap;
477
+ position: relative;
478
+ height: 26px;
479
+ line-height: 26px;
480
+ padding: 0 0 0 8px;
481
+ color: #444;
482
+ text-decoration: none;
483
+ }
484
+ .chzn-container-single .chzn-single span {
485
+ margin-right: 26px;
486
+ display: block;
487
+ overflow: hidden;
488
+ white-space: nowrap;
489
+ -o-text-overflow: ellipsis;
490
+ -ms-text-overflow: ellipsis;
491
+ text-overflow: ellipsis;
492
+ }
493
+ .chzn-container-single .chzn-single abbr {
494
+ display: block;
495
+ position: absolute;
496
+ right: 26px;
497
+ top: 8px;
498
+ width: 12px;
499
+ height: 13px;
500
+ font-size: 1px;
501
+ background: url(chosen-sprite.png) right top no-repeat;
502
+ }
503
+ .chzn-container-single .chzn-single abbr:hover {
504
+ background-position: right -11px;
505
+ }
506
+ .chzn-container-single .chzn-single div {
507
+ -webkit-border-radius: 0 4px 4px 0;
508
+ -moz-border-radius : 0 4px 4px 0;
509
+ border-radius : 0 4px 4px 0;
510
+ -moz-background-clip : padding;
511
+ -webkit-background-clip: padding-box;
512
+ background-clip : padding-box;
513
+ background: #ccc;
514
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
515
+ background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
516
+ background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
517
+ background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%);
518
+ background-image: -ms-linear-gradient(top, #cccccc 0%,#eeeeee 60%);
519
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cccccc', endColorstr='#eeeeee',GradientType=0 );
520
+ background-image: linear-gradient(top, #cccccc 0%,#eeeeee 60%);
521
+ border-left: 1px solid #aaa;
522
+ position: absolute;
523
+ right: 0;
524
+ top: 0;
525
+ display: block;
526
+ height: 100%;
527
+ width: 18px;
528
+ }
529
+ .chzn-container-single .chzn-single div b {
530
+ background: url('chosen-sprite.png') no-repeat 0 1px;
531
+ display: block;
532
+ width: 100%;
533
+ height: 100%;
534
+ }
535
+ .chzn-container-single .chzn-search {
536
+ padding: 3px 4px;
537
+ position: relative;
538
+ margin: 0;
539
+ white-space: nowrap;
540
+ z-index: 1010;
541
+ }
542
+ .chzn-container-single .chzn-search input {
543
+ background: #fff url('chosen-sprite.png') no-repeat 100% -22px;
544
+ background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
545
+ background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
546
+ background: url('chosen-sprite.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
547
+ background: url('chosen-sprite.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
548
+ background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
549
+ background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
550
+ background: url('chosen-sprite.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
551
+ margin: 1px 0;
552
+ padding: 4px 20px 4px 5px;
553
+ outline: 0;
554
+ border: 1px solid #aaa;
555
+ font-family: sans-serif;
556
+ font-size: 1em;
557
+ }
558
+ .chzn-container-single .chzn-drop {
559
+ -webkit-border-radius: 0 0 4px 4px;
560
+ -moz-border-radius : 0 0 4px 4px;
561
+ border-radius : 0 0 4px 4px;
562
+ -moz-background-clip : padding;
563
+ -webkit-background-clip: padding-box;
564
+ background-clip : padding-box;
565
+ }
566
+ /* @end */
567
+
568
+ .chzn-container-single-nosearch .chzn-search input {
569
+ position: absolute;
570
+ left: -9000px;
571
+ }
572
+
573
+ /* @group Multi Chosen */
574
+ .chzn-container-multi .chzn-choices {
575
+ background-color: #fff;
576
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
577
+ background-image: -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
578
+ background-image: -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
579
+ background-image: -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
580
+ background-image: -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
581
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 );
582
+ background-image: linear-gradient(top, #ffffff 85%,#eeeeee 99%);
583
+ border: 1px solid #aaa;
584
+ margin: 0;
585
+ padding: 0;
586
+ cursor: text;
587
+ overflow: hidden;
588
+ height: auto !important;
589
+ height: 1%;
590
+ position: relative;
591
+ }
592
+ .chzn-container-multi .chzn-choices li {
593
+ float: left;
594
+ list-style: none;
595
+ }
596
+ .chzn-container-multi .chzn-choices .search-field {
597
+ white-space: nowrap;
598
+ margin: 0;
599
+ padding: 0;
600
+ }
601
+ .chzn-container-multi .chzn-choices .search-field input {
602
+ color: #666;
603
+ background: transparent !important;
604
+ border: 0 !important;
605
+ padding: 5px;
606
+ margin: 1px 0;
607
+ outline: 0;
608
+ -webkit-box-shadow: none;
609
+ -moz-box-shadow : none;
610
+ -o-box-shadow : none;
611
+ box-shadow : none;
612
+ }
613
+ .chzn-container-multi .chzn-choices .search-field .default {
614
+ color: #999;
615
+ }
616
+ .chzn-container-multi .chzn-choices .search-choice {
617
+ -webkit-border-radius: 3px;
618
+ -moz-border-radius : 3px;
619
+ border-radius : 3px;
620
+ -moz-background-clip : padding;
621
+ -webkit-background-clip: padding-box;
622
+ background-clip : padding-box;
623
+ background-color: #e4e4e4;
624
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #e4e4e4), color-stop(0.7, #eeeeee));
625
+ background-image: -webkit-linear-gradient(center bottom, #e4e4e4 0%, #eeeeee 70%);
626
+ background-image: -moz-linear-gradient(center bottom, #e4e4e4 0%, #eeeeee 70%);
627
+ background-image: -o-linear-gradient(bottom, #e4e4e4 0%, #eeeeee 70%);
628
+ background-image: -ms-linear-gradient(top, #e4e4e4 0%,#eeeeee 70%);
629
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e4e4e4', endColorstr='#eeeeee',GradientType=0 );
630
+ background-image: linear-gradient(top, #e4e4e4 0%,#eeeeee 70%);
631
+ color: #333;
632
+ border: 1px solid #b4b4b4;
633
+ line-height: 13px;
634
+ padding: 3px 19px 3px 6px;
635
+ margin: 3px 0 3px 5px;
636
+ position: relative;
637
+ }
638
+ .chzn-container-multi .chzn-choices .search-choice span {
639
+ cursor: default;
640
+ }
641
+ .chzn-container-multi .chzn-choices .search-choice-focus {
642
+ background: #d4d4d4;
643
+ }
644
+ .chzn-container-multi .chzn-choices .search-choice .search-choice-close {
645
+ display: block;
646
+ position: absolute;
647
+ right: 3px;
648
+ top: 4px;
649
+ width: 12px;
650
+ height: 13px;
651
+ font-size: 1px;
652
+ background: url(chosen-sprite.png) right top no-repeat;
653
+ }
654
+ .chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover {
655
+ background-position: right -11px;
656
+ }
657
+ .chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close {
658
+ background-position: right -11px;
659
+ }
660
+ /* @end */
661
+
662
+ /* @group Results */
663
+ .chzn-container .chzn-results {
664
+ margin: 0 4px 4px 0;
665
+ max-height: 190px;
666
+ padding: 0 0 0 4px;
667
+ position: relative;
668
+ overflow-x: hidden;
669
+ overflow-y: auto;
670
+ }
671
+ .chzn-container-multi .chzn-results {
672
+ margin: -1px 0 0;
673
+ padding: 0;
674
+ }
675
+ .chzn-container .chzn-results li {
676
+ display: none;
677
+ line-height: 80%;
678
+ padding: 7px 7px 8px;
679
+ margin: 0;
680
+ list-style: none;
681
+ }
682
+ .chzn-container .chzn-results .active-result {
683
+ cursor: pointer;
684
+ display: list-item;
685
+ }
686
+ .chzn-container .chzn-results .highlighted {
687
+ background: #3875d7;
688
+ color: #fff;
689
+ }
690
+ .chzn-container .chzn-results li em {
691
+ background: #feffde;
692
+ font-style: normal;
693
+ }
694
+ .chzn-container .chzn-results .highlighted em {
695
+ background: transparent;
696
+ }
697
+ .chzn-container .chzn-results .no-results {
698
+ background: #f4f4f4;
699
+ display: list-item;
700
+ }
701
+ .chzn-container .chzn-results .group-result {
702
+ cursor: default;
703
+ color: #999;
704
+ font-weight: bold;
705
+ }
706
+ .chzn-container .chzn-results .group-option {
707
+ padding-left: 20px;
708
+ }
709
+ .chzn-container-multi .chzn-drop .result-selected {
710
+ display: none;
711
+ }
712
+ /* @end */
713
+
714
+ /* @group Active */
715
+ .chzn-container-active .chzn-single {
716
+ -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
717
+ -moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
718
+ -o-box-shadow : 0 0 5px rgba(0,0,0,.3);
719
+ box-shadow : 0 0 5px rgba(0,0,0,.3);
720
+ border: 1px solid #5897fb;
721
+ }
722
+ .chzn-container-active .chzn-single-with-drop {
723
+ border: 1px solid #aaa;
724
+ -webkit-box-shadow: 0 1px 0 #fff inset;
725
+ -moz-box-shadow : 0 1px 0 #fff inset;
726
+ -o-box-shadow : 0 1px 0 #fff inset;
727
+ box-shadow : 0 1px 0 #fff inset;
728
+ background-color: #eee;
729
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee));
730
+ background-image: -webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%);
731
+ background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%);
732
+ background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%);
733
+ background-image: -ms-linear-gradient(top, #ffffff 0%,#eeeeee 50%);
734
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 );
735
+ background-image: linear-gradient(top, #ffffff 0%,#eeeeee 50%);
736
+ -webkit-border-bottom-left-radius : 0;
737
+ -webkit-border-bottom-right-radius: 0;
738
+ -moz-border-radius-bottomleft : 0;
739
+ -moz-border-radius-bottomright: 0;
740
+ border-bottom-left-radius : 0;
741
+ border-bottom-right-radius: 0;
742
+ }
743
+ .chzn-container-active .chzn-single-with-drop div {
744
+ background: transparent;
745
+ border-left: none;
746
+ }
747
+ .chzn-container-active .chzn-single-with-drop div b {
748
+ background-position: -18px 1px;
749
+ }
750
+ .chzn-container-active .chzn-choices {
751
+ -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
752
+ -moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
753
+ -o-box-shadow : 0 0 5px rgba(0,0,0,.3);
754
+ box-shadow : 0 0 5px rgba(0,0,0,.3);
755
+ border: 1px solid #5897fb;
756
+ }
757
+ .chzn-container-active .chzn-choices .search-field input {
758
+ color: #111 !important;
759
+ }
760
+ /* @end */
761
+
762
+ /* @group Disabled Support */
763
+ .chzn-disabled {
764
+ cursor: default;
765
+ opacity:0.5 !important;
766
+ }
767
+ .chzn-disabled .chzn-single {
768
+ cursor: default;
769
+ }
770
+ .chzn-disabled .chzn-choices .search-choice .search-choice-close {
771
+ cursor: default;
772
+ }
773
+
774
+ /* @group Right to Left */
775
+ .chzn-rtl { direction:rtl;text-align: right; }
776
+ .chzn-rtl .chzn-single { padding-left: 0; padding-right: 8px; }
777
+ .chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; }
778
+ .chzn-rtl .chzn-single div {
779
+ left: 0; right: auto;
780
+ border-left: none; border-right: 1px solid #aaaaaa;
781
+ -webkit-border-radius: 4px 0 0 4px;
782
+ -moz-border-radius : 4px 0 0 4px;
783
+ border-radius : 4px 0 0 4px;
784
+ }
785
+ .chzn-rtl .chzn-choices li { float: right; }
786
+ .chzn-rtl .chzn-choices .search-choice { padding: 3px 6px 3px 19px; margin: 3px 5px 3px 0; }
787
+ .chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 5px; right: auto; background-position: right top;}
788
+ .chzn-rtl.chzn-container-single .chzn-results { margin-left: 4px; margin-right: 0; padding-left: 0; padding-right: 4px; }
789
+ .chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 20px; }
790
+ .chzn-rtl.chzn-container-active .chzn-single-with-drop div { border-right: none; }
791
+ .chzn-rtl .chzn-search input {
792
+ background: url('chosen-sprite.png') no-repeat -38px -22px, #ffffff;
793
+ background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
794
+ background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
795
+ background: url('chosen-sprite.png') no-repeat -38px -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
796
+ background: url('chosen-sprite.png') no-repeat -38px -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
797
+ background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
798
+ background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
799
+ background: url('chosen-sprite.png') no-repeat -38px -22px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
800
+ padding: 4px 5px 4px 20px;
801
+ }
802
+ /* @end */
803
+ /*
804
+ * This is a manifest file that'll automatically include all the stylesheets available in this directory
805
+ * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
806
+ * the top of the compiled file, but it's generally better to create a new file per style scope.
807
+ */
808
+
809
+ body {
810
+ font-family: Helvetica, sans-serif;
811
+ background: #232323 url(dark_brick_wall.png);
812
+ color: #aeaeae;
813
+ }
814
+
815
+ h1 img {
816
+ height: 75px;
817
+ }
818
+
819
+ /* For modern browsers */
820
+ .clearfix:before,
821
+ .clearfix:after {
822
+ content:"";
823
+ display:table;
824
+ }
825
+
826
+ .clearfix:after {
827
+ clear:both;
828
+ }
829
+
830
+ /* For IE 6/7 (trigger hasLayout) */
831
+ .clearfix {
832
+ zoom:1;
833
+ }
834
+
835
+ .col {
836
+ float: left;
837
+ width: 270px;
838
+ padding: 0 25px;
839
+ }
840
+
841
+ #container {
842
+ width: 960px;
843
+ margin: 0 auto;
844
+ }
845
+
846
+ #container h1 {
847
+ text-align: center;
848
+ margin: 43px 0 15px;
849
+ }
850
+
851
+ #features {
852
+ list-style-type: none;
853
+ padding: 0px;
854
+ }
855
+
856
+ #features .feature {
857
+ background-color: #121212;
858
+ padding: 20px 0;
859
+ border-radius: 10px;
860
+ margin-bottom: 25px;
861
+ }
862
+
863
+ #features .feature h2 {
864
+ margin: 0px 0 23px;
865
+ text-align: center;
866
+ font-size: 20px;
867
+ font-weight: normal;
868
+ letter-spacing: 1px;
869
+ }
870
+
871
+ #features .feature .groups {
872
+ height: 1.5em;
873
+ }
874
+
875
+ #features .feature label {
876
+ float: left;
877
+ font-size: 14px;
878
+ line-height: 2em;
879
+ color: #fcc334;
880
+ margin-right: 10px;
881
+ }
882
+
883
+ #features .feature select,
884
+ #features .feature .users {
885
+ line-height: 26px;
886
+ }
887
+
888
+ #features .feature .users {
889
+ width: 172px;
890
+ line-height: 27px;
891
+ }
892
+
893
+ #features .feature .percentage {
894
+ width: 187px;
895
+ }
896
+
897
+ #features .feature .groups {
898
+ width: 213px;
899
+ }
900
+
901
+ #features .feature .chzn-container-multi .chzn-choices {
902
+ -webkit-border-radius: 4px;
903
+ -moz-border-radius: 4px;
904
+ border-radius: 4px;
905
+ }
906
+ #features input[type='submit'] {
907
+ display: none;
908
+ }
909
+
910
+ #footer {
911
+ font-family: 'Ultra', serif;
912
+ font-size: 16px;
913
+ text-align: center;
914
+ color: #f4b71d;
915
+ text-shadow: 0 -1px 2px rgba(0,0,0,1);
916
+ }