sequenceserver 3.0.1 → 3.1.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sequenceserver might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/bin/sequenceserver +2 -2
- data/lib/sequenceserver/api_errors.rb +32 -2
- data/lib/sequenceserver/blast/job.rb +20 -3
- data/lib/sequenceserver/blast/report.rb +74 -86
- data/lib/sequenceserver/blast/tasks.rb +38 -0
- data/lib/sequenceserver/config.rb +54 -20
- data/lib/sequenceserver/makeblastdb.rb +16 -2
- data/lib/sequenceserver/report.rb +0 -6
- data/lib/sequenceserver/routes.rb +66 -25
- data/lib/sequenceserver/sequence.rb +35 -7
- data/lib/sequenceserver/server.rb +1 -1
- data/lib/sequenceserver/version.rb +1 -1
- data/lib/sequenceserver.rb +1 -1
- data/public/404.html +1 -1
- data/public/css/app.css +121 -0
- data/public/css/app.min.css +1 -0
- data/public/css/sequenceserver.css +0 -148
- data/public/css/sequenceserver.min.css +3 -3
- data/public/js/circos.js +2 -2
- data/public/js/collapse_preferences.js +37 -0
- data/public/js/databases.js +65 -37
- data/public/js/databases_tree.js +2 -1
- data/public/js/dnd.js +37 -50
- data/public/js/download_fasta.js +1 -0
- data/public/js/form.js +79 -50
- data/public/js/grapher.js +23 -37
- data/public/js/hits_overview.js +2 -2
- data/public/js/kablammo.js +2 -2
- data/public/js/length_distribution.js +3 -3
- data/public/js/null_plugins/grapher/histogram.js +25 -0
- data/public/js/null_plugins/options.js +3 -0
- data/public/js/null_plugins/query_stats.js +11 -0
- data/public/js/null_plugins/report_plugins.js +6 -1
- data/public/js/null_plugins/search_header_plugin.js +4 -0
- data/public/js/options.js +161 -56
- data/public/js/query.js +85 -59
- data/public/js/report.js +1 -1
- data/public/js/search.js +2 -0
- data/public/js/search_button.js +67 -56
- data/public/js/sidebar.js +10 -1
- data/public/js/tests/database.spec.js +5 -5
- data/public/js/tests/form.spec.js +98 -0
- data/public/js/tests/mock_data/databases.json +5 -5
- data/public/js/tests/mocks/circos.js +6 -0
- data/public/js/tests/report.spec.js +4 -3
- data/public/js/tests/search_query.spec.js +16 -6
- data/public/sequenceserver-report.min.js +46 -24
- data/public/sequenceserver-search.min.js +57 -13
- data/public/sequenceserver_logo.webp +0 -0
- data/views/blastn_options.erb +66 -66
- data/views/blastp_options.erb +59 -59
- data/views/blastx_options.erb +68 -68
- data/views/layout.erb +61 -3
- data/views/search.erb +33 -38
- data/views/search_layout.erb +153 -0
- data/views/tblastn_options.erb +57 -57
- data/views/tblastx_options.erb +64 -64
- metadata +51 -22
- data/lib/sequenceserver/makeblastdb-modified-with-cache.rb +0 -345
- data/public/SequenceServer_logo.png +0 -0
- data/public/js/tests/advanced_parameters.spec.js +0 -36
@@ -5,9 +5,11 @@ require 'rest-client'
|
|
5
5
|
|
6
6
|
require 'sequenceserver/job'
|
7
7
|
require 'sequenceserver/blast'
|
8
|
+
require 'sequenceserver/blast/tasks'
|
8
9
|
require 'sequenceserver/report'
|
9
10
|
require 'sequenceserver/database'
|
10
11
|
require 'sequenceserver/sequence'
|
12
|
+
require 'rack/csrf'
|
11
13
|
|
12
14
|
module SequenceServer
|
13
15
|
# Controller.
|
@@ -32,6 +34,8 @@ module SequenceServer
|
|
32
34
|
# Override in config.ru if the instance is served under a subpath
|
33
35
|
# e.g. for example.org/our-sequenceserver set to '/our-sequenceserver'
|
34
36
|
set :root_path_prefix, ''
|
37
|
+
|
38
|
+
set :search_layout, :'search_layout'
|
35
39
|
end
|
36
40
|
|
37
41
|
# See
|
@@ -55,6 +59,14 @@ module SequenceServer
|
|
55
59
|
frame_options = SequenceServer.config[:frame_options]
|
56
60
|
frame_options && { frame_options: frame_options }
|
57
61
|
}
|
62
|
+
|
63
|
+
use(
|
64
|
+
Rack::Session::Cookie,
|
65
|
+
key: 'rack.session.sequenceserver',
|
66
|
+
secret: ENV.fetch('SESSION_SECRET') { SecureRandom.alphanumeric(64) }
|
67
|
+
)
|
68
|
+
|
69
|
+
use Rack::Csrf, raise: true, skip: ['POST:/cloud_share']
|
58
70
|
end
|
59
71
|
|
60
72
|
unless ENV['SEQUENCE_SERVER_COMPRESS_RESPONSES'] == 'false'
|
@@ -74,7 +86,7 @@ module SequenceServer
|
|
74
86
|
|
75
87
|
# Returns base HTML. Rest happens client-side: rendering the search form.
|
76
88
|
get '/' do
|
77
|
-
erb :search, layout:
|
89
|
+
erb :search, layout: settings.search_layout
|
78
90
|
end
|
79
91
|
|
80
92
|
# Returns data that is used to render the search form client side. These
|
@@ -83,7 +95,8 @@ module SequenceServer
|
|
83
95
|
searchdata = {
|
84
96
|
query: Database.retrieve(params[:query]),
|
85
97
|
database: Database.all,
|
86
|
-
options: SequenceServer.config[:options]
|
98
|
+
options: SequenceServer.config[:options],
|
99
|
+
blastTaskMap: SequenceServer::BLAST::Tasks.to_h
|
87
100
|
}
|
88
101
|
|
89
102
|
searchdata.update(tree: Database.tree) if SequenceServer.config[:databases_widget] == 'tree'
|
@@ -100,7 +113,7 @@ module SequenceServer
|
|
100
113
|
post '/' do
|
101
114
|
if params[:input_sequence]
|
102
115
|
@input_sequence = params[:input_sequence]
|
103
|
-
erb :search, layout:
|
116
|
+
erb :search, layout: settings.search_layout
|
104
117
|
else
|
105
118
|
job = Job.create(params)
|
106
119
|
redirect to("/#{job.id}")
|
@@ -114,24 +127,11 @@ module SequenceServer
|
|
114
127
|
halt 404, { error: 'Job not found' }.to_json if job.nil?
|
115
128
|
halt 202 unless job.done?
|
116
129
|
|
117
|
-
report = Report.
|
130
|
+
report = BLAST::Report.new(job)
|
118
131
|
halt 202 unless report.done?
|
119
132
|
|
120
|
-
display_large_result_warning
|
121
|
-
|
122
|
-
params[:bypass_file_size_warning] != 'true' &&
|
123
|
-
report.xml_file_size > SequenceServer.config[:large_result_warning_threshold]
|
124
|
-
|
125
|
-
if display_large_result_warning
|
126
|
-
halt 200,
|
127
|
-
{
|
128
|
-
user_warning: 'LARGE_RESULT',
|
129
|
-
download_links: [
|
130
|
-
{ name: 'Standard Tabular Report', url: "download/#{jid}.std_tsv" },
|
131
|
-
{ name: 'Full Tabular Report', url: "/download/#{jid}.full_tsv" },
|
132
|
-
{ name: 'Results in XML', url: "/download/#{jid}.xml" }
|
133
|
-
]
|
134
|
-
}.to_json
|
133
|
+
if display_large_result_warning?(report.xml_file_size)
|
134
|
+
halt 200, large_result_warning_payload(jid).to_json
|
135
135
|
end
|
136
136
|
|
137
137
|
report.to_json
|
@@ -156,15 +156,35 @@ module SequenceServer
|
|
156
156
|
# in identifiers) and retreival_databases (we don't allow whitespace in a
|
157
157
|
# database's name, so it's safe).
|
158
158
|
get '/get_sequence/' do
|
159
|
-
sequence_ids = params[:sequence_ids].split(',')
|
160
|
-
database_ids = params[:database_ids].split(',')
|
159
|
+
sequence_ids = params[:sequence_ids].to_s.split(',')
|
160
|
+
database_ids = params[:database_ids].to_s.split(',')
|
161
|
+
if sequence_ids.empty?
|
162
|
+
status 422
|
163
|
+
return { error: 'No sequence ids provided' }.to_json
|
164
|
+
end
|
165
|
+
|
166
|
+
if database_ids.empty?
|
167
|
+
status 422
|
168
|
+
return { error: 'No database ids provided' }.to_json
|
169
|
+
end
|
161
170
|
sequences = Sequence::Retriever.new(sequence_ids, database_ids)
|
162
171
|
sequences.to_json
|
163
172
|
end
|
164
173
|
|
165
174
|
post '/get_sequence' do
|
166
|
-
sequence_ids = params['sequence_ids'].split(',')
|
167
|
-
database_ids = params['database_ids'].split(',')
|
175
|
+
sequence_ids = params['sequence_ids'].to_s.split(',')
|
176
|
+
database_ids = params['database_ids'].to_s.split(',')
|
177
|
+
|
178
|
+
if sequence_ids.empty?
|
179
|
+
status 422
|
180
|
+
return 'No sequence ids provided'
|
181
|
+
end
|
182
|
+
|
183
|
+
if database_ids.empty?
|
184
|
+
status 422
|
185
|
+
return 'No database ids provided'
|
186
|
+
end
|
187
|
+
|
168
188
|
sequences = Sequence::Retriever.new(sequence_ids, database_ids, true)
|
169
189
|
send_file(sequences.file.path,
|
170
190
|
type: sequences.mime,
|
@@ -307,12 +327,33 @@ module SequenceServer
|
|
307
327
|
# the user hits the back button. Thus we do not test for empty string.
|
308
328
|
method = job.method.to_sym
|
309
329
|
if job.advanced && job.advanced !=
|
310
|
-
searchdata
|
330
|
+
searchdata.dig(:options, method, :default, :attributes).to_a.join(' ')
|
311
331
|
searchdata[:options] = searchdata[:options].deep_copy
|
312
|
-
searchdata[:options][method]['last search'] = [job.advanced]
|
332
|
+
searchdata[:options][method]['last search'] = { attributes: [job.advanced] }
|
313
333
|
end
|
314
334
|
end
|
315
335
|
|
336
|
+
def display_large_result_warning?(xml_file_size)
|
337
|
+
threshold = SequenceServer.config[:large_result_warning_threshold].to_i
|
338
|
+
return false unless threshold.positive?
|
339
|
+
|
340
|
+
return false if params[:bypass_file_size_warning] == 'true'
|
341
|
+
|
342
|
+
xml_file_size > threshold
|
343
|
+
end
|
344
|
+
|
345
|
+
def large_result_warning_payload(jid)
|
346
|
+
{
|
347
|
+
user_warning: 'LARGE_RESULT',
|
348
|
+
download_links: [
|
349
|
+
{ name: 'Standard Tabular Report', url: "download/#{jid}.std_tsv" },
|
350
|
+
{ name: 'Full Tabular Report', url: "/download/#{jid}.full_tsv" },
|
351
|
+
{ name: 'Results in XML', url: "/download/#{jid}.xml" },
|
352
|
+
{ name: 'Pairwise', url: "/download/#{jid}.pairwise" },
|
353
|
+
]
|
354
|
+
}
|
355
|
+
end
|
356
|
+
|
316
357
|
helpers do
|
317
358
|
def root_path_prefix
|
318
359
|
settings.root_path_prefix.to_s
|
@@ -180,7 +180,7 @@ module SequenceServer
|
|
180
180
|
@database_ids = Array database_ids
|
181
181
|
@in_file = in_file
|
182
182
|
|
183
|
-
validate && run
|
183
|
+
validate && create_entry_batch_file && run
|
184
184
|
end
|
185
185
|
|
186
186
|
attr_reader :sequence_ids, :database_ids, :in_file, :sequences
|
@@ -197,10 +197,9 @@ module SequenceServer
|
|
197
197
|
def run
|
198
198
|
command = "blastdbcmd -outfmt '%g %i %a %t %s'" \
|
199
199
|
" -db '#{database_names.join(' ')}'" \
|
200
|
-
" -
|
200
|
+
" -entry_batch '#{@batch_file.path}'"
|
201
201
|
|
202
202
|
out, = sys(command, path: config[:bin])
|
203
|
-
|
204
203
|
@sequences = out.each_line.map do |line|
|
205
204
|
# Stop codons in amino acid sequence databases show up as invalid
|
206
205
|
# UTF-8 characters in the output and cause the subsequent call to
|
@@ -208,6 +207,8 @@ module SequenceServer
|
|
208
207
|
line = line.encode('UTF-8', invalid: :replace, replace: 'X')
|
209
208
|
Sequence.new(*line.chomp.split(' '))
|
210
209
|
end
|
210
|
+
|
211
|
+
@batch_file.unlink
|
211
212
|
extend(IO) && write if in_file
|
212
213
|
end
|
213
214
|
|
@@ -221,11 +222,38 @@ module SequenceServer
|
|
221
222
|
|
222
223
|
def validate
|
223
224
|
ids = Database.ids
|
224
|
-
|
225
|
-
|
225
|
+
unless database_ids.is_a?(Array) &&
|
226
|
+
!database_ids.empty? &&
|
227
|
+
(ids & database_ids).length == database_ids.length
|
228
|
+
|
229
|
+
fail(
|
230
|
+
DatabaseUnreachableError,
|
231
|
+
"Database id should be one of: #{ids.join("\n")}"
|
232
|
+
)
|
233
|
+
end
|
234
|
+
|
235
|
+
valid_id_regex = /\A[a-zA-Z0-9-_.:*#|\[\]]+\z/
|
236
|
+
invalid_sequence_ids = sequence_ids.reject do |id|
|
237
|
+
id =~ valid_id_regex
|
238
|
+
end
|
226
239
|
|
227
|
-
|
228
|
-
|
240
|
+
unless invalid_sequence_ids.empty?
|
241
|
+
fail(
|
242
|
+
InvalidSequenceIdError,
|
243
|
+
"Invalid sequence id(s): #{invalid_sequence_ids.join(', ')}"
|
244
|
+
)
|
245
|
+
end
|
246
|
+
|
247
|
+
true
|
248
|
+
end
|
249
|
+
|
250
|
+
##
|
251
|
+
# Create a temporary file containing sequence ids to fetch.
|
252
|
+
def create_entry_batch_file
|
253
|
+
@batch_file = Tempfile.new("#{Time.now}_batch").tap do |f|
|
254
|
+
f.write(sequence_ids.join("\n"))
|
255
|
+
f.flush
|
256
|
+
end
|
229
257
|
end
|
230
258
|
|
231
259
|
# rubocop:disable Metrics/MethodLength
|
data/lib/sequenceserver.rb
CHANGED
@@ -8,7 +8,7 @@ Encoding.default_internal = 'UTF-8'
|
|
8
8
|
# Top level module / namespace.
|
9
9
|
module SequenceServer
|
10
10
|
# The default version of BLAST that will be downloaded and configured for use.
|
11
|
-
BLAST_VERSION = '2.
|
11
|
+
BLAST_VERSION = '2.15.0+'.freeze
|
12
12
|
|
13
13
|
# Default location of configuration file.
|
14
14
|
DEFAULT_CONFIG_FILE = '~/.sequenceserver.conf'.freeze
|
data/public/404.html
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
<body class="bg-light text-dark text-center">
|
16
16
|
|
17
|
-
<img src="
|
17
|
+
<img src="/sequenceserver_logo.webp" alt="SequenceServer Logo" class="mt-5 mb-3" style="max-width: 200px;">
|
18
18
|
|
19
19
|
<div class="container" style="margin-top: 10%;">
|
20
20
|
<h1 class="display-4">404 Not Found</h1>
|
data/public/css/app.css
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
@tailwind base;
|
2
|
+
@tailwind components;
|
3
|
+
@tailwind utilities;
|
4
|
+
|
5
|
+
|
6
|
+
/* Backported bootstrap tooltip styles */
|
7
|
+
|
8
|
+
.tooltip {
|
9
|
+
position: absolute;
|
10
|
+
z-index: 1070;
|
11
|
+
display: block;
|
12
|
+
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
13
|
+
font-style: normal;
|
14
|
+
font-weight: 400;
|
15
|
+
line-height: 1.42857143;
|
16
|
+
line-break: auto;
|
17
|
+
text-align: left;
|
18
|
+
text-align: start;
|
19
|
+
text-decoration: none;
|
20
|
+
text-shadow: none;
|
21
|
+
text-transform: none;
|
22
|
+
letter-spacing: normal;
|
23
|
+
word-break: normal;
|
24
|
+
word-spacing: normal;
|
25
|
+
word-wrap: normal;
|
26
|
+
white-space: normal;
|
27
|
+
font-size: 12px;
|
28
|
+
filter: alpha(opacity=0);
|
29
|
+
opacity: 0;
|
30
|
+
}
|
31
|
+
.tooltip.in {
|
32
|
+
filter: alpha(opacity=90);
|
33
|
+
opacity: 0.9;
|
34
|
+
}
|
35
|
+
.tooltip.top {
|
36
|
+
padding: 5px 0;
|
37
|
+
margin-top: -3px;
|
38
|
+
}
|
39
|
+
.tooltip.right {
|
40
|
+
padding: 0 5px;
|
41
|
+
margin-left: 3px;
|
42
|
+
}
|
43
|
+
.tooltip.bottom {
|
44
|
+
padding: 5px 0;
|
45
|
+
margin-top: 3px;
|
46
|
+
}
|
47
|
+
.tooltip.left {
|
48
|
+
padding: 0 5px;
|
49
|
+
margin-left: -3px;
|
50
|
+
}
|
51
|
+
.tooltip.top .tooltip-arrow {
|
52
|
+
bottom: 0;
|
53
|
+
left: 50%;
|
54
|
+
margin-left: -5px;
|
55
|
+
border-width: 5px 5px 0;
|
56
|
+
border-top-color: #000;
|
57
|
+
}
|
58
|
+
.tooltip.top-left .tooltip-arrow {
|
59
|
+
right: 5px;
|
60
|
+
bottom: 0;
|
61
|
+
margin-bottom: -5px;
|
62
|
+
border-width: 5px 5px 0;
|
63
|
+
border-top-color: #000;
|
64
|
+
}
|
65
|
+
.tooltip.top-right .tooltip-arrow {
|
66
|
+
bottom: 0;
|
67
|
+
left: 5px;
|
68
|
+
margin-bottom: -5px;
|
69
|
+
border-width: 5px 5px 0;
|
70
|
+
border-top-color: #000;
|
71
|
+
}
|
72
|
+
.tooltip.right .tooltip-arrow {
|
73
|
+
top: 50%;
|
74
|
+
left: 0;
|
75
|
+
margin-top: -5px;
|
76
|
+
border-width: 5px 5px 5px 0;
|
77
|
+
border-right-color: #000;
|
78
|
+
}
|
79
|
+
.tooltip.left .tooltip-arrow {
|
80
|
+
top: 50%;
|
81
|
+
right: 0;
|
82
|
+
margin-top: -5px;
|
83
|
+
border-width: 5px 0 5px 5px;
|
84
|
+
border-left-color: #000;
|
85
|
+
}
|
86
|
+
.tooltip.bottom .tooltip-arrow {
|
87
|
+
top: 0;
|
88
|
+
left: 50%;
|
89
|
+
margin-left: -5px;
|
90
|
+
border-width: 0 5px 5px;
|
91
|
+
border-bottom-color: #000;
|
92
|
+
}
|
93
|
+
.tooltip.bottom-left .tooltip-arrow {
|
94
|
+
top: 0;
|
95
|
+
right: 5px;
|
96
|
+
margin-top: -5px;
|
97
|
+
border-width: 0 5px 5px;
|
98
|
+
border-bottom-color: #000;
|
99
|
+
}
|
100
|
+
.tooltip.bottom-right .tooltip-arrow {
|
101
|
+
top: 0;
|
102
|
+
left: 5px;
|
103
|
+
margin-top: -5px;
|
104
|
+
border-width: 0 5px 5px;
|
105
|
+
border-bottom-color: #000;
|
106
|
+
}
|
107
|
+
.tooltip-inner {
|
108
|
+
max-width: 200px;
|
109
|
+
padding: 3px 8px;
|
110
|
+
color: #fff;
|
111
|
+
text-align: center;
|
112
|
+
background-color: #000;
|
113
|
+
border-radius: 4px;
|
114
|
+
}
|
115
|
+
.tooltip-arrow {
|
116
|
+
position: absolute;
|
117
|
+
width: 0;
|
118
|
+
height: 0;
|
119
|
+
border-color: transparent;
|
120
|
+
border-style: solid;
|
121
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
/*! tailwindcss v3.4.3 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.bottom-0{bottom:0}.bottom-12{bottom:3rem}.end-1{inset-inline-end:.25rem}.left-0{left:0}.left-1{left:.25rem}.right-0{right:0}.right-2{right:.5rem}.start-1{inset-inline-start:.25rem}.top-0{top:0}.top-2{top:.5rem}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.col-span-2{grid-column:span 2/span 2}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.-mb-px{margin-bottom:-1px}.-ml-8{margin-left:-2rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-5{margin-top:1.25rem}.\!block{display:block!important}.block{display:block}.inline-block{display:inline-block}.\!inline{display:inline!important}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.grid{display:grid}.contents{display:contents}.list-item{display:list-item}.\!hidden{display:none!important}.hidden{display:none}.h-2{height:.5rem}.h-4{height:1rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.max-h-8{max-height:2rem}.max-h-96{max-height:24rem}.min-h-screen{min-height:100vh}.w-3{width:.75rem}.w-4{width:1rem}.w-48{width:12rem}.w-6{width:1.5rem}.w-auto{width:auto}.w-full{width:100%}.max-w-7xl{max-width:80rem}.max-w-screen-xl{max-width:1280px}.flex-auto{flex:1 1 auto}.flex-none{flex:none}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.gap-4{gap:1rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(243 244 246/var(--tw-divide-opacity))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-scroll{overflow-y:scroll}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-tr-lg{border-top-right-radius:.5rem}.border{border-width:1px}.border-x{border-left-width:1px;border-right-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-blue-800{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.border-seqblue{--tw-border-opacity:1;border-color:rgb(27 85 122/var(--tw-border-opacity))}.border-seqorange{--tw-border-opacity:1;border-color:rgb(199 79 19/var(--tw-border-opacity))}.border-transparent{border-color:#0000}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.bg-blue-300{--tw-bg-opacity:1;background-color:rgb(147 197 253/var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.bg-seqblue{--tw-bg-opacity:1;background-color:rgb(27 85 122/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.bg-opacity-75{--tw-bg-opacity:0.75}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.from-white\/90{--tw-gradient-from:#ffffffe6 var(--tw-gradient-from-position);--tw-gradient-to:#fff0 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-gray-100\/90{--tw-gradient-to:#f3f4f6e6 var(--tw-gradient-to-position)}.fill-current{fill:currentColor}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-4{padding:1rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-16{padding-left:4rem;padding-right:4rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pb-20{padding-bottom:5rem}.pb-4{padding-bottom:1rem}.pr-2{padding-right:.5rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-bottom{vertical-align:bottom}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-thin{font-weight:100}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-6{line-height:1.5rem}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.text-seqblue{--tw-text-opacity:1;color:rgb(27 85 122/var(--tw-text-opacity))}.text-seqorange{--tw-text-opacity:1;color:rgb(199 79 19/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.underline{-webkit-text-decoration-line:underline;text-decoration-line:underline}.\!shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a!important;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px #00000040;--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid #0000;outline-offset:2px}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.\!invert{--tw-invert:invert(100%)!important;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.invert{--tw-invert:invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.\!filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.\!transition{transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important;transition-duration:.15s!important}.transition{transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.tooltip{position:absolute;z-index:1070;display:block;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:12px;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px}.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{left:5px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:#0000;border-style:solid}.hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.hover\:bg-seqorange:hover{--tw-bg-opacity:1;background-color:rgb(199 79 19/var(--tw-bg-opacity))}.hover\:bg-sky-400:hover{--tw-bg-opacity:1;background-color:rgb(56 189 248/var(--tw-bg-opacity))}.hover\:bg-sky-500:hover{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.hover\:bg-yellow-100:hover{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.hover\:font-bold:hover{font-weight:700}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-1:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-seqorange:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(199 79 19/var(--tw-ring-opacity))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.group:hover .group-hover\:visible{visibility:visible}@media (min-width:640px){.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:ml-3{margin-left:.75rem}.sm\:mt-0{margin-top:0}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:flex{display:flex}.sm\:h-screen{height:100vh}.sm\:w-auto{width:auto}.sm\:w-full{width:100%}.sm\:max-w-screen-md{max-width:768px}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row-reverse{flex-direction:row-reverse}.sm\:items-center{align-items:center}.sm\:p-0{padding:0}.sm\:p-6{padding:1.5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pb-4{padding-bottom:1rem}.sm\:align-middle{vertical-align:middle}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}}@media (min-width:768px){.md\:my-2{margin-top:.5rem;margin-bottom:.5rem}.md\:flex{display:flex}.md\:w-auto{width:auto}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.md\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px*var(--tw-divide-x-reverse));border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))}.md\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px*var(--tw-divide-y-reverse))}.md\:pl-2{padding-left:.5rem}.md\:pt-0{padding-top:0}}@media (min-width:1024px){.lg\:px-8{padding-left:2rem;padding-right:2rem}}
|
@@ -5,7 +5,6 @@
|
|
5
5
|
@import url('../vendor/github/nicgirault/circosJs@1.7.0/dist/colorBrewer.css');
|
6
6
|
@import url('../vendor/github/twbs/bootstrap@3.3.5/css/bootstrap.min.css');
|
7
7
|
@import url('../vendor/npm/font-awesome@4.4.0/css/font-awesome.min.css');
|
8
|
-
@import url('../vendor/github/vakata/jstree@3.3.8/dist/themes/default/style.min.css');
|
9
8
|
@import url('grapher.css');
|
10
9
|
@import url('fonts.css');
|
11
10
|
|
@@ -162,29 +161,6 @@ a.disabled:hover,
|
|
162
161
|
padding: 0 0 0 1px;
|
163
162
|
}
|
164
163
|
|
165
|
-
/**
|
166
|
-
* Take out border, cut down margin and padding, and remove background color
|
167
|
-
* from panel.
|
168
|
-
*/
|
169
|
-
.panel {
|
170
|
-
border: none;
|
171
|
-
-webkit-box-shadow: none;
|
172
|
-
-moz-box-shadow: none;
|
173
|
-
box-shadow: none;
|
174
|
-
}
|
175
|
-
|
176
|
-
.panel .panel-heading {
|
177
|
-
padding: 0;
|
178
|
-
background-color: inherit;
|
179
|
-
border-bottom: 1px solid #c74f14;
|
180
|
-
}
|
181
|
-
|
182
|
-
.panel .panel-heading h4 {
|
183
|
-
margin: 0;
|
184
|
-
font-size: 16px;
|
185
|
-
font-weight: bold;
|
186
|
-
}
|
187
|
-
|
188
164
|
/**
|
189
165
|
* Take padding-right out of .control-label and keep padding of .input-group.
|
190
166
|
* Works better when browser is resized to smaller width.
|
@@ -350,11 +326,6 @@ td.nowrap-ellipsis {
|
|
350
326
|
background-color: red;
|
351
327
|
}
|
352
328
|
|
353
|
-
.dnd-errors {
|
354
|
-
color: red;
|
355
|
-
font-size: 18px;
|
356
|
-
}
|
357
|
-
|
358
329
|
.modal-error {
|
359
330
|
color: red;
|
360
331
|
font-size: 18px;
|
@@ -372,89 +343,6 @@ td.nowrap-ellipsis {
|
|
372
343
|
background-color: inherit;
|
373
344
|
}
|
374
345
|
|
375
|
-
.query-container {
|
376
|
-
margin-top: 35px;
|
377
|
-
margin-bottom: 35px;
|
378
|
-
position: relative;
|
379
|
-
}
|
380
|
-
|
381
|
-
.notifications {
|
382
|
-
position: fixed;
|
383
|
-
top: 0;
|
384
|
-
left: 0;
|
385
|
-
width: 100%;
|
386
|
-
height: 32px;
|
387
|
-
padding-right: 35px;
|
388
|
-
padding-left: 35px;
|
389
|
-
}
|
390
|
-
|
391
|
-
.notification {
|
392
|
-
margin-top: 6px;
|
393
|
-
}
|
394
|
-
|
395
|
-
.notification .alert-info,
|
396
|
-
.notification .alert-danger {
|
397
|
-
-webkit-border-radius: 6px;
|
398
|
-
-moz-border-radius: 6px;
|
399
|
-
border-radius: 6px;
|
400
|
-
-webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
|
401
|
-
-moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
|
402
|
-
box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
|
403
|
-
font-weight: bold;
|
404
|
-
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
|
405
|
-
text-align: center;
|
406
|
-
padding: 6px 12px 6px 12px;
|
407
|
-
}
|
408
|
-
|
409
|
-
.databases .list-group-item {
|
410
|
-
border: none;
|
411
|
-
padding: 1px 0 0;
|
412
|
-
}
|
413
|
-
|
414
|
-
#help pre:hover {
|
415
|
-
background-color: #ffc;
|
416
|
-
}
|
417
|
-
|
418
|
-
label[for="advanced"] {
|
419
|
-
font-size: 16px;
|
420
|
-
display: table-cell;
|
421
|
-
width: 1%;
|
422
|
-
white-space: nowrap;
|
423
|
-
vertical-align: middle;
|
424
|
-
padding: 5px 12px 5px 0;
|
425
|
-
cursor: default;
|
426
|
-
pointer-events: none;
|
427
|
-
}
|
428
|
-
|
429
|
-
input[name="advanced"] {
|
430
|
-
border-top-left-radius: 4px !important;
|
431
|
-
border-bottom-left-radius: 4px !important;
|
432
|
-
}
|
433
|
-
|
434
|
-
input[type=checkbox] {
|
435
|
-
vertical-align: top;
|
436
|
-
}
|
437
|
-
|
438
|
-
#method {
|
439
|
-
letter-spacing: 1px;
|
440
|
-
}
|
441
|
-
|
442
|
-
#methods li {
|
443
|
-
cursor: pointer;
|
444
|
-
text-align: center;
|
445
|
-
padding-top: 4px;
|
446
|
-
padding-bottom: 4px;
|
447
|
-
letter-spacing: 1px;
|
448
|
-
}
|
449
|
-
|
450
|
-
.dropdown-menu li {
|
451
|
-
border-bottom: 1px solid #ccc;
|
452
|
-
}
|
453
|
-
|
454
|
-
.dropdown-menu li:last-child {
|
455
|
-
border-bottom: 0;
|
456
|
-
}
|
457
|
-
|
458
346
|
/**********************
|
459
347
|
Sidebar
|
460
348
|
**********************/
|
@@ -575,28 +463,6 @@ input[type=checkbox] {
|
|
575
463
|
vertical-align: super;
|
576
464
|
}
|
577
465
|
|
578
|
-
.dnd-overlay {
|
579
|
-
position: absolute;
|
580
|
-
top: 51px;
|
581
|
-
left: 0;
|
582
|
-
right: 0;
|
583
|
-
bottom: 0;
|
584
|
-
z-index: 1000;
|
585
|
-
background-color: rgba(255, 255, 255, 0.75);
|
586
|
-
}
|
587
|
-
|
588
|
-
.dnd-overlay * {
|
589
|
-
pointer-events: none;
|
590
|
-
}
|
591
|
-
|
592
|
-
.dnd-overlay-container {
|
593
|
-
padding-top: 72px;
|
594
|
-
}
|
595
|
-
|
596
|
-
.dnd-overlay-container p {
|
597
|
-
font-size: 48px;
|
598
|
-
}
|
599
|
-
|
600
466
|
/* higlight when hit is selected */
|
601
467
|
.glow {
|
602
468
|
border-left: 2px solid #c74f14;
|
@@ -649,20 +515,6 @@ input[type=checkbox] {
|
|
649
515
|
display: table-cell;
|
650
516
|
}
|
651
517
|
|
652
|
-
|
653
|
-
/** For advanced params dropdown **/
|
654
|
-
.input-group-btn {
|
655
|
-
vertical-align: top;
|
656
|
-
}
|
657
|
-
#advanced-params-dropdown {
|
658
|
-
padding: 0;
|
659
|
-
}
|
660
|
-
#advanced-params-dropdown li {
|
661
|
-
padding: 10px;
|
662
|
-
cursor: pointer;
|
663
|
-
letter-spacing: 1px;
|
664
|
-
}
|
665
|
-
|
666
518
|
.share-url-component input[type="text"] {
|
667
519
|
width: 100%;
|
668
520
|
}
|