// ==UserScript==
// @name pcp - pr0gramm color picker
// @author N0ui
// @namespace pcp
// @include *://pr0gramm.com*
// @version 2.5.1
// @updateURL https://raw.githubusercontent.com/N0ui/pr0gramm-color-picker/master/pcp.user.js
// @downloadURL https://raw.githubusercontent.com/N0ui/pr0gramm-color-picker/master/pcp.user.js
// @icon http://pr0gramm.com/media/pr0gramm-favicon.png
// @grant none
// @run-at document-end
// ==/UserScript==
// by mopsalarm
const pu = {
addRoute(path, view) {
p.addRoute(view, path);
const tmpRoute = p._routes[p._routes.length - 2];
p._routes[p._routes.length - 2] = p._routes[p._routes.length - 1];
p._routes[p._routes.length - 1] = tmpRoute;
if (p.getURL() === path) {
p.navigateTo(path, p.NAVIGATE.FORCE);
}
}
};
const PCP = {
// colors and html
colorNames: [{
key: 'html',
html: '
Hauptfarben
'
}, {
desc: 'Hauptfarbe',
key: 'main-color',
value: '#ee4d2e'
}, {
desc: 'Hintergrund',
key: 'bg-color',
value: '#161618'
}, {
desc: 'Standard Schriftfarbe',
key: 'main-font-color',
value: '#f2f5f4'
}, {
desc: 'Standard Schriftfarbe 2 (grau)',
key: 'second-main-font-color',
value: '#888888'
}, {
desc: 'Linkfarbe',
key: 'link-color',
value: '#75c0c7'
}, {
desc: 'Linkfarbe Hover',
key: 'link-color-hover',
value: '#F5F7F6'
}, {
key: 'html',
html: '
Buttons
'
}, {
desc: 'Buttontext',
key: 'btn-color',
value: '#f2f5f4'
}, {
desc: 'Abbrechen Button Hintergrund',
key: 'cancelBtn-bg-color',
value: '#212425'
}, {
desc: 'Abbrechen Button Text',
key: 'cancelBtn-color',
value: '#888888'
}, {
desc: 'Button Hover Hintergrund',
key: 'btn-hover-bg-color',
value: '#F5F7F6'
}, {
desc: 'Button Hover Text',
key: 'btn-hover-color',
value: '#555555'
}, {
key: 'html',
html: '
Video & Tags
'
}, {
desc: 'Tag Hintergrund',
key: 'tag-bg-color',
value: '#2A2E31'
}, {
desc: 'Tag Text',
key: 'tag-color',
value: '#F5F7F6'
}, {
desc: 'Video Prozessbalken',
key: 'video-bg-color',
value: '#75c0c7'
}, {
key: 'html',
html: '
Sonstiges
'
}, {
desc: 'Warnung',
key: 'warn-color',
value: '#fc8833'
}
],
// theme array
theming: [{
name: 'Angenehmes Grün',
data: [{
key: 'main-color',
value: '#1db992'
}]
}, {
name: 'Olivgrün des Friedens',
data: [{
key: 'main-color',
value: '#B0AD05'
}]
}, {
name: 'Altes Pink',
data: [{
key: 'main-color',
value: '#FF0082'
}]
}, {
name: 'Altschwuchtel Grün',
data: [{
key: 'main-color',
value: '#5BB91C'
}]
}, {
name: 'Mega Episches Blau',
data: [{
key: 'main-color',
value: '#008FFF'
}]
}, {
name: 'Aggressionsförderndes Dunkelgelb',
data: [{
key: 'main-color',
value: '#FF9900'
}]
}, {
name: 'Lebhaftes Limettengrün',
data: [{
key: 'main-color',
value: '#b9cc5a'
}]
}, {
name: 'Wohliges Warmgelb',
data: [{
key: 'main-color',
value: '#e3af12'
}]
}, {
name: 'Sonniges Steppenrot',
data: [{
key: 'main-color',
value: '#cc674b'
}]
}, {
name: 'Samtweiches Stahlweiß',
data: [{
key: 'main-color',
value: '#b0b0b0'
}]
}
],
// calculate brightness (http://www.sitepoint.com/javascript-generate-lighter-darker-color/)
colorLuminance(hex, lum) {
// validate hex string
hex = String(hex).replace(/[^0-9a-f]/gi, '');
if (hex.length < 6) {
hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
}
lum = lum || 0;
// convert to decimal and change luminosity
let rgb = '#',
c, i;
for (i = 0; i < 3; i++) {
c = parseInt(hex.substr(i * 2, 2), 16);
c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16);
rgb += ('00' + c).substr(c.length);
}
return rgb;
},
// check if hex color is valid
// http://stackoverflow.com/questions/8027423/how-to-check-if-a-string-is-a-valid-hex-color-representation?answertab=active#tab-top
isValidateHex(value) {
return /^#([A-Fa-f0-9]{3}$)|([A-Fa-f0-9]{6}$)/.test(value) && value.length === 7;
},
// convert hex to rgba
convertHex(_hex, _opacity) {
const hex = _hex.replace('#', '');
const r = parseInt(hex.substring(0, 2), 16);
const g = parseInt(hex.substring(2, 4), 16);
const b = parseInt(hex.substring(4, 6), 16);
return 'rgba(' + r + ',' + g + ',' + b + ',' + _opacity / 100 + ')';
},
// style
cssStyle() {
const $styleEl = $('#pcp-style');
let cssStr = '';
let logoSvg = '';
cssStr += `
body {
--theme-main-color: ${localStorage['main-color']};
}
.comments .comment.own-comment {
color: ${localStorage['main-color']};
}
html,
body,
h3,
.tab-bar a,
.head-link,
#search-submit-inline,
.user,
.user-score,
#inboxLink.empty {
color: ${localStorage['main-font-color']};
}
input.box-from-label:checked + label:before {
background-color: ${localStorage['main-font-color']};
}
input.box-from-label + label:before {
border: 1px solid ${localStorage['main-font-color']};
}
#filter-save,
.confirm-button,
span.user-comment-op,
input[type=button],
input[type=submit],
.filter-setting.active .filter-check,
.loader > div,
div.stream-next:hover span.stream-next-icon,
div.stream-prev:hover span.stream-prev-icon,
.user-follow,
.user-unfollow {
background-color: ${this.colorLuminance(localStorage['main-color'], -0.1)};
}
#filter-save:hover,#loader > div{
background-color: ${localStorage['main-color']};
color: #fff;
}
.filter-setting.active .filter-check, #upload-droparea {
border: 1px solid ${localStorage['main-color']};
}
#inbox-link,
#inbox-link.empty:hover,div.overlay-tabs span.overlay-link:hover,
div.overlay-tabs span.active,#upload-droparea.active,
#key-indicator,
a.item-fullsize-link:hover,
.vote-up:hover,
.voted-down .vote-up:hover,
.voted-up .vote-up:hover,
.voted-up .vote-up,
a.bookmarklet,
#search-submit-inline:hover,
#settings-logout-link,.action,
.filter-setting.active .filter-name,
.head-link:hover,.tab-bar a:hover,
.tab-bar a.active,a.head-tab.active,
a.head-tab:hover,a#inboxLink,
a#inboxLink,
#inboxLink.empty:hover,.head-link:hover,
div.tagsinput span.tag a,
.vote-fav.faved,
.vote-fav:hover,
#inbox-link.empty:hover {
color: ${localStorage['main-color']};
}
a,
.link,
a.user:hover,
a.tag-link:hover,
span.tag.voted-down a.tag-link:hover {
color: ${localStorage['link-color']};
}
a:hover,
.link:hover,
.action:hover {
color: ${localStorage['link-color-hover']};
}
.confirm-button,
input[type=button],
input[type=submit],
.user-follow,
.user-unfollow {
color: ${localStorage['btn-color']};
}
.warn{
color: ${localStorage['warn-color']};
}
.confirm-button:hover,
input[type=button]:hover,
input[type=button]:focus,
input[type=submit]:hover,
input[type=submit]:focus {
background-color: ${localStorage['link-color-hover']};
}
input[type=button].cancel,
input[type=button]:disabled,
input[type=submit]:disabled,
input[type=submit].cancel {
background-color: ${localStorage['cancelBtn-bg-color']};
color: ${localStorage['cancelBtn-color']};
}
.confirm-button:hover,
input[type=button]:hover,
input[type=button]:focus,
input[type=submit]:hover,
input[type=submit]:focus,
.user-follow:hover,
.user-unfollow:hover {
background-color: ${localStorage['btn-hover-bg-color']};
color: ${localStorage['btn-hover-color']};
}
span.tag {
background-color: ${localStorage['tag-bg-color']} !important;
}
a.tag-link {
color: ${localStorage['tag-color']};
}
div.video-position {
background-color: ${localStorage['video-bg-color']};
}
.tab-bar span,
.user-stats,
div.comment-foot {
color: ${localStorage['second-main-font-color']};
}
a.head-tab {
color: ${this.colorLuminance(localStorage['second-main-font-color'], 0.2)};
}
html, body, div.item-container {
background-color: ${localStorage['bg-color']};
}
#footer-links {
background-color: transparent;
}
#footer-links a {
color: ${localStorage['second-main-font-color']} !important;
}
#footer-links a:hover {
color: ${localStorage['link-color-hover']}!important;
}
#head-content {
background-color: ${this.convertHex(this.colorLuminance(localStorage['bg-color'], -0.6), 80)};
}
input, textarea {
background-color: ${this.colorLuminance(localStorage['bg-color'], 0.3)};
}
input:focus,
textarea:focus {
background-color: ${this.colorLuminance(localStorage['bg-color'], 0.4)};
}
div.comment-foot,
div.comment-box div.comment-box {
border-color: ${this.colorLuminance(localStorage['bg-color'], -0.3)};
}
input.q {
background-color: ${this.convertHex(this.colorLuminance(localStorage['bg-color'], 0.4), 80)};
}
div.product-description {
background-color: ${this.colorLuminance(localStorage['bg-color'], 0.4)};
}
#pr0gramm-logo-link {
margin: 18px 12px 4px 4px;
}
#pr0gramm-logo-link svg {
width: 121px;
}
#pr0gramm-logo-link svg path,
#pr0gramm-logo-link svg polygon,
#pr0gramm-logo-link svg rect{
fill:${localStorage['main-font-color']}
}
#pr0gramm-logo-link svg .pr0-sign {
fill:${localStorage['main-color']}
}
.pcp-input-outer {
display:blofck;margin: 0 0 10px 0;
}
.pcp-label {
width: 40%;
display:inline-block !important;
}
.pcp-color{
padding: 0;
height:26px;
width: 24px;
display: inline-block;
border: 0;
background-color:transparent;
}
#pcp-reset {
background-color: #A21F1F;
display: inline-block;
padding: 10px 20px;
cursor:pointer;
}
.pcp-theme-list {
lists-style: none;
margin: 0; padding: 0;
}
.pcp-theme-list .pcp-theme-btn {
display: inline-block;
margin: 0 25px 25px 0;
padding: 10px 15px;
border: 1px solid #fff;
cursor: pointer;
}
.pcp-color-input {
width: 150px;
display:inline-block;
margin-left: 20px;
}`;
// userscript styles for 'pr0gramm.com Dick by Seglors'
cssStr += `.stream-next:hover,
.stream-prev:hover {
color: ${localStorage['main-color']} !important;
}
#com-top.active,
#com-top:hover,
#com-new.active,
#com-new:hover {
color:${localStorage['main-color']} !important;
}
.opuser .user:before {
background-color:${localStorage['main-color']} !important;
color: ${localStorage['main-font-color']} !important;
}
.comment-content a .preview,
.comment-content a .preview {
border-color:${localStorage['main-color']} !important;
}
.comment-content a .preview:before,
.comment-content a .preview:after {
border-color:${localStorage['main-color']} transparent !important;
}
.custom_seen::after {
background: ${this.convertHex(localStorage['main-color'], 70)} !important;
}`;
// cust0m pr0gramm 2.0
cssStr += `div.stream-next:hover
span.cust0m_stream-next-icon,
div.stream-prev:hover span.cust0m_stream-prev-icon,
.cust0m_menu:hover,
.cust0m_menu.active,
.cust0m_trigger.active,
.cust0m_trigger:hover,
.cust0m_button:hover {
color:${localStorage['main-color']} !important;
}
div.comment-op div.comment-foot, .comment-foot.custom_op {
border-bottom-color:${localStorage['main-color']} !important;
}
.highcharts-series path{stroke:${localStorage['main-color']}; stroke-width: 2px;}
.highcharts-markers.highcharts-tracker path{fill:${localStorage['main-color']};}
.highcharts-tooltip path:nth-child(4) {stroke:${localStorage['main-color']}; stroke-width: 1px;}
.highcharts-series-group:first-child path {fill: #000;}`;
//kfav
cssStr += `.kfav-save:hover {
color:${localStorage['main-color']} !important;
}`;
// op highlight
cssStr += `.extension-is-op .user:before {
background-color:${localStorage['main-color']} !important;
}`;
// visitenkarte
cssStr += `.user.profile > .extended > ul > li > span > span:last-child {
color:${localStorage['main-color']} !important;
}`;
// svg
logoSvg = ``;
// add logo
$('#pr0gramm-logo-link').html(logoSvg);
// check if style tag is set
if ($styleEl.length < 1) {
$('body').append('');
}
// insert css into style tag
$styleEl.html(cssStr);
},
// html form
settingsHtml() {
let settingsHtmlStr = '';
let themeHtml = '';
settingsHtmlStr += `
pr0gramm Farben
Stell einfach deine Farben ein
`;
$.each(this.colorNames, (i, v) => {
if (v.key !== 'html') {
settingsHtmlStr += `
`;
} else {
settingsHtmlStr += v.html;
}
});
settingsHtmlStr += `
theming
`;
$.each(this.theming, (i, v) => {
themeHtml += `- ${v.name}
`;
});
themeHtml += `
`;
settingsHtmlStr += themeHtml;
settingsHtmlStr += `
Alle Farben zurücksetzen (bewährtes Orange)
`;
return settingsHtmlStr;
},
// reset all colors
reset() {
$.each(this.colorNames, (i, v) => {
if (v.key !== 'html') {
localStorage.removeItem(v.key);
}
});
this.init();
},
// update colors
update(_isInit, _isInputUpdate) {
if (_isInit) {
$('#pcp-style').html(this.cssStyle());
}
$.each(this.colorNames, (i, v) => {
if (v.key !== 'html') {
if (!_isInit) {
if (_isInputUpdate && PCP.isValidateHex($('#pcp-' + v.key + '-input').val())) {
localStorage[v.key] = $('#pcp-' + v.key + '-input').val();
} else {
localStorage[v.key] = $('#pcp-' + v.key).val();
}
}
$('#pcp-' + v.key).val(localStorage[v.key].toLowerCase());
$('#pcp-' + v.key + '-input').val(localStorage[v.key].toLowerCase());
}
});
if (!_isInit) {
$('#pcp-style').html(this.cssStyle());
}
},
// set theme
setTheme(e) {
const $element = $(e.currentTarget);
if (typeof PCP.theming[$element.index()] !== 'undefined') {
$.each(PCP.theming[$element.index()].data, (i, v) => {
localStorage[v.key] = v.value;
});
}
PCP.update(true, false);
},
// init
init() {
const $styleEl = $('#pcp-style');
// set default colors
if (typeof localStorage['main-color'] === 'undefined' || localStorage['main-color'] === '') {
$.each(this.colorNames, (i, v) => {
if (v.key !== 'html') {
localStorage[v.key] = v.value;
}
});
}
// check if form exists
if ($('#settings-pcp').length < 1) {
$('#settings-site-form').prepend(PCP.settingsHtml());
}
// append style
if ($styleEl.length < 1) {
$('body').append('');
}
this.update(true, false);
}
};
const PCPload = () => {
// override native theming
p.User.prototype.loadTheme = () => {
$('#theme-style').remove();
};
// thanks to mopsalarm
$('#footer-links div').append(`
Theming`);
const link = $('#tab-theming');
// add theme route
pu.addRoute('theming', p.View.Base.extend({
template: `
pr0gramm Theming
${PCP.settingsHtml()}
`,
init(container, parent) {
this.parent(container, parent);
p.mainView.setTab('theming');
this.render();
},
load() {
// reset colors
$(document).on('click', '#pcp-reset', () => {
PCP.reset();
});
// update colors
$(document).on('change', '.pcp-color', () => {
PCP.update(false, false);
});
// update input color
$(document).on('focusout', '.pcp-color-input', () => {
PCP.update(false, true);
});
// set theme
$(document).on('click', '.pcp-theme-btn', PCP.setTheme);
this.render();
PCP.init();
return false;
},
loaded() {
this.render();
return false;
}
}));
PCP.init();
// replace main color
$('body').on('click', '.kfav-save', () => {
$('style').not('#pcp-style').html((_, html) => html.replace(/#ee4d2e/g, localStorage['main-color']));
});
$('style').not('#pcp-style').html((_, html) => html.replace(/#ee4d2e/g, localStorage['main-color']));
};
PCPload();