cassandra-web 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 53d8aa9c9c20ec6206ea58e50cbf9a083bb4ed71
4
+ data.tar.gz: 06df7e43ed2aac23627c6ba3ee6adeb5f1369bb4
5
+ SHA512:
6
+ metadata.gz: d7c5526216abfb64f56585afe08826e798fa023ea653b86214c5fa100ab31e85f3ff21e6709cfc486a8cc0de06ef0e0d1f9e088d098c73396ac61e69bd0ee8da
7
+ data.tar.gz: 625bee17a8be877807a54098fc0b6c02cd41e428ff121b8de07d2dda93d95dd1386c998003c5f34db823215a9603ee78d99088e635fb162a846d457a197e9d88
data/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # Cassandra Web
2
+
3
+ A web interface to Apache Cassandra with AngularJS and server-sent events.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ gem install cassandra-web
9
+ cassandra-web
10
+ ```
11
+
12
+ Run `cassandra-web -h` for futher help
13
+
14
+ ## Credits
15
+
16
+ Cassandra web is possible because of the following awesome technologies (in no particular order):
17
+
18
+ * [Apache Cassandra](http://cassandra.apache.org/)
19
+ * [AngularJS](https://angularjs.org/)
20
+ * [Twitter Bootstrap](http://getbootstrap.com/)
21
+ * [Thin](http://code.macournoyer.com/thin/)
22
+ * [Server Sent Events](http://www.w3.org/TR/2012/WD-eventsource-20120426/)
23
+ * [PrismJS](http://prismjs.com/)
24
+ * [CodeMirror](http://codemirror.net/)
25
+ * and many others...
data/app.rb ADDED
@@ -0,0 +1,112 @@
1
+ # encoding: utf-8
2
+
3
+ require 'logger'
4
+
5
+ require 'rubygems'
6
+ require 'bundler/setup'
7
+
8
+ require 'sinatra/base'
9
+ require 'rack/cors'
10
+ require 'rack/parser'
11
+ require 'cassandra'
12
+ require 'json'
13
+
14
+ $: << File.expand_path('../', __FILE__)
15
+
16
+ class App < Sinatra::Base
17
+ configure do
18
+ set :root, File.expand_path('../', __FILE__) + '/app'
19
+
20
+ enable :static
21
+ disable :views
22
+ disable :method_override
23
+ disable :protection
24
+ end
25
+
26
+ use Rack::Cors do
27
+ allow do
28
+ origins /.*/
29
+ resource '/*',
30
+ :methods => [:get, :post, :put, :delete, :options],
31
+ :expose => ['Location'],
32
+ :headers => :any
33
+ end
34
+ end
35
+
36
+ use Rack::Parser, :content_types => {
37
+ 'application/json' => JSON.method(:load)
38
+ }
39
+
40
+ get '/events/?' do
41
+ status 200
42
+ content_type 'text/event-stream'
43
+ headers 'Connection' => 'keep-alive'
44
+
45
+ stream(:keep_open) do |out|
46
+ send_events(out)
47
+ end
48
+ end
49
+
50
+ get '/hosts/?' do
51
+ status 200
52
+ content_type 'application/json'
53
+
54
+ json_dump(cluster.hosts)
55
+ end
56
+
57
+ get '/keyspaces/?' do
58
+ status 200
59
+ content_type 'application/json'
60
+
61
+ json_dump(cluster.keyspaces)
62
+ end
63
+
64
+ get '/consistencies/' do
65
+ status 200
66
+ content_type 'application/json'
67
+
68
+ json_dump(Cassandra::CONSISTENCIES)
69
+ end
70
+
71
+ post '/execute/?' do
72
+ content_type 'application/json'
73
+
74
+ begin
75
+ statement = params['statement']
76
+ statement.strip!
77
+ statement.chomp!(";")
78
+
79
+ options = {
80
+ :consistency => :quorum,
81
+ :trace => false
82
+ }
83
+
84
+ if params['options']
85
+ options[:trace] = !!params['options']['trace'] if params['options'].has_key?('trace')
86
+ options[:consistency] = params['options']['consistency'].to_sym if params['options'].has_key?('consistency') && Cassandra::CONSISTENCIES.include?(params['options']['consistency'].to_sym)
87
+ end
88
+
89
+ status 200
90
+ json_dump(session.execute(statement, options))
91
+ rescue Cassandra::Errors::NoHostsAvailable => e
92
+ status 503
93
+ json_dump(e)
94
+ rescue Cassandra::Errors::QueryError => e
95
+ status 400
96
+ json_dump(e)
97
+ rescue => e
98
+ status 500
99
+ json_dump(e)
100
+ end
101
+ end
102
+
103
+ get '*' do
104
+ File.read(File.join(settings.public_folder, 'main.html'))
105
+ end
106
+ end
107
+
108
+ require 'app/helpers/json'
109
+ require 'app/helpers/sse'
110
+
111
+ App.helpers App::Helpers::JSON
112
+ App.helpers App::Helpers::SSE
@@ -0,0 +1,178 @@
1
+ # encoding: utf-8
2
+
3
+ class App
4
+ module Helpers
5
+ module JSON
6
+ def json_dump(object)
7
+ ::JSON.dump(object_hash(object))
8
+ end
9
+
10
+ private
11
+
12
+ def object_hash(object)
13
+ case object
14
+ when ::Cassandra::Host
15
+ host_hash(object)
16
+ when ::Cassandra::Keyspace
17
+ keyspace_hash(object)
18
+ when ::Cassandra::Result
19
+ result_hash(object)
20
+ when ::Cassandra::Errors::NoHostsAvailable
21
+ no_hosts_available_error_hash(object)
22
+ when ::Cassandra::Errors::QueryError
23
+ query_error_hash(object)
24
+ when ::Exception
25
+ error_hash(object)
26
+ when ::Hash
27
+ hash = ::Hash.new
28
+ object.each do |key, value|
29
+ hash[key] = object_hash(value)
30
+ end
31
+ hash
32
+ when ::Enumerable
33
+ object.map(&method(:object_hash))
34
+ when ::String
35
+ begin
36
+ object.encode('utf-8')
37
+ rescue Encoding::UndefinedConversionError
38
+ '0x' + object.unpack('H*').first
39
+ end
40
+ when nil
41
+ 'null'
42
+ else
43
+ object.to_s
44
+ end
45
+ end
46
+
47
+ def object_key(object)
48
+ case object
49
+ when ::Cassandra::Host
50
+ object.ip
51
+ when ::Cassandra::Keyspace
52
+ object.name
53
+ else
54
+ raise "unsupported object #{object.inspect}"
55
+ end
56
+ end
57
+
58
+ def host_hash(host)
59
+ {
60
+ :ip => host.ip,
61
+ :id => host.id,
62
+ :datacenter => host.datacenter,
63
+ :rack => host.rack,
64
+ :release_version => host.release_version,
65
+ :status => host.status
66
+ }
67
+ end
68
+
69
+ def keyspace_hash(keyspace)
70
+ {
71
+ :name => keyspace.name,
72
+ :cql => keyspace.to_cql,
73
+ :tables => keyspace.tables.map do |table|
74
+ {
75
+ :name => table.name,
76
+ :cql => table.to_cql,
77
+ :columns => table.columns.map do |column|
78
+ {
79
+ :name => column.name,
80
+ :type => column_type_hash(column.type),
81
+ :order => column.order
82
+ }
83
+ end
84
+ }
85
+ end
86
+ }
87
+ end
88
+
89
+ def column_type_hash(column_type)
90
+ case column_type
91
+ when Array
92
+ column_type.first.to_s + '<' + column_type.slice(1..-1).join(', ') + '>'
93
+ else
94
+ column_type
95
+ end
96
+ end
97
+
98
+ def result_hash(result)
99
+ {
100
+ :rows => result.map(&method(:object_hash)),
101
+ :columns => columns_hash(result.first),
102
+ :info => execution_info_hash(result.execution_info),
103
+ }
104
+ end
105
+
106
+ def columns_hash(row)
107
+ return [] if row.nil?
108
+ row.keys
109
+ end
110
+
111
+ def execution_info_hash(execution_info)
112
+ {
113
+ :keyspace => execution_info.keyspace,
114
+ :statement => statement_hash(execution_info.statement),
115
+ :options => execution_options_hash(execution_info.options),
116
+ :hosts => execution_info.hosts.map(&method(:host_hash)),
117
+ :consistency => execution_info.consistency,
118
+ :retries => execution_info.retries,
119
+ :trace => execution_info.trace && execution_trace_hash(execution_info.trace)
120
+ }
121
+ end
122
+
123
+ def statement_hash(statement)
124
+ {
125
+ :cql => statement.cql
126
+ }
127
+ end
128
+
129
+ def execution_options_hash(execution_options)
130
+ {
131
+ :consistency => execution_options.consistency,
132
+ :serial_consistency => execution_options.serial_consistency,
133
+ :page_size => execution_options.page_size,
134
+ :timeout => execution_options.timeout,
135
+ :trace => execution_options.trace?
136
+ }
137
+ end
138
+
139
+ def execution_trace_hash(execution_trace)
140
+ {
141
+ :id => execution_trace.id,
142
+ :coordinator => execution_trace.coordinator,
143
+ :duration => execution_trace.duration,
144
+ :parameters => execution_trace.parameters,
145
+ :request => execution_trace.request,
146
+ :started_at => execution_trace.started_at,
147
+ :events => execution_trace.events.map(&method(:execution_trace_event_hash))
148
+ }
149
+ end
150
+
151
+ def execution_trace_event_hash(execution_trace_event)
152
+ {
153
+ :id => execution_trace_event.id,
154
+ :activity => execution_trace_event.activity,
155
+ :source => execution_trace_event.source,
156
+ :source_elapsed => execution_trace_event.source_elapsed,
157
+ :thread => execution_trace_event.thread
158
+ }
159
+ end
160
+
161
+ def error_hash(error)
162
+ {
163
+ :class => error.class.name,
164
+ :message => error.message,
165
+ :trace => error.backtrace
166
+ }
167
+ end
168
+
169
+ def query_error_hash(error)
170
+ error_hash(error)
171
+ end
172
+
173
+ def no_hosts_available_error_hash(error)
174
+ error_hash(error)
175
+ end
176
+ end
177
+ end
178
+ end
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+
3
+ class App
4
+ module Helpers
5
+ module SSE
6
+ class Streamer
7
+ include Helpers::JSON
8
+
9
+ def initialize(out)
10
+ @out = out
11
+ end
12
+
13
+ def host_found(host)
14
+ @out << "event: host_found\ndata: #{json_dump(host)}\n\n"
15
+ end
16
+
17
+ def host_up(host)
18
+ @out << "event: host_up\ndata: #{json_dump(host)}\n\n"
19
+ end
20
+
21
+ def host_down(host)
22
+ @out << "event: host_down\ndata: #{json_dump(host)}\n\n"
23
+ end
24
+
25
+ def host_lost(host)
26
+ @out << "event: host_lost\ndata: #{json_dump(host)}\n\n"
27
+ end
28
+
29
+ def keyspace_created(keyspace)
30
+ @out << "event: keyspace_created\ndata: #{json_dump(keyspace)}\n\n"
31
+ end
32
+
33
+ def keyspace_changed(keyspace)
34
+ @out << "event: keyspace_changed\ndata: #{json_dump(keyspace)}\n\n"
35
+ end
36
+
37
+ def keyspace_dropped(keyspace)
38
+ @out << "event: keyspace_dropped\ndata: #{json_dump(keyspace)}\n\n"
39
+ end
40
+ end
41
+
42
+ def send_events(out)
43
+ listener = Streamer.new(out)
44
+ heartbeat = EM.add_periodic_timer(2) { out << "\n" }
45
+
46
+ cluster.register(listener)
47
+
48
+ out.callback do
49
+ heartbeat.cancel
50
+ cluster.unregister(listener)
51
+ end
52
+
53
+ out.errback do |error|
54
+ heartbeat.cancel
55
+ cluster.unregister(listener)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,442 @@
1
+ /*!
2
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
3
+ * Copyright 2011-2014 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */
6
+
7
+ .btn-default,
8
+ .btn-primary,
9
+ .btn-success,
10
+ .btn-info,
11
+ .btn-warning,
12
+ .btn-danger {
13
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
14
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
15
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
16
+ }
17
+ .btn-default:active,
18
+ .btn-primary:active,
19
+ .btn-success:active,
20
+ .btn-info:active,
21
+ .btn-warning:active,
22
+ .btn-danger:active,
23
+ .btn-default.active,
24
+ .btn-primary.active,
25
+ .btn-success.active,
26
+ .btn-info.active,
27
+ .btn-warning.active,
28
+ .btn-danger.active {
29
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
30
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
31
+ }
32
+ .btn:active,
33
+ .btn.active {
34
+ background-image: none;
35
+ }
36
+ .btn-default {
37
+ text-shadow: 0 1px 0 #fff;
38
+ background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
39
+ background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
40
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
41
+ background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
42
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
43
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
44
+ background-repeat: repeat-x;
45
+ border-color: #dbdbdb;
46
+ border-color: #ccc;
47
+ }
48
+ .btn-default:hover,
49
+ .btn-default:focus {
50
+ background-color: #e0e0e0;
51
+ background-position: 0 -15px;
52
+ }
53
+ .btn-default:active,
54
+ .btn-default.active {
55
+ background-color: #e0e0e0;
56
+ border-color: #dbdbdb;
57
+ }
58
+ .btn-default:disabled,
59
+ .btn-default[disabled] {
60
+ background-color: #e0e0e0;
61
+ background-image: none;
62
+ }
63
+ .btn-primary {
64
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
65
+ background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
66
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2));
67
+ background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);
68
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);
69
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
70
+ background-repeat: repeat-x;
71
+ border-color: #2b669a;
72
+ }
73
+ .btn-primary:hover,
74
+ .btn-primary:focus {
75
+ background-color: #2d6ca2;
76
+ background-position: 0 -15px;
77
+ }
78
+ .btn-primary:active,
79
+ .btn-primary.active {
80
+ background-color: #2d6ca2;
81
+ border-color: #2b669a;
82
+ }
83
+ .btn-primary:disabled,
84
+ .btn-primary[disabled] {
85
+ background-color: #2d6ca2;
86
+ background-image: none;
87
+ }
88
+ .btn-success {
89
+ background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
90
+ background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
91
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
92
+ background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
93
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
94
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
95
+ background-repeat: repeat-x;
96
+ border-color: #3e8f3e;
97
+ }
98
+ .btn-success:hover,
99
+ .btn-success:focus {
100
+ background-color: #419641;
101
+ background-position: 0 -15px;
102
+ }
103
+ .btn-success:active,
104
+ .btn-success.active {
105
+ background-color: #419641;
106
+ border-color: #3e8f3e;
107
+ }
108
+ .btn-success:disabled,
109
+ .btn-success[disabled] {
110
+ background-color: #419641;
111
+ background-image: none;
112
+ }
113
+ .btn-info {
114
+ background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
115
+ background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
116
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
117
+ background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
118
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
119
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
120
+ background-repeat: repeat-x;
121
+ border-color: #28a4c9;
122
+ }
123
+ .btn-info:hover,
124
+ .btn-info:focus {
125
+ background-color: #2aabd2;
126
+ background-position: 0 -15px;
127
+ }
128
+ .btn-info:active,
129
+ .btn-info.active {
130
+ background-color: #2aabd2;
131
+ border-color: #28a4c9;
132
+ }
133
+ .btn-info:disabled,
134
+ .btn-info[disabled] {
135
+ background-color: #2aabd2;
136
+ background-image: none;
137
+ }
138
+ .btn-warning {
139
+ background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
140
+ background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
141
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
142
+ background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
143
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
144
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
145
+ background-repeat: repeat-x;
146
+ border-color: #e38d13;
147
+ }
148
+ .btn-warning:hover,
149
+ .btn-warning:focus {
150
+ background-color: #eb9316;
151
+ background-position: 0 -15px;
152
+ }
153
+ .btn-warning:active,
154
+ .btn-warning.active {
155
+ background-color: #eb9316;
156
+ border-color: #e38d13;
157
+ }
158
+ .btn-warning:disabled,
159
+ .btn-warning[disabled] {
160
+ background-color: #eb9316;
161
+ background-image: none;
162
+ }
163
+ .btn-danger {
164
+ background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
165
+ background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
166
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
167
+ background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
168
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
169
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
170
+ background-repeat: repeat-x;
171
+ border-color: #b92c28;
172
+ }
173
+ .btn-danger:hover,
174
+ .btn-danger:focus {
175
+ background-color: #c12e2a;
176
+ background-position: 0 -15px;
177
+ }
178
+ .btn-danger:active,
179
+ .btn-danger.active {
180
+ background-color: #c12e2a;
181
+ border-color: #b92c28;
182
+ }
183
+ .btn-danger:disabled,
184
+ .btn-danger[disabled] {
185
+ background-color: #c12e2a;
186
+ background-image: none;
187
+ }
188
+ .thumbnail,
189
+ .img-thumbnail {
190
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
191
+ box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
192
+ }
193
+ .dropdown-menu > li > a:hover,
194
+ .dropdown-menu > li > a:focus {
195
+ background-color: #e8e8e8;
196
+ background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
197
+ background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
198
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
199
+ background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
200
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
201
+ background-repeat: repeat-x;
202
+ }
203
+ .dropdown-menu > .active > a,
204
+ .dropdown-menu > .active > a:hover,
205
+ .dropdown-menu > .active > a:focus {
206
+ background-color: #357ebd;
207
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
208
+ background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
209
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
210
+ background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
211
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
212
+ background-repeat: repeat-x;
213
+ }
214
+ .navbar-default {
215
+ background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
216
+ background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
217
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
218
+ background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
219
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
220
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
221
+ background-repeat: repeat-x;
222
+ border-radius: 4px;
223
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
224
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
225
+ }
226
+ .navbar-default .navbar-nav > .active > a {
227
+ background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
228
+ background-image: -o-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
229
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f3f3f3));
230
+ background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);
231
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);
232
+ background-repeat: repeat-x;
233
+ -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
234
+ box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
235
+ }
236
+ .navbar-brand,
237
+ .navbar-nav > li > a {
238
+ text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
239
+ }
240
+ .navbar-inverse {
241
+ background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
242
+ background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
243
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
244
+ background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
245
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
246
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
247
+ background-repeat: repeat-x;
248
+ }
249
+ .navbar-inverse .navbar-nav > .active > a {
250
+ background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%);
251
+ background-image: -o-linear-gradient(top, #222 0%, #282828 100%);
252
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#222), to(#282828));
253
+ background-image: linear-gradient(to bottom, #222 0%, #282828 100%);
254
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);
255
+ background-repeat: repeat-x;
256
+ -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
257
+ box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
258
+ }
259
+ .navbar-inverse .navbar-brand,
260
+ .navbar-inverse .navbar-nav > li > a {
261
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
262
+ }
263
+ .navbar-static-top,
264
+ .navbar-fixed-top,
265
+ .navbar-fixed-bottom {
266
+ border-radius: 0;
267
+ }
268
+ .alert {
269
+ text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
270
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
271
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
272
+ }
273
+ .alert-success {
274
+ background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
275
+ background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
276
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
277
+ background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
278
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
279
+ background-repeat: repeat-x;
280
+ border-color: #b2dba1;
281
+ }
282
+ .alert-info {
283
+ background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
284
+ background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
285
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
286
+ background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
287
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
288
+ background-repeat: repeat-x;
289
+ border-color: #9acfea;
290
+ }
291
+ .alert-warning {
292
+ background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
293
+ background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
294
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
295
+ background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
296
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
297
+ background-repeat: repeat-x;
298
+ border-color: #f5e79e;
299
+ }
300
+ .alert-danger {
301
+ background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
302
+ background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
303
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
304
+ background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
305
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
306
+ background-repeat: repeat-x;
307
+ border-color: #dca7a7;
308
+ }
309
+ .progress {
310
+ background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
311
+ background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
312
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
313
+ background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
314
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
315
+ background-repeat: repeat-x;
316
+ }
317
+ .progress-bar {
318
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);
319
+ background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%);
320
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9));
321
+ background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
322
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);
323
+ background-repeat: repeat-x;
324
+ }
325
+ .progress-bar-success {
326
+ background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
327
+ background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
328
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
329
+ background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
330
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
331
+ background-repeat: repeat-x;
332
+ }
333
+ .progress-bar-info {
334
+ background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
335
+ background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
336
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
337
+ background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
338
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
339
+ background-repeat: repeat-x;
340
+ }
341
+ .progress-bar-warning {
342
+ background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
343
+ background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
344
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
345
+ background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
346
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
347
+ background-repeat: repeat-x;
348
+ }
349
+ .progress-bar-danger {
350
+ background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
351
+ background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
352
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
353
+ background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
354
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
355
+ background-repeat: repeat-x;
356
+ }
357
+ .progress-bar-striped {
358
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
359
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
360
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
361
+ }
362
+ .list-group {
363
+ border-radius: 4px;
364
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
365
+ box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
366
+ }
367
+ .list-group-item.active,
368
+ .list-group-item.active:hover,
369
+ .list-group-item.active:focus {
370
+ text-shadow: 0 -1px 0 #3071a9;
371
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);
372
+ background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%);
373
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3));
374
+ background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);
375
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);
376
+ background-repeat: repeat-x;
377
+ border-color: #3278b3;
378
+ }
379
+ .panel {
380
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
381
+ box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
382
+ }
383
+ .panel-default > .panel-heading {
384
+ background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
385
+ background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
386
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
387
+ background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
388
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
389
+ background-repeat: repeat-x;
390
+ }
391
+ .panel-primary > .panel-heading {
392
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
393
+ background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
394
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
395
+ background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
396
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
397
+ background-repeat: repeat-x;
398
+ }
399
+ .panel-success > .panel-heading {
400
+ background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
401
+ background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
402
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
403
+ background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
404
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
405
+ background-repeat: repeat-x;
406
+ }
407
+ .panel-info > .panel-heading {
408
+ background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
409
+ background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
410
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
411
+ background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
412
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
413
+ background-repeat: repeat-x;
414
+ }
415
+ .panel-warning > .panel-heading {
416
+ background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
417
+ background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
418
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
419
+ background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
420
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
421
+ background-repeat: repeat-x;
422
+ }
423
+ .panel-danger > .panel-heading {
424
+ background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
425
+ background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
426
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
427
+ background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
428
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
429
+ background-repeat: repeat-x;
430
+ }
431
+ .well {
432
+ background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
433
+ background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
434
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
435
+ background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
436
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
437
+ background-repeat: repeat-x;
438
+ border-color: #dcdcdc;
439
+ -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
440
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
441
+ }
442
+ /*# sourceMappingURL=bootstrap-theme.css.map */