Cloned DMOJ

This commit is contained in:
thanhluong 2020-01-21 15:35:58 +09:00
parent f623974b58
commit 49dc9ff10c
513 changed files with 132349 additions and 39 deletions

View file

@ -0,0 +1,10 @@
.wmd-wrapper {
padding-right: 15px !important;
}
.wmd-preview {
margin-top: 15px;
padding: 15px;
word-wrap: break-word;
}

View file

@ -0,0 +1,3 @@
.select2-container {
min-width: 220px !important;
}

674
resources/base.scss Normal file
View file

@ -0,0 +1,674 @@
@charset "UTF-8";
@import "vars";
@-ms-viewport {
min-width: 480px;
max-width: device-width;
}
@-o-viewport {
min-width: 480px;
max-width: device-width;
}
@viewport {
min-width: 480px;
max-width: device-width;
}
a {
color: #1958c1;
&:hover {
color: #0645ad;
}
&:active {
color: #faa700;
}
}
img {
max-width: 100%;
// height: auto
}
.full {
width: 100%;
}
table.sortable thead {
background-color: $background_gray;
color: #666;
font-weight: bold;
cursor: default;
}
th {
&.tablesorter-headerAsc:after {
content: "";
}
&.tablesorter-headerDesc:after {
content: "";
}
}
div {
&.tablesorter-header-inner {
display: inline;
}
}
pre {
white-space: pre-wrap;
}
hr {
display: block;
height: 0;
border: 0;
font-style: italic;
border-bottom: 1px solid $border_gray;
padding: 0;
}
.dashed {
border-bottom: 1px dashed $border_gray;
}
th {
vertical-align: middle;
}
.form-area {
display: inline-block;
background: $background_light_gray;
padding: 5px 10px 10px 15px;
border-radius: $widget_border_radius;
border: 1px solid $border_gray;
}
div.info-float {
float: right;
padding: 10px;
}
footer {
color: gray;
display: block;
width: 100%;
position: absolute;
bottom: 0;
}
body {
position: relative;
min-height: 100%;
margin: 0 auto;
max-width: 107em;
font-size: $base_font_size;
line-height: 1.231;
background: $background_light_gray;
font-family: "Segoe UI", "Lucida Grande", Arial, sans-serif;
color: #000;
height: 100%;
}
.unselectable {
cursor: default;
}
h1 {
font-size: 5em;
letter-spacing: -2px;
margin: 0;
padding: 0;
line-height: 1em;
}
b {
font-weight: bold;
}
h2 {
font-weight: 400;
font-size: 2em;
border-radius: $widget_border_radius;
padding: 0;
margin: 0;
}
h3 {
font-weight: 400;
font-size: 1.4em;
border-radius: $widget_border_radius;
padding: 0;
margin: 0;
}
h4 {
font-size: 1.1em;
padding: 0;
margin: 0;
}
header {
background: #111;
color: #aaa;
text-align: left;
display: block;
height: 60px;
margin-top: -10px;
padding: 10px 10px 10px 5%;
}
#user-links {
top: 0;
right: 0;
position: absolute;
color: #5c5954;
.anon {
padding-right: 10px;
display: inline-flex;
min-height: 100%;
align-items: center;
white-space: nowrap;
}
a {
color: #FFF;
}
li {
text-transform: none;
}
& > ul {
display: block;
margin: 0;
& > li > a > span {
font-size: 13px;
height: 36px;
padding-top: 8px;
display: block;
white-space: nowrap;
& > img {
vertical-align: middle;
border-radius: $widget_border_radius;
display: inline;
margin: 2px 6px 0 5px;
}
& > span {
color: #eee;
vertical-align: middle;
display: inline;
margin-top: 11px;
margin-right: 9px;
padding: 0;
}
}
}
}
#nav-shadow {
height: 3px;
background: linear-gradient(rgba(0, 0, 0, 0.5), transparent);
}
#nav-container {
background: $widget_black;
// opacity: 0.77
// filter: alpha(opacity=77)
height: 100%;
}
#navigation {
position: fixed;
top: 0;
left: 0;
right: 0;
}
nav {
position: relative;
position: -webkit-sticky;
position: sticky;
top: 0;
width: 100%;
margin: 0 auto;
z-index: 500;
text-align: left;
ul {
margin: 0 0 0 -5px !important;
padding: 0 0 0 1%;
text-align: left;
display: inline;
list-style: none;
background: transparent;
li {
display: inline-block;
color: #FFF;
text-transform: uppercase;
position: relative;
&.home-nav-element a {
padding: 0;
height: 44px;
&:hover {
border-bottom: none;
padding-top: 0;
padding-bottom: 0;
}
}
a, button {
display: inline-block;
text-decoration: none;
vertical-align: middle;
color: #FFF;
padding: 13px 7px;
height: 18px;
&:link {
color: #FFF;
}
&:hover {
color: #FFF;
background: rgba(255, 255, 255, 0.25);
margin: 0;
}
&.active {
color: #FFF;
background: $highlight_blue;
}
.nav-expand {
display: none;
}
}
ul {
padding: 0;
position: absolute;
left: 5px;
display: none;
color: #fff;
background: $widget_black;
margin: 0 !important;
box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
li {
&:first-child {
a.active {
border-top: 1px solid $widget_black;
}
}
}
li {
display: block;
a, button {
padding: 8px 20px 8px 8px !important;
font-size: 0.8em;
line-height: 18px;
display: block;
border-left: 4px solid $highlight_blue;
white-space: nowrap;
}
}
}
button {
background: none;
text-align: left;
border: none;
width: 100%;
border-radius: 0;
height: auto;
}
&:hover > ul, &:active > ul, &:focus > ul {
display: block !important;
}
&.home-nav-element a:hover {
border-bottom: 0;
padding-top: 0;
padding-bottom: 0;
background: transparent;
}
}
}
.nav-divider {
width: 1px;
vertical-align: middle;
padding-left: 3px;
display: inline-block;
height: 32px;
margin-right: 1px;
border-right: 3px solid rgba(255, 255, 255, 0.15);
}
}
hr {
color: rgba(0, 0, 0, 0.2);
}
#content {
margin: 52px auto auto;
// Header
width: 90%;
height: 100%;
min-height: 25em;
display: block;
.title {
color: #393630;
}
}
footer {
text-align: center;
height: 40px;
border-top: 1px solid $border_gray;
background: #ededed;
}
html {
position: relative;
height: 100%;
}
a {
text-decoration: none;
display: inline;
}
noscript #noscript {
font-family: Arial, sans-serif;
font-size: 111%;
color: white;
font-weight: bold;
background: $announcement_red;
text-align: center;
padding: 5px 0;
left: 0;
right: 0;
position: fixed;
z-index: 100;
}
#announcement {
font-family: Arial, sans-serif;
font-size: 111%;
color: white;
font-weight: bold;
background: $announcement_red;
text-align: center;
max-width: 30%;
position: fixed;
border-radius: $widget_border_radius;
z-index: 100;
bottom: -4px;
right: -4px;
padding: 5px 6px 6px 5px;
a {
color: orange;
}
}
.time {
color: #555;
}
.toggle {
font-weight: bold;
.fa {
transition: transform 0.4s;
}
&.open .fa {
transform: rotate(90deg);
}
}
#form-errors, .form-errors {
background: rgba(255, 0, 0, 0.3);
border: 3px solid red;
border-radius: $widget_border_radius;
padding: 0 1em 0.1em 1em;
margin: 0.3em 0 0.5em 0;
}
#navicon {
display: none;
}
#nav-placeholder {
height: 47px;
max-width: 107em;
background: white;
border-right: 1px solid $border_gray;
border-left: 1px solid $border_gray;
}
#contest-info {
font-size: 1.25em;
border: 5px solid $highlight_blue;
border-left: 5px dotted white;
border-radius: 0 $widget_border_radius $widget_border_radius 0;
background: rgba(0, 0, 0, 0.77);
z-index: 100000;
padding: 10px 12px;
color: white;
cursor: move;
position: fixed;
left: 20px;
top: 90%;
display: none;
a {
height: 1.4em;
padding: 0;
margin: 0;
color: white;
display: block;
}
}
#contest-time-remaining {
display: inline-block;
}
.spacer {
display: inline-block;
flex: 1 1 1px;
}
#user-links {
height: 100%;
ul {
margin: 0;
li {
display: block;
height: 100%;
a {
display: block;
padding: 0;
height: 100%;
}
}
}
}
#page-container {
min-height: 100%;
position: relative;
margin: 0 auto;
border-right: 1px solid $border_gray;
border-left: 1px solid $border_gray;
background: white;
}
// border-bottom: 1px solid rgb(204, 204, 204)
// border-bottom-left-radius: 4px
// border-bottom-right-radius: 4px
#content-body {
padding-bottom: 4em;
}
// Offset the footer
.title-line-action {
float: right;
margin-top: 1.2em;
}
math {
font-size: 1.155em;
}
.MathJax {
&:focus {
outline: none;
}
}
@media(max-width: 1498px) {
#page-container {
border-left: none;
border-right: none;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
}
@media (max-width: 760px) {
#navigation {
height: 36px;
}
#navicon {
transition-duration: 0.25s;
display: block;
line-height: 26px;
font-size: 2em;
color: #FFF;
padding: 0 0.25em;
margin: 4px 0.25em;
white-space: nowrap;
float: left;
&.hover {
color: #4db7fe;
text-shadow: 0 0 5px $highlight_blue;
transition-duration: 0.25s;
}
}
#nav-list {
display: none;
padding: 0;
margin-left: 0;
border-left: 4px solid $highlight_blue;
position: fixed;
top: 36px;
background: $widget_black;
bottom: 0;
width: 8em;
left: 0;
box-shadow: none;
li {
display: block;
a {
display: block;
.nav-expand {
float: right;
display: block;
height: inherit;
margin: (-13px) -7px;
padding: inherit;
}
}
ul {
left: 8em;
top: auto;
bottom: auto;
margin-top: -36px;
}
&.home-nav-element {
display: none;
}
}
}
#user-links {
bottom: 6px;
right: 6px;
position: absolute;
& > ul > li {
& > a > span {
padding-top: 4px;
height: 32px;
}
& > ul {
left: 0 !important;
margin-top: 0 !important;
}
}
}
#content {
width: auto;
padding: 0 5px;
}
}
@media not all and (max-width: 760px) {
#nav-list {
display: block !important;
li {
&.home-menu-item {
display: none;
}
&:not(:hover) > ul {
display: none !important;
}
ul {
left: 0 !important;
}
}
}
}

BIN
resources/blank.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 B

122
resources/blog.scss Normal file
View file

@ -0,0 +1,122 @@
@import "vars";
.blog-content {
padding-right: 0em;
flex: 73.5%;
vertical-align: top;
margin-right: 0;
.post {
border-bottom: 2px solid $border_gray;
padding-top: 0.5em;
.title {
font-weight: 600;
font-size: 1.7em;
a {
color: #5b80b9 !important;
&:hover {
color: #0645ad !important;
}
}
}
&:last-child {
border-bottom: none;
}
}
}
.blog-sidebar {
flex: 26.5%;
}
.blog-sidebox {
h3 {
padding-bottom: 0.25em;
padding-left: 0.5em;
}
ul {
list-style: none;
padding-left: 1em;
padding-right: 0.5em;
li {
margin-bottom: 0.75em;
}
}
.contest {
padding: 1.25em 0 1.5em 0;
text-align: center;
border-bottom: 1px solid $border_gray;
&:last-child {
border-bottom: none;
}
.name {
font-size: 1.25em;
font-weight: 500;
a {
color: #5b80b9 !important;
&:hover {
color: #0645ad !important;
}
}
}
}
}
@media (min-width: 800px) {
.blog-content, .blog-sidebar {
display: block !important;
}
.blog-content {
margin-right: 1em !important;
}
#mobile.tabs {
display: none;
}
#blog-container {
display: flex;
}
}
#mobile.tabs {
margin: 0;
margin-bottom: 1em;
}
.rssatom {
text-align: right;
padding: 0.25em;
display: block;
span {
width: 1em;
height: 1em;
padding: 0.1em;
font-size: 0.8em;
color: white;
border-radius: 0.2em;
display: inline-block;
margin-right: 0.2em;
border: 1px solid rgb(201, 90, 18);
background: #fb9e39;
background: linear-gradient(135deg, #e46d27 0, #fb9e39 47%, #e46d27 100%);
i {
text-align: center;
display: block;
}
}
}

136
resources/comments.scss Normal file
View file

@ -0,0 +1,136 @@
@import "vars";
.comment-score {
font-weight: bold;
text-align: center;
}
a {
&.upvote-link, &.downvote-link {
color: black;
}
&.voted {
text-shadow: 0 0 4px black, 0 0 9px blue;
}
}
.comment-area {
margin-right: 30px;
h2 {
margin-bottom: 20px;
}
}
.no-comments-message {
margin-top: -15px;
margin-left: 2.75em;
}
.comment-author {
font-weight: bold;
color: #333;
}
.comment-header {
color: rgba(1, 1, 1, 1);
background: rgba(0, 0, 0, 0.1);
padding: 5px 10px 5px 5px;
margin-left: 30px;
border: 1px solid $border_gray;
border-radius: $widget_border_radius;
display: flex;
}
.comment-lock {
width: 100%;
padding-left: 14px;
}
.comment-spacer {
flex: 1;
}
.comment-edits:not(:empty) {
padding-right: 2px;
color: #444;
}
.comment-operation {
float: right;
.fa {
color: #444;
}
a + a {
padding-left: 2px;
}
}
.comments.top-level-comments {
margin-right: -26px;
}
.comment-submit {
width: 100%;
}
.comment-post-wrapper {
div {
padding-bottom: 2px;
padding-right: 10px;
}
input, textarea {
min-width: 100%;
max-width: 100%;
// Hack for 4k on Chrome
font-size: $base_font_size;
}
}
.comment-box {
border-radius: $widget_border_radius;
padding: 5px 10px 10px 15px;
border: 1px solid $border_gray;
background: rgba(0, 0, 0, 0.01);
}
.comment {
list-style: none none;
border-radius: $widget_border_radius;
margin: (-50px) -4px 10px -40px;
padding-top: 50px;
&:target > .comment-box {
border-left: 10px solid $highlight_blue;
padding-left: 5px;
}
&:before {
display: block;
content: " ";
margin-top: -50px;
height: 50px;
visibility: hidden;
}
}
.comment-author {
margin-bottom: 1em;
img {
width: 1.25em;
height: 1.25em;
border-radius: 0.2em;
vertical-align: bottom;
margin-right: 0.3em;
}
}
.comment-body {
word-wrap: break-word;
}

355
resources/common.js Normal file
View file

@ -0,0 +1,355 @@
// IE 8
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function (obj) {
for (var i = 0; i < this.length; i++) {
if (this[i] == obj) {
return i;
}
}
return -1;
}
}
if (!String.prototype.startsWith) {
String.prototype.startsWith = function (searchString, position) {
return this.substr(position || 0, searchString.length) === searchString;
};
}
if (!String.prototype.endsWith) {
String.prototype.endsWith = function (searchString, position) {
var subjectString = this.toString();
if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {
position = subjectString.length;
}
position -= searchString.length;
var lastIndex = subjectString.lastIndexOf(searchString, position);
return lastIndex !== -1 && lastIndex === position;
};
}
// http://stackoverflow.com/a/1060034/1090657
$(function () {
var hidden = 'hidden';
// Standards:
if (hidden in document)
document.addEventListener('visibilitychange', onchange);
else if ((hidden = 'mozHidden') in document)
document.addEventListener('mozvisibilitychange', onchange);
else if ((hidden = 'webkitHidden') in document)
document.addEventListener('webkitvisibilitychange', onchange);
else if ((hidden = 'msHidden') in document)
document.addEventListener('msvisibilitychange', onchange);
// IE 9 and lower:
else if ('onfocusin' in document)
document.onfocusin = document.onfocusout = onchange;
// All others:
else
window.onpageshow = window.onpagehide
= window.onfocus = window.onblur = onchange;
function onchange(evt) {
var v = 'window-visible', h = 'window-hidden', evtMap = {
focus: v, focusin: v, pageshow: v, blur: h, focusout: h, pagehide: h
};
evt = evt || window.event;
if (evt.type in evtMap)
document.body.className = evtMap[evt.type];
else
document.body.className = this[hidden] ? 'window-hidden' : 'window-visible';
if ('$' in window)
$(window).trigger('dmoj:' + document.body.className);
}
// set the initial state (but only if browser supports the Page Visibility API)
if (document[hidden] !== undefined)
onchange({type: document[hidden] ? 'blur' : 'focus'});
});
function register_toggle(link) {
link.click(function () {
var toggled = link.next('.toggled');
if (toggled.is(':visible')) {
toggled.hide(400);
link.removeClass('open');
link.addClass('closed');
} else {
toggled.show(400);
link.addClass('open');
link.removeClass('closed');
}
});
}
$(function register_all_toggles() {
$('.toggle').each(function () {
register_toggle($(this));
});
});
function featureTest(property, value, noPrefixes) {
var prop = property + ':',
el = document.createElement('test'),
mStyle = el.style;
if (!noPrefixes) {
mStyle.cssText = prop + ['-webkit-', '-moz-', '-ms-', '-o-', ''].join(value + ';' + prop) + value + ';';
} else {
mStyle.cssText = prop + value;
}
return !!mStyle[property];
}
window.fix_div = function (div, height) {
var div_offset = div.offset().top - $('html').offset().top;
var is_moving;
var moving = function () {
div.css('position', 'absolute').css('top', div_offset);
is_moving = true;
};
var fix = function () {
div.css('position', 'fixed').css('top', height);
is_moving = false;
};
($(window).scrollTop() - div_offset > -height) ? fix() : moving();
$(window).scroll(function () {
if (($(window).scrollTop() - div_offset > -height) == is_moving)
is_moving ? fix() : moving();
});
};
$(function () {
if (typeof window.orientation !== 'undefined') {
$(window).resize(function () {
var width = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
$('#viewport').attr('content', width > 480 ? 'initial-scale=1' : 'width=480');
});
}
var $nav_list = $('#nav-list');
$('#navicon').click(function (event) {
event.stopPropagation();
$nav_list.toggle();
if ($nav_list.is(':hidden'))
$(this).blur().removeClass('hover');
else {
$(this).addClass('hover');
$nav_list.find('li ul').css('left', $('#nav-list').width()).hide();
}
}).hover(function () {
$(this).addClass('hover');
}, function () {
$(this).removeClass('hover');
});
$nav_list.find('li a .nav-expand').click(function (event) {
event.preventDefault();
$(this).parent().siblings('ul').css('display', 'block');
});
$nav_list.find('li a').each(function () {
if (!$(this).siblings('ul').length)
return;
$(this).on('contextmenu', function (event) {
event.preventDefault();
}).on('taphold', function () {
$(this).siblings('ul').css('display', 'block');
});
});
$nav_list.click(function (event) {
event.stopPropagation();
});
$('html').click(function () {
$nav_list.hide();
});
$.ajaxSetup({
beforeSend: function (xhr, settings) {
if (!(/^(GET|HEAD|OPTIONS|TRACE)$/.test(settings.type)) && !this.crossDomain)
xhr.setRequestHeader('X-CSRFToken', $.cookie('csrftoken'));
}
});
});
if (!Date.now) {
Date.now = function () {
return new Date().getTime();
};
}
function count_down(label) {
var initial = parseInt(label.attr('data-secs'));
var start = Date.now();
function format(num) {
var s = "0" + num;
return s.substr(s.length - 2);
}
var timer = setInterval(function () {
var time = Math.round(initial - (Date.now() - start) / 1000);
if (time <= 0) {
clearInterval(timer);
setTimeout(function() {
window.location.reload();
}, 2000);
}
var d = Math.floor(time / 86400);
var h = Math.floor(time % 86400 / 3600);
var m = Math.floor(time % 3600 / 60);
var s = time % 60;
if (d > 0)
label.text(npgettext('time format with day', '%d day %h:%m:%s', '%d days %h:%m:%s', d)
.replace('%d', d).replace('%h', format(h)).replace('%m', format(m)).replace('%s', format(s)));
else
label.text(pgettext('time format without day', '%h:%m:%s')
.replace('%h', format(h)).replace('%m', format(m)).replace('%s', format(s)));
}, 1000);
}
function register_time(elems, limit) {
limit = limit || 300;
elems.each(function () {
var outdated = false;
var $this = $(this);
var time = moment($this.attr('data-iso'));
var rel_format = $this.attr('data-format');
var abs = $this.text();
function update() {
if ($('body').hasClass('window-hidden'))
return outdated = true;
outdated = false;
if (moment().diff(time, 'days') > limit) {
$this.text(abs);
return;
}
$this.text(rel_format.replace('{time}', time.fromNow()));
setTimeout(update, 10000);
}
$(window).on('dmoj:window-visible', function () {
if (outdated)
update();
});
update();
});
}
$(function () {
register_time($('.time-with-rel'));
$('form').submit(function (evt) {
// Prevent multiple submissions of forms, see #565
$("input[type='submit']").prop('disabled', true);
});
});
window.notification_template = {
icon: '/logo.png'
};
window.notification_timeout = 5000;
window.notify = function (type, title, data, timeout) {
if (localStorage[type + '_notification'] != 'true') return;
var template = window[type + '_notification_template'] || window.notification_template;
var data = (typeof data !== 'undefined' ? $.extend({}, template, data) : template);
var object = new Notification(title, data);
if (typeof timeout === 'undefined')
timeout = window.notification_timeout;
if (timeout)
setTimeout(function () {
object.close();
}, timeout);
return object;
};
window.register_notify = function (type, options) {
if (typeof options === 'undefined')
options = {};
function status_change() {
if ('change' in options)
options.change(localStorage[key] == 'true');
}
var key = type + '_notification';
if ('Notification' in window) {
if (!(key in localStorage) || Notification.permission !== 'granted')
localStorage[key] = 'false';
if ('$checkbox' in options) {
options.$checkbox.change(function () {
var status = $(this).is(':checked');
if (status) {
if (Notification.permission === 'granted') {
localStorage[key] = 'true';
notify(type, 'Notification enabled!');
status_change();
} else
Notification.requestPermission(function (permission) {
if (permission === 'granted') {
localStorage[key] = 'true';
notify(type, 'Notification enabled!');
} else localStorage[key] = 'false';
status_change();
});
} else {
localStorage[key] = 'false';
status_change();
}
}).prop('checked', localStorage[key] == 'true');
}
$(window).on('storage', function (e) {
e = e.originalEvent;
if (e.key === key) {
if ('$checkbox' in options)
options.$checkbox.prop('checked', e.newValue == 'true');
status_change();
}
});
} else {
if ('$checkbox' in options) options.$checkbox.hide();
localStorage[key] = 'false';
}
status_change();
};
$(function () {
// Close dismissable boxes
$("a.close").click(function () {
var $closer = $(this);
$closer.parent().fadeOut(200);
});
});
$.fn.textWidth = function () {
var html_org = $(this).html();
var html_calc = '<span style="white-space: nowrap;">' + html_org + '</span>';
$(this).html(html_calc);
var width = $(this).find('span:first').width();
$(this).html(html_org);
return width;
};
$(function () {
$('.tabs').each(function () {
var $this = $(this), $h2 = $(this).find('h2'), $ul = $(this).find('ul');
var cutoff = ($h2.textWidth() || 400) + 20, handler;
$ul.children().each(function () {
cutoff += $(this).width();
});
$(window).resize(handler = function () {
$this.toggleClass('tabs-no-flex', $this.width() < cutoff);
});
handler();
});
});

View file

@ -0,0 +1,258 @@
@import "vars";
.content-description {
line-height: 1.5em;
font-size: 1em;
font-family: "Segoe UI", "Lucida Grande", Arial, sans-serif;
p {
margin: 1em 0 !important;
padding: 0 !important;
}
img {
max-width: 100%;
height: auto;
}
h1, h2, h3, h4, h5, h6 {
font-weight: normal;
color: #111;
margin-bottom: 0.75em;
padding: 0;
background: 0;
}
h3, h4, h5, h6 {
font-weight: bold;
}
h1 {
font-size: 2.5em;
}
h2 {
font-size: 2em;
}
h3 {
font-size: 1.6em;
margin: 0;
padding: 0;
}
h4 {
font-size: 1.4em;
border-bottom: 1px solid #EEE;
line-height: 1.225;
padding-bottom: 0.3em;
padding-top: 0.5em;
}
h5 {
font-size: 1.15em;
margin-top: 0;
}
h6 {
font-size: 0.9em;
}
blockquote {
color: #666;
margin: 0;
padding-left: 1.5em;
border-left: 0.5em #EEE solid;
}
hr {
display: block;
height: 0;
border: 0;
font-style: italic;
border-bottom: 1px solid $border_gray;
margin: 25px 0 20px 0;
padding: 0;
}
pre, code, kbd, samp, span.code {
color: #000;
page-break-inside: avoid;
font-family: $monospace-fonts;
font-size: 0.98em;
}
code, span.code {
font-family: $monospace-fonts !important;
margin: 0 2px;
padding: 0 5px;
border: 1px solid $border_gray;
background-color: #f8f8f8;
border-radius: $widget_border_radius;
font-size: 0.95em;
color: #444;
}
pre {
code, div.code {
border: 0;
line-height: 1em;
margin: 0;
padding: 0;
background: transparent;
font-size: 1em;
color: black;
}
white-space: pre-wrap;
word-wrap: break-word;
margin: 1.5em 0 1.5em 0;
padding: 1em;
border: 1px solid $border_gray;
background-color: #f8f8f8;
color: black;
border-radius: $widget_border_radius;
}
b, strong {
font-weight: bold;
}
dfn {
font-style: italic;
}
ins {
background: #ff9;
color: #000;
text-decoration: none;
}
mark {
background: #ff0;
color: #000;
font-style: italic;
font-weight: bold;
}
sub {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
top: -0.5em;
}
sub {
bottom: -0.25em;
}
ul, ol {
padding: 0 0 0 2em !important;
}
li p:last-child {
margin: 0;
}
dd {
margin: 0 0 0 2em;
}
img {
border: 0;
-ms-interpolation-mode: bicubic;
vertical-align: middle;
}
td {
vertical-align: top;
}
}
.display-math {
display: block;
text-align: center;
margin-left: auto;
margin-right: auto;
}
@media (min-width: 700px) {
#common-content {
display: flex;
flex-direction: row-reverse;
}
#content-left {
flex: 86%;
width: 100%;
&.split-common-content {
max-width: 86%;
}
.content-description {
width: 100%;
}
}
#content-right {
flex: 14%;
max-width: 12.5em;
min-width: 8em;
padding-left: 1.5em;
padding-top: 1em;
.info-float {
float: none;
padding: 0;
position: sticky;
top: 70px;
width: 100%;
}
}
}
@media not all and (min-width: 700px) {
#content-right .info-float {
float: none;
width: 100% !important;
position: static !important;
box-sizing: border-box;
}
}
a.view-pdf {
padding-top: 0.6em;
display: inline-block;
}
.problem-title {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
.spacer {
display: inline-block;
flex: 1 1 1px;
}
}
.info-float .fa {
color: #000;
padding-right: 0.2em;
}
#problem-types, #allowed-langs {
.toggled {
margin-left: 1.3em;
}
}

215
resources/contest.scss Normal file
View file

@ -0,0 +1,215 @@
@import "vars";
#contest-calendar {
border-collapse: collapse;
width: 100%;
th {
border-bottom: 1px solid $border_gray;
&.sun {
border-left: 1px solid $border_gray;
}
&.sun, &.mon, &.tue, &.wed, &.thu, &.fri, &.sat {
font-size: 0.95em;
border-right: 1px solid $border_gray;
background: $background_light_gray;
}
}
td {
height: 110px;
width: 170px;
color: #000;
vertical-align: top;
text-align: right;
font-size: 0.75em;
border-right: 1px solid $border_gray;
border-bottom: 1px solid $border_gray;
transition-duration: 0.2s;
.num {
font-size: 1.1em;
font-weight: bold;
display: block;
border-bottom: 1px dashed $border_gray;
padding-right: 0.2em;
margin-bottom: 0.4em;
}
ul {
text-decoration: none;
text-align: left;
padding: 0;
margin: 0;
li {
margin-left: 17px;
margin-bottom: 0.2em;
i.fa {
color: orange;
}
a {
text-decoration: none;
color: #222;
&:hover {
text-decoration: underline;
}
}
}
}
&:hover {
background: rgba(0, 0, 255, 0.3);
color: white;
.num {
font-weight: bold;
}
ul li a {
font-weight: normal;
}
}
}
.noday {
background: #f1f1f1;
}
.today {
background: rgba(255, 255, 100, 0.5);
}
tr td:first-child {
border-left: 1px solid #aaa;
}
}
#banner {
border-bottom: 1px solid rgba(0, 0, 0, 0.2);
padding-bottom: 1em;
a.date {
display: block;
text-decoration: none;
text-align: center;
line-height: 1.3;
font-size: 2.3em;
padding-bottom: 0.15em;
&:link, &:visited {
color: #5B80B9;
}
&:hover {
color: #0645AD;
}
}
#time {
text-align: center;
display: block;
color: rgb(85, 85, 85);
font-size: $base_font_size;
}
}
.contest-list {
td {
vertical-align: middle !important;
&:nth-child(2) {
min-width: 4em;
}
&:nth-child(3) {
min-width: 6em;
}
}
tbody tr {
height: 4em;
}
.floating-time-left {
position: absolute;
left: 0;
}
.floating-time-right {
position: absolute;
right: 0;
line-height: 1.2em;
}
.floating-time {
position: absolute;
right: 0;
bottom: 0;
}
.contest-tags {
padding-left: 0.75em;
vertical-align: top;
}
.participate-button {
display: inline-block;
width: 90px;
}
.contest-block {
text-align: left;
padding: 0.5em 0.5em 0.5em 1em;
}
}
.contest-tag {
box-shadow: inset 0 -0.1em 0 rgba(0, 0, 0, 0.12);
padding: 0.15em 0.3em;
border-radius: 0.15em;
font-weight: 600;
margin-right: 0.45em;
position: relative;
}
.contest-list-title {
font-size: 18px;
font-weight: 600;
}
form.contest-join-pseudotab {
display: inline;
padding: 6px 8px !important;
line-height: 1.7em;
margin-left: 0.5em;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
input {
display: inline;
border: none;
padding: 0;
background: none;
font-weight: 600;
}
}
.contest-participation-operation {
float: right;
.fa {
color: #444;
}
a + a {
padding-left: 1px;
}
padding: 0 5px;
}

View file

@ -0,0 +1,58 @@
(function ($) {
var init = function ($element, options) {
$element.select2(options);
};
var initHeavy = function ($element, options) {
var settings = $.extend({
ajax: {
data: function (params) {
return {
term: params.term,
page: params.page,
field_id: $element.data('field_id')
};
},
processResults: function (data, page) {
return {
results: data.results,
pagination: {
more: data.more
}
};
}
}
}, options);
$element.select2(settings);
};
$.fn.djangoSelect2 = function (options) {
var settings = $.extend({}, options);
$.each(this, function (i, element) {
var $element = $(element);
if ($element.hasClass('django-select2-heavy')) {
initHeavy($element, settings);
} else {
init($element, settings);
}
});
return this;
};
$(function () {
$('.django-select2:not([id*=__prefix__])').djangoSelect2({
dropdownAutoWidth: true
});
});
if ('django' in window && 'jQuery' in window.django)
django.jQuery(document).on('formset:added', function(event, $row) {
$row.find('.django-select2').each(function () {
// Notice how we are passing it into a different jQuery.
$(this).djangoSelect2({
dropdownAutoWidth: true
})
});
});
}(jQuery));

View file

@ -0,0 +1,41 @@
div.dmmd-preview {
padding: 0;
}
div.dmmd-preview-update {
background: #ccc;
color: #333;
text-align: center;
cursor: pointer;
border-radius: 4px;
height: 2em;
line-height: 2em;
}
div.dmmd-preview-content {
padding: 0 7px;
}
div.dmmd-preview.dmmd-preview-has-content div.dmmd-preview-update {
border-radius: 4px 4px 0 0;
}
div.dmmd-preview-has-content div.dmmd-preview-content {
padding-bottom: 7px;
}
div.dmmd-no-button div.dmmd-preview-update {
display: none;
}
div.dmmd-no-button div.dmmd-preview-content {
padding-bottom: 0;
}
div.dmmd-no-button:not(.dmmd-preview-has-content) {
display: none;
}
div.dmmd-preview-stale {
background: repeating-linear-gradient(-45deg, #fff, #fff 10px, #f8f8f8 10px, #f8f8f8 20px);
}

99
resources/dmmd-preview.js Normal file
View file

@ -0,0 +1,99 @@
$(function () {
window.register_dmmd_preview = function ($preview) {
var $form = $preview.parents('form').first();
var $update = $preview.find('.dmmd-preview-update');
var $content = $preview.find('.dmmd-preview-content');
var preview_url = $preview.attr('data-preview-url');
var $textarea = $('#' + $preview.attr('data-textarea-id'));
// Submit the form if Ctrl+Enter is pressed in pagedown textarea.
$textarea.keydown(function (ev) {
// Ctrl+Enter pressed (metaKey used to support command key on mac).
if ((ev.metaKey || ev.ctrlKey) && ev.which == 13) {
$form.submit();
}
});
$update.click(function () {
var text = $textarea.val();
if (text) {
$preview.addClass('dmmd-preview-stale');
$.post(preview_url, {
preview: text,
csrfmiddlewaretoken: $.cookie('csrftoken')
}, function (result) {
$content.html(result);
$preview.addClass('dmmd-preview-has-content').removeClass('dmmd-preview-stale');
var $jax = $content.find('.require-mathjax-support');
if ($jax.length) {
if (!('MathJax' in window)) {
$.ajax({
type: 'GET',
url: $jax.attr('data-config'),
dataType: 'script',
cache: true,
success: function () {
$.ajax({
type: 'GET',
url: 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS_HTML',
dataType: 'script',
cache: true,
success: function () {
MathJax.Hub.Queue(function () {
$content.find('.tex-image').hide();
$content.find('.tex-text').show();
});
}
});
}
});
} else {
MathJax.Hub.Queue(['Typeset', MathJax.Hub, $content[0]], function () {
$content.find('.tex-image').hide();
$content.find('.tex-text').show();
});
}
}
});
} else {
$content.empty();
$preview.removeClass('dmmd-preview-has-content').removeClass('dmmd-preview-stale');
}
}).click();
var timeout = $preview.attr('data-timeout');
var last_event = null;
var last_text = $textarea.val();
if (timeout) {
$textarea.on('keyup paste', function () {
var text = $textarea.val();
if (last_text == text) return;
last_text = text;
$preview.addClass('dmmd-preview-stale');
if (last_event)
clearTimeout(last_event);
last_event = setTimeout(function () {
$update.click();
last_event = null;
}, timeout);
});
}
};
$('.dmmd-preview').each(function () {
register_dmmd_preview($(this));
});
if ('django' in window && 'jQuery' in window.django)
django.jQuery(document).on('formset:added', function(event, $row) {
var $preview = $row.find('.dmmd-preview');
if ($preview.length) {
var id = $row.attr('id');
id = id.substr(id.lastIndexOf('-') + 1);
$preview.attr('data-textarea-id', $preview.attr('data-textarea-id').replace('__prefix__', id));
register_dmmd_preview($preview);
}
});
});

68
resources/event.js Normal file
View file

@ -0,0 +1,68 @@
function EventReceiver(websocket, poller, channels, last_msg, onmessage) {
this.websocket_path = websocket;
this.channels = channels;
this.last_msg = last_msg;
this.poller_base = poller;
this.poller_path = poller + channels.join('|');
if (onmessage)
this.onmessage = onmessage;
var receiver = this;
function init_poll() {
function long_poll() {
$.ajax({
url: receiver.poller_path,
data: {last: receiver.last_msg},
success: function (data, status, jqXHR) {
receiver.onmessage(data.message);
receiver.last_msg = data.id;
long_poll();
},
error: function (jqXHR, status, error) {
if (jqXHR.status == 504)
long_poll();
else {
console.log('Long poll failure: ' + status);
console.log(jqXHR);
setTimeout(long_poll, 2000);
}
},
dataType: "json"
});
}
long_poll();
}
this.onwsclose = null;
if (window.WebSocket) {
this.websocket = new WebSocket(websocket);
var timeout = setTimeout(function () {
receiver.websocket.close();
receiver.websocket = null;
init_poll();
}, 2000);
this.websocket.onopen = function (event) {
clearTimeout(timeout);
this.send(JSON.stringify({
command: 'start-msg',
start: last_msg
}));
this.send(JSON.stringify({
command: 'set-filter',
filter: channels
}));
};
this.websocket.onmessage = function (event) {
var data = JSON.parse(event.data);
receiver.onmessage(data.message);
receiver.last_msg = data.id;
};
this.websocket.onclose = function (event) {
if (event.code != 1000 && receiver.onwsclose !== null)
receiver.onwsclose(event);
}
} else {
this.websocket = null;
init_poll();
}
}

BIN
resources/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 797 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square70x70logo src="/mstile-70x70.png"/>
<square150x150logo src="/mstile-150x150.png"/>
<square310x310logo src="/mstile-310x310.png"/>
<wide310x150logo src="/mstile-310x150.png"/>
<TileColor>#00aba9</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

After

Width:  |  Height:  |  Size: 830 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
resources/icons/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

2
resources/icons/icon.svg Normal file
View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512"><g transform="translate(-39.05 141.54)"><ellipse cx="295.05" cy="114.46" stroke="#000" stroke-width="43.98" rx="234.01" ry="234.01"/><path fill="#fcdb05" stroke="#fcdb05" stroke-width="10.1" d="M292.15-97.87c-108.9.25-218 93.24-208.73 229.88 2.64 38.92 18.04 79.05 44.08 112.72 39.74 51.4 104.26 87.73 186.03 81.76 102.46-7.49 196.34-96.45 194.3-215.88-1.97-115.8-98.7-210.83-215.68-208.48m3.57 441.81C170.89 345.96 64.98 240.1 65.85 114.11c.87-127.2 104.19-230.62 231.63-228.85 125.82 1.75 228.06 99.76 227.16 233.15-.82 123.46-102.09 225.84-228.91 225.53"/><path fill="#fcdb05" d="M329.88 125.54c14.59 20.43 31.64 38.19 47.8 56.64 18.38 20.98 18.63 20.64-3.87 36.43a323.13 323.13 0 0 0-21.09 16.03c-6.33 5.26-10.61 6.44-15.2-2.48-12.92-25.09-43.6-78.04-46.49-77.52-2.75.5-32.75 53.64-46.81 78.18-4.61 8.05-8.12 6.99-14.26 1.97-10.9-8.93-22.03-17.76-33.91-25.3-7.58-4.8-7.66-8.16-2.1-14.34 18.41-20.47 57.68-66.13 60-69.4-29.07-6.04-56.94-12-84.88-17.54-10.47-2.08-13.92-4.45-9.3-16.96 4.37-11.77 10.46-23.62 11.68-36.4 1.08-11.3 6.47-11.5 14.62-7.83 25.03 11.27 78.4 35 81.42 35.94 1.08-21.34-7.3-80.7-8.72-89.9-1.03-6.76 1.2-9.53 8.58-9.25 14.79.55 29.67 1.08 44.38-.14 11.37-.94 13.17 4.21 11.53 13.08-5.22 28.16-5.58 56.73-7.83 86.7 26.11-11.44 51.64-22 76.59-33.8 14.14-6.68 16.52-6.37 20.02 8.05 2.92 12.02 7.6 23.6 11.58 35.24 4.15 12.13-1.5 13.41-9.92 15.16-27.61 5.72-55.22 11.5-83.82 17.46"/></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
resources/icons/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

16
resources/icons/logo.svg Normal file
View file

@ -0,0 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" width="160" height="44">
<g transform="matrix(.08265 0 0 -.0827 -18.736 55.375)">
<path fill="#FCDB05" stroke="#FCDB05" stroke-width="10" d="M477.898 612.007c-107.844-.25-215.89-92.284-206.703-227.507 6.614-97.33 93.848-202.26 227.87-192.475 101.47 7.41 194.44 95.456 192.42 213.653-1.96 114.6-97.744 208.65-213.587 206.33m3.533-437.256c-123.62-2.002-228.5 102.77-227.64 227.46.87 125.882 103.18 228.238 229.38 226.488 124.6-1.727 225.85-98.733 224.96-230.748-.82-122.186-101.1-223.51-226.69-223.2"/>
<path fill="#fcdb05" d="M515.264 390.9c14.44-20.215 31.333-37.793 47.34-56.057 18.196-20.76 18.438-20.43-3.845-36.05-7.16-5.014-14.16-10.288-20.88-15.868-6.27-5.203-10.51-6.375-15.06 2.458-12.79 24.824-43.17 77.232-46.028 76.716-2.73-.5-32.438-53.09-46.36-77.37-4.567-7.97-8.044-6.92-14.116-1.95-10.807 8.84-21.825 17.57-33.59 25.03-7.504 4.75-7.585 8.08-2.073 14.2 18.23 20.26 57.116 65.45 59.423 68.69-28.8 5.974-56.39 11.873-84.065 17.355-10.37 2.055-13.786 4.4-9.2 16.78 4.32 11.65 10.353 23.38 11.56 36.02 1.067 11.187 6.41 11.39 14.473 7.76 24.793-11.16 77.644-34.635 80.63-35.575 1.073 21.123-7.233 79.865-8.628 88.975-1.027 6.686 1.18 9.43 8.496 9.157 14.638-.545 29.38-1.074 43.94.132 11.26.932 13.05-4.163 11.42-12.94-5.17-27.87-5.52-56.143-7.755-85.808 25.865 11.322 51.147 21.774 75.85 33.45 14 6.613 16.357 6.306 19.824-7.96 2.892-11.905 7.53-23.366 11.466-34.877 4.11-12.01-1.486-13.28-9.816-15.007-27.35-5.66-54.684-11.38-83.012-17.28"/>
</g>
<g transform="matrix(.53656 0 0 .52273 46.09 -512.12)">
<path fill="#FCDB05" d="M1.8 1045v-46.4h16.4q24.7 0 24.7 22.6 0 10.8-6.8 17.3-6.7 6.5-18 6.5H1.7zm10.4-37.9v29.4h5.2q6.8 0 10.6-4.1 3.9-4.1 3.9-11.1 0-6.6-3.8-10.4-3.8-3.8-10.7-3.8h-5.1z"/>
<path fill="#ffde05" d="M101.5 1045H91.2v-27.8q0-4.5.4-9.9h-.3q-.8 4.3-1.5 6.1l-10.9 31.5h-8.5l-11.1-31.2q-.5-1.3-1.5-6.5h-.3q.4 6.9.4 12v25.7h-9.4v-46.4h15.3l9.5 27.5q1.1 3.3 1.6 6.6h.2q.9-3.8 1.8-6.7l9.5-27.4h14.9v46.4z"/>
<g fill="#ffde05">
<path d="M113.6 1018.2q-2.5 0-4.2-1.5-1.7-1.6-1.7-3.8 0-2.3 1.7-3.8t4.3-1.5q2.6 0 4.3 1.5 1.7 1.5 1.7 3.8 0 2.4-1.7 3.8-1.7 1.5-4.4 1.5zm0 23.7q-2.5 0-4.2-1.6-1.7-1.6-1.7-3.8 0-2.3 1.7-3.8t4.3-1.5q2.6 0 4.3 1.5 1.7 1.5 1.7 3.8 0 2.4-1.7 3.9t-4.4 1.5z"/>
<path d="M129.6 1018.2q-2.5 0-4.2-1.5-1.7-1.6-1.7-3.8 0-2.3 1.7-3.8t4.3-1.5q2.6 0 4.3 1.5 1.7 1.5 1.7 3.8 0 2.4-1.7 3.8-1.7 1.5-4.4 1.5zm0 23.7q-2.5 0-4.2-1.6-1.7-1.6-1.7-3.8 0-2.3 1.7-3.8t4.3-1.5q2.6 0 4.3 1.5 1.7 1.5 1.7 3.8 0 2.4-1.7 3.9t-4.4 1.5z"/>
</g>
<path fill="#aaa" d="M161.7 1045.8q-10 0-16.2-6.5-6.3-6.5-6.3-16.9 0-11 6.4-17.8 6.4-6.8 16.9-6.8 9.9 0 16 6.5t6.1 17.1q0 10.9-6.4 17.6-6.3 6.7-16.6 6.7zm.5-39q-5.5 0-8.7 4.1-3.2 4.1-3.2 10.9 0 6.9 3.2 10.9t8.5 4q5.4 0 8.6-3.9 3.2-3.9 3.2-10.8 0-7.2-3.1-11.2-3.1-4-8.4-4z"/>
<path fill="#aaa" d="M209.6 1026.6q0 9.3-4.3 14.3-4.3 4.9-12.5 4.9-3.7 0-6.8-1.3v-9.8q2.7 2 6 2 7.1 0 7.1-10.6v-27.6h10.5v28z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -0,0 +1,41 @@
{
"name": "DMOJ",
"icons": [
{
"src": "\/android-chrome-36x36.png",
"sizes": "36x36",
"type": "image\/png",
"density": 0.75
},
{
"src": "\/android-chrome-48x48.png",
"sizes": "48x48",
"type": "image\/png",
"density": 1
},
{
"src": "\/android-chrome-72x72.png",
"sizes": "72x72",
"type": "image\/png",
"density": 1.5
},
{
"src": "\/android-chrome-96x96.png",
"sizes": "96x96",
"type": "image\/png",
"density": 2
},
{
"src": "\/android-chrome-144x144.png",
"sizes": "144x144",
"type": "image\/png",
"density": 3
},
{
"src": "\/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image\/png",
"density": 4
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1,19 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="960.000000pt" height="960.000000pt" viewBox="0 0 960.000000 960.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,960.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M4430 9579 c-1066 -77 -2049 -478 -2810 -1146 -900 -791 -1457 -1877
-1597 -3115 -25 -218 -25 -828 0 -1048 126 -1122 585 -2089 1362 -2865 773
-774 1763 -1251 2865 -1381 183 -21 681 -30 891 -15 951 68 1836 397 2584 961
181 137 295 236 474 413 538 531 923 1151 1161 1867 129 386 200 739 231 1150
15 201 6 734 -16 929 -126 1130 -590 2116 -1355 2881 -763 763 -1738 1226
-2855 1355 -166 20 -744 28 -935 14z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 933 B

49
resources/math.scss Normal file
View file

@ -0,0 +1,49 @@
.mwe-math-mathml-inline {
display: inline !important;
}
.mwe-math-mathml-display {
display: block !important;
margin-left: auto;
margin-right: auto;
}
.mwe-math-mathml-a11y {
clip: rect(1px, 1px, 1px, 1px);
overflow: hidden;
position: absolute;
width: 1px;
height: 1px;
opacity: 0;
}
.mwe-math-fallback-image-inline {
display: inline-block;
vertical-align: middle;
}
.mwe-math-fallback-image-display {
display: block;
margin-left: auto !important;
margin-right: auto !important;
}
@font-face {
font-family: 'Latin Modern Math';
src: url('libs/latinmodernmath/latinmodern-math.eot'); /* IE9 Compat Modes */
src: local('Latin Modern Math'), local('LatinModernMath-Regular'),
url('libs/latinmodernmath/latinmodern-math.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('libs/latinmodernmath/latinmodern-math.woff2') format('woff2'), /* Modern Browsers */
url('libs/latinmodernmath/latinmodern-math.woff') format('woff'), /* Modern Browsers */
url('libs/latinmodernmath/latinmodern-math.ttf') format('truetype'); /* Safari, Android, iOS */
font-weight: normal;
font-style: normal;
}
math {
font-family: "Latin Modern Math";
}
img.inline-math {
display: inline;
}

View file

@ -0,0 +1,10 @@
window.MathJax = {
messageStyle: 'none',
tex2jax: {
inlineMath: [
['~', '~'],
['\\(', '\\)']
]
},
showMathMenu: false
};

55
resources/misc.scss Normal file
View file

@ -0,0 +1,55 @@
@import "vars";
#judge-versions {
display: block;
.version {
font-family: $monospace-fonts;
}
.version-blank {
background: #eee;
}
.version-latest {
background: #b3ff3fe6;
}
.version-outdated {
background: #f00c;
color: white;
}
tbody {
display: block;
}
tr {
display: flex;
flex-direction: row;
padding: 0;
&:first-child {
position: sticky;
top: 42px;
line-height: 1.8em;
}
}
td, th {
display: block;
flex: 1 0 110px;
overflow-x: hidden;
height: auto;
padding: 7px 5px;
}
}
.django-as-table {
text-align: left;
th {
vertical-align: top;
padding-top: 4px;
}
}

View file

@ -0,0 +1,17 @@
function mathjax_pagedown($) {
if ('MathJax' in window) {
$.each(window.editors, function (id, editor) {
var preview = $('div.wmd-preview#' + id + '_wmd_preview')[0];
editor.hooks.chain('onPreviewRefresh', function () {
MathJax.Hub.Queue(["Typeset", MathJax.Hub, preview]);
});
MathJax.Hub.Queue(["Typeset", MathJax.Hub, preview]);
});
}
}
window.mathjax_pagedown = mathjax_pagedown;
$(window).load(function () {
(mathjax_pagedown)('$' in window ? $ : django.jQuery);
});

View file

@ -0,0 +1,138 @@
.wmd-panel {
margin: 0;
width: 100%;
min-width: 0;
}
.wmd-button-bar {
width: 100%;
background-color: Silver;
}
.wmd-input {
height: 300px;
width: 100%;
background: #fff;
border: 1px solid DarkGray;
font-family: Consolas, "Liberation Mono", Monaco, "Courier New", monospace !important;
}
.wmd-preview {
background: none;
word-wrap: break-word;
}
.wmd-button-row {
position: relative;
margin: 10px 5px 5px;
padding: 0;
height: 20px;
overflow-x: auto;
}
.wmd-spacer {
width: 1px;
height: 20px;
margin-left: 14px;
position: absolute;
display: inline-block;
list-style: none;
}
.wmd-button {
width: 20px;
height: 20px;
padding-left: 2px;
padding-right: 3px;
position: absolute;
display: inline-block;
list-style: none;
cursor: pointer;
}
.wmd-button > span {
background: url(pagedown/wmd-buttons.png) no-repeat 0 0;
width: 20px;
height: 20px;
display: inline-block;
}
.wmd-spacer1 {
left: 50px;
}
.wmd-spacer2 {
left: 175px;
}
.wmd-spacer3 {
left: 300px;
}
.wmd-prompt-background {
background-color: Black;
}
.wmd-prompt-dialog {
border: 1px solid #999999;
background-color: #F5F5F5;
}
.wmd-prompt-dialog > div {
font-size: 0.8em;
font-family: arial, helvetica, sans-serif;
}
.wmd-prompt-dialog > form > input[type="text"] {
border: 1px solid #999999;
color: black;
}
.wmd-prompt-dialog > form > input[type="button"] {
border: 1px solid #888888;
font-family: trebuchet MS, helvetica, sans-serif;
font-size: 0.8em;
font-weight: bold;
}
.wmd-wrapper {
padding-right: 0 !important;
}
.wmd-preview {
margin-top: 15px;
padding: 7px;
background: white;
line-height: 1.5em;
font-size: 1em;
border: 1px solid #a9a9a9;
border-radius: 5px;
box-sizing: border-box;
}
.wmd-preview:empty {
display: none;
}
.wmd-preview h1, .wmd-preview h2, .wmd-preview h3, .wmd-preview h4, .wmd-preview h5, .wmd-preview h6 {
font-weight: bold !important;
margin-left: 0 !important;
}
.wmd-preview:not(.dmmd-preview) h1 {
font-size: 1.6em !important;
margin: 0 !important;
padding: 0 !important;
}
.wmd-preview:not(.dmmd-preview) h2 {
font-size: 1.4em !important
}
.wmd-preview:not(.dmmd-preview) h3 {
font-size: 1em !important
}
.wmd-preview:not(.dmmd-preview) h4, .wmd-preview:not(.dmmd-preview) h5, .wmd-preview:not(.dmmd-preview) h6 {
font-size: .9em !important
}

292
resources/problem.scss Normal file
View file

@ -0,0 +1,292 @@
#problem-table {
td {
&.category {
text-align: left;
padding: 0 1em;
}
&.problem {
text-align: left;
padding-left: 1em;
width: 100%;
}
&.pp {
text-align: left;
padding-left: 1em;
width: 100%;
}
&.users {
text-align: left;
padding: 0 1em;
white-space: nowrap;
}
&.types {
text-align: left;
padding: 0 1em;
}
&.ac-rate {
white-space: nowrap;
}
&.points {
white-space: nowrap;
}
}
tr {
transition: background-color linear 0.2s;
&:hover {
background: #eaeaea;
}
}
}
#filter-form {
vertical-align: top;
margin-bottom: 0.5em;
margin-top: 0.75em;
a {
margin-right: 5px;
display: inline-block;
padding: 3px 10px;
vertical-align: middle;
}
input {
vertical-align: middle;
margin-bottom: 0.5em;
}
label {
vertical-align: middle;
}
.filter-form-group {
margin-top: 5px;
}
}
#content-right {
&.problems {
flex: 26.5%;
max-width: unset;
padding-top: 0;
}
}
#content-left {
&.problems {
flex: 73.5%;
}
}
#search {
width: 100%;
height: 2.3em;
}
label[for="category"], label[for="type"] {
padding-bottom: 0.25em;
display: block;
}
#category {
margin-top: 0.5em;
width: 100%;
}
#types {
width: 100%;
}
span.type-tag {
white-space: nowrap;
}
ul.problem-list {
list-style: none;
padding-left: 1em;
padding-right: 0.5em;
li {
margin-bottom: 0.5em;
}
}
.pi-name {
font-weight: bold;
}
.pi-name:after {
content: " ";
}
.authors-value, .judges-value {
padding-left: 1.5em;
}
.lang-name:after {
content: ": ";
}
.lang-limit {
margin-left: 1.5em;
}
.solved-problem-color {
color: #44AD41;
}
.unsolved-problem-color {
color: #DE2121;
}
.attempted-problem-color {
color: orange;
}
.submissions-left {
color: black;
font-weight: 600;
text-align: center;
margin-top: 0.5em;
}
.no-submissions-left {
color: red;
}
.organization-tags {
padding-left: 0.75em;
vertical-align: middle;
}
.organization-tag {
box-shadow: inset 0 -0.1em 0 rgba(0, 0, 0, 0.12);
padding: 0.15em 0.3em;
border-radius: 0.15em;
font-weight: 600;
margin-right: 0.45em;
position: relative;
background-color: #ccc;
transform: translateY(+35%);
display: inline-block;
}
.organization-tag a {
color: #000;
}
.pdf-icon {
position: relative;
display: inline-block;
font-size: 1.5em;
.pdf-icon-logo {
color: #d40e13;
}
.pdf-icon-bar {
height: 0.2em;
display: block;
position: absolute;
top: 0.3em;
background: #d40e13;
width: 0.6em;
margin-left: -0.15em;
}
}
.license {
float: left;
font-size: 0.85em;
a {
color: gray;
text-decoration: none;
}
}
.clarify {
float: right;
}
#problem_submit {
width: 100%;
box-sizing: border-box;
.button {
float: right;
padding: 6px 12px;
}
}
@media (max-width: 550px) {
#problem-table tr :nth-child(6) {
display: none;
}
}
@media (max-width: 450px) {
#problem-table tr :nth-child(4) {
display: none;
}
}
@media (max-width: 350px) {
#problem-table tr :nth-child(3) {
display: none;
}
}
#problem-table th a {
color: inherit;
display: block;
padding: 4px 10px;
}
#category, #types {
visibility: hidden;
}
#filter-form .form-label {
margin-top: 0.5em;
font-style: italic;
}
#point-slider {
margin: 30px 15px 10px;
height: 10px;
.noUi-handle {
height: 20px;
width: 16px;
left: -8px;
}
.noUi-handle:before, .noUi-handle:after {
top: 3px;
height: 12px;
}
.noUi-handle:before {
left: 5px;
}
.noUi-handle:after {
left: 8px;
}
.noUi-tooltip {
height: 17px;
line-height: 13px;
padding: 0 3px;
font-size: 13px;
}
}

102
resources/problem_edit.css Normal file
View file

@ -0,0 +1,102 @@
.selector {
width: 840px;
float: left;
}
.selector select {
width: 400px;
height: 17.2em;
}
.selector-available, .selector-chosen {
float: left;
width: 400px;
text-align: center;
margin-bottom: 5px;
}
.selector-chosen select {
border-top: none;
}
.selector-available h2, .selector-chosen h2 {
border: 1px solid #ccc;
background: white bottom left repeat-x;
color: #666;
}
.selector .selector-filter {
background: white;
border: 1px solid #ccc;
border-width: 0 1px;
padding: 3px;
color: #999;
font-size: 10px;
margin: 0;
text-align: left;
}
.selector .selector-filter label,
.inline-group .aligned .selector .selector-filter label {
width: 16px;
padding: 2px;
}
.selector .selector-available input {
width: 360px;
}
.selector ul.selector-chooser {
float: left;
width: 22px;
height: 50px;
background-color: #eee;
margin: 10em 5px 0 5px;
padding: 0;
}
.selector-chooser li {
margin: 0;
padding: 3px;
list-style-type: none;
}
.selector select {
margin-bottom: 10px;
margin-top: 0;
}
.selector-add, .selector-remove {
width: 16px;
height: 16px;
display: block;
text-indent: -3000px;
overflow: hidden;
}
a.selector-chooseall, a.selector-clearall {
display: inline-block;
text-align: left;
margin-left: auto;
margin-right: auto;
font-weight: bold;
color: #666;
}
a.selector-chooseall {
padding: 3px 18px 3px 0;
}
a.selector-clearall {
padding: 3px 0 3px 18px;
}
a.active.selector-chooseall:hover, a.active.selector-clearall:hover {
color: #036;
}
.selector h2 {
font-size: 16px;
font-weight: bold;
margin: 1em 0 0 0;
}

View file

@ -0,0 +1,61 @@
code .hll { background-color: #ffffcc }
code .c { color: #999988; font-style: italic } /* Comment */
code .err { color: #a61717; background-color: #e3d2d2 } /* Error */
code .k { color: #000000; font-weight: bold } /* Keyword */
code .o { color: #000000; font-weight: bold } /* Operator */
code .cm { color: #999988; font-style: italic } /* Comment.Multiline */
code .cp { color: #999999; font-weight: bold; font-style: italic } /* Comment.Preproc */
code .c1 { color: #999988; font-style: italic } /* Comment.Single */
code .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
code .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
code .ge { color: #000000; font-style: italic } /* Generic.Emph */
code .gr { color: #aa0000 } /* Generic.Error */
code .gh { color: #999999 } /* Generic.Heading */
code .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
code .go { color: #888888 } /* Generic.Output */
code .gp { color: #555555 } /* Generic.Prompt */
code .gs { font-weight: bold } /* Generic.Strong */
code .gu { color: #aaaaaa } /* Generic.Subheading */
code .gt { color: #aa0000 } /* Generic.Traceback */
code .kc { color: #000000; font-weight: bold } /* Keyword.Constant */
code .kd { color: #000000; font-weight: bold } /* Keyword.Declaration */
code .kn { color: #000000; font-weight: bold } /* Keyword.Namespace */
code .kp { color: #000000; font-weight: bold } /* Keyword.Pseudo */
code .kr { color: #000000; font-weight: bold } /* Keyword.Reserved */
code .kt { color: #445588; font-weight: bold } /* Keyword.Type */
code .m { color: #009999 } /* Literal.Number */
code .s { color: #d01040 } /* Literal.String */
code .na { color: #008080 } /* Name.Attribute */
code .nb { color: #0086B3 } /* Name.Builtin */
code .nc { color: #445588; font-weight: bold } /* Name.Class */
code .no { color: #008080 } /* Name.Constant */
code .nd { color: #3c5d5d; font-weight: bold } /* Name.Decorator */
code .ni { color: #800080 } /* Name.Entity */
code .ne { color: #990000; font-weight: bold } /* Name.Exception */
code .nf { color: #990000; font-weight: bold } /* Name.Function */
code .nl { color: #990000; font-weight: bold } /* Name.Label */
code .nn { color: #555555 } /* Name.Namespace */
code .nt { color: #000080 } /* Name.Tag */
code .nv { color: #008080 } /* Name.Variable */
code .ow { color: #000000; font-weight: bold } /* Operator.Word */
code .w { color: #bbbbbb } /* Text.Whitespace */
code .mf { color: #009999 } /* Literal.Number.Float */
code .mh { color: #009999 } /* Literal.Number.Hex */
code .mi { color: #009999 } /* Literal.Number.Integer */
code .mo { color: #009999 } /* Literal.Number.Oct */
code .sb { color: #d01040 } /* Literal.String.Backtick */
code .sc { color: #d01040 } /* Literal.String.Char */
code .sd { color: #d01040 } /* Literal.String.Doc */
code .s2 { color: #d01040 } /* Literal.String.Double */
code .se { color: #d01040 } /* Literal.String.Escape */
code .sh { color: #d01040 } /* Literal.String.Heredoc */
code .si { color: #d01040 } /* Literal.String.Interpol */
code .sx { color: #d01040 } /* Literal.String.Other */
code .sr { color: #009926 } /* Literal.String.Regex */
code .s1 { color: #d01040 } /* Literal.String.Single */
code .ss { color: #990073 } /* Literal.String.Symbol */
code .bp { color: #999999 } /* Name.Builtin.Pseudo */
code .vc { color: #008080 } /* Name.Variable.Class */
code .vg { color: #008080 } /* Name.Variable.Global */
code .vi { color: #008080 } /* Name.Variable.Instance */
code .il { color: #009999 } /* Literal.Number.Integer.Long */

105
resources/ranks.scss Normal file
View file

@ -0,0 +1,105 @@
.admin a, .admin {
color: black !important;
font-weight: bold !important;
}
@mixin rate-svg-color($color) {
circle {
stroke: $color;
}
path {
fill: $color;
}
}
svg.rate-box {
width: 1.2em;
circle {
fill: none;
stroke-width: 2px;
}
&.rate-none {
visibility: hidden;
}
&.rate-newbie {
@include rate-svg-color(#999);
}
&.rate-amateur {
@include rate-svg-color(#00a900);
}
&.rate-expert {
@include rate-svg-color(#66f);
}
&.rate-candidate-master {
@include rate-svg-color(#f6f);
}
&.rate-master {
@include rate-svg-color(#dc0);
}
&.rate-grandmaster, &.rate-target {
@include rate-svg-color(#e00);
}
&.rate-target {
circle:last-child {
stroke: none;
fill: #e00;
}
}
}
.rating {
font-weight: bold;
}
.rate-none, .rate-none a {
color: black;
font-weight: normal;
}
.rate-newbie, .rate-newbie a {
color: #999;
}
.rate-amateur, .rate-amateur a {
color: #00a900;
}
.rate-expert, .rate-expert a {
color: blue;
}
.rate-candidate-master, .rate-candidate-master a {
color: purple;
}
.rate-master, .rate-master a {
color: #ffb100;
}
.rate-grandmaster, .rate-grandmaster a, .rate-target, .rate-target a {
color: #e00;
}
.rate-group {
white-space: nowrap;
display: inline-block;
color: black;
.rating {
display: inline-block;
}
.rate-box {
margin-right: 0.2em;
vertical-align: bottom;
}
}

44
resources/status.scss Normal file
View file

@ -0,0 +1,44 @@
.AB {
background-color: #CCC;
color: black;
}
.AC {
background-color: #53f23f;
color: green;
}
._AC {
background-color: #DFFF00;
color: green;
}
.WA {
background-color: #CCC;
color: #ef1b53;
}
.TLE, .MLE {
background-color: #CCC;
color: black;
}
.OLE, .IR, .RTE, .OTH {
background-color: #FAB623;
color: black;
}
.CE {
background-color: #CCC;
color: black;
}
.IE {
background-color: red;
color: black;
}
.QU, .G {
background: white;
color: black;
}

14
resources/style.scss Normal file
View file

@ -0,0 +1,14 @@
@import "base";
@import "table";
@import "math";
@import "status";
@import "blog";
@import "problem";
@import "ranks";
@import "users";
@import "content-description";
@import "widgets";
@import "comments";
@import "submission";
@import "contest";
@import "misc";

325
resources/submission.scss Normal file
View file

@ -0,0 +1,325 @@
.info-float {
position: sticky;
top: 60px;
width: 20%;
}
#submissions-table {
background: rgba(0, 0, 0, .01);
}
.submission-row {
display: flex;
border-left: #ccc 1px solid;
border-right: #ccc 1px solid;
transition: background-color linear 0.2s;
&:hover {
background: #F2F2F2;
}
&:first-of-type {
border-top: #ccc 1px solid;
}
> div {
padding: 7px 5px;
vertical-align: middle;
border-bottom: #ccc 1px solid;
display: flex;
flex-direction: column;
justify-content: center;
}
.sub-result {
min-width: 80px;
width: 80px;
text-align: center;
border-bottom-color: white;
border-right: #ccc 1px solid;
.state {
font-size: 0.7em;
font-weight: bold;
padding-top: 0.5em;
}
.score {
font-size: 1.3em;
color: #000;
}
}
.sub-info {
flex: 1;
padding-left: 20px !important;
.name {
font-weight: 700;
font-size: 1.2em;
}
}
.sub-testcase {
color: #555;
white-space: nowrap;
}
.sub-prop {
a {
white-space: nowrap;
}
}
.sub-usage {
min-width: 70px;
width: 70px;
white-space: nowrap;
text-align: center;
border-left: #ccc 1px solid;
.time {
font-weight: bold;
}
}
}
.sub-prop .fa {
display: none;
}
label[for="language"], label[for="status"] {
padding-bottom: 0.25em;
display: block;
}
#language {
margin-top: 0.5em;
width: 100%;
}
#status {
width: 100%;
}
#statistics-table tr:not(:first-child) td {
border-top: 1px solid white !important;
}
#statistics-table tr:not(:last-child) td:not(:last-child) {
border-right: 1px solid white;
}
#content-left.submission {
flex: 70%;
}
#content-right.submission {
flex: 12%;
min-width: initial;
max-width: 100%;
padding-top: 0;
}
@media(max-width: 700px) {
.sub-prop {
.label {
display: none;
}
.fa {
display: inline-block;
}
}
#fake-info-float {
display: none;
}
#statistics-table {
display: none;
}
#content-left.submission {
flex: 100%;
}
#content-right.submission {
display: none;
}
}
.submission-contest {
color: #555;
}
.source-ln {
color: gray;
border-right: 1px solid gray;
padding-right: 5px;
text-align: right;
a {
color: gray;
display: block;
&:hover {
text-decoration: underline;
}
&::before {
display: block;
content: " ";
margin-top: -50px;
height: 50px;
visibility: hidden;
}
}
}
.source-code pre, .source-ln pre {
margin: 0;
padding: 0;
white-space: pre;
}
.source-code {
padding-left: 15px;
}
.source-wrap {
overflow-x: auto;
}
.statistics-table {
.status {
font-weight: bold;
text-align: left;
}
.count {
color: black;
}
}
#test-cases {
.toggle .fa {
margin-left: -1.28571em;
}
.batch-cases {
margin: 0;
padding-left: 1em;
padding-bottom: 3px;
padding-top: 3px;
display: inline-block;
}
.batch-cases .case-row td b {
font-weight: 500;
}
.case-row td:nth-child(3) {
padding-right: 0;
text-align: right;
}
.case-row td:nth-child(3) span {
float: right;
}
.case-row td:nth-child(4) {
text-align: right;
}
.case-info {
margin: 0;
padding-left: 1em;
padding-bottom: 3px;
padding-top: 3px;
border: 1px solid #2980b9;
border-left-width: .5em;
border-radius: 4px;
color: #222;
}
.case-output {
margin: 0;
margin-right: 1em;
}
table td {
margin: 0;
padding: 0 5px 0 0;
}
.toggle {
font-weight: normal;
}
.case-feedback {
vertical-align: top;
}
.case-ext-feedback {
width: 50%;
}
}
.case-AC {
color: green;
font-weight: bold;
}
.case-_AC {
color: red;
font-weight: bold;
}
.case-WA {
color: red;
font-weight: bold;
}
.case-TLE, .case-SC {
color: gray;
font-weight: bold;
}
.case-MLE, .case-OLE, .case-RTE, .case-IR {
color: orange;
font-weight: bold;
}
.half-hr {
float: left;
width: 30%;
}
.source-wrap {
.line {
position: relative;
}
.highlighter {
position: absolute;
width: 9999px;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
a:active .line .highlighter {
background: rgba(255, 212, 0, 0.48);
}
}
.submission-info {
text-align: right;
float: right;
.submission-date {
color: gray;
}
}

87
resources/table.scss Normal file
View file

@ -0,0 +1,87 @@
@import "vars";
$table_header_rounding: 6px;
.table {
border-spacing: 0;
width: 100%;
margin-left: auto;
margin-right: auto;
margin-bottom: 0.5em;
background: rgba(0, 0, 0, 0.01);
&.striped tr:nth-child(even) {
background: #f7f7f7;
}
td:first-child {
border-color: $border_gray;
border-width: 1px 1px 0 1px;
}
tr:last-child td {
&:first-child {
border: 1px solid $border_gray;
}
border-color: $border_gray;
border-width: 1px 1px 1px 0;
}
thead th {
vertical-align: middle;
&:first-child {
border-top-left-radius: $table_header_rounding;
}
&:last-child {
border-top-right-radius: $table_header_rounding;
}
}
th {
height: 2em;
color: #FFF;
background-color: $widget_black;
border-color: #555;
border-width: 1px 1px 0 0;
border-style: solid;
padding: 4px 10px;
vertical-align: middle;
text-align: center;
white-space: nowrap;
font-weight: 600;
font-size: 1.1em;
&:first-child {
border-top-left-radius: $table_header_rounding;
}
&:last-child {
border-top-right-radius: $table_header_rounding;
}
}
td {
border-color: $border_gray;
border-width: 1px 1px 0 0;
border-style: solid;
padding: 7px 5px;
vertical-align: middle;
text-align: center;
}
// Monkey-patches for awkward table rounding
tr:not(:first-child) th {
border-radius: 0;
}
tr:last-child th {
border-bottom-left-radius: $table_header_rounding;
}
thead tr th {
border-bottom-left-radius: 0 !important;
}
}

169
resources/task_status.css Normal file
View file

@ -0,0 +1,169 @@
.container {
width: 100%;
padding-right: 15px;
padding-left: 15px;
margin-right: auto;
margin-left: auto;
}
@media (min-width: 576px) {
.container {
max-width: 540px;
}
}
@media (min-width: 768px) {
.container {
max-width: 720px;
}
}
@media (min-width: 992px) {
.container {
max-width: 960px;
}
}
@media (min-width: 1200px) {
.container {
max-width: 1140px;
}
}
.jumbotron {
padding: 2rem 1rem;
margin-bottom: 2rem;
background-color: #e9ecef;
border-radius: 0.3rem;
}
@media (min-width: 576px) {
.jumbotron {
padding: 4rem 2rem;
}
}
.jumbotron-fluid {
padding-right: 0;
padding-left: 0;
border-radius: 0;
}
@keyframes progress-bar-stripes {
from {
background-position: 1rem 0;
}
to {
background-position: 0 0;
}
}
.progress {
display: flex;
height: 1rem;
overflow: hidden;
font-size: 0.75rem;
background-color: #e9ecef;
border-radius: 0.25rem;
}
.progress-bar {
display: flex;
flex-direction: column;
justify-content: center;
color: #fff;
text-align: center;
white-space: nowrap;
background-color: #007bff;
transition: width 0.6s ease;
}
@media screen and (prefers-reduced-motion: reduce) {
.progress-bar {
transition: none;
}
}
.progress-bar-striped, .jumbotron .progress.progress-unknown .progress-bar {
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-size: 1rem 1rem;
}
.progress-bar-animated {
animation: progress-bar-stripes 1s linear infinite;
}
html, body {
margin: 0;
padding: 0;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #212529;
text-align: left;
background-color: #fff;
display: flex;
flex-direction: column;
min-height: 100%;
min-height: 100vh;
justify-content: center;
}
.jumbotron .icon {
display: block;
margin: 0 auto 3rem;
max-width: 15rem;
}
.jumbotron .action {
text-align: center;
font-size: 1.25rem;
font-weight: 300;
}
.jumbotron .stage {
text-align: center;
font-weight: 300;
}
.jumbotron .progress {
background: #007bff;
position: relative;
height: 2rem;
}
.jumbotron .progress .progress-bar {
background: #28a745;
font-size: 1.25rem;
height: 2rem;
}
.jumbotron .progress .progress-text {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 2rem;
line-height: 2rem;
font-size: 1.25rem;
text-align: center;
color: #fff;
}
.jumbotron .progress.progress-unknown .progress-bar {
width: 100%;
background-color: #007bff;
}
.jumbotron .progress.progress-complete .progress-bar {
width: 100%;
}
.jumbotron .progress.progress-failed .progress-bar {
width: 100%;
background: #dc3545;
}

View file

@ -0,0 +1,11 @@
<public:component lightweight="true">
<public:attach event="ondocumentready" onevent="unselectable()"/>
<script type="text/javascript">
function unselectable() {
element.onselectstart = function () {
return false;
};
element.setAttribute('unselectable', 'on', 0);
}
</script>
</public:component>

281
resources/users.scss Normal file
View file

@ -0,0 +1,281 @@
@media(min-width: 400px) {
#content-right {
&.users {
padding-left: 1.5em;
}
}
}
#content-right {
&.users {
flex: 40%;
max-width: 17em;
}
}
#content-left {
&.users {
flex: 60%;
}
}
td.user-name {
padding-left: 2em;
text-align: left;
}
tr {
padding-bottom: 96px;
&:target {
background: #fff897;
}
}
th.header.rank {
padding-left: 5px;
}
#search-handle {
width: 100%;
height: 2.3em;
}
.user-search-image, .user-search-name {
vertical-align: middle;
}
.user-search-name {
padding-left: 0.5em;
}
#users-table {
.username {
width: 100%;
}
.header {
vertical-align: middle;
}
.rank, .points, .problems, .username {
white-space: nowrap;
}
tr {
transition: background-color linear .2s;
&:hover {
background: #EAEAEA;
}
&.highlight {
background: #fff897;
}
}
}
#search-form {
display: inline-block;
vertical-align: top;
width: 225px;
float: right;
.select2-selection__arrow {
display: none;
}
.select2-selection__rendered {
cursor: text;
}
.select2-results__option {
position: relative;
}
.select2-results__option--highlighted {
background-color: #DEDEDE !important;
}
li.select2-results__option--highlighted a.user-redirect {
display: inline-block;
}
}
a.user-redirect {
color: #2980b9;
vertical-align: middle;
font-size: 1.2em;
position: absolute;
right: 0.8em;
display: none;
&:hover {
text-shadow: 0 0 2px blue;
}
}
a.edit-profile {
float: right;
padding-top: 1em;
}
.user-problem-group {
h3 {
font-weight: 600;
font-size: 1.25em;
margin-bottom: -10px;
max-height: 20%;
line-height: 2.5em;
}
ul {
-webkit-columns: 300px 4;
-moz-columns: 300px 4;
columns: 300px 4;
list-style-type: none;
margin-top: 0;
margin-left: -20px;
margin-bottom: 0;
}
a img {
max-width: 1em;
margin-right: 3px;
padding-bottom: 1px;
vertical-align: middle;
}
}
.user-info-cell {
padding-left: 15px;
border-left: 1px solid #CCC;
}
.contest-history-cell {
border-left: 1px solid #CCC;
padding: 0 0.5em;
}
.hide-solved-problems {
text-align: right;
overflow: hidden;
}
.hide-solved-problems > span {
position: relative;
display: inline-block;
}
.hide-solved-problems > span:before {
content: "";
position: absolute;
top: 50%;
width: 100000px;
height: 1px;
background: rgba(0, 0, 0, 0.2);
right: 100%;
margin-right: 5px;
}
.user-info-page {
display: flex;
max-width: 100%;
min-height: 0;
}
.user-sidebar {
flex: 0 0 150px;
padding-left: 1em;
}
.user-content {
flex: 1 1;
overflow: hidden;
word-wrap: break-word;
}
@media not all and (min-width: 600px) {
.user-info-page {
display: block;
}
.user-sidebar {
width: 150px;
margin: 0 auto;
}
.user-content {
overflow: visible;
}
}
.pp-table {
.pp {
font-weight: 600;
font-size: 1.4em;
}
.pp-scaled {
font-size: 0.8em;
}
.pp-weighted {
color: #777;
}
div.sub-pp {
text-align: right;
min-width: unset;
width: unset;
border-left: none;
}
td.problem-name {
text-align: left;
padding-left: 1em;
}
td.problem-score {
width: 80px;
}
td.problem-category {
width: 100px;
}
}
#pp-load-link-wrapper {
text-align: center;
border: 1px solid #ccc;
}
#pp-load-more-link {
display: block;
padding: 0.5em 0;
}
.pp-breakdown-header {
font-weight: 600;
font-size: 1.25em;
margin-bottom: 0.2em;
}
#rating-chart {
height: 400px;
margin-top: 1em;
}
#rating-tooltip {
display: none;
position: absolute;
background: rgba(0, 0, 0, 0.7);
color: white;
padding: 3px;
border-radius: 3px;
transition: all .1s ease;
pointer-events: none;
transform: translate(-50%, 0);
&.rate-group {
color: white;
}
}

11
resources/vars.scss Normal file
View file

@ -0,0 +1,11 @@
$highlight_blue: #2980B9;
$widget_black: #3b3b3b;
$border_gray: #ccc;
$background_gray: #ededed;
$background_light_gray: #fafafa;
$announcement_red: #ae0000;
$base_font_size: 14px;
$widget_border_radius: 4px;
$monospace-fonts: Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace;

518
resources/widgets.scss Normal file
View file

@ -0,0 +1,518 @@
@import "vars";
.social i {
display: inline;
font-size: 1.9em;
}
.facebook-this, .tweet-this, .gplus-this {
display: inline;
}
.tweet-this i {
color: #55ACEE;
}
.facebook-this it {
color: #133783;
}
.gplus-this i {
color: #DD4B38;
}
.social {
font-size: 1.3em;
float: right;
}
// Bootstrap-y buttons
.button, button, input[type=submit] {
color: white !important;
text-decoration: none !important;
cursor: pointer;
vertical-align: middle;
white-space: nowrap;
font-weight: 400;
line-height: 1.4;
background: rgb(51, 122, 183) none repeat scroll 0 (0% / auto) padding-box border-box;
background: -webkit-linear-gradient(top, #337ab7 0, #265a88 100%) repeat-x;
background: linear-gradient(to bottom, #337ab7 0, #265a88 100%) repeat-x;
border-radius: $widget_border_radius;
padding: 6px 12px;
display: block;
border: 1px solid #245580;
text-align: center;
// 4k hack
font-size: $base_font_size;
&:hover {
background: #265a88;
}
&.disabled {
background: linear-gradient(to bottom, darkgray 0, gray 100%) repeat-x !important;
border-color: grey !important;
cursor: not-allowed;
}
}
.button.full, input[type=submit].full, button.full {
padding: 6px 0;
}
button:hover, button:hover, input[type=submit]:hover {
background: #265a88;
}
.button:active, button:active, input[type=submit]:hover {
border-color: #245580;
background: #265a88;
}
.inline-button {
display: inline;
vertical-align: top;
padding: 3px 6px;
}
input {
&[type=text], &[type=password], &[type=email], &[type=number] {
padding: 4px 8px;
color: #555;
background: #FFF none;
border: 1px solid $border_gray;
border-radius: $widget_border_radius;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset;
transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s;
box-sizing: border-box;
// Need this explicitly because UA stylesheet for Chrome on 4k makes
// everything look bad otherwise (forces it to 9.3px)
font-size: $base_font_size;
}
&[type=number] {
padding: 2px 0 2px 5px;
}
}
textarea {
padding: 4px 8px;
color: #555;
background: #FFF none;
border: 1px solid $border_gray;
border-radius: $widget_border_radius;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset;
transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s;
box-sizing: border-box;
}
textarea:hover {
border-color: rgba(82, 168, 236, 0.8);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 4px rgba(82, 168, 236, 0.6);
}
input {
&[type="text"]:hover, &[type="password"]:hover {
border-color: rgba(82, 168, 236, 0.8);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 4px rgba(82, 168, 236, 0.6);
}
}
textarea:focus {
border-color: rgba(82, 168, 236, 0.8);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
outline: 0;
}
input {
&[type="text"]:focus, &[type="password"]:focus {
border-color: rgba(82, 168, 236, 0.8);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
outline: 0;
}
}
// Bootstrap-y copy button
.btn-clipboard {
top: 0;
right: 0;
display: block;
font-size: 12px;
color: #767676;
cursor: pointer;
background-color: #FFF;
border: 1px solid #E1E1E8;
border-radius: 0 $widget_border_radius;
position: absolute;
padding: 5px 8px;
}
.copy-clipboard {
position: relative;
margin-top: 1.5em;
}
// Bootstrap-y tabs
.ul_tab_a_active {
color: black;
cursor: default;
background-color: #fff;
border: 1px solid $border_gray;
border-bottom-color: transparent;
border-image: none;
}
.tabs {
border-bottom: 1px solid $border_gray;
margin: 0 0 8px;
width: 100%;
display: flex;
&.tabs-no-flex {
display: block;
}
.tab {
.tab-icon {
padding-right: 0.3em;
color: gray;
}
a, span {
border-top-width: 3px !important;
}
&.active {
a, span {
border-top-color: $highlight_blue !important;
}
.tab-icon {
color: black;
}
}
}
h2 {
color: #393630;
}
> ul {
margin: 0;
padding: 0;
list-style: outside none none;
display: flex;
overflow-x: auto;
overflow-y: hidden;
> li {
margin-bottom: -1px;
position: relative;
display: block;
&.active > a, &.active > span {
@extend .ul_tab_a_active;
&:hover {
@extend .ul_tab_a_active;
}
&:focus {
@extend .ul_tab_a_active;
}
}
> a, > span {
margin-right: 2px;
line-height: 1.42857;
border: 1px solid transparent;
border-radius: $widget_border_radius $widget_border_radius 0 0;
position: relative;
display: block;
padding: 10px 15px;
color: #555;
text-decoration: none;
white-space: nowrap;
}
}
}
}
// Bootstrap-y pagination
ul.pagination a:hover {
color: #FFF;
background: rgba(0, 0, 0, 0.55);
}
ul.pagination {
display: inline-block;
padding-left: 0;
margin: 0;
border-radius: $widget_border_radius;
> {
li {
display: inline;
&:first-child > {
a, span {
margin-left: 0;
border-top-left-radius: $widget_border_radius;
border-bottom-left-radius: $widget_border_radius;
}
}
&:last-child > {
a, span {
margin-left: 0;
border-top-right-radius: $widget_border_radius;
border-bottom-right-radius: $widget_border_radius;
}
}
> {
a, span {
position: relative;
float: left;
padding: 4px 12px;
line-height: 1.42857;
text-decoration: none;
color: #FFF;
background-color: $widget_black;
border: 1px solid #505050;
margin-left: -1px;
}
}
}
.disabled-page > {
a {
color: #888;
background-color: $widget_black;
border-color: #282828;
}
span {
color: #888;
background-color: $widget_black;
border-color: #505050;
}
}
.active-page > {
a {
z-index: 2;
color: #FFF;
background-color: $highlight_blue;
border-color: transparent;
cursor: default;
}
span {
z-index: 2;
color: #FFF;
background-color: $highlight_blue;
border-color: transparent;
cursor: default;
}
}
}
}
.alert {
padding: 15px;
margin-bottom: 20px;
border: 1px solid transparent;
border-radius: $widget_border_radius;
}
.alert-info {
color: #31708f;
background-color: #d9edf7;
border-color: #bce8f1;
}
.alert-warning {
color: #8a6d3b;
background-color: #fcf8e3;
border-color: #faebcc;
}
.alert-danger {
color: #a94442;
background-color: #f2dede;
border-color: #ebccd1;
}
.alert-dismissable, .alert-dismissible {
padding-right: 35px;
}
.alert-dismissable .close, .alert-dismissible .close {
position: relative;
top: -2px;
right: -21px;
color: inherit;
}
.close {
float: right;
font-size: 21px;
font-weight: 700;
line-height: 1;
color: #000;
text-shadow: 0 1px 0 #fff;
filter: alpha(opacity=20);
opacity: 0.2;
}
a.close {
text-decoration: none !important;
font-size: 18px !important;
line-height: 1;
&:hover {
color: black !important;
}
}
.close {
&:focus, &:hover {
color: #000;
text-decoration: none;
cursor: pointer;
filter: alpha(opacity=50);
opacity: 0.5;
}
}
.badge {
min-width: 10px;
padding: 0 7px;
font-size: 12px;
font-weight: 700;
line-height: 1;
color: #fff;
text-align: center;
white-space: nowrap;
vertical-align: middle;
background-color: #e84848;
border-radius: 10px;
box-sizing: border-box;
}
.form-submit-group {
border-top: 1px solid #EEE;
margin-top: 0.8em;
padding-top: 0.5em;
text-align: right;
}
ul.select2-selection__rendered {
padding: 0 5px !important;
}
.sidebox h3 {
margin: 0 -5px;
background: $widget_black;
border-radius: $widget_border_radius $widget_border_radius 0 0;
color: white;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 7px;
font-size: 1.3em;
}
.sidebox h3 .fa {
color: white;
float: right;
margin: 0.2em 0.4em 0 0;
}
.sidebox-content {
border: 1px solid $border_gray;
border-top: none;
margin: 0 -5px;
padding: 1px 0.5em 3px;
&.sidebox-table {
border: none;
padding: 0;
.table {
margin: 0 !important;
}
}
}
.sidebox {
border-top-left-radius: $widget_border_radius;
border-top-right-radius: $widget_border_radius;
padding: 0 5px !important;
padding-bottom: 1.5em !important;
}
.ws-closed {
position: sticky;
top: 42px;
background: $announcement_red;
border-radius: 5px 5px 0 0;
display: none;
}
.ws-closed a {
display: block;
padding: 7px 0;
text-align: center;
color: white;
font-weight: 600;
}
.semibold {
font-weight: 600;
}
.messages {
list-style-type: none;
padding: 0;
li {
padding: 1em 1.5em;
margin-bottom: 1em;
border: 1px solid transparent;
border-radius: 5px;
&.debug {
color: #383d41;
background-color: #e2e3e5;
border-color: #d6d8db;
}
&.info {
color: #0c5460;
background-color: #d1ecf1;
border-color: #bee5eb;
}
&.success {
color: #155724;
background-color: #d4edda;
border-color: #c3e6cb;
}
&.warning {
color: #856404;
background-color: #fff3cd;
border-color: #ffeeba;
}
&.error {
color: #721c24;
background-color: #f8d7da;
border-color: #f5c6cb;
}
}
}

View file

@ -0,0 +1,68 @@
.select2-selection ul li {
list-style-type: inherit;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice {
line-height: unset !important;
}
.wmd-wrapper {
padding-top: 2em;
}
.wmd-wrapper ul.wmd-button-row {
margin-left: 0;
}
.wmd-input {
width: 100% !important;
}
#content .content-description h1,
#content .content-description h2,
#content .content-description h3,
#content .content-description h4,
#content .content-description h5,
#content .content-description h6 {
padding: 0;
}
#content .content-description h5 {
letter-spacing: initial;
text-transform: initial;
}
#content input.select2-search__field {
border: none;
box-shadow: none !important;
}
#content .content-description ul,
#content .content-description ol {
margin: 0;
}
#content .content-description li {
list-style-type: inherit;
}
select[id^=id_contest_problems] {
width: 20em !important;
}
select#id_organizers.django-select2,
select#id_organizations.django-select2,
select#id_tags.django-select2 {
width: 20em;
}
@media (max-width: 780px) {
#content .vLargeTextField {
max-width: unset;
}
}
.dmmd-preview-update {
position: sticky;
top: 38px;
}