cassandra-web 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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 */