/*!
- * bootswatch v3.3.4+1
+ * bootswatch v3.3.5
* Homepage: http://bootswatch.com
* Copyright 2012-2015 Thomas Park
* Licensed under MIT
* Based on Bootstrap
*/
-/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
html {
font-family: sans-serif;
-ms-text-size-adjust: 100%;
h3 {
page-break-after: avoid;
}
- select {
- background: #fff !important;
- }
.navbar {
display: none;
}
.text-primary {
color: #2a9fd6;
}
-a.text-primary:hover {
+a.text-primary:hover,
+a.text-primary:focus {
color: #2180ac;
}
.text-success {
color: #ffffff;
}
-a.text-success:hover {
+a.text-success:hover,
+a.text-success:focus {
color: #e6e6e6;
}
.text-info {
color: #ffffff;
}
-a.text-info:hover {
+a.text-info:hover,
+a.text-info:focus {
color: #e6e6e6;
}
.text-warning {
color: #ffffff;
}
-a.text-warning:hover {
+a.text-warning:hover,
+a.text-warning:focus {
color: #e6e6e6;
}
.text-danger {
color: #ffffff;
}
-a.text-danger:hover {
+a.text-danger:hover,
+a.text-danger:focus {
color: #e6e6e6;
}
.bg-primary {
color: #fff;
background-color: #2a9fd6;
}
-a.bg-primary:hover {
+a.bg-primary:hover,
+a.bg-primary:focus {
background-color: #2180ac;
}
.bg-success {
background-color: #77b300;
}
-a.bg-success:hover {
+a.bg-success:hover,
+a.bg-success:focus {
background-color: #558000;
}
.bg-info {
background-color: #9933cc;
}
-a.bg-info:hover {
+a.bg-info:hover,
+a.bg-info:focus {
background-color: #7a29a3;
}
.bg-warning {
background-color: #ff8800;
}
-a.bg-warning:hover {
+a.bg-warning:hover,
+a.bg-warning:focus {
background-color: #cc6d00;
}
.bg-danger {
background-color: #cc0000;
}
-a.bg-danger:hover {
+a.bg-danger:hover,
+a.bg-danger:focus {
background-color: #990000;
}
.page-header {
background-color: #424242;
border-color: #424242;
}
-.btn-default:hover,
.btn-default:focus,
-.btn-default.focus,
+.btn-default.focus {
+ color: #ffffff;
+ background-color: #282828;
+ border-color: #020202;
+}
+.btn-default:hover {
+ color: #ffffff;
+ background-color: #282828;
+ border-color: #232323;
+}
.btn-default:active,
.btn-default.active,
.open > .dropdown-toggle.btn-default {
background-color: #282828;
border-color: #232323;
}
+.btn-default:active:hover,
+.btn-default.active:hover,
+.open > .dropdown-toggle.btn-default:hover,
+.btn-default:active:focus,
+.btn-default.active:focus,
+.open > .dropdown-toggle.btn-default:focus,
+.btn-default:active.focus,
+.btn-default.active.focus,
+.open > .dropdown-toggle.btn-default.focus {
+ color: #ffffff;
+ background-color: #161616;
+ border-color: #020202;
+}
.btn-default:active,
.btn-default.active,
.open > .dropdown-toggle.btn-default {
background-color: #2a9fd6;
border-color: #2a9fd6;
}
-.btn-primary:hover,
.btn-primary:focus,
-.btn-primary.focus,
+.btn-primary.focus {
+ color: #ffffff;
+ background-color: #2180ac;
+ border-color: #15506c;
+}
+.btn-primary:hover {
+ color: #ffffff;
+ background-color: #2180ac;
+ border-color: #1f79a3;
+}
.btn-primary:active,
.btn-primary.active,
.open > .dropdown-toggle.btn-primary {
background-color: #2180ac;
border-color: #1f79a3;
}
+.btn-primary:active:hover,
+.btn-primary.active:hover,
+.open > .dropdown-toggle.btn-primary:hover,
+.btn-primary:active:focus,
+.btn-primary.active:focus,
+.open > .dropdown-toggle.btn-primary:focus,
+.btn-primary:active.focus,
+.btn-primary.active.focus,
+.open > .dropdown-toggle.btn-primary.focus {
+ color: #ffffff;
+ background-color: #1b698e;
+ border-color: #15506c;
+}
.btn-primary:active,
.btn-primary.active,
.open > .dropdown-toggle.btn-primary {
.text-info:hover {
color: #9933cc;
}
+.bg-success,
+.bg-info,
+.bg-warning,
+.bg-danger {
+ color: #fff;
+}
.nav-tabs a,
.nav-pills a,
.breadcrumb a,
/*!
- * bootswatch v3.3.4+1
+ * bootswatch v3.3.5
* Homepage: http://bootswatch.com
* Copyright 2012-2015 Thomas Park
* Licensed under MIT
* Based on Bootstrap
*/
-/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
html {
font-family: sans-serif;
-ms-text-size-adjust: 100%;
h3 {
page-break-after: avoid;
}
- select {
- background: #fff !important;
- }
.navbar {
display: none;
}
.text-primary {
color: #4582ec;
}
-a.text-primary:hover {
+a.text-primary:hover,
+a.text-primary:focus {
color: #1863e6;
}
.text-success {
color: #3fad46;
}
-a.text-success:hover {
+a.text-success:hover,
+a.text-success:focus {
color: #318837;
}
.text-info {
color: #5bc0de;
}
-a.text-info:hover {
+a.text-info:hover,
+a.text-info:focus {
color: #31b0d5;
}
.text-warning {
color: #f0ad4e;
}
-a.text-warning:hover {
+a.text-warning:hover,
+a.text-warning:focus {
color: #ec971f;
}
.text-danger {
color: #d9534f;
}
-a.text-danger:hover {
+a.text-danger:hover,
+a.text-danger:focus {
color: #c9302c;
}
.bg-primary {
color: #fff;
background-color: #4582ec;
}
-a.bg-primary:hover {
+a.bg-primary:hover,
+a.bg-primary:focus {
background-color: #1863e6;
}
.bg-success {
background-color: #dff0d8;
}
-a.bg-success:hover {
+a.bg-success:hover,
+a.bg-success:focus {
background-color: #c1e2b3;
}
.bg-info {
background-color: #d9edf7;
}
-a.bg-info:hover {
+a.bg-info:hover,
+a.bg-info:focus {
background-color: #afd9ee;
}
.bg-warning {
background-color: #fcf8e3;
}
-a.bg-warning:hover {
+a.bg-warning:hover,
+a.bg-warning:focus {
background-color: #f7ecb5;
}
.bg-danger {
background-color: #f2dede;
}
-a.bg-danger:hover {
+a.bg-danger:hover,
+a.bg-danger:focus {
background-color: #e4b9b9;
}
.page-header {
background-color: #ffffff;
border-color: #dddddd;
}
-.btn-default:hover,
.btn-default:focus,
-.btn-default.focus,
+.btn-default.focus {
+ color: #333333;
+ background-color: #e6e6e6;
+ border-color: #9d9d9d;
+}
+.btn-default:hover {
+ color: #333333;
+ background-color: #e6e6e6;
+ border-color: #bebebe;
+}
.btn-default:active,
.btn-default.active,
.open > .dropdown-toggle.btn-default {
background-color: #e6e6e6;
border-color: #bebebe;
}
+.btn-default:active:hover,
+.btn-default.active:hover,
+.open > .dropdown-toggle.btn-default:hover,
+.btn-default:active:focus,
+.btn-default.active:focus,
+.open > .dropdown-toggle.btn-default:focus,
+.btn-default:active.focus,
+.btn-default.active.focus,
+.open > .dropdown-toggle.btn-default.focus {
+ color: #333333;
+ background-color: #d4d4d4;
+ border-color: #9d9d9d;
+}
.btn-default:active,
.btn-default.active,
.open > .dropdown-toggle.btn-default {
background-color: #4582ec;
border-color: #4582ec;
}
-.btn-primary:hover,
.btn-primary:focus,
-.btn-primary.focus,
+.btn-primary.focus {
+ color: #ffffff;
+ background-color: #1863e6;
+ border-color: #1045a1;
+}
+.btn-primary:hover {
+ color: #ffffff;
+ background-color: #1863e6;
+ border-color: #175fdd;
+}
.btn-primary:active,
.btn-primary.active,
.open > .dropdown-toggle.btn-primary {
background-color: #1863e6;
border-color: #175fdd;
}
+.btn-primary:active:hover,
+.btn-primary.active:hover,
+.open > .dropdown-toggle.btn-primary:hover,
+.btn-primary:active:focus,
+.btn-primary.active:focus,
+.open > .dropdown-toggle.btn-primary:focus,
+.btn-primary:active.focus,
+.btn-primary.active.focus,
+.open > .dropdown-toggle.btn-primary.focus {
+ color: #ffffff;
+ background-color: #1455c6;
+ border-color: #1045a1;
+}
.btn-primary:active,
.btn-primary.active,
.open > .dropdown-toggle.btn-primary {
border: 1px solid #ddd;
color: #333333;
}
-.badge {
- padding: 1px 7px 5px;
- vertical-align: 2px;
- font-family: sans-serif;
- font-weight: normal;
-}
-.panel {
- box-shadow: none;
-}
-.panel-default .close {
- color: #333333;
-}
-.modal .close {
- color: #333333;
-}
/*!
- * bootswatch v3.3.4+1
+ * bootswatch v3.3.5
* Homepage: http://bootswatch.com
* Copyright 2012-2015 Thomas Park
* Licensed under MIT
* Based on Bootstrap
*/
-/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
html {
font-family: sans-serif;
-ms-text-size-adjust: 100%;
h3 {
page-break-after: avoid;
}
- select {
- background: #fff !important;
- }
.navbar {
display: none;
}
.text-primary {
color: #7a8288;
}
-a.text-primary:hover {
+a.text-primary:hover,
+a.text-primary:focus {
color: #62686d;
}
.text-success {
color: #ffffff;
}
-a.text-success:hover {
+a.text-success:hover,
+a.text-success:focus {
color: #e6e6e6;
}
.text-info {
color: #ffffff;
}
-a.text-info:hover {
+a.text-info:hover,
+a.text-info:focus {
color: #e6e6e6;
}
.text-warning {
color: #ffffff;
}
-a.text-warning:hover {
+a.text-warning:hover,
+a.text-warning:focus {
color: #e6e6e6;
}
.text-danger {
color: #ffffff;
}
-a.text-danger:hover {
+a.text-danger:hover,
+a.text-danger:focus {
color: #e6e6e6;
}
.bg-primary {
color: #fff;
background-color: #7a8288;
}
-a.bg-primary:hover {
+a.bg-primary:hover,
+a.bg-primary:focus {
background-color: #62686d;
}
.bg-success {
background-color: #62c462;
}
-a.bg-success:hover {
+a.bg-success:hover,
+a.bg-success:focus {
background-color: #42b142;
}
.bg-info {
background-color: #5bc0de;
}
-a.bg-info:hover {
+a.bg-info:hover,
+a.bg-info:focus {
background-color: #31b0d5;
}
.bg-warning {
background-color: #f89406;
}
-a.bg-warning:hover {
+a.bg-warning:hover,
+a.bg-warning:focus {
background-color: #c67605;
}
.bg-danger {
background-color: #ee5f5b;
}
-a.bg-danger:hover {
+a.bg-danger:hover,
+a.bg-danger:focus {
background-color: #e9322d;
}
.page-header {
background-color: #3a3f44;
border-color: #3a3f44;
}
-.btn-default:hover,
.btn-default:focus,
-.btn-default.focus,
+.btn-default.focus {
+ color: #ffffff;
+ background-color: #232628;
+ border-color: #000000;
+}
+.btn-default:hover {
+ color: #ffffff;
+ background-color: #232628;
+ border-color: #1e2023;
+}
.btn-default:active,
.btn-default.active,
.open > .dropdown-toggle.btn-default {
background-color: #232628;
border-color: #1e2023;
}
+.btn-default:active:hover,
+.btn-default.active:hover,
+.open > .dropdown-toggle.btn-default:hover,
+.btn-default:active:focus,
+.btn-default.active:focus,
+.open > .dropdown-toggle.btn-default:focus,
+.btn-default:active.focus,
+.btn-default.active.focus,
+.open > .dropdown-toggle.btn-default.focus {
+ color: #ffffff;
+ background-color: #121415;
+ border-color: #000000;
+}
.btn-default:active,
.btn-default.active,
.open > .dropdown-toggle.btn-default {
background-color: #7a8288;
border-color: #7a8288;
}
-.btn-primary:hover,
.btn-primary:focus,
-.btn-primary.focus,
+.btn-primary.focus {
+ color: #ffffff;
+ background-color: #62686d;
+ border-color: #3e4245;
+}
+.btn-primary:hover {
+ color: #ffffff;
+ background-color: #62686d;
+ border-color: #5d6368;
+}
.btn-primary:active,
.btn-primary.active,
.open > .dropdown-toggle.btn-primary {
background-color: #62686d;
border-color: #5d6368;
}
+.btn-primary:active:hover,
+.btn-primary.active:hover,
+.open > .dropdown-toggle.btn-primary:hover,
+.btn-primary:active:focus,
+.btn-primary.active:focus,
+.open > .dropdown-toggle.btn-primary:focus,
+.btn-primary:active.focus,
+.btn-primary.active.focus,
+.open > .dropdown-toggle.btn-primary.focus {
+ color: #ffffff;
+ background-color: #51565a;
+ border-color: #3e4245;
+}
.btn-primary:active,
.btn-primary.active,
.open > .dropdown-toggle.btn-primary {
div.innerHTML = html;
return div.firstChild;
}
+
+function q(selector) {
+ return document.querySelector(selector);
+}
}
$(function() {
- modal = $('.modal')[0];
- backdrop = $('.backdrop')[0];
+ modal = q('.modal');
+ backdrop = q('.backdrop');
$(modal).on('transitionend', el => {
if(!document.body.classList.contains('modal-open'))
modal.classList.add('hidden');
$(function() {
if(!document.getElementById('sidebar')) {
- const content = $('main')[0];
+ const content = q('main');
content.innerHTML = '<div class="col-md-9">' + content.innerHTML + '</div><aside id="sidebar" class="col-md-3"></aside>';
content.classList.add('row');
}
}
function divine_format() {
- const filename = $('#prog')[0].value;
+ const filename = q('#prog').value;
const ext = /\.([^.]*)$/.exec(filename)[1];
if(ext_table[ext])
- $('#prog_format')[0].value = ext_table[ext];
+ q('#prog_format').value = ext_table[ext];
}
$(() => $('#prog').on('change', divine_format));
$(function(){
- const result = $('#result')[0];
+ const result = q('#result');
$('.jsform > input[type="submit"]').on('click', e => {
const form_data = new FormData(this.parentElement);
const form = this.parentNode;
$(function(){
- const nav = $('nav')[0];
+ const nav = q('nav');
nav.classList.add('hidden-xs');
- $('#title')[0].insertAdjacentHTML('beforebegin', '<div class="text-center visible-xs-block">Tap title to toggle menu</div>');
+ q('#title').insertAdjacentHTML('beforebegin', '<div class="text-center visible-xs-block">Tap title to toggle menu</div>');
$('#title,#logo').on('click', () => nav.classList.toggle('hidden-xs'));
});
const path = location.pathname;
for (const nav in NAVS)
if(path.match(NAVS[nav]))
- $('#nav-' + nav)[0].classList.add('active');
+ q('#nav-' + nav).classList.add('active');
});
document.body.classList.add('transition-color');
setTimeout(() => document.body.classList.remove('transition-color'), 1000);
}
- $('link[title]').each(e => e.disabled = true);
- $('link[title="' + name + '"]')[0].disabled = false;
+ q('html').className = name;
localStorage.setItem("theme", name);
$(function() {
if(name == 'slate' || name == 'cyborg')
'<li><a role="button" data-theme="cyborg">Black</a>' +
'<li><a role="button" data-theme="slate">Grey</a>' +
'<li><a role="button" data-theme="readable">White</a></ul>';
- const sidebar = $('#sidebar')[0];
+ const sidebar = q('#sidebar');
sidebar.insertBefore(m(theme_ul), sidebar.firstChild);
$('#themes a').on('click', e => set_style(e.target.dataset.theme, true));
});
data.contests.forEach(e => contests[e.contest] = 1);
clean_tracker();
- $('#tracker_userlink')[0].innerHTML = data.name;
- $('#tracker_solved')[0].innerHTML = solvednr;
- $('#tracker_attempted')[0].innerHTML = attemptednr;
- $('#tracker_contests')[0].innerHTML = data.contests.length;
- $('#tracker_log')[0].setAttribute('href', '/log/?owner=' + user);
+ q('#tracker_userlink').innerHTML = data.name;
+ q('#tracker_solved').innerHTML = solvednr;
+ q('#tracker_attempted').innerHTML = attemptednr;
+ q('#tracker_contests').innerHTML = data.contests.length;
+ q('#tracker_log').setAttribute('href', '/log/?owner=' + user);
if(location.pathname == '/pb/')
$('table .name a').each(el => {
function start_tracking(user){
localStorage.setItem('tracker_username', user);
- $('#tracker_userlink')[0].setAttribute('href', '/us/' + user);
- $('#tracker_userlink')[0].innerHTML = user;
+ q('#tracker_userlink').setAttribute('href', '/us/' + user);
+ q('#tracker_userlink').innerHTML = user;
tracker.classList.remove('hidden');
update_tracker();
const lastfetch = localStorage.getItem('tracker_lastfetch');
$(function(){
tracker = m('<div id="tracker" class="hidden">Tracking <a id="tracker_userlink"></a>.<br><a id="tracker_stop" role="button">Stop tracking</a><br><a id="tracker_log">Job log</a><dl class="dl-horizontal"><dt>Solved</dt> <dd id="tracker_solved">?</dd><dt>Attempted</dt> <dd id="tracker_attempted">?</dd><dt>Contests</dt> <dd id="tracker_contests">?</dd></dl></div>');
- const sidebar = $('#sidebar')[0];
+ const sidebar = q('#sidebar');
sidebar.insertBefore(tracker, sidebar.firstChild);
$('#tracker_stop').on('click', stop_tracking);
$('#track_user').on('click', function() { stop_tracking(); start_tracking(this.dataset.user) });
$(function(){
- const sidebar = $('#sidebar')[0];
+ const sidebar = q('#sidebar');
const login = document.createElement('div');
login.innerHTML = '<a role="button" id="login" class="show">Log in</a>';
sidebar.insertBefore(login, sidebar.firstChild);
\@blocks
}
+my $default_theme = 'slate';
+
+sub theme_prefix {
+ my ($theme, $decl, $default) = @_;
+ return $decl if $theme eq $default_theme || !$decl;
+ return '' if $decl eq $default;
+
+ $default =~ s/[^{]*{\n//;
+ $default =~ s/\n}[^}]*//;
+ $decl =~ s/^$_$//m for split "\n", $default;
+ $decl =~ s/\n+/\n/g;
+
+ my $prefix = "html.$theme";
+ my ($first_line) = $decl =~ /([^{]*){/;
+ $first_line =~ s/(,\s+)/$1 $prefix /g;
+ $first_line = "$prefix $first_line";
+ $decl =~ s/([^{]*){/$first_line\{/;
+ $decl
+}
+
sub make_css {
- my %css;
- $css{common} .= read_file $_ for <css/*.css>;
+ my $css = join '', map { read_file $_ } <css/*.css>;
- my (%themes, $rndtheme);
+ my (%themes);
for (<css/themes/*>) {
- ($rndtheme) = m,themes/(.*)\.css,;
- $themes{$rndtheme} = read_css_into_blocks $_;
+ my ($theme) = m,themes/(.*)\.css,;
+ $themes{$theme} = read_css_into_blocks $_;
}
+ my @themes = sort grep { $_ ne $default_theme } keys %themes;
while (grep { scalar @$_ } values %themes) {
my %blocks = map { $_ => (shift @{$themes{$_}}) // '' } keys %themes;
- if (grep { $_ ne $blocks{$rndtheme} } values %blocks) {
- $css{$_} .= $blocks{$_} for keys %themes;
- } else {
- $css{common} .= $blocks{$rndtheme};
- }
+ $css .= $blocks{$default_theme};
+ $css .= theme_prefix $_, $blocks{$_}, $blocks{$default_theme} for @themes
}
- write_gzfile "static/css/$_.css", minify $css{$_} for keys %css
+ write_gzfile "static/css/all.css", minify $css
}
sub make_js {
}
}
-my $css_mtime = -M 'static/css/slate.css' // 0;
+my $css_mtime = -M 'static/css/all.css' // 0;
for (<css/*>, <css/themes/*>) {
if (!$css_mtime || $css_mtime > -M) {
make_css;
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="/static/favicon.png" rel="shortcut icon">
-<link href="/static/css/common.css" rel="stylesheet" integrity="x">
-<link href="/static/css/cyborg.css" title="cyborg" rel="alternate stylesheet" integrity="x">
-<link href="/static/css/slate.css" title="slate" rel="stylesheet" integrity="x">
-<link href="/static/css/readable.css" title="readable" rel="alternate stylesheet" integrity="x">
+<link href="/static/css/all.css" rel="stylesheet" integrity="x">
<script src="/static/js/all.js" type="text/javascript" async defer integrity="x"></script>
<body>