Almirah 0.1.9 → 0.2.1
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 +4 -4
- data/lib/almirah/doc_fabric.rb +3 -327
- data/lib/almirah/doc_items/controlled_paragraph.rb +3 -1
- data/lib/almirah/doc_items/controlled_table.rb +1 -1
- data/lib/almirah/doc_items/doc_item.rb +4 -0
- data/lib/almirah/doc_items/heading.rb +18 -2
- data/lib/almirah/doc_items/markdown_list.rb +5 -2
- data/lib/almirah/doc_parser.rb +334 -0
- data/lib/almirah/doc_types/base_document.rb +22 -6
- data/lib/almirah/doc_types/coverage.rb +1 -5
- data/lib/almirah/doc_types/index.rb +1 -3
- data/lib/almirah/doc_types/persistent_document.rb +20 -0
- data/lib/almirah/doc_types/protocol.rb +3 -15
- data/lib/almirah/doc_types/specification.rb +3 -11
- data/lib/almirah/doc_types/traceability.rb +1 -4
- data/lib/almirah/dom/document.rb +1 -1
- data/lib/almirah/project.rb +58 -47
- data/lib/almirah/project_configuration.rb +42 -0
- data/lib/almirah/search/specifications_db.rb +66 -0
- data/lib/almirah/templates/css/main.css +298 -0
- data/lib/almirah/templates/css/search.css +40 -0
- data/lib/almirah/templates/page.html +7 -357
- data/lib/almirah/templates/scripts/main.js +61 -0
- data/lib/almirah/templates/scripts/orama_search.js +136 -0
- data/lib/almirah.rb +3 -1
- metadata +10 -2
data/lib/almirah/project.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'fileutils'
|
2
|
-
require 'yaml'
|
3
2
|
require_relative "doc_fabric"
|
4
3
|
require_relative "navigation_pane"
|
5
4
|
require_relative "doc_types/traceability"
|
6
5
|
require_relative "doc_types/coverage"
|
7
6
|
require_relative "doc_types/index"
|
7
|
+
require_relative "search/specifications_db"
|
8
8
|
|
9
9
|
class Project
|
10
10
|
|
@@ -12,14 +12,13 @@ class Project
|
|
12
12
|
attr_accessor :protocols
|
13
13
|
attr_accessor :traceability_matrices
|
14
14
|
attr_accessor :coverage_matrices
|
15
|
-
attr_accessor :project_root_directory
|
16
15
|
attr_accessor :specifications_dictionary
|
17
16
|
attr_accessor :index
|
18
17
|
attr_accessor :project
|
19
|
-
attr_accessor :
|
18
|
+
attr_accessor :configuration
|
20
19
|
|
21
|
-
def initialize(
|
22
|
-
@
|
20
|
+
def initialize(configuration)
|
21
|
+
@configuration = configuration
|
23
22
|
@specifications = Array.new
|
24
23
|
@protocols = Array.new
|
25
24
|
@traceability_matrices = Array.new
|
@@ -27,19 +26,22 @@ class Project
|
|
27
26
|
@specifications_dictionary = Hash.new
|
28
27
|
@index = nil
|
29
28
|
@project = self
|
30
|
-
@
|
31
|
-
|
32
|
-
FileUtils.remove_dir(@project_root_directory + "/build", true)
|
29
|
+
FileUtils.remove_dir(@configuration.project_root_directory + "/build", true)
|
30
|
+
copy_resources
|
33
31
|
end
|
34
32
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
33
|
+
def copy_resources
|
34
|
+
# scripts
|
35
|
+
gem_root = File.expand_path './../..', File.dirname(__FILE__)
|
36
|
+
src_folder = gem_root + "/lib/almirah/templates/scripts"
|
37
|
+
dst_folder = @configuration.project_root_directory + "/build/scripts"
|
38
|
+
FileUtils.mkdir_p(dst_folder)
|
39
|
+
FileUtils.copy_entry( src_folder, dst_folder )
|
40
|
+
# css
|
41
|
+
src_folder = gem_root + "/lib/almirah/templates/css"
|
42
|
+
dst_folder = @configuration.project_root_directory + "/build/css"
|
43
|
+
FileUtils.mkdir_p(dst_folder)
|
44
|
+
FileUtils.copy_entry( src_folder, dst_folder )
|
43
45
|
end
|
44
46
|
|
45
47
|
def specifications_and_protocols
|
@@ -55,6 +57,7 @@ class Project
|
|
55
57
|
render_all_specifications(@coverage_matrices)
|
56
58
|
render_all_protocols
|
57
59
|
render_index
|
60
|
+
create_search_data
|
58
61
|
end
|
59
62
|
|
60
63
|
def specifications_and_results( test_run )
|
@@ -70,6 +73,7 @@ class Project
|
|
70
73
|
render_all_specifications(@coverage_matrices)
|
71
74
|
render_all_protocols
|
72
75
|
render_index
|
76
|
+
create_search_data
|
73
77
|
end
|
74
78
|
|
75
79
|
def transform( file_extension )
|
@@ -78,10 +82,10 @@ class Project
|
|
78
82
|
|
79
83
|
def transform_all_specifications( file_extension )
|
80
84
|
|
81
|
-
path = @project_root_directory
|
85
|
+
path = @configuration.project_root_directory
|
82
86
|
|
83
87
|
# find all specifications
|
84
|
-
Dir.glob( "#{
|
88
|
+
Dir.glob( "#{path}/specifications/**/*.md" ).each do |f|
|
85
89
|
puts f
|
86
90
|
# make a copy with another extention to preserve the content
|
87
91
|
f_directory = File.dirname(f)
|
@@ -93,12 +97,13 @@ class Project
|
|
93
97
|
end
|
94
98
|
|
95
99
|
def parse_all_specifications
|
100
|
+
path = @configuration.project_root_directory
|
96
101
|
# do a lasy pass first to get the list of documents id
|
97
|
-
Dir.glob( "#{
|
102
|
+
Dir.glob( "#{path}/specifications/**/*.md" ).each do |f|
|
98
103
|
DocFabric.add_lazy_doc_id(f)
|
99
104
|
end
|
100
105
|
# parse documents in the second pass
|
101
|
-
Dir.glob( "#{
|
106
|
+
Dir.glob( "#{path}/specifications/**/*.md" ).each do |f|
|
102
107
|
doc = DocFabric.create_specification(f)
|
103
108
|
@specifications.append(doc)
|
104
109
|
@specifications_dictionary[doc.id.to_s.downcase] = doc
|
@@ -106,7 +111,8 @@ class Project
|
|
106
111
|
end
|
107
112
|
|
108
113
|
def parse_all_protocols
|
109
|
-
|
114
|
+
path = @configuration.project_root_directory
|
115
|
+
Dir.glob( "#{path}/tests/protocols/**/*.md" ).each do |f|
|
110
116
|
puts "Prot: " + f
|
111
117
|
doc = DocFabric.create_protocol(f)
|
112
118
|
@protocols.append(doc)
|
@@ -114,7 +120,8 @@ class Project
|
|
114
120
|
end
|
115
121
|
|
116
122
|
def parse_test_run( test_run )
|
117
|
-
|
123
|
+
path = @configuration.project_root_directory
|
124
|
+
Dir.glob( "#{path}/tests/runs/#{test_run}/**/*.md" ).each do |f|
|
118
125
|
puts "Run: " + f
|
119
126
|
doc = DocFabric.create_protocol(f)
|
120
127
|
@protocols.append(doc)
|
@@ -128,14 +135,12 @@ class Project
|
|
128
135
|
# puts "Link: #{c[0].id} - #{c[1].id}"
|
129
136
|
end
|
130
137
|
# separatelly create design inputs treceability
|
131
|
-
|
132
|
-
@
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
@traceability_matrices.append trx
|
138
|
-
end
|
138
|
+
@configuration.get_design_inputs.each do |i|
|
139
|
+
if @specifications_dictionary.has_key? i.to_s.downcase
|
140
|
+
document = @specifications_dictionary[i.to_s.downcase]
|
141
|
+
if document
|
142
|
+
trx = Traceability.new document, nil, true
|
143
|
+
@traceability_matrices.append trx
|
139
144
|
end
|
140
145
|
end
|
141
146
|
end
|
@@ -144,7 +149,7 @@ class Project
|
|
144
149
|
def link_all_protocols
|
145
150
|
@protocols.each do |p|
|
146
151
|
@specifications.each do |s|
|
147
|
-
if p.
|
152
|
+
if p.up_link_docs.has_key?(s.id.to_s)
|
148
153
|
link_protocol_to_spec(p,s)
|
149
154
|
end
|
150
155
|
end
|
@@ -160,7 +165,7 @@ class Project
|
|
160
165
|
end
|
161
166
|
|
162
167
|
@specifications.each do |s|
|
163
|
-
s.
|
168
|
+
s.up_link_docs.each do |key, value|
|
164
169
|
unless available_specification_ids.has_key?(key)
|
165
170
|
# now key points to the doc_id that does not exist
|
166
171
|
wrong_doc_id = key
|
@@ -184,10 +189,10 @@ class Project
|
|
184
189
|
|
185
190
|
def link_two_specifications(doc_A, doc_B)
|
186
191
|
|
187
|
-
if doc_B.
|
192
|
+
if doc_B.up_link_docs.has_key?(doc_A.id.to_s)
|
188
193
|
top_document = doc_A
|
189
194
|
bottom_document = doc_B
|
190
|
-
elsif doc_A.
|
195
|
+
elsif doc_A.up_link_docs.has_key?(doc_B.id.to_s)
|
191
196
|
top_document = doc_B
|
192
197
|
bottom_document = doc_A
|
193
198
|
else
|
@@ -253,16 +258,16 @@ class Project
|
|
253
258
|
|
254
259
|
def render_all_specifications(spec_list)
|
255
260
|
|
256
|
-
|
261
|
+
path = @configuration.project_root_directory
|
257
262
|
|
258
|
-
FileUtils.mkdir_p(
|
263
|
+
FileUtils.mkdir_p(path + "/build/specifications")
|
259
264
|
|
260
265
|
spec_list.each do |doc|
|
261
266
|
|
262
267
|
doc.to_console
|
263
268
|
|
264
|
-
img_src_dir =
|
265
|
-
img_dst_dir =
|
269
|
+
img_src_dir = path + "/specifications/" + doc.id + "/img"
|
270
|
+
img_dst_dir = path + "/build/specifications/" + doc.id + "/img"
|
266
271
|
|
267
272
|
FileUtils.mkdir_p(img_dst_dir)
|
268
273
|
|
@@ -272,7 +277,7 @@ class Project
|
|
272
277
|
|
273
278
|
# create a sidebar first
|
274
279
|
nav_pane = NavigationPane.new(doc)
|
275
|
-
doc.to_html( nav_pane, "#{
|
280
|
+
doc.to_html( nav_pane, "#{path}/build/specifications/" )
|
276
281
|
end
|
277
282
|
end
|
278
283
|
|
@@ -281,15 +286,14 @@ class Project
|
|
281
286
|
# create a sidebar first
|
282
287
|
# nav_pane = NavigationPane.new(@specifications)
|
283
288
|
|
284
|
-
|
289
|
+
path = @configuration.project_root_directory
|
285
290
|
|
286
|
-
|
287
|
-
FileUtils.mkdir_p(pass + "/build/tests/protocols")
|
291
|
+
FileUtils.mkdir_p(path + "/build/tests/protocols")
|
288
292
|
|
289
293
|
@protocols.each do |doc|
|
290
294
|
|
291
|
-
img_src_dir =
|
292
|
-
img_dst_dir =
|
295
|
+
img_src_dir = path + "/tests/protocols/" + doc.id + "/img"
|
296
|
+
img_dst_dir = path + "/build/tests/protocols/" + doc.id + "/img"
|
293
297
|
|
294
298
|
FileUtils.mkdir_p(img_dst_dir)
|
295
299
|
|
@@ -297,17 +301,24 @@ class Project
|
|
297
301
|
FileUtils.copy_entry( img_src_dir, img_dst_dir )
|
298
302
|
end
|
299
303
|
|
300
|
-
doc.to_html( nil, "#{
|
304
|
+
doc.to_html( nil, "#{path}/build/tests/protocols/" )
|
301
305
|
end
|
302
306
|
end
|
303
307
|
|
304
|
-
def render_index
|
308
|
+
def render_index
|
305
309
|
|
306
|
-
path = @project_root_directory
|
310
|
+
path = @configuration.project_root_directory
|
307
311
|
|
308
312
|
doc = @index
|
309
313
|
doc.to_console
|
310
314
|
|
311
315
|
doc.to_html("#{path}/build/")
|
312
316
|
end
|
317
|
+
|
318
|
+
def create_search_data
|
319
|
+
db = SpecificationsDb.new @specifications
|
320
|
+
data_path = @configuration.project_root_directory + "/build/data"
|
321
|
+
FileUtils.mkdir_p(data_path)
|
322
|
+
db.save(data_path)
|
323
|
+
end
|
313
324
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
class ProjectConfiguration
|
4
|
+
|
5
|
+
attr_accessor :project_root_directory
|
6
|
+
attr_accessor :parameters
|
7
|
+
|
8
|
+
def initialize(path)
|
9
|
+
@project_root_directory = path
|
10
|
+
@parameters = {}
|
11
|
+
load_project_file()
|
12
|
+
end
|
13
|
+
|
14
|
+
def load_project_file
|
15
|
+
begin
|
16
|
+
@parameters = YAML.load_file(@project_root_directory + '/project.yml')
|
17
|
+
rescue Psych::SyntaxError => e
|
18
|
+
puts "YAML syntax error: #{e.message}"
|
19
|
+
rescue Errno::ENOENT
|
20
|
+
puts "Project file not found: project.yml"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_design_inputs
|
25
|
+
if (@parameters.key? 'specifications') and (@parameters['specifications'].key? 'input')
|
26
|
+
return @parameters['specifications']['input']
|
27
|
+
end
|
28
|
+
return []
|
29
|
+
end
|
30
|
+
|
31
|
+
def is_spec_db_shall_be_created
|
32
|
+
if (@parameters.key? 'output')
|
33
|
+
@parameters['output'].each do |p|
|
34
|
+
if p == 'specifications_db'
|
35
|
+
return true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
return false
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'json'
|
2
|
+
# Prepare JSON database file for further indexing by other tools
|
3
|
+
class SpecificationsDb
|
4
|
+
|
5
|
+
attr_accessor :specifications
|
6
|
+
attr_accessor :data
|
7
|
+
|
8
|
+
def initialize(spec_list)
|
9
|
+
@specifications = spec_list
|
10
|
+
@data = []
|
11
|
+
create_data
|
12
|
+
end
|
13
|
+
|
14
|
+
def create_data
|
15
|
+
@specifications.each do |sp|
|
16
|
+
sp.items.each do |i|
|
17
|
+
if (i.instance_of? Paragraph) or (i.instance_of? ControlledParagraph)
|
18
|
+
e = {"document" => i.parent_doc.title, \
|
19
|
+
"doc_color" => i.parent_doc.color, \
|
20
|
+
"text" => i.text, \
|
21
|
+
"heading_url" => i.parent_heading.get_url(), \
|
22
|
+
"heading_text" => i.parent_heading.get_section_info()
|
23
|
+
}
|
24
|
+
@data.append e
|
25
|
+
elsif i.instance_of? MarkdownList
|
26
|
+
e = add_markdown_list_item_to_db( @data, i, i)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def add_markdown_list_item_to_db(data, item_for_reference, item_to_process)
|
33
|
+
e = nil
|
34
|
+
item_to_process.rows.each do |r|
|
35
|
+
if r.is_a?(MarkdownList)
|
36
|
+
f_text = r.text
|
37
|
+
e = { "document" => item_for_reference.parent_doc.title, \
|
38
|
+
"doc_color" => item_for_reference.parent_doc.color, \
|
39
|
+
"text" => f_text, \
|
40
|
+
"heading_url" => item_for_reference.parent_heading.get_url(), \
|
41
|
+
"heading_text" => item_for_reference.parent_heading.get_section_info()
|
42
|
+
}
|
43
|
+
data << e
|
44
|
+
add_markdown_list_item_to_db(data, item_for_reference, r)
|
45
|
+
else
|
46
|
+
f_text = r
|
47
|
+
e = { "document" => item_for_reference.parent_doc.title, \
|
48
|
+
"doc_color" => item_for_reference.parent_doc.color, \
|
49
|
+
"text" => f_text, \
|
50
|
+
"heading_url" => item_for_reference.parent_heading.get_url(), \
|
51
|
+
"heading_text" => item_for_reference.parent_heading.get_section_info()
|
52
|
+
}
|
53
|
+
data << e
|
54
|
+
end
|
55
|
+
end
|
56
|
+
return e
|
57
|
+
end
|
58
|
+
|
59
|
+
def save(path)
|
60
|
+
json = JSON.generate(@data)
|
61
|
+
|
62
|
+
file = File.open( path + "/specifications_db.json", "w" )
|
63
|
+
file.puts json
|
64
|
+
file.close
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,298 @@
|
|
1
|
+
body {
|
2
|
+
font-family: Verdana, sans-serif;
|
3
|
+
font-size: 12px;
|
4
|
+
color: #333;
|
5
|
+
margin: 0;
|
6
|
+
padding: 0;
|
7
|
+
min-width: 900px;
|
8
|
+
}
|
9
|
+
#main {
|
10
|
+
flex-grow: 2;
|
11
|
+
display: flex;
|
12
|
+
flex-direction: row;
|
13
|
+
}
|
14
|
+
#content {
|
15
|
+
flex-grow: 1;
|
16
|
+
background-color: #fff;
|
17
|
+
margin-top: 30px;
|
18
|
+
padding: 10px 16px 10px 16px;
|
19
|
+
overflow-x: auto;
|
20
|
+
}
|
21
|
+
#content h1, h2, h3, h4, h5, h6 {
|
22
|
+
color: #555;
|
23
|
+
font-family: "Trebuchet MS", Verdana, sans-serif;
|
24
|
+
padding: 2px 10px 1px 0px;
|
25
|
+
margin: 0 0 10px 0;
|
26
|
+
}
|
27
|
+
h1 {
|
28
|
+
font-size: 2em;
|
29
|
+
}
|
30
|
+
h2 {
|
31
|
+
font-size: 1.8em;
|
32
|
+
}
|
33
|
+
h3 {
|
34
|
+
font-size: 1.5em;
|
35
|
+
}
|
36
|
+
h4 {
|
37
|
+
font-size: 1.2em;
|
38
|
+
border: none;
|
39
|
+
font-weight: bold;
|
40
|
+
}
|
41
|
+
h5 {
|
42
|
+
font-size: 1em;
|
43
|
+
}
|
44
|
+
h6 {
|
45
|
+
font-size: 1em; color: #8e8e8e;
|
46
|
+
}
|
47
|
+
a.heading_anchor {
|
48
|
+
display: none;
|
49
|
+
margin-left: 6px;
|
50
|
+
text-decoration: none;
|
51
|
+
}
|
52
|
+
table.markdown_table{
|
53
|
+
border: 1px solid #bbb;
|
54
|
+
border-collapse: collapse;
|
55
|
+
padding: 4px;
|
56
|
+
margin-bottom: 4px;
|
57
|
+
overflow: hidden;
|
58
|
+
}
|
59
|
+
table.markdown_table th{
|
60
|
+
border: 1px solid #bbb;
|
61
|
+
padding: 4px;
|
62
|
+
display: table-cell;
|
63
|
+
vertical-align: inherit;
|
64
|
+
background-color:#EEEEEE;
|
65
|
+
}
|
66
|
+
table.markdown_table td{
|
67
|
+
border: 1px solid #bbb;
|
68
|
+
padding: 4px;
|
69
|
+
display: table-cell;
|
70
|
+
vertical-align: inherit;
|
71
|
+
}
|
72
|
+
table.controlled{
|
73
|
+
border: 1px solid #e4e4e4;
|
74
|
+
border-collapse: collapse;
|
75
|
+
width: 100%;
|
76
|
+
margin-bottom: 4px;
|
77
|
+
border-spacing: 0px;
|
78
|
+
border-radius: 3px;
|
79
|
+
overflow: hidden;
|
80
|
+
}
|
81
|
+
table.controlled th {
|
82
|
+
background-color:#e1f1fa;
|
83
|
+
padding: 4px;
|
84
|
+
white-space:nowrap;
|
85
|
+
font-weight:normal;
|
86
|
+
border: 1px solid #bbb;
|
87
|
+
}
|
88
|
+
table.controlled td {
|
89
|
+
padding: 4px;
|
90
|
+
text-align:center;
|
91
|
+
vertical-align:middle;
|
92
|
+
padding-right:10px;
|
93
|
+
border: 1px solid #bbb;
|
94
|
+
}
|
95
|
+
table.controlled tr:first-child th {
|
96
|
+
border-top: 0;
|
97
|
+
}
|
98
|
+
table.controlled tr:last-child td {
|
99
|
+
border-bottom: 0;
|
100
|
+
}
|
101
|
+
table.controlled tr td:first-child,
|
102
|
+
table.controlled tr th:first-child {
|
103
|
+
border-left: 0;
|
104
|
+
}
|
105
|
+
table.controlled tr td:last-child,
|
106
|
+
table.controlled tr th:last-child {
|
107
|
+
border-right: 0;
|
108
|
+
}
|
109
|
+
table.controlled td.item_id {
|
110
|
+
width: 3%;
|
111
|
+
text-align: center;
|
112
|
+
}
|
113
|
+
table.controlled td.item_text{
|
114
|
+
text-align: left;
|
115
|
+
}
|
116
|
+
table.controlled:not(.odd-even) tbody tr:nth-child(odd) { background-color:#f6f7f8; }
|
117
|
+
table.controlled:not(.odd-even) tbody tr:nth-child(even) { background-color: #fff; }
|
118
|
+
table.controlled:not(.odd-even) tbody tr:nth-child(odd):hover,
|
119
|
+
table.controlled:not(.odd-even) tbody tr:nth-child(even):hover { background-color:#ffffdd; }
|
120
|
+
a, a:link, a:visited {
|
121
|
+
color: #169;
|
122
|
+
text-decoration: none;
|
123
|
+
display: inline-block;
|
124
|
+
}
|
125
|
+
a:active {
|
126
|
+
color: #555;
|
127
|
+
background-color:#deb887;
|
128
|
+
text-decoration: none;
|
129
|
+
display: inline-block;
|
130
|
+
}
|
131
|
+
div.blockquote {
|
132
|
+
display: block;
|
133
|
+
background:#f9f9fb;
|
134
|
+
border-left: 3px double #bbb;
|
135
|
+
font-style: italic;
|
136
|
+
padding: 4px 1em 4px 4px;
|
137
|
+
margin-top: 4px;
|
138
|
+
margin-bottom: 4px;
|
139
|
+
}
|
140
|
+
code {
|
141
|
+
display: block;
|
142
|
+
background:#ffffee;
|
143
|
+
border-left: 3px double #bbb;
|
144
|
+
font-family: Consolas, Menlo, "Liberation Mono", Courier, monospace;
|
145
|
+
padding: 4px 1em 4px 4px;
|
146
|
+
margin-top: 4px;
|
147
|
+
margin-bottom: 4px;
|
148
|
+
}
|
149
|
+
div.todoblock {
|
150
|
+
display: block;
|
151
|
+
background:#fcc;
|
152
|
+
border-left: 3px double #bbb;
|
153
|
+
font-style: italic;
|
154
|
+
padding: 4px 1em 4px 4px;
|
155
|
+
margin-top: 4px;
|
156
|
+
margin-bottom: 4px;
|
157
|
+
}
|
158
|
+
img:hover{
|
159
|
+
transition: 0.3s;
|
160
|
+
}
|
161
|
+
img{
|
162
|
+
opacity: 0.9;
|
163
|
+
cursor: pointer;
|
164
|
+
}
|
165
|
+
#modal_image_id{
|
166
|
+
cursor: default;
|
167
|
+
}
|
168
|
+
#closed_nav_pane{
|
169
|
+
padding: 0px;
|
170
|
+
background: #169;
|
171
|
+
border: 0px;
|
172
|
+
position: fixed;
|
173
|
+
width: 5px;
|
174
|
+
height: 100%; /* 100% Full-height */
|
175
|
+
visibility: visible;
|
176
|
+
cursor: pointer;
|
177
|
+
}
|
178
|
+
#closed_nav_pane:hover{
|
179
|
+
width: 10px;
|
180
|
+
}
|
181
|
+
#nav_pane{
|
182
|
+
flex-shrink: 0;
|
183
|
+
padding: 32px 8px 8px 8px;
|
184
|
+
background: #EEEEEE;
|
185
|
+
border: 1px solid #ddd;
|
186
|
+
position: fixed;
|
187
|
+
height: 100%; /* 100% Full-height */
|
188
|
+
visibility: hidden;
|
189
|
+
z-index: 1;
|
190
|
+
overflow-y: auto;
|
191
|
+
cursor: pointer;
|
192
|
+
}
|
193
|
+
@media screen and (min-width: 0px) and (max-width: 1089px) {#nav_pane{width: 22%;}}
|
194
|
+
@media screen and (min-width: 1090px) and (max-width: 1279px) {#nav_pane{width: 240px;}}
|
195
|
+
@media screen and (min-width: 1280px) and (max-width: 1599px) {#nav_pane{width: 280px;}}
|
196
|
+
@media screen and (min-width: 1600px) and (max-width: 1919px) {#nav_pane{width: 320px;}}
|
197
|
+
@media screen and (min-width: 1920px) and (max-width: 2559px) {#nav_pane{width: 360px;}}
|
198
|
+
@media screen and (min-width: 2560px) {#nav_pane{width: 380px;}}
|
199
|
+
|
200
|
+
#top_nav{
|
201
|
+
background-color: #169;
|
202
|
+
overflow: hidden;
|
203
|
+
position: fixed;
|
204
|
+
width: 100%;
|
205
|
+
z-index: 2;
|
206
|
+
}
|
207
|
+
#top_nav a {
|
208
|
+
float: left;
|
209
|
+
color: white;
|
210
|
+
text-align: center;
|
211
|
+
padding: 4px 6px;
|
212
|
+
text-decoration: none;
|
213
|
+
font-size: 1.5em;
|
214
|
+
font-family: "Trebuchet MS", Verdana, sans-serif;
|
215
|
+
}
|
216
|
+
#top_nav a.split {
|
217
|
+
float: right;
|
218
|
+
color: white;
|
219
|
+
text-align: center;
|
220
|
+
padding: 4px 6px;
|
221
|
+
text-decoration: none;
|
222
|
+
font-size: 1.5em;
|
223
|
+
font-family: "Trebuchet MS", Verdana, sans-serif;
|
224
|
+
}
|
225
|
+
#top_nav a:hover {
|
226
|
+
background-color: black;
|
227
|
+
color: white;
|
228
|
+
}
|
229
|
+
#top_nav a.active {
|
230
|
+
background-color: #169;
|
231
|
+
color: white;
|
232
|
+
}
|
233
|
+
#searchInput{
|
234
|
+
float: left;
|
235
|
+
margin: 4px 6px;
|
236
|
+
text-decoration: none;
|
237
|
+
}
|
238
|
+
.modal {
|
239
|
+
display: none; /* Hidden by default */
|
240
|
+
position: fixed; /* Stay in place */
|
241
|
+
z-index: 1; /* Sit on top */
|
242
|
+
padding-top: 100px; /* Location of the box */
|
243
|
+
left: 0;
|
244
|
+
top: 0;
|
245
|
+
width: 100%; /* Full width */
|
246
|
+
height: 100%; /* Full height */
|
247
|
+
overflow: auto; /* Enable scroll if needed */
|
248
|
+
background-color: rgb(0,0,0); /* Fallback color */
|
249
|
+
background-color: rgba(0,0,0,0.9); /* Black w/ opacity */
|
250
|
+
}
|
251
|
+
.modal_image {
|
252
|
+
margin: auto;
|
253
|
+
display: block;
|
254
|
+
width: 97%;
|
255
|
+
/*max-width: 700px;*/
|
256
|
+
}
|
257
|
+
#modal_image_caption {
|
258
|
+
margin: auto;
|
259
|
+
display: block;
|
260
|
+
width: 80%;
|
261
|
+
max-width: 700px;
|
262
|
+
text-align: center;
|
263
|
+
color: #ccc;
|
264
|
+
padding: 10px 0;
|
265
|
+
height: 150px;
|
266
|
+
}
|
267
|
+
.modal_image, #modal_image_caption {
|
268
|
+
animation-name: zoom;
|
269
|
+
animation-duration: 0.6s;
|
270
|
+
}
|
271
|
+
@keyframes zoom {
|
272
|
+
from {transform: scale(0.1)}
|
273
|
+
to {transform: scale(1)}
|
274
|
+
}
|
275
|
+
.modal_close_btn {
|
276
|
+
position: absolute;
|
277
|
+
top: 15px;
|
278
|
+
right: 35px;
|
279
|
+
color: #f1f1f1;
|
280
|
+
font-size: 30px;
|
281
|
+
font-weight: bold;
|
282
|
+
transition: 0.3s;
|
283
|
+
}
|
284
|
+
.modal_close_btn:hover,
|
285
|
+
.modal_close_btn:focus {
|
286
|
+
color: #bbb;
|
287
|
+
text-decoration: none;
|
288
|
+
cursor: pointer;
|
289
|
+
}
|
290
|
+
#footer {
|
291
|
+
clear: both;
|
292
|
+
border-top: 1px solid #bbb;
|
293
|
+
font-size: 0.9em;
|
294
|
+
color: #aaa;
|
295
|
+
padding: 5px;
|
296
|
+
text-align:center;
|
297
|
+
background:#fff;
|
298
|
+
}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
/* Dropdown Content (Hidden by Default) */
|
2
|
+
.search-results-content {
|
3
|
+
display: none;
|
4
|
+
position: absolute;
|
5
|
+
background-color: #f6f6f6;
|
6
|
+
min-width: 600px;
|
7
|
+
border: 1px solid #ddd;
|
8
|
+
z-index: 2;
|
9
|
+
}
|
10
|
+
|
11
|
+
/* Links inside the dropdown
|
12
|
+
.search-results-content a, a:link, a:visited {
|
13
|
+
color: #169;
|
14
|
+
text-decoration: none;
|
15
|
+
display: inline-block;
|
16
|
+
}*/
|
17
|
+
|
18
|
+
div.search-item {
|
19
|
+
padding: 2px;
|
20
|
+
text-align:left;
|
21
|
+
vertical-align:middle;
|
22
|
+
padding-right:10px;
|
23
|
+
border: 1px solid #bbb;
|
24
|
+
}
|
25
|
+
table.search-result-table{
|
26
|
+
border: 0;
|
27
|
+
margin: 0;
|
28
|
+
border-collapse: collapse;
|
29
|
+
width: 100%;
|
30
|
+
margin-bottom: 0px;
|
31
|
+
border-spacing: 0px;
|
32
|
+
overflow: hidden;
|
33
|
+
}
|
34
|
+
table.search-result-table td {
|
35
|
+
padding: 4px;
|
36
|
+
width: 50%;
|
37
|
+
text-align:left;
|
38
|
+
vertical-align:middle;
|
39
|
+
padding-right:10px;
|
40
|
+
}
|