##// END OF EJS Templates
ui: new commits page....
marcink -
r3882:74da9073 default
parent child Browse files
Show More
@@ -1,60 +1,60 b''
1 1 {
2 2 "name": "rhodecode-enterprise",
3 3 "version": "2.0.0",
4 4 "private": true,
5 5 "description" : "RhodeCode JS packaged",
6 6 "license": "SEE LICENSE IN LICENSE.txt",
7 7 "repository" : {
8 8 "type" : "hg",
9 9 "url" : "https://code.rhodecode.com/rhodecode-enterprise-ce"
10 10 },
11 11 "devDependencies": {
12 12 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1",
13 13 "clipboard": "^2.0.1",
14 14 "exports-loader": "^0.6.4",
15 15 "favico.js": "^0.3.10",
16 16 "dropzone": "^5.5.0",
17 17 "grunt": "^0.4.5",
18 18 "grunt-cli": "^1.3.1",
19 19 "grunt-contrib-concat": "^0.5.1",
20 20 "grunt-contrib-copy": "^1.0.0",
21 21 "grunt-contrib-jshint": "^0.12.0",
22 22 "grunt-contrib-less": "^1.1.0",
23 23 "grunt-contrib-watch": "^0.6.1",
24 24 "grunt-webpack": "^3.1.3",
25 25 "jquery": "1.11.3",
26 26 "mark.js": "8.11.1",
27 27 "jshint": "^2.9.1-rc3",
28 28 "moment": "^2.18.1",
29 29 "mousetrap": "^1.6.1",
30 30 "qrious": "^4.0.2",
31 "sticky-sidebar": "3.3.1",
31 "sticky-sidebar": "3.3.4",
32 32 "waypoints": "4.0.1",
33 33 "webpack": "4.23.1",
34 34 "webpack-cli": "3.1.2",
35 35 "babel-core": "^6.26.3",
36 36 "babel-loader": "^7.1.2",
37 37 "babel-plugin-transform-object-rest-spread": "^6.26.0",
38 38 "babel-preset-env": "^1.6.0",
39 39 "copy-webpack-plugin": "^4.4.2",
40 40 "css-loader": "^0.28.11",
41 41 "html-loader": "^0.4.4",
42 42 "html-webpack-plugin": "^3.2.0",
43 43 "imports-loader": "^0.7.1",
44 44 "polymer-webpack-loader": "^2.0.1",
45 45 "style-loader": "^0.21.0",
46 46 "webpack-uglify-js-plugin": "^1.1.9",
47 47 "raw-loader": "1.0.0-beta.0",
48 48 "ts-loader": "^1.3.3",
49 49 "@webcomponents/webcomponentsjs": "^2.0.0",
50 50 "@polymer/polymer": "^3.0.0",
51 51 "@polymer/paper-button": "^3.0.0",
52 52 "@polymer/paper-spinner": "^3.0.0",
53 53 "@polymer/paper-tooltip": "^3.0.0",
54 54 "@polymer/paper-toast": "^3.0.0",
55 55 "@polymer/paper-toggle-button": "^3.0.0",
56 56 "@polymer/iron-ajax": "^3.0.0",
57 57 "@polymer/iron-autogrow-textarea": "^3.0.0",
58 58 "@polymer/iron-a11y-keys": "^3.0.0"
59 59 }
60 60 }
@@ -1,500 +1,503 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 3 # Copyright (C) 2010-2019 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
7 7 # (only), as published by the Free Software Foundation.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU Affero General Public License
15 15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 16 #
17 17 # This program is dual-licensed. If you wish to learn more about the
18 18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21
22 22 import logging
23 23 import collections
24 24
25 25 from pyramid.httpexceptions import HTTPNotFound, HTTPBadRequest, HTTPFound
26 26 from pyramid.view import view_config
27 27 from pyramid.renderers import render
28 28 from pyramid.response import Response
29 29
30 30 from rhodecode.apps._base import RepoAppView
31 31
32 32 from rhodecode.lib import diffs, codeblocks
33 33 from rhodecode.lib.auth import (
34 34 LoginRequired, HasRepoPermissionAnyDecorator, NotAnonymous, CSRFRequired)
35 35
36 36 from rhodecode.lib.compat import OrderedDict
37 37 from rhodecode.lib.diffs import (
38 38 cache_diff, load_cached_diff, diff_cache_exist, get_diff_context,
39 39 get_diff_whitespace_flag)
40 40 from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError
41 41 import rhodecode.lib.helpers as h
42 42 from rhodecode.lib.utils2 import safe_unicode, str2bool
43 43 from rhodecode.lib.vcs.backends.base import EmptyCommit
44 44 from rhodecode.lib.vcs.exceptions import (
45 45 RepositoryError, CommitDoesNotExistError)
46 46 from rhodecode.model.db import ChangesetComment, ChangesetStatus
47 47 from rhodecode.model.changeset_status import ChangesetStatusModel
48 48 from rhodecode.model.comment import CommentsModel
49 49 from rhodecode.model.meta import Session
50 50 from rhodecode.model.settings import VcsSettingsModel
51 51
52 52 log = logging.getLogger(__name__)
53 53
54 54
55 55 def _update_with_GET(params, request):
56 56 for k in ['diff1', 'diff2', 'diff']:
57 57 params[k] += request.GET.getall(k)
58 58
59 59
60 60 class RepoCommitsView(RepoAppView):
61 61 def load_default_context(self):
62 62 c = self._get_local_tmpl_context(include_app_defaults=True)
63 63 c.rhodecode_repo = self.rhodecode_vcs_repo
64 64
65 65 return c
66 66
67 67 def _is_diff_cache_enabled(self, target_repo):
68 68 caching_enabled = self._get_general_setting(
69 69 target_repo, 'rhodecode_diff_cache')
70 70 log.debug('Diff caching enabled: %s', caching_enabled)
71 71 return caching_enabled
72 72
73 73 def _commit(self, commit_id_range, method):
74 74 _ = self.request.translate
75 75 c = self.load_default_context()
76 76 c.fulldiff = self.request.GET.get('fulldiff')
77 77
78 78 # fetch global flags of ignore ws or context lines
79 79 diff_context = get_diff_context(self.request)
80 80 hide_whitespace_changes = get_diff_whitespace_flag(self.request)
81 81
82 82 # diff_limit will cut off the whole diff if the limit is applied
83 83 # otherwise it will just hide the big files from the front-end
84 84 diff_limit = c.visual.cut_off_limit_diff
85 85 file_limit = c.visual.cut_off_limit_file
86 86
87 87 # get ranges of commit ids if preset
88 88 commit_range = commit_id_range.split('...')[:2]
89 89
90 90 try:
91 91 pre_load = ['affected_files', 'author', 'branch', 'date',
92 92 'message', 'parents']
93 93 if self.rhodecode_vcs_repo.alias == 'hg':
94 94 pre_load += ['hidden', 'obsolete', 'phase']
95 95
96 96 if len(commit_range) == 2:
97 97 commits = self.rhodecode_vcs_repo.get_commits(
98 98 start_id=commit_range[0], end_id=commit_range[1],
99 99 pre_load=pre_load, translate_tags=False)
100 100 commits = list(commits)
101 101 else:
102 102 commits = [self.rhodecode_vcs_repo.get_commit(
103 103 commit_id=commit_id_range, pre_load=pre_load)]
104 104
105 105 c.commit_ranges = commits
106 106 if not c.commit_ranges:
107 107 raise RepositoryError('The commit range returned an empty result')
108 108 except CommitDoesNotExistError as e:
109 109 msg = _('No such commit exists. Org exception: `{}`').format(e)
110 110 h.flash(msg, category='error')
111 111 raise HTTPNotFound()
112 112 except Exception:
113 113 log.exception("General failure")
114 114 raise HTTPNotFound()
115 115
116 116 c.changes = OrderedDict()
117 117 c.lines_added = 0
118 118 c.lines_deleted = 0
119 119
120 120 # auto collapse if we have more than limit
121 121 collapse_limit = diffs.DiffProcessor._collapse_commits_over
122 122 c.collapse_all_commits = len(c.commit_ranges) > collapse_limit
123 123
124 124 c.commit_statuses = ChangesetStatus.STATUSES
125 125 c.inline_comments = []
126 126 c.files = []
127 127
128 128 c.statuses = []
129 129 c.comments = []
130 130 c.unresolved_comments = []
131 c.resolved_comments = []
131 132 if len(c.commit_ranges) == 1:
132 133 commit = c.commit_ranges[0]
133 134 c.comments = CommentsModel().get_comments(
134 135 self.db_repo.repo_id,
135 136 revision=commit.raw_id)
136 137 c.statuses.append(ChangesetStatusModel().get_status(
137 138 self.db_repo.repo_id, commit.raw_id))
138 139 # comments from PR
139 140 statuses = ChangesetStatusModel().get_statuses(
140 141 self.db_repo.repo_id, commit.raw_id,
141 142 with_revisions=True)
142 143 prs = set(st.pull_request for st in statuses
143 144 if st.pull_request is not None)
144 145 # from associated statuses, check the pull requests, and
145 146 # show comments from them
146 147 for pr in prs:
147 148 c.comments.extend(pr.comments)
148 149
149 150 c.unresolved_comments = CommentsModel()\
150 151 .get_commit_unresolved_todos(commit.raw_id)
152 c.resolved_comments = CommentsModel()\
153 .get_commit_resolved_todos(commit.raw_id)
151 154
152 155 diff = None
153 156 # Iterate over ranges (default commit view is always one commit)
154 157 for commit in c.commit_ranges:
155 158 c.changes[commit.raw_id] = []
156 159
157 160 commit2 = commit
158 161 commit1 = commit.first_parent
159 162
160 163 if method == 'show':
161 164 inline_comments = CommentsModel().get_inline_comments(
162 165 self.db_repo.repo_id, revision=commit.raw_id)
163 166 c.inline_cnt = CommentsModel().get_inline_comments_count(
164 167 inline_comments)
165 168 c.inline_comments = inline_comments
166 169
167 170 cache_path = self.rhodecode_vcs_repo.get_create_shadow_cache_pr_path(
168 171 self.db_repo)
169 172 cache_file_path = diff_cache_exist(
170 173 cache_path, 'diff', commit.raw_id,
171 174 hide_whitespace_changes, diff_context, c.fulldiff)
172 175
173 176 caching_enabled = self._is_diff_cache_enabled(self.db_repo)
174 177 force_recache = str2bool(self.request.GET.get('force_recache'))
175 178
176 179 cached_diff = None
177 180 if caching_enabled:
178 181 cached_diff = load_cached_diff(cache_file_path)
179 182
180 183 has_proper_diff_cache = cached_diff and cached_diff.get('diff')
181 184 if not force_recache and has_proper_diff_cache:
182 185 diffset = cached_diff['diff']
183 186 else:
184 187 vcs_diff = self.rhodecode_vcs_repo.get_diff(
185 188 commit1, commit2,
186 189 ignore_whitespace=hide_whitespace_changes,
187 190 context=diff_context)
188 191
189 192 diff_processor = diffs.DiffProcessor(
190 193 vcs_diff, format='newdiff', diff_limit=diff_limit,
191 194 file_limit=file_limit, show_full_diff=c.fulldiff)
192 195
193 196 _parsed = diff_processor.prepare()
194 197
195 198 diffset = codeblocks.DiffSet(
196 199 repo_name=self.db_repo_name,
197 200 source_node_getter=codeblocks.diffset_node_getter(commit1),
198 201 target_node_getter=codeblocks.diffset_node_getter(commit2))
199 202
200 203 diffset = self.path_filter.render_patchset_filtered(
201 204 diffset, _parsed, commit1.raw_id, commit2.raw_id)
202 205
203 206 # save cached diff
204 207 if caching_enabled:
205 208 cache_diff(cache_file_path, diffset, None)
206 209
207 210 c.limited_diff = diffset.limited_diff
208 211 c.changes[commit.raw_id] = diffset
209 212 else:
210 213 # TODO(marcink): no cache usage here...
211 214 _diff = self.rhodecode_vcs_repo.get_diff(
212 215 commit1, commit2,
213 216 ignore_whitespace=hide_whitespace_changes, context=diff_context)
214 217 diff_processor = diffs.DiffProcessor(
215 218 _diff, format='newdiff', diff_limit=diff_limit,
216 219 file_limit=file_limit, show_full_diff=c.fulldiff)
217 220 # downloads/raw we only need RAW diff nothing else
218 221 diff = self.path_filter.get_raw_patch(diff_processor)
219 222 c.changes[commit.raw_id] = [None, None, None, None, diff, None, None]
220 223
221 224 # sort comments by how they were generated
222 225 c.comments = sorted(c.comments, key=lambda x: x.comment_id)
223 226
224 227 if len(c.commit_ranges) == 1:
225 228 c.commit = c.commit_ranges[0]
226 229 c.parent_tmpl = ''.join(
227 230 '# Parent %s\n' % x.raw_id for x in c.commit.parents)
228 231
229 232 if method == 'download':
230 233 response = Response(diff)
231 234 response.content_type = 'text/plain'
232 235 response.content_disposition = (
233 236 'attachment; filename=%s.diff' % commit_id_range[:12])
234 237 return response
235 238 elif method == 'patch':
236 239 c.diff = safe_unicode(diff)
237 240 patch = render(
238 241 'rhodecode:templates/changeset/patch_changeset.mako',
239 242 self._get_template_context(c), self.request)
240 243 response = Response(patch)
241 244 response.content_type = 'text/plain'
242 245 return response
243 246 elif method == 'raw':
244 247 response = Response(diff)
245 248 response.content_type = 'text/plain'
246 249 return response
247 250 elif method == 'show':
248 251 if len(c.commit_ranges) == 1:
249 252 html = render(
250 253 'rhodecode:templates/changeset/changeset.mako',
251 254 self._get_template_context(c), self.request)
252 255 return Response(html)
253 256 else:
254 257 c.ancestor = None
255 258 c.target_repo = self.db_repo
256 259 html = render(
257 260 'rhodecode:templates/changeset/changeset_range.mako',
258 261 self._get_template_context(c), self.request)
259 262 return Response(html)
260 263
261 264 raise HTTPBadRequest()
262 265
263 266 @LoginRequired()
264 267 @HasRepoPermissionAnyDecorator(
265 268 'repository.read', 'repository.write', 'repository.admin')
266 269 @view_config(
267 270 route_name='repo_commit', request_method='GET',
268 271 renderer=None)
269 272 def repo_commit_show(self):
270 273 commit_id = self.request.matchdict['commit_id']
271 274 return self._commit(commit_id, method='show')
272 275
273 276 @LoginRequired()
274 277 @HasRepoPermissionAnyDecorator(
275 278 'repository.read', 'repository.write', 'repository.admin')
276 279 @view_config(
277 280 route_name='repo_commit_raw', request_method='GET',
278 281 renderer=None)
279 282 @view_config(
280 283 route_name='repo_commit_raw_deprecated', request_method='GET',
281 284 renderer=None)
282 285 def repo_commit_raw(self):
283 286 commit_id = self.request.matchdict['commit_id']
284 287 return self._commit(commit_id, method='raw')
285 288
286 289 @LoginRequired()
287 290 @HasRepoPermissionAnyDecorator(
288 291 'repository.read', 'repository.write', 'repository.admin')
289 292 @view_config(
290 293 route_name='repo_commit_patch', request_method='GET',
291 294 renderer=None)
292 295 def repo_commit_patch(self):
293 296 commit_id = self.request.matchdict['commit_id']
294 297 return self._commit(commit_id, method='patch')
295 298
296 299 @LoginRequired()
297 300 @HasRepoPermissionAnyDecorator(
298 301 'repository.read', 'repository.write', 'repository.admin')
299 302 @view_config(
300 303 route_name='repo_commit_download', request_method='GET',
301 304 renderer=None)
302 305 def repo_commit_download(self):
303 306 commit_id = self.request.matchdict['commit_id']
304 307 return self._commit(commit_id, method='download')
305 308
306 309 @LoginRequired()
307 310 @NotAnonymous()
308 311 @HasRepoPermissionAnyDecorator(
309 312 'repository.read', 'repository.write', 'repository.admin')
310 313 @CSRFRequired()
311 314 @view_config(
312 315 route_name='repo_commit_comment_create', request_method='POST',
313 316 renderer='json_ext')
314 317 def repo_commit_comment_create(self):
315 318 _ = self.request.translate
316 319 commit_id = self.request.matchdict['commit_id']
317 320
318 321 c = self.load_default_context()
319 322 status = self.request.POST.get('changeset_status', None)
320 323 text = self.request.POST.get('text')
321 324 comment_type = self.request.POST.get('comment_type')
322 325 resolves_comment_id = self.request.POST.get('resolves_comment_id', None)
323 326
324 327 if status:
325 328 text = text or (_('Status change %(transition_icon)s %(status)s')
326 329 % {'transition_icon': '>',
327 330 'status': ChangesetStatus.get_status_lbl(status)})
328 331
329 332 multi_commit_ids = []
330 333 for _commit_id in self.request.POST.get('commit_ids', '').split(','):
331 334 if _commit_id not in ['', None, EmptyCommit.raw_id]:
332 335 if _commit_id not in multi_commit_ids:
333 336 multi_commit_ids.append(_commit_id)
334 337
335 338 commit_ids = multi_commit_ids or [commit_id]
336 339
337 340 comment = None
338 341 for current_id in filter(None, commit_ids):
339 342 comment = CommentsModel().create(
340 343 text=text,
341 344 repo=self.db_repo.repo_id,
342 345 user=self._rhodecode_db_user.user_id,
343 346 commit_id=current_id,
344 347 f_path=self.request.POST.get('f_path'),
345 348 line_no=self.request.POST.get('line'),
346 349 status_change=(ChangesetStatus.get_status_lbl(status)
347 350 if status else None),
348 351 status_change_type=status,
349 352 comment_type=comment_type,
350 353 resolves_comment_id=resolves_comment_id,
351 354 auth_user=self._rhodecode_user
352 355 )
353 356
354 357 # get status if set !
355 358 if status:
356 359 # if latest status was from pull request and it's closed
357 360 # disallow changing status !
358 361 # dont_allow_on_closed_pull_request = True !
359 362
360 363 try:
361 364 ChangesetStatusModel().set_status(
362 365 self.db_repo.repo_id,
363 366 status,
364 367 self._rhodecode_db_user.user_id,
365 368 comment,
366 369 revision=current_id,
367 370 dont_allow_on_closed_pull_request=True
368 371 )
369 372 except StatusChangeOnClosedPullRequestError:
370 373 msg = _('Changing the status of a commit associated with '
371 374 'a closed pull request is not allowed')
372 375 log.exception(msg)
373 376 h.flash(msg, category='warning')
374 377 raise HTTPFound(h.route_path(
375 378 'repo_commit', repo_name=self.db_repo_name,
376 379 commit_id=current_id))
377 380
378 381 # finalize, commit and redirect
379 382 Session().commit()
380 383
381 384 data = {
382 385 'target_id': h.safeid(h.safe_unicode(
383 386 self.request.POST.get('f_path'))),
384 387 }
385 388 if comment:
386 389 c.co = comment
387 390 rendered_comment = render(
388 391 'rhodecode:templates/changeset/changeset_comment_block.mako',
389 392 self._get_template_context(c), self.request)
390 393
391 394 data.update(comment.get_dict())
392 395 data.update({'rendered_text': rendered_comment})
393 396
394 397 return data
395 398
396 399 @LoginRequired()
397 400 @NotAnonymous()
398 401 @HasRepoPermissionAnyDecorator(
399 402 'repository.read', 'repository.write', 'repository.admin')
400 403 @CSRFRequired()
401 404 @view_config(
402 405 route_name='repo_commit_comment_preview', request_method='POST',
403 406 renderer='string', xhr=True)
404 407 def repo_commit_comment_preview(self):
405 408 # Technically a CSRF token is not needed as no state changes with this
406 409 # call. However, as this is a POST is better to have it, so automated
407 410 # tools don't flag it as potential CSRF.
408 411 # Post is required because the payload could be bigger than the maximum
409 412 # allowed by GET.
410 413
411 414 text = self.request.POST.get('text')
412 415 renderer = self.request.POST.get('renderer') or 'rst'
413 416 if text:
414 417 return h.render(text, renderer=renderer, mentions=True)
415 418 return ''
416 419
417 420 @LoginRequired()
418 421 @NotAnonymous()
419 422 @HasRepoPermissionAnyDecorator(
420 423 'repository.read', 'repository.write', 'repository.admin')
421 424 @CSRFRequired()
422 425 @view_config(
423 426 route_name='repo_commit_comment_delete', request_method='POST',
424 427 renderer='json_ext')
425 428 def repo_commit_comment_delete(self):
426 429 commit_id = self.request.matchdict['commit_id']
427 430 comment_id = self.request.matchdict['comment_id']
428 431
429 432 comment = ChangesetComment.get_or_404(comment_id)
430 433 if not comment:
431 434 log.debug('Comment with id:%s not found, skipping', comment_id)
432 435 # comment already deleted in another call probably
433 436 return True
434 437
435 438 is_repo_admin = h.HasRepoPermissionAny('repository.admin')(self.db_repo_name)
436 439 super_admin = h.HasPermissionAny('hg.admin')()
437 440 comment_owner = (comment.author.user_id == self._rhodecode_db_user.user_id)
438 441 is_repo_comment = comment.repo.repo_name == self.db_repo_name
439 442 comment_repo_admin = is_repo_admin and is_repo_comment
440 443
441 444 if super_admin or comment_owner or comment_repo_admin:
442 445 CommentsModel().delete(comment=comment, auth_user=self._rhodecode_user)
443 446 Session().commit()
444 447 return True
445 448 else:
446 449 log.warning('No permissions for user %s to delete comment_id: %s',
447 450 self._rhodecode_db_user, comment_id)
448 451 raise HTTPNotFound()
449 452
450 453 @LoginRequired()
451 454 @HasRepoPermissionAnyDecorator(
452 455 'repository.read', 'repository.write', 'repository.admin')
453 456 @view_config(
454 457 route_name='repo_commit_data', request_method='GET',
455 458 renderer='json_ext', xhr=True)
456 459 def repo_commit_data(self):
457 460 commit_id = self.request.matchdict['commit_id']
458 461 self.load_default_context()
459 462
460 463 try:
461 464 return self.rhodecode_vcs_repo.get_commit(commit_id=commit_id)
462 465 except CommitDoesNotExistError as e:
463 466 return EmptyCommit(message=str(e))
464 467
465 468 @LoginRequired()
466 469 @HasRepoPermissionAnyDecorator(
467 470 'repository.read', 'repository.write', 'repository.admin')
468 471 @view_config(
469 472 route_name='repo_commit_children', request_method='GET',
470 473 renderer='json_ext', xhr=True)
471 474 def repo_commit_children(self):
472 475 commit_id = self.request.matchdict['commit_id']
473 476 self.load_default_context()
474 477
475 478 try:
476 479 commit = self.rhodecode_vcs_repo.get_commit(commit_id=commit_id)
477 480 children = commit.children
478 481 except CommitDoesNotExistError:
479 482 children = []
480 483
481 484 result = {"results": children}
482 485 return result
483 486
484 487 @LoginRequired()
485 488 @HasRepoPermissionAnyDecorator(
486 489 'repository.read', 'repository.write', 'repository.admin')
487 490 @view_config(
488 491 route_name='repo_commit_parents', request_method='GET',
489 492 renderer='json_ext')
490 493 def repo_commit_parents(self):
491 494 commit_id = self.request.matchdict['commit_id']
492 495 self.load_default_context()
493 496
494 497 try:
495 498 commit = self.rhodecode_vcs_repo.get_commit(commit_id=commit_id)
496 499 parents = commit.parents
497 500 except CommitDoesNotExistError:
498 501 parents = []
499 502 result = {"results": parents}
500 503 return result
@@ -1,700 +1,717 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 3 # Copyright (C) 2011-2019 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
7 7 # (only), as published by the Free Software Foundation.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU Affero General Public License
15 15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 16 #
17 17 # This program is dual-licensed. If you wish to learn more about the
18 18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21 """
22 22 comments model for RhodeCode
23 23 """
24 24
25 25 import logging
26 26 import traceback
27 27 import collections
28 28
29 29 from pyramid.threadlocal import get_current_registry, get_current_request
30 30 from sqlalchemy.sql.expression import null
31 31 from sqlalchemy.sql.functions import coalesce
32 32
33 33 from rhodecode.lib import helpers as h, diffs, channelstream
34 34 from rhodecode.lib import audit_logger
35 35 from rhodecode.lib.utils2 import extract_mentioned_users, safe_str
36 36 from rhodecode.model import BaseModel
37 37 from rhodecode.model.db import (
38 38 ChangesetComment, User, Notification, PullRequest, AttributeDict)
39 39 from rhodecode.model.notification import NotificationModel
40 40 from rhodecode.model.meta import Session
41 41 from rhodecode.model.settings import VcsSettingsModel
42 42 from rhodecode.model.notification import EmailNotificationModel
43 43 from rhodecode.model.validation_schema.schemas import comment_schema
44 44
45 45
46 46 log = logging.getLogger(__name__)
47 47
48 48
49 49 class CommentsModel(BaseModel):
50 50
51 51 cls = ChangesetComment
52 52
53 53 DIFF_CONTEXT_BEFORE = 3
54 54 DIFF_CONTEXT_AFTER = 3
55 55
56 56 def __get_commit_comment(self, changeset_comment):
57 57 return self._get_instance(ChangesetComment, changeset_comment)
58 58
59 59 def __get_pull_request(self, pull_request):
60 60 return self._get_instance(PullRequest, pull_request)
61 61
62 62 def _extract_mentions(self, s):
63 63 user_objects = []
64 64 for username in extract_mentioned_users(s):
65 65 user_obj = User.get_by_username(username, case_insensitive=True)
66 66 if user_obj:
67 67 user_objects.append(user_obj)
68 68 return user_objects
69 69
70 70 def _get_renderer(self, global_renderer='rst', request=None):
71 71 request = request or get_current_request()
72 72
73 73 try:
74 74 global_renderer = request.call_context.visual.default_renderer
75 75 except AttributeError:
76 76 log.debug("Renderer not set, falling back "
77 77 "to default renderer '%s'", global_renderer)
78 78 except Exception:
79 79 log.error(traceback.format_exc())
80 80 return global_renderer
81 81
82 82 def aggregate_comments(self, comments, versions, show_version, inline=False):
83 83 # group by versions, and count until, and display objects
84 84
85 85 comment_groups = collections.defaultdict(list)
86 86 [comment_groups[
87 87 _co.pull_request_version_id].append(_co) for _co in comments]
88 88
89 89 def yield_comments(pos):
90 90 for co in comment_groups[pos]:
91 91 yield co
92 92
93 93 comment_versions = collections.defaultdict(
94 94 lambda: collections.defaultdict(list))
95 95 prev_prvid = -1
96 96 # fake last entry with None, to aggregate on "latest" version which
97 97 # doesn't have an pull_request_version_id
98 98 for ver in versions + [AttributeDict({'pull_request_version_id': None})]:
99 99 prvid = ver.pull_request_version_id
100 100 if prev_prvid == -1:
101 101 prev_prvid = prvid
102 102
103 103 for co in yield_comments(prvid):
104 104 comment_versions[prvid]['at'].append(co)
105 105
106 106 # save until
107 107 current = comment_versions[prvid]['at']
108 108 prev_until = comment_versions[prev_prvid]['until']
109 109 cur_until = prev_until + current
110 110 comment_versions[prvid]['until'].extend(cur_until)
111 111
112 112 # save outdated
113 113 if inline:
114 114 outdated = [x for x in cur_until
115 115 if x.outdated_at_version(show_version)]
116 116 else:
117 117 outdated = [x for x in cur_until
118 118 if x.older_than_version(show_version)]
119 119 display = [x for x in cur_until if x not in outdated]
120 120
121 121 comment_versions[prvid]['outdated'] = outdated
122 122 comment_versions[prvid]['display'] = display
123 123
124 124 prev_prvid = prvid
125 125
126 126 return comment_versions
127 127
128 128 def get_repository_comments(self, repo, comment_type=None, user=None, commit_id=None):
129 129 qry = Session().query(ChangesetComment) \
130 130 .filter(ChangesetComment.repo == repo)
131 131
132 132 if comment_type and comment_type in ChangesetComment.COMMENT_TYPES:
133 133 qry = qry.filter(ChangesetComment.comment_type == comment_type)
134 134
135 135 if user:
136 136 user = self._get_user(user)
137 137 if user:
138 138 qry = qry.filter(ChangesetComment.user_id == user.user_id)
139 139
140 140 if commit_id:
141 141 qry = qry.filter(ChangesetComment.revision == commit_id)
142 142
143 143 qry = qry.order_by(ChangesetComment.created_on)
144 144 return qry.all()
145 145
146 146 def get_repository_unresolved_todos(self, repo):
147 147 todos = Session().query(ChangesetComment) \
148 148 .filter(ChangesetComment.repo == repo) \
149 149 .filter(ChangesetComment.resolved_by == None) \
150 150 .filter(ChangesetComment.comment_type
151 151 == ChangesetComment.COMMENT_TYPE_TODO)
152 152 todos = todos.all()
153 153
154 154 return todos
155 155
156 156 def get_pull_request_unresolved_todos(self, pull_request, show_outdated=True):
157 157
158 158 todos = Session().query(ChangesetComment) \
159 159 .filter(ChangesetComment.pull_request == pull_request) \
160 160 .filter(ChangesetComment.resolved_by == None) \
161 161 .filter(ChangesetComment.comment_type
162 162 == ChangesetComment.COMMENT_TYPE_TODO)
163 163
164 164 if not show_outdated:
165 165 todos = todos.filter(
166 166 coalesce(ChangesetComment.display_state, '') !=
167 167 ChangesetComment.COMMENT_OUTDATED)
168 168
169 169 todos = todos.all()
170 170
171 171 return todos
172 172
173 173 def get_commit_unresolved_todos(self, commit_id, show_outdated=True):
174 174
175 175 todos = Session().query(ChangesetComment) \
176 176 .filter(ChangesetComment.revision == commit_id) \
177 177 .filter(ChangesetComment.resolved_by == None) \
178 178 .filter(ChangesetComment.comment_type
179 179 == ChangesetComment.COMMENT_TYPE_TODO)
180 180
181 181 if not show_outdated:
182 182 todos = todos.filter(
183 183 coalesce(ChangesetComment.display_state, '') !=
184 184 ChangesetComment.COMMENT_OUTDATED)
185 185
186 186 todos = todos.all()
187 187
188 188 return todos
189 189
190 def get_commit_resolved_todos(self, commit_id, show_outdated=True):
191
192 todos = Session().query(ChangesetComment) \
193 .filter(ChangesetComment.revision == commit_id) \
194 .filter(ChangesetComment.resolved_by != None) \
195 .filter(ChangesetComment.comment_type
196 == ChangesetComment.COMMENT_TYPE_TODO)
197
198 if not show_outdated:
199 todos = todos.filter(
200 coalesce(ChangesetComment.display_state, '') !=
201 ChangesetComment.COMMENT_OUTDATED)
202
203 todos = todos.all()
204
205 return todos
206
190 207 def _log_audit_action(self, action, action_data, auth_user, comment):
191 208 audit_logger.store(
192 209 action=action,
193 210 action_data=action_data,
194 211 user=auth_user,
195 212 repo=comment.repo)
196 213
197 214 def create(self, text, repo, user, commit_id=None, pull_request=None,
198 215 f_path=None, line_no=None, status_change=None,
199 216 status_change_type=None, comment_type=None,
200 217 resolves_comment_id=None, closing_pr=False, send_email=True,
201 218 renderer=None, auth_user=None):
202 219 """
203 220 Creates new comment for commit or pull request.
204 221 IF status_change is not none this comment is associated with a
205 222 status change of commit or commit associated with pull request
206 223
207 224 :param text:
208 225 :param repo:
209 226 :param user:
210 227 :param commit_id:
211 228 :param pull_request:
212 229 :param f_path:
213 230 :param line_no:
214 231 :param status_change: Label for status change
215 232 :param comment_type: Type of comment
216 233 :param status_change_type: type of status change
217 234 :param closing_pr:
218 235 :param send_email:
219 236 :param renderer: pick renderer for this comment
220 237 """
221 238
222 239 if not text:
223 240 log.warning('Missing text for comment, skipping...')
224 241 return
225 242 request = get_current_request()
226 243 _ = request.translate
227 244
228 245 if not renderer:
229 246 renderer = self._get_renderer(request=request)
230 247
231 248 repo = self._get_repo(repo)
232 249 user = self._get_user(user)
233 250 auth_user = auth_user or user
234 251
235 252 schema = comment_schema.CommentSchema()
236 253 validated_kwargs = schema.deserialize(dict(
237 254 comment_body=text,
238 255 comment_type=comment_type,
239 256 comment_file=f_path,
240 257 comment_line=line_no,
241 258 renderer_type=renderer,
242 259 status_change=status_change_type,
243 260 resolves_comment_id=resolves_comment_id,
244 261 repo=repo.repo_id,
245 262 user=user.user_id,
246 263 ))
247 264
248 265 comment = ChangesetComment()
249 266 comment.renderer = validated_kwargs['renderer_type']
250 267 comment.text = validated_kwargs['comment_body']
251 268 comment.f_path = validated_kwargs['comment_file']
252 269 comment.line_no = validated_kwargs['comment_line']
253 270 comment.comment_type = validated_kwargs['comment_type']
254 271
255 272 comment.repo = repo
256 273 comment.author = user
257 274 resolved_comment = self.__get_commit_comment(
258 275 validated_kwargs['resolves_comment_id'])
259 276 # check if the comment actually belongs to this PR
260 277 if resolved_comment and resolved_comment.pull_request and \
261 278 resolved_comment.pull_request != pull_request:
262 279 log.warning('Comment tried to resolved unrelated todo comment: %s',
263 280 resolved_comment)
264 281 # comment not bound to this pull request, forbid
265 282 resolved_comment = None
266 283
267 284 elif resolved_comment and resolved_comment.repo and \
268 285 resolved_comment.repo != repo:
269 286 log.warning('Comment tried to resolved unrelated todo comment: %s',
270 287 resolved_comment)
271 288 # comment not bound to this repo, forbid
272 289 resolved_comment = None
273 290
274 291 comment.resolved_comment = resolved_comment
275 292
276 293 pull_request_id = pull_request
277 294
278 295 commit_obj = None
279 296 pull_request_obj = None
280 297
281 298 if commit_id:
282 299 notification_type = EmailNotificationModel.TYPE_COMMIT_COMMENT
283 300 # do a lookup, so we don't pass something bad here
284 301 commit_obj = repo.scm_instance().get_commit(commit_id=commit_id)
285 302 comment.revision = commit_obj.raw_id
286 303
287 304 elif pull_request_id:
288 305 notification_type = EmailNotificationModel.TYPE_PULL_REQUEST_COMMENT
289 306 pull_request_obj = self.__get_pull_request(pull_request_id)
290 307 comment.pull_request = pull_request_obj
291 308 else:
292 309 raise Exception('Please specify commit or pull_request_id')
293 310
294 311 Session().add(comment)
295 312 Session().flush()
296 313 kwargs = {
297 314 'user': user,
298 315 'renderer_type': renderer,
299 316 'repo_name': repo.repo_name,
300 317 'status_change': status_change,
301 318 'status_change_type': status_change_type,
302 319 'comment_body': text,
303 320 'comment_file': f_path,
304 321 'comment_line': line_no,
305 322 'comment_type': comment_type or 'note'
306 323 }
307 324
308 325 if commit_obj:
309 326 recipients = ChangesetComment.get_users(
310 327 revision=commit_obj.raw_id)
311 328 # add commit author if it's in RhodeCode system
312 329 cs_author = User.get_from_cs_author(commit_obj.author)
313 330 if not cs_author:
314 331 # use repo owner if we cannot extract the author correctly
315 332 cs_author = repo.user
316 333 recipients += [cs_author]
317 334
318 335 commit_comment_url = self.get_url(comment, request=request)
319 336
320 337 target_repo_url = h.link_to(
321 338 repo.repo_name,
322 339 h.route_url('repo_summary', repo_name=repo.repo_name))
323 340
324 341 # commit specifics
325 342 kwargs.update({
326 343 'commit': commit_obj,
327 344 'commit_message': commit_obj.message,
328 345 'commit_target_repo': target_repo_url,
329 346 'commit_comment_url': commit_comment_url,
330 347 })
331 348
332 349 elif pull_request_obj:
333 350 # get the current participants of this pull request
334 351 recipients = ChangesetComment.get_users(
335 352 pull_request_id=pull_request_obj.pull_request_id)
336 353 # add pull request author
337 354 recipients += [pull_request_obj.author]
338 355
339 356 # add the reviewers to notification
340 357 recipients += [x.user for x in pull_request_obj.reviewers]
341 358
342 359 pr_target_repo = pull_request_obj.target_repo
343 360 pr_source_repo = pull_request_obj.source_repo
344 361
345 362 pr_comment_url = h.route_url(
346 363 'pullrequest_show',
347 364 repo_name=pr_target_repo.repo_name,
348 365 pull_request_id=pull_request_obj.pull_request_id,
349 366 _anchor='comment-%s' % comment.comment_id)
350 367
351 368 # set some variables for email notification
352 369 pr_target_repo_url = h.route_url(
353 370 'repo_summary', repo_name=pr_target_repo.repo_name)
354 371
355 372 pr_source_repo_url = h.route_url(
356 373 'repo_summary', repo_name=pr_source_repo.repo_name)
357 374
358 375 # pull request specifics
359 376 kwargs.update({
360 377 'pull_request': pull_request_obj,
361 378 'pr_id': pull_request_obj.pull_request_id,
362 379 'pr_target_repo': pr_target_repo,
363 380 'pr_target_repo_url': pr_target_repo_url,
364 381 'pr_source_repo': pr_source_repo,
365 382 'pr_source_repo_url': pr_source_repo_url,
366 383 'pr_comment_url': pr_comment_url,
367 384 'pr_closing': closing_pr,
368 385 })
369 386 if send_email:
370 387 # pre-generate the subject for notification itself
371 388 (subject,
372 389 _h, _e, # we don't care about those
373 390 body_plaintext) = EmailNotificationModel().render_email(
374 391 notification_type, **kwargs)
375 392
376 393 mention_recipients = set(
377 394 self._extract_mentions(text)).difference(recipients)
378 395
379 396 # create notification objects, and emails
380 397 NotificationModel().create(
381 398 created_by=user,
382 399 notification_subject=subject,
383 400 notification_body=body_plaintext,
384 401 notification_type=notification_type,
385 402 recipients=recipients,
386 403 mention_recipients=mention_recipients,
387 404 email_kwargs=kwargs,
388 405 )
389 406
390 407 Session().flush()
391 408 if comment.pull_request:
392 409 action = 'repo.pull_request.comment.create'
393 410 else:
394 411 action = 'repo.commit.comment.create'
395 412
396 413 comment_data = comment.get_api_data()
397 414 self._log_audit_action(
398 415 action, {'data': comment_data}, auth_user, comment)
399 416
400 417 msg_url = ''
401 418 channel = None
402 419 if commit_obj:
403 420 msg_url = commit_comment_url
404 421 repo_name = repo.repo_name
405 422 channel = u'/repo${}$/commit/{}'.format(
406 423 repo_name,
407 424 commit_obj.raw_id
408 425 )
409 426 elif pull_request_obj:
410 427 msg_url = pr_comment_url
411 428 repo_name = pr_target_repo.repo_name
412 429 channel = u'/repo${}$/pr/{}'.format(
413 430 repo_name,
414 431 pull_request_id
415 432 )
416 433
417 434 message = '<strong>{}</strong> {} - ' \
418 435 '<a onclick="window.location=\'{}\';' \
419 436 'window.location.reload()">' \
420 437 '<strong>{}</strong></a>'
421 438 message = message.format(
422 439 user.username, _('made a comment'), msg_url,
423 440 _('Show it now'))
424 441
425 442 channelstream.post_message(
426 443 channel, message, user.username,
427 444 registry=get_current_registry())
428 445
429 446 return comment
430 447
431 448 def delete(self, comment, auth_user):
432 449 """
433 450 Deletes given comment
434 451 """
435 452 comment = self.__get_commit_comment(comment)
436 453 old_data = comment.get_api_data()
437 454 Session().delete(comment)
438 455
439 456 if comment.pull_request:
440 457 action = 'repo.pull_request.comment.delete'
441 458 else:
442 459 action = 'repo.commit.comment.delete'
443 460
444 461 self._log_audit_action(
445 462 action, {'old_data': old_data}, auth_user, comment)
446 463
447 464 return comment
448 465
449 466 def get_all_comments(self, repo_id, revision=None, pull_request=None):
450 467 q = ChangesetComment.query()\
451 468 .filter(ChangesetComment.repo_id == repo_id)
452 469 if revision:
453 470 q = q.filter(ChangesetComment.revision == revision)
454 471 elif pull_request:
455 472 pull_request = self.__get_pull_request(pull_request)
456 473 q = q.filter(ChangesetComment.pull_request == pull_request)
457 474 else:
458 475 raise Exception('Please specify commit or pull_request')
459 476 q = q.order_by(ChangesetComment.created_on)
460 477 return q.all()
461 478
462 479 def get_url(self, comment, request=None, permalink=False):
463 480 if not request:
464 481 request = get_current_request()
465 482
466 483 comment = self.__get_commit_comment(comment)
467 484 if comment.pull_request:
468 485 pull_request = comment.pull_request
469 486 if permalink:
470 487 return request.route_url(
471 488 'pull_requests_global',
472 489 pull_request_id=pull_request.pull_request_id,
473 490 _anchor='comment-%s' % comment.comment_id)
474 491 else:
475 492 return request.route_url(
476 493 'pullrequest_show',
477 494 repo_name=safe_str(pull_request.target_repo.repo_name),
478 495 pull_request_id=pull_request.pull_request_id,
479 496 _anchor='comment-%s' % comment.comment_id)
480 497
481 498 else:
482 499 repo = comment.repo
483 500 commit_id = comment.revision
484 501
485 502 if permalink:
486 503 return request.route_url(
487 504 'repo_commit', repo_name=safe_str(repo.repo_id),
488 505 commit_id=commit_id,
489 506 _anchor='comment-%s' % comment.comment_id)
490 507
491 508 else:
492 509 return request.route_url(
493 510 'repo_commit', repo_name=safe_str(repo.repo_name),
494 511 commit_id=commit_id,
495 512 _anchor='comment-%s' % comment.comment_id)
496 513
497 514 def get_comments(self, repo_id, revision=None, pull_request=None):
498 515 """
499 516 Gets main comments based on revision or pull_request_id
500 517
501 518 :param repo_id:
502 519 :param revision:
503 520 :param pull_request:
504 521 """
505 522
506 523 q = ChangesetComment.query()\
507 524 .filter(ChangesetComment.repo_id == repo_id)\
508 525 .filter(ChangesetComment.line_no == None)\
509 526 .filter(ChangesetComment.f_path == None)
510 527 if revision:
511 528 q = q.filter(ChangesetComment.revision == revision)
512 529 elif pull_request:
513 530 pull_request = self.__get_pull_request(pull_request)
514 531 q = q.filter(ChangesetComment.pull_request == pull_request)
515 532 else:
516 533 raise Exception('Please specify commit or pull_request')
517 534 q = q.order_by(ChangesetComment.created_on)
518 535 return q.all()
519 536
520 537 def get_inline_comments(self, repo_id, revision=None, pull_request=None):
521 538 q = self._get_inline_comments_query(repo_id, revision, pull_request)
522 539 return self._group_comments_by_path_and_line_number(q)
523 540
524 541 def get_inline_comments_count(self, inline_comments, skip_outdated=True,
525 542 version=None):
526 543 inline_cnt = 0
527 544 for fname, per_line_comments in inline_comments.iteritems():
528 545 for lno, comments in per_line_comments.iteritems():
529 546 for comm in comments:
530 547 if not comm.outdated_at_version(version) and skip_outdated:
531 548 inline_cnt += 1
532 549
533 550 return inline_cnt
534 551
535 552 def get_outdated_comments(self, repo_id, pull_request):
536 553 # TODO: johbo: Remove `repo_id`, it is not needed to find the comments
537 554 # of a pull request.
538 555 q = self._all_inline_comments_of_pull_request(pull_request)
539 556 q = q.filter(
540 557 ChangesetComment.display_state ==
541 558 ChangesetComment.COMMENT_OUTDATED
542 559 ).order_by(ChangesetComment.comment_id.asc())
543 560
544 561 return self._group_comments_by_path_and_line_number(q)
545 562
546 563 def _get_inline_comments_query(self, repo_id, revision, pull_request):
547 564 # TODO: johbo: Split this into two methods: One for PR and one for
548 565 # commit.
549 566 if revision:
550 567 q = Session().query(ChangesetComment).filter(
551 568 ChangesetComment.repo_id == repo_id,
552 569 ChangesetComment.line_no != null(),
553 570 ChangesetComment.f_path != null(),
554 571 ChangesetComment.revision == revision)
555 572
556 573 elif pull_request:
557 574 pull_request = self.__get_pull_request(pull_request)
558 575 if not CommentsModel.use_outdated_comments(pull_request):
559 576 q = self._visible_inline_comments_of_pull_request(pull_request)
560 577 else:
561 578 q = self._all_inline_comments_of_pull_request(pull_request)
562 579
563 580 else:
564 581 raise Exception('Please specify commit or pull_request_id')
565 582 q = q.order_by(ChangesetComment.comment_id.asc())
566 583 return q
567 584
568 585 def _group_comments_by_path_and_line_number(self, q):
569 586 comments = q.all()
570 587 paths = collections.defaultdict(lambda: collections.defaultdict(list))
571 588 for co in comments:
572 589 paths[co.f_path][co.line_no].append(co)
573 590 return paths
574 591
575 592 @classmethod
576 593 def needed_extra_diff_context(cls):
577 594 return max(cls.DIFF_CONTEXT_BEFORE, cls.DIFF_CONTEXT_AFTER)
578 595
579 596 def outdate_comments(self, pull_request, old_diff_data, new_diff_data):
580 597 if not CommentsModel.use_outdated_comments(pull_request):
581 598 return
582 599
583 600 comments = self._visible_inline_comments_of_pull_request(pull_request)
584 601 comments_to_outdate = comments.all()
585 602
586 603 for comment in comments_to_outdate:
587 604 self._outdate_one_comment(comment, old_diff_data, new_diff_data)
588 605
589 606 def _outdate_one_comment(self, comment, old_diff_proc, new_diff_proc):
590 607 diff_line = _parse_comment_line_number(comment.line_no)
591 608
592 609 try:
593 610 old_context = old_diff_proc.get_context_of_line(
594 611 path=comment.f_path, diff_line=diff_line)
595 612 new_context = new_diff_proc.get_context_of_line(
596 613 path=comment.f_path, diff_line=diff_line)
597 614 except (diffs.LineNotInDiffException,
598 615 diffs.FileNotInDiffException):
599 616 comment.display_state = ChangesetComment.COMMENT_OUTDATED
600 617 return
601 618
602 619 if old_context == new_context:
603 620 return
604 621
605 622 if self._should_relocate_diff_line(diff_line):
606 623 new_diff_lines = new_diff_proc.find_context(
607 624 path=comment.f_path, context=old_context,
608 625 offset=self.DIFF_CONTEXT_BEFORE)
609 626 if not new_diff_lines:
610 627 comment.display_state = ChangesetComment.COMMENT_OUTDATED
611 628 else:
612 629 new_diff_line = self._choose_closest_diff_line(
613 630 diff_line, new_diff_lines)
614 631 comment.line_no = _diff_to_comment_line_number(new_diff_line)
615 632 else:
616 633 comment.display_state = ChangesetComment.COMMENT_OUTDATED
617 634
618 635 def _should_relocate_diff_line(self, diff_line):
619 636 """
620 637 Checks if relocation shall be tried for the given `diff_line`.
621 638
622 639 If a comment points into the first lines, then we can have a situation
623 640 that after an update another line has been added on top. In this case
624 641 we would find the context still and move the comment around. This
625 642 would be wrong.
626 643 """
627 644 should_relocate = (
628 645 (diff_line.new and diff_line.new > self.DIFF_CONTEXT_BEFORE) or
629 646 (diff_line.old and diff_line.old > self.DIFF_CONTEXT_BEFORE))
630 647 return should_relocate
631 648
632 649 def _choose_closest_diff_line(self, diff_line, new_diff_lines):
633 650 candidate = new_diff_lines[0]
634 651 best_delta = _diff_line_delta(diff_line, candidate)
635 652 for new_diff_line in new_diff_lines[1:]:
636 653 delta = _diff_line_delta(diff_line, new_diff_line)
637 654 if delta < best_delta:
638 655 candidate = new_diff_line
639 656 best_delta = delta
640 657 return candidate
641 658
642 659 def _visible_inline_comments_of_pull_request(self, pull_request):
643 660 comments = self._all_inline_comments_of_pull_request(pull_request)
644 661 comments = comments.filter(
645 662 coalesce(ChangesetComment.display_state, '') !=
646 663 ChangesetComment.COMMENT_OUTDATED)
647 664 return comments
648 665
649 666 def _all_inline_comments_of_pull_request(self, pull_request):
650 667 comments = Session().query(ChangesetComment)\
651 668 .filter(ChangesetComment.line_no != None)\
652 669 .filter(ChangesetComment.f_path != None)\
653 670 .filter(ChangesetComment.pull_request == pull_request)
654 671 return comments
655 672
656 673 def _all_general_comments_of_pull_request(self, pull_request):
657 674 comments = Session().query(ChangesetComment)\
658 675 .filter(ChangesetComment.line_no == None)\
659 676 .filter(ChangesetComment.f_path == None)\
660 677 .filter(ChangesetComment.pull_request == pull_request)
661 678 return comments
662 679
663 680 @staticmethod
664 681 def use_outdated_comments(pull_request):
665 682 settings_model = VcsSettingsModel(repo=pull_request.target_repo)
666 683 settings = settings_model.get_general_settings()
667 684 return settings.get('rhodecode_use_outdated_comments', False)
668 685
669 686
670 687 def _parse_comment_line_number(line_no):
671 688 """
672 689 Parses line numbers of the form "(o|n)\d+" and returns them in a tuple.
673 690 """
674 691 old_line = None
675 692 new_line = None
676 693 if line_no.startswith('o'):
677 694 old_line = int(line_no[1:])
678 695 elif line_no.startswith('n'):
679 696 new_line = int(line_no[1:])
680 697 else:
681 698 raise ValueError("Comment lines have to start with either 'o' or 'n'.")
682 699 return diffs.DiffLineNumber(old_line, new_line)
683 700
684 701
685 702 def _diff_to_comment_line_number(diff_line):
686 703 if diff_line.new is not None:
687 704 return u'n{}'.format(diff_line.new)
688 705 elif diff_line.old is not None:
689 706 return u'o{}'.format(diff_line.old)
690 707 return u''
691 708
692 709
693 710 def _diff_line_delta(a, b):
694 711 if None not in (a.new, b.new):
695 712 return abs(a.new - b.new)
696 713 elif None not in (a.old, b.old):
697 714 return abs(a.old - b.old)
698 715 else:
699 716 raise ValueError(
700 717 "Cannot compute delta between {} and {}".format(a, b))
@@ -1,444 +1,475 b''
1 1
2 2
3 3 //BUTTONS
4 4 button,
5 5 .btn,
6 6 input[type="button"] {
7 7 -webkit-appearance: none;
8 8 display: inline-block;
9 9 margin: 0 @padding/3 0 0;
10 10 padding: @button-padding;
11 11 text-align: center;
12 12 font-size: @basefontsize;
13 13 line-height: 1em;
14 14 font-family: @text-light;
15 15 text-decoration: none;
16 16 text-shadow: none;
17 17 color: @grey2;
18 18 background-color: white;
19 19 background-image: none;
20 20 border: none;
21 21 .border ( @border-thickness-buttons, @grey5 );
22 22 .border-radius (@border-radius);
23 23 cursor: pointer;
24 24 white-space: nowrap;
25 25 -webkit-transition: background .3s,color .3s;
26 26 -moz-transition: background .3s,color .3s;
27 27 -o-transition: background .3s,color .3s;
28 28 transition: background .3s,color .3s;
29 29 box-shadow: @button-shadow;
30 30 -webkit-box-shadow: @button-shadow;
31 31
32 32
33 33
34 34 a {
35 35 display: block;
36 36 margin: 0;
37 37 padding: 0;
38 38 color: inherit;
39 39 text-decoration: none;
40 40
41 41 &:hover {
42 42 text-decoration: none;
43 43 }
44 44 }
45 45
46 46 &:focus,
47 47 &:active {
48 48 outline:none;
49 49 }
50 50 &:hover {
51 51 color: @rcdarkblue;
52 52 background-color: @white;
53 53 .border ( @border-thickness, @grey4 );
54 54 }
55 55
56 56 .icon-remove {
57 57 display: none;
58 58 }
59 59
60 60 //disabled buttons
61 61 //last; overrides any other styles
62 62 &:disabled {
63 63 opacity: .7;
64 64 cursor: auto;
65 65 background-color: white;
66 66 color: @grey4;
67 67 text-shadow: none;
68 68 }
69 69
70 70 &.no-margin {
71 71 margin: 0 0 0 0;
72 72 }
73 73
74 &.btn-active {
75 color: @rcdarkblue;
76 background-color: @white;
77 .border ( @border-thickness, @rcdarkblue );
78 }
79
74 80 }
75 81
76 82
77 83 .btn-default {
78 84 border: @border-thickness solid @grey5;
79 85 background-image: none;
80 86 color: @grey2;
81 87
82 88 a {
83 89 color: @grey2;
84 90 }
85 91
86 92 &:hover,
87 93 &.active {
88 94 color: @rcdarkblue;
89 95 background-color: @white;
90 96 .border ( @border-thickness, @grey4 );
91 97
92 98 a {
93 99 color: @grey2;
94 100 }
95 101 }
96 102 &:disabled {
97 103 .border ( @border-thickness-buttons, @grey5 );
98 104 background-color: transparent;
99 105 }
106 &.btn-active {
107 color: @rcdarkblue;
108 background-color: @white;
109 .border ( @border-thickness, @rcdarkblue );
110 }
100 111 }
101 112
102 113 .btn-primary,
103 114 .btn-small, /* TODO: anderson: remove .btn-small to not mix with the new btn-sm */
104 115 .btn-success {
105 116 .border ( @border-thickness, @rcblue );
106 117 background-color: @rcblue;
107 118 color: white;
108 119
109 120 a {
110 121 color: white;
111 122 }
112 123
113 124 &:hover,
114 125 &.active {
115 126 .border ( @border-thickness, @rcdarkblue );
116 127 color: white;
117 128 background-color: @rcdarkblue;
118 129
119 130 a {
120 131 color: white;
121 132 }
122 133 }
123 134 &:disabled {
124 135 background-color: @rcblue;
125 136 }
126 137 }
127 138
128 139 .btn-secondary {
129 140 &:extend(.btn-default);
130 141
131 142 background-color: white;
132 143
133 144 &:focus {
134 145 outline: 0;
135 146 }
136 147
137 148 &:hover {
138 149 &:extend(.btn-default:hover);
139 150 }
140 151
141 152 &.btn-link {
142 153 &:extend(.btn-link);
143 154 color: @rcblue;
144 155 }
145 156
146 157 &:disabled {
147 158 color: @rcblue;
148 159 background-color: white;
149 160 }
150 161 }
151 162
152 163 .btn-warning,
153 164 .btn-danger,
154 165 .revoke_perm,
155 166 .btn-x,
156 167 .form .action_button.btn-x {
157 168 .border ( @border-thickness, @alert2 );
158 169 background-color: white;
159 170 color: @alert2;
160 171
161 172 a {
162 173 color: @alert2;
163 174 }
164 175
165 176 &:hover,
166 177 &.active {
167 178 .border ( @border-thickness, @alert2 );
168 179 color: white;
169 180 background-color: @alert2;
170 181
171 182 a {
172 183 color: white;
173 184 }
174 185 }
175 186
176 187 i {
177 188 display:none;
178 189 }
179 190
180 191 &:disabled {
181 192 background-color: white;
182 193 color: @alert2;
183 194 }
184 195 }
185 196
186 197 .btn-approved-status {
187 198 .border ( @border-thickness, @alert1 );
188 199 background-color: white;
189 200 color: @alert1;
190 201
191 202 }
192 203
193 204 .btn-rejected-status {
194 205 .border ( @border-thickness, @alert2 );
195 206 background-color: white;
196 207 color: @alert2;
197 208 }
198 209
199 210 .btn-sm,
200 211 .btn-mini,
201 212 .field-sm .btn {
202 213 padding: @padding/3;
203 214 }
204 215
205 216 .btn-xs {
206 217 padding: @padding/4;
207 218 }
208 219
209 220 .btn-lg {
210 221 padding: @padding * 1.2;
211 222 }
212 223
213 224 .btn-group {
214 225 display: inline-block;
215 226 .btn {
216 227 float: left;
217 margin: 0 0 0 -1px;
228 margin: 0 0 0 0;
229 // first item
230 &:first-of-type:not(:last-of-type) {
231 border-radius: @border-radius 0 0 @border-radius;
232
233 }
234 // middle elements
235 &:not(:first-of-type):not(:last-of-type) {
236 border-radius: 0;
237 border-left-width: 0;
238 border-right-width: 0;
239 }
240 // last item
241 &:last-of-type:not(:first-of-type) {
242 border-radius: 0 @border-radius @border-radius 0;
243 }
244
245 &:only-child {
246 border-radius: @border-radius;
247 }
218 248 }
249
219 250 }
220 251
221 252 .btn-link {
222 253 background: transparent;
223 254 border: none;
224 255 padding: 0;
225 256 color: @rcblue;
226 257
227 258 &:hover {
228 259 background: transparent;
229 260 border: none;
230 261 color: @rcdarkblue;
231 262 }
232 263
233 264 //disabled buttons
234 265 //last; overrides any other styles
235 266 &:disabled {
236 267 opacity: .7;
237 268 cursor: auto;
238 269 background-color: white;
239 270 color: @grey4;
240 271 text-shadow: none;
241 272 }
242 273
243 274 // TODO: johbo: Check if we can avoid this, indicates that the structure
244 275 // is not yet good.
245 276 // lisa: The button CSS reflects the button HTML; both need a cleanup.
246 277 &.btn-danger {
247 278 color: @alert2;
248 279
249 280 &:hover {
250 281 color: darken(@alert2,30%);
251 282 }
252 283
253 284 &:disabled {
254 285 color: @alert2;
255 286 }
256 287 }
257 288 }
258 289
259 290 .btn-social {
260 291 &:extend(.btn-default);
261 292 margin: 5px 5px 5px 0px;
262 293 min-width: 160px;
263 294 }
264 295
265 296 // TODO: johbo: check these exceptions
266 297
267 298 .links {
268 299
269 300 .btn + .btn {
270 301 margin-top: @padding;
271 302 }
272 303 }
273 304
274 305
275 306 .action_button {
276 307 display:inline;
277 308 margin: 0;
278 309 padding: 0 1em 0 0;
279 310 font-size: inherit;
280 311 color: @rcblue;
281 312 border: none;
282 313 border-radius: 0;
283 314 background-color: transparent;
284 315
285 316 &.last-item {
286 317 border: none;
287 318 padding: 0 0 0 0;
288 319 }
289 320
290 321 &:last-child {
291 322 border: none;
292 323 padding: 0 0 0 0;
293 324 }
294 325
295 326 &:hover {
296 327 color: @rcdarkblue;
297 328 background-color: transparent;
298 329 border: none;
299 330 }
300 331 }
301 332 .grid_delete {
302 333 .action_button {
303 334 border: none;
304 335 }
305 336 }
306 337
307 338
308 339 // TODO: johbo: Form button tweaks, check if we can use the classes instead
309 340 input[type="submit"] {
310 341 &:extend(.btn-primary);
311 342
312 343 &:focus {
313 344 outline: 0;
314 345 }
315 346
316 347 &:hover {
317 348 &:extend(.btn-primary:hover);
318 349 }
319 350
320 351 &.btn-link {
321 352 &:extend(.btn-link);
322 353 color: @rcblue;
323 354
324 355 &:disabled {
325 356 color: @rcblue;
326 357 background-color: transparent;
327 358 }
328 359 }
329 360
330 361 &:disabled {
331 362 .border ( @border-thickness-buttons, @rcblue );
332 363 background-color: @rcblue;
333 364 color: white;
334 365 opacity: 0.5;
335 366 }
336 367 }
337 368
338 369 input[type="reset"] {
339 370 &:extend(.btn-default);
340 371
341 372 // TODO: johbo: Check if this tweak can be avoided.
342 373 background: transparent;
343 374
344 375 &:focus {
345 376 outline: 0;
346 377 }
347 378
348 379 &:hover {
349 380 &:extend(.btn-default:hover);
350 381 }
351 382
352 383 &.btn-link {
353 384 &:extend(.btn-link);
354 385 color: @rcblue;
355 386
356 387 &:disabled {
357 388 border: none;
358 389 }
359 390 }
360 391
361 392 &:disabled {
362 393 .border ( @border-thickness-buttons, @rcblue );
363 394 background-color: white;
364 395 color: @rcblue;
365 396 }
366 397 }
367 398
368 399 input[type="submit"],
369 400 input[type="reset"] {
370 401 &.btn-danger {
371 402 &:extend(.btn-danger);
372 403
373 404 &:focus {
374 405 outline: 0;
375 406 }
376 407
377 408 &:hover {
378 409 &:extend(.btn-danger:hover);
379 410 }
380 411
381 412 &.btn-link {
382 413 &:extend(.btn-link);
383 414 color: @alert2;
384 415
385 416 &:hover {
386 417 color: darken(@alert2,30%);
387 418 }
388 419 }
389 420
390 421 &:disabled {
391 422 color: @alert2;
392 423 background-color: white;
393 424 }
394 425 }
395 426 &.btn-danger-action {
396 427 .border ( @border-thickness, @alert2 );
397 428 background-color: @alert2;
398 429 color: white;
399 430
400 431 a {
401 432 color: white;
402 433 }
403 434
404 435 &:hover {
405 436 background-color: darken(@alert2,20%);
406 437 }
407 438
408 439 &.active {
409 440 .border ( @border-thickness, @alert2 );
410 441 color: white;
411 442 background-color: @alert2;
412 443
413 444 a {
414 445 color: white;
415 446 }
416 447 }
417 448
418 449 &:disabled {
419 450 background-color: white;
420 451 color: @alert2;
421 452 }
422 453 }
423 454 }
424 455
425 456
426 457 .button-links {
427 458 float: left;
428 459 display: inline;
429 460 margin: 0;
430 461 padding-left: 0;
431 462 list-style: none;
432 463 text-align: right;
433 464
434 465 li {
435 466
436 467
437 468 }
438 469
439 470 li.active {
440 471 background-color: @grey6;
441 472 .border ( @border-thickness, @grey4 );
442 473 }
443 474
444 475 }
@@ -1,1271 +1,1284 b''
1 1 // Default styles
2 2
3 3 .diff-collapse {
4 4 margin: @padding 0;
5 5 text-align: right;
6 6 }
7 7
8 8 .diff-container {
9 9 margin-bottom: @space;
10 10
11 11 .diffblock {
12 12 margin-bottom: @space;
13 13 }
14 14
15 15 &.hidden {
16 16 display: none;
17 17 overflow: hidden;
18 18 }
19 19 }
20 20
21 21
22 22 div.diffblock .sidebyside {
23 23 background: #ffffff;
24 24 }
25 25
26 26 div.diffblock {
27 27 overflow-x: auto;
28 28 overflow-y: hidden;
29 29 clear: both;
30 30 padding: 0px;
31 31 background: @grey6;
32 32 border: @border-thickness solid @grey5;
33 33 -webkit-border-radius: @border-radius @border-radius 0px 0px;
34 34 border-radius: @border-radius @border-radius 0px 0px;
35 35
36 36
37 37 .comments-number {
38 38 float: right;
39 39 }
40 40
41 41 // BEGIN CODE-HEADER STYLES
42 42
43 43 .code-header {
44 44 background: @grey6;
45 45 padding: 10px 0 10px 0;
46 46 height: auto;
47 47 width: 100%;
48 48
49 49 .hash {
50 50 float: left;
51 51 padding: 2px 0 0 2px;
52 52 }
53 53
54 54 .date {
55 55 float: left;
56 56 text-transform: uppercase;
57 57 padding: 4px 0px 0px 2px;
58 58 }
59 59
60 60 div {
61 61 margin-left: 4px;
62 62 }
63 63
64 64 div.compare_header {
65 65 min-height: 40px;
66 66 margin: 0;
67 67 padding: 0 @padding;
68 68
69 69 .drop-menu {
70 70 float:left;
71 71 display: block;
72 72 margin:0 0 @padding 0;
73 73 }
74 74
75 75 .compare-label {
76 76 float: left;
77 77 clear: both;
78 78 display: inline-block;
79 79 min-width: 5em;
80 80 margin: 0;
81 81 padding: @button-padding @button-padding @button-padding 0;
82 82 font-weight: @text-semibold-weight;
83 83 font-family: @text-semibold;
84 84 }
85 85
86 86 .compare-buttons {
87 87 float: left;
88 88 margin: 0;
89 89 padding: 0 0 @padding;
90 90
91 91 .btn {
92 92 margin: 0 @padding 0 0;
93 93 }
94 94 }
95 95 }
96 96
97 97 }
98 98
99 99 .parents {
100 100 float: left;
101 101 width: 100px;
102 102 font-weight: 400;
103 103 vertical-align: middle;
104 104 padding: 0px 2px 0px 2px;
105 105 background-color: @grey6;
106 106
107 107 #parent_link {
108 108 margin: 00px 2px;
109 109
110 110 &.double {
111 111 margin: 0px 2px;
112 112 }
113 113
114 114 &.disabled{
115 115 margin-right: @padding;
116 116 }
117 117 }
118 118 }
119 119
120 120 .children {
121 121 float: right;
122 122 width: 100px;
123 123 font-weight: 400;
124 124 vertical-align: middle;
125 125 text-align: right;
126 126 padding: 0px 2px 0px 2px;
127 127 background-color: @grey6;
128 128
129 129 #child_link {
130 130 margin: 0px 2px;
131 131
132 132 &.double {
133 133 margin: 0px 2px;
134 134 }
135 135
136 136 &.disabled{
137 137 margin-right: @padding;
138 138 }
139 139 }
140 140 }
141 141
142 142 .changeset_header {
143 143 height: 16px;
144 144
145 145 & > div{
146 146 margin-right: @padding;
147 147 }
148 148 }
149 149
150 150 .changeset_file {
151 151 text-align: left;
152 152 float: left;
153 153 padding: 0;
154 154
155 155 a{
156 156 display: inline-block;
157 157 margin-right: 0.5em;
158 158 }
159 159
160 160 #selected_mode{
161 161 margin-left: 0;
162 162 }
163 163 }
164 164
165 165 .diff-menu-wrapper {
166 166 float: left;
167 167 }
168 168
169 169 .diff-menu {
170 170 position: absolute;
171 171 background: none repeat scroll 0 0 #FFFFFF;
172 172 border-color: #003367 @grey3 @grey3;
173 173 border-right: 1px solid @grey3;
174 174 border-style: solid solid solid;
175 175 border-width: @border-thickness;
176 176 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
177 177 margin-top: 5px;
178 178 margin-left: 1px;
179 179 }
180 180
181 181 .diff-actions, .editor-actions {
182 182 float: left;
183 183
184 184 input{
185 185 margin: 0 0.5em 0 0;
186 186 }
187 187 }
188 188
189 189 // END CODE-HEADER STYLES
190 190
191 191 // BEGIN CODE-BODY STYLES
192 192
193 193 .code-body {
194 194 padding: 0;
195 195 background-color: #ffffff;
196 196 position: relative;
197 197 max-width: none;
198 198 box-sizing: border-box;
199 199 // TODO: johbo: Parent has overflow: auto, this forces the child here
200 200 // to have the intended size and to scroll. Should be simplified.
201 201 width: 100%;
202 202 overflow-x: auto;
203 203 }
204 204
205 205 pre.raw {
206 206 background: white;
207 207 color: @grey1;
208 208 }
209 209 // END CODE-BODY STYLES
210 210
211 211 }
212 212
213 213
214 214 table.code-difftable {
215 215 border-collapse: collapse;
216 216 width: 99%;
217 217 border-radius: 0px !important;
218 218
219 219 td {
220 220 padding: 0 !important;
221 221 background: none !important;
222 222 border: 0 !important;
223 223 }
224 224
225 225 .context {
226 226 background: none repeat scroll 0 0 #DDE7EF;
227 227 }
228 228
229 229 .add {
230 230 background: none repeat scroll 0 0 #DDFFDD;
231 231
232 232 ins {
233 233 background: none repeat scroll 0 0 #AAFFAA;
234 234 text-decoration: none;
235 235 }
236 236 }
237 237
238 238 .del {
239 239 background: none repeat scroll 0 0 #FFDDDD;
240 240
241 241 del {
242 242 background: none repeat scroll 0 0 #FFAAAA;
243 243 text-decoration: none;
244 244 }
245 245 }
246 246
247 247 /** LINE NUMBERS **/
248 248 .lineno {
249 249 padding-left: 2px !important;
250 250 padding-right: 2px;
251 251 text-align: right;
252 252 width: 32px;
253 253 -moz-user-select: none;
254 254 -webkit-user-select: none;
255 255 border-right: @border-thickness solid @grey5 !important;
256 256 border-left: 0px solid #CCC !important;
257 257 border-top: 0px solid #CCC !important;
258 258 border-bottom: none !important;
259 259
260 260 a {
261 261 &:extend(pre);
262 262 text-align: right;
263 263 padding-right: 2px;
264 264 cursor: pointer;
265 265 display: block;
266 266 width: 32px;
267 267 }
268 268 }
269 269
270 270 .context {
271 271 cursor: auto;
272 272 &:extend(pre);
273 273 }
274 274
275 275 .lineno-inline {
276 276 background: none repeat scroll 0 0 #FFF !important;
277 277 padding-left: 2px;
278 278 padding-right: 2px;
279 279 text-align: right;
280 280 width: 30px;
281 281 -moz-user-select: none;
282 282 -webkit-user-select: none;
283 283 }
284 284
285 285 /** CODE **/
286 286 .code {
287 287 display: block;
288 288 width: 100%;
289 289
290 290 td {
291 291 margin: 0;
292 292 padding: 0;
293 293 }
294 294
295 295 pre {
296 296 margin: 0;
297 297 padding: 0;
298 298 margin-left: .5em;
299 299 }
300 300 }
301 301 }
302 302
303 303
304 304 // Comments
305 305
306 306 div.comment:target {
307 307 border-left: 6px solid @comment-highlight-color !important;
308 308 padding-left: 3px;
309 309 margin-left: -9px;
310 310 }
311 311
312 312 //TODO: anderson: can't get an absolute number out of anything, so had to put the
313 313 //current values that might change. But to make it clear I put as a calculation
314 314 @comment-max-width: 1065px;
315 315 @pr-extra-margin: 34px;
316 316 @pr-border-spacing: 4px;
317 317 @pr-comment-width: @comment-max-width - @pr-extra-margin - @pr-border-spacing;
318 318
319 319 // Pull Request
320 320 .cs_files .code-difftable {
321 321 border: @border-thickness solid @grey5; //borders only on PRs
322 322
323 323 .comment-inline-form,
324 324 div.comment {
325 325 width: @pr-comment-width;
326 326 }
327 327 }
328 328
329 329 // Changeset
330 330 .code-difftable {
331 331 .comment-inline-form,
332 332 div.comment {
333 333 width: @comment-max-width;
334 334 }
335 335 }
336 336
337 337 //Style page
338 338 @style-extra-margin: @sidebar-width + (@sidebarpadding * 3) + @padding;
339 339 #style-page .code-difftable{
340 340 .comment-inline-form,
341 341 div.comment {
342 342 width: @comment-max-width - @style-extra-margin;
343 343 }
344 344 }
345 345
346 346 #context-bar > h2 {
347 347 font-size: 20px;
348 348 }
349 349
350 350 #context-bar > h2> a {
351 351 font-size: 20px;
352 352 }
353 353 // end of defaults
354 354
355 355 .file_diff_buttons {
356 356 padding: 0 0 @padding;
357 357
358 358 .drop-menu {
359 359 float: left;
360 360 margin: 0 @padding 0 0;
361 361 }
362 362 .btn {
363 363 margin: 0 @padding 0 0;
364 364 }
365 365 }
366 366
367 367 .code-body.textarea.editor {
368 368 max-width: none;
369 369 padding: 15px;
370 370 }
371 371
372 372 td.injected_diff{
373 373 max-width: 1178px;
374 374 overflow-x: auto;
375 375 overflow-y: hidden;
376 376
377 377 div.diff-container,
378 378 div.diffblock{
379 379 max-width: 100%;
380 380 }
381 381
382 382 div.code-body {
383 383 max-width: 1124px;
384 384 overflow-x: auto;
385 385 overflow-y: hidden;
386 386 padding: 0;
387 387 }
388 388 div.diffblock {
389 389 border: none;
390 390 }
391 391
392 392 &.inline-form {
393 393 width: 99%
394 394 }
395 395 }
396 396
397 397
398 398 table.code-difftable {
399 399 width: 100%;
400 400 }
401 401
402 402 /** PYGMENTS COLORING **/
403 403 div.codeblock {
404 404
405 405 // TODO: johbo: Added interim to get rid of the margin around
406 406 // Select2 widgets. This needs further cleanup.
407 407 overflow: auto;
408 408 padding: 0px;
409 409 border: @border-thickness solid @grey6;
410 410 .border-radius(@border-radius);
411 411
412 412 #remove_gist {
413 413 float: right;
414 414 }
415 415
416 416 .gist_url {
417 417 padding: 0px 0px 10px 0px;
418 418 }
419 419
420 420 .author {
421 421 clear: both;
422 422 vertical-align: middle;
423 423 font-weight: @text-bold-weight;
424 424 font-family: @text-bold;
425 425 }
426 426
427 427 .btn-mini {
428 428 float: left;
429 429 margin: 0 5px 0 0;
430 430 }
431 431
432 432 .code-header {
433 433 padding: @padding;
434 434 border-bottom: @border-thickness solid @grey5;
435 435
436 436 .rc-user {
437 437 min-width: 0;
438 438 margin-right: .5em;
439 439 }
440 440
441 441 .stats {
442 442 clear: both;
443 443 margin: 0 0 @padding 0;
444 444 padding: 0;
445 445 .left {
446 446 float: left;
447 447 clear: left;
448 448 max-width: 75%;
449 449 margin: 0 0 @padding 0;
450 450
451 451 &.item {
452 452 margin-right: @padding;
453 453 &.last { border-right: none; }
454 454 }
455 455 }
456 456 .buttons { float: right; }
457 457 .author {
458 458 height: 25px; margin-left: 15px; font-weight: bold;
459 459 }
460 460 }
461 461
462 462 .commit {
463 463 margin: 5px 0 0 26px;
464 464 font-weight: normal;
465 465 white-space: pre-wrap;
466 466 }
467 467 }
468 468
469 469 .message {
470 470 position: relative;
471 471 margin: @padding;
472 472
473 473 .codeblock-label {
474 474 margin: 0 0 1em 0;
475 475 }
476 476 }
477 477
478 478 .code-body {
479 479 padding: 0.8em 1em;
480 480 background-color: #ffffff;
481 481 min-width: 100%;
482 482 box-sizing: border-box;
483 483 // TODO: johbo: Parent has overflow: auto, this forces the child here
484 484 // to have the intended size and to scroll. Should be simplified.
485 485 width: 100%;
486 486 overflow-x: auto;
487 487
488 488 img.rendered-binary {
489 489 height: auto;
490 490 width: 100%;
491 491 }
492 492
493 493 .markdown-block {
494 494 padding: 1em 0;
495 495 }
496 496 }
497 497
498 498 .codeblock-header {
499 499 background: @grey7;
500 500 height: 36px;
501 501 }
502 502
503 503 .path {
504 504 border-bottom: 1px solid @grey6;
505 505 padding: .65em 1em;
506 506 height: 18px;
507 507 }
508 508 }
509 509
510 510 .code-highlighttable,
511 511 div.codeblock {
512 512
513 513 &.readme {
514 514 background-color: white;
515 515 }
516 516
517 517 .markdown-block table {
518 518 border-collapse: collapse;
519 519
520 520 th,
521 521 td {
522 522 padding: .5em;
523 523 border: @border-thickness solid @border-default-color;
524 524 }
525 525 }
526 526
527 527 table {
528 528 border: 0px;
529 529 margin: 0;
530 530 letter-spacing: normal;
531 531
532 532
533 533 td {
534 534 border: 0px;
535 535 vertical-align: top;
536 536 }
537 537 }
538 538 }
539 539
540 540 div.codeblock .code-header .search-path { padding: 0 0 0 10px; }
541 541 div.search-code-body {
542 542 background-color: #ffffff; padding: 5px 0 5px 10px;
543 543 pre {
544 544 .match { background-color: #faffa6;}
545 545 .break { display: block; width: 100%; background-color: #DDE7EF; color: #747474; }
546 546 }
547 547 .code-highlighttable {
548 548 border-collapse: collapse;
549 549
550 550 tr:hover {
551 551 background: #fafafa;
552 552 }
553 553 td.code {
554 554 padding-left: 10px;
555 555 }
556 556 td.line {
557 557 border-right: 1px solid #ccc !important;
558 558 padding-right: 10px;
559 559 text-align: right;
560 560 font-family: @text-monospace;
561 561 span {
562 562 white-space: pre-wrap;
563 563 color: #666666;
564 564 }
565 565 }
566 566 }
567 567 }
568 568
569 569 div.annotatediv { margin-left: 2px; margin-right: 4px; }
570 570 .code-highlight {
571 571 margin: 0; padding: 0; border-left: @border-thickness solid @grey5;
572 572 pre, .linenodiv pre { padding: 0 5px; margin: 0; }
573 573 pre div:target {background-color: @comment-highlight-color !important;}
574 574 }
575 575
576 576 .linenos a { text-decoration: none; }
577 577
578 578 .CodeMirror-selected { background: @rchighlightblue; }
579 579 .CodeMirror-focused .CodeMirror-selected { background: @rchighlightblue; }
580 580 .CodeMirror ::selection { background: @rchighlightblue; }
581 581 .CodeMirror ::-moz-selection { background: @rchighlightblue; }
582 582
583 583 .code { display: block; border:0px !important; }
584 584 .code-highlight, /* TODO: dan: merge codehilite into code-highlight */
585 585 /* This can be generated with `pygmentize -S default -f html` */
586 586 .codehilite {
587 587 .c-ElasticMatch { background-color: #faffa6; padding: 0.2em;}
588 588 .hll { background-color: #ffffcc }
589 589 .c { color: #408080; font-style: italic } /* Comment */
590 590 .err, .codehilite .err { border: none } /* Error */
591 591 .k { color: #008000; font-weight: bold } /* Keyword */
592 592 .o { color: #666666 } /* Operator */
593 593 .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
594 594 .cm { color: #408080; font-style: italic } /* Comment.Multiline */
595 595 .cp { color: #BC7A00 } /* Comment.Preproc */
596 596 .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
597 597 .c1 { color: #408080; font-style: italic } /* Comment.Single */
598 598 .cs { color: #408080; font-style: italic } /* Comment.Special */
599 599 .gd { color: #A00000 } /* Generic.Deleted */
600 600 .ge { font-style: italic } /* Generic.Emph */
601 601 .gr { color: #FF0000 } /* Generic.Error */
602 602 .gh { color: #000080; font-weight: bold } /* Generic.Heading */
603 603 .gi { color: #00A000 } /* Generic.Inserted */
604 604 .go { color: #888888 } /* Generic.Output */
605 605 .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
606 606 .gs { font-weight: bold } /* Generic.Strong */
607 607 .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
608 608 .gt { color: #0044DD } /* Generic.Traceback */
609 609 .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
610 610 .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
611 611 .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
612 612 .kp { color: #008000 } /* Keyword.Pseudo */
613 613 .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
614 614 .kt { color: #B00040 } /* Keyword.Type */
615 615 .m { color: #666666 } /* Literal.Number */
616 616 .s { color: #BA2121 } /* Literal.String */
617 617 .na { color: #7D9029 } /* Name.Attribute */
618 618 .nb { color: #008000 } /* Name.Builtin */
619 619 .nc { color: #0000FF; font-weight: bold } /* Name.Class */
620 620 .no { color: #880000 } /* Name.Constant */
621 621 .nd { color: #AA22FF } /* Name.Decorator */
622 622 .ni { color: #999999; font-weight: bold } /* Name.Entity */
623 623 .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
624 624 .nf { color: #0000FF } /* Name.Function */
625 625 .nl { color: #A0A000 } /* Name.Label */
626 626 .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
627 627 .nt { color: #008000; font-weight: bold } /* Name.Tag */
628 628 .nv { color: #19177C } /* Name.Variable */
629 629 .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
630 630 .w { color: #bbbbbb } /* Text.Whitespace */
631 631 .mb { color: #666666 } /* Literal.Number.Bin */
632 632 .mf { color: #666666 } /* Literal.Number.Float */
633 633 .mh { color: #666666 } /* Literal.Number.Hex */
634 634 .mi { color: #666666 } /* Literal.Number.Integer */
635 635 .mo { color: #666666 } /* Literal.Number.Oct */
636 636 .sa { color: #BA2121 } /* Literal.String.Affix */
637 637 .sb { color: #BA2121 } /* Literal.String.Backtick */
638 638 .sc { color: #BA2121 } /* Literal.String.Char */
639 639 .dl { color: #BA2121 } /* Literal.String.Delimiter */
640 640 .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
641 641 .s2 { color: #BA2121 } /* Literal.String.Double */
642 642 .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
643 643 .sh { color: #BA2121 } /* Literal.String.Heredoc */
644 644 .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
645 645 .sx { color: #008000 } /* Literal.String.Other */
646 646 .sr { color: #BB6688 } /* Literal.String.Regex */
647 647 .s1 { color: #BA2121 } /* Literal.String.Single */
648 648 .ss { color: #19177C } /* Literal.String.Symbol */
649 649 .bp { color: #008000 } /* Name.Builtin.Pseudo */
650 650 .fm { color: #0000FF } /* Name.Function.Magic */
651 651 .vc { color: #19177C } /* Name.Variable.Class */
652 652 .vg { color: #19177C } /* Name.Variable.Global */
653 653 .vi { color: #19177C } /* Name.Variable.Instance */
654 654 .vm { color: #19177C } /* Name.Variable.Magic */
655 655 .il { color: #666666 } /* Literal.Number.Integer.Long */
656 656
657 657 }
658 658
659 659 /* customized pre blocks for markdown/rst */
660 660 pre.literal-block, .codehilite pre{
661 661 padding: @padding;
662 662 border: 1px solid @grey6;
663 663 .border-radius(@border-radius);
664 664 background-color: @grey7;
665 665 }
666 666
667 667
668 668 /* START NEW CODE BLOCK CSS */
669 669
670 670 @cb-line-height: 18px;
671 671 @cb-line-code-padding: 10px;
672 672 @cb-text-padding: 5px;
673 673
674 674 @pill-padding: 2px 7px;
675 675 @pill-padding-small: 2px 2px 1px 2px;
676 676
677 677 input.filediff-collapse-state {
678 678 display: none;
679 679
680 680 &:checked + .filediff { /* file diff is collapsed */
681 681 .cb {
682 682 display: none
683 683 }
684 684 .filediff-collapse-indicator {
685 width: 0;
686 height: 0;
687 border-style: solid;
688 border-width: 4.5px 0 4.5px 9.3px;
689 border-color: transparent transparent transparent #aaa;
690 margin: 6px 0px;
685 float: left;
686 cursor: pointer;
687 margin: 1px -5px;
691 688 }
689 .filediff-collapse-indicator:before {
690 content: '\f105';
691 }
692
692 693 .filediff-menu {
693 694 display: none;
694 695 }
695 696
696 697 }
697 698
698 699 &+ .filediff { /* file diff is expanded */
700
699 701 .filediff-collapse-indicator {
700 width: 0;
701 height: 0;
702 border-style: solid;
703 border-width: 9.3px 4.5px 0 4.5px;
704 border-color: #aaa transparent transparent transparent;
705 margin: 6px 0px;
702 float: left;
703 cursor: pointer;
704 margin: 1px -5px;
705 }
706 .filediff-collapse-indicator:before {
707 content: '\f107';
708 }
706 709
707 }
708 710 .filediff-menu {
709 711 display: block;
710 712 }
713
711 714 margin: 10px 0;
712 715 &:nth-child(2) {
713 716 margin: 0;
714 717 }
715 718 }
716 719 }
717 720
718 721 .filediffs .anchor {
719 722 display: block;
720 723 height: 40px;
721 724 margin-top: -40px;
722 725 visibility: hidden;
723 726 }
724 727
725 728 .filediffs .anchor:nth-of-type(1) {
726 729 display: block;
727 730 height: 80px;
728 731 margin-top: -80px;
729 732 visibility: hidden;
730 733 }
731 734
732 735 .cs_files {
733 736 clear: both;
734 737 }
735 738
736 739 #diff-file-sticky{
737 740 will-change: min-height;
741 height: 80px;
738 742 }
739 743
740 744 .sidebar__inner{
741 745 transform: translate(0, 0); /* For browsers don't support translate3d. */
742 746 transform: translate3d(0, 0, 0);
743 747 will-change: position, transform;
744 height: 70px;
748 height: 65px;
745 749 z-index: 30;
746 750 background-color: #fff;
747 751 padding: 5px 0px;
748 752 }
749 753
750 754 .sidebar__bar {
751 755 padding: 5px 0px 0px 0px
752 756 }
753 757
754 758 .fpath-placeholder {
755 759 clear: both;
756 760 visibility: hidden
757 761 }
758 762
759 763 .is-affixed {
760 764 .sidebar_inner_shadow {
761 765 position: fixed;
762 766 top: 75px;
763 767 right: -100%;
764 768 left: -100%;
765 769 z-index: 28;
766 770 display: block;
767 771 height: 5px;
768 772 content: "";
769 773 background: linear-gradient(rgba(0, 0, 0, 0.075), rgba(0, 0, 0, 0.001)) repeat-x 0 0;
770 774 border-top: 1px solid rgba(0, 0, 0, 0.15);
771 775 }
772 776 .fpath-placeholder {
773 777 visibility: visible !important;
774 778 }
775 779 }
776 780
777 781 .diffset-menu {
778 margin-bottom: 20px;
782
779 783 }
784
785 #todo-box {
786 clear:both;
787 display: none;
788 text-align: right
789 }
790
780 791 .diffset {
781 margin: 20px auto;
792 margin: 0px auto;
782 793 .diffset-heading {
783 794 border: 1px solid @grey5;
784 795 margin-bottom: -1px;
785 796 // margin-top: 20px;
786 797 h2 {
787 798 margin: 0;
788 799 line-height: 38px;
789 800 padding-left: 10px;
790 801 }
791 802 .btn {
792 803 margin: 0;
793 804 }
794 805 background: @grey6;
795 806 display: block;
796 807 padding: 5px;
797 808 }
798 809 .diffset-heading-warning {
799 810 background: @alert3-inner;
800 811 border: 1px solid @alert3;
801 812 }
802 813 &.diffset-comments-disabled {
803 814 .cb-comment-box-opener, .comment-inline-form, .cb-comment-add-button {
804 815 display: none !important;
805 816 }
806 817 }
807 818 }
808 819
809 820 .filelist {
810 821 .pill {
811 822 display: block;
812 823 float: left;
813 824 padding: @pill-padding-small;
814 825 }
815 826 }
816 827
817 828 .pill {
818 829 display: block;
819 830 float: left;
820 831 padding: @pill-padding;
821 832 }
822 833
823 834 .pill-group {
824 835 .pill {
825 836 opacity: .8;
826 837 margin-right: 3px;
827 838 font-size: 12px;
828 839 font-weight: normal;
840 min-width: 30px;
841 text-align: center;
829 842
830 843 &:first-child {
831 844 border-radius: @border-radius 0 0 @border-radius;
832 845 }
833 846 &:last-child {
834 847 border-radius: 0 @border-radius @border-radius 0;
835 848 }
836 849 &:only-child {
837 850 border-radius: @border-radius;
838 851 margin-right: 0;
839 852 }
840 853 }
841 854 }
842 855
843 856 /* Main comments*/
844 857 #comments {
845 858 .comment-selected {
846 859 border-left: 6px solid @comment-highlight-color;
847 860 padding-left: 3px;
848 861 margin-left: -9px;
849 862 }
850 863 }
851 864
852 865 .filediff {
853 866 border: 1px solid @grey5;
854 867
855 868 /* START OVERRIDES */
856 869 .code-highlight {
857 870 border: none; // TODO: remove this border from the global
858 871 // .code-highlight, it doesn't belong there
859 872 }
860 873 label {
861 874 margin: 0; // TODO: remove this margin definition from global label
862 875 // it doesn't belong there - if margin on labels
863 876 // are needed for a form they should be defined
864 877 // in the form's class
865 878 }
866 879 /* END OVERRIDES */
867 880
868 881 * {
869 882 box-sizing: border-box;
870 883 }
871 884 .filediff-anchor {
872 885 visibility: hidden;
873 886 }
874 887 &:hover {
875 888 .filediff-anchor {
876 889 visibility: visible;
877 890 }
878 891 }
879 892
880 .filediff-collapse-indicator {
881 border-style: solid;
882 float: left;
883 margin: 4px 0px 0 0;
884 cursor: pointer;
885 }
886
887 893 .filediff-heading {
888 background: @grey7;
889 894 cursor: pointer;
890 895 display: block;
891 padding: 5px 10px;
896 padding: 10px 10px;
892 897 }
893 898 .filediff-heading:after {
894 899 content: "";
895 900 display: table;
896 901 clear: both;
897 902 }
898 903 .filediff-heading:hover {
899 904 background: #e1e9f4 !important;
900 905 }
901 906
902 907 .filediff-menu {
903 float: right;
904 908 text-align: right;
905 909 padding: 5px 5px 5px 0px;
910 background: @grey7;
906 911
907 912 &> a,
908 913 &> span {
909 914 padding: 1px;
910 915 }
911 916 }
912 917
913 918 .filediff-collapse-button, .filediff-expand-button {
914 919 cursor: pointer;
915 920 }
916 921 .filediff-collapse-button {
917 922 display: inline;
918 923 }
919 924 .filediff-expand-button {
920 925 display: none;
921 926 }
922 927 .filediff-collapsed .filediff-collapse-button {
923 928 display: none;
924 929 }
925 930 .filediff-collapsed .filediff-expand-button {
926 931 display: inline;
927 932 }
928 933
929 934 /**** COMMENTS ****/
930 935
931 936 .filediff-menu {
932 937 .show-comment-button {
933 938 display: none;
934 939 }
935 940 }
936 941 &.hide-comments {
937 942 .inline-comments {
938 943 display: none;
939 944 }
940 945 .filediff-menu {
941 946 .show-comment-button {
942 947 display: inline;
943 948 }
944 949 .hide-comment-button {
945 950 display: none;
946 951 }
947 952 }
948 953 }
949 954
950 955 .hide-line-comments {
951 956 .inline-comments {
952 957 display: none;
953 958 }
954 959 }
955 960
956 961 /**** END COMMENTS ****/
957 962
958 963 }
959 964
960 965
966 .op-added {
967 color: @alert1;
968 }
969
970 .op-deleted {
971 color: @alert2;
972 }
961 973
962 974 .filediff, .filelist {
975
963 976 .pill {
964 977 &[op="name"] {
965 978 background: none;
966 979 opacity: 1;
967 980 color: white;
968 981 }
969 982 &[op="limited"] {
970 983 background: @grey2;
971 984 color: white;
972 985 }
973 986 &[op="binary"] {
974 987 background: @color7;
975 988 color: white;
976 989 }
977 990 &[op="modified"] {
978 991 background: @alert1;
979 992 color: white;
980 993 }
981 994 &[op="renamed"] {
982 995 background: @color4;
983 996 color: white;
984 997 }
985 998 &[op="copied"] {
986 999 background: @color4;
987 1000 color: white;
988 1001 }
989 1002 &[op="mode"] {
990 1003 background: @grey3;
991 1004 color: white;
992 1005 }
993 1006 &[op="symlink"] {
994 1007 background: @color8;
995 1008 color: white;
996 1009 }
997 1010
998 1011 &[op="added"] { /* added lines */
999 1012 background: @alert1;
1000 1013 color: white;
1001 1014 }
1002 1015 &[op="deleted"] { /* deleted lines */
1003 1016 background: @alert2;
1004 1017 color: white;
1005 1018 }
1006 1019
1007 1020 &[op="created"] { /* created file */
1008 1021 background: @alert1;
1009 1022 color: white;
1010 1023 }
1011 1024 &[op="removed"] { /* deleted file */
1012 1025 background: @color5;
1013 1026 color: white;
1014 1027 }
1015 1028 }
1016 1029 }
1017 1030
1018 1031
1019 1032 .filediff-outdated {
1020 1033 padding: 8px 0;
1021 1034
1022 1035 .filediff-heading {
1023 1036 opacity: .5;
1024 1037 }
1025 1038 }
1026 1039
1027 1040 table.cb {
1028 1041 width: 100%;
1029 1042 border-collapse: collapse;
1030 1043
1031 1044 .cb-text {
1032 1045 padding: @cb-text-padding;
1033 1046 }
1034 1047 .cb-hunk {
1035 1048 padding: @cb-text-padding;
1036 1049 }
1037 1050 .cb-expand {
1038 1051 display: none;
1039 1052 }
1040 1053 .cb-collapse {
1041 1054 display: inline;
1042 1055 }
1043 1056 &.cb-collapsed {
1044 1057 .cb-line {
1045 1058 display: none;
1046 1059 }
1047 1060 .cb-expand {
1048 1061 display: inline;
1049 1062 }
1050 1063 .cb-collapse {
1051 1064 display: none;
1052 1065 }
1053 1066 .cb-hunk {
1054 1067 display: none;
1055 1068 }
1056 1069 }
1057 1070
1058 1071 /* intentionally general selector since .cb-line-selected must override it
1059 1072 and they both use !important since the td itself may have a random color
1060 1073 generated by annotation blocks. TLDR: if you change it, make sure
1061 1074 annotated block selection and line selection in file view still work */
1062 1075 .cb-line-fresh .cb-content {
1063 1076 background: white !important;
1064 1077 }
1065 1078 .cb-warning {
1066 1079 background: #fff4dd;
1067 1080 }
1068 1081
1069 1082 &.cb-diff-sideside {
1070 1083 td {
1071 1084 &.cb-content {
1072 1085 width: 50%;
1073 1086 }
1074 1087 }
1075 1088 }
1076 1089
1077 1090 tr {
1078 1091 &.cb-annotate {
1079 1092 border-top: 1px solid #eee;
1080 1093 }
1081 1094
1082 1095 &.cb-comment-info {
1083 1096 border-top: 1px solid #eee;
1084 1097 color: rgba(0, 0, 0, 0.3);
1085 1098 background: #edf2f9;
1086 1099
1087 1100 td {
1088 1101
1089 1102 }
1090 1103 }
1091 1104
1092 1105 &.cb-hunk {
1093 1106 font-family: @text-monospace;
1094 1107 color: rgba(0, 0, 0, 0.3);
1095 1108
1096 1109 td {
1097 1110 &:first-child {
1098 1111 background: #edf2f9;
1099 1112 }
1100 1113 &:last-child {
1101 1114 background: #f4f7fb;
1102 1115 }
1103 1116 }
1104 1117 }
1105 1118 }
1106 1119
1107 1120
1108 1121 td {
1109 1122 vertical-align: top;
1110 1123 padding: 0;
1111 1124
1112 1125 &.cb-content {
1113 1126 font-size: 12.35px;
1114 1127
1115 1128 &.cb-line-selected .cb-code {
1116 1129 background: @comment-highlight-color !important;
1117 1130 }
1118 1131
1119 1132 span.cb-code {
1120 1133 line-height: @cb-line-height;
1121 1134 padding-left: @cb-line-code-padding;
1122 1135 padding-right: @cb-line-code-padding;
1123 1136 display: block;
1124 1137 white-space: pre-wrap;
1125 1138 font-family: @text-monospace;
1126 1139 word-break: break-all;
1127 1140 .nonl {
1128 1141 color: @color5;
1129 1142 }
1130 1143 .cb-action {
1131 1144 &:before {
1132 1145 content: " ";
1133 1146 }
1134 1147 &.cb-deletion:before {
1135 1148 content: "- ";
1136 1149 }
1137 1150 &.cb-addition:before {
1138 1151 content: "+ ";
1139 1152 }
1140 1153 }
1141 1154 }
1142 1155
1143 1156 &> button.cb-comment-box-opener {
1144 1157
1145 1158 padding: 2px 2px 1px 3px;
1146 1159 margin-left: -6px;
1147 1160 margin-top: -1px;
1148 1161
1149 1162 border-radius: @border-radius;
1150 1163 position: absolute;
1151 1164 display: none;
1152 1165 }
1153 1166 .cb-comment {
1154 1167 margin-top: 10px;
1155 1168 white-space: normal;
1156 1169 }
1157 1170 }
1158 1171 &:hover {
1159 1172 button.cb-comment-box-opener {
1160 1173 display: block;
1161 1174 }
1162 1175 &+ td button.cb-comment-box-opener {
1163 1176 display: block
1164 1177 }
1165 1178 }
1166 1179
1167 1180 &.cb-data {
1168 1181 text-align: right;
1169 1182 width: 30px;
1170 1183 font-family: @text-monospace;
1171 1184
1172 1185 .icon-comment {
1173 1186 cursor: pointer;
1174 1187 }
1175 1188 &.cb-line-selected {
1176 1189 background: @comment-highlight-color !important;
1177 1190 }
1178 1191 &.cb-line-selected > div {
1179 1192 display: block;
1180 1193 background: @comment-highlight-color !important;
1181 1194 line-height: @cb-line-height;
1182 1195 color: rgba(0, 0, 0, 0.3);
1183 1196 }
1184 1197 }
1185 1198
1186 1199 &.cb-lineno {
1187 1200 padding: 0;
1188 1201 width: 50px;
1189 1202 color: rgba(0, 0, 0, 0.3);
1190 1203 text-align: right;
1191 1204 border-right: 1px solid #eee;
1192 1205 font-family: @text-monospace;
1193 1206 -webkit-user-select: none;
1194 1207 -moz-user-select: none;
1195 1208 user-select: none;
1196 1209
1197 1210 a::before {
1198 1211 content: attr(data-line-no);
1199 1212 }
1200 1213 &.cb-line-selected {
1201 1214 background: @comment-highlight-color !important;
1202 1215 }
1203 1216
1204 1217 a {
1205 1218 display: block;
1206 1219 padding-right: @cb-line-code-padding;
1207 1220 padding-left: @cb-line-code-padding;
1208 1221 line-height: @cb-line-height;
1209 1222 color: rgba(0, 0, 0, 0.3);
1210 1223 }
1211 1224 }
1212 1225
1213 1226 &.cb-empty {
1214 1227 background: @grey7;
1215 1228 }
1216 1229
1217 1230 ins {
1218 1231 color: black;
1219 1232 background: #a6f3a6;
1220 1233 text-decoration: none;
1221 1234 }
1222 1235 del {
1223 1236 color: black;
1224 1237 background: #f8cbcb;
1225 1238 text-decoration: none;
1226 1239 }
1227 1240 &.cb-addition {
1228 1241 background: #ecffec;
1229 1242
1230 1243 &.blob-lineno {
1231 1244 background: #ddffdd;
1232 1245 }
1233 1246 }
1234 1247 &.cb-deletion {
1235 1248 background: #ffecec;
1236 1249
1237 1250 &.blob-lineno {
1238 1251 background: #ffdddd;
1239 1252 }
1240 1253 }
1241 1254 &.cb-annotate-message-spacer {
1242 1255 width:8px;
1243 1256 padding: 1px 0px 0px 3px;
1244 1257 }
1245 1258 &.cb-annotate-info {
1246 1259 width: 320px;
1247 1260 min-width: 320px;
1248 1261 max-width: 320px;
1249 1262 padding: 5px 2px;
1250 1263 font-size: 13px;
1251 1264
1252 1265 .cb-annotate-message {
1253 1266 padding: 2px 0px 0px 0px;
1254 1267 white-space: pre-line;
1255 1268 overflow: hidden;
1256 1269 }
1257 1270 .rc-user {
1258 1271 float: none;
1259 1272 padding: 0 6px 0 17px;
1260 1273 min-width: unset;
1261 1274 min-height: unset;
1262 1275 }
1263 1276 }
1264 1277
1265 1278 &.cb-annotate-revision {
1266 1279 cursor: pointer;
1267 1280 text-align: right;
1268 1281 padding: 1px 3px 0px 3px;
1269 1282 }
1270 1283 }
1271 1284 }
@@ -1,578 +1,586 b''
1 1 // comments.less
2 2 // For use in RhodeCode applications;
3 3 // see style guide documentation for guidelines.
4 4
5 5
6 6 // Comments
7 7 @comment-outdated-opacity: 0.6;
8 8
9 9 .comments {
10 10 width: 100%;
11 11 }
12 12
13 .comments-heading {
14 margin-bottom: -1px;
15 background: @grey6;
16 display: block;
17 padding: 10px 0px;
18 font-size: 18px
19 }
20
13 21 tr.inline-comments div {
14 22 max-width: 100%;
15 23
16 24 p {
17 25 white-space: normal;
18 26 }
19 27
20 28 code, pre, .code, dd {
21 29 overflow-x: auto;
22 30 width: 1062px;
23 31 }
24 32
25 33 dd {
26 34 width: auto;
27 35 }
28 36 }
29 37
30 38 #injected_page_comments {
31 39 .comment-previous-link,
32 40 .comment-next-link,
33 41 .comment-links-divider {
34 42 display: none;
35 43 }
36 44 }
37 45
38 46 .add-comment {
39 47 margin-bottom: 10px;
40 48 }
41 49 .hide-comment-button .add-comment {
42 50 display: none;
43 51 }
44 52
45 53 .comment-bubble {
46 54 color: @grey4;
47 55 margin-top: 4px;
48 56 margin-right: 30px;
49 57 visibility: hidden;
50 58 }
51 59
52 60 .comment-label {
53 61 float: left;
54 62
55 63 padding: 0.4em 0.4em;
56 64 margin: 3px 5px 0px -10px;
57 65 display: inline-block;
58 66 min-height: 0;
59 67
60 68 text-align: center;
61 69 font-size: 10px;
62 70 line-height: .8em;
63 71
64 72 font-family: @text-italic;
65 73 font-style: italic;
66 74 background: #fff none;
67 75 color: @grey4;
68 76 border: 1px solid @grey4;
69 77 white-space: nowrap;
70 78
71 79 text-transform: uppercase;
72 80 min-width: 40px;
73 81
74 82 &.todo {
75 83 color: @color5;
76 84 font-style: italic;
77 85 font-weight: @text-bold-italic-weight;
78 86 font-family: @text-bold-italic;
79 87 }
80 88
81 89 .resolve {
82 90 cursor: pointer;
83 91 text-decoration: underline;
84 92 }
85 93
86 94 .resolved {
87 95 text-decoration: line-through;
88 96 color: @color1;
89 97 }
90 98 .resolved a {
91 99 text-decoration: line-through;
92 100 color: @color1;
93 101 }
94 102 .resolve-text {
95 103 color: @color1;
96 104 margin: 2px 8px;
97 105 font-family: @text-italic;
98 106 font-style: italic;
99 107 }
100 108 }
101 109
102 110 .has-spacer-after {
103 111 &:after {
104 112 content: ' | ';
105 113 color: @grey5;
106 114 }
107 115 }
108 116
109 117 .has-spacer-before {
110 118 &:before {
111 119 content: ' | ';
112 120 color: @grey5;
113 121 }
114 122 }
115 123
116 124 .comment {
117 125
118 126 &.comment-general {
119 127 border: 1px solid @grey5;
120 128 padding: 5px 5px 5px 5px;
121 129 }
122 130
123 131 margin: @padding 0;
124 132 padding: 4px 0 0 0;
125 133 line-height: 1em;
126 134
127 135 .rc-user {
128 136 min-width: 0;
129 137 margin: 0px .5em 0 0;
130 138
131 139 .user {
132 140 display: inline;
133 141 }
134 142 }
135 143
136 144 .meta {
137 145 position: relative;
138 146 width: 100%;
139 147 border-bottom: 1px solid @grey5;
140 148 margin: -5px 0px;
141 149 line-height: 24px;
142 150
143 151 &:hover .permalink {
144 152 visibility: visible;
145 153 color: @rcblue;
146 154 }
147 155 }
148 156
149 157 .author,
150 158 .date {
151 159 display: inline;
152 160
153 161 &:after {
154 162 content: ' | ';
155 163 color: @grey5;
156 164 }
157 165 }
158 166
159 167 .author-general img {
160 168 top: 3px;
161 169 }
162 170 .author-inline img {
163 171 top: 3px;
164 172 }
165 173
166 174 .status-change,
167 175 .permalink,
168 176 .changeset-status-lbl {
169 177 display: inline;
170 178 }
171 179
172 180 .permalink {
173 181 visibility: hidden;
174 182 }
175 183
176 184 .comment-links-divider {
177 185 display: inline;
178 186 }
179 187
180 188 .comment-links-block {
181 189 float:right;
182 190 text-align: right;
183 191 min-width: 85px;
184 192
185 193 [class^="icon-"]:before,
186 194 [class*=" icon-"]:before {
187 195 margin-left: 0;
188 196 margin-right: 0;
189 197 }
190 198 }
191 199
192 200 .comment-previous-link {
193 201 display: inline-block;
194 202
195 203 .arrow_comment_link{
196 204 cursor: pointer;
197 205 i {
198 206 font-size:10px;
199 207 }
200 208 }
201 209 .arrow_comment_link.disabled {
202 210 cursor: default;
203 211 color: @grey5;
204 212 }
205 213 }
206 214
207 215 .comment-next-link {
208 216 display: inline-block;
209 217
210 218 .arrow_comment_link{
211 219 cursor: pointer;
212 220 i {
213 221 font-size:10px;
214 222 }
215 223 }
216 224 .arrow_comment_link.disabled {
217 225 cursor: default;
218 226 color: @grey5;
219 227 }
220 228 }
221 229
222 230 .flag_status {
223 231 display: inline-block;
224 232 margin: -2px .5em 0 .25em
225 233 }
226 234
227 235 .delete-comment {
228 236 display: inline-block;
229 237 color: @rcblue;
230 238
231 239 &:hover {
232 240 cursor: pointer;
233 241 }
234 242 }
235 243
236 244 .text {
237 245 clear: both;
238 246 .border-radius(@border-radius);
239 247 .box-sizing(border-box);
240 248
241 249 .markdown-block p,
242 250 .rst-block p {
243 251 margin: .5em 0 !important;
244 252 // TODO: lisa: This is needed because of other rst !important rules :[
245 253 }
246 254 }
247 255
248 256 .pr-version {
249 257 float: left;
250 258 margin: 0px 4px;
251 259 }
252 260 .pr-version-inline {
253 261 float: left;
254 262 margin: 0px 4px;
255 263 }
256 264 .pr-version-num {
257 265 font-size: 10px;
258 266 }
259 267 }
260 268
261 269 @comment-padding: 5px;
262 270
263 271 .general-comments {
264 272 .comment-outdated {
265 273 opacity: @comment-outdated-opacity;
266 274 }
267 275 }
268 276
269 277 .inline-comments {
270 278 border-radius: @border-radius;
271 279 .comment {
272 280 margin: 0;
273 281 border-radius: @border-radius;
274 282 }
275 283 .comment-outdated {
276 284 opacity: @comment-outdated-opacity;
277 285 }
278 286
279 287 .comment-inline {
280 288 background: white;
281 289 padding: @comment-padding @comment-padding;
282 290 border: @comment-padding solid @grey6;
283 291
284 292 .text {
285 293 border: none;
286 294 }
287 295 .meta {
288 296 border-bottom: 1px solid @grey6;
289 297 margin: -5px 0px;
290 298 line-height: 24px;
291 299 }
292 300 }
293 301 .comment-selected {
294 302 border-left: 6px solid @comment-highlight-color;
295 303 }
296 304 .comment-inline-form {
297 305 padding: @comment-padding;
298 306 display: none;
299 307 }
300 308 .cb-comment-add-button {
301 309 margin: @comment-padding;
302 310 }
303 311 /* hide add comment button when form is open */
304 312 .comment-inline-form-open ~ .cb-comment-add-button {
305 313 display: none;
306 314 }
307 315 .comment-inline-form-open {
308 316 display: block;
309 317 }
310 318 /* hide add comment button when form but no comments */
311 319 .comment-inline-form:first-child + .cb-comment-add-button {
312 320 display: none;
313 321 }
314 322 /* hide add comment button when no comments or form */
315 323 .cb-comment-add-button:first-child {
316 324 display: none;
317 325 }
318 326 /* hide add comment button when only comment is being deleted */
319 327 .comment-deleting:first-child + .cb-comment-add-button {
320 328 display: none;
321 329 }
322 330 }
323 331
324 332
325 333 .show-outdated-comments {
326 334 display: inline;
327 335 color: @rcblue;
328 336 }
329 337
330 338 // Comment Form
331 339 div.comment-form {
332 340 margin-top: 20px;
333 341 }
334 342
335 343 .comment-form strong {
336 344 display: block;
337 345 margin-bottom: 15px;
338 346 }
339 347
340 348 .comment-form textarea {
341 349 width: 100%;
342 350 height: 100px;
343 351 font-family: @text-monospace;
344 352 }
345 353
346 354 form.comment-form {
347 355 margin-top: 10px;
348 356 margin-left: 10px;
349 357 }
350 358
351 359 .comment-inline-form .comment-block-ta,
352 360 .comment-form .comment-block-ta,
353 361 .comment-form .preview-box {
354 362 .border-radius(@border-radius);
355 363 .box-sizing(border-box);
356 364 background-color: white;
357 365 }
358 366
359 367 .comment-form-submit {
360 368 margin-top: 5px;
361 369 margin-left: 525px;
362 370 }
363 371
364 372 .file-comments {
365 373 display: none;
366 374 }
367 375
368 376 .comment-form .preview-box.unloaded,
369 377 .comment-inline-form .preview-box.unloaded {
370 378 height: 50px;
371 379 text-align: center;
372 380 padding: 20px;
373 381 background-color: white;
374 382 }
375 383
376 384 .comment-footer {
377 385 position: relative;
378 386 width: 100%;
379 387 min-height: 42px;
380 388
381 389 .status_box,
382 390 .cancel-button {
383 391 float: left;
384 392 display: inline-block;
385 393 }
386 394
387 395 .action-buttons {
388 396 float: right;
389 397 display: inline-block;
390 398 }
391 399
392 400 .action-buttons-extra {
393 401 display: inline-block;
394 402 }
395 403 }
396 404
397 405 .comment-form {
398 406
399 407 .comment {
400 408 margin-left: 10px;
401 409 }
402 410
403 411 .comment-help {
404 412 color: @grey4;
405 413 padding: 5px 0 5px 0;
406 414 }
407 415
408 416 .comment-title {
409 417 padding: 5px 0 5px 0;
410 418 }
411 419
412 420 .comment-button {
413 421 display: inline-block;
414 422 }
415 423
416 424 .comment-button-input {
417 425 margin-right: 0;
418 426 }
419 427
420 428 .comment-footer {
421 429 margin-bottom: 110px;
422 430 margin-top: 10px;
423 431 }
424 432 }
425 433
426 434
427 435 .comment-form-login {
428 436 .comment-help {
429 437 padding: 0.7em; //same as the button
430 438 }
431 439
432 440 div.clearfix {
433 441 clear: both;
434 442 width: 100%;
435 443 display: block;
436 444 }
437 445 }
438 446
439 447 .comment-type {
440 448 margin: 0px;
441 449 border-radius: inherit;
442 450 border-color: @grey6;
443 451 }
444 452
445 453 .preview-box {
446 454 min-height: 105px;
447 455 margin-bottom: 15px;
448 456 background-color: white;
449 457 .border-radius(@border-radius);
450 458 .box-sizing(border-box);
451 459 }
452 460
453 461 .add-another-button {
454 462 margin-left: 10px;
455 463 margin-top: 10px;
456 464 margin-bottom: 10px;
457 465 }
458 466
459 467 .comment .buttons {
460 468 float: right;
461 469 margin: -1px 0px 0px 0px;
462 470 }
463 471
464 472 // Inline Comment Form
465 473 .injected_diff .comment-inline-form,
466 474 .comment-inline-form {
467 475 background-color: white;
468 476 margin-top: 10px;
469 477 margin-bottom: 20px;
470 478 }
471 479
472 480 .inline-form {
473 481 padding: 10px 7px;
474 482 }
475 483
476 484 .inline-form div {
477 485 max-width: 100%;
478 486 }
479 487
480 488 .overlay {
481 489 display: none;
482 490 position: absolute;
483 491 width: 100%;
484 492 text-align: center;
485 493 vertical-align: middle;
486 494 font-size: 16px;
487 495 background: none repeat scroll 0 0 white;
488 496
489 497 &.submitting {
490 498 display: block;
491 499 opacity: 0.5;
492 500 z-index: 100;
493 501 }
494 502 }
495 503 .comment-inline-form .overlay.submitting .overlay-text {
496 504 margin-top: 5%;
497 505 }
498 506
499 507 .comment-inline-form .clearfix,
500 508 .comment-form .clearfix {
501 509 .border-radius(@border-radius);
502 510 margin: 0px;
503 511 }
504 512
505 513 .comment-inline-form .comment-footer {
506 514 margin: 10px 0px 0px 0px;
507 515 }
508 516
509 517 .hide-inline-form-button {
510 518 margin-left: 5px;
511 519 }
512 520 .comment-button .hide-inline-form {
513 521 background: white;
514 522 }
515 523
516 524 .comment-area {
517 525 padding: 8px 12px;
518 526 border: 1px solid @grey5;
519 527 .border-radius(@border-radius);
520 528
521 529 .resolve-action {
522 530 padding: 1px 0px 0px 6px;
523 531 }
524 532
525 533 }
526 534
527 535 .comment-area-header .nav-links {
528 536 display: flex;
529 537 flex-flow: row wrap;
530 538 -webkit-flex-flow: row wrap;
531 539 width: 100%;
532 540 }
533 541
534 542 .comment-area-footer {
535 543 display: flex;
536 544 }
537 545
538 546 .comment-footer .toolbar {
539 547
540 548 }
541 549
542 550 .nav-links {
543 551 padding: 0;
544 552 margin: 0;
545 553 list-style: none;
546 554 height: auto;
547 555 border-bottom: 1px solid @grey5;
548 556 }
549 557 .nav-links li {
550 558 display: inline-block;
551 559 list-style-type: none;
552 560 }
553 561
554 562 .nav-links li a.disabled {
555 563 cursor: not-allowed;
556 564 }
557 565
558 566 .nav-links li.active a {
559 567 border-bottom: 2px solid @rcblue;
560 568 color: #000;
561 569 font-weight: 600;
562 570 }
563 571 .nav-links li a {
564 572 display: inline-block;
565 573 padding: 0px 10px 5px 10px;
566 574 margin-bottom: -1px;
567 575 font-size: 14px;
568 576 line-height: 28px;
569 577 color: #8f8f8f;
570 578 border-bottom: 2px solid transparent;
571 579 }
572 580
573 581 .toolbar-text {
574 582 float: left;
575 583 margin: -5px 0px 0px 0px;
576 584 font-size: 12px;
577 585 }
578 586
@@ -1,2808 +1,2854 b''
1 1 //Primary CSS
2 2
3 3 //--- IMPORTS ------------------//
4 4
5 5 @import 'helpers';
6 6 @import 'mixins';
7 7 @import 'rcicons';
8 8 @import 'variables';
9 9 @import 'bootstrap-variables';
10 10 @import 'form-bootstrap';
11 11 @import 'codemirror';
12 12 @import 'legacy_code_styles';
13 13 @import 'readme-box';
14 14 @import 'progress-bar';
15 15
16 16 @import 'type';
17 17 @import 'alerts';
18 18 @import 'buttons';
19 19 @import 'tags';
20 20 @import 'code-block';
21 21 @import 'examples';
22 22 @import 'login';
23 23 @import 'main-content';
24 24 @import 'select2';
25 25 @import 'comments';
26 26 @import 'panels-bootstrap';
27 27 @import 'panels';
28 28 @import 'deform';
29 29
30 30 //--- BASE ------------------//
31 31 .noscript-error {
32 32 top: 0;
33 33 left: 0;
34 34 width: 100%;
35 35 z-index: 101;
36 36 text-align: center;
37 37 font-size: 120%;
38 38 color: white;
39 39 background-color: @alert2;
40 40 padding: 5px 0 5px 0;
41 41 font-weight: @text-semibold-weight;
42 42 font-family: @text-semibold;
43 43 }
44 44
45 45 html {
46 46 display: table;
47 47 height: 100%;
48 48 width: 100%;
49 49 }
50 50
51 51 body {
52 52 display: table-cell;
53 53 width: 100%;
54 54 }
55 55
56 56 //--- LAYOUT ------------------//
57 57
58 58 .hidden{
59 59 display: none !important;
60 60 }
61 61
62 62 .box{
63 63 float: left;
64 64 width: 100%;
65 65 }
66 66
67 67 .browser-header {
68 68 clear: both;
69 69 }
70 70 .main {
71 71 clear: both;
72 72 padding:0 0 @pagepadding;
73 73 height: auto;
74 74
75 75 &:after { //clearfix
76 76 content:"";
77 77 clear:both;
78 78 width:100%;
79 79 display:block;
80 80 }
81 81 }
82 82
83 83 .action-link{
84 84 margin-left: @padding;
85 85 padding-left: @padding;
86 86 border-left: @border-thickness solid @border-default-color;
87 87 }
88 88
89 89 input + .action-link, .action-link.first{
90 90 border-left: none;
91 91 }
92 92
93 93 .action-link.last{
94 94 margin-right: @padding;
95 95 padding-right: @padding;
96 96 }
97 97
98 98 .action-link.active,
99 99 .action-link.active a{
100 100 color: @grey4;
101 101 }
102 102
103 103 .action-link.disabled {
104 104 color: @grey4;
105 105 cursor: inherit;
106 106 }
107 107
108 108 .clipboard-action {
109 109 cursor: pointer;
110 110 color: @grey4;
111 111 margin-left: 5px;
112 112
113 113 &:hover {
114 114 color: @grey2;
115 115 }
116 116 }
117 117
118 118 ul.simple-list{
119 119 list-style: none;
120 120 margin: 0;
121 121 padding: 0;
122 122 }
123 123
124 124 .main-content {
125 125 padding-bottom: @pagepadding;
126 126 }
127 127
128 128 .wide-mode-wrapper {
129 129 max-width:4000px !important;
130 130 }
131 131
132 132 .wrapper {
133 133 position: relative;
134 134 max-width: @wrapper-maxwidth;
135 135 margin: 0 auto;
136 136 }
137 137
138 138 #content {
139 139 clear: both;
140 140 padding: 0 @contentpadding;
141 141 }
142 142
143 143 .advanced-settings-fields{
144 144 input{
145 145 margin-left: @textmargin;
146 146 margin-right: @padding/2;
147 147 }
148 148 }
149 149
150 150 .cs_files_title {
151 151 margin: @pagepadding 0 0;
152 152 }
153 153
154 154 input.inline[type="file"] {
155 155 display: inline;
156 156 }
157 157
158 158 .error_page {
159 159 margin: 10% auto;
160 160
161 161 h1 {
162 162 color: @grey2;
163 163 }
164 164
165 165 .alert {
166 166 margin: @padding 0;
167 167 }
168 168
169 169 .error-branding {
170 170 color: @grey4;
171 171 font-weight: @text-semibold-weight;
172 172 font-family: @text-semibold;
173 173 }
174 174
175 175 .error_message {
176 176 font-family: @text-regular;
177 177 }
178 178
179 179 .sidebar {
180 180 min-height: 275px;
181 181 margin: 0;
182 182 padding: 0 0 @sidebarpadding @sidebarpadding;
183 183 border: none;
184 184 }
185 185
186 186 .main-content {
187 187 position: relative;
188 188 margin: 0 @sidebarpadding @sidebarpadding;
189 189 padding: 0 0 0 @sidebarpadding;
190 190 border-left: @border-thickness solid @grey5;
191 191
192 192 @media (max-width:767px) {
193 193 clear: both;
194 194 width: 100%;
195 195 margin: 0;
196 196 border: none;
197 197 }
198 198 }
199 199
200 200 .inner-column {
201 201 float: left;
202 202 width: 29.75%;
203 203 min-height: 150px;
204 204 margin: @sidebarpadding 2% 0 0;
205 205 padding: 0 2% 0 0;
206 206 border-right: @border-thickness solid @grey5;
207 207
208 208 @media (max-width:767px) {
209 209 clear: both;
210 210 width: 100%;
211 211 border: none;
212 212 }
213 213
214 214 ul {
215 215 padding-left: 1.25em;
216 216 }
217 217
218 218 &:last-child {
219 219 margin: @sidebarpadding 0 0;
220 220 border: none;
221 221 }
222 222
223 223 h4 {
224 224 margin: 0 0 @padding;
225 225 font-weight: @text-semibold-weight;
226 226 font-family: @text-semibold;
227 227 }
228 228 }
229 229 }
230 230 .error-page-logo {
231 231 width: 130px;
232 232 height: 160px;
233 233 }
234 234
235 235 // HEADER
236 236 .header {
237 237
238 238 // TODO: johbo: Fix login pages, so that they work without a min-height
239 239 // for the header and then remove the min-height. I chose a smaller value
240 240 // intentionally here to avoid rendering issues in the main navigation.
241 241 min-height: 49px;
242 242 min-width: 1024px;
243 243
244 244 position: relative;
245 245 vertical-align: bottom;
246 246 padding: 0 @header-padding;
247 247 background-color: @grey1;
248 248 color: @grey5;
249 249
250 250 .title {
251 251 overflow: visible;
252 252 }
253 253
254 254 &:before,
255 255 &:after {
256 256 content: "";
257 257 clear: both;
258 258 width: 100%;
259 259 }
260 260
261 261 // TODO: johbo: Avoids breaking "Repositories" chooser
262 262 .select2-container .select2-choice .select2-arrow {
263 263 display: none;
264 264 }
265 265 }
266 266
267 267 #header-inner {
268 268 &.title {
269 269 margin: 0;
270 270 }
271 271 &:before,
272 272 &:after {
273 273 content: "";
274 274 clear: both;
275 275 }
276 276 }
277 277
278 278 // Gists
279 279 #files_data {
280 280 clear: both; //for firefox
281 281 padding-top: 10px;
282 282 }
283 283
284 284 #gistid {
285 285 margin-right: @padding;
286 286 }
287 287
288 288 // Global Settings Editor
289 289 .textarea.editor {
290 290 float: left;
291 291 position: relative;
292 292 max-width: @texteditor-width;
293 293
294 294 select {
295 295 position: absolute;
296 296 top:10px;
297 297 right:0;
298 298 }
299 299
300 300 .CodeMirror {
301 301 margin: 0;
302 302 }
303 303
304 304 .help-block {
305 305 margin: 0 0 @padding;
306 306 padding:.5em;
307 307 background-color: @grey6;
308 308 &.pre-formatting {
309 309 white-space: pre;
310 310 }
311 311 }
312 312 }
313 313
314 314 ul.auth_plugins {
315 315 margin: @padding 0 @padding @legend-width;
316 316 padding: 0;
317 317
318 318 li {
319 319 margin-bottom: @padding;
320 320 line-height: 1em;
321 321 list-style-type: none;
322 322
323 323 .auth_buttons .btn {
324 324 margin-right: @padding;
325 325 }
326 326
327 327 }
328 328 }
329 329
330 330
331 331 // My Account PR list
332 332
333 333 #show_closed {
334 334 margin: 0 1em 0 0;
335 335 }
336 336
337 337 #pull_request_list_table {
338 338 .closed {
339 339 background-color: @grey6;
340 340 }
341 341
342 342 .state-creating,
343 343 .state-updating,
344 344 .state-merging
345 345 {
346 346 background-color: @grey6;
347 347 }
348 348
349 349 .td-status {
350 350 padding-left: .5em;
351 351 }
352 352 .log-container .truncate {
353 353 height: 2.75em;
354 354 white-space: pre-line;
355 355 }
356 356 table.rctable .user {
357 357 padding-left: 0;
358 358 }
359 359 table.rctable {
360 360 td.td-description,
361 361 .rc-user {
362 362 min-width: auto;
363 363 }
364 364 }
365 365 }
366 366
367 367 // Pull Requests
368 368
369 369 .pullrequests_section_head {
370 370 display: block;
371 371 clear: both;
372 372 margin: @padding 0;
373 373 font-weight: @text-bold-weight;
374 374 font-family: @text-bold;
375 375 }
376 376
377 377 .pr-origininfo, .pr-targetinfo {
378 378 position: relative;
379 379
380 380 .tag {
381 381 display: inline-block;
382 382 margin: 0 1em .5em 0;
383 383 }
384 384
385 385 .clone-url {
386 386 display: inline-block;
387 387 margin: 0 0 .5em 0;
388 388 padding: 0;
389 389 line-height: 1.2em;
390 390 }
391 391 }
392 392
393 393 .pr-mergeinfo {
394 394 min-width: 95% !important;
395 395 padding: 0 !important;
396 396 border: 0;
397 397 }
398 398 .pr-mergeinfo-copy {
399 399 padding: 0 0;
400 400 }
401 401
402 402 .pr-pullinfo {
403 403 min-width: 95% !important;
404 404 padding: 0 !important;
405 405 border: 0;
406 406 }
407 407 .pr-pullinfo-copy {
408 408 padding: 0 0;
409 409 }
410 410
411 411
412 412 #pr-title-input {
413 413 width: 72%;
414 414 font-size: 1em;
415 415 margin: 0;
416 416 padding: 0 0 0 @padding/4;
417 417 line-height: 1.7em;
418 418 color: @text-color;
419 419 letter-spacing: .02em;
420 420 font-weight: @text-bold-weight;
421 421 font-family: @text-bold;
422 422 }
423 423
424 424 #pullrequest_title {
425 425 width: 100%;
426 426 box-sizing: border-box;
427 427 }
428 428
429 429 #pr_open_message {
430 430 border: @border-thickness solid #fff;
431 431 border-radius: @border-radius;
432 432 padding: @padding-large-vertical @padding-large-vertical @padding-large-vertical 0;
433 433 text-align: left;
434 434 overflow: hidden;
435 435 }
436 436
437 437 .pr-submit-button {
438 438 float: right;
439 439 margin: 0 0 0 5px;
440 440 }
441 441
442 442 .pr-spacing-container {
443 443 padding: 20px;
444 444 clear: both
445 445 }
446 446
447 447 #pr-description-input {
448 448 margin-bottom: 0;
449 449 }
450 450
451 451 .pr-description-label {
452 452 vertical-align: top;
453 453 }
454 454
455 455 .perms_section_head {
456 456 min-width: 625px;
457 457
458 458 h2 {
459 459 margin-bottom: 0;
460 460 }
461 461
462 462 .label-checkbox {
463 463 float: left;
464 464 }
465 465
466 466 &.field {
467 467 margin: @space 0 @padding;
468 468 }
469 469
470 470 &:first-child.field {
471 471 margin-top: 0;
472 472
473 473 .label {
474 474 margin-top: 0;
475 475 padding-top: 0;
476 476 }
477 477
478 478 .radios {
479 479 padding-top: 0;
480 480 }
481 481 }
482 482
483 483 .radios {
484 484 position: relative;
485 485 width: 505px;
486 486 }
487 487 }
488 488
489 489 //--- MODULES ------------------//
490 490
491 491
492 492 // Server Announcement
493 493 #server-announcement {
494 494 width: 95%;
495 495 margin: @padding auto;
496 496 padding: @padding;
497 497 border-width: 2px;
498 498 border-style: solid;
499 499 .border-radius(2px);
500 500 font-weight: @text-bold-weight;
501 501 font-family: @text-bold;
502 502
503 503 &.info { border-color: @alert4; background-color: @alert4-inner; }
504 504 &.warning { border-color: @alert3; background-color: @alert3-inner; }
505 505 &.error { border-color: @alert2; background-color: @alert2-inner; }
506 506 &.success { border-color: @alert1; background-color: @alert1-inner; }
507 507 &.neutral { border-color: @grey3; background-color: @grey6; }
508 508 }
509 509
510 510 // Fixed Sidebar Column
511 511 .sidebar-col-wrapper {
512 512 padding-left: @sidebar-all-width;
513 513
514 514 .sidebar {
515 515 width: @sidebar-width;
516 516 margin-left: -@sidebar-all-width;
517 517 }
518 518 }
519 519
520 520 .sidebar-col-wrapper.scw-small {
521 521 padding-left: @sidebar-small-all-width;
522 522
523 523 .sidebar {
524 524 width: @sidebar-small-width;
525 525 margin-left: -@sidebar-small-all-width;
526 526 }
527 527 }
528 528
529 529
530 530 // FOOTER
531 531 #footer {
532 532 padding: 0;
533 533 text-align: center;
534 534 vertical-align: middle;
535 535 color: @grey2;
536 536 font-size: 11px;
537 537
538 538 p {
539 539 margin: 0;
540 540 padding: 1em;
541 541 line-height: 1em;
542 542 }
543 543
544 544 .server-instance { //server instance
545 545 display: none;
546 546 }
547 547
548 548 .title {
549 549 float: none;
550 550 margin: 0 auto;
551 551 }
552 552 }
553 553
554 554 button.close {
555 555 padding: 0;
556 556 cursor: pointer;
557 557 background: transparent;
558 558 border: 0;
559 559 .box-shadow(none);
560 560 -webkit-appearance: none;
561 561 }
562 562
563 563 .close {
564 564 float: right;
565 565 font-size: 21px;
566 566 font-family: @text-bootstrap;
567 567 line-height: 1em;
568 568 font-weight: bold;
569 569 color: @grey2;
570 570
571 571 &:hover,
572 572 &:focus {
573 573 color: @grey1;
574 574 text-decoration: none;
575 575 cursor: pointer;
576 576 }
577 577 }
578 578
579 579 // GRID
580 580 .sorting,
581 581 .sorting_desc,
582 582 .sorting_asc {
583 583 cursor: pointer;
584 584 }
585 585 .sorting_desc:after {
586 586 content: "\00A0\25B2";
587 587 font-size: .75em;
588 588 }
589 589 .sorting_asc:after {
590 590 content: "\00A0\25BC";
591 591 font-size: .68em;
592 592 }
593 593
594 594
595 595 .user_auth_tokens {
596 596
597 597 &.truncate {
598 598 white-space: nowrap;
599 599 overflow: hidden;
600 600 text-overflow: ellipsis;
601 601 }
602 602
603 603 .fields .field .input {
604 604 margin: 0;
605 605 }
606 606
607 607 input#description {
608 608 width: 100px;
609 609 margin: 0;
610 610 }
611 611
612 612 .drop-menu {
613 613 // TODO: johbo: Remove this, should work out of the box when
614 614 // having multiple inputs inline
615 615 margin: 0 0 0 5px;
616 616 }
617 617 }
618 618 #user_list_table {
619 619 .closed {
620 620 background-color: @grey6;
621 621 }
622 622 }
623 623
624 624
625 625 input, textarea {
626 626 &.disabled {
627 627 opacity: .5;
628 628 }
629 629
630 630 &:hover {
631 631 border-color: @grey3;
632 632 box-shadow: @button-shadow;
633 633 }
634 634
635 635 &:focus {
636 636 border-color: @rcblue;
637 637 box-shadow: @button-shadow;
638 638 }
639 639 }
640 640
641 641 // remove extra padding in firefox
642 642 input::-moz-focus-inner { border:0; padding:0 }
643 643
644 644 .adjacent input {
645 645 margin-bottom: @padding;
646 646 }
647 647
648 648 .permissions_boxes {
649 649 display: block;
650 650 }
651 651
652 652 //FORMS
653 653
654 654 .medium-inline,
655 655 input#description.medium-inline {
656 656 display: inline;
657 657 width: @medium-inline-input-width;
658 658 min-width: 100px;
659 659 }
660 660
661 661 select {
662 662 //reset
663 663 -webkit-appearance: none;
664 664 -moz-appearance: none;
665 665
666 666 display: inline-block;
667 667 height: 28px;
668 668 width: auto;
669 669 margin: 0 @padding @padding 0;
670 670 padding: 0 18px 0 8px;
671 671 line-height:1em;
672 672 font-size: @basefontsize;
673 673 border: @border-thickness solid @grey5;
674 674 border-radius: @border-radius;
675 675 background:white url("../images/dt-arrow-dn.png") no-repeat 100% 50%;
676 676 color: @grey4;
677 677 box-shadow: @button-shadow;
678 678
679 679 &:after {
680 680 content: "\00A0\25BE";
681 681 }
682 682
683 683 &:focus, &:hover {
684 684 outline: none;
685 685 border-color: @grey4;
686 686 color: @rcdarkblue;
687 687 }
688 688 }
689 689
690 690 option {
691 691 &:focus {
692 692 outline: none;
693 693 }
694 694 }
695 695
696 696 input,
697 697 textarea {
698 698 padding: @input-padding;
699 699 border: @input-border-thickness solid @border-highlight-color;
700 700 .border-radius (@border-radius);
701 701 font-family: @text-light;
702 702 font-size: @basefontsize;
703 703
704 704 &.input-sm {
705 705 padding: 5px;
706 706 }
707 707
708 708 &#description {
709 709 min-width: @input-description-minwidth;
710 710 min-height: 1em;
711 711 padding: 10px;
712 712 }
713 713 }
714 714
715 715 .field-sm {
716 716 input,
717 717 textarea {
718 718 padding: 5px;
719 719 }
720 720 }
721 721
722 722 textarea {
723 723 display: block;
724 724 clear: both;
725 725 width: 100%;
726 726 min-height: 100px;
727 727 margin-bottom: @padding;
728 728 .box-sizing(border-box);
729 729 overflow: auto;
730 730 }
731 731
732 732 label {
733 733 font-family: @text-light;
734 734 }
735 735
736 736 // GRAVATARS
737 737 // centers gravatar on username to the right
738 738
739 739 .gravatar {
740 740 display: inline;
741 741 min-width: 16px;
742 742 min-height: 16px;
743 743 margin: -5px 0;
744 744 padding: 0;
745 745 line-height: 1em;
746 746 box-sizing: content-box;
747 747 border-radius: 50%;
748 748
749 749 &.gravatar-large {
750 750 margin: -0.5em .25em -0.5em 0;
751 751 }
752 752
753 753 & + .user {
754 754 display: inline;
755 755 margin: 0;
756 756 padding: 0 0 0 .17em;
757 757 line-height: 1em;
758 758 }
759 759 }
760 760
761 761 .user-inline-data {
762 762 display: inline-block;
763 763 float: left;
764 764 padding-left: .5em;
765 765 line-height: 1.3em;
766 766 }
767 767
768 768 .rc-user { // gravatar + user wrapper
769 769 float: left;
770 770 position: relative;
771 771 min-width: 100px;
772 772 max-width: 200px;
773 773 min-height: (@gravatar-size + @border-thickness * 2); // account for border
774 774 display: block;
775 775 padding: 0 0 0 (@gravatar-size + @basefontsize/2 + @border-thickness * 2);
776 776
777 777
778 778 .gravatar {
779 779 display: block;
780 780 position: absolute;
781 781 top: 0;
782 782 left: 0;
783 783 min-width: @gravatar-size;
784 784 min-height: @gravatar-size;
785 785 margin: 0;
786 786 }
787 787
788 788 .user {
789 789 display: block;
790 790 max-width: 175px;
791 791 padding-top: 2px;
792 792 overflow: hidden;
793 793 text-overflow: ellipsis;
794 794 }
795 795 }
796 796
797 797 .gist-gravatar,
798 798 .journal_container {
799 799 .gravatar-large {
800 800 margin: 0 .5em -10px 0;
801 801 }
802 802 }
803 803
804 804
805 805 // ADMIN SETTINGS
806 806
807 807 // Tag Patterns
808 808 .tag_patterns {
809 809 .tag_input {
810 810 margin-bottom: @padding;
811 811 }
812 812 }
813 813
814 814 .locked_input {
815 815 position: relative;
816 816
817 817 input {
818 818 display: inline;
819 819 margin: 3px 5px 0px 0px;
820 820 }
821 821
822 822 br {
823 823 display: none;
824 824 }
825 825
826 826 .error-message {
827 827 float: left;
828 828 width: 100%;
829 829 }
830 830
831 831 .lock_input_button {
832 832 display: inline;
833 833 }
834 834
835 835 .help-block {
836 836 clear: both;
837 837 }
838 838 }
839 839
840 840 // Notifications
841 841
842 842 .notifications_buttons {
843 843 margin: 0 0 @space 0;
844 844 padding: 0;
845 845
846 846 .btn {
847 847 display: inline-block;
848 848 }
849 849 }
850 850
851 851 .notification-list {
852 852
853 853 div {
854 854 display: inline-block;
855 855 vertical-align: middle;
856 856 }
857 857
858 858 .container {
859 859 display: block;
860 860 margin: 0 0 @padding 0;
861 861 }
862 862
863 863 .delete-notifications {
864 864 margin-left: @padding;
865 865 text-align: right;
866 866 cursor: pointer;
867 867 }
868 868
869 869 .read-notifications {
870 870 margin-left: @padding/2;
871 871 text-align: right;
872 872 width: 35px;
873 873 cursor: pointer;
874 874 }
875 875
876 876 .icon-minus-sign {
877 877 color: @alert2;
878 878 }
879 879
880 880 .icon-ok-sign {
881 881 color: @alert1;
882 882 }
883 883 }
884 884
885 885 .user_settings {
886 886 float: left;
887 887 clear: both;
888 888 display: block;
889 889 width: 100%;
890 890
891 891 .gravatar_box {
892 892 margin-bottom: @padding;
893 893
894 894 &:after {
895 895 content: " ";
896 896 clear: both;
897 897 width: 100%;
898 898 }
899 899 }
900 900
901 901 .fields .field {
902 902 clear: both;
903 903 }
904 904 }
905 905
906 906 .advanced_settings {
907 907 margin-bottom: @space;
908 908
909 909 .help-block {
910 910 margin-left: 0;
911 911 }
912 912
913 913 button + .help-block {
914 914 margin-top: @padding;
915 915 }
916 916 }
917 917
918 918 // admin settings radio buttons and labels
919 919 .label-2 {
920 920 float: left;
921 921 width: @label2-width;
922 922
923 923 label {
924 924 color: @grey1;
925 925 }
926 926 }
927 927 .checkboxes {
928 928 float: left;
929 929 width: @checkboxes-width;
930 930 margin-bottom: @padding;
931 931
932 932 .checkbox {
933 933 width: 100%;
934 934
935 935 label {
936 936 margin: 0;
937 937 padding: 0;
938 938 }
939 939 }
940 940
941 941 .checkbox + .checkbox {
942 942 display: inline-block;
943 943 }
944 944
945 945 label {
946 946 margin-right: 1em;
947 947 }
948 948 }
949 949
950 950 // CHANGELOG
951 951 .container_header {
952 952 float: left;
953 953 display: block;
954 954 width: 100%;
955 955 margin: @padding 0 @padding;
956 956
957 957 #filter_changelog {
958 958 float: left;
959 959 margin-right: @padding;
960 960 }
961 961
962 962 .breadcrumbs_light {
963 963 display: inline-block;
964 964 }
965 965 }
966 966
967 967 .info_box {
968 968 float: right;
969 969 }
970 970
971 971
972 972
973 973 #graph_content{
974 974
975 975 // adjust for table headers so that graph renders properly
976 976 // #graph_nodes padding - table cell padding
977 977 padding-top: (@space - (@basefontsize * 2.4));
978 978
979 979 &.graph_full_width {
980 980 width: 100%;
981 981 max-width: 100%;
982 982 }
983 983 }
984 984
985 985 #graph {
986 986 .flag_status {
987 987 margin: 0;
988 988 }
989 989
990 990 .pagination-left {
991 991 float: left;
992 992 clear: both;
993 993 }
994 994
995 995 .log-container {
996 996 max-width: 345px;
997 997
998 998 .message{
999 999 max-width: 340px;
1000 1000 }
1001 1001 }
1002 1002
1003 1003 .graph-col-wrapper {
1004 1004
1005 1005 #graph_nodes {
1006 1006 width: 100px;
1007 1007 position: absolute;
1008 1008 left: 70px;
1009 1009 z-index: -1;
1010 1010 }
1011 1011 }
1012 1012
1013 1013 .load-more-commits {
1014 1014 text-align: center;
1015 1015 }
1016 1016 .load-more-commits:hover {
1017 1017 background-color: @grey7;
1018 1018 }
1019 1019 .load-more-commits {
1020 1020 a {
1021 1021 display: block;
1022 1022 }
1023 1023 }
1024 1024 }
1025 1025
1026 1026 .obsolete-toggle {
1027 1027 line-height: 30px;
1028 1028 margin-left: -15px;
1029 1029 }
1030 1030
1031 1031 #rev_range_container, #rev_range_clear, #rev_range_more {
1032 1032 margin-top: -5px;
1033 1033 margin-bottom: -5px;
1034 1034 }
1035 1035
1036 1036 #filter_changelog {
1037 1037 float: left;
1038 1038 }
1039 1039
1040 1040
1041 1041 //--- THEME ------------------//
1042 1042
1043 1043 #logo {
1044 1044 float: left;
1045 1045 margin: 9px 0 0 0;
1046 1046
1047 1047 .header {
1048 1048 background-color: transparent;
1049 1049 }
1050 1050
1051 1051 a {
1052 1052 display: inline-block;
1053 1053 }
1054 1054
1055 1055 img {
1056 1056 height:30px;
1057 1057 }
1058 1058 }
1059 1059
1060 1060 .logo-wrapper {
1061 1061 float:left;
1062 1062 }
1063 1063
1064 1064 .branding {
1065 1065 float: left;
1066 1066 padding: 9px 2px;
1067 1067 line-height: 1em;
1068 1068 font-size: @navigation-fontsize;
1069 1069
1070 1070 a {
1071 1071 color: @grey5
1072 1072 }
1073 1073 @media screen and (max-width: 1200px) {
1074 1074 display: none;
1075 1075 }
1076 1076 }
1077 1077
1078 1078 img {
1079 1079 border: none;
1080 1080 outline: none;
1081 1081 }
1082 1082 user-profile-header
1083 1083 label {
1084 1084
1085 1085 input[type="checkbox"] {
1086 1086 margin-right: 1em;
1087 1087 }
1088 1088 input[type="radio"] {
1089 1089 margin-right: 1em;
1090 1090 }
1091 1091 }
1092 1092
1093 1093 .flag_status {
1094 1094 margin: 2px;
1095 1095 &.under_review {
1096 1096 .circle(5px, @alert3);
1097 1097 }
1098 1098 &.approved {
1099 1099 .circle(5px, @alert1);
1100 1100 }
1101 1101 &.rejected,
1102 1102 &.forced_closed{
1103 1103 .circle(5px, @alert2);
1104 1104 }
1105 1105 &.not_reviewed {
1106 1106 .circle(5px, @grey5);
1107 1107 }
1108 1108 }
1109 1109
1110 .review-status {
1111 &.under_review {
1112 color: @alert3;
1113 }
1114 &.approved {
1115 color: @alert1;
1116 }
1117 &.rejected,
1118 &.forced_closed{
1119 color: @alert2;
1120 }
1121 &.not_reviewed {
1122 color: @grey5;
1123 }
1124 }
1125
1126 .review-status-under_review {
1127 color: @alert3;
1128 }
1129 .status-tag-under_review {
1130 border-color: @alert3;
1131 }
1132
1133 .review-status-approved {
1134 color: @alert1;
1135 }
1136 .status-tag-approved {
1137 border-color: @alert1;
1138 }
1139
1140 .review-status-rejected,
1141 .review-status-forced_closed {
1142 color: @alert2;
1143 }
1144 .status-tag-rejected,
1145 .status-tag-forced_closed {
1146 border-color: @alert2;
1147 }
1148
1149 .review-status-not_reviewed {
1150 color: @grey5;
1151 }
1152 .status-tag-not_reviewed {
1153 border-color: @grey5;
1154 }
1155
1110 1156 .flag_status_comment_box {
1111 1157 margin: 5px 6px 0px 2px;
1112 1158 }
1113 1159 .test_pattern_preview {
1114 1160 margin: @space 0;
1115 1161
1116 1162 p {
1117 1163 margin-bottom: 0;
1118 1164 border-bottom: @border-thickness solid @border-default-color;
1119 1165 color: @grey3;
1120 1166 }
1121 1167
1122 1168 .btn {
1123 1169 margin-bottom: @padding;
1124 1170 }
1125 1171 }
1126 1172 #test_pattern_result {
1127 1173 display: none;
1128 1174 &:extend(pre);
1129 1175 padding: .9em;
1130 1176 color: @grey3;
1131 1177 background-color: @grey7;
1132 1178 border-right: @border-thickness solid @border-default-color;
1133 1179 border-bottom: @border-thickness solid @border-default-color;
1134 1180 border-left: @border-thickness solid @border-default-color;
1135 1181 }
1136 1182
1137 1183 #repo_vcs_settings {
1138 1184 #inherit_overlay_vcs_default {
1139 1185 display: none;
1140 1186 }
1141 1187 #inherit_overlay_vcs_custom {
1142 1188 display: custom;
1143 1189 }
1144 1190 &.inherited {
1145 1191 #inherit_overlay_vcs_default {
1146 1192 display: block;
1147 1193 }
1148 1194 #inherit_overlay_vcs_custom {
1149 1195 display: none;
1150 1196 }
1151 1197 }
1152 1198 }
1153 1199
1154 1200 .issue-tracker-link {
1155 1201 color: @rcblue;
1156 1202 }
1157 1203
1158 1204 // Issue Tracker Table Show/Hide
1159 1205 #repo_issue_tracker {
1160 1206 #inherit_overlay {
1161 1207 display: none;
1162 1208 }
1163 1209 #custom_overlay {
1164 1210 display: custom;
1165 1211 }
1166 1212 &.inherited {
1167 1213 #inherit_overlay {
1168 1214 display: block;
1169 1215 }
1170 1216 #custom_overlay {
1171 1217 display: none;
1172 1218 }
1173 1219 }
1174 1220 }
1175 1221 table.issuetracker {
1176 1222 &.readonly {
1177 1223 tr, td {
1178 1224 color: @grey3;
1179 1225 }
1180 1226 }
1181 1227 .edit {
1182 1228 display: none;
1183 1229 }
1184 1230 .editopen {
1185 1231 .edit {
1186 1232 display: inline;
1187 1233 }
1188 1234 .entry {
1189 1235 display: none;
1190 1236 }
1191 1237 }
1192 1238 tr td.td-action {
1193 1239 min-width: 117px;
1194 1240 }
1195 1241 td input {
1196 1242 max-width: none;
1197 1243 min-width: 30px;
1198 1244 width: 80%;
1199 1245 }
1200 1246 .issuetracker_pref input {
1201 1247 width: 40%;
1202 1248 }
1203 1249 input.edit_issuetracker_update {
1204 1250 margin-right: 0;
1205 1251 width: auto;
1206 1252 }
1207 1253 }
1208 1254
1209 1255 table.integrations {
1210 1256 .td-icon {
1211 1257 width: 20px;
1212 1258 .integration-icon {
1213 1259 height: 20px;
1214 1260 width: 20px;
1215 1261 }
1216 1262 }
1217 1263 }
1218 1264
1219 1265 .integrations {
1220 1266 a.integration-box {
1221 1267 color: @text-color;
1222 1268 &:hover {
1223 1269 .panel {
1224 1270 background: #fbfbfb;
1225 1271 }
1226 1272 }
1227 1273 .integration-icon {
1228 1274 width: 30px;
1229 1275 height: 30px;
1230 1276 margin-right: 20px;
1231 1277 float: left;
1232 1278 }
1233 1279
1234 1280 .panel-body {
1235 1281 padding: 10px;
1236 1282 }
1237 1283 .panel {
1238 1284 margin-bottom: 10px;
1239 1285 }
1240 1286 h2 {
1241 1287 display: inline-block;
1242 1288 margin: 0;
1243 1289 min-width: 140px;
1244 1290 }
1245 1291 }
1246 1292 a.integration-box.dummy-integration {
1247 1293 color: @grey4
1248 1294 }
1249 1295 }
1250 1296
1251 1297 //Permissions Settings
1252 1298 #add_perm {
1253 1299 margin: 0 0 @padding;
1254 1300 cursor: pointer;
1255 1301 }
1256 1302
1257 1303 .perm_ac {
1258 1304 input {
1259 1305 width: 95%;
1260 1306 }
1261 1307 }
1262 1308
1263 1309 .autocomplete-suggestions {
1264 1310 width: auto !important; // overrides autocomplete.js
1265 1311 min-width: 278px;
1266 1312 margin: 0;
1267 1313 border: @border-thickness solid @grey5;
1268 1314 border-radius: @border-radius;
1269 1315 color: @grey2;
1270 1316 background-color: white;
1271 1317 }
1272 1318
1273 1319 .autocomplete-qfilter-suggestions {
1274 1320 width: auto !important; // overrides autocomplete.js
1275 1321 max-height: 100% !important;
1276 1322 min-width: 376px;
1277 1323 margin: 0;
1278 1324 border: @border-thickness solid @grey5;
1279 1325 color: @grey2;
1280 1326 background-color: white;
1281 1327 }
1282 1328
1283 1329 .autocomplete-selected {
1284 1330 background: #F0F0F0;
1285 1331 }
1286 1332
1287 1333 .ac-container-wrap {
1288 1334 margin: 0;
1289 1335 padding: 8px;
1290 1336 border-bottom: @border-thickness solid @grey5;
1291 1337 list-style-type: none;
1292 1338 cursor: pointer;
1293 1339
1294 1340 &:hover {
1295 1341 background-color: @grey7;
1296 1342 }
1297 1343
1298 1344 img {
1299 1345 height: @gravatar-size;
1300 1346 width: @gravatar-size;
1301 1347 margin-right: 1em;
1302 1348 }
1303 1349
1304 1350 strong {
1305 1351 font-weight: normal;
1306 1352 }
1307 1353 }
1308 1354
1309 1355 // Settings Dropdown
1310 1356 .user-menu .container {
1311 1357 padding: 0 4px;
1312 1358 margin: 0;
1313 1359 }
1314 1360
1315 1361 .user-menu .gravatar {
1316 1362 cursor: pointer;
1317 1363 }
1318 1364
1319 1365 .codeblock {
1320 1366 margin-bottom: @padding;
1321 1367 clear: both;
1322 1368
1323 1369 .stats {
1324 1370 overflow: hidden;
1325 1371 }
1326 1372
1327 1373 .message{
1328 1374 textarea{
1329 1375 margin: 0;
1330 1376 }
1331 1377 }
1332 1378
1333 1379 .code-header {
1334 1380 .stats {
1335 1381 line-height: 2em;
1336 1382
1337 1383 .revision_id {
1338 1384 margin-left: 0;
1339 1385 }
1340 1386 .buttons {
1341 1387 padding-right: 0;
1342 1388 }
1343 1389 }
1344 1390
1345 1391 .item{
1346 1392 margin-right: 0.5em;
1347 1393 }
1348 1394 }
1349 1395
1350 1396 #editor_container {
1351 1397 position: relative;
1352 1398 margin: @padding 10px;
1353 1399 }
1354 1400 }
1355 1401
1356 1402 #file_history_container {
1357 1403 display: none;
1358 1404 }
1359 1405
1360 1406 .file-history-inner {
1361 1407 margin-bottom: 10px;
1362 1408 }
1363 1409
1364 1410 // Pull Requests
1365 1411 .summary-details {
1366 1412 width: 72%;
1367 1413 }
1368 1414 .pr-summary {
1369 1415 border-bottom: @border-thickness solid @grey5;
1370 1416 margin-bottom: @space;
1371 1417 }
1372 1418 .reviewers-title {
1373 1419 width: 25%;
1374 1420 min-width: 200px;
1375 1421 }
1376 1422 .reviewers {
1377 1423 width: 25%;
1378 1424 min-width: 200px;
1379 1425 }
1380 1426 .reviewers ul li {
1381 1427 position: relative;
1382 1428 width: 100%;
1383 1429 padding-bottom: 8px;
1384 1430 list-style-type: none;
1385 1431 }
1386 1432
1387 1433 .reviewer_entry {
1388 1434 min-height: 55px;
1389 1435 }
1390 1436
1391 1437 .reviewers_member {
1392 1438 width: 100%;
1393 1439 overflow: auto;
1394 1440 }
1395 1441 .reviewer_reason {
1396 1442 padding-left: 20px;
1397 1443 line-height: 1.5em;
1398 1444 }
1399 1445 .reviewer_status {
1400 1446 display: inline-block;
1401 1447 vertical-align: top;
1402 1448 width: 25px;
1403 1449 min-width: 25px;
1404 1450 height: 1.2em;
1405 1451 margin-top: 3px;
1406 1452 line-height: 1em;
1407 1453 }
1408 1454
1409 1455 .reviewer_name {
1410 1456 display: inline-block;
1411 1457 max-width: 83%;
1412 1458 padding-right: 20px;
1413 1459 vertical-align: middle;
1414 1460 line-height: 1;
1415 1461
1416 1462 .rc-user {
1417 1463 min-width: 0;
1418 1464 margin: -2px 1em 0 0;
1419 1465 }
1420 1466
1421 1467 .reviewer {
1422 1468 float: left;
1423 1469 }
1424 1470 }
1425 1471
1426 1472 .reviewer_member_mandatory {
1427 1473 position: absolute;
1428 1474 left: 15px;
1429 1475 top: 8px;
1430 1476 width: 16px;
1431 1477 font-size: 11px;
1432 1478 margin: 0;
1433 1479 padding: 0;
1434 1480 color: black;
1435 1481 }
1436 1482
1437 1483 .reviewer_member_mandatory_remove,
1438 1484 .reviewer_member_remove {
1439 1485 position: absolute;
1440 1486 right: 0;
1441 1487 top: 0;
1442 1488 width: 16px;
1443 1489 margin-bottom: 10px;
1444 1490 padding: 0;
1445 1491 color: black;
1446 1492 }
1447 1493
1448 1494 .reviewer_member_mandatory_remove {
1449 1495 color: @grey4;
1450 1496 }
1451 1497
1452 1498 .reviewer_member_status {
1453 1499 margin-top: 5px;
1454 1500 }
1455 1501 .pr-summary #summary{
1456 1502 width: 100%;
1457 1503 }
1458 1504 .pr-summary .action_button:hover {
1459 1505 border: 0;
1460 1506 cursor: pointer;
1461 1507 }
1462 1508 .pr-details-title {
1463 1509 padding-bottom: 8px;
1464 1510 border-bottom: @border-thickness solid @grey5;
1465 1511
1466 1512 .action_button.disabled {
1467 1513 color: @grey4;
1468 1514 cursor: inherit;
1469 1515 }
1470 1516 .action_button {
1471 1517 color: @rcblue;
1472 1518 }
1473 1519 }
1474 1520 .pr-details-content {
1475 1521 margin-top: @textmargin;
1476 1522 margin-bottom: @textmargin;
1477 1523 }
1478 1524
1479 1525 .pr-reviewer-rules {
1480 1526 padding: 10px 0px 20px 0px;
1481 1527 }
1482 1528
1483 1529 .group_members {
1484 1530 margin-top: 0;
1485 1531 padding: 0;
1486 1532 list-style: outside none none;
1487 1533
1488 1534 img {
1489 1535 height: @gravatar-size;
1490 1536 width: @gravatar-size;
1491 1537 margin-right: .5em;
1492 1538 margin-left: 3px;
1493 1539 }
1494 1540
1495 1541 .to-delete {
1496 1542 .user {
1497 1543 text-decoration: line-through;
1498 1544 }
1499 1545 }
1500 1546 }
1501 1547
1502 1548 .compare_view_commits_title {
1503 1549 .disabled {
1504 1550 cursor: inherit;
1505 1551 &:hover{
1506 1552 background-color: inherit;
1507 1553 color: inherit;
1508 1554 }
1509 1555 }
1510 1556 }
1511 1557
1512 1558 .subtitle-compare {
1513 1559 margin: -15px 0px 0px 0px;
1514 1560 }
1515 1561
1516 1562 .comments-summary-td {
1517 1563 border-top: 1px dashed @grey5;
1518 1564 }
1519 1565
1520 1566 // new entry in group_members
1521 1567 .td-author-new-entry {
1522 1568 background-color: rgba(red(@alert1), green(@alert1), blue(@alert1), 0.3);
1523 1569 }
1524 1570
1525 1571 .usergroup_member_remove {
1526 1572 width: 16px;
1527 1573 margin-bottom: 10px;
1528 1574 padding: 0;
1529 1575 color: black !important;
1530 1576 cursor: pointer;
1531 1577 }
1532 1578
1533 1579 .reviewer_ac .ac-input {
1534 1580 width: 92%;
1535 1581 margin-bottom: 1em;
1536 1582 }
1537 1583
1538 1584 .compare_view_commits tr{
1539 1585 height: 20px;
1540 1586 }
1541 1587 .compare_view_commits td {
1542 1588 vertical-align: top;
1543 1589 padding-top: 10px;
1544 1590 }
1545 1591 .compare_view_commits .author {
1546 1592 margin-left: 5px;
1547 1593 }
1548 1594
1549 1595 .compare_view_commits {
1550 1596 .color-a {
1551 1597 color: @alert1;
1552 1598 }
1553 1599
1554 1600 .color-c {
1555 1601 color: @color3;
1556 1602 }
1557 1603
1558 1604 .color-r {
1559 1605 color: @color5;
1560 1606 }
1561 1607
1562 1608 .color-a-bg {
1563 1609 background-color: @alert1;
1564 1610 }
1565 1611
1566 1612 .color-c-bg {
1567 1613 background-color: @alert3;
1568 1614 }
1569 1615
1570 1616 .color-r-bg {
1571 1617 background-color: @alert2;
1572 1618 }
1573 1619
1574 1620 .color-a-border {
1575 1621 border: 1px solid @alert1;
1576 1622 }
1577 1623
1578 1624 .color-c-border {
1579 1625 border: 1px solid @alert3;
1580 1626 }
1581 1627
1582 1628 .color-r-border {
1583 1629 border: 1px solid @alert2;
1584 1630 }
1585 1631
1586 1632 .commit-change-indicator {
1587 1633 width: 15px;
1588 1634 height: 15px;
1589 1635 position: relative;
1590 1636 left: 15px;
1591 1637 }
1592 1638
1593 1639 .commit-change-content {
1594 1640 text-align: center;
1595 1641 vertical-align: middle;
1596 1642 line-height: 15px;
1597 1643 }
1598 1644 }
1599 1645
1600 1646 .compare_view_filepath {
1601 1647 color: @grey1;
1602 1648 }
1603 1649
1604 1650 .show_more {
1605 1651 display: inline-block;
1606 1652 width: 0;
1607 1653 height: 0;
1608 1654 vertical-align: middle;
1609 1655 content: "";
1610 1656 border: 4px solid;
1611 1657 border-right-color: transparent;
1612 1658 border-bottom-color: transparent;
1613 1659 border-left-color: transparent;
1614 1660 font-size: 0;
1615 1661 }
1616 1662
1617 1663 .journal_more .show_more {
1618 1664 display: inline;
1619 1665
1620 1666 &:after {
1621 1667 content: none;
1622 1668 }
1623 1669 }
1624 1670
1625 1671 .compare_view_commits .collapse_commit:after {
1626 1672 cursor: pointer;
1627 1673 content: "\00A0\25B4";
1628 1674 margin-left: -3px;
1629 1675 font-size: 17px;
1630 1676 color: @grey4;
1631 1677 }
1632 1678
1633 1679 .diff_links {
1634 1680 margin-left: 8px;
1635 1681 }
1636 1682
1637 1683 #pull_request_overview {
1638 1684 div.ancestor {
1639 1685 margin: -33px 0;
1640 1686 }
1641 1687 }
1642 1688
1643 1689 div.ancestor {
1644 1690 line-height: 33px;
1645 1691 }
1646 1692
1647 1693 .cs_icon_td input[type="checkbox"] {
1648 1694 display: none;
1649 1695 }
1650 1696
1651 1697 .cs_icon_td .expand_file_icon:after {
1652 1698 cursor: pointer;
1653 1699 content: "\00A0\25B6";
1654 1700 font-size: 12px;
1655 1701 color: @grey4;
1656 1702 }
1657 1703
1658 1704 .cs_icon_td .collapse_file_icon:after {
1659 1705 cursor: pointer;
1660 1706 content: "\00A0\25BC";
1661 1707 font-size: 12px;
1662 1708 color: @grey4;
1663 1709 }
1664 1710
1665 1711 /*new binary
1666 1712 NEW_FILENODE = 1
1667 1713 DEL_FILENODE = 2
1668 1714 MOD_FILENODE = 3
1669 1715 RENAMED_FILENODE = 4
1670 1716 COPIED_FILENODE = 5
1671 1717 CHMOD_FILENODE = 6
1672 1718 BIN_FILENODE = 7
1673 1719 */
1674 1720 .cs_files_expand {
1675 1721 font-size: @basefontsize + 5px;
1676 1722 line-height: 1.8em;
1677 1723 float: right;
1678 1724 }
1679 1725
1680 1726 .cs_files_expand span{
1681 1727 color: @rcblue;
1682 1728 cursor: pointer;
1683 1729 }
1684 1730 .cs_files {
1685 1731 clear: both;
1686 1732 padding-bottom: @padding;
1687 1733
1688 1734 .cur_cs {
1689 1735 margin: 10px 2px;
1690 1736 font-weight: bold;
1691 1737 }
1692 1738
1693 1739 .node {
1694 1740 float: left;
1695 1741 }
1696 1742
1697 1743 .changes {
1698 1744 float: right;
1699 1745 color: white;
1700 1746 font-size: @basefontsize - 4px;
1701 1747 margin-top: 4px;
1702 1748 opacity: 0.6;
1703 1749 filter: Alpha(opacity=60); /* IE8 and earlier */
1704 1750
1705 1751 .added {
1706 1752 background-color: @alert1;
1707 1753 float: left;
1708 1754 text-align: center;
1709 1755 }
1710 1756
1711 1757 .deleted {
1712 1758 background-color: @alert2;
1713 1759 float: left;
1714 1760 text-align: center;
1715 1761 }
1716 1762
1717 1763 .bin {
1718 1764 background-color: @alert1;
1719 1765 text-align: center;
1720 1766 }
1721 1767
1722 1768 /*new binary*/
1723 1769 .bin.bin1 {
1724 1770 background-color: @alert1;
1725 1771 text-align: center;
1726 1772 }
1727 1773
1728 1774 /*deleted binary*/
1729 1775 .bin.bin2 {
1730 1776 background-color: @alert2;
1731 1777 text-align: center;
1732 1778 }
1733 1779
1734 1780 /*mod binary*/
1735 1781 .bin.bin3 {
1736 1782 background-color: @grey2;
1737 1783 text-align: center;
1738 1784 }
1739 1785
1740 1786 /*rename file*/
1741 1787 .bin.bin4 {
1742 1788 background-color: @alert4;
1743 1789 text-align: center;
1744 1790 }
1745 1791
1746 1792 /*copied file*/
1747 1793 .bin.bin5 {
1748 1794 background-color: @alert4;
1749 1795 text-align: center;
1750 1796 }
1751 1797
1752 1798 /*chmod file*/
1753 1799 .bin.bin6 {
1754 1800 background-color: @grey2;
1755 1801 text-align: center;
1756 1802 }
1757 1803 }
1758 1804 }
1759 1805
1760 1806 .cs_files .cs_added, .cs_files .cs_A,
1761 1807 .cs_files .cs_added, .cs_files .cs_M,
1762 1808 .cs_files .cs_added, .cs_files .cs_D {
1763 1809 height: 16px;
1764 1810 padding-right: 10px;
1765 1811 margin-top: 7px;
1766 1812 text-align: left;
1767 1813 }
1768 1814
1769 1815 .cs_icon_td {
1770 1816 min-width: 16px;
1771 1817 width: 16px;
1772 1818 }
1773 1819
1774 1820 .pull-request-merge {
1775 1821 border: 1px solid @grey5;
1776 1822 padding: 10px 0px 20px;
1777 1823 margin-top: 10px;
1778 1824 margin-bottom: 20px;
1779 1825 }
1780 1826
1781 1827 .pull-request-merge ul {
1782 1828 padding: 0px 0px;
1783 1829 }
1784 1830
1785 1831 .pull-request-merge li {
1786 1832 list-style-type: none;
1787 1833 }
1788 1834
1789 1835 .pull-request-merge .pull-request-wrap {
1790 1836 height: auto;
1791 1837 padding: 0px 0px;
1792 1838 text-align: right;
1793 1839 }
1794 1840
1795 1841 .pull-request-merge span {
1796 1842 margin-right: 5px;
1797 1843 }
1798 1844
1799 1845 .pull-request-merge-actions {
1800 1846 min-height: 30px;
1801 1847 padding: 0px 0px;
1802 1848 }
1803 1849
1804 1850 .pull-request-merge-info {
1805 1851 padding: 0px 5px 5px 0px;
1806 1852 }
1807 1853
1808 1854 .merge-status {
1809 1855 margin-right: 5px;
1810 1856 }
1811 1857
1812 1858 .merge-message {
1813 1859 font-size: 1.2em
1814 1860 }
1815 1861
1816 1862 .merge-message.success i,
1817 1863 .merge-icon.success i {
1818 1864 color:@alert1;
1819 1865 }
1820 1866
1821 1867 .merge-message.warning i,
1822 1868 .merge-icon.warning i {
1823 1869 color: @alert3;
1824 1870 }
1825 1871
1826 1872 .merge-message.error i,
1827 1873 .merge-icon.error i {
1828 1874 color:@alert2;
1829 1875 }
1830 1876
1831 1877 .pr-versions {
1832 1878 font-size: 1.1em;
1833 1879
1834 1880 table {
1835 1881 padding: 0px 5px;
1836 1882 }
1837 1883
1838 1884 td {
1839 1885 line-height: 15px;
1840 1886 }
1841 1887
1842 1888 .flag_status {
1843 1889 margin: 0;
1844 1890 }
1845 1891
1846 1892 .compare-radio-button {
1847 1893 position: relative;
1848 1894 top: -3px;
1849 1895 }
1850 1896 }
1851 1897
1852 1898
1853 1899 #close_pull_request {
1854 1900 margin-right: 0px;
1855 1901 }
1856 1902
1857 1903 .empty_data {
1858 1904 color: @grey4;
1859 1905 }
1860 1906
1861 1907 #changeset_compare_view_content {
1862 1908 clear: both;
1863 1909 width: 100%;
1864 1910 box-sizing: border-box;
1865 1911 .border-radius(@border-radius);
1866 1912
1867 1913 .help-block {
1868 1914 margin: @padding 0;
1869 1915 color: @text-color;
1870 1916 &.pre-formatting {
1871 1917 white-space: pre;
1872 1918 }
1873 1919 }
1874 1920
1875 1921 .empty_data {
1876 1922 margin: @padding 0;
1877 1923 }
1878 1924
1879 1925 .alert {
1880 1926 margin-bottom: @space;
1881 1927 }
1882 1928 }
1883 1929
1884 1930 .table_disp {
1885 1931 .status {
1886 1932 width: auto;
1887 1933
1888 1934 .flag_status {
1889 1935 float: left;
1890 1936 }
1891 1937 }
1892 1938 }
1893 1939
1894 1940
1895 1941 .creation_in_progress {
1896 1942 color: @grey4
1897 1943 }
1898 1944
1899 1945 .status_box_menu {
1900 1946 margin: 0;
1901 1947 }
1902 1948
1903 1949 .notification-table{
1904 1950 margin-bottom: @space;
1905 1951 display: table;
1906 1952 width: 100%;
1907 1953
1908 1954 .container{
1909 1955 display: table-row;
1910 1956
1911 1957 .notification-header{
1912 1958 border-bottom: @border-thickness solid @border-default-color;
1913 1959 }
1914 1960
1915 1961 .notification-subject{
1916 1962 display: table-cell;
1917 1963 }
1918 1964 }
1919 1965 }
1920 1966
1921 1967 // Notifications
1922 1968 .notification-header{
1923 1969 display: table;
1924 1970 width: 100%;
1925 1971 padding: floor(@basefontsize/2) 0;
1926 1972 line-height: 1em;
1927 1973
1928 1974 .desc, .delete-notifications, .read-notifications{
1929 1975 display: table-cell;
1930 1976 text-align: left;
1931 1977 }
1932 1978
1933 1979 .desc{
1934 1980 width: 1163px;
1935 1981 }
1936 1982
1937 1983 .delete-notifications, .read-notifications{
1938 1984 width: 35px;
1939 1985 min-width: 35px; //fixes when only one button is displayed
1940 1986 }
1941 1987 }
1942 1988
1943 1989 .notification-body {
1944 1990 .markdown-block,
1945 1991 .rst-block {
1946 1992 padding: @padding 0;
1947 1993 }
1948 1994
1949 1995 .notification-subject {
1950 1996 padding: @textmargin 0;
1951 1997 border-bottom: @border-thickness solid @border-default-color;
1952 1998 }
1953 1999 }
1954 2000
1955 2001
1956 2002 .notifications_buttons{
1957 2003 float: right;
1958 2004 }
1959 2005
1960 2006 #notification-status{
1961 2007 display: inline;
1962 2008 }
1963 2009
1964 2010 // Repositories
1965 2011
1966 2012 #summary.fields{
1967 2013 display: table;
1968 2014
1969 2015 .field{
1970 2016 display: table-row;
1971 2017
1972 2018 .label-summary{
1973 2019 display: table-cell;
1974 2020 min-width: @label-summary-minwidth;
1975 2021 padding-top: @padding/2;
1976 2022 padding-bottom: @padding/2;
1977 2023 padding-right: @padding/2;
1978 2024 }
1979 2025
1980 2026 .input{
1981 2027 display: table-cell;
1982 2028 padding: @padding/2;
1983 2029
1984 2030 input{
1985 2031 min-width: 29em;
1986 2032 padding: @padding/4;
1987 2033 }
1988 2034 }
1989 2035 .statistics, .downloads{
1990 2036 .disabled{
1991 2037 color: @grey4;
1992 2038 }
1993 2039 }
1994 2040 }
1995 2041 }
1996 2042
1997 2043 #summary{
1998 2044 width: 70%;
1999 2045 }
2000 2046
2001 2047
2002 2048 // Journal
2003 2049 .journal.title {
2004 2050 h5 {
2005 2051 float: left;
2006 2052 margin: 0;
2007 2053 width: 70%;
2008 2054 }
2009 2055
2010 2056 ul {
2011 2057 float: right;
2012 2058 display: inline-block;
2013 2059 margin: 0;
2014 2060 width: 30%;
2015 2061 text-align: right;
2016 2062
2017 2063 li {
2018 2064 display: inline;
2019 2065 font-size: @journal-fontsize;
2020 2066 line-height: 1em;
2021 2067
2022 2068 list-style-type: none;
2023 2069 }
2024 2070 }
2025 2071 }
2026 2072
2027 2073 .filterexample {
2028 2074 position: absolute;
2029 2075 top: 95px;
2030 2076 left: @contentpadding;
2031 2077 color: @rcblue;
2032 2078 font-size: 11px;
2033 2079 font-family: @text-regular;
2034 2080 cursor: help;
2035 2081
2036 2082 &:hover {
2037 2083 color: @rcdarkblue;
2038 2084 }
2039 2085
2040 2086 @media (max-width:768px) {
2041 2087 position: relative;
2042 2088 top: auto;
2043 2089 left: auto;
2044 2090 display: block;
2045 2091 }
2046 2092 }
2047 2093
2048 2094
2049 2095 #journal{
2050 2096 margin-bottom: @space;
2051 2097
2052 2098 .journal_day{
2053 2099 margin-bottom: @textmargin/2;
2054 2100 padding-bottom: @textmargin/2;
2055 2101 font-size: @journal-fontsize;
2056 2102 border-bottom: @border-thickness solid @border-default-color;
2057 2103 }
2058 2104
2059 2105 .journal_container{
2060 2106 margin-bottom: @space;
2061 2107
2062 2108 .journal_user{
2063 2109 display: inline-block;
2064 2110 }
2065 2111 .journal_action_container{
2066 2112 display: block;
2067 2113 margin-top: @textmargin;
2068 2114
2069 2115 div{
2070 2116 display: inline;
2071 2117 }
2072 2118
2073 2119 div.journal_action_params{
2074 2120 display: block;
2075 2121 }
2076 2122
2077 2123 div.journal_repo:after{
2078 2124 content: "\A";
2079 2125 white-space: pre;
2080 2126 }
2081 2127
2082 2128 div.date{
2083 2129 display: block;
2084 2130 margin-bottom: @textmargin;
2085 2131 }
2086 2132 }
2087 2133 }
2088 2134 }
2089 2135
2090 2136 // Files
2091 2137 .edit-file-title {
2092 2138 font-size: 16px;
2093 2139
2094 2140 .title-heading {
2095 2141 padding: 2px;
2096 2142 }
2097 2143 }
2098 2144
2099 2145 .edit-file-fieldset {
2100 2146 margin: @sidebarpadding 0;
2101 2147
2102 2148 .fieldset {
2103 2149 .left-label {
2104 2150 width: 13%;
2105 2151 }
2106 2152 .right-content {
2107 2153 width: 87%;
2108 2154 max-width: 100%;
2109 2155 }
2110 2156 .filename-label {
2111 2157 margin-top: 13px;
2112 2158 }
2113 2159 .commit-message-label {
2114 2160 margin-top: 4px;
2115 2161 }
2116 2162 .file-upload-input {
2117 2163 input {
2118 2164 display: none;
2119 2165 }
2120 2166 margin-top: 10px;
2121 2167 }
2122 2168 .file-upload-label {
2123 2169 margin-top: 10px;
2124 2170 }
2125 2171 p {
2126 2172 margin-top: 5px;
2127 2173 }
2128 2174
2129 2175 }
2130 2176 .custom-path-link {
2131 2177 margin-left: 5px;
2132 2178 }
2133 2179 #commit {
2134 2180 resize: vertical;
2135 2181 }
2136 2182 }
2137 2183
2138 2184 .delete-file-preview {
2139 2185 max-height: 250px;
2140 2186 }
2141 2187
2142 2188 .new-file,
2143 2189 #filter_activate,
2144 2190 #filter_deactivate {
2145 2191 float: right;
2146 2192 margin: 0 0 0 10px;
2147 2193 }
2148 2194
2149 2195 .file-upload-transaction-wrapper {
2150 2196 margin-top: 57px;
2151 2197 clear: both;
2152 2198 }
2153 2199
2154 2200 .file-upload-transaction-wrapper .error {
2155 2201 color: @color5;
2156 2202 }
2157 2203
2158 2204 .file-upload-transaction {
2159 2205 min-height: 200px;
2160 2206 padding: 54px;
2161 2207 border: 1px solid @grey5;
2162 2208 text-align: center;
2163 2209 clear: both;
2164 2210 }
2165 2211
2166 2212 .file-upload-transaction i {
2167 2213 font-size: 48px
2168 2214 }
2169 2215
2170 2216 h3.files_location{
2171 2217 line-height: 2.4em;
2172 2218 }
2173 2219
2174 2220 .browser-nav {
2175 2221 width: 100%;
2176 2222 display: table;
2177 2223 margin-bottom: 20px;
2178 2224
2179 2225 .info_box {
2180 2226 float: left;
2181 2227 display: inline-table;
2182 2228 height: 2.5em;
2183 2229
2184 2230 .browser-cur-rev, .info_box_elem {
2185 2231 display: table-cell;
2186 2232 vertical-align: middle;
2187 2233 }
2188 2234
2189 2235 .drop-menu {
2190 2236 margin: 0 10px;
2191 2237 }
2192 2238
2193 2239 .info_box_elem {
2194 2240 border-top: @border-thickness solid @grey5;
2195 2241 border-bottom: @border-thickness solid @grey5;
2196 2242 box-shadow: @button-shadow;
2197 2243
2198 2244 #at_rev, a {
2199 2245 padding: 0.6em 0.4em;
2200 2246 margin: 0;
2201 2247 .box-shadow(none);
2202 2248 border: 0;
2203 2249 height: 12px;
2204 2250 color: @grey2;
2205 2251 }
2206 2252
2207 2253 input#at_rev {
2208 2254 max-width: 50px;
2209 2255 text-align: center;
2210 2256 }
2211 2257
2212 2258 &.previous {
2213 2259 border: @border-thickness solid @grey5;
2214 2260 border-top-left-radius: @border-radius;
2215 2261 border-bottom-left-radius: @border-radius;
2216 2262
2217 2263 &:hover {
2218 2264 border-color: @grey4;
2219 2265 }
2220 2266
2221 2267 .disabled {
2222 2268 color: @grey5;
2223 2269 cursor: not-allowed;
2224 2270 opacity: 0.5;
2225 2271 }
2226 2272 }
2227 2273
2228 2274 &.next {
2229 2275 border: @border-thickness solid @grey5;
2230 2276 border-top-right-radius: @border-radius;
2231 2277 border-bottom-right-radius: @border-radius;
2232 2278
2233 2279 &:hover {
2234 2280 border-color: @grey4;
2235 2281 }
2236 2282
2237 2283 .disabled {
2238 2284 color: @grey5;
2239 2285 cursor: not-allowed;
2240 2286 opacity: 0.5;
2241 2287 }
2242 2288 }
2243 2289 }
2244 2290
2245 2291 .browser-cur-rev {
2246 2292
2247 2293 span{
2248 2294 margin: 0;
2249 2295 color: @rcblue;
2250 2296 height: 12px;
2251 2297 display: inline-block;
2252 2298 padding: 0.7em 1em ;
2253 2299 border: @border-thickness solid @rcblue;
2254 2300 margin-right: @padding;
2255 2301 }
2256 2302 }
2257 2303
2258 2304 }
2259 2305
2260 2306 .select-index-number {
2261 2307 margin: 0 0 0 20px;
2262 2308 color: @grey3;
2263 2309 }
2264 2310
2265 2311 .search_activate {
2266 2312 display: table-cell;
2267 2313 vertical-align: middle;
2268 2314
2269 2315 input, label{
2270 2316 margin: 0;
2271 2317 padding: 0;
2272 2318 }
2273 2319
2274 2320 input{
2275 2321 margin-left: @textmargin;
2276 2322 }
2277 2323
2278 2324 }
2279 2325 }
2280 2326
2281 2327 .browser-cur-rev{
2282 2328 margin-bottom: @textmargin;
2283 2329 }
2284 2330
2285 2331 #node_filter_box_loading{
2286 2332 .info_text;
2287 2333 }
2288 2334
2289 2335 .browser-search {
2290 2336 margin: -25px 0px 5px 0px;
2291 2337 }
2292 2338
2293 2339 .files-quick-filter {
2294 2340 float: right;
2295 2341 width: 180px;
2296 2342 position: relative;
2297 2343 }
2298 2344
2299 2345 .files-filter-box {
2300 2346 display: flex;
2301 2347 padding: 0px;
2302 2348 border-radius: 3px;
2303 2349 margin-bottom: 0;
2304 2350
2305 2351 a {
2306 2352 border: none !important;
2307 2353 }
2308 2354
2309 2355 li {
2310 2356 list-style-type: none
2311 2357 }
2312 2358 }
2313 2359
2314 2360 .files-filter-box-path {
2315 2361 line-height: 33px;
2316 2362 padding: 0;
2317 2363 width: 20px;
2318 2364 position: absolute;
2319 2365 z-index: 11;
2320 2366 left: 5px;
2321 2367 }
2322 2368
2323 2369 .files-filter-box-input {
2324 2370 margin-right: 0;
2325 2371
2326 2372 input {
2327 2373 border: 1px solid @white;
2328 2374 padding-left: 25px;
2329 2375 width: 145px;
2330 2376
2331 2377 &:hover {
2332 2378 border-color: @grey6;
2333 2379 }
2334 2380
2335 2381 &:focus {
2336 2382 border-color: @grey5;
2337 2383 }
2338 2384 }
2339 2385 }
2340 2386
2341 2387 .browser-result{
2342 2388 td a{
2343 2389 margin-left: 0.5em;
2344 2390 display: inline-block;
2345 2391
2346 2392 em {
2347 2393 font-weight: @text-bold-weight;
2348 2394 font-family: @text-bold;
2349 2395 }
2350 2396 }
2351 2397 }
2352 2398
2353 2399 .browser-highlight{
2354 2400 background-color: @grey5-alpha;
2355 2401 }
2356 2402
2357 2403
2358 2404 .edit-file-fieldset #location,
2359 2405 .edit-file-fieldset #filename {
2360 2406 display: flex;
2361 2407 width: -moz-available; /* WebKit-based browsers will ignore this. */
2362 2408 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
2363 2409 width: fill-available;
2364 2410 border: 0;
2365 2411 }
2366 2412
2367 2413 .path-items {
2368 2414 display: flex;
2369 2415 padding: 0;
2370 2416 border: 1px solid #eeeeee;
2371 2417 width: 100%;
2372 2418 float: left;
2373 2419
2374 2420 .breadcrumb-path {
2375 2421 line-height: 30px;
2376 2422 padding: 0 4px;
2377 2423 white-space: nowrap;
2378 2424 }
2379 2425
2380 2426 .location-path {
2381 2427 width: -moz-available; /* WebKit-based browsers will ignore this. */
2382 2428 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
2383 2429 width: fill-available;
2384 2430
2385 2431 .file-name-input {
2386 2432 padding: 0.5em 0;
2387 2433 }
2388 2434
2389 2435 }
2390 2436
2391 2437 ul {
2392 2438 display: flex;
2393 2439 margin: 0;
2394 2440 padding: 0;
2395 2441 width: 100%;
2396 2442 }
2397 2443
2398 2444 li {
2399 2445 list-style-type: none;
2400 2446 }
2401 2447
2402 2448 }
2403 2449
2404 2450 .editor-items {
2405 2451 height: 40px;
2406 2452 margin: 10px 0 -17px 10px;
2407 2453
2408 2454 .editor-action {
2409 2455 cursor: pointer;
2410 2456 }
2411 2457
2412 2458 .editor-action.active {
2413 2459 border-bottom: 2px solid #5C5C5C;
2414 2460 }
2415 2461
2416 2462 li {
2417 2463 list-style-type: none;
2418 2464 }
2419 2465 }
2420 2466
2421 2467 .edit-file-fieldset .message textarea {
2422 2468 border: 1px solid #eeeeee;
2423 2469 }
2424 2470
2425 2471 #files_data .codeblock {
2426 2472 background-color: #F5F5F5;
2427 2473 }
2428 2474
2429 2475 #editor_preview {
2430 2476 background: white;
2431 2477 }
2432 2478
2433 2479 .show-editor {
2434 2480 padding: 10px;
2435 2481 background-color: white;
2436 2482
2437 2483 }
2438 2484
2439 2485 .show-preview {
2440 2486 padding: 10px;
2441 2487 background-color: white;
2442 2488 border-left: 1px solid #eeeeee;
2443 2489 }
2444 2490 // quick filter
2445 2491 .grid-quick-filter {
2446 2492 float: right;
2447 2493 position: relative;
2448 2494 }
2449 2495
2450 2496 .grid-filter-box {
2451 2497 display: flex;
2452 2498 padding: 0px;
2453 2499 border-radius: 3px;
2454 2500 margin-bottom: 0;
2455 2501
2456 2502 a {
2457 2503 border: none !important;
2458 2504 }
2459 2505
2460 2506 li {
2461 2507 list-style-type: none
2462 2508 }
2463 2509 }
2464 2510
2465 2511 .grid-filter-box-icon {
2466 2512 line-height: 33px;
2467 2513 padding: 0;
2468 2514 width: 20px;
2469 2515 position: absolute;
2470 2516 z-index: 11;
2471 2517 left: 5px;
2472 2518 }
2473 2519
2474 2520 .grid-filter-box-input {
2475 2521 margin-right: 0;
2476 2522
2477 2523 input {
2478 2524 border: 1px solid @white;
2479 2525 padding-left: 25px;
2480 2526 width: 145px;
2481 2527
2482 2528 &:hover {
2483 2529 border-color: @grey6;
2484 2530 }
2485 2531
2486 2532 &:focus {
2487 2533 border-color: @grey5;
2488 2534 }
2489 2535 }
2490 2536 }
2491 2537
2492 2538
2493 2539
2494 2540 // Search
2495 2541
2496 2542 .search-form{
2497 2543 #q {
2498 2544 width: @search-form-width;
2499 2545 }
2500 2546 .fields{
2501 2547 margin: 0 0 @space;
2502 2548 }
2503 2549
2504 2550 label{
2505 2551 display: inline-block;
2506 2552 margin-right: @textmargin;
2507 2553 padding-top: 0.25em;
2508 2554 }
2509 2555
2510 2556
2511 2557 .results{
2512 2558 clear: both;
2513 2559 margin: 0 0 @padding;
2514 2560 }
2515 2561
2516 2562 .search-tags {
2517 2563 padding: 5px 0;
2518 2564 }
2519 2565 }
2520 2566
2521 2567 div.search-feedback-items {
2522 2568 display: inline-block;
2523 2569 }
2524 2570
2525 2571 div.search-code-body {
2526 2572 background-color: #ffffff; padding: 5px 0 5px 10px;
2527 2573 pre {
2528 2574 .match { background-color: #faffa6;}
2529 2575 .break { display: block; width: 100%; background-color: #DDE7EF; color: #747474; }
2530 2576 }
2531 2577 }
2532 2578
2533 2579 .expand_commit.search {
2534 2580 .show_more.open {
2535 2581 height: auto;
2536 2582 max-height: none;
2537 2583 }
2538 2584 }
2539 2585
2540 2586 .search-results {
2541 2587
2542 2588 h2 {
2543 2589 margin-bottom: 0;
2544 2590 }
2545 2591 .codeblock {
2546 2592 border: none;
2547 2593 background: transparent;
2548 2594 }
2549 2595
2550 2596 .codeblock-header {
2551 2597 border: none;
2552 2598 background: transparent;
2553 2599 }
2554 2600
2555 2601 .code-body {
2556 2602 border: @border-thickness solid @grey6;
2557 2603 .border-radius(@border-radius);
2558 2604 }
2559 2605
2560 2606 .td-commit {
2561 2607 &:extend(pre);
2562 2608 border-bottom: @border-thickness solid @border-default-color;
2563 2609 }
2564 2610
2565 2611 .message {
2566 2612 height: auto;
2567 2613 max-width: 350px;
2568 2614 white-space: normal;
2569 2615 text-overflow: initial;
2570 2616 overflow: visible;
2571 2617
2572 2618 .match { background-color: #faffa6;}
2573 2619 .break { background-color: #DDE7EF; width: 100%; color: #747474; display: block; }
2574 2620 }
2575 2621
2576 2622 .path {
2577 2623 border-bottom: none !important;
2578 2624 border-left: 1px solid @grey6 !important;
2579 2625 border-right: 1px solid @grey6 !important;
2580 2626 }
2581 2627 }
2582 2628
2583 2629 table.rctable td.td-search-results div {
2584 2630 max-width: 100%;
2585 2631 }
2586 2632
2587 2633 #tip-box, .tip-box{
2588 2634 padding: @menupadding/2;
2589 2635 display: block;
2590 2636 border: @border-thickness solid @border-highlight-color;
2591 2637 .border-radius(@border-radius);
2592 2638 background-color: white;
2593 2639 z-index: 99;
2594 2640 white-space: pre-wrap;
2595 2641 }
2596 2642
2597 2643 #linktt {
2598 2644 width: 79px;
2599 2645 }
2600 2646
2601 2647 #help_kb .modal-content{
2602 2648 max-width: 750px;
2603 2649 margin: 10% auto;
2604 2650
2605 2651 table{
2606 2652 td,th{
2607 2653 border-bottom: none;
2608 2654 line-height: 2.5em;
2609 2655 }
2610 2656 th{
2611 2657 padding-bottom: @textmargin/2;
2612 2658 }
2613 2659 td.keys{
2614 2660 text-align: center;
2615 2661 }
2616 2662 }
2617 2663
2618 2664 .block-left{
2619 2665 width: 45%;
2620 2666 margin-right: 5%;
2621 2667 }
2622 2668 .modal-footer{
2623 2669 clear: both;
2624 2670 }
2625 2671 .key.tag{
2626 2672 padding: 0.5em;
2627 2673 background-color: @rcblue;
2628 2674 color: white;
2629 2675 border-color: @rcblue;
2630 2676 .box-shadow(none);
2631 2677 }
2632 2678 }
2633 2679
2634 2680
2635 2681
2636 2682 //--- IMPORTS FOR REFACTORED STYLES ------------------//
2637 2683
2638 2684 @import 'statistics-graph';
2639 2685 @import 'tables';
2640 2686 @import 'forms';
2641 2687 @import 'diff';
2642 2688 @import 'summary';
2643 2689 @import 'navigation';
2644 2690
2645 2691 //--- SHOW/HIDE SECTIONS --//
2646 2692
2647 2693 .btn-collapse {
2648 2694 float: right;
2649 2695 text-align: right;
2650 2696 font-family: @text-light;
2651 2697 font-size: @basefontsize;
2652 2698 cursor: pointer;
2653 2699 border: none;
2654 2700 color: @rcblue;
2655 2701 }
2656 2702
2657 2703 table.rctable,
2658 2704 table.dataTable {
2659 2705 .btn-collapse {
2660 2706 float: right;
2661 2707 text-align: right;
2662 2708 }
2663 2709 }
2664 2710
2665 2711 table.rctable {
2666 2712 &.permissions {
2667 2713
2668 2714 th.td-owner {
2669 2715 padding: 0;
2670 2716 }
2671 2717
2672 2718 th {
2673 2719 font-weight: normal;
2674 2720 padding: 0 5px;
2675 2721 }
2676 2722
2677 2723 }
2678 2724 }
2679 2725
2680 2726
2681 2727 // TODO: johbo: Fix for IE10, this avoids that we see a border
2682 2728 // and padding around checkboxes and radio boxes. Move to the right place,
2683 2729 // or better: Remove this once we did the form refactoring.
2684 2730 input[type=checkbox],
2685 2731 input[type=radio] {
2686 2732 padding: 0;
2687 2733 border: none;
2688 2734 }
2689 2735
2690 2736 .toggle-ajax-spinner{
2691 2737 height: 16px;
2692 2738 width: 16px;
2693 2739 }
2694 2740
2695 2741
2696 2742 .markup-form .clearfix {
2697 2743 .border-radius(@border-radius);
2698 2744 margin: 0px;
2699 2745 }
2700 2746
2701 2747 .markup-form-area {
2702 2748 padding: 8px 12px;
2703 2749 border: 1px solid @grey4;
2704 2750 .border-radius(@border-radius);
2705 2751 }
2706 2752
2707 2753 .markup-form-area-header .nav-links {
2708 2754 display: flex;
2709 2755 flex-flow: row wrap;
2710 2756 -webkit-flex-flow: row wrap;
2711 2757 width: 100%;
2712 2758 }
2713 2759
2714 2760 .markup-form-area-footer {
2715 2761 display: flex;
2716 2762 }
2717 2763
2718 2764 .markup-form-area-footer .toolbar {
2719 2765
2720 2766 }
2721 2767
2722 2768 // markup Form
2723 2769 div.markup-form {
2724 2770 margin-top: 20px;
2725 2771 }
2726 2772
2727 2773 .markup-form strong {
2728 2774 display: block;
2729 2775 margin-bottom: 15px;
2730 2776 }
2731 2777
2732 2778 .markup-form textarea {
2733 2779 width: 100%;
2734 2780 height: 100px;
2735 2781 font-family: @text-monospace;
2736 2782 }
2737 2783
2738 2784 form.markup-form {
2739 2785 margin-top: 10px;
2740 2786 margin-left: 10px;
2741 2787 }
2742 2788
2743 2789 .markup-form .comment-block-ta,
2744 2790 .markup-form .preview-box {
2745 2791 .border-radius(@border-radius);
2746 2792 .box-sizing(border-box);
2747 2793 background-color: white;
2748 2794 }
2749 2795
2750 2796 .markup-form .preview-box.unloaded {
2751 2797 height: 50px;
2752 2798 text-align: center;
2753 2799 padding: 20px;
2754 2800 background-color: white;
2755 2801 }
2756 2802
2757 2803
2758 2804 .dropzone-wrapper {
2759 2805 border: 1px solid @grey5;
2760 2806 padding: 20px;
2761 2807 }
2762 2808
2763 2809 .dropzone,
2764 2810 .dropzone-pure {
2765 2811 border: 2px dashed @grey5;
2766 2812 border-radius: 5px;
2767 2813 background: white;
2768 2814 min-height: 200px;
2769 2815 padding: 54px;
2770 2816
2771 2817 .dz-message {
2772 2818 font-weight: 700;
2773 2819 text-align: center;
2774 2820 margin: 2em 0;
2775 2821 }
2776 2822
2777 2823 }
2778 2824
2779 2825 .dz-preview {
2780 2826 margin: 10px 0 !important;
2781 2827 position: relative;
2782 2828 vertical-align: top;
2783 2829 padding: 10px;
2784 2830 border-bottom: 1px solid @grey5;
2785 2831 }
2786 2832
2787 2833 .dz-filename {
2788 2834 font-weight: 700;
2789 2835 float:left;
2790 2836 }
2791 2837
2792 2838 .dz-sending {
2793 2839 float: right;
2794 2840 }
2795 2841
2796 2842 .dz-response {
2797 2843 clear:both
2798 2844 }
2799 2845
2800 2846 .dz-filename-size {
2801 2847 float:right
2802 2848 }
2803 2849
2804 2850 .dz-error-message {
2805 2851 color: @alert2;
2806 2852 padding-top: 10px;
2807 2853 clear: both;
2808 2854 }
@@ -1,275 +1,289 b''
1 1 @font-face {
2 2 font-family: 'rcicons';
3 3
4 src: url('../fonts/RCIcons/rcicons.eot?92789106');
5 src: url('../fonts/RCIcons/rcicons.eot?92789106#iefix') format('embedded-opentype'),
6 url('../fonts/RCIcons/rcicons.woff2?92789106') format('woff2'),
7 url('../fonts/RCIcons/rcicons.woff?92789106') format('woff'),
8 url('../fonts/RCIcons/rcicons.ttf?92789106') format('truetype'),
9 url('../fonts/RCIcons/rcicons.svg?92789106#rcicons') format('svg');
4 src: url('../fonts/RCIcons/rcicons.eot?44705679');
5 src: url('../fonts/RCIcons/rcicons.eot?44705679#iefix') format('embedded-opentype'),
6 url('../fonts/RCIcons/rcicons.woff2?44705679') format('woff2'),
7 url('../fonts/RCIcons/rcicons.woff?44705679') format('woff'),
8 url('../fonts/RCIcons/rcicons.ttf?44705679') format('truetype'),
9 url('../fonts/RCIcons/rcicons.svg?44705679#rcicons') format('svg');
10 10
11 11 font-weight: normal;
12 12 font-style: normal;
13 13 }
14 14 /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
15 15 /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
16 16 /*
17 17 @media screen and (-webkit-min-device-pixel-ratio:0) {
18 18 @font-face {
19 19 font-family: 'rcicons';
20 20 src: url('../fonts/RCIcons/rcicons.svg?74666722#rcicons') format('svg');
21 21 }
22 22 }
23 23 */
24 24
25 25 [class^="icon-"]:before, [class*=" icon-"]:before {
26 26 font-family: "rcicons";
27 27 font-style: normal;
28 28 font-weight: normal;
29 29 speak: none;
30 30
31 31 display: inline-block;
32 32 text-decoration: inherit;
33 33 width: 1em;
34 34 margin-right: .2em;
35 35 text-align: center;
36 36 /* opacity: .8; */
37 37
38 38 /* For safety - reset parent styles, that can break glyph codes*/
39 39 font-variant: normal;
40 40 text-transform: none;
41 41
42 42 /* fix buttons height, for twitter bootstrap */
43 43 line-height: 1em;
44 44
45 45 /* Animation center compensation - margins should be symmetric */
46 46 /* remove if not needed */
47 47 margin-left: .2em;
48 48
49 49 /* you can be more comfortable with increased icons size */
50 50 /* font-size: 120%; */
51 51
52 52 /* Font smoothing. That was taken from TWBS */
53 53 -webkit-font-smoothing: antialiased;
54 54 -moz-osx-font-smoothing: grayscale;
55 55
56 56 /* Uncomment for 3D effect */
57 57 /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
58 58 }
59 59
60 60 .animate-spin {
61 61 -moz-animation: spin 2s infinite linear;
62 62 -o-animation: spin 2s infinite linear;
63 63 -webkit-animation: spin 2s infinite linear;
64 64 animation: spin 2s infinite linear;
65 65 display: inline-block;
66 66 }
67 67 @-moz-keyframes spin {
68 68 0% {
69 69 -moz-transform: rotate(0deg);
70 70 -o-transform: rotate(0deg);
71 71 -webkit-transform: rotate(0deg);
72 72 transform: rotate(0deg);
73 73 }
74 74
75 75 100% {
76 76 -moz-transform: rotate(359deg);
77 77 -o-transform: rotate(359deg);
78 78 -webkit-transform: rotate(359deg);
79 79 transform: rotate(359deg);
80 80 }
81 81 }
82 82 @-webkit-keyframes spin {
83 83 0% {
84 84 -moz-transform: rotate(0deg);
85 85 -o-transform: rotate(0deg);
86 86 -webkit-transform: rotate(0deg);
87 87 transform: rotate(0deg);
88 88 }
89 89
90 90 100% {
91 91 -moz-transform: rotate(359deg);
92 92 -o-transform: rotate(359deg);
93 93 -webkit-transform: rotate(359deg);
94 94 transform: rotate(359deg);
95 95 }
96 96 }
97 97 @-o-keyframes spin {
98 98 0% {
99 99 -moz-transform: rotate(0deg);
100 100 -o-transform: rotate(0deg);
101 101 -webkit-transform: rotate(0deg);
102 102 transform: rotate(0deg);
103 103 }
104 104
105 105 100% {
106 106 -moz-transform: rotate(359deg);
107 107 -o-transform: rotate(359deg);
108 108 -webkit-transform: rotate(359deg);
109 109 transform: rotate(359deg);
110 110 }
111 111 }
112 112 @-ms-keyframes spin {
113 113 0% {
114 114 -moz-transform: rotate(0deg);
115 115 -o-transform: rotate(0deg);
116 116 -webkit-transform: rotate(0deg);
117 117 transform: rotate(0deg);
118 118 }
119 119
120 120 100% {
121 121 -moz-transform: rotate(359deg);
122 122 -o-transform: rotate(359deg);
123 123 -webkit-transform: rotate(359deg);
124 124 transform: rotate(359deg);
125 125 }
126 126 }
127 127 @keyframes spin {
128 128 0% {
129 129 -moz-transform: rotate(0deg);
130 130 -o-transform: rotate(0deg);
131 131 -webkit-transform: rotate(0deg);
132 132 transform: rotate(0deg);
133 133 }
134 134
135 135 100% {
136 136 -moz-transform: rotate(359deg);
137 137 -o-transform: rotate(359deg);
138 138 -webkit-transform: rotate(359deg);
139 139 transform: rotate(359deg);
140 140 }
141 141 }
142 142
143 143
144 144
145 145 .icon-no-margin::before {
146 146 margin: 0;
147 147
148 148 }
149 149 // -- ICON CLASSES -- //
150 150 // sorter = lambda s: '\n'.join(sorted(s.splitlines()))
151 151
152 152 .icon-delete:before { content: '\e800'; } /* '' */
153 153 .icon-ok:before { content: '\e801'; } /* '' */
154 154 .icon-comment:before { content: '\e802'; } /* '' */
155 155 .icon-bookmark:before { content: '\e803'; } /* '' */
156 156 .icon-branch:before { content: '\e804'; } /* '' */
157 157 .icon-tag:before { content: '\e805'; } /* '' */
158 158 .icon-lock:before { content: '\e806'; } /* '' */
159 159 .icon-unlock:before { content: '\e807'; } /* '' */
160 160 .icon-feed:before { content: '\e808'; } /* '' */
161 161 .icon-left:before { content: '\e809'; } /* '' */
162 162 .icon-right:before { content: '\e80a'; } /* '' */
163 163 .icon-down:before { content: '\e80b'; } /* '' */
164 164 .icon-folder:before { content: '\e80c'; } /* '' */
165 165 .icon-folder-open:before { content: '\e80d'; } /* '' */
166 .icon-folder-empty:before { content: '\f114'; } /* '' */
167 .icon-folder-open-empty:before { content: '\f115'; } /* '' */
168 166 .icon-trash-empty:before { content: '\e80e'; } /* '' */
169 167 .icon-group:before { content: '\e80f'; } /* '' */
170 168 .icon-remove:before { content: '\e810'; } /* '' */
171 169 .icon-fork:before { content: '\e811'; } /* '' */
172 170 .icon-more:before { content: '\e812'; } /* '' */
173 171 .icon-search:before { content: '\e813'; } /* '' */
174 172 .icon-scissors:before { content: '\e814'; } /* '' */
175 173 .icon-download:before { content: '\e815'; } /* '' */
176 174 .icon-doc:before { content: '\e816'; } /* '' */
177 175 .icon-cog:before { content: '\e817'; } /* '' */
178 176 .icon-cog-alt:before { content: '\e818'; } /* '' */
179 177 .icon-eye:before { content: '\e819'; } /* '' */
180 178 .icon-eye-off:before { content: '\e81a'; } /* '' */
181 179 .icon-cancel-circled2:before { content: '\e81b'; } /* '' */
182 180 .icon-cancel-circled:before { content: '\e81c'; } /* '' */
183 181 .icon-plus:before { content: '\e81d'; } /* '' */
184 182 .icon-plus-circled:before { content: '\e81e'; } /* '' */
185 183 .icon-minus-circled:before { content: '\e81f'; } /* '' */
186 184 .icon-minus:before { content: '\e820'; } /* '' */
187 185 .icon-info-circled:before { content: '\e821'; } /* '' */
188 186 .icon-upload:before { content: '\e822'; } /* '' */
189 187 .icon-home:before { content: '\e823'; } /* '' */
188 .icon-flag-filled:before { content: '\e824'; } /* '' */
190 189 .icon-git:before { content: '\e82a'; } /* '' */
191 190 .icon-hg:before { content: '\e82d'; } /* '' */
192 191 .icon-svn:before { content: '\e82e'; } /* '' */
193 192 .icon-comment-add:before { content: '\e82f'; } /* '' */
194 193 .icon-comment-toggle:before { content: '\e830'; } /* '' */
195 194 .icon-rhodecode:before { content: '\e831'; } /* '' */
196 195 .icon-up:before { content: '\e832'; } /* '' */
197 196 .icon-merge:before { content: '\e833'; } /* '' */
197 .icon-spin-alt:before { content: '\e834'; } /* '' */
198 .icon-spin:before { content: '\e838'; } /* '' */
198 199 .icon-docs:before { content: '\f0c5'; } /* '' */
199 200 .icon-menu:before { content: '\f0c9'; } /* '' */
201 .icon-sort:before { content: '\f0dc'; } /* '' */
200 202 .icon-paste:before { content: '\f0ea'; } /* '' */
201 203 .icon-doc-text:before { content: '\f0f6'; } /* '' */
202 204 .icon-plus-squared:before { content: '\f0fe'; } /* '' */
205 .icon-angle-left:before { content: '\f104'; } /* '' */
206 .icon-angle-right:before { content: '\f105'; } /* '' */
207 .icon-angle-up:before { content: '\f106'; } /* '' */
208 .icon-angle-down:before { content: '\f107'; } /* '' */
209 .icon-circle-empty:before { content: '\f10c'; } /* '' */
210 .icon-circle:before { content: '\f111'; } /* '' */
211 .icon-folder-empty:before { content: '\f114'; } /* '' */
212 .icon-folder-open-empty:before { content: '\f115'; } /* '' */
213 .icon-code:before { content: '\f121'; } /* '' */
214 .icon-info:before { content: '\f129'; } /* '' */
203 215 .icon-minus-squared:before { content: '\f146'; } /* '' */
204 216 .icon-minus-squared-alt:before { content: '\f147'; } /* '' */
205 217 .icon-doc-inv:before { content: '\f15b'; } /* '' */
206 218 .icon-doc-text-inv:before { content: '\f15c'; } /* '' */
207 219 .icon-plus-squared-alt:before { content: '\f196'; } /* '' */
208 220 .icon-file-code:before { content: '\f1c9'; } /* '' */
209 221 .icon-history:before { content: '\f1da'; } /* '' */
222 .icon-circle-thin:before { content: '\f1db'; } /* '' */
210 223 .icon-sliders:before { content: '\f1de'; } /* '' */
211 224 .icon-trash:before { content: '\f1f8'; } /* '' */
212 .icon-spin-alt:before { content: '\e834'; } /* '' */
213 .icon-spin:before { content: '\e838'; } /* '' */
214 225
215 226
216 227 // MERGED ICONS BASED ON CURRENT ONES
217 228 .icon-repo-group:before { &:extend(.icon-folder-open:before); }
218 229 .icon-repo-private:before { &:extend(.icon-lock:before); }
219 230 .icon-repo-lock:before { &:extend(.icon-lock:before); }
220 231 .icon-unlock-alt:before { &:extend(.icon-unlock:before); }
221 232 .icon-repo-unlock:before { &:extend(.icon-unlock:before); }
222 233 .icon-repo-public:before { &:extend(.icon-unlock:before); }
223 234 .icon-rss-sign:before { &:extend(.icon-feed:before); }
224 235 .icon-code-fork:before { &:extend(.icon-fork:before); }
225 236 .icon-arrow_up:before { &:extend(.icon-up:before); }
226 237 .icon-file:before { &:extend(.icon-file-code:before); }
227 238 .icon-file-text:before { &:extend(.icon-file-code:before); }
228 239 .icon-directory:before { &:extend(.icon-folder:before); }
229 240 .icon-more-linked:before { &:extend(.icon-more:before); }
230 241 .icon-clipboard:before { &:extend(.icon-docs:before); }
231 242 .icon-copy:before { &:extend(.icon-docs:before); }
232 243 .icon-true:before { &:extend(.icon-ok:before); }
233 244 .icon-false:before { &:extend(.icon-delete:before); }
234 245 .icon-expand-linked:before { &:extend(.icon-down:before); }
235 246 .icon-pr-merge-fail:before { &:extend(.icon-delete:before); }
247 .icon-wide-mode:before { &:extend(.icon-sort:before); }
248 .icon-flag-filled-red:before { &:extend(.icon-flag-filled:before); }
236 249
237 250 // TRANSFORM
238
239 251 .icon-merge:before {transform: rotate(180deg);}
252 .icon-wide-mode:before {transform: rotate(90deg);}
240 253
241 254 // -- END ICON CLASSES -- //
242 255
243 256
244 257 //--- ICONS STYLING ------------------//
245 258
246 259 .icon-git { color: @color4 !important; }
247 260 .icon-hg { color: @color8 !important; }
248 261 .icon-svn { color: @color1 !important; }
249 262 .icon-git-inv { color: @color4 !important; }
250 263 .icon-hg-inv { color: @color8 !important; }
251 264 .icon-svn-inv { color: @color1 !important; }
252 265 .icon-repo-lock { color: #FF0000; }
253 266 .icon-repo-unlock { color: #FF0000; }
254 267 .icon-false { color: @grey5 }
255 268 .icon-expand-linked { cursor: pointer; color: @grey3; font-size: 14px }
256 269 .icon-more-linked { cursor: pointer; color: @grey3 }
270 .icon-flag-filled-red { color: @color5 !important; }
257 271
258 272 .repo-switcher-dropdown .select2-result-label {
259 273 .icon-git:before {
260 274 &:extend(.icon-git-transparent:before);
261 275 }
262 276 .icon-hg:before {
263 277 &:extend(.icon-hg-transparent:before);
264 278 color: @alert4;
265 279 }
266 280 .icon-svn:before {
267 281 &:extend(.icon-svn-transparent:before);
268 282 }
269 283 }
270 284
271 285 .icon-user-group:before {
272 286 &:extend(.icon-group:before);
273 287 margin: 0;
274 288 font-size: 16px;
275 289 }
@@ -1,240 +1,242 b''
1 1 // select2.less
2 2 // For use in RhodeCode application drop down select boxes;
3 3 // see style guide documentation for guidelines.
4 4
5 5
6 6 // SELECT2 DROPDOWN MENUS
7 7
8 8 //Select2 Dropdown
9 9 .select2-results{
10 10 .box-sizing(border-box);
11 11 overflow-y: scroll;
12 12 }
13 13
14 14 .select2-container{margin: 0; position: relative; display: inline-block; zoom: 1;}
15 15 .select2-container,
16 16 .select2-drop,
17 17 .select2-search,
18 18 .select2-search input {.box-sizing(border-box);}
19 19 .select2-container .select2-choice{display:block; line-height:1em; -webkit-touch-callout:none;-moz-user-select:none;-ms-user-select:none;user-select:none; }
20 20 .main .select2-container .select2-choice { background-color: white; box-shadow: @button-shadow;}
21 21 .select2-container .select2-choice abbr { display: none; width: 12px; height: 12px; position: absolute; right: 24px; top: 8px; font-size: 1px; text-decoration: none; border: 0; background: url('../images/select2.png') right top no-repeat; cursor: pointer; outline: 0; }
22 22 .select2-container.select2-allowclear .select2-choice abbr {display: inline-block;}
23 23 .select2-container .select2-choice abbr:hover { background-position: right -11px; cursor: pointer; }
24 24 .select2-drop-mask { border: 0; margin: 0; padding: 0; position: fixed; left: 0; top: 0; min-height: 100%; min-width: 100%; height: auto; width: auto; opacity: 0; z-index: 998; background-color: #fff; filter: alpha(opacity=0); }
25 25 .select2-drop { width: 100%; margin-top: -1px; position: absolute; z-index: 999; top: 100%; background: #fff; color: #000; border: @border-thickness solid @rcblue; border-top: 0; border-radius: 0 0 @border-radius @border-radius; }
26 26 .select2-drop.select2-drop-above { margin-top: 1px; border-top: @border-thickness solid @rclightblue; border-bottom: 0; border-radius: @border-radius @border-radius 0 0; }
27 27 .select2-drop-active { border: @border-thickness solid #5897fb; border-top: none; }
28 28 .select2-drop.select2-drop-above.select2-drop-active {border-top: @border-thickness solid #5897fb;}
29 29 .select2-drop-auto-width { border-top: @border-thickness solid #aaa; width: auto; }
30 30 .select2-drop-auto-width .select2-search {padding-top: 4px;}
31 31 html[dir="rtl"] .select2-container .select2-choice .select2-arrow { left: 0; right: auto; border-left: none; border-right: @border-thickness solid @grey5; border-radius: @border-radius 0 0 @border-radius; }
32 32 html[dir="rtl"] .select2-container .select2-choice .select2-arrow b {background-position: 2px 1px;}
33 33 .select2-search { display: inline-block; width: 100%; min-height: 26px; margin: 0; padding-left: 4px; padding-right: 4px; position: relative; z-index: 1000; white-space: nowrap; }
34 34 .select2-search input { width: 100%; height: auto !important; min-height: 26px; padding: 4px 20px 4px 5px; margin: 0; outline: 0; }
35 35 html[dir="rtl"] .select2-search input { padding: 4px 5px 4px 20px; background: #fff url('../images/select2.png') no-repeat -37px -22px; }
36 36 .select2-drop.select2-drop-above .select2-search input {margin-top: 4px;}
37 37 .select2-dropdown-open .select2-choice .select2-arrow { background: transparent; border-left: none; filter: none; }
38 38 html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow {border-right: none;}
39 39 .select2-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
40 40 /* results */
41 41 .select2-results { max-height: 200px; padding: 0 0 0 4px; margin: 4px 4px 4px 0; position: relative; overflow-x: hidden; overflow-y: auto; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }
42 42 html[dir="rtl"] .select2-results { padding: 0 4px 0 0; margin: 4px 0 4px 4px; }
43 43 .select2-results .select2-disabled{background:@grey6;display:list-item;cursor:default}
44 44 .select2-results .select2-selected{display:none}
45 45 .select2-more-results.select2-active{background:#f4f4f4 url('../images/select2-spinner.gif') no-repeat 100%}
46 46 .select2-container.select2-container-disabled .select2-choice abbr{display:none}
47 47 .select2-container.select2-container-disabled {background:@grey6;cursor:default}
48 48 .select2-container.select2-container-disabled .select2-choice {background:@grey6;cursor:default}
49 49 .select2-container-multi .select2-choices li{float:left;list-style:none}
50 50 .select2-container-multi .select2-choices .select2-search-field{margin:0;padding:0;white-space:nowrap}
51 51 .select2-container-multi .select2-choices .select2-search-choice .select2-chosen{cursor:default}
52 52 .select2-search-choice-close{display:block;width:12px;height:13px;position:absolute;right:3px;top:4px;font-size:1px;outline:none;background:url('../images/select2.png') right top no-repeat}
53 53 .select2-container-multi .select2-search-choice-close{left:3px}
54 54 .select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover{background-position:right -11px}
55 55 .select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close{background-position:right -11px}
56 56 .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close{display:none;background:none}
57 57 .select2-offscreen,.select2-offscreen:focus{clip:rect(0 0 0 0) !important;width:1px !important;height:1px !important;
58 58 border:0 !important;margin:0 !important;padding:0 !important;overflow:hidden !important;
59 59 position: absolute !important;outline:0 !important;left:0 !important;top:0 !important}
60 60 .select2-display-none,
61 61 .select2-search-hidden {display:none}
62 62 .select2-search input { border-color: @rclightblue; }
63 63
64 64 .select2-measure-scrollbar{position:absolute;top:-10000px;left:-10000px;width:100px;height:100px;overflow:scroll}
65 65 @media only screen and (-webkit-min-device-pixel-ratio:1.5),
66 66 only screen and (min-resolution:144dpi){
67 67 .select2-search input,
68 68 .select2-search-choice-close,
69 69 .select2-container .select2-choice abbr,
70 70 .select2-container .select2-choice .select2-arrow b{background-image:url('../images/select2x2.png');background-repeat:no-repeat;background-size:60px 40px;}
71 71 .select2-search input{background-position:100% -21px}
72 72 }
73 73 [class^="input-"] [class^="select2-choice"]>div{display:none}
74 74 [class^="input-"] .select2-offscreen{position:absolute}
75 75 select.select2{height:28px;visibility:hidden}
76 76 .autocomplete-suggestions{overflow:auto}
77 77 .autocomplete-suggestion{white-space:nowrap;overflow:hidden}
78 78
79 79 /* Retina-ize icons */
80 80 @media only screen and (-webkit-min-device-pixel-ratio:1.5),
81 81 only screen and (min-resolution:144dpi){
82 82 .select2-search input,
83 83 .select2-search-choice-close,
84 84 .select2-container .select2-choice abbr,
85 85 .select2-container .select2-choice .select2-arrow b{background-image:url('../images/select2x2.png');background-repeat:no-repeat;background-size:60px 40px;}
86 86 .select2-search input{background-position:100% -21px}
87 87 }
88 88
89 89 //Internal Select2 Dropdown Menus
90 90
91 91 .drop-menu-core {
92 92 min-width: 160px;
93 93 margin: 0 @padding 0 0;
94 94 padding: 0;
95 95 border: @border-thickness solid @grey5;
96 96 border-radius: @border-radius;
97 97 color: @grey2;
98 98 background-color: white;
99 99
100 100 a {
101 101 color: @grey2;
102 102
103 103 &:hover {
104 104 color: @rcdarkblue;
105 105 }
106 106 }
107 107 }
108 108
109 109 .drop-menu-dropdown {
110 110 .drop-menu-core;
111 111
112 112 .flag_status {
113 113 margin-top: 0;
114 114 }
115 115 }
116 116
117 117 .drop-menu-base {
118 118 .drop-menu-core;
119 119 position: relative;
120 120 display: inline-block;
121 121 line-height: 1em;
122 122 z-index: 2;
123 123 cursor: pointer;
124 124
125 125 .flag_status {
126 126 margin-top: 0;
127 127 }
128 128
129 129 a {
130 130 display:block;
131 131 padding: .7em;
132 132 padding-right: 2em;
133 133 position: relative;
134 134
135 135 &:after {
136 136 position: absolute;
137 137 content: "\00A0\25BE";
138 138 right: .1em;
139 139 line-height: 1em;
140 140 top: 0.2em;
141 141 width: 1em;
142 142 font-size: 20px;
143 143 }
144 144 }
145 145 }
146 146
147 147 .drop-menu {
148 148 .drop-menu-base;
149 149 width: auto !important;
150 150 }
151 151
152 152 .drop-menu-no-width {
153 153 .drop-menu-base;
154 154 width: auto;
155 min-width: 0;
156 margin: 0;
155 157 }
156 158
157 159 .field-sm .drop-menu {
158 160 padding: 1px 0 0 0;
159 161 a {
160 162 padding: 6px;
161 163 };
162 164 }
163 165
164 166 .select2-search input {
165 167 width: 100%;
166 168 margin: .5em 0;
167 169 padding: .5em;
168 170 border-color: @grey4;
169 171
170 172 &:focus, &:hover {
171 173 border-color: @rcblue;
172 174 box-shadow: @button-shadow;
173 175 }
174 176 }
175 177
176 178 .select2-no-results {
177 179 padding: .5em;
178 180 }
179 181
180 182 .drop-menu-dropdown ul {
181 183 width: auto;
182 184 margin: 0;
183 185 padding: 0;
184 186 z-index: 50;
185 187
186 188 li {
187 189 margin: 0;
188 190 line-height: 1em;
189 191 list-style-type: none;
190 192
191 193 &:hover,
192 194 &.select2-highlighted {
193 195 background-color: @grey7;
194 196
195 197 .select2-result-label {
196 198 &:hover {
197 199 color: @grey1!important;
198 200 }
199 201 }
200 202 }
201 203
202 204 &.select2-result-with-children {
203 205 &:hover {
204 206 background-color: white;
205 207 }
206 208 }
207 209
208 210 .select2-result-label {
209 211 display:block;
210 212 padding: 8px;
211 213 font-family: @text-regular;
212 214 color: @grey2;
213 215 cursor: pointer;
214 216 }
215 217 &.select2-result-with-children {
216 218
217 219 .select2-result-label {
218 220 color: @rcdarkblue;
219 221 cursor: default;
220 222 font-weight: @text-semibold-weight;
221 223 font-family: @text-semibold;
222 224 }
223 225
224 226 ul.select2-result-sub li .select2-result-label {
225 227 padding-left: 16px;
226 228 font-family: @text-regular;
227 229 color: @grey2;
228 230 cursor: pointer;
229 231 }
230 232 }
231 233 }
232 234 }
233 235
234 236 .side-by-side-selector {
235 237 .left-group,
236 238 .middle-group,
237 239 .right-group {
238 240 margin-bottom: @padding;
239 241 }
240 242 }
@@ -1,492 +1,497 b''
1 1 // summary.less
2 2 // For use in RhodeCode applications;
3 3 // Used for headers and file detail summary screens.
4 4
5 5 .summary {
6 6 clear: both;
7 7 float: none;
8 8 position: relative;
9 9 width: 100%;
10 10 margin: 0;
11 11 padding: 0;
12 12 background: #FCFCFC;
13 13 border: 1px solid #EAEAEA;
14 14 border-radius: @border-radius;
15 15 margin-bottom: 20px;
16 16
17 17 .summary-detail-header {
18 18 display: block;
19 19 width: 100%;
20 20 margin-bottom: 10px;
21 21 padding: 0 0 .5em 0;
22 22 border-bottom: @border-thickness solid @border-default-color;
23 23
24 24 .breadcrumbs {
25 25 display: inline;
26 26 margin: 0;
27 27 padding: 0;
28 28 }
29 29
30 30 h4 {
31 31 margin: 0 1em 0 0;
32 32 padding: 10px 0 5px 20px;
33 33 line-height: 1.2em;
34 34 font-size: @basefontsize;
35 35 }
36 36
37 37 .action_link {
38 38 float: right;
39 39 }
40 40
41 41 .new-file {
42 42 float: right;
43 43 margin-top: -1.5em;
44 44 }
45 45 }
46 46
47 47 .summary-detail {
48 48 float: none;
49 49 position: relative;
50 50 width: 100%;
51 51 margin: 0;
52 52 padding: 0 0 20px 0;
53 53
54 54 .file_diff_buttons {
55 55 margin-top: @space;
56 56 }
57 57
58 58 // commit message
59 59 .commit {
60 60 white-space: pre-wrap;
61 61 }
62 62
63 63 .left-clone {
64 64 float: left;
65 65 height: 30px;
66 66 margin: 0;
67 67 padding: 0;
68 68 width: 130px;
69 69 font-weight: @text-semibold-weight;
70 70 font-family: @text-semibold;
71 71 }
72 72 .left-clone select {
73 73 width: 130px;
74 74 margin-right: 0;
75 75 background-color: @grey7;
76 76 border-color: @grey4;
77 77 color: #5C5C5C;
78 78 border-top-right-radius: 0;
79 79 border-bottom-right-radius: 0;
80 80 }
81 81
82 82 .right-clone {
83 83 float: left;
84 84 width: ~"calc(100% - 170px)";
85 85
86 86 .clipboard-action {
87 87 margin-left: -30px;
88 88 }
89 89 }
90 90
91 91 .clone_url_input {
92 92 width: ~"calc(100% - 90px)";
93 93 padding: 6px 30px 6px 10px;
94 94 height: 14px;
95 95 box-shadow: 0 1px 1px 0 rgba(0,0,0,0.07);
96 96 border-top-left-radius: 0;
97 97 border-bottom-left-radius: 0;
98 98 margin-left: -1px;
99 99 }
100 100
101 101 &.directory {
102 102 margin-bottom: 0;
103 103 }
104 104
105 105 .desc {
106 106 white-space: pre-wrap;
107 107 }
108 108 .disabled {
109 109 opacity: .5;
110 110 cursor: inherit;
111 111 }
112 112 .help-block {
113 113 color: inherit;
114 114 margin: 0;
115 115 }
116 116 }
117 117
118 118 .sidebar-right {
119 119 float: left;
120 120 width: 24%;
121 121 margin: 0;
122 122 padding: 0;
123 123
124 124 ul {
125 125 margin-left: 0;
126 126 padding-left: 0;
127 127
128 128 li {
129 129 list-style-type: none;
130 130 }
131 131 }
132 132 }
133 133
134 134 #clone_by_name, #clone_by_id{
135 135 display: inline-block;
136 136 margin-left: 0px;
137 137 }
138 138
139 139 .codeblock {
140 140 border: none;
141 141 background-color: transparent;
142 142 }
143 143
144 144 .code-body {
145 145 border: @border-thickness solid @border-default-color;
146 146 .border-radius(@border-radius);
147 147 }
148 148
149 149 .btn-collapse {
150 150 clear: both;
151 151 float: none;
152 152 background: #F7F7F7;
153 153 text-align: center;
154 154 color: #949494;
155 155 font-size: 11px;
156 line-height: 1.3em;
156 157
157 158 &:hover {
158 159 background: #f1f1f1;
159 160 color: #2B2B2D;
160 161 }
161 162 }
162 163 }
163 164
164 165 // this is used outside of just the summary
165 166 .fieldset, // similar to form fieldset
166 167 .summary .sidebar-right-content { // these have to match
167 168 clear: both;
168 169 float: none;
169 170 position: relative;
170 171 display:block;
171 172 width: 100%;
172 173 min-height: 20px;
173 174 margin-bottom: 10px;
174 175 padding: 0;
175 176 line-height: 1.2em;
176 177
177 178 &:after { // clearfix
178 179 content: "";
179 180 clear: both;
180 181 width: 100%;
181 182 height: 1em;
182 183 }
183 184 }
184 185
185 186 .summary .sidebar-right-content {
186 187 margin-bottom: 0;
187 188
188 189 .rc-user {
189 190 min-width: 0;
190 191 }
191 192
192 193 li {
193 194 list-style: none;
194 195 line-height: normal;
195 196 }
196 197 }
197 198
198 199 .summary {
199 200 .fieldset {
200 201 margin-bottom: 0;
201 202 }
203
204 .tags-main {
205 margin-bottom: 5px;
206 }
202 207 }
203 208
204 209 .fieldset {
205 210
206 211 .left-label { // similar to form legend
207 212 display: block;
208 213 margin: 0;
209 214 padding: 0;
210 215 font-weight: @text-semibold-weight;
211 216 font-family: @text-semibold;
212 217 }
213 218
214 219 .left-label-summary {
215 220 padding-left: 20px;
216 221 margin-bottom: 5px;
217 222
218 223 p {
219 224 margin-bottom: 5px;
220 225 color: @grey1;
221 226 float: left;
222 227 width: 130px;
223 228
224 229 &.spacing {
225 230 margin-top: 10px;
226 231 }
227 232 }
228 233
229 234 .right-label-summary {
230 235 float: left;
231 236 margin-top: 7px;
232 237 width: ~"calc(100% - 160px)";
233 238 }
234 239 }
235 240
236 241 .left-label-summary-files {
237 242 padding-left: 45px;
238 243 margin-top: 5px;
239 244
240 245 p {
241 246 margin-bottom: 5px;
242 247 color: @grey1;
243 248 float: left;
244 249 width: 130px;
245 250
246 251 &.spacing {
247 252 margin-top: 10px;
248 253 }
249 254 }
250 255
251 256 .right-label-summary {
252 257 float: left;
253 258 margin-top: 7px;
254 259 }
255 260 }
256 261
257 262 .left-content {
258 263 width: ~"calc(60% - 20px)";
259 264 float: left;
260 265 margin: 15px 0 15px 20px;
261 266
262 267 .rc-user {
263 268 min-width: auto;
264 269 max-width: none;
265 270 min-height: auto;
266 271 padding-right: 5px;
267 272 }
268 273
269 274 .left-content-avatar {
270 275 width: 45px;
271 276 float: left;
272 277 margin-top: 8px;
273 278 }
274 279
275 280 .left-content-message {
276 281 float: left;
277 282 width: ~"calc(100% - 45px)";
278 283 }
279 284 }
280 285
281 286 .right-content { // similar to form fields
282 287 float: left;
283 288 display: block;
284 289 width: ~"calc(40% - 20px)";
285 290 text-align: right;
286 291 margin: 15px 20px 15px 0;
287 292
288 293 .truncate-wrap,
289 294 .truncate {
290 295 max-width: 100%;
291 296 width: 100%;
292 297 }
293 298
294 299 .commit-long {
295 300 overflow-x: auto;
296 301 }
297 302
298 303 .commit-info {
299 304 margin-top: 7px;
300 305 }
301 306
302 307 .summary-tag,
303 308 .summary-tagtag,
304 309 .summary-branchtag,
305 310 .summary-booktag,
306 311 .summary-metatag,
307 312 .summary-perm_tag {
308 313 background:transparent;
309 314 border: none;
310 315 box-shadow: none;
311 316 margin-left: 10px;
312 317 font-size: 13px;
313 318 }
314 319
315 320 .summary-tag span,
316 321 .summary-tag i,
317 322 .summary-tag a {
318 323 color: @grey1;
319 324 }
320 325
321 326 }
322 327 .commit {
323 328 color: @grey1;
324 329 margin-bottom: 5px;
325 330 white-space: pre;
326 331 }
327 332 .commit.truncate-wrap {
328 333 overflow:hidden;
329 334 text-overflow: ellipsis;
330 335 }
331 336 .commit-author {
332 337 color: @grey1;
333 338 }
334 339 .commit-date {
335 340 color: @grey4;
336 341 }
337 342 .fieldset-text-line {
338 343 line-height: 36px;
339 344 }
340 345 }
341 346
342 347 // expand commit message
343 348 #message_expand {
344 349 clear: both;
345 350 display: block;
346 351 color: @rcblue;
347 352 cursor: pointer;
348 353 }
349 354
350 355 #trimmed_message_box {
351 356 max-height: floor(2 * @basefontsize * 1.2); // 2 lines * line-height
352 357 overflow: hidden;
353 358 }
354 359
355 360 // show/hide comments button
356 361 .show-inline-comments {
357 362 display: inline;
358 363 cursor: pointer;
359 364
360 365 .comments-show { display: inline; }
361 366 .comments-hide { display: none; }
362 367
363 368 &.comments-visible {
364 369 .comments-show { display: none; }
365 370 .comments-hide { display: inline; }
366 371 }
367 372 }
368 373
369 374 // Quick Start section
370 375
371 376 .empty-repo {
372 377 border: 1px solid #EAEAEA;
373 378 border-bottom: 0;
374 379 border-radius: @border-radius;
375 380 padding: 0 20px;
376 381 }
377 382
378 383 .empty-repo h3, .quick_start p {
379 384 margin-bottom: 10px;
380 385 }
381 386
382 387 .quick_start pre {
383 388 background: #FCFEFF;
384 389 border: 1px solid #CBDBEB;
385 390 box-shadow: @button-shadow;
386 391 padding: 10px 15px;
387 392 border-radius: 4px;
388 393 color: @grey2;
389 394 }
390 395
391 396 .clear-fix {
392 397 clear: both;
393 398 }
394 399
395 400 .quick_start {
396 401 display: block;
397 402 position: relative;
398 403 border: 1px solid #EAEAEA;
399 404 border-top: 0;
400 405 border-radius: @border-radius;
401 406 padding: 0 20px;
402 407
403 408 // adds some space to make copy and paste easier
404 409 .left-label,
405 410 .right-content {
406 411 line-height: 1.6em;
407 412 }
408 413 }
409 414
410 415
411 416 .submodule {
412 417 .summary-detail {
413 418 width: 100%;
414 419
415 420 .btn-collapse {
416 421 display: none;
417 422 }
418 423 }
419 424 }
420 425
421 426 .codeblock-header {
422 427 float: left;
423 428 display: block;
424 429 width: 100%;
425 430 margin: 0;
426 431
427 432 .file-filename {
428 433 float:left;
429 434 padding: 10px;
430 435 }
431 436
432 437 .file-stats {
433 438 padding: 10px;
434 439 float:right;
435 440 }
436 441
437 442
438 443 .stats-first-item {
439 444 padding: 0px 0px 0px 3px;
440 445 }
441 446
442 447 .stats-info {
443 448 font-size: 11px;
444 449 color: @grey4;
445 450 }
446 451
447 452 .buttons {
448 453 float: right;
449 454 text-align: right;
450 455 color: @grey4;
451 456 padding: 10px;
452 457 }
453 458
454 459 .file-container {
455 460 display: inline-block;
456 461 width: 100%;
457 462 }
458 463
459 464 }
460 465
461 466 #summary-menu-stats {
462 467
463 468 .stats-bullet {
464 469 color: @grey3;
465 470 min-width: 3em;
466 471 }
467 472
468 473 .repo-size {
469 474 margin-bottom: .5em;
470 475 }
471 476
472 477 }
473 478
474 479 .rctable.repo_summary {
475 480 border: 1px solid #eaeaea;
476 481 border-radius: 2px;
477 482 border-collapse: inherit;
478 483 border-bottom: 0;
479 484
480 485 th {
481 486 background: @grey7;
482 487 border-bottom: 0;
483 488 }
484 489
485 490 td {
486 491 border-color: #eaeaea;
487 492 }
488 493
489 494 td.td-status {
490 495 padding: 0 0 0 10px;
491 496 }
492 497 }
@@ -1,623 +1,689 b''
1 1 {
2 2 "name": "rcicons",
3 3 "css_prefix_text": "icon-",
4 4 "css_use_suffix": false,
5 5 "hinting": true,
6 6 "units_per_em": 1000,
7 7 "ascent": 850,
8 8 "copyright": "RhodeCode GmbH",
9 9 "glyphs": [
10 10 {
11 11 "uid": "a5f9b6d4d795603e6e29a5b8007cc139",
12 12 "css": "bookmark",
13 13 "code": 59395,
14 14 "src": "custom_icons",
15 15 "selected": true,
16 16 "svg": {
17 17 "path": "M780 990L520 700C510 690 495 690 485 700L225 995C205 1015 180 1000 180 965V35C175 15 190 0 205 0H795C810 0 825 15 825 35V960C825 995 795 1010 780 990Z",
18 18 "width": 1000
19 19 },
20 20 "search": [
21 21 "bookmark"
22 22 ]
23 23 },
24 24 {
25 25 "uid": "fbc028d3a6a0df72f8f508ff5dfbab72",
26 26 "css": "tag",
27 27 "code": 59397,
28 28 "src": "custom_icons",
29 29 "selected": true,
30 30 "svg": {
31 31 "path": "M459.8 62.5L93.8 53.6C75.9 53.6 62.5 67 62.5 84.8L75.9 450.9C75.9 459.8 80.4 464.3 84.8 473.2L549.1 937.5C562.5 950.9 580.4 950.9 593.8 937.5L946.4 584.8C959.8 571.4 959.8 553.6 946.4 540.2L477.7 71.4C473.2 67 464.3 62.5 459.8 62.5ZM357.1 285.7C357.1 321.4 325.9 352.7 290.2 352.7 254.5 352.7 223.2 321.4 223.2 285.7 223.2 250 254.5 218.8 290.2 218.8S357.1 245.5 357.1 285.7Z",
32 32 "width": 1000
33 33 },
34 34 "search": [
35 35 "tag"
36 36 ]
37 37 },
38 38 {
39 39 "uid": "1c67c02366438b324c184ff9e356dca1",
40 40 "css": "branch",
41 41 "code": 59396,
42 42 "src": "custom_icons",
43 43 "selected": true,
44 44 "svg": {
45 45 "path": "M875 250C875 174.1 817 116.1 741.1 116.1S607.1 174.1 607.1 250C607.1 299.1 633.9 339.3 669.6 361.6 651.8 504.5 531.3 544.6 459.8 558V245.5C504.5 223.2 531.3 183 531.3 133.9 531.3 58 473.2 0 397.3 0S263.4 58 263.4 133.9C263.4 183 290.2 227.7 330.4 250V750C290.2 772.3 263.4 817 263.4 866.1 263.4 942 321.4 1000 397.3 1000S531.3 942 531.3 866.1C531.3 817 504.5 772.3 464.3 750V692C526.8 683 629.5 660.7 709.8 580.4 767.9 522.3 799.1 450.9 808 366.1 848.2 343.8 875 299.1 875 250ZM397.3 89.3C424.1 89.3 442 107.1 442 133.9S424.1 178.6 397.3 178.6 352.7 160.7 352.7 133.9 370.5 89.3 397.3 89.3ZM397.3 910.7C370.5 910.7 352.7 892.9 352.7 866.1S370.5 821.4 397.3 821.4 442 839.3 442 866.1 419.6 910.7 397.3 910.7ZM741.1 205.4C767.9 205.4 785.7 223.2 785.7 250S767.9 294.6 741.1 294.6 696.4 276.8 696.4 250 718.8 205.4 741.1 205.4Z",
46 46 "width": 1000
47 47 },
48 48 "search": [
49 49 "branch"
50 50 ]
51 51 },
52 52 {
53 53 "uid": "b75f7b47706aebd803ef370082e8e334",
54 54 "css": "group",
55 55 "code": 59407,
56 56 "src": "custom_icons",
57 57 "selected": true,
58 58 "svg": {
59 59 "path": "M961.5 630.8V646.2C961.5 650 957.7 657.7 950 657.7H788.5 784.6C769.2 638.5 746.2 619.2 707.7 615.4 673.1 607.7 653.8 600 638.5 592.3 646.2 584.6 657.7 580.8 669.2 576.9 715.4 569.2 726.9 553.8 734.6 542.3 742.3 530.8 742.3 519.2 734.6 503.8 726.9 488.5 703.8 461.5 703.8 423.1 703.8 384.6 703.8 319.2 776.9 319.2H784.6 792.3C865.4 323.1 869.2 384.6 865.4 423.1 865.4 461.5 842.3 492.3 834.6 503.8 826.9 519.2 826.9 530.8 834.6 542.3 842.3 553.8 857.7 569.2 900 576.9 953.8 580.8 961.5 623.1 961.5 630.8 961.5 630.8 961.5 630.8 961.5 630.8ZM253.8 646.2C269.2 630.8 292.3 615.4 323.1 611.5 361.5 603.8 384.6 596.2 396.2 584.6 388.5 576.9 376.9 569.2 361.5 565.4 315.4 557.7 303.8 542.3 296.2 530.8 288.5 519.2 288.5 507.7 296.2 492.3 303.8 476.9 326.9 450 326.9 411.5 326.9 373.1 326.9 307.7 253.8 307.7H246.2 234.6C161.5 311.5 157.7 373.1 161.5 411.5 161.5 450 184.6 480.8 192.3 492.3 200 507.7 200 519.2 192.3 530.8 184.6 542.3 169.2 557.7 126.9 565.4 80.8 573.1 73.1 615.4 73.1 619.2 73.1 619.2 73.1 619.2 73.1 619.2V634.6C73.1 638.5 76.9 646.2 84.6 646.2H246.2 253.8ZM707.7 634.6C634.6 623.1 611.5 600 600 580.8 588.5 561.5 588.5 542.3 600 519.2 611.5 496.2 650 450 653.8 388.5 657.7 326.9 653.8 223.1 534.6 219.2H519.2 503.8C384.6 223.1 380.8 323.1 384.6 384.6 388.5 446.2 423.1 492.3 438.5 515.4 450 538.5 450 557.7 438.5 576.9 426.9 596.2 403.8 619.2 330.8 630.8 257.7 642.3 246.2 711.5 246.2 719.2 246.2 719.2 246.2 719.2 246.2 719.2V742.3C246.2 750 253.8 757.7 261.5 757.7H519.2 776.9C784.6 757.7 792.3 750 792.3 742.3V719.2C792.3 719.2 792.3 719.2 792.3 719.2 788.5 715.4 780.8 646.2 707.7 634.6Z",
60 60 "width": 1000
61 61 },
62 62 "search": [
63 63 "group"
64 64 ]
65 65 },
66 66 {
67 67 "uid": "7ae0ef039bb0217d9581e44b09448905",
68 68 "css": "fork",
69 69 "code": 59409,
70 70 "src": "custom_icons",
71 71 "selected": true,
72 72 "svg": {
73 73 "path": "M792.3 196.2C792.3 138.5 746.2 96.2 692.3 96.2 634.6 96.2 592.3 142.3 592.3 196.2 592.3 230.8 611.5 261.5 638.5 280.8 626.9 365.4 569.2 403.8 511.5 423.1 453.8 407.7 396.2 369.2 384.6 280.8 411.5 261.5 430.8 230.8 430.8 196.2 430.8 138.5 384.6 96.2 330.8 96.2S223.1 138.5 223.1 196.2C223.1 234.6 246.2 269.2 276.9 284.6 288.5 392.3 353.8 473.1 457.7 511.5V673.1C426.9 692.3 407.7 723.1 407.7 761.5 407.7 819.2 453.8 861.5 507.7 861.5S607.7 815.4 607.7 761.5C607.7 723.1 588.5 692.3 557.7 673.1V511.5C661.5 473.1 726.9 392.3 738.5 284.6 769.2 265.4 792.3 234.6 792.3 196.2ZM326.9 161.5C346.2 161.5 361.5 176.9 361.5 196.2S346.2 226.9 326.9 226.9 292.3 215.4 292.3 196.2 307.7 161.5 326.9 161.5ZM507.7 796.2C488.5 796.2 473.1 780.8 473.1 761.5S488.5 726.9 507.7 726.9C526.9 726.9 542.3 742.3 542.3 761.5S526.9 796.2 507.7 796.2ZM692.3 161.5C711.5 161.5 726.9 176.9 726.9 196.2S711.5 226.9 692.3 226.9 657.7 211.5 657.7 192.3 673.1 161.5 692.3 161.5Z",
74 74 "width": 1000
75 75 },
76 76 "search": [
77 77 "fork"
78 78 ]
79 79 },
80 80 {
81 81 "uid": "65e66c3e7d74e2c345fb78fadd400d3f",
82 82 "css": "rhodecode",
83 83 "code": 59441,
84 84 "src": "custom_icons",
85 85 "selected": true,
86 86 "svg": {
87 87 "path": "M174.6 216.8C173.4 220.9 172.2 225 171 229.1 168.1 239.1 165.2 249.1 162.3 259.1 158.7 271.6 155 284.2 151.4 296.7 148 308.4 144.6 320.1 141.2 331.8 139 339.3 136.8 346.8 134.7 354.3 134.4 355.4 134.1 356.5 133.7 357.6 133.7 357.7 133.9 358.2 134 358.3 134.3 359 134.5 359.7 134.8 360.5 137.2 367.3 139.7 374.1 142.1 381 146 392 149.9 403 153.9 414.1 158.3 426.5 162.8 439 167.2 451.4 171.1 462.5 175.1 473.6 179 484.7 181.5 491.7 184 498.6 186.4 505.6 186.8 506.7 187.2 507.7 187.5 508.8 187.8 509.6 188.6 510.4 189 511.1 192.8 516.9 196.5 522.6 200.3 528.4 206.5 537.9 212.7 547.4 219 556.9 226.2 567.9 233.4 578.9 240.6 590 247.3 600.3 254.1 610.6 260.8 620.9 265.6 628.2 270.4 635.6 275.2 642.9 276.4 644.8 277.6 646.6 278.9 648.5 279.2 649 279.5 649.5 279.8 649.8 282.7 652.6 285.5 655.4 288.4 658.2 294.6 664.3 300.9 670.5 307.1 676.6 315.5 684.9 323.9 693.2 332.4 701.4 341.8 710.6 351.2 719.9 360.6 729.1 369.8 738.1 378.9 747.1 388.1 756.1 395.8 763.7 403.6 771.3 411.3 778.9 416.4 783.9 421.5 788.9 426.6 793.9 428.2 795.5 429.8 797.3 431.6 798.6 438.9 803.9 446.1 809.2 453.4 814.5 463.7 822 473.9 829.5 484.2 837 487.6 839.5 491.1 842 494.5 844.5 495.3 845.1 496.1 845.7 496.9 846.3 497.2 846.5 497.2 846.6 497.6 846.4 504.7 842.7 511.8 839.1 518.9 835.4 530.3 829.5 541.7 823.6 553.1 817.7 559.2 814.5 565.4 811.4 571.5 808.2 571.9 808 572.3 807.1 572.6 806.8 573.7 805.4 574.8 804 576 802.5 580.2 797.2 584.3 791.9 588.5 786.7 594.7 778.9 600.8 771.1 607 763.3 614.5 753.8 622 744.3 629.5 734.8 637.7 724.5 645.8 714.1 654 703.8 662.1 693.5 670.3 683.2 678.4 672.9 685.9 663.5 693.3 654 700.8 644.6 706.9 636.9 713 629.2 719.1 621.5 723.2 616.4 727.2 611.2 731.3 606.1 732.7 604.4 734 602.6 735.4 600.9 735.2 600.8 734.8 600.8 734.6 600.7 733.8 600.5 733 600.4 732.2 600.2 729.1 599.6 726 598.9 722.9 598.2 718 597.1 713 596 708.1 594.8 701.5 593.2 694.9 591.5 688.3 589.7 680.2 587.5 672.2 585.2 664.1 582.9 654.7 580.1 645.4 577.2 636.1 574.1 625.6 570.6 615.2 567 604.8 563.3 593.4 559.1 582 554.8 570.8 550.2 558.6 545.3 546.6 540.1 534.6 534.8 521.9 529.1 509.3 523.1 496.8 516.8 483.7 510.2 470.7 503.4 457.9 496.2 444.6 488.7 431.4 480.9 418.5 472.8 405.1 464.4 392 455.6 379.1 446.4 365.9 437 352.9 427.1 340.3 416.9 327.4 406.4 314.8 395.5 302.7 384.2 290.3 372.6 278.3 360.6 266.8 348.1 255.1 335.3 243.8 322.1 233.2 308.4 222.3 294.4 212 279.9 202.4 265 192.5 249.7 183.4 233.9 175 217.8 175 217.4 174.8 217.1 174.6 216.8ZM172.1 214.2C170.7 218.7 169.3 223.3 167.8 227.8 164.5 238.5 161.1 249.2 157.8 259.9 153.9 272.4 150 285 146.1 297.5 143 307.5 139.9 317.4 136.7 327.4 135.9 330.1 135 332.7 134.2 335.4 134 336.1 133.6 336.7 133.8 337.4 135.4 342.2 137 347.1 138.6 351.9 141.9 361.9 145.2 371.8 148.6 381.8 152.7 394.1 156.8 406.5 160.9 418.8 164.9 430.8 168.9 442.8 172.9 454.8 175.9 463.7 178.8 472.6 181.8 481.4 182.6 483.8 183.4 486.2 184.2 488.7 184.4 489.4 184.6 490.1 184.9 490.8 187.2 495 189.5 499.2 191.8 503.4 196.8 512.6 201.9 521.8 206.9 531 213.2 542.4 219.4 553.9 225.7 565.3 231.7 576.2 237.6 587.1 243.6 598 247.8 605.6 251.9 613.2 256.1 620.8 257.3 623 258.2 625.4 259.9 627.2 264.1 631.7 268.3 636.2 272.5 640.7 280.2 648.9 287.9 657.2 295.5 665.4 304.5 675 313.5 684.7 322.4 694.3 330.5 703 338.6 711.7 346.7 720.4 351.8 725.8 356.8 731.3 361.9 736.7 363.5 738.4 365 740 366.6 741.6 372.3 747.3 378 753 383.7 758.7 392.5 767.5 401.2 776.2 410 785 419.1 794.1 428.3 803.3 437.4 812.4 444.2 819.2 451.1 826.1 457.9 832.9 459.6 834.6 461.3 836.3 463 838 463.3 838.3 463.6 838.6 463.8 838.8 463.9 838.9 465.1 838.7 465.3 838.6 475.9 837.2 486.5 835.8 497 834.5 505.6 833.4 514.1 832.3 522.7 831.2 523 831.2 523.7 830.1 523.9 829.9 525.1 828.6 526.3 827.2 527.6 825.9 532.1 820.9 536.7 815.9 541.2 810.9 547.9 803.5 554.6 796.1 561.4 788.7 569.6 779.7 577.7 770.7 585.9 761.8 594.8 752 603.6 742.3 612.5 732.5 621.3 722.8 630.1 713.1 639 703.4 647 694.5 655.1 685.7 663.1 676.8 669.6 669.6 676.2 662.4 682.7 655.2 687 650.5 691.3 645.8 695.6 641 696.6 639.9 697.7 638.7 698.7 637.6 698.9 637.4 699.6 636.9 699.6 636.6 699.6 636.5 696.6 635.7 696.5 635.7 693.5 634.8 690.4 633.9 687.4 633 682.6 631.5 677.8 630 673 628.4 666.6 626.3 660.1 624.1 653.8 621.8 645.9 619 638.1 616.1 630.3 613.1 621.2 609.6 612.1 606 603.1 602.2 592.9 598 582.8 593.6 572.8 589 561.8 584 550.8 578.8 540 573.4 528.3 567.6 516.7 561.6 505.2 555.3 493 548.7 480.9 541.8 469 534.6 456.5 527.1 444.1 519.3 431.9 511.2 419.2 502.8 406.7 494 394.5 484.9 381.8 475.5 369.5 465.8 357.4 455.7 345 445.3 332.8 434.6 321.1 423.4 309.1 412 297.4 400.2 286.2 388 274.7 375.5 263.7 362.6 253.2 349.3 242.5 335.7 232.3 321.7 222.8 307.2 213 292.4 203.9 277.2 195.5 261.7 186.8 246.5 179 230.5 172.1 214.2ZM169.5 204C168.8 207.8 168.1 211.6 167.3 215.4 165.5 224.9 163.7 234.5 161.9 244 159.5 256.5 157.1 269 154.7 281.5 152.3 294.2 149.8 307 147.4 319.7 145.5 329.9 143.5 340.1 141.6 350.3 140.7 355.2 139.7 360.1 138.8 365 138.7 365.7 139.1 366.4 139.3 367 140.2 369.6 141.1 372.2 142 374.8 145.4 384.5 148.7 394.3 152.1 404 156.4 416.4 160.7 428.7 165 441.1 168.8 452.1 172.6 463 176.4 474 178.3 479.5 180.2 485 182.1 490.5 182.3 491.2 182.7 491.8 183 492.4 184.2 494.8 185.4 497.1 186.5 499.5 190.9 508.4 195.4 517.2 199.8 526.1 205.6 537.7 211.4 549.3 217.2 560.9 222.7 571.9 228.2 583 233.8 594 237.4 601.2 241 608.3 244.6 615.5 245.2 616.6 245.7 617.7 246.3 618.8 246.7 619.6 247.6 620.4 248.2 621.1 252.8 626.6 257.4 632.1 262 637.7 269.5 646.7 276.9 655.6 284.4 664.6 292.8 674.7 301.3 684.9 309.7 695 317.2 704 324.8 713.1 332.3 722.1 337 727.8 341.8 733.5 346.5 739.1 347.2 740 347.9 740.8 348.7 741.7 348.9 741.9 349.2 742 349.4 742.2 350.2 742.7 350.9 743.2 351.7 743.7 358.7 748.5 365.8 753.3 372.8 758.1 383.3 765.3 393.9 772.5 404.4 779.7 414.6 786.6 424.7 793.6 434.9 800.5 440.8 804.5 446.7 808.6 452.7 812.6 456.3 815.1 459.5 818.1 462.9 820.8 472.5 828.7 482.1 836.7 491.7 844.6 498.5 850.2 505.4 855.9 512.2 861.5 512.8 862 512.7 861.9 513.3 861.3 514.2 860.3 515.2 859.2 516.1 858.2 520 853.9 524 849.6 527.9 845.3 534 838.6 540.2 831.9 546.3 825.2 554 816.8 561.7 808.3 569.4 799.9 578.1 790.4 586.7 781 595.4 771.5 604.4 761.7 613.3 751.9 622.3 742.1 630.9 732.6 639.6 723.2 648.2 713.7 655.9 705.3 663.6 696.9 671.3 688.5 677.4 681.8 683.5 675.1 689.6 668.4 693.5 664.1 697.4 659.9 701.3 655.6 702.4 654.4 703.5 653.2 704.6 652 704.6 652 704.6 652 704.6 652 704.6 652 704.6 652 704.6 652 704.6 652.1 701.6 651.3 701.5 651.3 698.5 650.5 695.5 649.5 692.6 648.6 687.9 647.1 683.1 645.5 678.4 643.8 672.1 641.6 665.8 639.2 659.5 636.9 651.8 634 644.1 630.9 636.4 627.8 627.5 624.1 618.6 620.3 609.7 616.4 599.7 612 589.8 607.4 580 602.7 569.2 597.5 558.4 592.1 547.7 586.6 536.2 580.6 524.8 574.4 513.4 568 501.4 561.2 489.5 554.2 477.7 546.9 465.3 539.3 453.1 531.4 441.1 523.3 428.6 514.8 416.3 506.1 404.2 497 391.7 487.7 379.5 478 367.5 468 355.2 457.8 343.2 447.2 331.5 436.3 319.6 425.2 308 413.6 296.8 401.7 285.4 389.6 274.5 377.1 264 364.3 253.3 351.2 243.2 337.8 233.6 323.9 223.8 309.8 214.6 295.4 206.1 280.5 197.4 265.4 189.4 249.9 182.1 234 177.7 224.2 173.5 214.2 169.5 204ZM866 183.5C863.9 179.4 861.1 176.2 857.1 174 851.9 171.1 846.2 168.9 840.7 166.5 829.5 161.7 818.2 157.4 806.7 153.4 783.6 145.4 760 138.9 736.3 132.9 711.7 126.7 687.1 120.9 662.3 115.7 637.1 110.4 611.7 105.6 586.3 101.4 561.2 97.2 536 93.1 510.5 91.1 497.8 90.1 485 89.9 472.4 91.3 465.9 92 459.4 93.2 453 94.2 446.6 95.2 440.1 96.2 433.7 97.3 408.2 101.5 382.8 106 357.4 111 332.2 115.9 307.1 121.2 282.1 126.9 257.2 132.5 232.6 139.2 208.4 147.3 196.3 151.4 184.2 155.8 172.3 160.5 166.4 162.8 160.5 165.2 154.6 167.7 151.7 168.9 148.8 170.2 145.8 171.4 143.2 172.5 140.6 173.5 138.1 174.7 134 176.7 130.6 179.7 128.3 183.6 127 185.8 126.2 188.2 125.3 190.6 124.2 193.6 123.1 196.6 122.1 199.6 118.1 211.5 114.9 223.7 112.5 236 107.7 260.4 106 285.4 106.8 310.2 107.2 322.7 108.2 335.3 109.7 347.7 111.2 360.2 112.7 372.8 115.1 385.2 119.8 410.4 126.7 435.1 134.8 459.3 138.9 471.4 143.3 483.5 147.9 495.4 152.2 506.5 157.5 517.3 162.7 528 173 549.2 184.4 569.8 196.6 589.9 208.8 609.9 221.9 629.3 235.7 648.1 249.5 666.8 264.1 685 279.3 702.6 295.3 721.1 311.7 739.2 328.6 756.9 345.6 774.8 363 792.2 381 809 398.9 825.9 417.4 842.2 436.4 857.8 445.6 865.4 454.9 872.8 464.2 880.2 473.6 887.7 483.1 895.1 492 903.2 494.3 905.2 496.5 907.3 498.7 909.5 498.9 909.7 499.7 910.8 500 910.8 500.2 910.8 500.5 910.8 500.7 910.8 501.2 910.8 502 911 502.5 910.8 507.3 907.1 512 903.3 516.8 899.6 526.2 892.1 535.6 884.6 544.9 876.9 563.3 861.7 581.4 846.2 599.2 830.3 616.9 814.5 634.1 798.2 651 781.5 667.9 764.7 684.4 747.5 700.3 729.7 716.3 711.8 731.8 693.4 746.5 674.4 761 655.7 774.8 636.5 787.8 616.8 800.7 597.2 812.8 577 823.8 556.2 835 535.1 845.2 513.5 854.3 491.4 863.4 469.1 871.2 446.3 877.3 423 883.4 399.9 887.8 376.4 890.3 352.7 892.9 328.6 893.4 304.3 892 280 891.8 276.9 891 273.8 890.3 270.7 889.7 267.7 889 264.6 888.4 261.6 887.2 255.7 886 249.9 884.7 244 882.3 233 879.7 222 876.5 211.1 873.4 201.8 870.1 192.5 866 183.5 863.5 178.4 878.8 211.7 866 183.5ZM814.8 393.5C808.1 418.2 799.5 442.5 789.4 466 780 487.9 770 509.6 758.5 530.5 747.4 550.7 735.1 570.3 722 589.3 708.8 608.4 694.7 626.8 680 644.8 664.8 663.4 649 681.5 632.7 699.1 615.9 717.3 598.5 734.9 580.5 752 562.5 769.1 544.1 785.7 525.1 801.6 515.7 809.5 506.1 817.3 496.5 824.9 496.1 825.2 495.2 826.3 494.7 826.3 494 826.3 493.3 826.3 492.6 826.3 492 826.3 491.4 825.5 491 825.1 490.5 824.6 490 824.1 489.5 823.6 488.4 822.6 487.2 821.5 486.1 820.5 481.6 816.6 476.9 813.1 472.2 809.4 469.9 807.6 467.6 805.7 465.3 803.8 463.1 801.9 461 799.8 458.8 797.8 454.2 793.7 449.7 789.6 445.2 785.5 435.9 777 426.6 768.5 417.5 759.8 408.4 751.1 399.5 742.3 390.9 733.2 386.7 728.8 382.7 724.3 378.4 720 374.2 715.8 370 711.5 365.8 707.2 349.1 690 332.9 672.5 317.4 654.3 301.8 636 286.9 617 273.1 597.3 259.2 577.5 246.4 556.9 234.5 535.8 222.8 515 212.1 493.7 202.6 471.8 193.1 449.9 184.8 427.4 177.9 404.6 176.1 398.6 174.4 392.6 173.1 386.5 171.7 380.1 170.6 373.6 169.6 367.1 167.6 354.2 166.3 341.2 165.5 328.2 164.7 315.3 164.3 302.3 164.5 289.3 164.7 276.7 165.9 264.2 167.5 251.7 167.9 248.5 168.3 245.4 168.7 242.2 168.9 240.6 169.1 239.1 169.3 237.5 169.5 235.9 169.6 234.3 169.8 232.7 170.1 230.3 171.1 228.1 171.7 225.7 172 224.5 172.2 223.2 172.2 221.9 172.2 220.8 172.8 220.1 173.6 219.5 174.6 218.8 175.6 218.3 176.5 217.5 177.1 217 177.6 216.6 178.4 216.3 179.2 216 180.1 215.7 180.9 215.3 183.9 214.2 186.8 213 189.8 211.9 195.7 209.7 201.6 207.5 207.6 205.3 231.3 196.7 255.3 189 279.7 182.4 292 179.1 304.3 176.1 316.7 173.5 322.9 172.2 329.1 170.6 335.4 169.3 341.7 167.9 348 166.6 354.3 165.4 379.8 160.4 405.4 156.3 431.1 152.5 444 150.6 457 148.8 470 147 473.2 146.6 476.5 146.1 479.7 145.7 481.3 145.5 482.8 145.3 484.4 145.1 485.7 144.9 487.1 145 488.4 145.1 493.9 145.1 499.5 145.3 504.9 146.3 506.2 146.5 507.4 146.8 508.6 147.1 510.1 147.5 511.5 147.8 513 148 516.1 148.4 519.2 148.9 522.3 149.3 528.6 150.2 534.8 151.1 541.1 152 553.7 153.8 566.4 155.7 579 157.7 604.4 161.7 629.7 166 654.8 171.4 680 176.8 705 183.2 729.7 190.3 742.1 193.9 754.4 197.7 766.6 201.7 772.7 203.7 778.7 205.8 784.7 207.9 787.7 209 790.7 210 793.7 211.1 795.1 211.6 796.6 212.1 798 212.7 798.7 213 799.4 213.2 800.1 213.5 800.8 213.8 801.9 214 802.4 214.5 803.6 215.7 805.3 216.5 806.3 217.9 806.8 218.7 807.1 219.5 807.2 220.5 807.3 221.2 807.2 221.8 807.4 222.5 807.7 223.4 807.9 224.3 808.1 225.2 809.8 231.5 811.2 237.9 812.3 244.4 813.4 250.8 814.1 257.2 814.5 263.6 814.7 266.8 814.8 270 814.9 273.2 814.9 274 814.9 274.7 814.9 275.5 814.9 276.3 815.2 277.1 815.3 277.8 815.7 279.5 816 281.1 816.4 282.8 821.3 306.5 822.7 330.7 820.7 354.8 819.6 367.7 817.6 380.7 814.8 393.5 807.1 421.7 822.5 357.6 814.8 393.5ZM617.6 393.5C616.1 389 614.6 384.5 613.1 379.9 612.9 379.3 612.7 378.7 612.5 378.1 612.4 377.7 612.5 377.1 612.4 376.7 612.3 376.1 612.2 375.5 612.1 374.9 611.8 373.8 611.4 372.8 610.8 371.9 609.7 370.1 608.1 368.5 606.5 367 604.7 365.2 602.4 362.7 599.6 362.7 601.6 360.7 604.3 360 606.5 358.3 607.6 357.4 608.5 356.5 609.7 355.7 610.5 355.2 611.6 354.7 612.1 353.8 612.3 353.4 612.4 352.9 612.4 352.5 612.9 352 613.3 351.5 613.7 350.9 614.4 349.8 614.7 348.6 614.9 347.3 615.1 345.1 615 342.9 615 340.7 615 338.4 615 336.1 615 333.8 615 331.4 615 329 614.4 326.6 613.1 321.5 610 316.8 606.4 313.1 604.7 311.4 603 309.9 601 308.6 598.3 306.9 595.5 305.5 592.7 304.1 589.9 302.7 586.9 301.8 583.8 301.4 581.4 301.1 579 301.1 576.6 301.1 573.9 301.1 571.2 301.1 568.5 301.1 556.2 301.1 543.8 301.1 531.5 301.1 526.9 301.1 522.3 301.1 517.7 301.1 516.9 301.1 516.1 301.1 515.2 301.1 515.1 301.1 515.2 305.3 515.2 305.6 515.2 308.8 515.2 311.9 515.2 315.1 515.2 316.2 515.2 317.3 515.2 318.4 515.2 318.9 515 319.1 515.5 319.1 516.7 319.1 528 319 528 319.2 528 327.2 528 335.2 528 343.2 528 355.8 528 368.3 528 380.9 528 384.6 528 388.3 528 392 528 392.2 528.1 393.4 527.9 393.4 525.4 393.4 522.8 393.4 520.3 393.4 518.9 393.4 517.6 393.4 516.2 393.4 515.9 393.4 515.2 393.2 515.2 393.6 515.2 395.7 515.2 397.8 515.2 400 515.2 401 515.2 414 515.2 414 524.7 414 534.3 414 543.8 414 549.3 414 554.8 414 560.2 414 561.4 414 562.5 414 563.7 414 564 414 563.8 411.1 563.8 410.7 563.8 405.1 563.8 399.6 563.8 394 563.8 393.4 563.9 393.5 563.3 393.5 562 393.5 560.7 393.5 559.3 393.5 557.8 393.5 556.3 393.5 554.8 393.5 554.6 393.5 553.5 393.7 553.5 393.4 553.5 388.4 553.5 383.4 553.5 378.4 553.5 375.6 553.5 372.9 553.5 370.1 553.5 369.4 553.5 368.8 553.5 368.1 553.5 367.7 554.2 367.9 554.5 367.9 557.4 367.9 560.2 367.9 563.1 367.9 565 367.9 566.9 367.9 568.8 367.9 570.1 367.9 571.6 367.7 572.8 368.1 573.9 368.4 574.8 369 575.7 369.7 576.8 370.6 578.3 371.8 578.9 373.1 579.2 373.8 579.2 374.5 579.2 375.3 579.2 376.6 579.6 377.7 580.2 378.9 580.7 380 581.3 381 581.6 382.2 581.7 382.6 581.7 383 581.8 383.4 581.9 384 582 384.6 582.1 385.1 583.1 390.9 584.2 396.6 585.2 402.4 585.6 404.9 586.1 407.3 586.5 409.8 586.6 410.3 586.7 410.8 586.8 411.3 586.8 411.4 587.2 411.4 587.4 411.4 597.8 411.4 608.3 411.4 618.7 411.4 619.2 411.4 619.6 411.4 620.1 411.4 620.2 411.4 620.2 410.7 620.2 410.6 620.2 408.2 620.2 405.7 620.2 403.3 620.2 398.3 620.2 393.3 620.2 388.4 620.2 388.4 620.2 388.4 620.2 388.4 619.3 390.1 618.5 391.8 617.6 393.5ZM592 339.7C592 342 589.2 342.8 587.7 344.1 587.4 344.3 587.1 344.6 586.9 344.8 586.7 344.8 586.4 344.8 586.2 344.9 585.8 345 585.4 345.2 585.1 345.4 584.4 345.9 583.9 346.6 583.2 347 582.1 347.5 580.7 347.3 579.6 347.3 577.9 347.3 576.3 347.3 574.6 347.3 573.9 347.3 573.2 347.3 572.5 347.3 569.5 347.3 566.4 347.3 563.4 347.3 563 347.3 558.8 347.4 558.8 347.2 558.8 337.9 558.8 328.5 558.8 319.2 558.8 319.1 571.7 319.2 573 319.2 577 319.2 581 319.1 584.9 320.1 586.4 320.5 587.8 321 589.2 321.6 590.1 322.1 591 323.2 591.6 324 593.1 325.7 594.1 327.8 594.5 330 594.6 330.7 594.6 331.3 594.6 332 594.3 332.6 594 333.2 593.7 333.9 593.3 334.7 592.9 335.5 592.6 336.3 592.1 337.4 592 338.5 592 339.7ZM722.6 393.5C722.6 384.2 722.6 374.9 722.6 365.6 722.6 357.1 720.9 348 714.6 341.9 707.5 335.1 696.4 333.9 687 334.7 685.1 334.9 683.2 335.3 681.4 336.1 680.4 336.5 679.5 336.9 678.6 337.6 678 338.1 677.3 338.5 676.7 338.8 673.6 340.4 670.5 341.6 668.8 344.9 668.8 335.9 668.8 326.8 668.8 317.8 668.8 311.9 668.8 306 668.8 300.1 668.8 298.4 668.8 296.6 668.8 294.9 668.8 294.4 669.1 293.7 668.5 293.7 657.9 293.7 647.3 293.7 636.7 293.7 635.5 293.7 634.2 293.7 633 293.7 633 293.7 633 297.8 633 298.1 633 303.4 633 308.7 633 314 633 314.3 633.8 314.2 634 314.2 635.4 314.2 636.7 314.2 638.1 314.2 640.6 314.2 643.2 314.2 645.7 314.2 645.9 314.2 645.8 319.4 645.8 319.8 645.8 331.2 645.8 342.6 645.8 353.9 645.8 364.9 645.8 375.8 645.8 386.8 645.8 388 645.8 389.2 645.8 390.3 645.8 391.2 645.7 391 644.6 391 641.6 391 638.7 391 635.7 391 634.8 391 633.9 391 633 391 632.9 391 632.9 391.9 632.9 392 632.9 397.7 632.9 403.4 632.9 409 632.9 409.8 632.9 410.5 632.9 411.3 632.9 411.5 633 411.5 633.2 411.5 634.5 411.5 635.9 411.5 637.2 411.5 649.1 411.5 661 411.5 672.9 411.5 673.4 411.5 681.5 411.5 681.5 411.5 681.5 406.5 681.5 401.5 681.5 396.5 681.5 394.7 681.5 392.9 681.5 391.1 681.5 391.1 675.6 391.1 675.2 391.1 674.8 391.1 668.7 391.1 668.7 391.1 668.7 389.8 668.7 388.5 668.7 387.3 668.7 381.2 668.7 375 668.7 368.9 668.7 366.5 668.7 364.2 668.7 361.8 668.7 361.3 668.7 360.9 668.7 360.4 668.7 360 670.3 358.8 670.6 358.5 671.7 357.5 672.8 356.5 674.2 355.8 674.7 355.5 675.3 355.3 675.8 355.3 676.5 355.2 676.8 354.8 677.4 354.3 678.5 353.5 679.7 353 681 352.8 683.6 352.4 685.8 352.7 687.9 354.2 689.1 355.1 690.1 356.1 691.2 357.2 692 358 692.7 358.8 693.3 359.8 694.2 361.6 694.3 363.7 694.3 365.7 694.4 369.3 694.3 372.9 694.3 376.6 694.3 387.8 694.3 399 694.3 410.3 694.3 410.9 694 411.6 694.7 411.6 696.4 411.6 698.1 411.6 699.8 411.6 706 411.6 712.3 411.6 718.5 411.6 722.4 411.6 726.3 411.6 730.2 411.6 730.2 411.6 730.2 398.5 730.2 397.5 730.2 395.4 730.2 393.3 730.2 391.2 727.8 391.8 725.2 392.6 722.6 393.5ZM730.3 270.6C727.9 270.6 725.4 270.6 723 270.6 722 270.6 721.1 270.6 720.1 270.6 720 270.6 719.6 271.3 719.6 271.4 716.5 276 713.4 280.6 710.4 285.3 708.9 287.5 707.4 289.7 706 292 705.6 292.5 705.3 293.1 704.9 293.6 704.6 294.1 704.8 294.9 704.8 295.4 704.8 295.6 704.8 298.8 704.8 298.8 705.4 298.8 706 298.8 706.5 298.8 709.5 298.8 712.4 298.8 715.4 298.8 717.8 298.8 720.1 298.8 722.5 298.8 723 298.8 722.7 299.6 722.7 299.9 722.7 301.4 722.7 302.9 722.7 304.4 722.7 305.8 722.7 307.1 722.7 308.5 722.7 309.3 723 309.1 723.8 309.1 725.3 309.1 726.9 309.1 728.4 309.1 728.7 309.1 730.3 309.3 730.3 308.9 730.3 306.2 730.3 303.4 730.3 300.7 730.3 300.4 730.1 298.8 730.5 298.8 731.9 298.8 733.3 298.8 734.6 298.8 734.7 298.8 735.4 298.8 735.4 298.8 735.4 298.2 735.4 297.7 735.4 297.1 735.4 296.9 735.4 293.7 735.4 293.7 734.1 293.7 732.9 293.7 731.6 293.7 731.1 293.7 730.3 294 730.3 293.4 730.3 285.7 730.3 278.1 730.3 270.6ZM722.6 285.9C722.6 287.2 722.6 288.5 722.6 289.7 722.6 290.6 722.6 291.4 722.6 292.3 722.6 292.5 722.7 293.4 722.6 293.6 722.5 293.7 721.6 293.6 721.5 293.6 720.6 293.6 719.7 293.6 718.8 293.6 717.5 293.6 716.2 293.6 715 293.6 716.3 291.6 717.7 289.6 719 287.6 719.6 286.7 720.2 285.9 720.8 285.1 722.4 283.1 722.6 280.7 722.6 278.2 722.6 280.8 722.6 283.4 722.6 285.9ZM763.6 288.5C760.9 285.8 756.2 285.9 752.6 285.9 752 285.9 751.4 285.9 750.8 285.9 750.8 285.9 750.8 284.8 750.8 284.7 750.8 283.4 750.8 282.1 750.8 280.8 750.8 280.7 763.9 280.8 765.2 280.8 765.7 280.8 766.2 281 766.2 280.5 766.2 279.1 766.2 277.7 766.2 276.4 766.2 275.3 766.2 274.2 766.2 273.2 766.2 273.2 764.9 273.2 764.9 273.2 759.2 273.2 753.5 273.2 747.8 273.2 747.2 273.2 746.5 273.2 745.9 273.2 745.7 273.2 745.7 273.6 745.7 273.8 745.4 276 745.1 278.2 744.9 280.4 744.3 284.8 743.8 289.3 743.2 293.7 747 293.7 751.5 293.1 755.1 294.8 757.9 296.2 759 299.4 758.5 302.4 758 305.8 754.4 306.5 751.5 306.5 749.6 306.5 743.2 307 743.2 303.9 742.3 306.5 741.5 309 740.6 311.6 742.3 311.6 744 312.6 745.6 313.2 748 314.1 750.5 314.3 753 314.1 756.9 313.8 761 312.5 763.6 309.4 766.3 306.1 766.2 301.9 766.2 297.8 766.2 295.6 766.2 293.3 765.7 291.1 765.5 290.1 765 288.6 763.7 288.5 763.7 288.5 763.6 288.5 763.6 288.5 761 285.9 766.2 288.5 763.6 288.5Z",
88 88 "width": 1000
89 89 },
90 90 "search": [
91 91 "rhodecode"
92 92 ]
93 93 },
94 94 {
95 95 "uid": "e5ad8728e6d6290aff4b6ffcfcaa9167",
96 96 "css": "up",
97 97 "code": 59442,
98 98 "src": "custom_icons",
99 99 "selected": true,
100 100 "svg": {
101 101 "path": "M686.5 595.8L513.6 379.1C506.3 369.9 492.4 369.9 485.1 379.1L312.2 595.8C302.7 607.8 311.2 625.4 326.5 625.4H672.2C687.5 625.4 696 607.8 686.5 595.8Z",
102 102 "width": 1000
103 103 },
104 104 "search": [
105 105 "up"
106 106 ]
107 107 },
108 108 {
109 109 "uid": "6e459e39444c93a2c017f258186765d6",
110 110 "css": "unlock",
111 111 "code": 59399,
112 112 "src": "custom_icons",
113 113 "selected": true,
114 114 "svg": {
115 115 "path": "M780.8 434.6H396.2V342.3C396.2 284.6 438.5 238.5 492.3 226.9 492.3 226.9 492.3 226.9 496.2 226.9 503.8 226.9 507.7 226.9 515.4 226.9 515.4 226.9 519.2 226.9 519.2 226.9 519.2 226.9 519.2 226.9 523.1 226.9 530.8 226.9 538.5 226.9 546.2 230.8 546.2 230.8 546.2 230.8 546.2 230.8 553.8 230.8 557.7 234.6 565.4 238.5 565.4 238.5 569.2 238.5 569.2 242.3 573.1 246.2 580.8 246.2 584.6 250 584.6 250 584.6 250 584.6 250 588.5 253.8 596.2 257.7 600 261.5 600 261.5 603.8 265.4 603.8 265.4 607.7 269.2 611.5 273.1 615.4 276.9 615.4 276.9 615.4 276.9 619.2 280.8 623.1 284.6 626.9 292.3 630.8 300 630.8 300 630.8 303.8 630.8 303.8 634.6 307.7 634.6 315.4 634.6 319.2 634.6 319.2 634.6 323.1 634.6 323.1 634.6 323.1 634.6 323.1 634.6 326.9 638.5 338.5 646.2 346.2 657.7 346.2H715.4C730.8 346.2 742.3 334.6 738.5 319.2 738.5 319.2 738.5 319.2 738.5 319.2 738.5 319.2 738.5 315.4 738.5 315.4 738.5 307.7 734.6 303.8 734.6 296.2 734.6 292.3 734.6 292.3 730.8 288.5 730.8 273.1 730.8 269.2 726.9 261.5 726.9 261.5 726.9 257.7 723.1 257.7 719.2 250 715.4 242.3 711.5 234.6 711.5 234.6 707.7 230.8 707.7 230.8 703.8 223.1 700 219.2 696.2 215.4 696.2 211.5 692.3 211.5 692.3 207.7 688.5 203.8 684.6 196.2 680.8 192.3 680.8 192.3 676.9 188.5 676.9 188.5 669.2 180.8 665.4 176.9 657.7 169.2 657.7 169.2 653.8 169.2 653.8 165.4 650 161.5 642.3 157.7 634.6 153.8 630.8 153.8 630.8 150 626.9 150 623.1 146.2 615.4 142.3 611.5 142.3 607.7 142.3 607.7 138.5 603.8 138.5 596.2 134.6 588.5 130.8 580.8 130.8 580.8 130.8 580.8 130.8 580.8 130.8 573.1 126.9 565.4 126.9 553.8 123.1 550 123.1 550 123.1 546.2 123.1 538.5 123.1 534.6 123.1 526.9 119.2 523.1 119.2 519.2 119.2 519.2 119.2 511.5 119.2 503.8 119.2 496.2 119.2 496.2 119.2 492.3 119.2 492.3 119.2 484.6 119.2 476.9 123.1 465.4 123.1 461.5 123.1 453.8 126.9 450 126.9 450 126.9 446.2 126.9 446.2 126.9 353.8 153.8 288.5 242.3 288.5 342.3V434.6H246.2C230.8 434.6 223.1 446.2 223.1 457.7V857.7C223.1 873.1 234.6 880.8 246.2 880.8H780.8C796.2 880.8 803.8 869.2 803.8 857.7V457.7C807.7 446.2 796.2 434.6 780.8 434.6Z",
116 116 "width": 1000
117 117 },
118 118 "search": [
119 119 "unlock"
120 120 ]
121 121 },
122 122 {
123 123 "uid": "b077586592b9b69166b981325446c836",
124 124 "css": "delete",
125 125 "code": 59392,
126 126 "src": "custom_icons",
127 127 "selected": true,
128 128 "svg": {
129 129 "path": "M515.4 92.3C303.8 92.3 130.8 265.4 130.8 476.9 130.8 688.5 303.8 861.5 515.4 861.5S900 688.5 900 476.9C900 265.4 726.9 92.3 515.4 92.3ZM742.3 507.7C742.3 523.1 730.8 534.6 711.5 534.6H315.4C300 534.6 284.6 523.1 284.6 507.7V446.2C284.6 430.8 296.2 419.2 315.4 419.2H711.5C726.9 419.2 742.3 430.8 742.3 446.2V507.7Z",
130 130 "width": 1000
131 131 },
132 132 "search": [
133 133 "delete"
134 134 ]
135 135 },
136 136 {
137 137 "uid": "dca63ad885c0d6f1780a8d1d55bc2380",
138 138 "css": "ok",
139 139 "code": 59393,
140 140 "src": "custom_icons",
141 141 "selected": true,
142 142 "svg": {
143 143 "path": "M515.4 115.4C303.8 115.4 130.8 288.5 130.8 500 130.8 711.5 303.8 884.6 515.4 884.6S900 711.5 900 500C900 288.5 726.9 115.4 515.4 115.4ZM753.8 411.5L450 715.4C438.5 726.9 423.1 726.9 411.5 715.4L273.1 576.9C261.5 565.4 261.5 550 273.1 538.5L315.4 496.2C326.9 484.6 342.3 484.6 353.8 496.2L411.5 553.8C423.1 565.4 438.5 565.4 450 553.8L669.2 334.6C680.8 323.1 696.2 323.1 707.7 334.6L750 376.9C765.4 384.6 765.4 400 753.8 411.5Z",
144 144 "width": 1000
145 145 },
146 146 "search": [
147 147 "ok"
148 148 ]
149 149 },
150 150 {
151 151 "uid": "c158b3a004c055c6ad1471cd98932268",
152 152 "css": "down",
153 153 "code": 59403,
154 154 "src": "custom_icons",
155 155 "selected": true,
156 156 "svg": {
157 157 "path": "M703.8 396.2L530.8 615.4C523.1 623.1 507.7 623.1 503.8 615.4L330.8 396.2C323.1 384.6 330.8 365.4 346.2 365.4H692.3C703.8 365.4 711.5 384.6 703.8 396.2Z",
158 158 "width": 1000
159 159 },
160 160 "search": [
161 161 "arrow_down"
162 162 ]
163 163 },
164 164 {
165 165 "uid": "02f59f392ad28056845cfc04cb121f13",
166 166 "css": "comment",
167 167 "code": 59394,
168 168 "src": "custom_icons",
169 169 "selected": true,
170 170 "svg": {
171 171 "path": "M130.8 784.6V280.8C130.8 207.7 188.5 150 261.5 150H769.2C842.3 150 900 207.7 900 280.8V569.2C900 642.3 842.3 700 769.2 700H273.1C269.2 700 261.5 703.8 257.7 707.7L165.4 800C153.8 815.4 130.8 803.8 130.8 784.6ZM261.5 211.5C223.1 211.5 188.5 242.3 188.5 284.6V696.2L234.6 650C238.5 646.2 242.3 642.3 250 642.3H769.2C807.7 642.3 842.3 611.5 842.3 569.2V280.8C842.3 242.3 811.5 207.7 769.2 207.7H261.5Z",
172 172 "width": 1000
173 173 },
174 174 "search": [
175 175 "comment"
176 176 ]
177 177 },
178 178 {
179 179 "uid": "9a44b838872ca62b8aba7bbbbf67cc59",
180 180 "css": "feed",
181 181 "code": 59400,
182 182 "src": "custom_icons",
183 183 "selected": true,
184 184 "svg": {
185 185 "path": "M842.3 111.5H188.5C153.8 111.5 130.8 138.5 130.8 169.2V826.9C130.8 857.7 157.7 884.6 188.5 884.6H846.2C876.9 884.6 903.8 857.7 903.8 826.9V169.2C900 138.5 873.1 111.5 842.3 111.5ZM307.7 776.9C269.2 776.9 234.6 746.2 234.6 703.8S265.4 630.8 307.7 630.8C346.2 630.8 380.8 661.5 380.8 703.8S346.2 776.9 307.7 776.9ZM553.8 788.5C519.2 788.5 496.2 761.5 496.2 730.8 496.2 619.2 407.7 530.8 296.2 530.8 265.4 530.8 230.8 503.8 230.8 473.1 230.8 438.5 253.8 411.5 284.6 411.5L296.2 411.5C473.1 411.5 615.4 553.8 615.4 730.8 611.5 761.5 584.6 788.5 553.8 788.5ZM750 788.5C715.4 788.5 692.3 761.5 692.3 730.8 692.3 511.5 511.5 330.8 292.3 330.8 261.5 330.8 226.9 303.8 226.9 269.2 226.9 234.6 250 207.7 280.8 207.7L292.3 207.7C576.9 207.7 811.5 438.5 811.5 726.9 811.5 761.5 784.6 788.5 750 788.5Z",
186 186 "width": 1000
187 187 },
188 188 "search": [
189 189 "feed"
190 190 ]
191 191 },
192 192 {
193 193 "uid": "e0118d6f20b76d77317977ae8dc849d7",
194 194 "css": "left",
195 195 "code": 59401,
196 196 "src": "custom_icons",
197 197 "selected": true,
198 198 "svg": {
199 199 "path": "M692.3 76.9L761.5 146.2C773.1 157.7 773.1 173.1 761.5 184.6L473.1 473.1C461.5 484.6 461.5 500 473.1 511.5L769.2 807.7C780.8 819.2 780.8 834.6 769.2 846.2L700 915.4C688.5 926.9 673.1 926.9 661.5 915.4L257.7 511.5C246.2 500 246.2 484.6 257.7 473.1L653.8 76.9C665.4 65.4 680.8 65.4 692.3 76.9Z",
200 200 "width": 1000
201 201 },
202 202 "search": [
203 203 "left"
204 204 ]
205 205 },
206 206 {
207 207 "uid": "3cea97f90c8f2b0a90833855434f58de",
208 208 "css": "right",
209 209 "code": 59402,
210 210 "src": "custom_icons",
211 211 "selected": true,
212 212 "svg": {
213 213 "path": "M338.5 915.4L265.4 846.2C253.8 834.6 253.8 819.2 265.4 807.7L553.8 519.2C565.4 507.7 565.4 492.3 553.8 480.8L257.7 184.6C246.2 173.1 246.2 157.7 257.7 146.2L326.9 76.9C338.5 65.4 353.8 65.4 365.4 76.9L769.2 480.8C780.8 492.3 780.8 507.7 769.2 519.2L376.9 915.4C365.4 926.9 346.2 926.9 338.5 915.4Z",
214 214 "width": 1000
215 215 },
216 216 "search": [
217 217 "right"
218 218 ]
219 219 },
220 220 {
221 221 "uid": "820a44cb2e7fc1d0e28b1d2a8cd44cb9",
222 222 "css": "git",
223 223 "code": 59434,
224 224 "src": "custom_icons",
225 225 "selected": true,
226 226 "svg": {
227 227 "path": "M928.8 6.3H71.3C35 6.3 6.3 36.3 6.3 71.3V927.5C6.3 963.8 36.3 992.5 71.3 992.5H927.5C963.8 992.5 992.5 962.5 992.5 927.5V71.3C993.8 36.3 963.7 6.3 928.8 6.3ZM200 555C203.8 566.3 208.8 575 213.8 582.5 220 590 227.5 596.3 236.3 600 245 603.8 255 606.3 265 606.3 273.8 606.3 281.3 605 288.8 603.8 296.3 602.5 302.5 600 308.8 597.5L315 546.3H287.5C283.8 546.3 280 545 277.5 542.5 276.3 541.3 275 537.5 275 535L280 496.2H385L368.7 627.5C361.2 633.8 352.5 638.7 343.7 642.5 335 646.3 326.3 650 316.2 652.5 306.2 655 297.5 657.5 286.3 658.8 276.3 660 265 661.3 252.5 661.3 232.5 661.3 215 657.5 198.7 650 182.5 642.5 168.7 632.5 157.5 620 146.2 607.5 137.5 592.5 131.2 575 125 557.5 121.2 538.8 121.2 518.8 121.2 501.3 123.7 485 127.5 468.8 131.2 452.5 137.5 438.8 145 425 152.5 411.3 161.2 400 171.2 388.8 181.2 377.5 192.5 368.8 205 361.3 217.5 353.8 231.3 347.5 246.3 343.8 261.3 340 276.3 337.5 292.5 337.5 306.3 337.5 317.5 338.8 328.7 341.3 340 343.8 350 347.5 357.5 351.3 366.2 355 373.8 360 380 365 386.3 370 392.5 376.3 397.5 381.3L377.5 412.5C373.8 417.5 368.8 420 363.8 421.3 358.8 422.5 353.7 421.3 347.5 417.5 342.5 413.8 337.5 411.3 333.7 408.8 328.7 406.3 325 403.8 320 402.5 315 401.3 310 400 305 398.8 300 397.5 293.7 397.5 287.5 397.5 273.7 397.5 261.2 400 250 406.3 238.7 412.5 228.7 420 221.2 431.3 212.5 441.2 206.2 455 202.5 468.8 197.5 483.8 196.2 500 196.2 517.5 195 531.3 197.5 543.8 200 555ZM536.3 657.5H465L503.7 342.5H575L536.3 657.5ZM878.8 398.8H798.8L766.3 657.5H696.3L727.5 398.7H647.5L655 342.5H886.3L878.8 398.8Z",
228 228 "width": 1000
229 229 },
230 230 "search": [
231 231 "git"
232 232 ]
233 233 },
234 234 {
235 235 "uid": "ea152b092f5ad7d610de2c388553e188",
236 236 "css": "hg",
237 237 "code": 59437,
238 238 "src": "custom_icons",
239 239 "selected": true,
240 240 "svg": {
241 241 "path": "M926.6 9.2H73.9C37.9 9.2 8.7 38.5 8.7 74.4V927.1C8.7 963.1 38 992.3 73.9 992.3H926.6C962.6 992.3 991.8 963 991.8 927.1V74.4C991.8 38.4 962.6 9.2 926.6 9.2ZM444 657.4H373.5L389.8 524.1H276.7L260.4 657.4H189.9L228.6 344.2H299.1L282.8 476.4H395.9L412.2 344.2H482.7L444 657.4ZM621 555.8C624.3 566.8 629.1 576 635.3 583.5 641.5 591 648.8 596.8 657.5 600.8 666.1 604.8 675.6 606.8 686.1 606.8 694.7 606.8 702.4 606 709.3 604.5 716.2 603 722.8 600.8 729.1 598.1L735.1 546.9H708.4C704.1 546.9 700.8 545.8 698.6 543.6 696.4 541.4 695.5 538.5 695.9 534.9L700.6 496.2H805.1L788.8 627.1C780.8 633 772.5 638.1 763.9 642.3 755.3 646.6 746.3 650 736.9 652.7 727.5 655.5 717.6 657.5 707.2 658.7 696.8 660 685.7 660.6 674 660.6 654.6 660.6 637 657 621 650 605 642.9 591.3 633.1 579.9 620.7 568.5 608.2 559.7 593.5 553.5 576.4 547.2 559.3 544.1 540.9 544.1 520.9 544.1 503.6 546.1 487.1 550 471.3 554 455.6 559.6 441.1 566.9 427.8 574.2 414.5 583 402.4 593.2 391.7 603.4 381 614.9 371.8 627.4 364.2 639.9 356.6 653.5 350.7 667.9 346.6 682.4 342.6 697.6 340.5 713.5 340.5 726.8 340.5 738.9 341.7 749.7 344.2 760.5 346.6 770.2 349.9 778.8 353.9 787.4 358 795.1 362.8 801.8 368.1 808.6 373.5 814.5 379 819.7 384.8L797 413.2C793.3 418.2 788.8 421.3 783.7 422.3 778.6 423.4 773.2 422.2 767.8 418.8 762.8 415.4 758.1 412.4 753.6 409.9 749.2 407.4 744.7 405.3 740.1 403.7 735.5 402 730.7 400.8 725.6 400 720.5 399.2 714.8 398.8 708.5 398.8 694.9 398.8 682.4 401.7 671.1 407.5 659.8 413.3 650 421.5 641.9 432 633.7 442.5 627.4 455.2 622.9 469.9 618.4 484.7 616.1 501 616.1 518.7 615.9 532.5 617.6 544.8 621 555.8Z",
242 242 "width": 1000
243 243 },
244 244 "search": [
245 245 "hg"
246 246 ]
247 247 },
248 248 {
249 249 "uid": "4a842c0afb4c35dacd21da71f9fed3f1",
250 250 "css": "comment-add",
251 251 "code": 59439,
252 252 "src": "custom_icons",
253 253 "selected": true,
254 254 "svg": {
255 255 "path": "M952.4 591.9V274.9C952.4 268.4 952.3 261.9 951.8 255.4 950.7 242.9 948.2 230.6 944.1 218.8 936.5 196.6 923.8 176.2 907.3 159.6 890.8 143.1 870.6 130.4 848.5 122.7 836.6 118.6 824.2 115.9 811.6 114.8 805.3 114.2 798.9 114.2 792.6 114.2H216.9C204 114.2 191.3 114.1 178.5 116 166.3 117.9 154.4 121.2 143 125.9 121.4 134.8 101.9 148.7 86.4 166.2 70.8 183.8 59.3 205 53.1 227.7 49.7 240.1 47.9 252.8 47.6 265.6 47.3 278.7 47.6 291.8 47.6 304.9V861.8C47.6 870.7 52.5 878.6 60.5 882.5 67.3 885.9 75.6 886.2 82.4 882.7 84.8 881.5 86.9 879.7 88.8 877.8 91.1 875.5 93.4 873.2 95.6 871 100.3 866.3 105 861.6 109.7 856.9L137.9 828.6C147.3 819.2 156.6 809.9 166 800.5 175.2 791.3 184.6 782.1 193.7 772.7 197.7 768.5 201.9 764.4 207.6 762.7 210.4 761.9 213.2 761.8 216 761.8H782.7C795.5 761.8 808.3 762 821 760.1 844.8 756.5 867.7 747.3 887.3 733.3 906.2 719.9 922.1 702.1 933.2 681.8 945.1 660.2 951.5 636 952.2 611.4 952.5 604.9 952.4 598.4 952.4 591.9ZM883.4 285.1V602.5C883.4 608.8 883.4 615.1 882.5 621.4 881.7 627.5 880.2 633.6 878.1 639.4 874.4 649.4 868.8 658.7 861.7 666.7 846.6 683.6 825.1 693.8 802.5 695.1 796.3 695.4 790 695.2 783.8 695.2H207.8C201.2 695.2 194.7 695.2 188.1 695.2 185 695.2 181.8 695.2 178.8 696.1 176.2 696.9 173.9 698.2 171.8 699.9 169.6 701.7 167.6 703.7 165.6 705.7 163.3 708 161 710.3 158.7 712.6 154 717.3 149.4 721.9 144.7 726.6 135.3 736 126 745.3 116.6 754.7V270C116.6 257.8 118.8 245.7 123.7 234.6 128 224.9 134 215.9 141.5 208.4 157.5 192.4 179.6 183.3 202.2 183.3H791.5C797.6 183.3 803.7 183.3 809.7 184.2 832 187.4 852.4 199.4 866 217.4 872.8 226.4 877.7 236.7 880.5 247.6 882 253.5 882.9 259.6 883.1 265.8 883.6 272.2 883.4 278.7 883.4 285.1ZM668.8 402H538.2C534.4 402 526.7 394.3 526.7 390.5V263.7C526.7 256 519 248.3 515.2 248.3H465.3C457.6 248.3 449.9 256 449.9 259.8V390.4C449.9 394.2 442.2 401.9 438.4 401.9H311.7C304 401.9 296.3 409.6 296.3 413.4V463.3C296.3 471 304 478.7 307.8 478.7H434.5C442.2 478.7 449.9 486.4 449.9 490.2V617C449.9 624.7 457.6 632.4 461.4 632.4H511.3C519 632.4 526.7 624.7 526.7 620.9V494.1C526.7 486.4 534.4 478.7 538.2 478.7H665C672.7 478.7 680.4 471 680.4 467.2V417.3C680.3 409.6 672.6 402 668.8 402Z",
256 256 "width": 1000
257 257 },
258 258 "search": [
259 259 "comment-add"
260 260 ]
261 261 },
262 262 {
263 263 "uid": "2427f6b8d4379b9a0b41cf31780807cf",
264 264 "css": "comment-toggle",
265 265 "code": 59440,
266 266 "src": "custom_icons",
267 267 "selected": true,
268 268 "svg": {
269 269 "path": "M797.6 114.2H202.4C116.6 114.2 47.6 183.3 47.6 269V861.9C47.6 881.4 69.5 891.1 84.1 881.8 86.4 880.7 88.6 879.1 90.6 877.1L199.8 768C202.1 765.7 204.7 764 207.7 762.8 209.7 762.2 211.9 761.9 214.3 761.9H797.6C883.4 761.9 952.4 692.8 952.4 607.1V269C952.4 183.2 883.3 114.2 797.6 114.2ZM118.3 752.6V269.5C118.3 222.5 156.4 184.3 203.5 184.3H680.1C593.7 267.9 175.5 695.4 171.4 699.5L118.3 752.6Z",
270 270 "width": 1000
271 271 },
272 272 "search": [
273 273 "comment-toggle"
274 274 ]
275 275 },
276 276 {
277 277 "uid": "6533bdc16ab201eb3f3b27ce989cab33",
278 278 "css": "folder-open-empty",
279 279 "code": 61717,
280 280 "src": "fontawesome"
281 281 },
282 282 {
283 283 "uid": "d64b34fac1d9923b7d29d1550b628ecd",
284 284 "css": "lock",
285 285 "code": 59398,
286 286 "src": "custom_icons",
287 287 "selected": true,
288 288 "svg": {
289 289 "path": "M812.5 424.1H758.9V317C758.9 308 758.9 303.6 758.9 299.1 758.9 294.6 758.9 290.2 758.9 285.7 758.9 281.3 758.9 281.3 758.9 276.8 758.9 267.9 758.9 263.4 754.5 254.5 754.5 250 754.5 250 750 245.5 750 236.6 745.5 232.1 741.1 223.2 741.1 223.2 741.1 218.8 736.6 218.8 732.1 209.8 727.7 200.9 723.2 192 723.2 192 718.8 187.5 718.8 187.5 723.2 178.6 718.8 169.6 714.3 165.2 714.3 160.7 709.8 160.7 709.8 156.3 705.4 151.8 700.9 142.9 696.4 138.4 696.4 138.4 692 133.9 692 133.9 683 125 678.6 120.5 669.6 111.6 669.6 111.6 665.2 111.6 665.2 107.1 660.7 102.7 651.8 98.2 642.9 93.8 638.4 93.8 638.4 89.3 633.9 89.3 629.5 84.8 620.5 80.4 616.1 80.4 611.6 80.4 611.6 75.9 607.1 75.9 598.2 71.4 589.3 67 580.4 67 580.4 67 580.4 67 580.4 67 571.4 62.5 562.5 62.5 549.1 58 544.6 58 544.6 58 540.2 58 535.7 58 535.7 58 531.3 58 531.3 58 526.8 58 526.8 58 526.8 58 522.3 58 522.3 58 522.3 58 522.3 58 522.3 58 522.3 58 522.3 58 522.3 58 517.9 58 513.4 58 513.4 58 513.4 58 508.9 58 508.9 58 504.5 58 504.5 58 500 58 500 58 500 58 500 58 495.5 58 491.1 58 491.1 58 491.1 58 491.1 58 491.1 58 491.1 58 491.1 58 491.1 58 491.1 58 486.6 58 486.6 58 486.6 58 482.1 58 482.1 58 477.7 58 477.7 58 473.2 58 468.8 58 468.8 58 464.3 58 455.4 58 442 62.5 433 67 433 67 433 67 433 67 410.7 67 397.3 71.4 388.4 75.9 383.9 75.9 383.9 80.4 379.5 80.4 375 84.8 370.5 84.8 361.6 89.3 361.6 93.8 357.1 93.8 357.1 93.8 348.2 98.2 339.3 102.7 334.8 111.6 334.8 111.6 330.4 111.6 330.4 116.1 321.4 120.5 317 125 308 133.9 308 133.9 303.6 138.4 303.6 138.4 299.1 142.9 294.6 151.8 290.2 156.3 290.2 160.7 285.7 160.7 285.7 165.2 276.8 169.6 272.3 178.6 272.3 183 267.9 183 267.9 187.5 267.9 187.5 263.4 196.4 258.9 205.4 254.5 214.3 254.5 214.3 254.5 218.8 250 218.8 250 232.1 245.5 236.6 245.5 245.5 245.5 250 245.5 250 241.1 254.5 241.1 263.4 236.6 267.9 236.6 276.8 236.6 281.3 236.6 281.3 236.6 285.7 236.6 290.2 236.6 294.6 236.6 299.1 236.6 303.6 236.6 312.5 236.6 317V424.1H187.5C169.6 424.1 160.7 437.5 160.7 450.9V915.2C160.7 933 174.1 942 187.5 942H808C825.9 942 834.8 928.6 834.8 915.2V450.9C839.3 433 825.9 424.1 812.5 424.1ZM361.6 317C361.6 250 410.7 196.4 473.2 183 473.2 183 473.2 183 477.7 183 486.6 183 491.1 183 500 183 500 183 504.5 183 504.5 183 504.5 183 504.5 183 504.5 183 513.4 183 517.9 183 526.8 183 526.8 183 526.8 183 531.3 183 593.8 196.4 642.9 250 642.9 317V424.1H361.6V317Z",
290 290 "width": 1000
291 291 },
292 292 "search": [
293 293 "lock"
294 294 ]
295 295 },
296 296 {
297 297 "uid": "d95fde5e3bfeb3302efc47c90538a1c5",
298 298 "css": "more",
299 299 "code": 59410,
300 300 "src": "custom_icons",
301 301 "selected": true,
302 302 "svg": {
303 303 "path": "M546.2 415.4H446.2C430.8 415.4 419.2 426.9 419.2 442.3V542.3C419.2 557.7 430.8 569.2 446.2 569.2H546.2C561.5 569.2 573.1 557.7 573.1 542.3V442.3C573.1 426.9 561.5 415.4 546.2 415.4ZM546.2 107.7H446.2C430.8 107.7 419.2 119.2 419.2 134.6V234.6C419.2 250 430.8 261.5 446.2 261.5H546.2C561.5 261.5 573.1 250 573.1 234.6V134.6C573.1 119.2 561.5 107.7 546.2 107.7ZM546.2 723.1H446.2C430.8 723.1 419.2 734.6 419.2 750V850C419.2 865.4 430.8 876.9 446.2 876.9H546.2C561.5 876.9 573.1 865.4 573.1 850V750C573.1 734.6 561.5 723.1 546.2 723.1Z",
304 304 "width": 1000
305 305 },
306 306 "search": [
307 307 "more"
308 308 ]
309 309 },
310 310 {
311 311 "uid": "34e7772638ae3ca1bfb0a4eca2c39221",
312 312 "css": "merge",
313 313 "code": 59443,
314 314 "src": "custom_icons",
315 315 "selected": true,
316 316 "svg": {
317 317 "path": "M199.8 740.5C199.8 812.2 258.1 870.5 329.8 870.5S459.8 812.2 459.8 740.5C459.8 694.6 435.8 654.5 399.8 631.3 418.4 491.7 533.4 451.9 602.4 440.6V742.4C563.7 765 537.4 806.4 537.4 854.4 537.4 926.1 595.7 984.4 667.4 984.4S797.4 926.1 797.4 854.4C797.4 806.5 771.1 765 732.4 742.4V254.9C771.1 232.3 797.4 190.9 797.4 142.9 797.4 71.2 739.1 12.9 667.4 12.9S537.4 71.2 537.4 142.9C537.4 190.8 563.7 232.3 602.4 254.9V309.9C542.2 317.8 440.4 342.3 364.2 417.8 309.5 472.1 277.9 542.1 269.6 625.9 228.4 647.7 199.8 690.6 199.8 740.5ZM667.6 897.8C643.7 897.8 624.3 878.3 624.3 854.5S643.8 811.2 667.6 811.2C691.5 811.2 710.9 830.7 710.9 854.5S691.5 897.8 667.6 897.8ZM667.6 99.6C691.5 99.6 710.9 119 710.9 142.9S691.4 186.2 667.6 186.2C643.7 186.2 624.3 166.8 624.3 142.9S643.7 99.6 667.6 99.6ZM329.9 783.9C306 783.9 286.6 764.4 286.6 740.6S306.1 697.3 329.9 697.3C353.8 697.3 373.2 716.7 373.2 740.6S353.8 783.9 329.9 783.9Z",
318 318 "width": 1000
319 319 },
320 320 "search": [
321 321 "merge"
322 322 ]
323 323 },
324 324 {
325 325 "uid": "c95735c17a10af81448c7fed98a04546",
326 326 "css": "folder-open",
327 327 "code": 59405,
328 328 "src": "fontawesome"
329 329 },
330 330 {
331 331 "uid": "865ac833a8efcfc24a6f573705ce56b1",
332 332 "css": "svn",
333 333 "code": 59438,
334 334 "src": "custom_icons",
335 335 "selected": true,
336 336 "svg": {
337 337 "path": "M933.4 9.2H80.7C44.7 9.2 15.5 38.5 15.5 74.4V927.1C15.5 963.1 44.8 992.3 80.7 992.3H933.4C969.4 992.3 998.6 963 998.6 927.1V74.4C998.7 38.4 969.4 9.2 933.4 9.2ZM167.9 447.1C171.1 451 175.4 454.4 180.8 457.3 186.2 460.2 192.2 463 199 465.4 205.7 467.8 212.7 470.5 219.8 473.3 226.9 476.2 233.9 479.5 240.7 483.2 247.5 486.9 253.6 491.6 259 497.2 264.4 502.8 268.7 509.6 271.9 517.4 275.1 525.3 276.8 534.8 276.8 545.8 276.8 561.6 274.1 576.4 268.6 590.3 263.1 604.3 255.3 616.4 245.1 626.8 234.9 637.2 222.5 645.4 208 651.5 193.4 657.6 177 660.7 158.8 660.7 149.7 660.7 140.7 659.7 131.5 657.7S113.6 652.8 105.2 649.2C96.8 645.5 89 641.2 81.8 636.2 74.6 631.2 68.5 625.6 63.5 619.5L88.5 586.7C90.5 584.3 93 582.3 95.9 580.7 98.8 579.1 101.8 578.3 104.8 578.3 108.8 578.3 112.7 579.7 116.5 582.5 120.3 585.3 124.5 588.4 129.1 591.8 133.7 595.2 139 598.2 145.1 601.1 151.2 603.9 158.7 605.3 167.6 605.3 180.7 605.3 190.7 601.7 197.8 594.7 204.9 587.6 208.4 577.1 208.4 563.2 208.4 556.8 206.8 551.4 203.5 547.3 200.3 543.1 196 539.7 190.8 536.8 185.6 533.9 179.6 531.4 172.8 529.1 166 526.9 159.2 524.5 152.1 521.9 145.1 519.3 138.2 516.2 131.4 512.8 124.6 509.3 118.6 504.7 113.4 499 108.2 493.3 103.9 486.4 100.7 478.2 97.5 469.9 95.9 459.8 95.9 447.7 95.9 433.8 98.5 420.4 103.7 407.6 108.9 394.8 116.4 383.4 126.2 373.5 136 363.6 147.8 355.7 161.7 349.8 175.6 343.9 191.3 341 208.6 341 217.5 341 226.1 341.9 234.5 343.8S250.8 348.2 258.1 351.6C265.4 354.9 272.1 358.8 278.1 363.3 284.1 367.8 289.2 372.8 293.4 378.1L272.3 407C269.7 410.3 267.2 412.8 264.8 414.4 262.4 416 259.4 416.8 256 416.8 252.7 416.8 249.4 415.8 246.1 413.6 242.8 411.4 239.1 409.1 235 406.5 230.9 403.9 226.2 401.6 220.9 399.4 215.6 397.2 209.3 396.2 202.2 396.2 195.6 396.2 189.8 397.1 184.9 399 179.9 400.9 175.8 403.4 172.5 406.8 169.2 410.1 166.7 414 165.1 418.4 163.5 422.9 162.6 427.8 162.6 433 163.1 438.4 164.7 443.2 167.9 447.1ZM480 657.4H416.3L339.2 343.7H395.6C401.6 343.7 406.4 345.1 410 348 413.6 350.8 415.8 354.5 416.7 359L449.4 531.8C451.3 538.7 453 546.3 454.6 554.8 456.2 563.2 457.5 571.9 458.7 581 461.7 572 464.9 563.2 468.4 554.8 471.8 546.4 475.4 538.8 479.2 531.8L552.3 359C553.2 357.1 554.4 355.2 556.1 353.4 557.7 351.5 559.6 349.8 561.8 348.4 564 347 566.4 345.8 569 345 571.6 344.2 574.4 343.7 577.3 343.7H634.1L480 657.4ZM902.6 657.4H866C860.5 657.4 856.1 656.5 852.8 654.7 849.4 652.9 846.2 649.9 843.2 645.8L733.6 452.2C733.3 456.2 733 460.1 732.7 463.8 732.3 467.6 732 471.1 731.7 474.4L710.2 657.4H648.2L686.9 343.7H723.9C726.9 343.7 729.5 343.8 731.6 344 733.7 344.2 735.5 344.7 737.1 345.5 738.7 346.3 740.1 347.4 741.4 348.8S744.1 352.1 745.5 354.4L855.5 548.1C855.8 543.1 856.2 538.3 856.7 533.7 857.2 529.2 857.8 524.8 858.3 520.8L879.4 343.6H941.4L902.6 657.4Z",
338 338 "width": 1000
339 339 },
340 340 "search": [
341 341 "svn"
342 342 ]
343 343 },
344 344 {
345 345 "uid": "bbfb51903f40597f0b70fd75bc7b5cac",
346 346 "css": "trash",
347 347 "code": 61944,
348 348 "src": "fontawesome"
349 349 },
350 350 {
351 351 "uid": "f48ae54adfb27d8ada53d0fd9e34ee10",
352 352 "css": "trash-empty",
353 353 "code": 59406,
354 354 "src": "fontawesome"
355 355 },
356 356 {
357 357 "uid": "f8aa663c489bcbd6e68ec8147dca841e",
358 358 "css": "folder",
359 359 "code": 59404,
360 360 "src": "fontawesome"
361 361 },
362 362 {
363 363 "uid": "c8585e1e5b0467f28b70bce765d5840c",
364 364 "css": "docs",
365 365 "code": 61637,
366 366 "src": "fontawesome"
367 367 },
368 368 {
369 369 "uid": "1b5a5d7b7e3c71437f5a26befdd045ed",
370 370 "css": "doc",
371 371 "code": 59414,
372 372 "src": "fontawesome"
373 373 },
374 374 {
375 375 "uid": "5408be43f7c42bccee419c6be53fdef5",
376 376 "css": "doc-text",
377 377 "code": 61686,
378 378 "src": "fontawesome"
379 379 },
380 380 {
381 381 "uid": "b091a8bd0fdade174951f17d936f51e4",
382 382 "css": "folder-empty",
383 383 "code": 61716,
384 384 "src": "fontawesome"
385 385 },
386 386 {
387 387 "uid": "c08a1cde48d96cba21d8c05fa7d7feb1",
388 388 "css": "doc-text-inv",
389 389 "code": 61788,
390 390 "src": "fontawesome"
391 391 },
392 392 {
393 393 "uid": "178053298e3e5b03551d754d4b9acd8b",
394 394 "css": "doc-inv",
395 395 "code": 61787,
396 396 "src": "fontawesome"
397 397 },
398 398 {
399 399 "uid": "e99461abfef3923546da8d745372c995",
400 400 "css": "cog",
401 401 "code": 59415,
402 402 "src": "fontawesome"
403 403 },
404 404 {
405 405 "uid": "98687378abd1faf8f6af97c254eb6cd6",
406 406 "css": "cog-alt",
407 407 "code": 59416,
408 408 "src": "fontawesome"
409 409 },
410 410 {
411 411 "uid": "21b42d3c3e6be44c3cc3d73042faa216",
412 412 "css": "sliders",
413 413 "code": 61918,
414 414 "src": "fontawesome"
415 415 },
416 416 {
417 417 "uid": "559647a6f430b3aeadbecd67194451dd",
418 418 "css": "menu",
419 419 "code": 61641,
420 420 "src": "fontawesome"
421 421 },
422 422 {
423 423 "uid": "c5fd349cbd3d23e4ade333789c29c729",
424 424 "css": "eye",
425 425 "code": 59417,
426 426 "src": "fontawesome"
427 427 },
428 428 {
429 429 "uid": "7fd683b2c518ceb9e5fa6757f2276faa",
430 430 "css": "eye-off",
431 431 "code": 59418,
432 432 "src": "fontawesome"
433 433 },
434 434 {
435 435 "uid": "2e2dba0307a502a8507c1729084c7ab5",
436 436 "css": "cancel-circled2",
437 437 "code": 59419,
438 438 "src": "fontawesome"
439 439 },
440 440 {
441 441 "uid": "0f4cae16f34ae243a6144c18a003f2d8",
442 442 "css": "cancel-circled",
443 443 "code": 59420,
444 444 "src": "fontawesome"
445 445 },
446 446 {
447 447 "uid": "26613a2e6bc41593c54bead46f8c8ee3",
448 448 "css": "file-code",
449 449 "code": 61897,
450 450 "src": "fontawesome"
451 451 },
452 452 {
453 453 "uid": "5211af474d3a9848f67f945e2ccaf143",
454 454 "css": "remove",
455 455 "code": 59408,
456 456 "src": "fontawesome"
457 457 },
458 458 {
459 459 "uid": "44e04715aecbca7f266a17d5a7863c68",
460 460 "css": "plus",
461 461 "code": 59421,
462 462 "src": "fontawesome"
463 463 },
464 464 {
465 465 "uid": "4ba33d2607902cf690dd45df09774cb0",
466 466 "css": "plus-circled",
467 467 "code": 59422,
468 468 "src": "fontawesome"
469 469 },
470 470 {
471 471 "uid": "1a5cfa186647e8c929c2b17b9fc4dac1",
472 472 "css": "plus-squared",
473 473 "code": 61694,
474 474 "src": "fontawesome"
475 475 },
476 476 {
477 477 "uid": "2d3be3e856fc1e4ac067590d2ded1b07",
478 478 "css": "plus-squared-alt",
479 479 "code": 61846,
480 480 "src": "fontawesome"
481 481 },
482 482 {
483 483 "uid": "eeadb020bb75d089b25d8424aabe19e0",
484 484 "css": "minus-circled",
485 485 "code": 59423,
486 486 "src": "fontawesome"
487 487 },
488 488 {
489 489 "uid": "f755a58fb985eeb70bd47d9b31892a34",
490 490 "css": "minus-squared",
491 491 "code": 61766,
492 492 "src": "fontawesome"
493 493 },
494 494 {
495 495 "uid": "18ef25350258541e8e54148ed79845c0",
496 496 "css": "minus-squared-alt",
497 497 "code": 61767,
498 498 "src": "fontawesome"
499 499 },
500 500 {
501 501 "uid": "861ab06e455e2de3232ebef67d60d708",
502 502 "css": "minus",
503 503 "code": 59424,
504 504 "src": "fontawesome"
505 505 },
506 506 {
507 507 "uid": "e82cedfa1d5f15b00c5a81c9bd731ea2",
508 508 "css": "info-circled",
509 509 "code": 59425,
510 510 "src": "fontawesome"
511 511 },
512 512 {
513 513 "uid": "9dd9e835aebe1060ba7190ad2b2ed951",
514 514 "css": "search",
515 515 "code": 59411,
516 516 "src": "fontawesome"
517 517 },
518 518 {
519 519 "uid": "b429436ec5a518c78479d44ef18dbd60",
520 520 "css": "paste",
521 521 "code": 61674,
522 522 "src": "fontawesome"
523 523 },
524 524 {
525 525 "uid": "8772331a9fec983cdb5d72902a6f9e0e",
526 526 "css": "scissors",
527 527 "code": 59412,
528 528 "src": "fontawesome"
529 529 },
530 530 {
531 531 "uid": "9a76bc135eac17d2c8b8ad4a5774fc87",
532 532 "css": "download",
533 533 "code": 59413,
534 534 "src": "fontawesome"
535 535 },
536 536 {
537 537 "uid": "eeec3208c90b7b48e804919d0d2d4a41",
538 538 "css": "upload",
539 539 "code": 59426,
540 540 "src": "fontawesome"
541 541 },
542 542 {
543 543 "uid": "5d2d07f112b8de19f2c0dbfec3e42c05",
544 544 "css": "spin",
545 545 "code": 59448,
546 546 "src": "fontelico"
547 547 },
548 548 {
549 549 "uid": "9bd60140934a1eb9236fd7a8ab1ff6ba",
550 550 "css": "spin-alt",
551 551 "code": 59444,
552 552 "src": "fontelico"
553 553 },
554 554 {
555 555 "uid": "513ac180ff85bd275f2b736720cbbf5e",
556 556 "css": "home",
557 557 "code": 59427,
558 558 "src": "entypo"
559 559 },
560 560 {
561 561 "uid": "d4816c0845aa43767213d45574b3b145",
562 562 "css": "history",
563 563 "code": 61914,
564 564 "src": "fontawesome"
565 565 },
566 566 {
567 "uid": "7034e4d22866af82bef811f52fb1ba46",
568 "css": "code",
569 "code": 61729,
570 "src": "fontawesome"
571 },
572 {
573 "uid": "f3f90c8c89795da30f7444634476ea4f",
574 "css": "angle-left",
575 "code": 61700,
576 "src": "fontawesome"
577 },
578 {
579 "uid": "7bf14281af5633a597f85b061ef1cfb9",
580 "css": "angle-right",
581 "code": 61701,
582 "src": "fontawesome"
583 },
584 {
585 "uid": "5de9370846a26947e03f63142a3f1c07",
586 "css": "angle-up",
587 "code": 61702,
588 "src": "fontawesome"
589 },
590 {
591 "uid": "e4dde1992f787163e2e2b534b8c8067d",
592 "css": "angle-down",
593 "code": 61703,
594 "src": "fontawesome"
595 },
596 {
597 "uid": "4i0s2bklai5fywieqm4dqqngfz9ptfab",
598 "css": "flag-filled",
599 "code": 59428,
600 "src": "typicons"
601 },
602 {
603 "uid": "3d4ea8a78dc34efe891f3a0f3d961274",
604 "css": "info",
605 "code": 61737,
606 "src": "fontawesome"
607 },
608 {
609 "uid": "56a21935a5d4d79b2e91ec00f760b369",
610 "css": "sort",
611 "code": 61660,
612 "src": "fontawesome"
613 },
614 {
615 "uid": "130380e481a7defc690dfb24123a1f0c",
616 "css": "circle",
617 "code": 61713,
618 "src": "fontawesome"
619 },
620 {
621 "uid": "422e07e5afb80258a9c4ed1706498f8a",
622 "css": "circle-empty",
623 "code": 61708,
624 "src": "fontawesome"
625 },
626 {
627 "uid": "5774d0a0e50f6eefc8be01bd761e5dd3",
628 "css": "circle-thin",
629 "code": 61915,
630 "src": "fontawesome"
631 },
632 {
567 633 "uid": "c43db6645e7515889fc2193294f50767",
568 634 "css": "plus",
569 635 "code": 59411,
570 636 "src": "custom_icons",
571 637 "selected": false,
572 638 "svg": {
573 639 "path": "M873.1 446.2H619.2C603.8 446.2 592.3 434.6 592.3 419.2V165.4C592.3 150 580.8 138.5 565.4 138.5H465.4C450 138.5 438.5 150 438.5 165.4V419.2C438.5 434.6 426.9 446.2 411.5 446.2H157.7C142.3 446.2 130.8 457.7 130.8 473.1V573.1C130.8 588.5 142.3 600 157.7 600H411.5C426.9 600 438.5 611.5 438.5 626.9V880.8C438.5 896.2 450 907.7 465.4 907.7H565.4C580.8 907.7 592.3 896.2 592.3 880.8V626.9C592.3 611.5 603.8 600 619.2 600H873.1C888.5 600 900 588.5 900 573.1V473.1C900 457.7 888.5 446.2 873.1 446.2Z",
574 640 "width": 1000
575 641 },
576 642 "search": [
577 643 "plus"
578 644 ]
579 645 },
580 646 {
581 647 "uid": "7d7f338d90203f20c0d8d5c26091cc69",
582 648 "css": "minus",
583 649 "code": 59412,
584 650 "src": "custom_icons",
585 651 "selected": false,
586 652 "svg": {
587 653 "path": "M980 560H20C10 560 0 550 0 540V380C0 370 10 360 20 360H985C995 360 1005 370 1005 380V545C1000 550 990 560 980 560Z",
588 654 "width": 1000
589 655 },
590 656 "search": [
591 657 "minus"
592 658 ]
593 659 },
594 660 {
595 661 "uid": "4ccc61480001600f2e7e3c7dd0546c6e",
596 662 "css": "remove",
597 663 "code": 59413,
598 664 "src": "custom_icons",
599 665 "selected": false,
600 666 "svg": {
601 667 "path": "M975 140L860 25C845 10 825 10 810 25L525 310C510 325 490 325 475 310L190 25C175 10 155 10 140 25L25 140C10 155 10 175 25 190L310 475C325 490 325 510 310 525L25 810C10 825 10 845 25 860L140 975C155 990 175 990 190 975L475 690C490 675 510 675 525 690L810 975C825 990 845 990 860 975L975 860C990 845 990 825 975 810L690 525C675 510 675 490 690 475L975 190C990 180 990 155 975 140Z",
602 668 "width": 1000
603 669 },
604 670 "search": [
605 671 "remove"
606 672 ]
607 673 },
608 674 {
609 675 "uid": "b1afcccc053ecb95fbcacf06e5c0d554",
610 676 "css": "history",
611 677 "code": 59418,
612 678 "src": "custom_icons",
613 679 "selected": false,
614 680 "svg": {
615 681 "path": "",
616 682 "width": 1143
617 683 },
618 684 "search": [
619 685 "history"
620 686 ]
621 687 }
622 688 ]
623 689 } No newline at end of file
1 NO CONTENT: modified file, binary diff hidden
@@ -1,134 +1,156 b''
1 1 <?xml version="1.0" standalone="no"?>
2 2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 3 <svg xmlns="http://www.w3.org/2000/svg">
4 4 <metadata>Copyright (C) 2019 by original authors @ fontello.com</metadata>
5 5 <defs>
6 6 <font id="rcicons" horiz-adv-x="1000" >
7 7 <font-face font-family="rcicons" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
8 8 <missing-glyph horiz-adv-x="1000" />
9 9 <glyph glyph-name="delete" unicode="&#xe800;" d="M515 758c-211 0-384-173-384-385 0-211 173-385 384-385s385 174 385 385c0 212-173 385-385 385z m227-416c0-15-11-27-30-27h-397c-15 0-30 12-30 27v62c0 15 11 27 30 27h397c15 0 30-12 30-27v-62z" horiz-adv-x="1000" />
10 10
11 11 <glyph glyph-name="ok" unicode="&#xe801;" d="M515 735c-211 0-384-173-384-385 0-211 173-385 384-385s385 174 385 385c0 212-173 385-385 385z m239-296l-304-304c-11-12-27-12-38 0l-139 138c-11 12-11 27 0 39l42 42c12 11 27 11 39 0l58-58c11-11 27-11 38 0l219 219c12 12 27 12 39 0l42-42c15-8 15-23 4-34z" horiz-adv-x="1000" />
12 12
13 13 <glyph glyph-name="comment" unicode="&#xe802;" d="M131 65v504c0 73 58 131 131 131h507c73 0 131-58 131-131v-288c0-73-58-131-131-131h-496c-4 0-11-4-15-8l-93-92c-11-15-34-4-34 15z m131 574c-39 0-73-31-73-74v-411l46 46c4 4 7 8 15 8h519c39 0 73 31 73 73v288c0 39-30 73-73 73h-507z" horiz-adv-x="1000" />
14 14
15 15 <glyph glyph-name="bookmark" unicode="&#xe803;" d="M780-140l-260 290c-10 10-25 10-35 0l-260-295c-20-20-45-5-45 30v930c-5 20 10 35 25 35h590c15 0 30-15 30-35v-925c0-35-30-50-45-30z" horiz-adv-x="1000" />
16 16
17 17 <glyph glyph-name="branch" unicode="&#xe804;" d="M875 600c0 76-58 134-134 134s-134-58-134-134c0-49 27-89 63-112-18-142-139-183-210-196v313c45 22 71 62 71 111 0 76-58 134-134 134s-134-58-134-134c0-49 27-94 67-116v-500c-40-22-67-67-67-116 0-76 58-134 134-134s134 58 134 134c0 49-26 94-67 116v58c63 9 166 31 246 112 58 58 89 129 98 214 40 22 67 67 67 116z m-478 161c27 0 45-18 45-45s-18-45-45-45-44 18-44 45 18 45 44 45z m0-822c-26 0-44 18-44 45s18 45 44 45 45-18 45-45-22-45-45-45z m344 706c27 0 45-18 45-45s-18-45-45-45-45 18-45 45 23 45 45 45z" horiz-adv-x="1000" />
18 18
19 19 <glyph glyph-name="tag" unicode="&#xe805;" d="M460 788l-366 8c-18 0-31-13-31-31l13-366c0-9 4-13 9-22l464-465c14-13 31-13 45 0l352 353c14 14 14 31 0 45l-468 469c-5 4-14 9-18 9z m-103-224c0-35-31-67-67-67-35 0-67 32-67 67 0 36 32 67 67 67s67-26 67-67z" horiz-adv-x="1000" />
20 20
21 21 <glyph glyph-name="lock" unicode="&#xe806;" d="M813 426h-54v107c0 9 0 13 0 18 0 4 0 9 0 13 0 5 0 5 0 9 0 9 0 14-4 23 0 4 0 4-5 9 0 8-4 13-9 22 0 0 0 4-4 4-5 9-9 18-14 27 0 0-4 5-4 5 4 8 0 17-5 22 0 4-4 4-4 9-5 4-9 13-14 18 0 0-4 4-4 4-9 9-13 14-22 22 0 0-5 0-5 5-4 4-13 9-22 13-5 0-5 5-9 5-4 4-13 9-18 9-4 0-4 4-9 4-9 5-18 9-27 9 0 0 0 0 0 0-9 5-17 5-31 9-4 0-4 0-9 0-4 0-4 0-9 0 0 0-4 0-4 0 0 0-5 0-5 0 0 0 0 0 0 0 0 0 0 0 0 0-4 0-9 0-9 0 0 0-4 0-4 0-4 0-4 0-9 0 0 0 0 0 0 0-4 0-9 0-9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0-4 0-4 0 0 0-5 0-5 0-4 0-4 0-9 0-4 0-4 0-9 0-9 0-22-4-31-9 0 0 0 0 0 0-22 0-36-4-45-9-4 0-4-4-8-4-5-5-9-5-18-9 0-5-5-5-5-5-9-4-18-9-22-18 0 0-5 0-5-4-9-4-13-9-22-18 0 0-4-4-4-4-5-5-9-14-14-18 0-5-4-5-4-9-9-5-14-14-14-18-4 0-4-4-4-4-5-9-9-18-13-27 0 0 0-5-5-5 0-13-4-18-4-26 0-5 0-5-5-9 0-9-4-14-4-23 0-4 0-4 0-9 0-4 0-9 0-13 0-5 0-13 0-18v-107h-49c-18 0-27-13-27-27v-464c0-18 13-27 27-27h620c18 0 27 13 27 27v464c4 18-9 27-22 27z m-451 107c0 67 49 121 111 134 0 0 0 0 5 0 9 0 13 0 22 0 0 0 5 0 5 0 0 0 0 0 0 0 8 0 13 0 22 0 0 0 0 0 4 0 63-13 112-67 112-134v-107h-281v107z" horiz-adv-x="1000" />
22 22
23 23 <glyph glyph-name="unlock" unicode="&#xe807;" d="M781 415h-385v93c0 57 43 104 96 115 0 0 0 0 4 0 8 0 12 0 19 0 0 0 4 0 4 0 0 0 0 0 4 0 8 0 16 0 23-4 0 0 0 0 0 0 8 0 12-4 19-7 0 0 4 0 4-4 4-4 12-4 16-8 0 0 0 0 0 0 4-4 11-8 15-11 0 0 4-4 4-4 4-4 8-8 11-12 0 0 0 0 4-4 4-4 8-11 12-19 0 0 0-4 0-4 4-4 4-11 4-15 0 0 0-4 0-4 0 0 0 0 0-4 4-11 11-19 23-19h57c16 0 27 11 24 27 0 0 0 0 0 0 0 0 0 4 0 4 0 7-4 11-4 19 0 4 0 4-4 8 0 15 0 19-4 27 0 0 0 3-4 3-4 8-8 16-11 23 0 0-4 4-4 4-4 8-8 12-12 16 0 4-4 4-4 7-3 4-7 12-11 16 0 0-4 4-4 4-8 7-12 11-19 19 0 0-4 0-4 4-4 4-12 7-19 11-4 0-4 4-8 4-4 4-12 8-15 8-4 0-4 4-8 4-8 3-15 7-23 7 0 0 0 0 0 0-8 4-16 4-27 8-4 0-4 0-8 0-7 0-11 0-19 4-4 0-8 0-8 0-7 0-15 0-23 0 0 0-4 0-4 0-7 0-15-4-27-4-3 0-11-4-15-4 0 0-4 0-4 0-92-27-157-115-157-215v-93h-43c-15 0-23-11-23-23v-400c0-15 12-23 23-23h535c15 0 23 12 23 23v400c4 12-8 23-23 23z" horiz-adv-x="1000" />
24 24
25 25 <glyph glyph-name="feed" unicode="&#xe808;" d="M842 739h-653c-35 0-58-27-58-58v-658c0-31 27-58 58-58h657c31 0 58 27 58 58v658c-4 31-31 58-62 58z m-534-666c-39 0-73 31-73 73s30 73 73 73c38 0 73-30 73-73s-35-73-73-73z m246-11c-35 0-58 27-58 57 0 112-88 200-200 200-31 0-65 27-65 58 0 35 23 62 54 62l11 0c177 0 319-143 319-320-3-30-30-57-61-57z m196 0c-35 0-58 27-58 57 0 220-180 400-400 400-30 0-65 27-65 62 0 34 23 61 54 61l11 0c285 0 520-230 520-519 0-34-27-61-62-61z" horiz-adv-x="1000" />
26 26
27 27 <glyph glyph-name="left" unicode="&#xe809;" d="M692 773l70-69c11-12 11-27 0-39l-289-288c-11-12-11-27 0-38l296-297c12-11 12-27 0-38l-69-69c-11-12-27-12-38 0l-404 404c-12 11-12 26 0 38l396 396c11 12 27 12 38 0z" horiz-adv-x="1000" />
28 28
29 29 <glyph glyph-name="right" unicode="&#xe80a;" d="M339-65l-74 69c-11 11-11 27 0 38l289 289c11 11 11 27 0 38l-296 296c-12 12-12 27 0 39l69 69c12 12 27 12 38 0l404-404c12-11 12-27 0-38l-392-396c-12-12-31-12-38 0z" horiz-adv-x="1000" />
30 30
31 31 <glyph glyph-name="down" unicode="&#xe80b;" d="M704 454l-173-219c-8-8-23-8-27 0l-173 219c-8 11 0 31 15 31h346c12 0 20-20 12-31z" horiz-adv-x="1000" />
32 32
33 33 <glyph glyph-name="folder" unicode="&#xe80c;" d="M929 511v-393q0-51-37-88t-88-37h-679q-51 0-88 37t-37 88v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h375q51 0 88-37t37-88z" horiz-adv-x="928.6" />
34 34
35 35 <glyph glyph-name="folder-open" unicode="&#xe80d;" d="M1049 319q0-17-18-37l-187-221q-24-28-67-48t-81-20h-607q-19 0-33 7t-15 24q0 17 17 37l188 221q24 28 67 48t80 20h607q19 0 34-7t15-24z m-192 192v-90h-464q-53 0-110-26t-92-67l-188-221-2-3q0 2-1 7t0 7v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h303q52 0 88-37t37-88z" horiz-adv-x="1071.4" />
36 36
37 37 <glyph glyph-name="trash-empty" unicode="&#xe80e;" d="M286 439v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m143 0v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m142 0v-321q0-8-5-13t-12-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q7 0 12-5t5-13z m72-404v529h-500v-529q0-12 4-22t8-15 6-5h464q2 0 6 5t8 15 4 22z m-375 601h250l-27 65q-4 5-9 6h-177q-6-1-10-6z m518-18v-36q0-8-5-13t-13-5h-54v-529q0-46-26-80t-63-34h-464q-37 0-63 33t-27 79v531h-53q-8 0-13 5t-5 13v36q0 8 5 13t13 5h172l39 93q9 21 31 35t44 15h178q23 0 44-15t30-35l39-93h173q8 0 13-5t5-13z" horiz-adv-x="785.7" />
38 38
39 39 <glyph glyph-name="group" unicode="&#xe80f;" d="M962 219v-15c0-4-4-12-12-12h-161-4c-16 20-39 39-77 43-35 7-54 15-69 23 7 7 19 11 30 15 46 8 58 23 66 35 7 11 7 23 0 38-8 16-31 43-31 81 0 38 0 104 73 104h8 7c73-4 77-66 73-104 0-38-23-69-30-81-8-15-8-27 0-38 7-12 23-27 65-35 54-4 62-46 62-54 0 0 0 0 0 0z m-708-15c15 15 38 31 69 35 39 7 62 15 73 26-7 8-19 16-34 20-47 7-58 23-66 34-7 12-7 23 0 39 8 15 31 42 31 81 0 38 0 103-73 103h-8-11c-73-3-77-65-73-103 0-39 23-70 30-81 8-16 8-27 0-39-7-11-23-27-65-34-46-8-54-50-54-54 0 0 0 0 0 0v-16c0-3 4-11 12-11h161 8z m454 11c-73 12-96 35-108 54-11 20-11 39 0 62 12 23 50 69 54 131 4 61 0 165-119 169h-16-15c-119-4-123-104-119-166 4-61 38-107 54-130 11-23 11-43 0-62-12-19-35-42-108-54-73-11-85-80-85-88 0 0 0 0 0 0v-23c0-8 8-16 16-16h257 258c8 0 15 8 15 16v23c0 0 0 0 0 0-3 4-11 73-84 84z" horiz-adv-x="1000" />
40 40
41 41 <glyph glyph-name="remove" unicode="&#xe810;" d="M724 112q0-22-15-38l-76-76q-16-15-38-15t-38 15l-164 165-164-165q-16-15-38-15t-38 15l-76 76q-16 16-16 38t16 38l164 164-164 164q-16 16-16 38t16 38l76 76q16 16 38 16t38-16l164-164 164 164q16 16 38 16t38-16l76-76q15-15 15-38t-15-38l-164-164 164-164q15-15 15-38z" horiz-adv-x="785.7" />
42 42
43 43 <glyph glyph-name="fork" unicode="&#xe811;" d="M792 654c0 58-46 100-100 100-57 0-100-46-100-100 0-35 20-65 47-85-12-84-70-123-127-142-58 15-116 54-127 142 27 20 46 50 46 85 0 58-46 100-100 100s-108-42-108-100c0-39 23-73 54-89 12-107 77-188 181-226v-162c-31-19-50-50-50-88 0-58 46-101 100-101s100 47 100 101c0 38-19 69-50 88v162c104 38 169 119 181 226 30 20 53 50 53 89z m-465 35c19 0 35-16 35-35s-16-31-35-31-35 12-35 31 16 35 35 35z m181-635c-19 0-35 15-35 35s16 34 35 34c19 0 34-15 34-34s-15-35-34-35z m184 635c20 0 35-16 35-35s-15-31-35-31-34 16-34 35 15 31 34 31z" horiz-adv-x="1000" />
44 44
45 45 <glyph glyph-name="more" unicode="&#xe812;" d="M546 435h-100c-15 0-27-12-27-27v-100c0-16 12-27 27-27h100c16 0 27 11 27 27v100c0 15-11 27-27 27z m0 307h-100c-15 0-27-11-27-27v-100c0-15 12-26 27-26h100c16 0 27 11 27 26v100c0 16-11 27-27 27z m0-615h-100c-15 0-27-12-27-27v-100c0-15 12-27 27-27h100c16 0 27 12 27 27v100c0 15-11 27-27 27z" horiz-adv-x="1000" />
46 46
47 47 <glyph glyph-name="search" unicode="&#xe813;" d="M643 386q0 103-73 176t-177 74-177-74-73-176 73-177 177-73 177 73 73 177z m286-465q0-29-22-50t-50-21q-30 0-50 21l-191 191q-100-69-223-69-80 0-153 31t-125 84-84 125-31 153 31 152 84 126 125 84 153 31 153-31 125-84 84-126 31-152q0-123-69-223l191-191q21-21 21-51z" horiz-adv-x="928.6" />
48 48
49 49 <glyph glyph-name="scissors" unicode="&#xe814;" d="M536 350q14 0 25-11t10-25-10-25-25-10-25 10-11 25 11 25 25 11z m167-36l283-222q16-11 14-31-3-20-19-28l-72-36q-7-4-16-4-10 0-17 4l-385 216-62-36q-4-3-7-3 8-28 6-54-4-43-31-83t-74-69q-74-47-154-47-76 0-124 44-51 47-44 116 4 42 31 82t73 69q74 47 155 47 46 0 84-18 5 8 13 13l68 40-68 41q-8 5-13 12-38-17-84-17-81 0-155 47-46 30-73 69t-31 82q-3 33 8 63t36 52q47 44 124 44 80 0 154-47 46-29 74-68t31-83q2-27-6-54 3-1 7-3l62-37 385 216q7 5 17 5 9 0 16-4l72-36q16-9 19-28 2-20-14-32z m-380 145q26 24 12 61t-59 65q-52 33-107 33-42 0-63-20-26-24-12-60t59-66q51-33 107-33 41 0 63 20z m-47-415q45 28 59 65t-12 60q-22 20-63 20-56 0-107-33-45-28-59-65t12-60q21-20 63-20 55 0 107 33z m99 342l54-33v7q0 20 18 31l8 4-44 26-15-14q-1-2-5-6t-7-7q-1-1-2-2t-2-1z m125-125l54-18 410 321-71 36-429-240v-64l-89-53 5-5q1-1 4-3 2-2 6-7t6-6l15-15z m393-232l71 35-290 228-99-77q-1-2-7-4z" horiz-adv-x="1000" />
50 50
51 51 <glyph glyph-name="download" unicode="&#xe815;" d="M714 100q0 15-10 25t-25 11-25-11-11-25 11-25 25-11 25 11 10 25z m143 0q0 15-10 25t-26 11-25-11-10-25 10-25 25-11 26 11 10 25z m72 125v-179q0-22-16-37t-38-16h-821q-23 0-38 16t-16 37v179q0 22 16 38t38 16h259l75-76q33-32 76-32t76 32l76 76h259q22 0 38-16t16-38z m-182 318q10-23-8-39l-250-250q-10-11-25-11t-25 11l-250 250q-17 16-8 39 10 21 33 21h143v250q0 15 11 25t25 11h143q14 0 25-11t10-25v-250h143q24 0 33-21z" horiz-adv-x="928.6" />
52 52
53 53 <glyph glyph-name="doc" unicode="&#xe816;" d="M819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 17-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 16t-16 37v233h-429v-858h715z" horiz-adv-x="857.1" />
54 54
55 55 <glyph glyph-name="cog" unicode="&#xe817;" d="M571 350q0 59-41 101t-101 42-101-42-42-101 42-101 101-42 101 42 41 101z m286 61v-124q0-7-4-13t-11-7l-104-16q-10-30-21-51 19-27 59-77 6-6 6-13t-5-13q-15-21-55-61t-53-39q-7 0-14 5l-77 60q-25-13-51-21-9-76-16-104-4-16-20-16h-124q-8 0-14 5t-6 12l-16 103q-27 9-50 21l-79-60q-6-5-14-5-8 0-14 6-70 64-92 94-4 5-4 13 0 6 5 12 8 12 28 37t30 40q-15 28-23 55l-102 15q-7 1-11 7t-5 13v124q0 7 5 13t10 7l104 16q8 25 22 51-23 32-60 77-6 7-6 14 0 5 5 12 15 20 55 60t53 40q7 0 15-5l77-60q24 13 50 21 9 76 17 104 3 16 20 16h124q7 0 13-5t7-12l15-103q28-9 51-20l79 59q5 5 13 5 7 0 14-5 72-67 92-95 4-5 4-12 0-7-4-13-9-12-29-37t-30-40q15-28 23-54l102-16q7-1 12-7t4-13z" horiz-adv-x="857.1" />
56 56
57 57 <glyph glyph-name="cog-alt" unicode="&#xe818;" d="M500 350q0 59-42 101t-101 42-101-42-42-101 42-101 101-42 101 42 42 101z m429-286q0 29-22 51t-50 21-50-21-21-51q0-29 21-50t50-21 51 21 21 50z m0 572q0 29-22 50t-50 21-50-21-21-50q0-30 21-51t50-21 51 21 21 51z m-215-235v-103q0-6-4-11t-8-6l-87-14q-6-19-18-42 19-27 50-64 4-6 4-11 0-7-4-11-12-17-46-50t-43-33q-7 0-12 4l-64 50q-21-11-43-17-6-60-13-87-4-13-17-13h-104q-6 0-11 4t-5 10l-13 85q-19 6-42 18l-66-50q-4-4-11-4-6 0-12 4-80 75-80 90 0 5 4 10 5 8 23 30t26 34q-13 24-20 46l-85 13q-5 1-9 5t-4 11v104q0 5 4 10t9 6l86 14q7 19 18 42-19 27-50 64-4 6-4 11 0 7 4 12 12 16 46 49t44 33q6 0 12-4l64-50q19 10 43 18 6 60 13 86 3 13 16 13h104q6 0 11-4t6-10l13-85q19-6 42-17l65 49q5 4 12 4 6 0 11-4 81-75 81-90 0-4-4-10-7-9-24-30t-25-34q13-27 19-46l85-12q6-2 9-6t4-11z m357-298v-78q0-9-83-17-6-15-16-29 28-63 28-77 0-2-2-4-68-40-69-40-5 0-26 27t-29 37q-11-1-17-1t-17 1q-7-11-29-37t-25-27q-1 0-69 40-3 2-3 4 0 14 29 77-10 14-17 29-83 8-83 17v78q0 9 83 18 7 16 17 29-29 63-29 77 0 2 3 4 2 1 19 11t33 19 17 9q4 0 25-26t29-38q12 1 17 1t17-1q28 40 51 63l4 1q2 0 69-39 2-2 2-4 0-14-28-77 9-13 16-29 83-9 83-18z m0 572v-78q0-9-83-18-6-15-16-29 28-63 28-77 0-2-2-4-68-39-69-39-5 0-26 26t-29 38q-11-1-17-1t-17 1q-7-12-29-38t-25-26q-1 0-69 39-3 2-3 4 0 14 29 77-10 14-17 29-83 9-83 18v78q0 9 83 17 7 16 17 29-29 63-29 77 0 2 3 4 2 1 19 11t33 19 17 9q4 0 25-26t29-37q12 1 17 1t17-1q28 39 51 62l4 1q2 0 69-39 2-2 2-4 0-14-28-77 9-13 16-29 83-8 83-17z" horiz-adv-x="1071.4" />
58 58
59 59 <glyph glyph-name="eye" unicode="&#xe819;" d="M929 314q-85 132-213 197 34-58 34-125 0-103-73-177t-177-73-177 73-73 177q0 67 34 125-128-65-213-197 75-114 187-182t242-68 243 68 186 182z m-402 215q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-11 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19z m473-215q0-19-11-38-78-129-210-206t-279-77-279 77-210 206q-11 19-11 38t11 39q78 128 210 205t279 78 279-78 210-205q11-20 11-39z" horiz-adv-x="1000" />
60 60
61 61 <glyph glyph-name="eye-off" unicode="&#xe81a;" d="M310 105l43 79q-48 35-76 88t-27 114q0 67 34 125-128-65-213-197 94-144 239-209z m217 424q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-11 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19z m202 106q0-4 0-5-59-105-176-316t-176-316l-28-50q-5-9-15-9-7 0-75 39-9 6-9 16 0 7 25 49-80 36-147 96t-117 137q-11 17-11 38t11 39q86 131 212 207t277 76q50 0 100-10l31 54q5 9 15 9 3 0 10-3t18-9 18-10 18-10 10-7q9-5 9-15z m21-249q0-78-44-142t-117-91l157 280q4-25 4-47z m250-72q0-19-11-38-22-36-61-81-84-96-194-149t-234-53l41 74q119 10 219 76t169 171q-65 100-158 164l35 63q53-36 102-85t81-103q11-19 11-39z" horiz-adv-x="1000" />
62 62
63 63 <glyph glyph-name="cancel-circled2" unicode="&#xe81b;" d="M612 248l-81-82q-6-5-13-5t-13 5l-76 77-77-77q-5-5-13-5t-12 5l-82 82q-6 6-6 13t6 13l76 76-76 77q-6 5-6 12t6 13l82 82q5 5 12 5t13-5l77-77 76 77q6 5 13 5t13-5l81-82q6-5 6-13t-6-12l-76-77 76-76q6-6 6-13t-6-13z m120 102q0 83-41 152t-110 111-152 41-153-41-110-111-41-152 41-152 110-111 153-41 152 41 110 111 41 152z m125 0q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
64 64
65 65 <glyph glyph-name="cancel-circled" unicode="&#xe81c;" d="M641 224q0 14-10 25l-101 101 101 101q10 11 10 25 0 15-10 26l-51 50q-10 11-25 11-15 0-25-11l-101-101-101 101q-11 11-25 11-16 0-26-11l-50-50q-11-11-11-26 0-14 11-25l101-101-101-101q-11-11-11-25 0-15 11-26l50-50q10-11 26-11 14 0 25 11l101 101 101-101q10-11 25-11 15 0 25 11l51 50q10 11 10 26z m216 126q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
66 66
67 67 <glyph glyph-name="plus" unicode="&#xe81d;" d="M786 439v-107q0-22-16-38t-38-15h-232v-233q0-22-16-37t-38-16h-107q-22 0-38 16t-15 37v233h-232q-23 0-38 15t-16 38v107q0 23 16 38t38 16h232v232q0 22 15 38t38 16h107q23 0 38-16t16-38v-232h232q23 0 38-16t16-38z" horiz-adv-x="785.7" />
68 68
69 69 <glyph glyph-name="plus-circled" unicode="&#xe81e;" d="M679 314v72q0 14-11 25t-25 10h-143v143q0 15-11 25t-25 11h-71q-15 0-25-11t-11-25v-143h-143q-14 0-25-10t-10-25v-72q0-14 10-25t25-10h143v-143q0-15 11-25t25-11h71q15 0 25 11t11 25v143h143q14 0 25 10t11 25z m178 36q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
70 70
71 71 <glyph glyph-name="minus-circled" unicode="&#xe81f;" d="M679 314v72q0 14-11 25t-25 10h-429q-14 0-25-10t-10-25v-72q0-14 10-25t25-10h429q14 0 25 10t11 25z m178 36q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
72 72
73 73 <glyph glyph-name="minus" unicode="&#xe820;" d="M786 439v-107q0-22-16-38t-38-15h-678q-23 0-38 15t-16 38v107q0 23 16 38t38 16h678q23 0 38-16t16-38z" horiz-adv-x="785.7" />
74 74
75 75 <glyph glyph-name="info-circled" unicode="&#xe821;" d="M571 82v89q0 8-5 13t-12 5h-54v286q0 8-5 13t-13 5h-178q-8 0-13-5t-5-13v-89q0-8 5-13t13-5h53v-179h-53q-8 0-13-5t-5-13v-89q0-8 5-13t13-5h250q7 0 12 5t5 13z m-71 500v89q0 8-5 13t-13 5h-107q-8 0-13-5t-5-13v-89q0-8 5-13t13-5h107q8 0 13 5t5 13z m357-232q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
76 76
77 77 <glyph glyph-name="upload" unicode="&#xe822;" d="M714 29q0 14-10 25t-25 10-25-10-11-25 11-25 25-11 25 11 10 25z m143 0q0 14-10 25t-26 10-25-10-10-25 10-25 25-11 26 11 10 25z m72 125v-179q0-22-16-38t-38-16h-821q-23 0-38 16t-16 38v179q0 22 16 38t38 15h238q12-31 39-51t62-20h143q34 0 61 20t40 51h238q22 0 38-15t16-38z m-182 361q-9-22-33-22h-143v-250q0-15-10-25t-25-11h-143q-15 0-25 11t-11 25v250h-143q-23 0-33 22-9 22 8 39l250 250q10 10 25 10t25-10l250-250q18-17 8-39z" horiz-adv-x="928.6" />
78 78
79 79 <glyph glyph-name="home" unicode="&#xe823;" d="M888 336q16-16 11-27t-27-11l-84 0 0-310q0-14-1-21t-8-13-23-6l-204 0 0 310-204 0 0-310-194 0q-28 0-35 10t-7 30l0 310-84 0q-22 0-27 11t11 27l400 402q16 16 38 16t38-16z" horiz-adv-x="900" />
80 80
81 <glyph glyph-name="flag-filled" unicode="&#xe824;" d="M640 693q25 25 57 11t32-47l0-418q0-21-15-36-80-80-193-80t-193 80q-47 46-110 50t-114-36l0-238q0-21-15-37t-36-15-37 15-16 37l0 678q0 21 15 36 80 80 193 80t193-80q50-50 120-50t119 50z" horiz-adv-x="729" />
82
81 83 <glyph glyph-name="git" unicode="&#xe82a;" d="M929 844h-858c-36 0-65-30-65-65v-857c0-36 30-65 65-65h857c36 0 65 30 65 65v857c1 35-29 65-64 65z m-729-549c4-11 9-20 14-27 6-8 14-14 22-18 9-4 19-6 29-6 9 0 16 1 24 2 7 2 14 4 20 7l6 51h-27c-4 0-8 1-10 4-2 1-3 5-3 7l5 39h105l-16-131c-8-7-16-12-25-15-9-4-18-8-28-10-10-3-18-5-30-7-10-1-21-2-33-2-20 0-38 4-54 11-16 8-30 18-41 30-12 13-20 28-27 45-6 18-10 36-10 56 0 18 3 34 7 50 3 17 10 30 17 44 8 14 16 25 26 36 10 12 22 20 34 28 13 7 26 14 41 17 15 4 30 7 47 7 13 0 25-2 36-4 11-3 21-6 29-10 8-4 16-9 22-14 6-5 13-11 18-16l-20-31c-4-5-9-8-14-9-5-1-10 0-16 4-5 3-10 6-14 8-5 3-9 5-14 7-5 1-10 2-15 3-5 2-11 2-17 2-14 0-27-3-38-9-11-6-21-14-29-25-8-10-15-24-18-38-5-15-7-31-7-48-1-14 2-27 4-38z m336-102h-71l39 315h71l-39-315z m343 258h-80l-33-258h-70l32 258h-80l7 57h231l-7-57z" horiz-adv-x="1000" />
82 84
83 85 <glyph glyph-name="hg" unicode="&#xe82d;" d="M927 841h-853c-36 0-65-29-65-65v-853c0-36 29-65 65-65h853c36 0 65 29 65 65v853c0 36-29 65-65 65z m-483-648h-70l16 133h-113l-17-133h-70l39 313h70l-16-132h113l16 132h71l-39-313z m177 101c3-11 8-20 14-27 7-8 14-14 23-18 8-4 18-6 28-6 9 0 16 1 23 3 7 1 14 3 20 6l6 51h-27c-4 0-7 1-9 3-3 3-3 6-3 9l5 39h104l-16-131c-8-6-16-11-25-15-9-5-18-8-27-11-9-2-19-4-30-6-10-1-21-2-33-2-19 0-37 4-53 11-16 7-30 17-41 29-11 13-20 28-26 45-7 17-10 35-10 55 0 17 2 34 6 50 4 15 10 30 17 43 7 14 16 26 26 36 10 11 22 20 34 28 13 7 27 13 41 17 14 4 30 7 46 7 13 0 25-2 36-4 11-3 20-6 29-10 8-4 16-9 23-14 7-5 13-11 18-17l-23-28c-4-5-8-8-13-9-5-1-11 0-16 3-5 4-10 7-14 9-5 3-9 5-14 6-4 2-9 3-14 4-5 1-11 1-17 1-14 0-27-3-38-8-11-6-21-14-29-25-8-10-15-23-19-38-5-15-7-31-7-49 0-13 2-26 5-37z" horiz-adv-x="1000" />
84 86
85 87 <glyph glyph-name="svn" unicode="&#xe82e;" d="M933 841h-852c-36 0-65-29-65-65v-853c0-36 29-65 65-65h852c36 0 66 29 66 65v853c0 36-30 65-66 65z m-765-438c3-4 7-7 13-10 5-3 11-6 18-8 7-3 14-5 21-8 7-3 14-6 21-10 7-4 13-9 18-14 5-6 10-13 13-20 3-8 5-18 5-29 0-16-3-30-8-44-6-14-14-26-24-37-10-10-22-18-37-24-15-7-31-10-49-10-9 0-18 1-27 3s-18 5-27 9c-8 4-16 8-23 13-7 5-13 10-18 17l25 32c2 3 4 5 7 6 3 2 6 3 9 3 4 0 8-2 12-4 3-3 8-6 12-10 5-3 10-6 16-9 6-3 14-4 23-4 13 0 23 3 30 10 7 7 10 18 10 32 0 6-1 12-4 16-4 4-8 7-13 10-5 3-11 6-18 8-7 2-14 5-21 7-7 3-14 6-21 9-6 4-12 8-18 14-5 6-9 13-12 21-3 8-5 18-5 30 0 14 3 28 8 40 5 13 12 25 22 35 10 9 22 17 36 23 14 6 29 9 47 9 9 0 17-1 26-3s16-4 23-8c7-3 14-7 20-11 6-5 11-10 15-15l-21-29c-2-3-5-6-7-7-3-2-6-3-9-3-3 0-7 1-10 3-3 3-7 5-11 8-4 2-9 4-14 7-5 2-12 3-19 3-6 0-12-1-17-3-5-2-9-4-12-8-4-3-6-7-8-11-1-5-2-10-2-15 0-5 2-10 5-14z m312-210h-64l-77 313h57c6 0 10-1 14-4 4-3 6-6 7-11l32-173c2-7 4-14 6-23 1-8 3-17 4-26 3 9 6 18 9 26 4 9 7 16 11 23l73 173c1 2 2 4 4 6 2 2 4 3 6 5 2 1 4 2 7 3 3 1 5 1 8 1h57l-154-313z m423 0h-37c-5 0-10 1-13 2-4 2-7 5-10 9l-109 194c-1-4-1-8-1-12-1-4-1-7-1-10l-22-183h-62l39 313h37c3 0 6 0 8 0 2 0 4-1 5-1 2-1 3-2 4-4s3-3 5-5l110-194c0 5 0 10 1 14 0 5 1 9 1 13l21 177h62l-38-313z" horiz-adv-x="1000" />
86 88
87 89 <glyph glyph-name="comment-add" unicode="&#xe82f;" d="M952 258v317c0 7 0 13 0 20-1 12-4 24-8 36-7 22-20 43-37 59-16 17-36 30-58 37-12 4-25 7-37 8-7 1-13 1-19 1h-576c-13 0-26 0-38-2-13-2-25-5-36-10-22-9-41-23-57-40-15-18-27-39-33-62-3-12-5-25-5-38-1-13 0-26 0-39v-557c0-9 5-17 13-21 6-3 15-3 21 0 3 1 5 3 7 5 2 2 4 5 7 7 4 5 9 9 14 14l28 28c9 10 19 19 28 29 9 9 19 18 28 27 4 5 8 9 14 10 2 1 5 1 8 1h567c13 0 25 0 38 2 24 4 47 13 66 27 19 13 35 31 46 51 12 22 19 46 19 71 1 6 0 13 0 19z m-69 307v-317c0-7 0-13 0-19-1-6-3-13-5-18-4-10-9-20-16-28-15-17-37-27-59-28-7 0-13 0-19 0h-576c-7 0-13 0-20 0-3 0-6 0-9-1-3-1-5-2-7-4-2-2-4-4-6-6-3-2-5-4-7-7-5-4-10-9-14-14-10-9-19-18-28-28v485c0 12 2 24 7 35 4 10 10 19 18 27 16 16 38 25 60 25h590c6 0 12 0 18-1 22-3 42-15 56-33 7-9 12-20 15-31 1-5 2-12 2-18 1-6 0-13 0-19z m-214-117h-131c-4 0-11 8-11 12v126c0 8-8 16-12 16h-50c-7 0-15-8-15-12v-130c0-4-8-12-12-12h-126c-8 0-16-8-16-11v-50c0-8 8-16 12-16h127c7 0 15-7 15-11v-127c0-8 8-15 11-15h50c8 0 16 7 16 11v127c0 8 7 15 11 15h127c8 0 15 8 15 12v50c0 7-7 15-11 15z" horiz-adv-x="1000" />
88 90
89 91 <glyph glyph-name="comment-toggle" unicode="&#xe830;" d="M798 736h-596c-85 0-154-69-154-155v-593c0-19 22-29 36-20 2 1 5 3 7 5l109 109c2 2 5 4 8 5 2 1 4 1 6 1h584c85 0 154 69 154 155v338c0 86-69 155-154 155z m-680-639v484c0 47 38 85 86 85h476c-86-84-504-511-509-515l-53-54z" horiz-adv-x="1000" />
90 92
91 93 <glyph glyph-name="rhodecode" unicode="&#xe831;" d="M175 633c-2-4-3-8-4-12-3-10-6-20-9-30-3-13-7-25-11-38-3-11-6-23-10-35-2-7-4-15-6-22-1-1-1-2-1-4 0 0 0 0 0 0 0-1 1-2 1-2 2-7 5-14 7-21 4-11 8-22 12-33 4-12 9-25 13-37 4-11 8-23 12-34 3-7 5-14 7-21 1-1 1-2 2-3 0-1 1-1 1-2 4-6 8-12 11-17 7-10 13-19 19-29 7-11 14-22 22-33 6-10 13-21 20-31 5-7 9-15 14-22 1-2 3-4 4-5 0-1 1-1 1-2 3-3 6-5 8-8 7-6 13-12 19-19 9-8 17-16 25-24 10-10 19-19 29-28 9-9 18-18 27-27 8-8 16-15 23-23 5-5 11-10 16-15 1-1 3-3 5-5 7-5 14-10 21-15 11-8 21-15 31-23 4-2 7-5 11-7 0-1 1-2 2-2 0 0 0-1 1 0 7 3 14 7 21 11 11 6 23 11 34 17 6 4 12 7 19 10 0 0 0 1 1 1 1 2 2 3 3 5 4 5 8 10 13 15 6 8 12 16 18 24 8 9 15 19 23 28 8 11 16 21 24 31 8 11 16 21 24 31 8 10 15 19 23 28 6 8 12 16 18 24 4 5 8 10 12 15 2 2 3 3 4 5 0 0 0 0 0 0-1 1-2 1-3 1-3 0-6 1-9 2-5 1-10 2-15 3-6 2-13 4-20 5-8 3-16 5-24 7-9 3-19 6-28 9-10 3-21 7-31 11-12 4-23 8-34 13-12 5-24 10-36 15-13 6-26 12-38 18-13 7-26 14-39 21-13 7-27 15-39 23-14 9-27 17-40 27-13 9-26 19-39 29-13 11-25 22-37 33-13 11-25 23-36 36-12 13-23 26-34 40-11 14-21 28-31 43-9 15-19 31-27 47 0 1 0 1 0 1z m-3 3c-1-5-3-9-4-14-3-10-7-21-10-32-4-12-8-25-12-37-3-10-6-20-9-30-1-3-2-6-3-8 0-1 0-2 0-2 1-5 3-10 5-15 3-10 6-20 10-30 4-12 8-24 12-37 4-12 8-24 12-36 3-9 6-18 9-26 1-3 1-5 2-8 0 0 1-1 1-2 2-4 5-8 7-12 5-10 10-19 15-28 6-11 12-23 19-34 6-11 12-22 18-33 4-8 8-15 12-23 1-2 2-4 4-6 4-5 8-9 13-14 7-8 15-16 23-24 9-10 18-20 26-29 9-9 17-18 25-26 5-6 10-11 15-17 2-1 3-3 5-5 5-5 11-11 17-17 9-8 17-17 26-26 9-9 18-18 27-27 7-7 14-14 21-21 2-2 3-3 5-5 0 0 1-1 1-1 0 0 1 0 1 0 11 2 22 3 32 5 9 1 17 2 26 3 0 0 1 1 1 1 1 1 2 3 4 4 4 5 9 10 13 15 7 8 14 15 20 22 9 9 17 18 25 27 9 10 18 20 27 30 8 9 17 19 26 29 8 9 16 17 24 26 7 7 13 15 20 22 4 5 8 9 13 14 1 1 2 2 3 3 0 1 1 1 1 1 0 1-3 1-3 1-3 1-7 2-10 3-4 2-9 3-14 5-6 2-13 4-19 6-8 3-16 6-24 9-9 3-18 7-27 11-10 4-20 8-30 13-11 5-22 10-33 16-12 5-23 11-35 18-12 6-24 13-36 20-12 8-25 16-37 24-13 8-25 17-37 26-13 10-25 19-38 29-12 11-24 21-36 33-12 11-24 23-35 35-11 13-22 25-33 39-10 13-21 27-30 42-10 15-19 30-27 45-9 16-17 32-24 48z m-2 10c-1-4-2-8-3-11-1-10-3-19-5-29-2-12-5-25-7-37-3-13-5-26-8-39-1-10-3-20-5-30-1-5-2-10-3-15 0-1 0-1 0-2 1-3 2-5 3-8 3-9 7-19 10-29 4-12 9-25 13-37 4-11 8-22 11-33 2-5 4-11 6-16 0-1 1-2 1-2 1-3 2-5 4-7 4-9 8-18 13-27 6-12 11-23 17-35 6-11 11-22 17-33 3-7 7-14 11-21 0-2 1-3 1-4 1-1 2-1 2-2 5-6 9-11 14-17 8-9 15-18 22-27 9-10 17-20 26-30 7-9 15-18 22-27 5-6 10-11 15-17 0-1 1-2 2-3 0 0 0 0 0 0 1-1 2-1 3-2 7-4 14-9 21-14 10-7 21-14 31-22 11-7 21-14 31-20 6-4 12-9 18-13 3-2 7-5 10-8 10-8 19-16 29-24 7-5 13-11 20-17 1 0 1 0 1 1 1 1 2 2 3 3 4 4 8 8 12 13 6 6 12 13 18 20 8 8 16 17 23 25 9 10 18 19 26 29 9 9 18 19 27 29 9 9 18 19 26 28 8 9 16 17 23 26 6 6 13 13 19 20 4 4 7 8 11 12 1 2 3 3 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0-3 1-3 1-3 1-6 2-9 2-5 2-10 4-15 5-6 2-12 5-18 7-8 3-16 6-24 9-8 4-17 8-26 12-10 4-20 9-30 13-11 6-22 11-32 16-12 6-23 13-35 19-12 7-23 14-35 21-13 8-25 16-37 24-12 8-25 17-37 26-12 9-24 19-36 29-13 10-25 21-36 32-12 11-24 22-35 34-12 12-22 25-33 38-11 13-21 26-30 40-10 14-19 29-28 44-9 15-17 30-24 46-4 10-8 20-12 30z m696 21c-2 4-5 7-9 9-5 3-11 5-16 8-11 4-23 9-34 13-23 8-47 14-71 20-24 6-49 12-74 17-25 6-50 10-76 15-25 4-50 8-75 10-13 1-26 1-39 0-6-1-13-2-19-3-6-1-13-2-19-3-26-4-51-9-77-14-25-5-50-10-75-16-25-5-49-12-74-20-12-4-24-9-36-13-6-3-11-5-17-8-3-1-6-2-9-3-3-1-5-2-8-4-4-2-7-5-10-9-1-2-2-4-3-7-1-3-2-6-3-9-4-11-7-24-9-36-5-24-7-49-6-74 0-13 1-25 3-38 1-12 3-25 5-37 5-25 12-50 20-74 4-12 8-24 13-36 4-11 10-22 15-33 10-21 21-42 34-62 12-20 25-39 39-58 14-19 28-37 43-55 16-18 33-36 50-54 17-18 34-35 52-52 18-17 36-33 55-49 10-7 19-15 28-22 10-8 19-15 28-23 2-2 5-4 7-7 0 0 1-1 1-1 0 0 1 0 1 0 0 0 1 0 2 0 4 4 9 8 14 11 9 8 19 15 28 23 18 15 36 31 54 47 18 16 35 32 52 49 17 16 33 34 49 51 16 18 32 37 47 56 14 18 28 38 41 57 13 20 25 40 36 61 11 21 21 43 30 65 9 22 17 45 23 68 6 23 11 47 13 70 3 24 3 49 2 73 0 3-1 6-2 9 0 3-1 6-2 9-1 6-2 12-3 18-3 11-5 22-8 33-4 9-7 19-11 28-2 5 13-29 0 0z m-51-210c-7-25-15-49-26-73-9-22-19-44-30-64-12-21-24-40-37-59-13-19-27-38-42-56-15-18-31-36-47-54-17-18-34-36-52-53-18-17-37-34-56-50-9-7-19-15-28-23-1 0-2-1-2-1-1 0-2 0-2 0-1 0-2 1-2 1 0 0-1 1-1 1-2 1-3 3-4 4-4 3-9 7-14 11-2 1-4 3-7 5-2 2-4 4-6 6-5 4-9 8-14 13-9 8-18 17-27 25-10 9-18 18-27 27-4 4-8 9-13 13-4 4-8 9-12 13-17 17-33 35-49 53-15 18-30 37-44 57-14 20-27 40-38 61-12 21-23 42-32 64-10 22-18 45-25 67-2 6-4 12-5 19-1 6-2 12-3 19-2 13-4 26-4 39-1 13-2 26-1 39 0 12 1 25 3 37 0 4 0 7 1 10 0 1 0 3 0 5 1 1 1 3 1 4 0 3 1 5 2 7 0 2 0 3 0 4 0 1 1 2 2 3 1 0 2 1 3 2 0 0 1 0 1 1 1 0 2 0 3 1 3 1 6 2 9 3 6 2 12 5 18 7 23 8 47 16 72 23 12 3 24 6 37 9 6 1 12 2 18 4 7 1 13 2 19 4 26 5 51 9 77 13 13 1 26 3 39 5 3 0 7 1 10 1 1 1 3 1 4 1 2 0 3 0 4 0 6 0 12 0 17-1 1 0 2-1 4-1 1 0 3-1 4-1 3 0 6-1 9-1 7-1 13-2 19-3 13-2 25-4 38-6 25-4 51-8 76-13 25-6 50-12 75-19 12-4 24-8 37-12 6-2 12-4 18-6 3-1 6-2 9-3 1-1 3-1 4-2 1 0 1 0 2 0 1-1 2-1 2-1 2-2 3-2 4-4 1-1 1-1 1-2 0-1 0-2 0-2 1-1 1-2 1-3 2-6 3-13 4-19 1-7 2-13 3-20 0-3 0-6 0-9 0-1 0-2 0-2 0-1 0-2 0-3 1-1 1-3 1-5 5-23 7-48 5-72-1-13-3-26-6-38-8-29 8 35 0 0z m-197 0c-2 4-3 9-5 13 0 1 0 1 0 2-1 0 0 1-1 1 0 1 0 2 0 2 0 1-1 2-1 3-1 2-3 4-4 5-2 2-5 4-7 4 2 2 4 3 7 5 1 1 2 2 3 2 1 1 2 1 2 2 0 1 0 1 0 2 1 0 1 1 2 1 0 1 1 2 1 4 0 2 0 4 0 6 0 3 0 5 0 7 0 3 0 5-1 7-1 6-4 10-8 14-1 2-3 3-5 4-3 2-5 4-8 5-3 1-6 2-9 3-3 0-5 0-7 0-3 0-6 0-8 0-13 0-25 0-37 0-5 0-10 0-14 0-1 0-2 0-3 0 0 0 0-4 0-5 0-3 0-6 0-9 0-1 0-2 0-3 0-1 0-1 1-1 1 0 12 0 12 0 0-8 0-16 0-24 0-13 0-25 0-38 0-4 0-7 0-11 0 0 0-1 0-1-3 0-5 0-8 0-1 0-2 0-4 0 0 0-1 0-1-1 0-2 0-4 0-6 0-1 0-14 0-14 10 0 19 0 29 0 5 0 11 0 16 0 1 0 3 0 4 0 0 0 0 3 0 3 0 6 0 11 0 17 0 1 0 1-1 1-1 0-2 0-4 0-1 0-3 0-4 0 0 0-1-1-1 0 0 5 0 10 0 15 0 2 0 5 0 8 0 1 0 1 0 2 0 0 0 0 1 0 2 0 5 0 8 0 2 0 4 0 6 0 1 0 3 0 4 0 1 0 2-1 3-2 1-1 2-2 3-3 0-1 0-1 0-2 0-2 1-3 1-4 1-1 1-2 2-3 0-1 0-1 0-1 0-1 0-2 0-2 1-6 2-12 3-17 1-3 1-5 2-8 0 0 0-1 0-1 0 0 0 0 0 0 11 0 21 0 32 0 0 0 1 0 1 0 0 0 0 0 0 0 0 3 0 5 0 8 0 5 0 10 0 15 0 0 0 0 0 0-1-2-1-4-2-5z m-26 53c0-2-3-3-4-4-1 0-1-1-1-1 0 0-1 0-1 0 0 0-1 0-1 0-1-1-1-2-2-2-1 0-2 0-3 0-2 0-4 0-5 0-1 0-2 0-2 0-3 0-7 0-10 0 0 0-4 0-4 0 0 9 0 19 0 28 0 0 13 0 14 0 4 0 8 0 12-1 1 0 3-1 4-2 1 0 2-1 3-2 1-2 2-4 3-6 0-1 0-1 0-2-1-1-1-1-1-2-1-1-1-1-1-2-1-1-1-2-1-4z m131-53c0 9 0 18 0 27 0 9-2 18-8 24-7 7-19 8-28 7-2 0-4 0-6-1-1 0-1-1-2-2-1 0-2 0-2-1-3-1-6-3-8-6 0 9 0 18 0 27 0 6 0 12 0 18 0 2 0 3 0 5 0 1 0 1 0 1-11 0-22 0-32 0-1 0-3 0-4 0 0 0 0-4 0-4 0-5 0-11 0-16 0 0 1 0 1 0 1 0 3 0 4 0 3 0 5 0 8 0 0 0 0-5 0-6 0-11 0-23 0-34 0-11 0-22 0-33 0-1 0-2 0-3 0-1 0-1-1-1-3 0-6 0-9 0-1 0-2 0-3 0 0 0 0-1 0-1 0-6 0-11 0-17 0-1 0-1 0-2 0 0 0 0 0 0 2 0 3 0 4 0 12 0 24 0 36 0 0 0 9 0 9 0 0 5 0 10 0 15 0 1 0 3 0 5 0 0-6 0-7 0 0 0-6 0-6 0 0 1 0 3 0 4 0 6 0 12 0 18 0 3 0 5 0 7 0 1 0 1 0 2 0 0 1 1 2 2 1 1 2 2 3 2 1 1 1 1 2 1 1 0 1 0 1 1 2 1 3 1 4 1 3 1 5 0 7-1 1-1 2-2 3-3 1-1 2-2 2-3 1-2 1-4 1-6 0-3 0-7 0-11 0-11 0-22 0-33 0-1 0-2 1-2 1 0 3 0 5 0 6 0 12 0 19 0 3 0 7 0 11 0 0 0 0 14 0 15 0 2 0 4 0 6-2-1-5-2-7-2z m7 122c-2 0-5 0-7 0-1 0-2 0-3 0 0 0 0 0 0 0-3-5-7-10-10-14-1-2-3-5-4-7 0 0-1-1-1-2 0 0 0-1 0-1 0-1 0-4 0-4 0 0 1 0 2 0 3 0 5 0 8 0 3 0 5 0 8 0 0 0 0-1 0-1 0-1 0-3 0-4 0-2 0-3 0-4 0-1 0-1 1-1 1 0 3 0 4 0 1 0 2 0 2 0 0 3 0 6 0 8 0 1 0 2 1 2 1 0 2 0 4 0 0 0 0 0 0 0 0 1 0 1 0 2 0 0 0 3 0 3-1 0-2 0-3 0-1 0-2 0-2 1 0 7 0 15 0 22z m-7-15c0-1 0-2 0-4 0-1 0-1 0-2 0 0 0-1 0-2 0 0-1 0-1 0-1 0-2 0-3 0-1 0-3 0-4 0 1 2 3 4 4 6 1 1 1 2 2 3 1 2 2 4 2 7 0-3 0-5 0-8z m41-2c-3 2-8 2-11 2-1 0-2 0-2 0 0 0 0 1 0 1 0 2 0 3 0 4 0 0 13 0 14 0 1 0 1 0 1 1 0 1 0 2 0 4 0 1 0 2 0 3 0 0-1 0-1 0-6 0-11 0-17 0-1 0-1 0-2 0 0 0 0-1 0-1-1-2-1-4-1-6-1-5-1-9-2-14 4 0 9 1 12-1 3-1 4-4 4-7-1-4-5-4-7-4-2 0-9-1-9 2-1-2-1-5-2-8 1 0 3-1 5-1 2-1 5-1 7-1 4 0 8 2 11 5 2 3 2 7 2 11 0 2 0 5 0 7 0 1-1 2-2 3 0 0 0 0 0 0-3 2 2 0 0 0z" horiz-adv-x="1000" />
92 94
93 95 <glyph glyph-name="up" unicode="&#xe832;" d="M687 254l-173 217c-8 9-22 9-29 0l-173-217c-9-12-1-29 15-29h345c16 0 24 17 15 29z" horiz-adv-x="1000" />
94 96
95 97 <glyph glyph-name="merge" unicode="&#xe833;" d="M200 110c0-72 58-131 130-131s130 59 130 131c0 45-24 86-60 109 18 139 133 179 202 190v-301c-38-23-65-64-65-112 0-72 59-130 130-130s130 58 130 130c0 48-26 89-65 112v487c39 23 65 64 65 112 0 72-58 130-130 130s-130-58-130-130c0-48 27-89 65-112v-55c-60-8-162-32-238-108-54-54-86-124-94-208-42-22-70-65-70-114z m468-158c-24 0-44 20-44 43s20 44 44 44c24 0 43-20 43-44s-19-43-43-43z m0 798c24 0 43-19 43-43s-20-43-43-43c-24 0-44 19-44 43s20 43 44 43z m-338-684c-24 0-43 20-43 43s19 44 43 44c24 0 43-20 43-44s-19-43-43-43z" horiz-adv-x="1000" />
96 98
97 99 <glyph glyph-name="spin-alt" unicode="&#xe834;" d="M498 850c-114 0-228-39-320-116l0 0c173 140 428 130 588-31 134-134 164-332 89-495-10-29-5-50 12-68 21-20 61-23 84 0 3 3 12 15 15 24 71 180 33 393-112 539-99 98-228 147-356 147z m-409-274c-14 0-29-5-39-16-3-3-13-15-15-24-71-180-34-393 112-539 185-185 479-195 676-31l0 0c-173-140-428-130-589 31-134 134-163 333-89 495 11 29 6 50-12 68-11 11-27 17-44 16z" horiz-adv-x="1001" />
98 100
99 101 <glyph glyph-name="spin" unicode="&#xe838;" d="M462 850c-6 0-11-5-11-11l0-183 0 0c0-6 5-11 11-11l69 0c1 0 1 0 1 0 7 0 12 5 12 11l0 183 0 0c0 6-5 11-12 11l-69 0c0 0 0 0-1 0z m250-47c-4 1-8-2-10-5l-91-158 0 0c-4-6-2-13 4-16l60-34c0-1 0-1 0-1 6-3 13-1 16 4l91 158c3 6 2 13-4 16l-61 35c-1 1-3 1-5 1z m-428-2c-2 0-4-1-6-2l-61-35c-5-3-7-10-4-16l91-157c0 0 0 0 0 0 3-6 10-8 16-5l61 35c5 4 7 11 4 16l-91 157c0 1 0 1 0 1-2 4-6 6-10 6z m620-163c-2 0-4 0-6-1l-157-91c0 0 0 0 0 0-6-3-8-10-5-16l35-61c4-5 11-7 16-4l157 91c1 0 1 0 1 0 6 3 7 11 4 16l-35 61c-2 4-6 6-10 5z m-810-4c-5 0-9-2-11-6l-35-61c-3-5-1-12 4-15l158-91 0 0c6-4 13-2 16 4l35 60c0 0 0 0 0 0 3 6 1 13-4 16l-158 91c-2 1-4 2-5 2z m712-235l0 0c-6 0-11-5-11-11l0-69c0-1 0-1 0-1 0-7 5-12 11-12l183 0 0 0c6 0 11 5 11 12l0 69c0 0 0 0 0 1 0 6-5 11-11 11l-183 0z m-794-5l0 0c-7 0-12-5-12-12l0-69c0 0 0 0 0-1 0-6 5-11 12-11l182 0 0 0c6 0 11 5 11 11l0 69c0 1 0 1 0 1 0 7-5 12-11 12l-182 0z m772-153c-4 0-8-2-10-6l-34-60c-1 0-1 0-1 0-3-6-1-13 4-16l158-91c6-3 13-1 16 4l35 61c3 5 1 12-4 15l-158 92 0 0c-2 1-4 1-6 1z m-566-5c-1 0-3 0-5-1l-157-91c0 0-1 0-1 0-5-3-7-10-4-16l35-61c3-5 10-7 16-4l157 91c0 0 0 0 0 0 6 3 8 10 5 16l-35 61c-3 3-7 6-11 5z m468-121c-2 0-4 0-6-1l-61-35c-5-4-7-11-4-16l91-157c0-1 0-1 0-1 3-6 11-7 16-4l61 35c5 3 7 10 4 16l-91 157c0 0 0 0 0 0-2 4-6 6-10 6z m-367-2c-4 0-8-2-10-6l-91-158c-3-6-1-13 4-16l61-35c5-3 12-1 15 4l92 158 0 0c3 6 1 13-5 16l-60 35c0 0 0 0 0 0-2 1-4 1-6 2z m149-58c-7 0-12-5-12-11l0-183 0 0c0-6 5-11 12-11l69 0c0 0 0 0 1 0 6 0 11 5 11 11l0 183 0 0c0 6-5 11-11 11l-69 0c-1 0-1 0-1 0z" horiz-adv-x="1000" />
100 102
101 103 <glyph glyph-name="docs" unicode="&#xf0c5;" d="M946 636q23 0 38-16t16-38v-678q0-23-16-38t-38-16h-535q-23 0-38 16t-16 38v160h-303q-23 0-38 16t-16 38v375q0 22 11 49t27 42l228 228q15 16 42 27t49 11h232q23 0 38-16t16-38v-183q38 23 71 23h232z m-303-119l-167-167h167v167z m-357 214l-167-167h167v167z m109-361l176 176v233h-214v-233q0-22-15-37t-38-16h-233v-357h286v143q0 22 11 49t27 42z m534-449v643h-215v-232q0-22-15-38t-38-15h-232v-358h500z" horiz-adv-x="1000" />
102 104
103 105 <glyph glyph-name="menu" unicode="&#xf0c9;" d="M857 100v-71q0-15-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 25t25 11h785q15 0 26-11t10-25z m0 286v-72q0-14-10-25t-26-10h-785q-15 0-25 10t-11 25v72q0 14 11 25t25 10h785q15 0 26-10t10-25z m0 285v-71q0-14-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 26t25 10h785q15 0 26-10t10-26z" horiz-adv-x="857.1" />
104 106
107 <glyph glyph-name="sort" unicode="&#xf0dc;" d="M571 243q0-15-10-25l-250-250q-11-11-25-11t-25 11l-250 250q-11 10-11 25t11 25 25 11h500q14 0 25-11t10-25z m0 214q0-14-10-25t-25-11h-500q-15 0-25 11t-11 25 11 25l250 250q10 11 25 11t25-11l250-250q10-10 10-25z" horiz-adv-x="571.4" />
108
105 109 <glyph glyph-name="paste" unicode="&#xf0ea;" d="M429-79h500v358h-233q-22 0-37 15t-16 38v232h-214v-643z m142 804v36q0 7-5 12t-12 6h-393q-7 0-13-6t-5-12v-36q0-7 5-13t13-5h393q7 0 12 5t5 13z m143-375h167l-167 167v-167z m286-71v-375q0-23-16-38t-38-16h-535q-23 0-38 16t-16 38v89h-303q-23 0-38 16t-16 37v750q0 23 16 38t38 16h607q22 0 38-16t15-38v-183q12-7 20-15l228-228q16-15 27-42t11-49z" horiz-adv-x="1000" />
106 110
107 111 <glyph glyph-name="doc-text" unicode="&#xf0f6;" d="M819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 17-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 16t-16 37v233h-429v-858h715z m-572 483q0 7 5 12t13 5h393q8 0 13-5t5-12v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36z m411-125q8 0 13-5t5-13v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36q0 8 5 13t13 5h393z m0-143q8 0 13-5t5-13v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36q0 8 5 13t13 5h393z" horiz-adv-x="857.1" />
108 112
109 113 <glyph glyph-name="plus-squared" unicode="&#xf0fe;" d="M714 314v72q0 14-10 25t-25 10h-179v179q0 15-11 25t-25 11h-71q-15 0-25-11t-11-25v-179h-178q-15 0-25-10t-11-25v-72q0-14 11-25t25-10h178v-179q0-14 11-25t25-11h71q15 0 25 11t11 25v179h179q14 0 25 10t10 25z m143 304v-536q0-66-47-113t-114-48h-535q-67 0-114 48t-47 113v536q0 66 47 113t114 48h535q67 0 114-48t47-113z" horiz-adv-x="857.1" />
110 114
115 <glyph glyph-name="angle-left" unicode="&#xf104;" d="M350 546q0-7-6-12l-219-220 219-219q6-6 6-13t-6-13l-28-28q-5-5-12-5t-13 5l-260 261q-6 5-6 12t6 13l260 260q5 6 13 6t12-6l28-28q6-5 6-13z" horiz-adv-x="357.1" />
116
117 <glyph glyph-name="angle-right" unicode="&#xf105;" d="M332 314q0-7-5-12l-261-261q-5-5-12-5t-13 5l-28 28q-6 6-6 13t6 13l219 219-219 220q-6 5-6 12t6 13l28 28q5 6 13 6t12-6l261-260q5-5 5-13z" horiz-adv-x="357.1" />
118
119 <glyph glyph-name="angle-up" unicode="&#xf106;" d="M600 189q0-7-6-12l-28-28q-5-6-12-6t-13 6l-220 219-219-219q-5-6-13-6t-12 6l-28 28q-6 5-6 12t6 13l260 260q5 6 12 6t13-6l260-260q6-5 6-13z" horiz-adv-x="642.9" />
120
121 <glyph glyph-name="angle-down" unicode="&#xf107;" d="M600 439q0-7-6-12l-260-261q-5-5-13-5t-12 5l-260 261q-6 5-6 12t6 13l28 28q5 6 12 6t13-6l219-219 220 219q5 6 13 6t12-6l28-28q6-5 6-13z" horiz-adv-x="642.9" />
122
123 <glyph glyph-name="circle-empty" unicode="&#xf10c;" d="M429 654q-83 0-153-41t-110-111-41-152 41-152 110-111 153-41 152 41 110 111 41 152-41 152-110 111-152 41z m428-304q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
124
125 <glyph glyph-name="circle" unicode="&#xf111;" d="M857 350q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
126
111 127 <glyph glyph-name="folder-empty" unicode="&#xf114;" d="M857 118v393q0 22-15 38t-38 15h-393q-23 0-38 16t-16 38v36q0 22-15 38t-38 15h-179q-22 0-38-15t-16-38v-536q0-22 16-38t38-16h679q22 0 38 16t15 38z m72 393v-393q0-51-37-88t-88-37h-679q-51 0-88 37t-37 88v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h375q51 0 88-37t37-88z" horiz-adv-x="928.6" />
112 128
113 129 <glyph glyph-name="folder-open-empty" unicode="&#xf115;" d="M994 331q0 19-30 19h-607q-22 0-48-12t-39-29l-164-203q-11-13-11-22 0-20 30-20h607q23 0 48 13t40 29l164 203q10 12 10 22z m-637 90h429v90q0 22-16 38t-38 15h-321q-23 0-38 16t-16 38v36q0 22-15 38t-38 15h-179q-22 0-38-15t-16-38v-476l143 175q25 30 65 49t78 19z m708-90q0-35-25-67l-165-203q-24-30-65-49t-78-19h-607q-51 0-88 37t-37 88v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h303q52 0 88-37t37-88v-90h107q30 0 56-13t37-40q8-17 8-37z" horiz-adv-x="1071.4" />
114 130
131 <glyph glyph-name="code" unicode="&#xf121;" d="M344 69l-28-28q-5-5-12-5t-13 5l-260 261q-6 5-6 12t6 13l260 260q5 6 13 6t12-6l28-28q6-5 6-13t-6-12l-219-220 219-219q6-6 6-13t-6-13z m330 596l-208-721q-2-7-9-11t-13-1l-34 9q-8 3-11 9t-2 14l209 720q2 8 8 11t13 2l35-10q7-2 11-9t1-13z m367-363l-260-261q-6-5-13-5t-13 5l-28 28q-5 6-5 13t5 13l219 219-219 220q-5 5-5 12t5 13l28 28q6 6 13 6t13-6l260-260q5-5 5-13t-5-12z" horiz-adv-x="1071.4" />
132
133 <glyph glyph-name="info" unicode="&#xf129;" d="M357 100v-71q0-15-10-25t-26-11h-285q-15 0-25 11t-11 25v71q0 15 11 25t25 11h35v214h-35q-15 0-25 11t-11 25v71q0 15 11 25t25 11h214q15 0 25-11t11-25v-321h35q15 0 26-11t10-25z m-71 643v-107q0-15-11-25t-25-11h-143q-14 0-25 11t-11 25v107q0 14 11 25t25 11h143q15 0 25-11t11-25z" horiz-adv-x="357.1" />
134
115 135 <glyph glyph-name="minus-squared" unicode="&#xf146;" d="M714 314v72q0 14-10 25t-25 10h-500q-15 0-25-10t-11-25v-72q0-14 11-25t25-10h500q14 0 25 10t10 25z m143 304v-536q0-66-47-113t-114-48h-535q-67 0-114 48t-47 113v536q0 66 47 113t114 48h535q67 0 114-48t47-113z" horiz-adv-x="857.1" />
116 136
117 137 <glyph glyph-name="minus-squared-alt" unicode="&#xf147;" d="M643 404v-36q0-8-5-13t-13-5h-464q-8 0-13 5t-5 13v36q0 7 5 12t13 5h464q8 0 13-5t5-12z m71-250v464q0 37-26 63t-63 26h-464q-37 0-63-26t-27-63v-464q0-37 27-63t63-27h464q37 0 63 27t26 63z m72 464v-464q0-67-47-114t-114-47h-464q-67 0-114 47t-47 114v464q0 66 47 113t114 48h464q66 0 114-48t47-113z" horiz-adv-x="785.7" />
118 138
119 139 <glyph glyph-name="doc-inv" unicode="&#xf15b;" d="M571 564v264q13-8 21-16l227-228q8-7 16-20h-264z m-71-18q0-22 16-37t38-16h303v-589q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h446v-304z" horiz-adv-x="857.1" />
120 140
121 141 <glyph glyph-name="doc-text-inv" unicode="&#xf15c;" d="M819 584q8-7 16-20h-264v264q13-8 21-16z m-265-91h303v-589q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h446v-304q0-22 16-37t38-16z m89-411v36q0 8-5 13t-13 5h-393q-8 0-13-5t-5-13v-36q0-8 5-13t13-5h393q8 0 13 5t5 13z m0 143v36q0 8-5 13t-13 5h-393q-8 0-13-5t-5-13v-36q0-8 5-13t13-5h393q8 0 13 5t5 13z m0 143v36q0 7-5 12t-13 5h-393q-8 0-13-5t-5-12v-36q0-8 5-13t13-5h393q8 0 13 5t5 13z" horiz-adv-x="857.1" />
122 142
123 143 <glyph glyph-name="plus-squared-alt" unicode="&#xf196;" d="M643 404v-36q0-8-5-13t-13-5h-196v-196q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v196h-196q-8 0-13 5t-5 13v36q0 7 5 12t13 5h196v197q0 8 5 13t13 5h36q8 0 13-5t5-13v-197h196q8 0 13-5t5-12z m71-250v464q0 37-26 63t-63 26h-464q-37 0-63-26t-27-63v-464q0-37 27-63t63-27h464q37 0 63 27t26 63z m72 464v-464q0-67-47-114t-114-47h-464q-67 0-114 47t-47 114v464q0 66 47 113t114 48h464q66 0 114-48t47-113z" horiz-adv-x="785.7" />
124 144
125 145 <glyph glyph-name="file-code" unicode="&#xf1c9;" d="M819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 17-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 16t-16 37v233h-429v-858h715z m-518 500q4 7 12 7t13-3l28-21q7-5 7-12t-3-13l-102-136 102-136q4-6 3-13t-7-12l-28-21q-6-4-13-4t-12 7l-126 168q-8 11 0 22z m447-167q8-11 0-22l-126-168q-4-6-11-7t-14 4l-28 21q-6 5-7 12t3 13l102 136-102 136q-4 6-3 13t7 12l28 21q6 4 14 3t11-7z m-346-258q-7 1-11 8t-3 13l77 464q1 7 7 11t14 3l35-5q7-2 11-8t3-13l-77-464q-1-7-7-11t-13-3z" horiz-adv-x="857.1" />
126 146
127 147 <glyph glyph-name="history" unicode="&#xf1da;" d="M857 350q0-87-34-166t-91-137-137-92-166-34q-96 0-183 41t-147 114q-4 6-4 13t5 11l76 77q6 5 14 5 9-1 13-7 41-53 100-82t126-29q58 0 110 23t92 61 61 91 22 111-22 111-61 91-92 61-110 23q-55 0-105-20t-90-57l77-77q17-16 8-38-10-23-33-23h-250q-15 0-25 11t-11 25v250q0 24 22 33 22 10 39-8l72-72q60 57 137 88t159 31q87 0 166-34t137-92 91-137 34-166z m-357 161v-250q0-8-5-13t-13-5h-178q-8 0-13 5t-5 13v35q0 8 5 13t13 5h125v197q0 8 5 13t12 5h36q8 0 13-5t5-13z" horiz-adv-x="857.1" />
128 148
149 <glyph glyph-name="circle-thin" unicode="&#xf1db;" d="M429 707q-73 0-139-28t-114-76-76-114-29-139 29-139 76-113 114-77 139-28 138 28 114 77 76 113 29 139-29 139-76 114-114 76-138 28z m428-357q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
150
129 151 <glyph glyph-name="sliders" unicode="&#xf1de;" d="M196 64v-71h-196v71h196z m197 72q14 0 25-11t11-25v-143q0-14-11-25t-25-11h-143q-14 0-25 11t-11 25v143q0 15 11 25t25 11h143z m89 214v-71h-482v71h482z m-357 286v-72h-125v72h125z m732-572v-71h-411v71h411z m-536 643q15 0 26-10t10-26v-142q0-15-10-25t-26-11h-142q-15 0-25 11t-11 25v142q0 15 11 26t25 10h142z m358-286q14 0 25-10t10-25v-143q0-15-10-25t-25-11h-143q-15 0-25 11t-11 25v143q0 14 11 25t25 10h143z m178-71v-71h-125v71h125z m0 286v-72h-482v72h482z" horiz-adv-x="857.1" />
130 152
131 153 <glyph glyph-name="trash" unicode="&#xf1f8;" d="M286 82v393q0 8-5 13t-13 5h-36q-8 0-13-5t-5-13v-393q0-8 5-13t13-5h36q8 0 13 5t5 13z m143 0v393q0 8-5 13t-13 5h-36q-8 0-13-5t-5-13v-393q0-8 5-13t13-5h36q8 0 13 5t5 13z m142 0v393q0 8-5 13t-12 5h-36q-8 0-13-5t-5-13v-393q0-8 5-13t13-5h36q7 0 12 5t5 13z m-303 554h250l-27 65q-4 5-9 6h-177q-6-1-10-6z m518-18v-36q0-8-5-13t-13-5h-54v-529q0-46-26-80t-63-34h-464q-37 0-63 33t-27 79v531h-53q-8 0-13 5t-5 13v36q0 8 5 13t13 5h172l39 93q9 21 31 35t44 15h178q23 0 44-15t30-35l39-93h173q8 0 13-5t5-13z" horiz-adv-x="785.7" />
132 154 </font>
133 155 </defs>
134 156 </svg> No newline at end of file
1 NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file, binary diff hidden
@@ -1,356 +1,311 b''
1 1 ## -*- coding: utf-8 -*-
2 2
3 3 <%inherit file="/base/base.mako"/>
4 <%namespace name="base" file="/base/base.mako"/>
4 5 <%namespace name="diff_block" file="/changeset/diff_block.mako"/>
6 <%namespace name="file_base" file="/files/base.mako"/>
5 7
6 8 <%def name="title()">
7 ${_('%s Commit') % c.repo_name} - ${h.show_id(c.commit)}
9 ${_('{} Commit').format(c.repo_name)} - ${h.show_id(c.commit)}
8 10 %if c.rhodecode_name:
9 11 &middot; ${h.branding(c.rhodecode_name)}
10 12 %endif
11 13 </%def>
12 14
13 15 <%def name="menu_bar_nav()">
14 16 ${self.menu_items(active='repositories')}
15 17 </%def>
16 18
17 19 <%def name="menu_bar_subnav()">
18 20 ${self.repo_menu(active='commits')}
19 21 </%def>
20 22
21 23 <%def name="main()">
22 <script>
24 <script type="text/javascript">
23 25 // TODO: marcink switch this to pyroutes
24 26 AJAX_COMMENT_DELETE_URL = "${h.route_path('repo_commit_comment_delete',repo_name=c.repo_name,commit_id=c.commit.raw_id,comment_id='__COMMENT_ID__')}";
25 27 templateContext.commit_data.commit_id = "${c.commit.raw_id}";
26 28 </script>
29
27 30 <div class="box">
28 31
29 <div id="changeset_compare_view_content" class="summary changeset">
30 <div class="summary-detail">
31 <div class="fieldset">
32 <div class="left-label-summary">
33 <p>${_('Commit')}</p>
34 <div class="right-label-summary">
35 <code>
36 ${h.show_id(c.commit)}
37 </code>
38 <i class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${c.commit.raw_id}" title="${_('Copy the full commit id')}"></i>
39 % if hasattr(c.commit, 'phase'):
40 <span class="tag phase-${c.commit.phase} tooltip" title="${_('Commit phase')}">${c.commit.phase}</span>
41 % endif
32 <div class="summary">
33
34 <div class="fieldset">
35 <div class="left-content">
36
37 <div class="left-content-avatar">
38 ${base.gravatar(c.commit.author_email, 30)}
39 </div>
40
41 <div class="left-content-message">
42 <div class="fieldset collapsable-content no-hide" data-toggle="summary-details">
43 <div class="commit truncate-wrap">${h.urlify_commit_message(h.chop_at_smart(c.commit.message, '\n', suffix_if_chopped='...'), c.repo_name)}</div>
44 </div>
42 45
43 ## obsolete commits
44 % if hasattr(c.commit, 'obsolete'):
45 % if c.commit.obsolete:
46 <span class="tag obsolete-${c.commit.obsolete} tooltip" title="${_('Evolve State')}">${_('obsolete')}</span>
47 % endif
48 % endif
46 <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none">
47 <div class="commit">${h.urlify_commit_message(c.commit.message,c.repo_name)}</div>
48 </div>
49
50 <div class="fieldset" data-toggle="summary-details">
51 <div class="">
52 <table>
53 <tr class="file_author tooltip" title="${h.tooltip(h.author_string(c.commit.author_email))}">
49 54
50 ## hidden commits
51 % if hasattr(c.commit, 'hidden'):
52 % if c.commit.hidden:
53 <span class="tag hidden-${c.commit.hidden} tooltip" title="${_('Evolve State')}">${_('hidden')}</span>
54 % endif
55 % endif
56
55 <td>
56 <span class="user commit-author">${h.link_to_user(c.commit.author)}</span>
57 <span class="commit-date">- ${h.age_component(c.commit.date)}</span>
58 </td>
57 59
58 <div class="pull-right">
59 <span id="parent_link">
60 <a href="#parentCommit" title="${_('Parent Commit')}"><i class="icon-left icon-no-margin"></i>${_('parent')}</a>
61 </span>
62 |
63 <span id="child_link">
64 <a href="#childCommit" title="${_('Child Commit')}">${_('child')}<i class="icon-right icon-no-margin"></i></a>
65 </span>
66 </div>
67
68 </div>
60 <td>
61 ## second cell for consistency with files
62 </td>
63 </tr>
64 </table>
69 65 </div>
70 66 </div>
71 67
68 </div>
69 </div>
72 70
71 <div class="right-content">
72
73 <div data-toggle="summary-details">
74 <div class="tags tags-main">
75 <code><a href="${h.route_path('repo_commit',repo_name=c.repo_name,commit_id=c.commit.raw_id)}">${h.show_id(c.commit)}</a></code>
76 <i class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${c.commit.raw_id}" title="${_('Copy the full commit id')}"></i>
77 ${file_base.refs(c.commit)}
78
79 ## phase
80 % if hasattr(c.commit, 'phase') and getattr(c.commit, 'phase') != 'public':
81 <span class="tag phase-${c.commit.phase} tooltip" title="${_('Commit phase')}">
82 <i class="icon-info"></i>${c.commit.phase}
83 </span>
84 % endif
73 85
74 <div class="fieldset">
86 ## obsolete commits
87 % if getattr(c.commit, 'obsolete', False):
88 <span class="tag obsolete-${c.commit.obsolete} tooltip" title="${_('Evolve State')}">
89 ${_('obsolete')}
90 </span>
91 % endif
92
93 ## hidden commits
94 % if getattr(c.commit, 'hidden', False):
95 <span class="tag hidden-${c.commit.hidden} tooltip" title="${_('Evolve State')}">
96 ${_('hidden')}
97 </span>
98 % endif
99 </div>
100
101 %if c.statuses:
102 <div class="tag status-tag-${c.statuses[0]} pull-right">
103 <i class="icon-circle review-status-${c.statuses[0]}"></i>
104 <div class="pull-right">${h.commit_status_lbl(c.statuses[0])}</div>
105 </div>
106 %endif
107
108 </div>
109
110 </div>
111 </div>
112
113 <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none;">
75 114 <div class="left-label-summary">
76 <p>${_('Description')}:</p>
115 <p>${_('Commit navigation')}:</p>
77 116 <div class="right-label-summary">
78 <div id="trimmed_message_box" class="commit">${h.urlify_commit_message(c.commit.message,c.repo_name)}</div>
79 <div id="message_expand" style="display:none;">
80 ${_('Expand')}
81 </div>
117 <span id="parent_link" class="tag tagtag">
118 <a href="#parentCommit" title="${_('Parent Commit')}"><i class="icon-left icon-no-margin"></i>${_('parent')}</a>
119 </span>
120
121 <span id="child_link" class="tag tagtag">
122 <a href="#childCommit" title="${_('Child Commit')}">${_('child')}<i class="icon-right icon-no-margin"></i></a>
123 </span>
82 124 </div>
83 125 </div>
84 126 </div>
85 127
86 %if c.statuses:
87 <div class="fieldset">
88 <div class="left-label-summary">
89 <p>${_('Commit status')}:</p>
90 <div class="right-label-summary">
91 <div class="changeset-status-ico">
92 <div class="${'flag_status %s' % c.statuses[0]} pull-left"></div>
93 </div>
94 <div title="${_('Commit status')}" class="changeset-status-lbl">[${h.commit_status_lbl(c.statuses[0])}]</div>
95 </div>
96 </div>
97 </div>
98 %endif
99
100 <div class="fieldset">
101 <div class="left-label-summary">
102 <p>${_('References')}:</p>
103 <div class="right-label-summary">
104 <div class="tags">
105 %if c.commit.merge:
106 <span class="mergetag tag">
107 <i class="icon-merge"></i>${_('merge')}
108 </span>
109 %endif
110
111 %if h.is_hg(c.rhodecode_repo):
112 %for book in c.commit.bookmarks:
113 <span class="booktag tag" title="${h.tooltip(_('Bookmark %s') % book)}">
114 <a href="${h.route_path('repo_files:default_path',repo_name=c.repo_name,commit_id=c.commit.raw_id,_query=dict(at=book))}"><i class="icon-bookmark"></i>${h.shorter(book)}</a>
115 </span>
116 %endfor
117 %endif
118
119 %for tag in c.commit.tags:
120 <span class="tagtag tag" title="${h.tooltip(_('Tag %s') % tag)}">
121 <a href="${h.route_path('repo_files:default_path',repo_name=c.repo_name,commit_id=c.commit.raw_id,_query=dict(at=tag))}"><i class="icon-tag"></i>${tag}</a>
122 </span>
123 %endfor
124
125 %if c.commit.branch:
126 <span class="branchtag tag" title="${h.tooltip(_('Branch %s') % c.commit.branch)}">
127 <a href="${h.route_path('repo_files:default_path',repo_name=c.repo_name,commit_id=c.commit.raw_id,_query=dict(at=c.commit.branch))}"><i class="icon-code-fork"></i>${h.shorter(c.commit.branch)}</a>
128 </span>
129 %endif
130 </div>
131 </div>
132 </div>
133 </div>
134
135 <div class="fieldset">
128 <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none;">
136 129 <div class="left-label-summary">
137 130 <p>${_('Diff options')}:</p>
138 131 <div class="right-label-summary">
139 132 <div class="diff-actions">
140 133 <a href="${h.route_path('repo_commit_raw',repo_name=c.repo_name,commit_id=c.commit.raw_id)}" class="tooltip" title="${h.tooltip(_('Raw diff'))}">
141 134 ${_('Raw Diff')}
142 135 </a>
143 136 |
144 137 <a href="${h.route_path('repo_commit_patch',repo_name=c.repo_name,commit_id=c.commit.raw_id)}" class="tooltip" title="${h.tooltip(_('Patch diff'))}">
145 138 ${_('Patch Diff')}
146 139 </a>
147 140 |
148 141 <a href="${h.route_path('repo_commit_download',repo_name=c.repo_name,commit_id=c.commit.raw_id,_query=dict(diff='download'))}" class="tooltip" title="${h.tooltip(_('Download diff'))}">
149 142 ${_('Download Diff')}
150 143 </a>
151 144 </div>
152 145 </div>
153 146 </div>
154 147 </div>
155 148
156 <div class="fieldset">
157 <div class="left-label-summary">
158 <p>${_('Comments')}:</p>
159 <div class="right-label-summary">
160 <div class="comments-number">
161 %if c.comments:
162 <a href="#comments">${_ungettext("%d Commit comment", "%d Commit comments", len(c.comments)) % len(c.comments)}</a>,
163 %else:
164 ${_ungettext("%d Commit comment", "%d Commit comments", len(c.comments)) % len(c.comments)}
165 %endif
166 %if c.inline_cnt:
167 <a href="#" onclick="return Rhodecode.comments.nextComment();" id="inline-comments-counter">${_ungettext("%d Inline Comment", "%d Inline Comments", c.inline_cnt) % c.inline_cnt}</a>
168 %else:
169 ${_ungettext("%d Inline Comment", "%d Inline Comments", c.inline_cnt) % c.inline_cnt}
170 %endif
171 </div>
172 </div>
173 </div>
149 <div class="clear-fix"></div>
150
151 <div class="btn-collapse" data-toggle="summary-details">
152 ${_('Show More')}
174 153 </div>
175 154
176 <div class="fieldset">
177 <div class="left-label-summary">
178 <p>${_('Unresolved TODOs')}:</p>
179 <div class="right-label-summary">
180 <div class="comments-number">
181 % if c.unresolved_comments:
182 % for co in c.unresolved_comments:
183 <a class="permalink" href="#comment-${co.comment_id}" onclick="Rhodecode.comments.scrollToComment($('#comment-${co.comment_id}'))"> #${co.comment_id}</a>${'' if loop.last else ','}
184 % endfor
185 % else:
186 ${_('There are no unresolved TODOs')}
187 % endif
188 </div>
189 </div>
190 </div>
191 </div>
155 </div>
192 156
193 <div class="fieldset">
194 <div class="left-label-summary">
195 <p>${_('Author')}</p>
196
197 <div class="right-label-summary">
198 ${self.gravatar_with_user(c.commit.author)}
199 <div class="user-inline-data">- ${h.age_component(c.commit.date)}</div>
200 </div>
201 </div>
202
203 <div class="clear-fix"></div>
204
205 </div> <!-- end summary-detail -->
206 </div> <!-- end summary -->
207 </div>
208 157 <div class="cs_files">
209 158 <%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/>
210 159 ${cbdiffs.render_diffset_menu(c.changes[c.commit.raw_id])}
211 160 ${cbdiffs.render_diffset(
212 161 c.changes[c.commit.raw_id], commit=c.commit, use_comments=True,inline_comments=c.inline_comments )}
213 162 </div>
214 163
164 <div class="comments-heading">
165 <i class="icon-comment"></i>
166 ${_('Comments')} ${len(c.comments)}
167 </div>
168
215 169 ## template for inline comment form
216 170 <%namespace name="comment" file="/changeset/changeset_file_comment.mako"/>
217 171
218 172 ## render comments
219 173 ${comment.generate_comments(c.comments)}
220 174
221 175 ## main comment form and it status
222 176 ${comment.comments(h.route_path('repo_commit_comment_create', repo_name=c.repo_name, commit_id=c.commit.raw_id),
223 177 h.commit_status(c.rhodecode_db_repo, c.commit.raw_id))}
224 178 </div>
225 179
226 180 ## FORM FOR MAKING JS ACTION AS CHANGESET COMMENTS
227 181 <script type="text/javascript">
228 182
229 183 $(document).ready(function() {
230 184
231 185 var boxmax = parseInt($('#trimmed_message_box').css('max-height'), 10);
232 186 if($('#trimmed_message_box').height() === boxmax){
233 187 $('#message_expand').show();
234 188 }
235 189
236 190 $('#message_expand').on('click', function(e){
237 191 $('#trimmed_message_box').css('max-height', 'none');
238 192 $(this).hide();
239 193 });
240 194
241 195 $('.show-inline-comments').on('click', function(e){
242 196 var boxid = $(this).attr('data-comment-id');
243 197 var button = $(this);
244 198
245 199 if(button.hasClass("comments-visible")) {
246 200 $('#{0} .inline-comments'.format(boxid)).each(function(index){
247 201 $(this).hide();
248 202 });
249 203 button.removeClass("comments-visible");
250 204 } else {
251 205 $('#{0} .inline-comments'.format(boxid)).each(function(index){
252 206 $(this).show();
253 207 });
254 208 button.addClass("comments-visible");
255 209 }
256 210 });
257 211
258 212
259 213 // next links
260 214 $('#child_link').on('click', function(e){
261 215 // fetch via ajax what is going to be the next link, if we have
262 216 // >1 links show them to user to choose
263 217 if(!$('#child_link').hasClass('disabled')){
264 218 $.ajax({
265 219 url: '${h.route_path('repo_commit_children',repo_name=c.repo_name, commit_id=c.commit.raw_id)}',
266 220 success: function(data) {
267 221 if(data.results.length === 0){
268 222 $('#child_link').html("${_('No Child Commits')}").addClass('disabled');
269 223 }
270 224 if(data.results.length === 1){
271 225 var commit = data.results[0];
272 226 window.location = pyroutes.url('repo_commit', {'repo_name': '${c.repo_name}','commit_id': commit.raw_id});
273 227 }
274 228 else if(data.results.length === 2){
275 229 $('#child_link').addClass('disabled');
276 230 $('#child_link').addClass('double');
277 231
278 232 var _html = '';
279 233 _html +='<a title="__title__" href="__url__"><span class="tag branchtag"><i class="icon-code-fork"></i>__branch__</span> __rev__</a> '
280 234 .replace('__branch__', data.results[0].branch)
281 235 .replace('__rev__','r{0}:{1}'.format(data.results[0].revision, data.results[0].raw_id.substr(0,6)))
282 236 .replace('__title__', data.results[0].message)
283 237 .replace('__url__', pyroutes.url('repo_commit', {'repo_name': '${c.repo_name}','commit_id': data.results[0].raw_id}));
284 238 _html +=' | ';
285 239 _html +='<a title="__title__" href="__url__"><span class="tag branchtag"><i class="icon-code-fork"></i>__branch__</span> __rev__</a> '
286 240 .replace('__branch__', data.results[1].branch)
287 241 .replace('__rev__','r{0}:{1}'.format(data.results[1].revision, data.results[1].raw_id.substr(0,6)))
288 242 .replace('__title__', data.results[1].message)
289 243 .replace('__url__', pyroutes.url('repo_commit', {'repo_name': '${c.repo_name}','commit_id': data.results[1].raw_id}));
290 244 $('#child_link').html(_html);
291 245 }
292 246 }
293 247 });
294 248 e.preventDefault();
295 249 }
296 250 });
297 251
298 252 // prev links
299 253 $('#parent_link').on('click', function(e){
300 254 // fetch via ajax what is going to be the next link, if we have
301 255 // >1 links show them to user to choose
302 256 if(!$('#parent_link').hasClass('disabled')){
303 257 $.ajax({
304 258 url: '${h.route_path("repo_commit_parents",repo_name=c.repo_name, commit_id=c.commit.raw_id)}',
305 259 success: function(data) {
306 260 if(data.results.length === 0){
307 261 $('#parent_link').html('${_('No Parent Commits')}').addClass('disabled');
308 262 }
309 263 if(data.results.length === 1){
310 264 var commit = data.results[0];
311 265 window.location = pyroutes.url('repo_commit', {'repo_name': '${c.repo_name}','commit_id': commit.raw_id});
312 266 }
313 267 else if(data.results.length === 2){
314 268 $('#parent_link').addClass('disabled');
315 269 $('#parent_link').addClass('double');
316 270
317 271 var _html = '';
318 272 _html +='<a title="__title__" href="__url__"><span class="tag branchtag"><i class="icon-code-fork"></i>__branch__</span> __rev__</a>'
319 273 .replace('__branch__', data.results[0].branch)
320 274 .replace('__rev__','r{0}:{1}'.format(data.results[0].revision, data.results[0].raw_id.substr(0,6)))
321 275 .replace('__title__', data.results[0].message)
322 276 .replace('__url__', pyroutes.url('repo_commit', {'repo_name': '${c.repo_name}','commit_id': data.results[0].raw_id}));
323 277 _html +=' | ';
324 278 _html +='<a title="__title__" href="__url__"><span class="tag branchtag"><i class="icon-code-fork"></i>__branch__</span> __rev__</a>'
325 279 .replace('__branch__', data.results[1].branch)
326 280 .replace('__rev__','r{0}:{1}'.format(data.results[1].revision, data.results[1].raw_id.substr(0,6)))
327 281 .replace('__title__', data.results[1].message)
328 282 .replace('__url__', pyroutes.url('repo_commit', {'repo_name': '${c.repo_name}','commit_id': data.results[1].raw_id}));
329 283 $('#parent_link').html(_html);
330 284 }
331 285 }
332 286 });
333 287 e.preventDefault();
334 288 }
335 289 });
336 290
337 291 if (location.hash) {
338 292 var result = splitDelimitedHash(location.hash);
339 293 var line = $('html').find(result.loc);
340 294 if (line.length > 0){
341 295 offsetScroll(line, 70);
342 296 }
343 297 }
344 298
345 299 // browse tree @ revision
346 300 $('#files_link').on('click', function(e){
347 301 window.location = '${h.route_path('repo_files:default_path',repo_name=c.repo_name, commit_id=c.commit.raw_id)}';
348 302 e.preventDefault();
349 303 });
350 304
351 305 // inject comments into their proper positions
352 306 var file_comments = $('.inline-comment-placeholder');
307
353 308 })
354 309 </script>
355 310
356 311 </%def>
@@ -1,119 +1,119 b''
1 1 ## -*- coding: utf-8 -*-
2 2 <%inherit file="/base/base.mako"/>
3 3
4 4 <%def name="title()">
5 5 ${_('%s Commits') % c.repo_name} -
6 6 r${c.commit_ranges[0].idx}:${h.short_id(c.commit_ranges[0].raw_id)}
7 7 ...
8 8 r${c.commit_ranges[-1].idx}:${h.short_id(c.commit_ranges[-1].raw_id)}
9 9 ${_ungettext('(%s commit)','(%s commits)', len(c.commit_ranges)) % len(c.commit_ranges)}
10 10 %if c.rhodecode_name:
11 11 &middot; ${h.branding(c.rhodecode_name)}
12 12 %endif
13 13 </%def>
14 14
15 15 <%def name="breadcrumbs_links()"></%def>
16 16
17 17 <%def name="menu_bar_nav()">
18 18 ${self.menu_items(active='repositories')}
19 19 </%def>
20 20
21 21 <%def name="menu_bar_subnav()">
22 22 ${self.repo_menu(active='commits')}
23 23 </%def>
24 24
25 25 <%def name="main()">
26
26 27 <div class="box">
27 28 <div class="summary changeset">
28 29 <div class="summary-detail">
29 30 <div class="summary-detail-header">
30 31 <span class="breadcrumbs files_location">
31 32 <h4>
32 33 ${_('Commit Range')}
33 34 </h4>
34 35 </span>
35 36
36 37 <div class="clear-fix"></div>
37 38 </div>
38 39
39 40 <div class="fieldset">
40 41 <div class="left-label-summary">
41 42 <p class="spacing">${_('Range')}:</p>
42 43 <div class="right-label-summary">
43 44 <div class="code-header" >
44 45 <div class="compare_header">
45 46 <code class="fieldset-text-line">
46 47 r${c.commit_ranges[0].idx}:${h.short_id(c.commit_ranges[0].raw_id)}
47 48 ...
48 49 r${c.commit_ranges[-1].idx}:${h.short_id(c.commit_ranges[-1].raw_id)}
49 50 ${_ungettext('(%s commit)','(%s commits)', len(c.commit_ranges)) % len(c.commit_ranges)}
50 51 </code>
51 52 </div>
52 53 </div>
53 54 </div>
54 55 </div>
55 56 </div>
56 57
57 58 <div class="fieldset">
58 59 <div class="left-label-summary">
59 60 <p class="spacing">${_('Diff Option')}:</p>
60 61 <div class="right-label-summary">
61 62 <div class="code-header" >
62 63 <div class="compare_header">
63 <div class="btn btn-primary">
64 <a href="${h.route_path('repo_compare',
64 <a class="btn btn-primary" href="${h.route_path('repo_compare',
65 65 repo_name=c.repo_name,
66 66 source_ref_type='rev',
67 67 source_ref=getattr(c.commit_ranges[0].parents[0] if c.commit_ranges[0].parents else h.EmptyCommit(), 'raw_id'),
68 68 target_ref_type='rev',
69 69 target_ref=c.commit_ranges[-1].raw_id)}"
70 70 >
71 71 ${_('Show combined diff')}
72 72 </a>
73 </div>
74 73 </div>
75 74 </div>
76 75 </div>
77 76 </div>
78 77 </div>
79 78
80 79 <div class="clear-fix"></div>
81 80 </div> <!-- end summary-detail -->
82 81 </div> <!-- end summary -->
83 82
84 83 <div id="changeset_compare_view_content">
85 84 <div class="pull-left">
86 85 <div class="btn-group">
87 86 <a
88 87 class="btn"
89 88 href="#"
90 89 onclick="$('.compare_select').show();$('.compare_select_hidden').hide(); return false">
91 90 ${_ungettext('Expand %s commit','Expand %s commits', len(c.commit_ranges)) % len(c.commit_ranges)}
92 91 </a>
93 92 <a
94 93 class="btn"
95 94 href="#"
96 95 onclick="$('.compare_select').hide();$('.compare_select_hidden').show(); return false">
97 96 ${_ungettext('Collapse %s commit','Collapse %s commits', len(c.commit_ranges)) % len(c.commit_ranges)}
98 97 </a>
99 98 </div>
100 99 </div>
101 100 ## Commit range generated below
102 101 <%include file="../compare/compare_commits.mako"/>
103 102 <div class="cs_files">
104 103 <%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/>
105 104 <%namespace name="comment" file="/changeset/changeset_file_comment.mako"/>
106 105 <%namespace name="diff_block" file="/changeset/diff_block.mako"/>
107 ${cbdiffs.render_diffset_menu()}
106
108 107 %for commit in c.commit_ranges:
108 ${cbdiffs.render_diffset_menu(c.changes[commit.raw_id])}
109 109 ${cbdiffs.render_diffset(
110 110 diffset=c.changes[commit.raw_id],
111 111 collapse_when_files_over=5,
112 112 commit=commit,
113 113 )}
114 114 %endfor
115 115 </div>
116 116 </div>
117 117 </div>
118 118
119 119 </%def>
@@ -1,1031 +1,1121 b''
1 1 <%namespace name="commentblock" file="/changeset/changeset_file_comment.mako"/>
2 2
3 3 <%def name="diff_line_anchor(commit, filename, line, type)"><%
4 4 return '%s_%s_%i' % (h.md5_safe(commit+filename), type, line)
5 5 %></%def>
6 6
7 7 <%def name="action_class(action)">
8 8 <%
9 9 return {
10 10 '-': 'cb-deletion',
11 11 '+': 'cb-addition',
12 12 ' ': 'cb-context',
13 13 }.get(action, 'cb-empty')
14 14 %>
15 15 </%def>
16 16
17 17 <%def name="op_class(op_id)">
18 18 <%
19 19 return {
20 20 DEL_FILENODE: 'deletion', # file deleted
21 21 BIN_FILENODE: 'warning' # binary diff hidden
22 22 }.get(op_id, 'addition')
23 23 %>
24 24 </%def>
25 25
26 26
27 27
28 28 <%def name="render_diffset(diffset, commit=None,
29 29
30 30 # collapse all file diff entries when there are more than this amount of files in the diff
31 31 collapse_when_files_over=20,
32 32
33 33 # collapse lines in the diff when more than this amount of lines changed in the file diff
34 34 lines_changed_limit=500,
35 35
36 36 # add a ruler at to the output
37 37 ruler_at_chars=0,
38 38
39 39 # show inline comments
40 40 use_comments=False,
41 41
42 42 # disable new comments
43 43 disable_new_comments=False,
44 44
45 45 # special file-comments that were deleted in previous versions
46 46 # it's used for showing outdated comments for deleted files in a PR
47 47 deleted_files_comments=None,
48 48
49 49 # for cache purpose
50 50 inline_comments=None,
51 51
52 52 )">
53
54 <%
55 diffset_container_id = h.md5(diffset.target_ref)
56 collapse_all = len(diffset.files) > collapse_when_files_over
57 %>
58
53 59 %if use_comments:
54 60 <div id="cb-comments-inline-container-template" class="js-template">
55 61 ${inline_comments_container([], inline_comments)}
56 62 </div>
57 63 <div class="js-template" id="cb-comment-inline-form-template">
58 64 <div class="comment-inline-form ac">
59 65
60 66 %if c.rhodecode_user.username != h.DEFAULT_USER:
61 67 ## render template for inline comments
62 68 ${commentblock.comment_form(form_type='inline')}
63 69 %else:
64 70 ${h.form('', class_='inline-form comment-form-login', method='get')}
65 71 <div class="pull-left">
66 72 <div class="comment-help pull-right">
67 73 ${_('You need to be logged in to leave comments.')} <a href="${h.route_path('login', _query={'came_from': h.current_route_path(request)})}">${_('Login now')}</a>
68 74 </div>
69 75 </div>
70 76 <div class="comment-button pull-right">
71 77 <button type="button" class="cb-comment-cancel" onclick="return Rhodecode.comments.cancelComment(this);">
72 78 ${_('Cancel')}
73 79 </button>
74 80 </div>
75 81 <div class="clearfix"></div>
76 82 ${h.end_form()}
77 83 %endif
78 84 </div>
79 85 </div>
80 86
81 87 %endif
82 <%
83 collapse_all = len(diffset.files) > collapse_when_files_over
84 %>
85 88
86 89 %if c.user_session_attrs["diffmode"] == 'sideside':
87 90 <style>
88 91 .wrapper {
89 92 max-width: 1600px !important;
90 93 }
91 94 </style>
92 95 %endif
93 96
94 97 %if ruler_at_chars:
95 98 <style>
96 99 .diff table.cb .cb-content:after {
97 100 content: "";
98 101 border-left: 1px solid blue;
99 102 position: absolute;
100 103 top: 0;
101 104 height: 18px;
102 105 opacity: .2;
103 106 z-index: 10;
104 107 //## +5 to account for diff action (+/-)
105 108 left: ${ruler_at_chars + 5}ch;
106 109 </style>
107 110 %endif
108 111
109 112 <div class="diffset ${disable_new_comments and 'diffset-comments-disabled'}">
110 <div class="diffset-heading ${diffset.limited_diff and 'diffset-heading-warning' or ''}">
111 %if commit:
112 <div class="pull-right">
113 <a class="btn tooltip" title="${h.tooltip(_('Browse Files at revision {}').format(commit.raw_id))}" href="${h.route_path('repo_files',repo_name=diffset.repo_name, commit_id=commit.raw_id, f_path='')}">
114 ${_('Browse Files')}
115 </a>
113
114 <div style="height: 20px; line-height: 20px">
115 ## expand/collapse action
116 <div class="pull-left">
117 <a class="${'collapsed' if collapse_all else ''}" href="#expand-files" onclick="toggleExpand(this, '${diffset_container_id}'); return false">
118 % if collapse_all:
119 <i class="icon-plus-squared-alt icon-no-margin"></i>${_('Expand all files')}
120 % else:
121 <i class="icon-minus-squared-alt icon-no-margin"></i>${_('Collapse all files')}
122 % endif
123 </a>
124
125 </div>
126
127 ## todos
128 <div class="pull-right">
129 <div class="comments-number" style="padding-left: 10px">
130 % if hasattr(c, 'unresolved_comments') and hasattr(c, 'resolved_comments'):
131 <i class="icon-flag-filled" style="color: #949494">TODOs:</i>
132 % if c.unresolved_comments:
133 <a href="#show-todos" onclick="$('#todo-box').toggle(); return false">
134 ${_('{} unresolved').format(len(c.unresolved_comments))}
135 </a>
136 % else:
137 ${_('0 unresolved')}
138 % endif
139
140 ${_('{} Resolved').format(len(c.unresolved_comments))}
141 % endif
116 142 </div>
117 %endif
118 <h2 class="clearinner">
119 ## invidual commit
120 % if commit:
121 <a class="tooltip revision" title="${h.tooltip(commit.message)}" href="${h.route_path('repo_commit',repo_name=diffset.repo_name,commit_id=commit.raw_id)}">${('r%s:%s' % (commit.idx,h.short_id(commit.raw_id)))}</a> -
122 ${h.age_component(commit.date)}
123 % if diffset.limited_diff:
124 - ${_('The requested changes are too big and content was truncated.')}
125 ${_ungettext('%(num)s file changed.', '%(num)s files changed.', diffset.changed_files) % {'num': diffset.changed_files}}
126 <a href="${h.current_route_path(request, fulldiff=1)}" onclick="return confirm('${_("Showing a big diff might take some time and resources, continue?")}')">${_('Show full diff')}</a>
127 % elif hasattr(c, 'commit_ranges') and len(c.commit_ranges) > 1:
128 ## compare diff, has no file-selector and we want to show stats anyway
129 ${_ungettext('{num} file changed: {linesadd} inserted, ''{linesdel} deleted',
130 '{num} files changed: {linesadd} inserted, {linesdel} deleted', diffset.changed_files) \
131 .format(num=diffset.changed_files, linesadd=diffset.lines_added, linesdel=diffset.lines_deleted)}
132 % endif
133 % else:
134 ## pull requests/compare
135 ${_('File Changes')}
136 % endif
143 </div>
137 144
138 </h2>
145 ## comments
146 <div class="pull-right">
147 <div class="comments-number" style="padding-left: 10px">
148 % if hasattr(c, 'comments') and hasattr(c, 'inline_cnt'):
149 <i class="icon-comment" style="color: #949494">COMMENTS:</i>
150 % if c.comments:
151 <a href="#comments">${_ungettext("{} General", "{} General", len(c.comments)).format(len(c.comments))}</a>,
152 % else:
153 ${_('0 General')}
154 % endif
155
156 % if c.inline_cnt:
157 <a href="#" onclick="return Rhodecode.comments.nextComment();"
158 id="inline-comments-counter">${_ungettext("{} Inline", "{} Inline", c.inline_cnt).format(c.inline_cnt)}
159 </a>
160 % else:
161 ${_('0 Inline')}
162 % endif
163 % endif
164 </div>
165 </div>
166
139 167 </div>
140 168
169 % if diffset.limited_diff:
170 <div class="diffset-heading ${(diffset.limited_diff and 'diffset-heading-warning' or '')}">
171 <h2 class="clearinner">
172 ${_('The requested changes are too big and content was truncated.')}
173 <a href="${h.current_route_path(request, fulldiff=1)}" onclick="return confirm('${_("Showing a big diff might take some time and resources, continue?")}')">${_('Show full diff')}</a>
174 </h2>
175 </div>
176 ## commit range header for each individual diff
177 % elif commit and hasattr(c, 'commit_ranges') and len(c.commit_ranges) > 1:
178 <div class="diffset-heading ${(diffset.limited_diff and 'diffset-heading-warning' or '')}">
179 <div class="clearinner">
180 <a class="tooltip revision" title="${h.tooltip(commit.message)}" href="${h.route_path('repo_commit',repo_name=diffset.repo_name,commit_id=commit.raw_id)}">${('r%s:%s' % (commit.idx,h.short_id(commit.raw_id)))}</a>
181 </div>
182 </div>
183 % endif
184
185 <div id="todo-box">
186 % if hasattr(c, 'unresolved_comments') and c.unresolved_comments:
187 % for co in c.unresolved_comments:
188 <a class="permalink" href="#comment-${co.comment_id}"
189 onclick="Rhodecode.comments.scrollToComment($('#comment-${co.comment_id}'))">
190 <i class="icon-flag-filled-red"></i>
191 ${co.comment_id}</a>${('' if loop.last else ',')}
192 % endfor
193 % endif
194 </div>
141 195 %if diffset.has_hidden_changes:
142 196 <p class="empty_data">${_('Some changes may be hidden')}</p>
143 197 %elif not diffset.files:
144 198 <p class="empty_data">${_('No files')}</p>
145 199 %endif
146 200
147 201 <div class="filediffs">
148 202
149 203 ## initial value could be marked as False later on
150 204 <% over_lines_changed_limit = False %>
151 205 %for i, filediff in enumerate(diffset.files):
152 206
153 207 <%
154 208 lines_changed = filediff.patch['stats']['added'] + filediff.patch['stats']['deleted']
155 209 over_lines_changed_limit = lines_changed > lines_changed_limit
156 210 %>
157 211 ## anchor with support of sticky header
158 212 <div class="anchor" id="a_${h.FID(filediff.raw_id, filediff.patch['filename'])}"></div>
159 213
160 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state" id="filediff-collapse-${id(filediff)}" type="checkbox" onchange="updateSticky();">
214 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state collapse-${diffset_container_id}" id="filediff-collapse-${id(filediff)}" type="checkbox" onchange="updateSticky();">
161 215 <div
162 216 class="filediff"
163 217 data-f-path="${filediff.patch['filename']}"
164 218 data-anchor-id="${h.FID(filediff.raw_id, filediff.patch['filename'])}"
165 219 >
166 220 <label for="filediff-collapse-${id(filediff)}" class="filediff-heading">
167 <div class="filediff-collapse-indicator"></div>
221 <div class="filediff-collapse-indicator icon-"></div>
168 222 ${diff_ops(filediff)}
169 223 </label>
170 224
171 225 ${diff_menu(filediff, use_comments=use_comments)}
172 226 <table data-f-path="${filediff.patch['filename']}" data-anchor-id="${h.FID(filediff.raw_id, filediff.patch['filename'])}" class="code-visible-block cb cb-diff-${c.user_session_attrs["diffmode"]} code-highlight ${(over_lines_changed_limit and 'cb-collapsed' or '')}">
173 227
174 228 ## new/deleted/empty content case
175 229 % if not filediff.hunks:
176 230 ## Comment container, on "fakes" hunk that contains all data to render comments
177 231 ${render_hunk_lines(filediff, c.user_session_attrs["diffmode"], filediff.hunk_ops, use_comments=use_comments, inline_comments=inline_comments)}
178 232 % endif
179 233
180 234 %if filediff.limited_diff:
181 235 <tr class="cb-warning cb-collapser">
182 236 <td class="cb-text" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=6')}>
183 237 ${_('The requested commit or file is too big and content was truncated.')} <a href="${h.current_route_path(request, fulldiff=1)}" onclick="return confirm('${_("Showing a big diff might take some time and resources, continue?")}')">${_('Show full diff')}</a>
184 238 </td>
185 239 </tr>
186 240 %else:
187 241 %if over_lines_changed_limit:
188 242 <tr class="cb-warning cb-collapser">
189 243 <td class="cb-text" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=6')}>
190 244 ${_('This diff has been collapsed as it changes many lines, (%i lines changed)' % lines_changed)}
191 245 <a href="#" class="cb-expand"
192 246 onclick="$(this).closest('table').removeClass('cb-collapsed'); updateSticky(); return false;">${_('Show them')}
193 247 </a>
194 248 <a href="#" class="cb-collapse"
195 249 onclick="$(this).closest('table').addClass('cb-collapsed'); updateSticky(); return false;">${_('Hide them')}
196 250 </a>
197 251 </td>
198 252 </tr>
199 253 %endif
200 254 %endif
201 255
202 256 % for hunk in filediff.hunks:
203 257 <tr class="cb-hunk">
204 258 <td ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=3' or '')}>
205 259 ## TODO: dan: add ajax loading of more context here
206 260 ## <a href="#">
207 261 <i class="icon-more"></i>
208 262 ## </a>
209 263 </td>
210 264 <td ${(c.user_session_attrs["diffmode"] == 'sideside' and 'colspan=5' or '')}>
211 265 @@
212 266 -${hunk.source_start},${hunk.source_length}
213 267 +${hunk.target_start},${hunk.target_length}
214 268 ${hunk.section_header}
215 269 </td>
216 270 </tr>
217 271 ${render_hunk_lines(filediff, c.user_session_attrs["diffmode"], hunk, use_comments=use_comments, inline_comments=inline_comments)}
218 272 % endfor
219 273
220 274 <% unmatched_comments = (inline_comments or {}).get(filediff.patch['filename'], {}) %>
221 275
222 276 ## outdated comments that do not fit into currently displayed lines
223 277 % for lineno, comments in unmatched_comments.items():
224 278
225 279 %if c.user_session_attrs["diffmode"] == 'unified':
226 280 % if loop.index == 0:
227 281 <tr class="cb-hunk">
228 282 <td colspan="3"></td>
229 283 <td>
230 284 <div>
231 285 ${_('Unmatched inline comments below')}
232 286 </div>
233 287 </td>
234 288 </tr>
235 289 % endif
236 290 <tr class="cb-line">
237 291 <td class="cb-data cb-context"></td>
238 292 <td class="cb-lineno cb-context"></td>
239 293 <td class="cb-lineno cb-context"></td>
240 294 <td class="cb-content cb-context">
241 295 ${inline_comments_container(comments, inline_comments)}
242 296 </td>
243 297 </tr>
244 298 %elif c.user_session_attrs["diffmode"] == 'sideside':
245 299 % if loop.index == 0:
246 300 <tr class="cb-comment-info">
247 301 <td colspan="2"></td>
248 302 <td class="cb-line">
249 303 <div>
250 304 ${_('Unmatched inline comments below')}
251 305 </div>
252 306 </td>
253 307 <td colspan="2"></td>
254 308 <td class="cb-line">
255 309 <div>
256 310 ${_('Unmatched comments below')}
257 311 </div>
258 312 </td>
259 313 </tr>
260 314 % endif
261 315 <tr class="cb-line">
262 316 <td class="cb-data cb-context"></td>
263 317 <td class="cb-lineno cb-context"></td>
264 318 <td class="cb-content cb-context">
265 319 % if lineno.startswith('o'):
266 320 ${inline_comments_container(comments, inline_comments)}
267 321 % endif
268 322 </td>
269 323
270 324 <td class="cb-data cb-context"></td>
271 325 <td class="cb-lineno cb-context"></td>
272 326 <td class="cb-content cb-context">
273 327 % if lineno.startswith('n'):
274 328 ${inline_comments_container(comments, inline_comments)}
275 329 % endif
276 330 </td>
277 331 </tr>
278 332 %endif
279 333
280 334 % endfor
281 335
282 336 </table>
283 337 </div>
284 338 %endfor
285 339
286 340 ## outdated comments that are made for a file that has been deleted
287 341 % for filename, comments_dict in (deleted_files_comments or {}).items():
288 342 <%
289 343 display_state = 'display: none'
290 344 open_comments_in_file = [x for x in comments_dict['comments'] if x.outdated is False]
291 345 if open_comments_in_file:
292 346 display_state = ''
293 347 %>
294 348 <div class="filediffs filediff-outdated" style="${display_state}">
295 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state" id="filediff-collapse-${id(filename)}" type="checkbox" onchange="updateSticky();">
349 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state collapse-${diffset_container_id}" id="filediff-collapse-${id(filename)}" type="checkbox" onchange="updateSticky();">
296 350 <div class="filediff" data-f-path="${filename}" id="a_${h.FID(filediff.raw_id, filename)}">
297 351 <label for="filediff-collapse-${id(filename)}" class="filediff-heading">
298 352 <div class="filediff-collapse-indicator"></div>
353
299 354 <span class="pill">
300 355 ## file was deleted
301 <strong>${filename}</strong>
356 ${filename}
302 357 </span>
303 <span class="pill-group" style="float: left">
358 <span class="pill-group pull-left" >
304 359 ## file op, doesn't need translation
305 360 <span class="pill" op="removed">removed in this version</span>
306 361 </span>
307 362 <a class="pill filediff-anchor" href="#a_${h.FID(filediff.raw_id, filename)}"></a>
308 <span class="pill-group" style="float: right">
363 <span class="pill-group pull-right">
309 364 <span class="pill" op="deleted">-${comments_dict['stats']}</span>
310 365 </span>
311 366 </label>
312 367
313 <table class="cb cb-diff-${c.user_session_attrs["diffmode"]} code-highlight ${over_lines_changed_limit and 'cb-collapsed' or ''}">
368 <table class="cb cb-diff-${c.user_session_attrs["diffmode"]} code-highlight ${(over_lines_changed_limit and 'cb-collapsed' or '')}">
314 369 <tr>
315 370 % if c.user_session_attrs["diffmode"] == 'unified':
316 371 <td></td>
317 372 %endif
318 373
319 374 <td></td>
320 375 <td class="cb-text cb-${op_class(BIN_FILENODE)}" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=5')}>
321 376 ${_('File was deleted in this version. There are still outdated/unresolved comments attached to it.')}
322 377 </td>
323 378 </tr>
324 379 %if c.user_session_attrs["diffmode"] == 'unified':
325 380 <tr class="cb-line">
326 381 <td class="cb-data cb-context"></td>
327 382 <td class="cb-lineno cb-context"></td>
328 383 <td class="cb-lineno cb-context"></td>
329 384 <td class="cb-content cb-context">
330 385 ${inline_comments_container(comments_dict['comments'], inline_comments)}
331 386 </td>
332 387 </tr>
333 388 %elif c.user_session_attrs["diffmode"] == 'sideside':
334 389 <tr class="cb-line">
335 390 <td class="cb-data cb-context"></td>
336 391 <td class="cb-lineno cb-context"></td>
337 392 <td class="cb-content cb-context"></td>
338 393
339 394 <td class="cb-data cb-context"></td>
340 395 <td class="cb-lineno cb-context"></td>
341 396 <td class="cb-content cb-context">
342 397 ${inline_comments_container(comments_dict['comments'], inline_comments)}
343 398 </td>
344 399 </tr>
345 400 %endif
346 401 </table>
347 402 </div>
348 403 </div>
349 404 % endfor
350 405
351 406 </div>
352 407 </div>
353 408 </%def>
354 409
355 410 <%def name="diff_ops(filediff)">
356 411 <%
357 412 from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
358 413 MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE, COPIED_FILENODE
359 414 %>
360 415 <span class="pill">
416 <i class="icon-file-text"></i>
361 417 %if filediff.source_file_path and filediff.target_file_path:
362 418 %if filediff.source_file_path != filediff.target_file_path:
363 419 ## file was renamed, or copied
364 420 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
365 <strong>${filediff.target_file_path}</strong><del>${filediff.source_file_path}</del>
421 ${filediff.target_file_path}<del>${filediff.source_file_path}</del>
366 422 <% final_path = filediff.target_file_path %>
367 423 %elif COPIED_FILENODE in filediff.patch['stats']['ops']:
368 <strong>${filediff.target_file_path}</strong>${filediff.source_file_path}
424 ${filediff.target_file_path}${filediff.source_file_path}
369 425 <% final_path = filediff.target_file_path %>
370 426 %endif
371 427 %else:
372 428 ## file was modified
373 <strong>${filediff.source_file_path}</strong>
429 ${filediff.source_file_path}
374 430 <% final_path = filediff.source_file_path %>
375 431 %endif
376 432 %else:
377 433 %if filediff.source_file_path:
378 434 ## file was deleted
379 <strong>${filediff.source_file_path}</strong>
435 ${filediff.source_file_path}
380 436 <% final_path = filediff.source_file_path %>
381 437 %else:
382 438 ## file was added
383 <strong>${filediff.target_file_path}</strong>
439 ${filediff.target_file_path}
384 440 <% final_path = filediff.target_file_path %>
385 441 %endif
386 442 %endif
387 443 <i style="color: #aaa" class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${final_path}" title="${_('Copy the full path')}" onclick="return false;"></i>
388 444 </span>
389 445 ## anchor link
390 446 <a class="pill filediff-anchor" href="#a_${h.FID(filediff.raw_id, filediff.patch['filename'])}"></a>
391 447
392 <span class="pill-group" style="float: right">
448 <span class="pill-group pull-right">
393 449
394 450 ## ops pills
395 451 %if filediff.limited_diff:
396 452 <span class="pill tooltip" op="limited" title="The stats for this diff are not complete">limited diff</span>
397 453 %endif
398 454
399 455 %if NEW_FILENODE in filediff.patch['stats']['ops']:
400 456 <span class="pill" op="created">created</span>
401 457 %if filediff['target_mode'].startswith('120'):
402 458 <span class="pill" op="symlink">symlink</span>
403 459 %else:
404 460 <span class="pill" op="mode">${nice_mode(filediff['target_mode'])}</span>
405 461 %endif
406 462 %endif
407 463
408 464 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
409 465 <span class="pill" op="renamed">renamed</span>
410 466 %endif
411 467
412 468 %if COPIED_FILENODE in filediff.patch['stats']['ops']:
413 469 <span class="pill" op="copied">copied</span>
414 470 %endif
415 471
416 472 %if DEL_FILENODE in filediff.patch['stats']['ops']:
417 473 <span class="pill" op="removed">removed</span>
418 474 %endif
419 475
420 476 %if CHMOD_FILENODE in filediff.patch['stats']['ops']:
421 477 <span class="pill" op="mode">
422 478 ${nice_mode(filediff['source_mode'])}${nice_mode(filediff['target_mode'])}
423 479 </span>
424 480 %endif
425 481
426 482 %if BIN_FILENODE in filediff.patch['stats']['ops']:
427 483 <span class="pill" op="binary">binary</span>
428 484 %if MOD_FILENODE in filediff.patch['stats']['ops']:
429 485 <span class="pill" op="modified">modified</span>
430 486 %endif
431 487 %endif
432 488
433 489 <span class="pill" op="added">${('+' if filediff.patch['stats']['added'] else '')}${filediff.patch['stats']['added']}</span>
434 490 <span class="pill" op="deleted">${((h.safe_int(filediff.patch['stats']['deleted']) or 0) * -1)}</span>
435 491
436 492 </span>
437 493
438 494 </%def>
439 495
440 496 <%def name="nice_mode(filemode)">
441 497 ${(filemode.startswith('100') and filemode[3:] or filemode)}
442 498 </%def>
443 499
444 500 <%def name="diff_menu(filediff, use_comments=False)">
445 501 <div class="filediff-menu">
446 502
447 503 %if filediff.diffset.source_ref:
448 504
449 505 ## FILE BEFORE CHANGES
450 506 %if filediff.operation in ['D', 'M']:
451 507 <a
452 508 class="tooltip"
453 509 href="${h.route_path('repo_files',repo_name=filediff.diffset.target_repo_name,commit_id=filediff.diffset.source_ref,f_path=filediff.source_file_path)}"
454 510 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
455 511 >
456 512 ${_('Show file before')}
457 513 </a> |
458 514 %else:
459 515 <span
460 516 class="tooltip"
461 517 title="${h.tooltip(_('File not present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
462 518 >
463 519 ${_('Show file before')}
464 520 </span> |
465 521 %endif
466 522
467 523 ## FILE AFTER CHANGES
468 524 %if filediff.operation in ['A', 'M']:
469 525 <a
470 526 class="tooltip"
471 527 href="${h.route_path('repo_files',repo_name=filediff.diffset.source_repo_name,commit_id=filediff.diffset.target_ref,f_path=filediff.target_file_path)}"
472 528 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
473 529 >
474 530 ${_('Show file after')}
475 531 </a>
476 532 %else:
477 533 <span
478 534 class="tooltip"
479 535 title="${h.tooltip(_('File not present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
480 536 >
481 537 ${_('Show file after')}
482 538 </span>
483 539 %endif
484 540
485 541 % if use_comments:
486 542 |
487 543 <a href="#" onclick="return Rhodecode.comments.toggleComments(this);">
488 544 <span class="show-comment-button">${_('Show comments')}</span><span class="hide-comment-button">${_('Hide comments')}</span>
489 545 </a>
490 546 % endif
491 547
492 548 %endif
493 549
494 550 </div>
495 551 </%def>
496 552
497 553
498 554 <%def name="inline_comments_container(comments, inline_comments)">
499 555 <div class="inline-comments">
500 556 %for comment in comments:
501 557 ${commentblock.comment_block(comment, inline=True)}
502 558 %endfor
503 559 % if comments and comments[-1].outdated:
504 <span class="btn btn-secondary cb-comment-add-button comment-outdated}"
505 style="display: none;}">
560 <span class="btn btn-secondary cb-comment-add-button comment-outdated}" style="display: none;}">
506 561 ${_('Add another comment')}
507 562 </span>
508 563 % else:
509 <span onclick="return Rhodecode.comments.createComment(this)"
510 class="btn btn-secondary cb-comment-add-button">
564 <span onclick="return Rhodecode.comments.createComment(this)" class="btn btn-secondary cb-comment-add-button">
511 565 ${_('Add another comment')}
512 566 </span>
513 567 % endif
514 568
515 569 </div>
516 570 </%def>
517 571
518 572 <%!
519 573 def get_comments_for(diff_type, comments, filename, line_version, line_number):
520 574 if hasattr(filename, 'unicode_path'):
521 575 filename = filename.unicode_path
522 576
523 577 if not isinstance(filename, (unicode, str)):
524 578 return None
525 579
526 580 line_key = '{}{}'.format(line_version, line_number) ## e.g o37, n12
527 581
528 582 if comments and filename in comments:
529 583 file_comments = comments[filename]
530 584 if line_key in file_comments:
531 585 data = file_comments.pop(line_key)
532 586 return data
533 587 %>
534 588
535 589 <%def name="render_hunk_lines_sideside(filediff, hunk, use_comments=False, inline_comments=None)">
536 590 %for i, line in enumerate(hunk.sideside):
537 591 <%
538 592 old_line_anchor, new_line_anchor = None, None
539 593
540 594 if line.original.lineno:
541 595 old_line_anchor = diff_line_anchor(filediff.raw_id, hunk.source_file_path, line.original.lineno, 'o')
542 596 if line.modified.lineno:
543 597 new_line_anchor = diff_line_anchor(filediff.raw_id, hunk.target_file_path, line.modified.lineno, 'n')
544 598 %>
545 599
546 600 <tr class="cb-line">
547 601 <td class="cb-data ${action_class(line.original.action)}"
548 602 data-line-no="${line.original.lineno}"
549 603 >
550 604 <div>
551 605
552 606 <% line_old_comments = None %>
553 607 %if line.original.get_comment_args:
554 608 <% line_old_comments = get_comments_for('side-by-side', inline_comments, *line.original.get_comment_args) %>
555 609 %endif
556 610 %if line_old_comments:
557 611 <% has_outdated = any([x.outdated for x in line_old_comments]) %>
558 612 % if has_outdated:
559 613 <i title="${_('comments including outdated')}:${len(line_old_comments)}" class="icon-comment-toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
560 614 % else:
561 615 <i title="${_('comments')}: ${len(line_old_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
562 616 % endif
563 617 %endif
564 618 </div>
565 619 </td>
566 620 <td class="cb-lineno ${action_class(line.original.action)}"
567 621 data-line-no="${line.original.lineno}"
568 622 %if old_line_anchor:
569 623 id="${old_line_anchor}"
570 624 %endif
571 625 >
572 626 %if line.original.lineno:
573 627 <a name="${old_line_anchor}" href="#${old_line_anchor}">${line.original.lineno}</a>
574 628 %endif
575 629 </td>
576 630 <td class="cb-content ${action_class(line.original.action)}"
577 631 data-line-no="o${line.original.lineno}"
578 632 >
579 633 %if use_comments and line.original.lineno:
580 634 ${render_add_comment_button()}
581 635 %endif
582 636 <span class="cb-code"><span class="cb-action ${action_class(line.original.action)}"></span>${line.original.content or '' | n}</span>
583 637
584 638 %if use_comments and line.original.lineno and line_old_comments:
585 639 ${inline_comments_container(line_old_comments, inline_comments)}
586 640 %endif
587 641
588 642 </td>
589 643 <td class="cb-data ${action_class(line.modified.action)}"
590 644 data-line-no="${line.modified.lineno}"
591 645 >
592 646 <div>
593 647
594 648 %if line.modified.get_comment_args:
595 649 <% line_new_comments = get_comments_for('side-by-side', inline_comments, *line.modified.get_comment_args) %>
596 650 %else:
597 651 <% line_new_comments = None%>
598 652 %endif
599 653 %if line_new_comments:
600 654 <% has_outdated = any([x.outdated for x in line_new_comments]) %>
601 655 % if has_outdated:
602 656 <i title="${_('comments including outdated')}:${len(line_new_comments)}" class="icon-comment-toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
603 657 % else:
604 658 <i title="${_('comments')}: ${len(line_new_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
605 659 % endif
606 660 %endif
607 661 </div>
608 662 </td>
609 663 <td class="cb-lineno ${action_class(line.modified.action)}"
610 664 data-line-no="${line.modified.lineno}"
611 665 %if new_line_anchor:
612 666 id="${new_line_anchor}"
613 667 %endif
614 668 >
615 669 %if line.modified.lineno:
616 670 <a name="${new_line_anchor}" href="#${new_line_anchor}">${line.modified.lineno}</a>
617 671 %endif
618 672 </td>
619 673 <td class="cb-content ${action_class(line.modified.action)}"
620 674 data-line-no="n${line.modified.lineno}"
621 675 >
622 676 %if use_comments and line.modified.lineno:
623 677 ${render_add_comment_button()}
624 678 %endif
625 679 <span class="cb-code"><span class="cb-action ${action_class(line.modified.action)}"></span>${line.modified.content or '' | n}</span>
626 680 %if use_comments and line.modified.lineno and line_new_comments:
627 681 ${inline_comments_container(line_new_comments, inline_comments)}
628 682 %endif
629 683 </td>
630 684 </tr>
631 685 %endfor
632 686 </%def>
633 687
634 688
635 689 <%def name="render_hunk_lines_unified(filediff, hunk, use_comments=False, inline_comments=None)">
636 690 %for old_line_no, new_line_no, action, content, comments_args in hunk.unified:
637 691
638 692 <%
639 693 old_line_anchor, new_line_anchor = None, None
640 694 if old_line_no:
641 695 old_line_anchor = diff_line_anchor(filediff.raw_id, hunk.source_file_path, old_line_no, 'o')
642 696 if new_line_no:
643 697 new_line_anchor = diff_line_anchor(filediff.raw_id, hunk.target_file_path, new_line_no, 'n')
644 698 %>
645 699 <tr class="cb-line">
646 700 <td class="cb-data ${action_class(action)}">
647 701 <div>
648 702
649 703 %if comments_args:
650 704 <% comments = get_comments_for('unified', inline_comments, *comments_args) %>
651 705 %else:
652 706 <% comments = None %>
653 707 %endif
654 708
655 709 % if comments:
656 710 <% has_outdated = any([x.outdated for x in comments]) %>
657 711 % if has_outdated:
658 712 <i title="${_('comments including outdated')}:${len(comments)}" class="icon-comment-toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
659 713 % else:
660 714 <i title="${_('comments')}: ${len(comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
661 715 % endif
662 716 % endif
663 717 </div>
664 718 </td>
665 719 <td class="cb-lineno ${action_class(action)}"
666 720 data-line-no="${old_line_no}"
667 721 %if old_line_anchor:
668 722 id="${old_line_anchor}"
669 723 %endif
670 724 >
671 725 %if old_line_anchor:
672 726 <a name="${old_line_anchor}" href="#${old_line_anchor}">${old_line_no}</a>
673 727 %endif
674 728 </td>
675 729 <td class="cb-lineno ${action_class(action)}"
676 730 data-line-no="${new_line_no}"
677 731 %if new_line_anchor:
678 732 id="${new_line_anchor}"
679 733 %endif
680 734 >
681 735 %if new_line_anchor:
682 736 <a name="${new_line_anchor}" href="#${new_line_anchor}">${new_line_no}</a>
683 737 %endif
684 738 </td>
685 739 <td class="cb-content ${action_class(action)}"
686 740 data-line-no="${(new_line_no and 'n' or 'o')}${(new_line_no or old_line_no)}"
687 741 >
688 742 %if use_comments:
689 743 ${render_add_comment_button()}
690 744 %endif
691 745 <span class="cb-code"><span class="cb-action ${action_class(action)}"></span> ${content or '' | n}</span>
692 746 %if use_comments and comments:
693 747 ${inline_comments_container(comments, inline_comments)}
694 748 %endif
695 749 </td>
696 750 </tr>
697 751 %endfor
698 752 </%def>
699 753
700 754
701 755 <%def name="render_hunk_lines(filediff, diff_mode, hunk, use_comments, inline_comments)">
702 756 % if diff_mode == 'unified':
703 757 ${render_hunk_lines_unified(filediff, hunk, use_comments=use_comments, inline_comments=inline_comments)}
704 758 % elif diff_mode == 'sideside':
705 759 ${render_hunk_lines_sideside(filediff, hunk, use_comments=use_comments, inline_comments=inline_comments)}
706 760 % else:
707 761 <tr class="cb-line">
708 762 <td>unknown diff mode</td>
709 763 </tr>
710 764 % endif
711 765 </%def>file changes
712 766
713 767
714 768 <%def name="render_add_comment_button()">
715 769 <button class="btn btn-small btn-primary cb-comment-box-opener" onclick="return Rhodecode.comments.createComment(this)">
716 770 <span><i class="icon-comment"></i></span>
717 771 </button>
718 772 </%def>
719 773
720 <%def name="render_diffset_menu(diffset=None, range_diff_on=None)">
774 <%def name="render_diffset_menu(diffset, range_diff_on=None)">
775 <% diffset_container_id = h.md5(diffset.target_ref) %>
721 776
722 777 <div id="diff-file-sticky" class="diffset-menu clearinner">
723 778 ## auto adjustable
724 779 <div class="sidebar__inner">
725 780 <div class="sidebar__bar">
726 781 <div class="pull-right">
727 <div class="btn-group">
728
729 ## DIFF OPTIONS via Select2
730 <div class="pull-left">
731 ${h.hidden('diff_menu')}
782 <div class="btn-group">
783 <a class="btn tooltip toggle-wide-diff" href="#toggle-wide-diff" onclick="toggleWideDiff(this); return false" title="${h.tooltip(_('Toggle wide diff'))}">
784 <i class="icon-wide-mode"></i>
785 </a>
732 786 </div>
787 <div class="btn-group">
733 788
734 789 <a
735 class="btn ${(c.user_session_attrs["diffmode"] == 'sideside' and 'btn-primary')} tooltip"
736 title="${h.tooltip(_('View side by side'))}"
790 class="btn ${(c.user_session_attrs["diffmode"] == 'sideside' and 'btn-active')} tooltip"
791 title="${h.tooltip(_('View diff as side by side'))}"
737 792 href="${h.current_route_path(request, diffmode='sideside')}">
738 793 <span>${_('Side by Side')}</span>
739 794 </a>
740 795
741 796 <a
742 class="btn ${(c.user_session_attrs["diffmode"] == 'unified' and 'btn-primary')} tooltip"
743 title="${h.tooltip(_('View unified'))}" href="${h.current_route_path(request, diffmode='unified')}">
797 class="btn ${(c.user_session_attrs["diffmode"] == 'unified' and 'btn-active')} tooltip"
798 title="${h.tooltip(_('View diff as unified'))}" href="${h.current_route_path(request, diffmode='unified')}">
744 799 <span>${_('Unified')}</span>
745 800 </a>
746 801
747 802 % if range_diff_on is True:
748 803 <a
749 804 title="${_('Turn off: Show the diff as commit range')}"
750 805 class="btn btn-primary"
751 806 href="${h.current_route_path(request, **{"range-diff":"0"})}">
752 807 <span>${_('Range Diff')}</span>
753 808 </a>
754 809 % elif range_diff_on is False:
755 810 <a
756 811 title="${_('Show the diff as commit range')}"
757 812 class="btn"
758 813 href="${h.current_route_path(request, **{"range-diff":"1"})}">
759 814 <span>${_('Range Diff')}</span>
760 815 </a>
761 816 % endif
762 817 </div>
818 <div class="btn-group">
819
820 <div class="pull-left">
821 ${h.hidden('diff_menu_{}'.format(diffset_container_id))}
822 </div>
823
824 </div>
763 825 </div>
764 826 <div class="pull-left">
765 827 <div class="btn-group">
766 828 <div class="pull-left">
767 ${h.hidden('file_filter')}
829 ${h.hidden('file_filter_{}'.format(diffset_container_id))}
768 830 </div>
769 <a
770 class="btn"
771 href="#"
772 onclick="$('input[class=filediff-collapse-state]').prop('checked', false); updateSticky(); return false">${_('Expand All Files')}</a>
773 <a
774 class="btn"
775 href="#"
776 onclick="$('input[class=filediff-collapse-state]').prop('checked', true); updateSticky(); return false">${_('Collapse All Files')}</a>
831
777 832 </div>
778 833 </div>
779 834 </div>
780 835 <div class="fpath-placeholder">
781 836 <i class="icon-file-text"></i>
782 837 <strong class="fpath-placeholder-text">
783 838 Context file:
784 839 </strong>
785 840 </div>
786 841 <div class="sidebar_inner_shadow"></div>
787 842 </div>
788 843 </div>
789 844
790 845 % if diffset:
791
792 846 %if diffset.limited_diff:
793 847 <% file_placeholder = _ungettext('%(num)s file changed', '%(num)s files changed', diffset.changed_files) % {'num': diffset.changed_files} %>
794 848 %else:
795 <% file_placeholder = _ungettext('%(num)s file changed: %(linesadd)s inserted, ''%(linesdel)s deleted', '%(num)s files changed: %(linesadd)s inserted, %(linesdel)s deleted', diffset.changed_files) % {'num': diffset.changed_files, 'linesadd': diffset.lines_added, 'linesdel': diffset.lines_deleted}%>
849 <% file_placeholder = h.literal(_ungettext('%(num)s file changed: <span class="op-added">%(linesadd)s inserted</span>, <span class="op-deleted">%(linesdel)s deleted</span>', '%(num)s files changed: <span class="op-added">%(linesadd)s inserted</span>, <span class="op-deleted">%(linesdel)s deleted</span>',
850 diffset.changed_files) % {'num': diffset.changed_files, 'linesadd': diffset.lines_added, 'linesdel': diffset.lines_deleted}) %>
851
796 852 %endif
797 853 ## case on range-diff placeholder needs to be updated
798 854 % if range_diff_on is True:
799 855 <% file_placeholder = _('Disabled on range diff') %>
800 856 % endif
801 857
802 <script>
803
858 <script type="text/javascript">
804 859 var feedFilesOptions = function (query, initialData) {
805 860 var data = {results: []};
806 861 var isQuery = typeof query.term !== 'undefined';
807 862
808 863 var section = _gettext('Changed files');
809 864 var filteredData = [];
810 865
811 866 //filter results
812 867 $.each(initialData.results, function (idx, value) {
813 868
814 869 if (!isQuery || query.term.length === 0 || value.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0) {
815 870 filteredData.push({
816 871 'id': this.id,
817 872 'text': this.text,
818 873 "ops": this.ops,
819 874 })
820 875 }
821 876
822 877 });
823 878
824 879 data.results = filteredData;
825 880
826 881 query.callback(data);
827 882 };
828 883
884 var selectionFormatter = function(data, escapeMarkup) {
885 var container = '<div class="filelist" style="padding-right:100px">{0}</div>';
886 var tmpl = '<div><strong>{0}</strong></div>'.format(escapeMarkup(data['text']));
887 var pill = '<div class="pill-group" style="position: absolute; top:7px; right: 0">' +
888 '<span class="pill" op="added">{0}</span>' +
889 '<span class="pill" op="deleted">{1}</span>' +
890 '</div>'
891 ;
892 var added = data['ops']['added'];
893 if (added === 0) {
894 // don't show +0
895 added = 0;
896 } else {
897 added = '+' + added;
898 }
899
900 var deleted = -1*data['ops']['deleted'];
901
902 tmpl += pill.format(added, deleted);
903 return container.format(tmpl);
904 };
829 905 var formatFileResult = function(result, container, query, escapeMarkup) {
830 return function(data, escapeMarkup) {
831 var container = '<div class="filelist" style="padding-right:100px">{0}</div>';
832 var tmpl = '<span style="margin-right:-50px"><strong>{0}</strong></span>'.format(escapeMarkup(data['text']));
833 var pill = '<span class="pill-group" style="float: right;margin-right: -100px">' +
834 '<span class="pill" op="added">{0}</span>' +
835 '<span class="pill" op="deleted">{1}</span>' +
836 '</span>'
837 ;
838 var added = data['ops']['added'];
839 if (added === 0) {
840 // don't show +0
841 added = 0;
842 } else {
843 added = '+' + added;
844 }
845
846 var deleted = -1*data['ops']['deleted'];
847
848 tmpl += pill.format(added, deleted);
849 return container.format(tmpl);
850
851 }(result, escapeMarkup);
906 return selectionFormatter(result, escapeMarkup);
852 907 };
853 908
854 var preloadFileFilterData = {
909 var formatSelection = function (data, container) {
910 return '${file_placeholder}'
911 };
912
913 if (window.preloadFileFilterData === undefined) {
914 window.preloadFileFilterData = {}
915 }
916
917 preloadFileFilterData["${diffset_container_id}"] = {
855 918 results: [
856 919 % for filediff in diffset.files:
857 920 {id:"a_${h.FID(filediff.raw_id, filediff.patch['filename'])}",
858 921 text:"${filediff.patch['filename']}",
859 922 ops:${h.json.dumps(filediff.patch['stats'])|n}}${('' if loop.last else ',')}
860 923 % endfor
861 924 ]
862 925 };
863 926
864 $(document).ready(function () {
927 var diffFileFilterId = "#file_filter_" + "${diffset_container_id}";
928 var diffFileFilter = $(diffFileFilterId).select2({
929 'dropdownAutoWidth': true,
930 'width': 'auto',
931
932 containerCssClass: "drop-menu",
933 dropdownCssClass: "drop-menu-dropdown",
934 data: preloadFileFilterData["${diffset_container_id}"],
935 query: function(query) {
936 feedFilesOptions(query, preloadFileFilterData["${diffset_container_id}"]);
937 },
938 initSelection: function(element, callback) {
939 callback({'init': true});
940 },
941 formatResult: formatFileResult,
942 formatSelection: formatSelection
943 });
865 944
866 var fileFilter = $("#file_filter").select2({
867 'dropdownAutoWidth': true,
868 'width': 'auto',
869 'placeholder': "${file_placeholder}",
870 containerCssClass: "drop-menu",
871 dropdownCssClass: "drop-menu-dropdown",
872 data: preloadFileFilterData,
873 query: function(query) {
874 feedFilesOptions(query, preloadFileFilterData);
875 },
876 formatResult: formatFileResult
877 });
945 % if range_diff_on is True:
946 diffFileFilter.select2("enable", false);
947 % endif
948
949 $(diffFileFilterId).on('select2-selecting', function (e) {
950 var idSelector = e.choice.id;
951
952 // expand the container if we quick-select the field
953 $('#'+idSelector).next().prop('checked', false);
954 // hide the mast as we later do preventDefault()
955 $("#select2-drop-mask").click();
878 956
879 % if range_diff_on is True:
880 fileFilter.select2("enable", false);
881 % endif
957 window.location.hash = '#'+idSelector;
958 updateSticky();
959
960 e.preventDefault();
961 });
882 962
883 $("#file_filter").on('click', function (e) {
884 e.preventDefault();
885 var selected = $('#file_filter').select2('data');
886 var idSelector = "#"+selected.id;
887 window.location.hash = idSelector;
888 // expand the container if we quick-select the field
889 $(idSelector).next().prop('checked', false);
890 updateSticky()
891 });
963 </script>
964 % endif
965
966 <script type="text/javascript">
967 $(document).ready(function () {
892 968
893 969 var contextPrefix = _gettext('Context file: ');
894 970 ## sticky sidebar
895 971 var sidebarElement = document.getElementById('diff-file-sticky');
896 972 sidebar = new StickySidebar(sidebarElement, {
897 973 topSpacing: 0,
898 974 bottomSpacing: 0,
899 975 innerWrapperSelector: '.sidebar__inner'
900 976 });
901 977 sidebarElement.addEventListener('affixed.static.stickySidebar', function () {
902 978 // reset our file so it's not holding new value
903 $('.fpath-placeholder-text').html(contextPrefix)
979 $('.fpath-placeholder-text').html(contextPrefix + ' - ')
904 980 });
905 981
906 982 updateSticky = function () {
907 983 sidebar.updateSticky();
908 984 Waypoint.refreshAll();
909 985 };
910 986
911 var animateText = $.debounce(100, function(fPath, anchorId) {
987 var animateText = function (fPath, anchorId) {
912 988 fPath = Select2.util.escapeMarkup(fPath);
913
914 // animate setting the text
915 var callback = function () {
916 $('.fpath-placeholder-text').animate({'opacity': 1.00}, 200)
917 $('.fpath-placeholder-text').html(contextPrefix + '<a href="#a_' + anchorId + '">' + fPath + '</a>')
918 };
919 $('.fpath-placeholder-text').animate({'opacity': 0.15}, 200, callback);
920 });
989 $('.fpath-placeholder-text').html(contextPrefix + '<a href="#a_' + anchorId + '">' + fPath + '</a>')
990 };
921 991
922 992 ## dynamic file waypoints
923 993 var setFPathInfo = function(fPath, anchorId){
924 994 animateText(fPath, anchorId)
925 995 };
926 996
927 997 var codeBlock = $('.filediff');
998
928 999 // forward waypoint
929 1000 codeBlock.waypoint(
930 1001 function(direction) {
931 1002 if (direction === "down"){
932 1003 setFPathInfo($(this.element).data('fPath'), $(this.element).data('anchorId'))
933 1004 }
934 1005 }, {
935 offset: 70,
1006 offset: function () {
1007 return 70;
1008 },
936 1009 context: '.fpath-placeholder'
937 1010 }
938 1011 );
939 1012
940 1013 // backward waypoint
941 1014 codeBlock.waypoint(
942 1015 function(direction) {
943 1016 if (direction === "up"){
944 1017 setFPathInfo($(this.element).data('fPath'), $(this.element).data('anchorId'))
945 1018 }
946 1019 }, {
947 1020 offset: function () {
948 return -this.element.clientHeight + 90
1021 return -this.element.clientHeight + 90;
949 1022 },
950 1023 context: '.fpath-placeholder'
951 1024 }
952 1025 );
953 1026
1027 toggleWideDiff = function (el) {
1028 updateSticky();
1029 var wide = Rhodecode.comments.toggleWideMode(this);
1030 storeUserSessionAttr('rc_user_session_attr.wide_diff_mode', wide);
1031 if (wide === true) {
1032 $(el).addClass('btn-active');
1033 } else {
1034 $(el).removeClass('btn-active');
1035 }
1036 return null;
1037 };
1038
954 1039 var preloadDiffMenuData = {
955 1040 results: [
956 ## Wide diff mode
957 {
958 id: 1,
959 text: _gettext('Toggle Wide Mode diff'),
960 action: function () {
961 updateSticky();
962 var wide = Rhodecode.comments.toggleWideMode(this);
963 storeUserSessionAttr('rc_user_session_attr.wide_diff_mode', wide);
964 return null;
965 },
966 url: null,
967 },
968 1041
969 1042 ## Whitespace change
970 1043 % if request.GET.get('ignorews', '') == '1':
971 1044 {
972 1045 id: 2,
973 1046 text: _gettext('Show whitespace changes'),
974 1047 action: function () {},
975 1048 url: "${h.current_route_path(request, ignorews=0)|n}"
976 1049 },
977 1050 % else:
978 1051 {
979 1052 id: 2,
980 1053 text: _gettext('Hide whitespace changes'),
981 1054 action: function () {},
982 1055 url: "${h.current_route_path(request, ignorews=1)|n}"
983 1056 },
984 1057 % endif
985 1058
986 1059 ## FULL CONTEXT
987 1060 % if request.GET.get('fullcontext', '') == '1':
988 1061 {
989 1062 id: 3,
990 1063 text: _gettext('Hide full context diff'),
991 1064 action: function () {},
992 1065 url: "${h.current_route_path(request, fullcontext=0)|n}"
993 1066 },
994 1067 % else:
995 1068 {
996 1069 id: 3,
997 1070 text: _gettext('Show full context diff'),
998 1071 action: function () {},
999 1072 url: "${h.current_route_path(request, fullcontext=1)|n}"
1000 1073 },
1001 1074 % endif
1002 1075
1003 1076 ]
1004 1077 };
1005 1078
1006 1079 // get stored diff mode and pre-enable it
1007 1080 if (templateContext.session_attrs.wide_diff_mode === "true") {
1008 1081 Rhodecode.comments.toggleWideMode(null);
1082 $('.toggle-wide-diff').addClass('btn-active');
1009 1083 }
1010 1084
1011 $("#diff_menu").select2({
1085 var diffMenuId = "#diff_menu_" + "${diffset_container_id}";
1086 $(diffMenuId).select2({
1012 1087 minimumResultsForSearch: -1,
1013 containerCssClass: "drop-menu",
1088 containerCssClass: "drop-menu-no-width",
1014 1089 dropdownCssClass: "drop-menu-dropdown",
1015 1090 dropdownAutoWidth: true,
1016 1091 data: preloadDiffMenuData,
1017 placeholder: "${_('Diff Options')}",
1092 placeholder: "${_('...')}",
1018 1093 });
1019 $("#diff_menu").on('select2-selecting', function (e) {
1094 $(diffMenuId).on('select2-selecting', function (e) {
1020 1095 e.choice.action();
1021 1096 if (e.choice.url !== null) {
1022 1097 window.location = e.choice.url
1023 1098 }
1024 1099 });
1025
1100 toggleExpand = function (el, diffsetEl) {
1101 var el = $(el);
1102 if (el.hasClass('collapsed')) {
1103 $('.filediff-collapse-state.collapse-{0}'.format(diffsetEl)).prop('checked', false);
1104 el.removeClass('collapsed');
1105 el.html(
1106 '<i class="icon-minus-squared-alt icon-no-margin"></i>' +
1107 _gettext('Collapse all files'));
1108 }
1109 else {
1110 $('.filediff-collapse-state.collapse-{0}'.format(diffsetEl)).prop('checked', true);
1111 el.addClass('collapsed');
1112 el.html(
1113 '<i class="icon-plus-squared-alt icon-no-margin"></i>' +
1114 _gettext('Expand all files'));
1115 }
1116 updateSticky()
1117 }
1026 1118 });
1027
1028 1119 </script>
1029 % endif
1030 1120
1031 1121 </%def>
@@ -1,369 +1,369 b''
1 1 <%inherit file="/base/base.mako"/>
2 2
3 3 <%def name="title(*args)">
4 4 ${_('{} Files').format(c.repo_name)}
5 5 %if hasattr(c,'file'):
6 6 &middot; ${(h.safe_unicode(c.file.path) or '\\')}
7 7 %endif
8 8
9 9 %if c.rhodecode_name:
10 10 &middot; ${h.branding(c.rhodecode_name)}
11 11 %endif
12 12 </%def>
13 13
14 14 <%def name="breadcrumbs_links()">
15 15 ${_('Files')}
16 16 %if c.file:
17 17 @ ${h.show_id(c.commit)}
18 18 %endif
19 19 </%def>
20 20
21 21 <%def name="menu_bar_nav()">
22 22 ${self.menu_items(active='repositories')}
23 23 </%def>
24 24
25 25 <%def name="menu_bar_subnav()">
26 26 ${self.repo_menu(active='files')}
27 27 </%def>
28 28
29 29 <%def name="main()">
30 30 <script type="text/javascript">
31 31 var fileSourcePage = ${c.file_source_page};
32 32 var atRef = '${request.GET.get('at', '')}';
33 33
34 34 // global state for fetching metadata
35 35 metadataRequest = null;
36 36
37 37 // global metadata about URL
38 38 filesUrlData = ${h.files_url_data(request)|n};
39 39 </script>
40 40
41 41 <div>
42 <div id="files_data">
42 <div>
43 43 <%include file='files_pjax.mako'/>
44 44 </div>
45 45 </div>
46 46
47 47 <script type="text/javascript">
48 48
49 49 var initFileJS = function () {
50 50 var state = getFileState();
51 51
52 52 // select code link event
53 53 $("#hlcode").mouseup(getSelectionLink);
54 54
55 55 // file history select2 used for history of file, and switch to
56 56 var initialCommitData = {
57 57 at_ref: atRef,
58 58 id: null,
59 59 text: '${c.commit.raw_id}',
60 60 type: 'sha',
61 61 raw_id: '${c.commit.raw_id}',
62 62 idx: ${c.commit.idx},
63 63 files_url: null,
64 64 };
65 65
66 66 // check if we have ref info.
67 67 var selectedRef = fileTreeRefs[atRef];
68 68 if (selectedRef !== undefined) {
69 69 $.extend(initialCommitData, selectedRef)
70 70 }
71 71
72 72 var loadUrl = pyroutes.url('repo_file_history', {'repo_name': templateContext.repo_name, 'commit_id': state.commit_id,'f_path': state.f_path});
73 73 var cacheKey = '__SINGLE_FILE_REFS__';
74 74 var cachedDataSource = {};
75 75
76 76 var loadRefsData = function (query) {
77 77 $.ajax({
78 78 url: loadUrl,
79 79 data: {},
80 80 dataType: 'json',
81 81 type: 'GET',
82 82 success: function (data) {
83 83 cachedDataSource[cacheKey] = data;
84 84 query.callback({results: data.results});
85 85 }
86 86 });
87 87 };
88 88
89 89 var feedRefsData = function (query, cachedData) {
90 90 var data = {results: []};
91 91 //filter results
92 92 $.each(cachedData.results, function () {
93 93 var section = this.text;
94 94 var children = [];
95 95 $.each(this.children, function () {
96 96 if (query.term.length === 0 || this.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0) {
97 97 children.push(this)
98 98 }
99 99 });
100 100 data.results.push({
101 101 'text': section,
102 102 'children': children
103 103 })
104 104 });
105 105
106 106 query.callback(data);
107 107 };
108 108
109 109 var select2FileHistorySwitcher = function (targetElement, loadUrl, initialData) {
110 110 var formatResult = function (result, container, query) {
111 111 return formatSelect2SelectionRefs(result);
112 112 };
113 113
114 114 var formatSelection = function (data, container) {
115 115 var commit_ref = data;
116 116
117 117 var tmpl = '';
118 118 if (commit_ref.type === 'sha') {
119 119 tmpl = (commit_ref.raw_id || "").substr(0,8);
120 120 } else if (commit_ref.type === 'branch') {
121 121 tmpl = tmpl.concat('<i class="icon-branch"></i> ');
122 122 tmpl = tmpl.concat(escapeHtml(commit_ref.text));
123 123 } else if (commit_ref.type === 'tag') {
124 124 tmpl = tmpl.concat('<i class="icon-tag"></i> ');
125 125 tmpl = tmpl.concat(escapeHtml(commit_ref.text));
126 126 } else if (commit_ref.type === 'book') {
127 127 tmpl = tmpl.concat('<i class="icon-bookmark"></i> ');
128 128 tmpl = tmpl.concat(escapeHtml(commit_ref.text));
129 129 }
130 130 var idx = commit_ref.idx || 0;
131 131 if (idx !== 0) {
132 132 tmpl = tmpl.concat('<span class="select-index-number">r{0}</span>'.format(idx));
133 133 }
134 134 return tmpl
135 135 };
136 136
137 137 $(targetElement).select2({
138 138 dropdownAutoWidth: true,
139 139 width: "resolve",
140 140 containerCssClass: "drop-menu",
141 141 dropdownCssClass: "drop-menu-dropdown",
142 142 query: function(query) {
143 143 var cachedData = cachedDataSource[cacheKey];
144 144 if (cachedData) {
145 145 feedRefsData(query, cachedData)
146 146 } else {
147 147 loadRefsData(query)
148 148 }
149 149 },
150 150 initSelection: function(element, callback) {
151 151 callback(initialData);
152 152 },
153 153 formatResult: formatResult,
154 154 formatSelection: formatSelection
155 155 });
156 156
157 157 };
158 158
159 159 select2FileHistorySwitcher('#file_refs_filter', loadUrl, initialCommitData);
160 160
161 161 $('#file_refs_filter').on('change', function(e) {
162 162 var data = $('#file_refs_filter').select2('data');
163 163 var commit_id = data.id;
164 164
165 165 if ("${c.annotate}" === "True") {
166 166 var url = pyroutes.url('repo_files:annotated',
167 167 {'repo_name': templateContext.repo_name,
168 168 'commit_id': commit_id, 'f_path': state.f_path});
169 169 } else {
170 170 var url = pyroutes.url('repo_files',
171 171 {'repo_name': templateContext.repo_name,
172 172 'commit_id': commit_id, 'f_path': state.f_path});
173 173 }
174 174 window.location = url;
175 175
176 176 });
177 177
178 178 // load file short history
179 179 $('#file_history_overview').on('click', function(e) {
180 180 e.preventDefault();
181 181 path = state.f_path;
182 182 if (path.indexOf("#") >= 0) {
183 183 path = path.slice(0, path.indexOf("#"));
184 184 }
185 185 var url = pyroutes.url('repo_commits_file',
186 186 {'repo_name': templateContext.repo_name,
187 187 'commit_id': state.commit_id, 'f_path': path, 'limit': 6});
188 188 $('#file_history_container').show();
189 189 $('#file_history_container').html('<div class="file-history-inner">{0}</div>'.format(_gettext('Loading ...')));
190 190
191 191 $.pjax({
192 192 url: url,
193 193 container: '#file_history_container',
194 194 push: false,
195 195 timeout: 5000
196 196 });
197 197 });
198 198
199 199 };
200 200
201 201 var initTreeJS = function () {
202 202 var state = getFileState();
203 203 getFilesMetadata();
204 204
205 205 // fuzzy file filter
206 206 fileBrowserListeners(state.node_list_url, state.url_base);
207 207
208 208 // switch to widget
209 209 var initialCommitData = {
210 210 at_ref: atRef,
211 211 id: null,
212 212 text: '${c.commit.raw_id}',
213 213 type: 'sha',
214 214 raw_id: '${c.commit.raw_id}',
215 215 idx: ${c.commit.idx},
216 216 files_url: null,
217 217 };
218 218
219 219 // check if we have ref info.
220 220 var selectedRef = fileTreeRefs[atRef];
221 221 if (selectedRef !== undefined) {
222 222 $.extend(initialCommitData, selectedRef)
223 223 }
224 224
225 225 var loadUrl = pyroutes.url('repo_refs_data', {'repo_name': templateContext.repo_name});
226 226 var cacheKey = '__ALL_FILE_REFS__';
227 227 var cachedDataSource = {};
228 228
229 229 var loadRefsData = function (query) {
230 230 $.ajax({
231 231 url: loadUrl,
232 232 data: {},
233 233 dataType: 'json',
234 234 type: 'GET',
235 235 success: function (data) {
236 236 cachedDataSource[cacheKey] = data;
237 237 query.callback({results: data.results});
238 238 }
239 239 });
240 240 };
241 241
242 242 var feedRefsData = function (query, cachedData) {
243 243 var data = {results: []};
244 244 //filter results
245 245 $.each(cachedData.results, function () {
246 246 var section = this.text;
247 247 var children = [];
248 248 $.each(this.children, function () {
249 249 if (query.term.length === 0 || this.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0) {
250 250 children.push(this)
251 251 }
252 252 });
253 253 data.results.push({
254 254 'text': section,
255 255 'children': children
256 256 })
257 257 });
258 258
259 259 //push the typed in commit idx
260 260 if (!isNaN(query.term)) {
261 261 var files_url = pyroutes.url('repo_files',
262 262 {'repo_name': templateContext.repo_name,
263 263 'commit_id': query.term, 'f_path': state.f_path});
264 264
265 265 data.results.push({
266 266 'text': _gettext('go to numeric commit'),
267 267 'children': [{
268 268 at_ref: null,
269 269 id: null,
270 270 text: 'r{0}'.format(query.term),
271 271 type: 'sha',
272 272 raw_id: query.term,
273 273 idx: query.term,
274 274 files_url: files_url,
275 275 }]
276 276 });
277 277 }
278 278 query.callback(data);
279 279 };
280 280
281 281 var select2RefFileSwitcher = function (targetElement, loadUrl, initialData) {
282 282 var formatResult = function (result, container, query) {
283 283 return formatSelect2SelectionRefs(result);
284 284 };
285 285
286 286 var formatSelection = function (data, container) {
287 287 var commit_ref = data;
288 288
289 289 var tmpl = '';
290 290 if (commit_ref.type === 'sha') {
291 291 tmpl = (commit_ref.raw_id || "").substr(0,8);
292 292 } else if (commit_ref.type === 'branch') {
293 293 tmpl = tmpl.concat('<i class="icon-branch"></i> ');
294 294 tmpl = tmpl.concat(escapeHtml(commit_ref.text));
295 295 } else if (commit_ref.type === 'tag') {
296 296 tmpl = tmpl.concat('<i class="icon-tag"></i> ');
297 297 tmpl = tmpl.concat(escapeHtml(commit_ref.text));
298 298 } else if (commit_ref.type === 'book') {
299 299 tmpl = tmpl.concat('<i class="icon-bookmark"></i> ');
300 300 tmpl = tmpl.concat(escapeHtml(commit_ref.text));
301 301 }
302 302
303 303 var idx = commit_ref.idx || 0;
304 304 if (idx !== 0) {
305 305 tmpl = tmpl.concat('<span class="select-index-number">r{0}</span>'.format(idx));
306 306 }
307 307 return tmpl
308 308 };
309 309
310 310 $(targetElement).select2({
311 311 dropdownAutoWidth: true,
312 312 width: "resolve",
313 313 containerCssClass: "drop-menu",
314 314 dropdownCssClass: "drop-menu-dropdown",
315 315 query: function(query) {
316 316
317 317 var cachedData = cachedDataSource[cacheKey];
318 318 if (cachedData) {
319 319 feedRefsData(query, cachedData)
320 320 } else {
321 321 loadRefsData(query)
322 322 }
323 323 },
324 324 initSelection: function(element, callback) {
325 325 callback(initialData);
326 326 },
327 327 formatResult: formatResult,
328 328 formatSelection: formatSelection
329 329 });
330 330
331 331 };
332 332
333 333 select2RefFileSwitcher('#refs_filter', loadUrl, initialCommitData);
334 334
335 335 $('#refs_filter').on('change', function(e) {
336 336 var data = $('#refs_filter').select2('data');
337 337 window.location = data.files_url
338 338 });
339 339
340 340 };
341 341
342 342 $(document).ready(function() {
343 343 timeagoActivate();
344 344
345 345 if ($('#trimmed_message_box').height() < 50) {
346 346 $('#message_expand').hide();
347 347 }
348 348
349 349 $('#message_expand').on('click', function(e) {
350 350 $('#trimmed_message_box').css('max-height', 'none');
351 351 $(this).hide();
352 352 });
353 353
354 354 if (fileSourcePage) {
355 355 initFileJS()
356 356 } else {
357 357 initTreeJS()
358 358 }
359 359
360 360 var search_GET = "${request.GET.get('search','')}";
361 361 if (search_GET === "1") {
362 362 NodeFilter.initFilter();
363 363 NodeFilter.focus();
364 364 }
365 365 });
366 366
367 367 </script>
368 368
369 369 </%def> No newline at end of file
@@ -1,114 +1,114 b''
1 1 <%inherit file="/base/base.mako"/>
2 2
3 3 <%def name="title()">
4 4 ${_('{} Files Add').format(c.repo_name)}
5 5 %if c.rhodecode_name:
6 6 &middot; ${h.branding(c.rhodecode_name)}
7 7 %endif
8 8 </%def>
9 9
10 10 <%def name="menu_bar_nav()">
11 11 ${self.menu_items(active='repositories')}
12 12 </%def>
13 13
14 14 <%def name="breadcrumbs_links()"></%def>
15 15
16 16 <%def name="menu_bar_subnav()">
17 17 ${self.repo_menu(active='files')}
18 18 </%def>
19 19
20 20 <%def name="main()">
21 21
22 22 <div class="box">
23 23
24 24 <div class="edit-file-title">
25 25 <span class="title-heading">${_('Add new file')} @ <code>${h.show_id(c.commit)}</code></span>
26 26 % if c.commit.branch:
27 27 <span class="tag branchtag">
28 28 <i class="icon-branch"></i> ${c.commit.branch}
29 29 </span>
30 30 % endif
31 31 </div>
32 32
33 33 ${h.secure_form(h.route_path('repo_files_create_file', repo_name=c.repo_name, commit_id=c.commit.raw_id, f_path=c.f_path), id='eform', request=request)}
34 34 <div class="edit-file-fieldset">
35 35 <div class="path-items">
36 36 <ul>
37 37 <li class="breadcrumb-path">
38 38 <div>
39 39 <a href="${h.route_path('repo_files', repo_name=c.repo_name, commit_id=c.commit.raw_id, f_path='')}"><i class="icon-home"></i></a> /
40 40 <a href="${h.route_path('repo_files', repo_name=c.repo_name, commit_id=c.commit.raw_id, f_path=c.f_path)}">${c.f_path}</a> ${('/' if c.f_path else '')}
41 41 </div>
42 42 </li>
43 43 <li class="location-path">
44 44 <input class="file-name-input input-small" type="text" value="" name="filename" id="filename" placeholder="${_('Filename e.g example.py, or docs/readme.md')}">
45 45 </li>
46 46 </ul>
47 47 </div>
48 48
49 49 </div>
50 50
51 51 <div class="table">
52 <div id="files_data">
52 <div>
53 53
54 54 <div id="codeblock" class="codeblock">
55 55 <div class="editor-items">
56 56 <div class="editor-action active show-editor pull-left" onclick="fileEditor.showEditor(); return false">
57 57 ${_('Edit')}
58 58 </div>
59 59
60 60 <div class="editor-action show-preview pull-left" onclick="fileEditor.showPreview(); return false">
61 61 ${_('Preview')}
62 62 </div>
63 63
64 64 <div class="pull-right">
65 65 ${h.dropdownmenu('line_wrap', 'off', [('on', _('Line wraps on')), ('off', _('line wraps off'))], extra_classes=['last-item'])}
66 66 </div>
67 67 <div class="pull-right">
68 68 ${h.dropdownmenu('set_mode','plain',[('plain', _('plain'))], enable_filter=True)}
69 69 </div>
70 70 </div>
71 71
72 72 <div id="editor_container">
73 73 <pre id="editor_pre"></pre>
74 74 <textarea id="editor" name="content" ></textarea>
75 75 <div id="editor_preview"></div>
76 76 </div>
77 77 </div>
78 78 </div>
79 79 </div>
80 80
81 81 <div class="edit-file-fieldset">
82 82 <div class="fieldset">
83 83 <div class="message">
84 84 <textarea id="commit" name="message" placeholder="${c.default_message}"></textarea>
85 85 </div>
86 86 </div>
87 87 <div class="pull-left">
88 88 ${h.submit('commit_btn',_('Commit changes'), class_="btn btn-small btn-success")}
89 89 </div>
90 90 </div>
91 91 ${h.end_form()}
92 92 </div>
93 93
94 94 <script type="text/javascript">
95 95
96 96 $(document).ready(function () {
97 97 var modes_select = $('#set_mode');
98 98 var filename_selector = '#filename';
99 99 fillCodeMirrorOptions(modes_select);
100 100
101 101 fileEditor = new FileEditor('#editor');
102 102
103 103 // on change of select field set mode
104 104 setCodeMirrorModeFromSelect(modes_select, filename_selector, fileEditor.cm, null);
105 105
106 106 // on entering the new filename set mode, from given extension
107 107 setCodeMirrorModeFromInput(modes_select, filename_selector, fileEditor.cm, null);
108 108
109 109 $('#filename').focus();
110 110
111 111 });
112 112
113 113 </script>
114 114 </%def>
@@ -1,124 +1,124 b''
1 1 <%inherit file="/base/base.mako"/>
2 2
3 3 <%def name="title()">
4 4 ${_('{} Files Edit').format(c.repo_name)}
5 5 %if c.rhodecode_name:
6 6 &middot; ${h.branding(c.rhodecode_name)}
7 7 %endif
8 8 </%def>
9 9
10 10 <%def name="menu_bar_nav()">
11 11 ${self.menu_items(active='repositories')}
12 12 </%def>
13 13
14 14 <%def name="breadcrumbs_links()"></%def>
15 15
16 16 <%def name="menu_bar_subnav()">
17 17 ${self.repo_menu(active='files')}
18 18 </%def>
19 19
20 20 <%def name="main()">
21 21
22 22 <div class="box">
23 23
24 24 <div class="edit-file-title">
25 25 <span class="title-heading">${_('Edit file')} @ <code>${h.show_id(c.commit)}</code></span>
26 26 % if c.commit.branch:
27 27 <span class="tag branchtag">
28 28 <i class="icon-branch"></i> ${c.commit.branch}
29 29 </span>
30 30 % endif
31 31 </div>
32 32
33 33 ${h.secure_form(h.route_path('repo_files_update_file', repo_name=c.repo_name, commit_id=c.commit.raw_id, f_path=c.f_path), id='eform', request=request)}
34 34 <div class="edit-file-fieldset">
35 35 <div class="path-items">
36 36 <ul>
37 37 <li class="breadcrumb-path">
38 38 <div>
39 39 <a href="${h.route_path('repo_files', repo_name=c.repo_name, commit_id=c.commit.raw_id, f_path='')}"><i class="icon-home"></i></a> /
40 40 <a href="${h.route_path('repo_files', repo_name=c.repo_name, commit_id=c.commit.raw_id, f_path=c.file.dir_path)}">${c.file.dir_path}</a> ${('/' if c.file.dir_path else '')}
41 41 </div>
42 42 </li>
43 43 <li class="location-path">
44 44 <input type="hidden" value="${c.f_path}" name="root_path">
45 45 <input class="file-name-input input-small" type="text" value="${c.file.name}" name="filename" id="filename" placeholder="${_('Filename e.g example.py, or docs/readme.md')}">
46 46 </li>
47 47 </ul>
48 48 </div>
49 49
50 50 </div>
51 51
52 52 <div class="table">
53 <div id="files_data">
53 <div>
54 54
55 55 <div id="codeblock" class="codeblock">
56 56 <div class="editor-items">
57 57 <div class="editor-action active show-editor pull-left" onclick="fileEditor.showEditor(); return false">
58 58 ${_('Edit')}
59 59 </div>
60 60
61 61 <div class="editor-action show-preview pull-left" onclick="fileEditor.showPreview(); return false">
62 62 ${_('Preview')}
63 63 </div>
64 64
65 65 <div class="pull-right">
66 66 ${h.dropdownmenu('line_wrap', 'off', [('on', _('Line wraps on')), ('off', _('line wraps off')),])}
67 67 </div>
68 68 <div class="pull-right">
69 69 ${h.dropdownmenu('set_mode','plain',[('plain', _('plain'))],enable_filter=True)}
70 70 </div>
71 71 </div>
72 72
73 73 <div id="editor_container">
74 74 <pre id="editor_pre"></pre>
75 75 <textarea id="editor" name="content" >${h.escape(c.file.content)|n}</textarea>
76 76 <div id="editor_preview" ></div>
77 77 </div>
78 78 </div>
79 79 </div>
80 80 </div>
81 81
82 82 <div class="edit-file-fieldset">
83 83 <div class="fieldset">
84 84 <div class="message">
85 85 <textarea id="commit" name="message" placeholder="${c.default_message}"></textarea>
86 86 </div>
87 87 </div>
88 88 <div class="pull-left">
89 89 ${h.submit('commit_btn',_('Commit changes'), class_="btn btn-small btn-success")}
90 90 </div>
91 91 </div>
92 92 ${h.end_form()}
93 93 </div>
94 94
95 95 <script type="text/javascript">
96 96
97 97 $(document).ready(function() {
98 98 var modes_select = $('#set_mode');
99 99 var filename_selector = '#filename';
100 100 fillCodeMirrorOptions(modes_select);
101 101
102 102 fileEditor = new FileEditor('#editor');
103 103
104 104 // try to detect the mode based on the file we edit
105 105 var detected_mode = detectCodeMirrorMode("${c.file.name}", "${c.file.mimetype}");
106 106
107 107 if (detected_mode) {
108 108 setCodeMirrorMode(fileEditor.cm, detected_mode);
109 109
110 110 var mimetype = $(modes_select).find("option[mode={0}]".format(detected_mode)).val();
111 111 $(modes_select).select2("val", mimetype).trigger('change');
112 112 }
113 113
114 114 // on change of select field set mode
115 115 setCodeMirrorModeFromSelect(modes_select, filename_selector, fileEditor.cm, null);
116 116
117 117 // on entering the new filename set mode, from given extension
118 118 setCodeMirrorModeFromInput(modes_select, filename_selector, fileEditor.cm, null);
119 119
120 120 });
121 121
122 122
123 123 </script>
124 124 </%def>
@@ -1,61 +1,63 b''
1 1 <%namespace name="base" file="/base/base.mako"/>
2 2 <%namespace name="file_base" file="/files/base.mako"/>
3 3
4 4 <div class="summary">
5 5 <div class="fieldset">
6 6 <div class="left-content">
7 7
8 8 <div class="left-content-avatar">
9 9 ${base.gravatar(c.file_last_commit.author_email, 30)}
10 10 </div>
11 11
12 12 <div class="left-content-message">
13 13 <div class="fieldset collapsable-content no-hide" data-toggle="summary-details">
14 14 <div class="commit truncate-wrap">${h.urlify_commit_message(h.chop_at_smart(c.commit.message, '\n', suffix_if_chopped='...'), c.repo_name)}</div>
15 15 </div>
16 16
17 17 <div class="fieldset collapsable-content" data-toggle="summary-details">
18 18 <div class="commit">${h.urlify_commit_message(c.commit.message,c.repo_name)}</div>
19 19 </div>
20 20
21 21 <div class="fieldset" data-toggle="summary-details">
22 22 <div class="" id="file_authors">
23 23 ## loads single author, or ALL
24 24 <%include file='file_authors_box.mako'/>
25 25 </div>
26 26 </div>
27 27 </div>
28 28
29 29 <div class="fieldset collapsable-content" data-toggle="summary-details">
30 30 <div class="left-label-summary-files">
31 31 <p>${_('File last commit')}</p>
32 32 <div class="right-label-summary">
33 33 <code><a href="${h.route_path('repo_commit',repo_name=c.repo_name,commit_id=c.file_last_commit.raw_id)}">${h.show_id(c.file_last_commit)}</a></code>
34
35 34 ${file_base.refs(c.file_last_commit)}
36 35 </div>
37 36 </div>
38 37 </div>
39 38 </div>
40 39
41 40 <div class="right-content">
42 41 <div data-toggle="summary-details">
43 <div class="tags commit-info tags-main">
44 <code><a href="${h.route_path('repo_commit',repo_name=c.repo_name,commit_id=c.commit.raw_id)}">${h.show_id(c.commit)}</a></code>
42 <div class="tags tags-main">
43 <code>
44 <a href="${h.route_path('repo_commit',repo_name=c.repo_name,commit_id=c.commit.raw_id)}">${h.show_id(c.commit)}</a>
45 </code>
46 <i class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${c.commit.raw_id}" title="${_('Copy the full commit id')}"></i>
45 47 ${file_base.refs(c.commit)}
46 48 </div>
47 49 </div>
48 50 </div>
49 51
50 52 <div class="clear-fix"></div>
51 53
52 54 <div class="btn-collapse" data-toggle="summary-details">
53 55 ${_('Show More')}
54 56 </div>
55 57
56 58 </div>
57 59 </div>
58 60
59 61 <script>
60 62 collapsableContent();
61 63 </script>
@@ -1,46 +1,47 b''
1 1 <%namespace name="base" file="/base/base.mako"/>
2 2 <%namespace name="file_base" file="/files/base.mako"/>
3 3
4 4 <div class="summary">
5 5 <div class="fieldset">
6 6 <div class="left-content">
7 7
8 8 <div class="left-content-avatar">
9 9 ${base.gravatar(c.commit.author_email, 30)}
10 10 </div>
11 11
12 12 <div class="left-content-message">
13 13 <div class="fieldset collapsable-content no-hide" data-toggle="summary-details">
14 14 <div class="commit truncate-wrap">${h.urlify_commit_message(h.chop_at_smart(c.commit.message, '\n', suffix_if_chopped='...'), c.repo_name)}</div>
15 15 </div>
16 16
17 17 <div class="fieldset collapsable-content" data-toggle="summary-details">
18 18 <div class="commit">${h.urlify_commit_message(c.commit.message,c.repo_name)}</div>
19 19 </div>
20 20
21 21 <div class="fieldset clear-fix">
22 22 <span class="commit-author">${h.link_to_user(c.commit.author)}</span><span class="commit-date"> - ${h.age_component(c.commit.date)}</span>
23 23 </div>
24 24 </div>
25 25 </div>
26 26
27 27 <div class="right-content">
28 <div class="tags commit-info">
28 <div class="tags">
29 29 <code>
30 30 <a href="${h.route_path('repo_commit',repo_name=c.repo_name,commit_id=c.commit.raw_id)}">${h.show_id(c.commit)}</a>
31 31 </code>
32 32
33 <i class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${c.commit.raw_id}" title="${_('Copy the full commit id')}"></i>
33 34 ${file_base.refs(c.commit)}
34 35 </div>
35 36 </div>
36 37
37 38 <div class="clear-fix"></div>
38 39
39 40 <div class="btn-collapse" data-toggle="summary-details">
40 41 ${_('Show More')}
41 42 </div>
42 43 </div>
43 44 </div>
44 45 <script>
45 46 collapsableContent();
46 47 </script>
@@ -1,211 +1,211 b''
1 1 <%inherit file="/base/base.mako"/>
2 2
3 3 <%def name="title()">
4 4 ${_('{} Files Upload').format(c.repo_name)}
5 5 %if c.rhodecode_name:
6 6 &middot; ${h.branding(c.rhodecode_name)}
7 7 %endif
8 8 </%def>
9 9
10 10 <%def name="menu_bar_nav()">
11 11 ${self.menu_items(active='repositories')}
12 12 </%def>
13 13
14 14 <%def name="breadcrumbs_links()"></%def>
15 15
16 16 <%def name="menu_bar_subnav()">
17 17 ${self.repo_menu(active='files')}
18 18 </%def>
19 19
20 20 <%def name="main()">
21 21
22 22 <div class="box">
23 23 ## Template for uploads
24 24 <div style="display: none" id="tpl-dropzone">
25 25 <div class="dz-preview dz-file-preview">
26 26 <div class="dz-details">
27 27
28 28 <div class="dz-filename">
29 29 <span data-dz-name></span>
30 30 </div>
31 31 <div class="dz-filename-size">
32 32 <span class="dz-size" data-dz-size></span>
33 33
34 34 </div>
35 35
36 36 <div class="dz-sending" style="display: none">${_('Uploading...')}</div>
37 37 <div class="dz-response" style="display: none">
38 38 ${_('Uploaded')} 100%
39 39 </div>
40 40
41 41 </div>
42 42 <div class="dz-progress">
43 43 <span class="dz-upload" data-dz-uploadprogress></span>
44 44 </div>
45 45
46 46 <div class="dz-error-message">
47 47 </div>
48 48 </div>
49 49 </div>
50 50
51 51 <div class="edit-file-title">
52 52 <span class="title-heading">${_('Upload new file')} @ <code>${h.show_id(c.commit)}</code></span>
53 53 % if c.commit.branch:
54 54 <span class="tag branchtag">
55 55 <i class="icon-branch"></i> ${c.commit.branch}
56 56 </span>
57 57 % endif
58 58 </div>
59 59
60 60 <% form_url = h.route_path('repo_files_upload_file', repo_name=c.repo_name, commit_id=c.commit.raw_id, f_path=c.f_path) %>
61 61 ##${h.secure_form(form_url, id='eform', enctype="multipart/form-data", request=request)}
62 62 <div class="edit-file-fieldset">
63 63 <div class="path-items">
64 64 <ul>
65 65 <li class="breadcrumb-path">
66 66 <div>
67 67 <a href="${h.route_path('repo_files', repo_name=c.repo_name, commit_id=c.commit.raw_id, f_path='')}"><i class="icon-home"></i></a> /
68 68 <a href="${h.route_path('repo_files', repo_name=c.repo_name, commit_id=c.commit.raw_id, f_path=c.f_path)}">${c.f_path}</a> ${('/' if c.f_path else '')}
69 69 </div>
70 70 </li>
71 71 <li class="location-path">
72 72
73 73 </li>
74 74 </ul>
75 75 </div>
76 76
77 77 </div>
78 78
79 79 <div class="upload-form table">
80 <div id="files_data">
80 <div>
81 81
82 82 <div class="dropzone-wrapper" id="file-uploader">
83 83 <div class="dropzone-pure">
84 84 <div class="dz-message">
85 85 <i class="icon-upload" style="font-size:36px"></i></br>
86 86 ${_("Drag'n Drop files here or")} <span class="link">${_('Choose your files')}</span>.<br>
87 87 </div>
88 88 </div>
89 89
90 90 </div>
91 91 </div>
92 92
93 93 </div>
94 94
95 95 <div class="upload-form edit-file-fieldset">
96 96 <div class="fieldset">
97 97 <div class="message">
98 98 <textarea id="commit" name="message" placeholder="${c.default_message}"></textarea>
99 99 </div>
100 100 </div>
101 101 <div class="pull-left">
102 102 ${h.submit('commit_btn',_('Commit changes'), class_="btn btn-small btn-success")}
103 103 </div>
104 104 </div>
105 105 ##${h.end_form()}
106 106
107 107 <div class="file-upload-transaction-wrapper" style="display: none">
108 108 <div class="file-upload-transaction">
109 109 <h3>${_('Commiting...')}</h3>
110 110 <p>${_('Please wait while the files are being uploaded')}</p>
111 111 <p class="error" style="display: none">
112 112
113 113 </p>
114 114 <i class="icon-spin animate-spin"></i>
115 115 <p></p>
116 116 </div>
117 117 </div>
118 118
119 119 </div>
120 120
121 121 <script type="text/javascript">
122 122
123 123 $(document).ready(function () {
124 124
125 125 //see: https://www.dropzonejs.com/#configuration
126 126 myDropzone = new Dropzone("div#file-uploader", {
127 127 url: "${form_url}",
128 128 headers: {"X-CSRF-Token": CSRF_TOKEN},
129 129 paramName: function () {
130 130 return "files_upload"
131 131 }, // The name that will be used to transfer the file
132 132 parallelUploads: 20,
133 133 maxFiles: 20,
134 134 uploadMultiple: true,
135 135 //chunking: true, // use chunking transfer, not supported at the moment
136 136 //maxFilesize: 2, // in MBs
137 137 autoProcessQueue: false, // if false queue will not be processed automatically.
138 138 createImageThumbnails: false,
139 139 previewTemplate: document.querySelector('#tpl-dropzone').innerHTML,
140 140 accept: function (file, done) {
141 141 done();
142 142 },
143 143 init: function () {
144 144 this.on("addedfile", function (file) {
145 145
146 146 });
147 147
148 148 this.on("sending", function (file, xhr, formData) {
149 149 formData.append("message", $('#commit').val());
150 150 $(file.previewElement).find('.dz-sending').show();
151 151 });
152 152
153 153 this.on("success", function (file, response) {
154 154 $(file.previewElement).find('.dz-sending').hide();
155 155 $(file.previewElement).find('.dz-response').show();
156 156
157 157 if (response.error !== null) {
158 158 $('.file-upload-transaction-wrapper .error').html('ERROR: {0}'.format(response.error));
159 159 $('.file-upload-transaction-wrapper .error').show();
160 160 $('.file-upload-transaction-wrapper i').hide()
161 161 }
162 162
163 163 var redirect_url = response.redirect_url || '/';
164 164 window.location = redirect_url
165 165
166 166 });
167 167
168 168 this.on("error", function (file, errorMessage, xhr) {
169 169 var error = null;
170 170
171 171 if (xhr !== undefined){
172 172 var httpStatus = xhr.status + " " + xhr.statusText;
173 173 if (xhr.status >= 500) {
174 174 error = httpStatus;
175 175 }
176 176 }
177 177
178 178 if (error === null) {
179 179 error = errorMessage.error || errorMessage || httpStatus;
180 180 }
181 181
182 182 $(file.previewElement).find('.dz-error-message').html('ERROR: {0}'.format(error));
183 183 });
184 184 }
185 185 });
186 186
187 187 $('#commit_btn').on('click', function(e) {
188 188 e.preventDefault();
189 189 var button = $(this);
190 190 if (button.hasClass('clicked')) {
191 191 button.attr('disabled', true);
192 192 } else {
193 193 button.addClass('clicked');
194 194 }
195 195
196 196 var files = myDropzone.getQueuedFiles();
197 197 if (files.length === 0) {
198 198 alert("Missing files");
199 199 e.preventDefault();
200 200 }
201 201
202 202 $('.upload-form').hide();
203 203 $('.file-upload-transaction-wrapper').show();
204 204 myDropzone.processQueue();
205 205
206 206 });
207 207
208 208 });
209 209
210 210 </script>
211 211 </%def>
General Comments 0
You need to be logged in to leave comments. Login now