##// END OF EJS Templates
SortHelper refactoring:...
Jean-Philippe Lang -
r2503:2b585407cb66
parent child
Show More
@@ -0,0 +1,73
1 # Redmine - project management software
2 # Copyright (C) 2006-2009 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 require File.dirname(__FILE__) + '/../../test_helper'
19
20 class SortHelperTest < HelperTestCase
21 include SortHelper
22
23 def test_default_sort_clause_with_array
24 sort_init 'attr1', 'desc'
25 sort_update(['attr1', 'attr2'])
26
27 assert_equal 'attr1 DESC', sort_clause
28 end
29
30 def test_default_sort_clause_with_hash
31 sort_init 'attr1', 'desc'
32 sort_update({'attr1' => 'table1.attr1', 'attr2' => 'table2.attr2'})
33
34 assert_equal 'table1.attr1 DESC', sort_clause
35 end
36
37 def test_params_sort
38 @sort_param = 'attr1,attr2:desc'
39
40 sort_init 'attr1', 'desc'
41 sort_update({'attr1' => 'table1.attr1', 'attr2' => 'table2.attr2'})
42
43 assert_equal 'table1.attr1, table2.attr2 DESC', sort_clause
44 assert_equal 'attr1,attr2:desc', @session['foo_bar_sort']
45 end
46
47 def test_invalid_params_sort
48 @sort_param = 'attr3'
49
50 sort_init 'attr1', 'desc'
51 sort_update({'attr1' => 'table1.attr1', 'attr2' => 'table2.attr2'})
52
53 assert_nil sort_clause
54 assert_equal '', @session['foo_bar_sort']
55 end
56
57 def test_invalid_order_params_sort
58 @sort_param = 'attr1:foo:bar,attr2'
59
60 sort_init 'attr1', 'desc'
61 sort_update({'attr1' => 'table1.attr1', 'attr2' => 'table2.attr2'})
62
63 assert_equal 'table1.attr1, table2.attr2', sort_clause
64 assert_equal 'attr1,attr2', @session['foo_bar_sort']
65 end
66
67 private
68
69 def controller_name; 'foo'; end
70 def action_name; 'bar'; end
71 def params; {:sort => @sort_param}; end
72 def session; @session ||= {}; end
73 end
@@ -1,171 +1,205
1 # Helpers to sort tables using clickable column headers.
1 # Helpers to sort tables using clickable column headers.
2 #
2 #
3 # Author: Stuart Rackham <srackham@methods.co.nz>, March 2005.
3 # Author: Stuart Rackham <srackham@methods.co.nz>, March 2005.
4 # Jean-Philippe Lang, 2009
4 # License: This source code is released under the MIT license.
5 # License: This source code is released under the MIT license.
5 #
6 #
6 # - Consecutive clicks toggle the column's sort order.
7 # - Consecutive clicks toggle the column's sort order.
7 # - Sort state is maintained by a session hash entry.
8 # - Sort state is maintained by a session hash entry.
8 # - Icon image identifies sort column and state.
9 # - CSS classes identify sort column and state.
9 # - Typically used in conjunction with the Pagination module.
10 # - Typically used in conjunction with the Pagination module.
10 #
11 #
11 # Example code snippets:
12 # Example code snippets:
12 #
13 #
13 # Controller:
14 # Controller:
14 #
15 #
15 # helper :sort
16 # helper :sort
16 # include SortHelper
17 # include SortHelper
17 #
18 #
18 # def list
19 # def list
19 # sort_init 'last_name'
20 # sort_init 'last_name'
20 # sort_update
21 # sort_update %w(first_name, last_name)
21 # @items = Contact.find_all nil, sort_clause
22 # @items = Contact.find_all nil, sort_clause
22 # end
23 # end
23 #
24 #
24 # Controller (using Pagination module):
25 # Controller (using Pagination module):
25 #
26 #
26 # helper :sort
27 # helper :sort
27 # include SortHelper
28 # include SortHelper
28 #
29 #
29 # def list
30 # def list
30 # sort_init 'last_name'
31 # sort_init 'last_name'
31 # sort_update
32 # sort_update %w(first_name, last_name)
32 # @contact_pages, @items = paginate :contacts,
33 # @contact_pages, @items = paginate :contacts,
33 # :order_by => sort_clause,
34 # :order_by => sort_clause,
34 # :per_page => 10
35 # :per_page => 10
35 # end
36 # end
36 #
37 #
37 # View (table header in list.rhtml):
38 # View (table header in list.rhtml):
38 #
39 #
39 # <thead>
40 # <thead>
40 # <tr>
41 # <tr>
41 # <%= sort_header_tag('id', :title => 'Sort by contact ID') %>
42 # <%= sort_header_tag('id', :title => 'Sort by contact ID') %>
42 # <%= sort_header_tag('last_name', :caption => 'Name') %>
43 # <%= sort_header_tag('last_name', :caption => 'Name') %>
43 # <%= sort_header_tag('phone') %>
44 # <%= sort_header_tag('phone') %>
44 # <%= sort_header_tag('address', :width => 200) %>
45 # <%= sort_header_tag('address', :width => 200) %>
45 # </tr>
46 # </tr>
46 # </thead>
47 # </thead>
47 #
48 #
48 # - The ascending and descending sort icon images are sort_asc.png and
49 # - Introduces instance variables: @sort_default, @sort_criteria
49 # sort_desc.png and reside in the application's images directory.
50 # - Introduces param :sort
50 # - Introduces instance variables: @sort_name, @sort_default.
51 # - Introduces params :sort_key and :sort_order.
52 #
51 #
52
53 module SortHelper
53 module SortHelper
54 class SortCriteria
55
56 def initialize
57 @criteria = []
58 end
59
60 def available_criteria=(criteria)
61 unless criteria.is_a?(Hash)
62 criteria = criteria.inject({}) {|h,k| h[k] = k; h}
63 end
64 @available_criteria = criteria
65 end
66
67 def from_param(param)
68 @criteria = param.to_s.split(',').collect {|s| s.split(':')[0..1]}
69 normalize!
70 end
71
72 def to_param
73 @criteria.collect {|k,o| k + (o ? '' : ':desc')}.join(',')
74 end
75
76 def to_sql
77 sql = @criteria.collect do |k,o|
78 if s = @available_criteria[k]
79 (o ? s.to_a : s.to_a.collect {|c| "#{c} DESC"}).join(', ')
80 end
81 end.compact.join(', ')
82 sql.blank? ? nil : sql
83 end
84
85 def add!(key, asc)
86 @criteria.delete_if {|k,o| k == key}
87 @criteria = [[key, asc]] + @criteria
88 normalize!
89 end
90
91 def add(*args)
92 r = self.class.new.from_param(to_param)
93 r.add!(*args)
94 r
95 end
96
97 def first_key
98 @criteria.first && @criteria.first.first
99 end
100
101 def first_asc?
102 @criteria.first && @criteria.first.last
103 end
104
105 private
106
107 def normalize!
108 @criteria = @criteria.collect {|s| [s.first, (s.last == false || s.last == 'desc') ? false : true]}
109 @criteria = @criteria.select {|k,o| @available_criteria.has_key?(k)} if @available_criteria
110 @criteria.slice!(3)
111 self
112 end
113 end
54
114
55 # Initializes the default sort column (default_key) and sort order
115 # Initializes the default sort column (default_key) and sort order
56 # (default_order).
116 # (default_order).
57 #
117 #
58 # - default_key is a column attribute name.
118 # - default_key is a column attribute name.
59 # - default_order is 'asc' or 'desc'.
119 # - default_order is 'asc' or 'desc'.
60 # - name is the name of the session hash entry that stores the sort state,
61 # defaults to '<controller_name>_sort'.
62 #
120 #
63 def sort_init(default_key, default_order='asc', name=nil)
121 def sort_init(default_key, default_order='asc')
64 @sort_name = name || params[:controller] + params[:action] + '_sort'
122 @sort_default = "#{default_key}:#{default_order}"
65 @sort_default = {:key => default_key, :order => default_order}
66 end
123 end
67
124
68 # Updates the sort state. Call this in the controller prior to calling
125 # Updates the sort state. Call this in the controller prior to calling
69 # sort_clause.
126 # sort_clause.
70 # sort_keys can be either an array or a hash of allowed keys
127 # - criteria can be either an array or a hash of allowed keys
71 def sort_update(sort_keys)
128 #
72 sort_key = params[:sort_key]
129 def sort_update(criteria)
73 sort_key = nil unless (sort_keys.is_a?(Array) ? sort_keys.include?(sort_key) : sort_keys[sort_key])
130 sort_name = controller_name + '_' + action_name + '_sort'
74
75 sort_order = (params[:sort_order] == 'desc' ? 'DESC' : 'ASC')
76
77 if sort_key
78 sort = {:key => sort_key, :order => sort_order}
79 elsif session[@sort_name]
80 sort = session[@sort_name] # Previous sort.
81 else
82 sort = @sort_default
83 end
84 session[@sort_name] = sort
85
131
86 sort_column = (sort_keys.is_a?(Hash) ? sort_keys[sort[:key]] : sort[:key])
132 @sort_criteria = SortCriteria.new
87 @sort_clause = (sort_column.blank? ? nil : [sort_column].flatten.collect {|s| "#{s} #{sort[:order]}"}.join(','))
133 @sort_criteria.available_criteria = criteria
134 @sort_criteria.from_param(params[:sort] || session[sort_name] || @sort_default)
135 session[sort_name] = @sort_criteria.to_param
88 end
136 end
89
137
90 # Returns an SQL sort clause corresponding to the current sort state.
138 # Returns an SQL sort clause corresponding to the current sort state.
91 # Use this to sort the controller's table items collection.
139 # Use this to sort the controller's table items collection.
92 #
140 #
93 def sort_clause()
141 def sort_clause()
94 @sort_clause
142 @sort_criteria.to_sql
95 end
143 end
96
144
97 # Returns a link which sorts by the named column.
145 # Returns a link which sorts by the named column.
98 #
146 #
99 # - column is the name of an attribute in the sorted record collection.
147 # - column is the name of an attribute in the sorted record collection.
100 # - The optional caption explicitly specifies the displayed link text.
148 # - the optional caption explicitly specifies the displayed link text.
101 # - A sort icon image is positioned to the right of the sort link.
149 # - 2 CSS classes reflect the state of the link: sort and asc or desc
102 #
150 #
103 def sort_link(column, caption, default_order)
151 def sort_link(column, caption, default_order)
104 key, order = session[@sort_name][:key], session[@sort_name][:order]
152 css, order = nil, default_order
105 if key == column
153
106 if order.downcase == 'asc'
154 if column.to_s == @sort_criteria.first_key
107 icon = 'sort_asc.png'
155 if @sort_criteria.first_asc?
156 css = 'sort asc'
108 order = 'desc'
157 order = 'desc'
109 else
158 else
110 icon = 'sort_desc.png'
159 css = 'sort desc'
111 order = 'asc'
160 order = 'asc'
112 end
161 end
113 else
114 icon = nil
115 order = default_order
116 end
162 end
117 caption = titleize(Inflector::humanize(column)) unless caption
163 caption = column.to_s.humanize unless caption
118
164
119 sort_options = { :sort_key => column, :sort_order => order }
165 sort_options = { :sort => @sort_criteria.add(column.to_s, order).to_param }
120 # don't reuse params if filters are present
166 # don't reuse params if filters are present
121 url_options = params.has_key?(:set_filter) ? sort_options : params.merge(sort_options)
167 url_options = params.has_key?(:set_filter) ? sort_options : params.merge(sort_options)
122
168
123 # Add project_id to url_options
169 # Add project_id to url_options
124 url_options = url_options.merge(:project_id => params[:project_id]) if params.has_key?(:project_id)
170 url_options = url_options.merge(:project_id => params[:project_id]) if params.has_key?(:project_id)
125
171
126 link_to_remote(caption,
172 link_to_remote(caption,
127 {:update => "content", :url => url_options, :method => :get},
173 {:update => "content", :url => url_options, :method => :get},
128 {:href => url_for(url_options)}) +
174 {:href => url_for(url_options),
129 (icon ? nbsp(2) + image_tag(icon) : '')
175 :class => css})
130 end
176 end
131
177
132 # Returns a table header <th> tag with a sort link for the named column
178 # Returns a table header <th> tag with a sort link for the named column
133 # attribute.
179 # attribute.
134 #
180 #
135 # Options:
181 # Options:
136 # :caption The displayed link name (defaults to titleized column name).
182 # :caption The displayed link name (defaults to titleized column name).
137 # :title The tag's 'title' attribute (defaults to 'Sort by :caption').
183 # :title The tag's 'title' attribute (defaults to 'Sort by :caption').
138 #
184 #
139 # Other options hash entries generate additional table header tag attributes.
185 # Other options hash entries generate additional table header tag attributes.
140 #
186 #
141 # Example:
187 # Example:
142 #
188 #
143 # <%= sort_header_tag('id', :title => 'Sort by contact ID', :width => 40) %>
189 # <%= sort_header_tag('id', :title => 'Sort by contact ID', :width => 40) %>
144 #
190 #
145 # Renders:
191 # Renders:
146 #
192 #
147 # <th title="Sort by contact ID" width="40">
193 # <th title="Sort by contact ID" width="40">
148 # <a href="/contact/list?sort_order=desc&amp;sort_key=id">Id</a>
194 # <a href="/contact/list?sort_order=desc&amp;sort_key=id">Id</a>
149 # &nbsp;&nbsp;<img alt="Sort_asc" src="/images/sort_asc.png" />
195 # &nbsp;&nbsp;<img alt="Sort_asc" src="/images/sort_asc.png" />
150 # </th>
196 # </th>
151 #
197 #
152 def sort_header_tag(column, options = {})
198 def sort_header_tag(column, options = {})
153 caption = options.delete(:caption) || titleize(Inflector::humanize(column))
199 caption = options.delete(:caption) || column.to_s.humanize
154 default_order = options.delete(:default_order) || 'asc'
200 default_order = options.delete(:default_order) || 'asc'
155 options[:title]= l(:label_sort_by, "\"#{caption}\"") unless options[:title]
201 options[:title] = l(:label_sort_by, "\"#{caption}\"") unless options[:title]
156 content_tag('th', sort_link(column, caption, default_order), options)
202 content_tag('th', sort_link(column, caption, default_order), options)
157 end
203 end
158
159 private
160
161 # Return n non-breaking spaces.
162 def nbsp(n)
163 '&nbsp;' * n
164 end
165
166 # Return capitalized title.
167 def titleize(title)
168 title.split.map {|w| w.capitalize }.join(' ')
169 end
170
171 end
204 end
205
@@ -1,714 +1,718
1 body { font-family: Verdana, sans-serif; font-size: 12px; color:#484848; margin: 0; padding: 0; min-width: 900px; }
1 body { font-family: Verdana, sans-serif; font-size: 12px; color:#484848; margin: 0; padding: 0; min-width: 900px; }
2
2
3 h1, h2, h3, h4 { font-family: "Trebuchet MS", Verdana, sans-serif;}
3 h1, h2, h3, h4 { font-family: "Trebuchet MS", Verdana, sans-serif;}
4 h1 {margin:0; padding:0; font-size: 24px;}
4 h1 {margin:0; padding:0; font-size: 24px;}
5 h2, .wiki h1 {font-size: 20px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
5 h2, .wiki h1 {font-size: 20px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
6 h3, .wiki h2 {font-size: 16px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
6 h3, .wiki h2 {font-size: 16px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
7 h4, .wiki h3 {font-size: 13px;padding: 2px 10px 1px 0px;margin-bottom: 5px; border-bottom: 1px dotted #bbbbbb; color: #444;}
7 h4, .wiki h3 {font-size: 13px;padding: 2px 10px 1px 0px;margin-bottom: 5px; border-bottom: 1px dotted #bbbbbb; color: #444;}
8
8
9 /***** Layout *****/
9 /***** Layout *****/
10 #wrapper {background: white;}
10 #wrapper {background: white;}
11
11
12 #top-menu {background: #2C4056; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;}
12 #top-menu {background: #2C4056; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;}
13 #top-menu ul {margin: 0; padding: 0;}
13 #top-menu ul {margin: 0; padding: 0;}
14 #top-menu li {
14 #top-menu li {
15 float:left;
15 float:left;
16 list-style-type:none;
16 list-style-type:none;
17 margin: 0px 0px 0px 0px;
17 margin: 0px 0px 0px 0px;
18 padding: 0px 0px 0px 0px;
18 padding: 0px 0px 0px 0px;
19 white-space:nowrap;
19 white-space:nowrap;
20 }
20 }
21 #top-menu a {color: #fff; margin-right: 8px; font-weight: bold;}
21 #top-menu a {color: #fff; margin-right: 8px; font-weight: bold;}
22 #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; }
22 #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; }
23
23
24 #account {float:right;}
24 #account {float:right;}
25
25
26 #header {height:5.3em;margin:0;background-color:#507AAA;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;}
26 #header {height:5.3em;margin:0;background-color:#507AAA;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;}
27 #header a {color:#f8f8f8;}
27 #header a {color:#f8f8f8;}
28 #header h1 a.ancestor { font-size: 80%; }
28 #header h1 a.ancestor { font-size: 80%; }
29 #quick-search {float:right;}
29 #quick-search {float:right;}
30
30
31 #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
31 #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
32 #main-menu ul {margin: 0; padding: 0;}
32 #main-menu ul {margin: 0; padding: 0;}
33 #main-menu li {
33 #main-menu li {
34 float:left;
34 float:left;
35 list-style-type:none;
35 list-style-type:none;
36 margin: 0px 2px 0px 0px;
36 margin: 0px 2px 0px 0px;
37 padding: 0px 0px 0px 0px;
37 padding: 0px 0px 0px 0px;
38 white-space:nowrap;
38 white-space:nowrap;
39 }
39 }
40 #main-menu li a {
40 #main-menu li a {
41 display: block;
41 display: block;
42 color: #fff;
42 color: #fff;
43 text-decoration: none;
43 text-decoration: none;
44 font-weight: bold;
44 font-weight: bold;
45 margin: 0;
45 margin: 0;
46 padding: 4px 10px 4px 10px;
46 padding: 4px 10px 4px 10px;
47 }
47 }
48 #main-menu li a:hover {background:#759FCF; color:#fff;}
48 #main-menu li a:hover {background:#759FCF; color:#fff;}
49 #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;}
49 #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;}
50
50
51 #main {background-color:#EEEEEE;}
51 #main {background-color:#EEEEEE;}
52
52
53 #sidebar{ float: right; width: 17%; position: relative; z-index: 9; min-height: 600px; padding: 0; margin: 0;}
53 #sidebar{ float: right; width: 17%; position: relative; z-index: 9; min-height: 600px; padding: 0; margin: 0;}
54 * html #sidebar{ width: 17%; }
54 * html #sidebar{ width: 17%; }
55 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
55 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
56 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
56 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
57 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
57 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
58
58
59 #content { width: 80%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; }
59 #content { width: 80%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; }
60 * html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
60 * html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
61 html>body #content { min-height: 600px; }
61 html>body #content { min-height: 600px; }
62 * html body #content { height: 600px; } /* IE */
62 * html body #content { height: 600px; } /* IE */
63
63
64 #main.nosidebar #sidebar{ display: none; }
64 #main.nosidebar #sidebar{ display: none; }
65 #main.nosidebar #content{ width: auto; border-right: 0; }
65 #main.nosidebar #content{ width: auto; border-right: 0; }
66
66
67 #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
67 #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
68
68
69 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
69 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
70 #login-form table td {padding: 6px;}
70 #login-form table td {padding: 6px;}
71 #login-form label {font-weight: bold;}
71 #login-form label {font-weight: bold;}
72
72
73 input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; }
73 input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; }
74
74
75 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
75 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
76
76
77 /***** Links *****/
77 /***** Links *****/
78 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
78 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
79 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
79 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
80 a img{ border: 0; }
80 a img{ border: 0; }
81
81
82 a.issue.closed, a.issue.closed:link, a.issue.closed:visited { text-decoration: line-through; }
82 a.issue.closed, a.issue.closed:link, a.issue.closed:visited { text-decoration: line-through; }
83
83
84 /***** Tables *****/
84 /***** Tables *****/
85 table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
85 table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
86 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
86 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
87 table.list td { vertical-align: top; }
87 table.list td { vertical-align: top; }
88 table.list td.id { width: 2%; text-align: center;}
88 table.list td.id { width: 2%; text-align: center;}
89 table.list td.checkbox { width: 15px; padding: 0px;}
89 table.list td.checkbox { width: 15px; padding: 0px;}
90
90
91 tr.project td.name a { padding-left: 16px; white-space:nowrap; }
91 tr.project td.name a { padding-left: 16px; white-space:nowrap; }
92 tr.project.parent td.name a { background: url('../images/bullet_toggle_minus.png') no-repeat; }
92 tr.project.parent td.name a { background: url('../images/bullet_toggle_minus.png') no-repeat; }
93
93
94 tr.issue { text-align: center; white-space: nowrap; }
94 tr.issue { text-align: center; white-space: nowrap; }
95 tr.issue td.subject, tr.issue td.category, td.assigned_to { white-space: normal; }
95 tr.issue td.subject, tr.issue td.category, td.assigned_to { white-space: normal; }
96 tr.issue td.subject { text-align: left; }
96 tr.issue td.subject { text-align: left; }
97 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
97 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
98
98
99 tr.entry { border: 1px solid #f8f8f8; }
99 tr.entry { border: 1px solid #f8f8f8; }
100 tr.entry td { white-space: nowrap; }
100 tr.entry td { white-space: nowrap; }
101 tr.entry td.filename { width: 30%; }
101 tr.entry td.filename { width: 30%; }
102 tr.entry td.size { text-align: right; font-size: 90%; }
102 tr.entry td.size { text-align: right; font-size: 90%; }
103 tr.entry td.revision, tr.entry td.author { text-align: center; }
103 tr.entry td.revision, tr.entry td.author { text-align: center; }
104 tr.entry td.age { text-align: right; }
104 tr.entry td.age { text-align: right; }
105
105
106 tr.entry span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;}
106 tr.entry span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;}
107 tr.entry.open span.expander {background-image: url(../images/bullet_toggle_minus.png);}
107 tr.entry.open span.expander {background-image: url(../images/bullet_toggle_minus.png);}
108 tr.entry.file td.filename a { margin-left: 16px; }
108 tr.entry.file td.filename a { margin-left: 16px; }
109
109
110 tr.changeset td.author { text-align: center; width: 15%; }
110 tr.changeset td.author { text-align: center; width: 15%; }
111 tr.changeset td.committed_on { text-align: center; width: 15%; }
111 tr.changeset td.committed_on { text-align: center; width: 15%; }
112
112
113 tr.file td { text-align: center; }
113 tr.file td { text-align: center; }
114 tr.file td.filename { text-align: left; padding-left: 24px; }
114 tr.file td.filename { text-align: left; padding-left: 24px; }
115 tr.file td.digest { font-size: 80%; }
115 tr.file td.digest { font-size: 80%; }
116
116
117 tr.message { height: 2.6em; }
117 tr.message { height: 2.6em; }
118 tr.message td.last_message { font-size: 80%; }
118 tr.message td.last_message { font-size: 80%; }
119 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
119 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
120 tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; }
120 tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; }
121
121
122 tr.user td { width:13%; }
122 tr.user td { width:13%; }
123 tr.user td.email { width:18%; }
123 tr.user td.email { width:18%; }
124 tr.user td { white-space: nowrap; }
124 tr.user td { white-space: nowrap; }
125 tr.user.locked, tr.user.registered { color: #aaa; }
125 tr.user.locked, tr.user.registered { color: #aaa; }
126 tr.user.locked a, tr.user.registered a { color: #aaa; }
126 tr.user.locked a, tr.user.registered a { color: #aaa; }
127
127
128 tr.time-entry { text-align: center; white-space: nowrap; }
128 tr.time-entry { text-align: center; white-space: nowrap; }
129 tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; }
129 tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; }
130 td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
130 td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
131 td.hours .hours-dec { font-size: 0.9em; }
131 td.hours .hours-dec { font-size: 0.9em; }
132
132
133 table.plugins td { vertical-align: middle; }
133 table.plugins td { vertical-align: middle; }
134 table.plugins td.configure { text-align: right; padding-right: 1em; }
134 table.plugins td.configure { text-align: right; padding-right: 1em; }
135 table.plugins span.name { font-weight: bold; display: block; margin-bottom: 6px; }
135 table.plugins span.name { font-weight: bold; display: block; margin-bottom: 6px; }
136 table.plugins span.description { display: block; font-size: 0.9em; }
136 table.plugins span.description { display: block; font-size: 0.9em; }
137 table.plugins span.url { display: block; font-size: 0.9em; }
137 table.plugins span.url { display: block; font-size: 0.9em; }
138
138
139 table.list tbody tr:hover { background-color:#ffffdd; }
139 table.list tbody tr:hover { background-color:#ffffdd; }
140 table td {padding:2px;}
140 table td {padding:2px;}
141 table p {margin:0;}
141 table p {margin:0;}
142 .odd {background-color:#f6f7f8;}
142 .odd {background-color:#f6f7f8;}
143 .even {background-color: #fff;}
143 .even {background-color: #fff;}
144
144
145 a.sort { padding-right: 16px; background-position: 100% 50%; background-repeat: no-repeat; }
146 a.sort.asc { background-image: url(../images/sort_asc.png); }
147 a.sort.desc { background-image: url(../images/sort_desc.png); }
148
145 .highlight { background-color: #FCFD8D;}
149 .highlight { background-color: #FCFD8D;}
146 .highlight.token-1 { background-color: #faa;}
150 .highlight.token-1 { background-color: #faa;}
147 .highlight.token-2 { background-color: #afa;}
151 .highlight.token-2 { background-color: #afa;}
148 .highlight.token-3 { background-color: #aaf;}
152 .highlight.token-3 { background-color: #aaf;}
149
153
150 .box{
154 .box{
151 padding:6px;
155 padding:6px;
152 margin-bottom: 10px;
156 margin-bottom: 10px;
153 background-color:#f6f6f6;
157 background-color:#f6f6f6;
154 color:#505050;
158 color:#505050;
155 line-height:1.5em;
159 line-height:1.5em;
156 border: 1px solid #e4e4e4;
160 border: 1px solid #e4e4e4;
157 }
161 }
158
162
159 div.square {
163 div.square {
160 border: 1px solid #999;
164 border: 1px solid #999;
161 float: left;
165 float: left;
162 margin: .3em .4em 0 .4em;
166 margin: .3em .4em 0 .4em;
163 overflow: hidden;
167 overflow: hidden;
164 width: .6em; height: .6em;
168 width: .6em; height: .6em;
165 }
169 }
166 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
170 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
167 .contextual input {font-size:0.9em;}
171 .contextual input {font-size:0.9em;}
168 .message .contextual { margin-top: 0; }
172 .message .contextual { margin-top: 0; }
169
173
170 .splitcontentleft{float:left; width:49%;}
174 .splitcontentleft{float:left; width:49%;}
171 .splitcontentright{float:right; width:49%;}
175 .splitcontentright{float:right; width:49%;}
172 form {display: inline;}
176 form {display: inline;}
173 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
177 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
174 fieldset {border: 1px solid #e4e4e4; margin:0;}
178 fieldset {border: 1px solid #e4e4e4; margin:0;}
175 legend {color: #484848;}
179 legend {color: #484848;}
176 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
180 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
177 blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;}
181 blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;}
178 blockquote blockquote { margin-left: 0;}
182 blockquote blockquote { margin-left: 0;}
179 textarea.wiki-edit { width: 99%; }
183 textarea.wiki-edit { width: 99%; }
180 li p {margin-top: 0;}
184 li p {margin-top: 0;}
181 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
185 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
182 p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;}
186 p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;}
183 p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; }
187 p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; }
184 p.footnote { font-size: 0.9em; margin-top: 0px; margin-bottom: 0px; }
188 p.footnote { font-size: 0.9em; margin-top: 0px; margin-bottom: 0px; }
185
189
186 fieldset#filters, fieldset#date-range { padding: 0.7em; margin-bottom: 8px; }
190 fieldset#filters, fieldset#date-range { padding: 0.7em; margin-bottom: 8px; }
187 fieldset#filters p { margin: 1.2em 0 0.8em 2px; }
191 fieldset#filters p { margin: 1.2em 0 0.8em 2px; }
188 fieldset#filters table { border-collapse: collapse; }
192 fieldset#filters table { border-collapse: collapse; }
189 fieldset#filters table td { padding: 0; vertical-align: middle; }
193 fieldset#filters table td { padding: 0; vertical-align: middle; }
190 fieldset#filters tr.filter { height: 2em; }
194 fieldset#filters tr.filter { height: 2em; }
191 fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
195 fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
192 .buttons { font-size: 0.9em; }
196 .buttons { font-size: 0.9em; }
193
197
194 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
198 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
195 div#issue-changesets .changeset { padding: 4px;}
199 div#issue-changesets .changeset { padding: 4px;}
196 div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
200 div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
197 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
201 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
198
202
199 div#activity dl, #search-results { margin-left: 2em; }
203 div#activity dl, #search-results { margin-left: 2em; }
200 div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
204 div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
201 div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
205 div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
202 div#activity dt.me .time { border-bottom: 1px solid #999; }
206 div#activity dt.me .time { border-bottom: 1px solid #999; }
203 div#activity dt .time { color: #777; font-size: 80%; }
207 div#activity dt .time { color: #777; font-size: 80%; }
204 div#activity dd .description, #search-results dd .description { font-style: italic; }
208 div#activity dd .description, #search-results dd .description { font-style: italic; }
205 div#activity span.project:after, #search-results span.project:after { content: " -"; }
209 div#activity span.project:after, #search-results span.project:after { content: " -"; }
206 div#activity dd span.description, #search-results dd span.description { display:block; color: #808080; }
210 div#activity dd span.description, #search-results dd span.description { display:block; color: #808080; }
207
211
208 #search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; }
212 #search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; }
209
213
210 div#search-results-counts {float:right;}
214 div#search-results-counts {float:right;}
211 div#search-results-counts ul { margin-top: 0.5em; }
215 div#search-results-counts ul { margin-top: 0.5em; }
212 div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; }
216 div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; }
213
217
214 dt.issue { background-image: url(../images/ticket.png); }
218 dt.issue { background-image: url(../images/ticket.png); }
215 dt.issue-edit { background-image: url(../images/ticket_edit.png); }
219 dt.issue-edit { background-image: url(../images/ticket_edit.png); }
216 dt.issue-closed { background-image: url(../images/ticket_checked.png); }
220 dt.issue-closed { background-image: url(../images/ticket_checked.png); }
217 dt.issue-note { background-image: url(../images/ticket_note.png); }
221 dt.issue-note { background-image: url(../images/ticket_note.png); }
218 dt.changeset { background-image: url(../images/changeset.png); }
222 dt.changeset { background-image: url(../images/changeset.png); }
219 dt.news { background-image: url(../images/news.png); }
223 dt.news { background-image: url(../images/news.png); }
220 dt.message { background-image: url(../images/message.png); }
224 dt.message { background-image: url(../images/message.png); }
221 dt.reply { background-image: url(../images/comments.png); }
225 dt.reply { background-image: url(../images/comments.png); }
222 dt.wiki-page { background-image: url(../images/wiki_edit.png); }
226 dt.wiki-page { background-image: url(../images/wiki_edit.png); }
223 dt.attachment { background-image: url(../images/attachment.png); }
227 dt.attachment { background-image: url(../images/attachment.png); }
224 dt.document { background-image: url(../images/document.png); }
228 dt.document { background-image: url(../images/document.png); }
225 dt.project { background-image: url(../images/projects.png); }
229 dt.project { background-image: url(../images/projects.png); }
226
230
227 #search-results dt.issue.closed { background-image: url(../images/ticket_checked.png); }
231 #search-results dt.issue.closed { background-image: url(../images/ticket_checked.png); }
228
232
229 div#roadmap fieldset.related-issues { margin-bottom: 1em; }
233 div#roadmap fieldset.related-issues { margin-bottom: 1em; }
230 div#roadmap fieldset.related-issues ul { margin-top: 0.3em; margin-bottom: 0.3em; }
234 div#roadmap fieldset.related-issues ul { margin-top: 0.3em; margin-bottom: 0.3em; }
231 div#roadmap .wiki h1:first-child { display: none; }
235 div#roadmap .wiki h1:first-child { display: none; }
232 div#roadmap .wiki h1 { font-size: 120%; }
236 div#roadmap .wiki h1 { font-size: 120%; }
233 div#roadmap .wiki h2 { font-size: 110%; }
237 div#roadmap .wiki h2 { font-size: 110%; }
234
238
235 div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; background-color: #fff; }
239 div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; background-color: #fff; }
236 div#version-summary fieldset { margin-bottom: 1em; }
240 div#version-summary fieldset { margin-bottom: 1em; }
237 div#version-summary .total-hours { text-align: right; }
241 div#version-summary .total-hours { text-align: right; }
238
242
239 table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; }
243 table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; }
240 table#time-report tbody tr { font-style: italic; color: #777; }
244 table#time-report tbody tr { font-style: italic; color: #777; }
241 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
245 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
242 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
246 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
243 table#time-report .hours-dec { font-size: 0.9em; }
247 table#time-report .hours-dec { font-size: 0.9em; }
244
248
245 form#issue-form .attributes { margin-bottom: 8px; }
249 form#issue-form .attributes { margin-bottom: 8px; }
246 form#issue-form .attributes p { padding-top: 1px; padding-bottom: 2px; }
250 form#issue-form .attributes p { padding-top: 1px; padding-bottom: 2px; }
247 form#issue-form .attributes select { min-width: 30%; }
251 form#issue-form .attributes select { min-width: 30%; }
248
252
249 ul.projects { margin: 0; padding-left: 1em; }
253 ul.projects { margin: 0; padding-left: 1em; }
250 ul.projects.root { margin: 0; padding: 0; }
254 ul.projects.root { margin: 0; padding: 0; }
251 ul.projects ul { border-left: 3px solid #e0e0e0; }
255 ul.projects ul { border-left: 3px solid #e0e0e0; }
252 ul.projects li { list-style-type:none; }
256 ul.projects li { list-style-type:none; }
253 ul.projects li.root { margin-bottom: 1em; }
257 ul.projects li.root { margin-bottom: 1em; }
254 ul.projects li.child { margin-top: 1em;}
258 ul.projects li.child { margin-top: 1em;}
255 ul.projects div.root a.project { font-family: "Trebuchet MS", Verdana, sans-serif; font-weight: bold; font-size: 16px; margin: 0 0 10px 0; }
259 ul.projects div.root a.project { font-family: "Trebuchet MS", Verdana, sans-serif; font-weight: bold; font-size: 16px; margin: 0 0 10px 0; }
256 .my-project { padding-left: 18px; background: url(../images/fav.png) no-repeat 0 50%; }
260 .my-project { padding-left: 18px; background: url(../images/fav.png) no-repeat 0 50%; }
257
261
258 #tracker_project_ids ul { margin: 0; padding-left: 1em; }
262 #tracker_project_ids ul { margin: 0; padding-left: 1em; }
259 #tracker_project_ids li { list-style-type:none; }
263 #tracker_project_ids li { list-style-type:none; }
260
264
261 ul.properties {padding:0; font-size: 0.9em; color: #777;}
265 ul.properties {padding:0; font-size: 0.9em; color: #777;}
262 ul.properties li {list-style-type:none;}
266 ul.properties li {list-style-type:none;}
263 ul.properties li span {font-style:italic;}
267 ul.properties li span {font-style:italic;}
264
268
265 .total-hours { font-size: 110%; font-weight: bold; }
269 .total-hours { font-size: 110%; font-weight: bold; }
266 .total-hours span.hours-int { font-size: 120%; }
270 .total-hours span.hours-int { font-size: 120%; }
267
271
268 .autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
272 .autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
269 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
273 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
270
274
271 .pagination {font-size: 90%}
275 .pagination {font-size: 90%}
272 p.pagination {margin-top:8px;}
276 p.pagination {margin-top:8px;}
273
277
274 /***** Tabular forms ******/
278 /***** Tabular forms ******/
275 .tabular p{
279 .tabular p{
276 margin: 0;
280 margin: 0;
277 padding: 5px 0 8px 0;
281 padding: 5px 0 8px 0;
278 padding-left: 180px; /*width of left column containing the label elements*/
282 padding-left: 180px; /*width of left column containing the label elements*/
279 height: 1%;
283 height: 1%;
280 clear:left;
284 clear:left;
281 }
285 }
282
286
283 html>body .tabular p {overflow:hidden;}
287 html>body .tabular p {overflow:hidden;}
284
288
285 .tabular label{
289 .tabular label{
286 font-weight: bold;
290 font-weight: bold;
287 float: left;
291 float: left;
288 text-align: right;
292 text-align: right;
289 margin-left: -180px; /*width of left column*/
293 margin-left: -180px; /*width of left column*/
290 width: 175px; /*width of labels. Should be smaller than left column to create some right
294 width: 175px; /*width of labels. Should be smaller than left column to create some right
291 margin*/
295 margin*/
292 }
296 }
293
297
294 .tabular label.floating{
298 .tabular label.floating{
295 font-weight: normal;
299 font-weight: normal;
296 margin-left: 0px;
300 margin-left: 0px;
297 text-align: left;
301 text-align: left;
298 width: 270px;
302 width: 270px;
299 }
303 }
300
304
301 input#time_entry_comments { width: 90%;}
305 input#time_entry_comments { width: 90%;}
302
306
303 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
307 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
304
308
305 .tabular.settings p{ padding-left: 300px; }
309 .tabular.settings p{ padding-left: 300px; }
306 .tabular.settings label{ margin-left: -300px; width: 295px; }
310 .tabular.settings label{ margin-left: -300px; width: 295px; }
307
311
308 .required {color: #bb0000;}
312 .required {color: #bb0000;}
309 .summary {font-style: italic;}
313 .summary {font-style: italic;}
310
314
311 #attachments_fields input[type=text] {margin-left: 8px; }
315 #attachments_fields input[type=text] {margin-left: 8px; }
312
316
313 div.attachments { margin-top: 12px; }
317 div.attachments { margin-top: 12px; }
314 div.attachments p { margin:4px 0 2px 0; }
318 div.attachments p { margin:4px 0 2px 0; }
315 div.attachments img { vertical-align: middle; }
319 div.attachments img { vertical-align: middle; }
316 div.attachments span.author { font-size: 0.9em; color: #888; }
320 div.attachments span.author { font-size: 0.9em; color: #888; }
317
321
318 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
322 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
319 .other-formats span + span:before { content: "| "; }
323 .other-formats span + span:before { content: "| "; }
320
324
321 a.atom { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
325 a.atom { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
322
326
323 /***** Flash & error messages ****/
327 /***** Flash & error messages ****/
324 #errorExplanation, div.flash, .nodata, .warning {
328 #errorExplanation, div.flash, .nodata, .warning {
325 padding: 4px 4px 4px 30px;
329 padding: 4px 4px 4px 30px;
326 margin-bottom: 12px;
330 margin-bottom: 12px;
327 font-size: 1.1em;
331 font-size: 1.1em;
328 border: 2px solid;
332 border: 2px solid;
329 }
333 }
330
334
331 div.flash {margin-top: 8px;}
335 div.flash {margin-top: 8px;}
332
336
333 div.flash.error, #errorExplanation {
337 div.flash.error, #errorExplanation {
334 background: url(../images/false.png) 8px 5px no-repeat;
338 background: url(../images/false.png) 8px 5px no-repeat;
335 background-color: #ffe3e3;
339 background-color: #ffe3e3;
336 border-color: #dd0000;
340 border-color: #dd0000;
337 color: #550000;
341 color: #550000;
338 }
342 }
339
343
340 div.flash.notice {
344 div.flash.notice {
341 background: url(../images/true.png) 8px 5px no-repeat;
345 background: url(../images/true.png) 8px 5px no-repeat;
342 background-color: #dfffdf;
346 background-color: #dfffdf;
343 border-color: #9fcf9f;
347 border-color: #9fcf9f;
344 color: #005f00;
348 color: #005f00;
345 }
349 }
346
350
347 div.flash.warning {
351 div.flash.warning {
348 background: url(../images/warning.png) 8px 5px no-repeat;
352 background: url(../images/warning.png) 8px 5px no-repeat;
349 background-color: #FFEBC1;
353 background-color: #FFEBC1;
350 border-color: #FDBF3B;
354 border-color: #FDBF3B;
351 color: #A6750C;
355 color: #A6750C;
352 text-align: left;
356 text-align: left;
353 }
357 }
354
358
355 .nodata, .warning {
359 .nodata, .warning {
356 text-align: center;
360 text-align: center;
357 background-color: #FFEBC1;
361 background-color: #FFEBC1;
358 border-color: #FDBF3B;
362 border-color: #FDBF3B;
359 color: #A6750C;
363 color: #A6750C;
360 }
364 }
361
365
362 #errorExplanation ul { font-size: 0.9em;}
366 #errorExplanation ul { font-size: 0.9em;}
363 #errorExplanation h2, #errorExplanation p { display: none; }
367 #errorExplanation h2, #errorExplanation p { display: none; }
364
368
365 /***** Ajax indicator ******/
369 /***** Ajax indicator ******/
366 #ajax-indicator {
370 #ajax-indicator {
367 position: absolute; /* fixed not supported by IE */
371 position: absolute; /* fixed not supported by IE */
368 background-color:#eee;
372 background-color:#eee;
369 border: 1px solid #bbb;
373 border: 1px solid #bbb;
370 top:35%;
374 top:35%;
371 left:40%;
375 left:40%;
372 width:20%;
376 width:20%;
373 font-weight:bold;
377 font-weight:bold;
374 text-align:center;
378 text-align:center;
375 padding:0.6em;
379 padding:0.6em;
376 z-index:100;
380 z-index:100;
377 filter:alpha(opacity=50);
381 filter:alpha(opacity=50);
378 opacity: 0.5;
382 opacity: 0.5;
379 }
383 }
380
384
381 html>body #ajax-indicator { position: fixed; }
385 html>body #ajax-indicator { position: fixed; }
382
386
383 #ajax-indicator span {
387 #ajax-indicator span {
384 background-position: 0% 40%;
388 background-position: 0% 40%;
385 background-repeat: no-repeat;
389 background-repeat: no-repeat;
386 background-image: url(../images/loading.gif);
390 background-image: url(../images/loading.gif);
387 padding-left: 26px;
391 padding-left: 26px;
388 vertical-align: bottom;
392 vertical-align: bottom;
389 }
393 }
390
394
391 /***** Calendar *****/
395 /***** Calendar *****/
392 table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;}
396 table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;}
393 table.cal thead th {width: 14%;}
397 table.cal thead th {width: 14%;}
394 table.cal tbody tr {height: 100px;}
398 table.cal tbody tr {height: 100px;}
395 table.cal th { background-color:#EEEEEE; padding: 4px; }
399 table.cal th { background-color:#EEEEEE; padding: 4px; }
396 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
400 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
397 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
401 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
398 table.cal td.odd p.day-num {color: #bbb;}
402 table.cal td.odd p.day-num {color: #bbb;}
399 table.cal td.today {background:#ffffdd;}
403 table.cal td.today {background:#ffffdd;}
400 table.cal td.today p.day-num {font-weight: bold;}
404 table.cal td.today p.day-num {font-weight: bold;}
401
405
402 /***** Tooltips ******/
406 /***** Tooltips ******/
403 .tooltip{position:relative;z-index:24;}
407 .tooltip{position:relative;z-index:24;}
404 .tooltip:hover{z-index:25;color:#000;}
408 .tooltip:hover{z-index:25;color:#000;}
405 .tooltip span.tip{display: none; text-align:left;}
409 .tooltip span.tip{display: none; text-align:left;}
406
410
407 div.tooltip:hover span.tip{
411 div.tooltip:hover span.tip{
408 display:block;
412 display:block;
409 position:absolute;
413 position:absolute;
410 top:12px; left:24px; width:270px;
414 top:12px; left:24px; width:270px;
411 border:1px solid #555;
415 border:1px solid #555;
412 background-color:#fff;
416 background-color:#fff;
413 padding: 4px;
417 padding: 4px;
414 font-size: 0.8em;
418 font-size: 0.8em;
415 color:#505050;
419 color:#505050;
416 }
420 }
417
421
418 /***** Progress bar *****/
422 /***** Progress bar *****/
419 table.progress {
423 table.progress {
420 border: 1px solid #D7D7D7;
424 border: 1px solid #D7D7D7;
421 border-collapse: collapse;
425 border-collapse: collapse;
422 border-spacing: 0pt;
426 border-spacing: 0pt;
423 empty-cells: show;
427 empty-cells: show;
424 text-align: center;
428 text-align: center;
425 float:left;
429 float:left;
426 margin: 1px 6px 1px 0px;
430 margin: 1px 6px 1px 0px;
427 }
431 }
428
432
429 table.progress td { height: 0.9em; }
433 table.progress td { height: 0.9em; }
430 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
434 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
431 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
435 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
432 table.progress td.open { background: #FFF none repeat scroll 0%; }
436 table.progress td.open { background: #FFF none repeat scroll 0%; }
433 p.pourcent {font-size: 80%;}
437 p.pourcent {font-size: 80%;}
434 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
438 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
435
439
436 /***** Tabs *****/
440 /***** Tabs *****/
437 #content .tabs {height: 2.6em; border-bottom: 1px solid #bbbbbb; margin-bottom:1.2em; position:relative;}
441 #content .tabs {height: 2.6em; border-bottom: 1px solid #bbbbbb; margin-bottom:1.2em; position:relative;}
438 #content .tabs ul {margin:0; position:absolute; bottom:-2px; padding-left:1em;}
442 #content .tabs ul {margin:0; position:absolute; bottom:-2px; padding-left:1em;}
439 #content .tabs>ul { bottom:-1px; } /* others */
443 #content .tabs>ul { bottom:-1px; } /* others */
440 #content .tabs ul li {
444 #content .tabs ul li {
441 float:left;
445 float:left;
442 list-style-type:none;
446 list-style-type:none;
443 white-space:nowrap;
447 white-space:nowrap;
444 margin-right:8px;
448 margin-right:8px;
445 background:#fff;
449 background:#fff;
446 }
450 }
447 #content .tabs ul li a{
451 #content .tabs ul li a{
448 display:block;
452 display:block;
449 font-size: 0.9em;
453 font-size: 0.9em;
450 text-decoration:none;
454 text-decoration:none;
451 line-height:1.3em;
455 line-height:1.3em;
452 padding:4px 6px 4px 6px;
456 padding:4px 6px 4px 6px;
453 border: 1px solid #ccc;
457 border: 1px solid #ccc;
454 border-bottom: 1px solid #bbbbbb;
458 border-bottom: 1px solid #bbbbbb;
455 background-color: #eeeeee;
459 background-color: #eeeeee;
456 color:#777;
460 color:#777;
457 font-weight:bold;
461 font-weight:bold;
458 }
462 }
459
463
460 #content .tabs ul li a:hover {
464 #content .tabs ul li a:hover {
461 background-color: #ffffdd;
465 background-color: #ffffdd;
462 text-decoration:none;
466 text-decoration:none;
463 }
467 }
464
468
465 #content .tabs ul li a.selected {
469 #content .tabs ul li a.selected {
466 background-color: #fff;
470 background-color: #fff;
467 border: 1px solid #bbbbbb;
471 border: 1px solid #bbbbbb;
468 border-bottom: 1px solid #fff;
472 border-bottom: 1px solid #fff;
469 }
473 }
470
474
471 #content .tabs ul li a.selected:hover {
475 #content .tabs ul li a.selected:hover {
472 background-color: #fff;
476 background-color: #fff;
473 }
477 }
474
478
475 /***** Diff *****/
479 /***** Diff *****/
476 .diff_out { background: #fcc; }
480 .diff_out { background: #fcc; }
477 .diff_in { background: #cfc; }
481 .diff_in { background: #cfc; }
478
482
479 /***** Wiki *****/
483 /***** Wiki *****/
480 div.wiki table {
484 div.wiki table {
481 border: 1px solid #505050;
485 border: 1px solid #505050;
482 border-collapse: collapse;
486 border-collapse: collapse;
483 margin-bottom: 1em;
487 margin-bottom: 1em;
484 }
488 }
485
489
486 div.wiki table, div.wiki td, div.wiki th {
490 div.wiki table, div.wiki td, div.wiki th {
487 border: 1px solid #bbb;
491 border: 1px solid #bbb;
488 padding: 4px;
492 padding: 4px;
489 }
493 }
490
494
491 div.wiki .external {
495 div.wiki .external {
492 background-position: 0% 60%;
496 background-position: 0% 60%;
493 background-repeat: no-repeat;
497 background-repeat: no-repeat;
494 padding-left: 12px;
498 padding-left: 12px;
495 background-image: url(../images/external.png);
499 background-image: url(../images/external.png);
496 }
500 }
497
501
498 div.wiki a.new {
502 div.wiki a.new {
499 color: #b73535;
503 color: #b73535;
500 }
504 }
501
505
502 div.wiki pre {
506 div.wiki pre {
503 margin: 1em 1em 1em 1.6em;
507 margin: 1em 1em 1em 1.6em;
504 padding: 2px;
508 padding: 2px;
505 background-color: #fafafa;
509 background-color: #fafafa;
506 border: 1px solid #dadada;
510 border: 1px solid #dadada;
507 width:95%;
511 width:95%;
508 overflow-x: auto;
512 overflow-x: auto;
509 }
513 }
510
514
511 div.wiki ul.toc {
515 div.wiki ul.toc {
512 background-color: #ffffdd;
516 background-color: #ffffdd;
513 border: 1px solid #e4e4e4;
517 border: 1px solid #e4e4e4;
514 padding: 4px;
518 padding: 4px;
515 line-height: 1.2em;
519 line-height: 1.2em;
516 margin-bottom: 12px;
520 margin-bottom: 12px;
517 margin-right: 12px;
521 margin-right: 12px;
518 margin-left: 0;
522 margin-left: 0;
519 display: table
523 display: table
520 }
524 }
521 * html div.wiki ul.toc { width: 50%; } /* IE6 doesn't autosize div */
525 * html div.wiki ul.toc { width: 50%; } /* IE6 doesn't autosize div */
522
526
523 div.wiki ul.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
527 div.wiki ul.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
524 div.wiki ul.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
528 div.wiki ul.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
525 div.wiki ul.toc li { list-style-type:none;}
529 div.wiki ul.toc li { list-style-type:none;}
526 div.wiki ul.toc li.heading2 { margin-left: 6px; }
530 div.wiki ul.toc li.heading2 { margin-left: 6px; }
527 div.wiki ul.toc li.heading3 { margin-left: 12px; font-size: 0.8em; }
531 div.wiki ul.toc li.heading3 { margin-left: 12px; font-size: 0.8em; }
528
532
529 div.wiki ul.toc a {
533 div.wiki ul.toc a {
530 font-size: 0.9em;
534 font-size: 0.9em;
531 font-weight: normal;
535 font-weight: normal;
532 text-decoration: none;
536 text-decoration: none;
533 color: #606060;
537 color: #606060;
534 }
538 }
535 div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;}
539 div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;}
536
540
537 a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; }
541 a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; }
538 a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; }
542 a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; }
539 h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; }
543 h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; }
540
544
541 /***** My page layout *****/
545 /***** My page layout *****/
542 .block-receiver {
546 .block-receiver {
543 border:1px dashed #c0c0c0;
547 border:1px dashed #c0c0c0;
544 margin-bottom: 20px;
548 margin-bottom: 20px;
545 padding: 15px 0 15px 0;
549 padding: 15px 0 15px 0;
546 }
550 }
547
551
548 .mypage-box {
552 .mypage-box {
549 margin:0 0 20px 0;
553 margin:0 0 20px 0;
550 color:#505050;
554 color:#505050;
551 line-height:1.5em;
555 line-height:1.5em;
552 }
556 }
553
557
554 .handle {
558 .handle {
555 cursor: move;
559 cursor: move;
556 }
560 }
557
561
558 a.close-icon {
562 a.close-icon {
559 display:block;
563 display:block;
560 margin-top:3px;
564 margin-top:3px;
561 overflow:hidden;
565 overflow:hidden;
562 width:12px;
566 width:12px;
563 height:12px;
567 height:12px;
564 background-repeat: no-repeat;
568 background-repeat: no-repeat;
565 cursor:pointer;
569 cursor:pointer;
566 background-image:url('../images/close.png');
570 background-image:url('../images/close.png');
567 }
571 }
568
572
569 a.close-icon:hover {
573 a.close-icon:hover {
570 background-image:url('../images/close_hl.png');
574 background-image:url('../images/close_hl.png');
571 }
575 }
572
576
573 /***** Gantt chart *****/
577 /***** Gantt chart *****/
574 .gantt_hdr {
578 .gantt_hdr {
575 position:absolute;
579 position:absolute;
576 top:0;
580 top:0;
577 height:16px;
581 height:16px;
578 border-top: 1px solid #c0c0c0;
582 border-top: 1px solid #c0c0c0;
579 border-bottom: 1px solid #c0c0c0;
583 border-bottom: 1px solid #c0c0c0;
580 border-right: 1px solid #c0c0c0;
584 border-right: 1px solid #c0c0c0;
581 text-align: center;
585 text-align: center;
582 overflow: hidden;
586 overflow: hidden;
583 }
587 }
584
588
585 .task {
589 .task {
586 position: absolute;
590 position: absolute;
587 height:8px;
591 height:8px;
588 font-size:0.8em;
592 font-size:0.8em;
589 color:#888;
593 color:#888;
590 padding:0;
594 padding:0;
591 margin:0;
595 margin:0;
592 line-height:0.8em;
596 line-height:0.8em;
593 }
597 }
594
598
595 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
599 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
596 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
600 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
597 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
601 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
598 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
602 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
599
603
600 /***** Icons *****/
604 /***** Icons *****/
601 .icon {
605 .icon {
602 background-position: 0% 40%;
606 background-position: 0% 40%;
603 background-repeat: no-repeat;
607 background-repeat: no-repeat;
604 padding-left: 20px;
608 padding-left: 20px;
605 padding-top: 2px;
609 padding-top: 2px;
606 padding-bottom: 3px;
610 padding-bottom: 3px;
607 }
611 }
608
612
609 .icon22 {
613 .icon22 {
610 background-position: 0% 40%;
614 background-position: 0% 40%;
611 background-repeat: no-repeat;
615 background-repeat: no-repeat;
612 padding-left: 26px;
616 padding-left: 26px;
613 line-height: 22px;
617 line-height: 22px;
614 vertical-align: middle;
618 vertical-align: middle;
615 }
619 }
616
620
617 .icon-add { background-image: url(../images/add.png); }
621 .icon-add { background-image: url(../images/add.png); }
618 .icon-edit { background-image: url(../images/edit.png); }
622 .icon-edit { background-image: url(../images/edit.png); }
619 .icon-copy { background-image: url(../images/copy.png); }
623 .icon-copy { background-image: url(../images/copy.png); }
620 .icon-del { background-image: url(../images/delete.png); }
624 .icon-del { background-image: url(../images/delete.png); }
621 .icon-move { background-image: url(../images/move.png); }
625 .icon-move { background-image: url(../images/move.png); }
622 .icon-save { background-image: url(../images/save.png); }
626 .icon-save { background-image: url(../images/save.png); }
623 .icon-cancel { background-image: url(../images/cancel.png); }
627 .icon-cancel { background-image: url(../images/cancel.png); }
624 .icon-file { background-image: url(../images/file.png); }
628 .icon-file { background-image: url(../images/file.png); }
625 .icon-folder { background-image: url(../images/folder.png); }
629 .icon-folder { background-image: url(../images/folder.png); }
626 .open .icon-folder { background-image: url(../images/folder_open.png); }
630 .open .icon-folder { background-image: url(../images/folder_open.png); }
627 .icon-package { background-image: url(../images/package.png); }
631 .icon-package { background-image: url(../images/package.png); }
628 .icon-home { background-image: url(../images/home.png); }
632 .icon-home { background-image: url(../images/home.png); }
629 .icon-user { background-image: url(../images/user.png); }
633 .icon-user { background-image: url(../images/user.png); }
630 .icon-mypage { background-image: url(../images/user_page.png); }
634 .icon-mypage { background-image: url(../images/user_page.png); }
631 .icon-admin { background-image: url(../images/admin.png); }
635 .icon-admin { background-image: url(../images/admin.png); }
632 .icon-projects { background-image: url(../images/projects.png); }
636 .icon-projects { background-image: url(../images/projects.png); }
633 .icon-help { background-image: url(../images/help.png); }
637 .icon-help { background-image: url(../images/help.png); }
634 .icon-attachment { background-image: url(../images/attachment.png); }
638 .icon-attachment { background-image: url(../images/attachment.png); }
635 .icon-index { background-image: url(../images/index.png); }
639 .icon-index { background-image: url(../images/index.png); }
636 .icon-history { background-image: url(../images/history.png); }
640 .icon-history { background-image: url(../images/history.png); }
637 .icon-time { background-image: url(../images/time.png); }
641 .icon-time { background-image: url(../images/time.png); }
638 .icon-time-add { background-image: url(../images/time_add.png); }
642 .icon-time-add { background-image: url(../images/time_add.png); }
639 .icon-stats { background-image: url(../images/stats.png); }
643 .icon-stats { background-image: url(../images/stats.png); }
640 .icon-warning { background-image: url(../images/warning.png); }
644 .icon-warning { background-image: url(../images/warning.png); }
641 .icon-fav { background-image: url(../images/fav.png); }
645 .icon-fav { background-image: url(../images/fav.png); }
642 .icon-fav-off { background-image: url(../images/fav_off.png); }
646 .icon-fav-off { background-image: url(../images/fav_off.png); }
643 .icon-reload { background-image: url(../images/reload.png); }
647 .icon-reload { background-image: url(../images/reload.png); }
644 .icon-lock { background-image: url(../images/locked.png); }
648 .icon-lock { background-image: url(../images/locked.png); }
645 .icon-unlock { background-image: url(../images/unlock.png); }
649 .icon-unlock { background-image: url(../images/unlock.png); }
646 .icon-checked { background-image: url(../images/true.png); }
650 .icon-checked { background-image: url(../images/true.png); }
647 .icon-details { background-image: url(../images/zoom_in.png); }
651 .icon-details { background-image: url(../images/zoom_in.png); }
648 .icon-report { background-image: url(../images/report.png); }
652 .icon-report { background-image: url(../images/report.png); }
649 .icon-comment { background-image: url(../images/comment.png); }
653 .icon-comment { background-image: url(../images/comment.png); }
650
654
651 .icon22-projects { background-image: url(../images/22x22/projects.png); }
655 .icon22-projects { background-image: url(../images/22x22/projects.png); }
652 .icon22-users { background-image: url(../images/22x22/users.png); }
656 .icon22-users { background-image: url(../images/22x22/users.png); }
653 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
657 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
654 .icon22-role { background-image: url(../images/22x22/role.png); }
658 .icon22-role { background-image: url(../images/22x22/role.png); }
655 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
659 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
656 .icon22-options { background-image: url(../images/22x22/options.png); }
660 .icon22-options { background-image: url(../images/22x22/options.png); }
657 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
661 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
658 .icon22-authent { background-image: url(../images/22x22/authent.png); }
662 .icon22-authent { background-image: url(../images/22x22/authent.png); }
659 .icon22-info { background-image: url(../images/22x22/info.png); }
663 .icon22-info { background-image: url(../images/22x22/info.png); }
660 .icon22-comment { background-image: url(../images/22x22/comment.png); }
664 .icon22-comment { background-image: url(../images/22x22/comment.png); }
661 .icon22-package { background-image: url(../images/22x22/package.png); }
665 .icon22-package { background-image: url(../images/22x22/package.png); }
662 .icon22-settings { background-image: url(../images/22x22/settings.png); }
666 .icon22-settings { background-image: url(../images/22x22/settings.png); }
663 .icon22-plugin { background-image: url(../images/22x22/plugin.png); }
667 .icon22-plugin { background-image: url(../images/22x22/plugin.png); }
664
668
665 img.gravatar {
669 img.gravatar {
666 padding: 2px;
670 padding: 2px;
667 border: solid 1px #d5d5d5;
671 border: solid 1px #d5d5d5;
668 background: #fff;
672 background: #fff;
669 }
673 }
670
674
671 div.issue img.gravatar {
675 div.issue img.gravatar {
672 float: right;
676 float: right;
673 margin: 0 0 0 1em;
677 margin: 0 0 0 1em;
674 padding: 5px;
678 padding: 5px;
675 }
679 }
676
680
677 div.issue table img.gravatar {
681 div.issue table img.gravatar {
678 height: 14px;
682 height: 14px;
679 width: 14px;
683 width: 14px;
680 padding: 2px;
684 padding: 2px;
681 float: left;
685 float: left;
682 margin: 0 0.5em 0 0;
686 margin: 0 0.5em 0 0;
683 }
687 }
684
688
685 #history img.gravatar {
689 #history img.gravatar {
686 padding: 3px;
690 padding: 3px;
687 margin: 0 1.5em 1em 0;
691 margin: 0 1.5em 1em 0;
688 float: left;
692 float: left;
689 }
693 }
690
694
691 td.username img.gravatar {
695 td.username img.gravatar {
692 float: left;
696 float: left;
693 margin: 0 1em 0 0;
697 margin: 0 1em 0 0;
694 }
698 }
695
699
696 #activity dt img.gravatar {
700 #activity dt img.gravatar {
697 float: left;
701 float: left;
698 margin: 0 1em 1em 0;
702 margin: 0 1em 1em 0;
699 }
703 }
700
704
701 #activity dt,
705 #activity dt,
702 .journal {
706 .journal {
703 clear: left;
707 clear: left;
704 }
708 }
705
709
706 h2 img { vertical-align:middle; }
710 h2 img { vertical-align:middle; }
707
711
708
712
709 /***** Media print specific styles *****/
713 /***** Media print specific styles *****/
710 @media print {
714 @media print {
711 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
715 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
712 #main { background: #fff; }
716 #main { background: #fff; }
713 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; overflow: visible !important;}
717 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; overflow: visible !important;}
714 }
718 }
General Comments 0
You need to be logged in to leave comments. Login now