##// END OF EJS Templates
diff: show whitespace...
Mads Kiilerich -
r4310:7c094db3 default
parent child Browse files
Show More
@@ -1,724 +1,738 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 # This program is free software: you can redistribute it and/or modify
2 # This program is free software: you can redistribute it and/or modify
3 # it under the terms of the GNU General Public License as published by
3 # it under the terms of the GNU General Public License as published by
4 # the Free Software Foundation, either version 3 of the License, or
4 # the Free Software Foundation, either version 3 of the License, or
5 # (at your option) any later version.
5 # (at your option) any later version.
6 #
6 #
7 # This program is distributed in the hope that it will be useful,
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
10 # GNU General Public License for more details.
11 #
11 #
12 # You should have received a copy of the GNU General Public License
12 # You should have received a copy of the GNU General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 """
14 """
15 kallithea.lib.diffs
15 kallithea.lib.diffs
16 ~~~~~~~~~~~~~~~~~~~
16 ~~~~~~~~~~~~~~~~~~~
17
17
18 Set of diffing helpers, previously part of vcs
18 Set of diffing helpers, previously part of vcs
19
19
20
20
21 This file was forked by the Kallithea project in July 2014.
21 This file was forked by the Kallithea project in July 2014.
22 Original author and date, and relevant copyright and licensing information is below:
22 Original author and date, and relevant copyright and licensing information is below:
23 :created_on: Dec 4, 2011
23 :created_on: Dec 4, 2011
24 :author: marcink
24 :author: marcink
25 :copyright: (c) 2013 RhodeCode GmbH, and others.
25 :copyright: (c) 2013 RhodeCode GmbH, and others.
26 :license: GPLv3, see LICENSE.md for more details.
26 :license: GPLv3, see LICENSE.md for more details.
27 """
27 """
28 import re
28 import re
29 import difflib
29 import difflib
30 import logging
30 import logging
31
31
32 from itertools import tee, imap
32 from itertools import tee, imap
33
33
34 from pylons.i18n.translation import _
34 from pylons.i18n.translation import _
35
35
36 from kallithea.lib.vcs.exceptions import VCSError
36 from kallithea.lib.vcs.exceptions import VCSError
37 from kallithea.lib.vcs.nodes import FileNode, SubModuleNode
37 from kallithea.lib.vcs.nodes import FileNode, SubModuleNode
38 from kallithea.lib.vcs.backends.base import EmptyChangeset
38 from kallithea.lib.vcs.backends.base import EmptyChangeset
39 from kallithea.lib.helpers import escape
39 from kallithea.lib.helpers import escape
40 from kallithea.lib.utils2 import safe_unicode, safe_str
40 from kallithea.lib.utils2 import safe_unicode, safe_str
41
41
42 log = logging.getLogger(__name__)
42 log = logging.getLogger(__name__)
43
43
44
44
45 def wrap_to_table(str_):
45 def wrap_to_table(str_):
46 return '''<table class="code-difftable">
46 return '''<table class="code-difftable">
47 <tr class="line no-comment">
47 <tr class="line no-comment">
48 <td class="lineno new"></td>
48 <td class="lineno new"></td>
49 <td class="code no-comment"><pre>%s</pre></td>
49 <td class="code no-comment"><pre>%s</pre></td>
50 </tr>
50 </tr>
51 </table>''' % str_
51 </table>''' % str_
52
52
53
53
54 def wrapped_diff(filenode_old, filenode_new, cut_off_limit=None,
54 def wrapped_diff(filenode_old, filenode_new, cut_off_limit=None,
55 ignore_whitespace=True, line_context=3,
55 ignore_whitespace=True, line_context=3,
56 enable_comments=False):
56 enable_comments=False):
57 """
57 """
58 returns a wrapped diff into a table, checks for cut_off_limit and presents
58 returns a wrapped diff into a table, checks for cut_off_limit and presents
59 proper message
59 proper message
60 """
60 """
61
61
62 if filenode_old is None:
62 if filenode_old is None:
63 filenode_old = FileNode(filenode_new.path, '', EmptyChangeset())
63 filenode_old = FileNode(filenode_new.path, '', EmptyChangeset())
64
64
65 if filenode_old.is_binary or filenode_new.is_binary:
65 if filenode_old.is_binary or filenode_new.is_binary:
66 diff = wrap_to_table(_('Binary file'))
66 diff = wrap_to_table(_('Binary file'))
67 stats = (0, 0)
67 stats = (0, 0)
68 size = 0
68 size = 0
69
69
70 elif cut_off_limit != -1 and (cut_off_limit is None or
70 elif cut_off_limit != -1 and (cut_off_limit is None or
71 (filenode_old.size < cut_off_limit and filenode_new.size < cut_off_limit)):
71 (filenode_old.size < cut_off_limit and filenode_new.size < cut_off_limit)):
72
72
73 f_gitdiff = get_gitdiff(filenode_old, filenode_new,
73 f_gitdiff = get_gitdiff(filenode_old, filenode_new,
74 ignore_whitespace=ignore_whitespace,
74 ignore_whitespace=ignore_whitespace,
75 context=line_context)
75 context=line_context)
76 diff_processor = DiffProcessor(f_gitdiff, format='gitdiff')
76 diff_processor = DiffProcessor(f_gitdiff, format='gitdiff')
77
77
78 diff = diff_processor.as_html(enable_comments=enable_comments)
78 diff = diff_processor.as_html(enable_comments=enable_comments)
79 stats = diff_processor.stat()
79 stats = diff_processor.stat()
80 size = len(diff or '')
80 size = len(diff or '')
81 else:
81 else:
82 diff = wrap_to_table(_('Changeset was too big and was cut off, use '
82 diff = wrap_to_table(_('Changeset was too big and was cut off, use '
83 'diff menu to display this diff'))
83 'diff menu to display this diff'))
84 stats = (0, 0)
84 stats = (0, 0)
85 size = 0
85 size = 0
86 if not diff:
86 if not diff:
87 submodules = filter(lambda o: isinstance(o, SubModuleNode),
87 submodules = filter(lambda o: isinstance(o, SubModuleNode),
88 [filenode_new, filenode_old])
88 [filenode_new, filenode_old])
89 if submodules:
89 if submodules:
90 diff = wrap_to_table(escape('Submodule %r' % submodules[0]))
90 diff = wrap_to_table(escape('Submodule %r' % submodules[0]))
91 else:
91 else:
92 diff = wrap_to_table(_('No changes detected'))
92 diff = wrap_to_table(_('No changes detected'))
93
93
94 cs1 = filenode_old.changeset.raw_id
94 cs1 = filenode_old.changeset.raw_id
95 cs2 = filenode_new.changeset.raw_id
95 cs2 = filenode_new.changeset.raw_id
96
96
97 return size, cs1, cs2, diff, stats
97 return size, cs1, cs2, diff, stats
98
98
99
99
100 def get_gitdiff(filenode_old, filenode_new, ignore_whitespace=True, context=3):
100 def get_gitdiff(filenode_old, filenode_new, ignore_whitespace=True, context=3):
101 """
101 """
102 Returns git style diff between given ``filenode_old`` and ``filenode_new``.
102 Returns git style diff between given ``filenode_old`` and ``filenode_new``.
103
103
104 :param ignore_whitespace: ignore whitespaces in diff
104 :param ignore_whitespace: ignore whitespaces in diff
105 """
105 """
106 # make sure we pass in default context
106 # make sure we pass in default context
107 context = context or 3
107 context = context or 3
108 submodules = filter(lambda o: isinstance(o, SubModuleNode),
108 submodules = filter(lambda o: isinstance(o, SubModuleNode),
109 [filenode_new, filenode_old])
109 [filenode_new, filenode_old])
110 if submodules:
110 if submodules:
111 return ''
111 return ''
112
112
113 for filenode in (filenode_old, filenode_new):
113 for filenode in (filenode_old, filenode_new):
114 if not isinstance(filenode, FileNode):
114 if not isinstance(filenode, FileNode):
115 raise VCSError("Given object should be FileNode object, not %s"
115 raise VCSError("Given object should be FileNode object, not %s"
116 % filenode.__class__)
116 % filenode.__class__)
117
117
118 repo = filenode_new.changeset.repository
118 repo = filenode_new.changeset.repository
119 old_raw_id = getattr(filenode_old.changeset, 'raw_id', repo.EMPTY_CHANGESET)
119 old_raw_id = getattr(filenode_old.changeset, 'raw_id', repo.EMPTY_CHANGESET)
120 new_raw_id = getattr(filenode_new.changeset, 'raw_id', repo.EMPTY_CHANGESET)
120 new_raw_id = getattr(filenode_new.changeset, 'raw_id', repo.EMPTY_CHANGESET)
121
121
122 vcs_gitdiff = repo.get_diff(old_raw_id, new_raw_id, filenode_new.path,
122 vcs_gitdiff = repo.get_diff(old_raw_id, new_raw_id, filenode_new.path,
123 ignore_whitespace, context)
123 ignore_whitespace, context)
124 return vcs_gitdiff
124 return vcs_gitdiff
125
125
126 NEW_FILENODE = 1
126 NEW_FILENODE = 1
127 DEL_FILENODE = 2
127 DEL_FILENODE = 2
128 MOD_FILENODE = 3
128 MOD_FILENODE = 3
129 RENAMED_FILENODE = 4
129 RENAMED_FILENODE = 4
130 COPIED_FILENODE = 5
130 COPIED_FILENODE = 5
131 CHMOD_FILENODE = 6
131 CHMOD_FILENODE = 6
132 BIN_FILENODE = 7
132 BIN_FILENODE = 7
133
133
134
134
135 class DiffLimitExceeded(Exception):
135 class DiffLimitExceeded(Exception):
136 pass
136 pass
137
137
138
138
139 class LimitedDiffContainer(object):
139 class LimitedDiffContainer(object):
140
140
141 def __init__(self, diff_limit, cur_diff_size, diff):
141 def __init__(self, diff_limit, cur_diff_size, diff):
142 self.diff = diff
142 self.diff = diff
143 self.diff_limit = diff_limit
143 self.diff_limit = diff_limit
144 self.cur_diff_size = cur_diff_size
144 self.cur_diff_size = cur_diff_size
145
145
146 def __iter__(self):
146 def __iter__(self):
147 for l in self.diff:
147 for l in self.diff:
148 yield l
148 yield l
149
149
150
150
151 class DiffProcessor(object):
151 class DiffProcessor(object):
152 """
152 """
153 Give it a unified or git diff and it returns a list of the files that were
153 Give it a unified or git diff and it returns a list of the files that were
154 mentioned in the diff together with a dict of meta information that
154 mentioned in the diff together with a dict of meta information that
155 can be used to render it in a HTML template.
155 can be used to render it in a HTML template.
156 """
156 """
157 _chunk_re = re.compile(r'^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)')
157 _chunk_re = re.compile(r'^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)')
158 _newline_marker = re.compile(r'^\\ No newline at end of file')
158 _newline_marker = re.compile(r'^\\ No newline at end of file')
159 _git_header_re = re.compile(r"""
159 _git_header_re = re.compile(r"""
160 #^diff[ ]--git
160 #^diff[ ]--git
161 [ ]a/(?P<a_path>.+?)[ ]b/(?P<b_path>.+?)\n
161 [ ]a/(?P<a_path>.+?)[ ]b/(?P<b_path>.+?)\n
162 (?:^similarity[ ]index[ ](?P<similarity_index>\d+)%\n
162 (?:^similarity[ ]index[ ](?P<similarity_index>\d+)%\n
163 ^rename[ ]from[ ](?P<rename_from>\S+)\n
163 ^rename[ ]from[ ](?P<rename_from>\S+)\n
164 ^rename[ ]to[ ](?P<rename_to>\S+)(?:\n|$))?
164 ^rename[ ]to[ ](?P<rename_to>\S+)(?:\n|$))?
165 (?:^old[ ]mode[ ](?P<old_mode>\d+)\n
165 (?:^old[ ]mode[ ](?P<old_mode>\d+)\n
166 ^new[ ]mode[ ](?P<new_mode>\d+)(?:\n|$))?
166 ^new[ ]mode[ ](?P<new_mode>\d+)(?:\n|$))?
167 (?:^new[ ]file[ ]mode[ ](?P<new_file_mode>.+)(?:\n|$))?
167 (?:^new[ ]file[ ]mode[ ](?P<new_file_mode>.+)(?:\n|$))?
168 (?:^deleted[ ]file[ ]mode[ ](?P<deleted_file_mode>.+)(?:\n|$))?
168 (?:^deleted[ ]file[ ]mode[ ](?P<deleted_file_mode>.+)(?:\n|$))?
169 (?:^index[ ](?P<a_blob_id>[0-9A-Fa-f]+)
169 (?:^index[ ](?P<a_blob_id>[0-9A-Fa-f]+)
170 \.\.(?P<b_blob_id>[0-9A-Fa-f]+)[ ]?(?P<b_mode>.+)?(?:\n|$))?
170 \.\.(?P<b_blob_id>[0-9A-Fa-f]+)[ ]?(?P<b_mode>.+)?(?:\n|$))?
171 (?:^(?P<bin_patch>GIT[ ]binary[ ]patch)(?:\n|$))?
171 (?:^(?P<bin_patch>GIT[ ]binary[ ]patch)(?:\n|$))?
172 (?:^---[ ](a/(?P<a_file>.+)|/dev/null)(?:\n|$))?
172 (?:^---[ ](a/(?P<a_file>.+)|/dev/null)(?:\n|$))?
173 (?:^\+\+\+[ ](b/(?P<b_file>.+)|/dev/null)(?:\n|$))?
173 (?:^\+\+\+[ ](b/(?P<b_file>.+)|/dev/null)(?:\n|$))?
174 """, re.VERBOSE | re.MULTILINE)
174 """, re.VERBOSE | re.MULTILINE)
175 _hg_header_re = re.compile(r"""
175 _hg_header_re = re.compile(r"""
176 #^diff[ ]--git
176 #^diff[ ]--git
177 [ ]a/(?P<a_path>.+?)[ ]b/(?P<b_path>.+?)\n
177 [ ]a/(?P<a_path>.+?)[ ]b/(?P<b_path>.+?)\n
178 (?:^old[ ]mode[ ](?P<old_mode>\d+)\n
178 (?:^old[ ]mode[ ](?P<old_mode>\d+)\n
179 ^new[ ]mode[ ](?P<new_mode>\d+)(?:\n|$))?
179 ^new[ ]mode[ ](?P<new_mode>\d+)(?:\n|$))?
180 (?:^similarity[ ]index[ ](?P<similarity_index>\d+)%(?:\n|$))?
180 (?:^similarity[ ]index[ ](?P<similarity_index>\d+)%(?:\n|$))?
181 (?:^rename[ ]from[ ](?P<rename_from>\S+)\n
181 (?:^rename[ ]from[ ](?P<rename_from>\S+)\n
182 ^rename[ ]to[ ](?P<rename_to>\S+)(?:\n|$))?
182 ^rename[ ]to[ ](?P<rename_to>\S+)(?:\n|$))?
183 (?:^copy[ ]from[ ](?P<copy_from>\S+)\n
183 (?:^copy[ ]from[ ](?P<copy_from>\S+)\n
184 ^copy[ ]to[ ](?P<copy_to>\S+)(?:\n|$))?
184 ^copy[ ]to[ ](?P<copy_to>\S+)(?:\n|$))?
185 (?:^new[ ]file[ ]mode[ ](?P<new_file_mode>.+)(?:\n|$))?
185 (?:^new[ ]file[ ]mode[ ](?P<new_file_mode>.+)(?:\n|$))?
186 (?:^deleted[ ]file[ ]mode[ ](?P<deleted_file_mode>.+)(?:\n|$))?
186 (?:^deleted[ ]file[ ]mode[ ](?P<deleted_file_mode>.+)(?:\n|$))?
187 (?:^index[ ](?P<a_blob_id>[0-9A-Fa-f]+)
187 (?:^index[ ](?P<a_blob_id>[0-9A-Fa-f]+)
188 \.\.(?P<b_blob_id>[0-9A-Fa-f]+)[ ]?(?P<b_mode>.+)?(?:\n|$))?
188 \.\.(?P<b_blob_id>[0-9A-Fa-f]+)[ ]?(?P<b_mode>.+)?(?:\n|$))?
189 (?:^(?P<bin_patch>GIT[ ]binary[ ]patch)(?:\n|$))?
189 (?:^(?P<bin_patch>GIT[ ]binary[ ]patch)(?:\n|$))?
190 (?:^---[ ](a/(?P<a_file>.+)|/dev/null)(?:\n|$))?
190 (?:^---[ ](a/(?P<a_file>.+)|/dev/null)(?:\n|$))?
191 (?:^\+\+\+[ ](b/(?P<b_file>.+)|/dev/null)(?:\n|$))?
191 (?:^\+\+\+[ ](b/(?P<b_file>.+)|/dev/null)(?:\n|$))?
192 """, re.VERBOSE | re.MULTILINE)
192 """, re.VERBOSE | re.MULTILINE)
193
193
194 #used for inline highlighter word split
194 #used for inline highlighter word split
195 _token_re = re.compile(r'()(&gt;|&lt;|&amp;|\W+?)')
195 _token_re = re.compile(r'()(&gt;|&lt;|&amp;|<u>\t</u>| <i></i>|\W+?)')
196
197 _escape_re = re.compile(r'(&)|(<)|(>)|(\t)|( \n| $)')
198
196
199
197 def __init__(self, diff, vcs='hg', format='gitdiff', diff_limit=None):
200 def __init__(self, diff, vcs='hg', format='gitdiff', diff_limit=None):
198 """
201 """
199 :param diff: a text in diff format
202 :param diff: a text in diff format
200 :param vcs: type of version controll hg or git
203 :param vcs: type of version controll hg or git
201 :param format: format of diff passed, `udiff` or `gitdiff`
204 :param format: format of diff passed, `udiff` or `gitdiff`
202 :param diff_limit: define the size of diff that is considered "big"
205 :param diff_limit: define the size of diff that is considered "big"
203 based on that parameter cut off will be triggered, set to None
206 based on that parameter cut off will be triggered, set to None
204 to show full diff
207 to show full diff
205 """
208 """
206 if not isinstance(diff, basestring):
209 if not isinstance(diff, basestring):
207 raise Exception('Diff must be a basestring got %s instead' % type(diff))
210 raise Exception('Diff must be a basestring got %s instead' % type(diff))
208
211
209 self._diff = diff
212 self._diff = diff
210 self._format = format
213 self._format = format
211 self.adds = 0
214 self.adds = 0
212 self.removes = 0
215 self.removes = 0
213 # calculate diff size
216 # calculate diff size
214 self.diff_size = len(diff)
217 self.diff_size = len(diff)
215 self.diff_limit = diff_limit
218 self.diff_limit = diff_limit
216 self.cur_diff_size = 0
219 self.cur_diff_size = 0
217 self.parsed = False
220 self.parsed = False
218 self.parsed_diff = []
221 self.parsed_diff = []
219 self.vcs = vcs
222 self.vcs = vcs
220
223
221 if format == 'gitdiff':
224 if format == 'gitdiff':
222 self.differ = self._highlight_line_difflib
225 self.differ = self._highlight_line_difflib
223 self._parser = self._parse_gitdiff
226 self._parser = self._parse_gitdiff
224 else:
227 else:
225 self.differ = self._highlight_line_udiff
228 self.differ = self._highlight_line_udiff
226 self._parser = self._parse_udiff
229 self._parser = self._parse_udiff
227
230
228 def _copy_iterator(self):
231 def _copy_iterator(self):
229 """
232 """
230 make a fresh copy of generator, we should not iterate thru
233 make a fresh copy of generator, we should not iterate thru
231 an original as it's needed for repeating operations on
234 an original as it's needed for repeating operations on
232 this instance of DiffProcessor
235 this instance of DiffProcessor
233 """
236 """
234 self.__udiff, iterator_copy = tee(self.__udiff)
237 self.__udiff, iterator_copy = tee(self.__udiff)
235 return iterator_copy
238 return iterator_copy
236
239
237 def _escaper(self, string):
240 def _escaper(self, string):
238 """
241 """
239 Escaper for diff escapes special chars and checks the diff limit
242 Escaper for diff escapes special chars and checks the diff limit
240
243
241 :param string:
244 :param string:
242 """
245 """
243
246
244 self.cur_diff_size += len(string)
247 self.cur_diff_size += len(string)
245
248
246 # escaper gets iterated on each .next() call and it checks if each
249 # escaper gets iterated on each .next() call and it checks if each
247 # parsed line doesn't exceed the diff limit
250 # parsed line doesn't exceed the diff limit
248 if self.diff_limit is not None and self.cur_diff_size > self.diff_limit:
251 if self.diff_limit is not None and self.cur_diff_size > self.diff_limit:
249 raise DiffLimitExceeded('Diff Limit Exceeded')
252 raise DiffLimitExceeded('Diff Limit Exceeded')
250
253
251 return safe_unicode(string).replace('&', '&amp;')\
254 def substitute(m):
252 .replace('<', '&lt;')\
255 groups = m.groups()
253 .replace('>', '&gt;')
256 if groups[0]:
257 return '&amp;'
258 if groups[1]:
259 return '&lt;'
260 if groups[2]:
261 return '&gt;'
262 if groups[3]:
263 return '<u>\t</u>'
264 if groups[4] and m.start(): # skip 1st column with +/-
265 return ' <i></i>'
266
267 return self._escape_re.sub(substitute, safe_unicode(string))
254
268
255 def _line_counter(self, l):
269 def _line_counter(self, l):
256 """
270 """
257 Checks each line and bumps total adds/removes for this diff
271 Checks each line and bumps total adds/removes for this diff
258
272
259 :param l:
273 :param l:
260 """
274 """
261 if l.startswith('+') and not l.startswith('+++'):
275 if l.startswith('+') and not l.startswith('+++'):
262 self.adds += 1
276 self.adds += 1
263 elif l.startswith('-') and not l.startswith('---'):
277 elif l.startswith('-') and not l.startswith('---'):
264 self.removes += 1
278 self.removes += 1
265 return safe_unicode(l)
279 return safe_unicode(l)
266
280
267 def _highlight_line_difflib(self, line, next_):
281 def _highlight_line_difflib(self, line, next_):
268 """
282 """
269 Highlight inline changes in both lines.
283 Highlight inline changes in both lines.
270 """
284 """
271
285
272 if line['action'] == 'del':
286 if line['action'] == 'del':
273 old, new = line, next_
287 old, new = line, next_
274 else:
288 else:
275 old, new = next_, line
289 old, new = next_, line
276
290
277 oldwords = self._token_re.split(old['line'])
291 oldwords = self._token_re.split(old['line'])
278 newwords = self._token_re.split(new['line'])
292 newwords = self._token_re.split(new['line'])
279 sequence = difflib.SequenceMatcher(None, oldwords, newwords)
293 sequence = difflib.SequenceMatcher(None, oldwords, newwords)
280
294
281 oldfragments, newfragments = [], []
295 oldfragments, newfragments = [], []
282 for tag, i1, i2, j1, j2 in sequence.get_opcodes():
296 for tag, i1, i2, j1, j2 in sequence.get_opcodes():
283 oldfrag = ''.join(oldwords[i1:i2])
297 oldfrag = ''.join(oldwords[i1:i2])
284 newfrag = ''.join(newwords[j1:j2])
298 newfrag = ''.join(newwords[j1:j2])
285 if tag != 'equal':
299 if tag != 'equal':
286 if oldfrag:
300 if oldfrag:
287 oldfrag = '<del>%s</del>' % oldfrag
301 oldfrag = '<del>%s</del>' % oldfrag
288 if newfrag:
302 if newfrag:
289 newfrag = '<ins>%s</ins>' % newfrag
303 newfrag = '<ins>%s</ins>' % newfrag
290 oldfragments.append(oldfrag)
304 oldfragments.append(oldfrag)
291 newfragments.append(newfrag)
305 newfragments.append(newfrag)
292
306
293 old['line'] = "".join(oldfragments)
307 old['line'] = "".join(oldfragments)
294 new['line'] = "".join(newfragments)
308 new['line'] = "".join(newfragments)
295
309
296 def _highlight_line_udiff(self, line, next_):
310 def _highlight_line_udiff(self, line, next_):
297 """
311 """
298 Highlight inline changes in both lines.
312 Highlight inline changes in both lines.
299 """
313 """
300 start = 0
314 start = 0
301 limit = min(len(line['line']), len(next_['line']))
315 limit = min(len(line['line']), len(next_['line']))
302 while start < limit and line['line'][start] == next_['line'][start]:
316 while start < limit and line['line'][start] == next_['line'][start]:
303 start += 1
317 start += 1
304 end = -1
318 end = -1
305 limit -= start
319 limit -= start
306 while -end <= limit and line['line'][end] == next_['line'][end]:
320 while -end <= limit and line['line'][end] == next_['line'][end]:
307 end -= 1
321 end -= 1
308 end += 1
322 end += 1
309 if start or end:
323 if start or end:
310 def do(l):
324 def do(l):
311 last = end + len(l['line'])
325 last = end + len(l['line'])
312 if l['action'] == 'add':
326 if l['action'] == 'add':
313 tag = 'ins'
327 tag = 'ins'
314 else:
328 else:
315 tag = 'del'
329 tag = 'del'
316 l['line'] = '%s<%s>%s</%s>%s' % (
330 l['line'] = '%s<%s>%s</%s>%s' % (
317 l['line'][:start],
331 l['line'][:start],
318 tag,
332 tag,
319 l['line'][start:last],
333 l['line'][start:last],
320 tag,
334 tag,
321 l['line'][last:]
335 l['line'][last:]
322 )
336 )
323 do(line)
337 do(line)
324 do(next_)
338 do(next_)
325
339
326 def _get_header(self, diff_chunk):
340 def _get_header(self, diff_chunk):
327 """
341 """
328 parses the diff header, and returns parts, and leftover diff
342 parses the diff header, and returns parts, and leftover diff
329 parts consists of 14 elements::
343 parts consists of 14 elements::
330
344
331 a_path, b_path, similarity_index, rename_from, rename_to,
345 a_path, b_path, similarity_index, rename_from, rename_to,
332 old_mode, new_mode, new_file_mode, deleted_file_mode,
346 old_mode, new_mode, new_file_mode, deleted_file_mode,
333 a_blob_id, b_blob_id, b_mode, a_file, b_file
347 a_blob_id, b_blob_id, b_mode, a_file, b_file
334
348
335 :param diff_chunk:
349 :param diff_chunk:
336 """
350 """
337
351
338 if self.vcs == 'git':
352 if self.vcs == 'git':
339 match = self._git_header_re.match(diff_chunk)
353 match = self._git_header_re.match(diff_chunk)
340 diff = diff_chunk[match.end():]
354 diff = diff_chunk[match.end():]
341 return match.groupdict(), imap(self._escaper, diff.splitlines(1))
355 return match.groupdict(), imap(self._escaper, diff.splitlines(1))
342 elif self.vcs == 'hg':
356 elif self.vcs == 'hg':
343 match = self._hg_header_re.match(diff_chunk)
357 match = self._hg_header_re.match(diff_chunk)
344 diff = diff_chunk[match.end():]
358 diff = diff_chunk[match.end():]
345 return match.groupdict(), imap(self._escaper, diff.splitlines(1))
359 return match.groupdict(), imap(self._escaper, diff.splitlines(1))
346 else:
360 else:
347 raise Exception('VCS type %s is not supported' % self.vcs)
361 raise Exception('VCS type %s is not supported' % self.vcs)
348
362
349 def _clean_line(self, line, command):
363 def _clean_line(self, line, command):
350 if command in ['+', '-', ' ']:
364 if command in ['+', '-', ' ']:
351 #only modify the line if it's actually a diff thing
365 #only modify the line if it's actually a diff thing
352 line = line[1:]
366 line = line[1:]
353 return line
367 return line
354
368
355 def _parse_gitdiff(self, inline_diff=True):
369 def _parse_gitdiff(self, inline_diff=True):
356 _files = []
370 _files = []
357 diff_container = lambda arg: arg
371 diff_container = lambda arg: arg
358
372
359 ##split the diff in chunks of separate --git a/file b/file chunks
373 ##split the diff in chunks of separate --git a/file b/file chunks
360 for raw_diff in ('\n' + self._diff).split('\ndiff --git')[1:]:
374 for raw_diff in ('\n' + self._diff).split('\ndiff --git')[1:]:
361 head, diff = self._get_header(raw_diff)
375 head, diff = self._get_header(raw_diff)
362
376
363 op = None
377 op = None
364 stats = {
378 stats = {
365 'added': 0,
379 'added': 0,
366 'deleted': 0,
380 'deleted': 0,
367 'binary': False,
381 'binary': False,
368 'ops': {},
382 'ops': {},
369 }
383 }
370
384
371 if head['deleted_file_mode']:
385 if head['deleted_file_mode']:
372 op = 'D'
386 op = 'D'
373 stats['binary'] = True
387 stats['binary'] = True
374 stats['ops'][DEL_FILENODE] = 'deleted file'
388 stats['ops'][DEL_FILENODE] = 'deleted file'
375
389
376 elif head['new_file_mode']:
390 elif head['new_file_mode']:
377 op = 'A'
391 op = 'A'
378 stats['binary'] = True
392 stats['binary'] = True
379 stats['ops'][NEW_FILENODE] = 'new file %s' % head['new_file_mode']
393 stats['ops'][NEW_FILENODE] = 'new file %s' % head['new_file_mode']
380 else: # modify operation, can be cp, rename, chmod
394 else: # modify operation, can be cp, rename, chmod
381 # CHMOD
395 # CHMOD
382 if head['new_mode'] and head['old_mode']:
396 if head['new_mode'] and head['old_mode']:
383 op = 'M'
397 op = 'M'
384 stats['binary'] = True
398 stats['binary'] = True
385 stats['ops'][CHMOD_FILENODE] = ('modified file chmod %s => %s'
399 stats['ops'][CHMOD_FILENODE] = ('modified file chmod %s => %s'
386 % (head['old_mode'], head['new_mode']))
400 % (head['old_mode'], head['new_mode']))
387 # RENAME
401 # RENAME
388 if (head['rename_from'] and head['rename_to']
402 if (head['rename_from'] and head['rename_to']
389 and head['rename_from'] != head['rename_to']):
403 and head['rename_from'] != head['rename_to']):
390 op = 'M'
404 op = 'M'
391 stats['binary'] = True
405 stats['binary'] = True
392 stats['ops'][RENAMED_FILENODE] = ('file renamed from %s to %s'
406 stats['ops'][RENAMED_FILENODE] = ('file renamed from %s to %s'
393 % (head['rename_from'], head['rename_to']))
407 % (head['rename_from'], head['rename_to']))
394 # COPY
408 # COPY
395 if head.get('copy_from') and head.get('copy_to'):
409 if head.get('copy_from') and head.get('copy_to'):
396 op = 'M'
410 op = 'M'
397 stats['binary'] = True
411 stats['binary'] = True
398 stats['ops'][COPIED_FILENODE] = ('file copied from %s to %s'
412 stats['ops'][COPIED_FILENODE] = ('file copied from %s to %s'
399 % (head['copy_from'], head['copy_to']))
413 % (head['copy_from'], head['copy_to']))
400 # FALL BACK: detect missed old style add or remove
414 # FALL BACK: detect missed old style add or remove
401 if op is None:
415 if op is None:
402 if not head['a_file'] and head['b_file']:
416 if not head['a_file'] and head['b_file']:
403 op = 'A'
417 op = 'A'
404 stats['binary'] = True
418 stats['binary'] = True
405 stats['ops'][NEW_FILENODE] = 'new file'
419 stats['ops'][NEW_FILENODE] = 'new file'
406
420
407 elif head['a_file'] and not head['b_file']:
421 elif head['a_file'] and not head['b_file']:
408 op = 'D'
422 op = 'D'
409 stats['binary'] = True
423 stats['binary'] = True
410 stats['ops'][DEL_FILENODE] = 'deleted file'
424 stats['ops'][DEL_FILENODE] = 'deleted file'
411
425
412 # it's not ADD not DELETE
426 # it's not ADD not DELETE
413 if op is None:
427 if op is None:
414 op = 'M'
428 op = 'M'
415 stats['binary'] = True
429 stats['binary'] = True
416 stats['ops'][MOD_FILENODE] = 'modified file'
430 stats['ops'][MOD_FILENODE] = 'modified file'
417
431
418 # a real non-binary diff
432 # a real non-binary diff
419 if head['a_file'] or head['b_file']:
433 if head['a_file'] or head['b_file']:
420 try:
434 try:
421 chunks, _stats = self._parse_lines(diff)
435 chunks, _stats = self._parse_lines(diff)
422 stats['binary'] = False
436 stats['binary'] = False
423 stats['added'] = _stats[0]
437 stats['added'] = _stats[0]
424 stats['deleted'] = _stats[1]
438 stats['deleted'] = _stats[1]
425 # explicit mark that it's a modified file
439 # explicit mark that it's a modified file
426 if op == 'M':
440 if op == 'M':
427 stats['ops'][MOD_FILENODE] = 'modified file'
441 stats['ops'][MOD_FILENODE] = 'modified file'
428
442
429 except DiffLimitExceeded:
443 except DiffLimitExceeded:
430 diff_container = lambda _diff: \
444 diff_container = lambda _diff: \
431 LimitedDiffContainer(self.diff_limit,
445 LimitedDiffContainer(self.diff_limit,
432 self.cur_diff_size, _diff)
446 self.cur_diff_size, _diff)
433 break
447 break
434 else: # GIT binary patch (or empty diff)
448 else: # GIT binary patch (or empty diff)
435 # GIT Binary patch
449 # GIT Binary patch
436 if head['bin_patch']:
450 if head['bin_patch']:
437 stats['ops'][BIN_FILENODE] = 'binary diff not shown'
451 stats['ops'][BIN_FILENODE] = 'binary diff not shown'
438 chunks = []
452 chunks = []
439
453
440 if op == 'D' and chunks:
454 if op == 'D' and chunks:
441 # a way of seeing deleted content could perhaps be nice - but
455 # a way of seeing deleted content could perhaps be nice - but
442 # not with the current UI
456 # not with the current UI
443 chunks = []
457 chunks = []
444
458
445 chunks.insert(0, [{
459 chunks.insert(0, [{
446 'old_lineno': '',
460 'old_lineno': '',
447 'new_lineno': '',
461 'new_lineno': '',
448 'action': 'context',
462 'action': 'context',
449 'line': msg,
463 'line': msg,
450 } for _op, msg in stats['ops'].iteritems()
464 } for _op, msg in stats['ops'].iteritems()
451 if _op not in [MOD_FILENODE]])
465 if _op not in [MOD_FILENODE]])
452
466
453 _files.append({
467 _files.append({
454 'filename': head['b_path'],
468 'filename': head['b_path'],
455 'old_revision': head['a_blob_id'],
469 'old_revision': head['a_blob_id'],
456 'new_revision': head['b_blob_id'],
470 'new_revision': head['b_blob_id'],
457 'chunks': chunks,
471 'chunks': chunks,
458 'operation': op,
472 'operation': op,
459 'stats': stats,
473 'stats': stats,
460 })
474 })
461
475
462 sorter = lambda info: {'A': 0, 'M': 1, 'D': 2}.get(info['operation'])
476 sorter = lambda info: {'A': 0, 'M': 1, 'D': 2}.get(info['operation'])
463
477
464 if not inline_diff:
478 if not inline_diff:
465 return diff_container(sorted(_files, key=sorter))
479 return diff_container(sorted(_files, key=sorter))
466
480
467 # highlight inline changes
481 # highlight inline changes
468 for diff_data in _files:
482 for diff_data in _files:
469 for chunk in diff_data['chunks']:
483 for chunk in diff_data['chunks']:
470 lineiter = iter(chunk)
484 lineiter = iter(chunk)
471 try:
485 try:
472 while 1:
486 while 1:
473 line = lineiter.next()
487 line = lineiter.next()
474 if line['action'] not in ['unmod', 'context']:
488 if line['action'] not in ['unmod', 'context']:
475 nextline = lineiter.next()
489 nextline = lineiter.next()
476 if nextline['action'] in ['unmod', 'context'] or \
490 if nextline['action'] in ['unmod', 'context'] or \
477 nextline['action'] == line['action']:
491 nextline['action'] == line['action']:
478 continue
492 continue
479 self.differ(line, nextline)
493 self.differ(line, nextline)
480 except StopIteration:
494 except StopIteration:
481 pass
495 pass
482
496
483 return diff_container(sorted(_files, key=sorter))
497 return diff_container(sorted(_files, key=sorter))
484
498
485 def _parse_udiff(self, inline_diff=True):
499 def _parse_udiff(self, inline_diff=True):
486 raise NotImplementedError()
500 raise NotImplementedError()
487
501
488 def _parse_lines(self, diff):
502 def _parse_lines(self, diff):
489 """
503 """
490 Parse the diff an return data for the template.
504 Parse the diff an return data for the template.
491 """
505 """
492
506
493 lineiter = iter(diff)
507 lineiter = iter(diff)
494 stats = [0, 0]
508 stats = [0, 0]
495
509
496 try:
510 try:
497 chunks = []
511 chunks = []
498 line = lineiter.next()
512 line = lineiter.next()
499
513
500 while line:
514 while line:
501 lines = []
515 lines = []
502 chunks.append(lines)
516 chunks.append(lines)
503
517
504 match = self._chunk_re.match(line)
518 match = self._chunk_re.match(line)
505
519
506 if not match:
520 if not match:
507 break
521 break
508
522
509 gr = match.groups()
523 gr = match.groups()
510 (old_line, old_end,
524 (old_line, old_end,
511 new_line, new_end) = [int(x or 1) for x in gr[:-1]]
525 new_line, new_end) = [int(x or 1) for x in gr[:-1]]
512 old_line -= 1
526 old_line -= 1
513 new_line -= 1
527 new_line -= 1
514
528
515 context = len(gr) == 5
529 context = len(gr) == 5
516 old_end += old_line
530 old_end += old_line
517 new_end += new_line
531 new_end += new_line
518
532
519 if context:
533 if context:
520 # skip context only if it's first line
534 # skip context only if it's first line
521 if int(gr[0]) > 1:
535 if int(gr[0]) > 1:
522 lines.append({
536 lines.append({
523 'old_lineno': '...',
537 'old_lineno': '...',
524 'new_lineno': '...',
538 'new_lineno': '...',
525 'action': 'context',
539 'action': 'context',
526 'line': line,
540 'line': line,
527 })
541 })
528
542
529 line = lineiter.next()
543 line = lineiter.next()
530
544
531 while old_line < old_end or new_line < new_end:
545 while old_line < old_end or new_line < new_end:
532 command = ' '
546 command = ' '
533 if line:
547 if line:
534 command = line[0]
548 command = line[0]
535
549
536 affects_old = affects_new = False
550 affects_old = affects_new = False
537
551
538 # ignore those if we don't expect them
552 # ignore those if we don't expect them
539 if command in '#@':
553 if command in '#@':
540 continue
554 continue
541 elif command == '+':
555 elif command == '+':
542 affects_new = True
556 affects_new = True
543 action = 'add'
557 action = 'add'
544 stats[0] += 1
558 stats[0] += 1
545 elif command == '-':
559 elif command == '-':
546 affects_old = True
560 affects_old = True
547 action = 'del'
561 action = 'del'
548 stats[1] += 1
562 stats[1] += 1
549 else:
563 else:
550 affects_old = affects_new = True
564 affects_old = affects_new = True
551 action = 'unmod'
565 action = 'unmod'
552
566
553 if not self._newline_marker.match(line):
567 if not self._newline_marker.match(line):
554 old_line += affects_old
568 old_line += affects_old
555 new_line += affects_new
569 new_line += affects_new
556 lines.append({
570 lines.append({
557 'old_lineno': affects_old and old_line or '',
571 'old_lineno': affects_old and old_line or '',
558 'new_lineno': affects_new and new_line or '',
572 'new_lineno': affects_new and new_line or '',
559 'action': action,
573 'action': action,
560 'line': self._clean_line(line, command)
574 'line': self._clean_line(line, command)
561 })
575 })
562
576
563 line = lineiter.next()
577 line = lineiter.next()
564
578
565 if self._newline_marker.match(line):
579 if self._newline_marker.match(line):
566 # we need to append to lines, since this is not
580 # we need to append to lines, since this is not
567 # counted in the line specs of diff
581 # counted in the line specs of diff
568 lines.append({
582 lines.append({
569 'old_lineno': '...',
583 'old_lineno': '...',
570 'new_lineno': '...',
584 'new_lineno': '...',
571 'action': 'context',
585 'action': 'context',
572 'line': self._clean_line(line, command)
586 'line': self._clean_line(line, command)
573 })
587 })
574
588
575 except StopIteration:
589 except StopIteration:
576 pass
590 pass
577 return chunks, stats
591 return chunks, stats
578
592
579 def _safe_id(self, idstring):
593 def _safe_id(self, idstring):
580 """Make a string safe for including in an id attribute.
594 """Make a string safe for including in an id attribute.
581
595
582 The HTML spec says that id attributes 'must begin with
596 The HTML spec says that id attributes 'must begin with
583 a letter ([A-Za-z]) and may be followed by any number
597 a letter ([A-Za-z]) and may be followed by any number
584 of letters, digits ([0-9]), hyphens ("-"), underscores
598 of letters, digits ([0-9]), hyphens ("-"), underscores
585 ("_"), colons (":"), and periods (".")'. These regexps
599 ("_"), colons (":"), and periods (".")'. These regexps
586 are slightly over-zealous, in that they remove colons
600 are slightly over-zealous, in that they remove colons
587 and periods unnecessarily.
601 and periods unnecessarily.
588
602
589 Whitespace is transformed into underscores, and then
603 Whitespace is transformed into underscores, and then
590 anything which is not a hyphen or a character that
604 anything which is not a hyphen or a character that
591 matches \w (alphanumerics and underscore) is removed.
605 matches \w (alphanumerics and underscore) is removed.
592
606
593 """
607 """
594 # Transform all whitespace to underscore
608 # Transform all whitespace to underscore
595 idstring = re.sub(r'\s', "_", '%s' % idstring)
609 idstring = re.sub(r'\s', "_", '%s' % idstring)
596 # Remove everything that is not a hyphen or a member of \w
610 # Remove everything that is not a hyphen or a member of \w
597 idstring = re.sub(r'(?!-)\W', "", idstring).lower()
611 idstring = re.sub(r'(?!-)\W', "", idstring).lower()
598 return idstring
612 return idstring
599
613
600 def prepare(self, inline_diff=True):
614 def prepare(self, inline_diff=True):
601 """
615 """
602 Prepare the passed udiff for HTML rendering. It'l return a list
616 Prepare the passed udiff for HTML rendering. It'l return a list
603 of dicts with diff information
617 of dicts with diff information
604 """
618 """
605 parsed = self._parser(inline_diff=inline_diff)
619 parsed = self._parser(inline_diff=inline_diff)
606 self.parsed = True
620 self.parsed = True
607 self.parsed_diff = parsed
621 self.parsed_diff = parsed
608 return parsed
622 return parsed
609
623
610 def as_raw(self, diff_lines=None):
624 def as_raw(self, diff_lines=None):
611 """
625 """
612 Returns raw string diff
626 Returns raw string diff
613 """
627 """
614 return self._diff
628 return self._diff
615 #return u''.join(imap(self._line_counter, self._diff.splitlines(1)))
629 #return u''.join(imap(self._line_counter, self._diff.splitlines(1)))
616
630
617 def as_html(self, table_class='code-difftable', line_class='line',
631 def as_html(self, table_class='code-difftable', line_class='line',
618 old_lineno_class='lineno old', new_lineno_class='lineno new',
632 old_lineno_class='lineno old', new_lineno_class='lineno new',
619 code_class='code', enable_comments=False, parsed_lines=None):
633 code_class='code', enable_comments=False, parsed_lines=None):
620 """
634 """
621 Return given diff as html table with customized css classes
635 Return given diff as html table with customized css classes
622 """
636 """
623 def _link_to_if(condition, label, url):
637 def _link_to_if(condition, label, url):
624 """
638 """
625 Generates a link if condition is meet or just the label if not.
639 Generates a link if condition is meet or just the label if not.
626 """
640 """
627
641
628 if condition:
642 if condition:
629 return '''<a href="%(url)s">%(label)s</a>''' % {
643 return '''<a href="%(url)s">%(label)s</a>''' % {
630 'url': url,
644 'url': url,
631 'label': label
645 'label': label
632 }
646 }
633 else:
647 else:
634 return label
648 return label
635 if not self.parsed:
649 if not self.parsed:
636 self.prepare()
650 self.prepare()
637
651
638 diff_lines = self.parsed_diff
652 diff_lines = self.parsed_diff
639 if parsed_lines:
653 if parsed_lines:
640 diff_lines = parsed_lines
654 diff_lines = parsed_lines
641
655
642 _html_empty = True
656 _html_empty = True
643 _html = []
657 _html = []
644 _html.append('''<table class="%(table_class)s">\n''' % {
658 _html.append('''<table class="%(table_class)s">\n''' % {
645 'table_class': table_class
659 'table_class': table_class
646 })
660 })
647
661
648 for diff in diff_lines:
662 for diff in diff_lines:
649 for line in diff['chunks']:
663 for line in diff['chunks']:
650 _html_empty = False
664 _html_empty = False
651 for change in line:
665 for change in line:
652 _html.append('''<tr class="%(lc)s %(action)s">\n''' % {
666 _html.append('''<tr class="%(lc)s %(action)s">\n''' % {
653 'lc': line_class,
667 'lc': line_class,
654 'action': change['action']
668 'action': change['action']
655 })
669 })
656 anchor_old_id = ''
670 anchor_old_id = ''
657 anchor_new_id = ''
671 anchor_new_id = ''
658 anchor_old = "%(filename)s_o%(oldline_no)s" % {
672 anchor_old = "%(filename)s_o%(oldline_no)s" % {
659 'filename': self._safe_id(diff['filename']),
673 'filename': self._safe_id(diff['filename']),
660 'oldline_no': change['old_lineno']
674 'oldline_no': change['old_lineno']
661 }
675 }
662 anchor_new = "%(filename)s_n%(oldline_no)s" % {
676 anchor_new = "%(filename)s_n%(oldline_no)s" % {
663 'filename': self._safe_id(diff['filename']),
677 'filename': self._safe_id(diff['filename']),
664 'oldline_no': change['new_lineno']
678 'oldline_no': change['new_lineno']
665 }
679 }
666 cond_old = (change['old_lineno'] != '...' and
680 cond_old = (change['old_lineno'] != '...' and
667 change['old_lineno'])
681 change['old_lineno'])
668 cond_new = (change['new_lineno'] != '...' and
682 cond_new = (change['new_lineno'] != '...' and
669 change['new_lineno'])
683 change['new_lineno'])
670 if cond_old:
684 if cond_old:
671 anchor_old_id = 'id="%s"' % anchor_old
685 anchor_old_id = 'id="%s"' % anchor_old
672 if cond_new:
686 if cond_new:
673 anchor_new_id = 'id="%s"' % anchor_new
687 anchor_new_id = 'id="%s"' % anchor_new
674 ###########################################################
688 ###########################################################
675 # OLD LINE NUMBER
689 # OLD LINE NUMBER
676 ###########################################################
690 ###########################################################
677 _html.append('''\t<td %(a_id)s class="%(olc)s">''' % {
691 _html.append('''\t<td %(a_id)s class="%(olc)s">''' % {
678 'a_id': anchor_old_id,
692 'a_id': anchor_old_id,
679 'olc': old_lineno_class
693 'olc': old_lineno_class
680 })
694 })
681
695
682 _html.append('''%(link)s''' % {
696 _html.append('''%(link)s''' % {
683 'link': _link_to_if(True, change['old_lineno'],
697 'link': _link_to_if(True, change['old_lineno'],
684 '#%s' % anchor_old)
698 '#%s' % anchor_old)
685 })
699 })
686 _html.append('''</td>\n''')
700 _html.append('''</td>\n''')
687 ###########################################################
701 ###########################################################
688 # NEW LINE NUMBER
702 # NEW LINE NUMBER
689 ###########################################################
703 ###########################################################
690
704
691 _html.append('''\t<td %(a_id)s class="%(nlc)s">''' % {
705 _html.append('''\t<td %(a_id)s class="%(nlc)s">''' % {
692 'a_id': anchor_new_id,
706 'a_id': anchor_new_id,
693 'nlc': new_lineno_class
707 'nlc': new_lineno_class
694 })
708 })
695
709
696 _html.append('''%(link)s''' % {
710 _html.append('''%(link)s''' % {
697 'link': _link_to_if(True, change['new_lineno'],
711 'link': _link_to_if(True, change['new_lineno'],
698 '#%s' % anchor_new)
712 '#%s' % anchor_new)
699 })
713 })
700 _html.append('''</td>\n''')
714 _html.append('''</td>\n''')
701 ###########################################################
715 ###########################################################
702 # CODE
716 # CODE
703 ###########################################################
717 ###########################################################
704 comments = '' if enable_comments else 'no-comment'
718 comments = '' if enable_comments else 'no-comment'
705 _html.append('''\t<td class="%(cc)s %(inc)s">''' % {
719 _html.append('''\t<td class="%(cc)s %(inc)s">''' % {
706 'cc': code_class,
720 'cc': code_class,
707 'inc': comments
721 'inc': comments
708 })
722 })
709 _html.append('''\n\t\t<pre>%(code)s</pre>\n''' % {
723 _html.append('''\n\t\t<pre>%(code)s</pre>\n''' % {
710 'code': change['line']
724 'code': change['line']
711 })
725 })
712
726
713 _html.append('''\t</td>''')
727 _html.append('''\t</td>''')
714 _html.append('''\n</tr>\n''')
728 _html.append('''\n</tr>\n''')
715 _html.append('''</table>''')
729 _html.append('''</table>''')
716 if _html_empty:
730 if _html_empty:
717 return None
731 return None
718 return ''.join(_html)
732 return ''.join(_html)
719
733
720 def stat(self):
734 def stat(self):
721 """
735 """
722 Returns tuple of added, and removed lines for this instance
736 Returns tuple of added, and removed lines for this instance
723 """
737 """
724 return self.adds, self.removes
738 return self.adds, self.removes
@@ -1,1432 +1,1444 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 # This program is free software: you can redistribute it and/or modify
2 # This program is free software: you can redistribute it and/or modify
3 # it under the terms of the GNU General Public License as published by
3 # it under the terms of the GNU General Public License as published by
4 # the Free Software Foundation, either version 3 of the License, or
4 # the Free Software Foundation, either version 3 of the License, or
5 # (at your option) any later version.
5 # (at your option) any later version.
6 #
6 #
7 # This program is distributed in the hope that it will be useful,
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
10 # GNU General Public License for more details.
11 #
11 #
12 # You should have received a copy of the GNU General Public License
12 # You should have received a copy of the GNU General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 """
14 """
15 Helper functions
15 Helper functions
16
16
17 Consists of functions to typically be used within templates, but also
17 Consists of functions to typically be used within templates, but also
18 available to Controllers. This module is available to both as 'h'.
18 available to Controllers. This module is available to both as 'h'.
19 """
19 """
20 import random
20 import random
21 import hashlib
21 import hashlib
22 import StringIO
22 import StringIO
23 import urllib
23 import urllib
24 import math
24 import math
25 import logging
25 import logging
26 import re
26 import re
27 import urlparse
27 import urlparse
28 import textwrap
28 import textwrap
29
29
30 from datetime import datetime
30 from datetime import datetime
31 from pygments.formatters.html import HtmlFormatter
31 from pygments.formatters.html import HtmlFormatter
32 from pygments import highlight as code_highlight
32 from pygments import highlight as code_highlight
33 from pylons import url
33 from pylons import url
34 from pylons.i18n.translation import _, ungettext
34 from pylons.i18n.translation import _, ungettext
35 from hashlib import md5
35 from hashlib import md5
36
36
37 from webhelpers.html import literal, HTML, escape
37 from webhelpers.html import literal, HTML, escape
38 from webhelpers.html.tools import *
38 from webhelpers.html.tools import *
39 from webhelpers.html.builder import make_tag
39 from webhelpers.html.builder import make_tag
40 from webhelpers.html.tags import auto_discovery_link, checkbox, css_classes, \
40 from webhelpers.html.tags import auto_discovery_link, checkbox, css_classes, \
41 end_form, file, form, hidden, image, javascript_link, link_to, \
41 end_form, file, form, hidden, image, javascript_link, link_to, \
42 link_to_if, link_to_unless, ol, required_legend, select, stylesheet_link, \
42 link_to_if, link_to_unless, ol, required_legend, select, stylesheet_link, \
43 submit, text, password, textarea, title, ul, xml_declaration, radio
43 submit, text, password, textarea, title, ul, xml_declaration, radio
44 from webhelpers.html.tools import auto_link, button_to, highlight, \
44 from webhelpers.html.tools import auto_link, button_to, highlight, \
45 js_obfuscate, mail_to, strip_links, strip_tags, tag_re
45 js_obfuscate, mail_to, strip_links, strip_tags, tag_re
46 from webhelpers.number import format_byte_size, format_bit_size
46 from webhelpers.number import format_byte_size, format_bit_size
47 from webhelpers.pylonslib import Flash as _Flash
47 from webhelpers.pylonslib import Flash as _Flash
48 from webhelpers.pylonslib.secure_form import secure_form
48 from webhelpers.pylonslib.secure_form import secure_form
49 from webhelpers.text import chop_at, collapse, convert_accented_entities, \
49 from webhelpers.text import chop_at, collapse, convert_accented_entities, \
50 convert_misc_entities, lchop, plural, rchop, remove_formatting, \
50 convert_misc_entities, lchop, plural, rchop, remove_formatting, \
51 replace_whitespace, urlify, truncate, wrap_paragraphs
51 replace_whitespace, urlify, truncate, wrap_paragraphs
52 from webhelpers.date import time_ago_in_words
52 from webhelpers.date import time_ago_in_words
53 from webhelpers.paginate import Page as _Page
53 from webhelpers.paginate import Page as _Page
54 from webhelpers.html.tags import _set_input_attrs, _set_id_attr, \
54 from webhelpers.html.tags import _set_input_attrs, _set_id_attr, \
55 convert_boolean_attrs, NotGiven, _make_safe_id_component
55 convert_boolean_attrs, NotGiven, _make_safe_id_component
56
56
57 from kallithea.lib.annotate import annotate_highlight
57 from kallithea.lib.annotate import annotate_highlight
58 from kallithea.lib.utils import repo_name_slug, get_custom_lexer
58 from kallithea.lib.utils import repo_name_slug, get_custom_lexer
59 from kallithea.lib.utils2 import str2bool, safe_unicode, safe_str, \
59 from kallithea.lib.utils2 import str2bool, safe_unicode, safe_str, \
60 get_changeset_safe, datetime_to_time, time_to_datetime, AttributeDict,\
60 get_changeset_safe, datetime_to_time, time_to_datetime, AttributeDict,\
61 safe_int
61 safe_int
62 from kallithea.lib.markup_renderer import MarkupRenderer
62 from kallithea.lib.markup_renderer import MarkupRenderer
63 from kallithea.lib.vcs.exceptions import ChangesetDoesNotExistError
63 from kallithea.lib.vcs.exceptions import ChangesetDoesNotExistError
64 from kallithea.lib.vcs.backends.base import BaseChangeset, EmptyChangeset
64 from kallithea.lib.vcs.backends.base import BaseChangeset, EmptyChangeset
65 from kallithea.config.conf import DATE_FORMAT, DATETIME_FORMAT
65 from kallithea.config.conf import DATE_FORMAT, DATETIME_FORMAT
66 from kallithea.model.changeset_status import ChangesetStatusModel
66 from kallithea.model.changeset_status import ChangesetStatusModel
67 from kallithea.model.db import URL_SEP, Permission
67 from kallithea.model.db import URL_SEP, Permission
68
68
69 log = logging.getLogger(__name__)
69 log = logging.getLogger(__name__)
70
70
71
71
72 def html_escape(text, html_escape_table=None):
72 def html_escape(text, html_escape_table=None):
73 """Produce entities within text."""
73 """Produce entities within text."""
74 if not html_escape_table:
74 if not html_escape_table:
75 html_escape_table = {
75 html_escape_table = {
76 "&": "&amp;",
76 "&": "&amp;",
77 '"': "&quot;",
77 '"': "&quot;",
78 "'": "&apos;",
78 "'": "&apos;",
79 ">": "&gt;",
79 ">": "&gt;",
80 "<": "&lt;",
80 "<": "&lt;",
81 }
81 }
82 return "".join(html_escape_table.get(c, c) for c in text)
82 return "".join(html_escape_table.get(c, c) for c in text)
83
83
84
84
85 def shorter(text, size=20):
85 def shorter(text, size=20):
86 postfix = '...'
86 postfix = '...'
87 if len(text) > size:
87 if len(text) > size:
88 return text[:size - len(postfix)] + postfix
88 return text[:size - len(postfix)] + postfix
89 return text
89 return text
90
90
91
91
92 def _reset(name, value=None, id=NotGiven, type="reset", **attrs):
92 def _reset(name, value=None, id=NotGiven, type="reset", **attrs):
93 """
93 """
94 Reset button
94 Reset button
95 """
95 """
96 _set_input_attrs(attrs, type, name, value)
96 _set_input_attrs(attrs, type, name, value)
97 _set_id_attr(attrs, id, name)
97 _set_id_attr(attrs, id, name)
98 convert_boolean_attrs(attrs, ["disabled"])
98 convert_boolean_attrs(attrs, ["disabled"])
99 return HTML.input(**attrs)
99 return HTML.input(**attrs)
100
100
101 reset = _reset
101 reset = _reset
102 safeid = _make_safe_id_component
102 safeid = _make_safe_id_component
103
103
104
104
105 def FID(raw_id, path):
105 def FID(raw_id, path):
106 """
106 """
107 Creates a uniqe ID for filenode based on it's hash of path and revision
107 Creates a uniqe ID for filenode based on it's hash of path and revision
108 it's safe to use in urls
108 it's safe to use in urls
109
109
110 :param raw_id:
110 :param raw_id:
111 :param path:
111 :param path:
112 """
112 """
113
113
114 return 'C-%s-%s' % (short_id(raw_id), md5(safe_str(path)).hexdigest()[:12])
114 return 'C-%s-%s' % (short_id(raw_id), md5(safe_str(path)).hexdigest()[:12])
115
115
116
116
117 def get_token():
117 def get_token():
118 """Return the current authentication token, creating one if one doesn't
118 """Return the current authentication token, creating one if one doesn't
119 already exist.
119 already exist.
120 """
120 """
121 token_key = "_authentication_token"
121 token_key = "_authentication_token"
122 from pylons import session
122 from pylons import session
123 if not token_key in session:
123 if not token_key in session:
124 try:
124 try:
125 token = hashlib.sha1(str(random.getrandbits(128))).hexdigest()
125 token = hashlib.sha1(str(random.getrandbits(128))).hexdigest()
126 except AttributeError: # Python < 2.4
126 except AttributeError: # Python < 2.4
127 token = hashlib.sha1(str(random.randrange(2 ** 128))).hexdigest()
127 token = hashlib.sha1(str(random.randrange(2 ** 128))).hexdigest()
128 session[token_key] = token
128 session[token_key] = token
129 if hasattr(session, 'save'):
129 if hasattr(session, 'save'):
130 session.save()
130 session.save()
131 return session[token_key]
131 return session[token_key]
132
132
133
133
134 class _GetError(object):
134 class _GetError(object):
135 """Get error from form_errors, and represent it as span wrapped error
135 """Get error from form_errors, and represent it as span wrapped error
136 message
136 message
137
137
138 :param field_name: field to fetch errors for
138 :param field_name: field to fetch errors for
139 :param form_errors: form errors dict
139 :param form_errors: form errors dict
140 """
140 """
141
141
142 def __call__(self, field_name, form_errors):
142 def __call__(self, field_name, form_errors):
143 tmpl = """<span class="error_msg">%s</span>"""
143 tmpl = """<span class="error_msg">%s</span>"""
144 if form_errors and field_name in form_errors:
144 if form_errors and field_name in form_errors:
145 return literal(tmpl % form_errors.get(field_name))
145 return literal(tmpl % form_errors.get(field_name))
146
146
147 get_error = _GetError()
147 get_error = _GetError()
148
148
149
149
150 class _ToolTip(object):
150 class _ToolTip(object):
151
151
152 def __call__(self, tooltip_title, trim_at=50):
152 def __call__(self, tooltip_title, trim_at=50):
153 """
153 """
154 Special function just to wrap our text into nice formatted
154 Special function just to wrap our text into nice formatted
155 autowrapped text
155 autowrapped text
156
156
157 :param tooltip_title:
157 :param tooltip_title:
158 """
158 """
159 tooltip_title = escape(tooltip_title)
159 tooltip_title = escape(tooltip_title)
160 tooltip_title = tooltip_title.replace('<', '&lt;').replace('>', '&gt;')
160 tooltip_title = tooltip_title.replace('<', '&lt;').replace('>', '&gt;')
161 return tooltip_title
161 return tooltip_title
162 tooltip = _ToolTip()
162 tooltip = _ToolTip()
163
163
164
164
165 class _FilesBreadCrumbs(object):
165 class _FilesBreadCrumbs(object):
166
166
167 def __call__(self, repo_name, rev, paths):
167 def __call__(self, repo_name, rev, paths):
168 if isinstance(paths, str):
168 if isinstance(paths, str):
169 paths = safe_unicode(paths)
169 paths = safe_unicode(paths)
170 url_l = [link_to(repo_name, url('files_home',
170 url_l = [link_to(repo_name, url('files_home',
171 repo_name=repo_name,
171 repo_name=repo_name,
172 revision=rev, f_path=''),
172 revision=rev, f_path=''),
173 class_='ypjax-link')]
173 class_='ypjax-link')]
174 paths_l = paths.split('/')
174 paths_l = paths.split('/')
175 for cnt, p in enumerate(paths_l):
175 for cnt, p in enumerate(paths_l):
176 if p != '':
176 if p != '':
177 url_l.append(link_to(p,
177 url_l.append(link_to(p,
178 url('files_home',
178 url('files_home',
179 repo_name=repo_name,
179 repo_name=repo_name,
180 revision=rev,
180 revision=rev,
181 f_path='/'.join(paths_l[:cnt + 1])
181 f_path='/'.join(paths_l[:cnt + 1])
182 ),
182 ),
183 class_='ypjax-link'
183 class_='ypjax-link'
184 )
184 )
185 )
185 )
186
186
187 return literal('/'.join(url_l))
187 return literal('/'.join(url_l))
188
188
189 files_breadcrumbs = _FilesBreadCrumbs()
189 files_breadcrumbs = _FilesBreadCrumbs()
190
190
191
191
192 class CodeHtmlFormatter(HtmlFormatter):
192 class CodeHtmlFormatter(HtmlFormatter):
193 """
193 """
194 My code Html Formatter for source codes
194 My code Html Formatter for source codes
195 """
195 """
196
196
197 def wrap(self, source, outfile):
197 def wrap(self, source, outfile):
198 return self._wrap_div(self._wrap_pre(self._wrap_code(source)))
198 return self._wrap_div(self._wrap_pre(self._wrap_code(source)))
199
199
200 def _wrap_code(self, source):
200 def _wrap_code(self, source):
201 for cnt, it in enumerate(source):
201 for cnt, it in enumerate(source):
202 i, t = it
202 i, t = it
203 t = '<div id="L%s">%s</div>' % (cnt + 1, t)
203 t = '<div id="L%s">%s</div>' % (cnt + 1, t)
204 yield i, t
204 yield i, t
205
205
206 def _wrap_tablelinenos(self, inner):
206 def _wrap_tablelinenos(self, inner):
207 dummyoutfile = StringIO.StringIO()
207 dummyoutfile = StringIO.StringIO()
208 lncount = 0
208 lncount = 0
209 for t, line in inner:
209 for t, line in inner:
210 if t:
210 if t:
211 lncount += 1
211 lncount += 1
212 dummyoutfile.write(line)
212 dummyoutfile.write(line)
213
213
214 fl = self.linenostart
214 fl = self.linenostart
215 mw = len(str(lncount + fl - 1))
215 mw = len(str(lncount + fl - 1))
216 sp = self.linenospecial
216 sp = self.linenospecial
217 st = self.linenostep
217 st = self.linenostep
218 la = self.lineanchors
218 la = self.lineanchors
219 aln = self.anchorlinenos
219 aln = self.anchorlinenos
220 nocls = self.noclasses
220 nocls = self.noclasses
221 if sp:
221 if sp:
222 lines = []
222 lines = []
223
223
224 for i in range(fl, fl + lncount):
224 for i in range(fl, fl + lncount):
225 if i % st == 0:
225 if i % st == 0:
226 if i % sp == 0:
226 if i % sp == 0:
227 if aln:
227 if aln:
228 lines.append('<a href="#%s%d" class="special">%*d</a>' %
228 lines.append('<a href="#%s%d" class="special">%*d</a>' %
229 (la, i, mw, i))
229 (la, i, mw, i))
230 else:
230 else:
231 lines.append('<span class="special">%*d</span>' % (mw, i))
231 lines.append('<span class="special">%*d</span>' % (mw, i))
232 else:
232 else:
233 if aln:
233 if aln:
234 lines.append('<a href="#%s%d">%*d</a>' % (la, i, mw, i))
234 lines.append('<a href="#%s%d">%*d</a>' % (la, i, mw, i))
235 else:
235 else:
236 lines.append('%*d' % (mw, i))
236 lines.append('%*d' % (mw, i))
237 else:
237 else:
238 lines.append('')
238 lines.append('')
239 ls = '\n'.join(lines)
239 ls = '\n'.join(lines)
240 else:
240 else:
241 lines = []
241 lines = []
242 for i in range(fl, fl + lncount):
242 for i in range(fl, fl + lncount):
243 if i % st == 0:
243 if i % st == 0:
244 if aln:
244 if aln:
245 lines.append('<a href="#%s%d">%*d</a>' % (la, i, mw, i))
245 lines.append('<a href="#%s%d">%*d</a>' % (la, i, mw, i))
246 else:
246 else:
247 lines.append('%*d' % (mw, i))
247 lines.append('%*d' % (mw, i))
248 else:
248 else:
249 lines.append('')
249 lines.append('')
250 ls = '\n'.join(lines)
250 ls = '\n'.join(lines)
251
251
252 # in case you wonder about the seemingly redundant <div> here: since the
252 # in case you wonder about the seemingly redundant <div> here: since the
253 # content in the other cell also is wrapped in a div, some browsers in
253 # content in the other cell also is wrapped in a div, some browsers in
254 # some configurations seem to mess up the formatting...
254 # some configurations seem to mess up the formatting...
255 if nocls:
255 if nocls:
256 yield 0, ('<table class="%stable">' % self.cssclass +
256 yield 0, ('<table class="%stable">' % self.cssclass +
257 '<tr><td><div class="linenodiv" '
257 '<tr><td><div class="linenodiv" '
258 'style="background-color: #f0f0f0; padding-right: 10px">'
258 'style="background-color: #f0f0f0; padding-right: 10px">'
259 '<pre style="line-height: 125%">' +
259 '<pre style="line-height: 125%">' +
260 ls + '</pre></div></td><td id="hlcode" class="code">')
260 ls + '</pre></div></td><td id="hlcode" class="code">')
261 else:
261 else:
262 yield 0, ('<table class="%stable">' % self.cssclass +
262 yield 0, ('<table class="%stable">' % self.cssclass +
263 '<tr><td class="linenos"><div class="linenodiv"><pre>' +
263 '<tr><td class="linenos"><div class="linenodiv"><pre>' +
264 ls + '</pre></div></td><td id="hlcode" class="code">')
264 ls + '</pre></div></td><td id="hlcode" class="code">')
265 yield 0, dummyoutfile.getvalue()
265 yield 0, dummyoutfile.getvalue()
266 yield 0, '</td></tr></table>'
266 yield 0, '</td></tr></table>'
267
267
268
268
269 _whitespace_re = re.compile(r'(\t)|( )(?=\n|</div>)')
270
271 def _markup_whitespace(m):
272 groups = m.groups()
273 if groups[0]:
274 return '<u>\t</u>'
275 if groups[1]:
276 return ' <i></i>'
277
278 def markup_whitespace(s):
279 return _whitespace_re.sub(_markup_whitespace, s)
280
269 def pygmentize(filenode, **kwargs):
281 def pygmentize(filenode, **kwargs):
270 """
282 """
271 pygmentize function using pygments
283 pygmentize function using pygments
272
284
273 :param filenode:
285 :param filenode:
274 """
286 """
275 lexer = get_custom_lexer(filenode.extension) or filenode.lexer
287 lexer = get_custom_lexer(filenode.extension) or filenode.lexer
276 return literal(code_highlight(filenode.content, lexer,
288 return literal(markup_whitespace(
277 CodeHtmlFormatter(**kwargs)))
289 code_highlight(filenode.content, lexer, CodeHtmlFormatter(**kwargs))))
278
290
279
291
280 def pygmentize_annotation(repo_name, filenode, **kwargs):
292 def pygmentize_annotation(repo_name, filenode, **kwargs):
281 """
293 """
282 pygmentize function for annotation
294 pygmentize function for annotation
283
295
284 :param filenode:
296 :param filenode:
285 """
297 """
286
298
287 color_dict = {}
299 color_dict = {}
288
300
289 def gen_color(n=10000):
301 def gen_color(n=10000):
290 """generator for getting n of evenly distributed colors using
302 """generator for getting n of evenly distributed colors using
291 hsv color and golden ratio. It always return same order of colors
303 hsv color and golden ratio. It always return same order of colors
292
304
293 :returns: RGB tuple
305 :returns: RGB tuple
294 """
306 """
295
307
296 def hsv_to_rgb(h, s, v):
308 def hsv_to_rgb(h, s, v):
297 if s == 0.0:
309 if s == 0.0:
298 return v, v, v
310 return v, v, v
299 i = int(h * 6.0) # XXX assume int() truncates!
311 i = int(h * 6.0) # XXX assume int() truncates!
300 f = (h * 6.0) - i
312 f = (h * 6.0) - i
301 p = v * (1.0 - s)
313 p = v * (1.0 - s)
302 q = v * (1.0 - s * f)
314 q = v * (1.0 - s * f)
303 t = v * (1.0 - s * (1.0 - f))
315 t = v * (1.0 - s * (1.0 - f))
304 i = i % 6
316 i = i % 6
305 if i == 0:
317 if i == 0:
306 return v, t, p
318 return v, t, p
307 if i == 1:
319 if i == 1:
308 return q, v, p
320 return q, v, p
309 if i == 2:
321 if i == 2:
310 return p, v, t
322 return p, v, t
311 if i == 3:
323 if i == 3:
312 return p, q, v
324 return p, q, v
313 if i == 4:
325 if i == 4:
314 return t, p, v
326 return t, p, v
315 if i == 5:
327 if i == 5:
316 return v, p, q
328 return v, p, q
317
329
318 golden_ratio = 0.618033988749895
330 golden_ratio = 0.618033988749895
319 h = 0.22717784590367374
331 h = 0.22717784590367374
320
332
321 for _ in xrange(n):
333 for _ in xrange(n):
322 h += golden_ratio
334 h += golden_ratio
323 h %= 1
335 h %= 1
324 HSV_tuple = [h, 0.95, 0.95]
336 HSV_tuple = [h, 0.95, 0.95]
325 RGB_tuple = hsv_to_rgb(*HSV_tuple)
337 RGB_tuple = hsv_to_rgb(*HSV_tuple)
326 yield map(lambda x: str(int(x * 256)), RGB_tuple)
338 yield map(lambda x: str(int(x * 256)), RGB_tuple)
327
339
328 cgenerator = gen_color()
340 cgenerator = gen_color()
329
341
330 def get_color_string(cs):
342 def get_color_string(cs):
331 if cs in color_dict:
343 if cs in color_dict:
332 col = color_dict[cs]
344 col = color_dict[cs]
333 else:
345 else:
334 col = color_dict[cs] = cgenerator.next()
346 col = color_dict[cs] = cgenerator.next()
335 return "color: rgb(%s)! important;" % (', '.join(col))
347 return "color: rgb(%s)! important;" % (', '.join(col))
336
348
337 def url_func(repo_name):
349 def url_func(repo_name):
338
350
339 def _url_func(changeset):
351 def _url_func(changeset):
340 author = changeset.author
352 author = changeset.author
341 date = changeset.date
353 date = changeset.date
342 message = tooltip(changeset.message)
354 message = tooltip(changeset.message)
343
355
344 tooltip_html = ("<div style='font-size:0.8em'><b>Author:</b>"
356 tooltip_html = ("<div style='font-size:0.8em'><b>Author:</b>"
345 " %s<br/><b>Date:</b> %s</b><br/><b>Message:"
357 " %s<br/><b>Date:</b> %s</b><br/><b>Message:"
346 "</b> %s<br/></div>")
358 "</b> %s<br/></div>")
347
359
348 tooltip_html = tooltip_html % (author, date, message)
360 tooltip_html = tooltip_html % (author, date, message)
349 lnk_format = '%5s:%s' % ('r%s' % changeset.revision,
361 lnk_format = '%5s:%s' % ('r%s' % changeset.revision,
350 short_id(changeset.raw_id))
362 short_id(changeset.raw_id))
351 uri = link_to(
363 uri = link_to(
352 lnk_format,
364 lnk_format,
353 url('changeset_home', repo_name=repo_name,
365 url('changeset_home', repo_name=repo_name,
354 revision=changeset.raw_id),
366 revision=changeset.raw_id),
355 style=get_color_string(changeset.raw_id),
367 style=get_color_string(changeset.raw_id),
356 class_='tooltip',
368 class_='tooltip',
357 title=tooltip_html
369 title=tooltip_html
358 )
370 )
359
371
360 uri += '\n'
372 uri += '\n'
361 return uri
373 return uri
362 return _url_func
374 return _url_func
363
375
364 return literal(annotate_highlight(filenode, url_func(repo_name), **kwargs))
376 return literal(markup_whitespace(annotate_highlight(filenode, url_func(repo_name), **kwargs)))
365
377
366
378
367 def is_following_repo(repo_name, user_id):
379 def is_following_repo(repo_name, user_id):
368 from kallithea.model.scm import ScmModel
380 from kallithea.model.scm import ScmModel
369 return ScmModel().is_following_repo(repo_name, user_id)
381 return ScmModel().is_following_repo(repo_name, user_id)
370
382
371 class _Message(object):
383 class _Message(object):
372 """A message returned by ``Flash.pop_messages()``.
384 """A message returned by ``Flash.pop_messages()``.
373
385
374 Converting the message to a string returns the message text. Instances
386 Converting the message to a string returns the message text. Instances
375 also have the following attributes:
387 also have the following attributes:
376
388
377 * ``message``: the message text.
389 * ``message``: the message text.
378 * ``category``: the category specified when the message was created.
390 * ``category``: the category specified when the message was created.
379 """
391 """
380
392
381 def __init__(self, category, message):
393 def __init__(self, category, message):
382 self.category = category
394 self.category = category
383 self.message = message
395 self.message = message
384
396
385 def __str__(self):
397 def __str__(self):
386 return self.message
398 return self.message
387
399
388 __unicode__ = __str__
400 __unicode__ = __str__
389
401
390 def __html__(self):
402 def __html__(self):
391 return escape(safe_unicode(self.message))
403 return escape(safe_unicode(self.message))
392
404
393 class Flash(_Flash):
405 class Flash(_Flash):
394
406
395 def pop_messages(self):
407 def pop_messages(self):
396 """Return all accumulated messages and delete them from the session.
408 """Return all accumulated messages and delete them from the session.
397
409
398 The return value is a list of ``Message`` objects.
410 The return value is a list of ``Message`` objects.
399 """
411 """
400 from pylons import session
412 from pylons import session
401 messages = session.pop(self.session_key, [])
413 messages = session.pop(self.session_key, [])
402 session.save()
414 session.save()
403 return [_Message(*m) for m in messages]
415 return [_Message(*m) for m in messages]
404
416
405 flash = Flash()
417 flash = Flash()
406
418
407 #==============================================================================
419 #==============================================================================
408 # SCM FILTERS available via h.
420 # SCM FILTERS available via h.
409 #==============================================================================
421 #==============================================================================
410 from kallithea.lib.vcs.utils import author_name, author_email
422 from kallithea.lib.vcs.utils import author_name, author_email
411 from kallithea.lib.utils2 import credentials_filter, age as _age
423 from kallithea.lib.utils2 import credentials_filter, age as _age
412 from kallithea.model.db import User, ChangesetStatus
424 from kallithea.model.db import User, ChangesetStatus
413
425
414 age = lambda x, y=False: _age(x, y)
426 age = lambda x, y=False: _age(x, y)
415 capitalize = lambda x: x.capitalize()
427 capitalize = lambda x: x.capitalize()
416 email = author_email
428 email = author_email
417 short_id = lambda x: x[:12]
429 short_id = lambda x: x[:12]
418 hide_credentials = lambda x: ''.join(credentials_filter(x))
430 hide_credentials = lambda x: ''.join(credentials_filter(x))
419
431
420
432
421 def show_id(cs):
433 def show_id(cs):
422 """
434 """
423 Configurable function that shows ID
435 Configurable function that shows ID
424 by default it's r123:fffeeefffeee
436 by default it's r123:fffeeefffeee
425
437
426 :param cs: changeset instance
438 :param cs: changeset instance
427 """
439 """
428 from kallithea import CONFIG
440 from kallithea import CONFIG
429 def_len = safe_int(CONFIG.get('show_sha_length', 12))
441 def_len = safe_int(CONFIG.get('show_sha_length', 12))
430 show_rev = str2bool(CONFIG.get('show_revision_number', True))
442 show_rev = str2bool(CONFIG.get('show_revision_number', True))
431
443
432 raw_id = cs.raw_id[:def_len]
444 raw_id = cs.raw_id[:def_len]
433 if show_rev:
445 if show_rev:
434 return 'r%s:%s' % (cs.revision, raw_id)
446 return 'r%s:%s' % (cs.revision, raw_id)
435 else:
447 else:
436 return '%s' % (raw_id)
448 return '%s' % (raw_id)
437
449
438
450
439 def fmt_date(date):
451 def fmt_date(date):
440 if date:
452 if date:
441 _fmt = u"%a, %d %b %Y %H:%M:%S".encode('utf8')
453 _fmt = u"%a, %d %b %Y %H:%M:%S".encode('utf8')
442 return date.strftime(_fmt).decode('utf8')
454 return date.strftime(_fmt).decode('utf8')
443
455
444 return ""
456 return ""
445
457
446
458
447 def is_git(repository):
459 def is_git(repository):
448 if hasattr(repository, 'alias'):
460 if hasattr(repository, 'alias'):
449 _type = repository.alias
461 _type = repository.alias
450 elif hasattr(repository, 'repo_type'):
462 elif hasattr(repository, 'repo_type'):
451 _type = repository.repo_type
463 _type = repository.repo_type
452 else:
464 else:
453 _type = repository
465 _type = repository
454 return _type == 'git'
466 return _type == 'git'
455
467
456
468
457 def is_hg(repository):
469 def is_hg(repository):
458 if hasattr(repository, 'alias'):
470 if hasattr(repository, 'alias'):
459 _type = repository.alias
471 _type = repository.alias
460 elif hasattr(repository, 'repo_type'):
472 elif hasattr(repository, 'repo_type'):
461 _type = repository.repo_type
473 _type = repository.repo_type
462 else:
474 else:
463 _type = repository
475 _type = repository
464 return _type == 'hg'
476 return _type == 'hg'
465
477
466
478
467 def email_or_none(author):
479 def email_or_none(author):
468 # extract email from the commit string
480 # extract email from the commit string
469 _email = email(author)
481 _email = email(author)
470 if _email != '':
482 if _email != '':
471 # check it against Kallithea database, and use the MAIN email for this
483 # check it against Kallithea database, and use the MAIN email for this
472 # user
484 # user
473 user = User.get_by_email(_email, case_insensitive=True, cache=True)
485 user = User.get_by_email(_email, case_insensitive=True, cache=True)
474 if user is not None:
486 if user is not None:
475 return user.email
487 return user.email
476 return _email
488 return _email
477
489
478 # See if it contains a username we can get an email from
490 # See if it contains a username we can get an email from
479 user = User.get_by_username(author_name(author), case_insensitive=True,
491 user = User.get_by_username(author_name(author), case_insensitive=True,
480 cache=True)
492 cache=True)
481 if user is not None:
493 if user is not None:
482 return user.email
494 return user.email
483
495
484 # No valid email, not a valid user in the system, none!
496 # No valid email, not a valid user in the system, none!
485 return None
497 return None
486
498
487
499
488 def person(author, show_attr="username_and_name"):
500 def person(author, show_attr="username_and_name"):
489 # attr to return from fetched user
501 # attr to return from fetched user
490 person_getter = lambda usr: getattr(usr, show_attr)
502 person_getter = lambda usr: getattr(usr, show_attr)
491
503
492 # if author is already an instance use it for extraction
504 # if author is already an instance use it for extraction
493 if isinstance(author, User):
505 if isinstance(author, User):
494 return person_getter(author)
506 return person_getter(author)
495
507
496 # Valid email in the attribute passed, see if they're in the system
508 # Valid email in the attribute passed, see if they're in the system
497 _email = email(author)
509 _email = email(author)
498 if _email != '':
510 if _email != '':
499 user = User.get_by_email(_email, case_insensitive=True, cache=True)
511 user = User.get_by_email(_email, case_insensitive=True, cache=True)
500 if user is not None:
512 if user is not None:
501 return person_getter(user)
513 return person_getter(user)
502
514
503 # Maybe it's a username?
515 # Maybe it's a username?
504 _author = author_name(author)
516 _author = author_name(author)
505 user = User.get_by_username(_author, case_insensitive=True,
517 user = User.get_by_username(_author, case_insensitive=True,
506 cache=True)
518 cache=True)
507 if user is not None:
519 if user is not None:
508 return person_getter(user)
520 return person_getter(user)
509
521
510 # Still nothing? Just pass back the author name if any, else the email
522 # Still nothing? Just pass back the author name if any, else the email
511 return _author or _email
523 return _author or _email
512
524
513
525
514 def person_by_id(id_, show_attr="username_and_name"):
526 def person_by_id(id_, show_attr="username_and_name"):
515 # attr to return from fetched user
527 # attr to return from fetched user
516 person_getter = lambda usr: getattr(usr, show_attr)
528 person_getter = lambda usr: getattr(usr, show_attr)
517
529
518 #maybe it's an ID ?
530 #maybe it's an ID ?
519 if str(id_).isdigit() or isinstance(id_, int):
531 if str(id_).isdigit() or isinstance(id_, int):
520 id_ = int(id_)
532 id_ = int(id_)
521 user = User.get(id_)
533 user = User.get(id_)
522 if user is not None:
534 if user is not None:
523 return person_getter(user)
535 return person_getter(user)
524 return id_
536 return id_
525
537
526
538
527 def desc_stylize(value):
539 def desc_stylize(value):
528 """
540 """
529 converts tags from value into html equivalent
541 converts tags from value into html equivalent
530
542
531 :param value:
543 :param value:
532 """
544 """
533 if not value:
545 if not value:
534 return ''
546 return ''
535
547
536 value = re.sub(r'\[see\ \=\>\ *([a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\]',
548 value = re.sub(r'\[see\ \=\>\ *([a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\]',
537 '<div class="metatag" tag="see">see =&gt; \\1 </div>', value)
549 '<div class="metatag" tag="see">see =&gt; \\1 </div>', value)
538 value = re.sub(r'\[license\ \=\>\ *([a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\]',
550 value = re.sub(r'\[license\ \=\>\ *([a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\]',
539 '<div class="metatag" tag="license"><a href="http:\/\/www.opensource.org/licenses/\\1">\\1</a></div>', value)
551 '<div class="metatag" tag="license"><a href="http:\/\/www.opensource.org/licenses/\\1">\\1</a></div>', value)
540 value = re.sub(r'\[(requires|recommends|conflicts|base)\ \=\>\ *([a-zA-Z0-9\-\/]*)\]',
552 value = re.sub(r'\[(requires|recommends|conflicts|base)\ \=\>\ *([a-zA-Z0-9\-\/]*)\]',
541 '<div class="metatag" tag="\\1">\\1 =&gt; <a href="/\\2">\\2</a></div>', value)
553 '<div class="metatag" tag="\\1">\\1 =&gt; <a href="/\\2">\\2</a></div>', value)
542 value = re.sub(r'\[(lang|language)\ \=\>\ *([a-zA-Z\-\/\#\+]*)\]',
554 value = re.sub(r'\[(lang|language)\ \=\>\ *([a-zA-Z\-\/\#\+]*)\]',
543 '<div class="metatag" tag="lang">\\2</div>', value)
555 '<div class="metatag" tag="lang">\\2</div>', value)
544 value = re.sub(r'\[([a-z]+)\]',
556 value = re.sub(r'\[([a-z]+)\]',
545 '<div class="metatag" tag="\\1">\\1</div>', value)
557 '<div class="metatag" tag="\\1">\\1</div>', value)
546
558
547 return value
559 return value
548
560
549
561
550 def boolicon(value):
562 def boolicon(value):
551 """Returns boolean value of a value, represented as small html image of true/false
563 """Returns boolean value of a value, represented as small html image of true/false
552 icons
564 icons
553
565
554 :param value: value
566 :param value: value
555 """
567 """
556
568
557 if value:
569 if value:
558 return HTML.tag('i', class_="icon-ok-sign")
570 return HTML.tag('i', class_="icon-ok-sign")
559 else:
571 else:
560 return HTML.tag('i', class_="icon-minus-sign")
572 return HTML.tag('i', class_="icon-minus-sign")
561
573
562
574
563 def action_parser(user_log, feed=False, parse_cs=False):
575 def action_parser(user_log, feed=False, parse_cs=False):
564 """
576 """
565 This helper will action_map the specified string action into translated
577 This helper will action_map the specified string action into translated
566 fancy names with icons and links
578 fancy names with icons and links
567
579
568 :param user_log: user log instance
580 :param user_log: user log instance
569 :param feed: use output for feeds (no html and fancy icons)
581 :param feed: use output for feeds (no html and fancy icons)
570 :param parse_cs: parse Changesets into VCS instances
582 :param parse_cs: parse Changesets into VCS instances
571 """
583 """
572
584
573 action = user_log.action
585 action = user_log.action
574 action_params = ' '
586 action_params = ' '
575
587
576 x = action.split(':')
588 x = action.split(':')
577
589
578 if len(x) > 1:
590 if len(x) > 1:
579 action, action_params = x
591 action, action_params = x
580
592
581 def get_cs_links():
593 def get_cs_links():
582 revs_limit = 3 # display this amount always
594 revs_limit = 3 # display this amount always
583 revs_top_limit = 50 # show upto this amount of changesets hidden
595 revs_top_limit = 50 # show upto this amount of changesets hidden
584 revs_ids = action_params.split(',')
596 revs_ids = action_params.split(',')
585 deleted = user_log.repository is None
597 deleted = user_log.repository is None
586 if deleted:
598 if deleted:
587 return ','.join(revs_ids)
599 return ','.join(revs_ids)
588
600
589 repo_name = user_log.repository.repo_name
601 repo_name = user_log.repository.repo_name
590
602
591 def lnk(rev, repo_name):
603 def lnk(rev, repo_name):
592 if isinstance(rev, BaseChangeset) or isinstance(rev, AttributeDict):
604 if isinstance(rev, BaseChangeset) or isinstance(rev, AttributeDict):
593 lazy_cs = True
605 lazy_cs = True
594 if getattr(rev, 'op', None) and getattr(rev, 'ref_name', None):
606 if getattr(rev, 'op', None) and getattr(rev, 'ref_name', None):
595 lazy_cs = False
607 lazy_cs = False
596 lbl = '?'
608 lbl = '?'
597 if rev.op == 'delete_branch':
609 if rev.op == 'delete_branch':
598 lbl = '%s' % _('Deleted branch: %s') % rev.ref_name
610 lbl = '%s' % _('Deleted branch: %s') % rev.ref_name
599 title = ''
611 title = ''
600 elif rev.op == 'tag':
612 elif rev.op == 'tag':
601 lbl = '%s' % _('Created tag: %s') % rev.ref_name
613 lbl = '%s' % _('Created tag: %s') % rev.ref_name
602 title = ''
614 title = ''
603 _url = '#'
615 _url = '#'
604
616
605 else:
617 else:
606 lbl = '%s' % (rev.short_id[:8])
618 lbl = '%s' % (rev.short_id[:8])
607 _url = url('changeset_home', repo_name=repo_name,
619 _url = url('changeset_home', repo_name=repo_name,
608 revision=rev.raw_id)
620 revision=rev.raw_id)
609 title = tooltip(rev.message)
621 title = tooltip(rev.message)
610 else:
622 else:
611 ## changeset cannot be found/striped/removed etc.
623 ## changeset cannot be found/striped/removed etc.
612 lbl = ('%s' % rev)[:12]
624 lbl = ('%s' % rev)[:12]
613 _url = '#'
625 _url = '#'
614 title = _('Changeset not found')
626 title = _('Changeset not found')
615 if parse_cs:
627 if parse_cs:
616 return link_to(lbl, _url, title=title, class_='tooltip')
628 return link_to(lbl, _url, title=title, class_='tooltip')
617 return link_to(lbl, _url, raw_id=rev.raw_id, repo_name=repo_name,
629 return link_to(lbl, _url, raw_id=rev.raw_id, repo_name=repo_name,
618 class_='lazy-cs' if lazy_cs else '')
630 class_='lazy-cs' if lazy_cs else '')
619
631
620 def _get_op(rev_txt):
632 def _get_op(rev_txt):
621 _op = None
633 _op = None
622 _name = rev_txt
634 _name = rev_txt
623 if len(rev_txt.split('=>')) == 2:
635 if len(rev_txt.split('=>')) == 2:
624 _op, _name = rev_txt.split('=>')
636 _op, _name = rev_txt.split('=>')
625 return _op, _name
637 return _op, _name
626
638
627 revs = []
639 revs = []
628 if len(filter(lambda v: v != '', revs_ids)) > 0:
640 if len(filter(lambda v: v != '', revs_ids)) > 0:
629 repo = None
641 repo = None
630 for rev in revs_ids[:revs_top_limit]:
642 for rev in revs_ids[:revs_top_limit]:
631 _op, _name = _get_op(rev)
643 _op, _name = _get_op(rev)
632
644
633 # we want parsed changesets, or new log store format is bad
645 # we want parsed changesets, or new log store format is bad
634 if parse_cs:
646 if parse_cs:
635 try:
647 try:
636 if repo is None:
648 if repo is None:
637 repo = user_log.repository.scm_instance
649 repo = user_log.repository.scm_instance
638 _rev = repo.get_changeset(rev)
650 _rev = repo.get_changeset(rev)
639 revs.append(_rev)
651 revs.append(_rev)
640 except ChangesetDoesNotExistError:
652 except ChangesetDoesNotExistError:
641 log.error('cannot find revision %s in this repo' % rev)
653 log.error('cannot find revision %s in this repo' % rev)
642 revs.append(rev)
654 revs.append(rev)
643 continue
655 continue
644 else:
656 else:
645 _rev = AttributeDict({
657 _rev = AttributeDict({
646 'short_id': rev[:12],
658 'short_id': rev[:12],
647 'raw_id': rev,
659 'raw_id': rev,
648 'message': '',
660 'message': '',
649 'op': _op,
661 'op': _op,
650 'ref_name': _name
662 'ref_name': _name
651 })
663 })
652 revs.append(_rev)
664 revs.append(_rev)
653 cs_links = [" " + ', '.join(
665 cs_links = [" " + ', '.join(
654 [lnk(rev, repo_name) for rev in revs[:revs_limit]]
666 [lnk(rev, repo_name) for rev in revs[:revs_limit]]
655 )]
667 )]
656 _op1, _name1 = _get_op(revs_ids[0])
668 _op1, _name1 = _get_op(revs_ids[0])
657 _op2, _name2 = _get_op(revs_ids[-1])
669 _op2, _name2 = _get_op(revs_ids[-1])
658
670
659 _rev = '%s...%s' % (_name1, _name2)
671 _rev = '%s...%s' % (_name1, _name2)
660
672
661 compare_view = (
673 compare_view = (
662 ' <div class="compare_view tooltip" title="%s">'
674 ' <div class="compare_view tooltip" title="%s">'
663 '<a href="%s">%s</a> </div>' % (
675 '<a href="%s">%s</a> </div>' % (
664 _('Show all combined changesets %s->%s') % (
676 _('Show all combined changesets %s->%s') % (
665 revs_ids[0][:12], revs_ids[-1][:12]
677 revs_ids[0][:12], revs_ids[-1][:12]
666 ),
678 ),
667 url('changeset_home', repo_name=repo_name,
679 url('changeset_home', repo_name=repo_name,
668 revision=_rev
680 revision=_rev
669 ),
681 ),
670 _('compare view')
682 _('compare view')
671 )
683 )
672 )
684 )
673
685
674 # if we have exactly one more than normally displayed
686 # if we have exactly one more than normally displayed
675 # just display it, takes less space than displaying
687 # just display it, takes less space than displaying
676 # "and 1 more revisions"
688 # "and 1 more revisions"
677 if len(revs_ids) == revs_limit + 1:
689 if len(revs_ids) == revs_limit + 1:
678 rev = revs[revs_limit]
690 rev = revs[revs_limit]
679 cs_links.append(", " + lnk(rev, repo_name))
691 cs_links.append(", " + lnk(rev, repo_name))
680
692
681 # hidden-by-default ones
693 # hidden-by-default ones
682 if len(revs_ids) > revs_limit + 1:
694 if len(revs_ids) > revs_limit + 1:
683 uniq_id = revs_ids[0]
695 uniq_id = revs_ids[0]
684 html_tmpl = (
696 html_tmpl = (
685 '<span> %s <a class="show_more" id="_%s" '
697 '<span> %s <a class="show_more" id="_%s" '
686 'href="#more">%s</a> %s</span>'
698 'href="#more">%s</a> %s</span>'
687 )
699 )
688 if not feed:
700 if not feed:
689 cs_links.append(html_tmpl % (
701 cs_links.append(html_tmpl % (
690 _('and'),
702 _('and'),
691 uniq_id, _('%s more') % (len(revs_ids) - revs_limit),
703 uniq_id, _('%s more') % (len(revs_ids) - revs_limit),
692 _('revisions')
704 _('revisions')
693 )
705 )
694 )
706 )
695
707
696 if not feed:
708 if not feed:
697 html_tmpl = '<span id="%s" style="display:none">, %s </span>'
709 html_tmpl = '<span id="%s" style="display:none">, %s </span>'
698 else:
710 else:
699 html_tmpl = '<span id="%s"> %s </span>'
711 html_tmpl = '<span id="%s"> %s </span>'
700
712
701 morelinks = ', '.join(
713 morelinks = ', '.join(
702 [lnk(rev, repo_name) for rev in revs[revs_limit:]]
714 [lnk(rev, repo_name) for rev in revs[revs_limit:]]
703 )
715 )
704
716
705 if len(revs_ids) > revs_top_limit:
717 if len(revs_ids) > revs_top_limit:
706 morelinks += ', ...'
718 morelinks += ', ...'
707
719
708 cs_links.append(html_tmpl % (uniq_id, morelinks))
720 cs_links.append(html_tmpl % (uniq_id, morelinks))
709 if len(revs) > 1:
721 if len(revs) > 1:
710 cs_links.append(compare_view)
722 cs_links.append(compare_view)
711 return ''.join(cs_links)
723 return ''.join(cs_links)
712
724
713 def get_fork_name():
725 def get_fork_name():
714 repo_name = action_params
726 repo_name = action_params
715 _url = url('summary_home', repo_name=repo_name)
727 _url = url('summary_home', repo_name=repo_name)
716 return _('fork name %s') % link_to(action_params, _url)
728 return _('fork name %s') % link_to(action_params, _url)
717
729
718 def get_user_name():
730 def get_user_name():
719 user_name = action_params
731 user_name = action_params
720 return user_name
732 return user_name
721
733
722 def get_users_group():
734 def get_users_group():
723 group_name = action_params
735 group_name = action_params
724 return group_name
736 return group_name
725
737
726 def get_pull_request():
738 def get_pull_request():
727 pull_request_id = action_params
739 pull_request_id = action_params
728 deleted = user_log.repository is None
740 deleted = user_log.repository is None
729 if deleted:
741 if deleted:
730 repo_name = user_log.repository_name
742 repo_name = user_log.repository_name
731 else:
743 else:
732 repo_name = user_log.repository.repo_name
744 repo_name = user_log.repository.repo_name
733 return link_to(_('Pull request #%s') % pull_request_id,
745 return link_to(_('Pull request #%s') % pull_request_id,
734 url('pullrequest_show', repo_name=repo_name,
746 url('pullrequest_show', repo_name=repo_name,
735 pull_request_id=pull_request_id))
747 pull_request_id=pull_request_id))
736
748
737 def get_archive_name():
749 def get_archive_name():
738 archive_name = action_params
750 archive_name = action_params
739 return archive_name
751 return archive_name
740
752
741 # action : translated str, callback(extractor), icon
753 # action : translated str, callback(extractor), icon
742 action_map = {
754 action_map = {
743 'user_deleted_repo': (_('[deleted] repository'),
755 'user_deleted_repo': (_('[deleted] repository'),
744 None, 'icon-trash'),
756 None, 'icon-trash'),
745 'user_created_repo': (_('[created] repository'),
757 'user_created_repo': (_('[created] repository'),
746 None, 'icon-plus icon-plus-colored'),
758 None, 'icon-plus icon-plus-colored'),
747 'user_created_fork': (_('[created] repository as fork'),
759 'user_created_fork': (_('[created] repository as fork'),
748 None, 'icon-code-fork'),
760 None, 'icon-code-fork'),
749 'user_forked_repo': (_('[forked] repository'),
761 'user_forked_repo': (_('[forked] repository'),
750 get_fork_name, 'icon-code-fork'),
762 get_fork_name, 'icon-code-fork'),
751 'user_updated_repo': (_('[updated] repository'),
763 'user_updated_repo': (_('[updated] repository'),
752 None, 'icon-pencil icon-pencil-colored'),
764 None, 'icon-pencil icon-pencil-colored'),
753 'user_downloaded_archive': (_('[downloaded] archive from repository'),
765 'user_downloaded_archive': (_('[downloaded] archive from repository'),
754 get_archive_name, 'icon-download-alt'),
766 get_archive_name, 'icon-download-alt'),
755 'admin_deleted_repo': (_('[delete] repository'),
767 'admin_deleted_repo': (_('[delete] repository'),
756 None, 'icon-trash'),
768 None, 'icon-trash'),
757 'admin_created_repo': (_('[created] repository'),
769 'admin_created_repo': (_('[created] repository'),
758 None, 'icon-plus icon-plus-colored'),
770 None, 'icon-plus icon-plus-colored'),
759 'admin_forked_repo': (_('[forked] repository'),
771 'admin_forked_repo': (_('[forked] repository'),
760 None, 'icon-code-fork icon-fork-colored'),
772 None, 'icon-code-fork icon-fork-colored'),
761 'admin_updated_repo': (_('[updated] repository'),
773 'admin_updated_repo': (_('[updated] repository'),
762 None, 'icon-pencil icon-pencil-colored'),
774 None, 'icon-pencil icon-pencil-colored'),
763 'admin_created_user': (_('[created] user'),
775 'admin_created_user': (_('[created] user'),
764 get_user_name, 'icon-user icon-user-colored'),
776 get_user_name, 'icon-user icon-user-colored'),
765 'admin_updated_user': (_('[updated] user'),
777 'admin_updated_user': (_('[updated] user'),
766 get_user_name, 'icon-user icon-user-colored'),
778 get_user_name, 'icon-user icon-user-colored'),
767 'admin_created_users_group': (_('[created] user group'),
779 'admin_created_users_group': (_('[created] user group'),
768 get_users_group, 'icon-pencil icon-pencil-colored'),
780 get_users_group, 'icon-pencil icon-pencil-colored'),
769 'admin_updated_users_group': (_('[updated] user group'),
781 'admin_updated_users_group': (_('[updated] user group'),
770 get_users_group, 'icon-pencil icon-pencil-colored'),
782 get_users_group, 'icon-pencil icon-pencil-colored'),
771 'user_commented_revision': (_('[commented] on revision in repository'),
783 'user_commented_revision': (_('[commented] on revision in repository'),
772 get_cs_links, 'icon-comment icon-comment-colored'),
784 get_cs_links, 'icon-comment icon-comment-colored'),
773 'user_commented_pull_request': (_('[commented] on pull request for'),
785 'user_commented_pull_request': (_('[commented] on pull request for'),
774 get_pull_request, 'icon-comment icon-comment-colored'),
786 get_pull_request, 'icon-comment icon-comment-colored'),
775 'user_closed_pull_request': (_('[closed] pull request for'),
787 'user_closed_pull_request': (_('[closed] pull request for'),
776 get_pull_request, 'icon-check'),
788 get_pull_request, 'icon-check'),
777 'push': (_('[pushed] into'),
789 'push': (_('[pushed] into'),
778 get_cs_links, 'icon-arrow-up'),
790 get_cs_links, 'icon-arrow-up'),
779 'push_local': (_('[committed via Kallithea] into repository'),
791 'push_local': (_('[committed via Kallithea] into repository'),
780 get_cs_links, 'icon-pencil icon-pencil-colored'),
792 get_cs_links, 'icon-pencil icon-pencil-colored'),
781 'push_remote': (_('[pulled from remote] into repository'),
793 'push_remote': (_('[pulled from remote] into repository'),
782 get_cs_links, 'icon-arrow-up'),
794 get_cs_links, 'icon-arrow-up'),
783 'pull': (_('[pulled] from'),
795 'pull': (_('[pulled] from'),
784 None, 'icon-arrow-down'),
796 None, 'icon-arrow-down'),
785 'started_following_repo': (_('[started following] repository'),
797 'started_following_repo': (_('[started following] repository'),
786 None, 'icon-heart icon-heart-colored'),
798 None, 'icon-heart icon-heart-colored'),
787 'stopped_following_repo': (_('[stopped following] repository'),
799 'stopped_following_repo': (_('[stopped following] repository'),
788 None, 'icon-heart-empty icon-heart-colored'),
800 None, 'icon-heart-empty icon-heart-colored'),
789 }
801 }
790
802
791 action_str = action_map.get(action, action)
803 action_str = action_map.get(action, action)
792 if feed:
804 if feed:
793 action = action_str[0].replace('[', '').replace(']', '')
805 action = action_str[0].replace('[', '').replace(']', '')
794 else:
806 else:
795 action = action_str[0]\
807 action = action_str[0]\
796 .replace('[', '<span class="journal_highlight">')\
808 .replace('[', '<span class="journal_highlight">')\
797 .replace(']', '</span>')
809 .replace(']', '</span>')
798
810
799 action_params_func = lambda: ""
811 action_params_func = lambda: ""
800
812
801 if callable(action_str[1]):
813 if callable(action_str[1]):
802 action_params_func = action_str[1]
814 action_params_func = action_str[1]
803
815
804 def action_parser_icon():
816 def action_parser_icon():
805 action = user_log.action
817 action = user_log.action
806 action_params = None
818 action_params = None
807 x = action.split(':')
819 x = action.split(':')
808
820
809 if len(x) > 1:
821 if len(x) > 1:
810 action, action_params = x
822 action, action_params = x
811
823
812 tmpl = """<i class="%s" alt="%s"></i>"""
824 tmpl = """<i class="%s" alt="%s"></i>"""
813 ico = action_map.get(action, ['', '', ''])[2]
825 ico = action_map.get(action, ['', '', ''])[2]
814 return literal(tmpl % (ico, action))
826 return literal(tmpl % (ico, action))
815
827
816 # returned callbacks we need to call to get
828 # returned callbacks we need to call to get
817 return [lambda: literal(action), action_params_func, action_parser_icon]
829 return [lambda: literal(action), action_params_func, action_parser_icon]
818
830
819
831
820
832
821 #==============================================================================
833 #==============================================================================
822 # PERMS
834 # PERMS
823 #==============================================================================
835 #==============================================================================
824 from kallithea.lib.auth import HasPermissionAny, HasPermissionAll, \
836 from kallithea.lib.auth import HasPermissionAny, HasPermissionAll, \
825 HasRepoPermissionAny, HasRepoPermissionAll, HasRepoGroupPermissionAll, \
837 HasRepoPermissionAny, HasRepoPermissionAll, HasRepoGroupPermissionAll, \
826 HasRepoGroupPermissionAny
838 HasRepoGroupPermissionAny
827
839
828
840
829 #==============================================================================
841 #==============================================================================
830 # GRAVATAR URL
842 # GRAVATAR URL
831 #==============================================================================
843 #==============================================================================
832
844
833 def gravatar_url(email_address, size=30, ssl_enabled=True):
845 def gravatar_url(email_address, size=30, ssl_enabled=True):
834 # doh, we need to re-import those to mock it later
846 # doh, we need to re-import those to mock it later
835 from pylons import url
847 from pylons import url
836 from pylons import tmpl_context as c
848 from pylons import tmpl_context as c
837
849
838 _def = 'anonymous@kallithea-scm.org' # default gravatar
850 _def = 'anonymous@kallithea-scm.org' # default gravatar
839 _use_gravatar = c.visual.use_gravatar
851 _use_gravatar = c.visual.use_gravatar
840 _gravatar_url = c.visual.gravatar_url or User.DEFAULT_GRAVATAR_URL
852 _gravatar_url = c.visual.gravatar_url or User.DEFAULT_GRAVATAR_URL
841
853
842 email_address = email_address or _def
854 email_address = email_address or _def
843 if isinstance(email_address, unicode):
855 if isinstance(email_address, unicode):
844 #hashlib crashes on unicode items
856 #hashlib crashes on unicode items
845 email_address = safe_str(email_address)
857 email_address = safe_str(email_address)
846
858
847 if not _use_gravatar or not email_address or email_address == _def:
859 if not _use_gravatar or not email_address or email_address == _def:
848 # pick best matching size to one given in size param
860 # pick best matching size to one given in size param
849 f = lambda a, l: min(l, key=lambda x: abs(x - a))
861 f = lambda a, l: min(l, key=lambda x: abs(x - a))
850 return url("/images/user%s.png" % f(size, [14, 16, 20, 24, 30]))
862 return url("/images/user%s.png" % f(size, [14, 16, 20, 24, 30]))
851
863
852 if _use_gravatar:
864 if _use_gravatar:
853 _md5 = lambda s: hashlib.md5(s).hexdigest()
865 _md5 = lambda s: hashlib.md5(s).hexdigest()
854
866
855 tmpl = _gravatar_url
867 tmpl = _gravatar_url
856 parsed_url = urlparse.urlparse(url.current(qualified=True))
868 parsed_url = urlparse.urlparse(url.current(qualified=True))
857 tmpl = tmpl.replace('{email}', email_address)\
869 tmpl = tmpl.replace('{email}', email_address)\
858 .replace('{md5email}', _md5(email_address.lower())) \
870 .replace('{md5email}', _md5(email_address.lower())) \
859 .replace('{netloc}', parsed_url.netloc)\
871 .replace('{netloc}', parsed_url.netloc)\
860 .replace('{scheme}', parsed_url.scheme)\
872 .replace('{scheme}', parsed_url.scheme)\
861 .replace('{size}', safe_str(size))
873 .replace('{size}', safe_str(size))
862 return tmpl
874 return tmpl
863
875
864 class Page(_Page):
876 class Page(_Page):
865 """
877 """
866 Custom pager to match rendering style with YUI paginator
878 Custom pager to match rendering style with YUI paginator
867 """
879 """
868
880
869 def _get_pos(self, cur_page, max_page, items):
881 def _get_pos(self, cur_page, max_page, items):
870 edge = (items / 2) + 1
882 edge = (items / 2) + 1
871 if (cur_page <= edge):
883 if (cur_page <= edge):
872 radius = max(items / 2, items - cur_page)
884 radius = max(items / 2, items - cur_page)
873 elif (max_page - cur_page) < edge:
885 elif (max_page - cur_page) < edge:
874 radius = (items - 1) - (max_page - cur_page)
886 radius = (items - 1) - (max_page - cur_page)
875 else:
887 else:
876 radius = items / 2
888 radius = items / 2
877
889
878 left = max(1, (cur_page - (radius)))
890 left = max(1, (cur_page - (radius)))
879 right = min(max_page, cur_page + (radius))
891 right = min(max_page, cur_page + (radius))
880 return left, cur_page, right
892 return left, cur_page, right
881
893
882 def _range(self, regexp_match):
894 def _range(self, regexp_match):
883 """
895 """
884 Return range of linked pages (e.g. '1 2 [3] 4 5 6 7 8').
896 Return range of linked pages (e.g. '1 2 [3] 4 5 6 7 8').
885
897
886 Arguments:
898 Arguments:
887
899
888 regexp_match
900 regexp_match
889 A "re" (regular expressions) match object containing the
901 A "re" (regular expressions) match object containing the
890 radius of linked pages around the current page in
902 radius of linked pages around the current page in
891 regexp_match.group(1) as a string
903 regexp_match.group(1) as a string
892
904
893 This function is supposed to be called as a callable in
905 This function is supposed to be called as a callable in
894 re.sub.
906 re.sub.
895
907
896 """
908 """
897 radius = int(regexp_match.group(1))
909 radius = int(regexp_match.group(1))
898
910
899 # Compute the first and last page number within the radius
911 # Compute the first and last page number within the radius
900 # e.g. '1 .. 5 6 [7] 8 9 .. 12'
912 # e.g. '1 .. 5 6 [7] 8 9 .. 12'
901 # -> leftmost_page = 5
913 # -> leftmost_page = 5
902 # -> rightmost_page = 9
914 # -> rightmost_page = 9
903 leftmost_page, _cur, rightmost_page = self._get_pos(self.page,
915 leftmost_page, _cur, rightmost_page = self._get_pos(self.page,
904 self.last_page,
916 self.last_page,
905 (radius * 2) + 1)
917 (radius * 2) + 1)
906 nav_items = []
918 nav_items = []
907
919
908 # Create a link to the first page (unless we are on the first page
920 # Create a link to the first page (unless we are on the first page
909 # or there would be no need to insert '..' spacers)
921 # or there would be no need to insert '..' spacers)
910 if self.page != self.first_page and self.first_page < leftmost_page:
922 if self.page != self.first_page and self.first_page < leftmost_page:
911 nav_items.append(self._pagerlink(self.first_page, self.first_page))
923 nav_items.append(self._pagerlink(self.first_page, self.first_page))
912
924
913 # Insert dots if there are pages between the first page
925 # Insert dots if there are pages between the first page
914 # and the currently displayed page range
926 # and the currently displayed page range
915 if leftmost_page - self.first_page > 1:
927 if leftmost_page - self.first_page > 1:
916 # Wrap in a SPAN tag if nolink_attr is set
928 # Wrap in a SPAN tag if nolink_attr is set
917 text = '..'
929 text = '..'
918 if self.dotdot_attr:
930 if self.dotdot_attr:
919 text = HTML.span(c=text, **self.dotdot_attr)
931 text = HTML.span(c=text, **self.dotdot_attr)
920 nav_items.append(text)
932 nav_items.append(text)
921
933
922 for thispage in xrange(leftmost_page, rightmost_page + 1):
934 for thispage in xrange(leftmost_page, rightmost_page + 1):
923 # Hilight the current page number and do not use a link
935 # Hilight the current page number and do not use a link
924 if thispage == self.page:
936 if thispage == self.page:
925 text = '%s' % (thispage,)
937 text = '%s' % (thispage,)
926 # Wrap in a SPAN tag if nolink_attr is set
938 # Wrap in a SPAN tag if nolink_attr is set
927 if self.curpage_attr:
939 if self.curpage_attr:
928 text = HTML.span(c=text, **self.curpage_attr)
940 text = HTML.span(c=text, **self.curpage_attr)
929 nav_items.append(text)
941 nav_items.append(text)
930 # Otherwise create just a link to that page
942 # Otherwise create just a link to that page
931 else:
943 else:
932 text = '%s' % (thispage,)
944 text = '%s' % (thispage,)
933 nav_items.append(self._pagerlink(thispage, text))
945 nav_items.append(self._pagerlink(thispage, text))
934
946
935 # Insert dots if there are pages between the displayed
947 # Insert dots if there are pages between the displayed
936 # page numbers and the end of the page range
948 # page numbers and the end of the page range
937 if self.last_page - rightmost_page > 1:
949 if self.last_page - rightmost_page > 1:
938 text = '..'
950 text = '..'
939 # Wrap in a SPAN tag if nolink_attr is set
951 # Wrap in a SPAN tag if nolink_attr is set
940 if self.dotdot_attr:
952 if self.dotdot_attr:
941 text = HTML.span(c=text, **self.dotdot_attr)
953 text = HTML.span(c=text, **self.dotdot_attr)
942 nav_items.append(text)
954 nav_items.append(text)
943
955
944 # Create a link to the very last page (unless we are on the last
956 # Create a link to the very last page (unless we are on the last
945 # page or there would be no need to insert '..' spacers)
957 # page or there would be no need to insert '..' spacers)
946 if self.page != self.last_page and rightmost_page < self.last_page:
958 if self.page != self.last_page and rightmost_page < self.last_page:
947 nav_items.append(self._pagerlink(self.last_page, self.last_page))
959 nav_items.append(self._pagerlink(self.last_page, self.last_page))
948
960
949 #_page_link = url.current()
961 #_page_link = url.current()
950 #nav_items.append(literal('<link rel="prerender" href="%s?page=%s">' % (_page_link, str(int(self.page)+1))))
962 #nav_items.append(literal('<link rel="prerender" href="%s?page=%s">' % (_page_link, str(int(self.page)+1))))
951 #nav_items.append(literal('<link rel="prefetch" href="%s?page=%s">' % (_page_link, str(int(self.page)+1))))
963 #nav_items.append(literal('<link rel="prefetch" href="%s?page=%s">' % (_page_link, str(int(self.page)+1))))
952 return self.separator.join(nav_items)
964 return self.separator.join(nav_items)
953
965
954 def pager(self, format='~2~', page_param='page', partial_param='partial',
966 def pager(self, format='~2~', page_param='page', partial_param='partial',
955 show_if_single_page=False, separator=' ', onclick=None,
967 show_if_single_page=False, separator=' ', onclick=None,
956 symbol_first='<<', symbol_last='>>',
968 symbol_first='<<', symbol_last='>>',
957 symbol_previous='<', symbol_next='>',
969 symbol_previous='<', symbol_next='>',
958 link_attr={'class': 'pager_link', 'rel': 'prerender'},
970 link_attr={'class': 'pager_link', 'rel': 'prerender'},
959 curpage_attr={'class': 'pager_curpage'},
971 curpage_attr={'class': 'pager_curpage'},
960 dotdot_attr={'class': 'pager_dotdot'}, **kwargs):
972 dotdot_attr={'class': 'pager_dotdot'}, **kwargs):
961
973
962 self.curpage_attr = curpage_attr
974 self.curpage_attr = curpage_attr
963 self.separator = separator
975 self.separator = separator
964 self.pager_kwargs = kwargs
976 self.pager_kwargs = kwargs
965 self.page_param = page_param
977 self.page_param = page_param
966 self.partial_param = partial_param
978 self.partial_param = partial_param
967 self.onclick = onclick
979 self.onclick = onclick
968 self.link_attr = link_attr
980 self.link_attr = link_attr
969 self.dotdot_attr = dotdot_attr
981 self.dotdot_attr = dotdot_attr
970
982
971 # Don't show navigator if there is no more than one page
983 # Don't show navigator if there is no more than one page
972 if self.page_count == 0 or (self.page_count == 1 and not show_if_single_page):
984 if self.page_count == 0 or (self.page_count == 1 and not show_if_single_page):
973 return ''
985 return ''
974
986
975 from string import Template
987 from string import Template
976 # Replace ~...~ in token format by range of pages
988 # Replace ~...~ in token format by range of pages
977 result = re.sub(r'~(\d+)~', self._range, format)
989 result = re.sub(r'~(\d+)~', self._range, format)
978
990
979 # Interpolate '%' variables
991 # Interpolate '%' variables
980 result = Template(result).safe_substitute({
992 result = Template(result).safe_substitute({
981 'first_page': self.first_page,
993 'first_page': self.first_page,
982 'last_page': self.last_page,
994 'last_page': self.last_page,
983 'page': self.page,
995 'page': self.page,
984 'page_count': self.page_count,
996 'page_count': self.page_count,
985 'items_per_page': self.items_per_page,
997 'items_per_page': self.items_per_page,
986 'first_item': self.first_item,
998 'first_item': self.first_item,
987 'last_item': self.last_item,
999 'last_item': self.last_item,
988 'item_count': self.item_count,
1000 'item_count': self.item_count,
989 'link_first': self.page > self.first_page and \
1001 'link_first': self.page > self.first_page and \
990 self._pagerlink(self.first_page, symbol_first) or '',
1002 self._pagerlink(self.first_page, symbol_first) or '',
991 'link_last': self.page < self.last_page and \
1003 'link_last': self.page < self.last_page and \
992 self._pagerlink(self.last_page, symbol_last) or '',
1004 self._pagerlink(self.last_page, symbol_last) or '',
993 'link_previous': self.previous_page and \
1005 'link_previous': self.previous_page and \
994 self._pagerlink(self.previous_page, symbol_previous) \
1006 self._pagerlink(self.previous_page, symbol_previous) \
995 or HTML.span(symbol_previous, class_="yui-pg-previous"),
1007 or HTML.span(symbol_previous, class_="yui-pg-previous"),
996 'link_next': self.next_page and \
1008 'link_next': self.next_page and \
997 self._pagerlink(self.next_page, symbol_next) \
1009 self._pagerlink(self.next_page, symbol_next) \
998 or HTML.span(symbol_next, class_="yui-pg-next")
1010 or HTML.span(symbol_next, class_="yui-pg-next")
999 })
1011 })
1000
1012
1001 return literal(result)
1013 return literal(result)
1002
1014
1003
1015
1004 #==============================================================================
1016 #==============================================================================
1005 # REPO PAGER, PAGER FOR REPOSITORY
1017 # REPO PAGER, PAGER FOR REPOSITORY
1006 #==============================================================================
1018 #==============================================================================
1007 class RepoPage(Page):
1019 class RepoPage(Page):
1008
1020
1009 def __init__(self, collection, page=1, items_per_page=20,
1021 def __init__(self, collection, page=1, items_per_page=20,
1010 item_count=None, url=None, **kwargs):
1022 item_count=None, url=None, **kwargs):
1011
1023
1012 """Create a "RepoPage" instance. special pager for paging
1024 """Create a "RepoPage" instance. special pager for paging
1013 repository
1025 repository
1014 """
1026 """
1015 self._url_generator = url
1027 self._url_generator = url
1016
1028
1017 # Safe the kwargs class-wide so they can be used in the pager() method
1029 # Safe the kwargs class-wide so they can be used in the pager() method
1018 self.kwargs = kwargs
1030 self.kwargs = kwargs
1019
1031
1020 # Save a reference to the collection
1032 # Save a reference to the collection
1021 self.original_collection = collection
1033 self.original_collection = collection
1022
1034
1023 self.collection = collection
1035 self.collection = collection
1024
1036
1025 # The self.page is the number of the current page.
1037 # The self.page is the number of the current page.
1026 # The first page has the number 1!
1038 # The first page has the number 1!
1027 try:
1039 try:
1028 self.page = int(page) # make it int() if we get it as a string
1040 self.page = int(page) # make it int() if we get it as a string
1029 except (ValueError, TypeError):
1041 except (ValueError, TypeError):
1030 self.page = 1
1042 self.page = 1
1031
1043
1032 self.items_per_page = items_per_page
1044 self.items_per_page = items_per_page
1033
1045
1034 # Unless the user tells us how many items the collections has
1046 # Unless the user tells us how many items the collections has
1035 # we calculate that ourselves.
1047 # we calculate that ourselves.
1036 if item_count is not None:
1048 if item_count is not None:
1037 self.item_count = item_count
1049 self.item_count = item_count
1038 else:
1050 else:
1039 self.item_count = len(self.collection)
1051 self.item_count = len(self.collection)
1040
1052
1041 # Compute the number of the first and last available page
1053 # Compute the number of the first and last available page
1042 if self.item_count > 0:
1054 if self.item_count > 0:
1043 self.first_page = 1
1055 self.first_page = 1
1044 self.page_count = int(math.ceil(float(self.item_count) /
1056 self.page_count = int(math.ceil(float(self.item_count) /
1045 self.items_per_page))
1057 self.items_per_page))
1046 self.last_page = self.first_page + self.page_count - 1
1058 self.last_page = self.first_page + self.page_count - 1
1047
1059
1048 # Make sure that the requested page number is the range of
1060 # Make sure that the requested page number is the range of
1049 # valid pages
1061 # valid pages
1050 if self.page > self.last_page:
1062 if self.page > self.last_page:
1051 self.page = self.last_page
1063 self.page = self.last_page
1052 elif self.page < self.first_page:
1064 elif self.page < self.first_page:
1053 self.page = self.first_page
1065 self.page = self.first_page
1054
1066
1055 # Note: the number of items on this page can be less than
1067 # Note: the number of items on this page can be less than
1056 # items_per_page if the last page is not full
1068 # items_per_page if the last page is not full
1057 self.first_item = max(0, (self.item_count) - (self.page *
1069 self.first_item = max(0, (self.item_count) - (self.page *
1058 items_per_page))
1070 items_per_page))
1059 self.last_item = ((self.item_count - 1) - items_per_page *
1071 self.last_item = ((self.item_count - 1) - items_per_page *
1060 (self.page - 1))
1072 (self.page - 1))
1061
1073
1062 self.items = list(self.collection[self.first_item:self.last_item + 1])
1074 self.items = list(self.collection[self.first_item:self.last_item + 1])
1063
1075
1064 # Links to previous and next page
1076 # Links to previous and next page
1065 if self.page > self.first_page:
1077 if self.page > self.first_page:
1066 self.previous_page = self.page - 1
1078 self.previous_page = self.page - 1
1067 else:
1079 else:
1068 self.previous_page = None
1080 self.previous_page = None
1069
1081
1070 if self.page < self.last_page:
1082 if self.page < self.last_page:
1071 self.next_page = self.page + 1
1083 self.next_page = self.page + 1
1072 else:
1084 else:
1073 self.next_page = None
1085 self.next_page = None
1074
1086
1075 # No items available
1087 # No items available
1076 else:
1088 else:
1077 self.first_page = None
1089 self.first_page = None
1078 self.page_count = 0
1090 self.page_count = 0
1079 self.last_page = None
1091 self.last_page = None
1080 self.first_item = None
1092 self.first_item = None
1081 self.last_item = None
1093 self.last_item = None
1082 self.previous_page = None
1094 self.previous_page = None
1083 self.next_page = None
1095 self.next_page = None
1084 self.items = []
1096 self.items = []
1085
1097
1086 # This is a subclass of the 'list' type. Initialise the list now.
1098 # This is a subclass of the 'list' type. Initialise the list now.
1087 list.__init__(self, reversed(self.items))
1099 list.__init__(self, reversed(self.items))
1088
1100
1089
1101
1090 def changed_tooltip(nodes):
1102 def changed_tooltip(nodes):
1091 """
1103 """
1092 Generates a html string for changed nodes in changeset page.
1104 Generates a html string for changed nodes in changeset page.
1093 It limits the output to 30 entries
1105 It limits the output to 30 entries
1094
1106
1095 :param nodes: LazyNodesGenerator
1107 :param nodes: LazyNodesGenerator
1096 """
1108 """
1097 if nodes:
1109 if nodes:
1098 pref = ': <br/> '
1110 pref = ': <br/> '
1099 suf = ''
1111 suf = ''
1100 if len(nodes) > 30:
1112 if len(nodes) > 30:
1101 suf = '<br/>' + _(' and %s more') % (len(nodes) - 30)
1113 suf = '<br/>' + _(' and %s more') % (len(nodes) - 30)
1102 return literal(pref + '<br/> '.join([safe_unicode(x.path)
1114 return literal(pref + '<br/> '.join([safe_unicode(x.path)
1103 for x in nodes[:30]]) + suf)
1115 for x in nodes[:30]]) + suf)
1104 else:
1116 else:
1105 return ': ' + _('No Files')
1117 return ': ' + _('No Files')
1106
1118
1107
1119
1108 def repo_link(groups_and_repos):
1120 def repo_link(groups_and_repos):
1109 """
1121 """
1110 Makes a breadcrumbs link to repo within a group
1122 Makes a breadcrumbs link to repo within a group
1111 joins &raquo; on each group to create a fancy link
1123 joins &raquo; on each group to create a fancy link
1112
1124
1113 ex::
1125 ex::
1114 group >> subgroup >> repo
1126 group >> subgroup >> repo
1115
1127
1116 :param groups_and_repos:
1128 :param groups_and_repos:
1117 :param last_url:
1129 :param last_url:
1118 """
1130 """
1119 groups, just_name, repo_name = groups_and_repos
1131 groups, just_name, repo_name = groups_and_repos
1120 last_url = url('summary_home', repo_name=repo_name)
1132 last_url = url('summary_home', repo_name=repo_name)
1121 last_link = link_to(just_name, last_url)
1133 last_link = link_to(just_name, last_url)
1122
1134
1123 def make_link(group):
1135 def make_link(group):
1124 return link_to(group.name,
1136 return link_to(group.name,
1125 url('repos_group_home', group_name=group.group_name))
1137 url('repos_group_home', group_name=group.group_name))
1126 return literal(' &raquo; '.join(map(make_link, groups) + ['<span>%s</span>' % last_link]))
1138 return literal(' &raquo; '.join(map(make_link, groups) + ['<span>%s</span>' % last_link]))
1127
1139
1128
1140
1129 def fancy_file_stats(stats):
1141 def fancy_file_stats(stats):
1130 """
1142 """
1131 Displays a fancy two colored bar for number of added/deleted
1143 Displays a fancy two colored bar for number of added/deleted
1132 lines of code on file
1144 lines of code on file
1133
1145
1134 :param stats: two element list of added/deleted lines of code
1146 :param stats: two element list of added/deleted lines of code
1135 """
1147 """
1136 from kallithea.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
1148 from kallithea.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
1137 MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE
1149 MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE
1138
1150
1139 def cgen(l_type, a_v, d_v):
1151 def cgen(l_type, a_v, d_v):
1140 mapping = {'tr': 'top-right-rounded-corner-mid',
1152 mapping = {'tr': 'top-right-rounded-corner-mid',
1141 'tl': 'top-left-rounded-corner-mid',
1153 'tl': 'top-left-rounded-corner-mid',
1142 'br': 'bottom-right-rounded-corner-mid',
1154 'br': 'bottom-right-rounded-corner-mid',
1143 'bl': 'bottom-left-rounded-corner-mid'}
1155 'bl': 'bottom-left-rounded-corner-mid'}
1144 map_getter = lambda x: mapping[x]
1156 map_getter = lambda x: mapping[x]
1145
1157
1146 if l_type == 'a' and d_v:
1158 if l_type == 'a' and d_v:
1147 #case when added and deleted are present
1159 #case when added and deleted are present
1148 return ' '.join(map(map_getter, ['tl', 'bl']))
1160 return ' '.join(map(map_getter, ['tl', 'bl']))
1149
1161
1150 if l_type == 'a' and not d_v:
1162 if l_type == 'a' and not d_v:
1151 return ' '.join(map(map_getter, ['tr', 'br', 'tl', 'bl']))
1163 return ' '.join(map(map_getter, ['tr', 'br', 'tl', 'bl']))
1152
1164
1153 if l_type == 'd' and a_v:
1165 if l_type == 'd' and a_v:
1154 return ' '.join(map(map_getter, ['tr', 'br']))
1166 return ' '.join(map(map_getter, ['tr', 'br']))
1155
1167
1156 if l_type == 'd' and not a_v:
1168 if l_type == 'd' and not a_v:
1157 return ' '.join(map(map_getter, ['tr', 'br', 'tl', 'bl']))
1169 return ' '.join(map(map_getter, ['tr', 'br', 'tl', 'bl']))
1158
1170
1159 a, d = stats['added'], stats['deleted']
1171 a, d = stats['added'], stats['deleted']
1160 width = 100
1172 width = 100
1161
1173
1162 if stats['binary']:
1174 if stats['binary']:
1163 #binary mode
1175 #binary mode
1164 lbl = ''
1176 lbl = ''
1165 bin_op = 1
1177 bin_op = 1
1166
1178
1167 if BIN_FILENODE in stats['ops']:
1179 if BIN_FILENODE in stats['ops']:
1168 lbl = 'bin+'
1180 lbl = 'bin+'
1169
1181
1170 if NEW_FILENODE in stats['ops']:
1182 if NEW_FILENODE in stats['ops']:
1171 lbl += _('new file')
1183 lbl += _('new file')
1172 bin_op = NEW_FILENODE
1184 bin_op = NEW_FILENODE
1173 elif MOD_FILENODE in stats['ops']:
1185 elif MOD_FILENODE in stats['ops']:
1174 lbl += _('mod')
1186 lbl += _('mod')
1175 bin_op = MOD_FILENODE
1187 bin_op = MOD_FILENODE
1176 elif DEL_FILENODE in stats['ops']:
1188 elif DEL_FILENODE in stats['ops']:
1177 lbl += _('del')
1189 lbl += _('del')
1178 bin_op = DEL_FILENODE
1190 bin_op = DEL_FILENODE
1179 elif RENAMED_FILENODE in stats['ops']:
1191 elif RENAMED_FILENODE in stats['ops']:
1180 lbl += _('rename')
1192 lbl += _('rename')
1181 bin_op = RENAMED_FILENODE
1193 bin_op = RENAMED_FILENODE
1182
1194
1183 #chmod can go with other operations
1195 #chmod can go with other operations
1184 if CHMOD_FILENODE in stats['ops']:
1196 if CHMOD_FILENODE in stats['ops']:
1185 _org_lbl = _('chmod')
1197 _org_lbl = _('chmod')
1186 lbl += _org_lbl if lbl.endswith('+') else '+%s' % _org_lbl
1198 lbl += _org_lbl if lbl.endswith('+') else '+%s' % _org_lbl
1187
1199
1188 #import ipdb;ipdb.set_trace()
1200 #import ipdb;ipdb.set_trace()
1189 b_d = '<div class="bin bin%s %s" style="width:100%%">%s</div>' % (bin_op, cgen('a', a_v='', d_v=0), lbl)
1201 b_d = '<div class="bin bin%s %s" style="width:100%%">%s</div>' % (bin_op, cgen('a', a_v='', d_v=0), lbl)
1190 b_a = '<div class="bin bin1" style="width:0%%"></div>'
1202 b_a = '<div class="bin bin1" style="width:0%%"></div>'
1191 return literal('<div style="width:%spx">%s%s</div>' % (width, b_a, b_d))
1203 return literal('<div style="width:%spx">%s%s</div>' % (width, b_a, b_d))
1192
1204
1193 t = stats['added'] + stats['deleted']
1205 t = stats['added'] + stats['deleted']
1194 unit = float(width) / (t or 1)
1206 unit = float(width) / (t or 1)
1195
1207
1196 # needs > 9% of width to be visible or 0 to be hidden
1208 # needs > 9% of width to be visible or 0 to be hidden
1197 a_p = max(9, unit * a) if a > 0 else 0
1209 a_p = max(9, unit * a) if a > 0 else 0
1198 d_p = max(9, unit * d) if d > 0 else 0
1210 d_p = max(9, unit * d) if d > 0 else 0
1199 p_sum = a_p + d_p
1211 p_sum = a_p + d_p
1200
1212
1201 if p_sum > width:
1213 if p_sum > width:
1202 #adjust the percentage to be == 100% since we adjusted to 9
1214 #adjust the percentage to be == 100% since we adjusted to 9
1203 if a_p > d_p:
1215 if a_p > d_p:
1204 a_p = a_p - (p_sum - width)
1216 a_p = a_p - (p_sum - width)
1205 else:
1217 else:
1206 d_p = d_p - (p_sum - width)
1218 d_p = d_p - (p_sum - width)
1207
1219
1208 a_v = a if a > 0 else ''
1220 a_v = a if a > 0 else ''
1209 d_v = d if d > 0 else ''
1221 d_v = d if d > 0 else ''
1210
1222
1211 d_a = '<div class="added %s" style="width:%s%%">%s</div>' % (
1223 d_a = '<div class="added %s" style="width:%s%%">%s</div>' % (
1212 cgen('a', a_v, d_v), a_p, a_v
1224 cgen('a', a_v, d_v), a_p, a_v
1213 )
1225 )
1214 d_d = '<div class="deleted %s" style="width:%s%%">%s</div>' % (
1226 d_d = '<div class="deleted %s" style="width:%s%%">%s</div>' % (
1215 cgen('d', a_v, d_v), d_p, d_v
1227 cgen('d', a_v, d_v), d_p, d_v
1216 )
1228 )
1217 return literal('<div style="width:%spx">%s%s</div>' % (width, d_a, d_d))
1229 return literal('<div style="width:%spx">%s%s</div>' % (width, d_a, d_d))
1218
1230
1219
1231
1220 def urlify_text(text_, safe=True):
1232 def urlify_text(text_, safe=True):
1221 """
1233 """
1222 Extrac urls from text and make html links out of them
1234 Extrac urls from text and make html links out of them
1223
1235
1224 :param text_:
1236 :param text_:
1225 """
1237 """
1226
1238
1227 url_pat = re.compile(r'''(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]'''
1239 url_pat = re.compile(r'''(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]'''
1228 '''|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)''')
1240 '''|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)''')
1229
1241
1230 def url_func(match_obj):
1242 def url_func(match_obj):
1231 url_full = match_obj.groups()[0]
1243 url_full = match_obj.groups()[0]
1232 return '<a href="%(url)s">%(url)s</a>' % ({'url': url_full})
1244 return '<a href="%(url)s">%(url)s</a>' % ({'url': url_full})
1233 _newtext = url_pat.sub(url_func, text_)
1245 _newtext = url_pat.sub(url_func, text_)
1234 if safe:
1246 if safe:
1235 return literal(_newtext)
1247 return literal(_newtext)
1236 return _newtext
1248 return _newtext
1237
1249
1238
1250
1239 def urlify_changesets(text_, repository):
1251 def urlify_changesets(text_, repository):
1240 """
1252 """
1241 Extract revision ids from changeset and make link from them
1253 Extract revision ids from changeset and make link from them
1242
1254
1243 :param text_:
1255 :param text_:
1244 :param repository: repo name to build the URL with
1256 :param repository: repo name to build the URL with
1245 """
1257 """
1246 from pylons import url # doh, we need to re-import url to mock it later
1258 from pylons import url # doh, we need to re-import url to mock it later
1247
1259
1248 def url_func(match_obj):
1260 def url_func(match_obj):
1249 rev = match_obj.group(0)
1261 rev = match_obj.group(0)
1250 return '<a class="revision-link" href="%(url)s">%(rev)s</a>' % {
1262 return '<a class="revision-link" href="%(url)s">%(rev)s</a>' % {
1251 'url': url('changeset_home', repo_name=repository, revision=rev),
1263 'url': url('changeset_home', repo_name=repository, revision=rev),
1252 'rev': rev,
1264 'rev': rev,
1253 }
1265 }
1254
1266
1255 return re.sub(r'(?:^|(?<=\s))([0-9a-fA-F]{12,40})(?=$|\s|[.,:])', url_func, text_)
1267 return re.sub(r'(?:^|(?<=\s))([0-9a-fA-F]{12,40})(?=$|\s|[.,:])', url_func, text_)
1256
1268
1257
1269
1258 def urlify_commit(text_, repository, link_=None):
1270 def urlify_commit(text_, repository, link_=None):
1259 """
1271 """
1260 Parses given text message and makes proper links.
1272 Parses given text message and makes proper links.
1261 issues are linked to given issue-server, and rest is a changeset link
1273 issues are linked to given issue-server, and rest is a changeset link
1262 if link_ is given, in other case it's a plain text
1274 if link_ is given, in other case it's a plain text
1263
1275
1264 :param text_:
1276 :param text_:
1265 :param repository:
1277 :param repository:
1266 :param link_: changeset link
1278 :param link_: changeset link
1267 """
1279 """
1268 import traceback
1280 import traceback
1269 from pylons import url # doh, we need to re-import url to mock it later
1281 from pylons import url # doh, we need to re-import url to mock it later
1270
1282
1271 def escaper(string):
1283 def escaper(string):
1272 return string.replace('<', '&lt;').replace('>', '&gt;')
1284 return string.replace('<', '&lt;').replace('>', '&gt;')
1273
1285
1274 def linkify_others(t, l):
1286 def linkify_others(t, l):
1275 urls = re.compile(r'(\<a.*?\<\/a\>)',)
1287 urls = re.compile(r'(\<a.*?\<\/a\>)',)
1276 links = []
1288 links = []
1277 for e in urls.split(t):
1289 for e in urls.split(t):
1278 if not urls.match(e):
1290 if not urls.match(e):
1279 links.append('<a class="message-link" href="%s">%s</a>' % (l, e))
1291 links.append('<a class="message-link" href="%s">%s</a>' % (l, e))
1280 else:
1292 else:
1281 links.append(e)
1293 links.append(e)
1282
1294
1283 return ''.join(links)
1295 return ''.join(links)
1284
1296
1285 # urlify changesets - extract revisions and make link out of them
1297 # urlify changesets - extract revisions and make link out of them
1286 newtext = urlify_changesets(escaper(text_), repository)
1298 newtext = urlify_changesets(escaper(text_), repository)
1287
1299
1288 # extract http/https links and make them real urls
1300 # extract http/https links and make them real urls
1289 newtext = urlify_text(newtext, safe=False)
1301 newtext = urlify_text(newtext, safe=False)
1290
1302
1291 try:
1303 try:
1292 from kallithea import CONFIG
1304 from kallithea import CONFIG
1293 conf = CONFIG
1305 conf = CONFIG
1294
1306
1295 # allow multiple issue servers to be used
1307 # allow multiple issue servers to be used
1296 valid_indices = [
1308 valid_indices = [
1297 x.group(1)
1309 x.group(1)
1298 for x in map(lambda x: re.match(r'issue_pat(.*)', x), conf.keys())
1310 for x in map(lambda x: re.match(r'issue_pat(.*)', x), conf.keys())
1299 if x and 'issue_server_link%s' % x.group(1) in conf
1311 if x and 'issue_server_link%s' % x.group(1) in conf
1300 and 'issue_prefix%s' % x.group(1) in conf
1312 and 'issue_prefix%s' % x.group(1) in conf
1301 ]
1313 ]
1302
1314
1303 log.debug('found issue server suffixes `%s` during valuation of: %s'
1315 log.debug('found issue server suffixes `%s` during valuation of: %s'
1304 % (','.join(valid_indices), newtext))
1316 % (','.join(valid_indices), newtext))
1305
1317
1306 for pattern_index in valid_indices:
1318 for pattern_index in valid_indices:
1307 ISSUE_PATTERN = conf.get('issue_pat%s' % pattern_index)
1319 ISSUE_PATTERN = conf.get('issue_pat%s' % pattern_index)
1308 ISSUE_SERVER_LNK = conf.get('issue_server_link%s' % pattern_index)
1320 ISSUE_SERVER_LNK = conf.get('issue_server_link%s' % pattern_index)
1309 ISSUE_PREFIX = conf.get('issue_prefix%s' % pattern_index)
1321 ISSUE_PREFIX = conf.get('issue_prefix%s' % pattern_index)
1310
1322
1311 log.debug('pattern suffix `%s` PAT:%s SERVER_LINK:%s PREFIX:%s'
1323 log.debug('pattern suffix `%s` PAT:%s SERVER_LINK:%s PREFIX:%s'
1312 % (pattern_index, ISSUE_PATTERN, ISSUE_SERVER_LNK,
1324 % (pattern_index, ISSUE_PATTERN, ISSUE_SERVER_LNK,
1313 ISSUE_PREFIX))
1325 ISSUE_PREFIX))
1314
1326
1315 URL_PAT = re.compile(r'%s' % ISSUE_PATTERN)
1327 URL_PAT = re.compile(r'%s' % ISSUE_PATTERN)
1316
1328
1317 def url_func(match_obj):
1329 def url_func(match_obj):
1318 pref = ''
1330 pref = ''
1319 if match_obj.group().startswith(' '):
1331 if match_obj.group().startswith(' '):
1320 pref = ' '
1332 pref = ' '
1321
1333
1322 issue_id = ''.join(match_obj.groups())
1334 issue_id = ''.join(match_obj.groups())
1323 tmpl = (
1335 tmpl = (
1324 '%(pref)s<a class="%(cls)s" href="%(url)s">'
1336 '%(pref)s<a class="%(cls)s" href="%(url)s">'
1325 '%(issue-prefix)s%(id-repr)s'
1337 '%(issue-prefix)s%(id-repr)s'
1326 '</a>'
1338 '</a>'
1327 )
1339 )
1328 url = ISSUE_SERVER_LNK.replace('{id}', issue_id)
1340 url = ISSUE_SERVER_LNK.replace('{id}', issue_id)
1329 if repository:
1341 if repository:
1330 url = url.replace('{repo}', repository)
1342 url = url.replace('{repo}', repository)
1331 repo_name = repository.split(URL_SEP)[-1]
1343 repo_name = repository.split(URL_SEP)[-1]
1332 url = url.replace('{repo_name}', repo_name)
1344 url = url.replace('{repo_name}', repo_name)
1333
1345
1334 return tmpl % {
1346 return tmpl % {
1335 'pref': pref,
1347 'pref': pref,
1336 'cls': 'issue-tracker-link',
1348 'cls': 'issue-tracker-link',
1337 'url': url,
1349 'url': url,
1338 'id-repr': issue_id,
1350 'id-repr': issue_id,
1339 'issue-prefix': ISSUE_PREFIX,
1351 'issue-prefix': ISSUE_PREFIX,
1340 'serv': ISSUE_SERVER_LNK,
1352 'serv': ISSUE_SERVER_LNK,
1341 }
1353 }
1342 newtext = URL_PAT.sub(url_func, newtext)
1354 newtext = URL_PAT.sub(url_func, newtext)
1343 log.debug('processed prefix:`%s` => %s' % (pattern_index, newtext))
1355 log.debug('processed prefix:`%s` => %s' % (pattern_index, newtext))
1344
1356
1345 # if we actually did something above
1357 # if we actually did something above
1346 if link_:
1358 if link_:
1347 # wrap not links into final link => link_
1359 # wrap not links into final link => link_
1348 newtext = linkify_others(newtext, link_)
1360 newtext = linkify_others(newtext, link_)
1349 except Exception:
1361 except Exception:
1350 log.error(traceback.format_exc())
1362 log.error(traceback.format_exc())
1351 pass
1363 pass
1352
1364
1353 return literal(newtext)
1365 return literal(newtext)
1354
1366
1355
1367
1356 def rst(source):
1368 def rst(source):
1357 return literal('<div class="rst-block">%s</div>' %
1369 return literal('<div class="rst-block">%s</div>' %
1358 MarkupRenderer.rst(source))
1370 MarkupRenderer.rst(source))
1359
1371
1360
1372
1361 def rst_w_mentions(source):
1373 def rst_w_mentions(source):
1362 """
1374 """
1363 Wrapped rst renderer with @mention highlighting
1375 Wrapped rst renderer with @mention highlighting
1364
1376
1365 :param source:
1377 :param source:
1366 """
1378 """
1367 return literal('<div class="rst-block">%s</div>' %
1379 return literal('<div class="rst-block">%s</div>' %
1368 MarkupRenderer.rst_with_mentions(source))
1380 MarkupRenderer.rst_with_mentions(source))
1369
1381
1370 def link_to_ref(repo_name, ref_type, ref_name, rev=None):
1382 def link_to_ref(repo_name, ref_type, ref_name, rev=None):
1371 """
1383 """
1372 Return full markup for a href to changeset_home for a changeset.
1384 Return full markup for a href to changeset_home for a changeset.
1373 If ref_type is branch it will link to changelog.
1385 If ref_type is branch it will link to changelog.
1374 ref_name is shortened if ref_type is 'rev'.
1386 ref_name is shortened if ref_type is 'rev'.
1375 if rev is specified show it too, explicitly linking to that revision.
1387 if rev is specified show it too, explicitly linking to that revision.
1376 """
1388 """
1377 if ref_type == 'rev':
1389 if ref_type == 'rev':
1378 txt = short_id(ref_name)
1390 txt = short_id(ref_name)
1379 else:
1391 else:
1380 txt = ref_name
1392 txt = ref_name
1381 if ref_type == 'branch':
1393 if ref_type == 'branch':
1382 u = url('changelog_home', repo_name=repo_name, branch=ref_name)
1394 u = url('changelog_home', repo_name=repo_name, branch=ref_name)
1383 else:
1395 else:
1384 u = url('changeset_home', repo_name=repo_name, revision=ref_name)
1396 u = url('changeset_home', repo_name=repo_name, revision=ref_name)
1385 l = link_to(repo_name + '#' + txt, u)
1397 l = link_to(repo_name + '#' + txt, u)
1386 if rev and ref_type != 'rev':
1398 if rev and ref_type != 'rev':
1387 l = literal('%s (%s)' % (l, link_to(short_id(rev), url('changeset_home', repo_name=repo_name, revision=rev))))
1399 l = literal('%s (%s)' % (l, link_to(short_id(rev), url('changeset_home', repo_name=repo_name, revision=rev))))
1388 return l
1400 return l
1389
1401
1390 def changeset_status(repo, revision):
1402 def changeset_status(repo, revision):
1391 return ChangesetStatusModel().get_status(repo, revision)
1403 return ChangesetStatusModel().get_status(repo, revision)
1392
1404
1393
1405
1394 def changeset_status_lbl(changeset_status):
1406 def changeset_status_lbl(changeset_status):
1395 return dict(ChangesetStatus.STATUSES).get(changeset_status)
1407 return dict(ChangesetStatus.STATUSES).get(changeset_status)
1396
1408
1397
1409
1398 def get_permission_name(key):
1410 def get_permission_name(key):
1399 return dict(Permission.PERMS).get(key)
1411 return dict(Permission.PERMS).get(key)
1400
1412
1401
1413
1402 def journal_filter_help():
1414 def journal_filter_help():
1403 return _(textwrap.dedent('''
1415 return _(textwrap.dedent('''
1404 Example filter terms:
1416 Example filter terms:
1405 repository:vcs
1417 repository:vcs
1406 username:developer
1418 username:developer
1407 action:*push*
1419 action:*push*
1408 ip:127.0.0.1
1420 ip:127.0.0.1
1409 date:20120101
1421 date:20120101
1410 date:[20120101100000 TO 20120102]
1422 date:[20120101100000 TO 20120102]
1411
1423
1412 Generate wildcards using '*' character:
1424 Generate wildcards using '*' character:
1413 "repositroy:vcs*" - search everything starting with 'vcs'
1425 "repositroy:vcs*" - search everything starting with 'vcs'
1414 "repository:*vcs*" - search for repository containing 'vcs'
1426 "repository:*vcs*" - search for repository containing 'vcs'
1415
1427
1416 Optional AND / OR operators in queries
1428 Optional AND / OR operators in queries
1417 "repository:vcs OR repository:test"
1429 "repository:vcs OR repository:test"
1418 "username:test AND repository:test*"
1430 "username:test AND repository:test*"
1419 '''))
1431 '''))
1420
1432
1421
1433
1422 def not_mapped_error(repo_name):
1434 def not_mapped_error(repo_name):
1423 flash(_('%s repository is not mapped to db perhaps'
1435 flash(_('%s repository is not mapped to db perhaps'
1424 ' it was created or renamed from the filesystem'
1436 ' it was created or renamed from the filesystem'
1425 ' please run the application again'
1437 ' please run the application again'
1426 ' in order to rescan repositories') % repo_name, category='error')
1438 ' in order to rescan repositories') % repo_name, category='error')
1427
1439
1428
1440
1429 def ip_range(ip_addr):
1441 def ip_range(ip_addr):
1430 from kallithea.model.db import UserIpMap
1442 from kallithea.model.db import UserIpMap
1431 s, e = UserIpMap._get_ip_range(ip_addr)
1443 s, e = UserIpMap._get_ip_range(ip_addr)
1432 return '%s - %s' % (s, e)
1444 return '%s - %s' % (s, e)
@@ -1,5062 +1,5079 b''
1 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td {
1 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td {
2 border: 0;
2 border: 0;
3 outline: 0;
3 outline: 0;
4 font-size: 100%;
4 font-size: 100%;
5 vertical-align: baseline;
5 vertical-align: baseline;
6 background: transparent;
6 background: transparent;
7 margin: 0;
7 margin: 0;
8 padding: 0;
8 padding: 0;
9 }
9 }
10
10
11 body {
11 body {
12 line-height: 1;
12 line-height: 1;
13 height: 100%;
13 height: 100%;
14 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
14 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
15 font-family: Lucida Grande, Verdana, Lucida Sans Regular,
15 font-family: Lucida Grande, Verdana, Lucida Sans Regular,
16 Lucida Sans Unicode, Arial, sans-serif; font-size : 12px;
16 Lucida Sans Unicode, Arial, sans-serif; font-size : 12px;
17 color: #000;
17 color: #000;
18 margin: 0;
18 margin: 0;
19 padding: 0;
19 padding: 0;
20 font-size: 12px;
20 font-size: 12px;
21 }
21 }
22
22
23 ol, ul {
23 ol, ul {
24 list-style: none;
24 list-style: none;
25 }
25 }
26
26
27 blockquote, q {
27 blockquote, q {
28 quotes: none;
28 quotes: none;
29 }
29 }
30
30
31 blockquote:before, blockquote:after, q:before, q:after {
31 blockquote:before, blockquote:after, q:before, q:after {
32 content: none;
32 content: none;
33 }
33 }
34
34
35 :focus {
35 :focus {
36 outline: 0;
36 outline: 0;
37 }
37 }
38
38
39 del {
39 del {
40 text-decoration: line-through;
40 text-decoration: line-through;
41 }
41 }
42
42
43 table {
43 table {
44 border-collapse: collapse;
44 border-collapse: collapse;
45 border-spacing: 0;
45 border-spacing: 0;
46 }
46 }
47
47
48 html {
48 html {
49 height: 100%;
49 height: 100%;
50 }
50 }
51
51
52 a {
52 a {
53 color: #577632;
53 color: #577632;
54 text-decoration: none;
54 text-decoration: none;
55 cursor: pointer;
55 cursor: pointer;
56 }
56 }
57
57
58 a:hover {
58 a:hover {
59 color: #576622;
59 color: #576622;
60 text-decoration: underline;
60 text-decoration: underline;
61 }
61 }
62
62
63 h1, h2, h3, h4, h5, h6,
63 h1, h2, h3, h4, h5, h6,
64 div.h1, div.h2, div.h3, div.h4, div.h5, div.h6 {
64 div.h1, div.h2, div.h3, div.h4, div.h5, div.h6 {
65 color: #292929;
65 color: #292929;
66 font-weight: 700;
66 font-weight: 700;
67 }
67 }
68
68
69 h1, div.h1 {
69 h1, div.h1 {
70 font-size: 22px;
70 font-size: 22px;
71 }
71 }
72
72
73 h2, div.h2 {
73 h2, div.h2 {
74 font-size: 20px;
74 font-size: 20px;
75 }
75 }
76
76
77 h3, div.h3 {
77 h3, div.h3 {
78 font-size: 18px;
78 font-size: 18px;
79 }
79 }
80
80
81 h4, div.h4 {
81 h4, div.h4 {
82 font-size: 16px;
82 font-size: 16px;
83 }
83 }
84
84
85 h5, div.h5 {
85 h5, div.h5 {
86 font-size: 14px;
86 font-size: 14px;
87 }
87 }
88
88
89 h6, div.h6 {
89 h6, div.h6 {
90 font-size: 11px;
90 font-size: 11px;
91 }
91 }
92
92
93 ul.circle {
93 ul.circle {
94 list-style-type: circle;
94 list-style-type: circle;
95 }
95 }
96
96
97 ul.disc {
97 ul.disc {
98 list-style-type: disc;
98 list-style-type: disc;
99 }
99 }
100
100
101 ul.square {
101 ul.square {
102 list-style-type: square;
102 list-style-type: square;
103 }
103 }
104
104
105 ol.lower-roman {
105 ol.lower-roman {
106 list-style-type: lower-roman;
106 list-style-type: lower-roman;
107 }
107 }
108
108
109 ol.upper-roman {
109 ol.upper-roman {
110 list-style-type: upper-roman;
110 list-style-type: upper-roman;
111 }
111 }
112
112
113 ol.lower-alpha {
113 ol.lower-alpha {
114 list-style-type: lower-alpha;
114 list-style-type: lower-alpha;
115 }
115 }
116
116
117 ol.upper-alpha {
117 ol.upper-alpha {
118 list-style-type: upper-alpha;
118 list-style-type: upper-alpha;
119 }
119 }
120
120
121 ol.decimal {
121 ol.decimal {
122 list-style-type: decimal;
122 list-style-type: decimal;
123 }
123 }
124
124
125 div.color {
125 div.color {
126 clear: both;
126 clear: both;
127 overflow: hidden;
127 overflow: hidden;
128 position: absolute;
128 position: absolute;
129 background: #FFF;
129 background: #FFF;
130 margin: 7px 0 0 60px;
130 margin: 7px 0 0 60px;
131 padding: 1px 1px 1px 0;
131 padding: 1px 1px 1px 0;
132 }
132 }
133
133
134 div.color a {
134 div.color a {
135 width: 15px;
135 width: 15px;
136 height: 15px;
136 height: 15px;
137 display: block;
137 display: block;
138 float: left;
138 float: left;
139 margin: 0 0 0 1px;
139 margin: 0 0 0 1px;
140 padding: 0;
140 padding: 0;
141 }
141 }
142
142
143 div.options {
143 div.options {
144 clear: both;
144 clear: both;
145 overflow: hidden;
145 overflow: hidden;
146 position: absolute;
146 position: absolute;
147 background: #FFF;
147 background: #FFF;
148 margin: 7px 0 0 162px;
148 margin: 7px 0 0 162px;
149 padding: 0;
149 padding: 0;
150 }
150 }
151
151
152 div.options a {
152 div.options a {
153 height: 1%;
153 height: 1%;
154 display: block;
154 display: block;
155 text-decoration: none;
155 text-decoration: none;
156 margin: 0;
156 margin: 0;
157 padding: 3px 8px;
157 padding: 3px 8px;
158 }
158 }
159
159
160 code,
160 code,
161 .code pre,
161 .code pre,
162 div.readme .readme_box pre,
162 div.readme .readme_box pre,
163 div.rst-block pre,
163 div.rst-block pre,
164 .CodeMirror .CodeMirror-code pre {
164 .CodeMirror .CodeMirror-code pre {
165 font-size: 12px;
165 font-size: 12px;
166 font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
166 font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
167 }
167 }
168
168
169 .top-left-rounded-corner {
169 .top-left-rounded-corner {
170 -webkit-border-top-left-radius: 8px;
170 -webkit-border-top-left-radius: 8px;
171 -khtml-border-radius-topleft: 8px;
171 -khtml-border-radius-topleft: 8px;
172 border-top-left-radius: 8px;
172 border-top-left-radius: 8px;
173 }
173 }
174
174
175 .top-right-rounded-corner {
175 .top-right-rounded-corner {
176 -webkit-border-top-right-radius: 8px;
176 -webkit-border-top-right-radius: 8px;
177 -khtml-border-radius-topright: 8px;
177 -khtml-border-radius-topright: 8px;
178 border-top-right-radius: 8px;
178 border-top-right-radius: 8px;
179 }
179 }
180
180
181 .bottom-left-rounded-corner {
181 .bottom-left-rounded-corner {
182 -webkit-border-bottom-left-radius: 8px;
182 -webkit-border-bottom-left-radius: 8px;
183 -khtml-border-radius-bottomleft: 8px;
183 -khtml-border-radius-bottomleft: 8px;
184 border-bottom-left-radius: 8px;
184 border-bottom-left-radius: 8px;
185 }
185 }
186
186
187 .bottom-right-rounded-corner {
187 .bottom-right-rounded-corner {
188 -webkit-border-bottom-right-radius: 8px;
188 -webkit-border-bottom-right-radius: 8px;
189 -khtml-border-radius-bottomright: 8px;
189 -khtml-border-radius-bottomright: 8px;
190 border-bottom-right-radius: 8px;
190 border-bottom-right-radius: 8px;
191 }
191 }
192
192
193 .top-left-rounded-corner-mid {
193 .top-left-rounded-corner-mid {
194 -webkit-border-top-left-radius: 4px;
194 -webkit-border-top-left-radius: 4px;
195 -khtml-border-radius-topleft: 4px;
195 -khtml-border-radius-topleft: 4px;
196 border-top-left-radius: 4px;
196 border-top-left-radius: 4px;
197 }
197 }
198
198
199 .top-right-rounded-corner-mid {
199 .top-right-rounded-corner-mid {
200 -webkit-border-top-right-radius: 4px;
200 -webkit-border-top-right-radius: 4px;
201 -khtml-border-radius-topright: 4px;
201 -khtml-border-radius-topright: 4px;
202 border-top-right-radius: 4px;
202 border-top-right-radius: 4px;
203 }
203 }
204
204
205 .bottom-left-rounded-corner-mid {
205 .bottom-left-rounded-corner-mid {
206 -webkit-border-bottom-left-radius: 4px;
206 -webkit-border-bottom-left-radius: 4px;
207 -khtml-border-radius-bottomleft: 4px;
207 -khtml-border-radius-bottomleft: 4px;
208 border-bottom-left-radius: 4px;
208 border-bottom-left-radius: 4px;
209 }
209 }
210
210
211 .bottom-right-rounded-corner-mid {
211 .bottom-right-rounded-corner-mid {
212 -webkit-border-bottom-right-radius: 4px;
212 -webkit-border-bottom-right-radius: 4px;
213 -khtml-border-radius-bottomright: 4px;
213 -khtml-border-radius-bottomright: 4px;
214 border-bottom-right-radius: 4px;
214 border-bottom-right-radius: 4px;
215 }
215 }
216
216
217 .help-block {
217 .help-block {
218 color: #999999;
218 color: #999999;
219 display: block;
219 display: block;
220 margin-bottom: 0;
220 margin-bottom: 0;
221 margin-top: 5px;
221 margin-top: 5px;
222 }
222 }
223
223
224 .empty_data {
224 .empty_data {
225 color: #B9B9B9;
225 color: #B9B9B9;
226 }
226 }
227
227
228 .truncate {
228 .truncate {
229 white-space: nowrap;
229 white-space: nowrap;
230 overflow: hidden;
230 overflow: hidden;
231 text-overflow: ellipsis;
231 text-overflow: ellipsis;
232 -o-text-overflow: ellipsis;
232 -o-text-overflow: ellipsis;
233 -ms-text-overflow: ellipsis;
233 -ms-text-overflow: ellipsis;
234 }
234 }
235
235
236 .truncate.autoexpand:hover {
236 .truncate.autoexpand:hover {
237 text-overflow: none;
237 text-overflow: none;
238 overflow: visible;
238 overflow: visible;
239 }
239 }
240
240
241 a.permalink {
241 a.permalink {
242 visibility: hidden;
242 visibility: hidden;
243 position: absolute;
243 position: absolute;
244 margin: 3px 4px;
244 margin: 3px 4px;
245 }
245 }
246
246
247 a.permalink:hover {
247 a.permalink:hover {
248 text-decoration: none;
248 text-decoration: none;
249 }
249 }
250
250
251 h1:hover > a.permalink,
251 h1:hover > a.permalink,
252 h2:hover > a.permalink,
252 h2:hover > a.permalink,
253 h3:hover > a.permalink,
253 h3:hover > a.permalink,
254 h4:hover > a.permalink,
254 h4:hover > a.permalink,
255 h5:hover > a.permalink,
255 h5:hover > a.permalink,
256 h6:hover > a.permalink,
256 h6:hover > a.permalink,
257 div:hover > a.permalink {
257 div:hover > a.permalink {
258 visibility: visible;
258 visibility: visible;
259 }
259 }
260
260
261 #header #logo {
261 #header #logo {
262 padding-left: 10px;
262 padding-left: 10px;
263 }
263 }
264
264
265 div.header img {
265 div.header img {
266 padding-top: 5px;
266 padding-top: 5px;
267 }
267 }
268
268
269 #header #logo div.header,
269 #header #logo div.header,
270 #header #logo div.branding {
270 #header #logo div.branding {
271 font-size: 20px;
271 font-size: 20px;
272 color: white;
272 color: white;
273 float: left;
273 float: left;
274 height: 44px;
274 height: 44px;
275 line-height: 44px;
275 line-height: 44px;
276 margin-right: 5px;
276 margin-right: 5px;
277 }
277 }
278
278
279 #header ul#logged-user {
279 #header ul#logged-user {
280 margin-bottom: 5px !important;
280 margin-bottom: 5px !important;
281 -webkit-border-radius: 0px 0px 8px 8px;
281 -webkit-border-radius: 0px 0px 8px 8px;
282 -khtml-border-radius: 0px 0px 8px 8px;
282 -khtml-border-radius: 0px 0px 8px 8px;
283 border-radius: 0px 0px 8px 8px;
283 border-radius: 0px 0px 8px 8px;
284 height: 37px;
284 height: 37px;
285 background-color: #577632;
285 background-color: #577632;
286 background-repeat: repeat-x;
286 background-repeat: repeat-x;
287 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
287 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
288 background-image: -moz-linear-gradient(top, #577632, #577632);
288 background-image: -moz-linear-gradient(top, #577632, #577632);
289 background-image: -ms-linear-gradient(top, #577632, #577632);
289 background-image: -ms-linear-gradient(top, #577632, #577632);
290 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
290 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
291 background-image: -webkit-linear-gradient(top, #577632, #577632);
291 background-image: -webkit-linear-gradient(top, #577632, #577632);
292 background-image: -o-linear-gradient(top, #577632, #577632);
292 background-image: -o-linear-gradient(top, #577632, #577632);
293 background-image: linear-gradient(to bottom, #577632, #577632);
293 background-image: linear-gradient(to bottom, #577632, #577632);
294 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#577632',endColorstr='#577632', GradientType=0 );
294 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#577632',endColorstr='#577632', GradientType=0 );
295 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
295 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
296 }
296 }
297
297
298 #header ul#logged-user li {
298 #header ul#logged-user li {
299 list-style: none;
299 list-style: none;
300 float: left;
300 float: left;
301 margin: 8px 0 0;
301 margin: 8px 0 0;
302 padding: 4px 12px;
302 padding: 4px 12px;
303 border-left: 1px solid #576622;
303 border-left: 1px solid #576622;
304 }
304 }
305
305
306 #header ul#logged-user li.first {
306 #header ul#logged-user li.first {
307 border-left: none;
307 border-left: none;
308 margin: 4px;
308 margin: 4px;
309 }
309 }
310
310
311 #header ul#logged-user li.first div.gravatar {
311 #header ul#logged-user li.first div.gravatar {
312 margin-top: -2px;
312 margin-top: -2px;
313 }
313 }
314
314
315 #header ul#logged-user li.first div.account {
315 #header ul#logged-user li.first div.account {
316 padding-top: 4px;
316 padding-top: 4px;
317 float: left;
317 float: left;
318 }
318 }
319
319
320 #header ul#logged-user li.last {
320 #header ul#logged-user li.last {
321 border-right: none;
321 border-right: none;
322 }
322 }
323
323
324 #header ul#logged-user li a {
324 #header ul#logged-user li a {
325 color: #fff;
325 color: #fff;
326 font-weight: 700;
326 font-weight: 700;
327 text-decoration: none;
327 text-decoration: none;
328 }
328 }
329
329
330 #header ul#logged-user li a:hover {
330 #header ul#logged-user li a:hover {
331 text-decoration: underline;
331 text-decoration: underline;
332 }
332 }
333
333
334 #header ul#logged-user li.highlight a {
334 #header ul#logged-user li.highlight a {
335 color: #fff;
335 color: #fff;
336 }
336 }
337
337
338 #header ul#logged-user li.highlight a:hover {
338 #header ul#logged-user li.highlight a:hover {
339 color: #FFF;
339 color: #FFF;
340 }
340 }
341 #header-dd {
341 #header-dd {
342 clear: both;
342 clear: both;
343 position: fixed !important;
343 position: fixed !important;
344 background-color: #577632;
344 background-color: #577632;
345 opacity: 0.01;
345 opacity: 0.01;
346 cursor: pointer;
346 cursor: pointer;
347 min-height: 10px;
347 min-height: 10px;
348 width: 100% !important;
348 width: 100% !important;
349 -webkit-border-radius: 0px 0px 4px 4px;
349 -webkit-border-radius: 0px 0px 4px 4px;
350 -khtml-border-radius: 0px 0px 4px 4px;
350 -khtml-border-radius: 0px 0px 4px 4px;
351 border-radius: 0px 0px 4px 4px;
351 border-radius: 0px 0px 4px 4px;
352 }
352 }
353
353
354 #header-dd:hover {
354 #header-dd:hover {
355 opacity: 0.2;
355 opacity: 0.2;
356 -webkit-transition: opacity 0.5s ease-in-out;
356 -webkit-transition: opacity 0.5s ease-in-out;
357 -moz-transition: opacity 0.5s ease-in-out;
357 -moz-transition: opacity 0.5s ease-in-out;
358 transition: opacity 0.5s ease-in-out;
358 transition: opacity 0.5s ease-in-out;
359 }
359 }
360
360
361 #header #header-inner {
361 #header #header-inner {
362 min-height: 44px;
362 min-height: 44px;
363 clear: both;
363 clear: both;
364 position: relative;
364 position: relative;
365 background-color: #577632;
365 background-color: #577632;
366 background-repeat: repeat-x;
366 background-repeat: repeat-x;
367 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
367 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
368 background-image: -moz-linear-gradient(top, #577632, #577632);
368 background-image: -moz-linear-gradient(top, #577632, #577632);
369 background-image: -ms-linear-gradient(top, #577632, #577632);
369 background-image: -ms-linear-gradient(top, #577632, #577632);
370 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632),color-stop(100%, #577632) );
370 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632),color-stop(100%, #577632) );
371 background-image: -webkit-linear-gradient(top, #577632, #577632);
371 background-image: -webkit-linear-gradient(top, #577632, #577632);
372 background-image: -o-linear-gradient(top, #577632, #577632);
372 background-image: -o-linear-gradient(top, #577632, #577632);
373 background-image: linear-gradient(to bottom, #577632, #577632);
373 background-image: linear-gradient(to bottom, #577632, #577632);
374 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#577632',endColorstr='#577632', GradientType=0 );
374 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#577632',endColorstr='#577632', GradientType=0 );
375 margin: 0;
375 margin: 0;
376 padding: 0;
376 padding: 0;
377 display: block;
377 display: block;
378 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
378 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
379 -webkit-border-radius: 0px 0px 4px 4px;
379 -webkit-border-radius: 0px 0px 4px 4px;
380 -khtml-border-radius: 0px 0px 4px 4px;
380 -khtml-border-radius: 0px 0px 4px 4px;
381 border-radius: 0px 0px 4px 4px;
381 border-radius: 0px 0px 4px 4px;
382 }
382 }
383 #header #header-inner.hover {
383 #header #header-inner.hover {
384 width: 100% !important;
384 width: 100% !important;
385 -webkit-border-radius: 0px 0px 0px 0px;
385 -webkit-border-radius: 0px 0px 0px 0px;
386 -khtml-border-radius: 0px 0px 0px 0px;
386 -khtml-border-radius: 0px 0px 0px 0px;
387 border-radius: 0px 0px 0px 0px;
387 border-radius: 0px 0px 0px 0px;
388 position: fixed !important;
388 position: fixed !important;
389 z-index: 10000;
389 z-index: 10000;
390 }
390 }
391
391
392 .ie7 #header #header-inner.hover,
392 .ie7 #header #header-inner.hover,
393 .ie8 #header #header-inner.hover,
393 .ie8 #header #header-inner.hover,
394 .ie9 #header #header-inner.hover
394 .ie9 #header #header-inner.hover
395 {
395 {
396 z-index: auto !important;
396 z-index: auto !important;
397 }
397 }
398
398
399 .header-pos-fix, .anchor {
399 .header-pos-fix, .anchor {
400 margin-top: -46px;
400 margin-top: -46px;
401 padding-top: 46px;
401 padding-top: 46px;
402 }
402 }
403
403
404 #header #header-inner #home a {
404 #header #header-inner #home a {
405 height: 40px;
405 height: 40px;
406 width: 46px;
406 width: 46px;
407 display: block;
407 display: block;
408 background-position: 0 0;
408 background-position: 0 0;
409 margin: 0;
409 margin: 0;
410 padding: 0;
410 padding: 0;
411 }
411 }
412
412
413 #header #header-inner #home a:hover {
413 #header #header-inner #home a:hover {
414 background-position: 0 -40px;
414 background-position: 0 -40px;
415 }
415 }
416
416
417 #header #header-inner #logo {
417 #header #header-inner #logo {
418 float: left;
418 float: left;
419 position: absolute;
419 position: absolute;
420 }
420 }
421
421
422 #header #header-inner #logo h1 {
422 #header #header-inner #logo h1 {
423 color: #FFF;
423 color: #FFF;
424 font-size: 20px;
424 font-size: 20px;
425 margin: 12px 0 0 13px;
425 margin: 12px 0 0 13px;
426 padding: 0;
426 padding: 0;
427 }
427 }
428
428
429 #header #header-inner #logo a {
429 #header #header-inner #logo a {
430 color: #fff;
430 color: #fff;
431 text-decoration: none;
431 text-decoration: none;
432 }
432 }
433
433
434 #header #header-inner #logo a:hover {
434 #header #header-inner #logo a:hover {
435 color: #bfe3ff;
435 color: #bfe3ff;
436 }
436 }
437
437
438 #header #header-inner #quick {
438 #header #header-inner #quick {
439 position: relative;
439 position: relative;
440 float: right;
440 float: right;
441 list-style-type: none;
441 list-style-type: none;
442 list-style-position: outside;
442 list-style-position: outside;
443 margin: 4px 8px 0 0;
443 margin: 4px 8px 0 0;
444 padding: 0;
444 padding: 0;
445 border-radius: 4px;
445 border-radius: 4px;
446 }
446 }
447
447
448 #header #header-inner #quick li span.short {
448 #header #header-inner #quick li span.short {
449 padding: 9px 6px 8px 6px;
449 padding: 9px 6px 8px 6px;
450 }
450 }
451
451
452 #header #header-inner #quick li span {
452 #header #header-inner #quick li span {
453 display: inline;
453 display: inline;
454 margin: 0;
454 margin: 0;
455 }
455 }
456
456
457 #header #header-inner #quick li span.normal {
457 #header #header-inner #quick li span.normal {
458 border: none;
458 border: none;
459 padding: 10px 12px 8px;
459 padding: 10px 12px 8px;
460 }
460 }
461
461
462 #header #header-inner #quick li span.icon {
462 #header #header-inner #quick li span.icon {
463 border-left: none;
463 border-left: none;
464 padding-left: 10px;
464 padding-left: 10px;
465 }
465 }
466
466
467 #header #header-inner #quick li span.icon_short {
467 #header #header-inner #quick li span.icon_short {
468 top: 0;
468 top: 0;
469 left: 0;
469 left: 0;
470 border-left: none;
470 border-left: none;
471 border-right: 1px solid #2e5c89;
471 border-right: 1px solid #2e5c89;
472 padding: 8px 6px 4px;
472 padding: 8px 6px 4px;
473 }
473 }
474
474
475 #header #header-inner #quick li span.icon img, #header #header-inner #quick li span.icon_short img {
475 #header #header-inner #quick li span.icon img, #header #header-inner #quick li span.icon_short img {
476 vertical-align: middle;
476 vertical-align: middle;
477 margin-bottom: 2px;
477 margin-bottom: 2px;
478 }
478 }
479
479
480 #header #header-inner #quick ul.repo_switcher {
480 #header #header-inner #quick ul.repo_switcher {
481 max-height: 275px;
481 max-height: 275px;
482 overflow-x: hidden;
482 overflow-x: hidden;
483 overflow-y: auto;
483 overflow-y: auto;
484 }
484 }
485
485
486 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
486 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
487 padding: 2px 3px;
487 padding: 2px 3px;
488 padding-right: 17px;
488 padding-right: 17px;
489 }
489 }
490
490
491 #header #header-inner #quick ul.repo_switcher li.qfilter_rs input {
491 #header #header-inner #quick ul.repo_switcher li.qfilter_rs input {
492 width: 100%;
492 width: 100%;
493 border-radius: 10px;
493 border-radius: 10px;
494 padding: 2px 7px;
494 padding: 2px 7px;
495 }
495 }
496
496
497 #header #header-inner #quick .repo_switcher_type {
497 #header #header-inner #quick .repo_switcher_type {
498 position: absolute;
498 position: absolute;
499 left: 0;
499 left: 0;
500 top: 9px;
500 top: 9px;
501 margin: 0px 2px 0px 2px;
501 margin: 0px 2px 0px 2px;
502 }
502 }
503
503
504 #header #header-inner #quick li ul li a.journal, #header #header-inner #quick li ul li a.journal:hover {
504 #header #header-inner #quick li ul li a.journal, #header #header-inner #quick li ul li a.journal:hover {
505 background-image: url("../images/icons/book.png");
505 background-image: url("../images/icons/book.png");
506 }
506 }
507
507
508 #header #header-inner #quick li ul li a.private_repo, #header #header-inner #quick li ul li a.private_repo:hover {
508 #header #header-inner #quick li ul li a.private_repo, #header #header-inner #quick li ul li a.private_repo:hover {
509 background-image: url("../images/icons/private_repo.png")
509 background-image: url("../images/icons/private_repo.png")
510 }
510 }
511
511
512 #header #header-inner #quick li ul li a.public_repo, #header #header-inner #quick li ul li a.public_repo:hover {
512 #header #header-inner #quick li ul li a.public_repo, #header #header-inner #quick li ul li a.public_repo:hover {
513 background-image: url("../images/icons/public_repo.png");
513 background-image: url("../images/icons/public_repo.png");
514 }
514 }
515
515
516 #header #header-inner #quick li ul li a.hg, #header #header-inner #quick li ul li a.hg:hover {
516 #header #header-inner #quick li ul li a.hg, #header #header-inner #quick li ul li a.hg:hover {
517 background-image: url("../images/icons/hgicon.png");
517 background-image: url("../images/icons/hgicon.png");
518 padding-left: 42px;
518 padding-left: 42px;
519 background-position: 20px 9px;
519 background-position: 20px 9px;
520 }
520 }
521
521
522 #header #header-inner #quick li ul li a.git, #header #header-inner #quick li ul li a.git:hover {
522 #header #header-inner #quick li ul li a.git, #header #header-inner #quick li ul li a.git:hover {
523 background-image: url("../images/icons/giticon.png");
523 background-image: url("../images/icons/giticon.png");
524 padding-left: 42px;
524 padding-left: 42px;
525 background-position: 20px 9px;
525 background-position: 20px 9px;
526 }
526 }
527
527
528 #header #header-inner #quick li ul li a.repos, #header #header-inner #quick li ul li a.repos:hover {
528 #header #header-inner #quick li ul li a.repos, #header #header-inner #quick li ul li a.repos:hover {
529 background-image: url("../images/icons/database_edit.png");
529 background-image: url("../images/icons/database_edit.png");
530 }
530 }
531
531
532 #header #header-inner #quick li ul li a.repos_groups, #header #header-inner #quick li ul li a.repos_groups:hover {
532 #header #header-inner #quick li ul li a.repos_groups, #header #header-inner #quick li ul li a.repos_groups:hover {
533 background-image: url("../images/icons/database_link.png");
533 background-image: url("../images/icons/database_link.png");
534 }
534 }
535
535
536 #header #header-inner #quick li ul li a.users, #header #header-inner #quick li ul li a.users:hover {
536 #header #header-inner #quick li ul li a.users, #header #header-inner #quick li ul li a.users:hover {
537 background-image: url("../images/icons/user_edit.png");
537 background-image: url("../images/icons/user_edit.png");
538 }
538 }
539
539
540 #header #header-inner #quick li ul li a.groups, #header #header-inner #quick li ul li a.groups:hover {
540 #header #header-inner #quick li ul li a.groups, #header #header-inner #quick li ul li a.groups:hover {
541 background-image: url("../images/icons/group_edit.png");
541 background-image: url("../images/icons/group_edit.png");
542 }
542 }
543
543
544 #header #header-inner #quick li ul li a.defaults, #header #header-inner #quick li ul li a.defaults:hover {
544 #header #header-inner #quick li ul li a.defaults, #header #header-inner #quick li ul li a.defaults:hover {
545 background-image: url("../images/icons/wrench.png");
545 background-image: url("../images/icons/wrench.png");
546 }
546 }
547
547
548 #header #header-inner #quick li ul li a.settings, #header #header-inner #quick li ul li a.settings:hover {
548 #header #header-inner #quick li ul li a.settings, #header #header-inner #quick li ul li a.settings:hover {
549 background-image: url("../images/icons/cog.png");
549 background-image: url("../images/icons/cog.png");
550 }
550 }
551
551
552 #header #header-inner #quick li ul li a.permissions, #header #header-inner #quick li ul li a.permissions:hover {
552 #header #header-inner #quick li ul li a.permissions, #header #header-inner #quick li ul li a.permissions:hover {
553 background-image: url("../images/icons/key.png");
553 background-image: url("../images/icons/key.png");
554 }
554 }
555
555
556 #header #header-inner #quick li ul li a.ldap, #header #header-inner #quick li ul li a.ldap:hover {
556 #header #header-inner #quick li ul li a.ldap, #header #header-inner #quick li ul li a.ldap:hover {
557 background-image: url("../images/icons/server_key.png");
557 background-image: url("../images/icons/server_key.png");
558 }
558 }
559
559
560 #header #header-inner #quick li ul li a.fork, #header #header-inner #quick li ul li a.fork:hover {
560 #header #header-inner #quick li ul li a.fork, #header #header-inner #quick li ul li a.fork:hover {
561 background-image: url("../images/icons/arrow_divide.png");
561 background-image: url("../images/icons/arrow_divide.png");
562 }
562 }
563
563
564 #header #header-inner #quick li ul li a.locking_add, #header #header-inner #quick li ul li a.locking_add:hover {
564 #header #header-inner #quick li ul li a.locking_add, #header #header-inner #quick li ul li a.locking_add:hover {
565 background-image: url("../images/icons/lock_add.png");
565 background-image: url("../images/icons/lock_add.png");
566 }
566 }
567
567
568 #header #header-inner #quick li ul li a.locking_del, #header #header-inner #quick li ul li a.locking_del:hover {
568 #header #header-inner #quick li ul li a.locking_del, #header #header-inner #quick li ul li a.locking_del:hover {
569 background-image: url("../images/icons/lock_delete.png");
569 background-image: url("../images/icons/lock_delete.png");
570 }
570 }
571
571
572 #header #header-inner #quick li ul li a.pull_request, #header #header-inner #quick li ul li a.pull_request:hover {
572 #header #header-inner #quick li ul li a.pull_request, #header #header-inner #quick li ul li a.pull_request:hover {
573 background-image: url("../images/icons/arrow_join.png") ;
573 background-image: url("../images/icons/arrow_join.png") ;
574 }
574 }
575
575
576 #header #header-inner #quick li ul li a.compare_request, #header #header-inner #quick li ul li a.compare_request:hover {
576 #header #header-inner #quick li ul li a.compare_request, #header #header-inner #quick li ul li a.compare_request:hover {
577 background-image: url("../images/icons/arrow_inout.png");
577 background-image: url("../images/icons/arrow_inout.png");
578 }
578 }
579
579
580 #header #header-inner #quick li ul li a.search, #header #header-inner #quick li ul li a.search:hover {
580 #header #header-inner #quick li ul li a.search, #header #header-inner #quick li ul li a.search:hover {
581 background-image: url("../images/icons/search_16.png");
581 background-image: url("../images/icons/search_16.png");
582 }
582 }
583
583
584 #header #header-inner #quick li ul li a.delete, #header #header-inner #quick li ul li a.delete:hover {
584 #header #header-inner #quick li ul li a.delete, #header #header-inner #quick li ul li a.delete:hover {
585 background-image: url("../images/icons/delete.png");
585 background-image: url("../images/icons/delete.png");
586 }
586 }
587
587
588 #header #header-inner #quick li ul li a.branches, #header #header-inner #quick li ul li a.branches:hover {
588 #header #header-inner #quick li ul li a.branches, #header #header-inner #quick li ul li a.branches:hover {
589 background-image: url("../images/icons/arrow_branch.png");
589 background-image: url("../images/icons/arrow_branch.png");
590 }
590 }
591
591
592 #header #header-inner #quick li ul li a.tags,
592 #header #header-inner #quick li ul li a.tags,
593 #header #header-inner #quick li ul li a.tags:hover {
593 #header #header-inner #quick li ul li a.tags:hover {
594 background: #FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
594 background: #FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
595 width: 167px;
595 width: 167px;
596 margin: 0;
596 margin: 0;
597 padding: 12px 9px 7px 24px;
597 padding: 12px 9px 7px 24px;
598 }
598 }
599
599
600 #header #header-inner #quick li ul li a.bookmarks,
600 #header #header-inner #quick li ul li a.bookmarks,
601 #header #header-inner #quick li ul li a.bookmarks:hover {
601 #header #header-inner #quick li ul li a.bookmarks:hover {
602 background: #FFF url("../images/icons/tag_green.png") no-repeat 4px 9px;
602 background: #FFF url("../images/icons/tag_green.png") no-repeat 4px 9px;
603 width: 167px;
603 width: 167px;
604 margin: 0;
604 margin: 0;
605 padding: 12px 9px 7px 24px;
605 padding: 12px 9px 7px 24px;
606 }
606 }
607
607
608 #header #header-inner #quick li ul li a.admin,
608 #header #header-inner #quick li ul li a.admin,
609 #header #header-inner #quick li ul li a.admin:hover {
609 #header #header-inner #quick li ul li a.admin:hover {
610 background: #FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
610 background: #FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
611 width: 167px;
611 width: 167px;
612 margin: 0;
612 margin: 0;
613 padding: 12px 9px 7px 24px;
613 padding: 12px 9px 7px 24px;
614 }
614 }
615
615
616 .groups_breadcrumbs a {
616 .groups_breadcrumbs a {
617 color: #fff;
617 color: #fff;
618 }
618 }
619
619
620 .groups_breadcrumbs a:hover {
620 .groups_breadcrumbs a:hover {
621 color: #bfe3ff;
621 color: #bfe3ff;
622 text-decoration: none;
622 text-decoration: none;
623 }
623 }
624
624
625 td.quick_repo_menu {
625 td.quick_repo_menu {
626 background: #FFF url("../images/vertical-indicator.png") 8px 50% no-repeat !important;
626 background: #FFF url("../images/vertical-indicator.png") 8px 50% no-repeat !important;
627 cursor: pointer;
627 cursor: pointer;
628 width: 8px;
628 width: 8px;
629 border: 1px solid transparent;
629 border: 1px solid transparent;
630 }
630 }
631
631
632 td.quick_repo_menu.active {
632 td.quick_repo_menu.active {
633 background: url("../images/dt-arrow-dn.png") no-repeat scroll 5px 50% #FFFFFF !important;
633 background: url("../images/dt-arrow-dn.png") no-repeat scroll 5px 50% #FFFFFF !important;
634 border: 1px solid #577632;
634 border: 1px solid #577632;
635 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
635 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
636 cursor: pointer;
636 cursor: pointer;
637 }
637 }
638
638
639 td.quick_repo_menu .menu_items {
639 td.quick_repo_menu .menu_items {
640 margin-top: 10px;
640 margin-top: 10px;
641 margin-left: -6px;
641 margin-left: -6px;
642 width: 150px;
642 width: 150px;
643 position: absolute;
643 position: absolute;
644 background-color: #FFF;
644 background-color: #FFF;
645 background: none repeat scroll 0 0 #FFFFFF;
645 background: none repeat scroll 0 0 #FFFFFF;
646 border-color: #577632 #666666 #666666;
646 border-color: #577632 #666666 #666666;
647 border-right: 1px solid #666666;
647 border-right: 1px solid #666666;
648 border-style: solid;
648 border-style: solid;
649 border-width: 1px;
649 border-width: 1px;
650 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
650 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
651 border-top-style: none;
651 border-top-style: none;
652 }
652 }
653
653
654 td.quick_repo_menu .menu_items li {
654 td.quick_repo_menu .menu_items li {
655 padding: 0 !important;
655 padding: 0 !important;
656 }
656 }
657
657
658 td.quick_repo_menu .menu_items a {
658 td.quick_repo_menu .menu_items a {
659 display: block;
659 display: block;
660 padding: 4px 12px 4px 8px;
660 padding: 4px 12px 4px 8px;
661 }
661 }
662
662
663 td.quick_repo_menu .menu_items a:hover {
663 td.quick_repo_menu .menu_items a:hover {
664 background-color: #EEE;
664 background-color: #EEE;
665 text-decoration: none;
665 text-decoration: none;
666 }
666 }
667
667
668 td.quick_repo_menu .menu_items .icon img {
668 td.quick_repo_menu .menu_items .icon img {
669 margin-bottom: -2px;
669 margin-bottom: -2px;
670 }
670 }
671
671
672 td.quick_repo_menu .menu_items.hidden {
672 td.quick_repo_menu .menu_items.hidden {
673 display: none;
673 display: none;
674 }
674 }
675
675
676 .yui-dt-first th {
676 .yui-dt-first th {
677 text-align: left;
677 text-align: left;
678 }
678 }
679
679
680 /*
680 /*
681 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
681 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
682 Code licensed under the BSD License:
682 Code licensed under the BSD License:
683 http://developer.yahoo.com/yui/license.html
683 http://developer.yahoo.com/yui/license.html
684 version: 2.9.0
684 version: 2.9.0
685 */
685 */
686 .yui-skin-sam .yui-dt-mask {
686 .yui-skin-sam .yui-dt-mask {
687 position: absolute;
687 position: absolute;
688 z-index: 9500;
688 z-index: 9500;
689 }
689 }
690 .yui-dt-tmp {
690 .yui-dt-tmp {
691 position: absolute;
691 position: absolute;
692 left: -9000px;
692 left: -9000px;
693 }
693 }
694 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
694 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
695 .yui-dt-scrollable .yui-dt-hd {
695 .yui-dt-scrollable .yui-dt-hd {
696 overflow: hidden;
696 overflow: hidden;
697 position: relative;
697 position: relative;
698 }
698 }
699 .yui-dt-scrollable .yui-dt-bd thead tr,
699 .yui-dt-scrollable .yui-dt-bd thead tr,
700 .yui-dt-scrollable .yui-dt-bd thead th {
700 .yui-dt-scrollable .yui-dt-bd thead th {
701 position: absolute;
701 position: absolute;
702 left: -1500px;
702 left: -1500px;
703 }
703 }
704 .yui-dt-scrollable tbody { -moz-outline: 0 }
704 .yui-dt-scrollable tbody { -moz-outline: 0 }
705 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
705 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
706 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
706 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
707 .yui-dt-coltarget {
707 .yui-dt-coltarget {
708 position: absolute;
708 position: absolute;
709 z-index: 999;
709 z-index: 999;
710 }
710 }
711 .yui-dt-hd { zoom: 1 }
711 .yui-dt-hd { zoom: 1 }
712 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
712 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
713 .yui-dt-resizer {
713 .yui-dt-resizer {
714 position: absolute;
714 position: absolute;
715 right: 0;
715 right: 0;
716 bottom: 0;
716 bottom: 0;
717 height: 100%;
717 height: 100%;
718 cursor: e-resize;
718 cursor: e-resize;
719 cursor: col-resize;
719 cursor: col-resize;
720 background-color: #CCC;
720 background-color: #CCC;
721 opacity: 0;
721 opacity: 0;
722 filter: alpha(opacity=0);
722 filter: alpha(opacity=0);
723 }
723 }
724 .yui-dt-resizerproxy {
724 .yui-dt-resizerproxy {
725 visibility: hidden;
725 visibility: hidden;
726 position: absolute;
726 position: absolute;
727 z-index: 9000;
727 z-index: 9000;
728 background-color: #CCC;
728 background-color: #CCC;
729 opacity: 0;
729 opacity: 0;
730 filter: alpha(opacity=0);
730 filter: alpha(opacity=0);
731 }
731 }
732 th.yui-dt-hidden .yui-dt-liner,
732 th.yui-dt-hidden .yui-dt-liner,
733 td.yui-dt-hidden .yui-dt-liner,
733 td.yui-dt-hidden .yui-dt-liner,
734 th.yui-dt-hidden .yui-dt-resizer { display: none }
734 th.yui-dt-hidden .yui-dt-resizer { display: none }
735 .yui-dt-editor,
735 .yui-dt-editor,
736 .yui-dt-editor-shim {
736 .yui-dt-editor-shim {
737 position: absolute;
737 position: absolute;
738 z-index: 9000;
738 z-index: 9000;
739 }
739 }
740 .yui-skin-sam .yui-dt table {
740 .yui-skin-sam .yui-dt table {
741 margin: 0;
741 margin: 0;
742 padding: 0;
742 padding: 0;
743 font-family: arial;
743 font-family: arial;
744 font-size: inherit;
744 font-size: inherit;
745 border-collapse: separate;
745 border-collapse: separate;
746 *border-collapse: collapse;
746 *border-collapse: collapse;
747 border-spacing: 0;
747 border-spacing: 0;
748 border: 1px solid #7f7f7f;
748 border: 1px solid #7f7f7f;
749 }
749 }
750 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
750 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
751 .yui-skin-sam .yui-dt caption {
751 .yui-skin-sam .yui-dt caption {
752 color: #000;
752 color: #000;
753 font-size: 85%;
753 font-size: 85%;
754 font-weight: normal;
754 font-weight: normal;
755 font-style: italic;
755 font-style: italic;
756 line-height: 1;
756 line-height: 1;
757 padding: 1em 0;
757 padding: 1em 0;
758 text-align: center;
758 text-align: center;
759 }
759 }
760 .yui-skin-sam .yui-dt th { background: #d8d8da url(../images/sprite.png) repeat-x 0 0 }
760 .yui-skin-sam .yui-dt th { background: #d8d8da url(../images/sprite.png) repeat-x 0 0 }
761 .yui-skin-sam .yui-dt th,
761 .yui-skin-sam .yui-dt th,
762 .yui-skin-sam .yui-dt th a {
762 .yui-skin-sam .yui-dt th a {
763 font-weight: normal;
763 font-weight: normal;
764 text-decoration: none;
764 text-decoration: none;
765 color: #000;
765 color: #000;
766 vertical-align: bottom;
766 vertical-align: bottom;
767 }
767 }
768 .yui-skin-sam .yui-dt th {
768 .yui-skin-sam .yui-dt th {
769 margin: 0;
769 margin: 0;
770 padding: 0;
770 padding: 0;
771 border: 0;
771 border: 0;
772 border-right: 1px solid #cbcbcb;
772 border-right: 1px solid #cbcbcb;
773 }
773 }
774 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
774 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
775 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
775 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
776 .yui-skin-sam .yui-dt-liner {
776 .yui-skin-sam .yui-dt-liner {
777 margin: 0;
777 margin: 0;
778 padding: 0;
778 padding: 0;
779 }
779 }
780 .yui-skin-sam .yui-dt-coltarget {
780 .yui-skin-sam .yui-dt-coltarget {
781 width: 5px;
781 width: 5px;
782 background-color: red;
782 background-color: red;
783 }
783 }
784 .yui-skin-sam .yui-dt td {
784 .yui-skin-sam .yui-dt td {
785 margin: 0;
785 margin: 0;
786 padding: 0;
786 padding: 0;
787 border: 0;
787 border: 0;
788 border-right: 1px solid #cbcbcb;
788 border-right: 1px solid #cbcbcb;
789 text-align: left;
789 text-align: left;
790 }
790 }
791 .yui-skin-sam .yui-dt-list td { border-right: 0 }
791 .yui-skin-sam .yui-dt-list td { border-right: 0 }
792 .yui-skin-sam .yui-dt-resizer { width: 6px }
792 .yui-skin-sam .yui-dt-resizer { width: 6px }
793 .yui-skin-sam .yui-dt-mask {
793 .yui-skin-sam .yui-dt-mask {
794 background-color: #000;
794 background-color: #000;
795 opacity: .25;
795 opacity: .25;
796 filter: alpha(opacity=25);
796 filter: alpha(opacity=25);
797 }
797 }
798 .yui-skin-sam .yui-dt-message { background-color: #FFF }
798 .yui-skin-sam .yui-dt-message { background-color: #FFF }
799 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
799 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
800 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
800 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
801 border-left: 1px solid #7f7f7f;
801 border-left: 1px solid #7f7f7f;
802 border-top: 1px solid #7f7f7f;
802 border-top: 1px solid #7f7f7f;
803 border-right: 1px solid #7f7f7f;
803 border-right: 1px solid #7f7f7f;
804 }
804 }
805 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
805 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
806 border-left: 1px solid #7f7f7f;
806 border-left: 1px solid #7f7f7f;
807 border-bottom: 1px solid #7f7f7f;
807 border-bottom: 1px solid #7f7f7f;
808 border-right: 1px solid #7f7f7f;
808 border-right: 1px solid #7f7f7f;
809 background-color: #FFF;
809 background-color: #FFF;
810 }
810 }
811 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
811 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
812 .yui-skin-sam th.yui-dt-asc,
812 .yui-skin-sam th.yui-dt-asc,
813 .yui-skin-sam th.yui-dt-desc { background: url(../images/sprite.png) repeat-x 0 -100px }
813 .yui-skin-sam th.yui-dt-desc { background: url(../images/sprite.png) repeat-x 0 -100px }
814 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
814 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
815 .yui-skin-sam th.yui-dt-asc .yui-dt-liner { background: url(../images/dt-arrow-up.png) no-repeat right }
815 .yui-skin-sam th.yui-dt-asc .yui-dt-liner { background: url(../images/dt-arrow-up.png) no-repeat right }
816 .yui-skin-sam th.yui-dt-desc .yui-dt-liner { background: url(../images/dt-arrow-dn.png) no-repeat right }
816 .yui-skin-sam th.yui-dt-desc .yui-dt-liner { background: url(../images/dt-arrow-dn.png) no-repeat right }
817 tbody .yui-dt-editable { cursor: pointer }
817 tbody .yui-dt-editable { cursor: pointer }
818 .yui-dt-editor {
818 .yui-dt-editor {
819 text-align: left;
819 text-align: left;
820 background-color: #f2f2f2;
820 background-color: #f2f2f2;
821 border: 1px solid #808080;
821 border: 1px solid #808080;
822 padding: 6px;
822 padding: 6px;
823 }
823 }
824 .yui-dt-editor label {
824 .yui-dt-editor label {
825 padding-left: 4px;
825 padding-left: 4px;
826 padding-right: 6px;
826 padding-right: 6px;
827 }
827 }
828 .yui-dt-editor .yui-dt-button {
828 .yui-dt-editor .yui-dt-button {
829 padding-top: 6px;
829 padding-top: 6px;
830 text-align: right;
830 text-align: right;
831 }
831 }
832 .yui-dt-editor .yui-dt-button button {
832 .yui-dt-editor .yui-dt-button button {
833 background: url(../images/sprite.png) repeat-x 0 0;
833 background: url(../images/sprite.png) repeat-x 0 0;
834 border: 1px solid #999;
834 border: 1px solid #999;
835 width: 4em;
835 width: 4em;
836 height: 1.8em;
836 height: 1.8em;
837 margin-left: 6px;
837 margin-left: 6px;
838 }
838 }
839 .yui-dt-editor .yui-dt-button button.yui-dt-default {
839 .yui-dt-editor .yui-dt-button button.yui-dt-default {
840 background: url(../images/sprite.png) repeat-x 0 -1400px;
840 background: url(../images/sprite.png) repeat-x 0 -1400px;
841 background-color: #5584e0;
841 background-color: #5584e0;
842 border: 1px solid #304369;
842 border: 1px solid #304369;
843 color: #FFF;
843 color: #FFF;
844 }
844 }
845 .yui-dt-editor .yui-dt-button button:hover {
845 .yui-dt-editor .yui-dt-button button:hover {
846 background: url(../images/sprite.png) repeat-x 0 -1300px;
846 background: url(../images/sprite.png) repeat-x 0 -1300px;
847 color: #000;
847 color: #000;
848 }
848 }
849 .yui-dt-editor .yui-dt-button button:active {
849 .yui-dt-editor .yui-dt-button button:active {
850 background: url(../images/sprite.png) repeat-x 0 -1700px;
850 background: url(../images/sprite.png) repeat-x 0 -1700px;
851 color: #000;
851 color: #000;
852 }
852 }
853 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
853 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
854 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
854 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
855 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
855 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
856 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
856 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
857 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
857 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
858 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
858 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
859 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
859 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
860 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
860 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
861 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
861 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
862 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
862 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
863 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
863 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
864 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
864 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
865 .yui-skin-sam th.yui-dt-highlighted,
865 .yui-skin-sam th.yui-dt-highlighted,
866 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
866 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
867 .yui-skin-sam tr.yui-dt-highlighted,
867 .yui-skin-sam tr.yui-dt-highlighted,
868 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
868 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
869 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
869 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
870 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
870 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
871 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
871 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
872 cursor: pointer;
872 cursor: pointer;
873 background-color: #b2d2ff;
873 background-color: #b2d2ff;
874 }
874 }
875 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
875 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
876 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
876 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
877 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
877 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
878 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
878 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
879 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
879 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
880 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
880 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
881 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
881 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
882 cursor: pointer;
882 cursor: pointer;
883 background-color: #b2d2ff;
883 background-color: #b2d2ff;
884 }
884 }
885 .yui-skin-sam th.yui-dt-selected,
885 .yui-skin-sam th.yui-dt-selected,
886 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
886 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
887 .yui-skin-sam tr.yui-dt-selected td,
887 .yui-skin-sam tr.yui-dt-selected td,
888 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
888 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
889 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
889 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
890 background-color: #426fd9;
890 background-color: #426fd9;
891 color: #FFF;
891 color: #FFF;
892 }
892 }
893 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
893 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
894 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
894 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
895 background-color: #446cd7;
895 background-color: #446cd7;
896 color: #FFF;
896 color: #FFF;
897 }
897 }
898 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
898 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
899 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
899 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
900 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
900 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
901 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
901 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
902 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
902 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
903 background-color: #426fd9;
903 background-color: #426fd9;
904 color: #FFF;
904 color: #FFF;
905 }
905 }
906 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
906 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
907 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
907 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
908 background-color: #446cd7;
908 background-color: #446cd7;
909 color: #FFF;
909 color: #FFF;
910 }
910 }
911 .yui-skin-sam .yui-dt-paginator {
911 .yui-skin-sam .yui-dt-paginator {
912 display: block;
912 display: block;
913 margin: 6px 0;
913 margin: 6px 0;
914 white-space: nowrap;
914 white-space: nowrap;
915 }
915 }
916 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
916 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
917 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
917 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
918 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
918 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
919 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
919 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
920 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
920 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
921 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
921 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
922 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
922 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
923 .yui-skin-sam a.yui-dt-page {
923 .yui-skin-sam a.yui-dt-page {
924 border: 1px solid #cbcbcb;
924 border: 1px solid #cbcbcb;
925 padding: 2px 6px;
925 padding: 2px 6px;
926 text-decoration: none;
926 text-decoration: none;
927 background-color: #fff;
927 background-color: #fff;
928 }
928 }
929 .yui-skin-sam .yui-dt-selected {
929 .yui-skin-sam .yui-dt-selected {
930 border: 1px solid #fff;
930 border: 1px solid #fff;
931 background-color: #fff;
931 background-color: #fff;
932 }
932 }
933
933
934 #content #left {
934 #content #left {
935 left: 0;
935 left: 0;
936 width: 280px;
936 width: 280px;
937 position: absolute;
937 position: absolute;
938 }
938 }
939
939
940 #content #right {
940 #content #right {
941 margin: 0 60px 10px 290px;
941 margin: 0 60px 10px 290px;
942 }
942 }
943
943
944 #content div.box {
944 #content div.box {
945 clear: both;
945 clear: both;
946 background: #fff;
946 background: #fff;
947 margin: 0 0 10px;
947 margin: 0 0 10px;
948 padding: 0 0 10px;
948 padding: 0 0 10px;
949 -webkit-border-radius: 4px 4px 4px 4px;
949 -webkit-border-radius: 4px 4px 4px 4px;
950 -khtml-border-radius: 4px 4px 4px 4px;
950 -khtml-border-radius: 4px 4px 4px 4px;
951 border-radius: 4px 4px 4px 4px;
951 border-radius: 4px 4px 4px 4px;
952 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
952 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
953 }
953 }
954
954
955 #content div.box-left {
955 #content div.box-left {
956 width: 49%;
956 width: 49%;
957 clear: none;
957 clear: none;
958 float: left;
958 float: left;
959 margin: 0 0 10px;
959 margin: 0 0 10px;
960 }
960 }
961
961
962 #content div.box-right {
962 #content div.box-right {
963 width: 49%;
963 width: 49%;
964 clear: none;
964 clear: none;
965 float: right;
965 float: right;
966 margin: 0 0 10px;
966 margin: 0 0 10px;
967 }
967 }
968
968
969 #content div.box div.title {
969 #content div.box div.title {
970 clear: both;
970 clear: both;
971 overflow: hidden;
971 overflow: hidden;
972 background-color: #577632;
972 background-color: #577632;
973 background-repeat: repeat-x;
973 background-repeat: repeat-x;
974 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
974 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
975 background-image: -moz-linear-gradient(top, #577632, #577632);
975 background-image: -moz-linear-gradient(top, #577632, #577632);
976 background-image: -ms-linear-gradient(top, #577632, #577632);
976 background-image: -ms-linear-gradient(top, #577632, #577632);
977 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
977 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
978 background-image: -webkit-linear-gradient(top, #577632, #577632);
978 background-image: -webkit-linear-gradient(top, #577632, #577632);
979 background-image: -o-linear-gradient(top, #577632, #577632);
979 background-image: -o-linear-gradient(top, #577632, #577632);
980 background-image: linear-gradient(to bottom, #577632, #577632);
980 background-image: linear-gradient(to bottom, #577632, #577632);
981 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#577632', endColorstr='#577632', GradientType=0 );
981 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#577632', endColorstr='#577632', GradientType=0 );
982 margin: 0 0 20px;
982 margin: 0 0 20px;
983 padding: 0;
983 padding: 0;
984 border-radius: 4px 4px 0 0;
984 border-radius: 4px 4px 0 0;
985 }
985 }
986
986
987 #content div.box div.title h5 {
987 #content div.box div.title h5 {
988 float: left;
988 float: left;
989 border: none;
989 border: none;
990 color: #fff;
990 color: #fff;
991 margin: 0;
991 margin: 0;
992 padding: 11px 0 11px 10px;
992 padding: 11px 0 11px 10px;
993 }
993 }
994
994
995 #content div.box div.title .link-white {
995 #content div.box div.title .link-white {
996 color: #FFFFFF;
996 color: #FFFFFF;
997 }
997 }
998
998
999 #content div.box div.title .link-white.current {
999 #content div.box div.title .link-white.current {
1000 color: #BFE3FF;
1000 color: #BFE3FF;
1001 }
1001 }
1002
1002
1003 #content div.box div.title ul.links li {
1003 #content div.box div.title ul.links li {
1004 list-style: none;
1004 list-style: none;
1005 float: left;
1005 float: left;
1006 margin: 0;
1006 margin: 0;
1007 padding: 0;
1007 padding: 0;
1008 }
1008 }
1009
1009
1010 #content div.box div.title ul.links li a {
1010 #content div.box div.title ul.links li a {
1011 font-size: 13px;
1011 font-size: 13px;
1012 font-weight: 700;
1012 font-weight: 700;
1013 height: 1%;
1013 height: 1%;
1014 margin: 4px;
1014 margin: 4px;
1015 text-decoration: none;
1015 text-decoration: none;
1016 }
1016 }
1017
1017
1018 #content div.box h1, #content div.box h2, #content div.box h3, #content div.box h4, #content div.box h5, #content div.box h6,
1018 #content div.box h1, #content div.box h2, #content div.box h3, #content div.box h4, #content div.box h5, #content div.box h6,
1019 #content div.box div.h1, #content div.box div.h2, #content div.box div.h3, #content div.box div.h4, #content div.box div.h5, #content div.box div.h6 {
1019 #content div.box div.h1, #content div.box div.h2, #content div.box div.h3, #content div.box div.h4, #content div.box div.h5, #content div.box div.h6 {
1020 clear: both;
1020 clear: both;
1021 overflow: hidden;
1021 overflow: hidden;
1022 margin: 8px 20px 5px;
1022 margin: 8px 20px 5px;
1023 }
1023 }
1024
1024
1025 #content div.box p {
1025 #content div.box p {
1026 color: #5f5f5f;
1026 color: #5f5f5f;
1027 font-size: 12px;
1027 font-size: 12px;
1028 line-height: 150%;
1028 line-height: 150%;
1029 margin: 0 24px 10px;
1029 margin: 0 24px 10px;
1030 padding: 0;
1030 padding: 0;
1031 }
1031 }
1032
1032
1033 #content div.box blockquote {
1033 #content div.box blockquote {
1034 border-left: 4px solid #DDD;
1034 border-left: 4px solid #DDD;
1035 color: #5f5f5f;
1035 color: #5f5f5f;
1036 font-size: 11px;
1036 font-size: 11px;
1037 line-height: 150%;
1037 line-height: 150%;
1038 margin: 0 34px;
1038 margin: 0 34px;
1039 padding: 0 0 0 14px;
1039 padding: 0 0 0 14px;
1040 }
1040 }
1041
1041
1042 #content div.box blockquote p {
1042 #content div.box blockquote p {
1043 margin: 10px 0;
1043 margin: 10px 0;
1044 padding: 0;
1044 padding: 0;
1045 }
1045 }
1046
1046
1047 #content div.box dl {
1047 #content div.box dl {
1048 margin: 10px 0px;
1048 margin: 10px 0px;
1049 }
1049 }
1050
1050
1051 #content div.box dt {
1051 #content div.box dt {
1052 font-size: 12px;
1052 font-size: 12px;
1053 margin: 0;
1053 margin: 0;
1054 }
1054 }
1055
1055
1056 #content div.box dd {
1056 #content div.box dd {
1057 font-size: 12px;
1057 font-size: 12px;
1058 margin: 0;
1058 margin: 0;
1059 padding: 8px 0 8px 15px;
1059 padding: 8px 0 8px 15px;
1060 }
1060 }
1061
1061
1062 #content div.box li {
1062 #content div.box li {
1063 font-size: 12px;
1063 font-size: 12px;
1064 padding: 4px 0;
1064 padding: 4px 0;
1065 }
1065 }
1066
1066
1067 #content div.box ul.disc, #content div.box ul.circle {
1067 #content div.box ul.disc, #content div.box ul.circle {
1068 margin: 10px 24px 10px 38px;
1068 margin: 10px 24px 10px 38px;
1069 }
1069 }
1070
1070
1071 #content div.box ul.square {
1071 #content div.box ul.square {
1072 margin: 10px 24px 10px 40px;
1072 margin: 10px 24px 10px 40px;
1073 }
1073 }
1074
1074
1075 #content div.box img.left {
1075 #content div.box img.left {
1076 border: none;
1076 border: none;
1077 float: left;
1077 float: left;
1078 margin: 10px 10px 10px 0;
1078 margin: 10px 10px 10px 0;
1079 }
1079 }
1080
1080
1081 #content div.box img.right {
1081 #content div.box img.right {
1082 border: none;
1082 border: none;
1083 float: right;
1083 float: right;
1084 margin: 10px 0 10px 10px;
1084 margin: 10px 0 10px 10px;
1085 }
1085 }
1086
1086
1087 #content div.box div.messages {
1087 #content div.box div.messages {
1088 clear: both;
1088 clear: both;
1089 overflow: hidden;
1089 overflow: hidden;
1090 margin: 0 20px;
1090 margin: 0 20px;
1091 padding: 0;
1091 padding: 0;
1092 }
1092 }
1093
1093
1094 #content div.box div.message {
1094 #content div.box div.message {
1095 clear: both;
1095 clear: both;
1096 overflow: hidden;
1096 overflow: hidden;
1097 margin: 0;
1097 margin: 0;
1098 padding: 5px 0;
1098 padding: 5px 0;
1099 white-space: pre-wrap;
1099 white-space: pre-wrap;
1100 }
1100 }
1101 #content div.box div.expand {
1101 #content div.box div.expand {
1102 width: 110%;
1102 width: 110%;
1103 height: 14px;
1103 height: 14px;
1104 font-size: 10px;
1104 font-size: 10px;
1105 text-align: center;
1105 text-align: center;
1106 cursor: pointer;
1106 cursor: pointer;
1107 color: #666;
1107 color: #666;
1108
1108
1109 background: -webkit-gradient(linear,0% 50%,100% 50%,color-stop(0%,rgba(255,255,255,0)),color-stop(100%,rgba(64,96,128,0.1)));
1109 background: -webkit-gradient(linear,0% 50%,100% 50%,color-stop(0%,rgba(255,255,255,0)),color-stop(100%,rgba(64,96,128,0.1)));
1110 background: -webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1110 background: -webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1111 background: -moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1111 background: -moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1112 background: -o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1112 background: -o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1113 background: -ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1113 background: -ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1114 background: linear-gradient(to bottom,rgba(255,255,255,0),rgba(64,96,128,0.1));
1114 background: linear-gradient(to bottom,rgba(255,255,255,0),rgba(64,96,128,0.1));
1115
1115
1116 display: none;
1116 display: none;
1117 overflow: hidden;
1117 overflow: hidden;
1118 }
1118 }
1119 #content div.box div.expand .expandtext {
1119 #content div.box div.expand .expandtext {
1120 background-color: #ffffff;
1120 background-color: #ffffff;
1121 padding: 2px;
1121 padding: 2px;
1122 border-radius: 2px;
1122 border-radius: 2px;
1123 }
1123 }
1124
1124
1125 #content div.box div.message a {
1125 #content div.box div.message a {
1126 font-weight: 400 !important;
1126 font-weight: 400 !important;
1127 }
1127 }
1128
1128
1129 #content div.box div.message div.image {
1129 #content div.box div.message div.image {
1130 float: left;
1130 float: left;
1131 margin: 9px 0 0 5px;
1131 margin: 9px 0 0 5px;
1132 padding: 6px;
1132 padding: 6px;
1133 }
1133 }
1134
1134
1135 #content div.box div.message div.image img {
1135 #content div.box div.message div.image img {
1136 vertical-align: middle;
1136 vertical-align: middle;
1137 margin: 0;
1137 margin: 0;
1138 }
1138 }
1139
1139
1140 #content div.box div.message div.text {
1140 #content div.box div.message div.text {
1141 float: left;
1141 float: left;
1142 margin: 0;
1142 margin: 0;
1143 padding: 9px 6px;
1143 padding: 9px 6px;
1144 }
1144 }
1145
1145
1146 #content div.box div.message div.dismiss a {
1146 #content div.box div.message div.dismiss a {
1147 height: 16px;
1147 height: 16px;
1148 width: 16px;
1148 width: 16px;
1149 display: block;
1149 display: block;
1150 background: url("../images/icons/cross.png") no-repeat;
1150 background: url("../images/icons/cross.png") no-repeat;
1151 margin: 15px 14px 0 0;
1151 margin: 15px 14px 0 0;
1152 padding: 0;
1152 padding: 0;
1153 }
1153 }
1154
1154
1155 #content div.box div.message div.text h1, #content div.box div.message div.text h2, #content div.box div.message div.text h3, #content div.box div.message div.text h4, #content div.box div.message div.text h5, #content div.box div.message div.text h6 {
1155 #content div.box div.message div.text h1, #content div.box div.message div.text h2, #content div.box div.message div.text h3, #content div.box div.message div.text h4, #content div.box div.message div.text h5, #content div.box div.message div.text h6 {
1156 border: none;
1156 border: none;
1157 margin: 0;
1157 margin: 0;
1158 padding: 0;
1158 padding: 0;
1159 }
1159 }
1160
1160
1161 #content div.box div.message div.text span {
1161 #content div.box div.message div.text span {
1162 height: 1%;
1162 height: 1%;
1163 display: block;
1163 display: block;
1164 margin: 0;
1164 margin: 0;
1165 padding: 5px 0 0;
1165 padding: 5px 0 0;
1166 }
1166 }
1167
1167
1168 #content div.box div.message-error {
1168 #content div.box div.message-error {
1169 height: 1%;
1169 height: 1%;
1170 clear: both;
1170 clear: both;
1171 overflow: hidden;
1171 overflow: hidden;
1172 background: #FBE3E4;
1172 background: #FBE3E4;
1173 border: 1px solid #FBC2C4;
1173 border: 1px solid #FBC2C4;
1174 color: #860006;
1174 color: #860006;
1175 }
1175 }
1176
1176
1177 #content div.box div.message-error h6 {
1177 #content div.box div.message-error h6 {
1178 color: #860006;
1178 color: #860006;
1179 }
1179 }
1180
1180
1181 #content div.box div.message-warning {
1181 #content div.box div.message-warning {
1182 height: 1%;
1182 height: 1%;
1183 clear: both;
1183 clear: both;
1184 overflow: hidden;
1184 overflow: hidden;
1185 background: #FFF6BF;
1185 background: #FFF6BF;
1186 border: 1px solid #FFD324;
1186 border: 1px solid #FFD324;
1187 color: #5f5200;
1187 color: #5f5200;
1188 }
1188 }
1189
1189
1190 #content div.box div.message-warning h6 {
1190 #content div.box div.message-warning h6 {
1191 color: #5f5200;
1191 color: #5f5200;
1192 }
1192 }
1193
1193
1194 #content div.box div.message-notice {
1194 #content div.box div.message-notice {
1195 height: 1%;
1195 height: 1%;
1196 clear: both;
1196 clear: both;
1197 overflow: hidden;
1197 overflow: hidden;
1198 background: #8FBDE0;
1198 background: #8FBDE0;
1199 border: 1px solid #6BACDE;
1199 border: 1px solid #6BACDE;
1200 color: #003863;
1200 color: #003863;
1201 }
1201 }
1202
1202
1203 #content div.box div.message-notice h6 {
1203 #content div.box div.message-notice h6 {
1204 color: #003863;
1204 color: #003863;
1205 }
1205 }
1206
1206
1207 #content div.box div.message-success {
1207 #content div.box div.message-success {
1208 height: 1%;
1208 height: 1%;
1209 clear: both;
1209 clear: both;
1210 overflow: hidden;
1210 overflow: hidden;
1211 background: #E6EFC2;
1211 background: #E6EFC2;
1212 border: 1px solid #C6D880;
1212 border: 1px solid #C6D880;
1213 color: #4e6100;
1213 color: #4e6100;
1214 }
1214 }
1215
1215
1216 #content div.box div.message-success h6 {
1216 #content div.box div.message-success h6 {
1217 color: #4e6100;
1217 color: #4e6100;
1218 }
1218 }
1219
1219
1220 #content div.box div.form div.fields div.field {
1220 #content div.box div.form div.fields div.field {
1221 height: 1%;
1221 height: 1%;
1222 min-height: 12px;
1222 min-height: 12px;
1223 border-bottom: 1px solid #DDD;
1223 border-bottom: 1px solid #DDD;
1224 clear: both;
1224 clear: both;
1225 margin: 0;
1225 margin: 0;
1226 padding: 10px 0;
1226 padding: 10px 0;
1227 }
1227 }
1228
1228
1229 #content div.box div.form div.fields div.field-first {
1229 #content div.box div.form div.fields div.field-first {
1230 padding: 0 0 10px;
1230 padding: 0 0 10px;
1231 }
1231 }
1232
1232
1233 #content div.box div.form div.fields div.field-noborder {
1233 #content div.box div.form div.fields div.field-noborder {
1234 border-bottom: 0 !important;
1234 border-bottom: 0 !important;
1235 }
1235 }
1236
1236
1237 #content div.box div.form div.fields div.field span.error-message {
1237 #content div.box div.form div.fields div.field span.error-message {
1238 height: 1%;
1238 height: 1%;
1239 display: inline-block;
1239 display: inline-block;
1240 color: red;
1240 color: red;
1241 margin: 8px 0 0 4px;
1241 margin: 8px 0 0 4px;
1242 padding: 0;
1242 padding: 0;
1243 }
1243 }
1244
1244
1245 #content div.box div.form div.fields div.field span.success {
1245 #content div.box div.form div.fields div.field span.success {
1246 height: 1%;
1246 height: 1%;
1247 display: block;
1247 display: block;
1248 color: #316309;
1248 color: #316309;
1249 margin: 8px 0 0;
1249 margin: 8px 0 0;
1250 padding: 0;
1250 padding: 0;
1251 }
1251 }
1252
1252
1253 #content div.box div.form div.fields div.field div.label {
1253 #content div.box div.form div.fields div.field div.label {
1254 left: 70px;
1254 left: 70px;
1255 width: 155px;
1255 width: 155px;
1256 position: absolute;
1256 position: absolute;
1257 margin: 0;
1257 margin: 0;
1258 padding: 5px 0 0 0px;
1258 padding: 5px 0 0 0px;
1259 }
1259 }
1260
1260
1261 #content div.box div.form div.fields div.field div.label-summary {
1261 #content div.box div.form div.fields div.field div.label-summary {
1262 left: 30px;
1262 left: 30px;
1263 width: 155px;
1263 width: 155px;
1264 position: absolute;
1264 position: absolute;
1265 margin: 0;
1265 margin: 0;
1266 padding: 0px 0 0 0px;
1266 padding: 0px 0 0 0px;
1267 }
1267 }
1268
1268
1269 #content div.box-left div.form div.fields div.field div.label,
1269 #content div.box-left div.form div.fields div.field div.label,
1270 #content div.box-right div.form div.fields div.field div.label,
1270 #content div.box-right div.form div.fields div.field div.label,
1271 #content div.box-left div.form div.fields div.field div.label,
1271 #content div.box-left div.form div.fields div.field div.label,
1272 #content div.box-left div.form div.fields div.field div.label-summary,
1272 #content div.box-left div.form div.fields div.field div.label-summary,
1273 #content div.box-right div.form div.fields div.field div.label-summary,
1273 #content div.box-right div.form div.fields div.field div.label-summary,
1274 #content div.box-left div.form div.fields div.field div.label-summary {
1274 #content div.box-left div.form div.fields div.field div.label-summary {
1275 clear: both;
1275 clear: both;
1276 overflow: hidden;
1276 overflow: hidden;
1277 left: 0;
1277 left: 0;
1278 width: auto;
1278 width: auto;
1279 position: relative;
1279 position: relative;
1280 margin: 0;
1280 margin: 0;
1281 padding: 0 0 8px;
1281 padding: 0 0 8px;
1282 }
1282 }
1283
1283
1284 #content div.box div.form div.fields div.field div.label-select {
1284 #content div.box div.form div.fields div.field div.label-select {
1285 padding: 5px 0 0 5px;
1285 padding: 5px 0 0 5px;
1286 }
1286 }
1287
1287
1288 #content div.box-left div.form div.fields div.field div.label-select,
1288 #content div.box-left div.form div.fields div.field div.label-select,
1289 #content div.box-right div.form div.fields div.field div.label-select {
1289 #content div.box-right div.form div.fields div.field div.label-select {
1290 padding: 0 0 8px;
1290 padding: 0 0 8px;
1291 }
1291 }
1292
1292
1293 #content div.box-left div.form div.fields div.field div.label-textarea,
1293 #content div.box-left div.form div.fields div.field div.label-textarea,
1294 #content div.box-right div.form div.fields div.field div.label-textarea {
1294 #content div.box-right div.form div.fields div.field div.label-textarea {
1295 padding: 0 0 8px !important;
1295 padding: 0 0 8px !important;
1296 }
1296 }
1297
1297
1298 #content div.box div.form div.fields div.field div.label label, div.label label {
1298 #content div.box div.form div.fields div.field div.label label, div.label label {
1299 color: #393939;
1299 color: #393939;
1300 font-weight: 700;
1300 font-weight: 700;
1301 }
1301 }
1302 #content div.box div.form div.fields div.field div.label label, div.label-summary label {
1302 #content div.box div.form div.fields div.field div.label label, div.label-summary label {
1303 color: #393939;
1303 color: #393939;
1304 font-weight: 700;
1304 font-weight: 700;
1305 }
1305 }
1306 #content div.box div.form div.fields div.field div.input {
1306 #content div.box div.form div.fields div.field div.input {
1307 margin: 0 0 0 200px;
1307 margin: 0 0 0 200px;
1308 }
1308 }
1309
1309
1310 #content div.box div.form div.fields div.field div.input.summary {
1310 #content div.box div.form div.fields div.field div.input.summary {
1311 margin: 0 0 0 110px;
1311 margin: 0 0 0 110px;
1312 }
1312 }
1313 #content div.box div.form div.fields div.field div.input.summary-short {
1313 #content div.box div.form div.fields div.field div.input.summary-short {
1314 margin: 0 0 0 110px;
1314 margin: 0 0 0 110px;
1315 }
1315 }
1316 #content div.box div.form div.fields div.field div.file {
1316 #content div.box div.form div.fields div.field div.file {
1317 margin: 0 0 0 200px;
1317 margin: 0 0 0 200px;
1318 }
1318 }
1319 #content div.box div.form div.fields div.field div.editor {
1319 #content div.box div.form div.fields div.field div.editor {
1320 margin: 0 0 0 200px;
1320 margin: 0 0 0 200px;
1321 }
1321 }
1322
1322
1323 #content div.box-left div.form div.fields div.field div.input, #content div.box-right div.form div.fields div.field div.input {
1323 #content div.box-left div.form div.fields div.field div.input, #content div.box-right div.form div.fields div.field div.input {
1324 margin: 0 0 0 0px;
1324 margin: 0 0 0 0px;
1325 }
1325 }
1326
1326
1327 #content div.box div.form div.fields div.field div.input input,
1327 #content div.box div.form div.fields div.field div.input input,
1328 .reviewer_ac input {
1328 .reviewer_ac input {
1329 background: #FFF;
1329 background: #FFF;
1330 border-top: 1px solid #b3b3b3;
1330 border-top: 1px solid #b3b3b3;
1331 border-left: 1px solid #b3b3b3;
1331 border-left: 1px solid #b3b3b3;
1332 border-right: 1px solid #eaeaea;
1332 border-right: 1px solid #eaeaea;
1333 border-bottom: 1px solid #eaeaea;
1333 border-bottom: 1px solid #eaeaea;
1334 color: #000;
1334 color: #000;
1335 font-size: 12px;
1335 font-size: 12px;
1336 margin: 0;
1336 margin: 0;
1337 padding: 7px 7px 6px;
1337 padding: 7px 7px 6px;
1338 }
1338 }
1339
1339
1340 #content div.box div.form div.fields div.field div.input input#clone_url,
1340 #content div.box div.form div.fields div.field div.input input#clone_url,
1341 #content div.box div.form div.fields div.field div.input input#clone_url_id
1341 #content div.box div.form div.fields div.field div.input input#clone_url_id
1342 {
1342 {
1343 font-size: 16px;
1343 font-size: 16px;
1344 padding: 2px;
1344 padding: 2px;
1345 }
1345 }
1346
1346
1347 #content div.box div.form div.fields div.field div.file input {
1347 #content div.box div.form div.fields div.field div.file input {
1348 background: none repeat scroll 0 0 #FFFFFF;
1348 background: none repeat scroll 0 0 #FFFFFF;
1349 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1349 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1350 border-style: solid;
1350 border-style: solid;
1351 border-width: 1px;
1351 border-width: 1px;
1352 color: #000000;
1352 color: #000000;
1353 font-size: 12px;
1353 font-size: 12px;
1354 margin: 0;
1354 margin: 0;
1355 padding: 7px 7px 6px;
1355 padding: 7px 7px 6px;
1356 }
1356 }
1357
1357
1358 input.disabled {
1358 input.disabled {
1359 background-color: #F5F5F5 !important;
1359 background-color: #F5F5F5 !important;
1360 }
1360 }
1361 #content div.box div.form div.fields div.field div.input input.small {
1361 #content div.box div.form div.fields div.field div.input input.small {
1362 width: 30%;
1362 width: 30%;
1363 }
1363 }
1364
1364
1365 #content div.box div.form div.fields div.field div.input input.medium {
1365 #content div.box div.form div.fields div.field div.input input.medium {
1366 width: 55%;
1366 width: 55%;
1367 }
1367 }
1368
1368
1369 #content div.box div.form div.fields div.field div.input input.large {
1369 #content div.box div.form div.fields div.field div.input input.large {
1370 width: 85%;
1370 width: 85%;
1371 }
1371 }
1372
1372
1373 #content div.box div.form div.fields div.field div.input input.date {
1373 #content div.box div.form div.fields div.field div.input input.date {
1374 width: 177px;
1374 width: 177px;
1375 }
1375 }
1376
1376
1377 #content div.box div.form div.fields div.field div.input input.button {
1377 #content div.box div.form div.fields div.field div.input input.button {
1378 background: #D4D0C8;
1378 background: #D4D0C8;
1379 border-top: 1px solid #FFF;
1379 border-top: 1px solid #FFF;
1380 border-left: 1px solid #FFF;
1380 border-left: 1px solid #FFF;
1381 border-right: 1px solid #404040;
1381 border-right: 1px solid #404040;
1382 border-bottom: 1px solid #404040;
1382 border-bottom: 1px solid #404040;
1383 color: #000;
1383 color: #000;
1384 margin: 0;
1384 margin: 0;
1385 padding: 4px 8px;
1385 padding: 4px 8px;
1386 }
1386 }
1387
1387
1388 #content div.box div.form div.fields div.field div.textarea {
1388 #content div.box div.form div.fields div.field div.textarea {
1389 border-top: 1px solid #b3b3b3;
1389 border-top: 1px solid #b3b3b3;
1390 border-left: 1px solid #b3b3b3;
1390 border-left: 1px solid #b3b3b3;
1391 border-right: 1px solid #eaeaea;
1391 border-right: 1px solid #eaeaea;
1392 border-bottom: 1px solid #eaeaea;
1392 border-bottom: 1px solid #eaeaea;
1393 margin: 0 0 0 200px;
1393 margin: 0 0 0 200px;
1394 padding: 7px 7px 6px;
1394 padding: 7px 7px 6px;
1395 }
1395 }
1396
1396
1397 #content div.box div.form div.fields div.field div.textarea-editor {
1397 #content div.box div.form div.fields div.field div.textarea-editor {
1398 border: 1px solid #ddd;
1398 border: 1px solid #ddd;
1399 padding: 0;
1399 padding: 0;
1400 }
1400 }
1401
1401
1402 #content div.box div.form div.fields div.field div.textarea textarea {
1402 #content div.box div.form div.fields div.field div.textarea textarea {
1403 width: 100%;
1403 width: 100%;
1404 height: 220px;
1404 height: 220px;
1405 overflow: hidden;
1405 overflow: hidden;
1406 background: #FFF;
1406 background: #FFF;
1407 color: #000;
1407 color: #000;
1408 font-size: 12px;
1408 font-size: 12px;
1409 outline: none;
1409 outline: none;
1410 border-width: 0;
1410 border-width: 0;
1411 margin: 0;
1411 margin: 0;
1412 padding: 0;
1412 padding: 0;
1413 }
1413 }
1414
1414
1415 #content div.box-left div.form div.fields div.field div.textarea textarea, #content div.box-right div.form div.fields div.field div.textarea textarea {
1415 #content div.box-left div.form div.fields div.field div.textarea textarea, #content div.box-right div.form div.fields div.field div.textarea textarea {
1416 width: 100%;
1416 width: 100%;
1417 height: 100px;
1417 height: 100px;
1418 }
1418 }
1419
1419
1420 #content div.box div.form div.fields div.field div.textarea table {
1420 #content div.box div.form div.fields div.field div.textarea table {
1421 width: 100%;
1421 width: 100%;
1422 border: none;
1422 border: none;
1423 margin: 0;
1423 margin: 0;
1424 padding: 0;
1424 padding: 0;
1425 }
1425 }
1426
1426
1427 #content div.box div.form div.fields div.field div.textarea table td {
1427 #content div.box div.form div.fields div.field div.textarea table td {
1428 background: #DDD;
1428 background: #DDD;
1429 border: none;
1429 border: none;
1430 padding: 0;
1430 padding: 0;
1431 }
1431 }
1432
1432
1433 #content div.box div.form div.fields div.field div.textarea table td table {
1433 #content div.box div.form div.fields div.field div.textarea table td table {
1434 width: auto;
1434 width: auto;
1435 border: none;
1435 border: none;
1436 margin: 0;
1436 margin: 0;
1437 padding: 0;
1437 padding: 0;
1438 }
1438 }
1439
1439
1440 #content div.box div.form div.fields div.field div.textarea table td table td {
1440 #content div.box div.form div.fields div.field div.textarea table td table td {
1441 font-size: 11px;
1441 font-size: 11px;
1442 padding: 5px 5px 5px 0;
1442 padding: 5px 5px 5px 0;
1443 }
1443 }
1444
1444
1445 #content div.box div.form div.fields div.field input[type=text]:focus,
1445 #content div.box div.form div.fields div.field input[type=text]:focus,
1446 #content div.box div.form div.fields div.field input[type=password]:focus,
1446 #content div.box div.form div.fields div.field input[type=password]:focus,
1447 #content div.box div.form div.fields div.field input[type=file]:focus,
1447 #content div.box div.form div.fields div.field input[type=file]:focus,
1448 #content div.box div.form div.fields div.field textarea:focus,
1448 #content div.box div.form div.fields div.field textarea:focus,
1449 #content div.box div.form div.fields div.field select:focus,
1449 #content div.box div.form div.fields div.field select:focus,
1450 .reviewer_ac input:focus {
1450 .reviewer_ac input:focus {
1451 background: #f6f6f6;
1451 background: #f6f6f6;
1452 border-color: #666;
1452 border-color: #666;
1453 }
1453 }
1454
1454
1455 .reviewer_ac {
1455 .reviewer_ac {
1456 padding: 10px
1456 padding: 10px
1457 }
1457 }
1458
1458
1459 div.form div.fields div.field div.button {
1459 div.form div.fields div.field div.button {
1460 margin: 0;
1460 margin: 0;
1461 padding: 0 0 0 8px;
1461 padding: 0 0 0 8px;
1462 }
1462 }
1463 #content div.box table.noborder {
1463 #content div.box table.noborder {
1464 border: 1px solid transparent;
1464 border: 1px solid transparent;
1465 }
1465 }
1466
1466
1467 #content div.box table {
1467 #content div.box table {
1468 width: 100%;
1468 width: 100%;
1469 border-collapse: separate;
1469 border-collapse: separate;
1470 margin: 0;
1470 margin: 0;
1471 padding: 0;
1471 padding: 0;
1472 border: 1px solid #eee;
1472 border: 1px solid #eee;
1473 -webkit-border-radius: 4px;
1473 -webkit-border-radius: 4px;
1474 border-radius: 4px;
1474 border-radius: 4px;
1475 }
1475 }
1476
1476
1477 #content div.box table th {
1477 #content div.box table th {
1478 background: #eee;
1478 background: #eee;
1479 border-bottom: 1px solid #ddd;
1479 border-bottom: 1px solid #ddd;
1480 padding: 5px 0px 5px 5px;
1480 padding: 5px 0px 5px 5px;
1481 text-align: left;
1481 text-align: left;
1482 }
1482 }
1483
1483
1484 #content div.box table th.left {
1484 #content div.box table th.left {
1485 text-align: left;
1485 text-align: left;
1486 }
1486 }
1487
1487
1488 #content div.box table th.right {
1488 #content div.box table th.right {
1489 text-align: right;
1489 text-align: right;
1490 }
1490 }
1491
1491
1492 #content div.box table th.center {
1492 #content div.box table th.center {
1493 text-align: center;
1493 text-align: center;
1494 }
1494 }
1495
1495
1496 #content div.box table th.selected {
1496 #content div.box table th.selected {
1497 vertical-align: middle;
1497 vertical-align: middle;
1498 padding: 0;
1498 padding: 0;
1499 }
1499 }
1500
1500
1501 #content div.box table td {
1501 #content div.box table td {
1502 background: #fff;
1502 background: #fff;
1503 border-bottom: 1px solid #cdcdcd;
1503 border-bottom: 1px solid #cdcdcd;
1504 vertical-align: middle;
1504 vertical-align: middle;
1505 padding: 5px;
1505 padding: 5px;
1506 }
1506 }
1507
1507
1508 #content div.box table tr.selected td {
1508 #content div.box table tr.selected td {
1509 background: #FFC;
1509 background: #FFC;
1510 }
1510 }
1511
1511
1512 #content div.box table td.selected {
1512 #content div.box table td.selected {
1513 width: 3%;
1513 width: 3%;
1514 text-align: center;
1514 text-align: center;
1515 vertical-align: middle;
1515 vertical-align: middle;
1516 padding: 0;
1516 padding: 0;
1517 }
1517 }
1518
1518
1519 #content div.box table td.action {
1519 #content div.box table td.action {
1520 width: 45%;
1520 width: 45%;
1521 text-align: left;
1521 text-align: left;
1522 }
1522 }
1523
1523
1524 #content div.box table td.date {
1524 #content div.box table td.date {
1525 width: 33%;
1525 width: 33%;
1526 text-align: center;
1526 text-align: center;
1527 }
1527 }
1528
1528
1529 #content div.box div.action {
1529 #content div.box div.action {
1530 float: right;
1530 float: right;
1531 background: #FFF;
1531 background: #FFF;
1532 text-align: right;
1532 text-align: right;
1533 margin: 10px 0 0;
1533 margin: 10px 0 0;
1534 padding: 0;
1534 padding: 0;
1535 }
1535 }
1536
1536
1537 #content div.box div.action select {
1537 #content div.box div.action select {
1538 font-size: 11px;
1538 font-size: 11px;
1539 margin: 0;
1539 margin: 0;
1540 }
1540 }
1541
1541
1542 #content div.box div.action .ui-selectmenu {
1542 #content div.box div.action .ui-selectmenu {
1543 margin: 0;
1543 margin: 0;
1544 padding: 0;
1544 padding: 0;
1545 }
1545 }
1546
1546
1547 #content div.box div.pagination {
1547 #content div.box div.pagination {
1548 height: 1%;
1548 height: 1%;
1549 clear: both;
1549 clear: both;
1550 overflow: hidden;
1550 overflow: hidden;
1551 margin: 10px 0 0;
1551 margin: 10px 0 0;
1552 padding: 0;
1552 padding: 0;
1553 }
1553 }
1554
1554
1555 #content div.box div.pagination ul.pager {
1555 #content div.box div.pagination ul.pager {
1556 float: right;
1556 float: right;
1557 text-align: right;
1557 text-align: right;
1558 margin: 0;
1558 margin: 0;
1559 padding: 0;
1559 padding: 0;
1560 }
1560 }
1561
1561
1562 #content div.box div.pagination ul.pager li {
1562 #content div.box div.pagination ul.pager li {
1563 height: 1%;
1563 height: 1%;
1564 float: left;
1564 float: left;
1565 list-style: none;
1565 list-style: none;
1566 background: #ebebeb url("../images/pager.png") repeat-x;
1566 background: #ebebeb url("../images/pager.png") repeat-x;
1567 border-top: 1px solid #dedede;
1567 border-top: 1px solid #dedede;
1568 border-left: 1px solid #cfcfcf;
1568 border-left: 1px solid #cfcfcf;
1569 border-right: 1px solid #c4c4c4;
1569 border-right: 1px solid #c4c4c4;
1570 border-bottom: 1px solid #c4c4c4;
1570 border-bottom: 1px solid #c4c4c4;
1571 color: #4A4A4A;
1571 color: #4A4A4A;
1572 font-weight: 700;
1572 font-weight: 700;
1573 margin: 0 0 0 4px;
1573 margin: 0 0 0 4px;
1574 padding: 0;
1574 padding: 0;
1575 }
1575 }
1576
1576
1577 #content div.box div.pagination ul.pager li.separator {
1577 #content div.box div.pagination ul.pager li.separator {
1578 padding: 6px;
1578 padding: 6px;
1579 }
1579 }
1580
1580
1581 #content div.box div.pagination ul.pager li.current {
1581 #content div.box div.pagination ul.pager li.current {
1582 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1582 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1583 border-top: 1px solid #ccc;
1583 border-top: 1px solid #ccc;
1584 border-left: 1px solid #bebebe;
1584 border-left: 1px solid #bebebe;
1585 border-right: 1px solid #b1b1b1;
1585 border-right: 1px solid #b1b1b1;
1586 border-bottom: 1px solid #afafaf;
1586 border-bottom: 1px solid #afafaf;
1587 color: #515151;
1587 color: #515151;
1588 padding: 6px;
1588 padding: 6px;
1589 }
1589 }
1590
1590
1591 #content div.box div.pagination ul.pager li a {
1591 #content div.box div.pagination ul.pager li a {
1592 height: 1%;
1592 height: 1%;
1593 display: block;
1593 display: block;
1594 float: left;
1594 float: left;
1595 color: #515151;
1595 color: #515151;
1596 text-decoration: none;
1596 text-decoration: none;
1597 margin: 0;
1597 margin: 0;
1598 padding: 6px;
1598 padding: 6px;
1599 }
1599 }
1600
1600
1601 #content div.box div.pagination ul.pager li a:hover,
1601 #content div.box div.pagination ul.pager li a:hover,
1602 #content div.box div.pagination ul.pager li a:active {
1602 #content div.box div.pagination ul.pager li a:active {
1603 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1603 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1604 border-top: 1px solid #ccc;
1604 border-top: 1px solid #ccc;
1605 border-left: 1px solid #bebebe;
1605 border-left: 1px solid #bebebe;
1606 border-right: 1px solid #b1b1b1;
1606 border-right: 1px solid #b1b1b1;
1607 border-bottom: 1px solid #afafaf;
1607 border-bottom: 1px solid #afafaf;
1608 margin: -1px;
1608 margin: -1px;
1609 }
1609 }
1610
1610
1611 #content div.box div.pagination-right {
1611 #content div.box div.pagination-right {
1612 float: right;
1612 float: right;
1613 }
1613 }
1614
1614
1615 #content div.box div.pagination-wh {
1615 #content div.box div.pagination-wh {
1616 height: 1%;
1616 height: 1%;
1617 overflow: hidden;
1617 overflow: hidden;
1618 text-align: right;
1618 text-align: right;
1619 margin: 10px 0 0;
1619 margin: 10px 0 0;
1620 padding: 0;
1620 padding: 0;
1621 }
1621 }
1622
1622
1623 #content div.box div.pagination-wh > :first-child {
1623 #content div.box div.pagination-wh > :first-child {
1624 border-radius: 4px 0px 0px 4px;
1624 border-radius: 4px 0px 0px 4px;
1625 }
1625 }
1626
1626
1627 #content div.box div.pagination-wh > :last-child {
1627 #content div.box div.pagination-wh > :last-child {
1628 border-radius: 0px 4px 4px 0px;
1628 border-radius: 0px 4px 4px 0px;
1629 border-right: 1px solid #cfcfcf;
1629 border-right: 1px solid #cfcfcf;
1630 }
1630 }
1631
1631
1632 #content div.box div.pagination-wh a,
1632 #content div.box div.pagination-wh a,
1633 #content div.box div.pagination-wh span.pager_dotdot,
1633 #content div.box div.pagination-wh span.pager_dotdot,
1634 #content div.box div.pagination-wh span.yui-pg-previous,
1634 #content div.box div.pagination-wh span.yui-pg-previous,
1635 #content div.box div.pagination-wh span.yui-pg-last,
1635 #content div.box div.pagination-wh span.yui-pg-last,
1636 #content div.box div.pagination-wh span.yui-pg-next,
1636 #content div.box div.pagination-wh span.yui-pg-next,
1637 #content div.box div.pagination-wh span.yui-pg-first {
1637 #content div.box div.pagination-wh span.yui-pg-first {
1638 height: 1%;
1638 height: 1%;
1639 float: left;
1639 float: left;
1640 background: #ebebeb url("../images/pager.png") repeat-x;
1640 background: #ebebeb url("../images/pager.png") repeat-x;
1641 border-top: 1px solid #dedede;
1641 border-top: 1px solid #dedede;
1642 border-left: 1px solid #cfcfcf;
1642 border-left: 1px solid #cfcfcf;
1643 border-bottom: 1px solid #c4c4c4;
1643 border-bottom: 1px solid #c4c4c4;
1644 color: #4A4A4A;
1644 color: #4A4A4A;
1645 font-weight: 700;
1645 font-weight: 700;
1646 padding: 6px;
1646 padding: 6px;
1647 }
1647 }
1648
1648
1649 #content div.box div.pagination-wh span.pager_curpage {
1649 #content div.box div.pagination-wh span.pager_curpage {
1650 height: 1%;
1650 height: 1%;
1651 float: left;
1651 float: left;
1652 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1652 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1653 border-top: 1px solid #ccc;
1653 border-top: 1px solid #ccc;
1654 border-left: 1px solid #bebebe;
1654 border-left: 1px solid #bebebe;
1655 border-bottom: 1px solid #afafaf;
1655 border-bottom: 1px solid #afafaf;
1656 color: #515151;
1656 color: #515151;
1657 font-weight: 700;
1657 font-weight: 700;
1658 padding: 6px;
1658 padding: 6px;
1659 }
1659 }
1660
1660
1661 #content div.box div.pagination-wh a:hover, #content div.box div.pagination-wh a:active {
1661 #content div.box div.pagination-wh a:hover, #content div.box div.pagination-wh a:active {
1662 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1662 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1663 border-top: 1px solid #ccc;
1663 border-top: 1px solid #ccc;
1664 border-left: 1px solid #bebebe;
1664 border-left: 1px solid #bebebe;
1665 border-bottom: 1px solid #afafaf;
1665 border-bottom: 1px solid #afafaf;
1666 text-decoration: none;
1666 text-decoration: none;
1667 }
1667 }
1668
1668
1669 #content div.box div.traffic div.legend {
1669 #content div.box div.traffic div.legend {
1670 clear: both;
1670 clear: both;
1671 overflow: hidden;
1671 overflow: hidden;
1672 border-bottom: 1px solid #ddd;
1672 border-bottom: 1px solid #ddd;
1673 margin: 0 0 10px;
1673 margin: 0 0 10px;
1674 padding: 0 0 10px;
1674 padding: 0 0 10px;
1675 }
1675 }
1676
1676
1677 #content div.box div.traffic div.legend h6 {
1677 #content div.box div.traffic div.legend h6 {
1678 float: left;
1678 float: left;
1679 border: none;
1679 border: none;
1680 margin: 0;
1680 margin: 0;
1681 padding: 0;
1681 padding: 0;
1682 }
1682 }
1683
1683
1684 #content div.box div.traffic div.legend li {
1684 #content div.box div.traffic div.legend li {
1685 list-style: none;
1685 list-style: none;
1686 float: left;
1686 float: left;
1687 font-size: 11px;
1687 font-size: 11px;
1688 margin: 0;
1688 margin: 0;
1689 padding: 0 8px 0 4px;
1689 padding: 0 8px 0 4px;
1690 }
1690 }
1691
1691
1692 #content div.box div.traffic div.legend li.visits {
1692 #content div.box div.traffic div.legend li.visits {
1693 border-left: 12px solid #edc240;
1693 border-left: 12px solid #edc240;
1694 }
1694 }
1695
1695
1696 #content div.box div.traffic div.legend li.pageviews {
1696 #content div.box div.traffic div.legend li.pageviews {
1697 border-left: 12px solid #afd8f8;
1697 border-left: 12px solid #afd8f8;
1698 }
1698 }
1699
1699
1700 #content div.box div.traffic table {
1700 #content div.box div.traffic table {
1701 width: auto;
1701 width: auto;
1702 }
1702 }
1703
1703
1704 #content div.box div.traffic table td {
1704 #content div.box div.traffic table td {
1705 background: transparent;
1705 background: transparent;
1706 border: none;
1706 border: none;
1707 padding: 2px 3px 3px;
1707 padding: 2px 3px 3px;
1708 }
1708 }
1709
1709
1710 #content div.box div.traffic table td.legendLabel {
1710 #content div.box div.traffic table td.legendLabel {
1711 padding: 0 3px 2px;
1711 padding: 0 3px 2px;
1712 }
1712 }
1713
1713
1714 #content div.box #summary {
1714 #content div.box #summary {
1715 margin-right: 200px;
1715 margin-right: 200px;
1716 min-height: 240px;
1716 min-height: 240px;
1717 }
1717 }
1718
1718
1719 #summary-menu-stats {
1719 #summary-menu-stats {
1720 float: left;
1720 float: left;
1721 width: 180px;
1721 width: 180px;
1722 position: absolute;
1722 position: absolute;
1723 top: 0;
1723 top: 0;
1724 right: 0;
1724 right: 0;
1725 }
1725 }
1726
1726
1727 #summary-menu-stats ul {
1727 #summary-menu-stats ul {
1728 margin: 0 10px;
1728 margin: 0 10px;
1729 display: block;
1729 display: block;
1730 background-color: #f9f9f9;
1730 background-color: #f9f9f9;
1731 border: 1px solid #d1d1d1;
1731 border: 1px solid #d1d1d1;
1732 border-radius: 4px;
1732 border-radius: 4px;
1733 }
1733 }
1734
1734
1735 #content #summary-menu-stats li {
1735 #content #summary-menu-stats li {
1736 border-top: 1px solid #d1d1d1;
1736 border-top: 1px solid #d1d1d1;
1737 padding: 0;
1737 padding: 0;
1738 }
1738 }
1739
1739
1740 #content #summary-menu-stats li:hover {
1740 #content #summary-menu-stats li:hover {
1741 background: #f0f0f0;
1741 background: #f0f0f0;
1742 }
1742 }
1743
1743
1744 #content #summary-menu-stats li:first-child {
1744 #content #summary-menu-stats li:first-child {
1745 border-top: none;
1745 border-top: none;
1746 }
1746 }
1747
1747
1748 #summary-menu-stats a.followers { background-image: url('../images/icons/heart.png')}
1748 #summary-menu-stats a.followers { background-image: url('../images/icons/heart.png')}
1749 #summary-menu-stats a.forks { background-image: url('../images/icons/arrow_divide.png')}
1749 #summary-menu-stats a.forks { background-image: url('../images/icons/arrow_divide.png')}
1750 #summary-menu-stats a.settings { background-image: url('../images/icons/cog_edit.png')}
1750 #summary-menu-stats a.settings { background-image: url('../images/icons/cog_edit.png')}
1751 #summary-menu-stats a.feed { background-image: url('../images/icons/rss_16.png')}
1751 #summary-menu-stats a.feed { background-image: url('../images/icons/rss_16.png')}
1752 #summary-menu-stats a.repo-size { background-image: url('../images/icons/server.png')}
1752 #summary-menu-stats a.repo-size { background-image: url('../images/icons/server.png')}
1753
1753
1754 #summary-menu-stats a {
1754 #summary-menu-stats a {
1755 display: block;
1755 display: block;
1756 padding: 12px 10px;
1756 padding: 12px 10px;
1757 background-repeat: no-repeat;
1757 background-repeat: no-repeat;
1758 background-position: 10px 50%;
1758 background-position: 10px 50%;
1759 padding-right: 10px;
1759 padding-right: 10px;
1760 }
1760 }
1761
1761
1762 #repo_size_2.loaded {
1762 #repo_size_2.loaded {
1763 margin-left: 30px;
1763 margin-left: 30px;
1764 display: block;
1764 display: block;
1765 padding-right: 10px;
1765 padding-right: 10px;
1766 padding-bottom: 7px;
1766 padding-bottom: 7px;
1767 }
1767 }
1768
1768
1769 #summary-menu-stats a:hover {
1769 #summary-menu-stats a:hover {
1770 text-decoration: none;
1770 text-decoration: none;
1771 }
1771 }
1772
1772
1773 #summary-menu-stats a span {
1773 #summary-menu-stats a span {
1774 background-color: #DEDEDE;
1774 background-color: #DEDEDE;
1775 color: #888 !important;
1775 color: #888 !important;
1776 border-radius: 4px;
1776 border-radius: 4px;
1777 padding: 2px 4px;
1777 padding: 2px 4px;
1778 font-size: 10px;
1778 font-size: 10px;
1779 }
1779 }
1780
1780
1781 #summary .metatag {
1781 #summary .metatag {
1782 display: inline-block;
1782 display: inline-block;
1783 padding: 3px 5px;
1783 padding: 3px 5px;
1784 margin-bottom: 3px;
1784 margin-bottom: 3px;
1785 margin-right: 1px;
1785 margin-right: 1px;
1786 border-radius: 5px;
1786 border-radius: 5px;
1787 }
1787 }
1788
1788
1789 #content div.box #summary p {
1789 #content div.box #summary p {
1790 margin-bottom: -5px;
1790 margin-bottom: -5px;
1791 width: 600px;
1791 width: 600px;
1792 white-space: pre-wrap;
1792 white-space: pre-wrap;
1793 }
1793 }
1794
1794
1795 #content div.box #summary p:last-child {
1795 #content div.box #summary p:last-child {
1796 margin-bottom: 9px;
1796 margin-bottom: 9px;
1797 }
1797 }
1798
1798
1799 #content div.box #summary p:first-of-type {
1799 #content div.box #summary p:first-of-type {
1800 margin-top: 9px;
1800 margin-top: 9px;
1801 }
1801 }
1802
1802
1803 .metatag {
1803 .metatag {
1804 display: inline-block;
1804 display: inline-block;
1805 margin-right: 1px;
1805 margin-right: 1px;
1806 -webkit-border-radius: 4px 4px 4px 4px;
1806 -webkit-border-radius: 4px 4px 4px 4px;
1807 -khtml-border-radius: 4px 4px 4px 4px;
1807 -khtml-border-radius: 4px 4px 4px 4px;
1808 border-radius: 4px 4px 4px 4px;
1808 border-radius: 4px 4px 4px 4px;
1809
1809
1810 border: solid 1px #9CF;
1810 border: solid 1px #9CF;
1811 padding: 2px 3px 2px 3px !important;
1811 padding: 2px 3px 2px 3px !important;
1812 background-color: #DEF;
1812 background-color: #DEF;
1813 }
1813 }
1814
1814
1815 .metatag[tag="dead"] {
1815 .metatag[tag="dead"] {
1816 background-color: #E44;
1816 background-color: #E44;
1817 }
1817 }
1818
1818
1819 .metatag[tag="stale"] {
1819 .metatag[tag="stale"] {
1820 background-color: #EA4;
1820 background-color: #EA4;
1821 }
1821 }
1822
1822
1823 .metatag[tag="featured"] {
1823 .metatag[tag="featured"] {
1824 background-color: #AEA;
1824 background-color: #AEA;
1825 }
1825 }
1826
1826
1827 .metatag[tag="requires"] {
1827 .metatag[tag="requires"] {
1828 background-color: #9CF;
1828 background-color: #9CF;
1829 }
1829 }
1830
1830
1831 .metatag[tag="recommends"] {
1831 .metatag[tag="recommends"] {
1832 background-color: #BDF;
1832 background-color: #BDF;
1833 }
1833 }
1834
1834
1835 .metatag[tag="lang"] {
1835 .metatag[tag="lang"] {
1836 background-color: #FAF474;
1836 background-color: #FAF474;
1837 }
1837 }
1838
1838
1839 .metatag[tag="license"] {
1839 .metatag[tag="license"] {
1840 border: solid 1px #9CF;
1840 border: solid 1px #9CF;
1841 background-color: #DEF;
1841 background-color: #DEF;
1842 target-new: tab !important;
1842 target-new: tab !important;
1843 }
1843 }
1844 .metatag[tag="see"] {
1844 .metatag[tag="see"] {
1845 border: solid 1px #CBD;
1845 border: solid 1px #CBD;
1846 background-color: #EDF;
1846 background-color: #EDF;
1847 }
1847 }
1848
1848
1849 a.metatag[tag="license"]:hover {
1849 a.metatag[tag="license"]:hover {
1850 background-color: #577632;
1850 background-color: #577632;
1851 color: #FFF;
1851 color: #FFF;
1852 text-decoration: none;
1852 text-decoration: none;
1853 }
1853 }
1854
1854
1855 #summary .desc {
1855 #summary .desc {
1856 white-space: pre;
1856 white-space: pre;
1857 width: 100%;
1857 width: 100%;
1858 }
1858 }
1859
1859
1860 #summary .repo_name {
1860 #summary .repo_name {
1861 font-size: 1.6em;
1861 font-size: 1.6em;
1862 font-weight: bold;
1862 font-weight: bold;
1863 vertical-align: baseline;
1863 vertical-align: baseline;
1864 clear: right
1864 clear: right
1865 }
1865 }
1866
1866
1867 #footer {
1867 #footer {
1868 clear: both;
1868 clear: both;
1869 overflow: hidden;
1869 overflow: hidden;
1870 text-align: right;
1870 text-align: right;
1871 margin: 0;
1871 margin: 0;
1872 padding: 0 10px 4px;
1872 padding: 0 10px 4px;
1873 margin: -10px 0 0;
1873 margin: -10px 0 0;
1874 }
1874 }
1875
1875
1876 #footer div#footer-inner {
1876 #footer div#footer-inner {
1877 background-color: #577632;
1877 background-color: #577632;
1878 background-repeat: repeat-x;
1878 background-repeat: repeat-x;
1879 background-image: -khtml-gradient( linear, left top, left bottom, from(#577632), to(#577632));
1879 background-image: -khtml-gradient( linear, left top, left bottom, from(#577632), to(#577632));
1880 background-image: -moz-linear-gradient(top, #577632, #577632);
1880 background-image: -moz-linear-gradient(top, #577632, #577632);
1881 background-image: -ms-linear-gradient( top, #577632, #577632);
1881 background-image: -ms-linear-gradient( top, #577632, #577632);
1882 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #577632), color-stop( 100%, #577632));
1882 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #577632), color-stop( 100%, #577632));
1883 background-image: -webkit-linear-gradient( top, #577632, #577632));
1883 background-image: -webkit-linear-gradient( top, #577632, #577632));
1884 background-image: -o-linear-gradient( top, #577632, #577632));
1884 background-image: -o-linear-gradient( top, #577632, #577632));
1885 background-image: linear-gradient(to bottom, #577632, #577632);
1885 background-image: linear-gradient(to bottom, #577632, #577632);
1886 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#577632', endColorstr = '#577632', GradientType = 0);
1886 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#577632', endColorstr = '#577632', GradientType = 0);
1887 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1887 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1888 -webkit-border-radius: 4px 4px 4px 4px;
1888 -webkit-border-radius: 4px 4px 4px 4px;
1889 -khtml-border-radius: 4px 4px 4px 4px;
1889 -khtml-border-radius: 4px 4px 4px 4px;
1890 border-radius: 4px 4px 4px 4px;
1890 border-radius: 4px 4px 4px 4px;
1891 }
1891 }
1892
1892
1893 #footer div#footer-inner p {
1893 #footer div#footer-inner p {
1894 padding: 15px 25px 15px 0;
1894 padding: 15px 25px 15px 0;
1895 color: #FFF;
1895 color: #FFF;
1896 font-weight: 700;
1896 font-weight: 700;
1897 }
1897 }
1898
1898
1899 #footer div#footer-inner .footer-link {
1899 #footer div#footer-inner .footer-link {
1900 float: left;
1900 float: left;
1901 padding-left: 10px;
1901 padding-left: 10px;
1902 }
1902 }
1903
1903
1904 #footer div#footer-inner .footer-link a, #footer div#footer-inner .footer-link-right a {
1904 #footer div#footer-inner .footer-link a, #footer div#footer-inner .footer-link-right a {
1905 color: #FFF;
1905 color: #FFF;
1906 }
1906 }
1907
1907
1908 #login div.title {
1908 #login div.title {
1909 clear: both;
1909 clear: both;
1910 overflow: hidden;
1910 overflow: hidden;
1911 position: relative;
1911 position: relative;
1912 background-color: #577632;
1912 background-color: #577632;
1913 background-repeat: repeat-x;
1913 background-repeat: repeat-x;
1914 background-image: -khtml-gradient( linear, left top, left bottom, from(#577632), to(#577632));
1914 background-image: -khtml-gradient( linear, left top, left bottom, from(#577632), to(#577632));
1915 background-image: -moz-linear-gradient( top, #577632, #577632);
1915 background-image: -moz-linear-gradient( top, #577632, #577632);
1916 background-image: -ms-linear-gradient( top, #577632, #577632);
1916 background-image: -ms-linear-gradient( top, #577632, #577632);
1917 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #577632), color-stop( 100%, #577632));
1917 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #577632), color-stop( 100%, #577632));
1918 background-image: -webkit-linear-gradient( top, #577632, #577632));
1918 background-image: -webkit-linear-gradient( top, #577632, #577632));
1919 background-image: -o-linear-gradient( top, #577632, #577632));
1919 background-image: -o-linear-gradient( top, #577632, #577632));
1920 background-image: linear-gradient(to bottom, #577632, #577632);
1920 background-image: linear-gradient(to bottom, #577632, #577632);
1921 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#577632', endColorstr = '#577632', GradientType = 0);
1921 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#577632', endColorstr = '#577632', GradientType = 0);
1922 margin: 0 auto;
1922 margin: 0 auto;
1923 padding: 0;
1923 padding: 0;
1924 }
1924 }
1925
1925
1926 #login div.inner {
1926 #login div.inner {
1927 background: #FFF url("../images/login.png") no-repeat top left;
1927 background: #FFF url("../images/login.png") no-repeat top left;
1928 border-top: none;
1928 border-top: none;
1929 border-bottom: none;
1929 border-bottom: none;
1930 margin: 0 auto;
1930 margin: 0 auto;
1931 padding: 20px;
1931 padding: 20px;
1932 }
1932 }
1933
1933
1934 #login div.form div.fields div.field div.label {
1934 #login div.form div.fields div.field div.label {
1935 width: 173px;
1935 width: 173px;
1936 float: left;
1936 float: left;
1937 text-align: right;
1937 text-align: right;
1938 margin: 2px 10px 0 0;
1938 margin: 2px 10px 0 0;
1939 padding: 5px 0 0 5px;
1939 padding: 5px 0 0 5px;
1940 }
1940 }
1941
1941
1942 #login div.form div.fields div.field div.input input {
1942 #login div.form div.fields div.field div.input input {
1943 background: #FFF;
1943 background: #FFF;
1944 border-top: 1px solid #b3b3b3;
1944 border-top: 1px solid #b3b3b3;
1945 border-left: 1px solid #b3b3b3;
1945 border-left: 1px solid #b3b3b3;
1946 border-right: 1px solid #eaeaea;
1946 border-right: 1px solid #eaeaea;
1947 border-bottom: 1px solid #eaeaea;
1947 border-bottom: 1px solid #eaeaea;
1948 color: #000;
1948 color: #000;
1949 font-size: 11px;
1949 font-size: 11px;
1950 margin: 0;
1950 margin: 0;
1951 padding: 7px 7px 6px;
1951 padding: 7px 7px 6px;
1952 }
1952 }
1953
1953
1954 #login div.form div.fields div.buttons {
1954 #login div.form div.fields div.buttons {
1955 clear: both;
1955 clear: both;
1956 overflow: hidden;
1956 overflow: hidden;
1957 border-top: 1px solid #DDD;
1957 border-top: 1px solid #DDD;
1958 text-align: right;
1958 text-align: right;
1959 margin: 0;
1959 margin: 0;
1960 padding: 10px 0 0;
1960 padding: 10px 0 0;
1961 }
1961 }
1962
1962
1963 #login div.form div.links {
1963 #login div.form div.links {
1964 clear: both;
1964 clear: both;
1965 overflow: hidden;
1965 overflow: hidden;
1966 margin: 10px 0 0;
1966 margin: 10px 0 0;
1967 padding: 0 0 2px;
1967 padding: 0 0 2px;
1968 }
1968 }
1969
1969
1970 .user-menu {
1970 .user-menu {
1971 margin: 0px !important;
1971 margin: 0px !important;
1972 float: left;
1972 float: left;
1973 }
1973 }
1974
1974
1975 .user-menu .container {
1975 .user-menu .container {
1976 padding: 0px 4px 0px 4px;
1976 padding: 0px 4px 0px 4px;
1977 margin: 0px 0px 0px 0px;
1977 margin: 0px 0px 0px 0px;
1978 }
1978 }
1979
1979
1980 .user-menu .gravatar {
1980 .user-menu .gravatar {
1981 margin: 0px 0px 0px 0px;
1981 margin: 0px 0px 0px 0px;
1982 cursor: pointer;
1982 cursor: pointer;
1983 }
1983 }
1984 .user-menu .gravatar.enabled {
1984 .user-menu .gravatar.enabled {
1985 background-color: #FDF784 !important;
1985 background-color: #FDF784 !important;
1986 }
1986 }
1987 .user-menu .gravatar:hover {
1987 .user-menu .gravatar:hover {
1988 background-color: #FDF784 !important;
1988 background-color: #FDF784 !important;
1989 }
1989 }
1990 #quick_login {
1990 #quick_login {
1991 min-height: 110px;
1991 min-height: 110px;
1992 padding: 4px;
1992 padding: 4px;
1993 position: absolute;
1993 position: absolute;
1994 right: 0;
1994 right: 0;
1995 background-color: #577632;
1995 background-color: #577632;
1996 background-repeat: repeat-x;
1996 background-repeat: repeat-x;
1997 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
1997 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
1998 background-image: -moz-linear-gradient(top, #577632, #577632);
1998 background-image: -moz-linear-gradient(top, #577632, #577632);
1999 background-image: -ms-linear-gradient(top, #577632, #577632);
1999 background-image: -ms-linear-gradient(top, #577632, #577632);
2000 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
2000 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
2001 background-image: -webkit-linear-gradient(top, #577632, #577632);
2001 background-image: -webkit-linear-gradient(top, #577632, #577632);
2002 background-image: -o-linear-gradient(top, #577632, #577632);
2002 background-image: -o-linear-gradient(top, #577632, #577632);
2003 background-image: linear-gradient(to bottom, #577632, #577632);
2003 background-image: linear-gradient(to bottom, #577632, #577632);
2004 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#577632', endColorstr='#577632', GradientType=0 );
2004 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#577632', endColorstr='#577632', GradientType=0 );
2005
2005
2006 z-index: 999;
2006 z-index: 999;
2007 -webkit-border-radius: 0px 0px 4px 4px;
2007 -webkit-border-radius: 0px 0px 4px 4px;
2008 -khtml-border-radius: 0px 0px 4px 4px;
2008 -khtml-border-radius: 0px 0px 4px 4px;
2009 border-radius: 0px 0px 4px 4px;
2009 border-radius: 0px 0px 4px 4px;
2010 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
2010 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
2011
2011
2012 overflow: hidden;
2012 overflow: hidden;
2013 }
2013 }
2014 #quick_login h4 {
2014 #quick_login h4 {
2015 color: #fff;
2015 color: #fff;
2016 padding: 5px 0px 5px 14px;
2016 padding: 5px 0px 5px 14px;
2017 }
2017 }
2018
2018
2019 #quick_login .password_forgoten {
2019 #quick_login .password_forgoten {
2020 padding-right: 0px;
2020 padding-right: 0px;
2021 padding-top: 0px;
2021 padding-top: 0px;
2022 text-align: left;
2022 text-align: left;
2023 }
2023 }
2024
2024
2025 #quick_login .password_forgoten a {
2025 #quick_login .password_forgoten a {
2026 font-size: 10px;
2026 font-size: 10px;
2027 color: #fff;
2027 color: #fff;
2028 padding: 0px !important;
2028 padding: 0px !important;
2029 line-height: 20px !important;
2029 line-height: 20px !important;
2030 }
2030 }
2031
2031
2032 #quick_login .register {
2032 #quick_login .register {
2033 padding-right: 10px;
2033 padding-right: 10px;
2034 padding-top: 5px;
2034 padding-top: 5px;
2035 text-align: left;
2035 text-align: left;
2036 }
2036 }
2037
2037
2038 #quick_login .register a {
2038 #quick_login .register a {
2039 font-size: 10px;
2039 font-size: 10px;
2040 color: #fff;
2040 color: #fff;
2041 padding: 0px !important;
2041 padding: 0px !important;
2042 line-height: 20px !important;
2042 line-height: 20px !important;
2043 }
2043 }
2044
2044
2045 #quick_login .submit {
2045 #quick_login .submit {
2046 margin: -20px 0 0 0px;
2046 margin: -20px 0 0 0px;
2047 position: absolute;
2047 position: absolute;
2048 right: 15px;
2048 right: 15px;
2049 }
2049 }
2050
2050
2051 #quick_login .links_left {
2051 #quick_login .links_left {
2052 float: left;
2052 float: left;
2053 margin-right: 130px;
2053 margin-right: 130px;
2054 width: 170px;
2054 width: 170px;
2055 }
2055 }
2056 #quick_login .links_right {
2056 #quick_login .links_right {
2057
2057
2058 position: absolute;
2058 position: absolute;
2059 right: 0;
2059 right: 0;
2060 }
2060 }
2061 #quick_login .full_name {
2061 #quick_login .full_name {
2062 color: #FFFFFF;
2062 color: #FFFFFF;
2063 font-weight: bold;
2063 font-weight: bold;
2064 padding: 3px 3px 3px 6px;
2064 padding: 3px 3px 3px 6px;
2065 }
2065 }
2066 #quick_login .big_gravatar {
2066 #quick_login .big_gravatar {
2067 padding: 4px 0px 0px 6px;
2067 padding: 4px 0px 0px 6px;
2068 }
2068 }
2069 #quick_login .notifications {
2069 #quick_login .notifications {
2070 padding: 2px 0px 0px 6px;
2070 padding: 2px 0px 0px 6px;
2071 color: #FFFFFF;
2071 color: #FFFFFF;
2072 font-weight: bold;
2072 font-weight: bold;
2073 line-height: 10px !important;
2073 line-height: 10px !important;
2074 }
2074 }
2075 #quick_login .notifications a,
2075 #quick_login .notifications a,
2076 #quick_login .unread a {
2076 #quick_login .unread a {
2077 color: #FFFFFF;
2077 color: #FFFFFF;
2078 display: block;
2078 display: block;
2079 padding: 0px !important;
2079 padding: 0px !important;
2080 }
2080 }
2081 #quick_login .notifications a:hover,
2081 #quick_login .notifications a:hover,
2082 #quick_login .unread a:hover {
2082 #quick_login .unread a:hover {
2083 background-color: inherit !important;
2083 background-color: inherit !important;
2084 }
2084 }
2085 #quick_login .email, #quick_login .unread {
2085 #quick_login .email, #quick_login .unread {
2086 color: #FFFFFF;
2086 color: #FFFFFF;
2087 padding: 3px 3px 3px 6px;
2087 padding: 3px 3px 3px 6px;
2088 }
2088 }
2089 #quick_login .links .logout {
2089 #quick_login .links .logout {
2090 }
2090 }
2091
2091
2092 #quick_login div.form div.fields {
2092 #quick_login div.form div.fields {
2093 padding-top: 2px;
2093 padding-top: 2px;
2094 padding-left: 10px;
2094 padding-left: 10px;
2095 }
2095 }
2096
2096
2097 #quick_login div.form div.fields div.field {
2097 #quick_login div.form div.fields div.field {
2098 padding: 5px;
2098 padding: 5px;
2099 }
2099 }
2100
2100
2101 #quick_login div.form div.fields div.field div.label label {
2101 #quick_login div.form div.fields div.field div.label label {
2102 color: #fff;
2102 color: #fff;
2103 padding-bottom: 3px;
2103 padding-bottom: 3px;
2104 }
2104 }
2105
2105
2106 #quick_login div.form div.fields div.field div.input input {
2106 #quick_login div.form div.fields div.field div.input input {
2107 width: 236px;
2107 width: 236px;
2108 background: #FFF;
2108 background: #FFF;
2109 border-top: 1px solid #b3b3b3;
2109 border-top: 1px solid #b3b3b3;
2110 border-left: 1px solid #b3b3b3;
2110 border-left: 1px solid #b3b3b3;
2111 border-right: 1px solid #eaeaea;
2111 border-right: 1px solid #eaeaea;
2112 border-bottom: 1px solid #eaeaea;
2112 border-bottom: 1px solid #eaeaea;
2113 color: #000;
2113 color: #000;
2114 font-size: 11px;
2114 font-size: 11px;
2115 margin: 0;
2115 margin: 0;
2116 padding: 5px 7px 4px;
2116 padding: 5px 7px 4px;
2117 }
2117 }
2118
2118
2119 #quick_login div.form div.fields div.buttons {
2119 #quick_login div.form div.fields div.buttons {
2120 clear: both;
2120 clear: both;
2121 overflow: hidden;
2121 overflow: hidden;
2122 text-align: right;
2122 text-align: right;
2123 margin: 0;
2123 margin: 0;
2124 padding: 5px 14px 0px 5px;
2124 padding: 5px 14px 0px 5px;
2125 }
2125 }
2126
2126
2127 #quick_login div.form div.links {
2127 #quick_login div.form div.links {
2128 clear: both;
2128 clear: both;
2129 overflow: hidden;
2129 overflow: hidden;
2130 margin: 10px 0 0;
2130 margin: 10px 0 0;
2131 padding: 0 0 2px;
2131 padding: 0 0 2px;
2132 }
2132 }
2133
2133
2134 #quick_login ol.links {
2134 #quick_login ol.links {
2135 display: block;
2135 display: block;
2136 font-weight: bold;
2136 font-weight: bold;
2137 list-style: none outside none;
2137 list-style: none outside none;
2138 text-align: right;
2138 text-align: right;
2139 }
2139 }
2140 #quick_login ol.links li {
2140 #quick_login ol.links li {
2141 line-height: 27px;
2141 line-height: 27px;
2142 margin: 0;
2142 margin: 0;
2143 padding: 0;
2143 padding: 0;
2144 color: #fff;
2144 color: #fff;
2145 display: block;
2145 display: block;
2146 float: none !important;
2146 float: none !important;
2147 }
2147 }
2148
2148
2149 #quick_login ol.links li a {
2149 #quick_login ol.links li a {
2150 color: #fff;
2150 color: #fff;
2151 display: block;
2151 display: block;
2152 padding: 2px;
2152 padding: 2px;
2153 }
2153 }
2154 #quick_login ol.links li a:HOVER {
2154 #quick_login ol.links li a:HOVER {
2155 background-color: inherit !important;
2155 background-color: inherit !important;
2156 }
2156 }
2157
2157
2158 #register div.title {
2158 #register div.title {
2159 clear: both;
2159 clear: both;
2160 overflow: hidden;
2160 overflow: hidden;
2161 position: relative;
2161 position: relative;
2162 background-color: #577632;
2162 background-color: #577632;
2163 background-repeat: repeat-x;
2163 background-repeat: repeat-x;
2164 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
2164 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
2165 background-image: -moz-linear-gradient(top, #577632, #577632);
2165 background-image: -moz-linear-gradient(top, #577632, #577632);
2166 background-image: -ms-linear-gradient(top, #577632, #577632);
2166 background-image: -ms-linear-gradient(top, #577632, #577632);
2167 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
2167 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
2168 background-image: -webkit-linear-gradient(top, #577632, #577632);
2168 background-image: -webkit-linear-gradient(top, #577632, #577632);
2169 background-image: -o-linear-gradient(top, #577632, #577632);
2169 background-image: -o-linear-gradient(top, #577632, #577632);
2170 background-image: linear-gradient(to bottom, #577632, #577632);
2170 background-image: linear-gradient(to bottom, #577632, #577632);
2171 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#577632',
2171 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#577632',
2172 endColorstr='#577632', GradientType=0 );
2172 endColorstr='#577632', GradientType=0 );
2173 margin: 0 auto;
2173 margin: 0 auto;
2174 padding: 0;
2174 padding: 0;
2175 }
2175 }
2176
2176
2177 #register div.inner {
2177 #register div.inner {
2178 background: #FFF;
2178 background: #FFF;
2179 border-top: none;
2179 border-top: none;
2180 border-bottom: none;
2180 border-bottom: none;
2181 margin: 0 auto;
2181 margin: 0 auto;
2182 padding: 20px;
2182 padding: 20px;
2183 }
2183 }
2184
2184
2185 #register div.form div.fields div.field div.label {
2185 #register div.form div.fields div.field div.label {
2186 width: 135px;
2186 width: 135px;
2187 float: left;
2187 float: left;
2188 text-align: right;
2188 text-align: right;
2189 margin: 2px 10px 0 0;
2189 margin: 2px 10px 0 0;
2190 padding: 5px 0 0 5px;
2190 padding: 5px 0 0 5px;
2191 }
2191 }
2192
2192
2193 #register div.form div.fields div.field div.input input {
2193 #register div.form div.fields div.field div.input input {
2194 width: 300px;
2194 width: 300px;
2195 background: #FFF;
2195 background: #FFF;
2196 border-top: 1px solid #b3b3b3;
2196 border-top: 1px solid #b3b3b3;
2197 border-left: 1px solid #b3b3b3;
2197 border-left: 1px solid #b3b3b3;
2198 border-right: 1px solid #eaeaea;
2198 border-right: 1px solid #eaeaea;
2199 border-bottom: 1px solid #eaeaea;
2199 border-bottom: 1px solid #eaeaea;
2200 color: #000;
2200 color: #000;
2201 font-size: 11px;
2201 font-size: 11px;
2202 margin: 0;
2202 margin: 0;
2203 padding: 7px 7px 6px;
2203 padding: 7px 7px 6px;
2204 }
2204 }
2205
2205
2206 #register div.form div.fields div.buttons {
2206 #register div.form div.fields div.buttons {
2207 clear: both;
2207 clear: both;
2208 overflow: hidden;
2208 overflow: hidden;
2209 border-top: 1px solid #DDD;
2209 border-top: 1px solid #DDD;
2210 text-align: left;
2210 text-align: left;
2211 margin: 0;
2211 margin: 0;
2212 padding: 10px 0 0 150px;
2212 padding: 10px 0 0 150px;
2213 }
2213 }
2214
2214
2215 #register div.form div.activation_msg {
2215 #register div.form div.activation_msg {
2216 padding-top: 4px;
2216 padding-top: 4px;
2217 padding-bottom: 4px;
2217 padding-bottom: 4px;
2218 }
2218 }
2219
2219
2220 #journal .journal_day {
2220 #journal .journal_day {
2221 font-size: 20px;
2221 font-size: 20px;
2222 padding: 10px 0px;
2222 padding: 10px 0px;
2223 border-bottom: 2px solid #DDD;
2223 border-bottom: 2px solid #DDD;
2224 margin-left: 10px;
2224 margin-left: 10px;
2225 margin-right: 10px;
2225 margin-right: 10px;
2226 }
2226 }
2227
2227
2228 #journal .journal_container {
2228 #journal .journal_container {
2229 padding: 5px;
2229 padding: 5px;
2230 clear: both;
2230 clear: both;
2231 margin: 0px 5px 0px 10px;
2231 margin: 0px 5px 0px 10px;
2232 }
2232 }
2233
2233
2234 #journal .journal_action_container {
2234 #journal .journal_action_container {
2235 padding-left: 38px;
2235 padding-left: 38px;
2236 }
2236 }
2237
2237
2238 #journal .journal_user {
2238 #journal .journal_user {
2239 color: #747474;
2239 color: #747474;
2240 font-size: 14px;
2240 font-size: 14px;
2241 font-weight: bold;
2241 font-weight: bold;
2242 height: 30px;
2242 height: 30px;
2243 }
2243 }
2244
2244
2245 #journal .journal_user.deleted {
2245 #journal .journal_user.deleted {
2246 color: #747474;
2246 color: #747474;
2247 font-size: 14px;
2247 font-size: 14px;
2248 font-weight: normal;
2248 font-weight: normal;
2249 height: 30px;
2249 height: 30px;
2250 font-style: italic;
2250 font-style: italic;
2251 }
2251 }
2252
2252
2253
2253
2254 #journal .journal_icon {
2254 #journal .journal_icon {
2255 clear: both;
2255 clear: both;
2256 float: left;
2256 float: left;
2257 padding-right: 4px;
2257 padding-right: 4px;
2258 padding-top: 3px;
2258 padding-top: 3px;
2259 }
2259 }
2260
2260
2261 #journal .journal_action {
2261 #journal .journal_action {
2262 padding-top: 4px;
2262 padding-top: 4px;
2263 min-height: 2px;
2263 min-height: 2px;
2264 float: left
2264 float: left
2265 }
2265 }
2266
2266
2267 #journal .journal_action_params {
2267 #journal .journal_action_params {
2268 clear: left;
2268 clear: left;
2269 padding-left: 22px;
2269 padding-left: 22px;
2270 }
2270 }
2271
2271
2272 #journal .journal_repo {
2272 #journal .journal_repo {
2273 float: left;
2273 float: left;
2274 margin-left: 6px;
2274 margin-left: 6px;
2275 padding-top: 3px;
2275 padding-top: 3px;
2276 }
2276 }
2277
2277
2278 #journal .date {
2278 #journal .date {
2279 clear: both;
2279 clear: both;
2280 color: #777777;
2280 color: #777777;
2281 font-size: 11px;
2281 font-size: 11px;
2282 padding-left: 22px;
2282 padding-left: 22px;
2283 }
2283 }
2284
2284
2285 #journal .journal_repo .journal_repo_name {
2285 #journal .journal_repo .journal_repo_name {
2286 font-weight: bold;
2286 font-weight: bold;
2287 font-size: 1.1em;
2287 font-size: 1.1em;
2288 }
2288 }
2289
2289
2290 #journal .compare_view {
2290 #journal .compare_view {
2291 padding: 5px 0px 5px 0px;
2291 padding: 5px 0px 5px 0px;
2292 width: 95px;
2292 width: 95px;
2293 }
2293 }
2294
2294
2295 .journal_highlight {
2295 .journal_highlight {
2296 font-weight: bold;
2296 font-weight: bold;
2297 padding: 0 2px;
2297 padding: 0 2px;
2298 vertical-align: bottom;
2298 vertical-align: bottom;
2299 }
2299 }
2300
2300
2301 .trending_language_tbl, .trending_language_tbl td {
2301 .trending_language_tbl, .trending_language_tbl td {
2302 border: 0 !important;
2302 border: 0 !important;
2303 margin: 0 !important;
2303 margin: 0 !important;
2304 padding: 0 !important;
2304 padding: 0 !important;
2305 }
2305 }
2306
2306
2307 .trending_language_tbl, .trending_language_tbl tr {
2307 .trending_language_tbl, .trending_language_tbl tr {
2308 border-spacing: 1px;
2308 border-spacing: 1px;
2309 }
2309 }
2310
2310
2311 .trending_language {
2311 .trending_language {
2312 background-color: #577632;
2312 background-color: #577632;
2313 color: #FFF;
2313 color: #FFF;
2314 display: block;
2314 display: block;
2315 min-width: 20px;
2315 min-width: 20px;
2316 text-decoration: none;
2316 text-decoration: none;
2317 height: 12px;
2317 height: 12px;
2318 margin-bottom: 0px;
2318 margin-bottom: 0px;
2319 margin-left: 5px;
2319 margin-left: 5px;
2320 white-space: pre;
2320 white-space: pre;
2321 padding: 3px;
2321 padding: 3px;
2322 }
2322 }
2323
2323
2324 h3.files_location {
2324 h3.files_location {
2325 font-size: 1.8em;
2325 font-size: 1.8em;
2326 font-weight: 700;
2326 font-weight: 700;
2327 border-bottom: none !important;
2327 border-bottom: none !important;
2328 margin: 10px 0 !important;
2328 margin: 10px 0 !important;
2329 }
2329 }
2330
2330
2331 #files_data dl dt {
2331 #files_data dl dt {
2332 float: left;
2332 float: left;
2333 width: 60px;
2333 width: 60px;
2334 margin: 0 !important;
2334 margin: 0 !important;
2335 padding: 5px;
2335 padding: 5px;
2336 }
2336 }
2337
2337
2338 #files_data dl dd {
2338 #files_data dl dd {
2339 margin: 0 !important;
2339 margin: 0 !important;
2340 padding: 5px !important;
2340 padding: 5px !important;
2341 }
2341 }
2342
2342
2343 #files_data .codeblock #editor_container .error-message {
2343 #files_data .codeblock #editor_container .error-message {
2344 color: red;
2344 color: red;
2345 padding: 10px 10px 10px 26px
2345 padding: 10px 10px 10px 26px
2346 }
2346 }
2347
2347
2348 .file_history {
2348 .file_history {
2349 padding-top: 10px;
2349 padding-top: 10px;
2350 font-size: 16px;
2350 font-size: 16px;
2351 }
2351 }
2352 .file_author {
2352 .file_author {
2353 float: left;
2353 float: left;
2354 }
2354 }
2355
2355
2356 .file_author .item {
2356 .file_author .item {
2357 float: left;
2357 float: left;
2358 padding: 5px;
2358 padding: 5px;
2359 color: #888;
2359 color: #888;
2360 }
2360 }
2361
2361
2362 .tablerow0 {
2362 .tablerow0 {
2363 background-color: #F8F8F8;
2363 background-color: #F8F8F8;
2364 }
2364 }
2365
2365
2366 .tablerow1 {
2366 .tablerow1 {
2367 background-color: #FFFFFF;
2367 background-color: #FFFFFF;
2368 }
2368 }
2369
2369
2370 .changeset_id {
2370 .changeset_id {
2371 color: #666666;
2371 color: #666666;
2372 margin-right: -3px;
2372 margin-right: -3px;
2373 }
2373 }
2374
2374
2375 .changeset_hash {
2375 .changeset_hash {
2376 color: #000000;
2376 color: #000000;
2377 }
2377 }
2378
2378
2379 #changeset_content {
2379 #changeset_content {
2380 border-left: 1px solid #CCC;
2380 border-left: 1px solid #CCC;
2381 border-right: 1px solid #CCC;
2381 border-right: 1px solid #CCC;
2382 border-bottom: 1px solid #CCC;
2382 border-bottom: 1px solid #CCC;
2383 padding: 5px;
2383 padding: 5px;
2384 }
2384 }
2385
2385
2386 #changeset_compare_view_content {
2386 #changeset_compare_view_content {
2387 border: 1px solid #CCC;
2387 border: 1px solid #CCC;
2388 padding: 5px;
2388 padding: 5px;
2389 }
2389 }
2390
2390
2391 #changeset_content .container {
2391 #changeset_content .container {
2392 min-height: 100px;
2392 min-height: 100px;
2393 font-size: 1.2em;
2393 font-size: 1.2em;
2394 overflow: hidden;
2394 overflow: hidden;
2395 }
2395 }
2396
2396
2397 #changeset_compare_view_content .compare_view_commits {
2397 #changeset_compare_view_content .compare_view_commits {
2398 width: auto !important;
2398 width: auto !important;
2399 }
2399 }
2400
2400
2401 #changeset_compare_view_content .compare_view_commits td {
2401 #changeset_compare_view_content .compare_view_commits td {
2402 padding: 0px 0px 0px 12px !important;
2402 padding: 0px 0px 0px 12px !important;
2403 }
2403 }
2404
2404
2405 #changeset_content .container .right {
2405 #changeset_content .container .right {
2406 float: right;
2406 float: right;
2407 width: 20%;
2407 width: 20%;
2408 text-align: right;
2408 text-align: right;
2409 }
2409 }
2410
2410
2411 #changeset_content .container .message {
2411 #changeset_content .container .message {
2412 white-space: pre-wrap;
2412 white-space: pre-wrap;
2413 }
2413 }
2414 #changeset_content .container .message a:hover {
2414 #changeset_content .container .message a:hover {
2415 text-decoration: none;
2415 text-decoration: none;
2416 }
2416 }
2417 .cs_files .cur_cs {
2417 .cs_files .cur_cs {
2418 margin: 10px 2px;
2418 margin: 10px 2px;
2419 font-weight: bold;
2419 font-weight: bold;
2420 }
2420 }
2421
2421
2422 .cs_files .node {
2422 .cs_files .node {
2423 float: left;
2423 float: left;
2424 }
2424 }
2425
2425
2426 .cs_files .changes {
2426 .cs_files .changes {
2427 float: right;
2427 float: right;
2428 color: #577632;
2428 color: #577632;
2429 }
2429 }
2430
2430
2431 .cs_files .changes .added {
2431 .cs_files .changes .added {
2432 background-color: #BBFFBB;
2432 background-color: #BBFFBB;
2433 float: left;
2433 float: left;
2434 text-align: center;
2434 text-align: center;
2435 font-size: 9px;
2435 font-size: 9px;
2436 padding: 2px 0px 2px 0px;
2436 padding: 2px 0px 2px 0px;
2437 }
2437 }
2438
2438
2439 .cs_files .changes .deleted {
2439 .cs_files .changes .deleted {
2440 background-color: #FF8888;
2440 background-color: #FF8888;
2441 float: left;
2441 float: left;
2442 text-align: center;
2442 text-align: center;
2443 font-size: 9px;
2443 font-size: 9px;
2444 padding: 2px 0px 2px 0px;
2444 padding: 2px 0px 2px 0px;
2445 }
2445 }
2446 /*new binary
2446 /*new binary
2447 NEW_FILENODE = 1
2447 NEW_FILENODE = 1
2448 DEL_FILENODE = 2
2448 DEL_FILENODE = 2
2449 MOD_FILENODE = 3
2449 MOD_FILENODE = 3
2450 RENAMED_FILENODE = 4
2450 RENAMED_FILENODE = 4
2451 CHMOD_FILENODE = 5
2451 CHMOD_FILENODE = 5
2452 BIN_FILENODE = 6
2452 BIN_FILENODE = 6
2453 */
2453 */
2454 .cs_files .changes .bin {
2454 .cs_files .changes .bin {
2455 background-color: #BBFFBB;
2455 background-color: #BBFFBB;
2456 float: left;
2456 float: left;
2457 text-align: center;
2457 text-align: center;
2458 font-size: 9px;
2458 font-size: 9px;
2459 padding: 2px 0px 2px 0px;
2459 padding: 2px 0px 2px 0px;
2460 }
2460 }
2461 .cs_files .changes .bin.bin1 {
2461 .cs_files .changes .bin.bin1 {
2462 background-color: #BBFFBB;
2462 background-color: #BBFFBB;
2463 }
2463 }
2464
2464
2465 /*deleted binary*/
2465 /*deleted binary*/
2466 .cs_files .changes .bin.bin2 {
2466 .cs_files .changes .bin.bin2 {
2467 background-color: #FF8888;
2467 background-color: #FF8888;
2468 }
2468 }
2469
2469
2470 /*mod binary*/
2470 /*mod binary*/
2471 .cs_files .changes .bin.bin3 {
2471 .cs_files .changes .bin.bin3 {
2472 background-color: #DDDDDD;
2472 background-color: #DDDDDD;
2473 }
2473 }
2474
2474
2475 /*rename file*/
2475 /*rename file*/
2476 .cs_files .changes .bin.bin4 {
2476 .cs_files .changes .bin.bin4 {
2477 background-color: #6D99FF;
2477 background-color: #6D99FF;
2478 }
2478 }
2479
2479
2480 /*rename file*/
2480 /*rename file*/
2481 .cs_files .changes .bin.bin4 {
2481 .cs_files .changes .bin.bin4 {
2482 background-color: #6D99FF;
2482 background-color: #6D99FF;
2483 }
2483 }
2484
2484
2485 /*chmod file*/
2485 /*chmod file*/
2486 .cs_files .changes .bin.bin5 {
2486 .cs_files .changes .bin.bin5 {
2487 background-color: #6D99FF;
2487 background-color: #6D99FF;
2488 }
2488 }
2489
2489
2490 .cs_files .cs_added, .cs_files .cs_A {
2490 .cs_files .cs_added, .cs_files .cs_A {
2491 background: url("../images/icons/page_white_add.png") no-repeat scroll
2491 background: url("../images/icons/page_white_add.png") no-repeat scroll
2492 3px;
2492 3px;
2493 height: 16px;
2493 height: 16px;
2494 padding-left: 20px;
2494 padding-left: 20px;
2495 margin-top: 7px;
2495 margin-top: 7px;
2496 text-align: left;
2496 text-align: left;
2497 }
2497 }
2498
2498
2499 .cs_files .cs_changed, .cs_files .cs_M {
2499 .cs_files .cs_changed, .cs_files .cs_M {
2500 background: url("../images/icons/page_white_edit.png") no-repeat scroll
2500 background: url("../images/icons/page_white_edit.png") no-repeat scroll
2501 3px;
2501 3px;
2502 height: 16px;
2502 height: 16px;
2503 padding-left: 20px;
2503 padding-left: 20px;
2504 margin-top: 7px;
2504 margin-top: 7px;
2505 text-align: left;
2505 text-align: left;
2506 }
2506 }
2507
2507
2508 .cs_files .cs_removed, .cs_files .cs_D {
2508 .cs_files .cs_removed, .cs_files .cs_D {
2509 background: url("../images/icons/page_white_delete.png") no-repeat
2509 background: url("../images/icons/page_white_delete.png") no-repeat
2510 scroll 3px;
2510 scroll 3px;
2511 height: 16px;
2511 height: 16px;
2512 padding-left: 20px;
2512 padding-left: 20px;
2513 margin-top: 7px;
2513 margin-top: 7px;
2514 text-align: left;
2514 text-align: left;
2515 }
2515 }
2516
2516
2517 .table {
2517 .table {
2518 position: relative;
2518 position: relative;
2519 }
2519 }
2520
2520
2521 #graph {
2521 #graph {
2522 position: relative;
2522 position: relative;
2523 overflow: hidden;
2523 overflow: hidden;
2524 }
2524 }
2525
2525
2526 #graph_nodes {
2526 #graph_nodes {
2527 position: absolute;
2527 position: absolute;
2528 }
2528 }
2529
2529
2530 #graph_content,
2530 #graph_content,
2531 #graph .info_box,
2531 #graph .info_box,
2532 #graph .container_header {
2532 #graph .container_header {
2533 margin-left: 100px;
2533 margin-left: 100px;
2534 }
2534 }
2535
2535
2536 #graph_content {
2536 #graph_content {
2537 position: relative;
2537 position: relative;
2538 }
2538 }
2539
2539
2540 #graph .container_header {
2540 #graph .container_header {
2541 padding: 10px;
2541 padding: 10px;
2542 height: 25px;
2542 height: 25px;
2543 }
2543 }
2544
2544
2545 #graph_content #rev_range_container {
2545 #graph_content #rev_range_container {
2546 float: left;
2546 float: left;
2547 margin: 0px 0px 0px 3px;
2547 margin: 0px 0px 0px 3px;
2548 }
2548 }
2549
2549
2550 #graph_content #rev_range_clear {
2550 #graph_content #rev_range_clear {
2551 float: left;
2551 float: left;
2552 margin: 0px 0px 0px 3px;
2552 margin: 0px 0px 0px 3px;
2553 }
2553 }
2554
2554
2555 #graph_content #changesets {
2555 #graph_content #changesets {
2556 table-layout: fixed;
2556 table-layout: fixed;
2557 border-collapse: collapse;
2557 border-collapse: collapse;
2558 border-left: none;
2558 border-left: none;
2559 border-right: none;
2559 border-right: none;
2560 border-color: #cdcdcd;
2560 border-color: #cdcdcd;
2561 }
2561 }
2562
2562
2563 #graph_content #changesets td {
2563 #graph_content #changesets td {
2564 overflow: hidden;
2564 overflow: hidden;
2565 text-overflow: ellipsis;
2565 text-overflow: ellipsis;
2566 white-space: nowrap;
2566 white-space: nowrap;
2567 height: 31px;
2567 height: 31px;
2568 border-color: #cdcdcd;
2568 border-color: #cdcdcd;
2569 text-align: left;
2569 text-align: left;
2570 }
2570 }
2571
2571
2572 #graph_content .container .checkbox {
2572 #graph_content .container .checkbox {
2573 width: 12px;
2573 width: 12px;
2574 font-size: 0.85em;
2574 font-size: 0.85em;
2575 }
2575 }
2576
2576
2577 #graph_content .container .status {
2577 #graph_content .container .status {
2578 width: 14px;
2578 width: 14px;
2579 font-size: 0.85em;
2579 font-size: 0.85em;
2580 }
2580 }
2581
2581
2582 #graph_content .container .author {
2582 #graph_content .container .author {
2583 width: 105px;
2583 width: 105px;
2584 }
2584 }
2585
2585
2586 #graph_content .container .hash {
2586 #graph_content .container .hash {
2587 width: 100px;
2587 width: 100px;
2588 font-size: 0.85em;
2588 font-size: 0.85em;
2589 }
2589 }
2590
2590
2591 #graph_content #changesets .container .date {
2591 #graph_content #changesets .container .date {
2592 width: 76px;
2592 width: 76px;
2593 color: #666;
2593 color: #666;
2594 font-size: 10px;
2594 font-size: 10px;
2595 }
2595 }
2596
2596
2597 #graph_content_pr .compare_view_commits .expand_commit,
2597 #graph_content_pr .compare_view_commits .expand_commit,
2598 #graph_content .container .expand_commit {
2598 #graph_content .container .expand_commit {
2599 width: 24px;
2599 width: 24px;
2600 cursor: pointer;
2600 cursor: pointer;
2601 }
2601 }
2602
2602
2603 #graph_content #changesets .container .right {
2603 #graph_content #changesets .container .right {
2604 width: 120px;
2604 width: 120px;
2605 padding-right: 0px;
2605 padding-right: 0px;
2606 overflow: visible;
2606 overflow: visible;
2607 position: relative;
2607 position: relative;
2608 }
2608 }
2609
2609
2610 #graph_content .container .mid {
2610 #graph_content .container .mid {
2611 padding: 0;
2611 padding: 0;
2612 }
2612 }
2613
2613
2614 #graph_content .log-container {
2614 #graph_content .log-container {
2615 position: relative;
2615 position: relative;
2616 }
2616 }
2617
2617
2618 #graph_content .container .changeset_range {
2618 #graph_content .container .changeset_range {
2619 float: left;
2619 float: left;
2620 margin: 6px 3px;
2620 margin: 6px 3px;
2621 }
2621 }
2622
2622
2623 #graph_content .container .author img {
2623 #graph_content .container .author img {
2624 vertical-align: middle;
2624 vertical-align: middle;
2625 }
2625 }
2626
2626
2627 #graph_content .container .author .user {
2627 #graph_content .container .author .user {
2628 color: #444444;
2628 color: #444444;
2629 }
2629 }
2630
2630
2631 #graph_content .container .mid .message {
2631 #graph_content .container .mid .message {
2632 white-space: pre-wrap;
2632 white-space: pre-wrap;
2633 padding: 0;
2633 padding: 0;
2634 overflow: hidden;
2634 overflow: hidden;
2635 height: 1.1em;
2635 height: 1.1em;
2636 }
2636 }
2637
2637
2638 #graph_content .container .extra-container {
2638 #graph_content .container .extra-container {
2639 display: block;
2639 display: block;
2640 position: absolute;
2640 position: absolute;
2641 top: -15px;
2641 top: -15px;
2642 right: 0;
2642 right: 0;
2643 padding-left: 5px;
2643 padding-left: 5px;
2644 background: #FFFFFF;
2644 background: #FFFFFF;
2645 height: 41px;
2645 height: 41px;
2646 }
2646 }
2647
2647
2648 #graph_content .comments-container,
2648 #graph_content .comments-container,
2649 #shortlog_data .comments-container,
2649 #shortlog_data .comments-container,
2650 #graph_content .logtags {
2650 #graph_content .logtags {
2651 display: block;
2651 display: block;
2652 float: left;
2652 float: left;
2653 overflow: hidden;
2653 overflow: hidden;
2654 padding: 0;
2654 padding: 0;
2655 margin: 0;
2655 margin: 0;
2656 }
2656 }
2657
2657
2658 #graph_content .comments-container {
2658 #graph_content .comments-container {
2659 margin: 0.8em 0;
2659 margin: 0.8em 0;
2660 margin-right: 0.5em;
2660 margin-right: 0.5em;
2661 }
2661 }
2662
2662
2663 #graph_content .tagcontainer {
2663 #graph_content .tagcontainer {
2664 width: 80px;
2664 width: 80px;
2665 position: relative;
2665 position: relative;
2666 float: right;
2666 float: right;
2667 height: 100%;
2667 height: 100%;
2668 top: 7px;
2668 top: 7px;
2669 margin-left: 0.5em;
2669 margin-left: 0.5em;
2670 }
2670 }
2671
2671
2672 #graph_content .logtags {
2672 #graph_content .logtags {
2673 min-width: 80px;
2673 min-width: 80px;
2674 height: 1.1em;
2674 height: 1.1em;
2675 position: absolute;
2675 position: absolute;
2676 left: 0px;
2676 left: 0px;
2677 width: auto;
2677 width: auto;
2678 top: 0px;
2678 top: 0px;
2679 }
2679 }
2680
2680
2681 #graph_content .logtags.tags {
2681 #graph_content .logtags.tags {
2682 top: 14px;
2682 top: 14px;
2683 }
2683 }
2684
2684
2685 #graph_content .logtags:hover {
2685 #graph_content .logtags:hover {
2686 overflow: visible;
2686 overflow: visible;
2687 position: absolute;
2687 position: absolute;
2688 width: auto;
2688 width: auto;
2689 right: 0;
2689 right: 0;
2690 left: initial;
2690 left: initial;
2691 }
2691 }
2692
2692
2693 #graph_content .logtags .booktag,
2693 #graph_content .logtags .booktag,
2694 #graph_content .logtags .tagtag {
2694 #graph_content .logtags .tagtag {
2695 float: left;
2695 float: left;
2696 line-height: 1em;
2696 line-height: 1em;
2697 margin-bottom: 1px;
2697 margin-bottom: 1px;
2698 margin-right: 1px;
2698 margin-right: 1px;
2699 padding: 1px 3px;
2699 padding: 1px 3px;
2700 font-size: 10px;
2700 font-size: 10px;
2701 }
2701 }
2702
2702
2703 #graph_content .container .mid .message a:hover {
2703 #graph_content .container .mid .message a:hover {
2704 text-decoration: none;
2704 text-decoration: none;
2705 }
2705 }
2706
2706
2707 .revision-link {
2707 .revision-link {
2708 color: #3F6F9F;
2708 color: #3F6F9F;
2709 font-weight: bold !important;
2709 font-weight: bold !important;
2710 }
2710 }
2711
2711
2712 .issue-tracker-link {
2712 .issue-tracker-link {
2713 color: #3F6F9F;
2713 color: #3F6F9F;
2714 font-weight: bold !important;
2714 font-weight: bold !important;
2715 }
2715 }
2716
2716
2717 .changeset-status-container {
2717 .changeset-status-container {
2718 padding-right: 5px;
2718 padding-right: 5px;
2719 margin-top: 1px;
2719 margin-top: 1px;
2720 float: right;
2720 float: right;
2721 height: 14px;
2721 height: 14px;
2722 }
2722 }
2723 .code-header .changeset-status-container {
2723 .code-header .changeset-status-container {
2724 float: left;
2724 float: left;
2725 padding: 2px 0px 0px 2px;
2725 padding: 2px 0px 0px 2px;
2726 }
2726 }
2727 .changeset-status-container .changeset-status-lbl {
2727 .changeset-status-container .changeset-status-lbl {
2728 float: left;
2728 float: left;
2729 padding: 3px 4px 0px 0px
2729 padding: 3px 4px 0px 0px
2730 }
2730 }
2731 .code-header .changeset-status-container .changeset-status-lbl {
2731 .code-header .changeset-status-container .changeset-status-lbl {
2732 float: left;
2732 float: left;
2733 padding: 0px 4px 0px 0px;
2733 padding: 0px 4px 0px 0px;
2734 }
2734 }
2735 .changeset-status-container .changeset-status-ico {
2735 .changeset-status-container .changeset-status-ico {
2736 float: left;
2736 float: left;
2737 }
2737 }
2738 .code-header .changeset-status-container .changeset-status-ico, .container .changeset-status-ico {
2738 .code-header .changeset-status-container .changeset-status-ico, .container .changeset-status-ico {
2739 float: left;
2739 float: left;
2740 }
2740 }
2741
2741
2742 #graph_content .comments-cnt {
2742 #graph_content .comments-cnt {
2743 color: rgb(136, 136, 136);
2743 color: rgb(136, 136, 136);
2744 padding: 5px 0;
2744 padding: 5px 0;
2745 }
2745 }
2746
2746
2747 #shortlog_data .comments-cnt {
2747 #shortlog_data .comments-cnt {
2748 color: rgb(136, 136, 136);
2748 color: rgb(136, 136, 136);
2749 padding: 3px 0;
2749 padding: 3px 0;
2750 }
2750 }
2751
2751
2752 #graph_content .comments-cnt a,
2752 #graph_content .comments-cnt a,
2753 #shortlog_data .comments-cnt a {
2753 #shortlog_data .comments-cnt a {
2754 background-image: url('../images/icons/comments.png');
2754 background-image: url('../images/icons/comments.png');
2755 background-repeat: no-repeat;
2755 background-repeat: no-repeat;
2756 background-position: 100% 50%;
2756 background-position: 100% 50%;
2757 padding: 5px 0;
2757 padding: 5px 0;
2758 padding-right: 20px;
2758 padding-right: 20px;
2759 }
2759 }
2760
2760
2761 .right .changes {
2761 .right .changes {
2762 clear: both;
2762 clear: both;
2763 }
2763 }
2764
2764
2765 .right .changes .changed_total {
2765 .right .changes .changed_total {
2766 display: block;
2766 display: block;
2767 float: right;
2767 float: right;
2768 text-align: center;
2768 text-align: center;
2769 min-width: 45px;
2769 min-width: 45px;
2770 cursor: pointer;
2770 cursor: pointer;
2771 color: #444444;
2771 color: #444444;
2772 background: #FEA;
2772 background: #FEA;
2773 -webkit-border-radius: 0px 0px 0px 6px;
2773 -webkit-border-radius: 0px 0px 0px 6px;
2774 border-radius: 0px 0px 0px 6px;
2774 border-radius: 0px 0px 0px 6px;
2775 padding: 1px;
2775 padding: 1px;
2776 }
2776 }
2777
2777
2778 .right .changes .added, .changed, .removed {
2778 .right .changes .added, .changed, .removed {
2779 display: block;
2779 display: block;
2780 padding: 1px;
2780 padding: 1px;
2781 color: #444444;
2781 color: #444444;
2782 float: right;
2782 float: right;
2783 text-align: center;
2783 text-align: center;
2784 min-width: 15px;
2784 min-width: 15px;
2785 }
2785 }
2786
2786
2787 .right .changes .added {
2787 .right .changes .added {
2788 background: #CFC;
2788 background: #CFC;
2789 }
2789 }
2790
2790
2791 .right .changes .changed {
2791 .right .changes .changed {
2792 background: #FEA;
2792 background: #FEA;
2793 }
2793 }
2794
2794
2795 .right .changes .removed {
2795 .right .changes .removed {
2796 background: #FAA;
2796 background: #FAA;
2797 }
2797 }
2798
2798
2799 .right .merge {
2799 .right .merge {
2800 padding: 1px 3px 1px 3px;
2800 padding: 1px 3px 1px 3px;
2801 background-color: #fca062;
2801 background-color: #fca062;
2802 font-size: 10px;
2802 font-size: 10px;
2803 color: #ffffff;
2803 color: #ffffff;
2804 text-transform: uppercase;
2804 text-transform: uppercase;
2805 white-space: nowrap;
2805 white-space: nowrap;
2806 -webkit-border-radius: 3px;
2806 -webkit-border-radius: 3px;
2807 border-radius: 3px;
2807 border-radius: 3px;
2808 margin-right: 2px;
2808 margin-right: 2px;
2809 }
2809 }
2810
2810
2811 .right .parent {
2811 .right .parent {
2812 color: #666666;
2812 color: #666666;
2813 clear: both;
2813 clear: both;
2814 }
2814 }
2815 .right .logtags {
2815 .right .logtags {
2816 line-height: 2.2em;
2816 line-height: 2.2em;
2817 }
2817 }
2818 .branchtag, .logtags .tagtag, .logtags .booktag {
2818 .branchtag, .logtags .tagtag, .logtags .booktag {
2819 margin: 0px 2px;
2819 margin: 0px 2px;
2820 }
2820 }
2821
2821
2822 .branchtag,
2822 .branchtag,
2823 .tagtag,
2823 .tagtag,
2824 .booktag,
2824 .booktag,
2825 .spantag {
2825 .spantag {
2826 padding: 1px 3px 1px 3px;
2826 padding: 1px 3px 1px 3px;
2827 font-size: 10px;
2827 font-size: 10px;
2828 color: #577632;
2828 color: #577632;
2829 white-space: nowrap;
2829 white-space: nowrap;
2830 -webkit-border-radius: 4px;
2830 -webkit-border-radius: 4px;
2831 border-radius: 4px;
2831 border-radius: 4px;
2832 border: 1px solid #d9e8f8;
2832 border: 1px solid #d9e8f8;
2833 line-height: 1.5em;
2833 line-height: 1.5em;
2834 }
2834 }
2835
2835
2836 #graph_content .branchtag,
2836 #graph_content .branchtag,
2837 #graph_content .tagtag,
2837 #graph_content .tagtag,
2838 #graph_content .booktag {
2838 #graph_content .booktag {
2839 margin: 1.1em 0;
2839 margin: 1.1em 0;
2840 margin-right: 0.5em;
2840 margin-right: 0.5em;
2841 }
2841 }
2842
2842
2843 .branchtag,
2843 .branchtag,
2844 .tagtag,
2844 .tagtag,
2845 .booktag {
2845 .booktag {
2846 float: left;
2846 float: left;
2847 }
2847 }
2848
2848
2849 .right .logtags .branchtag,
2849 .right .logtags .branchtag,
2850 .right .logtags .tagtag,
2850 .right .logtags .tagtag,
2851 .right .logtags .booktag,
2851 .right .logtags .booktag,
2852 .right .merge {
2852 .right .merge {
2853 float: right;
2853 float: right;
2854 line-height: 1em;
2854 line-height: 1em;
2855 margin: 1px 1px !important;
2855 margin: 1px 1px !important;
2856 display: block;
2856 display: block;
2857 }
2857 }
2858
2858
2859 .booktag {
2859 .booktag {
2860 border-color: #46A546;
2860 border-color: #46A546;
2861 color: #46A546;
2861 color: #46A546;
2862 }
2862 }
2863
2863
2864 .tagtag {
2864 .tagtag {
2865 border-color: #62cffc;
2865 border-color: #62cffc;
2866 color: #62cffc;
2866 color: #62cffc;
2867 }
2867 }
2868
2868
2869 .logtags .branchtag a:hover,
2869 .logtags .branchtag a:hover,
2870 .logtags .branchtag a,
2870 .logtags .branchtag a,
2871 .branchtag a,
2871 .branchtag a,
2872 .branchtag a:hover {
2872 .branchtag a:hover {
2873 text-decoration: none;
2873 text-decoration: none;
2874 color: inherit;
2874 color: inherit;
2875 }
2875 }
2876 .logtags .tagtag {
2876 .logtags .tagtag {
2877 padding: 1px 3px 1px 3px;
2877 padding: 1px 3px 1px 3px;
2878 background-color: #62cffc;
2878 background-color: #62cffc;
2879 font-size: 10px;
2879 font-size: 10px;
2880 color: #ffffff;
2880 color: #ffffff;
2881 white-space: nowrap;
2881 white-space: nowrap;
2882 -webkit-border-radius: 3px;
2882 -webkit-border-radius: 3px;
2883 border-radius: 3px;
2883 border-radius: 3px;
2884 }
2884 }
2885
2885
2886 .tagtag a,
2886 .tagtag a,
2887 .tagtag a:hover,
2887 .tagtag a:hover,
2888 .logtags .tagtag a,
2888 .logtags .tagtag a,
2889 .logtags .tagtag a:hover {
2889 .logtags .tagtag a:hover {
2890 text-decoration: none;
2890 text-decoration: none;
2891 color: inherit;
2891 color: inherit;
2892 }
2892 }
2893 .logbooks .booktag, .logbooks .booktag, .logtags .booktag, .logtags .booktag {
2893 .logbooks .booktag, .logbooks .booktag, .logtags .booktag, .logtags .booktag {
2894 padding: 1px 3px 1px 3px;
2894 padding: 1px 3px 1px 3px;
2895 background-color: #46A546;
2895 background-color: #46A546;
2896 font-size: 10px;
2896 font-size: 10px;
2897 color: #ffffff;
2897 color: #ffffff;
2898 white-space: nowrap;
2898 white-space: nowrap;
2899 -webkit-border-radius: 3px;
2899 -webkit-border-radius: 3px;
2900 border-radius: 3px;
2900 border-radius: 3px;
2901 }
2901 }
2902 .logbooks .booktag, .logbooks .booktag a, .right .logtags .booktag, .logtags .booktag a {
2902 .logbooks .booktag, .logbooks .booktag a, .right .logtags .booktag, .logtags .booktag a {
2903 color: #ffffff;
2903 color: #ffffff;
2904 }
2904 }
2905
2905
2906 .logbooks .booktag, .logbooks .booktag a:hover,
2906 .logbooks .booktag, .logbooks .booktag a:hover,
2907 .logtags .booktag, .logtags .booktag a:hover,
2907 .logtags .booktag, .logtags .booktag a:hover,
2908 .booktag a,
2908 .booktag a,
2909 .booktag a:hover {
2909 .booktag a:hover {
2910 text-decoration: none;
2910 text-decoration: none;
2911 color: inherit;
2911 color: inherit;
2912 }
2912 }
2913 div.browserblock {
2913 div.browserblock {
2914 overflow: hidden;
2914 overflow: hidden;
2915 border: 1px solid #ccc;
2915 border: 1px solid #ccc;
2916 background: #f8f8f8;
2916 background: #f8f8f8;
2917 font-size: 100%;
2917 font-size: 100%;
2918 line-height: 125%;
2918 line-height: 125%;
2919 padding: 0;
2919 padding: 0;
2920 -webkit-border-radius: 6px 6px 0px 0px;
2920 -webkit-border-radius: 6px 6px 0px 0px;
2921 border-radius: 6px 6px 0px 0px;
2921 border-radius: 6px 6px 0px 0px;
2922 }
2922 }
2923
2923
2924 div.browserblock .browser-header {
2924 div.browserblock .browser-header {
2925 background: #FFF;
2925 background: #FFF;
2926 padding: 10px 0px 15px 0px;
2926 padding: 10px 0px 15px 0px;
2927 width: 100%;
2927 width: 100%;
2928 }
2928 }
2929
2929
2930 div.browserblock .browser-nav {
2930 div.browserblock .browser-nav {
2931 float: left
2931 float: left
2932 }
2932 }
2933
2933
2934 div.browserblock .browser-branch {
2934 div.browserblock .browser-branch {
2935 float: left;
2935 float: left;
2936 }
2936 }
2937
2937
2938 div.browserblock .browser-branch label {
2938 div.browserblock .browser-branch label {
2939 color: #4A4A4A;
2939 color: #4A4A4A;
2940 vertical-align: text-top;
2940 vertical-align: text-top;
2941 }
2941 }
2942
2942
2943 div.browserblock .browser-header span {
2943 div.browserblock .browser-header span {
2944 margin-left: 5px;
2944 margin-left: 5px;
2945 font-weight: 700;
2945 font-weight: 700;
2946 }
2946 }
2947
2947
2948 div.browserblock .browser-search {
2948 div.browserblock .browser-search {
2949 clear: both;
2949 clear: both;
2950 padding: 8px 8px 0px 5px;
2950 padding: 8px 8px 0px 5px;
2951 height: 20px;
2951 height: 20px;
2952 }
2952 }
2953
2953
2954 div.browserblock #node_filter_box {
2954 div.browserblock #node_filter_box {
2955 }
2955 }
2956
2956
2957 div.browserblock .search_activate {
2957 div.browserblock .search_activate {
2958 float: left
2958 float: left
2959 }
2959 }
2960
2960
2961 div.browserblock .add_node {
2961 div.browserblock .add_node {
2962 float: left;
2962 float: left;
2963 padding-left: 5px;
2963 padding-left: 5px;
2964 }
2964 }
2965
2965
2966 div.browserblock .search_activate a:hover, div.browserblock .add_node a:hover {
2966 div.browserblock .search_activate a:hover, div.browserblock .add_node a:hover {
2967 text-decoration: none !important;
2967 text-decoration: none !important;
2968 }
2968 }
2969
2969
2970 div.browserblock .browser-body {
2970 div.browserblock .browser-body {
2971 background: #EEE;
2971 background: #EEE;
2972 border-top: 1px solid #CCC;
2972 border-top: 1px solid #CCC;
2973 }
2973 }
2974
2974
2975 table.code-browser {
2975 table.code-browser {
2976 border-collapse: collapse;
2976 border-collapse: collapse;
2977 width: 100%;
2977 width: 100%;
2978 }
2978 }
2979
2979
2980 table.code-browser tr {
2980 table.code-browser tr {
2981 margin: 3px;
2981 margin: 3px;
2982 }
2982 }
2983
2983
2984 table.code-browser thead th {
2984 table.code-browser thead th {
2985 background-color: #EEE;
2985 background-color: #EEE;
2986 height: 20px;
2986 height: 20px;
2987 font-size: 1.1em;
2987 font-size: 1.1em;
2988 font-weight: 700;
2988 font-weight: 700;
2989 text-align: left;
2989 text-align: left;
2990 padding-left: 10px;
2990 padding-left: 10px;
2991 }
2991 }
2992
2992
2993 table.code-browser tbody td {
2993 table.code-browser tbody td {
2994 padding-left: 10px;
2994 padding-left: 10px;
2995 height: 20px;
2995 height: 20px;
2996 }
2996 }
2997
2997
2998 table.code-browser .browser-file {
2998 table.code-browser .browser-file {
2999 background: url("../images/icons/document_16.png") no-repeat scroll 3px;
2999 background: url("../images/icons/document_16.png") no-repeat scroll 3px;
3000 height: 16px;
3000 height: 16px;
3001 padding-left: 20px;
3001 padding-left: 20px;
3002 text-align: left;
3002 text-align: left;
3003 }
3003 }
3004 .diffblock .changeset_header {
3004 .diffblock .changeset_header {
3005 height: 16px;
3005 height: 16px;
3006 }
3006 }
3007 .diffblock .changeset_file {
3007 .diffblock .changeset_file {
3008 float: left;
3008 float: left;
3009 }
3009 }
3010 .diffblock .diff-menu-wrapper {
3010 .diffblock .diff-menu-wrapper {
3011 float: left;
3011 float: left;
3012 }
3012 }
3013
3013
3014 .diffblock .diff-menu {
3014 .diffblock .diff-menu {
3015 position: absolute;
3015 position: absolute;
3016 background: none repeat scroll 0 0 #FFFFFF;
3016 background: none repeat scroll 0 0 #FFFFFF;
3017 border-color: #577632 #666666 #666666;
3017 border-color: #577632 #666666 #666666;
3018 border-right: 1px solid #666666;
3018 border-right: 1px solid #666666;
3019 border-style: solid solid solid;
3019 border-style: solid solid solid;
3020 border-width: 1px;
3020 border-width: 1px;
3021 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
3021 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
3022 margin-top: 5px;
3022 margin-top: 5px;
3023 margin-left: 1px;
3023 margin-left: 1px;
3024
3024
3025 }
3025 }
3026 .diffblock .diff-actions {
3026 .diffblock .diff-actions {
3027 padding: 2px 0px 0px 2px;
3027 padding: 2px 0px 0px 2px;
3028 float: left;
3028 float: left;
3029 }
3029 }
3030 .diffblock .diff-menu ul li {
3030 .diffblock .diff-menu ul li {
3031 padding: 0px 0px 0px 0px !important;
3031 padding: 0px 0px 0px 0px !important;
3032 }
3032 }
3033 .diffblock .diff-menu ul li a {
3033 .diffblock .diff-menu ul li a {
3034 display: block;
3034 display: block;
3035 padding: 3px 8px 3px 8px !important;
3035 padding: 3px 8px 3px 8px !important;
3036 }
3036 }
3037 .diffblock .diff-menu ul li a:hover {
3037 .diffblock .diff-menu ul li a:hover {
3038 text-decoration: none;
3038 text-decoration: none;
3039 background-color: #EEEEEE;
3039 background-color: #EEEEEE;
3040 }
3040 }
3041 table.code-browser .browser-dir {
3041 table.code-browser .browser-dir {
3042 background: url("../images/icons/folder_16.png") no-repeat scroll 3px;
3042 background: url("../images/icons/folder_16.png") no-repeat scroll 3px;
3043 height: 16px;
3043 height: 16px;
3044 padding-left: 20px;
3044 padding-left: 20px;
3045 text-align: left;
3045 text-align: left;
3046 }
3046 }
3047
3047
3048 table.code-browser .submodule-dir {
3048 table.code-browser .submodule-dir {
3049 background: url("../images/icons/disconnect.png") no-repeat scroll 3px;
3049 background: url("../images/icons/disconnect.png") no-repeat scroll 3px;
3050 height: 16px;
3050 height: 16px;
3051 padding-left: 20px;
3051 padding-left: 20px;
3052 text-align: left;
3052 text-align: left;
3053 }
3053 }
3054
3054
3055
3055
3056 .box .search {
3056 .box .search {
3057 clear: both;
3057 clear: both;
3058 overflow: hidden;
3058 overflow: hidden;
3059 margin: 0;
3059 margin: 0;
3060 padding: 0 20px 10px;
3060 padding: 0 20px 10px;
3061 }
3061 }
3062
3062
3063 .box .search div.search_path {
3063 .box .search div.search_path {
3064 background: none repeat scroll 0 0 #EEE;
3064 background: none repeat scroll 0 0 #EEE;
3065 border: 1px solid #CCC;
3065 border: 1px solid #CCC;
3066 color: blue;
3066 color: blue;
3067 margin-bottom: 10px;
3067 margin-bottom: 10px;
3068 padding: 10px 0;
3068 padding: 10px 0;
3069 }
3069 }
3070
3070
3071 .box .search div.search_path div.link {
3071 .box .search div.search_path div.link {
3072 font-weight: 700;
3072 font-weight: 700;
3073 margin-left: 25px;
3073 margin-left: 25px;
3074 }
3074 }
3075
3075
3076 .box .search div.search_path div.link a {
3076 .box .search div.search_path div.link a {
3077 color: #577632;
3077 color: #577632;
3078 cursor: pointer;
3078 cursor: pointer;
3079 text-decoration: none;
3079 text-decoration: none;
3080 }
3080 }
3081
3081
3082 #path_unlock {
3082 #path_unlock {
3083 color: red;
3083 color: red;
3084 font-size: 1.2em;
3084 font-size: 1.2em;
3085 padding-left: 4px;
3085 padding-left: 4px;
3086 }
3086 }
3087
3087
3088 .info_box span {
3088 .info_box span {
3089 margin-left: 3px;
3089 margin-left: 3px;
3090 margin-right: 3px;
3090 margin-right: 3px;
3091 }
3091 }
3092
3092
3093 .info_box .rev {
3093 .info_box .rev {
3094 color: #577632;
3094 color: #577632;
3095 font-size: 1.6em;
3095 font-size: 1.6em;
3096 font-weight: bold;
3096 font-weight: bold;
3097 vertical-align: sub;
3097 vertical-align: sub;
3098 }
3098 }
3099
3099
3100 .info_box input#at_rev, .info_box input#size {
3100 .info_box input#at_rev, .info_box input#size {
3101 background: #FFF;
3101 background: #FFF;
3102 border-top: 1px solid #b3b3b3;
3102 border-top: 1px solid #b3b3b3;
3103 border-left: 1px solid #b3b3b3;
3103 border-left: 1px solid #b3b3b3;
3104 border-right: 1px solid #eaeaea;
3104 border-right: 1px solid #eaeaea;
3105 border-bottom: 1px solid #eaeaea;
3105 border-bottom: 1px solid #eaeaea;
3106 color: #000;
3106 color: #000;
3107 font-size: 12px;
3107 font-size: 12px;
3108 margin: 0;
3108 margin: 0;
3109 padding: 1px 5px 1px;
3109 padding: 1px 5px 1px;
3110 }
3110 }
3111
3111
3112 .info_box input#view {
3112 .info_box input#view {
3113 text-align: center;
3113 text-align: center;
3114 padding: 4px 3px 2px 2px;
3114 padding: 4px 3px 2px 2px;
3115 }
3115 }
3116
3116
3117 .info_box_elem {
3117 .info_box_elem {
3118 display: inline-block;
3118 display: inline-block;
3119 padding: 0 2px;
3119 padding: 0 2px;
3120 }
3120 }
3121
3121
3122 .yui-overlay, .yui-panel-container {
3122 .yui-overlay, .yui-panel-container {
3123 visibility: hidden;
3123 visibility: hidden;
3124 position: absolute;
3124 position: absolute;
3125 z-index: 2;
3125 z-index: 2;
3126 }
3126 }
3127
3127
3128 #tip-box {
3128 #tip-box {
3129 position: absolute;
3129 position: absolute;
3130
3130
3131 background-color: #FFF;
3131 background-color: #FFF;
3132 border: 2px solid #577632;
3132 border: 2px solid #577632;
3133 font: 100% sans-serif;
3133 font: 100% sans-serif;
3134 width: auto;
3134 width: auto;
3135 opacity: 1;
3135 opacity: 1;
3136 padding: 8px;
3136 padding: 8px;
3137
3137
3138 white-space: pre-wrap;
3138 white-space: pre-wrap;
3139 -webkit-border-radius: 8px 8px 8px 8px;
3139 -webkit-border-radius: 8px 8px 8px 8px;
3140 -khtml-border-radius: 8px 8px 8px 8px;
3140 -khtml-border-radius: 8px 8px 8px 8px;
3141 border-radius: 8px 8px 8px 8px;
3141 border-radius: 8px 8px 8px 8px;
3142 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3142 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3143 -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3143 -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3144 z-index: 100000;
3144 z-index: 100000;
3145 }
3145 }
3146
3146
3147 .hl-tip-box {
3147 .hl-tip-box {
3148 z-index: 1;
3148 z-index: 1;
3149 position: absolute;
3149 position: absolute;
3150 color: #666;
3150 color: #666;
3151 background-color: #FFF;
3151 background-color: #FFF;
3152 border: 2px solid #577632;
3152 border: 2px solid #577632;
3153 font: 100% sans-serif;
3153 font: 100% sans-serif;
3154 width: auto;
3154 width: auto;
3155 opacity: 1;
3155 opacity: 1;
3156 padding: 8px;
3156 padding: 8px;
3157 white-space: pre-wrap;
3157 white-space: pre-wrap;
3158 -webkit-border-radius: 8px 8px 8px 8px;
3158 -webkit-border-radius: 8px 8px 8px 8px;
3159 -khtml-border-radius: 8px 8px 8px 8px;
3159 -khtml-border-radius: 8px 8px 8px 8px;
3160 border-radius: 8px 8px 8px 8px;
3160 border-radius: 8px 8px 8px 8px;
3161 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3161 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3162 }
3162 }
3163
3163
3164
3164
3165 .mentions-container {
3165 .mentions-container {
3166 width: 90% !important;
3166 width: 90% !important;
3167 }
3167 }
3168 .mentions-container .yui-ac-content {
3168 .mentions-container .yui-ac-content {
3169 width: 100% !important;
3169 width: 100% !important;
3170 }
3170 }
3171
3171
3172 .ac {
3172 .ac {
3173 vertical-align: top;
3173 vertical-align: top;
3174 }
3174 }
3175
3175
3176 .ac .yui-ac {
3176 .ac .yui-ac {
3177 position: inherit;
3177 position: inherit;
3178 font-size: 100%;
3178 font-size: 100%;
3179 }
3179 }
3180
3180
3181 .ac .perm_ac {
3181 .ac .perm_ac {
3182 width: 20em;
3182 width: 20em;
3183 }
3183 }
3184
3184
3185 .ac .yui-ac-input {
3185 .ac .yui-ac-input {
3186 width: 100%;
3186 width: 100%;
3187 }
3187 }
3188
3188
3189 .ac .yui-ac-container {
3189 .ac .yui-ac-container {
3190 position: absolute;
3190 position: absolute;
3191 top: 1.6em;
3191 top: 1.6em;
3192 width: auto;
3192 width: auto;
3193 }
3193 }
3194
3194
3195 .ac .yui-ac-content {
3195 .ac .yui-ac-content {
3196 position: absolute;
3196 position: absolute;
3197 border: 1px solid gray;
3197 border: 1px solid gray;
3198 background: #fff;
3198 background: #fff;
3199 z-index: 9050;
3199 z-index: 9050;
3200 }
3200 }
3201
3201
3202 .ac .yui-ac-shadow {
3202 .ac .yui-ac-shadow {
3203 position: absolute;
3203 position: absolute;
3204 width: 100%;
3204 width: 100%;
3205 background: #000;
3205 background: #000;
3206 opacity: .10;
3206 opacity: .10;
3207 filter: alpha(opacity = 10);
3207 filter: alpha(opacity = 10);
3208 z-index: 9049;
3208 z-index: 9049;
3209 margin: .3em;
3209 margin: .3em;
3210 }
3210 }
3211
3211
3212 .ac .yui-ac-content ul {
3212 .ac .yui-ac-content ul {
3213 width: 100%;
3213 width: 100%;
3214 margin: 0;
3214 margin: 0;
3215 padding: 0;
3215 padding: 0;
3216 z-index: 9050;
3216 z-index: 9050;
3217 }
3217 }
3218
3218
3219 .ac .yui-ac-content li {
3219 .ac .yui-ac-content li {
3220 cursor: default;
3220 cursor: default;
3221 white-space: nowrap;
3221 white-space: nowrap;
3222 margin: 0;
3222 margin: 0;
3223 padding: 2px 5px;
3223 padding: 2px 5px;
3224 height: 18px;
3224 height: 18px;
3225 z-index: 9050;
3225 z-index: 9050;
3226 display: block;
3226 display: block;
3227 width: auto !important;
3227 width: auto !important;
3228 }
3228 }
3229
3229
3230 .ac .yui-ac-content li .ac-container-wrap {
3230 .ac .yui-ac-content li .ac-container-wrap {
3231 width: auto;
3231 width: auto;
3232 }
3232 }
3233
3233
3234 .ac .yui-ac-content li.yui-ac-prehighlight {
3234 .ac .yui-ac-content li.yui-ac-prehighlight {
3235 background: #B3D4FF;
3235 background: #B3D4FF;
3236 z-index: 9050;
3236 z-index: 9050;
3237 }
3237 }
3238
3238
3239 .ac .yui-ac-content li.yui-ac-highlight {
3239 .ac .yui-ac-content li.yui-ac-highlight {
3240 background: #556CB5;
3240 background: #556CB5;
3241 color: #FFF;
3241 color: #FFF;
3242 z-index: 9050;
3242 z-index: 9050;
3243 }
3243 }
3244 .ac .yui-ac-bd {
3244 .ac .yui-ac-bd {
3245 z-index: 9050;
3245 z-index: 9050;
3246 }
3246 }
3247
3247
3248 .reposize {
3248 .reposize {
3249 background: url("../images/icons/server.png") no-repeat scroll 3px;
3249 background: url("../images/icons/server.png") no-repeat scroll 3px;
3250 height: 16px;
3250 height: 16px;
3251 width: 20px;
3251 width: 20px;
3252 cursor: pointer;
3252 cursor: pointer;
3253 display: block;
3253 display: block;
3254 float: right;
3254 float: right;
3255 margin-top: 2px;
3255 margin-top: 2px;
3256 }
3256 }
3257
3257
3258 #repo_size {
3258 #repo_size {
3259 display: block;
3259 display: block;
3260 margin-top: 4px;
3260 margin-top: 4px;
3261 color: #666;
3261 color: #666;
3262 float: right;
3262 float: right;
3263 }
3263 }
3264
3264
3265 .locking_locked {
3265 .locking_locked {
3266 background: #FFF url("../images/icons/block_16.png") no-repeat scroll 3px;
3266 background: #FFF url("../images/icons/block_16.png") no-repeat scroll 3px;
3267 height: 16px;
3267 height: 16px;
3268 width: 20px;
3268 width: 20px;
3269 cursor: pointer;
3269 cursor: pointer;
3270 display: block;
3270 display: block;
3271 float: right;
3271 float: right;
3272 margin-top: 2px;
3272 margin-top: 2px;
3273 }
3273 }
3274
3274
3275 .locking_unlocked {
3275 .locking_unlocked {
3276 background: #FFF url("../images/icons/accept.png") no-repeat scroll 3px;
3276 background: #FFF url("../images/icons/accept.png") no-repeat scroll 3px;
3277 height: 16px;
3277 height: 16px;
3278 width: 20px;
3278 width: 20px;
3279 cursor: pointer;
3279 cursor: pointer;
3280 display: block;
3280 display: block;
3281 float: right;
3281 float: right;
3282 margin-top: 2px;
3282 margin-top: 2px;
3283 }
3283 }
3284
3284
3285 .currently_following {
3285 .currently_following {
3286 padding-left: 10px;
3286 padding-left: 10px;
3287 padding-bottom: 5px;
3287 padding-bottom: 5px;
3288 }
3288 }
3289
3289
3290 .add_icon {
3290 .add_icon {
3291 background: url("../images/icons/add.png") no-repeat scroll 3px;
3291 background: url("../images/icons/add.png") no-repeat scroll 3px;
3292 padding-left: 20px;
3292 padding-left: 20px;
3293 padding-top: 0px;
3293 padding-top: 0px;
3294 text-align: left;
3294 text-align: left;
3295 }
3295 }
3296
3296
3297 .accept_icon {
3297 .accept_icon {
3298 background: url("../images/icons/accept.png") no-repeat scroll 3px;
3298 background: url("../images/icons/accept.png") no-repeat scroll 3px;
3299 padding-left: 20px;
3299 padding-left: 20px;
3300 padding-top: 0px;
3300 padding-top: 0px;
3301 text-align: left;
3301 text-align: left;
3302 }
3302 }
3303
3303
3304 .edit_icon {
3304 .edit_icon {
3305 background: url("../images/icons/application_form_edit.png") no-repeat scroll 3px;
3305 background: url("../images/icons/application_form_edit.png") no-repeat scroll 3px;
3306 padding-left: 20px;
3306 padding-left: 20px;
3307 padding-top: 0px;
3307 padding-top: 0px;
3308 text-align: left;
3308 text-align: left;
3309 }
3309 }
3310
3310
3311 .delete_icon {
3311 .delete_icon {
3312 background: url("../images/icons/delete.png") no-repeat scroll 3px;
3312 background: url("../images/icons/delete.png") no-repeat scroll 3px;
3313 padding-left: 20px;
3313 padding-left: 20px;
3314 padding-top: 0px;
3314 padding-top: 0px;
3315 text-align: left;
3315 text-align: left;
3316 }
3316 }
3317
3317
3318 .refresh_icon {
3318 .refresh_icon {
3319 background: url("../images/icons/arrow_refresh.png") no-repeat scroll
3319 background: url("../images/icons/arrow_refresh.png") no-repeat scroll
3320 3px;
3320 3px;
3321 padding-left: 20px;
3321 padding-left: 20px;
3322 padding-top: 0px;
3322 padding-top: 0px;
3323 text-align: left;
3323 text-align: left;
3324 }
3324 }
3325
3325
3326 .pull_icon {
3326 .pull_icon {
3327 background: url("../images/icons/connect.png") no-repeat scroll 3px;
3327 background: url("../images/icons/connect.png") no-repeat scroll 3px;
3328 padding-left: 20px;
3328 padding-left: 20px;
3329 padding-top: 0px;
3329 padding-top: 0px;
3330 text-align: left;
3330 text-align: left;
3331 }
3331 }
3332
3332
3333 .rss_icon {
3333 .rss_icon {
3334 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3334 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3335 padding-left: 20px;
3335 padding-left: 20px;
3336 padding-top: 4px;
3336 padding-top: 4px;
3337 text-align: left;
3337 text-align: left;
3338 font-size: 8px
3338 font-size: 8px
3339 }
3339 }
3340
3340
3341 .atom_icon {
3341 .atom_icon {
3342 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3342 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3343 padding-left: 20px;
3343 padding-left: 20px;
3344 padding-top: 4px;
3344 padding-top: 4px;
3345 text-align: left;
3345 text-align: left;
3346 font-size: 8px
3346 font-size: 8px
3347 }
3347 }
3348
3348
3349 .archive_icon {
3349 .archive_icon {
3350 background: url("../images/icons/compress.png") no-repeat scroll 3px;
3350 background: url("../images/icons/compress.png") no-repeat scroll 3px;
3351 padding-left: 20px;
3351 padding-left: 20px;
3352 text-align: left;
3352 text-align: left;
3353 padding-top: 1px;
3353 padding-top: 1px;
3354 }
3354 }
3355
3355
3356 .start_following_icon {
3356 .start_following_icon {
3357 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3357 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3358 padding-left: 20px;
3358 padding-left: 20px;
3359 text-align: left;
3359 text-align: left;
3360 padding-top: 0px;
3360 padding-top: 0px;
3361 }
3361 }
3362
3362
3363 .stop_following_icon {
3363 .stop_following_icon {
3364 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3364 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3365 padding-left: 20px;
3365 padding-left: 20px;
3366 text-align: left;
3366 text-align: left;
3367 padding-top: 0px;
3367 padding-top: 0px;
3368 }
3368 }
3369
3369
3370 .action_button {
3370 .action_button {
3371 border: 0;
3371 border: 0;
3372 display: inline;
3372 display: inline;
3373 }
3373 }
3374
3374
3375 .action_button:hover {
3375 .action_button:hover {
3376 border: 0;
3376 border: 0;
3377 text-decoration: underline;
3377 text-decoration: underline;
3378 cursor: pointer;
3378 cursor: pointer;
3379 }
3379 }
3380
3380
3381 #switch_repos {
3381 #switch_repos {
3382 position: absolute;
3382 position: absolute;
3383 height: 25px;
3383 height: 25px;
3384 z-index: 1;
3384 z-index: 1;
3385 }
3385 }
3386
3386
3387 #switch_repos select {
3387 #switch_repos select {
3388 min-width: 150px;
3388 min-width: 150px;
3389 max-height: 250px;
3389 max-height: 250px;
3390 z-index: 1;
3390 z-index: 1;
3391 }
3391 }
3392
3392
3393 .breadcrumbs {
3393 .breadcrumbs {
3394 border: medium none;
3394 border: medium none;
3395 color: #FFF;
3395 color: #FFF;
3396 float: left;
3396 float: left;
3397 font-weight: 700;
3397 font-weight: 700;
3398 font-size: 14px;
3398 font-size: 14px;
3399 margin: 0;
3399 margin: 0;
3400 padding: 11px 0 11px 10px;
3400 padding: 11px 0 11px 10px;
3401 }
3401 }
3402
3402
3403 .breadcrumbs .hash {
3403 .breadcrumbs .hash {
3404 text-transform: none;
3404 text-transform: none;
3405 color: #fff;
3405 color: #fff;
3406 }
3406 }
3407
3407
3408 .breadcrumbs a {
3408 .breadcrumbs a {
3409 color: #FFF;
3409 color: #FFF;
3410 }
3410 }
3411
3411
3412 .flash_msg {
3412 .flash_msg {
3413 }
3413 }
3414
3414
3415 .flash_msg ul {
3415 .flash_msg ul {
3416 }
3416 }
3417
3417
3418 .error_red {
3418 .error_red {
3419 color: red;
3419 color: red;
3420 }
3420 }
3421
3421
3422 .flash_msg .alert-error {
3422 .flash_msg .alert-error {
3423 background-color: #c43c35;
3423 background-color: #c43c35;
3424 background-repeat: repeat-x;
3424 background-repeat: repeat-x;
3425 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35) );
3425 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35) );
3426 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3426 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3427 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3427 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3428 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35) );
3428 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35) );
3429 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3429 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3430 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3430 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3431 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3431 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3432 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#c43c35', GradientType=0 );
3432 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#c43c35', GradientType=0 );
3433 border-color: #c43c35 #c43c35 #882a25;
3433 border-color: #c43c35 #c43c35 #882a25;
3434 }
3434 }
3435
3435
3436 .flash_msg .alert-error a {
3436 .flash_msg .alert-error a {
3437 text-decoration: underline;
3437 text-decoration: underline;
3438 }
3438 }
3439
3439
3440 .flash_msg .alert-warning {
3440 .flash_msg .alert-warning {
3441 color: #404040 !important;
3441 color: #404040 !important;
3442 background-color: #eedc94;
3442 background-color: #eedc94;
3443 background-repeat: repeat-x;
3443 background-repeat: repeat-x;
3444 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
3444 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
3445 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3445 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3446 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3446 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3447 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94) );
3447 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94) );
3448 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3448 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3449 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3449 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3450 background-image: linear-gradient(to bottom, #fceec1, #eedc94);
3450 background-image: linear-gradient(to bottom, #fceec1, #eedc94);
3451 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0 );
3451 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0 );
3452 border-color: #eedc94 #eedc94 #e4c652;
3452 border-color: #eedc94 #eedc94 #e4c652;
3453 }
3453 }
3454
3454
3455 .flash_msg .alert-warning a {
3455 .flash_msg .alert-warning a {
3456 text-decoration: underline;
3456 text-decoration: underline;
3457 }
3457 }
3458
3458
3459 .flash_msg .alert-success {
3459 .flash_msg .alert-success {
3460 background-color: #57a957;
3460 background-color: #57a957;
3461 background-repeat: repeat-x !important;
3461 background-repeat: repeat-x !important;
3462 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957) );
3462 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957) );
3463 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3463 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3464 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3464 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3465 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957) );
3465 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957) );
3466 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3466 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3467 background-image: -o-linear-gradient(top, #62c462, #57a957);
3467 background-image: -o-linear-gradient(top, #62c462, #57a957);
3468 background-image: linear-gradient(to bottom, #62c462, #57a957);
3468 background-image: linear-gradient(to bottom, #62c462, #57a957);
3469 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0 );
3469 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0 );
3470 border-color: #57a957 #57a957 #3d773d;
3470 border-color: #57a957 #57a957 #3d773d;
3471 }
3471 }
3472
3472
3473 .flash_msg .alert-success a {
3473 .flash_msg .alert-success a {
3474 text-decoration: underline;
3474 text-decoration: underline;
3475 color: #FFF !important;
3475 color: #FFF !important;
3476 }
3476 }
3477
3477
3478 .flash_msg .alert-info {
3478 .flash_msg .alert-info {
3479 background-color: #339bb9;
3479 background-color: #339bb9;
3480 background-repeat: repeat-x;
3480 background-repeat: repeat-x;
3481 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9) );
3481 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9) );
3482 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3482 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3483 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3483 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3484 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9) );
3484 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9) );
3485 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3485 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3486 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3486 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3487 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3487 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3488 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0 );
3488 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0 );
3489 border-color: #339bb9 #339bb9 #22697d;
3489 border-color: #339bb9 #339bb9 #22697d;
3490 }
3490 }
3491
3491
3492 .flash_msg .alert-info a {
3492 .flash_msg .alert-info a {
3493 text-decoration: underline;
3493 text-decoration: underline;
3494 }
3494 }
3495
3495
3496 .flash_msg .alert-error,
3496 .flash_msg .alert-error,
3497 .flash_msg .alert-warning,
3497 .flash_msg .alert-warning,
3498 .flash_msg .alert-success,
3498 .flash_msg .alert-success,
3499 .flash_msg .alert-info {
3499 .flash_msg .alert-info {
3500 font-size: 12px;
3500 font-size: 12px;
3501 font-weight: 700;
3501 font-weight: 700;
3502 min-height: 14px;
3502 min-height: 14px;
3503 line-height: 14px;
3503 line-height: 14px;
3504 margin-bottom: 10px;
3504 margin-bottom: 10px;
3505 margin-top: 0;
3505 margin-top: 0;
3506 display: block;
3506 display: block;
3507 overflow: auto;
3507 overflow: auto;
3508 padding: 6px 10px 6px 10px;
3508 padding: 6px 10px 6px 10px;
3509 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3509 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3510 position: relative;
3510 position: relative;
3511 color: #FFF;
3511 color: #FFF;
3512 border-width: 1px;
3512 border-width: 1px;
3513 border-style: solid;
3513 border-style: solid;
3514 -webkit-border-radius: 4px;
3514 -webkit-border-radius: 4px;
3515 border-radius: 4px;
3515 border-radius: 4px;
3516 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3516 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3517 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3517 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3518 }
3518 }
3519
3519
3520 #msg_close {
3520 #msg_close {
3521 background: transparent url("../images/cross_grey_small.png") no-repeat scroll 0 0;
3521 background: transparent url("../images/cross_grey_small.png") no-repeat scroll 0 0;
3522 cursor: pointer;
3522 cursor: pointer;
3523 height: 16px;
3523 height: 16px;
3524 position: absolute;
3524 position: absolute;
3525 right: 5px;
3525 right: 5px;
3526 top: 5px;
3526 top: 5px;
3527 width: 16px;
3527 width: 16px;
3528 }
3528 }
3529 div#legend_data {
3529 div#legend_data {
3530 padding-left: 10px;
3530 padding-left: 10px;
3531 }
3531 }
3532 div#legend_container table {
3532 div#legend_container table {
3533 border: none !important;
3533 border: none !important;
3534 }
3534 }
3535 div#legend_container table, div#legend_choices table {
3535 div#legend_container table, div#legend_choices table {
3536 width: auto !important;
3536 width: auto !important;
3537 }
3537 }
3538
3538
3539 table#permissions_manage {
3539 table#permissions_manage {
3540 width: 0 !important;
3540 width: 0 !important;
3541 }
3541 }
3542
3542
3543 table#permissions_manage span.private_repo_msg {
3543 table#permissions_manage span.private_repo_msg {
3544 font-size: 0.8em;
3544 font-size: 0.8em;
3545 opacity: 0.6;
3545 opacity: 0.6;
3546 }
3546 }
3547
3547
3548 table#permissions_manage td.private_repo_msg {
3548 table#permissions_manage td.private_repo_msg {
3549 font-size: 0.8em;
3549 font-size: 0.8em;
3550 }
3550 }
3551
3551
3552 table#permissions_manage tr#add_perm_input td {
3552 table#permissions_manage tr#add_perm_input td {
3553 vertical-align: middle;
3553 vertical-align: middle;
3554 }
3554 }
3555
3555
3556 div.gravatar {
3556 div.gravatar {
3557 background-color: #FFF;
3557 background-color: #FFF;
3558 float: left;
3558 float: left;
3559 margin-right: 0.7em;
3559 margin-right: 0.7em;
3560 padding: 1px 1px 1px 1px;
3560 padding: 1px 1px 1px 1px;
3561 line-height: 0;
3561 line-height: 0;
3562 -webkit-border-radius: 3px;
3562 -webkit-border-radius: 3px;
3563 -khtml-border-radius: 3px;
3563 -khtml-border-radius: 3px;
3564 border-radius: 3px;
3564 border-radius: 3px;
3565 }
3565 }
3566
3566
3567 div.gravatar img {
3567 div.gravatar img {
3568 -webkit-border-radius: 2px;
3568 -webkit-border-radius: 2px;
3569 -khtml-border-radius: 2px;
3569 -khtml-border-radius: 2px;
3570 border-radius: 2px;
3570 border-radius: 2px;
3571 }
3571 }
3572
3572
3573 #header, #content, #footer {
3573 #header, #content, #footer {
3574 min-width: 978px;
3574 min-width: 978px;
3575 }
3575 }
3576
3576
3577 #content {
3577 #content {
3578 clear: both;
3578 clear: both;
3579 padding: 10px 10px 14px 10px;
3579 padding: 10px 10px 14px 10px;
3580 }
3580 }
3581
3581
3582 #content.hover {
3582 #content.hover {
3583 padding: 55px 10px 14px 10px !important;
3583 padding: 55px 10px 14px 10px !important;
3584 }
3584 }
3585
3585
3586 #content div.box div.title div.search {
3586 #content div.box div.title div.search {
3587 border-left: 1px solid #576622;
3587 border-left: 1px solid #576622;
3588 }
3588 }
3589
3589
3590 #content div.box div.title div.search div.input input {
3590 #content div.box div.title div.search div.input input {
3591 border: 1px solid #576622;
3591 border: 1px solid #576622;
3592 }
3592 }
3593
3593
3594 .btn {
3594 .btn {
3595 color: #515151;
3595 color: #515151;
3596 background-color: #DADADA;
3596 background-color: #DADADA;
3597 background-repeat: repeat-x;
3597 background-repeat: repeat-x;
3598 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3598 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3599 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3599 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3600 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3600 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3601 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3601 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3602 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA) );
3602 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA) );
3603 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA) );
3603 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA) );
3604 background-image: linear-gradient(to bottom, #F4F4F4, #DADADA);
3604 background-image: linear-gradient(to bottom, #F4F4F4, #DADADA);
3605 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F4F4F4', endColorstr='#DADADA', GradientType=0);
3605 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F4F4F4', endColorstr='#DADADA', GradientType=0);
3606
3606
3607 border-top: 1px solid #DDD;
3607 border-top: 1px solid #DDD;
3608 border-left: 1px solid #c6c6c6;
3608 border-left: 1px solid #c6c6c6;
3609 border-right: 1px solid #DDD;
3609 border-right: 1px solid #DDD;
3610 border-bottom: 1px solid #c6c6c6;
3610 border-bottom: 1px solid #c6c6c6;
3611 color: #515151;
3611 color: #515151;
3612 outline: none;
3612 outline: none;
3613 margin: 0px 3px 3px 0px;
3613 margin: 0px 3px 3px 0px;
3614 -webkit-border-radius: 4px 4px 4px 4px !important;
3614 -webkit-border-radius: 4px 4px 4px 4px !important;
3615 -khtml-border-radius: 4px 4px 4px 4px !important;
3615 -khtml-border-radius: 4px 4px 4px 4px !important;
3616 border-radius: 4px 4px 4px 4px !important;
3616 border-radius: 4px 4px 4px 4px !important;
3617 cursor: pointer !important;
3617 cursor: pointer !important;
3618 padding: 3px 3px 3px 3px;
3618 padding: 3px 3px 3px 3px;
3619 background-position: 0 -100px;
3619 background-position: 0 -100px;
3620 display: inline-block;
3620 display: inline-block;
3621 }
3621 }
3622
3622
3623 ul.nav-stacked {
3623 ul.nav-stacked {
3624 margin: 20px;
3624 margin: 20px;
3625 color: #393939;
3625 color: #393939;
3626 font-weight: 700;
3626 font-weight: 700;
3627 }
3627 }
3628
3628
3629 ul.nav-stacked a {
3629 ul.nav-stacked a {
3630 color: inherit;
3630 color: inherit;
3631 }
3631 }
3632
3632
3633 /* make .btn inputs and buttons and divs look the same */
3633 /* make .btn inputs and buttons and divs look the same */
3634 button.btn,
3634 button.btn,
3635 input.btn {
3635 input.btn {
3636 font-family: inherit;
3636 font-family: inherit;
3637 font-size: inherit;
3637 font-size: inherit;
3638 line-height: inherit;
3638 line-height: inherit;
3639 }
3639 }
3640
3640
3641 .btn::-moz-focus-inner {
3641 .btn::-moz-focus-inner {
3642 border: 0;
3642 border: 0;
3643 padding: 0;
3643 padding: 0;
3644 }
3644 }
3645
3645
3646 .btn.badge {
3646 .btn.badge {
3647 cursor: default !important;
3647 cursor: default !important;
3648 }
3648 }
3649
3649
3650 .btn.disabled {
3650 .btn.disabled {
3651 color: #999;
3651 color: #999;
3652 }
3652 }
3653
3653
3654 .btn.btn-danger.disabled {
3654 .btn.btn-danger.disabled {
3655 color: #eee;
3655 color: #eee;
3656 background-color: #c77;
3656 background-color: #c77;
3657 border-color: #b66
3657 border-color: #b66
3658 }
3658 }
3659
3659
3660 .btn.btn-small {
3660 .btn.btn-small {
3661 padding: 2px 6px;
3661 padding: 2px 6px;
3662 }
3662 }
3663
3663
3664 .btn.btn-mini {
3664 .btn.btn-mini {
3665 padding: 0px 4px;
3665 padding: 0px 4px;
3666 }
3666 }
3667
3667
3668 .btn.clone {
3668 .btn.clone {
3669 padding: 5px 2px 6px 1px;
3669 padding: 5px 2px 6px 1px;
3670 margin: 0px 0px 3px -4px;
3670 margin: 0px 0px 3px -4px;
3671 -webkit-border-radius: 0px 4px 4px 0px !important;
3671 -webkit-border-radius: 0px 4px 4px 0px !important;
3672 -khtml-border-radius: 0px 4px 4px 0px !important;
3672 -khtml-border-radius: 0px 4px 4px 0px !important;
3673 border-radius: 0px 4px 4px 0px !important;
3673 border-radius: 0px 4px 4px 0px !important;
3674 width: 100px;
3674 width: 100px;
3675 text-align: center;
3675 text-align: center;
3676 display: inline-block;
3676 display: inline-block;
3677 position: relative;
3677 position: relative;
3678 top: -2px;
3678 top: -2px;
3679 }
3679 }
3680 .btn:focus {
3680 .btn:focus {
3681 outline: none;
3681 outline: none;
3682 }
3682 }
3683 .btn:hover {
3683 .btn:hover {
3684 background-position: 0 -100px;
3684 background-position: 0 -100px;
3685 text-decoration: none;
3685 text-decoration: none;
3686 color: #515151;
3686 color: #515151;
3687 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3687 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3688 }
3688 }
3689 .btn.badge:hover {
3689 .btn.badge:hover {
3690 box-shadow: none !important;
3690 box-shadow: none !important;
3691 }
3691 }
3692 .btn.disabled:hover {
3692 .btn.disabled:hover {
3693 background-position: 0;
3693 background-position: 0;
3694 color: #999;
3694 color: #999;
3695 text-decoration: none;
3695 text-decoration: none;
3696 box-shadow: none !important;
3696 box-shadow: none !important;
3697 }
3697 }
3698
3698
3699 .btn.red {
3699 .btn.red {
3700 color: #fff;
3700 color: #fff;
3701 background-color: #c43c35;
3701 background-color: #c43c35;
3702 background-repeat: repeat-x;
3702 background-repeat: repeat-x;
3703 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3703 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3704 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3704 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3705 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3705 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3706 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3706 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3707 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3707 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3708 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3708 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3709 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3709 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3710 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
3710 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
3711 border-color: #c43c35 #c43c35 #882a25;
3711 border-color: #c43c35 #c43c35 #882a25;
3712 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3712 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3713 }
3713 }
3714
3714
3715
3715
3716 .btn.blue {
3716 .btn.blue {
3717 color: #fff;
3717 color: #fff;
3718 background-color: #339bb9;
3718 background-color: #339bb9;
3719 background-repeat: repeat-x;
3719 background-repeat: repeat-x;
3720 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3720 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3721 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3721 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3722 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3722 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3723 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3723 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3724 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3724 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3725 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3725 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3726 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3726 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3727 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
3727 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
3728 border-color: #339bb9 #339bb9 #22697d;
3728 border-color: #339bb9 #339bb9 #22697d;
3729 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3729 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3730 }
3730 }
3731
3731
3732 .btn.green {
3732 .btn.green {
3733 color: #fff;
3733 color: #fff;
3734 background-color: #57a957;
3734 background-color: #57a957;
3735 background-repeat: repeat-x;
3735 background-repeat: repeat-x;
3736 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3736 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3737 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3737 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3738 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3738 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3739 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3739 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3740 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3740 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3741 background-image: -o-linear-gradient(top, #62c462, #57a957);
3741 background-image: -o-linear-gradient(top, #62c462, #57a957);
3742 background-image: linear-gradient(to bottom, #62c462, #57a957);
3742 background-image: linear-gradient(to bottom, #62c462, #57a957);
3743 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
3743 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
3744 border-color: #57a957 #57a957 #3d773d;
3744 border-color: #57a957 #57a957 #3d773d;
3745 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3745 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3746 }
3746 }
3747
3747
3748 .btn.yellow {
3748 .btn.yellow {
3749 color: #fff;
3749 color: #fff;
3750 background-color: #faa732;
3750 background-color: #faa732;
3751 background-repeat: repeat-x;
3751 background-repeat: repeat-x;
3752 background-image: -khtml-gradient(linear, left top, left bottom, from(#fbb450), to(#f89406));
3752 background-image: -khtml-gradient(linear, left top, left bottom, from(#fbb450), to(#f89406));
3753 background-image: -moz-linear-gradient(top, #fbb450, #f89406);
3753 background-image: -moz-linear-gradient(top, #fbb450, #f89406);
3754 background-image: -ms-linear-gradient(top, #fbb450, #f89406);
3754 background-image: -ms-linear-gradient(top, #fbb450, #f89406);
3755 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fbb450), color-stop(100%, #f89406));
3755 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fbb450), color-stop(100%, #f89406));
3756 background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
3756 background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
3757 background-image: -o-linear-gradient(top, #fbb450, #f89406);
3757 background-image: -o-linear-gradient(top, #fbb450, #f89406);
3758 background-image: linear-gradient(to bottom, #fbb450, #f89406);
3758 background-image: linear-gradient(to bottom, #fbb450, #f89406);
3759 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);
3759 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);
3760 border-color: #f89406 #f89406 #ad6704;
3760 border-color: #f89406 #f89406 #ad6704;
3761 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3761 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3762 }
3762 }
3763
3763
3764 label.disabled {
3764 label.disabled {
3765 color: #aaa;
3765 color: #aaa;
3766 }
3766 }
3767
3767
3768 .btn.blue.hidden {
3768 .btn.blue.hidden {
3769 display: none;
3769 display: none;
3770 }
3770 }
3771
3771
3772 .btn.active {
3772 .btn.active {
3773 font-weight: bold;
3773 font-weight: bold;
3774 }
3774 }
3775
3775
3776 ins, div.options a:hover {
3776 ins, div.options a:hover {
3777 text-decoration: none;
3777 text-decoration: none;
3778 }
3778 }
3779
3779
3780 img,
3780 img,
3781 #header #header-inner #quick li a:hover span.normal,
3781 #header #header-inner #quick li a:hover span.normal,
3782 #content div.box div.form div.fields div.field div.textarea table td table td a,
3782 #content div.box div.form div.fields div.field div.textarea table td table td a,
3783 #clone_url,
3783 #clone_url,
3784 #clone_url_id
3784 #clone_url_id
3785 {
3785 {
3786 border: none;
3786 border: none;
3787 }
3787 }
3788
3788
3789 img.icon, .right .merge img {
3789 img.icon, .right .merge img {
3790 vertical-align: bottom;
3790 vertical-align: bottom;
3791 }
3791 }
3792
3792
3793 #header ul#logged-user, #content div.box div.title ul.links,
3793 #header ul#logged-user, #content div.box div.title ul.links,
3794 #content div.box div.message div.dismiss,
3794 #content div.box div.message div.dismiss,
3795 #content div.box div.traffic div.legend ul {
3795 #content div.box div.traffic div.legend ul {
3796 float: right;
3796 float: right;
3797 margin: 0;
3797 margin: 0;
3798 padding: 0;
3798 padding: 0;
3799 }
3799 }
3800
3800
3801 #header #header-inner #home, #header #header-inner #logo,
3801 #header #header-inner #home, #header #header-inner #logo,
3802 #content div.box ul.left, #content div.box ol.left,
3802 #content div.box ul.left, #content div.box ol.left,
3803 div#commit_history,
3803 div#commit_history,
3804 div#legend_data, div#legend_container, div#legend_choices {
3804 div#legend_data, div#legend_container, div#legend_choices {
3805 float: left;
3805 float: left;
3806 }
3806 }
3807
3807
3808 #header #header-inner #quick li #quick_login,
3808 #header #header-inner #quick li #quick_login,
3809 #header #header-inner #quick li:hover ul ul,
3809 #header #header-inner #quick li:hover ul ul,
3810 #header #header-inner #quick li:hover ul ul ul,
3810 #header #header-inner #quick li:hover ul ul ul,
3811 #header #header-inner #quick li:hover ul ul ul ul,
3811 #header #header-inner #quick li:hover ul ul ul ul,
3812 #content #left #menu ul.closed, #content #left #menu li ul.collapsed, .yui-tt-shadow {
3812 #content #left #menu ul.closed, #content #left #menu li ul.collapsed, .yui-tt-shadow {
3813 display: none;
3813 display: none;
3814 }
3814 }
3815
3815
3816 #header #header-inner #quick li:hover #quick_login,
3816 #header #header-inner #quick li:hover #quick_login,
3817 #header #header-inner #quick li:hover ul, #header #header-inner #quick li li:hover ul, #header #header-inner #quick li li li:hover ul, #header #header-inner #quick li li li li:hover ul, #content #left #menu ul.opened, #content #left #menu li ul.expanded {
3817 #header #header-inner #quick li:hover ul, #header #header-inner #quick li li:hover ul, #header #header-inner #quick li li li:hover ul, #header #header-inner #quick li li li li:hover ul, #content #left #menu ul.opened, #content #left #menu li ul.expanded {
3818 display: block;
3818 display: block;
3819 }
3819 }
3820
3820
3821 .repo-switcher .select2-choice {
3821 .repo-switcher .select2-choice {
3822 padding: 0px 8px 1px !important;
3822 padding: 0px 8px 1px !important;
3823 display: block;
3823 display: block;
3824 height: 100%;
3824 height: 100%;
3825 }
3825 }
3826
3826
3827 .repo-switcher .select2-container,
3827 .repo-switcher .select2-container,
3828 .repo-switcher .select2-choice,
3828 .repo-switcher .select2-choice,
3829 .repo-switcher .select2-choice span {
3829 .repo-switcher .select2-choice span {
3830 background: transparent !important;
3830 background: transparent !important;
3831 border: 0 !important;
3831 border: 0 !important;
3832 box-shadow: none !important;
3832 box-shadow: none !important;
3833 color: #FFFFFF !important;
3833 color: #FFFFFF !important;
3834 }
3834 }
3835
3835
3836 .repo-switcher .select2-arrow {
3836 .repo-switcher .select2-arrow {
3837 display: none !important;
3837 display: none !important;
3838 }
3838 }
3839
3839
3840 .repo-switcher .select2-chosen:after {
3840 .repo-switcher .select2-chosen:after {
3841 content: ' \25BE';
3841 content: ' \25BE';
3842 }
3842 }
3843
3843
3844 .repo-switcher-dropdown.select2-drop.select2-drop-active {
3844 .repo-switcher-dropdown.select2-drop.select2-drop-active {
3845 xborder-color: black;
3845 xborder-color: black;
3846 -webkit-box-shadow: none;
3846 -webkit-box-shadow: none;
3847 -moz-box-shadow: none;
3847 -moz-box-shadow: none;
3848 box-shadow: none;
3848 box-shadow: none;
3849 color: #fff;
3849 color: #fff;
3850 background-color: #576622;
3850 background-color: #576622;
3851 }
3851 }
3852
3852
3853 .repo-switcher-dropdown.select2-drop.select2-drop-active .select2-results .select2-highlighted {
3853 .repo-switcher-dropdown.select2-drop.select2-drop-active .select2-results .select2-highlighted {
3854 background-color: #6388ad;
3854 background-color: #6388ad;
3855 }
3855 }
3856
3856
3857 #content div.graph {
3857 #content div.graph {
3858 padding: 0 10px 10px;
3858 padding: 0 10px 10px;
3859 }
3859 }
3860
3860
3861 #content div.box div.title ul.links li a:hover,
3861 #content div.box div.title ul.links li a:hover,
3862 #content div.box div.title ul.links li.ui-tabs-selected a {
3862 #content div.box div.title ul.links li.ui-tabs-selected a {
3863
3863
3864 background: #6388ad; /* Old browsers */
3864 background: #6388ad; /* Old browsers */
3865 background: -moz-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* FF3.6+ */
3865 background: -moz-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* FF3.6+ */
3866 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0.1)), color-stop(100%,rgba(255,255,255,0))); /* Chrome,Safari4+ */
3866 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0.1)), color-stop(100%,rgba(255,255,255,0))); /* Chrome,Safari4+ */
3867 background: -webkit-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Chrome10+,Safari5.1+ */
3867 background: -webkit-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Chrome10+,Safari5.1+ */
3868 background: -o-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Opera 11.10+ */
3868 background: -o-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Opera 11.10+ */
3869 background: -ms-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* IE10+ */
3869 background: -ms-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* IE10+ */
3870 background: linear-gradient(to bottom, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* W3C */
3870 background: linear-gradient(to bottom, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* W3C */
3871 /*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#88bfe8', endColorstr='#70b0e0',GradientType=0 ); /* IE6-9 */
3871 /*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#88bfe8', endColorstr='#70b0e0',GradientType=0 ); /* IE6-9 */
3872 }
3872 }
3873
3873
3874 #content div.box ol.lower-roman, #content div.box ol.upper-roman, #content div.box ol.lower-alpha, #content div.box ol.upper-alpha, #content div.box ol.decimal {
3874 #content div.box ol.lower-roman, #content div.box ol.upper-roman, #content div.box ol.lower-alpha, #content div.box ol.upper-alpha, #content div.box ol.decimal {
3875 margin: 10px 24px 10px 44px;
3875 margin: 10px 24px 10px 44px;
3876 }
3876 }
3877
3877
3878 #content div.box div.form, #content div.box div.table, #content div.box div.traffic {
3878 #content div.box div.form, #content div.box div.table, #content div.box div.traffic {
3879 position: relative;
3879 position: relative;
3880 clear: both;
3880 clear: both;
3881 margin: 0;
3881 margin: 0;
3882 padding: 0 20px 10px;
3882 padding: 0 20px 10px;
3883 }
3883 }
3884
3884
3885 #content div.box div.form div.fields, #login div.form, #login div.form div.fields, #register div.form, #register div.form div.fields {
3885 #content div.box div.form div.fields, #login div.form, #login div.form div.fields, #register div.form, #register div.form div.fields {
3886 clear: both;
3886 clear: both;
3887 overflow: hidden;
3887 overflow: hidden;
3888 margin: 0;
3888 margin: 0;
3889 padding: 0;
3889 padding: 0;
3890 }
3890 }
3891
3891
3892 #content div.box div.form div.fields div.field div.label span, #login div.form div.fields div.field div.label span, #register div.form div.fields div.field div.label span {
3892 #content div.box div.form div.fields div.field div.label span, #login div.form div.fields div.field div.label span, #register div.form div.fields div.field div.label span {
3893 height: 1%;
3893 height: 1%;
3894 display: block;
3894 display: block;
3895 color: #363636;
3895 color: #363636;
3896 margin: 0;
3896 margin: 0;
3897 padding: 2px 0 0;
3897 padding: 2px 0 0;
3898 }
3898 }
3899
3899
3900 #content div.box div.form div.fields div.field div.input input.error, #login div.form div.fields div.field div.input input.error, #register div.form div.fields div.field div.input input.error {
3900 #content div.box div.form div.fields div.field div.input input.error, #login div.form div.fields div.field div.input input.error, #register div.form div.fields div.field div.input input.error {
3901 background: #FBE3E4;
3901 background: #FBE3E4;
3902 border-top: 1px solid #e1b2b3;
3902 border-top: 1px solid #e1b2b3;
3903 border-left: 1px solid #e1b2b3;
3903 border-left: 1px solid #e1b2b3;
3904 border-right: 1px solid #FBC2C4;
3904 border-right: 1px solid #FBC2C4;
3905 border-bottom: 1px solid #FBC2C4;
3905 border-bottom: 1px solid #FBC2C4;
3906 }
3906 }
3907
3907
3908 #content div.box div.form div.fields div.field div.input input.success, #login div.form div.fields div.field div.input input.success, #register div.form div.fields div.field div.input input.success {
3908 #content div.box div.form div.fields div.field div.input input.success, #login div.form div.fields div.field div.input input.success, #register div.form div.fields div.field div.input input.success {
3909 background: #E6EFC2;
3909 background: #E6EFC2;
3910 border-top: 1px solid #cebb98;
3910 border-top: 1px solid #cebb98;
3911 border-left: 1px solid #cebb98;
3911 border-left: 1px solid #cebb98;
3912 border-right: 1px solid #c6d880;
3912 border-right: 1px solid #c6d880;
3913 border-bottom: 1px solid #c6d880;
3913 border-bottom: 1px solid #c6d880;
3914 }
3914 }
3915
3915
3916 #content div.box-left div.form div.fields div.field div.textarea, #content div.box-right div.form div.fields div.field div.textarea, #content div.box div.form div.fields div.field div.select select, #content div.box table th.selected input, #content div.box table td.selected input {
3916 #content div.box-left div.form div.fields div.field div.textarea, #content div.box-right div.form div.fields div.field div.textarea, #content div.box div.form div.fields div.field div.select select, #content div.box table th.selected input, #content div.box table td.selected input {
3917 margin: 0;
3917 margin: 0;
3918 }
3918 }
3919
3919
3920 #content div.box-left div.form div.fields div.field div.select, #content div.box-left div.form div.fields div.field div.checkboxes, #content div.box-left div.form div.fields div.field div.radios, #content div.box-right div.form div.fields div.field div.select, #content div.box-right div.form div.fields div.field div.checkboxes, #content div.box-right div.form div.fields div.field div.radios {
3920 #content div.box-left div.form div.fields div.field div.select, #content div.box-left div.form div.fields div.field div.checkboxes, #content div.box-left div.form div.fields div.field div.radios, #content div.box-right div.form div.fields div.field div.select, #content div.box-right div.form div.fields div.field div.checkboxes, #content div.box-right div.form div.fields div.field div.radios {
3921 margin: 0 0 0 0px !important;
3921 margin: 0 0 0 0px !important;
3922 padding: 0;
3922 padding: 0;
3923 }
3923 }
3924
3924
3925 #content div.box div.form div.fields div.field div.select, #content div.box div.form div.fields div.field div.checkboxes, #content div.box div.form div.fields div.field div.radios {
3925 #content div.box div.form div.fields div.field div.select, #content div.box div.form div.fields div.field div.checkboxes, #content div.box div.form div.fields div.field div.radios {
3926 margin: 0 0 0 200px;
3926 margin: 0 0 0 200px;
3927 padding: 0;
3927 padding: 0;
3928 }
3928 }
3929
3929
3930 #content div.box div.form div.fields div.field div.select a:hover, #content div.box div.form div.fields div.field div.select a.ui-selectmenu:hover, #content div.box div.action a:hover {
3930 #content div.box div.form div.fields div.field div.select a:hover, #content div.box div.form div.fields div.field div.select a.ui-selectmenu:hover, #content div.box div.action a:hover {
3931 color: #000;
3931 color: #000;
3932 text-decoration: none;
3932 text-decoration: none;
3933 }
3933 }
3934
3934
3935 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus, #content div.box div.action a.ui-selectmenu-focus {
3935 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus, #content div.box div.action a.ui-selectmenu-focus {
3936 border: 1px solid #666;
3936 border: 1px solid #666;
3937 }
3937 }
3938
3938
3939 #content div.box div.form div.fields div.field div.checkboxes div.checkbox, #content div.box div.form div.fields div.field div.radios div.radio {
3939 #content div.box div.form div.fields div.field div.checkboxes div.checkbox, #content div.box div.form div.fields div.field div.radios div.radio {
3940 clear: both;
3940 clear: both;
3941 overflow: hidden;
3941 overflow: hidden;
3942 margin: 0;
3942 margin: 0;
3943 padding: 8px 0 2px;
3943 padding: 8px 0 2px;
3944 }
3944 }
3945
3945
3946 #content div.box div.form div.fields div.field div.checkboxes div.checkbox input, #content div.box div.form div.fields div.field div.radios div.radio input {
3946 #content div.box div.form div.fields div.field div.checkboxes div.checkbox input, #content div.box div.form div.fields div.field div.radios div.radio input {
3947 float: left;
3947 float: left;
3948 margin: 0;
3948 margin: 0;
3949 }
3949 }
3950
3950
3951 #content div.box div.form div.fields div.field div.checkboxes div.checkbox label, #content div.box div.form div.fields div.field div.radios div.radio label {
3951 #content div.box div.form div.fields div.field div.checkboxes div.checkbox label, #content div.box div.form div.fields div.field div.radios div.radio label {
3952 height: 1%;
3952 height: 1%;
3953 display: block;
3953 display: block;
3954 float: left;
3954 float: left;
3955 margin: 2px 0 0 4px;
3955 margin: 2px 0 0 4px;
3956 }
3956 }
3957
3957
3958 div.form div.fields div.field div.button input,
3958 div.form div.fields div.field div.button input,
3959 #content div.box div.form div.fields div.buttons input
3959 #content div.box div.form div.fields div.buttons input
3960 div.form div.fields div.buttons input,
3960 div.form div.fields div.buttons input,
3961 #content div.box div.action div.button input {
3961 #content div.box div.action div.button input {
3962 font-size: 11px;
3962 font-size: 11px;
3963 font-weight: 700;
3963 font-weight: 700;
3964 margin: 0;
3964 margin: 0;
3965 }
3965 }
3966
3966
3967 input.ui-button {
3967 input.ui-button {
3968 background: #e5e3e3 url("../images/button.png") repeat-x;
3968 background: #e5e3e3 url("../images/button.png") repeat-x;
3969 border-top: 1px solid #DDD;
3969 border-top: 1px solid #DDD;
3970 border-left: 1px solid #c6c6c6;
3970 border-left: 1px solid #c6c6c6;
3971 border-right: 1px solid #DDD;
3971 border-right: 1px solid #DDD;
3972 border-bottom: 1px solid #c6c6c6;
3972 border-bottom: 1px solid #c6c6c6;
3973 color: #515151 !important;
3973 color: #515151 !important;
3974 outline: none;
3974 outline: none;
3975 margin: 0;
3975 margin: 0;
3976 padding: 6px 12px;
3976 padding: 6px 12px;
3977 -webkit-border-radius: 4px 4px 4px 4px;
3977 -webkit-border-radius: 4px 4px 4px 4px;
3978 -khtml-border-radius: 4px 4px 4px 4px;
3978 -khtml-border-radius: 4px 4px 4px 4px;
3979 border-radius: 4px 4px 4px 4px;
3979 border-radius: 4px 4px 4px 4px;
3980 box-shadow: 0 1px 0 #ececec;
3980 box-shadow: 0 1px 0 #ececec;
3981 cursor: pointer;
3981 cursor: pointer;
3982 }
3982 }
3983
3983
3984 input.ui-button:hover {
3984 input.ui-button:hover {
3985 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3985 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3986 border-top: 1px solid #ccc;
3986 border-top: 1px solid #ccc;
3987 border-left: 1px solid #bebebe;
3987 border-left: 1px solid #bebebe;
3988 border-right: 1px solid #b1b1b1;
3988 border-right: 1px solid #b1b1b1;
3989 border-bottom: 1px solid #afafaf;
3989 border-bottom: 1px solid #afafaf;
3990 }
3990 }
3991
3991
3992 div.form div.fields div.field div.highlight, #content div.box div.form div.fields div.buttons div.highlight {
3992 div.form div.fields div.field div.highlight, #content div.box div.form div.fields div.buttons div.highlight {
3993 display: inline;
3993 display: inline;
3994 }
3994 }
3995
3995
3996 #content div.box div.form div.fields div.buttons, div.form div.fields div.buttons {
3996 #content div.box div.form div.fields div.buttons, div.form div.fields div.buttons {
3997 margin: 10px 0 0 200px;
3997 margin: 10px 0 0 200px;
3998 padding: 0;
3998 padding: 0;
3999 }
3999 }
4000
4000
4001 #content div.box-left div.form div.fields div.buttons, #content div.box-right div.form div.fields div.buttons, div.box-left div.form div.fields div.buttons, div.box-right div.form div.fields div.buttons {
4001 #content div.box-left div.form div.fields div.buttons, #content div.box-right div.form div.fields div.buttons, div.box-left div.form div.fields div.buttons, div.box-right div.form div.fields div.buttons {
4002 margin: 10px 0 0;
4002 margin: 10px 0 0;
4003 }
4003 }
4004
4004
4005 #content div.box table td.user, #content div.box table td.address {
4005 #content div.box table td.user, #content div.box table td.address {
4006 width: 10%;
4006 width: 10%;
4007 text-align: center;
4007 text-align: center;
4008 }
4008 }
4009
4009
4010 #content div.box div.action div.button, #login div.form div.fields div.field div.input div.link, #register div.form div.fields div.field div.input div.link {
4010 #content div.box div.action div.button, #login div.form div.fields div.field div.input div.link, #register div.form div.fields div.field div.input div.link {
4011 text-align: right;
4011 text-align: right;
4012 margin: 6px 0 0;
4012 margin: 6px 0 0;
4013 padding: 0;
4013 padding: 0;
4014 }
4014 }
4015
4015
4016 #content div.box div.action div.button input.ui-state-hover, #login div.form div.fields div.buttons input.ui-state-hover, #register div.form div.fields div.buttons input.ui-state-hover {
4016 #content div.box div.action div.button input.ui-state-hover, #login div.form div.fields div.buttons input.ui-state-hover, #register div.form div.fields div.buttons input.ui-state-hover {
4017 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
4017 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
4018 border-top: 1px solid #ccc;
4018 border-top: 1px solid #ccc;
4019 border-left: 1px solid #bebebe;
4019 border-left: 1px solid #bebebe;
4020 border-right: 1px solid #b1b1b1;
4020 border-right: 1px solid #b1b1b1;
4021 border-bottom: 1px solid #afafaf;
4021 border-bottom: 1px solid #afafaf;
4022 color: #515151;
4022 color: #515151;
4023 margin: 0;
4023 margin: 0;
4024 padding: 6px 12px;
4024 padding: 6px 12px;
4025 }
4025 }
4026
4026
4027 #content div.box div.pagination div.results, #content div.box div.pagination-wh div.results {
4027 #content div.box div.pagination div.results, #content div.box div.pagination-wh div.results {
4028 text-align: left;
4028 text-align: left;
4029 float: left;
4029 float: left;
4030 margin: 0;
4030 margin: 0;
4031 padding: 0;
4031 padding: 0;
4032 }
4032 }
4033
4033
4034 #content div.box div.pagination div.results span, #content div.box div.pagination-wh div.results span {
4034 #content div.box div.pagination div.results span, #content div.box div.pagination-wh div.results span {
4035 height: 1%;
4035 height: 1%;
4036 display: block;
4036 display: block;
4037 float: left;
4037 float: left;
4038 background: #ebebeb url("../images/pager.png") repeat-x;
4038 background: #ebebeb url("../images/pager.png") repeat-x;
4039 border-top: 1px solid #dedede;
4039 border-top: 1px solid #dedede;
4040 border-left: 1px solid #cfcfcf;
4040 border-left: 1px solid #cfcfcf;
4041 border-right: 1px solid #c4c4c4;
4041 border-right: 1px solid #c4c4c4;
4042 border-bottom: 1px solid #c4c4c4;
4042 border-bottom: 1px solid #c4c4c4;
4043 color: #4A4A4A;
4043 color: #4A4A4A;
4044 font-weight: 700;
4044 font-weight: 700;
4045 margin: 0;
4045 margin: 0;
4046 padding: 6px 8px;
4046 padding: 6px 8px;
4047 }
4047 }
4048
4048
4049 #content div.box div.pagination ul.pager li.disabled, #content div.box div.pagination-wh a.disabled {
4049 #content div.box div.pagination ul.pager li.disabled, #content div.box div.pagination-wh a.disabled {
4050 color: #B4B4B4;
4050 color: #B4B4B4;
4051 padding: 6px;
4051 padding: 6px;
4052 }
4052 }
4053
4053
4054 #login, #register {
4054 #login, #register {
4055 width: 520px;
4055 width: 520px;
4056 margin: 10% auto 0;
4056 margin: 10% auto 0;
4057 padding: 0;
4057 padding: 0;
4058 }
4058 }
4059
4059
4060 #login div.color, #register div.color {
4060 #login div.color, #register div.color {
4061 clear: both;
4061 clear: both;
4062 overflow: hidden;
4062 overflow: hidden;
4063 background: #FFF;
4063 background: #FFF;
4064 margin: 10px auto 0;
4064 margin: 10px auto 0;
4065 padding: 3px 3px 3px 0;
4065 padding: 3px 3px 3px 0;
4066 }
4066 }
4067
4067
4068 #login div.color a, #register div.color a {
4068 #login div.color a, #register div.color a {
4069 width: 20px;
4069 width: 20px;
4070 height: 20px;
4070 height: 20px;
4071 display: block;
4071 display: block;
4072 float: left;
4072 float: left;
4073 margin: 0 0 0 3px;
4073 margin: 0 0 0 3px;
4074 padding: 0;
4074 padding: 0;
4075 }
4075 }
4076
4076
4077 #login div.title h5, #register div.title h5 {
4077 #login div.title h5, #register div.title h5 {
4078 color: #fff;
4078 color: #fff;
4079 margin: 10px;
4079 margin: 10px;
4080 padding: 0;
4080 padding: 0;
4081 }
4081 }
4082
4082
4083 #login div.form div.fields div.field, #register div.form div.fields div.field {
4083 #login div.form div.fields div.field, #register div.form div.fields div.field {
4084 clear: both;
4084 clear: both;
4085 overflow: hidden;
4085 overflow: hidden;
4086 margin: 0;
4086 margin: 0;
4087 padding: 0 0 10px;
4087 padding: 0 0 10px;
4088 }
4088 }
4089
4089
4090 #login div.form div.fields div.field span.error-message, #register div.form div.fields div.field span.error-message {
4090 #login div.form div.fields div.field span.error-message, #register div.form div.fields div.field span.error-message {
4091 height: 1%;
4091 height: 1%;
4092 display: block;
4092 display: block;
4093 color: red;
4093 color: red;
4094 margin: 8px 0 0;
4094 margin: 8px 0 0;
4095 padding: 0;
4095 padding: 0;
4096 max-width: 320px;
4096 max-width: 320px;
4097 }
4097 }
4098
4098
4099 #login div.form div.fields div.field div.label label, #register div.form div.fields div.field div.label label {
4099 #login div.form div.fields div.field div.label label, #register div.form div.fields div.field div.label label {
4100 color: #000;
4100 color: #000;
4101 font-weight: 700;
4101 font-weight: 700;
4102 }
4102 }
4103
4103
4104 #login div.form div.fields div.field div.input, #register div.form div.fields div.field div.input {
4104 #login div.form div.fields div.field div.input, #register div.form div.fields div.field div.input {
4105 float: left;
4105 float: left;
4106 margin: 0;
4106 margin: 0;
4107 padding: 0;
4107 padding: 0;
4108 }
4108 }
4109
4109
4110 #login div.form div.fields div.field div.input input.large {
4110 #login div.form div.fields div.field div.input input.large {
4111 width: 250px;
4111 width: 250px;
4112 }
4112 }
4113
4113
4114 #login div.form div.fields div.field div.checkbox, #register div.form div.fields div.field div.checkbox {
4114 #login div.form div.fields div.field div.checkbox, #register div.form div.fields div.field div.checkbox {
4115 margin: 0 0 0 184px;
4115 margin: 0 0 0 184px;
4116 padding: 0;
4116 padding: 0;
4117 }
4117 }
4118
4118
4119 #login div.form div.fields div.field div.checkbox label, #register div.form div.fields div.field div.checkbox label {
4119 #login div.form div.fields div.field div.checkbox label, #register div.form div.fields div.field div.checkbox label {
4120 color: #565656;
4120 color: #565656;
4121 font-weight: 700;
4121 font-weight: 700;
4122 }
4122 }
4123
4123
4124 #login div.form div.fields div.buttons input, #register div.form div.fields div.buttons input {
4124 #login div.form div.fields div.buttons input, #register div.form div.fields div.buttons input {
4125 color: #000;
4125 color: #000;
4126 font-size: 1em;
4126 font-size: 1em;
4127 font-weight: 700;
4127 font-weight: 700;
4128 margin: 0;
4128 margin: 0;
4129 }
4129 }
4130
4130
4131 #changeset_content .container .wrapper, #graph_content .container .wrapper {
4131 #changeset_content .container .wrapper, #graph_content .container .wrapper {
4132 width: 600px;
4132 width: 600px;
4133 }
4133 }
4134
4134
4135 #changeset_content .container .date, .ac .match {
4135 #changeset_content .container .date, .ac .match {
4136 font-weight: 700;
4136 font-weight: 700;
4137 padding-top: 5px;
4137 padding-top: 5px;
4138 padding-bottom: 5px;
4138 padding-bottom: 5px;
4139 }
4139 }
4140
4140
4141 div#legend_container table td, div#legend_choices table td {
4141 div#legend_container table td, div#legend_choices table td {
4142 border: none !important;
4142 border: none !important;
4143 height: 20px !important;
4143 height: 20px !important;
4144 padding: 0 !important;
4144 padding: 0 !important;
4145 }
4145 }
4146
4146
4147 .q_filter_box {
4147 .q_filter_box {
4148 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4148 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4149 -webkit-border-radius: 4px;
4149 -webkit-border-radius: 4px;
4150 border-radius: 4px;
4150 border-radius: 4px;
4151 border: 0 none;
4151 border: 0 none;
4152 margin-bottom: -4px;
4152 margin-bottom: -4px;
4153 margin-top: -4px;
4153 margin-top: -4px;
4154 padding-left: 3px;
4154 padding-left: 3px;
4155 }
4155 }
4156
4156
4157 #node_filter {
4157 #node_filter {
4158 border: 0px solid #545454;
4158 border: 0px solid #545454;
4159 color: #AAAAAA;
4159 color: #AAAAAA;
4160 padding-left: 3px;
4160 padding-left: 3px;
4161 }
4161 }
4162
4162
4163
4163
4164 .group_members_wrap {
4164 .group_members_wrap {
4165 min-height: 85px;
4165 min-height: 85px;
4166 padding-left: 20px;
4166 padding-left: 20px;
4167 }
4167 }
4168
4168
4169 .group_members .group_member {
4169 .group_members .group_member {
4170 height: 30px;
4170 height: 30px;
4171 padding: 0px 0px 0px 0px;
4171 padding: 0px 0px 0px 0px;
4172 }
4172 }
4173
4173
4174 .reviewer_status {
4174 .reviewer_status {
4175 float: left;
4175 float: left;
4176 }
4176 }
4177
4177
4178 .reviewers_member {
4178 .reviewers_member {
4179 height: 15px;
4179 height: 15px;
4180 padding: 0px 0px 0px 10px;
4180 padding: 0px 0px 0px 10px;
4181 }
4181 }
4182
4182
4183 .emails_wrap {
4183 .emails_wrap {
4184 padding: 0px 20px;
4184 padding: 0px 20px;
4185 }
4185 }
4186
4186
4187 .emails_wrap .email_entry {
4187 .emails_wrap .email_entry {
4188 height: 30px;
4188 height: 30px;
4189 padding: 0px 0px 0px 10px;
4189 padding: 0px 0px 0px 10px;
4190 }
4190 }
4191 .emails_wrap .email_entry .email {
4191 .emails_wrap .email_entry .email {
4192 float: left
4192 float: left
4193 }
4193 }
4194 .emails_wrap .email_entry .email_action {
4194 .emails_wrap .email_entry .email_action {
4195 float: left
4195 float: left
4196 }
4196 }
4197
4197
4198 .ips_wrap {
4198 .ips_wrap {
4199 padding: 0px 20px;
4199 padding: 0px 20px;
4200 }
4200 }
4201
4201
4202 .ips_wrap .ip_entry {
4202 .ips_wrap .ip_entry {
4203 height: 30px;
4203 height: 30px;
4204 padding: 0px 0px 0px 10px;
4204 padding: 0px 0px 0px 10px;
4205 }
4205 }
4206 .ips_wrap .ip_entry .ip {
4206 .ips_wrap .ip_entry .ip {
4207 float: left
4207 float: left
4208 }
4208 }
4209 .ips_wrap .ip_entry .ip_action {
4209 .ips_wrap .ip_entry .ip_action {
4210 float: left
4210 float: left
4211 }
4211 }
4212
4212
4213
4213
4214 /*README STYLE*/
4214 /*README STYLE*/
4215
4215
4216 div.readme {
4216 div.readme {
4217 padding: 0px;
4217 padding: 0px;
4218 }
4218 }
4219
4219
4220 div.readme h2 {
4220 div.readme h2 {
4221 font-weight: normal;
4221 font-weight: normal;
4222 }
4222 }
4223
4223
4224 div.readme .readme_box {
4224 div.readme .readme_box {
4225 background-color: #fafafa;
4225 background-color: #fafafa;
4226 }
4226 }
4227
4227
4228 div.readme .readme_box {
4228 div.readme .readme_box {
4229 clear: both;
4229 clear: both;
4230 overflow: hidden;
4230 overflow: hidden;
4231 margin: 0;
4231 margin: 0;
4232 padding: 0 20px 10px;
4232 padding: 0 20px 10px;
4233 }
4233 }
4234
4234
4235 div.readme .readme_box h1, div.readme .readme_box h2, div.readme .readme_box h3, div.readme .readme_box h4, div.readme .readme_box h5, div.readme .readme_box h6 {
4235 div.readme .readme_box h1, div.readme .readme_box h2, div.readme .readme_box h3, div.readme .readme_box h4, div.readme .readme_box h5, div.readme .readme_box h6 {
4236 border-bottom: 0 !important;
4236 border-bottom: 0 !important;
4237 margin: 0 !important;
4237 margin: 0 !important;
4238 padding: 0 !important;
4238 padding: 0 !important;
4239 line-height: 1.5em !important;
4239 line-height: 1.5em !important;
4240 }
4240 }
4241
4241
4242
4242
4243 div.readme .readme_box h1:first-child {
4243 div.readme .readme_box h1:first-child {
4244 padding-top: .25em !important;
4244 padding-top: .25em !important;
4245 }
4245 }
4246
4246
4247 div.readme .readme_box h2, div.readme .readme_box h3 {
4247 div.readme .readme_box h2, div.readme .readme_box h3 {
4248 margin: 1em 0 !important;
4248 margin: 1em 0 !important;
4249 }
4249 }
4250
4250
4251 div.readme .readme_box h2 {
4251 div.readme .readme_box h2 {
4252 margin-top: 1.5em !important;
4252 margin-top: 1.5em !important;
4253 border-top: 4px solid #e0e0e0 !important;
4253 border-top: 4px solid #e0e0e0 !important;
4254 padding-top: .5em !important;
4254 padding-top: .5em !important;
4255 }
4255 }
4256
4256
4257 div.readme .readme_box p {
4257 div.readme .readme_box p {
4258 color: black !important;
4258 color: black !important;
4259 margin: 1em 0 !important;
4259 margin: 1em 0 !important;
4260 line-height: 1.5em !important;
4260 line-height: 1.5em !important;
4261 }
4261 }
4262
4262
4263 div.readme .readme_box ul {
4263 div.readme .readme_box ul {
4264 list-style: disc !important;
4264 list-style: disc !important;
4265 margin: 1em 0 1em 2em !important;
4265 margin: 1em 0 1em 2em !important;
4266 }
4266 }
4267
4267
4268 div.readme .readme_box ol {
4268 div.readme .readme_box ol {
4269 list-style: decimal;
4269 list-style: decimal;
4270 margin: 1em 0 1em 2em !important;
4270 margin: 1em 0 1em 2em !important;
4271 }
4271 }
4272
4272
4273 div.readme .readme_box code {
4273 div.readme .readme_box code {
4274 font-size: 12px !important;
4274 font-size: 12px !important;
4275 background-color: ghostWhite !important;
4275 background-color: ghostWhite !important;
4276 color: #444 !important;
4276 color: #444 !important;
4277 padding: 0 .2em !important;
4277 padding: 0 .2em !important;
4278 border: 1px solid #dedede !important;
4278 border: 1px solid #dedede !important;
4279 }
4279 }
4280
4280
4281 div.readme .readme_box pre code {
4281 div.readme .readme_box pre code {
4282 padding: 0 !important;
4282 padding: 0 !important;
4283 font-size: 12px !important;
4283 font-size: 12px !important;
4284 background-color: #eee !important;
4284 background-color: #eee !important;
4285 border: none !important;
4285 border: none !important;
4286 }
4286 }
4287
4287
4288 div.readme .readme_box pre {
4288 div.readme .readme_box pre {
4289 margin: 1em 0;
4289 margin: 1em 0;
4290 font-size: 12px;
4290 font-size: 12px;
4291 background-color: #eee;
4291 background-color: #eee;
4292 border: 1px solid #ddd;
4292 border: 1px solid #ddd;
4293 padding: 5px;
4293 padding: 5px;
4294 color: #444;
4294 color: #444;
4295 overflow: auto;
4295 overflow: auto;
4296 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4296 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4297 -webkit-border-radius: 3px;
4297 -webkit-border-radius: 3px;
4298 border-radius: 3px;
4298 border-radius: 3px;
4299 }
4299 }
4300
4300
4301 div.readme .readme_box table {
4301 div.readme .readme_box table {
4302 display: table;
4302 display: table;
4303 border-collapse: separate;
4303 border-collapse: separate;
4304 border-spacing: 2px;
4304 border-spacing: 2px;
4305 border-color: gray;
4305 border-color: gray;
4306 width: auto !important;
4306 width: auto !important;
4307 }
4307 }
4308
4308
4309
4309
4310 /** RST STYLE **/
4310 /** RST STYLE **/
4311
4311
4312
4312
4313 div.rst-block {
4313 div.rst-block {
4314 padding: 0px;
4314 padding: 0px;
4315 }
4315 }
4316
4316
4317 div.rst-block h2 {
4317 div.rst-block h2 {
4318 font-weight: normal;
4318 font-weight: normal;
4319 }
4319 }
4320
4320
4321 div.rst-block {
4321 div.rst-block {
4322 background-color: #fafafa;
4322 background-color: #fafafa;
4323 }
4323 }
4324
4324
4325 div.rst-block {
4325 div.rst-block {
4326 clear: both;
4326 clear: both;
4327 overflow: hidden;
4327 overflow: hidden;
4328 margin: 0;
4328 margin: 0;
4329 padding: 0 20px 10px;
4329 padding: 0 20px 10px;
4330 }
4330 }
4331
4331
4332 div.rst-block h1, div.rst-block h2, div.rst-block h3, div.rst-block h4, div.rst-block h5, div.rst-block h6 {
4332 div.rst-block h1, div.rst-block h2, div.rst-block h3, div.rst-block h4, div.rst-block h5, div.rst-block h6 {
4333 border-bottom: 0 !important;
4333 border-bottom: 0 !important;
4334 margin: 0 !important;
4334 margin: 0 !important;
4335 padding: 0 !important;
4335 padding: 0 !important;
4336 line-height: 1.5em !important;
4336 line-height: 1.5em !important;
4337 }
4337 }
4338
4338
4339
4339
4340 div.rst-block h1:first-child {
4340 div.rst-block h1:first-child {
4341 padding-top: .25em !important;
4341 padding-top: .25em !important;
4342 }
4342 }
4343
4343
4344 div.rst-block h2, div.rst-block h3 {
4344 div.rst-block h2, div.rst-block h3 {
4345 margin: 1em 0 !important;
4345 margin: 1em 0 !important;
4346 }
4346 }
4347
4347
4348 div.rst-block h2 {
4348 div.rst-block h2 {
4349 margin-top: 1.5em !important;
4349 margin-top: 1.5em !important;
4350 border-top: 4px solid #e0e0e0 !important;
4350 border-top: 4px solid #e0e0e0 !important;
4351 padding-top: .5em !important;
4351 padding-top: .5em !important;
4352 }
4352 }
4353
4353
4354 div.rst-block p {
4354 div.rst-block p {
4355 color: black !important;
4355 color: black !important;
4356 margin: 1em 0 !important;
4356 margin: 1em 0 !important;
4357 line-height: 1.5em !important;
4357 line-height: 1.5em !important;
4358 }
4358 }
4359
4359
4360 div.rst-block ul {
4360 div.rst-block ul {
4361 list-style: disc !important;
4361 list-style: disc !important;
4362 margin: 1em 0 1em 2em !important;
4362 margin: 1em 0 1em 2em !important;
4363 }
4363 }
4364
4364
4365 div.rst-block ol {
4365 div.rst-block ol {
4366 list-style: decimal;
4366 list-style: decimal;
4367 margin: 1em 0 1em 2em !important;
4367 margin: 1em 0 1em 2em !important;
4368 }
4368 }
4369
4369
4370 div.rst-block code {
4370 div.rst-block code {
4371 font-size: 12px !important;
4371 font-size: 12px !important;
4372 background-color: ghostWhite !important;
4372 background-color: ghostWhite !important;
4373 color: #444 !important;
4373 color: #444 !important;
4374 padding: 0 .2em !important;
4374 padding: 0 .2em !important;
4375 border: 1px solid #dedede !important;
4375 border: 1px solid #dedede !important;
4376 }
4376 }
4377
4377
4378 div.rst-block pre code {
4378 div.rst-block pre code {
4379 padding: 0 !important;
4379 padding: 0 !important;
4380 font-size: 12px !important;
4380 font-size: 12px !important;
4381 background-color: #eee !important;
4381 background-color: #eee !important;
4382 border: none !important;
4382 border: none !important;
4383 }
4383 }
4384
4384
4385 div.rst-block pre {
4385 div.rst-block pre {
4386 margin: 1em 0;
4386 margin: 1em 0;
4387 font-size: 12px;
4387 font-size: 12px;
4388 background-color: #eee;
4388 background-color: #eee;
4389 border: 1px solid #ddd;
4389 border: 1px solid #ddd;
4390 padding: 5px;
4390 padding: 5px;
4391 color: #444;
4391 color: #444;
4392 overflow: auto;
4392 overflow: auto;
4393 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4393 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4394 -webkit-border-radius: 3px;
4394 -webkit-border-radius: 3px;
4395 border-radius: 3px;
4395 border-radius: 3px;
4396 }
4396 }
4397
4397
4398
4398
4399 /** comment main **/
4399 /** comment main **/
4400 .comments {
4400 .comments {
4401 padding: 10px 20px;
4401 padding: 10px 20px;
4402 max-width: 978px;
4402 max-width: 978px;
4403 }
4403 }
4404
4404
4405 .comments .comment {
4405 .comments .comment {
4406 border: 1px solid #ddd;
4406 border: 1px solid #ddd;
4407 margin-top: 10px;
4407 margin-top: 10px;
4408 -webkit-border-radius: 4px;
4408 -webkit-border-radius: 4px;
4409 border-radius: 4px;
4409 border-radius: 4px;
4410 }
4410 }
4411
4411
4412 .comments .comment .meta {
4412 .comments .comment .meta {
4413 background: #f8f8f8;
4413 background: #f8f8f8;
4414 padding: 4px;
4414 padding: 4px;
4415 border-bottom: 1px solid #ddd;
4415 border-bottom: 1px solid #ddd;
4416 height: 18px;
4416 height: 18px;
4417 }
4417 }
4418
4418
4419 .comments .comment .meta img {
4419 .comments .comment .meta img {
4420 vertical-align: middle;
4420 vertical-align: middle;
4421 }
4421 }
4422
4422
4423 .comments .comment .meta .user {
4423 .comments .comment .meta .user {
4424 font-weight: bold;
4424 font-weight: bold;
4425 float: left;
4425 float: left;
4426 padding: 4px 2px 2px 2px;
4426 padding: 4px 2px 2px 2px;
4427 }
4427 }
4428
4428
4429 .comments .comment .meta .date {
4429 .comments .comment .meta .date {
4430 float: left;
4430 float: left;
4431 padding: 4px 4px 0px 4px;
4431 padding: 4px 4px 0px 4px;
4432 }
4432 }
4433
4433
4434 .comments .comment .text {
4434 .comments .comment .text {
4435 background-color: #FAFAFA;
4435 background-color: #FAFAFA;
4436 }
4436 }
4437 .comment .text div.rst-block p {
4437 .comment .text div.rst-block p {
4438 margin: 0.5em 0px !important;
4438 margin: 0.5em 0px !important;
4439 }
4439 }
4440
4440
4441 .comments .comments-number {
4441 .comments .comments-number {
4442 padding: 0px 0px 10px 0px;
4442 padding: 0px 0px 10px 0px;
4443 font-weight: bold;
4443 font-weight: bold;
4444 color: #666;
4444 color: #666;
4445 font-size: 16px;
4445 font-size: 16px;
4446 }
4446 }
4447
4447
4448 /** comment form **/
4448 /** comment form **/
4449
4449
4450 .status-block {
4450 .status-block {
4451 min-height: 80px;
4451 min-height: 80px;
4452 clear: both
4452 clear: both
4453 }
4453 }
4454
4454
4455
4455
4456 div.comment-form {
4456 div.comment-form {
4457 margin-top: 20px;
4457 margin-top: 20px;
4458 }
4458 }
4459
4459
4460 .comment-form strong {
4460 .comment-form strong {
4461 display: block;
4461 display: block;
4462 margin-bottom: 15px;
4462 margin-bottom: 15px;
4463 }
4463 }
4464
4464
4465 .comment-form textarea {
4465 .comment-form textarea {
4466 width: 100%;
4466 width: 100%;
4467 height: 100px;
4467 height: 100px;
4468 font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
4468 font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
4469 }
4469 }
4470
4470
4471 form.comment-form {
4471 form.comment-form {
4472 margin-top: 10px;
4472 margin-top: 10px;
4473 margin-left: 10px;
4473 margin-left: 10px;
4474 }
4474 }
4475
4475
4476 .comment-inline-form .comment-block-ta,
4476 .comment-inline-form .comment-block-ta,
4477 .comment-form .comment-block-ta {
4477 .comment-form .comment-block-ta {
4478 border: 1px solid #ccc;
4478 border: 1px solid #ccc;
4479 border-radius: 3px;
4479 border-radius: 3px;
4480 box-sizing: border-box;
4480 box-sizing: border-box;
4481 }
4481 }
4482
4482
4483 .comment-form-submit {
4483 .comment-form-submit {
4484 margin-top: 5px;
4484 margin-top: 5px;
4485 margin-left: 525px;
4485 margin-left: 525px;
4486 }
4486 }
4487
4487
4488 .file-comments {
4488 .file-comments {
4489 display: none;
4489 display: none;
4490 }
4490 }
4491
4491
4492 .comment-form .comment {
4492 .comment-form .comment {
4493 margin-left: 10px;
4493 margin-left: 10px;
4494 }
4494 }
4495
4495
4496 .comment-form .comment-help {
4496 .comment-form .comment-help {
4497 padding: 5px 5px 5px 5px;
4497 padding: 5px 5px 5px 5px;
4498 color: #666;
4498 color: #666;
4499 }
4499 }
4500 .comment-form .comment-help .preview-btn,
4500 .comment-form .comment-help .preview-btn,
4501 .comment-form .comment-help .edit-btn {
4501 .comment-form .comment-help .edit-btn {
4502 float: right;
4502 float: right;
4503 margin: -6px 0px 0px 0px;
4503 margin: -6px 0px 0px 0px;
4504 }
4504 }
4505
4505
4506 .comment-form .preview-box.unloaded,
4506 .comment-form .preview-box.unloaded,
4507 .comment-inline-form .preview-box.unloaded {
4507 .comment-inline-form .preview-box.unloaded {
4508 height: 50px;
4508 height: 50px;
4509 text-align: center;
4509 text-align: center;
4510 padding: 20px;
4510 padding: 20px;
4511 background-color: #fafafa;
4511 background-color: #fafafa;
4512 }
4512 }
4513
4513
4514 .comment-form .comment-button {
4514 .comment-form .comment-button {
4515 padding-top: 5px;
4515 padding-top: 5px;
4516 }
4516 }
4517
4517
4518 .add-another-button {
4518 .add-another-button {
4519 margin-left: 10px;
4519 margin-left: 10px;
4520 margin-top: 10px;
4520 margin-top: 10px;
4521 margin-bottom: 10px;
4521 margin-bottom: 10px;
4522 }
4522 }
4523
4523
4524 .comment .buttons {
4524 .comment .buttons {
4525 float: right;
4525 float: right;
4526 margin: -1px 0px 0px 0px;
4526 margin: -1px 0px 0px 0px;
4527 }
4527 }
4528
4528
4529
4529
4530 .show-inline-comments {
4530 .show-inline-comments {
4531 position: relative;
4531 position: relative;
4532 top: 1px
4532 top: 1px
4533 }
4533 }
4534
4534
4535 /** comment inline form **/
4535 /** comment inline form **/
4536 .comment-inline-form {
4536 .comment-inline-form {
4537 margin: 4px;
4537 margin: 4px;
4538 max-width: 978px;
4538 max-width: 978px;
4539 }
4539 }
4540 .comment-inline-form .submitting-overlay {
4540 .comment-inline-form .submitting-overlay {
4541 display: none;
4541 display: none;
4542 height: 0;
4542 height: 0;
4543 text-align: center;
4543 text-align: center;
4544 font-size: 16px;
4544 font-size: 16px;
4545 opacity: 0.5;
4545 opacity: 0.5;
4546 }
4546 }
4547
4547
4548 .comment-inline-form .clearfix,
4548 .comment-inline-form .clearfix,
4549 .comment-form .clearfix {
4549 .comment-form .clearfix {
4550 background: #EEE;
4550 background: #EEE;
4551 -webkit-border-radius: 4px;
4551 -webkit-border-radius: 4px;
4552 border-radius: 4px;
4552 border-radius: 4px;
4553 padding: 5px;
4553 padding: 5px;
4554 margin: 0px;
4554 margin: 0px;
4555 }
4555 }
4556
4556
4557 div.comment-inline-form {
4557 div.comment-inline-form {
4558 padding: 4px 0px 6px 0px;
4558 padding: 4px 0px 6px 0px;
4559 }
4559 }
4560
4560
4561 .comment-inline-form strong {
4561 .comment-inline-form strong {
4562 display: block;
4562 display: block;
4563 margin-bottom: 15px;
4563 margin-bottom: 15px;
4564 }
4564 }
4565
4565
4566 .comment-inline-form textarea {
4566 .comment-inline-form textarea {
4567 width: 100%;
4567 width: 100%;
4568 height: 100px;
4568 height: 100px;
4569 font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
4569 font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
4570 }
4570 }
4571
4571
4572 form.comment-inline-form {
4572 form.comment-inline-form {
4573 margin-top: 10px;
4573 margin-top: 10px;
4574 margin-left: 10px;
4574 margin-left: 10px;
4575 }
4575 }
4576
4576
4577 .comment-inline-form-submit {
4577 .comment-inline-form-submit {
4578 margin-top: 5px;
4578 margin-top: 5px;
4579 margin-left: 525px;
4579 margin-left: 525px;
4580 }
4580 }
4581
4581
4582 .file-comments {
4582 .file-comments {
4583 display: none;
4583 display: none;
4584 }
4584 }
4585
4585
4586 .comment-inline-form .comment {
4586 .comment-inline-form .comment {
4587 margin-left: 10px;
4587 margin-left: 10px;
4588 }
4588 }
4589
4589
4590 .comment-inline-form .comment-help {
4590 .comment-inline-form .comment-help {
4591 padding: 5px 5px 5px 5px;
4591 padding: 5px 5px 5px 5px;
4592 color: #666;
4592 color: #666;
4593 }
4593 }
4594
4594
4595 .comment-inline-form .comment-help .preview-btn,
4595 .comment-inline-form .comment-help .preview-btn,
4596 .comment-inline-form .comment-help .edit-btn {
4596 .comment-inline-form .comment-help .edit-btn {
4597 float: right;
4597 float: right;
4598 margin: -6px 0px 0px 0px;
4598 margin: -6px 0px 0px 0px;
4599 }
4599 }
4600
4600
4601 .comment-inline-form .comment-button {
4601 .comment-inline-form .comment-button {
4602 padding-top: 5px;
4602 padding-top: 5px;
4603 }
4603 }
4604
4604
4605 /** comment inline **/
4605 /** comment inline **/
4606 .inline-comments {
4606 .inline-comments {
4607 padding: 10px 20px;
4607 padding: 10px 20px;
4608 }
4608 }
4609
4609
4610 .inline-comments div.rst-block {
4610 .inline-comments div.rst-block {
4611 clear: both;
4611 clear: both;
4612 overflow: hidden;
4612 overflow: hidden;
4613 margin: 0;
4613 margin: 0;
4614 padding: 0 20px 0px;
4614 padding: 0 20px 0px;
4615 }
4615 }
4616 .inline-comments .comment {
4616 .inline-comments .comment {
4617 max-width: 978px;
4617 max-width: 978px;
4618 border: 1px solid #ddd;
4618 border: 1px solid #ddd;
4619 -webkit-border-radius: 4px;
4619 -webkit-border-radius: 4px;
4620 border-radius: 4px;
4620 border-radius: 4px;
4621 margin: 3px 3px 5px 5px;
4621 margin: 3px 3px 5px 5px;
4622 background-color: #FAFAFA;
4622 background-color: #FAFAFA;
4623 }
4623 }
4624 .inline-comments .add-comment {
4624 .inline-comments .add-comment {
4625 padding: 2px 4px 8px 5px;
4625 padding: 2px 4px 8px 5px;
4626 }
4626 }
4627
4627
4628 .inline-comments .comment-wrapp {
4628 .inline-comments .comment-wrapp {
4629 padding: 1px;
4629 padding: 1px;
4630 }
4630 }
4631 .inline-comments .comment .meta {
4631 .inline-comments .comment .meta {
4632 background: #f8f8f8;
4632 background: #f8f8f8;
4633 padding: 4px;
4633 padding: 4px;
4634 border-bottom: 1px solid #ddd;
4634 border-bottom: 1px solid #ddd;
4635 height: 20px;
4635 height: 20px;
4636 }
4636 }
4637
4637
4638 .inline-comments .comment .meta img {
4638 .inline-comments .comment .meta img {
4639 vertical-align: middle;
4639 vertical-align: middle;
4640 }
4640 }
4641
4641
4642 .inline-comments .comment .meta .user {
4642 .inline-comments .comment .meta .user {
4643 font-weight: bold;
4643 font-weight: bold;
4644 float: left;
4644 float: left;
4645 padding: 3px;
4645 padding: 3px;
4646 }
4646 }
4647
4647
4648 .inline-comments .comment .meta .date {
4648 .inline-comments .comment .meta .date {
4649 float: left;
4649 float: left;
4650 padding: 3px;
4650 padding: 3px;
4651 }
4651 }
4652
4652
4653 .inline-comments .comment .text {
4653 .inline-comments .comment .text {
4654 background-color: #FAFAFA;
4654 background-color: #FAFAFA;
4655 }
4655 }
4656
4656
4657 .inline-comments .comments-number {
4657 .inline-comments .comments-number {
4658 padding: 0px 0px 10px 0px;
4658 padding: 0px 0px 10px 0px;
4659 font-weight: bold;
4659 font-weight: bold;
4660 color: #666;
4660 color: #666;
4661 font-size: 16px;
4661 font-size: 16px;
4662 }
4662 }
4663 .inline-comments-button .add-comment {
4663 .inline-comments-button .add-comment {
4664 margin: 2px 0px 8px 5px !important
4664 margin: 2px 0px 8px 5px !important
4665 }
4665 }
4666
4666
4667 .notification-paginator {
4667 .notification-paginator {
4668 padding: 0px 0px 4px 16px;
4668 padding: 0px 0px 4px 16px;
4669 }
4669 }
4670
4670
4671 #context-pages .pull-request span,
4671 #context-pages .pull-request span,
4672 .menu_link_notifications {
4672 .menu_link_notifications {
4673 padding: 4px 4px !important;
4673 padding: 4px 4px !important;
4674 text-align: center;
4674 text-align: center;
4675 color: #888 !important;
4675 color: #888 !important;
4676 background-color: #DEDEDE !important;
4676 background-color: #DEDEDE !important;
4677 border-radius: 4px !important;
4677 border-radius: 4px !important;
4678 -webkit-border-radius: 4px !important;
4678 -webkit-border-radius: 4px !important;
4679 }
4679 }
4680
4680
4681 #context-pages .forks span,
4681 #context-pages .forks span,
4682 .menu_link_notifications {
4682 .menu_link_notifications {
4683 padding: 4px 4px !important;
4683 padding: 4px 4px !important;
4684 text-align: center;
4684 text-align: center;
4685 color: #888 !important;
4685 color: #888 !important;
4686 background-color: #DEDEDE !important;
4686 background-color: #DEDEDE !important;
4687 border-radius: 4px !important;
4687 border-radius: 4px !important;
4688 -webkit-border-radius: 4px !important;
4688 -webkit-border-radius: 4px !important;
4689 }
4689 }
4690
4690
4691
4691
4692 .notification-header {
4692 .notification-header {
4693 padding-top: 6px;
4693 padding-top: 6px;
4694 }
4694 }
4695 .notification-header .desc {
4695 .notification-header .desc {
4696 font-size: 16px;
4696 font-size: 16px;
4697 height: 24px;
4697 height: 24px;
4698 float: left
4698 float: left
4699 }
4699 }
4700 .notification-list .container.unread {
4700 .notification-list .container.unread {
4701 background: none repeat scroll 0 0 rgba(255, 255, 180, 0.6);
4701 background: none repeat scroll 0 0 rgba(255, 255, 180, 0.6);
4702 }
4702 }
4703 .notification-header .gravatar {
4703 .notification-header .gravatar {
4704 background: none repeat scroll 0 0 transparent;
4704 background: none repeat scroll 0 0 transparent;
4705 padding: 0px 0px 0px 8px;
4705 padding: 0px 0px 0px 8px;
4706 }
4706 }
4707 .notification-list .container .notification-header .desc {
4707 .notification-list .container .notification-header .desc {
4708 font-weight: bold;
4708 font-weight: bold;
4709 font-size: 17px;
4709 font-size: 17px;
4710 }
4710 }
4711 .notification-table {
4711 .notification-table {
4712 border: 1px solid #ccc;
4712 border: 1px solid #ccc;
4713 -webkit-border-radius: 6px 6px 6px 6px;
4713 -webkit-border-radius: 6px 6px 6px 6px;
4714 border-radius: 6px 6px 6px 6px;
4714 border-radius: 6px 6px 6px 6px;
4715 clear: both;
4715 clear: both;
4716 margin: 0px 20px 0px 20px;
4716 margin: 0px 20px 0px 20px;
4717 }
4717 }
4718 .notification-header .delete-notifications {
4718 .notification-header .delete-notifications {
4719 float: right;
4719 float: right;
4720 padding-top: 8px;
4720 padding-top: 8px;
4721 cursor: pointer;
4721 cursor: pointer;
4722 }
4722 }
4723 .notification-header .read-notifications {
4723 .notification-header .read-notifications {
4724 float: right;
4724 float: right;
4725 padding-top: 8px;
4725 padding-top: 8px;
4726 cursor: pointer;
4726 cursor: pointer;
4727 }
4727 }
4728 .notification-subject {
4728 .notification-subject {
4729 clear: both;
4729 clear: both;
4730 border-bottom: 1px solid #eee;
4730 border-bottom: 1px solid #eee;
4731 padding: 5px 0px 5px 38px;
4731 padding: 5px 0px 5px 38px;
4732 }
4732 }
4733
4733
4734 .notification-body {
4734 .notification-body {
4735 clear: both;
4735 clear: both;
4736 margin: 34px 2px 2px 8px
4736 margin: 34px 2px 2px 8px
4737 }
4737 }
4738
4738
4739 /****
4739 /****
4740 PULL REQUESTS
4740 PULL REQUESTS
4741 *****/
4741 *****/
4742 .pullrequests_section_head {
4742 .pullrequests_section_head {
4743 padding: 10px 10px 10px 0px;
4743 padding: 10px 10px 10px 0px;
4744 font-size: 16px;
4744 font-size: 16px;
4745 font-weight: bold;
4745 font-weight: bold;
4746 }
4746 }
4747
4747
4748 div.pr-details-title.closed,
4748 div.pr-details-title.closed,
4749 #pullrequests_container li.closed div div
4749 #pullrequests_container li.closed div div
4750 {
4750 {
4751 color: #555;
4751 color: #555;
4752 background: #eee;
4752 background: #eee;
4753 }
4753 }
4754
4754
4755 div.pr-title {
4755 div.pr-title {
4756 font-size: 1.6em;
4756 font-size: 1.6em;
4757 }
4757 }
4758 div.pr-details-title {
4758 div.pr-details-title {
4759 font-size: 1.6em;
4759 font-size: 1.6em;
4760 padding: 5px 0px 5px 10px;
4760 padding: 5px 0px 5px 10px;
4761 }
4761 }
4762
4762
4763 div.pr {
4763 div.pr {
4764 margin: 0px 20px;
4764 margin: 0px 20px;
4765 padding: 4px 4px;
4765 padding: 4px 4px;
4766 }
4766 }
4767 div.pr-desc {
4767 div.pr-desc {
4768 margin: 0px 20px;
4768 margin: 0px 20px;
4769 }
4769 }
4770 div.pr-closed {
4770 div.pr-closed {
4771 background-color: #eee;
4771 background-color: #eee;
4772 }
4772 }
4773
4773
4774 span.pr-closed-tag {
4774 span.pr-closed-tag {
4775 margin-bottom: 1px;
4775 margin-bottom: 1px;
4776 margin-right: 1px;
4776 margin-right: 1px;
4777 padding: 1px 3px;
4777 padding: 1px 3px;
4778 font-size: 10px;
4778 font-size: 10px;
4779 padding: 1px 3px 1px 3px;
4779 padding: 1px 3px 1px 3px;
4780 font-size: 10px;
4780 font-size: 10px;
4781 color: #577632;
4781 color: #577632;
4782 white-space: nowrap;
4782 white-space: nowrap;
4783 -webkit-border-radius: 4px;
4783 -webkit-border-radius: 4px;
4784 border-radius: 4px;
4784 border-radius: 4px;
4785 border: 1px solid #d9e8f8;
4785 border: 1px solid #d9e8f8;
4786 line-height: 1.5em;
4786 line-height: 1.5em;
4787 }
4787 }
4788
4788
4789 .pr-box {
4789 .pr-box {
4790 max-width: 978px;
4790 max-width: 978px;
4791 }
4791 }
4792
4792
4793 /****
4793 /****
4794 PERMS
4794 PERMS
4795 *****/
4795 *****/
4796 #perms .perms_section_head {
4796 #perms .perms_section_head {
4797 padding: 10px 10px 10px 0px;
4797 padding: 10px 10px 10px 0px;
4798 font-size: 16px;
4798 font-size: 16px;
4799 font-weight: bold;
4799 font-weight: bold;
4800 }
4800 }
4801
4801
4802 #perms .perm_tag {
4802 #perms .perm_tag {
4803 padding: 1px 3px 1px 3px;
4803 padding: 1px 3px 1px 3px;
4804 font-size: 10px;
4804 font-size: 10px;
4805 font-weight: bold;
4805 font-weight: bold;
4806 text-transform: uppercase;
4806 text-transform: uppercase;
4807 white-space: nowrap;
4807 white-space: nowrap;
4808 -webkit-border-radius: 3px;
4808 -webkit-border-radius: 3px;
4809 border-radius: 3px;
4809 border-radius: 3px;
4810 }
4810 }
4811
4811
4812 #perms .perm_tag.admin {
4812 #perms .perm_tag.admin {
4813 background-color: #B94A48;
4813 background-color: #B94A48;
4814 color: #ffffff;
4814 color: #ffffff;
4815 }
4815 }
4816
4816
4817 #perms .perm_tag.write {
4817 #perms .perm_tag.write {
4818 background-color: #DB7525;
4818 background-color: #DB7525;
4819 color: #ffffff;
4819 color: #ffffff;
4820 }
4820 }
4821
4821
4822 #perms .perm_tag.read {
4822 #perms .perm_tag.read {
4823 background-color: #468847;
4823 background-color: #468847;
4824 color: #ffffff;
4824 color: #ffffff;
4825 }
4825 }
4826
4826
4827 #perms .perm_tag.none {
4827 #perms .perm_tag.none {
4828 background-color: #bfbfbf;
4828 background-color: #bfbfbf;
4829 color: #ffffff;
4829 color: #ffffff;
4830 }
4830 }
4831
4831
4832 .perm-gravatar {
4832 .perm-gravatar {
4833 vertical-align: middle;
4833 vertical-align: middle;
4834 padding: 2px;
4834 padding: 2px;
4835 }
4835 }
4836 .perm-gravatar-ac {
4836 .perm-gravatar-ac {
4837 vertical-align: middle;
4837 vertical-align: middle;
4838 padding: 2px;
4838 padding: 2px;
4839 width: 14px;
4839 width: 14px;
4840 height: 14px;
4840 height: 14px;
4841 }
4841 }
4842
4842
4843 /*****************************************************************************
4843 /*****************************************************************************
4844 DIFFS CSS
4844 DIFFS CSS
4845 ******************************************************************************/
4845 ******************************************************************************/
4846 .diff-collapse {
4846 .diff-collapse {
4847 text-align: center;
4847 text-align: center;
4848 margin-bottom: -15px;
4848 margin-bottom: -15px;
4849 }
4849 }
4850 .diff-collapse-button {
4850 .diff-collapse-button {
4851 cursor: pointer;
4851 cursor: pointer;
4852 color: #666;
4852 color: #666;
4853 font-size: 16px;
4853 font-size: 16px;
4854 }
4854 }
4855 .diff-container {
4855 .diff-container {
4856
4856
4857 }
4857 }
4858
4858
4859 .diff-container.hidden {
4859 .diff-container.hidden {
4860 display: none;
4860 display: none;
4861 overflow: hidden;
4861 overflow: hidden;
4862 }
4862 }
4863
4863
4864
4864
4865 div.diffblock {
4865 div.diffblock {
4866 overflow: auto;
4866 overflow: auto;
4867 padding: 0px;
4867 padding: 0px;
4868 border: 1px solid #ccc;
4868 border: 1px solid #ccc;
4869 background: #f8f8f8;
4869 background: #f8f8f8;
4870 font-size: 100%;
4870 font-size: 100%;
4871 line-height: 100%;
4871 line-height: 100%;
4872 /* new */
4872 /* new */
4873 line-height: 125%;
4873 line-height: 125%;
4874 -webkit-border-radius: 6px 6px 0px 0px;
4874 -webkit-border-radius: 6px 6px 0px 0px;
4875 border-radius: 6px 6px 0px 0px;
4875 border-radius: 6px 6px 0px 0px;
4876 }
4876 }
4877 div.diffblock.margined {
4877 div.diffblock.margined {
4878 margin: 0px 20px 0px 20px;
4878 margin: 0px 20px 0px 20px;
4879 }
4879 }
4880 div.diffblock .code-header {
4880 div.diffblock .code-header {
4881 border-bottom: 1px solid #CCCCCC;
4881 border-bottom: 1px solid #CCCCCC;
4882 background: #EEEEEE;
4882 background: #EEEEEE;
4883 padding: 10px 0 10px 0;
4883 padding: 10px 0 10px 0;
4884 min-height: 14px;
4884 min-height: 14px;
4885 }
4885 }
4886
4886
4887 div.diffblock .code-header.banner {
4887 div.diffblock .code-header.banner {
4888 border-bottom: 1px solid #CCCCCC;
4888 border-bottom: 1px solid #CCCCCC;
4889 background: #EEEEEE;
4889 background: #EEEEEE;
4890 height: 14px;
4890 height: 14px;
4891 margin: 0px 95px 0px 95px;
4891 margin: 0px 95px 0px 95px;
4892 padding: 3px 3px 11px 3px;
4892 padding: 3px 3px 11px 3px;
4893 }
4893 }
4894
4894
4895 div.diffblock .code-header-title {
4895 div.diffblock .code-header-title {
4896 padding: 0px 0px 10px 5px !important;
4896 padding: 0px 0px 10px 5px !important;
4897 margin: 0 !important;
4897 margin: 0 !important;
4898 }
4898 }
4899 div.diffblock .code-header .hash {
4899 div.diffblock .code-header .hash {
4900 float: left;
4900 float: left;
4901 padding: 2px 0 0 2px;
4901 padding: 2px 0 0 2px;
4902 }
4902 }
4903 div.diffblock .code-header .date {
4903 div.diffblock .code-header .date {
4904 float: left;
4904 float: left;
4905 text-transform: uppercase;
4905 text-transform: uppercase;
4906 padding: 2px 0px 0px 2px;
4906 padding: 2px 0px 0px 2px;
4907 }
4907 }
4908 div.diffblock .code-header div {
4908 div.diffblock .code-header div {
4909 margin-left: 4px;
4909 margin-left: 4px;
4910 font-weight: bold;
4910 font-weight: bold;
4911 font-size: 14px;
4911 font-size: 14px;
4912 }
4912 }
4913
4913
4914 div.diffblock .parents {
4914 div.diffblock .parents {
4915 float: left;
4915 float: left;
4916 height: 26px;
4916 height: 26px;
4917 width: 100px;
4917 width: 100px;
4918 font-size: 10px;
4918 font-size: 10px;
4919 font-weight: 400;
4919 font-weight: 400;
4920 vertical-align: middle;
4920 vertical-align: middle;
4921 padding: 0px 2px 2px 2px;
4921 padding: 0px 2px 2px 2px;
4922 background-color: #eeeeee;
4922 background-color: #eeeeee;
4923 border-bottom: 1px solid #CCCCCC;
4923 border-bottom: 1px solid #CCCCCC;
4924 }
4924 }
4925
4925
4926 div.diffblock .children {
4926 div.diffblock .children {
4927 float: right;
4927 float: right;
4928 height: 26px;
4928 height: 26px;
4929 width: 100px;
4929 width: 100px;
4930 font-size: 10px;
4930 font-size: 10px;
4931 font-weight: 400;
4931 font-weight: 400;
4932 vertical-align: middle;
4932 vertical-align: middle;
4933 text-align: right;
4933 text-align: right;
4934 padding: 0px 2px 2px 2px;
4934 padding: 0px 2px 2px 2px;
4935 background-color: #eeeeee;
4935 background-color: #eeeeee;
4936 border-bottom: 1px solid #CCCCCC;
4936 border-bottom: 1px solid #CCCCCC;
4937 }
4937 }
4938
4938
4939 div.diffblock .code-body {
4939 div.diffblock .code-body {
4940 background: #FFFFFF;
4940 background: #FFFFFF;
4941 clear: both;
4941 clear: both;
4942 }
4942 }
4943 div.diffblock pre.raw {
4943 div.diffblock pre.raw {
4944 background: #FFFFFF;
4944 background: #FFFFFF;
4945 color: #000000;
4945 color: #000000;
4946 }
4946 }
4947 table.code-difftable {
4947 table.code-difftable {
4948 border-collapse: collapse;
4948 border-collapse: collapse;
4949 width: 99%;
4949 width: 99%;
4950 border-radius: 0px !important;
4950 border-radius: 0px !important;
4951 }
4951 }
4952 table.code-difftable td {
4952 table.code-difftable td {
4953 padding: 0 !important;
4953 padding: 0 !important;
4954 background: none !important;
4954 background: none !important;
4955 border: 0 !important;
4955 border: 0 !important;
4956 vertical-align: baseline !important
4956 vertical-align: baseline !important
4957 }
4957 }
4958 table.code-difftable .context {
4958 table.code-difftable .context {
4959 background: none repeat scroll 0 0 #DDE7EF;
4959 background: none repeat scroll 0 0 #DDE7EF;
4960 color: #999;
4960 color: #999;
4961 }
4961 }
4962 table.code-difftable .add {
4962 table.code-difftable .add {
4963 background: none repeat scroll 0 0 #DDFFDD;
4963 background: none repeat scroll 0 0 #DDFFDD;
4964 }
4964 }
4965 table.code-difftable .add ins {
4965 table.code-difftable .add ins {
4966 background: none repeat scroll 0 0 #AAFFAA;
4966 background: none repeat scroll 0 0 #AAFFAA;
4967 text-decoration: none;
4967 text-decoration: none;
4968 }
4968 }
4969 table.code-difftable .del {
4969 table.code-difftable .del {
4970 background: none repeat scroll 0 0 #FFDDDD;
4970 background: none repeat scroll 0 0 #FFDDDD;
4971 }
4971 }
4972 table.code-difftable .del del {
4972 table.code-difftable .del del {
4973 background: none repeat scroll 0 0 #FFAAAA;
4973 background: none repeat scroll 0 0 #FFAAAA;
4974 text-decoration: none;
4974 text-decoration: none;
4975 }
4975 }
4976
4976
4977 table.code-highlighttable div.code-highlight pre u:before,
4978 table.code-difftable td.code pre u:before {
4979 content: "\21a6";
4980 display: inline-block;
4981 width: 0;
4982 }
4983 table.code-highlighttable div.code-highlight pre u,
4984 table.code-difftable td.code pre u {
4985 color: rgba(0,0,0,0.15);
4986 }
4987 table.code-highlighttable div.code-highlight pre i,
4988 table.code-difftable td.code pre i {
4989 border-style: solid;
4990 border-left-width: 1px;
4991 color: rgba(0,0,0,0.15);
4992 }
4993
4977 /** LINE NUMBERS **/
4994 /** LINE NUMBERS **/
4978 table.code-difftable .lineno {
4995 table.code-difftable .lineno {
4979 padding-left: 2px;
4996 padding-left: 2px;
4980 padding-right: 2px !important;
4997 padding-right: 2px !important;
4981 text-align: right;
4998 text-align: right;
4982 width: 30px;
4999 width: 30px;
4983 -moz-user-select: none;
5000 -moz-user-select: none;
4984 -webkit-user-select: none;
5001 -webkit-user-select: none;
4985 border-right: 1px solid #CCC !important;
5002 border-right: 1px solid #CCC !important;
4986 border-left: 0px solid #CCC !important;
5003 border-left: 0px solid #CCC !important;
4987 border-top: 0px solid #CCC !important;
5004 border-top: 0px solid #CCC !important;
4988 border-bottom: none !important;
5005 border-bottom: none !important;
4989 vertical-align: middle !important;
5006 vertical-align: middle !important;
4990 }
5007 }
4991 table.code-difftable .lineno.new {
5008 table.code-difftable .lineno.new {
4992 }
5009 }
4993 table.code-difftable .lineno.old {
5010 table.code-difftable .lineno.old {
4994 }
5011 }
4995 table.code-difftable .lineno a {
5012 table.code-difftable .lineno a {
4996 color: #aaa !important;
5013 color: #aaa !important;
4997 font: 11px Consolas, Monaco, Inconsolata, Liberation Mono, monospace !important;
5014 font: 11px Consolas, Monaco, Inconsolata, Liberation Mono, monospace !important;
4998 letter-spacing: -1px;
5015 letter-spacing: -1px;
4999 text-align: right;
5016 text-align: right;
5000 padding-right: 2px;
5017 padding-right: 2px;
5001 cursor: pointer;
5018 cursor: pointer;
5002 display: block;
5019 display: block;
5003 width: 30px;
5020 width: 30px;
5004 }
5021 }
5005
5022
5006 table.code-difftable .lineno-inline {
5023 table.code-difftable .lineno-inline {
5007 background: none repeat scroll 0 0 #FFF !important;
5024 background: none repeat scroll 0 0 #FFF !important;
5008 padding-left: 2px;
5025 padding-left: 2px;
5009 padding-right: 2px;
5026 padding-right: 2px;
5010 text-align: right;
5027 text-align: right;
5011 width: 30px;
5028 width: 30px;
5012 -moz-user-select: none;
5029 -moz-user-select: none;
5013 -webkit-user-select: none;
5030 -webkit-user-select: none;
5014 }
5031 }
5015
5032
5016 /** CODE **/
5033 /** CODE **/
5017 table.code-difftable .code {
5034 table.code-difftable .code {
5018 display: block;
5035 display: block;
5019 width: 100%;
5036 width: 100%;
5020 }
5037 }
5021 table.code-difftable .code td {
5038 table.code-difftable .code td {
5022 margin: 0;
5039 margin: 0;
5023 padding: 0;
5040 padding: 0;
5024 }
5041 }
5025 table.code-difftable .code pre {
5042 table.code-difftable .code pre {
5026 margin: 0;
5043 margin: 0;
5027 padding: 0;
5044 padding: 0;
5028 height: 17px;
5045 height: 17px;
5029 line-height: 17px;
5046 line-height: 17px;
5030 }
5047 }
5031
5048
5032
5049
5033 .diffblock.margined.comm .line .code:hover {
5050 .diffblock.margined.comm .line .code:hover {
5034 background-color: #FFFFCC !important;
5051 background-color: #FFFFCC !important;
5035 cursor: pointer !important;
5052 cursor: pointer !important;
5036 background-image: url("../images/icons/comment_add.png") !important;
5053 background-image: url("../images/icons/comment_add.png") !important;
5037 background-repeat: no-repeat !important;
5054 background-repeat: no-repeat !important;
5038 background-position: right !important;
5055 background-position: right !important;
5039 background-position: 0% 50% !important;
5056 background-position: 0% 50% !important;
5040 }
5057 }
5041 .diffblock.margined.comm .line .code.no-comment:hover {
5058 .diffblock.margined.comm .line .code.no-comment:hover {
5042 background-image: none !important;
5059 background-image: none !important;
5043 cursor: auto !important;
5060 cursor: auto !important;
5044 background-color: inherit !important;
5061 background-color: inherit !important;
5045 }
5062 }
5046
5063
5047 div.comment:target>.comment-wrapp {
5064 div.comment:target>.comment-wrapp {
5048 border: solid 2px #ee0 !important;
5065 border: solid 2px #ee0 !important;
5049 }
5066 }
5050
5067
5051 .lineno:target a {
5068 .lineno:target a {
5052 border: solid 2px #ee0 !important;
5069 border: solid 2px #ee0 !important;
5053 margin: -2px;
5070 margin: -2px;
5054 }
5071 }
5055
5072
5056 #help_kb {
5073 #help_kb {
5057 display: none;
5074 display: none;
5058 }
5075 }
5059
5076
5060 .repo-switcher-dropdown .select2-result-label span.repo-icons {
5077 .repo-switcher-dropdown .select2-result-label span.repo-icons {
5061 margin-left: -12px;
5078 margin-left: -12px;
5062 }
5079 }
General Comments 0
You need to be logged in to leave comments. Login now