notifly 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +22 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +13 -0
  5. data/Gemfile +24 -0
  6. data/Gemfile.lock +199 -0
  7. data/README.md +32 -6
  8. data/Rakefile +40 -14
  9. data/VERSION +1 -0
  10. data/app/assets/images/notifly/.keep +0 -0
  11. data/bin/rails +12 -0
  12. data/lib/generators/notifly/install/install_generator.rb +4 -0
  13. data/lib/notifly/engine.rb +0 -10
  14. data/spec/controllers/notifly/notifications_controller_spec.rb +44 -0
  15. data/spec/dummy/README.rdoc +28 -0
  16. data/spec/dummy/Rakefile +6 -0
  17. data/spec/dummy/app/assets/images/.keep +0 -0
  18. data/spec/dummy/app/assets/javascripts/application.js +14 -0
  19. data/spec/dummy/app/assets/stylesheets/application.css +20 -0
  20. data/spec/dummy/app/controllers/application_controller.rb +13 -0
  21. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  22. data/spec/dummy/app/controllers/site_controller.rb +4 -0
  23. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  24. data/spec/dummy/app/mailers/.keep +0 -0
  25. data/spec/dummy/app/models/.keep +0 -0
  26. data/spec/dummy/app/models/concerns/.keep +0 -0
  27. data/spec/dummy/app/models/dummy_object.rb +19 -0
  28. data/spec/dummy/app/models/post.rb +21 -0
  29. data/spec/dummy/app/views/layouts/application.html.erb +15 -0
  30. data/spec/dummy/app/views/site/index.html.erb +2 -0
  31. data/spec/dummy/bin/bundle +3 -0
  32. data/spec/dummy/bin/rails +4 -0
  33. data/spec/dummy/bin/rake +4 -0
  34. data/spec/dummy/config.ru +4 -0
  35. data/spec/dummy/config/application.rb +29 -0
  36. data/spec/dummy/config/boot.rb +5 -0
  37. data/spec/dummy/config/database.exemple.yml +12 -0
  38. data/spec/dummy/config/database.travis.yml +4 -0
  39. data/spec/dummy/config/environment.rb +5 -0
  40. data/spec/dummy/config/environments/development.rb +37 -0
  41. data/spec/dummy/config/environments/production.rb +78 -0
  42. data/spec/dummy/config/environments/test.rb +39 -0
  43. data/spec/dummy/config/initializers/assets.rb +8 -0
  44. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  45. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  46. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  47. data/spec/dummy/config/initializers/inflections.rb +16 -0
  48. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  49. data/spec/dummy/config/initializers/session_store.rb +3 -0
  50. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  51. data/spec/dummy/config/locales/en.yml +23 -0
  52. data/spec/dummy/config/routes.rb +5 -0
  53. data/spec/dummy/config/secrets.yml +22 -0
  54. data/spec/dummy/db/migrate/20141031165049_create_dummy_objects.rb +9 -0
  55. data/spec/dummy/db/migrate/20141103191353_create_posts.rb +10 -0
  56. data/spec/dummy/db/migrate/20141104121318_add_dummy_to_post.rb +5 -0
  57. data/spec/dummy/db/schema.rb +54 -0
  58. data/spec/dummy/lib/assets/.keep +0 -0
  59. data/spec/dummy/log/.keep +0 -0
  60. data/spec/dummy/public/404.html +67 -0
  61. data/spec/dummy/public/422.html +67 -0
  62. data/spec/dummy/public/500.html +66 -0
  63. data/spec/dummy/public/favicon.ico +0 -0
  64. data/spec/dummy/spec/features/notifly/counter_spec.rb +38 -0
  65. data/spec/dummy/spec/features/notifly/loading_notifications_spec.rb +38 -0
  66. data/spec/dummy/spec/features/notifly/read_notifications_spec.rb +70 -0
  67. data/spec/dummy/spec/models/dummy_object_spec.rb +58 -0
  68. data/spec/dummy/spec/models/post_spec.rb +89 -0
  69. data/spec/models/notifly/notification_spec.rb +18 -0
  70. data/spec/rails_helper.rb +21 -0
  71. data/spec/spec_helper.rb +62 -0
  72. data/spec/support/shared_connection.rb +14 -0
  73. data/spec/support/suppress_log.rb +3 -0
  74. data/spec/support/wait_ajax.rb +53 -0
  75. data/vendor/assets/javascripts/twitter/bootstrap.js +181 -0
  76. data/vendor/assets/stylesheets/twitter/bootstrap.css +475 -0
  77. metadata +181 -11
  78. data/lib/notifly/version.rb +0 -3
@@ -0,0 +1,181 @@
1
+ /*!
2
+ * Bootstrap v3.3.1 (http://getbootstrap.com)
3
+ * Copyright 2011-2014 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */
6
+
7
+ /*!
8
+ * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=908146e6b02e08c0f522)
9
+ * Config saved to config.json and https://gist.github.com/908146e6b02e08c0f522
10
+ */
11
+ if (typeof jQuery === 'undefined') {
12
+ throw new Error('Bootstrap\'s JavaScript requires jQuery')
13
+ }
14
+ +function ($) {
15
+ var version = $.fn.jquery.split(' ')[0].split('.')
16
+ if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) {
17
+ throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher')
18
+ }
19
+ }(jQuery);
20
+
21
+ /* ========================================================================
22
+ * Bootstrap: dropdown.js v3.3.1
23
+ * http://getbootstrap.com/javascript/#dropdowns
24
+ * ========================================================================
25
+ * Copyright 2011-2014 Twitter, Inc.
26
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
27
+ * ======================================================================== */
28
+
29
+
30
+ +function ($) {
31
+ 'use strict';
32
+
33
+ // DROPDOWN CLASS DEFINITION
34
+ // =========================
35
+
36
+ var backdrop = '.dropdown-backdrop'
37
+ var toggle = '[data-toggle="dropdown"]'
38
+ var Dropdown = function (element) {
39
+ $(element).on('click.bs.dropdown', this.toggle)
40
+ }
41
+
42
+ Dropdown.VERSION = '3.3.1'
43
+
44
+ Dropdown.prototype.toggle = function (e) {
45
+ var $this = $(this)
46
+
47
+ if ($this.is('.disabled, :disabled')) return
48
+
49
+ var $parent = getParent($this)
50
+ var isActive = $parent.hasClass('open')
51
+
52
+ clearMenus()
53
+
54
+ if (!isActive) {
55
+ if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
56
+ // if mobile we use a backdrop because click events don't delegate
57
+ $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
58
+ }
59
+
60
+ var relatedTarget = { relatedTarget: this }
61
+ $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
62
+
63
+ if (e.isDefaultPrevented()) return
64
+
65
+ $this
66
+ .trigger('focus')
67
+ .attr('aria-expanded', 'true')
68
+
69
+ $parent
70
+ .toggleClass('open')
71
+ .trigger('shown.bs.dropdown', relatedTarget)
72
+ }
73
+
74
+ return false
75
+ }
76
+
77
+ Dropdown.prototype.keydown = function (e) {
78
+ if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
79
+
80
+ var $this = $(this)
81
+
82
+ e.preventDefault()
83
+ e.stopPropagation()
84
+
85
+ if ($this.is('.disabled, :disabled')) return
86
+
87
+ var $parent = getParent($this)
88
+ var isActive = $parent.hasClass('open')
89
+
90
+ if ((!isActive && e.which != 27) || (isActive && e.which == 27)) {
91
+ if (e.which == 27) $parent.find(toggle).trigger('focus')
92
+ return $this.trigger('click')
93
+ }
94
+
95
+ var desc = ' li:not(.divider):visible a'
96
+ var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc)
97
+
98
+ if (!$items.length) return
99
+
100
+ var index = $items.index(e.target)
101
+
102
+ if (e.which == 38 && index > 0) index-- // up
103
+ if (e.which == 40 && index < $items.length - 1) index++ // down
104
+ if (!~index) index = 0
105
+
106
+ $items.eq(index).trigger('focus')
107
+ }
108
+
109
+ function clearMenus(e) {
110
+ if (e && e.which === 3) return
111
+ $(backdrop).remove()
112
+ $(toggle).each(function () {
113
+ var $this = $(this)
114
+ var $parent = getParent($this)
115
+ var relatedTarget = { relatedTarget: this }
116
+
117
+ if (!$parent.hasClass('open')) return
118
+
119
+ $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
120
+
121
+ if (e.isDefaultPrevented()) return
122
+
123
+ $this.attr('aria-expanded', 'false')
124
+ $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
125
+ })
126
+ }
127
+
128
+ function getParent($this) {
129
+ var selector = $this.attr('data-target')
130
+
131
+ if (!selector) {
132
+ selector = $this.attr('href')
133
+ selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
134
+ }
135
+
136
+ var $parent = selector && $(selector)
137
+
138
+ return $parent && $parent.length ? $parent : $this.parent()
139
+ }
140
+
141
+
142
+ // DROPDOWN PLUGIN DEFINITION
143
+ // ==========================
144
+
145
+ function Plugin(option) {
146
+ return this.each(function () {
147
+ var $this = $(this)
148
+ var data = $this.data('bs.dropdown')
149
+
150
+ if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
151
+ if (typeof option == 'string') data[option].call($this)
152
+ })
153
+ }
154
+
155
+ var old = $.fn.dropdown
156
+
157
+ $.fn.dropdown = Plugin
158
+ $.fn.dropdown.Constructor = Dropdown
159
+
160
+
161
+ // DROPDOWN NO CONFLICT
162
+ // ====================
163
+
164
+ $.fn.dropdown.noConflict = function () {
165
+ $.fn.dropdown = old
166
+ return this
167
+ }
168
+
169
+
170
+ // APPLY TO STANDARD DROPDOWN ELEMENTS
171
+ // ===================================
172
+
173
+ $(document)
174
+ .on('click.bs.dropdown.data-api', clearMenus)
175
+ .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
176
+ .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
177
+ .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
178
+ .on('keydown.bs.dropdown.data-api', '[role="menu"]', Dropdown.prototype.keydown)
179
+ .on('keydown.bs.dropdown.data-api', '[role="listbox"]', Dropdown.prototype.keydown)
180
+
181
+ }(jQuery);
@@ -0,0 +1,475 @@
1
+ /*!
2
+ * Bootstrap v3.3.1 (http://getbootstrap.com)
3
+ * Copyright 2011-2014 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */
6
+
7
+ /*!
8
+ * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=908146e6b02e08c0f522)
9
+ * Config saved to config.json and https://gist.github.com/908146e6b02e08c0f522
10
+ */
11
+ /*! normalize.css v3.0.2 | MIT License | git.io/normalize */
12
+ html {
13
+ font-family: sans-serif;
14
+ -ms-text-size-adjust: 100%;
15
+ -webkit-text-size-adjust: 100%;
16
+ }
17
+ body {
18
+ margin: 0;
19
+ }
20
+ article,
21
+ aside,
22
+ details,
23
+ figcaption,
24
+ figure,
25
+ footer,
26
+ header,
27
+ hgroup,
28
+ main,
29
+ menu,
30
+ nav,
31
+ section,
32
+ summary {
33
+ display: block;
34
+ }
35
+ audio,
36
+ canvas,
37
+ progress,
38
+ video {
39
+ display: inline-block;
40
+ vertical-align: baseline;
41
+ }
42
+ audio:not([controls]) {
43
+ display: none;
44
+ height: 0;
45
+ }
46
+ [hidden],
47
+ template {
48
+ display: none;
49
+ }
50
+ a {
51
+ background-color: transparent;
52
+ }
53
+ a:active,
54
+ a:hover {
55
+ outline: 0;
56
+ }
57
+ abbr[title] {
58
+ border-bottom: 1px dotted;
59
+ }
60
+ b,
61
+ strong {
62
+ font-weight: bold;
63
+ }
64
+ dfn {
65
+ font-style: italic;
66
+ }
67
+ h1 {
68
+ font-size: 2em;
69
+ margin: 0.67em 0;
70
+ }
71
+ mark {
72
+ background: #ff0;
73
+ color: #000;
74
+ }
75
+ small {
76
+ font-size: 80%;
77
+ }
78
+ sub,
79
+ sup {
80
+ font-size: 75%;
81
+ line-height: 0;
82
+ position: relative;
83
+ vertical-align: baseline;
84
+ }
85
+ sup {
86
+ top: -0.5em;
87
+ }
88
+ sub {
89
+ bottom: -0.25em;
90
+ }
91
+ img {
92
+ border: 0;
93
+ }
94
+ svg:not(:root) {
95
+ overflow: hidden;
96
+ }
97
+ figure {
98
+ margin: 1em 40px;
99
+ }
100
+ hr {
101
+ -moz-box-sizing: content-box;
102
+ -webkit-box-sizing: content-box;
103
+ box-sizing: content-box;
104
+ height: 0;
105
+ }
106
+ pre {
107
+ overflow: auto;
108
+ }
109
+ code,
110
+ kbd,
111
+ pre,
112
+ samp {
113
+ font-family: monospace, monospace;
114
+ font-size: 1em;
115
+ }
116
+ button,
117
+ input,
118
+ optgroup,
119
+ select,
120
+ textarea {
121
+ color: inherit;
122
+ font: inherit;
123
+ margin: 0;
124
+ }
125
+ button {
126
+ overflow: visible;
127
+ }
128
+ button,
129
+ select {
130
+ text-transform: none;
131
+ }
132
+ button,
133
+ html input[type="button"],
134
+ input[type="reset"],
135
+ input[type="submit"] {
136
+ -webkit-appearance: button;
137
+ cursor: pointer;
138
+ }
139
+ button[disabled],
140
+ html input[disabled] {
141
+ cursor: default;
142
+ }
143
+ button::-moz-focus-inner,
144
+ input::-moz-focus-inner {
145
+ border: 0;
146
+ padding: 0;
147
+ }
148
+ input {
149
+ line-height: normal;
150
+ }
151
+ input[type="checkbox"],
152
+ input[type="radio"] {
153
+ -webkit-box-sizing: border-box;
154
+ -moz-box-sizing: border-box;
155
+ box-sizing: border-box;
156
+ padding: 0;
157
+ }
158
+ input[type="number"]::-webkit-inner-spin-button,
159
+ input[type="number"]::-webkit-outer-spin-button {
160
+ height: auto;
161
+ }
162
+ input[type="search"] {
163
+ -webkit-appearance: textfield;
164
+ -moz-box-sizing: content-box;
165
+ -webkit-box-sizing: content-box;
166
+ box-sizing: content-box;
167
+ }
168
+ input[type="search"]::-webkit-search-cancel-button,
169
+ input[type="search"]::-webkit-search-decoration {
170
+ -webkit-appearance: none;
171
+ }
172
+ fieldset {
173
+ border: 1px solid #c0c0c0;
174
+ margin: 0 2px;
175
+ padding: 0.35em 0.625em 0.75em;
176
+ }
177
+ legend {
178
+ border: 0;
179
+ padding: 0;
180
+ }
181
+ textarea {
182
+ overflow: auto;
183
+ }
184
+ optgroup {
185
+ font-weight: bold;
186
+ }
187
+ table {
188
+ border-collapse: collapse;
189
+ border-spacing: 0;
190
+ }
191
+ td,
192
+ th {
193
+ padding: 0;
194
+ }
195
+ * {
196
+ -webkit-box-sizing: border-box;
197
+ -moz-box-sizing: border-box;
198
+ box-sizing: border-box;
199
+ }
200
+ *:before,
201
+ *:after {
202
+ -webkit-box-sizing: border-box;
203
+ -moz-box-sizing: border-box;
204
+ box-sizing: border-box;
205
+ }
206
+ html {
207
+ font-size: 10px;
208
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
209
+ }
210
+ body {
211
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
212
+ font-size: 14px;
213
+ line-height: 1.42857143;
214
+ color: #333333;
215
+ background-color: #ffffff;
216
+ }
217
+ input,
218
+ button,
219
+ select,
220
+ textarea {
221
+ font-family: inherit;
222
+ font-size: inherit;
223
+ line-height: inherit;
224
+ }
225
+ a {
226
+ color: #337ab7;
227
+ text-decoration: none;
228
+ }
229
+ a:hover,
230
+ a:focus {
231
+ color: #23527c;
232
+ text-decoration: underline;
233
+ }
234
+ a:focus {
235
+ outline: thin dotted;
236
+ outline: 5px auto -webkit-focus-ring-color;
237
+ outline-offset: -2px;
238
+ }
239
+ figure {
240
+ margin: 0;
241
+ }
242
+ img {
243
+ vertical-align: middle;
244
+ }
245
+ .img-responsive {
246
+ display: block;
247
+ max-width: 100%;
248
+ height: auto;
249
+ }
250
+ .img-rounded {
251
+ border-radius: 6px;
252
+ }
253
+ .img-thumbnail {
254
+ padding: 4px;
255
+ line-height: 1.42857143;
256
+ background-color: #ffffff;
257
+ border: 1px solid #dddddd;
258
+ border-radius: 4px;
259
+ -webkit-transition: all 0.2s ease-in-out;
260
+ -o-transition: all 0.2s ease-in-out;
261
+ transition: all 0.2s ease-in-out;
262
+ display: inline-block;
263
+ max-width: 100%;
264
+ height: auto;
265
+ }
266
+ .img-circle {
267
+ border-radius: 50%;
268
+ }
269
+ hr {
270
+ margin-top: 20px;
271
+ margin-bottom: 20px;
272
+ border: 0;
273
+ border-top: 1px solid #eeeeee;
274
+ }
275
+ .sr-only {
276
+ position: absolute;
277
+ width: 1px;
278
+ height: 1px;
279
+ margin: -1px;
280
+ padding: 0;
281
+ overflow: hidden;
282
+ clip: rect(0, 0, 0, 0);
283
+ border: 0;
284
+ }
285
+ .sr-only-focusable:active,
286
+ .sr-only-focusable:focus {
287
+ position: static;
288
+ width: auto;
289
+ height: auto;
290
+ margin: 0;
291
+ overflow: visible;
292
+ clip: auto;
293
+ }
294
+ .caret {
295
+ display: inline-block;
296
+ width: 0;
297
+ height: 0;
298
+ margin-left: 2px;
299
+ vertical-align: middle;
300
+ border-top: 4px solid;
301
+ border-right: 4px solid transparent;
302
+ border-left: 4px solid transparent;
303
+ }
304
+ .dropdown {
305
+ position: relative;
306
+ }
307
+ .dropdown-toggle:focus {
308
+ outline: 0;
309
+ }
310
+ .dropdown-menu {
311
+ position: absolute;
312
+ top: 100%;
313
+ left: 0;
314
+ z-index: 1000;
315
+ display: none;
316
+ float: left;
317
+ min-width: 160px;
318
+ padding: 5px 0;
319
+ margin: 2px 0 0;
320
+ list-style: none;
321
+ font-size: 14px;
322
+ text-align: left;
323
+ background-color: #ffffff;
324
+ border: 1px solid #cccccc;
325
+ border: 1px solid rgba(0, 0, 0, 0.15);
326
+ border-radius: 4px;
327
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
328
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
329
+ -webkit-background-clip: padding-box;
330
+ background-clip: padding-box;
331
+ }
332
+ .dropdown-menu.pull-right {
333
+ right: 0;
334
+ left: auto;
335
+ }
336
+ .dropdown-menu .divider {
337
+ height: 1px;
338
+ margin: 9px 0;
339
+ overflow: hidden;
340
+ background-color: #e5e5e5;
341
+ }
342
+ .dropdown-menu > li > a {
343
+ display: block;
344
+ padding: 3px 20px;
345
+ clear: both;
346
+ font-weight: normal;
347
+ line-height: 1.42857143;
348
+ color: #333333;
349
+ white-space: nowrap;
350
+ }
351
+ .dropdown-menu > li > a:hover,
352
+ .dropdown-menu > li > a:focus {
353
+ text-decoration: none;
354
+ color: #262626;
355
+ background-color: #f5f5f5;
356
+ }
357
+ .dropdown-menu > .active > a,
358
+ .dropdown-menu > .active > a:hover,
359
+ .dropdown-menu > .active > a:focus {
360
+ color: #ffffff;
361
+ text-decoration: none;
362
+ outline: 0;
363
+ background-color: #337ab7;
364
+ }
365
+ .dropdown-menu > .disabled > a,
366
+ .dropdown-menu > .disabled > a:hover,
367
+ .dropdown-menu > .disabled > a:focus {
368
+ color: #777777;
369
+ }
370
+ .dropdown-menu > .disabled > a:hover,
371
+ .dropdown-menu > .disabled > a:focus {
372
+ text-decoration: none;
373
+ background-color: transparent;
374
+ background-image: none;
375
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
376
+ cursor: not-allowed;
377
+ }
378
+ .open > .dropdown-menu {
379
+ display: block;
380
+ }
381
+ .open > a {
382
+ outline: 0;
383
+ }
384
+ .dropdown-menu-right {
385
+ left: auto;
386
+ right: 0;
387
+ }
388
+ .dropdown-menu-left {
389
+ left: 0;
390
+ right: auto;
391
+ }
392
+ .dropdown-header {
393
+ display: block;
394
+ padding: 3px 20px;
395
+ font-size: 12px;
396
+ line-height: 1.42857143;
397
+ color: #777777;
398
+ white-space: nowrap;
399
+ }
400
+ .dropdown-backdrop {
401
+ position: fixed;
402
+ left: 0;
403
+ right: 0;
404
+ bottom: 0;
405
+ top: 0;
406
+ z-index: 990;
407
+ }
408
+ .pull-right > .dropdown-menu {
409
+ right: 0;
410
+ left: auto;
411
+ }
412
+ .dropup .caret,
413
+ .navbar-fixed-bottom .dropdown .caret {
414
+ border-top: 0;
415
+ border-bottom: 4px solid;
416
+ content: "";
417
+ }
418
+ .dropup .dropdown-menu,
419
+ .navbar-fixed-bottom .dropdown .dropdown-menu {
420
+ top: auto;
421
+ bottom: 100%;
422
+ margin-bottom: 1px;
423
+ }
424
+ @media (min-width: 768px) {
425
+ .navbar-right .dropdown-menu {
426
+ left: auto;
427
+ right: 0;
428
+ }
429
+ .navbar-right .dropdown-menu-left {
430
+ left: 0;
431
+ right: auto;
432
+ }
433
+ }
434
+ .clearfix:before,
435
+ .clearfix:after {
436
+ content: " ";
437
+ display: table;
438
+ }
439
+ .clearfix:after {
440
+ clear: both;
441
+ }
442
+ .center-block {
443
+ display: block;
444
+ margin-left: auto;
445
+ margin-right: auto;
446
+ }
447
+ .pull-right {
448
+ float: right !important;
449
+ }
450
+ .pull-left {
451
+ float: left !important;
452
+ }
453
+ .hide {
454
+ display: none !important;
455
+ }
456
+ .show {
457
+ display: block !important;
458
+ }
459
+ .invisible {
460
+ visibility: hidden;
461
+ }
462
+ .text-hide {
463
+ font: 0/0 a;
464
+ color: transparent;
465
+ text-shadow: none;
466
+ background-color: transparent;
467
+ border: 0;
468
+ }
469
+ .hidden {
470
+ display: none !important;
471
+ visibility: hidden !important;
472
+ }
473
+ .affix {
474
+ position: fixed;
475
+ }