##// END OF EJS Templates
comments: avoid storing 'No comments' text when changing status...
Thomas De Schampheleire -
r5068:140f2811 default
parent child Browse files
Show More
@@ -1,476 +1,476 b''
1 1 # -*- coding: utf-8 -*-
2 2 # This program is free software: you can redistribute it and/or modify
3 3 # it under the terms of the GNU General Public License as published by
4 4 # the Free Software Foundation, either version 3 of the License, or
5 5 # (at your option) any later version.
6 6 #
7 7 # This program is distributed in the hope that it will be useful,
8 8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 10 # GNU General Public License for more details.
11 11 #
12 12 # You should have received a copy of the GNU General Public License
13 13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 14 """
15 15 kallithea.controllers.changeset
16 16 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
17 17
18 18 changeset controller for pylons showing changes between
19 19 revisions
20 20
21 21 This file was forked by the Kallithea project in July 2014.
22 22 Original author and date, and relevant copyright and licensing information is below:
23 23 :created_on: Apr 25, 2010
24 24 :author: marcink
25 25 :copyright: (c) 2013 RhodeCode GmbH, and others.
26 26 :license: GPLv3, see LICENSE.md for more details.
27 27 """
28 28
29 29 import logging
30 30 import traceback
31 31 from collections import defaultdict
32 32 from webob.exc import HTTPForbidden, HTTPBadRequest, HTTPNotFound
33 33
34 34 from pylons import tmpl_context as c, request, response
35 35 from pylons.i18n.translation import _
36 36 from pylons.controllers.util import redirect
37 37 from kallithea.lib.utils import jsonify
38 38
39 39 from kallithea.lib.vcs.exceptions import RepositoryError, \
40 40 ChangesetDoesNotExistError
41 41
42 42 from kallithea.lib.compat import json
43 43 import kallithea.lib.helpers as h
44 44 from kallithea.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator,\
45 45 NotAnonymous
46 46 from kallithea.lib.base import BaseRepoController, render
47 47 from kallithea.lib.utils import action_logger
48 48 from kallithea.lib.compat import OrderedDict
49 49 from kallithea.lib import diffs
50 50 from kallithea.model.db import ChangesetComment, ChangesetStatus
51 51 from kallithea.model.comment import ChangesetCommentsModel
52 52 from kallithea.model.changeset_status import ChangesetStatusModel
53 53 from kallithea.model.meta import Session
54 54 from kallithea.model.repo import RepoModel
55 55 from kallithea.lib.diffs import LimitedDiffContainer
56 56 from kallithea.lib.exceptions import StatusChangeOnClosedPullRequestError
57 57 from kallithea.lib.vcs.backends.base import EmptyChangeset
58 58 from kallithea.lib.utils2 import safe_unicode
59 59 from kallithea.lib.graphmod import graph_data
60 60
61 61 log = logging.getLogger(__name__)
62 62
63 63
64 64 def _update_with_GET(params, GET):
65 65 for k in ['diff1', 'diff2', 'diff']:
66 66 params[k] += GET.getall(k)
67 67
68 68
69 69 def anchor_url(revision, path, GET):
70 70 fid = h.FID(revision, path)
71 71 return h.url.current(anchor=fid, **dict(GET))
72 72
73 73
74 74 def get_ignore_ws(fid, GET):
75 75 ig_ws_global = GET.get('ignorews')
76 76 ig_ws = filter(lambda k: k.startswith('WS'), GET.getall(fid))
77 77 if ig_ws:
78 78 try:
79 79 return int(ig_ws[0].split(':')[-1])
80 80 except ValueError:
81 81 raise HTTPBadRequest()
82 82 return ig_ws_global
83 83
84 84
85 85 def _ignorews_url(GET, fileid=None):
86 86 fileid = str(fileid) if fileid else None
87 87 params = defaultdict(list)
88 88 _update_with_GET(params, GET)
89 89 lbl = _('Show whitespace')
90 90 ig_ws = get_ignore_ws(fileid, GET)
91 91 ln_ctx = get_line_ctx(fileid, GET)
92 92 # global option
93 93 if fileid is None:
94 94 if ig_ws is None:
95 95 params['ignorews'] += [1]
96 96 lbl = _('Ignore whitespace')
97 97 ctx_key = 'context'
98 98 ctx_val = ln_ctx
99 99 # per file options
100 100 else:
101 101 if ig_ws is None:
102 102 params[fileid] += ['WS:1']
103 103 lbl = _('Ignore whitespace')
104 104
105 105 ctx_key = fileid
106 106 ctx_val = 'C:%s' % ln_ctx
107 107 # if we have passed in ln_ctx pass it along to our params
108 108 if ln_ctx:
109 109 params[ctx_key] += [ctx_val]
110 110
111 111 params['anchor'] = fileid
112 112 icon = h.literal('<i class="icon-strike"></i>')
113 113 return h.link_to(icon, h.url.current(**params), title=lbl, class_='tooltip')
114 114
115 115
116 116 def get_line_ctx(fid, GET):
117 117 ln_ctx_global = GET.get('context')
118 118 if fid:
119 119 ln_ctx = filter(lambda k: k.startswith('C'), GET.getall(fid))
120 120 else:
121 121 _ln_ctx = filter(lambda k: k.startswith('C'), GET)
122 122 ln_ctx = GET.get(_ln_ctx[0]) if _ln_ctx else ln_ctx_global
123 123 if ln_ctx:
124 124 ln_ctx = [ln_ctx]
125 125
126 126 if ln_ctx:
127 127 retval = ln_ctx[0].split(':')[-1]
128 128 else:
129 129 retval = ln_ctx_global
130 130
131 131 try:
132 132 return int(retval)
133 133 except Exception:
134 134 return 3
135 135
136 136
137 137 def _context_url(GET, fileid=None):
138 138 """
139 139 Generates url for context lines
140 140
141 141 :param fileid:
142 142 """
143 143
144 144 fileid = str(fileid) if fileid else None
145 145 ig_ws = get_ignore_ws(fileid, GET)
146 146 ln_ctx = (get_line_ctx(fileid, GET) or 3) * 2
147 147
148 148 params = defaultdict(list)
149 149 _update_with_GET(params, GET)
150 150
151 151 # global option
152 152 if fileid is None:
153 153 if ln_ctx > 0:
154 154 params['context'] += [ln_ctx]
155 155
156 156 if ig_ws:
157 157 ig_ws_key = 'ignorews'
158 158 ig_ws_val = 1
159 159
160 160 # per file option
161 161 else:
162 162 params[fileid] += ['C:%s' % ln_ctx]
163 163 ig_ws_key = fileid
164 164 ig_ws_val = 'WS:%s' % 1
165 165
166 166 if ig_ws:
167 167 params[ig_ws_key] += [ig_ws_val]
168 168
169 169 lbl = _('increase diff context to %(num)s lines') % {'num': ln_ctx}
170 170
171 171 params['anchor'] = fileid
172 172 icon = h.literal('<i class="icon-sort"></i>')
173 173 return h.link_to(icon, h.url.current(**params), title=lbl, class_='tooltip')
174 174
175 175
176 176 class ChangesetController(BaseRepoController):
177 177
178 178 def __before__(self):
179 179 super(ChangesetController, self).__before__()
180 180 c.affected_files_cut_off = 60
181 181
182 182 def __load_data(self):
183 183 repo_model = RepoModel()
184 184 c.users_array = repo_model.get_users_js()
185 185 c.user_groups_array = repo_model.get_user_groups_js()
186 186
187 187 def _index(self, revision, method):
188 188 c.anchor_url = anchor_url
189 189 c.ignorews_url = _ignorews_url
190 190 c.context_url = _context_url
191 191 c.fulldiff = fulldiff = request.GET.get('fulldiff')
192 192 #get ranges of revisions if preset
193 193 rev_range = revision.split('...')[:2]
194 194 enable_comments = True
195 195 c.cs_repo = c.db_repo
196 196 try:
197 197 if len(rev_range) == 2:
198 198 enable_comments = False
199 199 rev_start = rev_range[0]
200 200 rev_end = rev_range[1]
201 201 rev_ranges = c.db_repo_scm_instance.get_changesets(start=rev_start,
202 202 end=rev_end)
203 203 else:
204 204 rev_ranges = [c.db_repo_scm_instance.get_changeset(revision)]
205 205
206 206 c.cs_ranges = list(rev_ranges)
207 207 if not c.cs_ranges:
208 208 raise RepositoryError('Changeset range returned empty result')
209 209
210 210 except(ChangesetDoesNotExistError,), e:
211 211 log.error(traceback.format_exc())
212 212 msg = _('Such revision does not exist for this repository')
213 213 h.flash(msg, category='error')
214 214 raise HTTPNotFound()
215 215
216 216 c.changes = OrderedDict()
217 217
218 218 c.lines_added = 0 # count of lines added
219 219 c.lines_deleted = 0 # count of lines removes
220 220
221 221 c.changeset_statuses = ChangesetStatus.STATUSES
222 222 comments = dict()
223 223 c.statuses = []
224 224 c.inline_comments = []
225 225 c.inline_cnt = 0
226 226
227 227 # Iterate over ranges (default changeset view is always one changeset)
228 228 for changeset in c.cs_ranges:
229 229 inlines = []
230 230 if method == 'show':
231 231 c.statuses.extend([ChangesetStatusModel().get_status(
232 232 c.db_repo.repo_id, changeset.raw_id)])
233 233
234 234 # Changeset comments
235 235 comments.update((com.comment_id, com)
236 236 for com in ChangesetCommentsModel()
237 237 .get_comments(c.db_repo.repo_id,
238 238 revision=changeset.raw_id))
239 239
240 240 # Status change comments - mostly from pull requests
241 241 comments.update((st.changeset_comment_id, st.comment)
242 242 for st in ChangesetStatusModel()
243 243 .get_statuses(c.db_repo.repo_id,
244 244 changeset.raw_id, with_revisions=True))
245 245
246 246 inlines = ChangesetCommentsModel()\
247 247 .get_inline_comments(c.db_repo.repo_id,
248 248 revision=changeset.raw_id)
249 249 c.inline_comments.extend(inlines)
250 250
251 251 c.changes[changeset.raw_id] = []
252 252
253 253 cs2 = changeset.raw_id
254 254 cs1 = changeset.parents[0].raw_id if changeset.parents else EmptyChangeset().raw_id
255 255 context_lcl = get_line_ctx('', request.GET)
256 256 ign_whitespace_lcl = ign_whitespace_lcl = get_ignore_ws('', request.GET)
257 257
258 258 _diff = c.db_repo_scm_instance.get_diff(cs1, cs2,
259 259 ignore_whitespace=ign_whitespace_lcl, context=context_lcl)
260 260 diff_limit = self.cut_off_limit if not fulldiff else None
261 261 diff_processor = diffs.DiffProcessor(_diff,
262 262 vcs=c.db_repo_scm_instance.alias,
263 263 format='gitdiff',
264 264 diff_limit=diff_limit)
265 265 cs_changes = OrderedDict()
266 266 if method == 'show':
267 267 _parsed = diff_processor.prepare()
268 268 c.limited_diff = False
269 269 if isinstance(_parsed, LimitedDiffContainer):
270 270 c.limited_diff = True
271 271 for f in _parsed:
272 272 st = f['stats']
273 273 c.lines_added += st['added']
274 274 c.lines_deleted += st['deleted']
275 275 fid = h.FID(changeset.raw_id, f['filename'])
276 276 diff = diff_processor.as_html(enable_comments=enable_comments,
277 277 parsed_lines=[f])
278 278 cs_changes[fid] = [cs1, cs2, f['operation'], f['filename'],
279 279 diff, st]
280 280 else:
281 281 # downloads/raw we only need RAW diff nothing else
282 282 diff = diff_processor.as_raw()
283 283 cs_changes[''] = [None, None, None, None, diff, None]
284 284 c.changes[changeset.raw_id] = cs_changes
285 285
286 286 #sort comments in creation order
287 287 c.comments = [com for com_id, com in sorted(comments.items())]
288 288
289 289 # count inline comments
290 290 for __, lines in c.inline_comments:
291 291 for comments in lines.values():
292 292 c.inline_cnt += len(comments)
293 293
294 294 if len(c.cs_ranges) == 1:
295 295 c.changeset = c.cs_ranges[0]
296 296 c.parent_tmpl = ''.join(['# Parent %s\n' % x.raw_id
297 297 for x in c.changeset.parents])
298 298 if method == 'download':
299 299 response.content_type = 'text/plain'
300 300 response.content_disposition = 'attachment; filename=%s.diff' \
301 301 % revision[:12]
302 302 return diff
303 303 elif method == 'patch':
304 304 response.content_type = 'text/plain'
305 305 c.diff = safe_unicode(diff)
306 306 return render('changeset/patch_changeset.html')
307 307 elif method == 'raw':
308 308 response.content_type = 'text/plain'
309 309 return diff
310 310 elif method == 'show':
311 311 self.__load_data()
312 312 if len(c.cs_ranges) == 1:
313 313 return render('changeset/changeset.html')
314 314 else:
315 315 c.cs_ranges_org = None
316 316 c.cs_comments = {}
317 317 revs = [ctx.revision for ctx in reversed(c.cs_ranges)]
318 318 c.jsdata = json.dumps(graph_data(c.db_repo_scm_instance, revs))
319 319 return render('changeset/changeset_range.html')
320 320
321 321 @LoginRequired()
322 322 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
323 323 'repository.admin')
324 324 def index(self, revision, method='show'):
325 325 return self._index(revision, method=method)
326 326
327 327 @LoginRequired()
328 328 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
329 329 'repository.admin')
330 330 def changeset_raw(self, revision):
331 331 return self._index(revision, method='raw')
332 332
333 333 @LoginRequired()
334 334 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
335 335 'repository.admin')
336 336 def changeset_patch(self, revision):
337 337 return self._index(revision, method='patch')
338 338
339 339 @LoginRequired()
340 340 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
341 341 'repository.admin')
342 342 def changeset_download(self, revision):
343 343 return self._index(revision, method='download')
344 344
345 345 @LoginRequired()
346 346 @NotAnonymous()
347 347 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
348 348 'repository.admin')
349 349 @jsonify
350 350 def comment(self, repo_name, revision):
351 351 status = request.POST.get('changeset_status')
352 text = request.POST.get('text', '').strip() or _('No comments.')
352 text = request.POST.get('text', '').strip()
353 353
354 354 c.co = comm = ChangesetCommentsModel().create(
355 355 text=text,
356 356 repo=c.db_repo.repo_id,
357 357 user=c.authuser.user_id,
358 358 revision=revision,
359 359 f_path=request.POST.get('f_path'),
360 360 line_no=request.POST.get('line'),
361 361 status_change=(ChangesetStatus.get_status_lbl(status)
362 362 if status else None)
363 363 )
364 364
365 365 # get status if set !
366 366 if status:
367 367 # if latest status was from pull request and it's closed
368 368 # disallow changing status !
369 369 # dont_allow_on_closed_pull_request = True !
370 370
371 371 try:
372 372 ChangesetStatusModel().set_status(
373 373 c.db_repo.repo_id,
374 374 status,
375 375 c.authuser.user_id,
376 376 comm,
377 377 revision=revision,
378 378 dont_allow_on_closed_pull_request=True
379 379 )
380 380 except StatusChangeOnClosedPullRequestError:
381 381 log.error(traceback.format_exc())
382 382 msg = _('Changing status on a changeset associated with '
383 383 'a closed pull request is not allowed')
384 384 h.flash(msg, category='warning')
385 385 return redirect(h.url('changeset_home', repo_name=repo_name,
386 386 revision=revision))
387 387 action_logger(self.authuser,
388 388 'user_commented_revision:%s' % revision,
389 389 c.db_repo, self.ip_addr, self.sa)
390 390
391 391 Session().commit()
392 392
393 393 if not request.environ.get('HTTP_X_PARTIAL_XHR'):
394 394 return redirect(h.url('changeset_home', repo_name=repo_name,
395 395 revision=revision))
396 396 #only ajax below
397 397 data = {
398 398 'target_id': h.safeid(h.safe_unicode(request.POST.get('f_path'))),
399 399 }
400 400 if comm:
401 401 data.update(comm.get_dict())
402 402 data.update({'rendered_text':
403 403 render('changeset/changeset_comment_block.html')})
404 404
405 405 return data
406 406
407 407 @LoginRequired()
408 408 @NotAnonymous()
409 409 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
410 410 'repository.admin')
411 411 def preview_comment(self):
412 412 if not request.environ.get('HTTP_X_PARTIAL_XHR'):
413 413 raise HTTPBadRequest()
414 414 text = request.POST.get('text')
415 415 if text:
416 416 return h.rst_w_mentions(text)
417 417 return ''
418 418
419 419 @LoginRequired()
420 420 @NotAnonymous()
421 421 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
422 422 'repository.admin')
423 423 @jsonify
424 424 def delete_comment(self, repo_name, comment_id):
425 425 co = ChangesetComment.get(comment_id)
426 426 if not co:
427 427 raise HTTPBadRequest()
428 428 owner = co.author.user_id == c.authuser.user_id
429 429 repo_admin = h.HasRepoPermissionAny('repository.admin')
430 430 if h.HasPermissionAny('hg.admin')() or repo_admin or owner:
431 431 ChangesetCommentsModel().delete(comment=co)
432 432 Session().commit()
433 433 return True
434 434 else:
435 435 raise HTTPForbidden()
436 436
437 437 @LoginRequired()
438 438 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
439 439 'repository.admin')
440 440 @jsonify
441 441 def changeset_info(self, repo_name, revision):
442 442 if request.is_xhr:
443 443 try:
444 444 return c.db_repo_scm_instance.get_changeset(revision)
445 445 except ChangesetDoesNotExistError, e:
446 446 return EmptyChangeset(message=str(e))
447 447 else:
448 448 raise HTTPBadRequest()
449 449
450 450 @LoginRequired()
451 451 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
452 452 'repository.admin')
453 453 @jsonify
454 454 def changeset_children(self, repo_name, revision):
455 455 if request.is_xhr:
456 456 changeset = c.db_repo_scm_instance.get_changeset(revision)
457 457 result = {"results": []}
458 458 if changeset.children:
459 459 result = {"results": changeset.children}
460 460 return result
461 461 else:
462 462 raise HTTPBadRequest()
463 463
464 464 @LoginRequired()
465 465 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
466 466 'repository.admin')
467 467 @jsonify
468 468 def changeset_parents(self, repo_name, revision):
469 469 if request.is_xhr:
470 470 changeset = c.db_repo_scm_instance.get_changeset(revision)
471 471 result = {"results": []}
472 472 if changeset.parents:
473 473 result = {"results": changeset.parents}
474 474 return result
475 475 else:
476 476 raise HTTPBadRequest()
@@ -1,770 +1,770 b''
1 1 # -*- coding: utf-8 -*-
2 2 # This program is free software: you can redistribute it and/or modify
3 3 # it under the terms of the GNU General Public License as published by
4 4 # the Free Software Foundation, either version 3 of the License, or
5 5 # (at your option) any later version.
6 6 #
7 7 # This program is distributed in the hope that it will be useful,
8 8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 10 # GNU General Public License for more details.
11 11 #
12 12 # You should have received a copy of the GNU General Public License
13 13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 14 """
15 15 kallithea.controllers.pullrequests
16 16 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
17 17
18 18 pull requests controller for Kallithea for initializing pull requests
19 19
20 20 This file was forked by the Kallithea project in July 2014.
21 21 Original author and date, and relevant copyright and licensing information is below:
22 22 :created_on: May 7, 2012
23 23 :author: marcink
24 24 :copyright: (c) 2013 RhodeCode GmbH, and others.
25 25 :license: GPLv3, see LICENSE.md for more details.
26 26 """
27 27
28 28 import logging
29 29 import traceback
30 30 import formencode
31 31 import re
32 32
33 33 from webob.exc import HTTPNotFound, HTTPForbidden, HTTPBadRequest
34 34
35 35 from pylons import request, tmpl_context as c, url
36 36 from pylons.controllers.util import redirect
37 37 from pylons.i18n.translation import _
38 38
39 39 from kallithea.lib.vcs.utils.hgcompat import unionrepo
40 40 from kallithea.lib.compat import json
41 41 from kallithea.lib.base import BaseRepoController, render
42 42 from kallithea.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator,\
43 43 NotAnonymous
44 44 from kallithea.lib.helpers import Page
45 45 from kallithea.lib import helpers as h
46 46 from kallithea.lib import diffs
47 47 from kallithea.lib.utils import action_logger, jsonify
48 48 from kallithea.lib.vcs.utils import safe_str
49 49 from kallithea.lib.vcs.exceptions import EmptyRepositoryError
50 50 from kallithea.lib.diffs import LimitedDiffContainer
51 51 from kallithea.model.db import PullRequest, ChangesetStatus, ChangesetComment,\
52 52 PullRequestReviewers
53 53 from kallithea.model.pull_request import PullRequestModel
54 54 from kallithea.model.meta import Session
55 55 from kallithea.model.repo import RepoModel
56 56 from kallithea.model.comment import ChangesetCommentsModel
57 57 from kallithea.model.changeset_status import ChangesetStatusModel
58 58 from kallithea.model.forms import PullRequestForm, PullRequestPostForm
59 59 from kallithea.lib.utils2 import safe_int
60 60 from kallithea.controllers.changeset import _ignorews_url,\
61 61 _context_url, get_line_ctx, get_ignore_ws
62 62 from kallithea.controllers.compare import CompareController
63 63 from kallithea.lib.graphmod import graph_data
64 64
65 65 log = logging.getLogger(__name__)
66 66
67 67
68 68 class PullrequestsController(BaseRepoController):
69 69
70 70 def __before__(self):
71 71 super(PullrequestsController, self).__before__()
72 72 repo_model = RepoModel()
73 73 c.users_array = repo_model.get_users_js()
74 74 c.user_groups_array = repo_model.get_user_groups_js()
75 75
76 76 def _get_repo_refs(self, repo, rev=None, branch=None, branch_rev=None):
77 77 """return a structure with repo's interesting changesets, suitable for
78 78 the selectors in pullrequest.html
79 79
80 80 rev: a revision that must be in the list somehow and selected by default
81 81 branch: a branch that must be in the list and selected by default - even if closed
82 82 branch_rev: a revision of which peers should be preferred and available."""
83 83 # list named branches that has been merged to this named branch - it should probably merge back
84 84 peers = []
85 85
86 86 if rev:
87 87 rev = safe_str(rev)
88 88
89 89 if branch:
90 90 branch = safe_str(branch)
91 91
92 92 if branch_rev:
93 93 branch_rev = safe_str(branch_rev)
94 94 # a revset not restricting to merge() would be better
95 95 # (especially because it would get the branch point)
96 96 # ... but is currently too expensive
97 97 # including branches of children could be nice too
98 98 peerbranches = set()
99 99 for i in repo._repo.revs(
100 100 "sort(parents(branch(id(%s)) and merge()) - branch(id(%s)), -rev)",
101 101 branch_rev, branch_rev):
102 102 abranch = repo.get_changeset(i).branch
103 103 if abranch not in peerbranches:
104 104 n = 'branch:%s:%s' % (abranch, repo.get_changeset(abranch).raw_id)
105 105 peers.append((n, abranch))
106 106 peerbranches.add(abranch)
107 107
108 108 selected = None
109 109 tiprev = repo.tags.get('tip')
110 110 tipbranch = None
111 111
112 112 branches = []
113 113 for abranch, branchrev in repo.branches.iteritems():
114 114 n = 'branch:%s:%s' % (abranch, branchrev)
115 115 desc = abranch
116 116 if branchrev == tiprev:
117 117 tipbranch = abranch
118 118 desc = '%s (current tip)' % desc
119 119 branches.append((n, desc))
120 120 if rev == branchrev:
121 121 selected = n
122 122 if branch == abranch:
123 123 if not rev:
124 124 selected = n
125 125 branch = None
126 126 if branch: # branch not in list - it is probably closed
127 127 branchrev = repo.closed_branches.get(branch)
128 128 if branchrev:
129 129 n = 'branch:%s:%s' % (branch, branchrev)
130 130 branches.append((n, _('%s (closed)') % branch))
131 131 selected = n
132 132 branch = None
133 133 if branch:
134 134 log.debug('branch %r not found in %s', branch, repo)
135 135
136 136 bookmarks = []
137 137 for bookmark, bookmarkrev in repo.bookmarks.iteritems():
138 138 n = 'book:%s:%s' % (bookmark, bookmarkrev)
139 139 bookmarks.append((n, bookmark))
140 140 if rev == bookmarkrev:
141 141 selected = n
142 142
143 143 tags = []
144 144 for tag, tagrev in repo.tags.iteritems():
145 145 if tag == 'tip':
146 146 continue
147 147 n = 'tag:%s:%s' % (tag, tagrev)
148 148 tags.append((n, tag))
149 149 if rev == tagrev:
150 150 selected = n
151 151
152 152 # prio 1: rev was selected as existing entry above
153 153
154 154 # prio 2: create special entry for rev; rev _must_ be used
155 155 specials = []
156 156 if rev and selected is None:
157 157 selected = 'rev:%s:%s' % (rev, rev)
158 158 specials = [(selected, '%s: %s' % (_("Changeset"), rev[:12]))]
159 159
160 160 # prio 3: most recent peer branch
161 161 if peers and not selected:
162 162 selected = peers[0][0]
163 163
164 164 # prio 4: tip revision
165 165 if not selected:
166 166 if h.is_hg(repo):
167 167 if tipbranch:
168 168 selected = 'branch:%s:%s' % (tipbranch, tiprev)
169 169 else:
170 170 selected = 'tag:null:' + repo.EMPTY_CHANGESET
171 171 tags.append((selected, 'null'))
172 172 else:
173 173 if 'master' in repo.branches:
174 174 selected = 'branch:master:%s' % repo.branches['master']
175 175 else:
176 176 k, v = repo.branches.items()[0]
177 177 selected = 'branch:%s:%s' % (k, v)
178 178
179 179 groups = [(specials, _("Special")),
180 180 (peers, _("Peer branches")),
181 181 (bookmarks, _("Bookmarks")),
182 182 (branches, _("Branches")),
183 183 (tags, _("Tags")),
184 184 ]
185 185 return [g for g in groups if g[0]], selected
186 186
187 187 def _get_is_allowed_change_status(self, pull_request):
188 188 if pull_request.is_closed():
189 189 return False
190 190
191 191 owner = self.authuser.user_id == pull_request.user_id
192 192 reviewer = self.authuser.user_id in [x.user_id for x in
193 193 pull_request.reviewers]
194 194 return self.authuser.admin or owner or reviewer
195 195
196 196 @LoginRequired()
197 197 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
198 198 'repository.admin')
199 199 def show_all(self, repo_name):
200 200 c.from_ = request.GET.get('from_') or ''
201 201 c.closed = request.GET.get('closed') or ''
202 202 c.pull_requests = PullRequestModel().get_all(repo_name, from_=c.from_, closed=c.closed)
203 203 c.repo_name = repo_name
204 204 p = safe_int(request.GET.get('page', 1), 1)
205 205
206 206 c.pullrequests_pager = Page(c.pull_requests, page=p, items_per_page=10)
207 207
208 208 if request.environ.get('HTTP_X_PARTIAL_XHR'):
209 209 return render('/pullrequests/pullrequest_data.html')
210 210
211 211 return render('/pullrequests/pullrequest_show_all.html')
212 212
213 213 @LoginRequired()
214 214 @NotAnonymous()
215 215 def show_my(self):
216 216 c.closed = request.GET.get('closed') or ''
217 217
218 218 def _filter(pr):
219 219 s = sorted(pr, key=lambda o: o.created_on, reverse=True)
220 220 if not c.closed:
221 221 s = filter(lambda p: p.status != PullRequest.STATUS_CLOSED, s)
222 222 return s
223 223
224 224 c.my_pull_requests = _filter(PullRequest.query()\
225 225 .filter(PullRequest.user_id ==
226 226 self.authuser.user_id)\
227 227 .all())
228 228
229 229 c.participate_in_pull_requests = _filter(PullRequest.query()\
230 230 .join(PullRequestReviewers)\
231 231 .filter(PullRequestReviewers.user_id ==
232 232 self.authuser.user_id)\
233 233 )
234 234
235 235 return render('/pullrequests/pullrequest_show_my.html')
236 236
237 237 @LoginRequired()
238 238 @NotAnonymous()
239 239 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
240 240 'repository.admin')
241 241 def index(self):
242 242 org_repo = c.db_repo
243 243 org_scm_instance = org_repo.scm_instance
244 244 try:
245 245 org_scm_instance.get_changeset()
246 246 except EmptyRepositoryError, e:
247 247 h.flash(h.literal(_('There are no changesets yet')),
248 248 category='warning')
249 249 redirect(url('summary_home', repo_name=org_repo.repo_name))
250 250
251 251 org_rev = request.GET.get('rev_end')
252 252 # rev_start is not directly useful - its parent could however be used
253 253 # as default for other and thus give a simple compare view
254 254 #other_rev = request.POST.get('rev_start')
255 255 branch = request.GET.get('branch')
256 256
257 257 c.cs_repos = [(org_repo.repo_name, org_repo.repo_name)]
258 258 c.default_cs_repo = org_repo.repo_name
259 259 c.cs_refs, c.default_cs_ref = self._get_repo_refs(org_scm_instance, rev=org_rev, branch=branch)
260 260
261 261 default_cs_ref_type, default_cs_branch, default_cs_rev = c.default_cs_ref.split(':')
262 262 if default_cs_ref_type != 'branch':
263 263 default_cs_branch = org_repo.get_changeset(default_cs_rev).branch
264 264
265 265 # add org repo to other so we can open pull request against peer branches on itself
266 266 c.a_repos = [(org_repo.repo_name, '%s (self)' % org_repo.repo_name)]
267 267
268 268 if org_repo.parent:
269 269 # add parent of this fork also and select it.
270 270 # use the same branch on destination as on source, if available.
271 271 c.a_repos.append((org_repo.parent.repo_name, '%s (parent)' % org_repo.parent.repo_name))
272 272 c.a_repo = org_repo.parent
273 273 c.a_refs, c.default_a_ref = self._get_repo_refs(
274 274 org_repo.parent.scm_instance, branch=default_cs_branch)
275 275
276 276 else:
277 277 c.a_repo = org_repo
278 278 c.a_refs, c.default_a_ref = self._get_repo_refs(org_scm_instance) # without rev and branch
279 279
280 280 # gather forks and add to this list ... even though it is rare to
281 281 # request forks to pull from their parent
282 282 for fork in org_repo.forks:
283 283 c.a_repos.append((fork.repo_name, fork.repo_name))
284 284
285 285 return render('/pullrequests/pullrequest.html')
286 286
287 287 @LoginRequired()
288 288 @NotAnonymous()
289 289 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
290 290 'repository.admin')
291 291 @jsonify
292 292 def repo_info(self, repo_name):
293 293 repo = RepoModel()._get_repo(repo_name)
294 294 refs, selected_ref = self._get_repo_refs(repo.scm_instance)
295 295 return {
296 296 'description': repo.description.split('\n', 1)[0],
297 297 'selected_ref': selected_ref,
298 298 'refs': refs,
299 299 }
300 300
301 301 @LoginRequired()
302 302 @NotAnonymous()
303 303 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
304 304 'repository.admin')
305 305 def create(self, repo_name):
306 306 repo = RepoModel()._get_repo(repo_name)
307 307 try:
308 308 _form = PullRequestForm(repo.repo_id)().to_python(request.POST)
309 309 except formencode.Invalid, errors:
310 310 log.error(traceback.format_exc())
311 311 log.error(str(errors))
312 312 msg = _('Error creating pull request: %s') % errors.msg
313 313 h.flash(msg, 'error')
314 314 raise HTTPBadRequest
315 315
316 316 # heads up: org and other might seem backward here ...
317 317 org_repo_name = _form['org_repo']
318 318 org_ref = _form['org_ref'] # will have merge_rev as rev but symbolic name
319 319 org_repo = RepoModel()._get_repo(org_repo_name)
320 320 (org_ref_type,
321 321 org_ref_name,
322 322 org_rev) = org_ref.split(':')
323 323 if org_ref_type == 'rev':
324 324 org_ref_type = 'branch'
325 325 cs = org_repo.scm_instance.get_changeset(org_rev)
326 326 org_ref = '%s:%s:%s' % (org_ref_type, cs.branch, cs.raw_id)
327 327
328 328 other_repo_name = _form['other_repo']
329 329 other_ref = _form['other_ref'] # will have symbolic name and head revision
330 330 other_repo = RepoModel()._get_repo(other_repo_name)
331 331 (other_ref_type,
332 332 other_ref_name,
333 333 other_rev) = other_ref.split(':')
334 334
335 335 cs_ranges, _cs_ranges_not, ancestor_rev = \
336 336 CompareController._get_changesets(org_repo.scm_instance.alias,
337 337 other_repo.scm_instance, other_rev, # org and other "swapped"
338 338 org_repo.scm_instance, org_rev,
339 339 )
340 340 revisions = [cs.raw_id for cs in cs_ranges]
341 341
342 342 # hack: ancestor_rev is not an other_rev but we want to show the
343 343 # requested destination and have the exact ancestor
344 344 other_ref = '%s:%s:%s' % (other_ref_type, other_ref_name, ancestor_rev)
345 345
346 346 reviewers = _form['review_members']
347 347
348 348 title = _form['pullrequest_title']
349 349 if not title:
350 350 if org_repo_name == other_repo_name:
351 351 title = '%s to %s' % (h.short_ref(org_ref_type, org_ref_name),
352 352 h.short_ref(other_ref_type, other_ref_name))
353 353 else:
354 354 title = '%s#%s to %s#%s' % (org_repo_name, h.short_ref(org_ref_type, org_ref_name),
355 355 other_repo_name, h.short_ref(other_ref_type, other_ref_name))
356 356 description = _form['pullrequest_desc'].strip() or _('No description')
357 357 try:
358 358 pull_request = PullRequestModel().create(
359 359 self.authuser.user_id, org_repo_name, org_ref, other_repo_name,
360 360 other_ref, revisions, reviewers, title, description
361 361 )
362 362 Session().commit()
363 363 h.flash(_('Successfully opened new pull request'),
364 364 category='success')
365 365 except Exception:
366 366 h.flash(_('Error occurred while creating pull request'),
367 367 category='error')
368 368 log.error(traceback.format_exc())
369 369 return redirect(url('pullrequest_home', repo_name=repo_name))
370 370
371 371 return redirect(pull_request.url())
372 372
373 373 def create_update(self, old_pull_request, updaterev, title, description, reviewers_ids):
374 374 org_repo = RepoModel()._get_repo(old_pull_request.org_repo.repo_name)
375 375 org_ref_type, org_ref_name, org_rev = old_pull_request.org_ref.split(':')
376 376 new_org_rev = self._get_ref_rev(org_repo, 'rev', updaterev)
377 377
378 378 other_repo = RepoModel()._get_repo(old_pull_request.other_repo.repo_name)
379 379 other_ref_type, other_ref_name, other_rev = old_pull_request.other_ref.split(':') # other_rev is ancestor
380 380 #assert other_ref_type == 'branch', other_ref_type # TODO: what if not?
381 381 new_other_rev = self._get_ref_rev(other_repo, other_ref_type, other_ref_name)
382 382
383 383 cs_ranges, _cs_ranges_not, ancestor_rev = CompareController._get_changesets(org_repo.scm_instance.alias,
384 384 other_repo.scm_instance, new_other_rev, # org and other "swapped"
385 385 org_repo.scm_instance, new_org_rev)
386 386
387 387 old_revisions = set(old_pull_request.revisions)
388 388 revisions = [cs.raw_id for cs in cs_ranges]
389 389 new_revisions = [r for r in revisions if r not in old_revisions]
390 390 lost = old_revisions.difference(revisions)
391 391
392 392 infos = ['This is an update of %s "%s".' %
393 393 (h.canonical_url('pullrequest_show', repo_name=old_pull_request.other_repo.repo_name,
394 394 pull_request_id=old_pull_request.pull_request_id),
395 395 old_pull_request.title)]
396 396
397 397 if lost:
398 398 infos.append(_('Missing changesets since the previous pull request:'))
399 399 for r in old_pull_request.revisions:
400 400 if r in lost:
401 401 rev_desc = org_repo.get_changeset(r).message.split('\n')[0]
402 402 infos.append(' %s "%s"' % (h.short_id(r), rev_desc))
403 403
404 404 if new_revisions:
405 405 infos.append(_('New changesets on %s %s since the previous pull request:') % (org_ref_type, org_ref_name))
406 406 for r in reversed(revisions):
407 407 if r in new_revisions:
408 408 rev_desc = org_repo.get_changeset(r).message.split('\n')[0]
409 409 infos.append(' %s %s' % (h.short_id(r), h.shorter(rev_desc, 80)))
410 410
411 411 if ancestor_rev == other_rev:
412 412 infos.append(_("Ancestor didn't change - show diff since previous version:"))
413 413 infos.append(h.canonical_url('compare_url',
414 414 repo_name=org_repo.repo_name, # other_repo is always same as repo_name
415 415 org_ref_type='rev', org_ref_name=h.short_id(org_rev), # use old org_rev as base
416 416 other_ref_type='rev', other_ref_name=h.short_id(new_org_rev),
417 417 )) # note: linear diff, merge or not doesn't matter
418 418 else:
419 419 infos.append(_('This pull request is based on another %s revision and there is no simple diff.') % other_ref_name)
420 420 else:
421 421 infos.append(_('No changes found on %s %s since previous version.') % (org_ref_type, org_ref_name))
422 422 # TODO: fail?
423 423
424 424 # hack: ancestor_rev is not an other_ref but we want to show the
425 425 # requested destination and have the exact ancestor
426 426 new_other_ref = '%s:%s:%s' % (other_ref_type, other_ref_name, ancestor_rev)
427 427 new_org_ref = '%s:%s:%s' % (org_ref_type, org_ref_name, new_org_rev)
428 428
429 429 try:
430 430 title, old_v = re.match(r'(.*)\(v(\d+)\)\s*$', title).groups()
431 431 v = int(old_v) + 1
432 432 except (AttributeError, ValueError):
433 433 v = 2
434 434 title = '%s (v%s)' % (title.strip(), v)
435 435
436 436 # using a mail-like separator, insert new update info at the top of the list
437 437 descriptions = description.replace('\r\n', '\n').split('\n-- \n', 1)
438 438 description = descriptions[0].strip() + '\n\n-- \n' + '\n'.join(infos)
439 439 if len(descriptions) > 1:
440 440 description += '\n\n' + descriptions[1].strip()
441 441
442 442 try:
443 443 pull_request = PullRequestModel().create(
444 444 self.authuser.user_id,
445 445 old_pull_request.org_repo.repo_name, new_org_ref,
446 446 old_pull_request.other_repo.repo_name, new_other_ref,
447 447 revisions, reviewers_ids, title, description
448 448 )
449 449 except Exception:
450 450 h.flash(_('Error occurred while creating pull request'),
451 451 category='error')
452 452 log.error(traceback.format_exc())
453 453 return redirect(old_pull_request.url())
454 454
455 455 ChangesetCommentsModel().create(
456 456 text=_('Closed, replaced by %s .') % pull_request.url(canonical=True),
457 457 repo=old_pull_request.other_repo.repo_id,
458 458 user=c.authuser.user_id,
459 459 pull_request=old_pull_request.pull_request_id,
460 460 closing_pr=True)
461 461 PullRequestModel().close_pull_request(old_pull_request.pull_request_id)
462 462
463 463 Session().commit()
464 464 h.flash(_('Pull request update created'),
465 465 category='success')
466 466
467 467 return redirect(pull_request.url())
468 468
469 469 # pullrequest_post for PR editing
470 470 @LoginRequired()
471 471 @NotAnonymous()
472 472 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
473 473 'repository.admin')
474 474 def post(self, repo_name, pull_request_id):
475 475 pull_request = PullRequest.get_or_404(pull_request_id)
476 476 if pull_request.is_closed():
477 477 raise HTTPForbidden()
478 478 assert pull_request.other_repo.repo_name == repo_name
479 479 #only owner or admin can update it
480 480 owner = pull_request.author.user_id == c.authuser.user_id
481 481 repo_admin = h.HasRepoPermissionAny('repository.admin')(c.repo_name)
482 482 if not (h.HasPermissionAny('hg.admin') or repo_admin or owner):
483 483 raise HTTPForbidden()
484 484
485 485 _form = PullRequestPostForm()().to_python(request.POST)
486 486 reviewers_ids = [int(s) for s in _form['review_members']]
487 487
488 488 if _form['updaterev']:
489 489 return self.create_update(pull_request,
490 490 _form['updaterev'],
491 491 _form['pullrequest_title'],
492 492 _form['pullrequest_desc'],
493 493 reviewers_ids)
494 494
495 495 old_description = pull_request.description
496 496 pull_request.title = _form['pullrequest_title']
497 497 pull_request.description = _form['pullrequest_desc'].strip() or _('No description')
498 498 PullRequestModel().mention_from_description(pull_request, old_description)
499 499
500 500 PullRequestModel().update_reviewers(pull_request_id, reviewers_ids)
501 501
502 502 Session().commit()
503 503 h.flash(_('Pull request updated'), category='success')
504 504
505 505 return redirect(pull_request.url())
506 506
507 507 @LoginRequired()
508 508 @NotAnonymous()
509 509 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
510 510 'repository.admin')
511 511 @jsonify
512 512 def delete(self, repo_name, pull_request_id):
513 513 pull_request = PullRequest.get_or_404(pull_request_id)
514 514 #only owner can delete it !
515 515 if pull_request.author.user_id == c.authuser.user_id:
516 516 PullRequestModel().delete(pull_request)
517 517 Session().commit()
518 518 h.flash(_('Successfully deleted pull request'),
519 519 category='success')
520 520 return redirect(url('my_pullrequests'))
521 521 raise HTTPForbidden()
522 522
523 523 @LoginRequired()
524 524 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
525 525 'repository.admin')
526 526 def show(self, repo_name, pull_request_id, extra=None):
527 527 repo_model = RepoModel()
528 528 c.users_array = repo_model.get_users_js()
529 529 c.user_groups_array = repo_model.get_user_groups_js()
530 530 c.pull_request = PullRequest.get_or_404(pull_request_id)
531 531 c.allowed_to_change_status = self._get_is_allowed_change_status(c.pull_request)
532 532 cc_model = ChangesetCommentsModel()
533 533 cs_model = ChangesetStatusModel()
534 534
535 535 # pull_requests repo_name we opened it against
536 536 # ie. other_repo must match
537 537 if repo_name != c.pull_request.other_repo.repo_name:
538 538 raise HTTPNotFound
539 539
540 540 # load compare data into template context
541 541 c.cs_repo = c.pull_request.org_repo
542 542 (c.cs_ref_type,
543 543 c.cs_ref_name,
544 544 c.cs_rev) = c.pull_request.org_ref.split(':')
545 545
546 546 c.a_repo = c.pull_request.other_repo
547 547 (c.a_ref_type,
548 548 c.a_ref_name,
549 549 c.a_rev) = c.pull_request.other_ref.split(':') # other_rev is ancestor
550 550
551 551 org_scm_instance = c.cs_repo.scm_instance # property with expensive cache invalidation check!!!
552 552 c.cs_repo = c.cs_repo
553 553 c.cs_ranges = [org_scm_instance.get_changeset(x) for x in c.pull_request.revisions]
554 554 c.cs_ranges_org = None # not stored and not important and moving target - could be calculated ...
555 555 revs = [ctx.revision for ctx in reversed(c.cs_ranges)]
556 556 c.jsdata = json.dumps(graph_data(org_scm_instance, revs))
557 557
558 558 avail_revs = set()
559 559 avail_show = []
560 560 c.cs_branch_name = c.cs_ref_name
561 561 other_scm_instance = c.a_repo.scm_instance
562 562 c.update_msg = ""
563 563 c.update_msg_other = ""
564 564 if org_scm_instance.alias == 'hg' and c.a_ref_name != 'ancestor':
565 565 if c.cs_ref_type != 'branch':
566 566 c.cs_branch_name = org_scm_instance.get_changeset(c.cs_ref_name).branch # use ref_type ?
567 567 c.a_branch_name = c.a_ref_name
568 568 if c.a_ref_type != 'branch':
569 569 try:
570 570 c.a_branch_name = other_scm_instance.get_changeset(c.a_ref_name).branch # use ref_type ?
571 571 except EmptyRepositoryError:
572 572 c.a_branch_name = 'null' # not a branch name ... but close enough
573 573 # candidates: descendants of old head that are on the right branch
574 574 # and not are the old head itself ...
575 575 # and nothing at all if old head is a descendant of target ref name
576 576 if other_scm_instance._repo.revs('present(%s)::&%s', c.cs_ranges[-1].raw_id, c.a_branch_name):
577 577 c.update_msg = _('This pull request has already been merged to %s.') % c.a_branch_name
578 578 elif c.pull_request.is_closed():
579 579 c.update_msg = _('This pull request has been closed and can not be updated.')
580 580 else: # look for descendants of PR head on source branch in org repo
581 581 avail_revs = org_scm_instance._repo.revs('%s:: & branch(%s)',
582 582 revs[0], c.cs_branch_name)
583 583 if len(avail_revs) > 1: # more than just revs[0]
584 584 # also show changesets that not are descendants but would be merged in
585 585 targethead = other_scm_instance.get_changeset(c.a_branch_name).raw_id
586 586 if org_scm_instance.path != other_scm_instance.path:
587 587 # Note: org_scm_instance.path must come first so all
588 588 # valid revision numbers are 100% org_scm compatible
589 589 # - both for avail_revs and for revset results
590 590 hgrepo = unionrepo.unionrepository(org_scm_instance.baseui,
591 591 org_scm_instance.path,
592 592 other_scm_instance.path)
593 593 else:
594 594 hgrepo = org_scm_instance._repo
595 595 show = set(hgrepo.revs('::%ld & !::%s & !::%s',
596 596 avail_revs, revs[0], targethead))
597 597 c.update_msg = _('This pull request can be updated with changes on %s:') % c.cs_branch_name
598 598 else:
599 599 show = set()
600 600 c.update_msg = _('No changesets found for updating this pull request.')
601 601
602 602 # TODO: handle branch heads that not are tip-most
603 603 brevs = org_scm_instance._repo.revs('%s - %ld', c.cs_branch_name, avail_revs)
604 604 if brevs:
605 605 # also show changesets that are on branch but neither ancestors nor descendants
606 606 show.update(org_scm_instance._repo.revs('::%ld - ::%ld - ::%s', brevs, avail_revs, c.a_branch_name))
607 607 show.add(revs[0]) # make sure graph shows this so we can see how they relate
608 608 c.update_msg_other = _('Note: Branch %s has another head: %s.') % (c.cs_branch_name,
609 609 h.short_id(org_scm_instance.get_changeset((max(brevs))).raw_id))
610 610
611 611 avail_show = sorted(show, reverse=True)
612 612
613 613 elif org_scm_instance.alias == 'git':
614 614 c.update_msg = _("Git pull requests don't support updates yet.")
615 615
616 616 c.avail_revs = avail_revs
617 617 c.avail_cs = [org_scm_instance.get_changeset(r) for r in avail_show]
618 618 c.avail_jsdata = json.dumps(graph_data(org_scm_instance, avail_show))
619 619
620 620 raw_ids = [x.raw_id for x in c.cs_ranges]
621 621 c.cs_comments = c.cs_repo.get_comments(raw_ids)
622 622 c.statuses = c.cs_repo.statuses(raw_ids)
623 623
624 624 ignore_whitespace = request.GET.get('ignorews') == '1'
625 625 line_context = request.GET.get('context', 3)
626 626 c.ignorews_url = _ignorews_url
627 627 c.context_url = _context_url
628 628 c.fulldiff = request.GET.get('fulldiff')
629 629 diff_limit = self.cut_off_limit if not c.fulldiff else None
630 630
631 631 # we swap org/other ref since we run a simple diff on one repo
632 632 log.debug('running diff between %s and %s in %s'
633 633 % (c.a_rev, c.cs_rev, org_scm_instance.path))
634 634 txtdiff = org_scm_instance.get_diff(rev1=safe_str(c.a_rev), rev2=safe_str(c.cs_rev),
635 635 ignore_whitespace=ignore_whitespace,
636 636 context=line_context)
637 637
638 638 diff_processor = diffs.DiffProcessor(txtdiff or '', format='gitdiff',
639 639 diff_limit=diff_limit)
640 640 _parsed = diff_processor.prepare()
641 641
642 642 c.limited_diff = False
643 643 if isinstance(_parsed, LimitedDiffContainer):
644 644 c.limited_diff = True
645 645
646 646 c.files = []
647 647 c.changes = {}
648 648 c.lines_added = 0
649 649 c.lines_deleted = 0
650 650
651 651 for f in _parsed:
652 652 st = f['stats']
653 653 c.lines_added += st['added']
654 654 c.lines_deleted += st['deleted']
655 655 fid = h.FID('', f['filename'])
656 656 c.files.append([fid, f['operation'], f['filename'], f['stats']])
657 657 htmldiff = diff_processor.as_html(enable_comments=True,
658 658 parsed_lines=[f])
659 659 c.changes[fid] = [f['operation'], f['filename'], htmldiff]
660 660
661 661 # inline comments
662 662 c.inline_cnt = 0
663 663 c.inline_comments = cc_model.get_inline_comments(
664 664 c.db_repo.repo_id,
665 665 pull_request=pull_request_id)
666 666 # count inline comments
667 667 for __, lines in c.inline_comments:
668 668 for comments in lines.values():
669 669 c.inline_cnt += len(comments)
670 670 # comments
671 671 c.comments = cc_model.get_comments(c.db_repo.repo_id,
672 672 pull_request=pull_request_id)
673 673
674 674 # (badly named) pull-request status calculation based on reviewer votes
675 675 (c.pull_request_reviewers,
676 676 c.pull_request_pending_reviewers,
677 677 c.current_voting_result,
678 678 ) = cs_model.calculate_pull_request_result(c.pull_request)
679 679 c.changeset_statuses = ChangesetStatus.STATUSES
680 680
681 681 c.as_form = False
682 682 c.ancestor = None # there is one - but right here we don't know which
683 683 return render('/pullrequests/pullrequest_show.html')
684 684
685 685 @LoginRequired()
686 686 @NotAnonymous()
687 687 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
688 688 'repository.admin')
689 689 @jsonify
690 690 def comment(self, repo_name, pull_request_id):
691 691 pull_request = PullRequest.get_or_404(pull_request_id)
692 692
693 693 status = 0
694 694 close_pr = False
695 695 allowed_to_change_status = self._get_is_allowed_change_status(pull_request)
696 696 if allowed_to_change_status:
697 697 status = request.POST.get('changeset_status')
698 698 close_pr = request.POST.get('save_close')
699 text = request.POST.get('text', '').strip() or _('No comments.')
699 text = request.POST.get('text', '').strip()
700 700 if close_pr:
701 701 text = _('Closing.') + '\n' + text
702 702
703 703 comm = ChangesetCommentsModel().create(
704 704 text=text,
705 705 repo=c.db_repo.repo_id,
706 706 user=c.authuser.user_id,
707 707 pull_request=pull_request_id,
708 708 f_path=request.POST.get('f_path'),
709 709 line_no=request.POST.get('line'),
710 710 status_change=(ChangesetStatus.get_status_lbl(status)
711 711 if status and allowed_to_change_status else None),
712 712 closing_pr=close_pr
713 713 )
714 714
715 715 action_logger(self.authuser,
716 716 'user_commented_pull_request:%s' % pull_request_id,
717 717 c.db_repo, self.ip_addr, self.sa)
718 718
719 719 if allowed_to_change_status:
720 720 # get status if set !
721 721 if status:
722 722 ChangesetStatusModel().set_status(
723 723 c.db_repo.repo_id,
724 724 status,
725 725 c.authuser.user_id,
726 726 comm,
727 727 pull_request=pull_request_id
728 728 )
729 729
730 730 if close_pr:
731 731 PullRequestModel().close_pull_request(pull_request_id)
732 732 action_logger(self.authuser,
733 733 'user_closed_pull_request:%s' % pull_request_id,
734 734 c.db_repo, self.ip_addr, self.sa)
735 735
736 736 Session().commit()
737 737
738 738 if not request.environ.get('HTTP_X_PARTIAL_XHR'):
739 739 return redirect(pull_request.url())
740 740
741 741 data = {
742 742 'target_id': h.safeid(h.safe_unicode(request.POST.get('f_path'))),
743 743 }
744 744 if comm:
745 745 c.co = comm
746 746 data.update(comm.get_dict())
747 747 data.update({'rendered_text':
748 748 render('changeset/changeset_comment_block.html')})
749 749
750 750 return data
751 751
752 752 @LoginRequired()
753 753 @NotAnonymous()
754 754 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
755 755 'repository.admin')
756 756 @jsonify
757 757 def delete_comment(self, repo_name, comment_id):
758 758 co = ChangesetComment.get(comment_id)
759 759 if co.pull_request.is_closed():
760 760 #don't allow deleting comments on closed pull request
761 761 raise HTTPForbidden()
762 762
763 763 owner = co.author.user_id == c.authuser.user_id
764 764 repo_admin = h.HasRepoPermissionAny('repository.admin')(c.repo_name)
765 765 if h.HasPermissionAny('hg.admin') or repo_admin or owner:
766 766 ChangesetCommentsModel().delete(comment=co)
767 767 Session().commit()
768 768 return True
769 769 else:
770 770 raise HTTPForbidden()
@@ -1,296 +1,296 b''
1 1 # -*- coding: utf-8 -*-
2 2 # This program is free software: you can redistribute it and/or modify
3 3 # it under the terms of the GNU General Public License as published by
4 4 # the Free Software Foundation, either version 3 of the License, or
5 5 # (at your option) any later version.
6 6 #
7 7 # This program is distributed in the hope that it will be useful,
8 8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 10 # GNU General Public License for more details.
11 11 #
12 12 # You should have received a copy of the GNU General Public License
13 13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 14 """
15 15 kallithea.model.comment
16 16 ~~~~~~~~~~~~~~~~~~~~~~~
17 17
18 18 comments model for Kallithea
19 19
20 20 This file was forked by the Kallithea project in July 2014.
21 21 Original author and date, and relevant copyright and licensing information is below:
22 22 :created_on: Nov 11, 2011
23 23 :author: marcink
24 24 :copyright: (c) 2013 RhodeCode GmbH, and others.
25 25 :license: GPLv3, see LICENSE.md for more details.
26 26 """
27 27
28 28 import logging
29 29
30 30 from pylons.i18n.translation import _
31 31 from collections import defaultdict
32 32
33 33 from kallithea.lib.utils2 import extract_mentioned_users, safe_unicode
34 34 from kallithea.lib import helpers as h
35 35 from kallithea.model import BaseModel
36 36 from kallithea.model.db import ChangesetComment, User, \
37 37 Notification, PullRequest
38 38 from kallithea.model.notification import NotificationModel
39 39 from kallithea.model.meta import Session
40 40
41 41 log = logging.getLogger(__name__)
42 42
43 43
44 44 class ChangesetCommentsModel(BaseModel):
45 45
46 46 cls = ChangesetComment
47 47
48 48 def __get_changeset_comment(self, changeset_comment):
49 49 return self._get_instance(ChangesetComment, changeset_comment)
50 50
51 51 def __get_pull_request(self, pull_request):
52 52 return self._get_instance(PullRequest, pull_request)
53 53
54 54 def _extract_mentions(self, s):
55 55 user_objects = []
56 56 for username in extract_mentioned_users(s):
57 57 user_obj = User.get_by_username(username, case_insensitive=True)
58 58 if user_obj:
59 59 user_objects.append(user_obj)
60 60 return user_objects
61 61
62 62 def _get_notification_data(self, repo, comment, user, comment_text,
63 63 line_no=None, revision=None, pull_request=None,
64 64 status_change=None, closing_pr=False):
65 65 """
66 66 Get notification data
67 67
68 68 :param comment_text:
69 69 :param line:
70 70 :returns: tuple (subj,body,recipients,notification_type,email_kwargs)
71 71 """
72 72 # make notification
73 73 body = comment_text # text of the comment
74 74 line = ''
75 75 if line_no:
76 76 line = _('on line %s') % line_no
77 77
78 78 #changeset
79 79 if revision:
80 80 notification_type = Notification.TYPE_CHANGESET_COMMENT
81 81 cs = repo.scm_instance.get_changeset(revision)
82 82 desc = "%s" % (cs.short_id)
83 83
84 84 threading = ['%s-rev-%s@%s' % (repo.repo_name, revision, h.canonical_hostname())]
85 85 if line_no: # TODO: url to file _and_ line number
86 86 threading.append('%s-rev-%s-line-%s@%s' % (repo.repo_name, revision, line_no,
87 87 h.canonical_hostname()))
88 88 comment_url = h.canonical_url('changeset_home',
89 89 repo_name=repo.repo_name,
90 90 revision=revision,
91 91 anchor='comment-%s' % comment.comment_id)
92 92 subj = safe_unicode(
93 93 h.link_to('Re changeset: %(desc)s %(line)s' % \
94 94 {'desc': desc, 'line': line},
95 95 comment_url)
96 96 )
97 97 # get the current participants of this changeset
98 98 recipients = ChangesetComment.get_users(revision=revision)
99 99 # add changeset author if it's in kallithea system
100 100 cs_author = User.get_from_cs_author(cs.author)
101 101 if not cs_author:
102 102 #use repo owner if we cannot extract the author correctly
103 103 cs_author = repo.user
104 104 recipients += [cs_author]
105 105 email_kwargs = {
106 106 'status_change': status_change,
107 107 'cs_comment_user': h.person(user, 'username_and_name'),
108 108 'cs_target_repo': h.canonical_url('summary_home', repo_name=repo.repo_name),
109 109 'cs_comment_url': comment_url,
110 110 'raw_id': revision,
111 111 'message': cs.message,
112 112 'repo_name': repo.repo_name,
113 113 'short_id': h.short_id(revision),
114 114 'branch': cs.branch,
115 115 'comment_username': user.username,
116 116 'threading': threading,
117 117 }
118 118 #pull request
119 119 elif pull_request:
120 120 notification_type = Notification.TYPE_PULL_REQUEST_COMMENT
121 121 desc = comment.pull_request.title
122 122 _org_ref_type, org_ref_name, _org_rev = comment.pull_request.org_ref.split(':')
123 123 threading = ['%s-pr-%s@%s' % (pull_request.other_repo.repo_name,
124 124 pull_request.pull_request_id,
125 125 h.canonical_hostname())]
126 126 if line_no: # TODO: url to file _and_ line number
127 127 threading.append('%s-pr-%s-line-%s@%s' % (pull_request.other_repo.repo_name,
128 128 pull_request.pull_request_id, line_no,
129 129 h.canonical_hostname()))
130 130 comment_url = pull_request.url(canonical=True,
131 131 anchor='comment-%s' % comment.comment_id)
132 132 subj = safe_unicode(
133 133 h.link_to('Re pull request #%(pr_id)s: %(desc)s %(line)s' % \
134 134 {'desc': desc,
135 135 'pr_id': comment.pull_request.pull_request_id,
136 136 'line': line},
137 137 comment_url)
138 138 )
139 139 # get the current participants of this pull request
140 140 recipients = ChangesetComment.get_users(pull_request_id=
141 141 pull_request.pull_request_id)
142 142 # add pull request author
143 143 recipients += [pull_request.author]
144 144
145 145 # add the reviewers to notification
146 146 recipients += [x.user for x in pull_request.reviewers]
147 147
148 148 #set some variables for email notification
149 149 email_kwargs = {
150 150 'pr_title': pull_request.title,
151 151 'pr_id': pull_request.pull_request_id,
152 152 'status_change': status_change,
153 153 'closing_pr': closing_pr,
154 154 'pr_comment_url': comment_url,
155 155 'pr_comment_user': h.person(user, 'username_and_name'),
156 156 'pr_target_repo': h.canonical_url('summary_home',
157 157 repo_name=pull_request.other_repo.repo_name),
158 158 'repo_name': pull_request.other_repo.repo_name,
159 159 'ref': org_ref_name,
160 160 'comment_username': user.username,
161 161 'threading': threading,
162 162 }
163 163
164 164 return subj, body, recipients, notification_type, email_kwargs
165 165
166 166 def create(self, text, repo, user, revision=None, pull_request=None,
167 167 f_path=None, line_no=None, status_change=None, closing_pr=False,
168 168 send_email=True):
169 169 """
170 170 Creates new comment for changeset or pull request.
171 171 If status_change is not None this comment is associated with a
172 172 status change of changeset or changesets associated with pull request
173 173
174 174 :param text:
175 175 :param repo:
176 176 :param user:
177 177 :param revision:
178 178 :param pull_request: (for emails, not for comments)
179 179 :param f_path:
180 180 :param line_no:
181 181 :param status_change: (for emails, not for comments)
182 182 :param closing_pr: (for emails, not for comments)
183 183 :param send_email: also send email
184 184 """
185 if not text:
185 if not status_change and not text:
186 186 log.warning('Missing text for comment, skipping...')
187 187 return
188 188
189 189 repo = self._get_repo(repo)
190 190 user = self._get_user(user)
191 191 comment = ChangesetComment()
192 192 comment.repo = repo
193 193 comment.author = user
194 194 comment.text = text
195 195 comment.f_path = f_path
196 196 comment.line_no = line_no
197 197
198 198 if revision:
199 199 comment.revision = revision
200 200 elif pull_request:
201 201 pull_request = self.__get_pull_request(pull_request)
202 202 comment.pull_request = pull_request
203 203 else:
204 204 raise Exception('Please specify revision or pull_request_id')
205 205
206 206 Session().add(comment)
207 207 Session().flush()
208 208
209 209 if send_email:
210 210 (subj, body, recipients, notification_type,
211 211 email_kwargs) = self._get_notification_data(
212 212 repo, comment, user,
213 213 comment_text=text,
214 214 line_no=line_no,
215 215 revision=revision,
216 216 pull_request=pull_request,
217 217 status_change=status_change,
218 218 closing_pr=closing_pr)
219 219 email_kwargs['is_mention'] = False
220 220 # create notification objects, and emails
221 221 NotificationModel().create(
222 222 created_by=user, subject=subj, body=body,
223 223 recipients=recipients, type_=notification_type,
224 224 email_kwargs=email_kwargs,
225 225 )
226 226
227 227 mention_recipients = set(self._extract_mentions(body))\
228 228 .difference(recipients)
229 229 if mention_recipients:
230 230 email_kwargs['is_mention'] = True
231 231 subj = _('[Mention]') + ' ' + subj
232 232 NotificationModel().create(
233 233 created_by=user, subject=subj, body=body,
234 234 recipients=mention_recipients,
235 235 type_=notification_type,
236 236 email_kwargs=email_kwargs
237 237 )
238 238
239 239 return comment
240 240
241 241 def delete(self, comment):
242 242 """
243 243 Deletes given comment
244 244
245 245 :param comment_id:
246 246 """
247 247 comment = self.__get_changeset_comment(comment)
248 248 Session().delete(comment)
249 249
250 250 return comment
251 251
252 252 def get_comments(self, repo_id, revision=None, pull_request=None):
253 253 """
254 254 Gets main comments based on revision or pull_request_id
255 255
256 256 :param repo_id:
257 257 :param revision:
258 258 :param pull_request:
259 259 """
260 260
261 261 q = ChangesetComment.query()\
262 262 .filter(ChangesetComment.repo_id == repo_id)\
263 263 .filter(ChangesetComment.line_no == None)\
264 264 .filter(ChangesetComment.f_path == None)
265 265 if revision:
266 266 q = q.filter(ChangesetComment.revision == revision)
267 267 elif pull_request:
268 268 pull_request = self.__get_pull_request(pull_request)
269 269 q = q.filter(ChangesetComment.pull_request == pull_request)
270 270 else:
271 271 raise Exception('Please specify revision or pull_request')
272 272 q = q.order_by(ChangesetComment.created_on)
273 273 return q.all()
274 274
275 275 def get_inline_comments(self, repo_id, revision=None, pull_request=None):
276 276 q = Session().query(ChangesetComment)\
277 277 .filter(ChangesetComment.repo_id == repo_id)\
278 278 .filter(ChangesetComment.line_no != None)\
279 279 .filter(ChangesetComment.f_path != None)\
280 280 .order_by(ChangesetComment.comment_id.asc())\
281 281
282 282 if revision:
283 283 q = q.filter(ChangesetComment.revision == revision)
284 284 elif pull_request:
285 285 pull_request = self.__get_pull_request(pull_request)
286 286 q = q.filter(ChangesetComment.pull_request == pull_request)
287 287 else:
288 288 raise Exception('Please specify revision or pull_request_id')
289 289
290 290 comments = q.all()
291 291
292 292 paths = defaultdict(lambda: defaultdict(list))
293 293
294 294 for co in comments:
295 295 paths[co.f_path][co.line_no].append(co)
296 296 return paths.items()
@@ -1,5067 +1,5071 b''
1 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 2 border: 0;
3 3 outline: 0;
4 4 font-size: 100%;
5 5 vertical-align: baseline;
6 6 background: transparent;
7 7 margin: 0;
8 8 padding: 0;
9 9 }
10 10
11 11 body {
12 12 line-height: 1;
13 13 height: 100%;
14 14 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
15 15 font-family: Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
16 16 color: #000;
17 17 margin: 0;
18 18 padding: 0;
19 19 font-size: 12px;
20 20 }
21 21
22 22 ol, ul {
23 23 list-style: none;
24 24 }
25 25
26 26 blockquote, q {
27 27 quotes: none;
28 28 }
29 29
30 30 blockquote:before, blockquote:after, q:before, q:after {
31 31 content: none;
32 32 }
33 33
34 34 :focus {
35 35 outline: 0;
36 36 }
37 37
38 38 del {
39 39 text-decoration: line-through;
40 40 }
41 41
42 42 table {
43 43 border-collapse: collapse;
44 44 border-spacing: 0;
45 45 }
46 46
47 47 html {
48 48 height: 100%;
49 49 }
50 50
51 51 a {
52 52 color: #577632;
53 53 text-decoration: none;
54 54 cursor: pointer;
55 55 }
56 56
57 57 a:hover {
58 58 color: #576622;
59 59 text-decoration: underline;
60 60 }
61 61
62 62 h1, h2, h3, h4, h5, h6,
63 63 div.h1, div.h2, div.h3, div.h4, div.h5, div.h6 {
64 64 color: #292929;
65 65 font-weight: 700;
66 66 }
67 67
68 68 h1, div.h1 {
69 69 font-size: 22px;
70 70 }
71 71
72 72 h2, div.h2 {
73 73 font-size: 20px;
74 74 }
75 75
76 76 h3, div.h3 {
77 77 font-size: 18px;
78 78 }
79 79
80 80 h4, div.h4 {
81 81 font-size: 16px;
82 82 }
83 83
84 84 h5, div.h5 {
85 85 font-size: 14px;
86 86 }
87 87
88 88 h6, div.h6 {
89 89 font-size: 11px;
90 90 }
91 91
92 92 ul.circle {
93 93 list-style-type: circle;
94 94 }
95 95
96 96 ul.disc {
97 97 list-style-type: disc;
98 98 }
99 99
100 100 ul.square {
101 101 list-style-type: square;
102 102 }
103 103
104 104 ol.lower-roman {
105 105 list-style-type: lower-roman;
106 106 }
107 107
108 108 ol.upper-roman {
109 109 list-style-type: upper-roman;
110 110 }
111 111
112 112 ol.lower-alpha {
113 113 list-style-type: lower-alpha;
114 114 }
115 115
116 116 ol.upper-alpha {
117 117 list-style-type: upper-alpha;
118 118 }
119 119
120 120 ol.decimal {
121 121 list-style-type: decimal;
122 122 }
123 123
124 124 div.color {
125 125 clear: both;
126 126 overflow: hidden;
127 127 position: absolute;
128 128 background: #FFF;
129 129 margin: 7px 0 0 60px;
130 130 padding: 1px 1px 1px 0;
131 131 }
132 132
133 133 div.color a {
134 134 width: 15px;
135 135 height: 15px;
136 136 display: block;
137 137 float: left;
138 138 margin: 0 0 0 1px;
139 139 padding: 0;
140 140 }
141 141
142 142 div.options {
143 143 clear: both;
144 144 overflow: hidden;
145 145 position: absolute;
146 146 background: #FFF;
147 147 margin: 7px 0 0 162px;
148 148 padding: 0;
149 149 }
150 150
151 151 div.options a {
152 152 height: 1%;
153 153 display: block;
154 154 text-decoration: none;
155 155 margin: 0;
156 156 padding: 3px 8px;
157 157 }
158 158
159 159 code,
160 160 .code pre,
161 161 div.readme .readme_box pre,
162 162 div.rst-block pre,
163 163 .CodeMirror .CodeMirror-code pre {
164 164 font-size: 12px;
165 165 font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
166 166 }
167 167
168 168 .top-left-rounded-corner {
169 169 -webkit-border-top-left-radius: 8px;
170 170 -khtml-border-radius-topleft: 8px;
171 171 border-top-left-radius: 8px;
172 172 }
173 173
174 174 .top-right-rounded-corner {
175 175 -webkit-border-top-right-radius: 8px;
176 176 -khtml-border-radius-topright: 8px;
177 177 border-top-right-radius: 8px;
178 178 }
179 179
180 180 .bottom-left-rounded-corner {
181 181 -webkit-border-bottom-left-radius: 8px;
182 182 -khtml-border-radius-bottomleft: 8px;
183 183 border-bottom-left-radius: 8px;
184 184 }
185 185
186 186 .bottom-right-rounded-corner {
187 187 -webkit-border-bottom-right-radius: 8px;
188 188 -khtml-border-radius-bottomright: 8px;
189 189 border-bottom-right-radius: 8px;
190 190 }
191 191
192 192 .top-left-rounded-corner-mid {
193 193 -webkit-border-top-left-radius: 4px;
194 194 -khtml-border-radius-topleft: 4px;
195 195 border-top-left-radius: 4px;
196 196 }
197 197
198 198 .top-right-rounded-corner-mid {
199 199 -webkit-border-top-right-radius: 4px;
200 200 -khtml-border-radius-topright: 4px;
201 201 border-top-right-radius: 4px;
202 202 }
203 203
204 204 .bottom-left-rounded-corner-mid {
205 205 -webkit-border-bottom-left-radius: 4px;
206 206 -khtml-border-radius-bottomleft: 4px;
207 207 border-bottom-left-radius: 4px;
208 208 }
209 209
210 210 .bottom-right-rounded-corner-mid {
211 211 -webkit-border-bottom-right-radius: 4px;
212 212 -khtml-border-radius-bottomright: 4px;
213 213 border-bottom-right-radius: 4px;
214 214 }
215 215
216 216 .help-block {
217 217 color: #999999;
218 218 display: block;
219 219 margin-bottom: 0;
220 220 margin-top: 5px;
221 221 }
222 222
223 223 .empty_data {
224 224 color: #B9B9B9;
225 225 }
226 226
227 227 .truncate {
228 228 white-space: nowrap;
229 229 overflow: hidden;
230 230 text-overflow: ellipsis;
231 231 -o-text-overflow: ellipsis;
232 232 -ms-text-overflow: ellipsis;
233 233 }
234 234
235 235 .truncate.autoexpand:hover {
236 236 text-overflow: none;
237 237 overflow: visible;
238 238 }
239 239
240 240 a.permalink {
241 241 visibility: hidden;
242 242 position: absolute;
243 243 margin: 3px 4px;
244 244 }
245 245
246 246 a.permalink:hover {
247 247 text-decoration: none;
248 248 }
249 249
250 250 h1:hover > a.permalink,
251 251 h2:hover > a.permalink,
252 252 h3:hover > a.permalink,
253 253 h4:hover > a.permalink,
254 254 h5:hover > a.permalink,
255 255 h6:hover > a.permalink,
256 256 div:hover > a.permalink {
257 257 visibility: visible;
258 258 }
259 259
260 260 #header #logo {
261 261 padding-left: 10px;
262 262 }
263 263
264 264 div.header img {
265 265 padding-top: 5px;
266 266 }
267 267
268 268 #header #logo div.header,
269 269 #header #logo div.branding {
270 270 font-size: 20px;
271 271 color: white;
272 272 float: left;
273 273 height: 44px;
274 274 line-height: 44px;
275 275 margin-right: 5px;
276 276 }
277 277
278 278 #header ul#logged-user {
279 279 margin-bottom: 5px !important;
280 280 -webkit-border-radius: 0px 0px 8px 8px;
281 281 -khtml-border-radius: 0px 0px 8px 8px;
282 282 border-radius: 0px 0px 8px 8px;
283 283 height: 37px;
284 284 background-color: #577632;
285 285 background-repeat: repeat-x;
286 286 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
287 287 background-image: -moz-linear-gradient(top, #577632, #577632);
288 288 background-image: -ms-linear-gradient(top, #577632, #577632);
289 289 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
290 290 background-image: -webkit-linear-gradient(top, #577632, #577632);
291 291 background-image: -o-linear-gradient(top, #577632, #577632);
292 292 background-image: linear-gradient(to bottom, #577632, #577632);
293 293 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
294 294 }
295 295
296 296 #header ul#logged-user li {
297 297 list-style: none;
298 298 float: left;
299 299 margin: 8px 0 0;
300 300 padding: 4px 12px;
301 301 border-left: 1px solid #576622;
302 302 }
303 303
304 304 #header ul#logged-user li.first {
305 305 border-left: none;
306 306 margin: 4px;
307 307 }
308 308
309 309 #header ul#logged-user li.first div.gravatar {
310 310 margin-top: -2px;
311 311 }
312 312
313 313 #header ul#logged-user li.first div.account {
314 314 padding-top: 4px;
315 315 float: left;
316 316 }
317 317
318 318 #header ul#logged-user li.last {
319 319 border-right: none;
320 320 }
321 321
322 322 #header ul#logged-user li a {
323 323 color: #fff;
324 324 font-weight: 700;
325 325 text-decoration: none;
326 326 }
327 327
328 328 #header ul#logged-user li a:hover {
329 329 text-decoration: underline;
330 330 }
331 331
332 332 #header ul#logged-user li.highlight a {
333 333 color: #fff;
334 334 }
335 335
336 336 #header ul#logged-user li.highlight a:hover {
337 337 color: #FFF;
338 338 }
339 339 #header-dd {
340 340 clear: both;
341 341 position: fixed !important;
342 342 background-color: #577632;
343 343 opacity: 0.01;
344 344 cursor: pointer;
345 345 min-height: 10px;
346 346 width: 100% !important;
347 347 -webkit-border-radius: 0px 0px 4px 4px;
348 348 -khtml-border-radius: 0px 0px 4px 4px;
349 349 border-radius: 0px 0px 4px 4px;
350 350 }
351 351
352 352 #header-dd:hover {
353 353 opacity: 0.2;
354 354 -webkit-transition: opacity 0.5s ease-in-out;
355 355 -moz-transition: opacity 0.5s ease-in-out;
356 356 transition: opacity 0.5s ease-in-out;
357 357 }
358 358
359 359 #header #header-inner {
360 360 min-height: 44px;
361 361 clear: both;
362 362 position: relative;
363 363 background-color: #577632;
364 364 background-repeat: repeat-x;
365 365 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
366 366 background-image: -moz-linear-gradient(top, #577632, #577632);
367 367 background-image: -ms-linear-gradient(top, #577632, #577632);
368 368 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632),color-stop(100%, #577632) );
369 369 background-image: -webkit-linear-gradient(top, #577632, #577632);
370 370 background-image: -o-linear-gradient(top, #577632, #577632);
371 371 background-image: linear-gradient(to bottom, #577632, #577632);
372 372 margin: 0;
373 373 padding: 0;
374 374 display: block;
375 375 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
376 376 -webkit-border-radius: 0px 0px 4px 4px;
377 377 -khtml-border-radius: 0px 0px 4px 4px;
378 378 border-radius: 0px 0px 4px 4px;
379 379 }
380 380 #header #header-inner.hover {
381 381 width: 100% !important;
382 382 -webkit-border-radius: 0px 0px 0px 0px;
383 383 -khtml-border-radius: 0px 0px 0px 0px;
384 384 border-radius: 0px 0px 0px 0px;
385 385 position: fixed !important;
386 386 z-index: 10000;
387 387 }
388 388
389 389 .ie7 #header #header-inner.hover,
390 390 .ie8 #header #header-inner.hover,
391 391 .ie9 #header #header-inner.hover
392 392 {
393 393 z-index: auto !important;
394 394 }
395 395
396 396 .header-pos-fix, .anchor {
397 397 margin-top: -46px;
398 398 padding-top: 46px;
399 399 }
400 400
401 401 #header #header-inner #home a {
402 402 height: 40px;
403 403 width: 46px;
404 404 display: block;
405 405 background-position: 0 0;
406 406 margin: 0;
407 407 padding: 0;
408 408 }
409 409
410 410 #header #header-inner #home a:hover {
411 411 background-position: 0 -40px;
412 412 }
413 413
414 414 #header #header-inner #logo {
415 415 float: left;
416 416 position: absolute;
417 417 }
418 418
419 419 #header #header-inner #logo h1 {
420 420 color: #FFF;
421 421 font-size: 20px;
422 422 margin: 12px 0 0 13px;
423 423 padding: 0;
424 424 }
425 425
426 426 #header #header-inner #logo a {
427 427 color: #fff;
428 428 text-decoration: none;
429 429 }
430 430
431 431 #header #header-inner #logo a:hover {
432 432 color: #bfe3ff;
433 433 }
434 434
435 435 #header #header-inner #quick {
436 436 position: relative;
437 437 float: right;
438 438 list-style-type: none;
439 439 list-style-position: outside;
440 440 margin: 4px 8px 0 0;
441 441 padding: 0;
442 442 border-radius: 4px;
443 443 }
444 444
445 445 #header #header-inner #quick li span.short {
446 446 padding: 9px 6px 8px 6px;
447 447 }
448 448
449 449 #header #header-inner #quick li span {
450 450 display: inline;
451 451 margin: 0;
452 452 }
453 453
454 454 #header #header-inner #quick li span.normal {
455 455 border: none;
456 456 padding: 10px 12px 8px;
457 457 }
458 458
459 459 #header #header-inner #quick li span.icon {
460 460 border-left: none;
461 461 padding-left: 10px;
462 462 }
463 463
464 464 #header #header-inner #quick li span.icon_short {
465 465 top: 0;
466 466 left: 0;
467 467 border-left: none;
468 468 border-right: 1px solid #2e5c89;
469 469 padding: 8px 6px 4px;
470 470 }
471 471
472 472 #header #header-inner #quick li span.icon img,
473 473 #header #header-inner #quick li span.icon_short img {
474 474 vertical-align: middle;
475 475 margin-bottom: 2px;
476 476 }
477 477
478 478 #header #header-inner #quick ul.repo_switcher {
479 479 max-height: 275px;
480 480 overflow-x: hidden;
481 481 overflow-y: auto;
482 482 }
483 483
484 484 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
485 485 padding: 2px 3px;
486 486 padding-right: 17px;
487 487 }
488 488
489 489 #header #header-inner #quick ul.repo_switcher li.qfilter_rs input {
490 490 width: 100%;
491 491 border-radius: 10px;
492 492 padding: 2px 7px;
493 493 }
494 494
495 495 #header #header-inner #quick .repo_switcher_type {
496 496 position: absolute;
497 497 left: 0;
498 498 top: 9px;
499 499 margin: 0px 2px 0px 2px;
500 500 }
501 501
502 502 .groups_breadcrumbs a {
503 503 color: #fff;
504 504 }
505 505
506 506 .groups_breadcrumbs a:hover {
507 507 color: #bfe3ff;
508 508 text-decoration: none;
509 509 }
510 510
511 511 td.quick_repo_menu:before {
512 512 font-family: "kallithea";
513 513 content: "\23f5"; /* triangle-right */
514 514 margin-left: 3px;
515 515 padding-right: 3px;
516 516 }
517 517
518 518 td.quick_repo_menu {
519 519 cursor: pointer;
520 520 width: 8px;
521 521 border: 1px solid transparent;
522 522 }
523 523
524 524 td.quick_repo_menu.active:before {
525 525 font-family: "kallithea";
526 526 content: "\23f7"; /* triangle-down */
527 527 margin-left: 1px;
528 528 padding-right: 1px;
529 529 }
530 530
531 531 td.quick_repo_menu.active {
532 532 border: 1px solid #577632;
533 533 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
534 534 cursor: pointer;
535 535 }
536 536
537 537 td.quick_repo_menu .menu_items {
538 538 margin-top: 5px;
539 539 margin-left: -6px;
540 540 width: 150px;
541 541 position: absolute;
542 542 background-color: #FFF;
543 543 background: none repeat scroll 0 0 #FFFFFF;
544 544 border-color: #577632 #666666 #666666;
545 545 border-right: 1px solid #666666;
546 546 border-style: solid;
547 547 border-width: 1px;
548 548 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
549 549 border-top-style: none;
550 550 }
551 551
552 552 td.quick_repo_menu .menu_items li {
553 553 padding: 0 !important;
554 554 }
555 555
556 556 td.quick_repo_menu .menu_items a {
557 557 display: block;
558 558 padding: 4px 12px 4px 8px;
559 559 }
560 560
561 561 td.quick_repo_menu .menu_items a:hover {
562 562 background-color: #EEE;
563 563 text-decoration: none;
564 564 }
565 565
566 566 td.quick_repo_menu .menu_items .icon img {
567 567 margin-bottom: -2px;
568 568 }
569 569
570 570 td.quick_repo_menu .menu_items.hidden {
571 571 display: none;
572 572 }
573 573
574 574 .dt_repo {
575 575 white-space: nowrap;
576 576 color: #577632;
577 577 }
578 578
579 579 .dt_repo_pending {
580 580 opacity: 0.5;
581 581 }
582 582
583 583 .dt_repo i.icon-keyhole-circled,
584 584 .dt_repo i.icon-globe
585 585 {
586 586 font-size: 16px;
587 587 vertical-align: -2px;
588 588 margin: 0px 1px 0px 3px;
589 589 }
590 590
591 591 .dt_repo a {
592 592 text-decoration: none;
593 593 }
594 594
595 595 .dt_repo .dt_repo_name:hover {
596 596 text-decoration: underline;
597 597 }
598 598
599 599 .yui-dt-first th {
600 600 text-align: left;
601 601 }
602 602
603 603 /*
604 604 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
605 605 Code licensed under the BSD License:
606 606 http://developer.yahoo.com/yui/license.html
607 607 version: 2.9.0
608 608 */
609 609 .yui-skin-sam .yui-dt-mask {
610 610 position: absolute;
611 611 z-index: 9500;
612 612 }
613 613 .yui-dt-tmp {
614 614 position: absolute;
615 615 left: -9000px;
616 616 }
617 617 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
618 618 .yui-dt-scrollable .yui-dt-hd {
619 619 overflow: hidden;
620 620 position: relative;
621 621 }
622 622 .yui-dt-scrollable .yui-dt-bd thead tr,
623 623 .yui-dt-scrollable .yui-dt-bd thead th {
624 624 position: absolute;
625 625 left: -1500px;
626 626 }
627 627 .yui-dt-scrollable tbody { -moz-outline: 0 }
628 628 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
629 629 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
630 630 .yui-dt-coltarget {
631 631 position: absolute;
632 632 z-index: 999;
633 633 }
634 634 .yui-dt-hd { zoom: 1 }
635 635 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
636 636 .yui-dt-resizer {
637 637 position: absolute;
638 638 right: 0;
639 639 bottom: 0;
640 640 height: 100%;
641 641 cursor: e-resize;
642 642 cursor: col-resize;
643 643 background-color: #CCC;
644 644 opacity: 0;
645 645 filter: alpha(opacity=0);
646 646 }
647 647 .yui-dt-resizerproxy {
648 648 visibility: hidden;
649 649 position: absolute;
650 650 z-index: 9000;
651 651 background-color: #CCC;
652 652 opacity: 0;
653 653 filter: alpha(opacity=0);
654 654 }
655 655 th.yui-dt-hidden .yui-dt-liner,
656 656 td.yui-dt-hidden .yui-dt-liner,
657 657 th.yui-dt-hidden .yui-dt-resizer { display: none }
658 658 .yui-dt-editor,
659 659 .yui-dt-editor-shim {
660 660 position: absolute;
661 661 z-index: 9000;
662 662 }
663 663 .yui-skin-sam .yui-dt table {
664 664 margin: 0;
665 665 padding: 0;
666 666 font-family: arial;
667 667 font-size: inherit;
668 668 border-collapse: separate;
669 669 border-spacing: 0;
670 670 border: 1px solid #7f7f7f;
671 671 }
672 672 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
673 673 .yui-skin-sam .yui-dt caption {
674 674 color: #000;
675 675 font-size: 85%;
676 676 font-weight: normal;
677 677 font-style: italic;
678 678 line-height: 1;
679 679 padding: 1em 0;
680 680 text-align: center;
681 681 }
682 682 .yui-skin-sam .yui-dt th,
683 683 .yui-skin-sam .yui-dt th a {
684 684 font-weight: normal;
685 685 text-decoration: none;
686 686 color: #000;
687 687 vertical-align: bottom;
688 688 }
689 689 .yui-skin-sam .yui-dt th {
690 690 margin: 0;
691 691 padding: 0;
692 692 border: 0;
693 693 border-right: 1px solid #cbcbcb;
694 694 }
695 695 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
696 696 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
697 697 .yui-skin-sam .yui-dt-liner {
698 698 margin: 0;
699 699 padding: 0;
700 700 }
701 701 .yui-skin-sam .yui-dt-coltarget {
702 702 width: 5px;
703 703 background-color: red;
704 704 }
705 705 .yui-skin-sam .yui-dt td {
706 706 margin: 0;
707 707 padding: 0;
708 708 border: 0;
709 709 border-right: 1px solid #cbcbcb;
710 710 text-align: left;
711 711 }
712 712 .yui-skin-sam .yui-dt-list td { border-right: 0 }
713 713 .yui-skin-sam .yui-dt-resizer { width: 6px }
714 714 .yui-skin-sam .yui-dt-mask {
715 715 background-color: #000;
716 716 opacity: .25;
717 717 filter: alpha(opacity=25);
718 718 }
719 719 .yui-skin-sam .yui-dt-message { background-color: #FFF }
720 720 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
721 721 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
722 722 border-left: 1px solid #7f7f7f;
723 723 border-top: 1px solid #7f7f7f;
724 724 border-right: 1px solid #7f7f7f;
725 725 }
726 726 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
727 727 border-left: 1px solid #7f7f7f;
728 728 border-bottom: 1px solid #7f7f7f;
729 729 border-right: 1px solid #7f7f7f;
730 730 background-color: #FFF;
731 731 }
732 732 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
733 733 .yui-skin-sam th.yui-dt-asc,
734 734 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
735 735
736 736 .yui-skin-sam th.yui-dt-asc .yui-dt-liner:after {
737 737 font-family: "kallithea";
738 738 content: "\23f6"; /* triangle-up */
739 739 }
740 740
741 741 .yui-skin-sam th.yui-dt-desc .yui-dt-liner:after {
742 742 font-family: "kallithea";
743 743 content: "\23f7"; /* triangle-down */
744 744 }
745 745
746 746 tbody .yui-dt-editable { cursor: pointer }
747 747 .yui-dt-editor {
748 748 text-align: left;
749 749 background-color: #f2f2f2;
750 750 border: 1px solid #808080;
751 751 padding: 6px;
752 752 }
753 753 .yui-dt-editor label {
754 754 padding-left: 4px;
755 755 padding-right: 6px;
756 756 }
757 757 .yui-dt-editor .yui-dt-button {
758 758 padding-top: 6px;
759 759 text-align: right;
760 760 }
761 761 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
762 762 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
763 763 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
764 764 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
765 765 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
766 766 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
767 767 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
768 768 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
769 769 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
770 770 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
771 771 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
772 772 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
773 773 .yui-skin-sam th.yui-dt-highlighted,
774 774 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
775 775 .yui-skin-sam tr.yui-dt-highlighted,
776 776 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
777 777 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
778 778 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
779 779 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
780 780 cursor: pointer;
781 781 background-color: #b2d2ff;
782 782 }
783 783 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
784 784 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
785 785 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
786 786 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
787 787 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
788 788 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
789 789 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
790 790 cursor: pointer;
791 791 background-color: #b2d2ff;
792 792 }
793 793 .yui-skin-sam th.yui-dt-selected,
794 794 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
795 795 .yui-skin-sam tr.yui-dt-selected td,
796 796 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
797 797 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
798 798 background-color: #426fd9;
799 799 color: #FFF;
800 800 }
801 801 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
802 802 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
803 803 background-color: #446cd7;
804 804 color: #FFF;
805 805 }
806 806 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
807 807 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
808 808 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
809 809 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
810 810 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
811 811 background-color: #426fd9;
812 812 color: #FFF;
813 813 }
814 814 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
815 815 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
816 816 background-color: #446cd7;
817 817 color: #FFF;
818 818 }
819 819 .yui-skin-sam .yui-dt-paginator {
820 820 display: block;
821 821 margin: 6px 0;
822 822 white-space: nowrap;
823 823 }
824 824 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
825 825 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
826 826 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
827 827 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
828 828 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
829 829 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
830 830 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
831 831 .yui-skin-sam a.yui-dt-page {
832 832 border: 1px solid #cbcbcb;
833 833 padding: 2px 6px;
834 834 text-decoration: none;
835 835 background-color: #fff;
836 836 }
837 837 .yui-skin-sam .yui-dt-selected {
838 838 border: 1px solid #fff;
839 839 background-color: #fff;
840 840 }
841 841
842 842 #content #left {
843 843 left: 0;
844 844 width: 280px;
845 845 position: absolute;
846 846 }
847 847
848 848 #content #right {
849 849 margin: 0 60px 10px 290px;
850 850 }
851 851
852 852 #content div.box {
853 853 clear: both;
854 854 background: #fff;
855 855 margin: 0 0 10px;
856 856 padding: 0 0 10px;
857 857 -webkit-border-radius: 4px 4px 4px 4px;
858 858 -khtml-border-radius: 4px 4px 4px 4px;
859 859 border-radius: 4px 4px 4px 4px;
860 860 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
861 861 }
862 862
863 863 #content div.box-left {
864 864 width: 49%;
865 865 clear: none;
866 866 float: left;
867 867 margin: 0 0 10px;
868 868 }
869 869
870 870 #content div.box-right {
871 871 width: 49%;
872 872 clear: none;
873 873 float: right;
874 874 margin: 0 0 10px;
875 875 }
876 876
877 877 #content div.box div.title {
878 878 clear: both;
879 879 overflow: hidden;
880 880 background-color: #577632;
881 881 background-repeat: repeat-x;
882 882 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
883 883 background-image: -moz-linear-gradient(top, #577632, #577632);
884 884 background-image: -ms-linear-gradient(top, #577632, #577632);
885 885 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
886 886 background-image: -webkit-linear-gradient(top, #577632, #577632);
887 887 background-image: -o-linear-gradient(top, #577632, #577632);
888 888 background-image: linear-gradient(to bottom, #577632, #577632);
889 889 margin: 0 0 20px;
890 890 padding: 0;
891 891 border-radius: 4px 4px 0 0;
892 892 }
893 893
894 894 #content div.box div.title h5 {
895 895 float: left;
896 896 border: none;
897 897 color: #fff;
898 898 margin: 0;
899 899 padding: 11px 0 11px 10px;
900 900 }
901 901
902 902 #content div.box div.title .link-white {
903 903 color: #FFFFFF;
904 904 }
905 905
906 906 #content div.box div.title .link-white.current {
907 907 color: #BFE3FF;
908 908 }
909 909
910 910 #content div.box div.title ul.links li {
911 911 list-style: none;
912 912 float: left;
913 913 margin: 0;
914 914 padding: 0;
915 915 }
916 916
917 917 #content div.box div.title ul.links li a {
918 918 font-size: 13px;
919 919 font-weight: 700;
920 920 height: 1%;
921 921 margin: 4px;
922 922 text-decoration: none;
923 923 }
924 924
925 925 #content div.box div.title ul.links.nav-tabs li a {
926 926 float: left;
927 927 color: #fff;
928 928 margin: 0;
929 929 padding: 11px 10px 11px 10px;
930 930 }
931 931
932 932 #content div.box div.title ul.links.icon-only-links li a {
933 933 float: left;
934 934 color: #fff;
935 935 margin: 0;
936 936 padding: 11px 10px 11px 10px;
937 937 }
938 938
939 939 #content div.box h1,
940 940 #content div.box h2,
941 941 #content div.box h3,
942 942 #content div.box h4,
943 943 #content div.box h5,
944 944 #content div.box h6,
945 945 #content div.box div.h1,
946 946 #content div.box div.h2,
947 947 #content div.box div.h3,
948 948 #content div.box div.h4,
949 949 #content div.box div.h5,
950 950 #content div.box div.h6 {
951 951 clear: both;
952 952 overflow: hidden;
953 953 margin: 8px 20px 3px;
954 954 padding-bottom: 2px;
955 955 }
956 956
957 957 #content div.box div.normal-indent {
958 958 margin: 0 20px 10px 20px;
959 959 }
960 960
961 961 #content div.box p {
962 962 color: #5f5f5f;
963 963 font-size: 12px;
964 964 line-height: 150%;
965 965 margin: 0 24px 10px;
966 966 padding: 0;
967 967 }
968 968
969 969 #content div.box blockquote {
970 970 border-left: 4px solid #DDD;
971 971 color: #5f5f5f;
972 972 font-size: 11px;
973 973 line-height: 150%;
974 974 margin: 0 34px;
975 975 padding: 0 0 0 14px;
976 976 }
977 977
978 978 #content div.box blockquote p {
979 979 margin: 10px 0;
980 980 padding: 0;
981 981 }
982 982
983 983 #content div.box dl {
984 984 margin: 10px 0px;
985 985 }
986 986
987 987 #content div.box dt {
988 988 font-size: 12px;
989 989 margin: 0;
990 990 }
991 991
992 992 #content div.box dd {
993 993 font-size: 12px;
994 994 margin: 0;
995 995 padding: 8px 0 8px 15px;
996 996 }
997 997
998 998 #content div.box li {
999 999 font-size: 12px;
1000 1000 padding: 4px 0;
1001 1001 }
1002 1002
1003 1003 #content div.box ul.disc,
1004 1004 #content div.box ul.circle {
1005 1005 margin: 10px 24px 10px 38px;
1006 1006 }
1007 1007
1008 1008 #content div.box ul.square {
1009 1009 margin: 10px 24px 10px 40px;
1010 1010 }
1011 1011
1012 1012 #content div.box img.left {
1013 1013 border: none;
1014 1014 float: left;
1015 1015 margin: 10px 10px 10px 0;
1016 1016 }
1017 1017
1018 1018 #content div.box img.right {
1019 1019 border: none;
1020 1020 float: right;
1021 1021 margin: 10px 0 10px 10px;
1022 1022 }
1023 1023
1024 1024 #content div.box div.messages {
1025 1025 clear: both;
1026 1026 overflow: hidden;
1027 1027 margin: 0 20px;
1028 1028 padding: 0;
1029 1029 }
1030 1030
1031 1031 #content div.box div.message {
1032 1032 clear: both;
1033 1033 overflow: hidden;
1034 1034 margin: 0;
1035 1035 padding: 5px 0;
1036 1036 white-space: pre-wrap;
1037 1037 }
1038 1038 #content div.box div.expand {
1039 1039 width: 110%;
1040 1040 height: 14px;
1041 1041 font-size: 10px;
1042 1042 text-align: center;
1043 1043 cursor: pointer;
1044 1044 color: #666;
1045 1045
1046 1046 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)));
1047 1047 background: -webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1048 1048 background: -moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1049 1049 background: -o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1050 1050 background: -ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1051 1051 background: linear-gradient(to bottom,rgba(255,255,255,0),rgba(64,96,128,0.1));
1052 1052
1053 1053 display: none;
1054 1054 overflow: hidden;
1055 1055 }
1056 1056 #content div.box div.expand .expandtext {
1057 1057 background-color: #ffffff;
1058 1058 padding: 2px;
1059 1059 border-radius: 2px;
1060 1060 }
1061 1061
1062 1062 #content div.box div.message a {
1063 1063 font-weight: 400 !important;
1064 1064 }
1065 1065
1066 1066 #content div.box div.message div.image {
1067 1067 float: left;
1068 1068 margin: 9px 0 0 5px;
1069 1069 padding: 6px;
1070 1070 }
1071 1071
1072 1072 #content div.box div.message div.image img {
1073 1073 vertical-align: middle;
1074 1074 margin: 0;
1075 1075 }
1076 1076
1077 1077 #content div.box div.message div.text {
1078 1078 float: left;
1079 1079 margin: 0;
1080 1080 padding: 9px 6px;
1081 1081 }
1082 1082
1083 1083 #content div.box div.message div.text h1,
1084 1084 #content div.box div.message div.text h2,
1085 1085 #content div.box div.message div.text h3,
1086 1086 #content div.box div.message div.text h4,
1087 1087 #content div.box div.message div.text h5,
1088 1088 #content div.box div.message div.text h6 {
1089 1089 border: none;
1090 1090 margin: 0;
1091 1091 padding: 0;
1092 1092 }
1093 1093
1094 1094 #content div.box div.message div.text span {
1095 1095 height: 1%;
1096 1096 display: block;
1097 1097 margin: 0;
1098 1098 padding: 5px 0 0;
1099 1099 }
1100 1100
1101 1101 #content div.box div.message-error {
1102 1102 height: 1%;
1103 1103 clear: both;
1104 1104 overflow: hidden;
1105 1105 background: #FBE3E4;
1106 1106 border: 1px solid #FBC2C4;
1107 1107 color: #860006;
1108 1108 }
1109 1109
1110 1110 #content div.box div.message-error h6 {
1111 1111 color: #860006;
1112 1112 }
1113 1113
1114 1114 #content div.box div.message-warning {
1115 1115 height: 1%;
1116 1116 clear: both;
1117 1117 overflow: hidden;
1118 1118 background: #FFF6BF;
1119 1119 border: 1px solid #FFD324;
1120 1120 color: #5f5200;
1121 1121 }
1122 1122
1123 1123 #content div.box div.message-warning h6 {
1124 1124 color: #5f5200;
1125 1125 }
1126 1126
1127 1127 #content div.box div.message-notice {
1128 1128 height: 1%;
1129 1129 clear: both;
1130 1130 overflow: hidden;
1131 1131 background: #8FBDE0;
1132 1132 border: 1px solid #6BACDE;
1133 1133 color: #003863;
1134 1134 }
1135 1135
1136 1136 #content div.box div.message-notice h6 {
1137 1137 color: #003863;
1138 1138 }
1139 1139
1140 1140 #content div.box div.message-success {
1141 1141 height: 1%;
1142 1142 clear: both;
1143 1143 overflow: hidden;
1144 1144 background: #E6EFC2;
1145 1145 border: 1px solid #C6D880;
1146 1146 color: #4e6100;
1147 1147 }
1148 1148
1149 1149 #content div.box div.message-success h6 {
1150 1150 color: #4e6100;
1151 1151 }
1152 1152
1153 1153 #content div.box div.form div.fields div.field {
1154 1154 height: 1%;
1155 1155 min-height: 12px;
1156 1156 border-bottom: 1px solid #DDD;
1157 1157 clear: both;
1158 1158 margin: 0;
1159 1159 padding: 10px 0;
1160 1160 }
1161 1161
1162 1162 #content div.box div.form div.fields div.field-first {
1163 1163 padding: 0 0 10px;
1164 1164 }
1165 1165
1166 1166 #content div.box div.form div.fields div.field-noborder {
1167 1167 border-bottom: 0 !important;
1168 1168 }
1169 1169
1170 1170 #content div.box div.form div.fields div.field span.error-message {
1171 1171 height: 1%;
1172 1172 display: inline-block;
1173 1173 color: red;
1174 1174 margin: 8px 0 0 4px;
1175 1175 padding: 0;
1176 1176 }
1177 1177
1178 1178 #content div.box div.form div.fields div.field span.success {
1179 1179 height: 1%;
1180 1180 display: block;
1181 1181 color: #316309;
1182 1182 margin: 8px 0 0;
1183 1183 padding: 0;
1184 1184 }
1185 1185
1186 1186 #content div.box div.form div.fields div.field div.label {
1187 1187 left: 70px;
1188 1188 width: 155px;
1189 1189 position: absolute;
1190 1190 margin: 0;
1191 1191 padding: 5px 0 0 0px;
1192 1192 }
1193 1193
1194 1194 #content div.box div.form div.fields div.field div.label-summary {
1195 1195 left: 30px;
1196 1196 width: 155px;
1197 1197 position: absolute;
1198 1198 margin: 0;
1199 1199 padding: 0px 0 0 0px;
1200 1200 }
1201 1201
1202 1202 #content div.box-left div.form div.fields div.field div.label,
1203 1203 #content div.box-right div.form div.fields div.field div.label,
1204 1204 #content div.box-left div.form div.fields div.field div.label,
1205 1205 #content div.box-left div.form div.fields div.field div.label-summary,
1206 1206 #content div.box-right div.form div.fields div.field div.label-summary,
1207 1207 #content div.box-left div.form div.fields div.field div.label-summary {
1208 1208 clear: both;
1209 1209 overflow: hidden;
1210 1210 left: 0;
1211 1211 width: auto;
1212 1212 position: relative;
1213 1213 margin: 0;
1214 1214 padding: 0 0 8px;
1215 1215 }
1216 1216
1217 1217 #content div.box div.form div.fields div.field div.label-select {
1218 1218 padding: 5px 0 0 5px;
1219 1219 }
1220 1220
1221 1221 #content div.box-left div.form div.fields div.field div.label-select,
1222 1222 #content div.box-right div.form div.fields div.field div.label-select {
1223 1223 padding: 0 0 8px;
1224 1224 }
1225 1225
1226 1226 #content div.box-left div.form div.fields div.field div.label-textarea,
1227 1227 #content div.box-right div.form div.fields div.field div.label-textarea {
1228 1228 padding: 0 0 8px !important;
1229 1229 }
1230 1230
1231 1231 #content div.box div.form div.fields div.field div.label label,
1232 1232 div.label label {
1233 1233 color: #393939;
1234 1234 font-weight: 700;
1235 1235 }
1236 1236 #content div.box div.form div.fields div.field div.label label,
1237 1237 div.label-summary label {
1238 1238 color: #393939;
1239 1239 font-weight: 700;
1240 1240 }
1241 1241 #content div.box div.form div.fields div.field div.input {
1242 1242 margin: 0 0 0 200px;
1243 1243 }
1244 1244
1245 1245 #content div.box div.form div.fields div.field div.input.summary {
1246 1246 margin: 0 0 0 110px;
1247 1247 }
1248 1248 #content div.box div.form div.fields div.field div.input.summary-short {
1249 1249 margin: 0 0 0 110px;
1250 1250 }
1251 1251 #content div.box div.form div.fields div.field div.file {
1252 1252 margin: 0 0 0 200px;
1253 1253 }
1254 1254 #content div.box div.form div.fields div.field div.editor {
1255 1255 margin: 0 0 0 200px;
1256 1256 }
1257 1257
1258 1258 #content div.box-left div.form div.fields div.field div.input,
1259 1259 #content div.box-right div.form div.fields div.field div.input {
1260 1260 margin: 0 0 0 0px;
1261 1261 }
1262 1262
1263 1263 #content div.box div.form div.fields div.field div.input input,
1264 1264 .reviewer_ac input {
1265 1265 background: #FFF;
1266 1266 border-top: 1px solid #b3b3b3;
1267 1267 border-left: 1px solid #b3b3b3;
1268 1268 border-right: 1px solid #eaeaea;
1269 1269 border-bottom: 1px solid #eaeaea;
1270 1270 color: #000;
1271 1271 font-size: 12px;
1272 1272 margin: 0;
1273 1273 padding: 7px 7px 6px;
1274 1274 }
1275 1275
1276 1276 #content div.box div.form div.fields div.field div.input input#clone_url,
1277 1277 #content div.box div.form div.fields div.field div.input input#clone_url_id
1278 1278 {
1279 1279 font-size: 14px;
1280 1280 padding: 0 2px;
1281 1281 }
1282 1282
1283 1283 #content div.box div.form div.fields div.field div.file input {
1284 1284 background: none repeat scroll 0 0 #FFFFFF;
1285 1285 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1286 1286 border-style: solid;
1287 1287 border-width: 1px;
1288 1288 color: #000000;
1289 1289 font-size: 12px;
1290 1290 margin: 0;
1291 1291 padding: 7px 7px 6px;
1292 1292 }
1293 1293
1294 1294 input.disabled {
1295 1295 background-color: #F5F5F5 !important;
1296 1296 }
1297 1297 #content div.box div.form div.fields div.field div.input input.small {
1298 1298 width: 30%;
1299 1299 }
1300 1300
1301 1301 #content div.box div.form div.fields div.field div.input input.medium {
1302 1302 width: 55%;
1303 1303 }
1304 1304
1305 1305 #content div.box div.form div.fields div.field div.input input.large {
1306 1306 width: 85%;
1307 1307 }
1308 1308
1309 1309 #content div.box div.form div.fields div.field div.input input.date {
1310 1310 width: 177px;
1311 1311 }
1312 1312
1313 1313 #content div.box div.form div.fields div.field div.input input.button {
1314 1314 background: #D4D0C8;
1315 1315 border-top: 1px solid #FFF;
1316 1316 border-left: 1px solid #FFF;
1317 1317 border-right: 1px solid #404040;
1318 1318 border-bottom: 1px solid #404040;
1319 1319 color: #000;
1320 1320 margin: 0;
1321 1321 padding: 4px 8px;
1322 1322 }
1323 1323
1324 1324 #content div.box div.form div.fields div.field div.textarea {
1325 1325 border-top: 1px solid #b3b3b3;
1326 1326 border-left: 1px solid #b3b3b3;
1327 1327 border-right: 1px solid #eaeaea;
1328 1328 border-bottom: 1px solid #eaeaea;
1329 1329 margin: 0 0 0 200px;
1330 1330 padding: 7px 7px 6px;
1331 1331 }
1332 1332
1333 1333 #content div.box div.form div.fields div.field div.textarea-editor {
1334 1334 border: 1px solid #ddd;
1335 1335 padding: 0;
1336 1336 }
1337 1337
1338 1338 #content div.box div.form div.fields div.field div.textarea textarea {
1339 1339 width: 100%;
1340 1340 height: 220px;
1341 1341 overflow-y: auto;
1342 1342 background: #FFF;
1343 1343 color: #000;
1344 1344 font-size: 12px;
1345 1345 outline: none;
1346 1346 border-width: 0;
1347 1347 margin: 0;
1348 1348 padding: 0;
1349 1349 }
1350 1350
1351 1351 #content div.box-left div.form div.fields div.field div.textarea textarea,
1352 1352 #content div.box-right div.form div.fields div.field div.textarea textarea {
1353 1353 width: 100%;
1354 1354 height: 100px;
1355 1355 }
1356 1356
1357 1357 #content div.box div.form div.fields div.field div.textarea table {
1358 1358 width: 100%;
1359 1359 border: none;
1360 1360 margin: 0;
1361 1361 padding: 0;
1362 1362 }
1363 1363
1364 1364 #content div.box div.form div.fields div.field div.textarea table td {
1365 1365 background: #DDD;
1366 1366 border: none;
1367 1367 padding: 0;
1368 1368 }
1369 1369
1370 1370 #content div.box div.form div.fields div.field div.textarea table td table {
1371 1371 width: auto;
1372 1372 border: none;
1373 1373 margin: 0;
1374 1374 padding: 0;
1375 1375 }
1376 1376
1377 1377 #content div.box div.form div.fields div.field div.textarea table td table td {
1378 1378 font-size: 11px;
1379 1379 padding: 5px 5px 5px 0;
1380 1380 }
1381 1381
1382 1382 #content div.box div.form div.fields div.field input[type=text]:focus,
1383 1383 #content div.box div.form div.fields div.field input[type=password]:focus,
1384 1384 #content div.box div.form div.fields div.field input[type=file]:focus,
1385 1385 #content div.box div.form div.fields div.field textarea:focus,
1386 1386 #content div.box div.form div.fields div.field select:focus,
1387 1387 .reviewer_ac input:focus {
1388 1388 background: #f6f6f6;
1389 1389 border-color: #666;
1390 1390 }
1391 1391
1392 1392 .reviewer_ac {
1393 1393 padding: 10px
1394 1394 }
1395 1395
1396 1396 div.form div.fields div.field div.button {
1397 1397 margin: 0;
1398 1398 padding: 0 0 0 8px;
1399 1399 }
1400 1400 #content div.box table.noborder {
1401 1401 border: 1px solid transparent;
1402 1402 }
1403 1403
1404 1404 #content div.box table {
1405 1405 width: 100%;
1406 1406 border-collapse: separate;
1407 1407 margin: 0;
1408 1408 padding: 0;
1409 1409 border: 1px solid #eee;
1410 1410 -webkit-border-radius: 4px;
1411 1411 border-radius: 4px;
1412 1412 }
1413 1413
1414 1414 #content div.box table th {
1415 1415 background: #eee;
1416 1416 border-bottom: 1px solid #ddd;
1417 1417 padding: 5px 0px 5px 5px;
1418 1418 text-align: left;
1419 1419 }
1420 1420
1421 1421 #content div.box table th.left {
1422 1422 text-align: left;
1423 1423 }
1424 1424
1425 1425 #content div.box table th.right {
1426 1426 text-align: right;
1427 1427 }
1428 1428
1429 1429 #content div.box table th.center {
1430 1430 text-align: center;
1431 1431 }
1432 1432
1433 1433 #content div.box table th.selected {
1434 1434 vertical-align: middle;
1435 1435 padding: 0;
1436 1436 }
1437 1437
1438 1438 #content div.box table td {
1439 1439 background: #fff;
1440 1440 border-bottom: 1px solid #cdcdcd;
1441 1441 vertical-align: middle;
1442 1442 padding: 5px;
1443 1443 }
1444 1444
1445 1445 #content div.box table td.compact {
1446 1446 padding: 0;
1447 1447 }
1448 1448
1449 1449 #content div.box table tr.selected td {
1450 1450 background: #FFC;
1451 1451 }
1452 1452
1453 1453 #content div.box table td.selected {
1454 1454 width: 3%;
1455 1455 text-align: center;
1456 1456 vertical-align: middle;
1457 1457 padding: 0;
1458 1458 }
1459 1459
1460 1460 #content div.box table td.action {
1461 1461 width: 45%;
1462 1462 text-align: left;
1463 1463 }
1464 1464
1465 1465 #content div.box table td.date {
1466 1466 width: 33%;
1467 1467 text-align: center;
1468 1468 }
1469 1469
1470 1470 #content div.box div.action {
1471 1471 float: right;
1472 1472 background: #FFF;
1473 1473 text-align: right;
1474 1474 margin: 10px 0 0;
1475 1475 padding: 0;
1476 1476 }
1477 1477
1478 1478 #content div.box div.action select {
1479 1479 font-size: 11px;
1480 1480 margin: 0;
1481 1481 }
1482 1482
1483 1483 #content div.box div.action .ui-selectmenu {
1484 1484 margin: 0;
1485 1485 padding: 0;
1486 1486 }
1487 1487
1488 1488 #content div.box div.pagination {
1489 1489 height: 1%;
1490 1490 clear: both;
1491 1491 overflow: hidden;
1492 1492 margin: 10px 0 0;
1493 1493 padding: 0;
1494 1494 }
1495 1495
1496 1496 #content div.box div.pagination ul.pager {
1497 1497 float: right;
1498 1498 text-align: right;
1499 1499 margin: 0;
1500 1500 padding: 0;
1501 1501 }
1502 1502
1503 1503 #content div.box div.pagination ul.pager li {
1504 1504 height: 1%;
1505 1505 float: left;
1506 1506 list-style: none;
1507 1507 background: #ebebeb url("../images/pager.png") repeat-x;
1508 1508 border-top: 1px solid #dedede;
1509 1509 border-left: 1px solid #cfcfcf;
1510 1510 border-right: 1px solid #c4c4c4;
1511 1511 border-bottom: 1px solid #c4c4c4;
1512 1512 color: #4A4A4A;
1513 1513 font-weight: 700;
1514 1514 margin: 0 0 0 4px;
1515 1515 padding: 0;
1516 1516 }
1517 1517
1518 1518 #content div.box div.pagination ul.pager li.separator {
1519 1519 padding: 6px;
1520 1520 }
1521 1521
1522 1522 #content div.box div.pagination ul.pager li.current {
1523 1523 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1524 1524 border-top: 1px solid #ccc;
1525 1525 border-left: 1px solid #bebebe;
1526 1526 border-right: 1px solid #b1b1b1;
1527 1527 border-bottom: 1px solid #afafaf;
1528 1528 color: #515151;
1529 1529 padding: 6px;
1530 1530 }
1531 1531
1532 1532 #content div.box div.pagination ul.pager li a {
1533 1533 height: 1%;
1534 1534 display: block;
1535 1535 float: left;
1536 1536 color: #515151;
1537 1537 text-decoration: none;
1538 1538 margin: 0;
1539 1539 padding: 6px;
1540 1540 }
1541 1541
1542 1542 #content div.box div.pagination ul.pager li a:hover,
1543 1543 #content div.box div.pagination ul.pager li a:active {
1544 1544 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1545 1545 border-top: 1px solid #ccc;
1546 1546 border-left: 1px solid #bebebe;
1547 1547 border-right: 1px solid #b1b1b1;
1548 1548 border-bottom: 1px solid #afafaf;
1549 1549 margin: -1px;
1550 1550 }
1551 1551
1552 1552 #content div.box div.pagination-right {
1553 1553 float: right;
1554 1554 }
1555 1555
1556 1556 #content div.box div.pagination-wh {
1557 1557 height: 1%;
1558 1558 overflow: hidden;
1559 1559 text-align: right;
1560 1560 margin: 10px 0 0;
1561 1561 padding: 0;
1562 1562 }
1563 1563
1564 1564 #content div.box div.pagination-wh > :first-child {
1565 1565 border-radius: 4px 0px 0px 4px;
1566 1566 }
1567 1567
1568 1568 #content div.box div.pagination-wh > :last-child {
1569 1569 border-radius: 0px 4px 4px 0px;
1570 1570 border-right: 1px solid #cfcfcf;
1571 1571 }
1572 1572
1573 1573 #content div.box div.pagination-wh a,
1574 1574 #content div.box div.pagination-wh span.pager_dotdot,
1575 1575 #content div.box div.pagination-wh span.yui-pg-previous,
1576 1576 #content div.box div.pagination-wh span.yui-pg-last,
1577 1577 #content div.box div.pagination-wh span.yui-pg-next,
1578 1578 #content div.box div.pagination-wh span.yui-pg-first {
1579 1579 height: 1%;
1580 1580 float: left;
1581 1581 background: #ebebeb url("../images/pager.png") repeat-x;
1582 1582 border-top: 1px solid #dedede;
1583 1583 border-left: 1px solid #cfcfcf;
1584 1584 border-bottom: 1px solid #c4c4c4;
1585 1585 color: #4A4A4A;
1586 1586 font-weight: 700;
1587 1587 padding: 6px;
1588 1588 }
1589 1589
1590 1590 #content div.box div.pagination-wh span.pager_curpage {
1591 1591 height: 1%;
1592 1592 float: left;
1593 1593 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1594 1594 border-top: 1px solid #ccc;
1595 1595 border-left: 1px solid #bebebe;
1596 1596 border-bottom: 1px solid #afafaf;
1597 1597 color: #515151;
1598 1598 font-weight: 700;
1599 1599 padding: 6px;
1600 1600 }
1601 1601
1602 1602 #content div.box div.pagination-wh a:hover,
1603 1603 #content div.box div.pagination-wh a:active {
1604 1604 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1605 1605 border-top: 1px solid #ccc;
1606 1606 border-left: 1px solid #bebebe;
1607 1607 border-bottom: 1px solid #afafaf;
1608 1608 text-decoration: none;
1609 1609 }
1610 1610
1611 1611 #content div.box div.traffic div.legend {
1612 1612 clear: both;
1613 1613 overflow: hidden;
1614 1614 border-bottom: 1px solid #ddd;
1615 1615 margin: 0 0 10px;
1616 1616 padding: 0 0 10px;
1617 1617 }
1618 1618
1619 1619 #content div.box div.traffic div.legend h6 {
1620 1620 float: left;
1621 1621 border: none;
1622 1622 margin: 0;
1623 1623 padding: 0;
1624 1624 }
1625 1625
1626 1626 #content div.box div.traffic div.legend li {
1627 1627 list-style: none;
1628 1628 float: left;
1629 1629 font-size: 11px;
1630 1630 margin: 0;
1631 1631 padding: 0 8px 0 4px;
1632 1632 }
1633 1633
1634 1634 #content div.box div.traffic div.legend li.visits {
1635 1635 border-left: 12px solid #edc240;
1636 1636 }
1637 1637
1638 1638 #content div.box div.traffic div.legend li.pageviews {
1639 1639 border-left: 12px solid #afd8f8;
1640 1640 }
1641 1641
1642 1642 #content div.box div.traffic table {
1643 1643 width: auto;
1644 1644 }
1645 1645
1646 1646 #content div.box div.traffic table td {
1647 1647 background: transparent;
1648 1648 border: none;
1649 1649 padding: 2px 3px 3px;
1650 1650 }
1651 1651
1652 1652 #content div.box div.traffic table td.legendLabel {
1653 1653 padding: 0 3px 2px;
1654 1654 }
1655 1655
1656 1656 #content div.box #summary {
1657 1657 margin-right: 200px;
1658 1658 min-height: 240px;
1659 1659 }
1660 1660
1661 1661 #summary-menu-stats {
1662 1662 float: left;
1663 1663 width: 180px;
1664 1664 position: absolute;
1665 1665 top: 0;
1666 1666 right: 0;
1667 1667 }
1668 1668
1669 1669 #summary-menu-stats ul {
1670 1670 margin: 0 10px;
1671 1671 display: block;
1672 1672 background-color: #f9f9f9;
1673 1673 border: 1px solid #d1d1d1;
1674 1674 border-radius: 4px;
1675 1675 }
1676 1676
1677 1677 #content #summary-menu-stats li {
1678 1678 border-top: 1px solid #d1d1d1;
1679 1679 padding: 0;
1680 1680 }
1681 1681
1682 1682 #content #summary-menu-stats li:hover {
1683 1683 background: #f0f0f0;
1684 1684 }
1685 1685
1686 1686 #content #summary-menu-stats li:first-child {
1687 1687 border-top: none;
1688 1688 }
1689 1689
1690 1690 #summary-menu-stats a {
1691 1691 display: block;
1692 1692 padding: 12px 10px;
1693 1693 background-repeat: no-repeat;
1694 1694 background-position: 10px 50%;
1695 1695 padding-right: 10px;
1696 1696 }
1697 1697
1698 1698 #repo_size_2.loaded {
1699 1699 margin-left: 30px;
1700 1700 display: block;
1701 1701 padding-right: 10px;
1702 1702 padding-bottom: 7px;
1703 1703 }
1704 1704
1705 1705 #summary-menu-stats a:hover {
1706 1706 text-decoration: none;
1707 1707 }
1708 1708
1709 1709 #summary-menu-stats a span {
1710 1710 background-color: #DEDEDE;
1711 1711 color: #888 !important;
1712 1712 border-radius: 4px;
1713 1713 padding: 2px 4px;
1714 1714 font-size: 10px;
1715 1715 }
1716 1716
1717 1717 #summary .metatag {
1718 1718 display: inline-block;
1719 1719 padding: 3px 5px;
1720 1720 margin-bottom: 3px;
1721 1721 margin-right: 1px;
1722 1722 border-radius: 5px;
1723 1723 }
1724 1724
1725 1725 #content div.box #summary p {
1726 1726 margin-bottom: -5px;
1727 1727 width: 600px;
1728 1728 white-space: pre-wrap;
1729 1729 }
1730 1730
1731 1731 #content div.box #summary p:last-child {
1732 1732 margin-bottom: 9px;
1733 1733 }
1734 1734
1735 1735 #content div.box #summary p:first-of-type {
1736 1736 margin-top: 9px;
1737 1737 }
1738 1738
1739 1739 .metatag {
1740 1740 display: inline-block;
1741 1741 margin-right: 1px;
1742 1742 -webkit-border-radius: 4px 4px 4px 4px;
1743 1743 -khtml-border-radius: 4px 4px 4px 4px;
1744 1744 border-radius: 4px 4px 4px 4px;
1745 1745
1746 1746 border: solid 1px #9CF;
1747 1747 padding: 2px 3px 2px 3px !important;
1748 1748 background-color: #DEF;
1749 1749 }
1750 1750
1751 1751 .metatag[tag="dead"] {
1752 1752 background-color: #E44;
1753 1753 }
1754 1754
1755 1755 .metatag[tag="stale"] {
1756 1756 background-color: #EA4;
1757 1757 }
1758 1758
1759 1759 .metatag[tag="featured"] {
1760 1760 background-color: #AEA;
1761 1761 }
1762 1762
1763 1763 .metatag[tag="requires"] {
1764 1764 background-color: #9CF;
1765 1765 }
1766 1766
1767 1767 .metatag[tag="recommends"] {
1768 1768 background-color: #BDF;
1769 1769 }
1770 1770
1771 1771 .metatag[tag="lang"] {
1772 1772 background-color: #FAF474;
1773 1773 }
1774 1774
1775 1775 .metatag[tag="license"] {
1776 1776 border: solid 1px #9CF;
1777 1777 background-color: #DEF;
1778 1778 target-new: tab !important;
1779 1779 }
1780 1780 .metatag[tag="see"] {
1781 1781 border: solid 1px #CBD;
1782 1782 background-color: #EDF;
1783 1783 }
1784 1784
1785 1785 a.metatag[tag="license"]:hover {
1786 1786 background-color: #577632;
1787 1787 color: #FFF;
1788 1788 text-decoration: none;
1789 1789 }
1790 1790
1791 1791 #summary .desc {
1792 1792 white-space: pre;
1793 1793 width: 100%;
1794 1794 }
1795 1795
1796 1796 #summary .repo_name {
1797 1797 font-size: 1.6em;
1798 1798 font-weight: bold;
1799 1799 vertical-align: baseline;
1800 1800 clear: right
1801 1801 }
1802 1802
1803 1803 #footer {
1804 1804 clear: both;
1805 1805 overflow: hidden;
1806 1806 text-align: right;
1807 1807 margin: 0;
1808 1808 padding: 0 10px 4px;
1809 1809 margin: -10px 0 0;
1810 1810 }
1811 1811
1812 1812 #footer div#footer-inner {
1813 1813 background-color: #577632;
1814 1814 background-repeat: repeat-x;
1815 1815 background-image: -khtml-gradient( linear, left top, left bottom, from(#577632), to(#577632));
1816 1816 background-image: -moz-linear-gradient(top, #577632, #577632);
1817 1817 background-image: -ms-linear-gradient( top, #577632, #577632);
1818 1818 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #577632), color-stop( 100%, #577632));
1819 1819 background-image: -webkit-linear-gradient( top, #577632, #577632);
1820 1820 background-image: -o-linear-gradient( top, #577632, #577632);
1821 1821 background-image: linear-gradient(to bottom, #577632, #577632);
1822 1822 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1823 1823 -webkit-border-radius: 4px 4px 4px 4px;
1824 1824 -khtml-border-radius: 4px 4px 4px 4px;
1825 1825 border-radius: 4px 4px 4px 4px;
1826 1826 }
1827 1827
1828 1828 #footer div#footer-inner p {
1829 1829 padding: 15px 25px 15px 0;
1830 1830 color: #FFF;
1831 1831 font-weight: 700;
1832 1832 }
1833 1833
1834 1834 #footer div#footer-inner .footer-link {
1835 1835 float: left;
1836 1836 padding-left: 10px;
1837 1837 }
1838 1838
1839 1839 #footer div#footer-inner .footer-link a,
1840 1840 #footer div#footer-inner .footer-link-right a {
1841 1841 color: #FFF;
1842 1842 }
1843 1843
1844 1844 #login div.title {
1845 1845 clear: both;
1846 1846 overflow: hidden;
1847 1847 position: relative;
1848 1848 background-color: #577632;
1849 1849 background-repeat: repeat-x;
1850 1850 background-image: -khtml-gradient( linear, left top, left bottom, from(#577632), to(#577632));
1851 1851 background-image: -moz-linear-gradient( top, #577632, #577632);
1852 1852 background-image: -ms-linear-gradient( top, #577632, #577632);
1853 1853 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #577632), color-stop( 100%, #577632));
1854 1854 background-image: -webkit-linear-gradient( top, #577632, #577632);
1855 1855 background-image: -o-linear-gradient( top, #577632, #577632);
1856 1856 background-image: linear-gradient(to bottom, #577632, #577632);
1857 1857 margin: 0 auto;
1858 1858 padding: 0;
1859 1859 }
1860 1860
1861 1861 #login div.inner .icon-lock {
1862 1862 font-size: 80pt;
1863 1863 color: #DDD;
1864 1864 }
1865 1865
1866 1866 #login div.inner {
1867 1867 background: #FFF;
1868 1868 border-top: none;
1869 1869 border-bottom: none;
1870 1870 margin: 0 auto;
1871 1871 padding: 20px;
1872 1872 }
1873 1873
1874 1874 #login div.form div.fields div.field div.label {
1875 1875 width: 173px;
1876 1876 float: left;
1877 1877 text-align: right;
1878 1878 margin: 2px 10px 0 0;
1879 1879 padding: 5px 0 0 5px;
1880 1880 }
1881 1881
1882 1882 #login div.form div.fields div.field div.input input {
1883 1883 background: #FFF;
1884 1884 border-top: 1px solid #b3b3b3;
1885 1885 border-left: 1px solid #b3b3b3;
1886 1886 border-right: 1px solid #eaeaea;
1887 1887 border-bottom: 1px solid #eaeaea;
1888 1888 color: #000;
1889 1889 font-size: 11px;
1890 1890 margin: 0;
1891 1891 padding: 7px 7px 6px;
1892 1892 }
1893 1893
1894 1894 #login div.form div.fields div.buttons {
1895 1895 clear: both;
1896 1896 overflow: hidden;
1897 1897 border-top: 1px solid #DDD;
1898 1898 text-align: right;
1899 1899 margin: 0;
1900 1900 padding: 10px 0 0;
1901 1901 }
1902 1902
1903 1903 #login div.form div.links {
1904 1904 clear: both;
1905 1905 overflow: hidden;
1906 1906 margin: 10px 0 0;
1907 1907 padding: 0 0 2px;
1908 1908 }
1909 1909
1910 1910 .user-menu {
1911 1911 margin: 0px !important;
1912 1912 float: left;
1913 1913 }
1914 1914
1915 1915 .user-menu .container {
1916 1916 padding: 0px 4px 0px 4px;
1917 1917 margin: 0px 0px 0px 0px;
1918 1918 }
1919 1919
1920 1920 .user-menu .gravatar {
1921 1921 margin: 0px 0px 0px 0px;
1922 1922 cursor: pointer;
1923 1923 }
1924 1924 .user-menu .gravatar.enabled {
1925 1925 background-color: #FDF784 !important;
1926 1926 }
1927 1927 .user-menu .gravatar:hover {
1928 1928 background-color: #FDF784 !important;
1929 1929 }
1930 1930 #quick_login {
1931 1931 min-height: 110px;
1932 1932 padding: 4px;
1933 1933 position: absolute;
1934 1934 right: 0;
1935 1935 background-color: #577632;
1936 1936 background-repeat: repeat-x;
1937 1937 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
1938 1938 background-image: -moz-linear-gradient(top, #577632, #577632);
1939 1939 background-image: -ms-linear-gradient(top, #577632, #577632);
1940 1940 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
1941 1941 background-image: -webkit-linear-gradient(top, #577632, #577632);
1942 1942 background-image: -o-linear-gradient(top, #577632, #577632);
1943 1943 background-image: linear-gradient(to bottom, #577632, #577632);
1944 1944
1945 1945 z-index: 999;
1946 1946 -webkit-border-radius: 0px 0px 4px 4px;
1947 1947 -khtml-border-radius: 0px 0px 4px 4px;
1948 1948 border-radius: 0px 0px 4px 4px;
1949 1949 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1950 1950
1951 1951 overflow: hidden;
1952 1952 }
1953 1953 #quick_login h4 {
1954 1954 color: #fff;
1955 1955 padding: 5px 0px 5px 14px;
1956 1956 }
1957 1957
1958 1958 #quick_login .password_forgoten {
1959 1959 padding-right: 0px;
1960 1960 padding-top: 0px;
1961 1961 text-align: left;
1962 1962 }
1963 1963
1964 1964 #quick_login .password_forgoten a {
1965 1965 font-size: 10px;
1966 1966 color: #fff;
1967 1967 padding: 0px !important;
1968 1968 line-height: 20px !important;
1969 1969 }
1970 1970
1971 1971 #quick_login .register {
1972 1972 padding-right: 10px;
1973 1973 padding-top: 5px;
1974 1974 text-align: left;
1975 1975 }
1976 1976
1977 1977 #quick_login .register a {
1978 1978 font-size: 10px;
1979 1979 color: #fff;
1980 1980 padding: 0px !important;
1981 1981 line-height: 20px !important;
1982 1982 }
1983 1983
1984 1984 #quick_login .submit {
1985 1985 margin: -20px 0 0 0px;
1986 1986 position: absolute;
1987 1987 right: 15px;
1988 1988 }
1989 1989
1990 1990 #quick_login .links_left {
1991 1991 float: left;
1992 1992 margin-right: 130px;
1993 1993 width: 170px;
1994 1994 }
1995 1995 #quick_login .links_right {
1996 1996
1997 1997 position: absolute;
1998 1998 right: 0;
1999 1999 }
2000 2000 #quick_login .full_name {
2001 2001 color: #FFFFFF;
2002 2002 font-weight: bold;
2003 2003 padding: 3px 3px 3px 6px;
2004 2004 }
2005 2005 #quick_login .big_gravatar {
2006 2006 padding: 4px 0px 0px 6px;
2007 2007 }
2008 2008 #quick_login .notifications {
2009 2009 padding: 2px 0px 0px 6px;
2010 2010 color: #FFFFFF;
2011 2011 font-weight: bold;
2012 2012 line-height: 10px !important;
2013 2013 }
2014 2014 #quick_login .notifications a,
2015 2015 #quick_login .unread a {
2016 2016 color: #FFFFFF;
2017 2017 display: block;
2018 2018 padding: 0px !important;
2019 2019 }
2020 2020 #quick_login .notifications a:hover,
2021 2021 #quick_login .unread a:hover {
2022 2022 background-color: inherit !important;
2023 2023 }
2024 2024 #quick_login .email,
2025 2025 #quick_login .unread {
2026 2026 color: #FFFFFF;
2027 2027 padding: 3px 3px 3px 6px;
2028 2028 }
2029 2029 #quick_login .links .logout {
2030 2030 }
2031 2031
2032 2032 #quick_login div.form div.fields {
2033 2033 padding-top: 2px;
2034 2034 padding-left: 10px;
2035 2035 }
2036 2036
2037 2037 #quick_login div.form div.fields div.field {
2038 2038 padding: 5px;
2039 2039 }
2040 2040
2041 2041 #quick_login div.form div.fields div.field div.label label {
2042 2042 color: #fff;
2043 2043 padding-bottom: 3px;
2044 2044 }
2045 2045
2046 2046 #quick_login div.form div.fields div.field div.input input {
2047 2047 width: 236px;
2048 2048 background: #FFF;
2049 2049 border-top: 1px solid #b3b3b3;
2050 2050 border-left: 1px solid #b3b3b3;
2051 2051 border-right: 1px solid #eaeaea;
2052 2052 border-bottom: 1px solid #eaeaea;
2053 2053 color: #000;
2054 2054 font-size: 11px;
2055 2055 margin: 0;
2056 2056 padding: 5px 7px 4px;
2057 2057 }
2058 2058
2059 2059 #quick_login div.form div.fields div.buttons {
2060 2060 clear: both;
2061 2061 overflow: hidden;
2062 2062 text-align: right;
2063 2063 margin: 0;
2064 2064 padding: 5px 14px 0px 5px;
2065 2065 }
2066 2066
2067 2067 #quick_login div.form div.links {
2068 2068 clear: both;
2069 2069 overflow: hidden;
2070 2070 margin: 10px 0 0;
2071 2071 padding: 0 0 2px;
2072 2072 }
2073 2073
2074 2074 #quick_login ol.links {
2075 2075 display: block;
2076 2076 font-weight: bold;
2077 2077 list-style: none outside none;
2078 2078 text-align: right;
2079 2079 }
2080 2080 #quick_login ol.links li {
2081 2081 line-height: 27px;
2082 2082 margin: 0;
2083 2083 padding: 0;
2084 2084 color: #fff;
2085 2085 display: block;
2086 2086 float: none !important;
2087 2087 }
2088 2088
2089 2089 #quick_login ol.links li a {
2090 2090 color: #fff;
2091 2091 display: block;
2092 2092 padding: 2px;
2093 2093 }
2094 2094 #quick_login ol.links li a:HOVER {
2095 2095 background-color: inherit !important;
2096 2096 }
2097 2097
2098 2098 #register div.title {
2099 2099 clear: both;
2100 2100 overflow: hidden;
2101 2101 position: relative;
2102 2102 background-color: #577632;
2103 2103 background-repeat: repeat-x;
2104 2104 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
2105 2105 background-image: -moz-linear-gradient(top, #577632, #577632);
2106 2106 background-image: -ms-linear-gradient(top, #577632, #577632);
2107 2107 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
2108 2108 background-image: -webkit-linear-gradient(top, #577632, #577632);
2109 2109 background-image: -o-linear-gradient(top, #577632, #577632);
2110 2110 background-image: linear-gradient(to bottom, #577632, #577632);
2111 2111 margin: 0 auto;
2112 2112 padding: 0;
2113 2113 }
2114 2114
2115 2115 #register div.inner {
2116 2116 background: #FFF;
2117 2117 border-top: none;
2118 2118 border-bottom: none;
2119 2119 margin: 0 auto;
2120 2120 padding: 20px;
2121 2121 }
2122 2122
2123 2123 #register div.form div.fields div.field div.label {
2124 2124 width: 135px;
2125 2125 float: left;
2126 2126 text-align: right;
2127 2127 margin: 2px 10px 0 0;
2128 2128 padding: 5px 0 0 5px;
2129 2129 }
2130 2130
2131 2131 #register div.form div.fields div.field div.input input {
2132 2132 width: 300px;
2133 2133 background: #FFF;
2134 2134 border-top: 1px solid #b3b3b3;
2135 2135 border-left: 1px solid #b3b3b3;
2136 2136 border-right: 1px solid #eaeaea;
2137 2137 border-bottom: 1px solid #eaeaea;
2138 2138 color: #000;
2139 2139 font-size: 11px;
2140 2140 margin: 0;
2141 2141 padding: 7px 7px 6px;
2142 2142 }
2143 2143
2144 2144 #register div.form div.fields div.buttons {
2145 2145 clear: both;
2146 2146 overflow: hidden;
2147 2147 border-top: 1px solid #DDD;
2148 2148 text-align: left;
2149 2149 margin: 0;
2150 2150 padding: 10px 0 0 150px;
2151 2151 }
2152 2152
2153 2153 #register div.form div.activation_msg {
2154 2154 padding-top: 4px;
2155 2155 padding-bottom: 4px;
2156 2156 }
2157 2157
2158 2158 #journal .journal_day {
2159 2159 font-size: 20px;
2160 2160 padding: 10px 0px;
2161 2161 border-bottom: 2px solid #DDD;
2162 2162 margin-left: 10px;
2163 2163 margin-right: 10px;
2164 2164 }
2165 2165
2166 2166 #journal .journal_container {
2167 2167 padding: 5px;
2168 2168 clear: both;
2169 2169 margin: 0px 5px 0px 10px;
2170 2170 }
2171 2171
2172 2172 #journal .journal_action_container {
2173 2173 padding-left: 38px;
2174 2174 }
2175 2175
2176 2176 #journal .journal_user {
2177 2177 color: #747474;
2178 2178 font-size: 14px;
2179 2179 font-weight: bold;
2180 2180 height: 30px;
2181 2181 }
2182 2182
2183 2183 #journal .journal_user.deleted {
2184 2184 color: #747474;
2185 2185 font-size: 14px;
2186 2186 font-weight: normal;
2187 2187 height: 30px;
2188 2188 font-style: italic;
2189 2189 }
2190 2190
2191 2191
2192 2192 #journal .journal_icon {
2193 2193 clear: both;
2194 2194 float: left;
2195 2195 padding-right: 4px;
2196 2196 padding-top: 3px;
2197 2197 }
2198 2198
2199 2199 #journal .journal_action {
2200 2200 padding-top: 4px;
2201 2201 min-height: 2px;
2202 2202 float: left
2203 2203 }
2204 2204
2205 2205 #journal .journal_action_params {
2206 2206 clear: left;
2207 2207 padding-left: 22px;
2208 2208 }
2209 2209
2210 2210 #journal .journal_repo {
2211 2211 float: left;
2212 2212 margin-left: 6px;
2213 2213 padding-top: 3px;
2214 2214 }
2215 2215
2216 2216 #journal .date {
2217 2217 clear: both;
2218 2218 color: #777777;
2219 2219 font-size: 11px;
2220 2220 padding-left: 22px;
2221 2221 }
2222 2222
2223 2223 #journal .journal_repo .journal_repo_name {
2224 2224 font-weight: bold;
2225 2225 font-size: 1.1em;
2226 2226 }
2227 2227
2228 2228 #journal .compare_view {
2229 2229 padding: 5px 0px 5px 0px;
2230 2230 width: 95px;
2231 2231 }
2232 2232
2233 2233 .journal_highlight {
2234 2234 font-weight: bold;
2235 2235 padding: 0 2px;
2236 2236 vertical-align: bottom;
2237 2237 }
2238 2238
2239 2239 .trending_language_tbl, .trending_language_tbl td {
2240 2240 border: 0 !important;
2241 2241 margin: 0 !important;
2242 2242 padding: 0 !important;
2243 2243 }
2244 2244
2245 2245 .trending_language_tbl, .trending_language_tbl tr {
2246 2246 border-spacing: 1px;
2247 2247 }
2248 2248
2249 2249 .trending_language {
2250 2250 background-color: #577632;
2251 2251 color: #FFF;
2252 2252 display: block;
2253 2253 min-width: 20px;
2254 2254 text-decoration: none;
2255 2255 height: 12px;
2256 2256 margin-bottom: 0px;
2257 2257 margin-left: 5px;
2258 2258 white-space: pre;
2259 2259 padding: 3px;
2260 2260 }
2261 2261
2262 2262 h3.files_location {
2263 2263 font-size: 1.8em;
2264 2264 font-weight: 700;
2265 2265 border-bottom: none !important;
2266 2266 margin: 10px 0 !important;
2267 2267 }
2268 2268
2269 2269 #files_data dl dt {
2270 2270 float: left;
2271 2271 width: 60px;
2272 2272 margin: 0 !important;
2273 2273 padding: 5px;
2274 2274 }
2275 2275
2276 2276 #files_data dl dd {
2277 2277 margin: 0 !important;
2278 2278 padding: 5px !important;
2279 2279 }
2280 2280
2281 2281 #files_data .codeblock #editor_container .error-message {
2282 2282 color: red;
2283 2283 padding: 10px 10px 10px 26px
2284 2284 }
2285 2285
2286 2286 .file_history {
2287 2287 padding-top: 10px;
2288 2288 font-size: 16px;
2289 2289 }
2290 2290 .file_author {
2291 2291 float: left;
2292 2292 }
2293 2293
2294 2294 .file_author .item {
2295 2295 float: left;
2296 2296 padding: 5px;
2297 2297 color: #888;
2298 2298 }
2299 2299
2300 2300 .tablerow0 {
2301 2301 background-color: #F8F8F8;
2302 2302 }
2303 2303
2304 2304 .tablerow1 {
2305 2305 background-color: #FFFFFF;
2306 2306 }
2307 2307
2308 2308 .changeset_id {
2309 2309 color: #666666;
2310 2310 margin-right: -3px;
2311 2311 }
2312 2312
2313 2313 .changeset_hash {
2314 2314 color: #000000;
2315 2315 }
2316 2316
2317 2317 #changeset_content {
2318 2318 border-left: 1px solid #CCC;
2319 2319 border-right: 1px solid #CCC;
2320 2320 border-bottom: 1px solid #CCC;
2321 2321 padding: 5px;
2322 2322 }
2323 2323
2324 2324 #changeset_compare_view_content {
2325 2325 border: 1px solid #CCC;
2326 2326 padding: 5px;
2327 2327 }
2328 2328
2329 2329 #changeset_content .container {
2330 2330 min-height: 100px;
2331 2331 font-size: 1.2em;
2332 2332 overflow: hidden;
2333 2333 }
2334 2334
2335 2335 #changeset_compare_view_content .compare_view_commits {
2336 2336 width: auto !important;
2337 2337 }
2338 2338
2339 2339 #changeset_compare_view_content .compare_view_commits td {
2340 2340 padding: 0px 0px 0px 12px !important;
2341 2341 }
2342 2342
2343 2343 #changeset_content .container .right {
2344 2344 float: right;
2345 2345 width: 20%;
2346 2346 text-align: right;
2347 2347 }
2348 2348
2349 2349 #changeset_content .container .message {
2350 2350 white-space: pre-wrap;
2351 2351 }
2352 2352 #changeset_content .container .message a:hover {
2353 2353 text-decoration: none;
2354 2354 }
2355 2355 .cs_files .cur_cs {
2356 2356 margin: 10px 2px;
2357 2357 font-weight: bold;
2358 2358 }
2359 2359
2360 2360 .cs_files .node {
2361 2361 float: left;
2362 2362 }
2363 2363
2364 2364 .cs_files .changes {
2365 2365 float: right;
2366 2366 color: #577632;
2367 2367 }
2368 2368
2369 2369 .cs_files .changes .added {
2370 2370 background-color: #BBFFBB;
2371 2371 float: left;
2372 2372 text-align: center;
2373 2373 font-size: 9px;
2374 2374 padding: 2px 0px 2px 0px;
2375 2375 }
2376 2376
2377 2377 .cs_files .changes .deleted {
2378 2378 background-color: #FF8888;
2379 2379 float: left;
2380 2380 text-align: center;
2381 2381 font-size: 9px;
2382 2382 padding: 2px 0px 2px 0px;
2383 2383 }
2384 2384 /*new binary
2385 2385 NEW_FILENODE = 1
2386 2386 DEL_FILENODE = 2
2387 2387 MOD_FILENODE = 3
2388 2388 RENAMED_FILENODE = 4
2389 2389 CHMOD_FILENODE = 5
2390 2390 BIN_FILENODE = 6
2391 2391 */
2392 2392 .cs_files .changes .bin {
2393 2393 background-color: #BBFFBB;
2394 2394 float: left;
2395 2395 text-align: center;
2396 2396 font-size: 9px;
2397 2397 padding: 2px 0px 2px 0px;
2398 2398 }
2399 2399 .cs_files .changes .bin.bin1 {
2400 2400 background-color: #BBFFBB;
2401 2401 }
2402 2402
2403 2403 /*deleted binary*/
2404 2404 .cs_files .changes .bin.bin2 {
2405 2405 background-color: #FF8888;
2406 2406 }
2407 2407
2408 2408 /*mod binary*/
2409 2409 .cs_files .changes .bin.bin3 {
2410 2410 background-color: #DDDDDD;
2411 2411 }
2412 2412
2413 2413 /*rename file*/
2414 2414 .cs_files .changes .bin.bin4 {
2415 2415 background-color: #6D99FF;
2416 2416 }
2417 2417
2418 2418 /*rename file*/
2419 2419 .cs_files .changes .bin.bin4 {
2420 2420 background-color: #6D99FF;
2421 2421 }
2422 2422
2423 2423 /*chmod file*/
2424 2424 .cs_files .changes .bin.bin5 {
2425 2425 background-color: #6D99FF;
2426 2426 }
2427 2427
2428 2428 .cs_files .cs_added,
2429 2429 .cs_files .cs_A {
2430 2430 height: 16px;
2431 2431 margin-top: 7px;
2432 2432 text-align: left;
2433 2433 }
2434 2434
2435 2435 .cs_files .cs_changed,
2436 2436 .cs_files .cs_M {
2437 2437 height: 16px;
2438 2438 margin-top: 7px;
2439 2439 text-align: left;
2440 2440 }
2441 2441
2442 2442 .cs_files .cs_removed,
2443 2443 .cs_files .cs_D {
2444 2444 height: 16px;
2445 2445 margin-top: 7px;
2446 2446 text-align: left;
2447 2447 }
2448 2448
2449 2449 .cs_files .cs_renamed,
2450 2450 .cs_files .cs_R {
2451 2451 height: 16px;
2452 2452 margin-top: 7px;
2453 2453 text-align: left;
2454 2454 }
2455 2455
2456 2456 .table {
2457 2457 position: relative;
2458 2458 }
2459 2459
2460 2460 #graph {
2461 2461 position: relative;
2462 2462 overflow: hidden;
2463 2463 }
2464 2464
2465 2465 #graph_nodes {
2466 2466 position: absolute;
2467 2467 }
2468 2468
2469 2469 #graph_content,
2470 2470 #graph .info_box,
2471 2471 #graph .container_header {
2472 2472 margin-left: 100px;
2473 2473 }
2474 2474
2475 2475 #graph_content {
2476 2476 position: relative;
2477 2477 }
2478 2478
2479 2479 #graph .container_header {
2480 2480 padding: 10px;
2481 2481 height: 25px;
2482 2482 }
2483 2483
2484 2484 #graph_content #rev_range_container {
2485 2485 float: left;
2486 2486 margin: 0px 0px 0px 3px;
2487 2487 }
2488 2488
2489 2489 #graph_content #rev_range_clear {
2490 2490 float: left;
2491 2491 margin: 0px 0px 0px 3px;
2492 2492 }
2493 2493
2494 2494 #graph_content #changesets {
2495 2495 table-layout: fixed;
2496 2496 border-collapse: collapse;
2497 2497 border-left: none;
2498 2498 border-right: none;
2499 2499 border-color: #cdcdcd;
2500 2500 }
2501 2501
2502 2502 #graph_content #changesets td {
2503 2503 overflow: hidden;
2504 2504 text-overflow: ellipsis;
2505 2505 white-space: nowrap;
2506 2506 height: 31px;
2507 2507 border-color: #cdcdcd;
2508 2508 text-align: left;
2509 2509 }
2510 2510
2511 2511 #graph_content .container .checkbox {
2512 2512 width: 12px;
2513 2513 font-size: 0.85em;
2514 2514 }
2515 2515
2516 2516 #graph_content .container .status {
2517 2517 width: 14px;
2518 2518 font-size: 0.85em;
2519 2519 }
2520 2520
2521 2521 #graph_content .container .author {
2522 2522 width: 105px;
2523 2523 }
2524 2524
2525 2525 #graph_content .container .hash {
2526 2526 width: 100px;
2527 2527 font-size: 0.85em;
2528 2528 }
2529 2529
2530 2530 #graph_content #changesets .container .date {
2531 2531 width: 76px;
2532 2532 color: #666;
2533 2533 font-size: 10px;
2534 2534 }
2535 2535
2536 2536 #graph_content_pr .compare_view_commits .expand_commit,
2537 2537 #graph_content .container .expand_commit {
2538 2538 width: 24px;
2539 2539 cursor: pointer;
2540 2540 }
2541 2541
2542 2542 #graph_content #changesets .container .right {
2543 2543 width: 120px;
2544 2544 padding-right: 0px;
2545 2545 overflow: visible;
2546 2546 position: relative;
2547 2547 }
2548 2548
2549 2549 #graph_content .container .mid {
2550 2550 padding: 0;
2551 2551 }
2552 2552
2553 2553 #graph_content .log-container {
2554 2554 position: relative;
2555 2555 }
2556 2556
2557 2557 #graph_content .container .changeset_range {
2558 2558 float: left;
2559 2559 margin: 6px 3px;
2560 2560 }
2561 2561
2562 2562 #graph_content .container .author img {
2563 2563 vertical-align: middle;
2564 2564 }
2565 2565
2566 2566 #graph_content .container .author .user {
2567 2567 color: #444444;
2568 2568 }
2569 2569
2570 2570 #graph_content .container .mid .message {
2571 2571 white-space: pre-wrap;
2572 2572 padding: 0;
2573 2573 overflow: hidden;
2574 2574 height: 1.1em;
2575 2575 }
2576 2576
2577 2577 #graph_content_pr .compare_view_commits .message {
2578 2578 padding: 0 !important;
2579 2579 height: 1.1em;
2580 2580 }
2581 2581
2582 2582 #graph_content .container .mid .message.expanded,
2583 2583 #graph_content_pr .compare_view_commits .message.expanded {
2584 2584 height: auto;
2585 2585 margin: 8px 0px 8px 0px;
2586 2586 overflow: initial;
2587 2587 }
2588 2588
2589 2589 #graph_content .container .extra-container {
2590 2590 display: block;
2591 2591 position: absolute;
2592 2592 top: -15px;
2593 2593 right: 0;
2594 2594 padding-left: 5px;
2595 2595 background: #FFFFFF;
2596 2596 height: 41px;
2597 2597 }
2598 2598
2599 2599 #pull_request_overview .comments-container,
2600 2600 #changeset_compare_view_content .comments-container,
2601 2601 #graph_content .comments-container,
2602 2602 #shortlog_data .comments-container,
2603 2603 #graph_content .logtags {
2604 2604 display: block;
2605 2605 float: left;
2606 2606 overflow: hidden;
2607 2607 padding: 0;
2608 2608 margin: 0;
2609 2609 white-space: nowrap;
2610 2610 }
2611 2611
2612 2612 #graph_content .comments-container {
2613 2613 margin: 0.8em 0;
2614 2614 margin-right: 0.5em;
2615 2615 }
2616 2616
2617 2617 #graph_content .tagcontainer {
2618 2618 width: 80px;
2619 2619 position: relative;
2620 2620 float: right;
2621 2621 height: 100%;
2622 2622 top: 7px;
2623 2623 margin-left: 0.5em;
2624 2624 }
2625 2625
2626 2626 #graph_content .logtags {
2627 2627 min-width: 80px;
2628 2628 height: 1.1em;
2629 2629 position: absolute;
2630 2630 left: 0px;
2631 2631 width: auto;
2632 2632 top: 0px;
2633 2633 }
2634 2634
2635 2635 #graph_content .logtags.tags {
2636 2636 top: 14px;
2637 2637 }
2638 2638
2639 2639 #graph_content .logtags:hover {
2640 2640 overflow: visible;
2641 2641 position: absolute;
2642 2642 width: auto;
2643 2643 right: 0;
2644 2644 left: initial;
2645 2645 }
2646 2646
2647 2647 #graph_content .logtags .booktag,
2648 2648 #graph_content .logtags .tagtag {
2649 2649 float: left;
2650 2650 line-height: 1em;
2651 2651 margin-bottom: 1px;
2652 2652 margin-right: 1px;
2653 2653 padding: 1px 3px;
2654 2654 font-size: 10px;
2655 2655 }
2656 2656
2657 2657 #graph_content .container .mid .message a:hover {
2658 2658 text-decoration: none;
2659 2659 }
2660 2660
2661 2661 #compare_branches + .table .revision-link,
2662 2662 #compare_tags + .table .revision-link,
2663 2663 #compare_bookmarks + .table .revision-link,
2664 2664 .table #files_data .revision-link,
2665 2665 #repos_list_wrap .revision-link,
2666 2666 #shortlog_data .revision-link {
2667 2667 font-weight: normal !important;
2668 2668 font-family: monospace;
2669 2669 font-size: 12px;
2670 2670 color: #577632;
2671 2671 }
2672 2672
2673 2673 .revision-link {
2674 2674 color: #3F6F9F;
2675 2675 font-weight: bold !important;
2676 2676 }
2677 2677
2678 2678 .issue-tracker-link {
2679 2679 color: #3F6F9F;
2680 2680 font-weight: bold !important;
2681 2681 }
2682 2682
2683 2683 .changeset-status-container {
2684 2684 padding-right: 5px;
2685 2685 margin-top: 1px;
2686 2686 float: right;
2687 2687 height: 14px;
2688 2688 }
2689 2689 .code-header .changeset-status-container {
2690 2690 float: left;
2691 2691 padding: 2px 0px 0px 2px;
2692 2692 }
2693 2693 .changeset-status-container .changeset-status-lbl {
2694 2694 float: left;
2695 2695 padding: 3px 4px 0px 0px
2696 2696 }
2697 2697 .code-header .changeset-status-container .changeset-status-lbl {
2698 2698 float: left;
2699 2699 padding: 0px 4px 0px 0px;
2700 2700 }
2701 2701 .changeset-status-container .changeset-status-ico {
2702 2702 float: left;
2703 2703 }
2704 2704 .code-header .changeset-status-container .changeset-status-ico,
2705 2705 .container .changeset-status-ico {
2706 2706 float: left;
2707 2707 }
2708 2708
2709 2709 /* changeset statuses (must be the same name as the status) */
2710 2710 .changeset-status-not_reviewed {
2711 2711 color: #bababa;
2712 2712 }
2713 2713 .changeset-status-approved {
2714 2714 color: #81ba51;
2715 2715 }
2716 2716 .changeset-status-rejected {
2717 2717 color: #cc392e;
2718 2718 }
2719 2719 .changeset-status-under_review {
2720 2720 color: #ffc71e;
2721 2721 }
2722 2722
2723 2723 #graph_content .comments-cnt {
2724 2724 color: rgb(136, 136, 136);
2725 2725 padding: 5px 0;
2726 2726 }
2727 2727
2728 2728 #shortlog_data .comments-cnt {
2729 2729 color: rgb(136, 136, 136);
2730 2730 padding: 3px 0;
2731 2731 }
2732 2732
2733 2733 .right .changes {
2734 2734 clear: both;
2735 2735 }
2736 2736
2737 2737 .right .changes .changed_total {
2738 2738 display: block;
2739 2739 float: right;
2740 2740 text-align: center;
2741 2741 min-width: 45px;
2742 2742 cursor: pointer;
2743 2743 color: #444444;
2744 2744 background: #FEA;
2745 2745 -webkit-border-radius: 0px 0px 0px 6px;
2746 2746 border-radius: 0px 0px 0px 6px;
2747 2747 padding: 1px;
2748 2748 }
2749 2749
2750 2750 .right .changes .added,
2751 2751 .changed, .removed {
2752 2752 display: block;
2753 2753 padding: 1px;
2754 2754 color: #444444;
2755 2755 float: right;
2756 2756 text-align: center;
2757 2757 min-width: 15px;
2758 2758 }
2759 2759
2760 2760 .right .changes .added {
2761 2761 background: #CFC;
2762 2762 }
2763 2763
2764 2764 .right .changes .changed {
2765 2765 background: #FEA;
2766 2766 }
2767 2767
2768 2768 .right .changes .removed {
2769 2769 background: #FAA;
2770 2770 }
2771 2771
2772 2772 .right .merge {
2773 2773 padding: 1px 3px 1px 3px;
2774 2774 background-color: #fca062;
2775 2775 font-size: 10px;
2776 2776 color: #ffffff;
2777 2777 text-transform: uppercase;
2778 2778 white-space: nowrap;
2779 2779 -webkit-border-radius: 3px;
2780 2780 border-radius: 3px;
2781 2781 margin-right: 2px;
2782 2782 }
2783 2783
2784 2784 .right .parent {
2785 2785 color: #666666;
2786 2786 clear: both;
2787 2787 }
2788 2788 .right .logtags {
2789 2789 line-height: 2.2em;
2790 2790 }
2791 2791 .repotag, .branchtag, .logtags .tagtag, .logtags .booktag {
2792 2792 margin: 0px 2px;
2793 2793 }
2794 2794
2795 2795 .repotag,
2796 2796 .branchtag,
2797 2797 .tagtag,
2798 2798 .booktag,
2799 2799 .spantag {
2800 2800 padding: 1px 3px 1px 3px;
2801 2801 font-size: 10px;
2802 2802 color: #577632;
2803 2803 white-space: nowrap;
2804 2804 -webkit-border-radius: 4px;
2805 2805 border-radius: 4px;
2806 2806 border: 1px solid #d9e8f8;
2807 2807 line-height: 1.5em;
2808 2808 }
2809 2809
2810 2810 #graph_content .branchtag,
2811 2811 #graph_content .tagtag,
2812 2812 #graph_content .booktag {
2813 2813 margin: 1.1em 0;
2814 2814 margin-right: 0.5em;
2815 2815 }
2816 2816
2817 2817 .repotag,
2818 2818 .branchtag,
2819 2819 .tagtag,
2820 2820 .booktag {
2821 2821 float: left;
2822 2822 }
2823 2823
2824 2824 .right .logtags .branchtag,
2825 2825 .right .logtags .tagtag,
2826 2826 .right .logtags .booktag,
2827 2827 .right .merge {
2828 2828 float: right;
2829 2829 line-height: 1em;
2830 2830 margin: 1px 1px !important;
2831 2831 display: block;
2832 2832 }
2833 2833
2834 2834 .repotag {
2835 2835 border-color: #56A546;
2836 2836 color: #46A546;
2837 2837 font-size: 8px;
2838 2838 text-transform: uppercase;
2839 2839 }
2840 2840
2841 2841 #context-bar .repotag,
2842 2842 .repo-icons .repotag {
2843 2843 border-color: white;
2844 2844 color: white;
2845 2845 margin-top: 3px;
2846 2846 }
2847 2847
2848 2848 .repo-icons .repotag {
2849 2849 margin-top: 0px;
2850 2850 padding-top: 0px;
2851 2851 padding-bottom: 0px;
2852 2852 }
2853 2853
2854 2854 .booktag {
2855 2855 border-color: #46A546;
2856 2856 color: #46A546;
2857 2857 }
2858 2858
2859 2859 .tagtag {
2860 2860 border-color: #62cffc;
2861 2861 color: #62cffc;
2862 2862 }
2863 2863
2864 2864 .logtags .branchtag a:hover,
2865 2865 .logtags .branchtag a,
2866 2866 .branchtag a,
2867 2867 .branchtag a:hover {
2868 2868 text-decoration: none;
2869 2869 color: inherit;
2870 2870 }
2871 2871 .logtags .tagtag {
2872 2872 padding: 1px 3px 1px 3px;
2873 2873 background-color: #62cffc;
2874 2874 font-size: 10px;
2875 2875 color: #ffffff;
2876 2876 white-space: nowrap;
2877 2877 -webkit-border-radius: 3px;
2878 2878 border-radius: 3px;
2879 2879 }
2880 2880
2881 2881 .tagtag a,
2882 2882 .tagtag a:hover,
2883 2883 .logtags .tagtag a,
2884 2884 .logtags .tagtag a:hover {
2885 2885 text-decoration: none;
2886 2886 color: inherit;
2887 2887 }
2888 2888 .logbooks .booktag,
2889 2889 .logbooks .booktag,
2890 2890 .logtags .booktag,
2891 2891 .logtags .booktag {
2892 2892 padding: 1px 3px 1px 3px;
2893 2893 background-color: #46A546;
2894 2894 font-size: 10px;
2895 2895 color: #ffffff;
2896 2896 white-space: nowrap;
2897 2897 -webkit-border-radius: 3px;
2898 2898 border-radius: 3px;
2899 2899 }
2900 2900 .logbooks .booktag,
2901 2901 .logbooks .booktag a,
2902 2902 .right .logtags .booktag,
2903 2903 .logtags .booktag a {
2904 2904 color: #ffffff;
2905 2905 }
2906 2906
2907 2907 .logbooks .booktag,
2908 2908 .logbooks .booktag a:hover,
2909 2909 .logtags .booktag,
2910 2910 .logtags .booktag a:hover,
2911 2911 .booktag a,
2912 2912 .booktag a:hover {
2913 2913 text-decoration: none;
2914 2914 color: inherit;
2915 2915 }
2916 2916 div.browserblock {
2917 2917 overflow: hidden;
2918 2918 border: 1px solid #ccc;
2919 2919 background: #f8f8f8;
2920 2920 font-size: 100%;
2921 2921 line-height: 125%;
2922 2922 padding: 0;
2923 2923 -webkit-border-radius: 6px 6px 0px 0px;
2924 2924 border-radius: 6px 6px 0px 0px;
2925 2925 }
2926 2926
2927 2927 div.browserblock .browser-header {
2928 2928 background: #FFF;
2929 2929 padding: 10px 0px 15px 0px;
2930 2930 width: 100%;
2931 2931 }
2932 2932
2933 2933 div.browserblock .browser-nav {
2934 2934 float: left
2935 2935 }
2936 2936
2937 2937 div.browserblock .browser-branch {
2938 2938 float: left;
2939 2939 }
2940 2940
2941 2941 div.browserblock .browser-branch label {
2942 2942 color: #4A4A4A;
2943 2943 vertical-align: text-top;
2944 2944 padding-right: 2px;
2945 2945 }
2946 2946
2947 2947 div.browserblock .browser-header span {
2948 2948 margin-left: 5px;
2949 2949 font-weight: 700;
2950 2950 }
2951 2951
2952 2952 div.browserblock .browser-search {
2953 2953 clear: both;
2954 2954 padding: 8px 8px 0px 5px;
2955 2955 height: 20px;
2956 2956 }
2957 2957
2958 2958 div.browserblock #node_filter_box {
2959 2959 }
2960 2960
2961 2961 div.browserblock .search_activate {
2962 2962 float: left
2963 2963 }
2964 2964
2965 2965 div.browserblock .add_node {
2966 2966 float: left;
2967 2967 padding-left: 5px;
2968 2968 }
2969 2969
2970 2970 div.browserblock .search_activate a:hover,
2971 2971 div.browserblock .add_node a:hover {
2972 2972 text-decoration: none !important;
2973 2973 }
2974 2974
2975 2975 div.browserblock .browser-body {
2976 2976 background: #EEE;
2977 2977 border-top: 1px solid #CCC;
2978 2978 }
2979 2979
2980 2980 table.code-browser {
2981 2981 border-collapse: collapse;
2982 2982 width: 100%;
2983 2983 }
2984 2984
2985 2985 table.code-browser tr {
2986 2986 margin: 3px;
2987 2987 }
2988 2988
2989 2989 table.code-browser thead th {
2990 2990 background-color: #EEE;
2991 2991 height: 20px;
2992 2992 font-size: 1.1em;
2993 2993 font-weight: 700;
2994 2994 text-align: left;
2995 2995 padding-left: 10px;
2996 2996 }
2997 2997
2998 2998 table.code-browser tbody td {
2999 2999 padding-left: 10px;
3000 3000 height: 20px;
3001 3001 }
3002 3002
3003 3003 table.code-browser .browser-file {
3004 3004 height: 16px;
3005 3005 padding-left: 5px;
3006 3006 text-align: left;
3007 3007 }
3008 3008 .diffblock .changeset_header {
3009 3009 height: 16px;
3010 3010 }
3011 3011 .diffblock .changeset_file {
3012 3012 float: left;
3013 3013 }
3014 3014 .diffblock .diff-menu-wrapper {
3015 3015 float: left;
3016 3016 }
3017 3017
3018 3018 .diffblock .diff-menu {
3019 3019 position: absolute;
3020 3020 background: none repeat scroll 0 0 #FFFFFF;
3021 3021 border-color: #577632 #666666 #666666;
3022 3022 border-right: 1px solid #666666;
3023 3023 border-style: solid solid solid;
3024 3024 border-width: 1px;
3025 3025 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
3026 3026 margin-top: 5px;
3027 3027 margin-left: 1px;
3028 3028
3029 3029 }
3030 3030 .diffblock .diff-actions {
3031 3031 padding: 2px 0px 0px 2px;
3032 3032 float: left;
3033 3033 }
3034 3034 .diffblock .diff-menu ul li {
3035 3035 padding: 0px 0px 0px 0px !important;
3036 3036 }
3037 3037 .diffblock .diff-menu ul li a {
3038 3038 display: block;
3039 3039 padding: 3px 8px 3px 8px !important;
3040 3040 }
3041 3041 .diffblock .diff-menu ul li a:hover {
3042 3042 text-decoration: none;
3043 3043 background-color: #EEEEEE;
3044 3044 }
3045 3045 table.code-browser .browser-dir {
3046 3046 height: 16px;
3047 3047 padding-left: 5px;
3048 3048 text-align: left;
3049 3049 }
3050 3050
3051 3051 table.code-browser .submodule-dir {
3052 3052 height: 16px;
3053 3053 padding-left: 5px;
3054 3054 text-align: left;
3055 3055 }
3056 3056
3057 3057 /* add some padding to the right of the file, folder, or submodule icon and
3058 3058 before the text */
3059 3059 table.code-browser i[class^='icon-'] {
3060 3060 padding-right: .3em;
3061 3061 }
3062 3062
3063 3063 .box .search {
3064 3064 clear: both;
3065 3065 overflow: hidden;
3066 3066 margin: 0;
3067 3067 padding: 0 20px 10px;
3068 3068 }
3069 3069
3070 3070 .box .search div.search_path {
3071 3071 background: none repeat scroll 0 0 #EEE;
3072 3072 border: 1px solid #CCC;
3073 3073 color: blue;
3074 3074 margin-bottom: 10px;
3075 3075 padding: 10px 0;
3076 3076 }
3077 3077
3078 3078 .box .search div.search_path div.link {
3079 3079 font-weight: 700;
3080 3080 margin-left: 25px;
3081 3081 }
3082 3082
3083 3083 .box .search div.search_path div.link a {
3084 3084 color: #577632;
3085 3085 cursor: pointer;
3086 3086 text-decoration: none;
3087 3087 }
3088 3088
3089 3089 #path_unlock {
3090 3090 color: red;
3091 3091 font-size: 1.2em;
3092 3092 padding-left: 4px;
3093 3093 }
3094 3094
3095 3095 .info_box span {
3096 3096 margin-left: 3px;
3097 3097 margin-right: 3px;
3098 3098 }
3099 3099
3100 3100 .info_box .rev {
3101 3101 color: #577632;
3102 3102 font-size: 1.6em;
3103 3103 font-weight: bold;
3104 3104 vertical-align: sub;
3105 3105 }
3106 3106
3107 3107 .info_box input#at_rev,
3108 3108 .info_box input#size {
3109 3109 background: #FFF;
3110 3110 border-top: 1px solid #b3b3b3;
3111 3111 border-left: 1px solid #b3b3b3;
3112 3112 border-right: 1px solid #eaeaea;
3113 3113 border-bottom: 1px solid #eaeaea;
3114 3114 color: #000;
3115 3115 font-size: 12px;
3116 3116 margin: 0;
3117 3117 padding: 1px 5px 1px;
3118 3118 }
3119 3119
3120 3120 .info_box input#view {
3121 3121 text-align: center;
3122 3122 padding: 4px 3px 2px 2px;
3123 3123 }
3124 3124
3125 3125 .info_box_elem {
3126 3126 display: inline-block;
3127 3127 padding: 0 2px;
3128 3128 }
3129 3129
3130 3130 .yui-overlay, .yui-panel-container {
3131 3131 visibility: hidden;
3132 3132 position: absolute;
3133 3133 z-index: 2;
3134 3134 }
3135 3135
3136 3136 #tip-box {
3137 3137 position: absolute;
3138 3138
3139 3139 background-color: #FFF;
3140 3140 border: 2px solid #577632;
3141 3141 font: 100% sans-serif;
3142 3142 width: auto;
3143 3143 opacity: 1;
3144 3144 padding: 8px;
3145 3145
3146 3146 white-space: pre-wrap;
3147 3147 -webkit-border-radius: 8px 8px 8px 8px;
3148 3148 -khtml-border-radius: 8px 8px 8px 8px;
3149 3149 border-radius: 8px 8px 8px 8px;
3150 3150 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3151 3151 -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3152 3152 z-index: 100000;
3153 3153 }
3154 3154
3155 3155 .hl-tip-box {
3156 3156 z-index: 1;
3157 3157 position: absolute;
3158 3158 color: #666;
3159 3159 background-color: #FFF;
3160 3160 border: 2px solid #577632;
3161 3161 font: 100% sans-serif;
3162 3162 width: auto;
3163 3163 opacity: 1;
3164 3164 padding: 8px;
3165 3165 white-space: pre-wrap;
3166 3166 -webkit-border-radius: 8px 8px 8px 8px;
3167 3167 -khtml-border-radius: 8px 8px 8px 8px;
3168 3168 border-radius: 8px 8px 8px 8px;
3169 3169 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3170 3170 }
3171 3171
3172 3172
3173 3173 .mentions-container {
3174 3174 width: 90% !important;
3175 3175 }
3176 3176 .mentions-container .yui-ac-content {
3177 3177 width: 100% !important;
3178 3178 }
3179 3179
3180 3180 .ac {
3181 3181 vertical-align: top;
3182 3182 }
3183 3183
3184 3184 .ac .yui-ac {
3185 3185 position: inherit;
3186 3186 font-size: 100%;
3187 3187 }
3188 3188
3189 3189 .ac .perm_ac {
3190 3190 width: 20em;
3191 3191 }
3192 3192
3193 3193 .ac .yui-ac-input {
3194 3194 width: 100%;
3195 3195 }
3196 3196
3197 3197 .ac .yui-ac-container {
3198 3198 position: absolute;
3199 3199 top: 1.6em;
3200 3200 width: auto;
3201 3201 }
3202 3202
3203 3203 .ac .yui-ac-content {
3204 3204 position: absolute;
3205 3205 border: 1px solid gray;
3206 3206 background: #fff;
3207 3207 z-index: 9050;
3208 3208 }
3209 3209
3210 3210 .ac .yui-ac-shadow {
3211 3211 position: absolute;
3212 3212 width: 100%;
3213 3213 background: #000;
3214 3214 opacity: .10;
3215 3215 filter: alpha(opacity = 10);
3216 3216 z-index: 9049;
3217 3217 margin: .3em;
3218 3218 }
3219 3219
3220 3220 .ac .yui-ac-content ul {
3221 3221 width: 100%;
3222 3222 margin: 0;
3223 3223 padding: 0;
3224 3224 z-index: 9050;
3225 3225 }
3226 3226
3227 3227 .ac .yui-ac-content li {
3228 3228 cursor: default;
3229 3229 white-space: nowrap;
3230 3230 margin: 0;
3231 3231 padding: 2px 5px;
3232 3232 height: 18px;
3233 3233 z-index: 9050;
3234 3234 display: block;
3235 3235 width: auto !important;
3236 3236 }
3237 3237
3238 3238 .ac .yui-ac-content li .ac-container-wrap {
3239 3239 width: auto;
3240 3240 }
3241 3241
3242 3242 .ac .yui-ac-content li.yui-ac-prehighlight {
3243 3243 background: #B3D4FF;
3244 3244 z-index: 9050;
3245 3245 }
3246 3246
3247 3247 .ac .yui-ac-content li.yui-ac-highlight {
3248 3248 background: #556CB5;
3249 3249 color: #FFF;
3250 3250 z-index: 9050;
3251 3251 }
3252 3252 .ac .yui-ac-bd {
3253 3253 z-index: 9050;
3254 3254 }
3255 3255
3256 3256 #repo_size {
3257 3257 display: block;
3258 3258 margin-top: 4px;
3259 3259 color: #666;
3260 3260 float: right;
3261 3261 }
3262 3262
3263 3263 .currently_following {
3264 3264 padding-left: 10px;
3265 3265 padding-bottom: 5px;
3266 3266 }
3267 3267
3268 3268 .action_button {
3269 3269 border: 0;
3270 3270 display: inline;
3271 3271 }
3272 3272
3273 3273 .action_button:hover {
3274 3274 border: 0;
3275 3275 text-decoration: underline;
3276 3276 cursor: pointer;
3277 3277 }
3278 3278
3279 3279 #switch_repos {
3280 3280 position: absolute;
3281 3281 height: 25px;
3282 3282 z-index: 1;
3283 3283 }
3284 3284
3285 3285 #switch_repos select {
3286 3286 min-width: 150px;
3287 3287 max-height: 250px;
3288 3288 z-index: 1;
3289 3289 }
3290 3290
3291 3291 .breadcrumbs {
3292 3292 border: medium none;
3293 3293 color: #FFF;
3294 3294 float: left;
3295 3295 font-weight: 700;
3296 3296 font-size: 14px;
3297 3297 margin: 0;
3298 3298 padding: 11px 0 11px 10px;
3299 3299 }
3300 3300
3301 3301 .breadcrumbs .hash {
3302 3302 text-transform: none;
3303 3303 color: #fff;
3304 3304 }
3305 3305
3306 3306 .breadcrumbs a {
3307 3307 color: #FFF;
3308 3308 }
3309 3309
3310 3310 .flash_msg {
3311 3311 }
3312 3312
3313 3313 .flash_msg ul {
3314 3314 }
3315 3315
3316 3316 .error_red {
3317 3317 color: red;
3318 3318 }
3319 3319
3320 3320 .flash_msg .alert-error {
3321 3321 background-color: #c43c35;
3322 3322 background-repeat: repeat-x;
3323 3323 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35) );
3324 3324 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3325 3325 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3326 3326 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35) );
3327 3327 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3328 3328 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3329 3329 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3330 3330 border-color: #c43c35 #c43c35 #882a25;
3331 3331 }
3332 3332
3333 3333 .flash_msg .alert-error a {
3334 3334 text-decoration: underline;
3335 3335 }
3336 3336
3337 3337 .flash_msg .alert-warning {
3338 3338 color: #404040 !important;
3339 3339 background-color: #eedc94;
3340 3340 background-repeat: repeat-x;
3341 3341 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
3342 3342 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3343 3343 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3344 3344 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94) );
3345 3345 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3346 3346 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3347 3347 background-image: linear-gradient(to bottom, #fceec1, #eedc94);
3348 3348 border-color: #eedc94 #eedc94 #e4c652;
3349 3349 }
3350 3350
3351 3351 .flash_msg .alert-warning a {
3352 3352 text-decoration: underline;
3353 3353 }
3354 3354
3355 3355 .flash_msg .alert-success {
3356 3356 background-color: #57a957;
3357 3357 background-repeat: repeat-x !important;
3358 3358 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957) );
3359 3359 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3360 3360 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3361 3361 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957) );
3362 3362 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3363 3363 background-image: -o-linear-gradient(top, #62c462, #57a957);
3364 3364 background-image: linear-gradient(to bottom, #62c462, #57a957);
3365 3365 border-color: #57a957 #57a957 #3d773d;
3366 3366 }
3367 3367
3368 3368 .flash_msg .alert-success a {
3369 3369 text-decoration: underline;
3370 3370 color: #FFF !important;
3371 3371 }
3372 3372
3373 3373 .flash_msg .alert-info {
3374 3374 background-color: #339bb9;
3375 3375 background-repeat: repeat-x;
3376 3376 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9) );
3377 3377 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3378 3378 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3379 3379 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9) );
3380 3380 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3381 3381 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3382 3382 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3383 3383 border-color: #339bb9 #339bb9 #22697d;
3384 3384 }
3385 3385
3386 3386 .flash_msg .alert-info a {
3387 3387 text-decoration: underline;
3388 3388 }
3389 3389
3390 3390 .flash_msg .alert-error,
3391 3391 .flash_msg .alert-warning,
3392 3392 .flash_msg .alert-success,
3393 3393 .flash_msg .alert-info {
3394 3394 font-size: 12px;
3395 3395 font-weight: 700;
3396 3396 min-height: 14px;
3397 3397 line-height: 14px;
3398 3398 margin-bottom: 10px;
3399 3399 margin-top: 0;
3400 3400 display: block;
3401 3401 overflow: auto;
3402 3402 padding: 6px 10px 6px 10px;
3403 3403 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3404 3404 position: relative;
3405 3405 color: #FFF;
3406 3406 border-width: 1px;
3407 3407 border-style: solid;
3408 3408 -webkit-border-radius: 4px;
3409 3409 border-radius: 4px;
3410 3410 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3411 3411 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3412 3412 }
3413 3413
3414 3414 div#legend_data {
3415 3415 padding-left: 10px;
3416 3416 }
3417 3417 div#legend_container table {
3418 3418 border: none !important;
3419 3419 }
3420 3420 div#legend_container table,
3421 3421 div#legend_choices table {
3422 3422 width: auto !important;
3423 3423 }
3424 3424
3425 3425 table#permissions_manage {
3426 3426 width: 0 !important;
3427 3427 }
3428 3428
3429 3429 table#permissions_manage span.private_repo_msg {
3430 3430 font-size: 0.8em;
3431 3431 opacity: 0.6;
3432 3432 }
3433 3433
3434 3434 table#permissions_manage td.private_repo_msg {
3435 3435 font-size: 0.8em;
3436 3436 }
3437 3437
3438 3438 table#permissions_manage tr#add_perm_input td {
3439 3439 vertical-align: middle;
3440 3440 }
3441 3441
3442 3442 div.gravatar {
3443 3443 background-color: #FFF;
3444 3444 float: left;
3445 3445 margin-right: 0.7em;
3446 3446 padding: 1px 1px 1px 1px;
3447 3447 line-height: 0;
3448 3448 -webkit-border-radius: 3px;
3449 3449 -khtml-border-radius: 3px;
3450 3450 border-radius: 3px;
3451 3451 }
3452 3452
3453 3453 div.gravatar img {
3454 3454 -webkit-border-radius: 2px;
3455 3455 -khtml-border-radius: 2px;
3456 3456 border-radius: 2px;
3457 3457 }
3458 3458
3459 3459 #header, #content, #footer {
3460 3460 min-width: 978px;
3461 3461 }
3462 3462
3463 3463 #content {
3464 3464 clear: both;
3465 3465 padding: 10px 10px 14px 10px;
3466 3466 }
3467 3467
3468 3468 #content.hover {
3469 3469 padding: 55px 10px 14px 10px !important;
3470 3470 }
3471 3471
3472 3472 #content div.box div.title div.search {
3473 3473 border-left: 1px solid #576622;
3474 3474 }
3475 3475
3476 3476 #content div.box div.title div.search div.input input {
3477 3477 border: 1px solid #576622;
3478 3478 }
3479 3479
3480 3480 .btn {
3481 3481 color: #515151;
3482 3482 background-color: #DADADA;
3483 3483 background-repeat: repeat-x;
3484 3484 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3485 3485 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3486 3486 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3487 3487 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3488 3488 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA);
3489 3489 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA);
3490 3490 background-image: linear-gradient(to bottom, #F4F4F4, #DADADA);
3491 3491
3492 3492 border-top: 1px solid #DDD;
3493 3493 border-left: 1px solid #c6c6c6;
3494 3494 border-right: 1px solid #DDD;
3495 3495 border-bottom: 1px solid #c6c6c6;
3496 3496 outline: none;
3497 3497 margin: 0px 3px 3px 0px;
3498 3498 -webkit-border-radius: 4px 4px 4px 4px !important;
3499 3499 -khtml-border-radius: 4px 4px 4px 4px !important;
3500 3500 border-radius: 4px 4px 4px 4px !important;
3501 3501 cursor: pointer !important;
3502 3502 padding: 3px 3px 3px 3px;
3503 3503 display: inline-block;
3504 3504 }
3505 3505
3506 3506 ul.nav-stacked {
3507 3507 margin: 20px;
3508 3508 color: #393939;
3509 3509 font-weight: 700;
3510 3510 }
3511 3511
3512 3512 ul.nav-stacked a {
3513 3513 color: inherit;
3514 3514 }
3515 3515
3516 3516 /* make .btn inputs and buttons and divs look the same */
3517 3517 button.btn,
3518 3518 input.btn {
3519 3519 font-family: inherit;
3520 3520 font-size: inherit;
3521 3521 line-height: inherit;
3522 3522 }
3523 3523
3524 3524 .btn::-moz-focus-inner {
3525 3525 border: 0;
3526 3526 padding: 0;
3527 3527 }
3528 3528
3529 3529 .btn.badge {
3530 3530 cursor: default !important;
3531 3531 }
3532 3532
3533 3533 input[disabled].btn,
3534 3534 .btn.disabled {
3535 3535 color: #999;
3536 3536 }
3537 3537
3538 3538 .btn.btn-danger.disabled {
3539 3539 color: #eee;
3540 3540 background-color: #c77;
3541 3541 border-color: #b66
3542 3542 }
3543 3543
3544 3544 .btn.btn-small {
3545 3545 padding: 2px 6px;
3546 3546 }
3547 3547
3548 3548 .btn.btn-mini {
3549 3549 padding: 0px 4px;
3550 3550 }
3551 3551
3552 3552 .btn:focus {
3553 3553 outline: none;
3554 3554 }
3555 3555 .btn:hover {
3556 3556 text-decoration: none;
3557 3557 color: #515151;
3558 3558 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3559 3559 }
3560 3560 .btn.badge:hover {
3561 3561 box-shadow: none !important;
3562 3562 }
3563 3563 .btn.disabled:hover {
3564 3564 background-position: 0;
3565 3565 color: #999;
3566 3566 text-decoration: none;
3567 3567 box-shadow: none !important;
3568 3568 }
3569 3569
3570 3570 .btn.red {
3571 3571 color: #fff;
3572 3572 background-color: #c43c35;
3573 3573 background-repeat: repeat-x;
3574 3574 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3575 3575 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3576 3576 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3577 3577 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3578 3578 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3579 3579 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3580 3580 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3581 3581 border-color: #c43c35 #c43c35 #882a25;
3582 3582 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3583 3583 }
3584 3584
3585 3585
3586 3586 .btn.blue {
3587 3587 color: #fff;
3588 3588 background-color: #339bb9;
3589 3589 background-repeat: repeat-x;
3590 3590 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3591 3591 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3592 3592 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3593 3593 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3594 3594 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3595 3595 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3596 3596 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3597 3597 border-color: #339bb9 #339bb9 #22697d;
3598 3598 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3599 3599 }
3600 3600
3601 3601 .btn.green {
3602 3602 color: #fff;
3603 3603 background-color: #57a957;
3604 3604 background-repeat: repeat-x;
3605 3605 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3606 3606 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3607 3607 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3608 3608 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3609 3609 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3610 3610 background-image: -o-linear-gradient(top, #62c462, #57a957);
3611 3611 background-image: linear-gradient(to bottom, #62c462, #57a957);
3612 3612 border-color: #57a957 #57a957 #3d773d;
3613 3613 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3614 3614 }
3615 3615
3616 3616 .btn.yellow {
3617 3617 color: #fff;
3618 3618 background-color: #faa732;
3619 3619 background-repeat: repeat-x;
3620 3620 background-image: -khtml-gradient(linear, left top, left bottom, from(#fbb450), to(#f89406));
3621 3621 background-image: -moz-linear-gradient(top, #fbb450, #f89406);
3622 3622 background-image: -ms-linear-gradient(top, #fbb450, #f89406);
3623 3623 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fbb450), color-stop(100%, #f89406));
3624 3624 background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
3625 3625 background-image: -o-linear-gradient(top, #fbb450, #f89406);
3626 3626 background-image: linear-gradient(to bottom, #fbb450, #f89406);
3627 3627 border-color: #f89406 #f89406 #ad6704;
3628 3628 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3629 3629 }
3630 3630
3631 3631 label.disabled {
3632 3632 color: #aaa;
3633 3633 }
3634 3634
3635 3635 .btn.blue.hidden {
3636 3636 display: none;
3637 3637 }
3638 3638
3639 3639 .btn.active {
3640 3640 font-weight: bold;
3641 3641 }
3642 3642
3643 3643 ins, div.options a:hover {
3644 3644 text-decoration: none;
3645 3645 }
3646 3646
3647 3647 img,
3648 3648 #header #header-inner #quick li a:hover span.normal,
3649 3649 #content div.box div.form div.fields div.field div.textarea table td table td a,
3650 3650 #clone_url,
3651 3651 #clone_url_id
3652 3652 {
3653 3653 border: none;
3654 3654 }
3655 3655
3656 3656 img.icon, .right .merge img {
3657 3657 vertical-align: bottom;
3658 3658 }
3659 3659
3660 3660 #header ul#logged-user,
3661 3661 #content div.box div.title ul.links,
3662 3662 #content div.box div.message div.dismiss,
3663 3663 #content div.box div.traffic div.legend ul {
3664 3664 float: right;
3665 3665 margin: 0;
3666 3666 padding: 0;
3667 3667 }
3668 3668
3669 3669 #header #header-inner #home,
3670 3670 #header #header-inner #logo,
3671 3671 #content div.box ul.left,
3672 3672 #content div.box ol.left,
3673 3673 div#commit_history,
3674 3674 div#legend_data, div#legend_container, div#legend_choices {
3675 3675 float: left;
3676 3676 }
3677 3677
3678 3678 #header #header-inner #quick li #quick_login,
3679 3679 #header #header-inner #quick li:hover ul ul,
3680 3680 #header #header-inner #quick li:hover ul ul ul,
3681 3681 #header #header-inner #quick li:hover ul ul ul ul,
3682 3682 #content #left #menu ul.closed,
3683 3683 #content #left #menu li ul.collapsed,
3684 3684 .yui-tt-shadow {
3685 3685 display: none;
3686 3686 }
3687 3687
3688 3688 #header #header-inner #quick li:hover #quick_login,
3689 3689 #header #header-inner #quick li:hover ul,
3690 3690 #header #header-inner #quick li li:hover ul,
3691 3691 #header #header-inner #quick li li li:hover ul,
3692 3692 #header #header-inner #quick li li li li:hover ul,
3693 3693 #content #left #menu ul.opened,
3694 3694 #content #left #menu li ul.expanded {
3695 3695 display: block;
3696 3696 }
3697 3697
3698 3698 .repo-switcher .select2-choice {
3699 3699 padding: 0px 8px 1px !important;
3700 3700 display: block;
3701 3701 height: 100%;
3702 3702 }
3703 3703
3704 3704 .repo-switcher .select2-container,
3705 3705 .repo-switcher .select2-choice,
3706 3706 .repo-switcher .select2-choice span {
3707 3707 background: transparent !important;
3708 3708 border: 0 !important;
3709 3709 box-shadow: none !important;
3710 3710 color: #FFFFFF !important;
3711 3711 }
3712 3712
3713 3713 .repo-switcher .select2-arrow {
3714 3714 display: none !important;
3715 3715 }
3716 3716
3717 3717 .repo-switcher .select2-chosen:after {
3718 3718 font-family: 'kallithea';
3719 3719 content: ' \23f7';
3720 3720 }
3721 3721
3722 3722 .repo-switcher-dropdown.select2-drop.select2-drop-active {
3723 3723 xborder-color: black;
3724 3724 -webkit-box-shadow: none;
3725 3725 -moz-box-shadow: none;
3726 3726 box-shadow: none;
3727 3727 color: #fff;
3728 3728 background-color: #576622;
3729 3729 }
3730 3730
3731 3731 .repo-switcher-dropdown.select2-drop.select2-drop-active .select2-results .select2-highlighted {
3732 3732 background-color: #6388ad;
3733 3733 }
3734 3734
3735 3735 #content div.graph {
3736 3736 padding: 0 10px 10px;
3737 3737 height: 450px;
3738 3738 }
3739 3739
3740 3740 #content div.box ol.lower-roman,
3741 3741 #content div.box ol.upper-roman,
3742 3742 #content div.box ol.lower-alpha,
3743 3743 #content div.box ol.upper-alpha,
3744 3744 #content div.box ol.decimal {
3745 3745 margin: 10px 24px 10px 44px;
3746 3746 }
3747 3747
3748 3748 #content div.box div.form,
3749 3749 #content div.box div.table,
3750 3750 #content div.box div.traffic {
3751 3751 position: relative;
3752 3752 clear: both;
3753 3753 margin: 0;
3754 3754 padding: 0 20px 10px;
3755 3755 }
3756 3756
3757 3757 #content div.box div.form div.fields,
3758 3758 #login div.form,
3759 3759 #login div.form div.fields,
3760 3760 #register div.form,
3761 3761 #register div.form div.fields {
3762 3762 clear: both;
3763 3763 overflow: hidden;
3764 3764 margin: 0;
3765 3765 padding: 0;
3766 3766 }
3767 3767
3768 3768 #content div.box div.form div.fields div.field div.label span,
3769 3769 #login div.form div.fields div.field div.label span,
3770 3770 #register div.form div.fields div.field div.label span {
3771 3771 height: 1%;
3772 3772 display: block;
3773 3773 color: #363636;
3774 3774 margin: 0;
3775 3775 padding: 2px 0 0;
3776 3776 }
3777 3777
3778 3778 #content div.box div.form div.fields div.field div.input input.error,
3779 3779 #login div.form div.fields div.field div.input input.error,
3780 3780 #register div.form div.fields div.field div.input input.error {
3781 3781 background: #FBE3E4;
3782 3782 border-top: 1px solid #e1b2b3;
3783 3783 border-left: 1px solid #e1b2b3;
3784 3784 border-right: 1px solid #FBC2C4;
3785 3785 border-bottom: 1px solid #FBC2C4;
3786 3786 }
3787 3787
3788 3788 #content div.box div.form div.fields div.field div.input input.success,
3789 3789 #login div.form div.fields div.field div.input input.success,
3790 3790 #register div.form div.fields div.field div.input input.success {
3791 3791 background: #E6EFC2;
3792 3792 border-top: 1px solid #cebb98;
3793 3793 border-left: 1px solid #cebb98;
3794 3794 border-right: 1px solid #c6d880;
3795 3795 border-bottom: 1px solid #c6d880;
3796 3796 }
3797 3797
3798 3798 #content div.box-left div.form div.fields div.field div.textarea,
3799 3799 #content div.box-right div.form div.fields div.field div.textarea,
3800 3800 #content div.box div.form div.fields div.field div.select select,
3801 3801 #content div.box table th.selected input,
3802 3802 #content div.box table td.selected input {
3803 3803 margin: 0;
3804 3804 }
3805 3805
3806 3806 #content div.box-left div.form div.fields div.field div.select,
3807 3807 #content div.box-left div.form div.fields div.field div.checkboxes,
3808 3808 #content div.box-left div.form div.fields div.field div.radios,
3809 3809 #content div.box-right div.form div.fields div.field div.select,
3810 3810 #content div.box-right div.form div.fields div.field div.checkboxes,
3811 3811 #content div.box-right div.form div.fields div.field div.radios {
3812 3812 margin: 0 0 0 0px !important;
3813 3813 padding: 0;
3814 3814 }
3815 3815
3816 3816 #content div.box div.form div.fields div.field div.select,
3817 3817 #content div.box div.form div.fields div.field div.checkboxes,
3818 3818 #content div.box div.form div.fields div.field div.radios {
3819 3819 margin: 0 0 0 200px;
3820 3820 padding: 0;
3821 3821 }
3822 3822
3823 3823 #content div.box div.form div.fields div.field div.select a:hover,
3824 3824 #content div.box div.form div.fields div.field div.select a.ui-selectmenu:hover,
3825 3825 #content div.box div.action a:hover {
3826 3826 color: #000;
3827 3827 text-decoration: none;
3828 3828 }
3829 3829
3830 3830 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus,
3831 3831 #content div.box div.action a.ui-selectmenu-focus {
3832 3832 border: 1px solid #666;
3833 3833 }
3834 3834
3835 3835 #content div.box div.form div.fields div.field div.checkboxes div.checkbox,
3836 3836 #content div.box div.form div.fields div.field div.radios div.radio {
3837 3837 clear: both;
3838 3838 overflow: hidden;
3839 3839 margin: 0;
3840 3840 padding: 8px 0 2px;
3841 3841 }
3842 3842
3843 3843 #content div.box div.form div.fields div.field div.checkboxes div.checkbox input,
3844 3844 #content div.box div.form div.fields div.field div.radios div.radio input {
3845 3845 float: left;
3846 3846 margin: 0;
3847 3847 }
3848 3848
3849 3849 #content div.box div.form div.fields div.field div.checkboxes div.checkbox label,
3850 3850 #content div.box div.form div.fields div.field div.radios div.radio label {
3851 3851 height: 1%;
3852 3852 display: block;
3853 3853 float: left;
3854 3854 margin: 2px 0 0 4px;
3855 3855 }
3856 3856
3857 3857 div.form div.fields div.field div.button input,
3858 3858 #content div.box div.form div.fields div.buttons input
3859 3859 div.form div.fields div.buttons input,
3860 3860 #content div.box div.action div.button input {
3861 3861 font-size: 11px;
3862 3862 font-weight: 700;
3863 3863 margin: 0;
3864 3864 }
3865 3865
3866 3866 div.form div.fields div.field div.highlight,
3867 3867 #content div.box div.form div.fields div.buttons div.highlight {
3868 3868 display: inline;
3869 3869 }
3870 3870
3871 3871 #content div.box div.form div.fields div.buttons,
3872 3872 div.form div.fields div.buttons {
3873 3873 margin: 10px 0 0 200px;
3874 3874 padding: 0;
3875 3875 }
3876 3876
3877 3877 #content div.box-left div.form div.fields div.buttons,
3878 3878 #content div.box-right div.form div.fields div.buttons,
3879 3879 div.box-left div.form div.fields div.buttons,
3880 3880 div.box-right div.form div.fields div.buttons {
3881 3881 margin: 10px 0 0;
3882 3882 }
3883 3883
3884 3884 #content div.box table td.user,
3885 3885 #content div.box table td.address {
3886 3886 width: 10%;
3887 3887 text-align: center;
3888 3888 }
3889 3889
3890 3890 #content div.box div.action div.button,
3891 3891 #login div.form div.fields div.field div.input div.link,
3892 3892 #register div.form div.fields div.field div.input div.link {
3893 3893 text-align: right;
3894 3894 margin: 6px 0 0;
3895 3895 padding: 0;
3896 3896 }
3897 3897
3898 3898 #content div.box div.pagination div.results,
3899 3899 #content div.box div.pagination-wh div.results {
3900 3900 text-align: left;
3901 3901 float: left;
3902 3902 margin: 0;
3903 3903 padding: 0;
3904 3904 }
3905 3905
3906 3906 #content div.box div.pagination div.results span,
3907 3907 #content div.box div.pagination-wh div.results span {
3908 3908 height: 1%;
3909 3909 display: block;
3910 3910 float: left;
3911 3911 background: #ebebeb url("../images/pager.png") repeat-x;
3912 3912 border-top: 1px solid #dedede;
3913 3913 border-left: 1px solid #cfcfcf;
3914 3914 border-right: 1px solid #c4c4c4;
3915 3915 border-bottom: 1px solid #c4c4c4;
3916 3916 color: #4A4A4A;
3917 3917 font-weight: 700;
3918 3918 margin: 0;
3919 3919 padding: 6px 8px;
3920 3920 }
3921 3921
3922 3922 #content div.box div.pagination ul.pager li.disabled,
3923 3923 #content div.box div.pagination-wh a.disabled {
3924 3924 color: #B4B4B4;
3925 3925 padding: 6px;
3926 3926 }
3927 3927
3928 3928 #login, #register {
3929 3929 width: 520px;
3930 3930 margin: 10% auto 0;
3931 3931 padding: 0;
3932 3932 }
3933 3933
3934 3934 #login div.color,
3935 3935 #register div.color {
3936 3936 clear: both;
3937 3937 overflow: hidden;
3938 3938 background: #FFF;
3939 3939 margin: 10px auto 0;
3940 3940 padding: 3px 3px 3px 0;
3941 3941 }
3942 3942
3943 3943 #login div.color a,
3944 3944 #register div.color a {
3945 3945 width: 20px;
3946 3946 height: 20px;
3947 3947 display: block;
3948 3948 float: left;
3949 3949 margin: 0 0 0 3px;
3950 3950 padding: 0;
3951 3951 }
3952 3952
3953 3953 #login div.title h5,
3954 3954 #register div.title h5 {
3955 3955 color: #fff;
3956 3956 margin: 10px;
3957 3957 padding: 0;
3958 3958 }
3959 3959
3960 3960 #login div.form div.fields div.field,
3961 3961 #register div.form div.fields div.field {
3962 3962 clear: both;
3963 3963 overflow: hidden;
3964 3964 margin: 0;
3965 3965 padding: 0 0 10px;
3966 3966 }
3967 3967
3968 3968 #login div.form div.fields div.field span.error-message,
3969 3969 #register div.form div.fields div.field span.error-message {
3970 3970 height: 1%;
3971 3971 display: block;
3972 3972 color: red;
3973 3973 margin: 8px 0 0;
3974 3974 padding: 0;
3975 3975 max-width: 320px;
3976 3976 }
3977 3977
3978 3978 #login div.form div.fields div.field div.label label,
3979 3979 #register div.form div.fields div.field div.label label {
3980 3980 color: #000;
3981 3981 font-weight: 700;
3982 3982 }
3983 3983
3984 3984 #login div.form div.fields div.field div.input,
3985 3985 #register div.form div.fields div.field div.input {
3986 3986 float: left;
3987 3987 margin: 0;
3988 3988 padding: 0;
3989 3989 }
3990 3990
3991 3991 #login div.form div.fields div.field div.input input.large {
3992 3992 width: 250px;
3993 3993 }
3994 3994
3995 3995 #login div.form div.fields div.field div.checkbox,
3996 3996 #register div.form div.fields div.field div.checkbox {
3997 3997 margin: 0 0 0 184px;
3998 3998 padding: 0;
3999 3999 }
4000 4000
4001 4001 #login div.form div.fields div.field div.checkbox label,
4002 4002 #register div.form div.fields div.field div.checkbox label {
4003 4003 color: #565656;
4004 4004 font-weight: 700;
4005 4005 }
4006 4006
4007 4007 #login div.form div.fields div.buttons input,
4008 4008 #register div.form div.fields div.buttons input {
4009 4009 color: #000;
4010 4010 font-size: 1em;
4011 4011 font-weight: 700;
4012 4012 margin: 0;
4013 4013 }
4014 4014
4015 4015 #changeset_content .container .wrapper,
4016 4016 #graph_content .container .wrapper {
4017 4017 width: 600px;
4018 4018 }
4019 4019
4020 4020 #changeset_content .container .date,
4021 4021 .ac .match {
4022 4022 font-weight: 700;
4023 4023 padding-top: 5px;
4024 4024 padding-bottom: 5px;
4025 4025 }
4026 4026
4027 4027 div#legend_container table td,
4028 4028 div#legend_choices table td {
4029 4029 border: none !important;
4030 4030 height: 20px !important;
4031 4031 padding: 0 !important;
4032 4032 }
4033 4033
4034 4034 .q_filter_box {
4035 4035 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4036 4036 -webkit-border-radius: 4px;
4037 4037 border-radius: 4px;
4038 4038 border: 0 none;
4039 4039 margin-bottom: -4px;
4040 4040 margin-top: -4px;
4041 4041 padding-left: 3px;
4042 4042 }
4043 4043
4044 4044 #node_filter {
4045 4045 border: 0px solid #545454;
4046 4046 color: #AAAAAA;
4047 4047 padding-left: 3px;
4048 4048 }
4049 4049
4050 4050
4051 4051 .group_members_wrap {
4052 4052 min-height: 85px;
4053 4053 padding-left: 20px;
4054 4054 }
4055 4055
4056 4056 .group_members .group_member {
4057 4057 height: 30px;
4058 4058 padding: 0px 0px 0px 0px;
4059 4059 }
4060 4060
4061 4061 .reviewer_status {
4062 4062 float: left;
4063 4063 }
4064 4064
4065 4065 .reviewers_member {
4066 4066 height: 15px;
4067 4067 padding: 0px 0px 0px 10px;
4068 4068 }
4069 4069
4070 4070 .emails_wrap {
4071 4071 padding: 0px 20px;
4072 4072 }
4073 4073
4074 4074 .emails_wrap .email_entry {
4075 4075 height: 30px;
4076 4076 padding: 0px 0px 0px 10px;
4077 4077 }
4078 4078 .emails_wrap .email_entry .email {
4079 4079 float: left
4080 4080 }
4081 4081 .emails_wrap .email_entry .email_action {
4082 4082 float: left
4083 4083 }
4084 4084
4085 4085 .ips_wrap {
4086 4086 padding: 0px 20px;
4087 4087 }
4088 4088
4089 4089 .ips_wrap .ip_entry {
4090 4090 height: 30px;
4091 4091 padding: 0px 0px 0px 10px;
4092 4092 }
4093 4093 .ips_wrap .ip_entry .ip {
4094 4094 float: left
4095 4095 }
4096 4096 .ips_wrap .ip_entry .ip_action {
4097 4097 float: left
4098 4098 }
4099 4099
4100 4100
4101 4101 /*README STYLE*/
4102 4102
4103 4103 div.readme {
4104 4104 padding: 0px;
4105 4105 }
4106 4106
4107 4107 div.readme h2 {
4108 4108 font-weight: normal;
4109 4109 }
4110 4110
4111 4111 div.readme .readme_box {
4112 4112 background-color: #fafafa;
4113 4113 }
4114 4114
4115 4115 div.readme .readme_box {
4116 4116 clear: both;
4117 4117 overflow: hidden;
4118 4118 margin: 0;
4119 4119 padding: 0 20px 10px;
4120 4120 }
4121 4121
4122 4122 div.readme .readme_box h1,
4123 4123 div.readme .readme_box h2,
4124 4124 div.readme .readme_box h3,
4125 4125 div.readme .readme_box h4,
4126 4126 div.readme .readme_box h5,
4127 4127 div.readme .readme_box h6 {
4128 4128 border-bottom: 0 !important;
4129 4129 margin: 0 !important;
4130 4130 padding: 0 !important;
4131 4131 line-height: 1.5em !important;
4132 4132 }
4133 4133
4134 4134
4135 4135 div.readme .readme_box h1:first-child {
4136 4136 padding-top: .25em !important;
4137 4137 }
4138 4138
4139 4139 div.readme .readme_box h2,
4140 4140 div.readme .readme_box h3 {
4141 4141 margin: 1em 0 !important;
4142 4142 }
4143 4143
4144 4144 div.readme .readme_box h2 {
4145 4145 margin-top: 1.5em !important;
4146 4146 border-top: 4px solid #e0e0e0 !important;
4147 4147 padding-top: .5em !important;
4148 4148 }
4149 4149
4150 4150 div.readme .readme_box p {
4151 4151 color: black !important;
4152 4152 margin: 1em 0 !important;
4153 4153 line-height: 1.5em !important;
4154 4154 }
4155 4155
4156 4156 div.readme .readme_box ul {
4157 4157 list-style: disc !important;
4158 4158 margin: 1em 0 1em 2em !important;
4159 4159 }
4160 4160
4161 4161 div.readme .readme_box ol {
4162 4162 list-style: decimal;
4163 4163 margin: 1em 0 1em 2em !important;
4164 4164 }
4165 4165
4166 4166 div.readme .readme_box code {
4167 4167 font-size: 12px !important;
4168 4168 background-color: ghostWhite !important;
4169 4169 color: #444 !important;
4170 4170 padding: 0 .2em !important;
4171 4171 border: 1px solid #dedede !important;
4172 4172 }
4173 4173
4174 4174 div.readme .readme_box pre code {
4175 4175 padding: 0 !important;
4176 4176 font-size: 12px !important;
4177 4177 background-color: #eee !important;
4178 4178 border: none !important;
4179 4179 }
4180 4180
4181 4181 div.readme .readme_box pre {
4182 4182 margin: 1em 0;
4183 4183 font-size: 12px;
4184 4184 background-color: #eee;
4185 4185 border: 1px solid #ddd;
4186 4186 padding: 5px;
4187 4187 color: #444;
4188 4188 overflow: auto;
4189 4189 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4190 4190 -webkit-border-radius: 3px;
4191 4191 border-radius: 3px;
4192 4192 }
4193 4193
4194 4194 div.readme .readme_box table {
4195 4195 display: table;
4196 4196 border-collapse: separate;
4197 4197 border-spacing: 2px;
4198 4198 border-color: gray;
4199 4199 width: auto !important;
4200 4200 }
4201 4201
4202 4202
4203 4203 /** RST STYLE **/
4204 4204
4205 4205
4206 4206 div.rst-block {
4207 4207 padding: 0px;
4208 4208 }
4209 4209
4210 4210 div.rst-block h2 {
4211 4211 font-weight: normal;
4212 4212 }
4213 4213
4214 4214 div.rst-block {
4215 4215 background-color: #fafafa;
4216 4216 }
4217 4217
4218 4218 div.rst-block {
4219 4219 clear: both;
4220 4220 overflow: hidden;
4221 4221 margin: 0;
4222 4222 padding: 0 20px 10px;
4223 4223 }
4224 4224
4225 4225 div.rst-block h1,
4226 4226 div.rst-block h2,
4227 4227 div.rst-block h3,
4228 4228 div.rst-block h4,
4229 4229 div.rst-block h5,
4230 4230 div.rst-block h6 {
4231 4231 border-bottom: 0 !important;
4232 4232 margin: 0 !important;
4233 4233 padding: 0 !important;
4234 4234 line-height: 1.5em !important;
4235 4235 }
4236 4236
4237 4237
4238 4238 div.rst-block h1:first-child {
4239 4239 padding-top: .25em !important;
4240 4240 }
4241 4241
4242 4242 div.rst-block h2,
4243 4243 div.rst-block h3 {
4244 4244 margin: 1em 0 !important;
4245 4245 }
4246 4246
4247 4247 div.rst-block h2 {
4248 4248 margin-top: 1.5em !important;
4249 4249 border-top: 4px solid #e0e0e0 !important;
4250 4250 padding-top: .5em !important;
4251 4251 }
4252 4252
4253 4253 div.rst-block p {
4254 4254 color: black !important;
4255 4255 margin: 1em 0 !important;
4256 4256 line-height: 1.5em !important;
4257 4257 }
4258 4258
4259 4259 div.rst-block ul {
4260 4260 list-style: disc !important;
4261 4261 margin: 1em 0 1em 2em !important;
4262 4262 }
4263 4263
4264 4264 div.rst-block ol {
4265 4265 list-style: decimal;
4266 4266 margin: 1em 0 1em 2em !important;
4267 4267 }
4268 4268
4269 4269 div.rst-block code {
4270 4270 font-size: 12px !important;
4271 4271 background-color: ghostWhite !important;
4272 4272 color: #444 !important;
4273 4273 padding: 0 .2em !important;
4274 4274 border: 1px solid #dedede !important;
4275 4275 }
4276 4276
4277 4277 div.rst-block pre code {
4278 4278 padding: 0 !important;
4279 4279 font-size: 12px !important;
4280 4280 background-color: #eee !important;
4281 4281 border: none !important;
4282 4282 }
4283 4283
4284 4284 div.rst-block pre {
4285 4285 margin: 1em 0;
4286 4286 font-size: 12px;
4287 4287 background-color: #eee;
4288 4288 border: 1px solid #ddd;
4289 4289 padding: 5px;
4290 4290 color: #444;
4291 4291 overflow: auto;
4292 4292 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4293 4293 -webkit-border-radius: 3px;
4294 4294 border-radius: 3px;
4295 4295 }
4296 4296
4297 4297
4298 4298 /** comment main **/
4299 4299 .comments {
4300 4300 padding: 10px 20px;
4301 4301 max-width: 978px;
4302 4302 }
4303 4303
4304 4304 .comments .comment {
4305 4305 border: 1px solid #ddd;
4306 4306 margin-top: 10px;
4307 4307 -webkit-border-radius: 4px;
4308 4308 border-radius: 4px;
4309 4309 }
4310 4310
4311 4311 .comments .comment .meta {
4312 4312 background: #f8f8f8;
4313 4313 padding: 4px;
4314 4314 border-bottom: 1px solid #ddd;
4315 4315 min-height: 18px;
4316 4316 overflow: auto;
4317 4317 }
4318 4318
4319 4319 .comments .comment .meta img {
4320 4320 vertical-align: middle;
4321 4321 }
4322 4322
4323 4323 .comments .comment .meta .user {
4324 4324 font-weight: bold;
4325 4325 float: left;
4326 4326 padding: 4px 2px 2px 2px;
4327 4327 }
4328 4328
4329 4329 .comments .comment .meta .date {
4330 4330 float: left;
4331 4331 padding: 4px 4px 0px 4px;
4332 4332 }
4333 4333
4334 4334 .comments .comment .text {
4335 4335 background-color: #FAFAFA;
4336 4336 }
4337 4337 .comment .text div.rst-block p {
4338 4338 margin: 0.5em 0px !important;
4339 4339 }
4340 4340
4341 4341 .comments .comments-number,
4342 4342 .pr-comments-number {
4343 4343 margin: 5px;
4344 4344 padding: 0px 0px 10px 0px;
4345 4345 font-weight: bold;
4346 4346 color: #666;
4347 4347 font-size: 16px;
4348 4348 }
4349 4349
4350 .automatic-comment {
4351 font-style: italic;
4352 }
4353
4350 4354 /** comment form **/
4351 4355
4352 4356 .status-block {
4353 4357 margin: 5px;
4354 4358 clear: both
4355 4359 }
4356 4360
4357 4361
4358 4362 div.comment-form {
4359 4363 margin-top: 20px;
4360 4364 }
4361 4365
4362 4366 .comment-form strong {
4363 4367 display: block;
4364 4368 margin-bottom: 15px;
4365 4369 }
4366 4370
4367 4371 .comment-form textarea {
4368 4372 width: 100%;
4369 4373 height: 100px;
4370 4374 font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
4371 4375 }
4372 4376
4373 4377 form.comment-form {
4374 4378 margin-top: 10px;
4375 4379 margin-left: 10px;
4376 4380 }
4377 4381
4378 4382 .comment-inline-form .comment-block-ta,
4379 4383 .comment-form .comment-block-ta {
4380 4384 border: 1px solid #ccc;
4381 4385 border-radius: 3px;
4382 4386 box-sizing: border-box;
4383 4387 }
4384 4388
4385 4389 .comment-form-submit {
4386 4390 margin-top: 5px;
4387 4391 margin-left: 525px;
4388 4392 }
4389 4393
4390 4394 .file-comments {
4391 4395 display: none;
4392 4396 }
4393 4397
4394 4398 .comment-form .comment {
4395 4399 margin-left: 10px;
4396 4400 }
4397 4401
4398 4402 .comment-form .comment-help {
4399 4403 padding: 5px 5px 5px 5px;
4400 4404 color: #666;
4401 4405 }
4402 4406 .comment-form .comment-help .preview-btn,
4403 4407 .comment-form .comment-help .edit-btn {
4404 4408 float: right;
4405 4409 margin: -6px 0px 0px 0px;
4406 4410 }
4407 4411
4408 4412 .comment-form .preview-box.unloaded,
4409 4413 .comment-inline-form .preview-box.unloaded {
4410 4414 height: 50px;
4411 4415 text-align: center;
4412 4416 padding: 20px;
4413 4417 background-color: #fafafa;
4414 4418 }
4415 4419
4416 4420 .comment-form .comment-button {
4417 4421 padding-top: 5px;
4418 4422 }
4419 4423
4420 4424 .add-another-button {
4421 4425 margin-left: 10px;
4422 4426 margin-top: 10px;
4423 4427 margin-bottom: 10px;
4424 4428 }
4425 4429
4426 4430 .comment .buttons {
4427 4431 float: right;
4428 4432 margin: -1px 0px 0px 0px;
4429 4433 }
4430 4434
4431 4435
4432 4436 .show-inline-comments {
4433 4437 position: relative;
4434 4438 top: 1px
4435 4439 }
4436 4440
4437 4441 /** comment inline form **/
4438 4442 .comment-inline-form {
4439 4443 margin: 4px;
4440 4444 max-width: 978px;
4441 4445 }
4442 4446 .comment-inline-form .submitting-overlay {
4443 4447 display: none;
4444 4448 height: 0;
4445 4449 text-align: center;
4446 4450 font-size: 16px;
4447 4451 opacity: 0.5;
4448 4452 }
4449 4453
4450 4454 .comment-inline-form .clearfix,
4451 4455 .comment-form .clearfix {
4452 4456 background: #EEE;
4453 4457 -webkit-border-radius: 4px;
4454 4458 border-radius: 4px;
4455 4459 padding: 5px;
4456 4460 margin: 0px;
4457 4461 }
4458 4462
4459 4463 div.comment-inline-form {
4460 4464 padding: 4px 0px 6px 0px;
4461 4465 }
4462 4466
4463 4467 .comment-inline-form strong {
4464 4468 display: block;
4465 4469 margin-bottom: 15px;
4466 4470 }
4467 4471
4468 4472 .comment-inline-form textarea {
4469 4473 width: 100%;
4470 4474 height: 100px;
4471 4475 font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
4472 4476 }
4473 4477
4474 4478 form.comment-inline-form {
4475 4479 margin-top: 10px;
4476 4480 margin-left: 10px;
4477 4481 }
4478 4482
4479 4483 .comment-inline-form-submit {
4480 4484 margin-top: 5px;
4481 4485 margin-left: 525px;
4482 4486 }
4483 4487
4484 4488 .file-comments {
4485 4489 display: none;
4486 4490 }
4487 4491
4488 4492 .comment-inline-form .comment {
4489 4493 margin-left: 10px;
4490 4494 }
4491 4495
4492 4496 .comment-inline-form .comment-help {
4493 4497 padding: 5px 5px 5px 5px;
4494 4498 color: #666;
4495 4499 }
4496 4500
4497 4501 .comment-inline-form .comment-help .preview-btn,
4498 4502 .comment-inline-form .comment-help .edit-btn {
4499 4503 float: right;
4500 4504 margin: -6px 0px 0px 0px;
4501 4505 }
4502 4506
4503 4507 .comment-inline-form .comment-button {
4504 4508 padding-top: 5px;
4505 4509 }
4506 4510
4507 4511 /** comment inline **/
4508 4512 .inline-comments {
4509 4513 padding: 10px 20px;
4510 4514 }
4511 4515
4512 4516 .inline-comments div.rst-block {
4513 4517 clear: both;
4514 4518 overflow: hidden;
4515 4519 margin: 0;
4516 4520 padding: 0 20px 0px;
4517 4521 }
4518 4522 .inline-comments .comment {
4519 4523 max-width: 978px;
4520 4524 border: 1px solid #ddd;
4521 4525 -webkit-border-radius: 4px;
4522 4526 border-radius: 4px;
4523 4527 margin: 3px 3px 5px 5px;
4524 4528 background-color: #FAFAFA;
4525 4529 }
4526 4530 .inline-comments .add-comment {
4527 4531 padding: 2px 4px 8px 5px;
4528 4532 }
4529 4533
4530 4534 .inline-comments .comment-wrapp {
4531 4535 padding: 1px;
4532 4536 }
4533 4537 .inline-comments .comment .meta {
4534 4538 background: #f8f8f8;
4535 4539 padding: 4px;
4536 4540 border-bottom: 1px solid #ddd;
4537 4541 min-height: 20px;
4538 4542 overflow: auto;
4539 4543 }
4540 4544
4541 4545 .inline-comments .comment .meta img {
4542 4546 vertical-align: middle;
4543 4547 }
4544 4548
4545 4549 .inline-comments .comment .meta .user {
4546 4550 font-weight: bold;
4547 4551 float: left;
4548 4552 padding: 3px;
4549 4553 }
4550 4554
4551 4555 .inline-comments .comment .meta .date {
4552 4556 float: left;
4553 4557 padding: 3px;
4554 4558 }
4555 4559
4556 4560 .inline-comments .comment .text {
4557 4561 background-color: #FAFAFA;
4558 4562 }
4559 4563
4560 4564 .inline-comments .comments-number {
4561 4565 padding: 0px 0px 10px 0px;
4562 4566 font-weight: bold;
4563 4567 color: #666;
4564 4568 font-size: 16px;
4565 4569 }
4566 4570 .inline-comments-button .add-comment {
4567 4571 margin: 2px 0px 8px 5px !important
4568 4572 }
4569 4573
4570 4574 .notification-paginator {
4571 4575 padding: 0px 0px 4px 16px;
4572 4576 }
4573 4577
4574 4578 #context-pages .pull-request span,
4575 4579 .menu_link_notifications {
4576 4580 padding: 4px 4px !important;
4577 4581 text-align: center;
4578 4582 color: #888 !important;
4579 4583 background-color: #DEDEDE !important;
4580 4584 border-radius: 4px !important;
4581 4585 -webkit-border-radius: 4px !important;
4582 4586 }
4583 4587
4584 4588 #context-pages .forks span,
4585 4589 .menu_link_notifications {
4586 4590 padding: 4px 4px !important;
4587 4591 text-align: center;
4588 4592 color: #888 !important;
4589 4593 background-color: #DEDEDE !important;
4590 4594 border-radius: 4px !important;
4591 4595 -webkit-border-radius: 4px !important;
4592 4596 }
4593 4597
4594 4598
4595 4599 .notification-header {
4596 4600 padding-top: 6px;
4597 4601 }
4598 4602 .notification-header .desc {
4599 4603 font-size: 16px;
4600 4604 height: 24px;
4601 4605 float: left
4602 4606 }
4603 4607 .notification-list .container.unread {
4604 4608 background: none repeat scroll 0 0 rgba(255, 255, 180, 0.6);
4605 4609 }
4606 4610 .notification-header .gravatar {
4607 4611 background: none repeat scroll 0 0 transparent;
4608 4612 padding: 0px 0px 0px 8px;
4609 4613 }
4610 4614 .notification-list .container .notification-header .desc {
4611 4615 font-weight: bold;
4612 4616 font-size: 17px;
4613 4617 }
4614 4618 .notification-table {
4615 4619 border: 1px solid #ccc;
4616 4620 -webkit-border-radius: 6px 6px 6px 6px;
4617 4621 border-radius: 6px 6px 6px 6px;
4618 4622 clear: both;
4619 4623 margin: 0px 20px 0px 20px;
4620 4624 }
4621 4625 .notification-header .delete-notifications {
4622 4626 float: right;
4623 4627 padding-top: 8px;
4624 4628 cursor: pointer;
4625 4629 }
4626 4630 .notification-header .read-notifications {
4627 4631 float: right;
4628 4632 padding-top: 8px;
4629 4633 cursor: pointer;
4630 4634 }
4631 4635 .notification-subject {
4632 4636 clear: both;
4633 4637 border-bottom: 1px solid #eee;
4634 4638 padding: 5px 0px 5px 38px;
4635 4639 }
4636 4640
4637 4641 .notification-body {
4638 4642 clear: both;
4639 4643 margin: 34px 2px 2px 8px
4640 4644 }
4641 4645
4642 4646 /****
4643 4647 PULL REQUESTS
4644 4648 *****/
4645 4649 .pullrequests_section_head {
4646 4650 padding: 10px 10px 10px 0px;
4647 4651 margin: 0 20px;
4648 4652 font-size: 16px;
4649 4653 font-weight: bold;
4650 4654 }
4651 4655
4652 4656 div.pr-details-title.closed {
4653 4657 color: #555;
4654 4658 background: #eee;
4655 4659 }
4656 4660
4657 4661 div.pr-details-title {
4658 4662 font-size: 1.6em;
4659 4663 padding: 5px 0px 5px 10px;
4660 4664 }
4661 4665
4662 4666 div.pr {
4663 4667 margin: 0px 20px;
4664 4668 padding: 4px 4px;
4665 4669 }
4666 4670 div.pr-desc {
4667 4671 margin: 0px 20px;
4668 4672 }
4669 4673 tr.pr-closed td {
4670 4674 background-color: #eee !important;
4671 4675 color: #555 !important;
4672 4676 }
4673 4677
4674 4678 span.pr-closed-tag {
4675 4679 margin-bottom: 1px;
4676 4680 margin-right: 1px;
4677 4681 padding: 1px 3px;
4678 4682 font-size: 10px;
4679 4683 padding: 1px 3px 1px 3px;
4680 4684 font-size: 10px;
4681 4685 color: #577632;
4682 4686 white-space: nowrap;
4683 4687 -webkit-border-radius: 4px;
4684 4688 border-radius: 4px;
4685 4689 border: 1px solid #d9e8f8;
4686 4690 line-height: 1.5em;
4687 4691 }
4688 4692
4689 4693 .pr-box {
4690 4694 max-width: 978px;
4691 4695 }
4692 4696
4693 4697 #s2id_org_ref,
4694 4698 #s2id_other_ref,
4695 4699 #s2id_org_repo,
4696 4700 #s2id_other_repo {
4697 4701 min-width: 150px;
4698 4702 margin: 5px;
4699 4703 }
4700 4704
4701 4705 #pr-summary .msg-div {
4702 4706 margin: 5px 0;
4703 4707 }
4704 4708
4705 4709 /****
4706 4710 PERMS
4707 4711 *****/
4708 4712 #perms .perms_section_head {
4709 4713 padding: 10px 10px 10px 0px;
4710 4714 font-size: 16px;
4711 4715 font-weight: bold;
4712 4716 text-transform: capitalize;
4713 4717 }
4714 4718
4715 4719 #perms .perm_tag {
4716 4720 padding: 1px 3px 1px 3px;
4717 4721 font-size: 10px;
4718 4722 font-weight: bold;
4719 4723 text-transform: uppercase;
4720 4724 white-space: nowrap;
4721 4725 -webkit-border-radius: 3px;
4722 4726 border-radius: 3px;
4723 4727 }
4724 4728
4725 4729 #perms .perm_tag.admin {
4726 4730 background-color: #B94A48;
4727 4731 color: #ffffff;
4728 4732 }
4729 4733
4730 4734 #perms .perm_tag.write {
4731 4735 background-color: #DB7525;
4732 4736 color: #ffffff;
4733 4737 }
4734 4738
4735 4739 #perms .perm_tag.read {
4736 4740 background-color: #468847;
4737 4741 color: #ffffff;
4738 4742 }
4739 4743
4740 4744 #perms .perm_tag.none {
4741 4745 background-color: #bfbfbf;
4742 4746 color: #ffffff;
4743 4747 }
4744 4748
4745 4749 .perm-gravatar {
4746 4750 vertical-align: middle;
4747 4751 padding: 2px;
4748 4752 }
4749 4753 .perm-gravatar-ac {
4750 4754 vertical-align: middle;
4751 4755 padding: 2px;
4752 4756 width: 14px;
4753 4757 height: 14px;
4754 4758 }
4755 4759
4756 4760 /*****************************************************************************
4757 4761 DIFFS CSS
4758 4762 ******************************************************************************/
4759 4763 .diff-collapse {
4760 4764 text-align: center;
4761 4765 margin-bottom: -15px;
4762 4766 }
4763 4767 .diff-collapse-button {
4764 4768 cursor: pointer;
4765 4769 color: #666;
4766 4770 font-size: 16px;
4767 4771 }
4768 4772 .diff-container {
4769 4773
4770 4774 }
4771 4775
4772 4776 .diff-container.hidden {
4773 4777 display: none;
4774 4778 overflow: hidden;
4775 4779 }
4776 4780
4777 4781
4778 4782 div.diffblock {
4779 4783 overflow: auto;
4780 4784 padding: 0px;
4781 4785 border: 1px solid #ccc;
4782 4786 background: #f8f8f8;
4783 4787 font-size: 100%;
4784 4788 line-height: 100%;
4785 4789 /* new */
4786 4790 line-height: 125%;
4787 4791 -webkit-border-radius: 6px 6px 0px 0px;
4788 4792 border-radius: 6px 6px 0px 0px;
4789 4793 }
4790 4794 div.diffblock.margined {
4791 4795 margin: 0px 20px 0px 20px;
4792 4796 overflow: hidden;
4793 4797 }
4794 4798 div.diffblock .code-header {
4795 4799 border-bottom: 1px solid #CCCCCC;
4796 4800 background: #EEEEEE;
4797 4801 padding: 10px 0 10px 0;
4798 4802 min-height: 14px;
4799 4803 }
4800 4804
4801 4805 div.diffblock .code-header.banner {
4802 4806 border-bottom: 1px solid #CCCCCC;
4803 4807 background: #EEEEEE;
4804 4808 height: 14px;
4805 4809 margin: 0;
4806 4810 padding: 3px 100px 11px 100px;
4807 4811 }
4808 4812
4809 4813 div.diffblock .code-header-title {
4810 4814 padding: 0px 0px 10px 5px !important;
4811 4815 margin: 0 !important;
4812 4816 }
4813 4817 div.diffblock .code-header .hash {
4814 4818 float: left;
4815 4819 padding: 2px 0 0 2px;
4816 4820 }
4817 4821 div.diffblock .code-header .date {
4818 4822 float: left;
4819 4823 text-transform: uppercase;
4820 4824 padding: 2px 0px 0px 2px;
4821 4825 }
4822 4826 div.diffblock .code-header div {
4823 4827 margin-left: 4px;
4824 4828 font-weight: bold;
4825 4829 font-size: 14px;
4826 4830 }
4827 4831
4828 4832 div.diffblock .parents {
4829 4833 float: left;
4830 4834 min-height: 26px;
4831 4835 font-size: 10px;
4832 4836 font-weight: 400;
4833 4837 vertical-align: middle;
4834 4838 padding: 0px 2px 2px 2px;
4835 4839 background-color: #eeeeee;
4836 4840 border-bottom: 1px solid #CCCCCC;
4837 4841 }
4838 4842
4839 4843 div.diffblock .children {
4840 4844 float: right;
4841 4845 min-height: 26px;
4842 4846 font-size: 10px;
4843 4847 font-weight: 400;
4844 4848 vertical-align: middle;
4845 4849 text-align: right;
4846 4850 padding: 0px 2px 2px 2px;
4847 4851 background-color: #eeeeee;
4848 4852 border-bottom: 1px solid #CCCCCC;
4849 4853 }
4850 4854
4851 4855 div.diffblock .code-body {
4852 4856 background: #FFFFFF;
4853 4857 clear: both;
4854 4858 }
4855 4859 div.diffblock pre.raw {
4856 4860 background: #FFFFFF;
4857 4861 color: #000000;
4858 4862 }
4859 4863 table.code-difftable {
4860 4864 border-collapse: collapse;
4861 4865 width: 99%;
4862 4866 border-radius: 0px !important;
4863 4867 }
4864 4868 table.code-difftable td {
4865 4869 padding: 0 !important;
4866 4870 background: none !important;
4867 4871 border: 0 !important;
4868 4872 vertical-align: baseline !important
4869 4873 }
4870 4874 table.code-difftable .context {
4871 4875 background: none repeat scroll 0 0 #DDE7EF;
4872 4876 color: #999;
4873 4877 }
4874 4878 table.code-difftable .add {
4875 4879 background: none repeat scroll 0 0 #DDFFDD;
4876 4880 }
4877 4881 table.code-difftable .add ins {
4878 4882 background: none repeat scroll 0 0 #AAFFAA;
4879 4883 text-decoration: none;
4880 4884 }
4881 4885 table.code-difftable .del {
4882 4886 background: none repeat scroll 0 0 #FFDDDD;
4883 4887 }
4884 4888 table.code-difftable .del del {
4885 4889 background: none repeat scroll 0 0 #FFAAAA;
4886 4890 text-decoration: none;
4887 4891 }
4888 4892
4889 4893 table.code-highlighttable div.code-highlight pre u:before,
4890 4894 table.code-difftable td.code pre u:before {
4891 4895 content: "\21a6";
4892 4896 display: inline-block;
4893 4897 width: 0;
4894 4898 }
4895 4899 table.code-highlighttable div.code-highlight pre u.cr:before,
4896 4900 table.code-difftable td.code pre u.cr:before {
4897 4901 content: "\21a4";
4898 4902 display: inline-block;
4899 4903 color: rgba(0,0,0,0.5);
4900 4904 }
4901 4905 table.code-highlighttable div.code-highlight pre u,
4902 4906 table.code-difftable td.code pre u {
4903 4907 color: rgba(0,0,0,0.15);
4904 4908 }
4905 4909 table.code-highlighttable div.code-highlight pre i,
4906 4910 table.code-difftable td.code pre i {
4907 4911 border-style: solid;
4908 4912 border-left-width: 1px;
4909 4913 color: rgba(0,0,0,0.5);
4910 4914 }
4911 4915
4912 4916 /** LINE NUMBERS **/
4913 4917 table.code-difftable .lineno {
4914 4918 padding-left: 2px;
4915 4919 padding-right: 2px !important;
4916 4920 text-align: right;
4917 4921 width: 30px;
4918 4922 -moz-user-select: none;
4919 4923 -webkit-user-select: none;
4920 4924 border-right: 1px solid #CCC !important;
4921 4925 border-left: 0px solid #CCC !important;
4922 4926 border-top: 0px solid #CCC !important;
4923 4927 border-bottom: none !important;
4924 4928 vertical-align: middle !important;
4925 4929 }
4926 4930 table.code-difftable .lineno.new {
4927 4931 }
4928 4932 table.code-difftable .lineno.old {
4929 4933 }
4930 4934 table.code-difftable .lineno a {
4931 4935 color: #aaa !important;
4932 4936 font: 11px Consolas, Monaco, Inconsolata, Liberation Mono, monospace !important;
4933 4937 letter-spacing: -1px;
4934 4938 text-align: right;
4935 4939 padding-right: 8px;
4936 4940 cursor: pointer;
4937 4941 display: block;
4938 4942 width: 30px;
4939 4943 }
4940 4944
4941 4945 table.code-difftable .lineno-inline {
4942 4946 background: none repeat scroll 0 0 #FFF !important;
4943 4947 padding-left: 2px;
4944 4948 padding-right: 2px;
4945 4949 text-align: right;
4946 4950 width: 30px;
4947 4951 -moz-user-select: none;
4948 4952 -webkit-user-select: none;
4949 4953 }
4950 4954
4951 4955 /** CODE **/
4952 4956 table.code-difftable .code {
4953 4957 display: block;
4954 4958 width: 100%;
4955 4959 }
4956 4960 table.code-difftable .code td {
4957 4961 margin: 0;
4958 4962 padding: 0;
4959 4963 }
4960 4964 table.code-difftable .code pre {
4961 4965 margin: 0 0 0 12px;
4962 4966 padding: 0;
4963 4967 min-height: 17px;
4964 4968 line-height: 17px;
4965 4969 white-space: pre-wrap;
4966 4970 }
4967 4971
4968 4972 table.code-difftable .del .code pre:before {
4969 4973 content: "-";
4970 4974 color: #550000;
4971 4975 }
4972 4976
4973 4977 table.code-difftable .add .code pre:before {
4974 4978 content: "+";
4975 4979 color: #005500;
4976 4980 }
4977 4981
4978 4982 table.code-difftable .unmod .code pre:before {
4979 4983 content: " ";
4980 4984 }
4981 4985
4982 4986 .add-bubble {
4983 4987 position: relative;
4984 4988 display: none;
4985 4989 float: left;
4986 4990 width: 0px;
4987 4991 height: 0px;
4988 4992 left: -8px;
4989 4993 box-sizing: border-box;
4990 4994 }
4991 4995
4992 4996 tr.line.add:hover td .add-bubble,
4993 4997 tr.line.del:hover td .add-bubble,
4994 4998 tr.line.unmod:hover td .add-bubble {
4995 4999 display: block;
4996 5000 }
4997 5001
4998 5002 .add-bubble div {
4999 5003 background: #577632;
5000 5004 width: 16px;
5001 5005 height: 16px;
5002 5006 cursor: pointer;
5003 5007 padding: 0 2px 2px 0.5px;
5004 5008 border: 1px solid #577632;
5005 5009 border-radius: 3px;
5006 5010 box-sizing: border-box;
5007 5011 }
5008 5012
5009 5013 .add-bubble div:before {
5010 5014 font-size: 14px;
5011 5015 color: #ffffff;
5012 5016 font-family: "kallithea";
5013 5017 content: '\1f5ea';
5014 5018 }
5015 5019
5016 5020 .add-bubble div:hover {
5017 5021 transform: scale(1.2, 1.2);
5018 5022 }
5019 5023
5020 5024 div.comment:target>.comment-wrapp {
5021 5025 border: solid 2px #ee0 !important;
5022 5026 }
5023 5027
5024 5028 .lineno:target a {
5025 5029 border: solid 2px #ee0 !important;
5026 5030 margin: -2px;
5027 5031 }
5028 5032
5029 5033 .btn-image-diff-show,
5030 5034 .btn-image-diff-swap {
5031 5035 margin: 5px;
5032 5036 }
5033 5037
5034 5038 .img-diff {
5035 5039 max-width: 45%;
5036 5040 height: auto;
5037 5041 margin: 5px;
5038 5042 /* http://lea.verou.me/demos/css3-patterns.html */
5039 5043 background-image:
5040 5044 linear-gradient(45deg, #888 25%, transparent 25%, transparent),
5041 5045 linear-gradient(-45deg, #888 25%, transparent 25%, transparent),
5042 5046 linear-gradient(45deg, transparent 75%, #888 75%),
5043 5047 linear-gradient(-45deg, transparent 75%, #888 75%);
5044 5048 background-size: 10px 10px;
5045 5049 background-color: #999;
5046 5050 }
5047 5051
5048 5052 .img-preview {
5049 5053 max-width: 100%;
5050 5054 height: auto;
5051 5055 margin: 5px;
5052 5056 }
5053 5057
5054 5058 div.prev-next-comment div.prev-comment,
5055 5059 div.prev-next-comment div.next-comment {
5056 5060 display: inline-block;
5057 5061 min-width: 150px;
5058 5062 margin: 3px 6px;
5059 5063 }
5060 5064
5061 5065 #help_kb {
5062 5066 display: none;
5063 5067 }
5064 5068
5065 5069 .icon-only-links i {
5066 5070 color: white;
5067 5071 }
@@ -1,263 +1,269 b''
1 1 ## -*- coding: utf-8 -*-
2 2 ## usage:
3 3 ## <%namespace name="comment" file="/changeset/changeset_file_comment.html"/>
4 4 ## ${comment.comment_block(co)}
5 5 ##
6 6 <%def name="comment_block(co)">
7 7 <div class="comment" id="comment-${co.comment_id}" line="${co.line_no}">
8 8 <div class="comment-wrapp">
9 9 <div class="meta">
10 10 <div style="float:left">
11 11 ${h.gravatar(co.author.email, size=20)}
12 12 </div>
13 13 <div class="user">
14 14 ${co.author.username_and_name}
15 15 </div>
16 16 <div class="date">
17 17 ${h.age(co.modified_at)}
18 18 </div>
19 19
20 20 <div style="float:left;padding:4px 0px 0px 5px">
21 21 <span class="">
22 22 %if co.pull_request:
23 23 %if co.status_change:
24 24 ${_('Status change from pull request')}
25 25 <a href="${co.pull_request.url()}">"${co.pull_request.title or _("No title")}"</a>:
26 26 %else:
27 27 ${_('Comment from pull request')}
28 28 <a href="${co.pull_request.url()}">"${co.pull_request.title or _("No title")}"</a>
29 29 %endif
30 30 %else:
31 31 %if co.status_change:
32 32 ${_('Status change on changeset')}:
33 33 %else:
34 34 ${_('Comment on changeset')}
35 35 %endif
36 36 %endif
37 37 </span>
38 38 </div>
39 39
40 40 %if co.status_change:
41 41 <div style="float:left" class="changeset-status-container">
42 42 <div style="float:left;padding:10px 2px 0px 2px"></div>
43 43 <div title="${_('Changeset status')}" class="changeset-status-lbl"> ${co.status_change[0].status_lbl}</div>
44 44 <div class="changeset-status-ico"><i class="icon-circle changeset-status-${co.status_change[0].status}"></i></div>
45 45 </div>
46 46 %endif
47 47
48 48 <a class="permalink" href="#comment-${co.comment_id}">&para;</a>
49 49 %if h.HasPermissionAny('hg.admin')() or h.HasRepoPermissionAny('repository.admin')(c.repo_name) or co.author.user_id == c.authuser.user_id:
50 50 <div onClick="confirm('${_("Delete comment?")}') && deleteComment(${co.comment_id})" class="buttons delete-comment btn btn-mini">${_('Delete')}</div>
51 51 %endif
52 52 </div>
53 53 <div class="text">
54 %if co.text:
54 55 ${h.rst_w_mentions(co.text)|n}
56 %else:
57 <div class="rst-block automatic-comment">
58 <p>${_('No comments.')}</p>
59 </div>
60 %endif
55 61 </div>
56 62 </div>
57 63 </div>
58 64 </%def>
59 65
60 66
61 67 <%def name="comment_inline_form()">
62 68 <div id='comment-inline-form-template' style="display:none">
63 69 <div class="comment-inline-form ac">
64 70 %if c.authuser.username != 'default':
65 71 ${h.form('#', class_='inline-form')}
66 72 <div id="edit-container_{1}" class="clearfix">
67 73 <div class="comment-help">${_('Commenting on line {1}.')}
68 74 ${(_('Comments parsed using %s syntax with %s support.') % (
69 75 ('<a href="%s">RST</a>' % h.url('rst_help')),
70 76 ('<span style="color:#577632" class="tooltip" title="%s">@mention</span>' % _('Use @username inside this text to notify another user'))
71 77 )
72 78 )|n
73 79 }
74 80 </div>
75 81 <div class="mentions-container" id="mentions_container_{1}"></div>
76 82 <textarea id="text_{1}" name="text" class="comment-block-ta yui-ac-input"></textarea>
77 83 </div>
78 84 <div id="preview-container_{1}" class="clearfix" style="display:none">
79 85 <div class="comment-help">
80 86 ${_('Comment preview')}
81 87 </div>
82 88 <div id="preview-box_{1}" class="preview-box"></div>
83 89 </div>
84 90 <div class="comment-button">
85 91 <div class="submitting-overlay">${_('Submitting ...')}</div>
86 92 <input type="hidden" name="f_path" value="{0}">
87 93 <input type="hidden" name="line" value="{1}">
88 94 ${h.submit('save', _('Comment'), class_='btn btn-small save-inline-form')}
89 95 ${h.reset('hide-inline-form', _('Cancel'), class_='btn btn-small hide-inline-form')}
90 96 <div id="preview-btn_{1}" class="preview-btn btn btn-small">${_('Preview')}</div>
91 97 <div id="edit-btn_{1}" class="edit-btn btn btn-small" style="display:none">${_('Edit')}</div>
92 98 </div>
93 99 ${h.end_form()}
94 100 %else:
95 101 ${h.form('')}
96 102 <div class="clearfix">
97 103 <div class="comment-help">
98 104 ${_('You need to be logged in to comment.')} <a href="${h.url('login_home',came_from=h.url.current())}">${_('Login now')}</a>
99 105 </div>
100 106 </div>
101 107 <div class="comment-button">
102 108 ${h.reset('hide-inline-form', _('Hide'), class_='btn btn-small hide-inline-form')}
103 109 </div>
104 110 ${h.end_form()}
105 111 %endif
106 112 </div>
107 113 </div>
108 114 </%def>
109 115
110 116
111 117 ## show comment count as "x comments (y inline, z general)"
112 118 <%def name="comment_count(inline_cnt, general_cnt)">
113 119 ${'%s (%s, %s)' % (
114 120 ungettext("%d comment", "%d comments", inline_cnt + general_cnt) % (inline_cnt + general_cnt),
115 121 ungettext("%d inline", "%d inline", inline_cnt) % inline_cnt,
116 122 ungettext("%d general", "%d general", general_cnt) % general_cnt
117 123 )}
118 124 <span class="firstlink"></span>
119 125 </%def>
120 126
121 127 ## generates inlines taken from c.comments var
122 128 <%def name="inlines()">
123 129 <div class="comments-number">
124 130 ${comment_count(c.inline_cnt, len(c.comments))}
125 131 </div>
126 132 %for path, lines in c.inline_comments:
127 133 % for line,comments in lines.iteritems():
128 134 <div style="display:none" class="inline-comment-placeholder" path="${path}" target_id="${h.safeid(h.safe_unicode(path))}">
129 135 %for co in comments:
130 136 ${comment_block(co)}
131 137 %endfor
132 138 </div>
133 139 %endfor
134 140 %endfor
135 141
136 142 </%def>
137 143
138 144 ## generate inline comments and the main ones
139 145 <%def name="generate_comments()">
140 146 <div class="comments">
141 147 <div id="inline-comments-container">
142 148 ## generate inlines for this changeset
143 149 ${inlines()}
144 150 </div>
145 151
146 152 %for co in c.comments:
147 153 <div id="comment-tr-${co.comment_id}">
148 154 ${comment_block(co)}
149 155 </div>
150 156 %endfor
151 157 </div>
152 158 </%def>
153 159
154 160 ## MAIN COMMENT FORM
155 161 <%def name="comments(post_url, cur_status, is_pr=False, change_status=True)">
156 162
157 163 <div class="comments">
158 164 %if c.authuser.username != 'default':
159 165 <div class="comment-form ac">
160 166 ${h.form(post_url, id="main_form")}
161 167 <div id="edit-container" class="clearfix">
162 168 <div class="comment-help">
163 169 ${(_('Comments parsed using %s syntax with %s support.') % (('<a href="%s">RST</a>' % h.url('rst_help')),
164 170 '<span style="color:#577632" class="tooltip" title="%s">@mention</span>' %
165 171 _('Use @username inside this text to notify another user.')))|n}
166 172 </div>
167 173 <div class="mentions-container" id="mentions_container"></div>
168 174 ${h.textarea('text', class_="comment-block-ta")}
169 175 %if change_status:
170 176 <div id="status_block_container" class="status-block">
171 177 %if is_pr:
172 178 ${_('Vote for pull request status')}:
173 179 %else:
174 180 ${_('Set changeset status')}:
175 181 %endif
176 182 <input type="radio" class="status_change_radio" name="changeset_status" id="changeset_status_unchanged" value="" checked="checked" />
177 183 <label for="changeset_status_unchanged">
178 184 ${_('No change')}
179 185 </label>
180 186 %for status,lbl in c.changeset_statuses:
181 187 <span style="margin-left: 15px;">
182 188 <input type="radio" class="status_change_radio" name="changeset_status" id="${status}" value="${status}">
183 189 <label for="${status}"><i class="icon-circle changeset-status-${status}" /></i>${lbl}</label>
184 190 </span>
185 191 %endfor
186 192
187 193 %if is_pr and ( \
188 194 h.HasPermissionAny('hg.admin')() or h.HasRepoPermissionAny('repository.admin')(c.repo_name) \
189 195 or c.pull_request.author.user_id == c.authuser.user_id):
190 196 <input id="save_close" type="checkbox" name="save_close">
191 197 <label id="save_close_label" for="save_close">${_("Close")}</label>
192 198 %endif
193 199 </div>
194 200 %endif
195 201 </div>
196 202
197 203 <div id="preview-container" class="clearfix" style="display:none">
198 204 <div class="comment-help">
199 205 ${_('Comment preview')}
200 206 </div>
201 207 <div id="preview-box" class="preview-box"></div>
202 208 </div>
203 209
204 210 <div class="comment-button">
205 211 ${h.submit('save', _('Comment'), class_="btn")}
206 212 <div id="preview-btn" class="preview-btn btn">${_('Preview')}</div>
207 213 <div id="edit-btn" class="edit-btn btn" style="display:none">${_('Edit')}</div>
208 214 </div>
209 215 ${h.end_form()}
210 216 </div>
211 217 %endif
212 218 </div>
213 219
214 220 <script>
215 221
216 222 $(document).ready(function () {
217 223 MentionsAutoComplete('text', 'mentions_container', _USERS_AC_DATA, _GROUPS_AC_DATA);
218 224
219 225 $(window).on('beforeunload', function(){
220 226 if($('.form-open').size() || $('textarea#text').val()){
221 227 // this message will not be displayed on all browsers
222 228 // (e.g. some versions of Firefox), but the user will still be warned
223 229 return 'There are uncommitted comments.';
224 230 }
225 231 });
226 232
227 233 $('form#main_form').submit(function(){
228 234 // if no open inline forms, disable the beforeunload check - it would
229 235 // fail in the check for the textarea we are about to submit
230 236 if(!$('.form-open').size()){
231 237 $(window).off('beforeunload');
232 238 }
233 239 });
234 240
235 241 $('#preview-btn').click(function(){
236 242 var _text = $('#text').val();
237 243 if(!_text){
238 244 return;
239 245 }
240 246 var post_data = {'text': _text};
241 247 $('#preview-box').addClass('unloaded');
242 248 $('#preivew-box').html(_TM['Loading ...']);
243 249 $('#edit-container').hide();
244 250 $('#edit-btn').show();
245 251 $('#preview-container').show();
246 252 $('#preview-btn').hide();
247 253
248 254 var url = pyroutes.url('changeset_comment_preview', {'repo_name': '${c.repo_name}'});
249 255 ajaxPOST(url,post_data,function(html){
250 256 $('#preview-box').html(html);
251 257 $('#preview-box').removeClass('unloaded');
252 258 });
253 259 });
254 260 $('#edit-btn').click(function(){
255 261 $('#edit-container').show();
256 262 $('#edit-btn').hide();
257 263 $('#preview-container').hide();
258 264 $('#preview-btn').show();
259 265 });
260 266
261 267 });
262 268 </script>
263 269 </%def>
General Comments 0
You need to be logged in to leave comments. Login now