diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d5a71d0b..2421dd5af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,18 @@ **MayhemYDG**: - **New feature**: `Show Dice Roll` (with @carboncopy) - Shows dice that were entered into the email field on /tg/. +- **Thread Watcher** improvements: + - It is now possible to open all watched threads via the `Open all threads` button in the Thread Watcher's menu. + - Added the `Current Board` setting to switch between showing watched threads from the current board or all boards, disabled by default. + - About dead (404'd) threads: + - Dead threads will be typographically indicated with a strikethrough. + - Dead threads will directly link to the corresponding archive when available. + - A button to prune all 404'd threads from the list is now available. + - Added the `Auto Prune` setting to automatically prune 404'd threads, disabled by default. + - The current thread is now highlighted in the list of watched threads. + - Watching the current thread can be done in the Header's menu too. +- Removed the `Check for Updates` setting: + - Your browser/userscript manager should handle updates itself automatically. - Fix impossibility to create new threads when in dead threads. - Fix flag filtering on /sp/ and /int/. - Update archives. (with @woxxy and @proplex) diff --git a/builds/4chan-X.user.js b/builds/4chan-X.user.js index 5564ab3d3..3552fecd1 100644 --- a/builds/4chan-X.user.js +++ b/builds/4chan-X.user.js @@ -134,7 +134,6 @@ 'Index Navigation': [false, 'Add buttons to navigate between threads.'], 'Reply Navigation': [false, 'Add buttons to navigate to top / bottom of thread.'], 'Show Dice Roll': [true, 'Show dice that were entered into the email field.'], - 'Check for Updates': [true, 'Check for updated versions of 4chan X.'], 'Show Updated Notifications': [true, 'Show notifications when 4chan X is successfully updated.'], 'Emoji': [false, 'Adds icons next to names for different emails'], 'Color User IDs': [false, 'Assign unique colors to user IDs on boards that use them'], @@ -188,9 +187,7 @@ 'Page Count in Stats': [false, 'Display the page count in the thread stats as well.'], 'Updater and Stats in Header': [true, 'Places the thread updater and thread stats in the header instead of floating them.'], 'Thread Watcher': [true, 'Bookmark threads.'], - 'Toggleable Thread Watcher': [true, 'Adds a shortcut for the thread watcher, hides the watcher by default, and makes it scroll with the page.'], - 'Auto Watch': [true, 'Automatically watch threads you start.'], - 'Auto Watch Reply': [false, 'Automatically watch threads you reply to.'] + 'Toggleable Thread Watcher': [true, 'Adds a shortcut for the thread watcher, hides the watcher by default, and makes it scroll with the page.'] }, 'Posting': { 'Quick Reply': [true, 'All-in-one form to reply, create threads, automate dumping and more.'], @@ -231,6 +228,12 @@ 'Expand from here': [false, 'Expand all images only from current position to thread end.'], 'Advance on contract': [false, 'Advance to next post when contracting an expanded image.'] }, + threadWatcher: { + 'Current Board': [false, 'Only show watched threads from the current board.'], + 'Auto Watch': [true, 'Automatically watch threads you start.'], + 'Auto Watch Reply': [false, 'Automatically watch threads you reply to.'], + 'Auto Prune': [false, 'Automatically prune 404\'d threads.'] + }, filter: { name: "# Filter any namefags:\n#/^(?!Anonymous$)/", uniqueID: "# Filter a specific ID:\n#/Txhvk1Tl/", @@ -423,26 +426,32 @@ } }; - $.ajax = function(url, options, extra) { - var form, headers, key, r, sync, type, upCallbacks, val; + $.ajax = (function() { + var lastModified; - if (extra == null) { - extra = {}; - } - type = extra.type, headers = extra.headers, upCallbacks = extra.upCallbacks, form = extra.form, sync = extra.sync; - r = new XMLHttpRequest(); - r.overrideMimeType('text/html'); - type || (type = form && 'post' || 'get'); - r.open(type, url, !sync); - for (key in headers) { - val = headers[key]; - r.setRequestHeader(key, val); - } - $.extend(r, options); - $.extend(r.upload, upCallbacks); - r.send(form); - return r; - }; + lastModified = {}; + return function(url, options, extra) { + var form, r, sync, type, upCallbacks, whenModified; + + if (extra == null) { + extra = {}; + } + type = extra.type, whenModified = extra.whenModified, upCallbacks = extra.upCallbacks, form = extra.form, sync = extra.sync; + r = new XMLHttpRequest(); + type || (type = form && 'post' || 'get'); + r.open(type, url, !sync); + if (whenModified) { + r.setRequestHeader('If-Modified-Since', lastModified[url] || '0'); + $.on(r, 'load', function() { + return lastModified[url] = r.getResponseHeader('Last-Modified'); + }); + } + $.extend(r, options); + $.extend(r.upload, upCallbacks); + r.send(form); + return r; + }; + })(); $.cache = (function() { var reqs; @@ -1198,17 +1207,19 @@ })(Post); - DataBoards = ['hiddenThreads', 'hiddenPosts', 'lastReadPosts', 'yourPosts']; + DataBoards = ['hiddenThreads', 'hiddenPosts', 'lastReadPosts', 'yourPosts', 'watchedThreads']; DataBoard = (function() { - function DataBoard(key, sync) { + function DataBoard(key, sync, dontClean) { var init, _this = this; this.key = key; this.data = Conf[key]; $.sync(key, this.onSync.bind(this)); - this.clean(); + if (!dontClean) { + this.clean(); + } if (!sync) { return; } @@ -1219,6 +1230,10 @@ $.on(d, '4chanXInitFinished', init); } + DataBoard.prototype.save = function() { + return $.set(this.key, this.data); + }; + DataBoard.prototype["delete"] = function(_arg) { var boardID, postID, threadID; @@ -1237,7 +1252,7 @@ } else { delete this.data.boards[boardID]; } - return $.set(this.key, this.data); + return this.save(); }; DataBoard.prototype.deleteIfEmpty = function(_arg) { @@ -1267,7 +1282,7 @@ } else { this.data.boards[boardID] = val; } - return $.set(this.key, this.data); + return this.save(); }; DataBoard.prototype.get = function(_arg) { @@ -1311,7 +1326,7 @@ this.ajaxClean(boardID); } } - return $.set(this.key, this.data); + return this.save(); }; DataBoard.prototype.ajaxClean = function(boardID) { @@ -1341,7 +1356,7 @@ boardID: boardID }); } - return $.set(_this.key, _this.data); + return _this.save(); }); }; @@ -1402,8 +1417,26 @@ Polyfill = { init: function() { + Polyfill.toBlob(); return Polyfill.visibility(); }, + toBlob: function() { + var _base; + + return (_base = HTMLCanvasElement.prototype).toBlob || (_base.toBlob = function(cb) { + var data, i, l, ui8a, _i; + + data = atob(this.toDataURL().slice(22)); + l = data.length; + ui8a = new Uint8Array(l); + for (i = _i = 0; 0 <= l ? _i < l : _i > l; i = 0 <= l ? ++_i : --_i) { + ui8a[i] = data.charCodeAt(i); + } + return cb(new Blob([ui8a], { + type: 'image/png' + })); + }); + }, visibility: function() { if (!('webkitHidden' in document)) { return; @@ -1822,7 +1855,7 @@ date: data.now, dateUTC: data.time, comment: data.com, - capReps: data.capcode_replies, + capcodeReplies: data.capcode_replies, isSticky: !!data.sticky, isClosed: !!data.closed }; @@ -1850,9 +1883,9 @@ @license: https://github.com/4chan/4chan-JS/blob/master/LICENSE */ - var a, array, boardID, capReps, capcode, capcodeClass, capcodeReplies, capcodeStart, capcodeType, closed, comment, container, date, dateUTC, email, emailEnd, emailStart, ext, file, fileDims, fileHTML, fileInfo, fileSize, fileThumb, filename, flag, flagCode, flagName, generateCapcodeReplies, href, imgSrc, isClosed, isOP, isSticky, name, postID, quote, shortFilename, spoilerRange, staticPath, sticky, subject, threadID, tripcode, uniqueID, userID, _i, _len, _ref; + var a, boardID, capcode, capcodeClass, capcodeReplies, capcodeStart, closed, comment, container, date, dateUTC, email, emailEnd, emailStart, ext, file, fileDims, fileHTML, fileInfo, fileSize, fileThumb, filename, flag, flagCode, flagName, href, imgSrc, isClosed, isOP, isSticky, name, postID, quote, shortFilename, spoilerRange, staticPath, sticky, subject, threadID, tripcode, uniqueID, userID, _i, _len, _ref; - postID = o.postID, threadID = o.threadID, boardID = o.boardID, name = o.name, capcode = o.capcode, tripcode = o.tripcode, uniqueID = o.uniqueID, email = o.email, subject = o.subject, flagCode = o.flagCode, flagName = o.flagName, date = o.date, dateUTC = o.dateUTC, isSticky = o.isSticky, isClosed = o.isClosed, comment = o.comment, capReps = o.capReps, file = o.file; + postID = o.postID, threadID = o.threadID, boardID = o.boardID, name = o.name, capcode = o.capcode, tripcode = o.tripcode, uniqueID = o.uniqueID, email = o.email, subject = o.subject, flagCode = o.flagCode, flagName = o.flagName, date = o.date, dateUTC = o.dateUTC, isSticky = o.isSticky, isClosed = o.isClosed, comment = o.comment, capcodeReplies = o.capcodeReplies, file = o.file; isOP = postID === threadID; staticPath = '//static.4chan.org/image/'; if (email) { @@ -1926,32 +1959,10 @@ tripcode = tripcode ? " " + tripcode + "" : ''; sticky = isSticky ? " Sticky" : ''; closed = isClosed ? " Closed" : ''; - capcodeReplies = ''; - if (capReps) { - generateCapcodeReplies = function(capcodeType, array) { - return "" + ((function() { - switch (capcodeType) { - case 'admin': - return 'Administrator'; - case 'mod': - return 'Moderator'; - case 'developer': - return 'Developer'; - } - })()) + " Repl" + (array.length > 1 ? 'ies' : 'y') + ": " + (array.map(function(ID) { - return ">>" + ID + ""; - }).join(' ')) + "
"; - }; - for (capcodeType in capReps) { - array = capReps[capcodeType]; - capcodeReplies += generateCapcodeReplies(capcodeType, array); - } - capcodeReplies = "

" + capcodeReplies + ""; - } container = $.el('div', { id: "pc" + postID, className: "postContainer " + (isOP ? 'op' : 'reply') + "Container", - innerHTML: "" + (isOP ? '' : "
>>
") + "
" + (name || '') + "" + (tripcode + capcodeStart + capcode + userID + flag + sticky + closed) + "
" + subject + "
" + date + "No." + postID + "
" + (isOP ? fileHTML : '') + "
" + subject + "" + emailStart + "" + (name || '') + "" + (tripcode + capcodeStart + emailEnd + capcode + userID + flag + sticky + closed) + "" + " " + "" + date + "" + " " + "No." + postID + "
" + (isOP ? '' : fileHTML) + "
" + (comment || '') + capcodeReplies + "
" + " " + "
" + innerHTML: "" + (isOP ? '' : "
>>
") + "
" + (name || '') + "" + (tripcode + capcodeStart + capcode + userID + flag + sticky + closed) + "
" + subject + "
" + date + "No." + postID + "
" + (isOP ? fileHTML : '') + "
" + subject + "" + emailStart + "" + (name || '') + "" + (tripcode + capcodeStart + emailEnd + capcode + userID + flag + sticky + closed) + "" + " " + "" + date + "" + " " + "No." + postID + "
" + (isOP ? '' : fileHTML) + "
" + (comment || '') + "
" + " " + "
" }); _ref = $$('.quotelink', container); for (_i = 0, _len = _ref.length; _i < _len; _i++) { @@ -1962,7 +1973,47 @@ } quote.href = "/" + boardID + "/res/" + href; } + Build.capcodeReplies({ + boardID: boardID, + threadID: threadID, + root: container, + capcodeReplies: capcodeReplies + }); return container; + }, + capcodeReplies: function(_arg) { + var array, boardID, bq, capcodeReplies, capcodeType, generateCapcodeReplies, html, root, threadID; + + boardID = _arg.boardID, threadID = _arg.threadID, bq = _arg.bq, root = _arg.root, capcodeReplies = _arg.capcodeReplies; + if (!capcodeReplies) { + return; + } + generateCapcodeReplies = function(capcodeType, array) { + return "" + ((function() { + switch (capcodeType) { + case 'admin': + return 'Administrator'; + case 'mod': + return 'Moderator'; + case 'developer': + return 'Developer'; + } + })()) + " Repl" + (array.length > 1 ? 'ies' : 'y') + ": " + (array.map(function(ID) { + return ">>" + ID + ""; + }).join(' ')) + "
"; + }; + html = []; + for (capcodeType in capcodeReplies) { + array = capcodeReplies[capcodeType]; + html.push(generateCapcodeReplies(capcodeType, array)); + } + bq || (bq = $('blockquote', root)); + return $.add(bq, [ + $.el('br'), $.el('br'), $.el('span', { + className: 'capcodeReplies', + innerHTML: html.join('') + }) + ]); } }; @@ -4375,7 +4426,7 @@ if (g.VIEW === 'catalog' || !Conf['Linkify']) { return; } - this.regString = Conf['Allow False Positives'] ? /(\b([-a-z]+:\/\/|[a-z]{3,}\.[-a-z0-9]+\.[a-z]|[-a-z0-9]+\.[a-z]|[\d]+\.[\d]+\.[\d]+\.[\d]+\/|[a-z]{3,}:[a-z0-9?]|[^\s@]+@[a-z0-9.-]+\.[a-z0-9])[^\s'"]+)/gi : /(((magnet|mailto)\:|(www\.)|(news|(ht|f)tp(s?))\:\/\/){1}\S+)/gi; + this.regString = Conf['Allow False Positives'] ? /([-a-z]+:\/\/|[a-z]{3,}\.[-a-z0-9]+\.[a-z]|[-a-z0-9]+\.[a-z]|[\d]+\.[\d]+\.[\d]+\.[\d]+\/|[a-z]{3,}:[a-z0-9?]|[^\s@]+@[a-z0-9.-]+\.[a-z0-9])/i : /(((magnet|mailto)\:|(www\.)|(news|(ht|f)tp(s?))\:\/\/){1})/i; if (Conf['Comment Expansion']) { ExpandComment.callbacks.push(this.node); } @@ -4388,7 +4439,7 @@ }); }, node: function() { - var data, el, i, items, links, node, range, snapshot, _i, _len, _ref; + var data, el, end, endNode, i, index, items, lIndex, length, link, links, node, range, result, saved, snapshot, space, test, text, _i, _len, _ref; if (this.isClone) { if (Conf['Embedding']) { @@ -4403,16 +4454,49 @@ } return; } + test = /[^\s'"]+/g; + space = /[\s'"]/; snapshot = $.X('.//br|.//text()', this.nodes.comment); i = 0; while (node = snapshot.snapshotItem(i++)) { - if (node.parentElement.nodeName === "A") { + links = []; + data = node.data; + if (node.parentElement.nodeName === "A" || !data) { continue; } - links = []; - if (Linkify.regString.test(node.data)) { - Linkify.regString.lastIndex = 0; - Linkify.gatherLinks(snapshot, this, node, links, i); + while (result = test.exec(data)) { + index = result.index; + endNode = node; + if ((length = index + result[0].length) === data.length) { + while ((saved = snapshot.snapshotItem(i++))) { + if (saved.nodeName === 'BR') { + break; + } + endNode = saved; + length = saved.data.length; + if (end = space.exec(saved.data)) { + length = end.index; + i--; + break; + } + } + if (length === endNode.data.length) { + test.lastIndex = 0; + } + range = Linkify.makeRange(node, endNode, index, length); + if (link = Linkify.regString.exec(text = range.toString())) { + if (lIndex = link.index) { + range.setStart(node, lIndex + index); + } + links.push([range, text]); + } + break; + } else { + if (link = Linkify.regString.exec(result[0])) { + range = Linkify.makeRange(node, node, link.index, link.length); + links.push([range, link]); + } + } } _ref = links.reverse(); for (_i = 0, _len = _ref.length; _i < _len; _i++) { @@ -4436,60 +4520,25 @@ } } }, - gatherLinks: function(snapshot, post, node, links, i) { - var data, index, len, len2, link, match, range; + makeRange: function(startNode, endNode, startOffset, endOffset) { + var range; - data = node.data; - len = data.length; - while ((match = Linkify.regString.exec(data))) { - index = match.index; - link = match[0]; - len2 = index + link.length; - if (len === len2) { - break; - } - range = document.createRange(); - range.setStart(node, index); - range.setEnd(node, len2); - links.push(range); - } - Linkify.regString.lastIndex = 0; - if (match) { - links.push(Linkify.seek(snapshot, post, node, links, match, i)); - } - }, - seek: function(snapshot, post, node, links, match, i) { - var data, index, link, next, range, result; - - link = match[0]; range = document.createRange(); - range.setStart(node, match.index); - while ((next = snapshot.snapshotItem(i++)) && next.nodeName !== 'BR') { - node = next; - data = node.data; - if (result = /[\s'"]/.exec(data)) { - index = result.index; - range.setEnd(node, index); - Linkify.regString.lastIndex = index; - Linkify.gatherLinks(snapshot, post, node, links, i); - return range; - } - } - if (range.collapsed) { - range.setEnd(node, node.data.length); - } + range.setStart(startNode, startOffset); + range.setEnd(endNode, endOffset); return range; }, - makeLink: function(range) { - var a, link; + makeLink: function(_arg) { + var a, range, text; - link = range.toString(); - link = link.contains(':') ? link : (link.contains('@') ? 'mailto:' : 'http://') + link; + range = _arg[0], text = _arg[1]; + text; + text = text.contains(':') ? text : (text.contains('@') ? 'mailto:' : 'http://') + text; a = $.el('a', { className: 'linkify', rel: 'nofollow noreferrer', target: '_blank', - href: link + href: text }); $.add(a, range.extractContents()); range.insertNode(a); @@ -5609,7 +5658,7 @@ img = $.el('img'); img.onload = function() { - var applyBlob, cv, data, height, i, l, s, ui8a, width, _i; + var cv, height, s, width; s = 90 * 2; if (_this.file.type === 'image/gif') { @@ -5633,23 +5682,10 @@ cv.width = img.width = width; cv.getContext('2d').drawImage(img, 0, 0, width, height); URL.revokeObjectURL(fileURL); - applyBlob = function(blob) { + return cv.toBlob(function(blob) { _this.URL = URL.createObjectURL(blob); return _this.nodes.el.style.backgroundImage = "url(" + _this.URL + ")"; - }; - if (cv.toBlob) { - cv.toBlob(applyBlob); - return; - } - data = atob(cv.toDataURL().split(',')[1]); - l = data.length; - ui8a = new Uint8Array(l); - for (i = _i = 0; 0 <= l ? _i < l : _i > l; i = 0 <= l ? ++_i : --_i) { - ui8a[i] = data.charCodeAt(i); - } - return applyBlob(new Blob([ui8a], { - type: 'image/png' - })); + }); }; fileURL = URL.createObjectURL(this.file); return img.src = fileURL; @@ -6502,7 +6538,7 @@ }, menu: { init: function() { - var conf, createSubEntry, el, key, subEntries, _ref; + var conf, createSubEntry, el, name, subEntries, _ref; if (g.VIEW === 'catalog' || !Conf['Image Expansion']) { return; @@ -6514,9 +6550,9 @@ createSubEntry = ImageExpand.menu.createSubEntry; subEntries = []; _ref = Config.imageExpansion; - for (key in _ref) { - conf = _ref[key]; - subEntries.push(createSubEntry(key, conf)); + for (name in _ref) { + conf = _ref[name]; + subEntries.push(createSubEntry(name, conf[1])); } return $.event('AddMenuEntry', { type: 'header', @@ -6525,22 +6561,20 @@ subEntries: subEntries }); }, - createSubEntry: function(type, config) { + createSubEntry: function(name, desc) { var input, label; label = $.el('label', { - innerHTML: " " + type + innerHTML: " " + name, + title: desc }); input = label.firstElementChild; - if (type === 'Fit width' || type === 'Fit height') { + if (name === 'Fit width' || name === 'Fit height') { $.on(input, 'change', ImageExpand.cb.setFitness); } - if (config) { - label.title = config[1]; - input.checked = Conf[type]; - $.event('change', null, input); - $.on(input, 'change', $.cb.checked); - } + input.checked = Conf[name]; + $.event('change', null, input); + $.on(input, 'change', $.cb.checked); return { el: label }; @@ -7217,7 +7251,6 @@ this.postCountEl = $('#post-count', sc); this.fileCountEl = $('#file-count', sc); this.pageCountEl = $('#page-count', sc); - this.lastModified = '0'; return Thread.prototype.callbacks.push({ name: 'Thread Stats', cb: this.node @@ -7272,19 +7305,13 @@ return $.ajax("//api.4chan.org/" + ThreadStats.thread.board + "/threads.json", { onload: ThreadStats.onThreadsLoad }, { - headers: { - 'If-Modified-Since': ThreadStats.lastModified - } + whenModified: true }); }, onThreadsLoad: function() { var page, pages, thread, _i, _j, _len, _len1, _ref; - if (!Conf["Page Count in Stats"]) { - return; - } - ThreadStats.lastModified = this.getResponseHeader('Last-Modified'); - if (this.status !== 200) { + if (!(Conf["Page Count in Stats"] && this.status === 200)) { return; } pages = JSON.parse(this.response); @@ -7379,7 +7406,6 @@ ThreadUpdater.root = this.OP.nodes.root.parentNode; ThreadUpdater.lastPost = +ThreadUpdater.root.lastElementChild.id.match(/\d+/)[0]; ThreadUpdater.outdateCount = 0; - ThreadUpdater.lastModified = '0'; ThreadUpdater.cb.interval.call($.el('input', { value: Conf['Interval'] })); @@ -7474,10 +7500,7 @@ case 200: g.DEAD = false; ThreadUpdater.parse(JSON.parse(req.response).posts); - ThreadUpdater.lastModified = req.getResponseHeader('Last-Modified'); - if (Conf['Auto Update']) { - ThreadUpdater.set('timer', ThreadUpdater.getInterval()); - } + ThreadUpdater.set('timer', ThreadUpdater.getInterval()); break; case 404: g.DEAD = true; @@ -7491,16 +7514,8 @@ }); break; default: - if (Conf['Auto Update']) { - ThreadUpdater.outdateCount++; - ThreadUpdater.set('timer', ThreadUpdater.getInterval()); - } - /* - Status Code 304: Not modified - By sending the `If-Modified-Since` header we get a proper status code, and no response. - This saves bandwidth for both the user and the servers and avoid unnecessary computation. - */ - + ThreadUpdater.outdateCount++; + ThreadUpdater.set('timer', ThreadUpdater.getInterval()); _ref = req.status === 304 ? [null, null] : ["" + req.statusText + " (" + req.status + ")", 'warning'], text = _ref[0], klass = _ref[1]; ThreadUpdater.set('status', text, klass); } @@ -7573,9 +7588,7 @@ return ThreadUpdater.req = $.ajax(url, { onloadend: ThreadUpdater.cb.load }, { - headers: { - 'If-Modified-Since': ThreadUpdater.lastModified - } + whenModified: true }); }, updateThreadStatus: function(title, OP) { @@ -7713,7 +7726,7 @@ ThreadWatcher = { init: function() { - var sc; + var now, sc; if (!Conf['Thread Watcher']) { return; @@ -7724,21 +7737,47 @@ href: 'javascript:;', className: 'disabled' }); - this.dialog = UI.dialog('watcher', 'top: 50px; left: 0px;', '
Thread Watcher×
'); + this.db = new DataBoard('watchedThreads', this.refresh, true); + this.dialog = UI.dialog('thread-watcher', 'top: 50px; left: 0px;', "
Thread Watcher ×[]
"); + this.status = $('#watcher-status', this.dialog); + this.list = this.dialog.lastElementChild; $.on(d, 'QRPostSuccessful', this.cb.post); - $.sync('WatchedThreads', this.refresh); + if (g.VIEW === 'thread') { + $.on(d, 'ThreadUpdate', this.cb.threadUpdate); + } $.on(sc, 'click', this.toggleWatcher); $.on($('.move>.close', ThreadWatcher.dialog), 'click', this.toggleWatcher); + $.on(d, '4chanXInitFinished', this.ready); if (Conf['Toggleable Thread Watcher']) { Header.addShortcut(sc); $.addClass(doc, 'fixed-watcher'); } - $.ready(function() { - ThreadWatcher.refresh(); - $.add(d.body, ThreadWatcher.dialog); - if (Conf['Toggleable Thread Watcher']) { - return ThreadWatcher.dialog.hidden = true; + now = Date.now(); + if ((this.db.data.lastChecked || 0) < now - 2 * $.HOUR) { + this.db.data.lastChecked = now; + ThreadWatcher.fetchAllStatus(); + this.db.save(); + } + $.get('WatchedThreads', null, function(_arg) { + var WatchedThreads, boardID, data, threadID, threads, _ref; + + WatchedThreads = _arg.WatchedThreads; + if (!WatchedThreads) { + return; } + _ref = ThreadWatcher.convert(WatchedThreads); + for (boardID in _ref) { + threads = _ref[boardID]; + for (threadID in threads) { + data = threads[threadID]; + ThreadWatcher.db.set({ + boardID: boardID, + threadID: threadID, + val: data + }); + } + } + return $["delete"]('WatchedThreads'); }); return Thread.prototype.callbacks.push({ name: 'Thread Watcher', @@ -7746,80 +7785,91 @@ }); }, node: function() { - var favicon, - _this = this; + var toggler; - favicon = $.el('a', { - className: 'watch-thread-link', - href: 'javascript:;' + toggler = $.el('img', { + className: 'watcher-toggler' }); - $.on(favicon, 'click', ThreadWatcher.cb.toggle); - $.before($('input', this.OP.nodes.post), favicon); - if (g.VIEW !== 'thread') { + $.on(toggler, 'click', ThreadWatcher.cb.toggle); + return $.before($('input', this.OP.nodes.post), toggler); + }, + ready: function() { + $.off(d, '4chanXInitFinished', ThreadWatcher.ready); + if (!Main.isThisPageLegit()) { return; } - return $.get('AutoWatch', 0, function(item) { - if (item['AutoWatch'] !== _this.ID) { + ThreadWatcher.refresh(); + $.add(d.body, ThreadWatcher.dialog); + if (Conf['Toggleable Thread Watcher']) { + ThreadWatcher.dialog.hidden = true; + } + if (!Conf['Auto Watch']) { + return; + } + return $.get('AutoWatch', 0, function(_arg) { + var AutoWatch, thread; + + AutoWatch = _arg.AutoWatch; + if (!(thread = g.BOARD.threads[AutoWatch])) { return; } - ThreadWatcher.watch(_this); + ThreadWatcher.add(thread); return $["delete"]('AutoWatch'); }); }, - refresh: function(watched) { - var ID, board, div, favicon, id, link, nodes, props, thread, x, _ref, _ref1; - - if (!watched) { - $.get('WatchedThreads', {}, function(item) { - return ThreadWatcher.refresh(item['WatchedThreads']); - }); - return; - } - nodes = [$('.move', ThreadWatcher.dialog)]; - for (board in watched) { - _ref = watched[board]; - for (id in _ref) { - props = _ref[id]; - x = $.el('a', { - textContent: '×', - className: 'close', - href: 'javascript:;' - }); - $.on(x, 'click', ThreadWatcher.cb.x); - link = $.el('a', props); - link.title = link.textContent; - div = $.el('div'); - $.add(div, [x, $.tn(' '), link]); - nodes.push(div); - } - } - $.rmAll(ThreadWatcher.dialog); - $.add(ThreadWatcher.dialog, nodes); - watched = watched[g.BOARD] || {}; - _ref1 = g.BOARD.threads; - for (ID in _ref1) { - thread = _ref1[ID]; - favicon = $('.watch-thread-link', thread.OP.nodes.post); - if (ID in watched) { - $.addClass(favicon, 'watched'); - } else { - $.rmClass(favicon, 'watched'); - } - } - }, toggleWatcher: function() { $.toggleClass(ThreadWatcher.shortcut, 'disabled'); return ThreadWatcher.dialog.hidden = !ThreadWatcher.dialog.hidden; }, cb: { + openAll: function() { + var a, _i, _len, _ref; + + if ($.hasClass(this, 'disabled')) { + return; + } + _ref = $$('a[title]', ThreadWatcher.list); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + a = _ref[_i]; + $.open(a.href); + } + return $.event('CloseMenu'); + }, + checkThreads: function() { + if ($.hasClass(this, 'disabled')) { + return; + } + return ThreadWatcher.fetchAllStatus(); + }, + pruneDeads: function() { + var boardID, data, threadID, _i, _len, _ref, _ref1; + + if ($.hasClass(this, 'disabled')) { + return; + } + _ref = ThreadWatcher.getAll(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + _ref1 = _ref[_i], boardID = _ref1.boardID, threadID = _ref1.threadID, data = _ref1.data; + if (!data.isDead) { + continue; + } + delete ThreadWatcher.db.data.boards[boardID][threadID]; + ThreadWatcher.db.deleteIfEmpty({ + boardID: boardID + }); + } + ThreadWatcher.db.save(); + ThreadWatcher.refresh(); + return $.event('CloseMenu'); + }, toggle: function() { return ThreadWatcher.toggle(Get.postFromNode(this).thread); }, - x: function() { - var thread; + rm: function() { + var boardID, threadID, _ref; - thread = this.nextElementSibling.pathname.split('/'); - return ThreadWatcher.unwatch(thread[1], thread[3]); + _ref = this.parentNode.dataset.fullID.split('.'), boardID = _ref[0], threadID = _ref[1]; + return ThreadWatcher.rm(boardID, +threadID); }, post: function(e) { var board, postID, threadID, _ref; @@ -7830,43 +7880,346 @@ return $.set('AutoWatch', threadID); } } else if (Conf['Auto Watch Reply']) { - return ThreadWatcher.watch(board.threads[threadID]); + return ThreadWatcher.add(board.threads[threadID]); } + }, + threadUpdate: function(e) { + var thread; + + thread = e.detail.thread; + if (!(e.detail[404] && ThreadWatcher.db.get({ + boardID: thread.board.ID, + threadID: thread.ID + }))) { + return; + } + return ThreadWatcher.add(thread); + } + }, + fetchCount: { + fetched: 0, + fetching: 0 + }, + fetchAllStatus: function() { + var thread, _i, _len, _ref; + + ThreadWatcher.status.textContent = '...'; + _ref = ThreadWatcher.getAll(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + thread = _ref[_i]; + ThreadWatcher.fetchStatus(thread); + } + }, + fetchStatus: function(_arg) { + var boardID, data, fetchCount, threadID; + + boardID = _arg.boardID, threadID = _arg.threadID, data = _arg.data; + if (data.isDead) { + return; + } + fetchCount = ThreadWatcher.fetchCount; + fetchCount.fetching++; + return $.ajax("//api.4chan.org/" + boardID + "/res/" + threadID + ".json", { + onloadend: function() { + var status; + + fetchCount.fetched++; + if (fetchCount.fetched === fetchCount.fetching) { + fetchCount.fetched = 0; + fetchCount.fetching = 0; + status = ''; + } else { + status = "" + (Math.round(fetchCount.fetched / fetchCount.fetching * 100)) + "%"; + } + ThreadWatcher.status.textContent = status; + if (this.status !== 404) { + return; + } + if (Conf['Auto Prune']) { + ThreadWatcher.rm(boardID, threadID); + } else { + data.isDead = true; + ThreadWatcher.db.set({ + boardID: boardID, + threadID: threadID, + val: data + }); + } + return ThreadWatcher.refresh(); + } + }, { + type: 'head' + }); + }, + getAll: function() { + var all, boardID, data, threadID, threads, _ref; + + all = []; + _ref = ThreadWatcher.db.data.boards; + for (boardID in _ref) { + threads = _ref[boardID]; + if (Conf['Current Board'] && boardID !== g.BOARD.ID) { + continue; + } + for (threadID in threads) { + data = threads[threadID]; + all.push({ + boardID: boardID, + threadID: threadID, + data: data + }); + } + } + return all; + }, + makeLine: function(boardID, threadID, data) { + var div, fullID, href, link, x; + + x = $.el('a', { + textContent: '×', + href: 'javascript:;' + }); + $.on(x, 'click', ThreadWatcher.cb.rm); + if (data.isDead) { + href = Redirect.to('thread', { + boardID: boardID, + threadID: threadID + }); + } + link = $.el('a', { + href: href || ("/" + boardID + "/res/" + threadID), + textContent: data.excerpt, + title: data.excerpt + }); + div = $.el('div'); + fullID = "" + boardID + "." + threadID; + div.dataset.fullID = fullID; + if (g.VIEW === 'thread' && fullID === ("" + g.BOARD + "." + g.THREADID)) { + $.addClass(div, 'current'); + } + if (data.isDead) { + $.addClass(div, 'dead-thread'); + } + $.add(div, [x, $.tn(' '), link]); + return div; + }, + refresh: function() { + var boardID, data, list, nodes, refresher, thread, threadID, toggler, _i, _j, _len, _len1, _ref, _ref1, _ref2, _ref3; + + nodes = []; + _ref = ThreadWatcher.getAll(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + _ref1 = _ref[_i], boardID = _ref1.boardID, threadID = _ref1.threadID, data = _ref1.data; + nodes.push(ThreadWatcher.makeLine(boardID, threadID, data)); + } + list = ThreadWatcher.list; + $.rmAll(list); + $.add(list, nodes); + _ref2 = g.BOARD.threads; + for (threadID in _ref2) { + thread = _ref2[threadID]; + toggler = $('.watcher-toggler', thread.OP.nodes.post); + toggler.src = ThreadWatcher.db.get({ + boardID: thread.board.ID, + threadID: threadID + }) ? Favicon["default"] : Favicon.empty; + } + _ref3 = ThreadWatcher.menu.refreshers; + for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) { + refresher = _ref3[_j]; + refresher(); } }, toggle: function(thread) { - if (!$.hasClass($('.watch-thread-link', thread.OP.nodes.post), 'watched')) { - return ThreadWatcher.watch(thread); + var boardID, threadID; + + boardID = thread.board.ID; + threadID = thread.ID; + if (ThreadWatcher.db.get({ + boardID: boardID, + threadID: threadID + })) { + return ThreadWatcher.rm(boardID, threadID); } else { - return ThreadWatcher.unwatch(thread.board, thread.ID); + return ThreadWatcher.add(thread); } }, - unwatch: function(board, threadID) { - return $.get('WatchedThreads', {}, function(item) { - var watched; + add: function(thread) { + var boardID, data, threadID; - watched = item['WatchedThreads']; - delete watched[board][threadID]; - if (!Object.keys(watched[board]).length) { - delete watched[board]; + data = {}; + boardID = thread.board.ID; + threadID = thread.ID; + if (thread.isDead) { + if (Conf['Auto Prune'] && ThreadWatcher.db.get({ + boardID: boardID, + threadID: threadID + })) { + ThreadWatcher.rm(boardID, threadID); + return; } - ThreadWatcher.refresh(watched); - return $.set('WatchedThreads', watched); + data.isDead = true; + } + data.excerpt = Get.threadExcerpt(thread); + ThreadWatcher.db.set({ + boardID: boardID, + threadID: threadID, + val: data }); + return ThreadWatcher.refresh(); }, - watch: function(thread) { - return $.get('WatchedThreads', {}, function(item) { - var watched, _name; - - watched = item['WatchedThreads']; - watched[_name = thread.board] || (watched[_name] = {}); - watched[thread.board][thread] = { - href: "/" + thread.board + "/res/" + thread, - textContent: Get.threadExcerpt(thread) - }; - ThreadWatcher.refresh(watched); - return $.set('WatchedThreads', watched); + rm: function(boardID, threadID) { + ThreadWatcher.db["delete"]({ + boardID: boardID, + threadID: threadID }); + return ThreadWatcher.refresh(); + }, + convert: function(oldFormat) { + var boardID, data, newFormat, threadID, threads; + + newFormat = {}; + for (boardID in oldFormat) { + threads = oldFormat[boardID]; + for (threadID in threads) { + data = threads[threadID]; + (newFormat[boardID] || (newFormat[boardID] = {}))[threadID] = { + excerpt: data.textContent + }; + } + } + return newFormat; + }, + menu: { + refreshers: [], + init: function() { + var menu; + + if (!Conf['Thread Watcher']) { + return; + } + menu = new UI.Menu('thread watcher'); + $.on($('.menu-button', ThreadWatcher.dialog), 'click', function(e) { + return menu.toggle(e, this, ThreadWatcher); + }); + this.addHeaderMenuEntry(); + return this.addMenuEntries(); + }, + addHeaderMenuEntry: function() { + var entryEl; + + if (g.VIEW !== 'thread') { + return; + } + entryEl = $.el('a', { + href: 'javascript:;' + }); + $.event('AddMenuEntry', { + type: 'header', + el: entryEl, + order: 60 + }); + $.on(entryEl, 'click', function() { + return ThreadWatcher.toggle(g.threads["" + g.BOARD + "." + g.THREADID]); + }); + return this.refreshers.push(function() { + var addClass, rmClass, text, _ref; + + _ref = $('.current', ThreadWatcher.list) ? ['unwatch-thread', 'watch-thread', 'Unwatch thread'] : ['watch-thread', 'unwatch-thread', 'Watch thread'], addClass = _ref[0], rmClass = _ref[1], text = _ref[2]; + $.addClass(entryEl, addClass); + $.rmClass(entryEl, rmClass); + return entryEl.textContent = text; + }); + }, + addMenuEntries: function() { + var cb, conf, entries, entry, name, refresh, subEntries, _i, _len, _ref, _ref1, _results; + + entries = []; + entries.push({ + cb: ThreadWatcher.cb.openAll, + entry: { + type: 'thread watcher', + el: $.el('a', { + textContent: 'Open all threads' + }) + }, + refresh: function() { + return (ThreadWatcher.list.firstElementChild ? $.rmClass : $.addClass)(this.el, 'disabled'); + } + }); + entries.push({ + cb: ThreadWatcher.cb.checkThreads, + entry: { + type: 'thread watcher', + el: $.el('a', { + textContent: 'Check 404\'d threads' + }) + }, + refresh: function() { + return ($('div:not(.dead-thread)', ThreadWatcher.list) ? $.rmClass : $.addClass)(this.el, 'disabled'); + } + }); + entries.push({ + cb: ThreadWatcher.cb.pruneDeads, + entry: { + type: 'thread watcher', + el: $.el('a', { + textContent: 'Prune 404\'d threads' + }) + }, + refresh: function() { + return ($('.dead-thread', ThreadWatcher.list) ? $.rmClass : $.addClass)(this.el, 'disabled'); + } + }); + subEntries = []; + _ref = Config.threadWatcher; + for (name in _ref) { + conf = _ref[name]; + subEntries.push(this.createSubEntry(name, conf[1])); + } + entries.push({ + entry: { + type: 'thread watcher', + el: $.el('span', { + textContent: 'Settings' + }), + subEntries: subEntries + } + }); + _results = []; + for (_i = 0, _len = entries.length; _i < _len; _i++) { + _ref1 = entries[_i], entry = _ref1.entry, cb = _ref1.cb, refresh = _ref1.refresh; + if (entry.el.nodeName === 'A') { + entry.el.href = 'javascript:;'; + } + if (cb) { + $.on(entry.el, 'click', cb); + } + if (refresh) { + this.refreshers.push(refresh.bind(entry)); + } + _results.push($.event('AddMenuEntry', entry)); + } + return _results; + }, + createSubEntry: function(name, desc) { + var entry, input; + + entry = { + type: 'thread watcher', + el: $.el('label', { + innerHTML: " " + name, + title: desc + }) + }; + input = entry.el.firstElementChild; + input.checked = Conf[name]; + $.on(input, 'change', $.cb.checked); + if (name === 'Current Board') { + $.on(input, 'change', ThreadWatcher.refresh); + } + return entry; + } } }; @@ -8205,8 +8558,8 @@ http: true, https: true, software: 'foolfuuka', - boards: ['adv', 'asp', 'cm', 'i', 'lgbt', 'n', 'o', 'p', 's4s', 't', 'trv'], - files: ['adv', 'asp', 'cm', 'i', 'lgbt', 'n', 'o', 'p', 's4s', 't', 'trv'] + boards: ['adv', 'asp', 'cm', 'd', 'e', 'i', 'lgbt', 'n', 'o', 'p', 'pol', 's', 's4s', 't', 'trv', 'y'], + files: ['cm', 'd', 'e', 'i', 'n', 'o', 'p', 's', 'trv', 'y'] }, 'Foolz Beta': { domain: 'beta.foolz.us', @@ -8631,11 +8984,8 @@ }, callbacks: [], cb: function(e) { - var post; - e.preventDefault(); - post = Get.postFromNode(this); - return ExpandComment.expand(post); + return ExpandComment.expand(Get.postFromNode(this)); }, expand: function(post) { var a; @@ -8698,6 +9048,12 @@ } quote.href = "/" + post.board + "/res/" + href; } + Build.capcodeReplies({ + boardID: post.board.ID, + threadID: post.thread.ID, + bq: clone, + capcodeReplies: postObj.capcode_replies + }); post.nodes.shortComment = comment; $.replace(comment, clone); post.nodes.comment = post.nodes.longComment = clone; @@ -9740,7 +10096,8 @@ $.on(d, '4chanXInitFinished', Settings.open); } return $.set({ - lastchecked: Date.now(), + archives: Conf['archives'], + lastarchivecheck: now, previousversion: g.VERSION }); }); @@ -9935,7 +10292,6 @@ version: g.VERSION, date: now }; - Conf['WatchedThreads'] = {}; for (_i = 0, _len = DataBoards.length; _i < _len; _i++) { db = DataBoards[_i]; Conf[db] = { @@ -10070,14 +10426,13 @@ }); } } - data.Conf.WatchedThreads = data.WatchedThreads; - } else if (version[0] === '3') { - data = Settings.convertSettings(data, { - 'Reply Hiding': 'Reply Hiding Buttons', - 'Thread Hiding': 'Thread Hiding Buttons', - 'Bottom header': 'Bottom Header', - 'Unread Tab Icon': 'Unread Favicon' - }); + data.Conf['WatchedThreads'] = data.WatchedThreads; + } + if (data.Conf['WatchedThreads']) { + data.Conf['watchedThreads'] = { + boards: ThreadWatcher.convert(data.Conf['WatchedThreads']) + }; + delete data.Conf['WatchedThreads']; } return $.set(data.Conf); }, @@ -10524,6 +10879,7 @@ 'Thread Stats': ThreadStats, 'Thread Updater': ThreadUpdater, 'Thread Watcher': ThreadWatcher, + 'Thread Watcher (Menu)': ThreadWatcher.menu, 'Index Navigation': Nav, 'Keybinds': Keybinds, 'Show Dice Roll': Dice @@ -10621,8 +10977,7 @@ } Main.callbackNodes(Thread, threads); Main.callbackNodesDB(Post, posts, function() { - $.event('4chanXInitFinished'); - return Main.checkUpdate(); + return $.event('4chanXInitFinished'); }); if (styleSelector = $.id('styleSelector')) { passLink = $.el('a', { @@ -10642,8 +10997,7 @@ err = _error; new Notification('warning', 'Cookies need to be enabled on 4chan for 4chan X to properly function.', 30); } - $.event('4chanXInitFinished'); - return Main.checkUpdate(); + return $.event('4chanXInitFinished'); }, callbackNodes: function(klass, nodes) { var callback, err, errors, i, len, node, _i, _len, _ref; @@ -10750,40 +11104,6 @@ obj.callback.isAddon = true; return Klass.prototype.callbacks.push(obj.callback); }, - message: function(e) { - var el, version; - - version = e.data.version; - if (version && version !== g.VERSION) { - el = $.el('span', { - innerHTML: "Update: 4chan X v" + version + " is out, get it here." - }); - return new Notification('info', el, 120); - } - }, - checkUpdate: function() { - var now; - - if (!(Conf['Check for Updates'] && Main.isThisPageLegit())) { - return; - } - now = Date.now(); - return $.get('lastchecked', 0, function(_arg) { - var lastchecked; - - lastchecked = _arg.lastchecked; - if (lastchecked > now - $.DAY) { - return; - } - return $.ready(function() { - $.on(window, 'message', Main.message); - $.set('lastchecked', now); - return $.add(d.head, $.el('script', { - src: 'https://github.com/seaweedchan/4chan-x/raw/master/latest.js' - })); - }); - }); - }, handleErrors: function(errors) { var div, error, logs, _i, _len; @@ -10838,7 +11158,7 @@ } return Main.thisPageIsLegit; }, - css: "/* General */\n.dialog {\nbox-shadow: 0 1px 2px rgba(0, 0, 0, .15);\nborder: 1px solid;\ndisplay: block;\npadding: 0;\n}\n.captcha-img,\n.field {\nbackground-color: #FFF;\nborder: 1px solid #CCC;\n-moz-box-sizing: border-box;\nbox-sizing: border-box;\ncolor: #333;\nfont: 13px sans-serif;\noutline: none;\ntransition: color .25s, border-color .25s;\ntransition: color .25s, border-color .25s;\n}\n.field::-moz-placeholder,\n.field:hover::-moz-placeholder {\ncolor: #AAA !important;\nfont-size: 13px !important;\nopacity: 1.0 !important;\n}\n.captch-img:hover,\n.field:hover {\nborder-color: #999;\n}\n.field:hover, .field:focus {\ncolor: #000;\n}\n.field[disabled] {\nbackground-color: #F2F2F2;\ncolor: #888;\n}\n.move {\ncursor: move;\noverflow: hidden;\n}\nlabel, .favicon {\ncursor: pointer;\n}\na[href=\"javascript:;\"] {\ntext-decoration: none;\n}\n.warning {\ncolor: red;\n}\n#boardNavDesktop {\ndisplay: none !important;\n}\na {\noutline: none !important;\n}\n\n/* 4chan style fixes */\n.opContainer, .op {\ndisplay: block !important;\noverflow: visible !important;\n}\n[hidden] {\ndisplay: none !important;\n}\n\n/* fixed, z-index */\n#overlay,\n#fourchanx-settings,\n#qp, #ihover,\n#navlinks, .fixed #header-bar,\n:root.float #updater,\n:root.float #thread-stats,\n#qr {\nposition: fixed;\n}\n#fourchanx-settings {\nz-index: 999;\n}\n#overlay {\nz-index: 900;\n}\n#notifications {\nz-index: 70;\n}\n#qp, #ihover {\nz-index: 60;\n}\n#menu {\nz-index: 50;\n}\n#navlinks, #updater, #thread-stats {\nz-index: 40;\n}\n.fixed #header-bar.autohide {\nz-index: 35;\n}\n#qr {\nz-index: 30;\n}\n#watcher {\nz-index: 8;\n}\n:root.fixed-watcher #watcher {\nz-index: 20;\n}\n.fixed #header-bar {\nz-index: 10;\n}\n/* Header */\n.fixed.top body {\npadding-top: 2em;\n}\n.fixed.bottom body {\npadding-bottom: 2em;\n}\n.fixed #header-bar {\nright: 0;\nleft: 0;\npadding: 3px 4px 4px;\n}\n.fixed.top #header-bar {\ntop: 0;\n}\n.fixed.bottom #header-bar {\nbottom: 0;\n}\n#header-bar {\nborder-width: 0;\ntransition: all .1s .05s ease-in-out;\n}\n:root.centered-links #shortcuts {\nwidth: 300px;\ntext-align: right;\n}\n:root.centered-links #header-bar {\ntext-align: center;\n}\n:root.centered-links #custom-board-list {\nposition: relative;\nleft: 150px;\n}\n.fixed.top #header-bar {\nborder-bottom-width: 1px;\n}\n.fixed.bottom #header-bar {\nbox-shadow: 0 -1px 2px rgba(0, 0, 0, .15);\nborder-top-width: 1px;\n}\n.fixed.bottom #header-bar .menu-button i {\nborder-top: none;\nborder-bottom: 6px solid;\n}\n#board-list {\ntext-align: center;\n}\n.fixed #header-bar.autohide:not(:hover) {\nbox-shadow: none;\ntransition: all .8s .6s cubic-bezier(.55, .055, .675, .19);\n}\n.fixed.top #header-bar.autohide:not(:hover) {\nmargin-bottom: -1em;\n-webkit-transform: translateY(-100%);\ntransform: translateY(-100%);\n}\n.fixed.bottom #header-bar.autohide:not(:hover) {\n-webkit-transform: translateY(100%);\ntransform: translateY(100%);\n}\n#scroll-marker {\nleft: 0;\nright: 0;\nheight: 10px;\nposition: absolute;\n}\n:root:not(.autohide) #scroll-marker {\npointer-events: none;\n}\n#header-bar #scroll-marker {\ndisplay: none;\n}\n.fixed #header-bar #scroll-marker {\ndisplay: block;\n}\n.fixed.top #header-bar #scroll-marker {\ntop: 100%;\n}\n.fixed.bottom #header-bar #scroll-marker {\nbottom: 100%;\n}\n#header-bar a:not(.entry):not(.close) {\ntext-decoration: none;\npadding: 1px;\n}\n#header-bar input {\nmargin: 0;\nvertical-align: bottom;\n}\n#shortcuts:empty {\ndisplay: none;\n}\n.brackets-wrap::before {\ncontent: \"\\00a0[\";\n}\n.brackets-wrap::after {\ncontent: \"]\\00a0\";\n}\n.disabled,\n.expand-all-shortcut {\nopacity: .45;\n}\n#shortcuts {\nfloat: right;\n}\n.shortcut {\nmargin-left: 3px;\n}\n#navbotright,\n#navtopright {\ndisplay: none;\n}\n#toggleMsgBtn {\ndisplay: none !important;\n}\n.current {\nfont-weight: bold;\n}\n/* 4chan X link brackets */\n.fourchanx-link::after {\ncontent: \"]\";\n}\n.fourchanx-link::before {\ncontent: \"[\";\n}\n/* Notifications */\n#notifications {\nposition: fixed;\ntop: 0;\nheight: 0;\ntext-align: center;\nright: 0;\nleft: 0;\ntransition: all .8s .6s cubic-bezier(.55, .055, .675, .19);\n}\n.fixed.top #header-bar #notifications {\nposition: absolute;\ntop: 100%;\n}\n.notification {\ncolor: #FFF;\nfont-weight: 700;\ntext-shadow: 0 1px 2px rgba(0, 0, 0, .5);\nbox-shadow: 0 1px 2px rgba(0, 0, 0, .15);\nborder-radius: 2px;\nmargin: 1px auto;\nwidth: 500px;\nmax-width: 100%;\nposition: relative;\ntransition: all .25s ease-in-out;\n}\n.notification.error {\nbackground-color: hsla(0, 100%, 38%, .9);\n}\n.notification.warning {\nbackground-color: hsla(36, 100%, 38%, .9);\n}\n.notification.info {\nbackground-color: hsla(200, 100%, 38%, .9);\n}\n.notification.success {\nbackground-color: hsla(104, 100%, 38%, .9);\n}\n.notification a {\ncolor: white;\n}\n.notification > .close {\npadding: 6px;\ntop: 0;\nright: 5px;\nposition: absolute;\n}\n.message {\n-moz-box-sizing: border-box;\nbox-sizing: border-box;\npadding: 6px 20px;\nmax-height: 200px;\nwidth: 100%;\noverflow: auto;\n}\n\n/* Settings */\n:root.fourchan-x body {\n-moz-box-sizing: border-box;\nbox-sizing: border-box;\n}\n#overlay {\nbackground-color: rgba(0, 0, 0, .5);\ntop: 0;\nleft: 0;\nheight: 100%;\nwidth: 100%;\n}\n#fourchanx-settings {\n-moz-box-sizing: border-box;\nbox-sizing: border-box;\nbox-shadow: 0 0 15px rgba(0, 0, 0, .15);\nheight: 600px;\nmax-height: 100%;\nwidth: 900px;\nmax-width: 100%;\nmargin: auto;\npadding: 3px;\ntop: 50%;\nleft: 50%;\n-moz-transform: translate(-50%, -50%);\n-webkit-transform: translate(-50%, -50%);\ntransform: translate(-50%, -50%);\n}\n#fourchanx-settings > nav {\npadding: 2px 2px 0;\nheight: 15px;\n}\n#fourchanx-settings > nav a {\ntext-decoration: underline;\n}\n#fourchanx-settings > nav a.close {\ntext-decoration: none;\npadding: 2px;\n}\n.section-container {\noverflow: auto;\nposition: absolute;\ntop: 2.1em;\nright: 5px;\nbottom: 5px;\nleft: 5px;\npadding-right: 5px;\n}\n.sections-list {\npadding: 0 3px;\nfloat: left;\n}\n.credits {\nfloat: right;\n}\n.tab-selected {\nfont-weight: 700;\n}\n.section-sauce ul,\n.section-advanced ul {\nlist-style: none;\nmargin: 0;\n}\n.section-sauce ul {\npadding: 8px;\n}\n.section-advanced ul {\npadding: 0px;\n}\n.section-sauce li,\n.section-advanced li {\npadding-left: 4px;\n}\n.section-main label {\ntext-decoration: underline;\n}\n.section-filter ul {\npadding: 0;\n}\n.section-filter li {\nmargin: 10px 40px;\n}\n.section-filter textarea {\nheight: 500px;\n}\n.section-sauce textarea {\nheight: 350px;\n}\n.section-advanced .field[name=\"boardnav\"] {\nwidth: 100%;\n}\n.section-advanced textarea {\nheight: 150px;\n}\n.section-advanced .archive-cell {\nmin-width: 160px;\ntext-align: center;\n}\n.section-advanced #archive-board-select {\nposition: absolute;\n}\n.section-advanced .note {\nfont-size: 0.8em;\nfont-style: italic;\nmargin-left: 10px;\n}\n.section-advanced .note code {\nfont-style: normal;\nfont-size: 11px;\n}\n.section-keybinds .field {\nfont-family: monospace;\n} \n#fourchanx-settings fieldset {\nborder: 1px solid;\nborder-radius: 3px;\n}\n#fourchanx-settings legend {\nfont-weight: 700;\n}\n#fourchanx-settings textarea {\nfont-family: monospace;\nmin-width: 100%;\nmax-width: 100%;\n}\n#fourchanx-settings code {\ncolor: #000;\nbackground-color: #FFF;\npadding: 0 2px;\n}\n.unscroll {\noverflow: hidden;\n}\n\n/* Announcement Hiding */\n:root.hide-announcement #globalMessage {\ndisplay: none;\n}\na.hide-announcement {\nfloat: left;\n}\n\n/* Unread */\n#unread-line {\nmargin: 0;\nborder-color: rgb(255,0,0);\n}\n\n/* Thread Updater */\n#updater {\nbackground: none;\nborder: none;\nbox-shadow: none;\n}\n#updater > .move {\npadding: 5px 3px 0px;\nmargin-bottom: -3px;\n}\n#updater > div:last-child {\ntext-align: center;\n}\n#updater input[type=number] {\nwidth: 4em;\n}\n:root.float #updater {\npadding: 0px 3px;\n}\n.new {\ncolor: limegreen;\n}\n#update-status.new {\nmargin-right: 5px;\n}\n#update-timer {\ncursor: pointer;\n}\n\n/* Thread Watcher */\n#watcher {\nposition: absolute;\n}\n#watcher {\npadding-bottom: 3px;\noverflow: hidden;\nwhite-space: nowrap;\nmin-width: 120px;\nmax-height: 92%;\noverflow-y: auto;\n}\n:root.fixed-watcher #watcher {\nposition: fixed;\n}\n:root:not(.fixed-watcher) #watcher:not(:hover) {\nmax-height: 210px;\noverflow-y: hidden;\n}\n#watcher > .move {\npadding-top: 3px;\n}\n#watcher > div {\nmax-width: 250px;\noverflow: hidden;\npadding-left: 3px;\npadding-right: 3px;\ntext-overflow: ellipsis;\n}\n#watcher a {\ntext-decoration: none;\n}\n#watcher .move>.close {\nposition: absolute;\nright: 0px;\ntop: 0px;\npadding: 0px 4px;\n}\n.watch-thread-link {\npadding-top: 18px;\nwidth: 18px;\nheight: 0px;\ndisplay: inline-block;\nbackground-repeat: no-repeat;\nopacity: 0.2;\nposition: relative;\ntop: 1px;\n}\n.watch-thread-link.watched {\nopacity: 1;\n}\n\n/* Thread Stats */\n#thread-stats {\nbackground: none;\nborder: none;\nbox-shadow: none;\n}\n:root.float #post-count, :root.float #file-count {\npointer-events: none;\n}\n:root.float #thread-stats {\npadding: 0px 3px;\n}\n\n/* Quote */\n.deadlink {\ntext-decoration: none !important;\n}\n.backlink.deadlink:not(.forwardlink),\n.quotelink.deadlink:not(.forwardlink) {\ntext-decoration: underline !important;\n}\n.inlined {\nopacity: .5;\n}\n#qp input, .forwarded {\ndisplay: none;\n}\n.quotelink.forwardlink,\n.backlink.forwardlink {\ntext-decoration: none;\nborder-bottom: 1px dashed;\n}\n.filtered {\ntext-decoration: underline line-through;\n}\n:root.hide-backlinks .backlink.filtered {\ndisplay: none;\n}\n.inline {\nborder: 1px solid;\ndisplay: table;\nmargin: 2px 0;\n}\n.inline .post {\nborder: 0 !important;\nbackground-color: transparent !important;\ndisplay: table !important;\nmargin: 0 !important;\npadding: 1px 2px !important;\n}\n#qp > .opContainer::after {\ncontent: '';\nclear: both;\ndisplay: table;\n}\n#qp .post {\nborder: none;\nmargin: 0;\npadding: 2px 2px 5px;\n}\n#qp img {\nmax-height: 80vh;\nmax-width: 50vw;\n}\n.qphl {\noutline: 2px solid rgba(216, 94, 49, .7);\n}\n:root.highlight-own .yourPost > .reply,\n:root.highlight-you .quotesYou > .reply {\nborder-left: 2px solid rgba(221,0,0,.5);\n}\n/* Quote Threading */\n.threadContainer {\nmargin-left: 20px;\nborder-left: 1px solid rgba(128,128,128,.3);\n}\n.threadOP {\nclear: both;\n} \n\n/* File */\n.fileText:hover .fntrunc,\n.fileText:not(:hover) .fnfull,\n.expanded-image > .post > .file > .fileThumb > img[data-md5],\n:not(.expanded-image) > .post > .file > .fileThumb > .full-image {\ndisplay: none;\n}\n.expanding {\nopacity: .5;\n}\n:root.fit-height .full-image {\nmax-height: 100vh;\n}\n:root.fit-width .full-image {\nmax-width: 100%;\n}\n:root.gecko.fit-width .full-image {\nwidth: 100%;\n}\n#ihover {\n-moz-box-sizing: border-box;\nbox-sizing: border-box;\nmax-height: 100%;\nmax-width: 75%;\npadding-bottom: 16px;\n}\n.fappeTyme .thread > .noFile,\n.fappeTyme .threadContainer > .noFile {\ndisplay: none;\n}\n\n/* Index/Reply Navigation */\n#navlinks {\nfont-size: 16px;\ntop: 25px;\nright: 10px;\n}\n\n/* Filter */\n.opContainer.filter-highlight {\nbox-shadow: inset 5px 0 rgba(255, 0, 0, .5);\n}\n.filter-highlight > .reply {\nbox-shadow: -5px 0 rgba(255, 0, 0, .5);\n}\n\n/* Spoiler text */\n:root.reveal-spoilers s {\ncolor: white !important;\n}\n\n/* Thread & Reply Hiding */\n.hide-thread-button,\n.hide-reply-button {\nfloat: left;\nmargin-right: 2px;\n}\n.stub ~ * {\ndisplay: none !important;\n}\n.stub input {\ndisplay: inline-block;\n}\n\n/* QR */\n:root.hide-original-post-form #postForm,\n:root.hide-original-post-form .postingMode,\n:root.hide-original-post-form #togglePostForm,\n#qr.autohide:not(.has-focus):not(:hover) > form,\n.postingMode ~ #qr select,\n#file-n-submit:not(.has-file) #qr-filerm {\ndisplay: none;\n}\n#qr select,\n#dump-button,\n.remove,\n.captcha-img {\ncursor: pointer;\n}\n#qr {\nz-index: 20;\nposition: fixed;\npadding: 1px;\nborder: 1px solid transparent;\nmin-width: 300px;\nborder-radius: 3px 3px 0 0;\n}\n#qrtab {\nborder-radius: 3px 3px 0 0;\n}\n#qrtab {\nmargin-bottom: 1px;\n}\n#qr .close {\nfloat: right;\npadding: 0 3px;\n}\n#qr .warning {\nmin-height: 1.6em;\nvertical-align: middle;\npadding: 0 1px;\nborder-width: 1px;\nborder-style: solid;\n}\n.qr-link-container {\ntext-align: center;\n}\n.persona {\nwidth: 248px;\nmax-width: 100%;\nmin-width: 100%;\n}\n#dump-button {\nwidth: 10%;\nmargin: 0;\nmargin-right: 4px;\nfont: 13px sans-serif;\npadding: 1px 0px 2px;\nopacity: 0.6;\n}\n.persona .field:not(#dump) {\nwidth: 95px;\nmin-width: 33.3%;\nmax-width: 33.3%;\n}\n#qr textarea.field {\nheight: 14.8em;\nmin-height: 9em;\n}\n#qr.has-captcha textarea.field {\nheight: 9em;\n}\ninput.field.tripped:not(:hover):not(:focus) {\ncolor: transparent !important;\ntext-shadow: none !important;\n}\n#qr textarea {\nresize: both;\n}\n.captcha-img {\nmargin: 0px;\ntext-align: center;\nbackground-image: #fff;\nfont-size: 0px;\nmin-height: 59px;\nmin-width: 302px;\n}\n.captcha-input {\nwidth: 100%;\nmargin: 1px 0 0;\n}\n.captcha-input.error:focus {\nborder-color: rgb(255,0,0) !important;\n}\n.field {\n-moz-box-sizing: border-box;\nmargin: 0px;\npadding: 2px 4px 3px;\n}\n#qr textarea {\nmin-width: 100%;\n}\n#qr [type='submit'] {\nwidth: 25%;\nvertical-align: top;\n}\n:root.webkit #qr [type='submit'] {\nheight: 24px;\n}\n/* Fake File Input */\n#qr-filename,\n.has-file #qr-no-file {\ndisplay: none;\n}\n#qr-no-file,\n.has-file #qr-filename {\ndisplay: inline-block;\npadding: 0px 4px;\nmargin-bottom: 2px;\noverflow: hidden;\ntext-overflow: ellipsis;\nmax-width: 88%;\n}\n#qr-no-file {\ncolor: #AAA;\n}\n#qr-filename-container {\n-moz-box-sizing: border-box;\ndisplay: inline-block;\nposition: relative;\nwidth: 100px;\nmin-width: 74.6%;\nmax-width: 74.6%;\nmargin-right: 0.4%;\nmargin-top: 1px;\noverflow: hidden;\npadding: 2px 1px 0;\nheight: 22px;\n}\n#qr-filename-container:hover {\ncursor: text;\n}\n#qr-extras-container {\nposition: absolute;\nright: 0px;\n}\n#qr-filerm {\nmargin-right: 2px;\nz-index: 2;\n}\n#file-n-submit {\nheight: 23px;\n}\n#qr input[type=file] {\nvisibility: hidden;\nposition: absolute;\n}\n/* Thread Select / Spoiler Label */\n#qr select {\nfloat: right;\n}\n#qr.has-spoiler .has-file #qr-spoiler-label {\nwidth: 6.7%;\nmin-width: 6.7%;\nmax-width: 6.7%;\ndisplay: inline-block;\ntext-align: center;\nvertical-align: top;\n}\n#qr.has-spoiler #file-n-submit:not(.has-file) #qr-spoiler-label {\ndisplay: none;\n}\n#qr.has-spoiler .has-file #qr-filename-container {\nmax-width: 67.9%;\nmin-width: 67.9%;\n}\n#qr-spoiler-label input {\nposition: relative;\ntop: 3px;\n}\n/* Dumping UI */\n.dump #dump-list-container {\ndisplay: block;\n}\n#dump-list-container {\ndisplay: none;\nposition: relative;\noverflow-y: hidden;\nmargin-top: 1px;\n}\n#dump-list {\noverflow-x: auto;\noverflow-y: hidden;\nwhite-space: nowrap;\nwidth: 248px;\nmax-width: 100%;\nmin-width: 100%;\n}\n#dump-list:hover {\noverflow-x: auto;\n}\n.qr-preview {\n-moz-box-sizing: border-box;\ncounter-increment: thumbnails;\ncursor: move;\ndisplay: inline-block;\nheight: 90px;\nwidth: 90px;\npadding: 2px;\nopacity: .5;\noverflow: hidden;\nposition: relative;\ntext-shadow: 0 1px 1px #000;\n-moz-transition: opacity .25s ease-in-out;\nvertical-align: top;\nbackground-size: cover;\n}\n.qr-preview:hover,\n.qr-preview:focus {\nopacity: .9;\n}\n.qr-preview::before {\ncontent: counter(thumbnails);\ncolor: #fff;\nposition: absolute;\ntop: 3px;\nright: 3px;\ntext-shadow: 0 0 3px #000, 0 0 8px #000;\n}\n.qr-preview#selected {\nopacity: 1;\n}\n.qr-preview.drag {\nbox-shadow: 0 0 10px rgba(0,0,0,.5);\n}\n.qr-preview.over {\nborder-color: #fff;\n}\n.qr-preview > span {\ncolor: #fff;\n}\n.remove {\nbackground: none;\ncolor: #e00;\nfont-weight: 700;\npadding: 3px;\n}\na:only-of-type > .remove {\ndisplay: none;\n}\n.remove:hover::after {\ncontent: \" Remove\";\n}\n.qr-preview > label {\nbackground: rgba(0,0,0,.5);\ncolor: #fff;\nright: 0;\nbottom: 0;\nleft: 0;\nposition: absolute;\ntext-align: center;\n}\n.qr-preview > label > input {\nmargin: 0;\n}\n#add-post {\ncursor: pointer;\nfont-size: 2em;\nposition: absolute;\ntop: 50%;\nright: 10px;\n-moz-transform: translateY(-50%);\n}\n.textarea {\nposition: relative;\n}\n:root.webkit .textarea {\nmargin-bottom: -2px;\n}\n#char-count {\ncolor: #000;\nbackground: hsla(0, 0%, 100%, .5);\nfont-size: 8pt;\nposition: absolute;\nbottom: 1px;\nright: 1px;\npointer-events: none;\n}\n\n/* Menu */\n.menu-button {\ndisplay: inline-block;\nposition: relative;\ncursor: pointer;\n}\n.menu-button i {\nborder-top: 6px solid;\nborder-right: 4px solid transparent;\nborder-left: 4px solid transparent;\ndisplay: inline-block;\nmargin: 2px;\nvertical-align: middle;\n}\n#menu {\nposition: fixed;\noutline: none;\n}\n.entry {\nborder-bottom: 1px solid rgba(0,0,0,.25);\ncursor: pointer;\ndisplay: block;\noutline: none;\npadding: 3px 7px;\nposition: relative;\ntext-decoration: none;\nwhite-space: nowrap;\n}\n.left>.entry.has-submenu {\npadding-right: 17px !important;\n}\n.entry:last-child {\nborder-bottom: 0;\n}\n.has-submenu::after {\ncontent: \"\";\nborder-left: .5em solid;\nborder-top: .3em solid transparent;\nborder-bottom: .3em solid transparent;\ndisplay: inline-block;\nmargin: .3em;\nposition: absolute;\nright: 3px;\n}\n.left .has-submenu::after {\nborder-left: 0;\nborder-right: .5em solid;\n}\n.submenu {\ndisplay: none;\nposition: absolute;\nleft: 100%;\ntop: -1px;\n}\n.focused .submenu {\ndisplay: block;\n}\n.imp-exp-result {\nposition: absolute;\ntext-align: center;\nmargin: auto;\nright: 0px;\nleft: 0px;\nwidth: 200px;\n}\n.export, .import {\ncursor: pointer;\ntext-decoration: none !important;\n}\n/* Link Title Favicons */\n.linkify.YouTube {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABIklEQVQoz53LvUrDUBjG8bOoOammSf1IoBSvoCB4JeIqOHgBLt6AIMRBBQelWurQ2kERnMRBsBUcIp5FJSBI5oQsJVkkUHh8W0o5nhaFHvjBgef/Mq+Q46RJBMkI/vE+aOus956tnEswIZe1LV0QyJ5sE2GzgZfVMtRNIdiDpccEssdlB1mW4bvTwdvWJtRdErM7U+8S/FJykCRJX5qm+KpVce8UMNLRLbulz4iSjTAMh6Iowsd5BeNadp3nUF0VlxAEwZBotXC0Usa4ll3meZdA1iguwvf9vpvDA2wvmKgYGtSud8suDB4TyGr2PF49D/vra9jRZ1BVdknMzgwuCGSnZEObwu6sBnVTCHZiaC7BhFx2PKdxUidiAH/4lLo9Mv0DELVs9qsOHXwAAAAASUVORK5CYII=') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.Vimeo {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAASJJREFUOE9jYAAC7ln7/pODQXrBmq333PvPu/YaSRikB6QXbACpmmHqsRoAMll7+20UQ0H8tmuv/pdffPFfZtNNuByGASBFIPDh5x+4IV6HHoDFYGDJgw+YBoBMBUkgA5BtIKduuvvy//svX+FSB+88wTTAc+/t/83bj/0HScLA5BPXwc7lKJ36f+L6XXDxhUfOYxrAPWUnWKFp9UQUm3iWQxSDXAEDSX3zcIcB96wD/x+8eA1XDNKMHAYg20GW4Y0FkCIYAAUqzEBQOIBciRzlWKMxZelOlMCEcVxq+jHSC1YDJPs3YBgA8jey0/F6ARRwsFAHORukmat9NdbUijMpg/wKcrJodDFOzSBXwA3Alh9AToZFI7a8Asu98BxJbnYGAJb5vYLDANzSAAAAAElFTkSuQmCC') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.SoundCloud {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABsklEQVQ4y5WTy2pUQRCGv2rbzDjJeAlIBmOyipGIIJqFEBDElwh4yULGeRFXPoEIBl/AvQ/gC2RnxCAoxijiwks852S6+3dxzslcHJCpTXVX11/Xv0097gLPgVNMJxnQNfX4zsqleWbnpoMf/oa9d988MM9MC/rp+E0a+A0dsVobMNMCOO8B6McRoABJI+A6gJmN3D2A8jgEBCEkSEMBrcrsDAzDWWn3AjgKFaDMmgRqniGFgsaDp1jrLOngDf1XT1D+A1dFc4MKAkkiCVKjjVu7g9+4Rzx4i1u6hjXbuMWr0O5QPNvCu7IaCZwEKQukLGDrm5x8uI0tr6MkiGlkiv7yLfzN+6S5i6QsIMABkEfcxhbWWYMkVAOjxvYAjc3HNHrbKI9VBQBFwF25XQKSBjqIf1YBuAurEMrczgDygD6/x2LCpFLXLUyQ+PoldphhBhYfIX09XU1+Flaukz7uYqs3SHs7cG4BmTsmkBUF9mmXEwa28BNLPaQPLepuNcbGSWQquQC2/Kdcox1FUGkcB0ykck1nA2+wTzMs8stGnP4rbWGw74EuS/GFQWfK7/wF6P4F7fzIAYkdmdEAAAAASUVORK5CYII=') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.audio {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAitJREFUOE9jYCAWKJWwavr0KyXWb/FIbDtUFFyzJx6nVofE2Xo5nXsj0rqPNSR0nVkR2Hjmgmfd+U9Otdf+m5Vf/6+SfeU/R9ChVVgNYDRtlfJuuPA/rPfe/4QpD/6nznj0P27Kw/9unff/69Xf+69c/+C/SO7N/0z+OAxgMmmRCe++/r9i3ev/KWvf/vdY8PK/bt/9/wrNV3/IN5y/IVt1YqNg4pGTTP4HsbuA2bhZ2qvpyn+xjIObxAp3VwqlrgngLFyryVy5nhPmZJHANS2cwYexG8BmVC/pWn3hP4NZlzWuQDJI3dIiFnUUuwEsQAOcq87jNcC7fHeLUtJxHF4AGmBWeAavAWH1+1rUUk7giAWjOknllON4DXAs2NEiG4/DBQxAF/CFHfrPYI4jDFSLuJVjNrUJhB/B7gIGo1pJRt99GAZYJK7wLJ1z7Xzl4vu/7aqv/GRBj0bjqAX2qb0nJ7mXH17C4HcUxQA+hymWtSue/C5a9up/9Ozn/7Vr7v1nRY7GqMb91T3b3v6vWvPmf/S0p/9ZQk+DDLCBRSOz06Jqk+o7/21nvfqvsebDf7kZL/5zBaxphkezd+OFn7HzXvz3Wvjmv9a8N//5Ek//ZTBpVYUrMG2X5wjcdl68+uI/wa5Lr3hSNjczGFeywOVZ/bbcVGp//F9izfv/Ql03f3P4LC/HSEQquYwMFnUCDJ7dzBhyjGZNQpye89M5gpfnMvtNUyE2h4PUAQBovvT7lyNljwAAAABJRU5ErkJggg==') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.LiveLeak {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAydJREFUOE9Nk1tIk2EYx79NyUNqTk0o6KYrnZeChodLDxfeZpCbJk4RXU5Nm7tYRYhiYXbQlaeGutyW2gxtpB1RIyKDEjKwA6Ti2dR5KNDn+fq/S6TBj/f93r3P732e53s/qfnkSdej4GB2SBLbwf+jmB+gUMgOheLg/z7EdCUnO6Ref392SpK8Hyh3I+gBwBo7lUp2xcbyQEoKD6alyQOpqd754/h4FjJXZCRJTl9ftmEzoK5/wdQJxPgkLY2WV1dpc2uLtnZ2eHNnhza3t2nd46GhjAzuValY6jx0iIfS03msoIDuQ9COQCtoUSjohU5HuwgaN5loeXycd3d3aW9vzwvW2K5SkdTi58fvzGb+3tdHFggA3QONEAzn59PvjQ1yqNX0zenkvX0B4ffWaGRraChJd/385JGqKvlzTw/fRqOaIGkEd1DjU52O/3g83BkTw5MOh7yJuUCUM2o0yi2hoSw1IIOhykr+YLNRHYKu4XQvyKA/N5c8yMCCDD7Z7bz26xcJ1rH2rKKCG0UJdRAMlJbyG6uVrkJQjWAB5tSbk0Nr2HwDgvcQiIYur6zQyvo6ucvLueHIEZKuQPBQr+dXra1kRuqXEOwFArtWSytra1QdFUVjNhvPLS3R3OIiLUDUD0F1WBhJJtwDW2Ehu5uaqBICI4IFlRB0QLCEzaboaHrd0cHzCBYsIIuesjK+LAQXkEFrXh676uupGCWcR6AeghLQptGQONUAwfOuLp6Zn6eZuTmaXVig7pISrhI90ENgQbdHhoep32JhFzLpu3WLio8epUYIfs7OUjF6UKJW88XERLqYkEBNej11oG8XhCAvMFAuOn5cNiclsTkhQTbhmpri4lgbEMANWi1DwC/xit3t7bK7rY0Fo4OD3G4wyEURESzloAdnceezlErK8vH5N4KzPj50PTOTfkxP0+THj/RlYoInJyZI8HVqim5qNFwQHk7SucBAPo2PKRMNPLM/4pnFszYkhJsNBu6uqWFHba1sr61lQSveQFZQkFx07BhJmhMnrLn4NLMPH/aSExR0QDbmWhwgyEapwDvXoDxdWBiXnjrV/Bdm2kYUxLwmEgAAAABJRU5ErkJggg==') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.Vocaroo {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAw9JREFUOE9jYMABuMwYmCyTJKUCGlSnFSy02TTzeOyCiQcDViX26qVz2TAyYtWmEMwuoZ3M7V40LcB79pHkc0svpvzY8jD//87nxf+3Pyn8v/ZO8v+VNyP/2mZJumI1QCWSI8232Hjumitlfw5+qPp/9l8TCt76JP//xkdx/wsXWCzjtWFkwTCkbWFe9plPk/+ga4Txz/xt/D/hkN//gMXif21a+NbyWjIwoRiy6GDT5rP/mlFsPfyp5n/NpOj/22+0gMUXXIz/H7hC/L/bFKFbPDZMrHAD5H35OPt2J9zacDv/f3V7xv9FhwrBGubsT/1//Pjx/1GJ/mD+/nfl/1v3Ovy3KRJNQbHdOlXCvOO03/+pm1P/v3v37n90hhtYw9HPtf8Xb2v937cmHswHeWPRxYj/LvkK3igGKARwicTO07118H3V/5kbi/4vPZMJtK3s/6YH2f+Pfq1B8VbjWrdnMu5s4nAD9CNFhKwz5DTUvLl419zKvAcLtG1P84BRl/b/5M/6/6f/NPzf/qzo84yj0Uus0xUU4Zor54bm9+4OfZG02OCuoAMTb9ZkC9ull1Nvrr2Z+XvRpaRfc65H/68F+jl9svEhzyLFWoccWVc+eyTHq/twydjlKRln7jX9bNMkMJnbhoFRL1xCqmKx6/yi2fYXa/c5/e846PV/5fW0/7OPx/yfcjzop34ulxdGGvDuU8mMXaX507lBuiN6ueadmQeT/p/93vf/1O+G//sP5fw/eL3o/5JLif8zVxs+Tlir9S26UyeFQQvJGBE7FvaFZ9LfN+1y+WjbItSb3GmXvXd15v8zroH/HxgE/D+aGPx/18vi/z07PeZNPRKxe/Kh0Ae8toxscCO4zBkYXArk9C1SxJUYjBkYPPIVtbbuTftz3cz//2O9wP/75iSAXdO72/dt2HL5F6YlfBW4MiJYXMiBiW3t7azHBx+V/t89N+H/8a+1//e9K/9attDp5LQjYX8SuvVL8RoAkmxa65299Erq1FnHo0qrl7t4BddriIs4MrM3rfWcFd+pGwVSAwBZ0bKP8yrZPAAAAABJRU5ErkJggg==') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.pastebin {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAtZJREFUOE+NU91LWmEc7sJtQew/2MUY7INg7CLY3W5GMHazyzEQo9UmfYxZTbAiVlgRqLMSZ+XnDC3z2+Y0+8JGakKZTtR0Tl2wtgtLLQh29cz3ZZ3h3Q68vOc95zzP73l+z+/U1f292O09DRxubxOH23P//1bvtQts3dPnry7LZnXJhcUl5Avf8dHtwY+fv2AyW5DOfIXFakMm+w0G4wISyRRm55TQG0y/Wzv6mikJ52Xf9TmVBoFAAD6fDwqFAqFQCJubmzCbzZiensbp6SmkUikikQi0Wi0kEgm6ewVaStDCfXPDandifn6egoaGhrCzswO1Wg2Hw4HBwUGk02kIBAL4/X4IhUJMTk6ii8dfYggy2RwymQzOz88Rj8dRLpexv7+PSqWCYDCIQqGAra0tJBIJrK2t0XdVAjNDEIl+wfj4OEqlEq2wt7dHrchkMmrBYDCAz+fTIjweD7FYrJbgIJOlgLOzM8jlcip1eXmZ2rFarVAqlRCLxcjlchCJRFRljYJYPAG32418Pg+n04lsNouVlRUcHh7C4/FQIOlHNBqlezgcJgQWxkIgGMbExASVNjY2hvX1dVo9mUzS5wREFLhcLrqTcw2B//M2RkdHodPp4PV6oVKpqH+SCom3v7+fNnF4eJiJusbCJ6+PviSyScakiaR5RIHRaKQpmEwmbAdCeD8zB6vdhebHT8SMhcUlC83bbrdTJRsbG3RwiCVCRNJJpDIoVeNNJJJQzKryV+rrmxiCtyNCCmaz2VhdXQWXy6XDpNfrodFoYLXZUTw+pk222Z3lW3ca26rgSwzBwqIZAwMDlITMAVEwNTVFR5fEJpK8Qyp1AJvDVbrTeLenCmxgfiZ22+urCtWHyu7uLp2wVCpFKx0dHaFYLOLk5KT6Y9kgk89kb95ubK0BX7A8a+1qannRLeW0daj/rU51S3tn9dypfvDw0QiLxbpX/Z7FVK7e/AEj4Wf24/2f5AAAAABJRU5ErkJggg==') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.gist {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAk1JREFUeNqUkzuIE1EUhv955MnsbB6r4kYQLUQQFncV3SnCIqJsoWGDYOGjsIiCtY2Kla1sjLBIsFFcXJC1kaSwENQmXUQSRSUSjCQSTCbkbR4z47lXEgtBNwcu3DNzvvO8R8jlcj7LshKmaWqYQERRTAmCcEru9/sJr9er0QF92BJMAVGr1TQ6CeZAc7lcGAwGkyQAxpTLZU0eDoc8crfbRTgcRjAYRCQSYSmi1WpxY7fbjU6ng1gshmaziXg8zhnGIpVKWbquW9ls1mLZsaMoiqWq6lgnBxY55He/328Vi0XOMFZmqVMD4fF4QBAajcY48khY9JE4HA4enTGMFVkaTHmy+ZzD/5NSqYSNB484w1h55ODO3TVu4FXcWDywl24Cmp0e1WBhyuWELAtIf/qKUrWOONmev3Lpt4NRCXq1gplpBS/v3cDc0nGg9h1o1ZkfwO4Atu1B8cM7HLt8k37V/y5B2b4bJxf2Y+7oEbyJrkMvUjki0YYJ03LidfQxAt4dOHdCw5RdGZcgGobBlQtnV/BDr1GfDai7ZiHZZRi9PoY/e5SCCTUwC9gk1GmMh5YWOcNYkR4Sv1y9uAJbYB82N57h4OnDmN7phjQ0qUkWRJuB+TMaPn/5iFfvv+Ha7eucYey4iWw8q6tRJJNJ3Fp7ClUawEkViBTfkCR0YUNTVHD/4Tpm/P4/U2CeKpUKfD4fJDIMhUKEhP45St50XedZyLQY6Xw+v8AUemVb2oNqtYpCocCWKi2TLLfb7ReZTGZ+kmUi7i2VvfxLgAEAZChMriPcl+IAAAAASUVORK5CYII=') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.image {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAs5JREFUOE+lk/tvi1EYx98/xT8gW4REIpGFMEQWl2FiM9ZMZhm2xRAyOsmujFFmdFRHu0tWm87UypxStr69zPauN5e5rHVp3IYhbOvHy+wHEQlxkm+ek+d8nm9OznkeSfrfldmgJC7QyUlTymsJTfuTZ25z4HdWYwyLreYhtpgekGPw0+kKvo1Eo+IXRSIiEhkWZuc9tqnsJD9EqTUopCxjSGTpB0iueczSo1HyW8cpsExQ1DbxI2pt45j9cXpexul4FEd79RnZphAa/SD7WvuFtO6UItbU9LC+YQxNI2w0wwYT5LRAdhOU3oBTIXC9gXP3oUSGgz2vST3gYHejR0jptT1C332f8yrUEYHrz8CgxDnpm6DKCUfc0KnmXa/AEVPPwnDcD0cvetA2uYRk67Ive/lpjO7YBO1PPuF8Df3vwf4cbNE4tqdw7YVq8HYyHx6FvhE1hkMEg8HDUqvFkjT4aIjMqkqyqkswDSrcfBfH+Q561YLAZ/B+BLda6FXlU/cPv0AoEPhuoP1h4Av7Wbh9E/Py15NWWUjeSR3nZDfeN+N0DY9hG/7K1eGP3P0S5/EYRFUF/IOTBrUXHPm9fT6mr1xEwupkZqxbzLyiDJYUZ5NSnkdqdSHpxyrYdFpPgdmAsdfJwPMI/Yr65bf7tZLGGBQ7DNdJWFtIYvoOZmbuZE7OXpIKKli86zAr9p9gTVktWTVnKTI2U95uRWe3U2IJUDbVB5p6hVm5x5m9Vc/cnedZUNzC8lILaQesZBy6hEZ3maKzgvJWFzVWD9XtXvVGQbSWASFtMATVRlJIKbOTWtlJXaeXepuPM1f6MNp9GLt8mLvvYLmp0OhQ2Fwvk6m7xaqDTvY0eYWUVtcnllXfYlGpnfklVuraHHg8HjxuN+6fktUHlWWZPaZeUo/ILK0UKttBcbNbSB9GP0yLxWJJUxoZGUn80zD9C/vXQ/4NHY10h3M1zmQAAAAASUVORK5CYII=') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.InstallGentoo {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAklJREFUOE9jYEAAASBTCorZkcSRmTjVCDLziCwG4hfM3EIvGNm44oC6WNEM4WXi5FsEkmfhFX3BxMmfAJSHW9Qr55Px3aZp3X/btq3/hQydPzKysMcCFbBBDeFj4uBdqBJR/gskb1W34j+PmulLoJwbzBJJoMm7dNO7/ntMP/XfpW/v//SKvk+7tl7fvXfTpx5pCdWVSiHFv1wnHQbLi9sE/Wdk5SwBauaCGQB3gUPb5v+7Lr/8/+fvr/9fv/z+f+Pyr/9bV735l9Wy/79Dx/b/Nk0bsLoAHgbeAVHv/v77/f8f0IB7N7+cu3DuecK54z9+7lzz639e9pK/7HwSWMMA5BJwCJeXtOm/fvVj1fcfv369f//92cN7X6ZcPvf9x6Htv//vXP3r/+T245UEYgpskPTNq08LgN749/PH7/93rv/6f/rw7//nj//4f+bU0zQcUQwWBkdVbGz62y+fv3wHeeXrlz//H9798//qpY//M3KqfzGxc8djiWKwZnBUuWQ2/fr46fv/P39+///x/ff/d69//z97+s7fyMb5/+y7d2GLYriDZikFF/1qXXXj/4Pbv/8/f/jn/5MH316/eP6jVlBAaIt6VO1/jxmn/zv27P7Pp2HxEajLD90ra9Sj6/979O37X73w0n+vqOL/0lJyMVBFq0EGgDSD0oKAlu1/oHg4ugGzVCKqfouYuL1Xj676Iajr8AnJFricGqYc3Bw+Zi6BVUxsXLHAdL6QiYMPFNrwpIxHDsUhgtAMAopKDjQn4pPDF7P45QC4hSmc1eX8WgAAAABJRU5ErkJggg==') center left no-repeat!important;\npadding-left: 18px;\n}\n\n/* General */\n:root.yotsuba .dialog {\nbackground-color: #F0E0D6;\nborder-color: #D9BFB7;\n}\n:root.yotsuba .field:focus {\nborder-color: #EA8;\n}\n\n/* Header */\n:root.yotsuba #header-bar, :root.yotsuba #notifications {\nfont-size: 9pt;\ncolor: #B86;\n}\n:root.yotsuba #header-bar a, :root.yotsuba #notifications a {\ncolor: #800000;\n}\n\n/* Settings */\n:root.yotsuba #fourchanx-settings fieldset {\nborder-color: #D9BFB7;\n}\n\n/* Quote */\n:root.yotsuba .backlink.deadlink {\ncolor: #00E !important;\n}\n:root.yotsuba .inline {\nborder-color: #D9BFB7;\nbackground-color: rgba(255, 255, 255, .14);\n}\n\n/* QR */\n.yotsuba #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #F0E0D6;\nborder-color: #D9BFB7;\n}\n:root.yotsuba .qr-preview {\nbackground-color: rgba(0, 0, 0, .15);\n}\n\n/* Menu */\n:root.yotsuba #menu {\ncolor: #800000;\n}\n:root.yotsuba .entry {\nborder-bottom: 1px solid #D9BFB7;\nfont-size: 10pt;\n}\n:root.yotsuba .focused.entry {\nbackground: rgba(255, 255, 255, .33);\n}\n\n/* Watcher Favicon */\n:root.yotsuba .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n\n/* General */\n:root.yotsuba-b .dialog {\nbackground-color: #D6DAF0;\nborder-color: #B7C5D9;\n}\n:root.yotsuba-b .field:focus {\nborder-color: #98E;\n}\n\n/* Header */\n:root.yotsuba-b #header-bar, :root.yotsuba-b #notifications {\nfont-size: 9pt;\ncolor: #89A;\n}\n:root.yotsuba-b #header-bar a, :root.yotsuba-b #notifications a {\ncolor: #34345C;\n}\n\n/* Settings */\n:root.yotsuba-b #fourchanx-settings fieldset {\nborder-color: #B7C5D9;\n}\n\n/* Quote */\n:root.yotsuba-b .backlink.deadlink {\ncolor: #34345C !important;\n}\n:root.yotsuba-b .inline {\nborder-color: #B7C5D9;\nbackground-color: rgba(255, 255, 255, .14);\n}\n\n/* QR */\n.yotsuba-b #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #D6DAF0;\nborder-color: #B7C5D9;\n}\n:root.yotsuba-b .qr-preview {\nbackground-color: rgba(0, 0, 0, .15);\n}\n\n/* Menu */\n:root.yotsuba-b #menu {\ncolor: #000;\n}\n:root.yotsuba-b .entry {\nborder-bottom: 1px solid #B7C5D9;\nfont-size: 10pt;\n}\n:root.yotsuba-b .focused.entry {\nbackground: rgba(255, 255, 255, .33);\n}\n\n/* Watcher Favicon */\n:root.yotsuba-b .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n\n/* General */\n:root.futaba .dialog {\nbackground-color: #F0E0D6;\nborder-color: #D9BFB7;\n}\n:root.futaba .field:focus {\nborder-color: #EA8;\n}\n\n/* Header */\n:root.futaba #header-bar, :root.futaba #notifications {\nfont-size: 11pt;\ncolor: #B86;\n}\n:root.futaba #header-bar a, :root.futaba #notifications a {\ncolor: #800000;\n}\n\n/* Settings */\n:root.futaba #fourchanx-settings fieldset {\nborder-color: #D9BFB7;\n}\n\n/* Quote */\n:root.futaba .backlink.deadlink {\ncolor: #00E !important;\n}\n:root.futaba .inline {\nborder-color: #D9BFB7;\nbackground-color: rgba(255, 255, 255, .14);\n}\n\n/* QR */\n.futaba #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #F0E0D6;\nborder-color: #D9BFB7;\n}\n:root.futaba .qr-preview {\nbackground-color: rgba(0, 0, 0, .15);\n}\n\n/* Menu */\n:root.futaba #menu {\ncolor: #800000;\n}\n:root.futaba .entry {\nborder-bottom: 1px solid #D9BFB7;\nfont-size: 12pt;\n}\n:root.futaba .focused.entry {\nbackground: rgba(255, 255, 255, .33);\n}\n\n/* Watcher Favicon */\n:root.futaba .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n\n/* General */\n:root.burichan .dialog {\nbackground-color: #D6DAF0;\nborder-color: #B7C5D9;\n}\n:root.burichan .field:focus {\nborder-color: #98E;\n}\n\n/* Header */\n:root.burichan #header-bar, :root.burichan #header-bar #notifications {\nfont-size: 11pt;\ncolor: #89A;\n}\n:root.burichan #header-bar a, :root.burichan #header-bar #notifications a {\ncolor: #34345C;\n}\n\n/* Settings */\n:root.burichan #fourchanx-settings fieldset {\nborder-color: #B7C5D9;\n}\n\n/* Quote */\n:root.burichan .backlink.deadlink {\ncolor: #34345C !important;\n}\n:root.burichan .inline {\nborder-color: #B7C5D9;\nbackground-color: rgba(255, 255, 255, .14);\n}\n\n/* QR */\n.burichan #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #D6DAF0;\nborder-color: #B7C5D9;\n}\n:root.burichan .qr-preview {\nbackground-color: rgba(0, 0, 0, .15);\n}\n\n/* Menu */\n:root.burichan #menu {\ncolor: #000000;\n}\n:root.burichan .entry {\nborder-bottom: 1px solid #B7C5D9;\nfont-size: 12pt;\n}\n:root.burichan .focused.entry {\nbackground: rgba(255, 255, 255, .33);\n}\n\n/* Watcher Favicon */\n:root.burichan .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n\n/* General */\n:root.tomorrow .dialog {\nbackground-color: #282A2E;\nborder-color: #111;\n}\n\n/* Header */\n:root.tomorrow #header-bar, :root.tomorrow #notifications {\nfont-size: 9pt;\ncolor: #C5C8C6;\n}\n:root.tomorrow #header-bar a, :root.tomorrow #notifications a {\ncolor: #81A2BE;\n}\n\n/* Settings */\n:root.tomorrow #fourchanx-settings fieldset {\nborder-color: #111;\n}\n\n/* Quote */\n:root.tomorrow .backlink.deadlink {\ncolor: #81A2BE !important;\n}\n:root.tomorrow .inline {\nborder-color: #111;\nbackground-color: rgba(0, 0, 0, .14);\n}\n\n/* QR */\n.tomorrow #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #282A2E;\nborder-color: #111;\n}\n:root.tomorrow .qr-preview {\nbackground-color: rgba(255, 255, 255, .15);\n}\n:root.tomorrow #qr .field {\nbackground-color: rgb(26, 27, 29);\ncolor: rgb(197,200,198);\nborder-color: rgb(40, 41, 42);\n}\n:root.tomorrow #qr .field:focus {\nborder-color: rgb(129, 162, 190) !important;\nbackground-color: rgb(30,32,36);\n}\n\n/* Menu */\n:root.tomorrow #menu {\ncolor: #C5C8C6;\n}\n:root.tomorrow .entry {\nborder-bottom: 1px solid #111;\nfont-size: 10pt;\n}\n:root.tomorrow .focused.entry {\nbackground: rgba(0, 0, 0, .33);\n}\n\n/* Watcher Favicon */\n:root.tomorrow .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n\n/* General */\n:root.photon .dialog {\nbackground-color: #DDD;\nborder-color: #CCC;\n}\n:root.photon .field:focus {\nborder-color: #EA8;\n}\n\n/* Header */\n:root.photon #header-bar, :root.photon #notifications {\nfont-size: 9pt;\ncolor: #333;\n}\n:root.photon #header-bar a, :root.photon #notifications a {\ncolor: #FF6600;\n}\n\n/* Settings */\n:root.photon #fourchanx-settings fieldset {\nborder-color: #CCC;\n}\n\n/* Quote */\n:root.photon .backlink.deadlink {\ncolor: #F60 !important;\n}\n:root.photon .inline {\nborder-color: #CCC;\nbackground-color: rgba(255, 255, 255, .14);\n}\n\n/* QR */\n.photon #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #DDD;\nborder-color: #CCC;\n}\n:root.photon .qr-preview {\nbackground-color: rgba(0, 0, 0, .15);\n}\n\n/* Menu */\n:root.photon #menu {\ncolor: #333;\n}\n:root.photon .entry {\nborder-bottom: 1px solid #CCC;\nfont-size: 10pt;\n}\n:root.photon .focused.entry {\nbackground: rgba(255, 255, 255, .33);\n}\n\n/* Watcher Favicon */\n:root.photon .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n" + css: "/* General */\n.dialog {\nbox-shadow: 0 1px 2px rgba(0, 0, 0, .15);\nborder: 1px solid;\ndisplay: block;\npadding: 0;\n}\n.captcha-img,\n.field {\nbackground-color: #FFF;\nborder: 1px solid #CCC;\n-moz-box-sizing: border-box;\nbox-sizing: border-box;\ncolor: #333;\nfont: 13px sans-serif;\noutline: none;\ntransition: color .25s, border-color .25s;\ntransition: color .25s, border-color .25s;\n}\n.field::-moz-placeholder,\n.field:hover::-moz-placeholder {\ncolor: #AAA !important;\nfont-size: 13px !important;\nopacity: 1.0 !important;\n}\n.captch-img:hover,\n.field:hover {\nborder-color: #999;\n}\n.field:hover, .field:focus {\ncolor: #000;\n}\n.field[disabled] {\nbackground-color: #F2F2F2;\ncolor: #888;\n}\n.move {\ncursor: move;\noverflow: hidden;\n}\nlabel, .favicon {\ncursor: pointer;\n}\na[href=\"javascript:;\"] {\ntext-decoration: none;\n}\n.warning {\ncolor: red;\n}\n#boardNavDesktop {\ndisplay: none !important;\n}\na {\noutline: none !important;\n}\n\n/* 4chan style fixes */\n.opContainer, .op {\ndisplay: block !important;\noverflow: visible !important;\n}\n[hidden] {\ndisplay: none !important;\n}\n\n/* fixed, z-index */\n#overlay,\n#fourchanx-settings,\n#qp, #ihover,\n#navlinks, .fixed #header-bar,\n:root.float #updater,\n:root.float #thread-stats,\n#qr {\nposition: fixed;\n}\n#fourchanx-settings {\nz-index: 999;\n}\n#overlay {\nz-index: 900;\n}\n#notifications {\nz-index: 70;\n}\n#qp, #ihover {\nz-index: 60;\n}\n#menu {\nz-index: 50;\n}\n#navlinks, #updater, #thread-stats {\nz-index: 40;\n}\n.fixed #header-bar.autohide {\nz-index: 35;\n}\n#qr {\nz-index: 30;\n}\n#thread-watcher {\nz-index: 8;\n}\n:root.fixed-watcher #thread-watcher {\nz-index: 20;\n}\n.fixed #header-bar {\nz-index: 10;\n}\n/* Header */\n.fixed.top body {\npadding-top: 2em;\n}\n.fixed.bottom body {\npadding-bottom: 2em;\n}\n.fixed #header-bar {\nright: 0;\nleft: 0;\npadding: 3px 4px 4px;\n}\n.fixed.top #header-bar {\ntop: 0;\n}\n.fixed.bottom #header-bar {\nbottom: 0;\n}\n#header-bar {\nborder-width: 0;\ntransition: all .1s .05s ease-in-out;\n}\n:root.centered-links #shortcuts {\nwidth: 300px;\ntext-align: right;\n}\n:root.centered-links #header-bar {\ntext-align: center;\n}\n:root.centered-links #custom-board-list {\nposition: relative;\nleft: 150px;\n}\n.fixed.top #header-bar {\nborder-bottom-width: 1px;\n}\n.fixed.bottom #header-bar {\nbox-shadow: 0 -1px 2px rgba(0, 0, 0, .15);\nborder-top-width: 1px;\n}\n.fixed.bottom #header-bar .menu-button i {\nborder-top: none;\nborder-bottom: 6px solid;\n}\n#board-list {\ntext-align: center;\n}\n.fixed #header-bar.autohide:not(:hover) {\nbox-shadow: none;\ntransition: all .8s .6s cubic-bezier(.55, .055, .675, .19);\n}\n.fixed.top #header-bar.autohide:not(:hover) {\nmargin-bottom: -1em;\n-webkit-transform: translateY(-100%);\ntransform: translateY(-100%);\n}\n.fixed.bottom #header-bar.autohide:not(:hover) {\n-webkit-transform: translateY(100%);\ntransform: translateY(100%);\n}\n#scroll-marker {\nleft: 0;\nright: 0;\nheight: 10px;\nposition: absolute;\n}\n:root:not(.autohide) #scroll-marker {\npointer-events: none;\n}\n#header-bar #scroll-marker {\ndisplay: none;\n}\n.fixed #header-bar #scroll-marker {\ndisplay: block;\n}\n.fixed.top #header-bar #scroll-marker {\ntop: 100%;\n}\n.fixed.bottom #header-bar #scroll-marker {\nbottom: 100%;\n}\n#header-bar a:not(.entry):not(.close) {\ntext-decoration: none;\npadding: 1px;\n}\n#header-bar input {\nmargin: 0;\nvertical-align: bottom;\n}\n#shortcuts:empty {\ndisplay: none;\n}\n.brackets-wrap::before {\ncontent: \"\\00a0[\";\n}\n.brackets-wrap::after {\ncontent: \"]\\00a0\";\n}\n.disabled,\n.expand-all-shortcut {\nopacity: .45;\n}\n#shortcuts {\nfloat: right;\n}\n.shortcut {\nmargin-left: 3px;\n}\n#navbotright,\n#navtopright {\ndisplay: none;\n}\n#toggleMsgBtn {\ndisplay: none !important;\n}\n.current {\nfont-weight: bold;\n}\n/* 4chan X link brackets */\n.fourchanx-link::after {\ncontent: \"]\";\n}\n.fourchanx-link::before {\ncontent: \"[\";\n}\n/* Notifications */\n#notifications {\nposition: fixed;\ntop: 0;\nheight: 0;\ntext-align: center;\nright: 0;\nleft: 0;\ntransition: all .8s .6s cubic-bezier(.55, .055, .675, .19);\n}\n.fixed.top #header-bar #notifications {\nposition: absolute;\ntop: 100%;\n}\n.notification {\ncolor: #FFF;\nfont-weight: 700;\ntext-shadow: 0 1px 2px rgba(0, 0, 0, .5);\nbox-shadow: 0 1px 2px rgba(0, 0, 0, .15);\nborder-radius: 2px;\nmargin: 1px auto;\nwidth: 500px;\nmax-width: 100%;\nposition: relative;\ntransition: all .25s ease-in-out;\n}\n.notification.error {\nbackground-color: hsla(0, 100%, 38%, .9);\n}\n.notification.warning {\nbackground-color: hsla(36, 100%, 38%, .9);\n}\n.notification.info {\nbackground-color: hsla(200, 100%, 38%, .9);\n}\n.notification.success {\nbackground-color: hsla(104, 100%, 38%, .9);\n}\n.notification a {\ncolor: white;\n}\n.notification > .close {\npadding: 6px;\ntop: 0;\nright: 5px;\nposition: absolute;\n}\n.message {\n-moz-box-sizing: border-box;\nbox-sizing: border-box;\npadding: 6px 20px;\nmax-height: 200px;\nwidth: 100%;\noverflow: auto;\n}\n\n/* Settings */\n:root.fourchan-x body {\n-moz-box-sizing: border-box;\nbox-sizing: border-box;\n}\n#overlay {\nbackground-color: rgba(0, 0, 0, .5);\ntop: 0;\nleft: 0;\nheight: 100%;\nwidth: 100%;\n}\n#fourchanx-settings {\n-moz-box-sizing: border-box;\nbox-sizing: border-box;\nbox-shadow: 0 0 15px rgba(0, 0, 0, .15);\nheight: 600px;\nmax-height: 100%;\nwidth: 900px;\nmax-width: 100%;\nmargin: auto;\npadding: 3px;\ntop: 50%;\nleft: 50%;\n-moz-transform: translate(-50%, -50%);\n-webkit-transform: translate(-50%, -50%);\ntransform: translate(-50%, -50%);\n}\n#fourchanx-settings > nav {\npadding: 2px 2px 0;\nheight: 15px;\n}\n#fourchanx-settings > nav a {\ntext-decoration: underline;\n}\n#fourchanx-settings > nav a.close {\ntext-decoration: none;\npadding: 2px;\n}\n.section-container {\noverflow: auto;\nposition: absolute;\ntop: 2.1em;\nright: 5px;\nbottom: 5px;\nleft: 5px;\npadding-right: 5px;\n}\n.sections-list {\npadding: 0 3px;\nfloat: left;\n}\n.credits {\nfloat: right;\n}\n.tab-selected {\nfont-weight: 700;\n}\n.section-sauce ul,\n.section-advanced ul {\nlist-style: none;\nmargin: 0;\n}\n.section-sauce ul {\npadding: 8px;\n}\n.section-advanced ul {\npadding: 0px;\n}\n.section-sauce li,\n.section-advanced li {\npadding-left: 4px;\n}\n.section-main label {\ntext-decoration: underline;\n}\n.section-filter ul {\npadding: 0;\n}\n.section-filter li {\nmargin: 10px 40px;\n}\n.section-filter textarea {\nheight: 500px;\n}\n.section-sauce textarea {\nheight: 350px;\n}\n.section-advanced .field[name=\"boardnav\"] {\nwidth: 100%;\n}\n.section-advanced textarea {\nheight: 150px;\n}\n.section-advanced .archive-cell {\nmin-width: 160px;\ntext-align: center;\n}\n.section-advanced #archive-board-select {\nposition: absolute;\n}\n.section-advanced .note {\nfont-size: 0.8em;\nfont-style: italic;\nmargin-left: 10px;\n}\n.section-advanced .note code {\nfont-style: normal;\nfont-size: 11px;\n}\n.section-keybinds .field {\nfont-family: monospace;\n} \n#fourchanx-settings fieldset {\nborder: 1px solid;\nborder-radius: 3px;\n}\n#fourchanx-settings legend {\nfont-weight: 700;\n}\n#fourchanx-settings textarea {\nfont-family: monospace;\nmin-width: 100%;\nmax-width: 100%;\n}\n#fourchanx-settings code {\ncolor: #000;\nbackground-color: #FFF;\npadding: 0 2px;\n}\n.unscroll {\noverflow: hidden;\n}\n\n/* Announcement Hiding */\n:root.hide-announcement #globalMessage {\ndisplay: none;\n}\na.hide-announcement {\nfloat: left;\n}\n\n/* Unread */\n#unread-line {\nmargin: 0;\nborder-color: rgb(255,0,0);\n}\n\n/* Thread Updater */\n#updater {\nbackground: none;\nborder: none;\nbox-shadow: none;\n}\n#updater > .move {\npadding: 5px 3px 0px;\nmargin-bottom: -3px;\n}\n#updater > div:last-child {\ntext-align: center;\n}\n#updater input[type=number] {\nwidth: 4em;\n}\n:root.float #updater {\npadding: 0px 3px;\n}\n.new {\ncolor: limegreen;\n}\n#update-status.new {\nmargin-right: 5px;\n}\n#update-timer {\ncursor: pointer;\n}\n\n/* Thread Watcher */\n#thread-watcher {\nposition: absolute;\n}\n#thread-watcher {\npadding-bottom: 3px;\noverflow: hidden;\nwhite-space: nowrap;\nmin-width: 120px;\nmax-height: 92%;\noverflow-y: auto;\n}\n:root.fixed-watcher #thread-watcher {\nposition: fixed;\n}\n:root:not(.fixed-watcher) #thread-watcher:not(:hover) {\nmax-height: 210px;\noverflow-y: hidden;\n}\n#thread-watcher > .move {\npadding-top: 3px;\n}\n#thread-watcher > div {\nmax-width: 250px;\noverflow: hidden;\npadding-left: 3px;\npadding-right: 3px;\ntext-overflow: ellipsis;\n}\n#thread-watcher a {\ntext-decoration: none;\n}\n#thread-watcher .move>.close {\nposition: absolute;\nright: 0px;\ntop: 0px;\npadding: 0px 4px;\n}\n.watch-thread-link {\npadding-top: 18px;\nwidth: 18px;\nheight: 0px;\ndisplay: inline-block;\nbackground-repeat: no-repeat;\nopacity: 0.2;\nposition: relative;\ntop: 1px;\n}\n.watch-thread-link.watched {\nopacity: 1;\n}\n\n/* Thread Stats */\n#thread-stats {\nbackground: none;\nborder: none;\nbox-shadow: none;\n}\n:root.float #post-count, :root.float #file-count {\npointer-events: none;\n}\n:root.float #thread-stats {\npadding: 0px 3px;\n}\n\n/* Quote */\n.deadlink {\ntext-decoration: none !important;\n}\n.backlink.deadlink:not(.forwardlink),\n.quotelink.deadlink:not(.forwardlink) {\ntext-decoration: underline !important;\n}\n.inlined {\nopacity: .5;\n}\n#qp input, .forwarded {\ndisplay: none;\n}\n.quotelink.forwardlink,\n.backlink.forwardlink {\ntext-decoration: none;\nborder-bottom: 1px dashed;\n}\n.filtered {\ntext-decoration: underline line-through;\n}\n:root.hide-backlinks .backlink.filtered {\ndisplay: none;\n}\n.inline {\nborder: 1px solid;\ndisplay: table;\nmargin: 2px 0;\n}\n.inline .post {\nborder: 0 !important;\nbackground-color: transparent !important;\ndisplay: table !important;\nmargin: 0 !important;\npadding: 1px 2px !important;\n}\n#qp > .opContainer::after {\ncontent: '';\nclear: both;\ndisplay: table;\n}\n#qp .post {\nborder: none;\nmargin: 0;\npadding: 2px 2px 5px;\n}\n#qp img {\nmax-height: 80vh;\nmax-width: 50vw;\n}\n.qphl {\noutline: 2px solid rgba(216, 94, 49, .7);\n}\n:root.highlight-own .yourPost > .reply,\n:root.highlight-you .quotesYou > .reply {\nborder-left: 2px solid rgba(221,0,0,.5);\n}\n/* Quote Threading */\n.threadContainer {\nmargin-left: 20px;\nborder-left: 1px solid rgba(128,128,128,.3);\n}\n.threadOP {\nclear: both;\n} \n\n/* File */\n.fileText:hover .fntrunc,\n.fileText:not(:hover) .fnfull,\n.expanded-image > .post > .file > .fileThumb > img[data-md5],\n:not(.expanded-image) > .post > .file > .fileThumb > .full-image {\ndisplay: none;\n}\n.expanding {\nopacity: .5;\n}\n:root.fit-height .full-image {\nmax-height: 100vh;\n}\n:root.fit-width .full-image {\nmax-width: 100%;\n}\n:root.gecko.fit-width .full-image {\nwidth: 100%;\n}\n#ihover {\n-moz-box-sizing: border-box;\nbox-sizing: border-box;\nmax-height: 100%;\nmax-width: 75%;\npadding-bottom: 16px;\n}\n.fappeTyme .thread > .noFile,\n.fappeTyme .threadContainer > .noFile {\ndisplay: none;\n}\n\n/* Index/Reply Navigation */\n#navlinks {\nfont-size: 16px;\ntop: 25px;\nright: 10px;\n}\n\n/* Filter */\n.opContainer.filter-highlight {\nbox-shadow: inset 5px 0 rgba(255, 0, 0, .5);\n}\n.filter-highlight > .reply {\nbox-shadow: -5px 0 rgba(255, 0, 0, .5);\n}\n\n/* Spoiler text */\n:root.reveal-spoilers s {\ncolor: white !important;\n}\n\n/* Thread & Reply Hiding */\n.hide-thread-button,\n.hide-reply-button {\nfloat: left;\nmargin-right: 2px;\n}\n.stub ~ * {\ndisplay: none !important;\n}\n.stub input {\ndisplay: inline-block;\n}\n\n/* QR */\n:root.hide-original-post-form #postForm,\n:root.hide-original-post-form .postingMode,\n:root.hide-original-post-form #togglePostForm,\n#qr.autohide:not(.has-focus):not(:hover) > form,\n.postingMode ~ #qr select,\n#file-n-submit:not(.has-file) #qr-filerm {\ndisplay: none;\n}\n#qr select,\n#dump-button,\n.remove,\n.captcha-img {\ncursor: pointer;\n}\n#qr {\nz-index: 20;\nposition: fixed;\npadding: 1px;\nborder: 1px solid transparent;\nmin-width: 300px;\nborder-radius: 3px 3px 0 0;\n}\n#qrtab {\nborder-radius: 3px 3px 0 0;\n}\n#qrtab {\nmargin-bottom: 1px;\n}\n#qr .close {\nfloat: right;\npadding: 0 3px;\n}\n#qr .warning {\nmin-height: 1.6em;\nvertical-align: middle;\npadding: 0 1px;\nborder-width: 1px;\nborder-style: solid;\n}\n.qr-link-container {\ntext-align: center;\n}\n.persona {\nwidth: 248px;\nmax-width: 100%;\nmin-width: 100%;\n}\n#dump-button {\nwidth: 10%;\nmargin: 0;\nmargin-right: 4px;\nfont: 13px sans-serif;\npadding: 1px 0px 2px;\nopacity: 0.6;\n}\n.persona .field:not(#dump) {\nwidth: 95px;\nmin-width: 33.3%;\nmax-width: 33.3%;\n}\n#qr textarea.field {\nheight: 14.8em;\nmin-height: 9em;\n}\n#qr.has-captcha textarea.field {\nheight: 9em;\n}\ninput.field.tripped:not(:hover):not(:focus) {\ncolor: transparent !important;\ntext-shadow: none !important;\n}\n#qr textarea {\nresize: both;\n}\n.captcha-img {\nmargin: 0px;\ntext-align: center;\nbackground-image: #fff;\nfont-size: 0px;\nmin-height: 59px;\nmin-width: 302px;\n}\n.captcha-input {\nwidth: 100%;\nmargin: 1px 0 0;\n}\n.captcha-input.error:focus {\nborder-color: rgb(255,0,0) !important;\n}\n.field {\n-moz-box-sizing: border-box;\nmargin: 0px;\npadding: 2px 4px 3px;\n}\n#qr textarea {\nmin-width: 100%;\n}\n#qr [type='submit'] {\nwidth: 25%;\nvertical-align: top;\n}\n:root.webkit #qr [type='submit'] {\nheight: 24px;\n}\n/* Fake File Input */\n#qr-filename,\n.has-file #qr-no-file {\ndisplay: none;\n}\n#qr-no-file,\n.has-file #qr-filename {\ndisplay: inline-block;\npadding: 0px 4px;\nmargin-bottom: 2px;\noverflow: hidden;\ntext-overflow: ellipsis;\nmax-width: 88%;\n}\n#qr-no-file {\ncolor: #AAA;\n}\n#qr-filename-container {\n-moz-box-sizing: border-box;\ndisplay: inline-block;\nposition: relative;\nwidth: 100px;\nmin-width: 74.6%;\nmax-width: 74.6%;\nmargin-right: 0.4%;\nmargin-top: 1px;\noverflow: hidden;\npadding: 2px 1px 0;\nheight: 22px;\n}\n#qr-filename-container:hover {\ncursor: text;\n}\n#qr-extras-container {\nposition: absolute;\nright: 0px;\n}\n#qr-filerm {\nmargin-right: 2px;\nz-index: 2;\n}\n#file-n-submit {\nheight: 23px;\n}\n#qr input[type=file] {\nvisibility: hidden;\nposition: absolute;\n}\n/* Thread Select / Spoiler Label */\n#qr select {\nfloat: right;\n}\n#qr.has-spoiler .has-file #qr-spoiler-label {\nwidth: 6.7%;\nmin-width: 6.7%;\nmax-width: 6.7%;\ndisplay: inline-block;\ntext-align: center;\nvertical-align: top;\n}\n#qr.has-spoiler #file-n-submit:not(.has-file) #qr-spoiler-label {\ndisplay: none;\n}\n#qr.has-spoiler .has-file #qr-filename-container {\nmax-width: 67.9%;\nmin-width: 67.9%;\n}\n#qr-spoiler-label input {\nposition: relative;\ntop: 3px;\n}\n/* Dumping UI */\n.dump #dump-list-container {\ndisplay: block;\n}\n#dump-list-container {\ndisplay: none;\nposition: relative;\noverflow-y: hidden;\nmargin-top: 1px;\n}\n#dump-list {\noverflow-x: auto;\noverflow-y: hidden;\nwhite-space: nowrap;\nwidth: 248px;\nmax-width: 100%;\nmin-width: 100%;\n}\n#dump-list:hover {\noverflow-x: auto;\n}\n.qr-preview {\n-moz-box-sizing: border-box;\ncounter-increment: thumbnails;\ncursor: move;\ndisplay: inline-block;\nheight: 90px;\nwidth: 90px;\npadding: 2px;\nopacity: .5;\noverflow: hidden;\nposition: relative;\ntext-shadow: 0 1px 1px #000;\n-moz-transition: opacity .25s ease-in-out;\nvertical-align: top;\nbackground-size: cover;\n}\n.qr-preview:hover,\n.qr-preview:focus {\nopacity: .9;\n}\n.qr-preview::before {\ncontent: counter(thumbnails);\ncolor: #fff;\nposition: absolute;\ntop: 3px;\nright: 3px;\ntext-shadow: 0 0 3px #000, 0 0 8px #000;\n}\n.qr-preview#selected {\nopacity: 1;\n}\n.qr-preview.drag {\nbox-shadow: 0 0 10px rgba(0,0,0,.5);\n}\n.qr-preview.over {\nborder-color: #fff;\n}\n.qr-preview > span {\ncolor: #fff;\n}\n.remove {\nbackground: none;\ncolor: #e00;\nfont-weight: 700;\npadding: 3px;\n}\na:only-of-type > .remove {\ndisplay: none;\n}\n.remove:hover::after {\ncontent: \" Remove\";\n}\n.qr-preview > label {\nbackground: rgba(0,0,0,.5);\ncolor: #fff;\nright: 0;\nbottom: 0;\nleft: 0;\nposition: absolute;\ntext-align: center;\n}\n.qr-preview > label > input {\nmargin: 0;\n}\n#add-post {\ncursor: pointer;\nfont-size: 2em;\nposition: absolute;\ntop: 50%;\nright: 10px;\n-moz-transform: translateY(-50%);\n}\n.textarea {\nposition: relative;\n}\n:root.webkit .textarea {\nmargin-bottom: -2px;\n}\n#char-count {\ncolor: #000;\nbackground: hsla(0, 0%, 100%, .5);\nfont-size: 8pt;\nposition: absolute;\nbottom: 1px;\nright: 1px;\npointer-events: none;\n}\n\n/* Menu */\n.menu-button {\ndisplay: inline-block;\nposition: relative;\ncursor: pointer;\n}\n.menu-button i {\nborder-top: 6px solid;\nborder-right: 4px solid transparent;\nborder-left: 4px solid transparent;\ndisplay: inline-block;\nmargin: 2px;\nvertical-align: middle;\n}\n#menu {\nposition: fixed;\noutline: none;\n}\n.entry {\nborder-bottom: 1px solid rgba(0,0,0,.25);\ncursor: pointer;\ndisplay: block;\noutline: none;\npadding: 3px 7px;\nposition: relative;\ntext-decoration: none;\nwhite-space: nowrap;\n}\n.left>.entry.has-submenu {\npadding-right: 17px !important;\n}\n.entry:last-child {\nborder-bottom: 0;\n}\n.has-submenu::after {\ncontent: \"\";\nborder-left: .5em solid;\nborder-top: .3em solid transparent;\nborder-bottom: .3em solid transparent;\ndisplay: inline-block;\nmargin: .3em;\nposition: absolute;\nright: 3px;\n}\n.left .has-submenu::after {\nborder-left: 0;\nborder-right: .5em solid;\n}\n.submenu {\ndisplay: none;\nposition: absolute;\nleft: 100%;\ntop: -1px;\n}\n.focused .submenu {\ndisplay: block;\n}\n.imp-exp-result {\nposition: absolute;\ntext-align: center;\nmargin: auto;\nright: 0px;\nleft: 0px;\nwidth: 200px;\n}\n.export, .import {\ncursor: pointer;\ntext-decoration: none !important;\n}\n/* Link Title Favicons */\n.linkify.YouTube {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABIklEQVQoz53LvUrDUBjG8bOoOammSf1IoBSvoCB4JeIqOHgBLt6AIMRBBQelWurQ2kERnMRBsBUcIp5FJSBI5oQsJVkkUHh8W0o5nhaFHvjBgef/Mq+Q46RJBMkI/vE+aOus956tnEswIZe1LV0QyJ5sE2GzgZfVMtRNIdiDpccEssdlB1mW4bvTwdvWJtRdErM7U+8S/FJykCRJX5qm+KpVce8UMNLRLbulz4iSjTAMh6Iowsd5BeNadp3nUF0VlxAEwZBotXC0Usa4ll3meZdA1iguwvf9vpvDA2wvmKgYGtSud8suDB4TyGr2PF49D/vra9jRZ1BVdknMzgwuCGSnZEObwu6sBnVTCHZiaC7BhFx2PKdxUidiAH/4lLo9Mv0DELVs9qsOHXwAAAAASUVORK5CYII=') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.Vimeo {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAASJJREFUOE9jYAAC7ln7/pODQXrBmq333PvPu/YaSRikB6QXbACpmmHqsRoAMll7+20UQ0H8tmuv/pdffPFfZtNNuByGASBFIPDh5x+4IV6HHoDFYGDJgw+YBoBMBUkgA5BtIKduuvvy//svX+FSB+88wTTAc+/t/83bj/0HScLA5BPXwc7lKJ36f+L6XXDxhUfOYxrAPWUnWKFp9UQUm3iWQxSDXAEDSX3zcIcB96wD/x+8eA1XDNKMHAYg20GW4Y0FkCIYAAUqzEBQOIBciRzlWKMxZelOlMCEcVxq+jHSC1YDJPs3YBgA8jey0/F6ARRwsFAHORukmat9NdbUijMpg/wKcrJodDFOzSBXwA3Alh9AToZFI7a8Asu98BxJbnYGAJb5vYLDANzSAAAAAElFTkSuQmCC') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.SoundCloud {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABsklEQVQ4y5WTy2pUQRCGv2rbzDjJeAlIBmOyipGIIJqFEBDElwh4yULGeRFXPoEIBl/AvQ/gC2RnxCAoxijiwks852S6+3dxzslcHJCpTXVX11/Xv0097gLPgVNMJxnQNfX4zsqleWbnpoMf/oa9d988MM9MC/rp+E0a+A0dsVobMNMCOO8B6McRoABJI+A6gJmN3D2A8jgEBCEkSEMBrcrsDAzDWWn3AjgKFaDMmgRqniGFgsaDp1jrLOngDf1XT1D+A1dFc4MKAkkiCVKjjVu7g9+4Rzx4i1u6hjXbuMWr0O5QPNvCu7IaCZwEKQukLGDrm5x8uI0tr6MkiGlkiv7yLfzN+6S5i6QsIMABkEfcxhbWWYMkVAOjxvYAjc3HNHrbKI9VBQBFwF25XQKSBjqIf1YBuAurEMrczgDygD6/x2LCpFLXLUyQ+PoldphhBhYfIX09XU1+Flaukz7uYqs3SHs7cG4BmTsmkBUF9mmXEwa28BNLPaQPLepuNcbGSWQquQC2/Kdcox1FUGkcB0ykck1nA2+wTzMs8stGnP4rbWGw74EuS/GFQWfK7/wF6P4F7fzIAYkdmdEAAAAASUVORK5CYII=') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.audio {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAitJREFUOE9jYCAWKJWwavr0KyXWb/FIbDtUFFyzJx6nVofE2Xo5nXsj0rqPNSR0nVkR2Hjmgmfd+U9Otdf+m5Vf/6+SfeU/R9ChVVgNYDRtlfJuuPA/rPfe/4QpD/6nznj0P27Kw/9unff/69Xf+69c/+C/SO7N/0z+OAxgMmmRCe++/r9i3ev/KWvf/vdY8PK/bt/9/wrNV3/IN5y/IVt1YqNg4pGTTP4HsbuA2bhZ2qvpyn+xjIObxAp3VwqlrgngLFyryVy5nhPmZJHANS2cwYexG8BmVC/pWn3hP4NZlzWuQDJI3dIiFnUUuwEsQAOcq87jNcC7fHeLUtJxHF4AGmBWeAavAWH1+1rUUk7giAWjOknllON4DXAs2NEiG4/DBQxAF/CFHfrPYI4jDFSLuJVjNrUJhB/B7gIGo1pJRt99GAZYJK7wLJ1z7Xzl4vu/7aqv/GRBj0bjqAX2qb0nJ7mXH17C4HcUxQA+hymWtSue/C5a9up/9Ozn/7Vr7v1nRY7GqMb91T3b3v6vWvPmf/S0p/9ZQk+DDLCBRSOz06Jqk+o7/21nvfqvsebDf7kZL/5zBaxphkezd+OFn7HzXvz3Wvjmv9a8N//5Ek//ZTBpVYUrMG2X5wjcdl68+uI/wa5Lr3hSNjczGFeywOVZ/bbcVGp//F9izfv/Ql03f3P4LC/HSEQquYwMFnUCDJ7dzBhyjGZNQpye89M5gpfnMvtNUyE2h4PUAQBovvT7lyNljwAAAABJRU5ErkJggg==') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.LiveLeak {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAydJREFUOE9Nk1tIk2EYx79NyUNqTk0o6KYrnZeChodLDxfeZpCbJk4RXU5Nm7tYRYhiYXbQlaeGutyW2gxtpB1RIyKDEjKwA6Ti2dR5KNDn+fq/S6TBj/f93r3P732e53s/qfnkSdej4GB2SBLbwf+jmB+gUMgOheLg/z7EdCUnO6Ref392SpK8Hyh3I+gBwBo7lUp2xcbyQEoKD6alyQOpqd754/h4FjJXZCRJTl9ftmEzoK5/wdQJxPgkLY2WV1dpc2uLtnZ2eHNnhza3t2nd46GhjAzuValY6jx0iIfS03msoIDuQ9COQCtoUSjohU5HuwgaN5loeXycd3d3aW9vzwvW2K5SkdTi58fvzGb+3tdHFggA3QONEAzn59PvjQ1yqNX0zenkvX0B4ffWaGRraChJd/385JGqKvlzTw/fRqOaIGkEd1DjU52O/3g83BkTw5MOh7yJuUCUM2o0yi2hoSw1IIOhykr+YLNRHYKu4XQvyKA/N5c8yMCCDD7Z7bz26xcJ1rH2rKKCG0UJdRAMlJbyG6uVrkJQjWAB5tSbk0Nr2HwDgvcQiIYur6zQyvo6ucvLueHIEZKuQPBQr+dXra1kRuqXEOwFArtWSytra1QdFUVjNhvPLS3R3OIiLUDUD0F1WBhJJtwDW2Ehu5uaqBICI4IFlRB0QLCEzaboaHrd0cHzCBYsIIuesjK+LAQXkEFrXh676uupGCWcR6AeghLQptGQONUAwfOuLp6Zn6eZuTmaXVig7pISrhI90ENgQbdHhoep32JhFzLpu3WLio8epUYIfs7OUjF6UKJW88XERLqYkEBNej11oG8XhCAvMFAuOn5cNiclsTkhQTbhmpri4lgbEMANWi1DwC/xit3t7bK7rY0Fo4OD3G4wyEURESzloAdnceezlErK8vH5N4KzPj50PTOTfkxP0+THj/RlYoInJyZI8HVqim5qNFwQHk7SucBAPo2PKRMNPLM/4pnFszYkhJsNBu6uqWFHba1sr61lQSveQFZQkFx07BhJmhMnrLn4NLMPH/aSExR0QDbmWhwgyEapwDvXoDxdWBiXnjrV/Bdm2kYUxLwmEgAAAABJRU5ErkJggg==') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.Vocaroo {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAw9JREFUOE9jYMABuMwYmCyTJKUCGlSnFSy02TTzeOyCiQcDViX26qVz2TAyYtWmEMwuoZ3M7V40LcB79pHkc0svpvzY8jD//87nxf+3Pyn8v/ZO8v+VNyP/2mZJumI1QCWSI8232Hjumitlfw5+qPp/9l8TCt76JP//xkdx/wsXWCzjtWFkwTCkbWFe9plPk/+ga4Txz/xt/D/hkN//gMXif21a+NbyWjIwoRiy6GDT5rP/mlFsPfyp5n/NpOj/22+0gMUXXIz/H7hC/L/bFKFbPDZMrHAD5H35OPt2J9zacDv/f3V7xv9FhwrBGubsT/1//Pjx/1GJ/mD+/nfl/1v3Ovy3KRJNQbHdOlXCvOO03/+pm1P/v3v37n90hhtYw9HPtf8Xb2v937cmHswHeWPRxYj/LvkK3igGKARwicTO07118H3V/5kbi/4vPZMJtK3s/6YH2f+Pfq1B8VbjWrdnMu5s4nAD9CNFhKwz5DTUvLl419zKvAcLtG1P84BRl/b/5M/6/6f/NPzf/qzo84yj0Uus0xUU4Zor54bm9+4OfZG02OCuoAMTb9ZkC9ull1Nvrr2Z+XvRpaRfc65H/68F+jl9svEhzyLFWoccWVc+eyTHq/twydjlKRln7jX9bNMkMJnbhoFRL1xCqmKx6/yi2fYXa/c5/e846PV/5fW0/7OPx/yfcjzop34ulxdGGvDuU8mMXaX507lBuiN6ueadmQeT/p/93vf/1O+G//sP5fw/eL3o/5JLif8zVxs+Tlir9S26UyeFQQvJGBE7FvaFZ9LfN+1y+WjbItSb3GmXvXd15v8zroH/HxgE/D+aGPx/18vi/z07PeZNPRKxe/Kh0Ae8toxscCO4zBkYXArk9C1SxJUYjBkYPPIVtbbuTftz3cz//2O9wP/75iSAXdO72/dt2HL5F6YlfBW4MiJYXMiBiW3t7azHBx+V/t89N+H/8a+1//e9K/9attDp5LQjYX8SuvVL8RoAkmxa65299Erq1FnHo0qrl7t4BddriIs4MrM3rfWcFd+pGwVSAwBZ0bKP8yrZPAAAAABJRU5ErkJggg==') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.pastebin {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAtZJREFUOE+NU91LWmEc7sJtQew/2MUY7INg7CLY3W5GMHazyzEQo9UmfYxZTbAiVlgRqLMSZ+XnDC3z2+Y0+8JGakKZTtR0Tl2wtgtLLQh29cz3ZZ3h3Q68vOc95zzP73l+z+/U1f292O09DRxubxOH23P//1bvtQts3dPnry7LZnXJhcUl5Avf8dHtwY+fv2AyW5DOfIXFakMm+w0G4wISyRRm55TQG0y/Wzv6mikJ52Xf9TmVBoFAAD6fDwqFAqFQCJubmzCbzZiensbp6SmkUikikQi0Wi0kEgm6ewVaStDCfXPDandifn6egoaGhrCzswO1Wg2Hw4HBwUGk02kIBAL4/X4IhUJMTk6ii8dfYggy2RwymQzOz88Rj8dRLpexv7+PSqWCYDCIQqGAra0tJBIJrK2t0XdVAjNDEIl+wfj4OEqlEq2wt7dHrchkMmrBYDCAz+fTIjweD7FYrJbgIJOlgLOzM8jlcip1eXmZ2rFarVAqlRCLxcjlchCJRFRljYJYPAG32418Pg+n04lsNouVlRUcHh7C4/FQIOlHNBqlezgcJgQWxkIgGMbExASVNjY2hvX1dVo9mUzS5wREFLhcLrqTcw2B//M2RkdHodPp4PV6oVKpqH+SCom3v7+fNnF4eJiJusbCJ6+PviSyScakiaR5RIHRaKQpmEwmbAdCeD8zB6vdhebHT8SMhcUlC83bbrdTJRsbG3RwiCVCRNJJpDIoVeNNJJJQzKryV+rrmxiCtyNCCmaz2VhdXQWXy6XDpNfrodFoYLXZUTw+pk222Z3lW3ca26rgSwzBwqIZAwMDlITMAVEwNTVFR5fEJpK8Qyp1AJvDVbrTeLenCmxgfiZ22+urCtWHyu7uLp2wVCpFKx0dHaFYLOLk5KT6Y9kgk89kb95ubK0BX7A8a+1qannRLeW0daj/rU51S3tn9dypfvDw0QiLxbpX/Z7FVK7e/AEj4Wf24/2f5AAAAABJRU5ErkJggg==') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.gist {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAk1JREFUeNqUkzuIE1EUhv955MnsbB6r4kYQLUQQFncV3SnCIqJsoWGDYOGjsIiCtY2Kla1sjLBIsFFcXJC1kaSwENQmXUQSRSUSjCQSTCbkbR4z47lXEgtBNwcu3DNzvvO8R8jlcj7LshKmaWqYQERRTAmCcEru9/sJr9er0QF92BJMAVGr1TQ6CeZAc7lcGAwGkyQAxpTLZU0eDoc8crfbRTgcRjAYRCQSYSmi1WpxY7fbjU6ng1gshmaziXg8zhnGIpVKWbquW9ls1mLZsaMoiqWq6lgnBxY55He/328Vi0XOMFZmqVMD4fF4QBAajcY48khY9JE4HA4enTGMFVkaTHmy+ZzD/5NSqYSNB484w1h55ODO3TVu4FXcWDywl24Cmp0e1WBhyuWELAtIf/qKUrWOONmev3Lpt4NRCXq1gplpBS/v3cDc0nGg9h1o1ZkfwO4Atu1B8cM7HLt8k37V/y5B2b4bJxf2Y+7oEbyJrkMvUjki0YYJ03LidfQxAt4dOHdCw5RdGZcgGobBlQtnV/BDr1GfDai7ZiHZZRi9PoY/e5SCCTUwC9gk1GmMh5YWOcNYkR4Sv1y9uAJbYB82N57h4OnDmN7phjQ0qUkWRJuB+TMaPn/5iFfvv+Ha7eucYey4iWw8q6tRJJNJ3Fp7ClUawEkViBTfkCR0YUNTVHD/4Tpm/P4/U2CeKpUKfD4fJDIMhUKEhP45St50XedZyLQY6Xw+v8AUemVb2oNqtYpCocCWKi2TLLfb7ReZTGZ+kmUi7i2VvfxLgAEAZChMriPcl+IAAAAASUVORK5CYII=') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.image {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAs5JREFUOE+lk/tvi1EYx98/xT8gW4REIpGFMEQWl2FiM9ZMZhm2xRAyOsmujFFmdFRHu0tWm87UypxStr69zPauN5e5rHVp3IYhbOvHy+wHEQlxkm+ek+d8nm9OznkeSfrfldmgJC7QyUlTymsJTfuTZ25z4HdWYwyLreYhtpgekGPw0+kKvo1Eo+IXRSIiEhkWZuc9tqnsJD9EqTUopCxjSGTpB0iueczSo1HyW8cpsExQ1DbxI2pt45j9cXpexul4FEd79RnZphAa/SD7WvuFtO6UItbU9LC+YQxNI2w0wwYT5LRAdhOU3oBTIXC9gXP3oUSGgz2vST3gYHejR0jptT1C332f8yrUEYHrz8CgxDnpm6DKCUfc0KnmXa/AEVPPwnDcD0cvetA2uYRk67Ive/lpjO7YBO1PPuF8Df3vwf4cbNE4tqdw7YVq8HYyHx6FvhE1hkMEg8HDUqvFkjT4aIjMqkqyqkswDSrcfBfH+Q561YLAZ/B+BLda6FXlU/cPv0AoEPhuoP1h4Av7Wbh9E/Py15NWWUjeSR3nZDfeN+N0DY9hG/7K1eGP3P0S5/EYRFUF/IOTBrUXHPm9fT6mr1xEwupkZqxbzLyiDJYUZ5NSnkdqdSHpxyrYdFpPgdmAsdfJwPMI/Yr65bf7tZLGGBQ7DNdJWFtIYvoOZmbuZE7OXpIKKli86zAr9p9gTVktWTVnKTI2U95uRWe3U2IJUDbVB5p6hVm5x5m9Vc/cnedZUNzC8lILaQesZBy6hEZ3maKzgvJWFzVWD9XtXvVGQbSWASFtMATVRlJIKbOTWtlJXaeXepuPM1f6MNp9GLt8mLvvYLmp0OhQ2Fwvk6m7xaqDTvY0eYWUVtcnllXfYlGpnfklVuraHHg8HjxuN+6fktUHlWWZPaZeUo/ILK0UKttBcbNbSB9GP0yLxWJJUxoZGUn80zD9C/vXQ/4NHY10h3M1zmQAAAAASUVORK5CYII=') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.InstallGentoo {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAklJREFUOE9jYEAAASBTCorZkcSRmTjVCDLziCwG4hfM3EIvGNm44oC6WNEM4WXi5FsEkmfhFX3BxMmfAJSHW9Qr55Px3aZp3X/btq3/hQydPzKysMcCFbBBDeFj4uBdqBJR/gskb1W34j+PmulLoJwbzBJJoMm7dNO7/ntMP/XfpW/v//SKvk+7tl7fvXfTpx5pCdWVSiHFv1wnHQbLi9sE/Wdk5SwBauaCGQB3gUPb5v+7Lr/8/+fvr/9fv/z+f+Pyr/9bV735l9Wy/79Dx/b/Nk0bsLoAHgbeAVHv/v77/f8f0IB7N7+cu3DuecK54z9+7lzz639e9pK/7HwSWMMA5BJwCJeXtOm/fvVj1fcfv369f//92cN7X6ZcPvf9x6Htv//vXP3r/+T245UEYgpskPTNq08LgN749/PH7/93rv/6f/rw7//nj//4f+bU0zQcUQwWBkdVbGz62y+fv3wHeeXrlz//H9798//qpY//M3KqfzGxc8djiWKwZnBUuWQ2/fr46fv/P39+///x/ff/d69//z97+s7fyMb5/+y7d2GLYriDZikFF/1qXXXj/4Pbv/8/f/jn/5MH316/eP6jVlBAaIt6VO1/jxmn/zv27P7Pp2HxEajLD90ra9Sj6/979O37X73w0n+vqOL/0lJyMVBFq0EGgDSD0oKAlu1/oHg4ugGzVCKqfouYuL1Xj676Iajr8AnJFricGqYc3Bw+Zi6BVUxsXLHAdL6QiYMPFNrwpIxHDsUhgtAMAopKDjQn4pPDF7P45QC4hSmc1eX8WgAAAABJRU5ErkJggg==') center left no-repeat!important;\npadding-left: 18px;\n}\n\n/* General */\n:root.yotsuba .dialog {\nbackground-color: #F0E0D6;\nborder-color: #D9BFB7;\n}\n:root.yotsuba .field:focus {\nborder-color: #EA8;\n}\n\n/* Header */\n:root.yotsuba #header-bar, :root.yotsuba #notifications {\nfont-size: 9pt;\ncolor: #B86;\n}\n:root.yotsuba #header-bar a, :root.yotsuba #notifications a {\ncolor: #800000;\n}\n\n/* Settings */\n:root.yotsuba #fourchanx-settings fieldset {\nborder-color: #D9BFB7;\n}\n\n/* Quote */\n:root.yotsuba .backlink.deadlink {\ncolor: #00E !important;\n}\n:root.yotsuba .inline {\nborder-color: #D9BFB7;\nbackground-color: rgba(255, 255, 255, .14);\n}\n\n/* QR */\n.yotsuba #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #F0E0D6;\nborder-color: #D9BFB7;\n}\n:root.yotsuba .qr-preview {\nbackground-color: rgba(0, 0, 0, .15);\n}\n\n/* Menu */\n:root.yotsuba #menu {\ncolor: #800000;\n}\n:root.yotsuba .entry {\nborder-bottom: 1px solid #D9BFB7;\nfont-size: 10pt;\n}\n:root.yotsuba .focused.entry {\nbackground: rgba(255, 255, 255, .33);\n}\n\n/* Watcher Favicon */\n:root.yotsuba .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n\n/* General */\n:root.yotsuba-b .dialog {\nbackground-color: #D6DAF0;\nborder-color: #B7C5D9;\n}\n:root.yotsuba-b .field:focus {\nborder-color: #98E;\n}\n\n/* Header */\n:root.yotsuba-b #header-bar, :root.yotsuba-b #notifications {\nfont-size: 9pt;\ncolor: #89A;\n}\n:root.yotsuba-b #header-bar a, :root.yotsuba-b #notifications a {\ncolor: #34345C;\n}\n\n/* Settings */\n:root.yotsuba-b #fourchanx-settings fieldset {\nborder-color: #B7C5D9;\n}\n\n/* Quote */\n:root.yotsuba-b .backlink.deadlink {\ncolor: #34345C !important;\n}\n:root.yotsuba-b .inline {\nborder-color: #B7C5D9;\nbackground-color: rgba(255, 255, 255, .14);\n}\n\n/* QR */\n.yotsuba-b #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #D6DAF0;\nborder-color: #B7C5D9;\n}\n:root.yotsuba-b .qr-preview {\nbackground-color: rgba(0, 0, 0, .15);\n}\n\n/* Menu */\n:root.yotsuba-b #menu {\ncolor: #000;\n}\n:root.yotsuba-b .entry {\nborder-bottom: 1px solid #B7C5D9;\nfont-size: 10pt;\n}\n:root.yotsuba-b .focused.entry {\nbackground: rgba(255, 255, 255, .33);\n}\n\n/* Watcher Favicon */\n:root.yotsuba-b .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n\n/* General */\n:root.futaba .dialog {\nbackground-color: #F0E0D6;\nborder-color: #D9BFB7;\n}\n:root.futaba .field:focus {\nborder-color: #EA8;\n}\n\n/* Header */\n:root.futaba #header-bar, :root.futaba #notifications {\nfont-size: 11pt;\ncolor: #B86;\n}\n:root.futaba #header-bar a, :root.futaba #notifications a {\ncolor: #800000;\n}\n\n/* Settings */\n:root.futaba #fourchanx-settings fieldset {\nborder-color: #D9BFB7;\n}\n\n/* Quote */\n:root.futaba .backlink.deadlink {\ncolor: #00E !important;\n}\n:root.futaba .inline {\nborder-color: #D9BFB7;\nbackground-color: rgba(255, 255, 255, .14);\n}\n\n/* QR */\n.futaba #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #F0E0D6;\nborder-color: #D9BFB7;\n}\n:root.futaba .qr-preview {\nbackground-color: rgba(0, 0, 0, .15);\n}\n\n/* Menu */\n:root.futaba #menu {\ncolor: #800000;\n}\n:root.futaba .entry {\nborder-bottom: 1px solid #D9BFB7;\nfont-size: 12pt;\n}\n:root.futaba .focused.entry {\nbackground: rgba(255, 255, 255, .33);\n}\n\n/* Watcher Favicon */\n:root.futaba .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n\n/* General */\n:root.burichan .dialog {\nbackground-color: #D6DAF0;\nborder-color: #B7C5D9;\n}\n:root.burichan .field:focus {\nborder-color: #98E;\n}\n\n/* Header */\n:root.burichan #header-bar, :root.burichan #header-bar #notifications {\nfont-size: 11pt;\ncolor: #89A;\n}\n:root.burichan #header-bar a, :root.burichan #header-bar #notifications a {\ncolor: #34345C;\n}\n\n/* Settings */\n:root.burichan #fourchanx-settings fieldset {\nborder-color: #B7C5D9;\n}\n\n/* Quote */\n:root.burichan .backlink.deadlink {\ncolor: #34345C !important;\n}\n:root.burichan .inline {\nborder-color: #B7C5D9;\nbackground-color: rgba(255, 255, 255, .14);\n}\n\n/* QR */\n.burichan #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #D6DAF0;\nborder-color: #B7C5D9;\n}\n:root.burichan .qr-preview {\nbackground-color: rgba(0, 0, 0, .15);\n}\n\n/* Menu */\n:root.burichan #menu {\ncolor: #000000;\n}\n:root.burichan .entry {\nborder-bottom: 1px solid #B7C5D9;\nfont-size: 12pt;\n}\n:root.burichan .focused.entry {\nbackground: rgba(255, 255, 255, .33);\n}\n\n/* Watcher Favicon */\n:root.burichan .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n\n/* General */\n:root.tomorrow .dialog {\nbackground-color: #282A2E;\nborder-color: #111;\n}\n\n/* Header */\n:root.tomorrow #header-bar, :root.tomorrow #notifications {\nfont-size: 9pt;\ncolor: #C5C8C6;\n}\n:root.tomorrow #header-bar a, :root.tomorrow #notifications a {\ncolor: #81A2BE;\n}\n\n/* Settings */\n:root.tomorrow #fourchanx-settings fieldset {\nborder-color: #111;\n}\n\n/* Quote */\n:root.tomorrow .backlink.deadlink {\ncolor: #81A2BE !important;\n}\n:root.tomorrow .inline {\nborder-color: #111;\nbackground-color: rgba(0, 0, 0, .14);\n}\n\n/* QR */\n.tomorrow #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #282A2E;\nborder-color: #111;\n}\n:root.tomorrow .qr-preview {\nbackground-color: rgba(255, 255, 255, .15);\n}\n:root.tomorrow #qr .field {\nbackground-color: rgb(26, 27, 29);\ncolor: rgb(197,200,198);\nborder-color: rgb(40, 41, 42);\n}\n:root.tomorrow #qr .field:focus {\nborder-color: rgb(129, 162, 190) !important;\nbackground-color: rgb(30,32,36);\n}\n\n/* Menu */\n:root.tomorrow #menu {\ncolor: #C5C8C6;\n}\n:root.tomorrow .entry {\nborder-bottom: 1px solid #111;\nfont-size: 10pt;\n}\n:root.tomorrow .focused.entry {\nbackground: rgba(0, 0, 0, .33);\n}\n\n/* Watcher Favicon */\n:root.tomorrow .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n\n/* General */\n:root.photon .dialog {\nbackground-color: #DDD;\nborder-color: #CCC;\n}\n:root.photon .field:focus {\nborder-color: #EA8;\n}\n\n/* Header */\n:root.photon #header-bar, :root.photon #notifications {\nfont-size: 9pt;\ncolor: #333;\n}\n:root.photon #header-bar a, :root.photon #notifications a {\ncolor: #FF6600;\n}\n\n/* Settings */\n:root.photon #fourchanx-settings fieldset {\nborder-color: #CCC;\n}\n\n/* Quote */\n:root.photon .backlink.deadlink {\ncolor: #F60 !important;\n}\n:root.photon .inline {\nborder-color: #CCC;\nbackground-color: rgba(255, 255, 255, .14);\n}\n\n/* QR */\n.photon #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #DDD;\nborder-color: #CCC;\n}\n:root.photon .qr-preview {\nbackground-color: rgba(0, 0, 0, .15);\n}\n\n/* Menu */\n:root.photon #menu {\ncolor: #333;\n}\n:root.photon .entry {\nborder-bottom: 1px solid #CCC;\nfont-size: 10pt;\n}\n:root.photon .focused.entry {\nbackground: rgba(255, 255, 255, .33);\n}\n\n/* Watcher Favicon */\n:root.photon .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n" }; Main.init(); diff --git a/builds/appchan-x.user.js b/builds/appchan-x.user.js index ce9a765c5..c06d60c28 100644 --- a/builds/appchan-x.user.js +++ b/builds/appchan-x.user.js @@ -137,7 +137,6 @@ 'Index Navigation': [false, 'Add buttons to navigate between threads.'], 'Reply Navigation': [false, 'Add buttons to navigate to top / bottom of thread.'], 'Show Dice Roll': [true, 'Show dice that were entered into the email field.'], - 'Check for Updates': [true, 'Check for updated versions of appchan x.'], 'Color User IDs': [false, 'Assign unique colors to user IDs on boards that use them'], 'Remove Spoilers': [false, 'Remove all spoilers in text.'], 'Reveal Spoilers': [false, 'Indicate spoilers if Remove Spoilers is enabled, or make the text appear hovered if Remove Spoiler is disabled.'] @@ -188,9 +187,7 @@ 'Thread Stats': [true, 'Display reply and image count.'], 'Page Count in Stats': [false, 'Display the page count in the thread stats as well.'], 'Updater and Stats in Header': [true, 'Places the thread updater and thread stats in the header instead of floating them.'], - 'Thread Watcher': [true, 'Bookmark threads.'], - 'Auto Watch': [true, 'Automatically watch threads you start.'], - 'Auto Watch Reply': [false, 'Automatically watch threads you reply to.'] + 'Thread Watcher': [true, 'Bookmark threads.'] }, 'Posting': { 'Header Shortcut': [true, 'Add a shortcut to the header to toggle the QR.'], @@ -327,6 +324,12 @@ 'Sage Highlight Position': ['after', 'Position of Sage Highlighting', ['before', 'after']] } }, + threadWatcher: { + 'Current Board': [false, 'Only show watched threads from the current board.'], + 'Auto Watch': [true, 'Automatically watch threads you start.'], + 'Auto Watch Reply': [false, 'Automatically watch threads you reply to.'], + 'Auto Prune': [false, 'Automatically prune 404\'d threads.'] + }, filter: { name: "# Filter any namefags:\n#/^(?!Anonymous$)/", uniqueID: "# Filter a specific ID:\n#/Txhvk1Tl/", @@ -2777,26 +2780,32 @@ } }; - $.ajax = function(url, options, extra) { - var form, headers, key, r, sync, type, upCallbacks, val; + $.ajax = (function() { + var lastModified; - if (extra == null) { - extra = {}; - } - type = extra.type, headers = extra.headers, upCallbacks = extra.upCallbacks, form = extra.form, sync = extra.sync; - r = new XMLHttpRequest(); - r.overrideMimeType('text/html'); - type || (type = form && 'post' || 'get'); - r.open(type, url, !sync); - for (key in headers) { - val = headers[key]; - r.setRequestHeader(key, val); - } - $.extend(r, options); - $.extend(r.upload, upCallbacks); - r.send(form); - return r; - }; + lastModified = {}; + return function(url, options, extra) { + var form, r, sync, type, upCallbacks, whenModified; + + if (extra == null) { + extra = {}; + } + type = extra.type, whenModified = extra.whenModified, upCallbacks = extra.upCallbacks, form = extra.form, sync = extra.sync; + r = new XMLHttpRequest(); + type || (type = form && 'post' || 'get'); + r.open(type, url, !sync); + if (whenModified) { + r.setRequestHeader('If-Modified-Since', lastModified[url] || '0'); + $.on(r, 'load', function() { + return lastModified[url] = r.getResponseHeader('Last-Modified'); + }); + } + $.extend(r, options); + $.extend(r.upload, upCallbacks); + r.send(form); + return r; + }; + })(); $.cache = (function() { var reqs; @@ -3564,17 +3573,19 @@ })(Post); - DataBoards = ['hiddenThreads', 'hiddenPosts', 'lastReadPosts', 'yourPosts']; + DataBoards = ['hiddenThreads', 'hiddenPosts', 'lastReadPosts', 'yourPosts', 'watchedThreads']; DataBoard = (function() { - function DataBoard(key, sync) { + function DataBoard(key, sync, dontClean) { var init, _this = this; this.key = key; this.data = Conf[key]; $.sync(key, this.onSync.bind(this)); - this.clean(); + if (!dontClean) { + this.clean(); + } if (!sync) { return; } @@ -3585,6 +3596,10 @@ $.on(d, '4chanXInitFinished', init); } + DataBoard.prototype.save = function() { + return $.set(this.key, this.data); + }; + DataBoard.prototype["delete"] = function(_arg) { var boardID, postID, threadID; @@ -3603,7 +3618,7 @@ } else { delete this.data.boards[boardID]; } - return $.set(this.key, this.data); + return this.save(); }; DataBoard.prototype.deleteIfEmpty = function(_arg) { @@ -3633,7 +3648,7 @@ } else { this.data.boards[boardID] = val; } - return $.set(this.key, this.data); + return this.save(); }; DataBoard.prototype.get = function(_arg) { @@ -3677,7 +3692,7 @@ this.ajaxClean(boardID); } } - return $.set(this.key, this.data); + return this.save(); }; DataBoard.prototype.ajaxClean = function(boardID) { @@ -3707,7 +3722,7 @@ boardID: boardID }); } - return $.set(_this.key, _this.data); + return _this.save(); }); }; @@ -3768,8 +3783,26 @@ Polyfill = { init: function() { + Polyfill.toBlob(); return Polyfill.visibility(); }, + toBlob: function() { + var _base; + + return (_base = HTMLCanvasElement.prototype).toBlob || (_base.toBlob = function(cb) { + var data, i, l, ui8a, _i; + + data = atob(this.toDataURL().slice(22)); + l = data.length; + ui8a = new Uint8Array(l); + for (i = _i = 0; 0 <= l ? _i < l : _i > l; i = 0 <= l ? ++_i : --_i) { + ui8a[i] = data.charCodeAt(i); + } + return cb(new Blob([ui8a], { + type: 'image/png' + })); + }); + }, visibility: function() { if (!('webkitHidden' in document)) { return; @@ -4127,7 +4160,7 @@ date: data.now, dateUTC: data.time, comment: data.com, - capReps: data.capcode_replies, + capcodeReplies: data.capcode_replies, isSticky: !!data.sticky, isClosed: !!data.closed }; @@ -4155,9 +4188,9 @@ @license: https://github.com/4chan/4chan-JS/blob/master/LICENSE */ - var a, array, boardID, capReps, capcode, capcodeClass, capcodeReplies, capcodeStart, capcodeType, closed, comment, container, date, dateUTC, email, emailEnd, emailStart, ext, file, fileDims, fileHTML, fileInfo, fileSize, fileThumb, filename, flag, flagCode, flagName, generateCapcodeReplies, href, imgSrc, isClosed, isOP, isSticky, name, postID, quote, shortFilename, spoilerRange, staticPath, sticky, subject, threadID, tripcode, uniqueID, userID, _i, _len, _ref; + var a, boardID, capcode, capcodeClass, capcodeReplies, capcodeStart, closed, comment, container, date, dateUTC, email, emailEnd, emailStart, ext, file, fileDims, fileHTML, fileInfo, fileSize, fileThumb, filename, flag, flagCode, flagName, href, imgSrc, isClosed, isOP, isSticky, name, postID, quote, shortFilename, spoilerRange, staticPath, sticky, subject, threadID, tripcode, uniqueID, userID, _i, _len, _ref; - postID = o.postID, threadID = o.threadID, boardID = o.boardID, name = o.name, capcode = o.capcode, tripcode = o.tripcode, uniqueID = o.uniqueID, email = o.email, subject = o.subject, flagCode = o.flagCode, flagName = o.flagName, date = o.date, dateUTC = o.dateUTC, isSticky = o.isSticky, isClosed = o.isClosed, comment = o.comment, capReps = o.capReps, file = o.file; + postID = o.postID, threadID = o.threadID, boardID = o.boardID, name = o.name, capcode = o.capcode, tripcode = o.tripcode, uniqueID = o.uniqueID, email = o.email, subject = o.subject, flagCode = o.flagCode, flagName = o.flagName, date = o.date, dateUTC = o.dateUTC, isSticky = o.isSticky, isClosed = o.isClosed, comment = o.comment, capcodeReplies = o.capcodeReplies, file = o.file; isOP = postID === threadID; staticPath = '//static.4chan.org/image/'; if (email) { @@ -4231,32 +4264,10 @@ tripcode = tripcode ? " " + tripcode + "" : ''; sticky = isSticky ? " Sticky" : ''; closed = isClosed ? " Closed" : ''; - capcodeReplies = ''; - if (capReps) { - generateCapcodeReplies = function(capcodeType, array) { - return "" + ((function() { - switch (capcodeType) { - case 'admin': - return 'Administrator'; - case 'mod': - return 'Moderator'; - case 'developer': - return 'Developer'; - } - })()) + " Repl" + (array.length > 1 ? 'ies' : 'y') + ": " + (array.map(function(ID) { - return ">>" + ID + ""; - }).join(' ')) + "
"; - }; - for (capcodeType in capReps) { - array = capReps[capcodeType]; - capcodeReplies += generateCapcodeReplies(capcodeType, array); - } - capcodeReplies = "

" + capcodeReplies + ""; - } container = $.el('div', { id: "pc" + postID, className: "postContainer " + (isOP ? 'op' : 'reply') + "Container", - innerHTML: "" + (isOP ? '' : "
>>
") + "
" + (name || '') + "" + (tripcode + capcodeStart + capcode + userID + flag + sticky + closed) + "
" + subject + "
" + date + "No." + postID + "
" + (isOP ? fileHTML : '') + "
" + subject + "" + emailStart + "" + (name || '') + "" + (tripcode + capcodeStart + emailEnd + capcode + userID + flag + sticky + closed) + "" + " " + "" + date + "" + " " + "No." + postID + "
" + (isOP ? '' : fileHTML) + "
" + (comment || '') + capcodeReplies + "
" + " " + "
" + innerHTML: "" + (isOP ? '' : "
>>
") + "
" + (name || '') + "" + (tripcode + capcodeStart + capcode + userID + flag + sticky + closed) + "
" + subject + "
" + date + "No." + postID + "
" + (isOP ? fileHTML : '') + "
" + subject + "" + emailStart + "" + (name || '') + "" + (tripcode + capcodeStart + emailEnd + capcode + userID + flag + sticky + closed) + "" + " " + "" + date + "" + " " + "No." + postID + "
" + (isOP ? '' : fileHTML) + "
" + (comment || '') + "
" + " " + "
" }); _ref = $$('.quotelink', container); for (_i = 0, _len = _ref.length; _i < _len; _i++) { @@ -4267,7 +4278,47 @@ } quote.href = "/" + boardID + "/res/" + href; } + Build.capcodeReplies({ + boardID: boardID, + threadID: threadID, + root: container, + capcodeReplies: capcodeReplies + }); return container; + }, + capcodeReplies: function(_arg) { + var array, boardID, bq, capcodeReplies, capcodeType, generateCapcodeReplies, html, root, threadID; + + boardID = _arg.boardID, threadID = _arg.threadID, bq = _arg.bq, root = _arg.root, capcodeReplies = _arg.capcodeReplies; + if (!capcodeReplies) { + return; + } + generateCapcodeReplies = function(capcodeType, array) { + return "" + ((function() { + switch (capcodeType) { + case 'admin': + return 'Administrator'; + case 'mod': + return 'Moderator'; + case 'developer': + return 'Developer'; + } + })()) + " Repl" + (array.length > 1 ? 'ies' : 'y') + ": " + (array.map(function(ID) { + return ">>" + ID + ""; + }).join(' ')) + "
"; + }; + html = []; + for (capcodeType in capcodeReplies) { + array = capcodeReplies[capcodeType]; + html.push(generateCapcodeReplies(capcodeType, array)); + } + bq || (bq = $('blockquote', root)); + return $.add(bq, [ + $.el('br'), $.el('br'), $.el('span', { + className: 'capcodeReplies', + innerHTML: html.join('') + }) + ]); } }; @@ -6674,7 +6725,7 @@ if (g.VIEW === 'catalog' || !Conf['Linkify']) { return; } - this.regString = Conf['Allow False Positives'] ? /(\b([-a-z]+:\/\/|[a-z]{3,}\.[-a-z0-9]+\.[a-z]|[-a-z0-9]+\.[a-z]|[\d]+\.[\d]+\.[\d]+\.[\d]+\/|[a-z]{3,}:[a-z0-9?]|[^\s@]+@[a-z0-9.-]+\.[a-z0-9])[^\s'"]+)/gi : /(((magnet|mailto)\:|(www\.)|(news|(ht|f)tp(s?))\:\/\/){1}\S+)/gi; + this.regString = Conf['Allow False Positives'] ? /([-a-z]+:\/\/|[a-z]{3,}\.[-a-z0-9]+\.[a-z]|[-a-z0-9]+\.[a-z]|[\d]+\.[\d]+\.[\d]+\.[\d]+\/|[a-z]{3,}:[a-z0-9?]|[^\s@]+@[a-z0-9.-]+\.[a-z0-9])/i : /(((magnet|mailto)\:|(www\.)|(news|(ht|f)tp(s?))\:\/\/){1})/i; if (Conf['Comment Expansion']) { ExpandComment.callbacks.push(this.node); } @@ -6687,7 +6738,7 @@ }); }, node: function() { - var data, el, i, items, links, node, range, snapshot, _i, _len, _ref; + var data, el, end, endNode, i, index, items, lIndex, length, link, links, node, range, result, saved, snapshot, space, test, text, _i, _len, _ref; if (this.isClone) { if (Conf['Embedding']) { @@ -6702,16 +6753,49 @@ } return; } + test = /[^\s'"]+/g; + space = /[\s'"]/; snapshot = $.X('.//br|.//text()', this.nodes.comment); i = 0; while (node = snapshot.snapshotItem(i++)) { - if (node.parentElement.nodeName === "A") { + links = []; + data = node.data; + if (node.parentElement.nodeName === "A" || !data) { continue; } - links = []; - if (Linkify.regString.test(node.data)) { - Linkify.regString.lastIndex = 0; - Linkify.gatherLinks(snapshot, this, node, links, i); + while (result = test.exec(data)) { + index = result.index; + endNode = node; + if ((length = index + result[0].length) === data.length) { + while ((saved = snapshot.snapshotItem(i++))) { + if (saved.nodeName === 'BR') { + break; + } + endNode = saved; + length = saved.data.length; + if (end = space.exec(saved.data)) { + length = end.index; + i--; + break; + } + } + if (length === endNode.data.length) { + test.lastIndex = 0; + } + range = Linkify.makeRange(node, endNode, index, length); + if (link = Linkify.regString.exec(text = range.toString())) { + if (lIndex = link.index) { + range.setStart(node, lIndex + index); + } + links.push([range, text]); + } + break; + } else { + if (link = Linkify.regString.exec(result[0])) { + range = Linkify.makeRange(node, node, link.index, link.length); + links.push([range, link]); + } + } } _ref = links.reverse(); for (_i = 0, _len = _ref.length; _i < _len; _i++) { @@ -6735,60 +6819,25 @@ } } }, - gatherLinks: function(snapshot, post, node, links, i) { - var data, index, len, len2, link, match, range; + makeRange: function(startNode, endNode, startOffset, endOffset) { + var range; - data = node.data; - len = data.length; - while ((match = Linkify.regString.exec(data))) { - index = match.index; - link = match[0]; - len2 = index + link.length; - if (len === len2) { - break; - } - range = document.createRange(); - range.setStart(node, index); - range.setEnd(node, len2); - links.push(range); - } - Linkify.regString.lastIndex = 0; - if (match) { - links.push(Linkify.seek(snapshot, post, node, links, match, i)); - } - }, - seek: function(snapshot, post, node, links, match, i) { - var data, index, link, next, range, result; - - link = match[0]; range = document.createRange(); - range.setStart(node, match.index); - while ((next = snapshot.snapshotItem(i++)) && next.nodeName !== 'BR') { - node = next; - data = node.data; - if (result = /[\s'"]/.exec(data)) { - index = result.index; - range.setEnd(node, index); - Linkify.regString.lastIndex = index; - Linkify.gatherLinks(snapshot, post, node, links, i); - return range; - } - } - if (range.collapsed) { - range.setEnd(node, node.data.length); - } + range.setStart(startNode, startOffset); + range.setEnd(endNode, endOffset); return range; }, - makeLink: function(range) { - var a, link; + makeLink: function(_arg) { + var a, range, text; - link = range.toString(); - link = link.contains(':') ? link : (link.contains('@') ? 'mailto:' : 'http://') + link; + range = _arg[0], text = _arg[1]; + text; + text = text.contains(':') ? text : (text.contains('@') ? 'mailto:' : 'http://') + text; a = $.el('a', { className: 'linkify', rel: 'nofollow noreferrer', target: '_blank', - href: link + href: text }); $.add(a, range.extractContents()); range.insertNode(a); @@ -7900,7 +7949,7 @@ img = $.el('img'); img.onload = function() { - var applyBlob, cv, data, height, i, l, s, ui8a, width, _i; + var cv, height, s, width; s = 90 * 2; if (_this.file.type === 'image/gif') { @@ -7924,23 +7973,10 @@ cv.width = img.width = width; cv.getContext('2d').drawImage(img, 0, 0, width, height); URL.revokeObjectURL(fileURL); - applyBlob = function(blob) { + return cv.toBlob(function(blob) { _this.URL = URL.createObjectURL(blob); return _this.nodes.el.style.backgroundImage = "url(" + _this.URL + ")"; - }; - if (cv.toBlob) { - cv.toBlob(applyBlob); - return; - } - data = atob(cv.toDataURL().split(',')[1]); - l = data.length; - ui8a = new Uint8Array(l); - for (i = _i = 0; 0 <= l ? _i < l : _i > l; i = 0 <= l ? ++_i : --_i) { - ui8a[i] = data.charCodeAt(i); - } - return applyBlob(new Blob([ui8a], { - type: 'image/png' - })); + }); }; fileURL = URL.createObjectURL(this.file); return img.src = fileURL; @@ -8843,7 +8879,7 @@ }, menu: { init: function() { - var conf, createSubEntry, el, key, subEntries, _ref; + var conf, createSubEntry, el, name, subEntries, _ref; if (g.VIEW === 'catalog' || !Conf['Image Expansion']) { return; @@ -8855,9 +8891,9 @@ createSubEntry = ImageExpand.menu.createSubEntry; subEntries = []; _ref = Config.imageExpansion; - for (key in _ref) { - conf = _ref[key]; - subEntries.push(createSubEntry(key, conf)); + for (name in _ref) { + conf = _ref[name]; + subEntries.push(createSubEntry(name, conf[1])); } return $.event('AddMenuEntry', { type: 'header', @@ -8866,22 +8902,20 @@ subEntries: subEntries }); }, - createSubEntry: function(type, config) { + createSubEntry: function(name, desc) { var input, label; label = $.el('label', { - innerHTML: " " + type + innerHTML: " " + name, + title: desc }); input = label.firstElementChild; - if (type === 'Fit width' || type === 'Fit height') { + if (name === 'Fit width' || name === 'Fit height') { $.on(input, 'change', ImageExpand.cb.setFitness); } - if (config) { - label.title = config[1]; - input.checked = Conf[type]; - $.event('change', null, input); - $.on(input, 'change', $.cb.checked); - } + input.checked = Conf[name]; + $.event('change', null, input); + $.on(input, 'change', $.cb.checked); return { el: label }; @@ -9573,7 +9607,6 @@ this.postCountEl = $('#post-count', sc); this.fileCountEl = $('#file-count', sc); this.pageCountEl = $('#page-count', sc); - this.lastModified = '0'; return Thread.prototype.callbacks.push({ name: 'Thread Stats', cb: this.node @@ -9628,19 +9661,13 @@ return $.ajax("//api.4chan.org/" + ThreadStats.thread.board + "/threads.json", { onload: ThreadStats.onThreadsLoad }, { - headers: { - 'If-Modified-Since': ThreadStats.lastModified - } + whenModified: true }); }, onThreadsLoad: function() { var page, pages, thread, _i, _j, _len, _len1, _ref; - if (!Conf["Page Count in Stats"]) { - return; - } - ThreadStats.lastModified = this.getResponseHeader('Last-Modified'); - if (this.status !== 200) { + if (!(Conf["Page Count in Stats"] && this.status === 200)) { return; } pages = JSON.parse(this.response); @@ -9735,7 +9762,6 @@ ThreadUpdater.root = this.OP.nodes.root.parentNode; ThreadUpdater.lastPost = +ThreadUpdater.root.lastElementChild.id.match(/\d+/)[0]; ThreadUpdater.outdateCount = 0; - ThreadUpdater.lastModified = '0'; ThreadUpdater.cb.interval.call($.el('input', { value: Conf['Interval'] })); @@ -9831,10 +9857,7 @@ case 200: g.DEAD = false; ThreadUpdater.parse(JSON.parse(req.response).posts); - ThreadUpdater.lastModified = req.getResponseHeader('Last-Modified'); - if (Conf['Auto Update']) { - ThreadUpdater.set('timer', ThreadUpdater.getInterval()); - } + ThreadUpdater.set('timer', ThreadUpdater.getInterval()); break; case 404: g.DEAD = true; @@ -9848,16 +9871,8 @@ }); break; default: - if (Conf['Auto Update']) { - ThreadUpdater.outdateCount++; - ThreadUpdater.set('timer', ThreadUpdater.getInterval()); - } - /* - Status Code 304: Not modified - By sending the `If-Modified-Since` header we get a proper status code, and no response. - This saves bandwidth for both the user and the servers and avoid unnecessary computation. - */ - + ThreadUpdater.outdateCount++; + ThreadUpdater.set('timer', ThreadUpdater.getInterval()); _ref = req.status === 304 ? [null, null] : ["" + req.statusText + " (" + req.status + ")", 'warning'], text = _ref[0], klass = _ref[1]; ThreadUpdater.set('status', text, klass); } @@ -9930,9 +9945,7 @@ return ThreadUpdater.req = $.ajax(url, { onloadend: ThreadUpdater.cb.load }, { - headers: { - 'If-Modified-Since': ThreadUpdater.lastModified - } + whenModified: true }); }, updateThreadStatus: function(title, OP) { @@ -10070,15 +10083,46 @@ ThreadWatcher = { init: function() { + var now; + if (!Conf['Thread Watcher']) { return; } - this.dialog = UI.dialog('watcher', 'top: 50px; left: 0px;', '
Thread Watcher
'); + this.db = new DataBoard('watchedThreads', this.refresh, true); + this.dialog = UI.dialog('thread-watcher', 'top: 50px; left: 0px;', "
Thread Watcher
"); + this.status = $('#watcher-status', this.dialog); + this.list = this.dialog.lastElementChild; $.on(d, 'QRPostSuccessful', this.cb.post); - $.sync('WatchedThreads', this.refresh); - $.ready(function() { - ThreadWatcher.refresh(); - return $.add(d.body, ThreadWatcher.dialog); + if (g.VIEW === 'thread') { + $.on(d, 'ThreadUpdate', this.cb.threadUpdate); + } + $.on(d, '4chanXInitFinished', this.ready); + now = Date.now(); + if ((this.db.data.lastChecked || 0) < now - 2 * $.HOUR) { + this.db.data.lastChecked = now; + ThreadWatcher.fetchAllStatus(); + this.db.save(); + } + $.get('WatchedThreads', null, function(_arg) { + var WatchedThreads, boardID, data, threadID, threads, _ref; + + WatchedThreads = _arg.WatchedThreads; + if (!WatchedThreads) { + return; + } + _ref = ThreadWatcher.convert(WatchedThreads); + for (boardID in _ref) { + threads = _ref[boardID]; + for (threadID in threads) { + data = threads[threadID]; + ThreadWatcher.db.set({ + boardID: boardID, + threadID: threadID, + val: data + }); + } + } + return $["delete"]('WatchedThreads'); }); return Thread.prototype.callbacks.push({ name: 'Thread Watcher', @@ -10086,76 +10130,84 @@ }); }, node: function() { - var favicon, - _this = this; + var toggler; - favicon = $.el('a', { - className: 'watch-thread-link', - href: 'javascript:;' + toggler = $.el('img', { + className: 'watcher-toggler' }); - $.on(favicon, 'click', ThreadWatcher.cb.toggle); - $.before($('input', this.OP.nodes.post), favicon); - if (g.VIEW !== 'thread') { + $.on(toggler, 'click', ThreadWatcher.cb.toggle); + return $.before($('input', this.OP.nodes.post), toggler); + }, + ready: function() { + $.off(d, '4chanXInitFinished', ThreadWatcher.ready); + if (!Main.isThisPageLegit()) { return; } - return $.get('AutoWatch', 0, function(item) { - if (item['AutoWatch'] !== _this.ID) { + ThreadWatcher.refresh(); + $.add(d.body, ThreadWatcher.dialog); + if (!Conf['Auto Watch']) { + return; + } + return $.get('AutoWatch', 0, function(_arg) { + var AutoWatch, thread; + + AutoWatch = _arg.AutoWatch; + if (!(thread = g.BOARD.threads[AutoWatch])) { return; } - ThreadWatcher.watch(_this); + ThreadWatcher.add(thread); return $["delete"]('AutoWatch'); }); }, - refresh: function(watched) { - var ID, board, div, favicon, id, link, nodes, props, thread, x, _ref, _ref1; - - if (!watched) { - $.get('WatchedThreads', {}, function(item) { - return ThreadWatcher.refresh(item['WatchedThreads']); - }); - return; - } - nodes = [$('.move', ThreadWatcher.dialog)]; - for (board in watched) { - _ref = watched[board]; - for (id in _ref) { - props = _ref[id]; - x = $.el('a', { - textContent: '✖', - className: 'close', - href: 'javascript:;' - }); - $.on(x, 'click', ThreadWatcher.cb.x); - link = $.el('a', props); - link.title = link.textContent; - div = $.el('div'); - $.add(div, [x, $.tn(' '), link]); - nodes.push(div); - } - } - $.rmAll(ThreadWatcher.dialog); - $.add(ThreadWatcher.dialog, nodes); - watched = watched[g.BOARD] || {}; - _ref1 = g.BOARD.threads; - for (ID in _ref1) { - thread = _ref1[ID]; - favicon = $('.watch-thread-link', thread.OP.nodes.post); - if (ID in watched) { - $.addClass(favicon, 'watched'); - } else { - $.rmClass(favicon, 'watched'); - } - } - }, cb: { + openAll: function() { + var a, _i, _len, _ref; + + if ($.hasClass(this, 'disabled')) { + return; + } + _ref = $$('a[title]', ThreadWatcher.list); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + a = _ref[_i]; + $.open(a.href); + } + return $.event('CloseMenu'); + }, + checkThreads: function() { + if ($.hasClass(this, 'disabled')) { + return; + } + return ThreadWatcher.fetchAllStatus(); + }, + pruneDeads: function() { + var boardID, data, threadID, _i, _len, _ref, _ref1; + + if ($.hasClass(this, 'disabled')) { + return; + } + _ref = ThreadWatcher.getAll(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + _ref1 = _ref[_i], boardID = _ref1.boardID, threadID = _ref1.threadID, data = _ref1.data; + if (!data.isDead) { + continue; + } + delete ThreadWatcher.db.data.boards[boardID][threadID]; + ThreadWatcher.db.deleteIfEmpty({ + boardID: boardID + }); + } + ThreadWatcher.db.save(); + ThreadWatcher.refresh(); + return $.event('CloseMenu'); + }, toggle: function() { return ThreadWatcher.toggle(Get.postFromNode(this).thread); }, - x: function() { - var thread; + rm: function() { + var boardID, threadID, _ref; - thread = this.nextElementSibling.pathname.split('/'); - return ThreadWatcher.unwatch(thread[1], thread[3]); + _ref = this.parentNode.dataset.fullID.split('.'), boardID = _ref[0], threadID = _ref[1]; + return ThreadWatcher.rm(boardID, +threadID); }, post: function(e) { var board, postID, threadID, _ref; @@ -10166,43 +10218,346 @@ return $.set('AutoWatch', threadID); } } else if (Conf['Auto Watch Reply']) { - return ThreadWatcher.watch(board.threads[threadID]); + return ThreadWatcher.add(board.threads[threadID]); } + }, + threadUpdate: function(e) { + var thread; + + thread = e.detail.thread; + if (!(e.detail[404] && ThreadWatcher.db.get({ + boardID: thread.board.ID, + threadID: thread.ID + }))) { + return; + } + return ThreadWatcher.add(thread); + } + }, + fetchCount: { + fetched: 0, + fetching: 0 + }, + fetchAllStatus: function() { + var thread, _i, _len, _ref; + + ThreadWatcher.status.textContent = '...'; + _ref = ThreadWatcher.getAll(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + thread = _ref[_i]; + ThreadWatcher.fetchStatus(thread); + } + }, + fetchStatus: function(_arg) { + var boardID, data, fetchCount, threadID; + + boardID = _arg.boardID, threadID = _arg.threadID, data = _arg.data; + if (data.isDead) { + return; + } + fetchCount = ThreadWatcher.fetchCount; + fetchCount.fetching++; + return $.ajax("//api.4chan.org/" + boardID + "/res/" + threadID + ".json", { + onloadend: function() { + var status; + + fetchCount.fetched++; + if (fetchCount.fetched === fetchCount.fetching) { + fetchCount.fetched = 0; + fetchCount.fetching = 0; + status = ''; + } else { + status = "" + (Math.round(fetchCount.fetched / fetchCount.fetching * 100)) + "%"; + } + ThreadWatcher.status.textContent = status; + if (this.status !== 404) { + return; + } + if (Conf['Auto Prune']) { + ThreadWatcher.rm(boardID, threadID); + } else { + data.isDead = true; + ThreadWatcher.db.set({ + boardID: boardID, + threadID: threadID, + val: data + }); + } + return ThreadWatcher.refresh(); + } + }, { + type: 'head' + }); + }, + getAll: function() { + var all, boardID, data, threadID, threads, _ref; + + all = []; + _ref = ThreadWatcher.db.data.boards; + for (boardID in _ref) { + threads = _ref[boardID]; + if (Conf['Current Board'] && boardID !== g.BOARD.ID) { + continue; + } + for (threadID in threads) { + data = threads[threadID]; + all.push({ + boardID: boardID, + threadID: threadID, + data: data + }); + } + } + return all; + }, + makeLine: function(boardID, threadID, data) { + var div, fullID, href, link, x; + + x = $.el('a', { + textContent: '✖', + href: 'javascript:;' + }); + $.on(x, 'click', ThreadWatcher.cb.rm); + if (data.isDead) { + href = Redirect.to('thread', { + boardID: boardID, + threadID: threadID + }); + } + link = $.el('a', { + href: href || ("/" + boardID + "/res/" + threadID), + textContent: data.excerpt, + title: data.excerpt + }); + div = $.el('div'); + fullID = "" + boardID + "." + threadID; + div.dataset.fullID = fullID; + if (g.VIEW === 'thread' && fullID === ("" + g.BOARD + "." + g.THREADID)) { + $.addClass(div, 'current'); + } + if (data.isDead) { + $.addClass(div, 'dead-thread'); + } + $.add(div, [x, $.tn(' '), link]); + return div; + }, + refresh: function() { + var boardID, data, list, nodes, refresher, thread, threadID, toggler, _i, _j, _len, _len1, _ref, _ref1, _ref2, _ref3; + + nodes = []; + _ref = ThreadWatcher.getAll(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + _ref1 = _ref[_i], boardID = _ref1.boardID, threadID = _ref1.threadID, data = _ref1.data; + nodes.push(ThreadWatcher.makeLine(boardID, threadID, data)); + } + list = ThreadWatcher.list; + $.rmAll(list); + $.add(list, nodes); + _ref2 = g.BOARD.threads; + for (threadID in _ref2) { + thread = _ref2[threadID]; + toggler = $('.watcher-toggler', thread.OP.nodes.post); + toggler.src = ThreadWatcher.db.get({ + boardID: thread.board.ID, + threadID: threadID + }) ? Favicon["default"] : Favicon.empty; + } + _ref3 = ThreadWatcher.menu.refreshers; + for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) { + refresher = _ref3[_j]; + refresher(); } }, toggle: function(thread) { - if (!$.hasClass($('.watch-thread-link', thread.OP.nodes.post), 'watched')) { - return ThreadWatcher.watch(thread); + var boardID, threadID; + + boardID = thread.board.ID; + threadID = thread.ID; + if (ThreadWatcher.db.get({ + boardID: boardID, + threadID: threadID + })) { + return ThreadWatcher.rm(boardID, threadID); } else { - return ThreadWatcher.unwatch(thread.board, thread.ID); + return ThreadWatcher.add(thread); } }, - unwatch: function(board, threadID) { - return $.get('WatchedThreads', {}, function(item) { - var watched; + add: function(thread) { + var boardID, data, threadID; - watched = item['WatchedThreads']; - delete watched[board][threadID]; - if (!Object.keys(watched[board]).length) { - delete watched[board]; + data = {}; + boardID = thread.board.ID; + threadID = thread.ID; + if (thread.isDead) { + if (Conf['Auto Prune'] && ThreadWatcher.db.get({ + boardID: boardID, + threadID: threadID + })) { + ThreadWatcher.rm(boardID, threadID); + return; } - ThreadWatcher.refresh(watched); - return $.set('WatchedThreads', watched); + data.isDead = true; + } + data.excerpt = Get.threadExcerpt(thread); + ThreadWatcher.db.set({ + boardID: boardID, + threadID: threadID, + val: data }); + return ThreadWatcher.refresh(); }, - watch: function(thread) { - return $.get('WatchedThreads', {}, function(item) { - var watched, _name; - - watched = item['WatchedThreads']; - watched[_name = thread.board] || (watched[_name] = {}); - watched[thread.board][thread] = { - href: "/" + thread.board + "/res/" + thread, - textContent: Get.threadExcerpt(thread) - }; - ThreadWatcher.refresh(watched); - return $.set('WatchedThreads', watched); + rm: function(boardID, threadID) { + ThreadWatcher.db["delete"]({ + boardID: boardID, + threadID: threadID }); + return ThreadWatcher.refresh(); + }, + convert: function(oldFormat) { + var boardID, data, newFormat, threadID, threads; + + newFormat = {}; + for (boardID in oldFormat) { + threads = oldFormat[boardID]; + for (threadID in threads) { + data = threads[threadID]; + (newFormat[boardID] || (newFormat[boardID] = {}))[threadID] = { + excerpt: data.textContent + }; + } + } + return newFormat; + }, + menu: { + refreshers: [], + init: function() { + var menu; + + if (!Conf['Thread Watcher']) { + return; + } + menu = new UI.Menu('thread watcher'); + $.on($('.menu-button', ThreadWatcher.dialog), 'click', function(e) { + return menu.toggle(e, this, ThreadWatcher); + }); + this.addHeaderMenuEntry(); + return this.addMenuEntries(); + }, + addHeaderMenuEntry: function() { + var entryEl; + + if (g.VIEW !== 'thread') { + return; + } + entryEl = $.el('a', { + href: 'javascript:;' + }); + $.event('AddMenuEntry', { + type: 'header', + el: entryEl, + order: 60 + }); + $.on(entryEl, 'click', function() { + return ThreadWatcher.toggle(g.threads["" + g.BOARD + "." + g.THREADID]); + }); + return this.refreshers.push(function() { + var addClass, rmClass, text, _ref; + + _ref = $('.current', ThreadWatcher.list) ? ['unwatch-thread', 'watch-thread', 'Unwatch thread'] : ['watch-thread', 'unwatch-thread', 'Watch thread'], addClass = _ref[0], rmClass = _ref[1], text = _ref[2]; + $.addClass(entryEl, addClass); + $.rmClass(entryEl, rmClass); + return entryEl.textContent = text; + }); + }, + addMenuEntries: function() { + var cb, conf, entries, entry, name, refresh, subEntries, _i, _len, _ref, _ref1, _results; + + entries = []; + entries.push({ + cb: ThreadWatcher.cb.openAll, + entry: { + type: 'thread watcher', + el: $.el('a', { + textContent: 'Open all threads' + }) + }, + refresh: function() { + return (ThreadWatcher.list.firstElementChild ? $.rmClass : $.addClass)(this.el, 'disabled'); + } + }); + entries.push({ + cb: ThreadWatcher.cb.checkThreads, + entry: { + type: 'thread watcher', + el: $.el('a', { + textContent: 'Check 404\'d threads' + }) + }, + refresh: function() { + return ($('div:not(.dead-thread)', ThreadWatcher.list) ? $.rmClass : $.addClass)(this.el, 'disabled'); + } + }); + entries.push({ + cb: ThreadWatcher.cb.pruneDeads, + entry: { + type: 'thread watcher', + el: $.el('a', { + textContent: 'Prune 404\'d threads' + }) + }, + refresh: function() { + return ($('.dead-thread', ThreadWatcher.list) ? $.rmClass : $.addClass)(this.el, 'disabled'); + } + }); + subEntries = []; + _ref = Config.threadWatcher; + for (name in _ref) { + conf = _ref[name]; + subEntries.push(this.createSubEntry(name, conf[1])); + } + entries.push({ + entry: { + type: 'thread watcher', + el: $.el('span', { + textContent: 'Settings' + }), + subEntries: subEntries + } + }); + _results = []; + for (_i = 0, _len = entries.length; _i < _len; _i++) { + _ref1 = entries[_i], entry = _ref1.entry, cb = _ref1.cb, refresh = _ref1.refresh; + if (entry.el.nodeName === 'A') { + entry.el.href = 'javascript:;'; + } + if (cb) { + $.on(entry.el, 'click', cb); + } + if (refresh) { + this.refreshers.push(refresh.bind(entry)); + } + _results.push($.event('AddMenuEntry', entry)); + } + return _results; + }, + createSubEntry: function(name, desc) { + var entry, input; + + entry = { + type: 'thread watcher', + el: $.el('label', { + innerHTML: " " + name, + title: desc + }) + }; + input = entry.el.firstElementChild; + input.checked = Conf[name]; + $.on(input, 'change', $.cb.checked); + if (name === 'Current Board') { + $.on(input, 'change', ThreadWatcher.refresh); + } + return entry; + } } }; @@ -10541,8 +10896,8 @@ http: true, https: true, software: 'foolfuuka', - boards: ['adv', 'asp', 'cm', 'i', 'lgbt', 'n', 'o', 'p', 's4s', 't', 'trv'], - files: ['adv', 'asp', 'cm', 'i', 'lgbt', 'n', 'o', 'p', 's4s', 't', 'trv'] + boards: ['adv', 'asp', 'cm', 'd', 'e', 'i', 'lgbt', 'n', 'o', 'p', 'pol', 's', 's4s', 't', 'trv', 'y'], + files: ['cm', 'd', 'e', 'i', 'n', 'o', 'p', 's', 'trv', 'y'] }, 'Foolz Beta': { domain: 'beta.foolz.us', @@ -11799,7 +12154,7 @@ fg = _arg[0]; return "0 0 0 0 " + fg.r + " 0 0 0 0 " + fg.g + " 0 0 0 0 " + fg.b; }, - layout: "/* Cleanup */ #absbot, #boardNavDesktop, #delPassword, #delform > hr:last-of-type, #navbotright, #postForm, #search-label, #search-label-bottom, #styleSwitcher, #togglePostForm, .boardBanner > div, .mobile, .next form, .next span, .postingMode, .prev form, .prev span, .riced, .sideArrows, .stylechanger, body > br, body > div[style^=\"text-align\"], body > hr { display: none; } /* Empties */ #qr .warning:empty, #qr-thread-select:empty { display: none; } /* File Name Trunctuate / /p/ exif */ .exif, .fileText:hover .fntrunc, .fileText:not(:hover) .fnfull { display: none; } /* Unnecessary */ #qp input, #qp .rice, .inline .rice { display: none !important; } /* Hidden Content */ .forwarded, .hidden, .hidden_thread ~ div, .hidden_thread ~ a, .replyContainer .stub ~ div, .replyContainer .stub ~ a, .stub + div, .thread > .stub:first-child ~ .postContainer, .thread > .stub:first-child ~ .summary, [hidden] { display: none !important; } /* Hidden UI */ #catalog, #navlinks, #navtopright, #svg_filters, .cataloglink, .navLinks { z-index: 7; position: fixed; top: 100%; left: 100%; } /* Hide last horizontal rule, keep clear functionality. */ .board > hr:last-of-type { visibility: hidden; } /* Fappe Tyme */ .fappeTyme .thread > .noFile, .fappeTyme .threadContainer > .noFile { display: none; } /* Defaults */ a { text-decoration: none; outline: none; } .underline-links a { text-decoration: underline; } body, html { min-height: 100%; -moz-box-sizing: border-box; } body { outline: none; min-height: 100%; } .sidebar-hide body { margin: 0 2px; } .sidebar-minimal body { margin: 0 20px; } .sidebar-normal body { margin: 0 252px } .sidebar-large body { margin: 0 303px; } .sidebar-location-right body { margin-left: 2px; } .sidebar-location-left body { margin-right: 2px; } body.unscroll { overflow: hidden; } .fourchan-ss-sidebar body::before { content: ''; position: fixed; top: 0; bottom: 0; -moz-box-sizing: border-box; display: block; z-index: 0; } .fourchan-ss-sidebar.sidebar-large body::before { width: 306px; } .fourchan-ss-sidebar.sidebar-normal body::before { width: 255px; } .fourchan-ss-sidebar.sidebar-minimal body::before { width: 23px; } .sidebar-location-right body::before { right: 0; } sidebar-location-left body::before { left: 0; } .fourchan-ss-sidebar.sidebar-location-right body { padding-right: 2px; } .fourchan-ss-sidebar.sidebar-location-left body { padding-left: 2px; } hr { clear: both; border: 0; padding: 0; margin: 0 0 1px; } .hide-horizontal-rules hr { visibility: hidden; } th { text-align: left; } .center { text-align: center; } .disabled { opacity: 0.5; } .pointer { cursor: pointer; } /* Symbols */ .drop-marker { vertical-align: middle; display: inline-block; margin: 2px 2px 3px; border-top: .5em solid; border-right: .3em solid transparent; border-left: .3em solid transparent; } .brackets-wrap::before { content: \" [\"; } .brackets-wrap::after { content: \"] \"; } /* Thread / Reply Nav */ #navlinks a { position: fixed; z-index: 12; opacity: 0.5; display: inline-block; border-right: 6px solid transparent; border-left: 6px solid transparent; margin: 1.5px; } #navlinks a:first-of-type { border-bottom: 11px solid rgb(130,130,130); } #navlinks a:last-of-type { border-top: 11px solid rgb(130,130,130); } /* Header */ #header-bar { z-index: 6; border-width: 1px; padding: 0 2px; border-style: solid; } .pagination-sticky-top .pagelist, .pagination-sticky-bottom .pagelist, #header-bar { left: 2px; right: 2px; } .navigation-alignment-center #header-bar { text-align: center; } .navigation-alignment-right #header-bar { text-align: right; } .sidebar-location-left.sidebar-large:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-left #header-bar { left: 303px; } .sidebar-location-left.sidebar-normal:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-left #header-bar { left: 252px; } .sidebar-location-left.sidebar-minimal:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-left.sidebar-minimal:not(.fourchan-ss-navigation) #header-bar { left: 20px; } .sidebar-location-right.sidebar-large:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-right #header-bar { right: 303px; } .sidebar-location-right.sidebar-normal:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-right #header-bar { right: 252px; } .sidebar-location-right.sidebar-minimal:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-right.sidebar-minimal:not(.fourchan-ss-navigation) #header-bar { right: 20px; } .fourchan-ss-navigation .pagelist, .fourchan-ss-navigation #header-bar { left: 0; right: 0; border-left: 0; border-right: 0; border-radius: 0 !important; } .hide-navigation-decorations #header-bar { font-size: 0; color: transparent; word-spacing: 2px; } #shortcuts { float: right; } .fixed #header-bar.autohide { z-index: 24; } .fixed #header-bar { position: fixed; } .top #header-bar { top: 0; border-top-width: 0; } .rounded-edges.top #header-bar { border-radius: 0 0 3px 3px; } .fixed.bottom #header-bar { bottom: 0; border-bottom-width: 0; } .rounded-edges.bottom #header-bar { border-radius: 3px 3px 0 0; } .hide #header-bar { position: fixed; top: 110%; bottom: auto; } /* Header Autohide */ .fixed #header-bar.autohide:not(:hover) { box-shadow: none; transition: all .8s .6s cubic-bezier(.55, .055, .675, .19); } .fixed.top #header-bar.autohide:not(:hover) { margin-bottom: -1em; transform: translateY(-100%); } .fixed.bottom #header-bar.autohide:not(:hover) { transform: translateY(100%); } #scroll-marker { left: 0; right: 0; height: 10px; position: absolute; } #header-bar #scroll-marker { display: none; } .fixed #header-bar #scroll-marker { display: block; } .fixed.top header-bar #scroll-marker { top: 100%; } .fixed.bottom #header-bar #scroll-marker { bottom: 100%; } /* Notifications */ #notifications { position: fixed; top: 0; text-align: center; right: 0; left: 0; transition: all .8s .6s cubic-bezier(.55, .055, .675, .19); } .fixed.top #header-bar #notifications { position: absolute; top: 100%; } .notification { font-weight: 700; text-shadow: 0 1px 2px rgba(0, 0, 0, .5); box-shadow: 0 1px 2px rgba(0, 0, 0, .15); border-radius: 2px; margin: 1px auto; width: 500px; max-width: 100%; position: relative; transition: all .25s ease-in-out; } .notification.error { background-color: hsla(0, 100%, 38%, .9); } .notification.warning { background-color: hsla(36, 100%, 38%, .9); } .notification.info { background-color: hsla(200, 100%, 38%, .9); } .notification.success { background-color: hsla(104, 100%, 38%, .9); } .notification, .notification a { color: #fff !important; } .notification > .close { top: 0; padding: 2px; right: 4px; position: absolute; color: #fff; } .message { -moz-box-sizing: border-box; padding: 6px 20px; max-height: 200px; width: 100%; overflow: auto; } /* Updater / Thread Stats */ .float #thread-stats, .float #updater { position: fixed; } #update-status.new::after { content: ', '; } /* Pagination */ .pagelist { border-style: solid; border-width: 1px; z-index: 6; } .pagination-alignment-center .pagelist { text-align: center; } .pagination-alignment-right .pagelist { text-align: right; } .pagination-sticky-top .pagelist { position: fixed; top: 0; border-top-width: 0; } .pagination-sticky-bottom .pagelist { position: fixed; bottom: 0; border-bottom-width: 0; } .pagination-top .pagelist { position: static; border-top-width: 0; } .pagination-bottom .pagelist { position: static; } .pagination-top.rounded-edges .pagelist, .pagination-sticky-top.rounded-edges .pagelist { border-radius: 0 0 3px 3px; } .pagination-bottom.rounded-edges .pagelist, .pagination-sticky-bottom.rounded-edges .pagelist { border-radius: 3px 3px 0 0; } .pagination-hide .pagelist { display: none; } .pagination-on-side .pagelist { position: fixed; padding: 0; top: auto; bottom: 0.5em; margin: 0; background: none transparent !important; border: 0 none !important; text-align: right; } .pagination-on-side.post-form-style-fixed.show-post-form-header .pagelist { bottom: 23.1em; } .pagination-on-side.post-form-style-fixed .pagelist { bottom: 21.6em; } .sidebar-location-left.pagination-on-side .pagelist { transform: rotate(-90deg); transform-origin: bottom left; } .sidebar-location-right.pagination-on-side .pagelist { transform: rotate(90deg); transform-origin: bottom right; } .sidebar-location-right.sidebar-large.pagination-on-side .pagelist { left: auto; right: 301px; } .sidebar-location-left.sidebar-large.pagination-on-side .pagelist { right: auto; left: 301px; } .sidebar-location-right.sidebar-normal.pagination-on-side .pagelist { left: auto; right: 246px; } .sidebar-location-left.sidebar-normal.pagination-on-side .pagelist { right: auto; left: 246px; } .sidebar-location-right.sidebar-minimal.pagination-on-side .pagelist { left: auto; right: 246px; } .sidebar-location-left.sidebar-minimal.pagination-on-side .pagelist { right: auto; left: 18px; } .hide-navigation-decorations .pagelist { font-size: 0; color: transparent; word-spacing: 0; } .pagelist input, .pagelist div { vertical-align: middle; } .hide-navigation-decorations .pages a { margin: 0 1px; } .next, .pages, .prev { display: inline-block; margin: 0 3px; } /* Icons */ .icons-4chan-ss #navtopright .exlinksOptionsLink::after, .icons-4chan-ss #main-menu, .icons-4chan-ss .navLinks > a:first-of-type::after, .icons-4chan-ss #watcher::after, .icons-4chan-ss #globalMessage::after, .icons-4chan-ss #boardNavDesktopFoot::after, .icons-4chan-ss #img-controls, .icons-4chan-ss #catalog::after, .icons-4chan-ss #fappeTyme { background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAACWCAMAAAA2YSLzAAAAPFBMVEVkZGRlZWVjY2NmZmZnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dZxmG7AAAAE3RSTlMFFQ0AJD8eQFRqf5CgssDM4+73gHqZRAAAA0pJREFUSMetVlmy5CgMZDMGxK7737Ulgcu8ejMREzHtD7sShJRaKWV/Psq3iz7QGwTF2BZ01hp3N6yasctZJANiN5ZlItDLtNkQDGNeMLU7EqmCbUwhkhZbwsIuNbyWPX7dIyHOrDYOc8SOiEUJjojN0EsWlCXRrq2qvJCsIjic2OcFrwrOpdmTimqVyWG7ZkrWy97p7z/hACd2FUetBcQDpTN+nuKsGng881L5xOz/VQ88xL/eQkyZT3axp+4dUMwvH0Pnhn6wSyR+8IdR4f43/v8XX1BHjXpjwy5RdEcQ7DiuzlBUsFD+GeIFEy6W0pKXoSZOiUz5tf99nvTDD/1sP9VRPvb/un86lT57SVqwSk8KR+L6kgTOlcZslRQe5WmJRKovETW7Anb+HzxUW4Xgnv11fuuj82aKXHz1Tzztx9v4VA9+/6le26B+3VhTC9RMPIr0qx4zaWNsnFRO0s8FWgEIFIRiVUAIlJGciqMmCwpQWyI/OplXA1RrXG1YI2svTQ3ufhWjNlKFqtXFI7Yg+zAXRcBZ+HygJuVHd0ys35bVn6QojLL5cZeVvPht/mVu/r/8s7GMXsLjv2s71GZhgjnEwsEVXogiSl/pl7LWra0IQgO3poTsieoYd4dhWfJlGWqyQf6sLxWt3/MRa4Im04ixeSdAWnxvqCX6tObVmzpZOPOZvrBNJF8gmGciBChsV+YdRYwnAvNpS4AnYFBm0KA2a35Unh+efxjercaLfV7wW0rtUTNl2j715al/9VtfutF+NZ/+aZSa+py/GCpRyvr17EsVLbRhmN++BBY/ik5/+YPK6bKnf2T8fh7P+uEYn0D3E4L3i6QHmvc3+k+8PN6Mb1w52tje6LbAi+M0FT4YneqVbpVDPnL2Xqx7m3tf9ENXHba9H/a/+X3z/+XfCnOo+Zy/o4SgY5Z6iq0nb+9Mc4JxL5f1qYs+xhTP/uiX/cMe4+hDHAfGnmGe+Ev+G88vnG7Ie20wHiUt/S1Kv+6BCM/9fkEfz73/9HNufQ4ZKdzvnwtS/LXltRcJB/yJ23H/mo89nPFa85Li3XOYu435LwTXKVWwO+cnlWFTB47L/AdfR//KI2bvF8sAb0c/M+1+YE3/oS77B8N+UUVHraV6AAAAAElFTkSuQmCC\"); } .icons-oneechan #navtopright .exlinksOptionsLink::after, .icons-oneechan #main-menu, .icons-oneechan .navLinks > a:first-of-type::after, .icons-oneechan #watcher::after, .icons-oneechan #globalMessage::after, .icons-oneechan #boardNavDesktopFoot::after, .icons-oneechan #img-controls, .icons-oneechan #catalog::after, .icons-oneechan #fappeTyme { background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAACWCAMAAAA2YSLzAAAAPFBMVEVoaGhqampeXl5sbGxsbGxra2tsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGzXmsRLAAAAE3RSTlMAEAYnHBg2QExbcYaWqM++2+z4BMdvAwAAAtVJREFUSMfFVgmu3CAMhYRPAmb3/e9aL5Bl2kptVbXWSOSBsY15NmOMMZs1KnNExC+ezgV4MBtNMIw58+qX2REtQwiifdC6hwlNQBGfUlBzc+KYkP3IxH5hNvicCPXrMfEVi3ts2WrzaiN6jie2OI2GXbBfXiA/XPyexPpEHrHdyDV8YAt6vEYCVpJ3S7rXAZKkkfbnuR8Uk/32xsac6Y01La2ZfyIh1VrX9Rnfu5ygd6/XeQAGFxACkopDb3mkeXug48x5FCKhNzW+1j2t8/5EEwHTIfPm6G3aP37o/w/ir3QZ2V/xY0spdSxWL7MrLU7slmnDSY0UrH6CBJ/wFI3TNGECCDY9G4xmrpDkZvQMJ4q31EzLQuhipr7ag8ueFa+hUQy2d43nnPGg7NopHTUVyYlWpE+lUT4qfhDCnLpzB8oXLLJb4leptD/JblswOaZd0gRkDV0cJi69NNOUaclRpG6S1NPdRVPLjI3VSjWV8+FmaARknTxqfipl0tGR1DXvd0h251Ww/ZlaNQoaX3bqUS+IK6ZX4hysvuQinS+6n9638/6BbK4RLi6R11O8rPS4OnO66KHtw6yK96BWrg5QxDGcVzcoB8cYb/dE1zPO6C+pHxN0Ttw/JtJrx55+oV9Jq+ScF22IfBWDD+sHfTnBmKlpS99hPGSC4SBsi+dP3p0PjVBVedMdO3WoG57cAEbYVNkRHFROIzjYuGjoM7LOaEQKbtQjkuo5hCSMmezaNq3Gl6TE5J3ZLMu26SjpPJZo4h/9FJhT4JQJzjFXD7x54fBgzO9RvDH9Vl5vHIetcGHct1apLh/6gU3c2PYy5rrYh7a1NP29/H/G9xn/d+f7FNVcw9/H/9sf8ymXPnqdDd7Wx3OpzWRJuP8+iMTFe7wZq48Tce7QciNetUzku+pT/t4UHK/iIq2yPR/8y/315M/rWl1A/sM83phVh6+aeZY39OLNN4Y0P2GdHOWPAAAAAElFTkSuQmCC\"); } /* Banner & Board Title */ .boardBanner { line-height: 0; } .faded-4chan-banner .boardBanner { opacity: 0.5; transition: opacity 0.3s ease-in-out .5s; } .faded-4chan-banner .boardBanner:hover { opacity: 1; transition: opacity 0.3s ease-in; } /* From 4chan SS / OneeChan */ .fourchan-banner-reflection .boardBanner::after { background-image: -moz-element(#Banner); bottom: -100%; content: ''; left: 0; mask: url(\"data:image/svg+xml, #mask\"); opacity: 0.3; position: absolute; right: 0; top: 100%; -moz-transform: scaleY(-1); z-index: -1; } .fourchan-banner-at-sidebar-top .boardBanner, .fourchan-banner-at-sidebar-bottom .boardBanner, .fourchan-banner-at-sidebar-bottom .boardBanner { position: fixed; } .fourchan-banner-at-sidebar-top .boardBanner { top: 16px; } .fourchan-banner-at-sidebar-bottom .boardBanner { bottom: 270px; } .fourchan-banner-under-post-form .boardBanner { bottom: 130px; } .board-title-at-sidebar-top.sidebar-location-right #boardTitle, .board-title-at-sidebar-bottom.sidebar-location-right #boardTitle, .board-title-under-post-form.sidebar-location-right #boardTitle, .fourchan-banner-at-sidebar-top.sidebar-location-right .boardBanner, .fourchan-banner-at-sidebar-bottom.sidebar-location-right .boardBanner, .fourchan-banner-under-post-form.sidebar-location-right .boardBanner { right: 2px; } .board-title-at-sidebar-top.sidebar-location-left #boardTitle, .board-title-at-sidebar-bottom.sidebar-location-left #boardTitle, .board-title-under-post-form.sidebar-location-left #boardTitle, .fourchan-banner-at-sidebar-top.sidebar-location-left .boardBanner, .fourchan-banner-at-sidebar-bottom.sidebar-location-left .boardBanner, .fourchan-banner-under-post-form.sidebar-location-left .boardBanner { left: 2px; } .board-title-at-sidebar-top #boardTitle, .board-title-at-sidebar-bottom #boardTitle, .board-title-under-post-form #boardTitle, .fourchan-banner-at-sidebar-top .boardBanner img, .fourchan-banner-at-sidebar-bottom .boardBanner img, .fourchan-banner-under-post-form .boardBanner img { width: 248px; } .board-title-at-sidebar-top.sidebar-large #boardTitle, .board-title-at-sidebar-bottom.sidebar-large #boardTitle, .board-title-under-post-form.sidebar-large #boardTitle, .fourchan-banner-at-sidebar-top.sidebar-large .boardBanner img, .fourchan-banner-at-sidebar-bottom.sidebar-large .boardBanner img, .fourchan-banner-under-post-form.sidebar-large .boardBanner img { width: 299px; } .fourchan-banner-at-top .boardBanner { position: relative; display: table; margin: 12px auto; text-align: center; } :root:not(.board-subtitle) .boardSubtitle, .board-title-hide #boardTitle, .fourchan-banner-hide .boardBanner { display: none; } #boardTitle { text-align: center; z-index: 4; } .board-title-at-sidebar-top #boardTitle, .board-title-at-sidebar-bottom #boardTitle, .board-title-under-post-form #boardTitle { position: fixed; } .board-title-at-sidebar-top.fourchan-banner-at-sidebar-top.sidebar-large #boardTitle { top: 121px; } .board-title-at-sidebar-top.fourchan-banner-at-sidebar-top #boardTitle { top: 104px; } .board-title-at-sidebar-top #boardTitle { top: 40px; } .board-title-at-sidebar-bottom #boardTitle { bottom: 280px; } .board-title-under-post-form #boardTitle { bottom: 140px; } /* Hover UI */ .move { cursor: pointer; } #ihover { position: fixed; max-height: 97%; max-width: 75%; z-index: 22; } #qp { position: fixed; z-index: 22; } #qp .postMessage::after { clear: both; display: block; content: \"\"; } #qp .full-image { max-height: 300px; max-width: 500px; } #menu { position: fixed; outline: none; z-index: 22; } /* Image Expansion */ .fit-width .full-image { max-width: 100%; width: 100%; } .fit-height .full-image { max-height: 95vh; } .images-overlap-post-form .full-image { position: relative; z-index: 21; } /* Delete Buttons */ .hide-delete-ui .deleteform, .hide-delete-ui .post:not(#exlinks-options) .rice { display: none; } .hide-delete-ui .postInfo { padding: 0 0 0 3px; } .deleteform { position: fixed; z-index: 18; width: 0; bottom: 0; right: 0; border-width: 1px 0 0 1px; border-style: solid; font-size: 0; color: transparent; } .deleteform:hover { width: auto; } .deleteform::before { z-index: 18; border-width: 1px 0 0 1px; border-style: solid; content: '✖'; display: block; position: fixed; bottom: 0; right: 0; -moz-box-sizing: border-box; height: 1.6em; width: 1.4em; text-align: center; } .deleteform:hover::before { display: none; } .deleteform input { margin: 0 1px 0 0; } /* Slideout Navigation */ #boardNavDesktopFoot { position: fixed; text-align: center; font-size: 0; color: transparent; overflow: hidden; -moz-box-sizing: border-box; width: 248px; } .sidebar-large #boardNavDesktopFoot { width: 299px; } .sidebar-location-right #boardNavDesktopFoot { right: 2px; } .sidebar-location-left #boardNavDesktopFoot { left: 2px; } #boardNavDesktopFoot:hover { overflow-y: auto; padding: 2px; } #boardNavDesktopFoot:not(:hover) { border-color: transparent; background-color: transparent; height: 0; overflow: hidden; padding: 0; border: 0 none; } .slideout-navigation-compact #boardNavDesktopFoot { word-spacing: 1px; } .slideout-navigation-list #boardNavDesktopFoot a { display: block; } .slideout-navigation-list #boardNavDesktopFoot:hover { max-height: 400px; } .slideout-navigation-list #boardNavDesktopFoot a::after { content: ' - ' attr(title); } .slideout-navigation-list #boardNavDesktopFoot a[href*='//boards.4chan.org/']::after, .slideout-navigation-list #boardNavDesktopFoot a[href*='//rs.4chan.org/']::after { content: '/ - ' attr(title); } .slideout-navigation-list #boardNavDesktopFoot a[href*='//boards.4chan.org/']::before, .slideout-navigation-list #boardNavDesktopFoot a[href*='//rs.4chan.org/']::before { content: '/'; } .slideout-navigation-hide #boardNavDesktopFoot { display: none; } /* Watcher */ #watcher { position: fixed; z-index: 14; padding: 2px; } #watcher { width: 200px; } #watcher:not(:hover) { max-height: 200px; overflow: hidden; } .rounded-edges #watcher { border-radius: 3px; } #watcher > div { max-height: 1.3em; overflow: hidden; } .slideout-watcher #watcher { -moz-box-sizing: border-box; width: 248px; } .slideout-watcher.sidebar-large #boardNavDesktopFoot { width: 299px; } .slideout-watcher.sidebar-location-right #watcher { left: auto !important; right: 2px !important; } .slideout-watcher.sidebar-location-left #watcher { right: auto !important; left: 2px !important; } .slideout-watcher #watcher .move { cursor: default; } .slideout-watcher.underline-links #watcher .move { text-decoration: underline; } .slideout-watcher #watcher > div { overflow: hidden; } .slideout-watcher #watcher:hover { overflow-y: auto; } .slideout-watcher #watcher:not(:hover) { height: 0; overflow: hidden; border: 0 none; padding: 0; } .watch-thread-link { padding-top: 18px; width: 18px; height: 0px; display: inline-block; background-repeat: no-repeat; opacity: 0.2; position: relative; top: 1px; } .watch-thread-link.watched { opacity: 1; } /* Announcements */ #globalMessage { text-align: center; } .rounded-edges #globalMessage { border-radius: 3px; } .announcements-slideout #globalMessage { position: fixed; padding: 2px; width: 248px; } .announcements-slideout.sidebar-location-right #globalMessage { left: auto; right: 2px; } .announcements-slideout.sidebar-location-left #globalMessage { right: auto; left: 2px; } .announcements-slideout.sidebar-large #globalMessage { width: 299px; } .announcements-slideout #globalMessage h3 { margin: 0; } .announcements-slideout #globalMessage:hover { -moz-box-sizing: border-box; overflow-y: auto; } .announcements-slideout #globalMessage:not(:hover) { height: 0; overflow: hidden; padding: 0; border: 0 none; } .announcements-hide #globalMessage { display: none !important; } /* Threads */ #threads, .rounded-edges .board > .thread { border-radius: 4px; } /* Thread Clearfix */ .thread > .threadContainer:last-of-type::after, .thread > .postContainer:last-of-type::after { display: block; content: ' '; clear: both; } /* Posts */ .expanding { opacity: .5; } .fileText:hover .fntrunc, .fileText:not(:hover) .fnfull, .expanded-image > .post > .file > .fileThumb > img[data-md5], .post > .file > .fileThumb > .full-image { display: none; } .expanded-image > .post > .file > .fileThumb > .full-image { display: block; } .thread > .replyContainer:last-of-type .post { margin-bottom: 0; } .menu-button { position: relative; } .stub .menu-button, .post .menu-button, .hide-thread-button, .show-thread-button span, .hide-reply-button, .show-reply-button span { float: right; } .post .menu-button, .hide-thread-button, .hide-reply-button { margin: 0 3px; opacity: 0; transition: opacity .3s ease-out 0s; } .post:hover .hide-reply-button, .post:hover .menu-button, .post:hover .hide-thread-button, .hidden_thread .hide-thread-button, .hidden_thread .menu-button, .inline .hide-reply-button, .inline .menu-button { opacity: 1; } .hidden_thread { text-align: right; } .color-user-ids .posteruid .hand { padding: .1em .3em; border-radius: 1em; font-size: 80%; } .postInfo > span { vertical-align: bottom; } .bolds .subject, .bolds .name { font-weight: 600; } .italics .postertrip { font-style: italic; } .underline-links .replylink { text-decoration: underline; } .fileInfo { padding: 0 3px; } .fileThumb { float: left; margin: 3px 20px; outline: none; } .reply.post { -moz-box-sizing: border-box; display: inline-block; } .fit-width-replies .reply.post { display: block; overflow: hidden; } .fit-width-replies .expanded-image .reply.post, .fit-width-replies .hasInline .reply.post { width: 100%; } .indent-replies #unread-line, .indent-replies .thread > .replyContainer, .indent-replies .threadContainer > .replyContainer { margin-left: 2em; } .expanded-image .reply.post, .hasInline .reply.post { display: inline-block; overflow: visible; clear: both; } .rounded-edges .post { border-radius: 3px; } .spoiler, s { text-decoration: none; } /* Emoji */ a.useremail:last-of-type { vertical-align: top; } /* Reply Clearfix */ .reply.post .postMessage { clear: right; } .op-background .op.post .postMessage::after, .force-reply-break .op.post .postMessage::after { display: block; content: ' '; clear: both; } /* OP */ .favicon { vertical-align: bottom; } .op-background .op.post { -moz-box-sizing: border-box; } /* Summary */ .force-reply-break .summary { clear: both; } /* Inlined */ .inline { margin: 2px 8px 2px 2px; } .post .inline { margin: 2px; } .inline .replyContainer { display: inline-block; } /* Inlined Clearfix */ .inline .postMessage::after { clear: both; display: block; content: \"\"; } /* Quotes */ .inlined { opacity: .5; } .underline-links .quotelink { text-decoration: underline; } .filtered, .quotelink.filtered { text-decoration: line-through !important; } .inline + .hashlink { display: none; } /* Quote Threading */ .threadContainer { padding-left: 2em; border-left: 1px solid; } .indent-replies .threadContainer { margin-left: 2em; padding-left: 0; } .threadOP { clear: both; } /* Backlinks */ .underline-links .forwardlink, .underline-links .backlink { text-decoration: underline; } .backlink.dead { text-decoration: none; } .filtered-backlinks .filtered.backlink { display: none; } .backlinks-position-lower-left .container, .backlinks-position-lower-right .container { max-width: 100%; padding: 0 5px; } .backlinks-position-lower-left .reply.quoted, .backlinks-position-lower-right .reply.quoted { position: relative; padding-bottom: 1.7em; } .backlinks-position-lower-left .inline .reply.quoted, .backlinks-position-lower-right .inline .reply.quoted, .backlinks-position-lower-right #qp .reply.quoted, .backlinks-position-lower-left #qp .reply.quoted { position: static; padding-bottom: 0; } .backlinks-position-lower-right .reply .container, .backlinks-position-lower-left .reply .container { position: absolute; bottom: 0; padding: 0 5px; } .backlinks-position-lower-left .reply .container { left: 0; } .backlinks-position-lower-right .reply .container { right: 0; } .backlinks-position-lower-right .container::before, .backlinks-position-lower-left .reply .container::before { content: 'REPLIES: '; } .container:empty { display: none; } .backlinks-position-lower-left #qp .container, .backlinks-position-lower-left .inline .container, .backlinks-position-lower-right .inline .container, .backlinks-position-lower-right #qp .container { position: static; max-width: 100%; } .backlinks-position-lower-left #qp .container::before, .backlinks-position-lower-left .inline .container::before, .backlinks-position-lower-right #qp .container::before, .backlinks-position-lower-right .inline .container::before { content: ''; } .backlinks-position-lower-right .inline .container { float: none; } /* Fixes text spoilers */ .remove-spoilers.indicate-spoilers .spoiler::before, .remove-spoilers.indicate-spoilers s::before { content: '[spoiler]'; } .remove-spoilers.indicate-spoilers .spoiler::after, .remove-spoilers.indicate-spoilers s::after { content: '[/spoiler]'; } :root:not(.remove-spoilers) .spoiler:not(:hover) *, :root:not(.remove-spoilers) s:not(:hover) * { color: rgb(0,0,0) !important; text-shadow: none !important; } :root:not(.remove-spoilers) spoiler:not(:hover), :root:not(.remove-spoilers) s:not(:hover) { background-color: rgb(0,0,0); color: rgb(0,0,0) !important; text-shadow: none !important; } /* Code */ .prettyprint { -moz-box-sizing: border-box; font-family: monospace; display: inline-block; margin: 0 auto .1em 0; vertical-align: middle; white-space: pre-wrap; border-radius: 2px; overflow-x: auto; padding: 3px; max-width: 100%; } /* Menu */ .entry { border-bottom: 1px solid rgba(0,0,0,.25); cursor: pointer; display: block; outline: none; padding: 3px 1em 3px 7px; position: relative; text-decoration: none; white-space: nowrap; } .entry:last-child { border-bottom: 0; } .has-submenu::after { content: \"\"; border-left: .5em solid; border-top: .3em solid transparent; border-bottom: .3em solid transparent; display: inline-block; margin: .3em; position: absolute; right: 0; } .submenu { display: none; position: absolute; top: -1px; } .focused .submenu { display: block; } /* Stubs */ .fit-width-replies .stub { display: block; text-align: right; clear: both; } /* Element Replacing: */ /* Checkboxes */ .rice { cursor: pointer; width: 9px; height: 9px; margin: 2px 3px 3px; display: inline-block; vertical-align: bottom; } input[type=checkbox]:checked + .rice { position: relative; } input[type=checkbox]:checked + .rice::after { content: \"\"; display: block; width: 4px; height: 10px; border-width: 0 3px 3px 0; border-style: solid; transform: rotate(45deg); position: absolute; left: 2px; bottom: -1px; } .rounded-edges .rice { border-radius: 2px;} } .circle-checkboxes .rice { border-radius: 6px;} } input:checked + .rice { background-attachment: scroll; background-repeat: no-repeat; background-position: bottom right; } /* Selects */ .selectrice { position: relative; cursor: default; overflow: hidden; text-align: left; } #settings .selectrice { display: inline-block; } .selectrice::after { content: \"\"; border-right: .25em solid transparent; border-left: .25em solid transparent; position: absolute; right: .4em; top: .5em; } .selectrice::before { content: \"\"; height: 1.6em; position: absolute; right: 1.3em; top: 0; } /* Select Dropdown */ #selectrice { padding: 0; margin: 0; position: fixed; max-height: 120px; overflow-y: auto; overflow-x: hidden; z-index: 32; } #selectrice:empty { display: none; } /* Post Form Shortcut */ .qr-shortcut.on-page { font-size: 250%; } /* Post Form */ #qr { z-index: 20; position: fixed; background: none; border: none; padding: 1px; min-width: 248px; background: transparent; border: 1px solid transparent; } .sidebar-large #qr { min-width: 299px; } .rounded-edges #qr, .rounded-edges #qrtab { border-radius: 3px 3px 0 0; } .post-form-style-fixed #qr { top: auto !important; } .sidebar-location-left:not(.post-form-style-float) #qr { left: 0 !important; right: auto !important; } .sidebar-location-right:not(.post-form-style-float) #qr { right: 0 !important; left: auto !important; } :root:not(.post-form-style-float) #qr { bottom: 0 !important; } .fourchan-ss-navigation.fixed.bottom:not(.post-form-style-float) #qr, .fourchan-ss-navigation.index.pagination-sticky-bottom:not(.post-form-style-float) #qr { bottom: 1.5em !important; } .post-form-style-slideout #qr { top: auto !important; } .post-form-style-slideout.sidebar-location-left #qr { transform: translateX(-93%); } .post-form-style-slideout.sidebar-location-right #qr { transform: translateX(93%); } .post-form-style-slideout #qr:hover, .post-form-style-slideout #qr.has-focus, .post-form-style-slideout #qr.dump { transform: translate(0); } .post-form-style-tabbed-slideout #qr { top: auto !important; } .post-form-style-tabbed-slideout.sidebar-location-left #qr { transform: translateX(-100%); } .post-form-style-tabbed-slideout.sidebar-location-right #qr { transform: translateX(100%); } .post-form-style-tabbed-slideout #qr:hover, .post-form-style-tabbed-slideout #qr.has-focus, .post-form-style-tabbed-slideout #qr.dump { transform: translateX(0); } .post-form-style-tabbed-slideout #qrtab { position: absolute; top: 0; width: 120px; text-align: center; border-width: 1px 1px 0 1px; cursor: default; } .post-form-style-tabbed-slideout.sidebar-location-left #qrtab { transform: rotate(90deg); transform-origin: bottom right; left: 100%; } .post-form-style-tabbed-slideout.sidebar-location-right #qrtab { transform: rotate(-90deg); transform-origin: bottom right; right: 100%; } .post-form-style-tabbed-slideout #qr:hover #qrtab, .post-form-style-tabbed-slideout #qr.has-focus #qrtab, .post-form-style-tabbed-slideout #qr.dump #qrtab { opacity: 0 !important; } .post-form-style-slideout #qrtab input, .post-form-style-slideout #qrtab .rice, .post-form-style-tabbed-slideout #qrtab input, .post-form-style-tabbed-slideout #qrtab .close, .post-form-style-tabbed-slideout #qrtab .rice, .post-form-style-tabbed-slideout #qrtab span { display: none; } .post-form-style-tabbed-slideout #qrtab .selectrice { text-align: center; } .transparent-post-form #qr { opacity: 0.2; transition: opacity .3s ease-in-out 1s; } .transparent-post-form #qr:hover, .transparent-post-form #qr.has-focus, .transparent-post-form #qr.dump { opacity: 1; transition: opacity .3s linear; } :root:not(.show-post-form-header):not(.post-form-style-float):not(.post-form-style-tabbed-slideout) #qrtab, .post-form-style-float .autohide:not(:hover):not(.has-focus) form, .show-post-form-header.post-form-style-fixed .autohide:not(:hover):not(.has-focus) form { display: none !important; } :root:not(.post-form-style-tabbed-slideout) #qrtab { margin-bottom: 1px; } #qr.autohide:not(:hover):not(.has-focus) #qrtab { margin-bottom: 0; } .post-form-slideout-transitions.post-form-style-slideout #qr, .post-form-slideout-transitions.post-form-style-tabbed-slideout #qr { transition: transform .3s ease-in-out 1s; } .post-form-slideout-transitions.post-form-style-tabbed-slideout #qr.dump, .post-form-slideout-transitions.post-form-style-tabbed-slideout #qr:hover, .post-form-slideout-transitions.post-form-style-tabbed-slideout #qr.has-focus, .post-form-slideout-transitions.post-form-style-slideout #qr.dump, .post-form-slideout-transitions.post-form-style-slideout #qr:hover, .post-form-slideout-transitions.post-form-style-slideout #qr.has-focus { transition: transform .3s linear; } .post-form-slideout-transitions #qrtab { transition: opacity .3s ease-in-out 1s; } .post-form-slideout-transitions #qr:hover #qrtab { transition: opacity .3s linear; } #qr .close { float: right; padding: 0 3px; } #qr .warning { min-height: 1.6em; vertical-align: middle; padding: 0 1px; border-width: 1px; border-style: solid; } .persona { width: 248px; max-width: 100%; min-width: 100%; } .persona input.field { width: 100%; } #qr textarea.field { height: 11.6em; min-height: 6em; } #qr.has-captcha textarea.field { height: 6em; } .compact-post-form-inputs .persona input.field { width: 33%; } .compact-post-form-inputs .persona input.field:first-child { margin: 0; } .compact-post-form-inputs .persona input.field { margin: 0 0 0 0.5%; } .compact-post-form-inputs #qr textarea.field { height: 14.9em; min-height: 9em; } .compact-post-form-inputs #qr.has-captcha textarea.field { height: 9em; } .tripcode-hider .tripped:not(:hover):not(:focus) { color: transparent !important; } .textarea-resize-horizontal #qr textarea { resize: horizontal; } .textarea-resize-vertical #qr textarea { resize: vertical; } .textarea-resize-both #qr textarea { resize: both; } .textarea-resize-none #qr textarea { resize: none; } .captcha-img { margin: 1px 0 0; text-align: center; line-height: 0; } .captcha-img img { width: 246px; } .captcha-img, .captcha-img img { height: 4em; } .captcha-input { width: 100%; margin: 1px 0 0; } .field, .selectrice, button, input:not([type=radio]) { -moz-box-sizing: border-box; height: 1.6em; margin: 1px 0 0; vertical-align: bottom; padding: 0 1px; outline: none; } .selectrice { padding-right: 1.6em; } #qr textarea { min-width: 100%; } #qr [type='submit'] { width: 25%; } [type='file'] { position: absolute; opacity: 0; z-index: -1; } /* Fake File Input */ #qr-filename, #qr-filerm, .has-file #qr-no-file { display: none; } #qr-no-file, .has-file #qr-filename { display: block; } .has-file #qr-filerm { display: inline-block; } #qr-extras-container { position: absolute; right: 0; top: 0; z-index: 2; } #qr-extras-container > label, #qr-extras-container > a { cursor: pointer; margin-right: 3px; } #qr-filename-container { -moz-box-sizing: border-box; display: inline-block; position: relative; width: 100px; min-width: 74.6%; max-width: 74.6%; margin-right: 0.4%; overflow: hidden; padding: 2px 1px 0; } /* Thread Select */ #qr-thread-select, #qr-thread-select .selectrice div { display: inline; } #qr-thread-select .selectrice { cursor: pointer; display: inline-block; width: 120px; border: none; background: none transparent; padding: 0; margin: 0; height: auto; } #qr-thread-select .selectrice::before, #qr-thread-select .selectrice::after { display: none; } /* Dumping UI */ .dump #dump-list-container { display: block; } #dump-list-container { display: none; position: relative; overflow-y: hidden; margin-top: 1px; } #dump-list { overflow-x: auto; overflow-y: hidden; white-space: nowrap; width: 248px; max-width: 100%; min-width: 100%; } #dump-list:hover { overflow-x: auto; } .qr-preview { -moz-box-sizing: border-box; counter-increment: thumbnails; cursor: move; display: inline-block; height: 90px; width: 90px; padding: 2px; opacity: .5; overflow: hidden; position: relative; text-shadow: 0 1px 1px #000; transition: opacity .25s ease-in-out; vertical-align: top; } .qr-preview:hover, .qr-preview:focus { opacity: .9; } .qr-preview::before { content: counter(thumbnails); color: #fff; position: absolute; top: 3px; right: 3px; text-shadow: 0 0 3px #000, 0 0 8px #000; } .qr-preview#selected { opacity: 1; } .qr-preview.drag { box-shadow: 0 0 10px rgba(0,0,0,.5); } .qr-preview.over { border-color: #fff; } .qr-preview > span { color: #fff; } .remove { background: none; color: #e00; font-weight: 700; padding: 3px; } a:only-of-type > .remove { display: none; } .remove:hover::after { content: \" Remove\"; } .qr-preview > label { background: rgba(0,0,0,.5); color: #fff; right: 0; bottom: 0; left: 0; position: absolute; text-align: center; } .qr-preview > label > input { margin: 0; } #add-post { cursor: pointer; font-size: 2em; position: absolute; top: 50%; right: 10px; transform: translateY(-50%); } /* Ads */ .fade-ads .topad img, .fade-ads .middlead img, .fade-ads .bottomad img { opacity: 0.3; transition: opacity .3s linear; } .fade-ads .topad img:hover, .fade-ads .middlead img:hover, .fade-ads .bottomad img:hover { opacity: 1; } .hide-ads .bottomad + hr, .hide-ads .topad, .hide-ads .middlead, .hide-ads .bottomad, .hide-ads .ad-plea { display: none; } .shrink-ads .topad a img, .shrink-ads .middlead a img, .shrink-ads .bottomad a img { width: 500px; height: auto; } /* Mascot Positions */ #mascot { display: none; position: fixed; z-index: -1; bottom: 0; left: 0; right: 0; line-height: 0; cursor: pointer; } .mascot-position-above-post-form.post-form-style-fixed:not(.post-form-decorations) #mascot img { margin-bottom: -2px; } .mascots #mascot { display: block; } .sidebar-location-right.mascot-location-sidebar #mascot, .sidebar-location-left.mascot-location-opposite #mascot { left: auto; } .sidebar-location-left.mascot-location-sidebar #mascot, .sidebar-location-right.mascot-location-opposite #mascot { right: auto; } .sidebar-location-left.mascot-location-sidebar #mascot img, .sidebar-location-right.mascot-location-opposite #mascot img { transform: scaleX(-1); } .fourchan-ss-navigation.bottom.fixed #mascot, .fourchan-ss-navigation.index.pagination-sticky-bottom #mascot { bottom: 1.5em } .mascots-overlap-posts #mascot { z-index: 3; } .mascot-position-middle #mascot { bottom: 50% !important; transform: translateY(50%); } .mascot-position-top #mascot { bottom: auto !important; top: 17px; } .grayscale-mascots #mascot { filter: url('#grayscale'); } .silhouettize-mascots #mascot img { filter: url('#mascot-filter'); } /* Options */ #overlay { position: fixed; z-index: 30; top: 0; right: 0; left: 0; bottom: 0; background: rgba(0,0,0,.5); } #appchanx-settings { width: auto; left: 15%; right: 15%; top: 15%; bottom: 15%; position: fixed; z-index: 31; padding: .3em; } .rounded-edges #appchanx-settings, .rounded-edges #appchanx-settings fieldset, .rounded-edges .mascots-container, .rounded-edges .section-container, .rounded-edges .sections-list > a { border-radius: 3px; } .description { display: none; } #appchanx-settings h3, .section-keybinds, .section-mascots, .section-script, .style { text-align: center; } .section-keybinds table, .section-script fieldset, .section-style fieldset { text-align: left; } .section-keybinds table { margin: auto; } #appchanx-settings fieldset { padding: 5px 0; vertical-align: top; border: 0; margin: 0 3px 6px; display: inline-block; } .single-column-mode #appchanx-settings fieldset { display: block; margin: 0 auto 6px; } #appchanx-settings .section-advanced fieldset { display: block; margin: 0 auto 6px; } .section-advanced .archive-cell { min-width: 200px; } .section-advanced .selectrice { display: inline-block; clear: both; } .section-container { overflow: auto; position: absolute; top: 1.7em; right: 5px; bottom: 5px; left: 5px; padding: 5px; } .sections-list { padding: 0 3px; float: left; } .sections-list > a { cursor: pointer; position: relative; padding: 0 4px; z-index: 1; height: 1.4em; display: inline-block; border-width: 1px 1px 0 1px; border-color: transparent; border-style: solid; } .sections-list > a.tab-selected { border-style: solid; } .credits { float: right; } #appchanx-settings h3 { margin: 0; } .section-script fieldset > div, .section-style fieldset > div, .section-advanced fieldset > div { overflow: visible; padding: 0 5px 0 7px; } #appchanx-settings tr:nth-of-type(2n+1), .section-script fieldset > div:nth-of-type(2n+1), .section-advanced fieldset > div:nth-of-type(2n+1), .section-style fieldset > div:nth-of-type(2n+1), .section-keybinds tr:nth-of-type(2n+1), #selectrice li:nth-of-type(2n+1) { background-color: rgba(0, 0, 0, 0.05); } article li { margin: 10px 0 10px 2em; } #appchanx-settings .option { width: 50%; display: inline-block; vertical-align: bottom; } .option input { width: 100%; } .optionlabel { padding-left: 18px; } .rice + .optionlabel { padding-left: 0; } .section-script fieldset, .styleoption { text-align: left; } .section-style fieldset { width: 370px; } .section-script fieldset { width: 200px; } #mascotcontent, #themecontent, .suboptions { overflow: auto; position: absolute; top: 0; right: 0; bottom: 1.7em; left: 0; } #mascotcontent, #themecontent { padding: 5px; } #themecontent { top: 1.8em; } .mAlign { height: 250px; vertical-align: bottom; display: table-cell; line-height: 0; } #save, .stylesettings { position: absolute; right: 10px; bottom: 0; } .section-style .suboptions { bottom: 0; } .section-container textarea { font-family: monospace; min-height: 150px; resize: vertical; width: 100%; } /* Hover Functionality */ #mouseover { z-index: 33; position: fixed; max-width: 70%; } #mouseover:empty { display: none; } /* Mascot Tab */ #mascot_hide { padding: 3px; position: absolute; top: 2px; right: 18px; } #mascot_hide .rice { float: left; } #mascot_hide > div { height: 0; text-align: right; overflow: hidden; } #mascot_hide:hover > div { height: auto; } #mascot_hide label { width: 100%; display: block; clear: both; text-decoration: none; } .mascots-container { padding: 0; text-align: center; } .mascot, .mascotcontainer { overflow: hidden; } .mascot { position: relative; border: none; margin: 5px; padding: 0; width: 200px; display: inline-block; background-color: transparent; } .mascotcontainer { height: 250px; border: 0; margin: 0; max-height: 250px; cursor: pointer; bottom: 0; border-width: 0 1px 1px; border-style: solid; border-color: transparent; overflow: hidden; } .mascot img { max-width: 200px; } .export-button, .mascotname, #mascot-options { -moz-box-sizing: border-box; padding: 0; width: 100%; } #mascot-options { opacity: 0; transition: opacity .3s linear; } .mascot:hover #mascot-options { opacity: 1; } #mascot-options { position: absolute; bottom: 0; right: 0; left: 0; } .export-button { position: absolute; bottom: 1.7em; right: 0; left: 0; text-align: center; } #mascot-options a { display: inline-block; width: 33%; } #upload { position: absolute; width: 100px; left: 50%; margin-left: -50px; text-align: center; bottom: 0; } #mascots_batch { position: absolute; left: 10px; bottom: 0; } /* Themes Tab */ #themes h1 { position: absolute; right: 300px; bottom: 10px; margin: 0; transition: all .2s ease-in-out; opacity: 0; } #themes .selectedtheme h1 { right: 11px; opacity: 1; } #addthemes { position: absolute; left: 10px; bottom: 0; } .theme { margin: 1em; } /* Theme Editor */ #themeConf { position: fixed; top: 0; bottom: 0; width: 296px; z-index: 10; } .sidebar-location-right #themeConf { right: 2px; left: auto; } .sidebar-location-right #themeConf { left: 2px; right: auto; } #themebar input { width: 30%; } .option .color { width: 10%; border-left: none !important; color: transparent !important; } .option .colorfield { width: 90%; } .themevar textarea { min-width: 100%; max-width: 100%; height: 20em; resize: vertical; } /* Mascot Editor */ #mascotConf { position: fixed; height: 17em; bottom: 0; left: 50%; width: 500px; margin-left: -250px; overflow: auto; z-index: 10; } #mascotConf .option, #mascotConf .optionlabel { -moz-box-sizing: border-box; width: 50%; display: inline-block; vertical-align: middle; } #mascotConf .option input { width: 100%; } #close { position: absolute; left: 10px; bottom: 0; } /* Catalog */ #content .navLinks, #info .navLinks, .btn-wrap { display: block; } .navLinks > .btn-wrap:not(:first-of-type)::before { content: ' - '; } .button { cursor: pointer; } #content .btn-wrap, #info .btn-wrap { display: inline-block; } #post-preview, #quote-preview { position: absolute; z-index: 22; } .rounded-edges #post-preview { border-radius: 3px; } #settings, #threads, #info .navLinks, #content .navLinks { text-align: center; } #threads .thread { vertical-align: top; display: inline-block; word-wrap: break-word; overflow: hidden; margin: 1px; padding: 5px 0 3px; text-align: center; } .extended-small .thread, .small .thread { width: 165px; max-height: 320px; } .small .teaser, .large .teaser { display: none; } .extended-large .thread, .large .thread { width: 270px; max-height: 410px; } .extended-small .thumb, .small .thumb { max-width: 150px; max-height: 150px; } .panel { position: fixed; top: 50% !important; left: 50%; transform: translate(-50%, -50%); padding: 5px; } .icon::after { display: inline-block; float: right; width: 1em; cursor: pointer; } .helpIcon::after { content: '?'; } .closeIcon::after { content: '✖'; } /* Front Page */ #logo { text-align: center; } #doc { -moz-box-sizing: border-box; margin: 10px auto; width: 1006px; padding: 2px; position: relative; } .rounded-edges #doc, .rounded-edges #doc div { border-radius: 3px; } #boards .boxcontent { vertical-align: top; text-align: center; } #filter-container, #options-container { top: 4px; right: 8px; position: absolute; } #filtermenu, #optionsmenu { top: 100% !important; left: auto !important; right: 0 !important; } #boards .column { -moz-box-sizing: border-box; display: inline-block; width: 180px; text-align: left; vertical-align: top; } .bd ul, .boxcontent ul { vertical-align: top; padding: 0; margin: 0; } .right-box .boxcontent ul { padding: 0 10px; } .yuimenuitem, .boxcontent li { list-style-type: none; } .boxbar { position: relative; } #doc h3, .boxbar h2 { margin: 0; } #doc h3 { text-decoration: none !important; } .underline-links #doc h3 { text-decoration: underline !important; } #ft, .box-outer { margin: 2px 0 0; overflow: hidden; } #ft, .boxbar, .boxcontent { padding: 0 8px; } .yui-module { position: absolute; } .yuimenuitem::before { content: \" [ ] \"; font-family: monospace; } .yuimenuitem-checked::before { content: \" [x] \" } .yui-g { overflow: hidden; } .yui-u { display: inline-block; vertical-align: top; width: 499px; float: right; } .yui-u.first { float: left; } #recent-images .boxcontent { text-align: center; } #ft { text-align: center; } #ft ul { padding: 0; } #ft li { list-style-type: none; display: inline-block; width: 100px; } #preview-tooltip-nws, #preview-tooltip-ws, #ft .fill, .clear-bug { display: none; } /* ExLinks */ #exlinks-options-content { padding: 5px; }", + layout: "/* Cleanup */ #absbot, #boardNavDesktop, #delPassword, #delform > hr:last-of-type, #navbotright, #postForm, #search-label, #search-label-bottom, #styleSwitcher, #togglePostForm, .boardBanner > div, .mobile, .next form, .next span, .postingMode, .prev form, .prev span, .riced, .sideArrows, .stylechanger, body > br, body > div[style^=\"text-align\"], body > hr { display: none; } /* Empties */ #qr .warning:empty, #qr-thread-select:empty { display: none; } /* File Name Trunctuate / /p/ exif */ .exif, .fileText:hover .fntrunc, .fileText:not(:hover) .fnfull { display: none; } /* Unnecessary */ #qp input, #qp .rice, .inline .rice { display: none !important; } /* Hidden Content */ .forwarded, .hidden, .hidden_thread ~ div, .hidden_thread ~ a, .replyContainer .stub ~ div, .replyContainer .stub ~ a, .stub + div, .thread > .stub:first-child ~ .postContainer, .thread > .stub:first-child ~ .summary, [hidden] { display: none !important; } /* Hidden UI */ #catalog, #navlinks, #navtopright, #svg_filters, .cataloglink, .navLinks { z-index: 7; position: fixed; top: 100%; left: 100%; } /* Hide last horizontal rule, keep clear functionality. */ .board > hr:last-of-type { visibility: hidden; } /* Fappe Tyme */ .fappeTyme .thread > .noFile, .fappeTyme .threadContainer > .noFile { display: none; } /* Defaults */ a { text-decoration: none; outline: none; } .underline-links a { text-decoration: underline; } body, html { min-height: 100%; -moz-box-sizing: border-box; } body { outline: none; min-height: 100%; } .sidebar-hide body { margin: 0 2px; } .sidebar-minimal body { margin: 0 20px; } .sidebar-normal body { margin: 0 252px } .sidebar-large body { margin: 0 303px; } .sidebar-location-right body { margin-left: 2px; } .sidebar-location-left body { margin-right: 2px; } body.unscroll { overflow: hidden; } .fourchan-ss-sidebar body::before { content: ''; position: fixed; top: 0; bottom: 0; -moz-box-sizing: border-box; display: block; z-index: 0; } .fourchan-ss-sidebar.sidebar-large body::before { width: 306px; } .fourchan-ss-sidebar.sidebar-normal body::before { width: 255px; } .fourchan-ss-sidebar.sidebar-minimal body::before { width: 23px; } .sidebar-location-right body::before { right: 0; } sidebar-location-left body::before { left: 0; } .fourchan-ss-sidebar.sidebar-location-right body { padding-right: 2px; } .fourchan-ss-sidebar.sidebar-location-left body { padding-left: 2px; } hr { clear: both; border: 0; padding: 0; margin: 0 0 1px; } .hide-horizontal-rules hr { visibility: hidden; } th { text-align: left; } .center { text-align: center; } .disabled { opacity: 0.5; } .pointer { cursor: pointer; } /* Symbols */ .drop-marker { vertical-align: middle; display: inline-block; margin: 2px 2px 3px; border-top: .5em solid; border-right: .3em solid transparent; border-left: .3em solid transparent; } .brackets-wrap::before { content: \" [\"; } .brackets-wrap::after { content: \"] \"; } /* Thread / Reply Nav */ #navlinks a { position: fixed; z-index: 12; opacity: 0.5; display: inline-block; border-right: 6px solid transparent; border-left: 6px solid transparent; margin: 1.5px; } #navlinks a:first-of-type { border-bottom: 11px solid rgb(130,130,130); } #navlinks a:last-of-type { border-top: 11px solid rgb(130,130,130); } /* Header */ #header-bar { z-index: 6; border-width: 1px; padding: 0 2px; border-style: solid; } .pagination-sticky-top .pagelist, .pagination-sticky-bottom .pagelist, #header-bar { left: 2px; right: 2px; } .navigation-alignment-center #header-bar { text-align: center; } .navigation-alignment-right #header-bar { text-align: right; } .sidebar-location-left.sidebar-large:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-left #header-bar { left: 303px; } .sidebar-location-left.sidebar-normal:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-left #header-bar { left: 252px; } .sidebar-location-left.sidebar-minimal:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-left.sidebar-minimal:not(.fourchan-ss-navigation) #header-bar { left: 20px; } .sidebar-location-right.sidebar-large:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-right #header-bar { right: 303px; } .sidebar-location-right.sidebar-normal:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-right #header-bar { right: 252px; } .sidebar-location-right.sidebar-minimal:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-right.sidebar-minimal:not(.fourchan-ss-navigation) #header-bar { right: 20px; } .fourchan-ss-navigation .pagelist, .fourchan-ss-navigation #header-bar { left: 0; right: 0; border-left: 0; border-right: 0; border-radius: 0 !important; } .hide-navigation-decorations #header-bar { font-size: 0; color: transparent; word-spacing: 2px; } #shortcuts { float: right; } .fixed #header-bar.autohide { z-index: 24; } .fixed #header-bar { position: fixed; } .top #header-bar { top: 0; border-top-width: 0; } .rounded-edges.top #header-bar { border-radius: 0 0 3px 3px; } .fixed.bottom #header-bar { bottom: 0; border-bottom-width: 0; } .rounded-edges.bottom #header-bar { border-radius: 3px 3px 0 0; } .hide #header-bar { position: fixed; top: 110%; bottom: auto; } /* Header Autohide */ .fixed #header-bar.autohide:not(:hover) { box-shadow: none; transition: all .8s .6s cubic-bezier(.55, .055, .675, .19); } .fixed.top #header-bar.autohide:not(:hover) { margin-bottom: -1em; transform: translateY(-100%); } .fixed.bottom #header-bar.autohide:not(:hover) { transform: translateY(100%); } #scroll-marker { left: 0; right: 0; height: 10px; position: absolute; } #header-bar #scroll-marker { display: none; } .fixed #header-bar #scroll-marker { display: block; } .fixed.top header-bar #scroll-marker { top: 100%; } .fixed.bottom #header-bar #scroll-marker { bottom: 100%; } /* Notifications */ #notifications { position: fixed; top: 0; text-align: center; right: 0; left: 0; transition: all .8s .6s cubic-bezier(.55, .055, .675, .19); } .fixed.top #header-bar #notifications { position: absolute; top: 100%; } .notification { font-weight: 700; text-shadow: 0 1px 2px rgba(0, 0, 0, .5); box-shadow: 0 1px 2px rgba(0, 0, 0, .15); border-radius: 2px; margin: 1px auto; width: 500px; max-width: 100%; position: relative; transition: all .25s ease-in-out; } .notification.error { background-color: hsla(0, 100%, 38%, .9); } .notification.warning { background-color: hsla(36, 100%, 38%, .9); } .notification.info { background-color: hsla(200, 100%, 38%, .9); } .notification.success { background-color: hsla(104, 100%, 38%, .9); } .notification, .notification a { color: #fff !important; } .notification > .close { top: 0; padding: 2px; right: 4px; position: absolute; color: #fff; } .message { -moz-box-sizing: border-box; padding: 6px 20px; max-height: 200px; width: 100%; overflow: auto; } /* Updater / Thread Stats */ .float #thread-stats, .float #updater { position: fixed; } #update-status.new::after { content: ', '; } /* Pagination */ .pagelist { border-style: solid; border-width: 1px; z-index: 6; } .pagination-alignment-center .pagelist { text-align: center; } .pagination-alignment-right .pagelist { text-align: right; } .pagination-sticky-top .pagelist { position: fixed; top: 0; border-top-width: 0; } .pagination-sticky-bottom .pagelist { position: fixed; bottom: 0; border-bottom-width: 0; } .pagination-top .pagelist { position: static; border-top-width: 0; } .pagination-bottom .pagelist { position: static; } .pagination-top.rounded-edges .pagelist, .pagination-sticky-top.rounded-edges .pagelist { border-radius: 0 0 3px 3px; } .pagination-bottom.rounded-edges .pagelist, .pagination-sticky-bottom.rounded-edges .pagelist { border-radius: 3px 3px 0 0; } .pagination-hide .pagelist { display: none; } .pagination-on-side .pagelist { position: fixed; padding: 0; top: auto; bottom: 0.5em; margin: 0; background: none transparent !important; border: 0 none !important; text-align: right; } .pagination-on-side.post-form-style-fixed.show-post-form-header .pagelist { bottom: 23.1em; } .pagination-on-side.post-form-style-fixed .pagelist { bottom: 21.6em; } .sidebar-location-left.pagination-on-side .pagelist { transform: rotate(-90deg); transform-origin: bottom left; } .sidebar-location-right.pagination-on-side .pagelist { transform: rotate(90deg); transform-origin: bottom right; } .sidebar-location-right.sidebar-large.pagination-on-side .pagelist { left: auto; right: 301px; } .sidebar-location-left.sidebar-large.pagination-on-side .pagelist { right: auto; left: 301px; } .sidebar-location-right.sidebar-normal.pagination-on-side .pagelist { left: auto; right: 246px; } .sidebar-location-left.sidebar-normal.pagination-on-side .pagelist { right: auto; left: 246px; } .sidebar-location-right.sidebar-minimal.pagination-on-side .pagelist { left: auto; right: 246px; } .sidebar-location-left.sidebar-minimal.pagination-on-side .pagelist { right: auto; left: 18px; } .hide-navigation-decorations .pagelist { font-size: 0; color: transparent; word-spacing: 0; } .pagelist input, .pagelist div { vertical-align: middle; } .hide-navigation-decorations .pages a { margin: 0 1px; } .next, .pages, .prev { display: inline-block; margin: 0 3px; } /* Icons */ .icons-4chan-ss #navtopright .exlinksOptionsLink::after, .icons-4chan-ss #main-menu, .icons-4chan-ss .navLinks > a:first-of-type::after, .icons-4chan-ss #thread-watcher::after, .icons-4chan-ss #globalMessage::after, .icons-4chan-ss #boardNavDesktopFoot::after, .icons-4chan-ss #img-controls, .icons-4chan-ss #catalog::after, .icons-4chan-ss #fappeTyme { background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAACWCAMAAAA2YSLzAAAAPFBMVEVkZGRlZWVjY2NmZmZnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dZxmG7AAAAE3RSTlMFFQ0AJD8eQFRqf5CgssDM4+73gHqZRAAAA0pJREFUSMetVlmy5CgMZDMGxK7737Ulgcu8ejMREzHtD7sShJRaKWV/Psq3iz7QGwTF2BZ01hp3N6yasctZJANiN5ZlItDLtNkQDGNeMLU7EqmCbUwhkhZbwsIuNbyWPX7dIyHOrDYOc8SOiEUJjojN0EsWlCXRrq2qvJCsIjic2OcFrwrOpdmTimqVyWG7ZkrWy97p7z/hACd2FUetBcQDpTN+nuKsGng881L5xOz/VQ88xL/eQkyZT3axp+4dUMwvH0Pnhn6wSyR+8IdR4f43/v8XX1BHjXpjwy5RdEcQ7DiuzlBUsFD+GeIFEy6W0pKXoSZOiUz5tf99nvTDD/1sP9VRPvb/un86lT57SVqwSk8KR+L6kgTOlcZslRQe5WmJRKovETW7Anb+HzxUW4Xgnv11fuuj82aKXHz1Tzztx9v4VA9+/6le26B+3VhTC9RMPIr0qx4zaWNsnFRO0s8FWgEIFIRiVUAIlJGciqMmCwpQWyI/OplXA1RrXG1YI2svTQ3ufhWjNlKFqtXFI7Yg+zAXRcBZ+HygJuVHd0ys35bVn6QojLL5cZeVvPht/mVu/r/8s7GMXsLjv2s71GZhgjnEwsEVXogiSl/pl7LWra0IQgO3poTsieoYd4dhWfJlGWqyQf6sLxWt3/MRa4Im04ixeSdAWnxvqCX6tObVmzpZOPOZvrBNJF8gmGciBChsV+YdRYwnAvNpS4AnYFBm0KA2a35Unh+efxjercaLfV7wW0rtUTNl2j715al/9VtfutF+NZ/+aZSa+py/GCpRyvr17EsVLbRhmN++BBY/ik5/+YPK6bKnf2T8fh7P+uEYn0D3E4L3i6QHmvc3+k+8PN6Mb1w52tje6LbAi+M0FT4YneqVbpVDPnL2Xqx7m3tf9ENXHba9H/a/+X3z/+XfCnOo+Zy/o4SgY5Z6iq0nb+9Mc4JxL5f1qYs+xhTP/uiX/cMe4+hDHAfGnmGe+Ev+G88vnG7Ie20wHiUt/S1Kv+6BCM/9fkEfz73/9HNufQ4ZKdzvnwtS/LXltRcJB/yJ23H/mo89nPFa85Li3XOYu435LwTXKVWwO+cnlWFTB47L/AdfR//KI2bvF8sAb0c/M+1+YE3/oS77B8N+UUVHraV6AAAAAElFTkSuQmCC\"); } .icons-oneechan #navtopright .exlinksOptionsLink::after, .icons-oneechan #main-menu, .icons-oneechan .navLinks > a:first-of-type::after, .icons-oneechan #thread-watcher::after, .icons-oneechan #globalMessage::after, .icons-oneechan #boardNavDesktopFoot::after, .icons-oneechan #img-controls, .icons-oneechan #catalog::after, .icons-oneechan #fappeTyme { background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAACWCAMAAAA2YSLzAAAAPFBMVEVoaGhqampeXl5sbGxsbGxra2tsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGzXmsRLAAAAE3RSTlMAEAYnHBg2QExbcYaWqM++2+z4BMdvAwAAAtVJREFUSMfFVgmu3CAMhYRPAmb3/e9aL5Bl2kptVbXWSOSBsY15NmOMMZs1KnNExC+ezgV4MBtNMIw58+qX2REtQwiifdC6hwlNQBGfUlBzc+KYkP3IxH5hNvicCPXrMfEVi3ts2WrzaiN6jie2OI2GXbBfXiA/XPyexPpEHrHdyDV8YAt6vEYCVpJ3S7rXAZKkkfbnuR8Uk/32xsac6Y01La2ZfyIh1VrX9Rnfu5ygd6/XeQAGFxACkopDb3mkeXug48x5FCKhNzW+1j2t8/5EEwHTIfPm6G3aP37o/w/ir3QZ2V/xY0spdSxWL7MrLU7slmnDSY0UrH6CBJ/wFI3TNGECCDY9G4xmrpDkZvQMJ4q31EzLQuhipr7ag8ueFa+hUQy2d43nnPGg7NopHTUVyYlWpE+lUT4qfhDCnLpzB8oXLLJb4leptD/JblswOaZd0gRkDV0cJi69NNOUaclRpG6S1NPdRVPLjI3VSjWV8+FmaARknTxqfipl0tGR1DXvd0h251Ww/ZlaNQoaX3bqUS+IK6ZX4hysvuQinS+6n9638/6BbK4RLi6R11O8rPS4OnO66KHtw6yK96BWrg5QxDGcVzcoB8cYb/dE1zPO6C+pHxN0Ttw/JtJrx55+oV9Jq+ScF22IfBWDD+sHfTnBmKlpS99hPGSC4SBsi+dP3p0PjVBVedMdO3WoG57cAEbYVNkRHFROIzjYuGjoM7LOaEQKbtQjkuo5hCSMmezaNq3Gl6TE5J3ZLMu26SjpPJZo4h/9FJhT4JQJzjFXD7x54fBgzO9RvDH9Vl5vHIetcGHct1apLh/6gU3c2PYy5rrYh7a1NP29/H/G9xn/d+f7FNVcw9/H/9sf8ymXPnqdDd7Wx3OpzWRJuP8+iMTFe7wZq48Tce7QciNetUzku+pT/t4UHK/iIq2yPR/8y/315M/rWl1A/sM83phVh6+aeZY39OLNN4Y0P2GdHOWPAAAAAElFTkSuQmCC\"); } /* Banner & Board Title */ .boardBanner { line-height: 0; } .faded-4chan-banner .boardBanner { opacity: 0.5; transition: opacity 0.3s ease-in-out .5s; } .faded-4chan-banner .boardBanner:hover { opacity: 1; transition: opacity 0.3s ease-in; } /* From 4chan SS / OneeChan */ .fourchan-banner-reflection .boardBanner::after { background-image: -moz-element(#Banner); bottom: -100%; content: ''; left: 0; mask: url(\"data:image/svg+xml, #mask\"); opacity: 0.3; position: absolute; right: 0; top: 100%; -moz-transform: scaleY(-1); z-index: -1; } .fourchan-banner-at-sidebar-top .boardBanner, .fourchan-banner-at-sidebar-bottom .boardBanner, .fourchan-banner-at-sidebar-bottom .boardBanner { position: fixed; } .fourchan-banner-at-sidebar-top .boardBanner { top: 16px; } .fourchan-banner-at-sidebar-bottom .boardBanner { bottom: 270px; } .fourchan-banner-under-post-form .boardBanner { bottom: 130px; } .board-title-at-sidebar-top.sidebar-location-right #boardTitle, .board-title-at-sidebar-bottom.sidebar-location-right #boardTitle, .board-title-under-post-form.sidebar-location-right #boardTitle, .fourchan-banner-at-sidebar-top.sidebar-location-right .boardBanner, .fourchan-banner-at-sidebar-bottom.sidebar-location-right .boardBanner, .fourchan-banner-under-post-form.sidebar-location-right .boardBanner { right: 2px; } .board-title-at-sidebar-top.sidebar-location-left #boardTitle, .board-title-at-sidebar-bottom.sidebar-location-left #boardTitle, .board-title-under-post-form.sidebar-location-left #boardTitle, .fourchan-banner-at-sidebar-top.sidebar-location-left .boardBanner, .fourchan-banner-at-sidebar-bottom.sidebar-location-left .boardBanner, .fourchan-banner-under-post-form.sidebar-location-left .boardBanner { left: 2px; } .board-title-at-sidebar-top #boardTitle, .board-title-at-sidebar-bottom #boardTitle, .board-title-under-post-form #boardTitle, .fourchan-banner-at-sidebar-top .boardBanner img, .fourchan-banner-at-sidebar-bottom .boardBanner img, .fourchan-banner-under-post-form .boardBanner img { width: 248px; } .board-title-at-sidebar-top.sidebar-large #boardTitle, .board-title-at-sidebar-bottom.sidebar-large #boardTitle, .board-title-under-post-form.sidebar-large #boardTitle, .fourchan-banner-at-sidebar-top.sidebar-large .boardBanner img, .fourchan-banner-at-sidebar-bottom.sidebar-large .boardBanner img, .fourchan-banner-under-post-form.sidebar-large .boardBanner img { width: 299px; } .fourchan-banner-at-top .boardBanner { position: relative; display: table; margin: 12px auto; text-align: center; } :root:not(.board-subtitle) .boardSubtitle, .board-title-hide #boardTitle, .fourchan-banner-hide .boardBanner { display: none; } #boardTitle { text-align: center; z-index: 4; } .board-title-at-sidebar-top #boardTitle, .board-title-at-sidebar-bottom #boardTitle, .board-title-under-post-form #boardTitle { position: fixed; } .board-title-at-sidebar-top.fourchan-banner-at-sidebar-top.sidebar-large #boardTitle { top: 121px; } .board-title-at-sidebar-top.fourchan-banner-at-sidebar-top #boardTitle { top: 104px; } .board-title-at-sidebar-top #boardTitle { top: 40px; } .board-title-at-sidebar-bottom #boardTitle { bottom: 280px; } .board-title-under-post-form #boardTitle { bottom: 140px; } /* Hover UI */ .move { cursor: pointer; } #ihover { position: fixed; max-height: 97%; max-width: 75%; z-index: 22; } #qp { position: fixed; z-index: 22; } #qp .postMessage::after { clear: both; display: block; content: \"\"; } #qp .full-image { max-height: 300px; max-width: 500px; } #menu { position: fixed; outline: none; z-index: 22; } /* Image Expansion */ .fit-width .full-image { max-width: 100%; width: 100%; } .fit-height .full-image { max-height: 95vh; } .images-overlap-post-form .full-image { position: relative; z-index: 21; } /* Delete Buttons */ .hide-delete-ui .deleteform, .hide-delete-ui .post:not(#exlinks-options) .rice { display: none; } .hide-delete-ui .postInfo { padding: 0 0 0 3px; } .deleteform { position: fixed; z-index: 18; width: 0; bottom: 0; right: 0; border-width: 1px 0 0 1px; border-style: solid; font-size: 0; color: transparent; } .deleteform:hover { width: auto; } .deleteform::before { z-index: 18; border-width: 1px 0 0 1px; border-style: solid; content: '✖'; display: block; position: fixed; bottom: 0; right: 0; -moz-box-sizing: border-box; height: 1.6em; width: 1.4em; text-align: center; } .deleteform:hover::before { display: none; } .deleteform input { margin: 0 1px 0 0; } /* Slideout Navigation */ #boardNavDesktopFoot { position: fixed; text-align: center; font-size: 0; color: transparent; overflow: hidden; -moz-box-sizing: border-box; width: 248px; } .sidebar-large #boardNavDesktopFoot { width: 299px; } .sidebar-location-right #boardNavDesktopFoot { right: 2px; } .sidebar-location-left #boardNavDesktopFoot { left: 2px; } #boardNavDesktopFoot:hover { overflow-y: auto; padding: 2px; } #boardNavDesktopFoot:not(:hover) { border-color: transparent; background-color: transparent; height: 0; overflow: hidden; padding: 0; border: 0 none; } .slideout-navigation-compact #boardNavDesktopFoot { word-spacing: 1px; } .slideout-navigation-list #boardNavDesktopFoot a { display: block; } .slideout-navigation-list #boardNavDesktopFoot:hover { max-height: 400px; } .slideout-navigation-list #boardNavDesktopFoot a::after { content: ' - ' attr(title); } .slideout-navigation-list #boardNavDesktopFoot a[href*='//boards.4chan.org/']::after, .slideout-navigation-list #boardNavDesktopFoot a[href*='//rs.4chan.org/']::after { content: '/ - ' attr(title); } .slideout-navigation-list #boardNavDesktopFoot a[href*='//boards.4chan.org/']::before, .slideout-navigation-list #boardNavDesktopFoot a[href*='//rs.4chan.org/']::before { content: '/'; } .slideout-navigation-hide #boardNavDesktopFoot { display: none; } /* Watcher */ #thread-watcher { position: fixed; z-index: 14; padding: 2px; } #thread-watcher { width: 200px; } #thread-watcher:not(:hover) { max-height: 200px; overflow: hidden; } .rounded-edges #thread-watcher { border-radius: 3px; } #thread-watcher > div { max-height: 1.3em; overflow: hidden; } .slideout-watcher #thread-watcher { -moz-box-sizing: border-box; width: 248px; } .slideout-watcher.sidebar-large #boardNavDesktopFoot { width: 299px; } .slideout-watcher.sidebar-location-right #thread-watcher { left: auto !important; right: 2px !important; } .slideout-watcher.sidebar-location-left #thread-watcher { right: auto !important; left: 2px !important; } .slideout-watcher #thread-watcher .move { cursor: default; } .slideout-watcher.underline-links #thread-watcher .move { text-decoration: underline; } .slideout-watcher #thread-watcher > div { overflow: hidden; } .slideout-watcher #thread-watcher:hover { overflow-y: auto; } .slideout-watcher #thread-watcher:not(:hover) { height: 0; overflow: hidden; border: 0 none; padding: 0; } .watch-thread-link { padding-top: 18px; width: 18px; height: 0px; display: inline-block; background-repeat: no-repeat; opacity: 0.2; position: relative; top: 1px; } .watch-thread-link.watched { opacity: 1; } /* Announcements */ #globalMessage { text-align: center; } .rounded-edges #globalMessage { border-radius: 3px; } .announcements-slideout #globalMessage { position: fixed; padding: 2px; width: 248px; } .announcements-slideout.sidebar-location-right #globalMessage { left: auto; right: 2px; } .announcements-slideout.sidebar-location-left #globalMessage { right: auto; left: 2px; } .announcements-slideout.sidebar-large #globalMessage { width: 299px; } .announcements-slideout #globalMessage h3 { margin: 0; } .announcements-slideout #globalMessage:hover { -moz-box-sizing: border-box; overflow-y: auto; } .announcements-slideout #globalMessage:not(:hover) { height: 0; overflow: hidden; padding: 0; border: 0 none; } .announcements-hide #globalMessage { display: none !important; } /* Threads */ #threads, .rounded-edges .board > .thread { border-radius: 4px; } /* Thread Clearfix */ .thread > .threadContainer:last-of-type::after, .thread > .postContainer:last-of-type::after { display: block; content: ' '; clear: both; } /* Posts */ .expanding { opacity: .5; } .fileText:hover .fntrunc, .fileText:not(:hover) .fnfull, .expanded-image > .post > .file > .fileThumb > img[data-md5], .post > .file > .fileThumb > .full-image { display: none; } .expanded-image > .post > .file > .fileThumb > .full-image { display: block; } .thread > .replyContainer:last-of-type .post { margin-bottom: 0; } .menu-button { position: relative; } .stub .menu-button, .post .menu-button, .hide-thread-button, .show-thread-button span, .hide-reply-button, .show-reply-button span { float: right; } .post .menu-button, .hide-thread-button, .hide-reply-button { margin: 0 3px; opacity: 0; transition: opacity .3s ease-out 0s; } .post:hover .hide-reply-button, .post:hover .menu-button, .post:hover .hide-thread-button, .hidden_thread .hide-thread-button, .hidden_thread .menu-button, .inline .hide-reply-button, .inline .menu-button { opacity: 1; } .hidden_thread { text-align: right; } .color-user-ids .posteruid .hand { padding: .1em .3em; border-radius: 1em; font-size: 80%; } .postInfo > span { vertical-align: bottom; } .bolds .subject, .bolds .name { font-weight: 600; } .italics .postertrip { font-style: italic; } .underline-links .replylink { text-decoration: underline; } .fileInfo { padding: 0 3px; } .fileThumb { float: left; margin: 3px 20px; outline: none; } .reply.post { -moz-box-sizing: border-box; display: inline-block; } .fit-width-replies .reply.post { display: block; overflow: hidden; } .fit-width-replies .expanded-image .reply.post, .fit-width-replies .hasInline .reply.post { width: 100%; } .indent-replies #unread-line, .indent-replies .thread > .replyContainer, .indent-replies .threadContainer > .replyContainer { margin-left: 2em; } .expanded-image .reply.post, .hasInline .reply.post { display: inline-block; overflow: visible; clear: both; } .rounded-edges .post { border-radius: 3px; } .spoiler, s { text-decoration: none; } /* Emoji */ a.useremail:last-of-type { vertical-align: top; } /* Reply Clearfix */ .reply.post .postMessage { clear: right; } .op-background .op.post .postMessage::after, .force-reply-break .op.post .postMessage::after { display: block; content: ' '; clear: both; } /* OP */ .favicon { vertical-align: bottom; } .op-background .op.post { -moz-box-sizing: border-box; } /* Summary */ .force-reply-break .summary { clear: both; } /* Inlined */ .inline { margin: 2px 8px 2px 2px; } .post .inline { margin: 2px; } .inline .replyContainer { display: inline-block; } /* Inlined Clearfix */ .inline .postMessage::after { clear: both; display: block; content: \"\"; } /* Quotes */ .inlined { opacity: .5; } .underline-links .quotelink { text-decoration: underline; } .filtered, .quotelink.filtered { text-decoration: line-through !important; } .inline + .hashlink { display: none; } /* Quote Threading */ .threadContainer { padding-left: 2em; border-left: 1px solid; } .indent-replies .threadContainer { margin-left: 2em; padding-left: 0; } .threadOP { clear: both; } /* Backlinks */ .underline-links .forwardlink, .underline-links .backlink { text-decoration: underline; } .backlink.dead { text-decoration: none; } .filtered-backlinks .filtered.backlink { display: none; } .backlinks-position-lower-left .container, .backlinks-position-lower-right .container { max-width: 100%; padding: 0 5px; } .backlinks-position-lower-left .reply.quoted, .backlinks-position-lower-right .reply.quoted { position: relative; padding-bottom: 1.7em; } .backlinks-position-lower-left .inline .reply.quoted, .backlinks-position-lower-right .inline .reply.quoted, .backlinks-position-lower-right #qp .reply.quoted, .backlinks-position-lower-left #qp .reply.quoted { position: static; padding-bottom: 0; } .backlinks-position-lower-right .reply .container, .backlinks-position-lower-left .reply .container { position: absolute; bottom: 0; padding: 0 5px; } .backlinks-position-lower-left .reply .container { left: 0; } .backlinks-position-lower-right .reply .container { right: 0; } .backlinks-position-lower-right .container::before, .backlinks-position-lower-left .reply .container::before { content: 'REPLIES: '; } .container:empty { display: none; } .backlinks-position-lower-left #qp .container, .backlinks-position-lower-left .inline .container, .backlinks-position-lower-right .inline .container, .backlinks-position-lower-right #qp .container { position: static; max-width: 100%; } .backlinks-position-lower-left #qp .container::before, .backlinks-position-lower-left .inline .container::before, .backlinks-position-lower-right #qp .container::before, .backlinks-position-lower-right .inline .container::before { content: ''; } .backlinks-position-lower-right .inline .container { float: none; } /* Fixes text spoilers */ .remove-spoilers.indicate-spoilers .spoiler::before, .remove-spoilers.indicate-spoilers s::before { content: '[spoiler]'; } .remove-spoilers.indicate-spoilers .spoiler::after, .remove-spoilers.indicate-spoilers s::after { content: '[/spoiler]'; } :root:not(.remove-spoilers) .spoiler:not(:hover) *, :root:not(.remove-spoilers) s:not(:hover) * { color: rgb(0,0,0) !important; text-shadow: none !important; } :root:not(.remove-spoilers) spoiler:not(:hover), :root:not(.remove-spoilers) s:not(:hover) { background-color: rgb(0,0,0); color: rgb(0,0,0) !important; text-shadow: none !important; } /* Code */ .prettyprint { -moz-box-sizing: border-box; font-family: monospace; display: inline-block; margin: 0 auto .1em 0; vertical-align: middle; white-space: pre-wrap; border-radius: 2px; overflow-x: auto; padding: 3px; max-width: 100%; } /* Menu */ .entry { border-bottom: 1px solid rgba(0,0,0,.25); cursor: pointer; display: block; outline: none; padding: 3px 1em 3px 7px; position: relative; text-decoration: none; white-space: nowrap; } .entry:last-child { border-bottom: 0; } .has-submenu::after { content: \"\"; border-left: .5em solid; border-top: .3em solid transparent; border-bottom: .3em solid transparent; display: inline-block; margin: .3em; position: absolute; right: 0; } .submenu { display: none; position: absolute; top: -1px; } .focused .submenu { display: block; } /* Stubs */ .fit-width-replies .stub { display: block; text-align: right; clear: both; } /* Element Replacing: */ /* Checkboxes */ .rice { cursor: pointer; width: 9px; height: 9px; margin: 2px 3px 3px; display: inline-block; vertical-align: bottom; } input[type=checkbox]:checked + .rice { position: relative; } input[type=checkbox]:checked + .rice::after { content: \"\"; display: block; width: 4px; height: 10px; border-width: 0 3px 3px 0; border-style: solid; transform: rotate(45deg); position: absolute; left: 2px; bottom: -1px; } .rounded-edges .rice { border-radius: 2px;} } .circle-checkboxes .rice { border-radius: 6px;} } input:checked + .rice { background-attachment: scroll; background-repeat: no-repeat; background-position: bottom right; } /* Selects */ .selectrice { position: relative; cursor: default; overflow: hidden; text-align: left; } #settings .selectrice { display: inline-block; } .selectrice::after { content: \"\"; border-right: .25em solid transparent; border-left: .25em solid transparent; position: absolute; right: .4em; top: .5em; } .selectrice::before { content: \"\"; height: 1.6em; position: absolute; right: 1.3em; top: 0; } /* Select Dropdown */ #selectrice { padding: 0; margin: 0; position: fixed; max-height: 120px; overflow-y: auto; overflow-x: hidden; z-index: 32; } #selectrice:empty { display: none; } /* Post Form Shortcut */ .qr-shortcut.on-page { font-size: 250%; } /* Post Form */ #qr { z-index: 20; position: fixed; background: none; border: none; padding: 1px; min-width: 248px; background: transparent; border: 1px solid transparent; } .sidebar-large #qr { min-width: 299px; } .rounded-edges #qr, .rounded-edges #qrtab { border-radius: 3px 3px 0 0; } .post-form-style-fixed #qr { top: auto !important; } .sidebar-location-left:not(.post-form-style-float) #qr { left: 0 !important; right: auto !important; } .sidebar-location-right:not(.post-form-style-float) #qr { right: 0 !important; left: auto !important; } :root:not(.post-form-style-float) #qr { bottom: 0 !important; } .fourchan-ss-navigation.fixed.bottom:not(.post-form-style-float) #qr, .fourchan-ss-navigation.index.pagination-sticky-bottom:not(.post-form-style-float) #qr { bottom: 1.5em !important; } .post-form-style-slideout #qr { top: auto !important; } .post-form-style-slideout.sidebar-location-left #qr { transform: translateX(-93%); } .post-form-style-slideout.sidebar-location-right #qr { transform: translateX(93%); } .post-form-style-slideout #qr:hover, .post-form-style-slideout #qr.has-focus, .post-form-style-slideout #qr.dump { transform: translate(0); } .post-form-style-tabbed-slideout #qr { top: auto !important; } .post-form-style-tabbed-slideout.sidebar-location-left #qr { transform: translateX(-100%); } .post-form-style-tabbed-slideout.sidebar-location-right #qr { transform: translateX(100%); } .post-form-style-tabbed-slideout #qr:hover, .post-form-style-tabbed-slideout #qr.has-focus, .post-form-style-tabbed-slideout #qr.dump { transform: translateX(0); } .post-form-style-tabbed-slideout #qrtab { position: absolute; top: 0; width: 120px; text-align: center; border-width: 1px 1px 0 1px; cursor: default; } .post-form-style-tabbed-slideout.sidebar-location-left #qrtab { transform: rotate(90deg); transform-origin: bottom right; left: 100%; } .post-form-style-tabbed-slideout.sidebar-location-right #qrtab { transform: rotate(-90deg); transform-origin: bottom right; right: 100%; } .post-form-style-tabbed-slideout #qr:hover #qrtab, .post-form-style-tabbed-slideout #qr.has-focus #qrtab, .post-form-style-tabbed-slideout #qr.dump #qrtab { opacity: 0 !important; } .post-form-style-slideout #qrtab input, .post-form-style-slideout #qrtab .rice, .post-form-style-tabbed-slideout #qrtab input, .post-form-style-tabbed-slideout #qrtab .close, .post-form-style-tabbed-slideout #qrtab .rice, .post-form-style-tabbed-slideout #qrtab span { display: none; } .post-form-style-tabbed-slideout #qrtab .selectrice { text-align: center; } .transparent-post-form #qr { opacity: 0.2; transition: opacity .3s ease-in-out 1s; } .transparent-post-form #qr:hover, .transparent-post-form #qr.has-focus, .transparent-post-form #qr.dump { opacity: 1; transition: opacity .3s linear; } :root:not(.show-post-form-header):not(.post-form-style-float):not(.post-form-style-tabbed-slideout) #qrtab, .post-form-style-float .autohide:not(:hover):not(.has-focus) form, .show-post-form-header.post-form-style-fixed .autohide:not(:hover):not(.has-focus) form { display: none !important; } :root:not(.post-form-style-tabbed-slideout) #qrtab { margin-bottom: 1px; } #qr.autohide:not(:hover):not(.has-focus) #qrtab { margin-bottom: 0; } .post-form-slideout-transitions.post-form-style-slideout #qr, .post-form-slideout-transitions.post-form-style-tabbed-slideout #qr { transition: transform .3s ease-in-out 1s; } .post-form-slideout-transitions.post-form-style-tabbed-slideout #qr.dump, .post-form-slideout-transitions.post-form-style-tabbed-slideout #qr:hover, .post-form-slideout-transitions.post-form-style-tabbed-slideout #qr.has-focus, .post-form-slideout-transitions.post-form-style-slideout #qr.dump, .post-form-slideout-transitions.post-form-style-slideout #qr:hover, .post-form-slideout-transitions.post-form-style-slideout #qr.has-focus { transition: transform .3s linear; } .post-form-slideout-transitions #qrtab { transition: opacity .3s ease-in-out 1s; } .post-form-slideout-transitions #qr:hover #qrtab { transition: opacity .3s linear; } #qr .close { float: right; padding: 0 3px; } #qr .warning { min-height: 1.6em; vertical-align: middle; padding: 0 1px; border-width: 1px; border-style: solid; } .persona { width: 248px; max-width: 100%; min-width: 100%; } .persona input.field { width: 100%; } #qr textarea.field { height: 11.6em; min-height: 6em; } #qr.has-captcha textarea.field { height: 6em; } .compact-post-form-inputs .persona input.field { width: 33%; } .compact-post-form-inputs .persona input.field:first-child { margin: 0; } .compact-post-form-inputs .persona input.field { margin: 0 0 0 0.5%; } .compact-post-form-inputs #qr textarea.field { height: 14.9em; min-height: 9em; } .compact-post-form-inputs #qr.has-captcha textarea.field { height: 9em; } .tripcode-hider .tripped:not(:hover):not(:focus) { color: transparent !important; } .textarea-resize-horizontal #qr textarea { resize: horizontal; } .textarea-resize-vertical #qr textarea { resize: vertical; } .textarea-resize-both #qr textarea { resize: both; } .textarea-resize-none #qr textarea { resize: none; } .captcha-img { margin: 1px 0 0; text-align: center; line-height: 0; } .captcha-img img { width: 246px; } .captcha-img, .captcha-img img { height: 4em; } .captcha-input { width: 100%; margin: 1px 0 0; } .field, .selectrice, button, input:not([type=radio]) { -moz-box-sizing: border-box; height: 1.6em; margin: 1px 0 0; vertical-align: bottom; padding: 0 1px; outline: none; } .selectrice { padding-right: 1.6em; } #qr textarea { min-width: 100%; } #qr [type='submit'] { width: 25%; } [type='file'] { position: absolute; opacity: 0; z-index: -1; } /* Fake File Input */ #qr-filename, #qr-filerm, .has-file #qr-no-file { display: none; } #qr-no-file, .has-file #qr-filename { display: block; } .has-file #qr-filerm { display: inline-block; } #qr-extras-container { position: absolute; right: 0; top: 0; z-index: 2; } #qr-extras-container > label, #qr-extras-container > a { cursor: pointer; margin-right: 3px; } #qr-filename-container { -moz-box-sizing: border-box; display: inline-block; position: relative; width: 100px; min-width: 74.6%; max-width: 74.6%; margin-right: 0.4%; overflow: hidden; padding: 2px 1px 0; } /* Thread Select */ #qr-thread-select, #qr-thread-select .selectrice div { display: inline; } #qr-thread-select .selectrice { cursor: pointer; display: inline-block; width: 120px; border: none; background: none transparent; padding: 0; margin: 0; height: auto; } #qr-thread-select .selectrice::before, #qr-thread-select .selectrice::after { display: none; } /* Dumping UI */ .dump #dump-list-container { display: block; } #dump-list-container { display: none; position: relative; overflow-y: hidden; margin-top: 1px; } #dump-list { overflow-x: auto; overflow-y: hidden; white-space: nowrap; width: 248px; max-width: 100%; min-width: 100%; } #dump-list:hover { overflow-x: auto; } .qr-preview { -moz-box-sizing: border-box; counter-increment: thumbnails; cursor: move; display: inline-block; height: 90px; width: 90px; padding: 2px; opacity: .5; overflow: hidden; position: relative; text-shadow: 0 1px 1px #000; transition: opacity .25s ease-in-out; vertical-align: top; } .qr-preview:hover, .qr-preview:focus { opacity: .9; } .qr-preview::before { content: counter(thumbnails); color: #fff; position: absolute; top: 3px; right: 3px; text-shadow: 0 0 3px #000, 0 0 8px #000; } .qr-preview#selected { opacity: 1; } .qr-preview.drag { box-shadow: 0 0 10px rgba(0,0,0,.5); } .qr-preview.over { border-color: #fff; } .qr-preview > span { color: #fff; } .remove { background: none; color: #e00; font-weight: 700; padding: 3px; } a:only-of-type > .remove { display: none; } .remove:hover::after { content: \" Remove\"; } .qr-preview > label { background: rgba(0,0,0,.5); color: #fff; right: 0; bottom: 0; left: 0; position: absolute; text-align: center; } .qr-preview > label > input { margin: 0; } #add-post { cursor: pointer; font-size: 2em; position: absolute; top: 50%; right: 10px; transform: translateY(-50%); } /* Ads */ .fade-ads .topad img, .fade-ads .middlead img, .fade-ads .bottomad img { opacity: 0.3; transition: opacity .3s linear; } .fade-ads .topad img:hover, .fade-ads .middlead img:hover, .fade-ads .bottomad img:hover { opacity: 1; } .hide-ads .bottomad + hr, .hide-ads .topad, .hide-ads .middlead, .hide-ads .bottomad, .hide-ads .ad-plea { display: none; } .shrink-ads .topad a img, .shrink-ads .middlead a img, .shrink-ads .bottomad a img { width: 500px; height: auto; } /* Mascot Positions */ #mascot { display: none; position: fixed; z-index: -1; bottom: 0; left: 0; right: 0; line-height: 0; cursor: pointer; } .mascot-position-above-post-form.post-form-style-fixed:not(.post-form-decorations) #mascot img { margin-bottom: -2px; } .mascots #mascot { display: block; } .sidebar-location-right.mascot-location-sidebar #mascot, .sidebar-location-left.mascot-location-opposite #mascot { left: auto; } .sidebar-location-left.mascot-location-sidebar #mascot, .sidebar-location-right.mascot-location-opposite #mascot { right: auto; } .sidebar-location-left.mascot-location-sidebar #mascot img, .sidebar-location-right.mascot-location-opposite #mascot img { transform: scaleX(-1); } .fourchan-ss-navigation.bottom.fixed #mascot, .fourchan-ss-navigation.index.pagination-sticky-bottom #mascot { bottom: 1.5em } .mascots-overlap-posts #mascot { z-index: 3; } .mascot-position-middle #mascot { bottom: 50% !important; transform: translateY(50%); } .mascot-position-top #mascot { bottom: auto !important; top: 17px; } .grayscale-mascots #mascot { filter: url('#grayscale'); } .silhouettize-mascots #mascot img { filter: url('#mascot-filter'); } /* Options */ #overlay { position: fixed; z-index: 30; top: 0; right: 0; left: 0; bottom: 0; background: rgba(0,0,0,.5); } #appchanx-settings { width: auto; left: 15%; right: 15%; top: 15%; bottom: 15%; position: fixed; z-index: 31; padding: .3em; } .rounded-edges #appchanx-settings, .rounded-edges #appchanx-settings fieldset, .rounded-edges .mascots-container, .rounded-edges .section-container, .rounded-edges .sections-list > a { border-radius: 3px; } .description { display: none; } #appchanx-settings h3, .section-keybinds, .section-mascots, .section-script, .style { text-align: center; } .section-keybinds table, .section-script fieldset, .section-style fieldset { text-align: left; } .section-keybinds table { margin: auto; } #appchanx-settings fieldset { padding: 5px 0; vertical-align: top; border: 0; margin: 0 3px 6px; display: inline-block; } .single-column-mode #appchanx-settings fieldset { display: block; margin: 0 auto 6px; } #appchanx-settings .section-advanced fieldset { display: block; margin: 0 auto 6px; } .section-advanced .archive-cell { min-width: 200px; } .section-advanced .selectrice { display: inline-block; clear: both; } .section-container { overflow: auto; position: absolute; top: 1.7em; right: 5px; bottom: 5px; left: 5px; padding: 5px; } .sections-list { padding: 0 3px; float: left; } .sections-list > a { cursor: pointer; position: relative; padding: 0 4px; z-index: 1; height: 1.4em; display: inline-block; border-width: 1px 1px 0 1px; border-color: transparent; border-style: solid; } .sections-list > a.tab-selected { border-style: solid; } .credits { float: right; } #appchanx-settings h3 { margin: 0; } .section-script fieldset > div, .section-style fieldset > div, .section-advanced fieldset > div { overflow: visible; padding: 0 5px 0 7px; } #appchanx-settings tr:nth-of-type(2n+1), .section-script fieldset > div:nth-of-type(2n+1), .section-advanced fieldset > div:nth-of-type(2n+1), .section-style fieldset > div:nth-of-type(2n+1), .section-keybinds tr:nth-of-type(2n+1), #selectrice li:nth-of-type(2n+1) { background-color: rgba(0, 0, 0, 0.05); } article li { margin: 10px 0 10px 2em; } #appchanx-settings .option { width: 50%; display: inline-block; vertical-align: bottom; } .option input { width: 100%; } .optionlabel { padding-left: 18px; } .rice + .optionlabel { padding-left: 0; } .section-script fieldset, .styleoption { text-align: left; } .section-style fieldset { width: 370px; } .section-script fieldset { width: 200px; } #mascotcontent, #themecontent, .suboptions { overflow: auto; position: absolute; top: 0; right: 0; bottom: 1.7em; left: 0; } #mascotcontent, #themecontent { padding: 5px; } #themecontent { top: 1.8em; } .mAlign { height: 250px; vertical-align: bottom; display: table-cell; line-height: 0; } #save, .stylesettings { position: absolute; right: 10px; bottom: 0; } .section-style .suboptions { bottom: 0; } .section-container textarea { font-family: monospace; min-height: 150px; resize: vertical; width: 100%; } /* Hover Functionality */ #mouseover { z-index: 33; position: fixed; max-width: 70%; } #mouseover:empty { display: none; } /* Mascot Tab */ #mascot_hide { padding: 3px; position: absolute; top: 2px; right: 18px; } #mascot_hide .rice { float: left; } #mascot_hide > div { height: 0; text-align: right; overflow: hidden; } #mascot_hide:hover > div { height: auto; } #mascot_hide label { width: 100%; display: block; clear: both; text-decoration: none; } .mascots-container { padding: 0; text-align: center; } .mascot, .mascotcontainer { overflow: hidden; } .mascot { position: relative; border: none; margin: 5px; padding: 0; width: 200px; display: inline-block; background-color: transparent; } .mascotcontainer { height: 250px; border: 0; margin: 0; max-height: 250px; cursor: pointer; bottom: 0; border-width: 0 1px 1px; border-style: solid; border-color: transparent; overflow: hidden; } .mascot img { max-width: 200px; } .export-button, .mascotname, #mascot-options { -moz-box-sizing: border-box; padding: 0; width: 100%; } #mascot-options { opacity: 0; transition: opacity .3s linear; } .mascot:hover #mascot-options { opacity: 1; } #mascot-options { position: absolute; bottom: 0; right: 0; left: 0; } .export-button { position: absolute; bottom: 1.7em; right: 0; left: 0; text-align: center; } #mascot-options a { display: inline-block; width: 33%; } #upload { position: absolute; width: 100px; left: 50%; margin-left: -50px; text-align: center; bottom: 0; } #mascots_batch { position: absolute; left: 10px; bottom: 0; } /* Themes Tab */ #themes h1 { position: absolute; right: 300px; bottom: 10px; margin: 0; transition: all .2s ease-in-out; opacity: 0; } #themes .selectedtheme h1 { right: 11px; opacity: 1; } #addthemes { position: absolute; left: 10px; bottom: 0; } .theme { margin: 1em; } /* Theme Editor */ #themeConf { position: fixed; top: 0; bottom: 0; width: 296px; z-index: 10; } .sidebar-location-right #themeConf { right: 2px; left: auto; } .sidebar-location-right #themeConf { left: 2px; right: auto; } #themebar input { width: 30%; } .option .color { width: 10%; border-left: none !important; color: transparent !important; } .option .colorfield { width: 90%; } .themevar textarea { min-width: 100%; max-width: 100%; height: 20em; resize: vertical; } /* Mascot Editor */ #mascotConf { position: fixed; height: 17em; bottom: 0; left: 50%; width: 500px; margin-left: -250px; overflow: auto; z-index: 10; } #mascotConf .option, #mascotConf .optionlabel { -moz-box-sizing: border-box; width: 50%; display: inline-block; vertical-align: middle; } #mascotConf .option input { width: 100%; } #close { position: absolute; left: 10px; bottom: 0; } /* Catalog */ #content .navLinks, #info .navLinks, .btn-wrap { display: block; } .navLinks > .btn-wrap:not(:first-of-type)::before { content: ' - '; } .button { cursor: pointer; } #content .btn-wrap, #info .btn-wrap { display: inline-block; } #post-preview, #quote-preview { position: absolute; z-index: 22; } .rounded-edges #post-preview { border-radius: 3px; } #settings, #threads, #info .navLinks, #content .navLinks { text-align: center; } #threads .thread { vertical-align: top; display: inline-block; word-wrap: break-word; overflow: hidden; margin: 1px; padding: 5px 0 3px; text-align: center; } .extended-small .thread, .small .thread { width: 165px; max-height: 320px; } .small .teaser, .large .teaser { display: none; } .extended-large .thread, .large .thread { width: 270px; max-height: 410px; } .extended-small .thumb, .small .thumb { max-width: 150px; max-height: 150px; } .panel { position: fixed; top: 50% !important; left: 50%; transform: translate(-50%, -50%); padding: 5px; } .icon::after { display: inline-block; float: right; width: 1em; cursor: pointer; } .helpIcon::after { content: '?'; } .closeIcon::after { content: '✖'; } /* Front Page */ #logo { text-align: center; } #doc { -moz-box-sizing: border-box; margin: 10px auto; width: 1006px; padding: 2px; position: relative; } .rounded-edges #doc, .rounded-edges #doc div { border-radius: 3px; } #boards .boxcontent { vertical-align: top; text-align: center; } #filter-container, #options-container { top: 4px; right: 8px; position: absolute; } #filtermenu, #optionsmenu { top: 100% !important; left: auto !important; right: 0 !important; } #boards .column { -moz-box-sizing: border-box; display: inline-block; width: 180px; text-align: left; vertical-align: top; } .bd ul, .boxcontent ul { vertical-align: top; padding: 0; margin: 0; } .right-box .boxcontent ul { padding: 0 10px; } .yuimenuitem, .boxcontent li { list-style-type: none; } .boxbar { position: relative; } #doc h3, .boxbar h2 { margin: 0; } #doc h3 { text-decoration: none !important; } .underline-links #doc h3 { text-decoration: underline !important; } #ft, .box-outer { margin: 2px 0 0; overflow: hidden; } #ft, .boxbar, .boxcontent { padding: 0 8px; } .yui-module { position: absolute; } .yuimenuitem::before { content: \" [ ] \"; font-family: monospace; } .yuimenuitem-checked::before { content: \" [x] \" } .yui-g { overflow: hidden; } .yui-u { display: inline-block; vertical-align: top; width: 499px; float: right; } .yui-u.first { float: left; } #recent-images .boxcontent { text-align: center; } #ft { text-align: center; } #ft ul { padding: 0; } #ft li { list-style-type: none; display: inline-block; width: 100px; } #preview-tooltip-nws, #preview-tooltip-ws, #ft .fill, .clear-bug { display: none; } /* ExLinks */ #exlinks-options-content { padding: 5px; }", dynamic: function() { var editSpace, sidebarLocation; @@ -11824,12 +12179,12 @@ replyRGB = "rgb(" + (replybg.shiftRGB(parseInt(Conf['Silhouette Contrast'], 10), true)) + ")"; Style.lightTheme = bgColor.isLight(); Style.svg.innerHTML = "\n\n\n"; - return (".hide_thread_button span > span, .hide_reply_button span > span { background-color: " + theme["Links"] + "; } #mascot_hide label { border-bottom: 1px solid " + theme["Reply Border"] + "; } #content .thumb { box-shadow: 0 0 5px " + theme["Reply Border"] + "; } .export-button, .mascotname, #mascot-options { background: " + theme["Dialog Background"] + "; border: 1px solid " + theme["Buttons Border"] + "; } .highlight-you .opContainer.quotesYou, .highlight-own .opContainer.yourPost, .opContainer.filter-highlight { box-shadow: inset 5px 0 " + theme["Backlinked Reply Outline"] + "; } .highlight-you .quotesYou > .reply, .highlight-own .yourPost > .reply, .filter-highlight > .reply { box-shadow: -5px 0 " + theme["Backlinked Reply Outline"] + "; } hr { border-bottom: 1px solid " + theme["Reply Border"] + "; } hr#unread-line { border-bottom: 1px solid " + theme["Reply Background"] + "; visibility: visible; } .threadContainer { border-color: " + theme["Reply Border"] + " !important; } html { background: " + (backgroundC || '') + "; background-image: " + (theme["Background Image"] || '') + "; background-repeat: " + (theme["Background Repeat"] || '') + "; background-attachment: " + (theme["Background Attachment"] || '') + "; background-position: " + (theme["Background Position"] || '') + "; } .panel, .section-container, #exlinks-options-content, #themecontent { background: " + backgroundC + "; border: 1px solid " + theme["Reply Border"] + "; } .sections-list > a.tab-selected { background: " + backgroundC + "; border-color: " + theme["Reply Border"] + "; } .captcha-img img { filter: url(\"#captcha-filter\"); } #boardTitle { text-shadow: 1px 1px " + backgroundC + ", -1px -1px " + backgroundC + ", 1px -1px " + backgroundC + ", -1px 1px " + backgroundC + "; } .sidebar-glow #boardTitle { text-shadow: 1px 1px 1px " + backgroundC + ", -1px -1px 1px " + backgroundC + ", 1px -1px 1px " + backgroundC + ", -1px 1px 1px " + backgroundC + ", 0 2px 4px rgba(0,0,0,.6), 0 0 10px rgba(0,0,0,.6); } #exlinks-options, #appchanx-settings, #qrtab, input[type=\"submit\"], input[value=\"Report\"], span[style=\"left: 5px; position: absolute;\"] a { background: " + theme["Buttons Background"] + "; border: 1px solid " + theme["Buttons Border"] + "; } .enabled .mascotcontainer { background: " + theme["Buttons Background"] + "; border-color: " + theme["Buttons Border"] + "; } #dump, #qr-filename-container, #appchanx-settings input, .captcha-img, .dump #dump, .qr-preview, .selectrice, button, input, textarea { background: " + theme["Input Background"] + "; border: 1px solid " + theme["Input Border"] + "; } .has-file #qr-extras-container { background: " + theme["Input Background"] + "; } #dump:hover, #qr-filename-container:hover, .selectrice:hover, #selectrice li:hover, #selectrice li:nth-of-type(2n+1):hover, input:hover, textarea:hover { background: " + theme["Hovered Input Background"] + "; border-color: " + theme["Hovered Input Border"] + "; } .has-file #qr-filename-container:hover #qr-extras-container { background: " + theme["Hovered Input Background"] + "; } #dump:active, #dump:focus, #selectrice li:focus, .selectrice:focus, #qr-filename-container:active, #qr-filename-container:focus, input:focus, textarea:focus, textarea.field:focus { background: " + theme["Focused Input Background"] + "; border-color: " + theme["Focused Input Border"] + "; color: " + theme["Inputs"] + "; } .has-file #qr-filename-container:active #qr-extras-container, .has-file #qr-filename-container:focus #qr-extras-container { background: " + theme["Focused Input Background"] + "; } #ft, #mouseover, #post-preview, #qp .post, #threads > .thread, #xupdater, .box-outer, .reply.post { border-width: 1px; border-style: solid; border-color: " + theme["Reply Border"] + "; background: " + theme["Reply Background"] + "; } .exblock.reply, .reply.post.highlight, .reply.post:target { background: " + theme["Highlighted Reply Background"] + "; border: 1px solid " + theme["Highlighted Reply Border"] + "; } #header-bar, .pagelist { background: " + theme["Navigation Background"] + "; border-color: " + theme["Navigation Border"] + "; } #doc, #threads, .board > .thread { background: " + theme["Thread Wrapper Background"] + "; border: 1px solid " + theme["Thread Wrapper Border"] + "; } #boardNavDesktopFoot, #mascot_hide, #menu, #selectrice, #themeConf, #watcher, #watcher:hover, .announcements-slideout #globalMessage, .dialog, .post-form-style-float #qr, .post-form-decorations #qr, .submenu { background: " + theme["Dialog Background"] + "; border: 1px solid " + theme["Dialog Border"] + "; } #qp.dialog { border: none; } .watch-thread-link { background-image: url(\"data:image/svg+xml,\"); } .deleteform::before, .deleteform, #qr .warning { background: " + theme["Input Background"] + "; border-color: " + theme["Input Border"] + "; } .disabledwarning, .warning { color: " + theme["Warnings"] + "; } #charCount { color: " + (Style.lightTheme ? "rgba(0,0,0,0.7)" : "rgba(255,255,255,0.7)") + "; } .postNum a { color: " + theme["Post Numbers"] + "; } .subject { color: " + theme["Subjects"] + " !important; } .dateTime, .post-ago { color: " + theme["Timestamps"] + " !important; } #fs_status a, #updater #update-status:not(.new)::after, #showQR, .abbr, .boxbar, .boxcontent, .deleteform::before, .pages strong, .pln, .reply, .reply.highlight, .summary, body, button, span[style=\"left: 5px; position: absolute;\"] a, input, textarea { color: " + theme["Text"] + "; } #exlinks-options-content > table, #appchanx-settings fieldset, #selectrice { border-bottom: 1px solid " + theme["Reply Border"] + "; box-shadow: inset " + theme["Shadow Color"] + " 0 0 5px; } .quote + .spoiler:hover, .quote { color: " + theme["Greentext"] + "; } .forwardlink { border-bottom: 1px dashed " + theme["Backlinks"] + "; } .container::before { color: " + theme["Timestamps"] + "; } .quote-shadows #menu, .quote-shadows #post-preview, .quote-shadows #qp .opContainer, .quote-shadows #qp .replyContainer, .quote-shadows .submenu { box-shadow: 5px 5px 5px " + theme['Shadow Color'] + "; } .rice { background: " + theme["Checkbox Background"] + "; border: 1px solid " + theme["Checkbox Border"] + "; } .selectrice::before { border-left: 1px solid " + theme["Input Border"] + "; } .selectrice::after { border-top: .45em solid " + theme["Inputs"] + "; } .bd { background: " + theme["Buttons Background"] + "; border: 1px solid " + theme["Buttons Border"] + "; } .pages a, #header-bar a { color: " + theme["Navigation Links"] + "; } input[type=checkbox]:checked + .rice::after { border-color: " + theme["Inputs"] + "; } #addReply, #dump, .button, .entry, .replylink, a { color: " + theme["Links"] + "; } .backlink { color: " + theme["Backlinks"] + "; } .qiQuote, .quotelink { color: " + theme["Quotelinks"] + "; } #addReply:hover, #dump:hover, .entry:hover, .replylink:hover, .qiQuote:hover, .quotelink:hover, a .name:hover, a .postertrip:hover, a:hover { color: " + theme["Hovered Links"] + "; } #header-bar a:hover, #boardTitle a:hover { color: " + theme["Hovered Navigation Links"] + "; } #boardTitle { color: " + theme["Board Title"] + "; } .name, .post-author { color: " + theme["Names"] + " !important; } .post-tripcode, .postertrip, .trip { color: " + theme["Tripcodes"] + " !important; } a .postertrip, a .name { color: " + theme["Emails"] + "; } .post.reply.qphl, .post.op.qphl { border-color: " + theme["Backlinked Reply Outline"] + "; background: " + theme["Highlighted Reply Background"] + "; } .quote-shadows .inline .post { box-shadow: 5px 5px 5px " + theme['Shadow Color'] + "; } .placeholder, #qr input::placeholder, #qr textarea::placeholder { color: " + (Style.lightTheme ? "rgba(0,0,0,0.3)" : "rgba(255,255,255,0.2)") + " !important; } #qr input:placeholder, #qr textarea:placeholder, .placeholder { color: " + (Style.lightTheme ? "rgba(0,0,0,0.3)" : "rgba(255,255,255,0.2)") + " !important; } #appchanx-settings fieldset, .boxcontent dd, .selectrice ul { border-color: " + (Style.lightTheme ? "rgba(0,0,0,0.1)" : "rgba(255,255,255,0.1)") + "; } #appchanx-settings li, #selectrice li:not(:first-of-type) { border-top: 1px solid " + (Style.lightTheme ? "rgba(0,0,0,0.05)" : "rgba(255,255,255,0.025)") + "; } #navtopright .exlinksOptionsLink::after, #main-menu, .navLinks > a:first-of-type::after, #watcher::after, #globalMessage::after, #boardNavDesktopFoot::after, #img-controls, #catalog::after, #fappeTyme { " + (!Style.lightTheme ? "filter: url(\"#icons-filter\");" : "") + " } .alternate-post-colors #threads > .thread:nth-of-type(2n+1), .alternate-post-colors .replyContainer:nth-of-type(2n+1) .post { background-image: linear-gradient(" + (replybg ? "rgba(" + (replybg.shiftRGB(-4, false)) + ",0.8), rgba(" + (replybg.shiftRGB(-4, false)) + ",0.8)" : Style.lightTheme ? "rgba(0,0,0,0.05), rgba(0,0,0,0.05)" : "rgba(255,255,255,0.02), rgba(255,255,255,0.02)") + "); } .color-reply-headings .boxbar, .color-reply-headings .postInfo { background: " + (replybg ? "rgba(" + (replybg.shiftRGB(-12, false)) + ",0.8)" : "rgba(0,0,0,0.1)") + "; border-bottom: 1px solid " + theme["Reply Border"] + " } .color-file-info .file { background: " + (replybg ? "rgba(" + (replybg.shiftRGB(-8, false)) + ",0.8)" : "rgba(0,0,0,0.1)") + "; border-bottom: 1px solid " + theme["Reply Border"] + " border-top: 1px solid " + theme["Reply Border"] + " } .color-reply.headings.color-file-info { border-top: none; } .op-background .op.post { background: " + theme["Reply Background"] + "; border: 1px solid " + theme["Reply Border"] + "; } .op-background .op.post:target .op-background .op.post.highlight { background: " + theme["Highlighted Reply Background"] + "; border: 1px solid " + theme["Highlighted Reply Border"] + "; } .fourchan-banner-at-sidebar-top.icon-orientation-vertical body::after { background: " + backgroundC + "; } .fourchan-banner-at-sidebar-top.icon-orientation-vertical.fourchan-ss-sidebar body::after, .fourchan-banner-at-sidebar-top.fourchan-ss-sidebar body::before { background: rgba(" + ((background = new Style.color(Style.colorToHex(theme["Reply Background"]))) ? background.shiftRGB(-18) : void 0) + ", 0.8); } .fourchan-ss-sidebar.sidebar-location-right body::before { border-left: 2px solid " + backgroundC + "; box-shadow: inset 1px 0 0 " + theme["Reply Border"] + ", -1px 0 0 " + theme["Reply Border"] + "; } .fourchan-ss-sidebar.sidebar-location-left body::before { border-right: 2px solid " + backgroundC + "; box-shadow: 1px 0 0 " + theme["Reply Border"] + ", inset -1px 0 0 " + theme["Reply Border"] + "; } .sage-highlighting-text.sage-highlight-position-before a.useremail[href*=\"sage\"]:last-of-type::before, .sage-highlighting-text.sage-highlight-position-before a.useremail[href*=\"Sage\"]:last-of-type::before, .sage-highlighting-text.sage-highlight-position-before a.useremail[href*=\"SAGE\"]:last-of-type::before, .sage-highlighting-text.sage-highlight-position-after a.useremail[href*=\"sage\"]:last-of-type::after, .sage-highlighting-text.sage-highlight-position-after a.useremail[href*=\"Sage\"]:last-of-type::after, .sage-highlighting-text.sage-highlight-position-after a.useremail[href*=\"SAGE\"]:last-of-type::after { content: \" (sage) \"; color: " + theme["Sage"] + "; } .quote-shadows #qr { box-shadow: 5px 5px 5px " + theme['Shadow Color'] + "; } " + (theme["Custom CSS"].replace(/\s+/g, ' ').trim())) + ("" + (Style.lightTheme ? " .prettyprint { background-color: #e7e7e7; border: 1px solid #dcdcdc; } .com { color: #dd0000; } .str, .atv { color: #7fa61b; } .pun { color: #61663a; } .tag { color: #117743; } .kwd { color: #5a6F9e; } .typ, .atn { color: #9474bd; } .lit { color: #368c72; } " : " .prettyprint { background-color: rgba(0,0,0,.1); border: 1px solid rgba(0,0,0,0.5); } .tag { color: #96562c; } .pun { color: #5b6f2a; } .com { color: #a34443; } .str, .atv { color: #8ba446; } .kwd { color: #987d3e; } .typ, .atn { color: #897399; } .lit { color: #558773; } ")); + return (".hide_thread_button span > span, .hide_reply_button span > span { background-color: " + theme["Links"] + "; } #mascot_hide label { border-bottom: 1px solid " + theme["Reply Border"] + "; } #content .thumb { box-shadow: 0 0 5px " + theme["Reply Border"] + "; } .export-button, .mascotname, #mascot-options { background: " + theme["Dialog Background"] + "; border: 1px solid " + theme["Buttons Border"] + "; } .highlight-you .opContainer.quotesYou, .highlight-own .opContainer.yourPost, .opContainer.filter-highlight { box-shadow: inset 5px 0 " + theme["Backlinked Reply Outline"] + "; } .highlight-you .quotesYou > .reply, .highlight-own .yourPost > .reply, .filter-highlight > .reply { box-shadow: -5px 0 " + theme["Backlinked Reply Outline"] + "; } hr { border-bottom: 1px solid " + theme["Reply Border"] + "; } hr#unread-line { border-bottom: 1px solid " + theme["Reply Background"] + "; visibility: visible; } .threadContainer { border-color: " + theme["Reply Border"] + " !important; } html { background: " + (backgroundC || '') + "; background-image: " + (theme["Background Image"] || '') + "; background-repeat: " + (theme["Background Repeat"] || '') + "; background-attachment: " + (theme["Background Attachment"] || '') + "; background-position: " + (theme["Background Position"] || '') + "; } .panel, .section-container, #exlinks-options-content, #themecontent { background: " + backgroundC + "; border: 1px solid " + theme["Reply Border"] + "; } .sections-list > a.tab-selected { background: " + backgroundC + "; border-color: " + theme["Reply Border"] + "; } .captcha-img img { filter: url(\"#captcha-filter\"); } #boardTitle { text-shadow: 1px 1px " + backgroundC + ", -1px -1px " + backgroundC + ", 1px -1px " + backgroundC + ", -1px 1px " + backgroundC + "; } .sidebar-glow #boardTitle { text-shadow: 1px 1px 1px " + backgroundC + ", -1px -1px 1px " + backgroundC + ", 1px -1px 1px " + backgroundC + ", -1px 1px 1px " + backgroundC + ", 0 2px 4px rgba(0,0,0,.6), 0 0 10px rgba(0,0,0,.6); } #exlinks-options, #appchanx-settings, #qrtab, input[type=\"submit\"], input[value=\"Report\"], span[style=\"left: 5px; position: absolute;\"] a { background: " + theme["Buttons Background"] + "; border: 1px solid " + theme["Buttons Border"] + "; } .enabled .mascotcontainer { background: " + theme["Buttons Background"] + "; border-color: " + theme["Buttons Border"] + "; } #dump, #qr-filename-container, #appchanx-settings input, .captcha-img, .dump #dump, .qr-preview, .selectrice, button, input, textarea { background: " + theme["Input Background"] + "; border: 1px solid " + theme["Input Border"] + "; } .has-file #qr-extras-container { background: " + theme["Input Background"] + "; } #dump:hover, #qr-filename-container:hover, .selectrice:hover, #selectrice li:hover, #selectrice li:nth-of-type(2n+1):hover, input:hover, textarea:hover { background: " + theme["Hovered Input Background"] + "; border-color: " + theme["Hovered Input Border"] + "; } .has-file #qr-filename-container:hover #qr-extras-container { background: " + theme["Hovered Input Background"] + "; } #dump:active, #dump:focus, #selectrice li:focus, .selectrice:focus, #qr-filename-container:active, #qr-filename-container:focus, input:focus, textarea:focus, textarea.field:focus { background: " + theme["Focused Input Background"] + "; border-color: " + theme["Focused Input Border"] + "; color: " + theme["Inputs"] + "; } .has-file #qr-filename-container:active #qr-extras-container, .has-file #qr-filename-container:focus #qr-extras-container { background: " + theme["Focused Input Background"] + "; } #ft, #mouseover, #post-preview, #qp .post, #threads > .thread, #xupdater, .box-outer, .reply.post { border-width: 1px; border-style: solid; border-color: " + theme["Reply Border"] + "; background: " + theme["Reply Background"] + "; } .exblock.reply, .reply.post.highlight, .reply.post:target { background: " + theme["Highlighted Reply Background"] + "; border: 1px solid " + theme["Highlighted Reply Border"] + "; } #header-bar, .pagelist { background: " + theme["Navigation Background"] + "; border-color: " + theme["Navigation Border"] + "; } #doc, #threads, .board > .thread { background: " + theme["Thread Wrapper Background"] + "; border: 1px solid " + theme["Thread Wrapper Border"] + "; } #boardNavDesktopFoot, #mascot_hide, #menu, #selectrice, #themeConf, #thread-watcher, #thread-watcher:hover, .announcements-slideout #globalMessage, .dialog, .post-form-style-float #qr, .post-form-decorations #qr, .submenu { background: " + theme["Dialog Background"] + "; border: 1px solid " + theme["Dialog Border"] + "; } #qp.dialog { border: none; } .watch-thread-link { background-image: url(\"data:image/svg+xml,\"); } .deleteform::before, .deleteform, #qr .warning { background: " + theme["Input Background"] + "; border-color: " + theme["Input Border"] + "; } .disabledwarning, .warning { color: " + theme["Warnings"] + "; } #charCount { color: " + (Style.lightTheme ? "rgba(0,0,0,0.7)" : "rgba(255,255,255,0.7)") + "; } .postNum a { color: " + theme["Post Numbers"] + "; } .subject { color: " + theme["Subjects"] + " !important; } .dateTime, .post-ago { color: " + theme["Timestamps"] + " !important; } #fs_status a, #updater #update-status:not(.new)::after, #showQR, .abbr, .boxbar, .boxcontent, .deleteform::before, .pages strong, .pln, .reply, .reply.highlight, .summary, body, button, span[style=\"left: 5px; position: absolute;\"] a, input, textarea { color: " + theme["Text"] + "; } #exlinks-options-content > table, #appchanx-settings fieldset, #selectrice { border-bottom: 1px solid " + theme["Reply Border"] + "; box-shadow: inset " + theme["Shadow Color"] + " 0 0 5px; } .quote + .spoiler:hover, .quote { color: " + theme["Greentext"] + "; } .forwardlink { border-bottom: 1px dashed " + theme["Backlinks"] + "; } .container::before { color: " + theme["Timestamps"] + "; } .quote-shadows #menu, .quote-shadows #post-preview, .quote-shadows #qp .opContainer, .quote-shadows #qp .replyContainer, .quote-shadows .submenu { box-shadow: 5px 5px 5px " + theme['Shadow Color'] + "; } .rice { background: " + theme["Checkbox Background"] + "; border: 1px solid " + theme["Checkbox Border"] + "; } .selectrice::before { border-left: 1px solid " + theme["Input Border"] + "; } .selectrice::after { border-top: .45em solid " + theme["Inputs"] + "; } .bd { background: " + theme["Buttons Background"] + "; border: 1px solid " + theme["Buttons Border"] + "; } .pages a, #header-bar a { color: " + theme["Navigation Links"] + "; } input[type=checkbox]:checked + .rice::after { border-color: " + theme["Inputs"] + "; } #addReply, #dump, .button, .entry, .replylink, a { color: " + theme["Links"] + "; } .backlink { color: " + theme["Backlinks"] + "; } .qiQuote, .quotelink { color: " + theme["Quotelinks"] + "; } #addReply:hover, #dump:hover, .entry:hover, .replylink:hover, .qiQuote:hover, .quotelink:hover, a .name:hover, a .postertrip:hover, a:hover { color: " + theme["Hovered Links"] + "; } #header-bar a:hover, #boardTitle a:hover { color: " + theme["Hovered Navigation Links"] + "; } #boardTitle { color: " + theme["Board Title"] + "; } .name, .post-author { color: " + theme["Names"] + " !important; } .post-tripcode, .postertrip, .trip { color: " + theme["Tripcodes"] + " !important; } a .postertrip, a .name { color: " + theme["Emails"] + "; } .post.reply.qphl, .post.op.qphl { border-color: " + theme["Backlinked Reply Outline"] + "; background: " + theme["Highlighted Reply Background"] + "; } .quote-shadows .inline .post { box-shadow: 5px 5px 5px " + theme['Shadow Color'] + "; } .placeholder, #qr input::placeholder, #qr textarea::placeholder { color: " + (Style.lightTheme ? "rgba(0,0,0,0.3)" : "rgba(255,255,255,0.2)") + " !important; } #qr input:placeholder, #qr textarea:placeholder, .placeholder { color: " + (Style.lightTheme ? "rgba(0,0,0,0.3)" : "rgba(255,255,255,0.2)") + " !important; } #appchanx-settings fieldset, .boxcontent dd, .selectrice ul { border-color: " + (Style.lightTheme ? "rgba(0,0,0,0.1)" : "rgba(255,255,255,0.1)") + "; } #appchanx-settings li, #selectrice li:not(:first-of-type) { border-top: 1px solid " + (Style.lightTheme ? "rgba(0,0,0,0.05)" : "rgba(255,255,255,0.025)") + "; } #navtopright .exlinksOptionsLink::after, #main-menu, .navLinks > a:first-of-type::after, #thread-watcher::after, #globalMessage::after, #boardNavDesktopFoot::after, #img-controls, #catalog::after, #fappeTyme { " + (!Style.lightTheme ? "filter: url(\"#icons-filter\");" : "") + " } .alternate-post-colors #threads > .thread:nth-of-type(2n+1), .alternate-post-colors .replyContainer:nth-of-type(2n+1) .post { background-image: linear-gradient(" + (replybg ? "rgba(" + (replybg.shiftRGB(-4, false)) + ",0.8), rgba(" + (replybg.shiftRGB(-4, false)) + ",0.8)" : Style.lightTheme ? "rgba(0,0,0,0.05), rgba(0,0,0,0.05)" : "rgba(255,255,255,0.02), rgba(255,255,255,0.02)") + "); } .color-reply-headings .boxbar, .color-reply-headings .postInfo { background: " + (replybg ? "rgba(" + (replybg.shiftRGB(-12, false)) + ",0.8)" : "rgba(0,0,0,0.1)") + "; border-bottom: 1px solid " + theme["Reply Border"] + " } .color-file-info .file { background: " + (replybg ? "rgba(" + (replybg.shiftRGB(-8, false)) + ",0.8)" : "rgba(0,0,0,0.1)") + "; border-bottom: 1px solid " + theme["Reply Border"] + " border-top: 1px solid " + theme["Reply Border"] + " } .color-reply.headings.color-file-info { border-top: none; } .op-background .op.post { background: " + theme["Reply Background"] + "; border: 1px solid " + theme["Reply Border"] + "; } .op-background .op.post:target .op-background .op.post.highlight { background: " + theme["Highlighted Reply Background"] + "; border: 1px solid " + theme["Highlighted Reply Border"] + "; } .fourchan-banner-at-sidebar-top.icon-orientation-vertical body::after { background: " + backgroundC + "; } .fourchan-banner-at-sidebar-top.icon-orientation-vertical.fourchan-ss-sidebar body::after, .fourchan-banner-at-sidebar-top.fourchan-ss-sidebar body::before { background: rgba(" + ((background = new Style.color(Style.colorToHex(theme["Reply Background"]))) ? background.shiftRGB(-18) : void 0) + ", 0.8); } .fourchan-ss-sidebar.sidebar-location-right body::before { border-left: 2px solid " + backgroundC + "; box-shadow: inset 1px 0 0 " + theme["Reply Border"] + ", -1px 0 0 " + theme["Reply Border"] + "; } .fourchan-ss-sidebar.sidebar-location-left body::before { border-right: 2px solid " + backgroundC + "; box-shadow: 1px 0 0 " + theme["Reply Border"] + ", inset -1px 0 0 " + theme["Reply Border"] + "; } .sage-highlighting-text.sage-highlight-position-before a.useremail[href*=\"sage\"]:last-of-type::before, .sage-highlighting-text.sage-highlight-position-before a.useremail[href*=\"Sage\"]:last-of-type::before, .sage-highlighting-text.sage-highlight-position-before a.useremail[href*=\"SAGE\"]:last-of-type::before, .sage-highlighting-text.sage-highlight-position-after a.useremail[href*=\"sage\"]:last-of-type::after, .sage-highlighting-text.sage-highlight-position-after a.useremail[href*=\"Sage\"]:last-of-type::after, .sage-highlighting-text.sage-highlight-position-after a.useremail[href*=\"SAGE\"]:last-of-type::after { content: \" (sage) \"; color: " + theme["Sage"] + "; } .quote-shadows #qr { box-shadow: 5px 5px 5px " + theme['Shadow Color'] + "; } " + (theme["Custom CSS"].replace(/\s+/g, ' ').trim())) + ("" + (Style.lightTheme ? " .prettyprint { background-color: #e7e7e7; border: 1px solid #dcdcdc; } .com { color: #dd0000; } .str, .atv { color: #7fa61b; } .pun { color: #61663a; } .tag { color: #117743; } .kwd { color: #5a6F9e; } .typ, .atn { color: #9474bd; } .lit { color: #368c72; } " : " .prettyprint { background-color: rgba(0,0,0,.1); border: 1px solid rgba(0,0,0,0.5); } .tag { color: #96562c; } .pun { color: #5b6f2a; } .com { color: #a34443; } .str, .atv { color: #8ba446; } .kwd { color: #987d3e; } .typ, .atn { color: #897399; } .lit { color: #558773; } ")); }, iconPositions: function() { var align, aligner, css, i, iconOffset, navlinks, notCatalog, notEither, position, psa, sidebar; - css = "#navtopright .exlinksOptionsLink::after, #main-menu, body > div.navLinks > a:first-of-type::after, .slideout-watcher #watcher::after, .announcements-slideout #globalMessage::after, #boardNavDesktopFoot::after, #img-controls, #catalog::after, #fappeTyme { z-index: 18; position: fixed; display: block; width: 15px; height: 15px; content: \"\"; opacity: 0.5; } body::after { content: \"\"; display: block; position: fixed; z-index: 5; width: 18px; height: 18px; } .invisible-icons #navtopright .exlinksOptionsLink::after, .invisible-icons #main-menu, .invisible-icons body > div.navLinks > a:first-of-type::after, .invisible-icons.slideout-watcher #watcher::after, .invisible-icons.announcements-slideout #globalMessage::after, .invisible-icons #boardNavDesktopFoot::after, .invisible-icons #img-controls, .invisible-icons #catalog::after, .invisible-icons #fappeTyme { opacity: 0; } #navtopright .exlinksOptionsLink, body > div.navLinks > a:first-of-type, " + (Conf['Slideout Watcher'] ? '#watcher,' : '') + " " + (Conf['Announcements'] === 'slideout' ? '#globalMessage,' : '') + " #boardNavDesktopFoot, #catalog { z-index: 16; } #navtopright .exlinksOptionsLink:hover, body > div.navLinks > a:first-of-type:hover, .slideout-watcher #watcher:hover, .announcements-slideout #globalMessage:hover, #boardNavDesktopFoot:hover, #img-controls, #catalog:hover { z-index: 17; } #main-menu { visibility: visible; background-position: 0 0; cursor: pointer; } body > div.navLinks > a:first-of-type::after { cursor: pointer; background-position: 0 -15px; } .slideout-watcher #watcher::after { background-position: 0 -30px; } .announcements-slideout #globalMessage::after { background-position: 0 -45px; } #boardNavDesktopFoot::after { background-position: 0 -60px; } #img-controls { background-position: 0 -90px; } #navtopright .exlinksOptionsLink::after { background-position: 0 -105px; } #catalog::after { visibility: visible; background-position: 0 -120px; } #fappeTyme { background-position: 0 -135px; } #boardNavDesktopFoot:hover::after, .announcements-slideout #globalMessage:hover::after, #img-controls:hover, #navlinks a:hover, #appchanOptions:hover, #main-menu:hover, #navtopright .exlinksOptionsLink:hover::after, #qr #qrtab, .slideout-watcher #watcher:hover::after, .thumbnail#selected, div.navLinks > a:first-of-type:hover::after, #catalog:hover::after, #fappeTyme:hover { opacity: 1 !important; }"; + css = "#navtopright .exlinksOptionsLink::after, #main-menu, body > div.navLinks > a:first-of-type::after, .slideout-watcher #thread-watcher::after, .announcements-slideout #globalMessage::after, #boardNavDesktopFoot::after, #img-controls, #catalog::after, #fappeTyme { z-index: 18; position: fixed; display: block; width: 15px; height: 15px; content: \"\"; opacity: 0.5; } body::after { content: \"\"; display: block; position: fixed; z-index: 5; width: 18px; height: 18px; } .invisible-icons #navtopright .exlinksOptionsLink::after, .invisible-icons #main-menu, .invisible-icons body > div.navLinks > a:first-of-type::after, .invisible-icons.slideout-watcher #thread-watcher::after, .invisible-icons.announcements-slideout #globalMessage::after, .invisible-icons #boardNavDesktopFoot::after, .invisible-icons #img-controls, .invisible-icons #catalog::after, .invisible-icons #fappeTyme { opacity: 0; } #navtopright .exlinksOptionsLink, body > div.navLinks > a:first-of-type, " + (Conf['Slideout Watcher'] ? '#thread-watcher,' : '') + " " + (Conf['Announcements'] === 'slideout' ? '#globalMessage,' : '') + " #boardNavDesktopFoot, #catalog { z-index: 16; } #navtopright .exlinksOptionsLink:hover, body > div.navLinks > a:first-of-type:hover, .slideout-watcher #thread-watcher:hover, .announcements-slideout #globalMessage:hover, #boardNavDesktopFoot:hover, #img-controls, #catalog:hover { z-index: 17; } #main-menu { visibility: visible; background-position: 0 0; cursor: pointer; } body > div.navLinks > a:first-of-type::after { cursor: pointer; background-position: 0 -15px; } .slideout-watcher #thread-watcher::after { background-position: 0 -30px; } .announcements-slideout #globalMessage::after { background-position: 0 -45px; } #boardNavDesktopFoot::after { background-position: 0 -60px; } #img-controls { background-position: 0 -90px; } #navtopright .exlinksOptionsLink::after { background-position: 0 -105px; } #catalog::after { visibility: visible; background-position: 0 -120px; } #fappeTyme { background-position: 0 -135px; } #boardNavDesktopFoot:hover::after, .announcements-slideout #globalMessage:hover::after, #img-controls:hover, #navlinks a:hover, #appchanOptions:hover, #main-menu:hover, #navtopright .exlinksOptionsLink:hover::after, #qr #qrtab, .slideout-watcher #thread-watcher:hover::after, .thumbnail#selected, div.navLinks > a:first-of-type:hover::after, #catalog:hover::after, #fappeTyme:hover { opacity: 1 !important; }"; i = 0; align = Conf['Sidebar Location']; sidebar = { @@ -11856,14 +12211,14 @@ if (iconOffset < 0) { iconOffset = 0; } - css += "body::after { " + align + ": " + (position[i] - 1) + "px; } /* Appchan X Options */ #main-menu { " + align + ": " + position[i++] + "px; } /* Slideout Navigation */ #boardNavDesktopFoot::after { " + align + ": " + position[i++] + "px; } /* Global Message */ .announcements-slideout #globalMessage::after { " + align + ": " + position[i++] + "px; } /* Watcher */ .slideout-watcher #watcher::after { " + align + ": " + position[i++] + "px; } /* ExLinks */ #navtopright .exlinksOptionsLink::after { " + align + ": " + position[i++] + "px; } /* Expand Images */ #img-controls { " + align + ": " + position[i++] + "px; } /* 4chan Catalog */ #catalog::after { " + align + ": " + position[i++] + "px; } /* Back */ div.navLinks > a:first-of-type::after { " + align + ": " + position[i++] + "px; } /* Fappe Tyme */ #fappeTyme { " + align + ": " + position[i++] + "px; } /* Thread Navigation Links */ #navlinks a { margin: 2px; top: 1px; } #navlinks a:last-of-type { " + align + ": " + position[i++] + "px; } #navlinks a:first-of-type { " + align + ": " + position[i++] + "px; } body::after { width: " + (position[i] - 2) + "px; top: 0; } #boardNavDesktopFoot::after, #navtopright .exlinksOptionsLink::after, #main-menu, .slideout-watcher #watcher::after, .announcements-slideout #globalMessage::after, #img-controls, #fappeTyme, div.navLinks > a:first-of-type::after, #catalog::after { top: 1px !important; } .slideout-watcher #globalMessage, .slideout-watcher #watcher, #boardNavDesktopFoot { top: 16px !important; } .fourchan-ss-navigation.fixed.top #header-bar, .fourchan-ss-navigation.pagination-top .pagelist, .fourchan-ss-navigation.pagination-sticky-top .pagelist { padding-" + align + ": " + iconOffset + "px; } .fixed.top:not(.fourchan-ss-navigation) #header-bar, .pagination-top:not(.fourchan-ss-navigation) .pagelist, .pagination-sticky-top:not(.fourchan-ss-navigation) .pagelist { margin-" + align + ": " + iconOffset + "px; }"; + css += "body::after { " + align + ": " + (position[i] - 1) + "px; } /* Appchan X Options */ #main-menu { " + align + ": " + position[i++] + "px; } /* Slideout Navigation */ #boardNavDesktopFoot::after { " + align + ": " + position[i++] + "px; } /* Global Message */ .announcements-slideout #globalMessage::after { " + align + ": " + position[i++] + "px; } /* Watcher */ .slideout-watcher #thread-watcher::after { " + align + ": " + position[i++] + "px; } /* ExLinks */ #navtopright .exlinksOptionsLink::after { " + align + ": " + position[i++] + "px; } /* Expand Images */ #img-controls { " + align + ": " + position[i++] + "px; } /* 4chan Catalog */ #catalog::after { " + align + ": " + position[i++] + "px; } /* Back */ div.navLinks > a:first-of-type::after { " + align + ": " + position[i++] + "px; } /* Fappe Tyme */ #fappeTyme { " + align + ": " + position[i++] + "px; } /* Thread Navigation Links */ #navlinks a { margin: 2px; top: 1px; } #navlinks a:last-of-type { " + align + ": " + position[i++] + "px; } #navlinks a:first-of-type { " + align + ": " + position[i++] + "px; } body::after { width: " + (position[i] - 2) + "px; top: 0; } #boardNavDesktopFoot::after, #navtopright .exlinksOptionsLink::after, #main-menu, .slideout-watcher #thread-watcher::after, .announcements-slideout #globalMessage::after, #img-controls, #fappeTyme, div.navLinks > a:first-of-type::after, #catalog::after { top: 1px !important; } .slideout-watcher #globalMessage, .slideout-watcher #thread-watcher, #boardNavDesktopFoot { top: 16px !important; } .fourchan-ss-navigation.fixed.top #header-bar, .fourchan-ss-navigation.pagination-top .pagelist, .fourchan-ss-navigation.pagination-sticky-top .pagelist { padding-" + align + ": " + iconOffset + "px; } .fixed.top:not(.fourchan-ss-navigation) #header-bar, .pagination-top:not(.fourchan-ss-navigation) .pagelist, .pagination-sticky-top:not(.fourchan-ss-navigation) .pagelist { margin-" + align + ": " + iconOffset + "px; }"; } else { position = aligner(2, [notEither && Conf['Image Expansion'], true, Conf['Slideout Navigation'] !== 'hide', Conf['Announcements'] === 'slideout' && (psa = $('#globalMessage', d.body)) && !psa.hidden, Conf['Thread Watcher'] && Conf['Slideout Watcher'], $('#navtopright .exlinksOptionsLink', d.body), notEither, g.VIEW === 'thread', notEither && Conf['Fappe Tyme'], navlinks = ((g.VIEW !== 'thread' && Conf['Index Navigation']) || (g.VIEW === 'thread' && Conf['Reply Navigation'])) && notCatalog, navlinks]); iconOffset = (20 + (g.VIEW === 'thread' && Conf['Updater Position'] === 'top' ? 100 : 0)) - (Conf['4chan SS Navigation'] ? 0 : sidebar + parseInt(Conf[align.charAt(0).toUpperCase() + align.slice(1) + " Thread Padding"], 10)); if (iconOffset < 0) { iconOffset = 0; } - css += "/* Expand Images */ body::after { top: " + (position[i] - 1) + "px; } #img-controls { top: " + position[i++] + "px; } /* Appchan X Options */ #main-menu { top: " + position[i++] + "px; } /* Slideout Navigation */ #boardNavDesktopFoot, #boardNavDesktopFoot::after { top: " + position[i++] + "px; } /* Global Message */ .announcements-slideout #globalMessage, .announcements-slideout #globalMessage::after { top: " + position[i++] + "px; } /* Watcher */ .slideout-watcher #watcher, .slideout-watcher #watcher::after { top: " + position[i++] + "px !important; } /* ExLinks */ #navtopright .exlinksOptionsLink::after { top: " + position[i++] + "px; } /* 4chan Catalog */ #catalog::after { top: " + position[i++] + "px; } /* Back */ div.navLinks > a:first-of-type::after { top: " + position[i++] + "px; } /* Fappe Tyme */ #fappeTyme { top: " + position[i++] + "px; } /* Thread Navigation Links */ #navlinks a:first-of-type { top: " + position[i++] + "px !important; } #navlinks a:last-of-type { top: " + position[i++] + "px !important; } body::after { height: " + (position[i] - 2) + "px; " + align + ": 2px; } #navlinks a, #navtopright .exlinksOptionsLink::after, #main-menu, #boardNavDesktopFoot::after, #globalMessage::after, #img-controls, #fappeTyme, .slideout-watcher #watcher::after, #catalog::after, div.navLinks > a:first-of-type::after { " + align + ": 3px !important; } #boardNavDesktopFoot, #globalMessage, .slideout-watcher #watcher.dialog { -moz-box-sizing: border-box; width: 232px !important; " + align + ": 18px !important; } .sidebar-large #boardNavDesktopFoot, .sidebar-large #globalMessage, .sidebar-large #watcher { width: 288px !important; } .fourchan-ss-navigation.fixed.top #header-bar, .fourchan-ss-navigation.pagination-top .pagelist, .fourchan-ss-navigation.pagination-sticky-top .pagelist { padding-" + align + ": " + iconOffset + "px; } .fixed.top:not(.fourchan-ss-navigation) #header-bar, .pagination-top:not(.fourchan-ss-navigation) .pagelist, .pagination-sticky-top:not(.fourchan-ss-navigation) .pagelist { margin-" + align + ": " + iconOffset + "px; }"; + css += "/* Expand Images */ body::after { top: " + (position[i] - 1) + "px; } #img-controls { top: " + position[i++] + "px; } /* Appchan X Options */ #main-menu { top: " + position[i++] + "px; } /* Slideout Navigation */ #boardNavDesktopFoot, #boardNavDesktopFoot::after { top: " + position[i++] + "px; } /* Global Message */ .announcements-slideout #globalMessage, .announcements-slideout #globalMessage::after { top: " + position[i++] + "px; } /* Watcher */ .slideout-watcher #thread-watcher, .slideout-watcher #thread-watcher::after { top: " + position[i++] + "px !important; } /* ExLinks */ #navtopright .exlinksOptionsLink::after { top: " + position[i++] + "px; } /* 4chan Catalog */ #catalog::after { top: " + position[i++] + "px; } /* Back */ div.navLinks > a:first-of-type::after { top: " + position[i++] + "px; } /* Fappe Tyme */ #fappeTyme { top: " + position[i++] + "px; } /* Thread Navigation Links */ #navlinks a:first-of-type { top: " + position[i++] + "px !important; } #navlinks a:last-of-type { top: " + position[i++] + "px !important; } body::after { height: " + (position[i] - 2) + "px; " + align + ": 2px; } #navlinks a, #navtopright .exlinksOptionsLink::after, #main-menu, #boardNavDesktopFoot::after, #globalMessage::after, #img-controls, #fappeTyme, .slideout-watcher #thread-watcher::after, #catalog::after, div.navLinks > a:first-of-type::after { " + align + ": 3px !important; } #boardNavDesktopFoot, #globalMessage, .slideout-watcher #thread-watcher.dialog { -moz-box-sizing: border-box; width: 232px !important; " + align + ": 18px !important; } .sidebar-large #boardNavDesktopFoot, .sidebar-large #globalMessage, .sidebar-large #thread-watcher { width: 288px !important; } .fourchan-ss-navigation.fixed.top #header-bar, .fourchan-ss-navigation.pagination-top .pagelist, .fourchan-ss-navigation.pagination-sticky-top .pagelist { padding-" + align + ": " + iconOffset + "px; } .fixed.top:not(.fourchan-ss-navigation) #header-bar, .pagination-top:not(.fourchan-ss-navigation) .pagelist, .pagination-sticky-top:not(.fourchan-ss-navigation) .pagelist { margin-" + align + ": " + iconOffset + "px; }"; } return Style.icons.textContent = css; }, @@ -12483,11 +12838,8 @@ }, callbacks: [], cb: function(e) { - var post; - e.preventDefault(); - post = Get.postFromNode(this); - return ExpandComment.expand(post); + return ExpandComment.expand(Get.postFromNode(this)); }, expand: function(post) { var a; @@ -12550,6 +12902,12 @@ } quote.href = "/" + post.board + "/res/" + href; } + Build.capcodeReplies({ + boardID: post.board.ID, + threadID: post.thread.ID, + bq: clone, + capcodeReplies: postObj.capcode_replies + }); post.nodes.shortComment = comment; $.replace(comment, clone); post.nodes.comment = post.nodes.longComment = clone; @@ -13596,7 +13954,8 @@ $.on(d, '4chanXInitFinished', Settings.open); } return $.set({ - lastchecked: Date.now(), + archives: Conf['archives'], + lastarchivecheck: now, previousversion: g.VERSION }); }); @@ -13805,7 +14164,6 @@ version: g.VERSION, date: now }; - Conf['WatchedThreads'] = {}; for (_i = 0, _len = DataBoards.length; _i < _len; _i++) { db = DataBoards[_i]; Conf[db] = { @@ -13863,9 +14221,12 @@ return reader.readAsText(file); }, loadSettings: function(data) { - var version; - - version = data.version.split('.'); + if (data.Conf['WatchedThreads']) { + data.Conf['watchedThreads'] = { + boards: ThreadWatcher.convert(data.Conf['WatchedThreads']) + }; + delete data.Conf['WatchedThreads']; + } return $.set(data.Conf); }, convertSettings: function(data, map) { @@ -14911,6 +15272,7 @@ 'Thread Updater': ThreadUpdater, 'Thread Stats': ThreadStats, 'Thread Watcher': ThreadWatcher, + 'Thread Watcher (Menu)': ThreadWatcher.menu, 'Index Navigation': Nav, 'Keybinds': Keybinds, 'Show Dice Roll': Dice @@ -14962,8 +15324,7 @@ } Main.callbackNodes(Thread, threads); Main.callbackNodesDB(Post, posts, function() { - $.event('4chanXInitFinished'); - return Main.checkUpdate(); + return $.event('4chanXInitFinished'); }); if (styleSelector = $.id('styleSelector')) { passLink = $.el('a', { @@ -14983,8 +15344,7 @@ err = _error; new Notification('warning', 'Cookies need to be enabled on 4chan for appchan x to properly function.', 30); } - $.event('4chanXInitFinished'); - return Main.checkUpdate(); + return $.event('4chanXInitFinished'); }, callbackNodes: function(klass, nodes) { var callback, err, errors, i, len, node, _i, _len, _ref; @@ -15091,40 +15451,6 @@ obj.callback.isAddon = true; return Klass.prototype.callbacks.push(obj.callback); }, - message: function(e) { - var el, version; - - version = e.data.version; - if (version && version !== g.VERSION) { - el = $.el('span', { - innerHTML: "Update: appchan x v" + version + " is out, get it here." - }); - return new Notification('info', el, 120); - } - }, - checkUpdate: function() { - var now; - - if (!(Conf['Check for Updates'] && Main.isThisPageLegit())) { - return; - } - now = Date.now(); - return $.get('lastchecked', 0, function(_arg) { - var lastchecked; - - lastchecked = _arg.lastchecked; - if (lastchecked > now - $.DAY) { - return; - } - return $.ready(function() { - $.on(window, 'message', Main.message); - $.set('lastchecked', now); - return $.add(d.head, $.el('script', { - src: 'https://github.com/zixaphir/appchan-x/raw/master/latest.js' - })); - }); - }); - }, handleErrors: function(errors) { var div, error, logs, _i, _len; diff --git a/builds/crx/script.js b/builds/crx/script.js index 09de71f15..e88277982 100644 --- a/builds/crx/script.js +++ b/builds/crx/script.js @@ -171,9 +171,7 @@ 'Thread Stats': [true, 'Display reply and image count.'], 'Page Count in Stats': [false, 'Display the page count in the thread stats as well.'], 'Updater and Stats in Header': [true, 'Places the thread updater and thread stats in the header instead of floating them.'], - 'Thread Watcher': [true, 'Bookmark threads.'], - 'Auto Watch': [true, 'Automatically watch threads you start.'], - 'Auto Watch Reply': [false, 'Automatically watch threads you reply to.'] + 'Thread Watcher': [true, 'Bookmark threads.'] }, 'Posting': { 'Header Shortcut': [true, 'Add a shortcut to the header to toggle the QR.'], @@ -310,6 +308,12 @@ 'Sage Highlight Position': ['after', 'Position of Sage Highlighting', ['before', 'after']] } }, + threadWatcher: { + 'Current Board': [false, 'Only show watched threads from the current board.'], + 'Auto Watch': [true, 'Automatically watch threads you start.'], + 'Auto Watch Reply': [false, 'Automatically watch threads you reply to.'], + 'Auto Prune': [false, 'Automatically prune 404\'d threads.'] + }, filter: { name: "# Filter any namefags:\n#/^(?!Anonymous$)/", uniqueID: "# Filter a specific ID:\n#/Txhvk1Tl/", @@ -2760,26 +2764,32 @@ } }; - $.ajax = function(url, options, extra) { - var form, headers, key, r, sync, type, upCallbacks, val; + $.ajax = (function() { + var lastModified; - if (extra == null) { - extra = {}; - } - type = extra.type, headers = extra.headers, upCallbacks = extra.upCallbacks, form = extra.form, sync = extra.sync; - r = new XMLHttpRequest(); - r.overrideMimeType('text/html'); - type || (type = form && 'post' || 'get'); - r.open(type, url, !sync); - for (key in headers) { - val = headers[key]; - r.setRequestHeader(key, val); - } - $.extend(r, options); - $.extend(r.upload, upCallbacks); - r.send(form); - return r; - }; + lastModified = {}; + return function(url, options, extra) { + var form, r, sync, type, upCallbacks, whenModified; + + if (extra == null) { + extra = {}; + } + type = extra.type, whenModified = extra.whenModified, upCallbacks = extra.upCallbacks, form = extra.form, sync = extra.sync; + r = new XMLHttpRequest(); + type || (type = form && 'post' || 'get'); + r.open(type, url, !sync); + if (whenModified) { + r.setRequestHeader('If-Modified-Since', lastModified[url] || '0'); + $.on(r, 'load', function() { + return lastModified[url] = r.getResponseHeader('Last-Modified'); + }); + } + $.extend(r, options); + $.extend(r.upload, upCallbacks); + r.send(form); + return r; + }; + })(); $.cache = (function() { var reqs; @@ -3578,17 +3588,19 @@ })(Post); - DataBoards = ['hiddenThreads', 'hiddenPosts', 'lastReadPosts', 'yourPosts']; + DataBoards = ['hiddenThreads', 'hiddenPosts', 'lastReadPosts', 'yourPosts', 'watchedThreads']; DataBoard = (function() { - function DataBoard(key, sync) { + function DataBoard(key, sync, dontClean) { var init, _this = this; this.key = key; this.data = Conf[key]; $.sync(key, this.onSync.bind(this)); - this.clean(); + if (!dontClean) { + this.clean(); + } if (!sync) { return; } @@ -3599,6 +3611,10 @@ $.on(d, '4chanXInitFinished', init); } + DataBoard.prototype.save = function() { + return $.set(this.key, this.data); + }; + DataBoard.prototype["delete"] = function(_arg) { var boardID, postID, threadID; @@ -3617,7 +3633,7 @@ } else { delete this.data.boards[boardID]; } - return $.set(this.key, this.data); + return this.save(); }; DataBoard.prototype.deleteIfEmpty = function(_arg) { @@ -3647,7 +3663,7 @@ } else { this.data.boards[boardID] = val; } - return $.set(this.key, this.data); + return this.save(); }; DataBoard.prototype.get = function(_arg) { @@ -3691,7 +3707,7 @@ this.ajaxClean(boardID); } } - return $.set(this.key, this.data); + return this.save(); }; DataBoard.prototype.ajaxClean = function(boardID) { @@ -3721,7 +3737,7 @@ boardID: boardID }); } - return $.set(_this.key, _this.data); + return _this.save(); }); }; @@ -3782,8 +3798,26 @@ Polyfill = { init: function() { + Polyfill.toBlob(); return Polyfill.visibility(); }, + toBlob: function() { + var _base; + + return (_base = HTMLCanvasElement.prototype).toBlob || (_base.toBlob = function(cb) { + var data, i, l, ui8a, _i; + + data = atob(this.toDataURL().slice(22)); + l = data.length; + ui8a = new Uint8Array(l); + for (i = _i = 0; 0 <= l ? _i < l : _i > l; i = 0 <= l ? ++_i : --_i) { + ui8a[i] = data.charCodeAt(i); + } + return cb(new Blob([ui8a], { + type: 'image/png' + })); + }); + }, visibility: function() { if (!('webkitHidden' in document)) { return; @@ -4141,7 +4175,7 @@ date: data.now, dateUTC: data.time, comment: data.com, - capReps: data.capcode_replies, + capcodeReplies: data.capcode_replies, isSticky: !!data.sticky, isClosed: !!data.closed }; @@ -4169,9 +4203,9 @@ @license: https://github.com/4chan/4chan-JS/blob/master/LICENSE */ - var a, array, boardID, capReps, capcode, capcodeClass, capcodeReplies, capcodeStart, capcodeType, closed, comment, container, date, dateUTC, email, emailEnd, emailStart, ext, file, fileDims, fileHTML, fileInfo, fileSize, fileThumb, filename, flag, flagCode, flagName, generateCapcodeReplies, href, imgSrc, isClosed, isOP, isSticky, name, postID, quote, shortFilename, spoilerRange, staticPath, sticky, subject, threadID, tripcode, uniqueID, userID, _i, _len, _ref; + var a, boardID, capcode, capcodeClass, capcodeReplies, capcodeStart, closed, comment, container, date, dateUTC, email, emailEnd, emailStart, ext, file, fileDims, fileHTML, fileInfo, fileSize, fileThumb, filename, flag, flagCode, flagName, href, imgSrc, isClosed, isOP, isSticky, name, postID, quote, shortFilename, spoilerRange, staticPath, sticky, subject, threadID, tripcode, uniqueID, userID, _i, _len, _ref; - postID = o.postID, threadID = o.threadID, boardID = o.boardID, name = o.name, capcode = o.capcode, tripcode = o.tripcode, uniqueID = o.uniqueID, email = o.email, subject = o.subject, flagCode = o.flagCode, flagName = o.flagName, date = o.date, dateUTC = o.dateUTC, isSticky = o.isSticky, isClosed = o.isClosed, comment = o.comment, capReps = o.capReps, file = o.file; + postID = o.postID, threadID = o.threadID, boardID = o.boardID, name = o.name, capcode = o.capcode, tripcode = o.tripcode, uniqueID = o.uniqueID, email = o.email, subject = o.subject, flagCode = o.flagCode, flagName = o.flagName, date = o.date, dateUTC = o.dateUTC, isSticky = o.isSticky, isClosed = o.isClosed, comment = o.comment, capcodeReplies = o.capcodeReplies, file = o.file; isOP = postID === threadID; staticPath = '//static.4chan.org/image/'; if (email) { @@ -4245,32 +4279,10 @@ tripcode = tripcode ? " " + tripcode + "" : ''; sticky = isSticky ? " Sticky" : ''; closed = isClosed ? " Closed" : ''; - capcodeReplies = ''; - if (capReps) { - generateCapcodeReplies = function(capcodeType, array) { - return "" + ((function() { - switch (capcodeType) { - case 'admin': - return 'Administrator'; - case 'mod': - return 'Moderator'; - case 'developer': - return 'Developer'; - } - })()) + " Repl" + (array.length > 1 ? 'ies' : 'y') + ": " + (array.map(function(ID) { - return ">>" + ID + ""; - }).join(' ')) + "
"; - }; - for (capcodeType in capReps) { - array = capReps[capcodeType]; - capcodeReplies += generateCapcodeReplies(capcodeType, array); - } - capcodeReplies = "

" + capcodeReplies + ""; - } container = $.el('div', { id: "pc" + postID, className: "postContainer " + (isOP ? 'op' : 'reply') + "Container", - innerHTML: "" + (isOP ? '' : "
>>
") + "
" + (name || '') + "" + (tripcode + capcodeStart + capcode + userID + flag + sticky + closed) + "
" + subject + "
" + date + "No." + postID + "
" + (isOP ? fileHTML : '') + "
" + subject + "" + emailStart + "" + (name || '') + "" + (tripcode + capcodeStart + emailEnd + capcode + userID + flag + sticky + closed) + "" + " " + "" + date + "" + " " + "No." + postID + "
" + (isOP ? '' : fileHTML) + "
" + (comment || '') + capcodeReplies + "
" + " " + "
" + innerHTML: "" + (isOP ? '' : "
>>
") + "
" + (name || '') + "" + (tripcode + capcodeStart + capcode + userID + flag + sticky + closed) + "
" + subject + "
" + date + "No." + postID + "
" + (isOP ? fileHTML : '') + "
" + subject + "" + emailStart + "" + (name || '') + "" + (tripcode + capcodeStart + emailEnd + capcode + userID + flag + sticky + closed) + "" + " " + "" + date + "" + " " + "No." + postID + "
" + (isOP ? '' : fileHTML) + "
" + (comment || '') + "
" + " " + "
" }); _ref = $$('.quotelink', container); for (_i = 0, _len = _ref.length; _i < _len; _i++) { @@ -4281,7 +4293,47 @@ } quote.href = "/" + boardID + "/res/" + href; } + Build.capcodeReplies({ + boardID: boardID, + threadID: threadID, + root: container, + capcodeReplies: capcodeReplies + }); return container; + }, + capcodeReplies: function(_arg) { + var array, boardID, bq, capcodeReplies, capcodeType, generateCapcodeReplies, html, root, threadID; + + boardID = _arg.boardID, threadID = _arg.threadID, bq = _arg.bq, root = _arg.root, capcodeReplies = _arg.capcodeReplies; + if (!capcodeReplies) { + return; + } + generateCapcodeReplies = function(capcodeType, array) { + return "" + ((function() { + switch (capcodeType) { + case 'admin': + return 'Administrator'; + case 'mod': + return 'Moderator'; + case 'developer': + return 'Developer'; + } + })()) + " Repl" + (array.length > 1 ? 'ies' : 'y') + ": " + (array.map(function(ID) { + return ">>" + ID + ""; + }).join(' ')) + "
"; + }; + html = []; + for (capcodeType in capcodeReplies) { + array = capcodeReplies[capcodeType]; + html.push(generateCapcodeReplies(capcodeType, array)); + } + bq || (bq = $('blockquote', root)); + return $.add(bq, [ + $.el('br'), $.el('br'), $.el('span', { + className: 'capcodeReplies', + innerHTML: html.join('') + }) + ]); } }; @@ -6681,7 +6733,7 @@ if (g.VIEW === 'catalog' || !Conf['Linkify']) { return; } - this.regString = Conf['Allow False Positives'] ? /(\b([-a-z]+:\/\/|[a-z]{3,}\.[-a-z0-9]+\.[a-z]|[-a-z0-9]+\.[a-z]|[\d]+\.[\d]+\.[\d]+\.[\d]+\/|[a-z]{3,}:[a-z0-9?]|[^\s@]+@[a-z0-9.-]+\.[a-z0-9])[^\s'"]+)/gi : /(((magnet|mailto)\:|(www\.)|(news|(ht|f)tp(s?))\:\/\/){1}\S+)/gi; + this.regString = Conf['Allow False Positives'] ? /([-a-z]+:\/\/|[a-z]{3,}\.[-a-z0-9]+\.[a-z]|[-a-z0-9]+\.[a-z]|[\d]+\.[\d]+\.[\d]+\.[\d]+\/|[a-z]{3,}:[a-z0-9?]|[^\s@]+@[a-z0-9.-]+\.[a-z0-9])/i : /(((magnet|mailto)\:|(www\.)|(news|(ht|f)tp(s?))\:\/\/){1})/i; if (Conf['Comment Expansion']) { ExpandComment.callbacks.push(this.node); } @@ -6694,7 +6746,7 @@ }); }, node: function() { - var data, el, i, items, links, node, range, snapshot, _i, _len, _ref; + var data, el, end, endNode, i, index, items, lIndex, length, link, links, node, range, result, saved, snapshot, space, test, text, _i, _len, _ref; if (this.isClone) { if (Conf['Embedding']) { @@ -6709,16 +6761,49 @@ } return; } + test = /[^\s'"]+/g; + space = /[\s'"]/; snapshot = $.X('.//br|.//text()', this.nodes.comment); i = 0; while (node = snapshot.snapshotItem(i++)) { - if (node.parentElement.nodeName === "A") { + links = []; + data = node.data; + if (node.parentElement.nodeName === "A" || !data) { continue; } - links = []; - if (Linkify.regString.test(node.data)) { - Linkify.regString.lastIndex = 0; - Linkify.gatherLinks(snapshot, this, node, links, i); + while (result = test.exec(data)) { + index = result.index; + endNode = node; + if ((length = index + result[0].length) === data.length) { + while ((saved = snapshot.snapshotItem(i++))) { + if (saved.nodeName === 'BR') { + break; + } + endNode = saved; + length = saved.data.length; + if (end = space.exec(saved.data)) { + length = end.index; + i--; + break; + } + } + if (length === endNode.data.length) { + test.lastIndex = 0; + } + range = Linkify.makeRange(node, endNode, index, length); + if (link = Linkify.regString.exec(text = range.toString())) { + if (lIndex = link.index) { + range.setStart(node, lIndex + index); + } + links.push([range, text]); + } + break; + } else { + if (link = Linkify.regString.exec(result[0])) { + range = Linkify.makeRange(node, node, link.index, link.length); + links.push([range, link]); + } + } } _ref = links.reverse(); for (_i = 0, _len = _ref.length; _i < _len; _i++) { @@ -6742,60 +6827,25 @@ } } }, - gatherLinks: function(snapshot, post, node, links, i) { - var data, index, len, len2, link, match, range; + makeRange: function(startNode, endNode, startOffset, endOffset) { + var range; - data = node.data; - len = data.length; - while ((match = Linkify.regString.exec(data))) { - index = match.index; - link = match[0]; - len2 = index + link.length; - if (len === len2) { - break; - } - range = document.createRange(); - range.setStart(node, index); - range.setEnd(node, len2); - links.push(range); - } - Linkify.regString.lastIndex = 0; - if (match) { - links.push(Linkify.seek(snapshot, post, node, links, match, i)); - } - }, - seek: function(snapshot, post, node, links, match, i) { - var data, index, link, next, range, result; - - link = match[0]; range = document.createRange(); - range.setStart(node, match.index); - while ((next = snapshot.snapshotItem(i++)) && next.nodeName !== 'BR') { - node = next; - data = node.data; - if (result = /[\s'"]/.exec(data)) { - index = result.index; - range.setEnd(node, index); - Linkify.regString.lastIndex = index; - Linkify.gatherLinks(snapshot, post, node, links, i); - return range; - } - } - if (range.collapsed) { - range.setEnd(node, node.data.length); - } + range.setStart(startNode, startOffset); + range.setEnd(endNode, endOffset); return range; }, - makeLink: function(range) { - var a, link; + makeLink: function(_arg) { + var a, range, text; - link = range.toString(); - link = link.contains(':') ? link : (link.contains('@') ? 'mailto:' : 'http://') + link; + range = _arg[0], text = _arg[1]; + text; + text = text.contains(':') ? text : (text.contains('@') ? 'mailto:' : 'http://') + text; a = $.el('a', { className: 'linkify', rel: 'nofollow noreferrer', target: '_blank', - href: link + href: text }); $.add(a, range.extractContents()); range.insertNode(a); @@ -7902,7 +7952,7 @@ img = $.el('img'); img.onload = function() { - var applyBlob, cv, data, height, i, l, s, ui8a, width, _i; + var cv, height, s, width; s = 90 * 2; if (_this.file.type === 'image/gif') { @@ -7926,23 +7976,10 @@ cv.width = img.width = width; cv.getContext('2d').drawImage(img, 0, 0, width, height); URL.revokeObjectURL(fileURL); - applyBlob = function(blob) { + return cv.toBlob(function(blob) { _this.URL = URL.createObjectURL(blob); return _this.nodes.el.style.backgroundImage = "url(" + _this.URL + ")"; - }; - if (cv.toBlob) { - cv.toBlob(applyBlob); - return; - } - data = atob(cv.toDataURL().split(',')[1]); - l = data.length; - ui8a = new Uint8Array(l); - for (i = _i = 0; 0 <= l ? _i < l : _i > l; i = 0 <= l ? ++_i : --_i) { - ui8a[i] = data.charCodeAt(i); - } - return applyBlob(new Blob([ui8a], { - type: 'image/png' - })); + }); }; fileURL = URL.createObjectURL(this.file); return img.src = fileURL; @@ -8826,7 +8863,7 @@ }, menu: { init: function() { - var conf, createSubEntry, el, key, subEntries, _ref; + var conf, createSubEntry, el, name, subEntries, _ref; if (g.VIEW === 'catalog' || !Conf['Image Expansion']) { return; @@ -8838,9 +8875,9 @@ createSubEntry = ImageExpand.menu.createSubEntry; subEntries = []; _ref = Config.imageExpansion; - for (key in _ref) { - conf = _ref[key]; - subEntries.push(createSubEntry(key, conf)); + for (name in _ref) { + conf = _ref[name]; + subEntries.push(createSubEntry(name, conf[1])); } return $.event('AddMenuEntry', { type: 'header', @@ -8849,22 +8886,20 @@ subEntries: subEntries }); }, - createSubEntry: function(type, config) { + createSubEntry: function(name, desc) { var input, label; label = $.el('label', { - innerHTML: " " + type + innerHTML: " " + name, + title: desc }); input = label.firstElementChild; - if (type === 'Fit width' || type === 'Fit height') { + if (name === 'Fit width' || name === 'Fit height') { $.on(input, 'change', ImageExpand.cb.setFitness); } - if (config) { - label.title = config[1]; - input.checked = Conf[type]; - $.event('change', null, input); - $.on(input, 'change', $.cb.checked); - } + input.checked = Conf[name]; + $.event('change', null, input); + $.on(input, 'change', $.cb.checked); return { el: label }; @@ -9556,7 +9591,6 @@ this.postCountEl = $('#post-count', sc); this.fileCountEl = $('#file-count', sc); this.pageCountEl = $('#page-count', sc); - this.lastModified = '0'; return Thread.prototype.callbacks.push({ name: 'Thread Stats', cb: this.node @@ -9611,19 +9645,13 @@ return $.ajax("//api.4chan.org/" + ThreadStats.thread.board + "/threads.json", { onload: ThreadStats.onThreadsLoad }, { - headers: { - 'If-Modified-Since': ThreadStats.lastModified - } + whenModified: true }); }, onThreadsLoad: function() { var page, pages, thread, _i, _j, _len, _len1, _ref; - if (!Conf["Page Count in Stats"]) { - return; - } - ThreadStats.lastModified = this.getResponseHeader('Last-Modified'); - if (this.status !== 200) { + if (!(Conf["Page Count in Stats"] && this.status === 200)) { return; } pages = JSON.parse(this.response); @@ -9718,7 +9746,6 @@ ThreadUpdater.root = this.OP.nodes.root.parentNode; ThreadUpdater.lastPost = +ThreadUpdater.root.lastElementChild.id.match(/\d+/)[0]; ThreadUpdater.outdateCount = 0; - ThreadUpdater.lastModified = '0'; ThreadUpdater.cb.interval.call($.el('input', { value: Conf['Interval'] })); @@ -9814,10 +9841,7 @@ case 200: g.DEAD = false; ThreadUpdater.parse(JSON.parse(req.response).posts); - ThreadUpdater.lastModified = req.getResponseHeader('Last-Modified'); - if (Conf['Auto Update']) { - ThreadUpdater.set('timer', ThreadUpdater.getInterval()); - } + ThreadUpdater.set('timer', ThreadUpdater.getInterval()); break; case 404: g.DEAD = true; @@ -9831,16 +9855,8 @@ }); break; default: - if (Conf['Auto Update']) { - ThreadUpdater.outdateCount++; - ThreadUpdater.set('timer', ThreadUpdater.getInterval()); - } - /* - Status Code 304: Not modified - By sending the `If-Modified-Since` header we get a proper status code, and no response. - This saves bandwidth for both the user and the servers and avoid unnecessary computation. - */ - + ThreadUpdater.outdateCount++; + ThreadUpdater.set('timer', ThreadUpdater.getInterval()); _ref = req.status === 304 ? [null, null] : ["" + req.statusText + " (" + req.status + ")", 'warning'], text = _ref[0], klass = _ref[1]; ThreadUpdater.set('status', text, klass); } @@ -9913,9 +9929,7 @@ return ThreadUpdater.req = $.ajax(url, { onloadend: ThreadUpdater.cb.load }, { - headers: { - 'If-Modified-Since': ThreadUpdater.lastModified - } + whenModified: true }); }, updateThreadStatus: function(title, OP) { @@ -10053,15 +10067,46 @@ ThreadWatcher = { init: function() { + var now; + if (!Conf['Thread Watcher']) { return; } - this.dialog = UI.dialog('watcher', 'top: 50px; left: 0px;', '
Thread Watcher
'); + this.db = new DataBoard('watchedThreads', this.refresh, true); + this.dialog = UI.dialog('thread-watcher', 'top: 50px; left: 0px;', "
Thread Watcher
"); + this.status = $('#watcher-status', this.dialog); + this.list = this.dialog.lastElementChild; $.on(d, 'QRPostSuccessful', this.cb.post); - $.sync('WatchedThreads', this.refresh); - $.ready(function() { - ThreadWatcher.refresh(); - return $.add(d.body, ThreadWatcher.dialog); + if (g.VIEW === 'thread') { + $.on(d, 'ThreadUpdate', this.cb.threadUpdate); + } + $.on(d, '4chanXInitFinished', this.ready); + now = Date.now(); + if ((this.db.data.lastChecked || 0) < now - 2 * $.HOUR) { + this.db.data.lastChecked = now; + ThreadWatcher.fetchAllStatus(); + this.db.save(); + } + $.get('WatchedThreads', null, function(_arg) { + var WatchedThreads, boardID, data, threadID, threads, _ref; + + WatchedThreads = _arg.WatchedThreads; + if (!WatchedThreads) { + return; + } + _ref = ThreadWatcher.convert(WatchedThreads); + for (boardID in _ref) { + threads = _ref[boardID]; + for (threadID in threads) { + data = threads[threadID]; + ThreadWatcher.db.set({ + boardID: boardID, + threadID: threadID, + val: data + }); + } + } + return $["delete"]('WatchedThreads'); }); return Thread.prototype.callbacks.push({ name: 'Thread Watcher', @@ -10069,76 +10114,84 @@ }); }, node: function() { - var favicon, - _this = this; + var toggler; - favicon = $.el('a', { - className: 'watch-thread-link', - href: 'javascript:;' + toggler = $.el('img', { + className: 'watcher-toggler' }); - $.on(favicon, 'click', ThreadWatcher.cb.toggle); - $.before($('input', this.OP.nodes.post), favicon); - if (g.VIEW !== 'thread') { + $.on(toggler, 'click', ThreadWatcher.cb.toggle); + return $.before($('input', this.OP.nodes.post), toggler); + }, + ready: function() { + $.off(d, '4chanXInitFinished', ThreadWatcher.ready); + if (!Main.isThisPageLegit()) { return; } - return $.get('AutoWatch', 0, function(item) { - if (item['AutoWatch'] !== _this.ID) { + ThreadWatcher.refresh(); + $.add(d.body, ThreadWatcher.dialog); + if (!Conf['Auto Watch']) { + return; + } + return $.get('AutoWatch', 0, function(_arg) { + var AutoWatch, thread; + + AutoWatch = _arg.AutoWatch; + if (!(thread = g.BOARD.threads[AutoWatch])) { return; } - ThreadWatcher.watch(_this); + ThreadWatcher.add(thread); return $["delete"]('AutoWatch'); }); }, - refresh: function(watched) { - var ID, board, div, favicon, id, link, nodes, props, thread, x, _ref, _ref1; - - if (!watched) { - $.get('WatchedThreads', {}, function(item) { - return ThreadWatcher.refresh(item['WatchedThreads']); - }); - return; - } - nodes = [$('.move', ThreadWatcher.dialog)]; - for (board in watched) { - _ref = watched[board]; - for (id in _ref) { - props = _ref[id]; - x = $.el('a', { - textContent: '✖', - className: 'close', - href: 'javascript:;' - }); - $.on(x, 'click', ThreadWatcher.cb.x); - link = $.el('a', props); - link.title = link.textContent; - div = $.el('div'); - $.add(div, [x, $.tn(' '), link]); - nodes.push(div); - } - } - $.rmAll(ThreadWatcher.dialog); - $.add(ThreadWatcher.dialog, nodes); - watched = watched[g.BOARD] || {}; - _ref1 = g.BOARD.threads; - for (ID in _ref1) { - thread = _ref1[ID]; - favicon = $('.watch-thread-link', thread.OP.nodes.post); - if (ID in watched) { - $.addClass(favicon, 'watched'); - } else { - $.rmClass(favicon, 'watched'); - } - } - }, cb: { + openAll: function() { + var a, _i, _len, _ref; + + if ($.hasClass(this, 'disabled')) { + return; + } + _ref = $$('a[title]', ThreadWatcher.list); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + a = _ref[_i]; + $.open(a.href); + } + return $.event('CloseMenu'); + }, + checkThreads: function() { + if ($.hasClass(this, 'disabled')) { + return; + } + return ThreadWatcher.fetchAllStatus(); + }, + pruneDeads: function() { + var boardID, data, threadID, _i, _len, _ref, _ref1; + + if ($.hasClass(this, 'disabled')) { + return; + } + _ref = ThreadWatcher.getAll(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + _ref1 = _ref[_i], boardID = _ref1.boardID, threadID = _ref1.threadID, data = _ref1.data; + if (!data.isDead) { + continue; + } + delete ThreadWatcher.db.data.boards[boardID][threadID]; + ThreadWatcher.db.deleteIfEmpty({ + boardID: boardID + }); + } + ThreadWatcher.db.save(); + ThreadWatcher.refresh(); + return $.event('CloseMenu'); + }, toggle: function() { return ThreadWatcher.toggle(Get.postFromNode(this).thread); }, - x: function() { - var thread; + rm: function() { + var boardID, threadID, _ref; - thread = this.nextElementSibling.pathname.split('/'); - return ThreadWatcher.unwatch(thread[1], thread[3]); + _ref = this.parentNode.dataset.fullID.split('.'), boardID = _ref[0], threadID = _ref[1]; + return ThreadWatcher.rm(boardID, +threadID); }, post: function(e) { var board, postID, threadID, _ref; @@ -10149,43 +10202,346 @@ return $.set('AutoWatch', threadID); } } else if (Conf['Auto Watch Reply']) { - return ThreadWatcher.watch(board.threads[threadID]); + return ThreadWatcher.add(board.threads[threadID]); } + }, + threadUpdate: function(e) { + var thread; + + thread = e.detail.thread; + if (!(e.detail[404] && ThreadWatcher.db.get({ + boardID: thread.board.ID, + threadID: thread.ID + }))) { + return; + } + return ThreadWatcher.add(thread); + } + }, + fetchCount: { + fetched: 0, + fetching: 0 + }, + fetchAllStatus: function() { + var thread, _i, _len, _ref; + + ThreadWatcher.status.textContent = '...'; + _ref = ThreadWatcher.getAll(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + thread = _ref[_i]; + ThreadWatcher.fetchStatus(thread); + } + }, + fetchStatus: function(_arg) { + var boardID, data, fetchCount, threadID; + + boardID = _arg.boardID, threadID = _arg.threadID, data = _arg.data; + if (data.isDead) { + return; + } + fetchCount = ThreadWatcher.fetchCount; + fetchCount.fetching++; + return $.ajax("//api.4chan.org/" + boardID + "/res/" + threadID + ".json", { + onloadend: function() { + var status; + + fetchCount.fetched++; + if (fetchCount.fetched === fetchCount.fetching) { + fetchCount.fetched = 0; + fetchCount.fetching = 0; + status = ''; + } else { + status = "" + (Math.round(fetchCount.fetched / fetchCount.fetching * 100)) + "%"; + } + ThreadWatcher.status.textContent = status; + if (this.status !== 404) { + return; + } + if (Conf['Auto Prune']) { + ThreadWatcher.rm(boardID, threadID); + } else { + data.isDead = true; + ThreadWatcher.db.set({ + boardID: boardID, + threadID: threadID, + val: data + }); + } + return ThreadWatcher.refresh(); + } + }, { + type: 'head' + }); + }, + getAll: function() { + var all, boardID, data, threadID, threads, _ref; + + all = []; + _ref = ThreadWatcher.db.data.boards; + for (boardID in _ref) { + threads = _ref[boardID]; + if (Conf['Current Board'] && boardID !== g.BOARD.ID) { + continue; + } + for (threadID in threads) { + data = threads[threadID]; + all.push({ + boardID: boardID, + threadID: threadID, + data: data + }); + } + } + return all; + }, + makeLine: function(boardID, threadID, data) { + var div, fullID, href, link, x; + + x = $.el('a', { + textContent: '✖', + href: 'javascript:;' + }); + $.on(x, 'click', ThreadWatcher.cb.rm); + if (data.isDead) { + href = Redirect.to('thread', { + boardID: boardID, + threadID: threadID + }); + } + link = $.el('a', { + href: href || ("/" + boardID + "/res/" + threadID), + textContent: data.excerpt, + title: data.excerpt + }); + div = $.el('div'); + fullID = "" + boardID + "." + threadID; + div.dataset.fullID = fullID; + if (g.VIEW === 'thread' && fullID === ("" + g.BOARD + "." + g.THREADID)) { + $.addClass(div, 'current'); + } + if (data.isDead) { + $.addClass(div, 'dead-thread'); + } + $.add(div, [x, $.tn(' '), link]); + return div; + }, + refresh: function() { + var boardID, data, list, nodes, refresher, thread, threadID, toggler, _i, _j, _len, _len1, _ref, _ref1, _ref2, _ref3; + + nodes = []; + _ref = ThreadWatcher.getAll(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + _ref1 = _ref[_i], boardID = _ref1.boardID, threadID = _ref1.threadID, data = _ref1.data; + nodes.push(ThreadWatcher.makeLine(boardID, threadID, data)); + } + list = ThreadWatcher.list; + $.rmAll(list); + $.add(list, nodes); + _ref2 = g.BOARD.threads; + for (threadID in _ref2) { + thread = _ref2[threadID]; + toggler = $('.watcher-toggler', thread.OP.nodes.post); + toggler.src = ThreadWatcher.db.get({ + boardID: thread.board.ID, + threadID: threadID + }) ? Favicon["default"] : Favicon.empty; + } + _ref3 = ThreadWatcher.menu.refreshers; + for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) { + refresher = _ref3[_j]; + refresher(); } }, toggle: function(thread) { - if (!$.hasClass($('.watch-thread-link', thread.OP.nodes.post), 'watched')) { - return ThreadWatcher.watch(thread); + var boardID, threadID; + + boardID = thread.board.ID; + threadID = thread.ID; + if (ThreadWatcher.db.get({ + boardID: boardID, + threadID: threadID + })) { + return ThreadWatcher.rm(boardID, threadID); } else { - return ThreadWatcher.unwatch(thread.board, thread.ID); + return ThreadWatcher.add(thread); } }, - unwatch: function(board, threadID) { - return $.get('WatchedThreads', {}, function(item) { - var watched; + add: function(thread) { + var boardID, data, threadID; - watched = item['WatchedThreads']; - delete watched[board][threadID]; - if (!Object.keys(watched[board]).length) { - delete watched[board]; + data = {}; + boardID = thread.board.ID; + threadID = thread.ID; + if (thread.isDead) { + if (Conf['Auto Prune'] && ThreadWatcher.db.get({ + boardID: boardID, + threadID: threadID + })) { + ThreadWatcher.rm(boardID, threadID); + return; } - ThreadWatcher.refresh(watched); - return $.set('WatchedThreads', watched); + data.isDead = true; + } + data.excerpt = Get.threadExcerpt(thread); + ThreadWatcher.db.set({ + boardID: boardID, + threadID: threadID, + val: data }); + return ThreadWatcher.refresh(); }, - watch: function(thread) { - return $.get('WatchedThreads', {}, function(item) { - var watched, _name; - - watched = item['WatchedThreads']; - watched[_name = thread.board] || (watched[_name] = {}); - watched[thread.board][thread] = { - href: "/" + thread.board + "/res/" + thread, - textContent: Get.threadExcerpt(thread) - }; - ThreadWatcher.refresh(watched); - return $.set('WatchedThreads', watched); + rm: function(boardID, threadID) { + ThreadWatcher.db["delete"]({ + boardID: boardID, + threadID: threadID }); + return ThreadWatcher.refresh(); + }, + convert: function(oldFormat) { + var boardID, data, newFormat, threadID, threads; + + newFormat = {}; + for (boardID in oldFormat) { + threads = oldFormat[boardID]; + for (threadID in threads) { + data = threads[threadID]; + (newFormat[boardID] || (newFormat[boardID] = {}))[threadID] = { + excerpt: data.textContent + }; + } + } + return newFormat; + }, + menu: { + refreshers: [], + init: function() { + var menu; + + if (!Conf['Thread Watcher']) { + return; + } + menu = new UI.Menu('thread watcher'); + $.on($('.menu-button', ThreadWatcher.dialog), 'click', function(e) { + return menu.toggle(e, this, ThreadWatcher); + }); + this.addHeaderMenuEntry(); + return this.addMenuEntries(); + }, + addHeaderMenuEntry: function() { + var entryEl; + + if (g.VIEW !== 'thread') { + return; + } + entryEl = $.el('a', { + href: 'javascript:;' + }); + $.event('AddMenuEntry', { + type: 'header', + el: entryEl, + order: 60 + }); + $.on(entryEl, 'click', function() { + return ThreadWatcher.toggle(g.threads["" + g.BOARD + "." + g.THREADID]); + }); + return this.refreshers.push(function() { + var addClass, rmClass, text, _ref; + + _ref = $('.current', ThreadWatcher.list) ? ['unwatch-thread', 'watch-thread', 'Unwatch thread'] : ['watch-thread', 'unwatch-thread', 'Watch thread'], addClass = _ref[0], rmClass = _ref[1], text = _ref[2]; + $.addClass(entryEl, addClass); + $.rmClass(entryEl, rmClass); + return entryEl.textContent = text; + }); + }, + addMenuEntries: function() { + var cb, conf, entries, entry, name, refresh, subEntries, _i, _len, _ref, _ref1, _results; + + entries = []; + entries.push({ + cb: ThreadWatcher.cb.openAll, + entry: { + type: 'thread watcher', + el: $.el('a', { + textContent: 'Open all threads' + }) + }, + refresh: function() { + return (ThreadWatcher.list.firstElementChild ? $.rmClass : $.addClass)(this.el, 'disabled'); + } + }); + entries.push({ + cb: ThreadWatcher.cb.checkThreads, + entry: { + type: 'thread watcher', + el: $.el('a', { + textContent: 'Check 404\'d threads' + }) + }, + refresh: function() { + return ($('div:not(.dead-thread)', ThreadWatcher.list) ? $.rmClass : $.addClass)(this.el, 'disabled'); + } + }); + entries.push({ + cb: ThreadWatcher.cb.pruneDeads, + entry: { + type: 'thread watcher', + el: $.el('a', { + textContent: 'Prune 404\'d threads' + }) + }, + refresh: function() { + return ($('.dead-thread', ThreadWatcher.list) ? $.rmClass : $.addClass)(this.el, 'disabled'); + } + }); + subEntries = []; + _ref = Config.threadWatcher; + for (name in _ref) { + conf = _ref[name]; + subEntries.push(this.createSubEntry(name, conf[1])); + } + entries.push({ + entry: { + type: 'thread watcher', + el: $.el('span', { + textContent: 'Settings' + }), + subEntries: subEntries + } + }); + _results = []; + for (_i = 0, _len = entries.length; _i < _len; _i++) { + _ref1 = entries[_i], entry = _ref1.entry, cb = _ref1.cb, refresh = _ref1.refresh; + if (entry.el.nodeName === 'A') { + entry.el.href = 'javascript:;'; + } + if (cb) { + $.on(entry.el, 'click', cb); + } + if (refresh) { + this.refreshers.push(refresh.bind(entry)); + } + _results.push($.event('AddMenuEntry', entry)); + } + return _results; + }, + createSubEntry: function(name, desc) { + var entry, input; + + entry = { + type: 'thread watcher', + el: $.el('label', { + innerHTML: " " + name, + title: desc + }) + }; + input = entry.el.firstElementChild; + input.checked = Conf[name]; + $.on(input, 'change', $.cb.checked); + if (name === 'Current Board') { + $.on(input, 'change', ThreadWatcher.refresh); + } + return entry; + } } }; @@ -10529,8 +10885,8 @@ http: true, https: true, software: 'foolfuuka', - boards: ['adv', 'asp', 'cm', 'i', 'lgbt', 'n', 'o', 'p', 's4s', 't', 'trv'], - files: ['adv', 'asp', 'cm', 'i', 'lgbt', 'n', 'o', 'p', 's4s', 't', 'trv'] + boards: ['adv', 'asp', 'cm', 'd', 'e', 'i', 'lgbt', 'n', 'o', 'p', 'pol', 's', 's4s', 't', 'trv', 'y'], + files: ['cm', 'd', 'e', 'i', 'n', 'o', 'p', 's', 'trv', 'y'] }, 'Foolz Beta': { domain: 'beta.foolz.us', @@ -11787,7 +12143,7 @@ fg = _arg[0]; return "0 0 0 0 " + fg.r + " 0 0 0 0 " + fg.g + " 0 0 0 0 " + fg.b; }, - layout: "/* Cleanup */ #absbot, #boardNavDesktop, #delPassword, #delform > hr:last-of-type, #navbotright, #postForm, #search-label, #search-label-bottom, #styleSwitcher, #togglePostForm, .boardBanner > div, .mobile, .next form, .next span, .postingMode, .prev form, .prev span, .riced, .sideArrows, .stylechanger, body > br, body > div[style^=\"text-align\"], body > hr { display: none; } /* Empties */ #qr .warning:empty, #qr-thread-select:empty { display: none; } /* File Name Trunctuate / /p/ exif */ .exif, .fileText:hover .fntrunc, .fileText:not(:hover) .fnfull { display: none; } /* Unnecessary */ #qp input, #qp .rice, .inline .rice { display: none !important; } /* Hidden Content */ .forwarded, .hidden, .hidden_thread ~ div, .hidden_thread ~ a, .replyContainer .stub ~ div, .replyContainer .stub ~ a, .stub + div, .thread > .stub:first-child ~ .postContainer, .thread > .stub:first-child ~ .summary, [hidden] { display: none !important; } /* Hidden UI */ #catalog, #navlinks, #navtopright, #svg_filters, .cataloglink, .navLinks { z-index: 7; position: fixed; top: 100%; left: 100%; } /* Hide last horizontal rule, keep clear functionality. */ .board > hr:last-of-type { visibility: hidden; } /* Fappe Tyme */ .fappeTyme .thread > .noFile, .fappeTyme .threadContainer > .noFile { display: none; } /* Defaults */ a { text-decoration: none; outline: none; } .underline-links a { text-decoration: underline; } body, html { min-height: 100%; box-sizing: border-box; } body { outline: none; min-height: 100%; } .sidebar-hide body { margin: 0 2px; } .sidebar-minimal body { margin: 0 20px; } .sidebar-normal body { margin: 0 252px } .sidebar-large body { margin: 0 303px; } .sidebar-location-right body { margin-left: 2px; } .sidebar-location-left body { margin-right: 2px; } body.unscroll { overflow: hidden; } .fourchan-ss-sidebar body::before { content: ''; position: fixed; top: 0; bottom: 0; box-sizing: border-box; display: block; z-index: 0; } .fourchan-ss-sidebar.sidebar-large body::before { width: 306px; } .fourchan-ss-sidebar.sidebar-normal body::before { width: 255px; } .fourchan-ss-sidebar.sidebar-minimal body::before { width: 23px; } .sidebar-location-right body::before { right: 0; } sidebar-location-left body::before { left: 0; } .fourchan-ss-sidebar.sidebar-location-right body { padding-right: 2px; } .fourchan-ss-sidebar.sidebar-location-left body { padding-left: 2px; } hr { clear: both; border: 0; padding: 0; margin: 0 0 1px; } .hide-horizontal-rules hr { visibility: hidden; } th { text-align: left; } .center { text-align: center; } .disabled { opacity: 0.5; } .pointer { cursor: pointer; } /* Symbols */ .drop-marker { vertical-align: middle; display: inline-block; margin: 2px 2px 3px; border-top: .5em solid; border-right: .3em solid transparent; border-left: .3em solid transparent; } .brackets-wrap::before { content: \" [\"; } .brackets-wrap::after { content: \"] \"; } /* Thread / Reply Nav */ #navlinks a { position: fixed; z-index: 12; opacity: 0.5; display: inline-block; border-right: 6px solid transparent; border-left: 6px solid transparent; margin: 1.5px; } #navlinks a:first-of-type { border-bottom: 11px solid rgb(130,130,130); } #navlinks a:last-of-type { border-top: 11px solid rgb(130,130,130); } /* Header */ #header-bar { z-index: 6; border-width: 1px; padding: 0 2px; border-style: solid; } .pagination-sticky-top .pagelist, .pagination-sticky-bottom .pagelist, #header-bar { left: 2px; right: 2px; } .navigation-alignment-center #header-bar { text-align: center; } .navigation-alignment-right #header-bar { text-align: right; } .sidebar-location-left.sidebar-large:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-left #header-bar { left: 303px; } .sidebar-location-left.sidebar-normal:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-left #header-bar { left: 252px; } .sidebar-location-left.sidebar-minimal:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-left.sidebar-minimal:not(.fourchan-ss-navigation) #header-bar { left: 20px; } .sidebar-location-right.sidebar-large:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-right #header-bar { right: 303px; } .sidebar-location-right.sidebar-normal:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-right #header-bar { right: 252px; } .sidebar-location-right.sidebar-minimal:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-right.sidebar-minimal:not(.fourchan-ss-navigation) #header-bar { right: 20px; } .fourchan-ss-navigation .pagelist, .fourchan-ss-navigation #header-bar { left: 0; right: 0; border-left: 0; border-right: 0; border-radius: 0 !important; } .hide-navigation-decorations #header-bar { font-size: 0; color: transparent; word-spacing: 2px; } #shortcuts { float: right; } .fixed #header-bar.autohide { z-index: 24; } .fixed #header-bar { position: fixed; } .top #header-bar { top: 0; border-top-width: 0; } .rounded-edges.top #header-bar { border-radius: 0 0 3px 3px; } .fixed.bottom #header-bar { bottom: 0; border-bottom-width: 0; } .rounded-edges.bottom #header-bar { border-radius: 3px 3px 0 0; } .hide #header-bar { position: fixed; top: 110%; bottom: auto; } /* Header Autohide */ .fixed #header-bar.autohide:not(:hover) { box-shadow: none; transition: all .8s .6s cubic-bezier(.55, .055, .675, .19); } .fixed.top #header-bar.autohide:not(:hover) { margin-bottom: -1em; -webkit-transform: translateY(-100%); } .fixed.bottom #header-bar.autohide:not(:hover) { -webkit-transform: translateY(100%); } #scroll-marker { left: 0; right: 0; height: 10px; position: absolute; } #header-bar #scroll-marker { display: none; } .fixed #header-bar #scroll-marker { display: block; } .fixed.top header-bar #scroll-marker { top: 100%; } .fixed.bottom #header-bar #scroll-marker { bottom: 100%; } /* Notifications */ #notifications { position: fixed; top: 0; text-align: center; right: 0; left: 0; transition: all .8s .6s cubic-bezier(.55, .055, .675, .19); } .fixed.top #header-bar #notifications { position: absolute; top: 100%; } .notification { font-weight: 700; text-shadow: 0 1px 2px rgba(0, 0, 0, .5); box-shadow: 0 1px 2px rgba(0, 0, 0, .15); border-radius: 2px; margin: 1px auto; width: 500px; max-width: 100%; position: relative; transition: all .25s ease-in-out; } .notification.error { background-color: hsla(0, 100%, 38%, .9); } .notification.warning { background-color: hsla(36, 100%, 38%, .9); } .notification.info { background-color: hsla(200, 100%, 38%, .9); } .notification.success { background-color: hsla(104, 100%, 38%, .9); } .notification, .notification a { color: #fff !important; } .notification > .close { top: 0; padding: 2px; right: 4px; position: absolute; color: #fff; } .message { box-sizing: border-box; padding: 6px 20px; max-height: 200px; width: 100%; overflow: auto; } /* Updater / Thread Stats */ .float #thread-stats, .float #updater { position: fixed; } #update-status.new::after { content: ', '; } /* Pagination */ .pagelist { border-style: solid; border-width: 1px; z-index: 6; } .pagination-alignment-center .pagelist { text-align: center; } .pagination-alignment-right .pagelist { text-align: right; } .pagination-sticky-top .pagelist { position: fixed; top: 0; border-top-width: 0; } .pagination-sticky-bottom .pagelist { position: fixed; bottom: 0; border-bottom-width: 0; } .pagination-top .pagelist { position: static; border-top-width: 0; } .pagination-bottom .pagelist { position: static; } .pagination-top.rounded-edges .pagelist, .pagination-sticky-top.rounded-edges .pagelist { border-radius: 0 0 3px 3px; } .pagination-bottom.rounded-edges .pagelist, .pagination-sticky-bottom.rounded-edges .pagelist { border-radius: 3px 3px 0 0; } .pagination-hide .pagelist { display: none; } .pagination-on-side .pagelist { position: fixed; padding: 0; top: auto; bottom: 0.5em; margin: 0; background: none transparent !important; border: 0 none !important; text-align: right; } .pagination-on-side.post-form-style-fixed.show-post-form-header .pagelist { bottom: 23.1em; } .pagination-on-side.post-form-style-fixed .pagelist { bottom: 21.6em; } .sidebar-location-left.pagination-on-side .pagelist { -webkit-transform: rotate(-90deg); -webkit-transform-origin: bottom left; } .sidebar-location-right.pagination-on-side .pagelist { -webkit-transform: rotate(90deg); -webkit-transform-origin: bottom right; } .sidebar-location-right.sidebar-large.pagination-on-side .pagelist { left: auto; right: 301px; } .sidebar-location-left.sidebar-large.pagination-on-side .pagelist { right: auto; left: 301px; } .sidebar-location-right.sidebar-normal.pagination-on-side .pagelist { left: auto; right: 246px; } .sidebar-location-left.sidebar-normal.pagination-on-side .pagelist { right: auto; left: 246px; } .sidebar-location-right.sidebar-minimal.pagination-on-side .pagelist { left: auto; right: 246px; } .sidebar-location-left.sidebar-minimal.pagination-on-side .pagelist { right: auto; left: 18px; } .hide-navigation-decorations .pagelist { font-size: 0; color: transparent; word-spacing: 0; } .pagelist input, .pagelist div { vertical-align: middle; } .hide-navigation-decorations .pages a { margin: 0 1px; } .next, .pages, .prev { display: inline-block; margin: 0 3px; } /* Icons */ .icons-4chan-ss #navtopright .exlinksOptionsLink::after, .icons-4chan-ss #main-menu, .icons-4chan-ss .navLinks > a:first-of-type::after, .icons-4chan-ss #watcher::after, .icons-4chan-ss #globalMessage::after, .icons-4chan-ss #boardNavDesktopFoot::after, .icons-4chan-ss #img-controls, .icons-4chan-ss #catalog::after, .icons-4chan-ss #fappeTyme { background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAACWCAMAAAA2YSLzAAAAPFBMVEVkZGRlZWVjY2NmZmZnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dZxmG7AAAAE3RSTlMFFQ0AJD8eQFRqf5CgssDM4+73gHqZRAAAA0pJREFUSMetVlmy5CgMZDMGxK7737Ulgcu8ejMREzHtD7sShJRaKWV/Psq3iz7QGwTF2BZ01hp3N6yasctZJANiN5ZlItDLtNkQDGNeMLU7EqmCbUwhkhZbwsIuNbyWPX7dIyHOrDYOc8SOiEUJjojN0EsWlCXRrq2qvJCsIjic2OcFrwrOpdmTimqVyWG7ZkrWy97p7z/hACd2FUetBcQDpTN+nuKsGng881L5xOz/VQ88xL/eQkyZT3axp+4dUMwvH0Pnhn6wSyR+8IdR4f43/v8XX1BHjXpjwy5RdEcQ7DiuzlBUsFD+GeIFEy6W0pKXoSZOiUz5tf99nvTDD/1sP9VRPvb/un86lT57SVqwSk8KR+L6kgTOlcZslRQe5WmJRKovETW7Anb+HzxUW4Xgnv11fuuj82aKXHz1Tzztx9v4VA9+/6le26B+3VhTC9RMPIr0qx4zaWNsnFRO0s8FWgEIFIRiVUAIlJGciqMmCwpQWyI/OplXA1RrXG1YI2svTQ3ufhWjNlKFqtXFI7Yg+zAXRcBZ+HygJuVHd0ys35bVn6QojLL5cZeVvPht/mVu/r/8s7GMXsLjv2s71GZhgjnEwsEVXogiSl/pl7LWra0IQgO3poTsieoYd4dhWfJlGWqyQf6sLxWt3/MRa4Im04ixeSdAWnxvqCX6tObVmzpZOPOZvrBNJF8gmGciBChsV+YdRYwnAvNpS4AnYFBm0KA2a35Unh+efxjercaLfV7wW0rtUTNl2j715al/9VtfutF+NZ/+aZSa+py/GCpRyvr17EsVLbRhmN++BBY/ik5/+YPK6bKnf2T8fh7P+uEYn0D3E4L3i6QHmvc3+k+8PN6Mb1w52tje6LbAi+M0FT4YneqVbpVDPnL2Xqx7m3tf9ENXHba9H/a/+X3z/+XfCnOo+Zy/o4SgY5Z6iq0nb+9Mc4JxL5f1qYs+xhTP/uiX/cMe4+hDHAfGnmGe+Ev+G88vnG7Ie20wHiUt/S1Kv+6BCM/9fkEfz73/9HNufQ4ZKdzvnwtS/LXltRcJB/yJ23H/mo89nPFa85Li3XOYu435LwTXKVWwO+cnlWFTB47L/AdfR//KI2bvF8sAb0c/M+1+YE3/oS77B8N+UUVHraV6AAAAAElFTkSuQmCC\"); } .icons-oneechan #navtopright .exlinksOptionsLink::after, .icons-oneechan #main-menu, .icons-oneechan .navLinks > a:first-of-type::after, .icons-oneechan #watcher::after, .icons-oneechan #globalMessage::after, .icons-oneechan #boardNavDesktopFoot::after, .icons-oneechan #img-controls, .icons-oneechan #catalog::after, .icons-oneechan #fappeTyme { background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAACWCAMAAAA2YSLzAAAAPFBMVEVoaGhqampeXl5sbGxsbGxra2tsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGzXmsRLAAAAE3RSTlMAEAYnHBg2QExbcYaWqM++2+z4BMdvAwAAAtVJREFUSMfFVgmu3CAMhYRPAmb3/e9aL5Bl2kptVbXWSOSBsY15NmOMMZs1KnNExC+ezgV4MBtNMIw58+qX2REtQwiifdC6hwlNQBGfUlBzc+KYkP3IxH5hNvicCPXrMfEVi3ts2WrzaiN6jie2OI2GXbBfXiA/XPyexPpEHrHdyDV8YAt6vEYCVpJ3S7rXAZKkkfbnuR8Uk/32xsac6Y01La2ZfyIh1VrX9Rnfu5ygd6/XeQAGFxACkopDb3mkeXug48x5FCKhNzW+1j2t8/5EEwHTIfPm6G3aP37o/w/ir3QZ2V/xY0spdSxWL7MrLU7slmnDSY0UrH6CBJ/wFI3TNGECCDY9G4xmrpDkZvQMJ4q31EzLQuhipr7ag8ueFa+hUQy2d43nnPGg7NopHTUVyYlWpE+lUT4qfhDCnLpzB8oXLLJb4leptD/JblswOaZd0gRkDV0cJi69NNOUaclRpG6S1NPdRVPLjI3VSjWV8+FmaARknTxqfipl0tGR1DXvd0h251Ww/ZlaNQoaX3bqUS+IK6ZX4hysvuQinS+6n9638/6BbK4RLi6R11O8rPS4OnO66KHtw6yK96BWrg5QxDGcVzcoB8cYb/dE1zPO6C+pHxN0Ttw/JtJrx55+oV9Jq+ScF22IfBWDD+sHfTnBmKlpS99hPGSC4SBsi+dP3p0PjVBVedMdO3WoG57cAEbYVNkRHFROIzjYuGjoM7LOaEQKbtQjkuo5hCSMmezaNq3Gl6TE5J3ZLMu26SjpPJZo4h/9FJhT4JQJzjFXD7x54fBgzO9RvDH9Vl5vHIetcGHct1apLh/6gU3c2PYy5rrYh7a1NP29/H/G9xn/d+f7FNVcw9/H/9sf8ymXPnqdDd7Wx3OpzWRJuP8+iMTFe7wZq48Tce7QciNetUzku+pT/t4UHK/iIq2yPR/8y/315M/rWl1A/sM83phVh6+aeZY39OLNN4Y0P2GdHOWPAAAAAElFTkSuQmCC\"); } /* Banner & Board Title */ .boardBanner { line-height: 0; } .faded-4chan-banner .boardBanner { opacity: 0.5; transition: opacity 0.3s ease-in-out .5s; } .faded-4chan-banner .boardBanner:hover { opacity: 1; transition: opacity 0.3s ease-in; } /* From 4chan SS / OneeChan */ .fourchan-banner-reflection #Banner { -webkit-box-reflect: below 0 -webkit-linear-gradient(rgba(255,255,255,0), rgba(255,255,255,0) 10%, rgba(255,255,255,.5)); } .fourchan-banner-at-sidebar-top .boardBanner, .fourchan-banner-at-sidebar-bottom .boardBanner, .fourchan-banner-at-sidebar-bottom .boardBanner { position: fixed; } .fourchan-banner-at-sidebar-top .boardBanner { top: 16px; } .fourchan-banner-at-sidebar-bottom .boardBanner { bottom: 270px; } .fourchan-banner-under-post-form .boardBanner { bottom: 130px; } .board-title-at-sidebar-top.sidebar-location-right #boardTitle, .board-title-at-sidebar-bottom.sidebar-location-right #boardTitle, .board-title-under-post-form.sidebar-location-right #boardTitle, .fourchan-banner-at-sidebar-top.sidebar-location-right .boardBanner, .fourchan-banner-at-sidebar-bottom.sidebar-location-right .boardBanner, .fourchan-banner-under-post-form.sidebar-location-right .boardBanner { right: 2px; } .board-title-at-sidebar-top.sidebar-location-left #boardTitle, .board-title-at-sidebar-bottom.sidebar-location-left #boardTitle, .board-title-under-post-form.sidebar-location-left #boardTitle, .fourchan-banner-at-sidebar-top.sidebar-location-left .boardBanner, .fourchan-banner-at-sidebar-bottom.sidebar-location-left .boardBanner, .fourchan-banner-under-post-form.sidebar-location-left .boardBanner { left: 2px; } .board-title-at-sidebar-top #boardTitle, .board-title-at-sidebar-bottom #boardTitle, .board-title-under-post-form #boardTitle, .fourchan-banner-at-sidebar-top .boardBanner img, .fourchan-banner-at-sidebar-bottom .boardBanner img, .fourchan-banner-under-post-form .boardBanner img { width: 248px; } .board-title-at-sidebar-top.sidebar-large #boardTitle, .board-title-at-sidebar-bottom.sidebar-large #boardTitle, .board-title-under-post-form.sidebar-large #boardTitle, .fourchan-banner-at-sidebar-top.sidebar-large .boardBanner img, .fourchan-banner-at-sidebar-bottom.sidebar-large .boardBanner img, .fourchan-banner-under-post-form.sidebar-large .boardBanner img { width: 299px; } .fourchan-banner-at-top .boardBanner { position: relative; display: table; margin: 12px auto; text-align: center; } :root:not(.board-subtitle) .boardSubtitle, .board-title-hide #boardTitle, .fourchan-banner-hide .boardBanner { display: none; } #boardTitle { text-align: center; z-index: 4; } .board-title-at-sidebar-top #boardTitle, .board-title-at-sidebar-bottom #boardTitle, .board-title-under-post-form #boardTitle { position: fixed; } .board-title-at-sidebar-top.fourchan-banner-at-sidebar-top.sidebar-large #boardTitle { top: 121px; } .board-title-at-sidebar-top.fourchan-banner-at-sidebar-top #boardTitle { top: 104px; } .board-title-at-sidebar-top #boardTitle { top: 40px; } .board-title-at-sidebar-bottom #boardTitle { bottom: 280px; } .board-title-under-post-form #boardTitle { bottom: 140px; } /* Hover UI */ .move { cursor: pointer; } #ihover { position: fixed; max-height: 97%; max-width: 75%; z-index: 22; } #qp { position: fixed; z-index: 22; } #qp .postMessage::after { clear: both; display: block; content: \"\"; } #qp .full-image { max-height: 300px; max-width: 500px; } #menu { position: fixed; outline: none; z-index: 22; } /* Image Expansion */ .fit-width .full-image { max-width: 100%; width: 100%; } .fit-height .full-image { max-height: 95vh; } .images-overlap-post-form .full-image { position: relative; z-index: 21; } /* Delete Buttons */ .hide-delete-ui .deleteform, .hide-delete-ui .post:not(#exlinks-options) .rice { display: none; } .hide-delete-ui .postInfo { padding: 0 0 0 3px; } .deleteform { position: fixed; z-index: 18; width: 0; bottom: 0; right: 0; border-width: 1px 0 0 1px; border-style: solid; font-size: 0; color: transparent; } .deleteform:hover { width: auto; } .deleteform::before { z-index: 18; border-width: 1px 0 0 1px; border-style: solid; content: '✖'; display: block; position: fixed; bottom: 0; right: 0; box-sizing: border-box; height: 1.6em; width: 1.4em; text-align: center; } .deleteform:hover::before { display: none; } .deleteform input { margin: 0 1px 0 0; } /* Slideout Navigation */ #boardNavDesktopFoot { position: fixed; text-align: center; font-size: 0; color: transparent; overflow: hidden; box-sizing: border-box; width: 248px; } .sidebar-large #boardNavDesktopFoot { width: 299px; } .sidebar-location-right #boardNavDesktopFoot { right: 2px; } .sidebar-location-left #boardNavDesktopFoot { left: 2px; } #boardNavDesktopFoot:hover { overflow-y: auto; padding: 2px; } #boardNavDesktopFoot:not(:hover) { border-color: transparent; background-color: transparent; height: 0; overflow: hidden; padding: 0; border: 0 none; } .slideout-navigation-compact #boardNavDesktopFoot { word-spacing: 1px; } .slideout-navigation-list #boardNavDesktopFoot a { display: block; } .slideout-navigation-list #boardNavDesktopFoot:hover { max-height: 400px; } .slideout-navigation-list #boardNavDesktopFoot a::after { content: ' - ' attr(title); } .slideout-navigation-list #boardNavDesktopFoot a[href*='//boards.4chan.org/']::after, .slideout-navigation-list #boardNavDesktopFoot a[href*='//rs.4chan.org/']::after { content: '/ - ' attr(title); } .slideout-navigation-list #boardNavDesktopFoot a[href*='//boards.4chan.org/']::before, .slideout-navigation-list #boardNavDesktopFoot a[href*='//rs.4chan.org/']::before { content: '/'; } .slideout-navigation-hide #boardNavDesktopFoot { display: none; } /* Watcher */ #watcher { position: fixed; z-index: 14; padding: 2px; } #watcher { width: 200px; } #watcher:not(:hover) { max-height: 200px; overflow: hidden; } .rounded-edges #watcher { border-radius: 3px; } #watcher > div { max-height: 1.3em; overflow: hidden; } .slideout-watcher #watcher { box-sizing: border-box; width: 248px; } .slideout-watcher.sidebar-large #boardNavDesktopFoot { width: 299px; } .slideout-watcher.sidebar-location-right #watcher { left: auto !important; right: 2px !important; } .slideout-watcher.sidebar-location-left #watcher { right: auto !important; left: 2px !important; } .slideout-watcher #watcher .move { cursor: default; } .slideout-watcher.underline-links #watcher .move { text-decoration: underline; } .slideout-watcher #watcher > div { overflow: hidden; } .slideout-watcher #watcher:hover { overflow-y: auto; } .slideout-watcher #watcher:not(:hover) { height: 0; overflow: hidden; border: 0 none; padding: 0; } .watch-thread-link { padding-top: 18px; width: 18px; height: 0px; display: inline-block; background-repeat: no-repeat; opacity: 0.2; position: relative; top: 1px; } .watch-thread-link.watched { opacity: 1; } /* Announcements */ #globalMessage { text-align: center; } .rounded-edges #globalMessage { border-radius: 3px; } .announcements-slideout #globalMessage { position: fixed; padding: 2px; width: 248px; } .announcements-slideout.sidebar-location-right #globalMessage { left: auto; right: 2px; } .announcements-slideout.sidebar-location-left #globalMessage { right: auto; left: 2px; } .announcements-slideout.sidebar-large #globalMessage { width: 299px; } .announcements-slideout #globalMessage h3 { margin: 0; } .announcements-slideout #globalMessage:hover { box-sizing: border-box; overflow-y: auto; } .announcements-slideout #globalMessage:not(:hover) { height: 0; overflow: hidden; padding: 0; border: 0 none; } .announcements-hide #globalMessage { display: none !important; } /* Threads */ #threads, .rounded-edges .board > .thread { border-radius: 4px; } /* Thread Clearfix */ .thread > .threadContainer:last-of-type::after, .thread > .postContainer:last-of-type::after { display: block; content: ' '; clear: both; } /* Posts */ .expanding { opacity: .5; } .fileText:hover .fntrunc, .fileText:not(:hover) .fnfull, .expanded-image > .post > .file > .fileThumb > img[data-md5], .post > .file > .fileThumb > .full-image { display: none; } .expanded-image > .post > .file > .fileThumb > .full-image { display: block; } .thread > .replyContainer:last-of-type .post { margin-bottom: 0; } .menu-button { position: relative; } .stub .menu-button, .post .menu-button, .hide-thread-button, .show-thread-button span, .hide-reply-button, .show-reply-button span { float: right; } .post .menu-button, .hide-thread-button, .hide-reply-button { margin: 0 3px; opacity: 0; transition: opacity .3s ease-out 0s; } .post:hover .hide-reply-button, .post:hover .menu-button, .post:hover .hide-thread-button, .hidden_thread .hide-thread-button, .hidden_thread .menu-button, .inline .hide-reply-button, .inline .menu-button { opacity: 1; } .hidden_thread { text-align: right; } .color-user-ids .posteruid .hand { padding: .1em .3em; border-radius: 1em; font-size: 80%; } .postInfo > span { vertical-align: bottom; } .bolds .subject, .bolds .name { font-weight: 600; } .italics .postertrip { font-style: italic; } .underline-links .replylink { text-decoration: underline; } .fileInfo { padding: 0 3px; } .fileThumb { float: left; margin: 3px 20px; outline: none; } .reply.post { box-sizing: border-box; display: inline-block; } .fit-width-replies .reply.post { display: block; overflow: hidden; } .fit-width-replies .expanded-image .reply.post, .fit-width-replies .hasInline .reply.post { width: 100%; } .indent-replies #unread-line, .indent-replies .thread > .replyContainer, .indent-replies .threadContainer > .replyContainer { margin-left: 2em; } .expanded-image .reply.post, .hasInline .reply.post { display: inline-block; overflow: visible; clear: both; } .rounded-edges .post { border-radius: 3px; } .spoiler, s { text-decoration: none; } /* Emoji */ a.useremail:last-of-type { vertical-align: top; } /* Reply Clearfix */ .reply.post .postMessage { clear: right; } .op-background .op.post .postMessage::after, .force-reply-break .op.post .postMessage::after { display: block; content: ' '; clear: both; } /* OP */ .favicon { vertical-align: bottom; } .op-background .op.post { box-sizing: border-box; } /* Summary */ .force-reply-break .summary { clear: both; } /* Inlined */ .inline { margin: 2px 8px 2px 2px; } .post .inline { margin: 2px; } .inline .replyContainer { display: inline-block; } /* Inlined Clearfix */ .inline .postMessage::after { clear: both; display: block; content: \"\"; } /* Quotes */ .inlined { opacity: .5; } .underline-links .quotelink { text-decoration: underline; } .filtered, .quotelink.filtered { text-decoration: line-through !important; } .inline + .hashlink { display: none; } /* Quote Threading */ .threadContainer { padding-left: 2em; border-left: 1px solid; } .indent-replies .threadContainer { margin-left: 2em; padding-left: 0; } .threadOP { clear: both; } /* Backlinks */ .underline-links .forwardlink, .underline-links .backlink { text-decoration: underline; } .backlink.dead { text-decoration: none; } .filtered-backlinks .filtered.backlink { display: none; } .backlinks-position-lower-left .container, .backlinks-position-lower-right .container { max-width: 100%; padding: 0 5px; } .backlinks-position-lower-left .reply.quoted, .backlinks-position-lower-right .reply.quoted { position: relative; padding-bottom: 1.7em; } .backlinks-position-lower-left .inline .reply.quoted, .backlinks-position-lower-right .inline .reply.quoted, .backlinks-position-lower-right #qp .reply.quoted, .backlinks-position-lower-left #qp .reply.quoted { position: static; padding-bottom: 0; } .backlinks-position-lower-right .reply .container, .backlinks-position-lower-left .reply .container { position: absolute; bottom: 0; padding: 0 5px; } .backlinks-position-lower-left .reply .container { left: 0; } .backlinks-position-lower-right .reply .container { right: 0; } .backlinks-position-lower-right .container::before, .backlinks-position-lower-left .reply .container::before { content: 'REPLIES: '; } .container:empty { display: none; } .backlinks-position-lower-left #qp .container, .backlinks-position-lower-left .inline .container, .backlinks-position-lower-right .inline .container, .backlinks-position-lower-right #qp .container { position: static; max-width: 100%; } .backlinks-position-lower-left #qp .container::before, .backlinks-position-lower-left .inline .container::before, .backlinks-position-lower-right #qp .container::before, .backlinks-position-lower-right .inline .container::before { content: ''; } .backlinks-position-lower-right .inline .container { float: none; } /* Fixes text spoilers */ .remove-spoilers.indicate-spoilers .spoiler::before, .remove-spoilers.indicate-spoilers s::before { content: '[spoiler]'; } .remove-spoilers.indicate-spoilers .spoiler::after, .remove-spoilers.indicate-spoilers s::after { content: '[/spoiler]'; } :root:not(.remove-spoilers) .spoiler:not(:hover) *, :root:not(.remove-spoilers) s:not(:hover) * { color: rgb(0,0,0) !important; text-shadow: none !important; } :root:not(.remove-spoilers) spoiler:not(:hover), :root:not(.remove-spoilers) s:not(:hover) { background-color: rgb(0,0,0); color: rgb(0,0,0) !important; text-shadow: none !important; } /* Code */ .prettyprint { box-sizing: border-box; font-family: monospace; display: inline-block; margin: 0 auto .1em 0; vertical-align: middle; white-space: pre-wrap; border-radius: 2px; overflow-x: auto; padding: 3px; max-width: 100%; } /* Menu */ .entry { border-bottom: 1px solid rgba(0,0,0,.25); cursor: pointer; display: block; outline: none; padding: 3px 1em 3px 7px; position: relative; text-decoration: none; white-space: nowrap; } .entry:last-child { border-bottom: 0; } .has-submenu::after { content: \"\"; border-left: .5em solid; border-top: .3em solid transparent; border-bottom: .3em solid transparent; display: inline-block; margin: .3em; position: absolute; right: 0; } .submenu { display: none; position: absolute; top: -1px; } .focused .submenu { display: block; } /* Stubs */ .fit-width-replies .stub { display: block; text-align: right; clear: both; } /* Element Replacing: */ /* Checkboxes */ .rice { cursor: pointer; width: 9px; height: 9px; margin: 2px 3px 3px; display: inline-block; vertical-align: bottom; } input[type=checkbox]:checked + .rice { position: relative; } input[type=checkbox]:checked + .rice::after { content: \"\"; display: block; width: 4px; height: 10px; border-width: 0 3px 3px 0; border-style: solid; -webkit-transform: rotate(45deg); position: absolute; left: 2px; bottom: -1px; } .rounded-edges .rice { border-radius: 2px;} } .circle-checkboxes .rice { border-radius: 6px;} } input:checked + .rice { background-attachment: scroll; background-repeat: no-repeat; background-position: bottom right; } /* Selects */ .selectrice { position: relative; cursor: default; overflow: hidden; text-align: left; } #settings .selectrice { display: inline-block; } .selectrice::after { content: \"\"; border-right: .25em solid transparent; border-left: .25em solid transparent; position: absolute; right: .4em; top: .5em; } .selectrice::before { content: \"\"; height: 1.6em; position: absolute; right: 1.3em; top: 0; } /* Select Dropdown */ #selectrice { padding: 0; margin: 0; position: fixed; max-height: 120px; overflow-y: auto; overflow-x: hidden; z-index: 32; } #selectrice:empty { display: none; } /* Post Form Shortcut */ .qr-shortcut.on-page { font-size: 250%; } /* Post Form */ #qr { z-index: 20; position: fixed; background: none; border: none; padding: 1px; min-width: 248px; background: transparent; border: 1px solid transparent; } .sidebar-large #qr { min-width: 299px; } .rounded-edges #qr, .rounded-edges #qrtab { border-radius: 3px 3px 0 0; } .post-form-style-fixed #qr { top: auto !important; } .sidebar-location-left:not(.post-form-style-float) #qr { left: 0 !important; right: auto !important; } .sidebar-location-right:not(.post-form-style-float) #qr { right: 0 !important; left: auto !important; } :root:not(.post-form-style-float) #qr { bottom: 0 !important; } .fourchan-ss-navigation.fixed.bottom:not(.post-form-style-float) #qr, .fourchan-ss-navigation.index.pagination-sticky-bottom:not(.post-form-style-float) #qr { bottom: 1.5em !important; } .post-form-style-slideout #qr { top: auto !important; } .post-form-style-slideout.sidebar-location-left #qr { -webkit-transform: translateX(-93%); } .post-form-style-slideout.sidebar-location-right #qr { -webkit-transform: translateX(93%); } .post-form-style-slideout #qr:hover, .post-form-style-slideout #qr.has-focus, .post-form-style-slideout #qr.dump { -webkit-transform: translate(0); } .post-form-style-tabbed-slideout #qr { top: auto !important; } .post-form-style-tabbed-slideout.sidebar-location-left #qr { -webkit-transform: translateX(-100%); } .post-form-style-tabbed-slideout.sidebar-location-right #qr { -webkit-transform: translateX(100%); } .post-form-style-tabbed-slideout #qr:hover, .post-form-style-tabbed-slideout #qr.has-focus, .post-form-style-tabbed-slideout #qr.dump { -webkit-transform: translateX(0); } .post-form-style-tabbed-slideout #qrtab { position: absolute; top: 0; width: 120px; text-align: center; border-width: 1px 1px 0 1px; cursor: default; } .post-form-style-tabbed-slideout.sidebar-location-left #qrtab { -webkit-transform: rotate(90deg); -webkit-transform-origin: bottom right; left: 100%; } .post-form-style-tabbed-slideout.sidebar-location-right #qrtab { -webkit-transform: rotate(-90deg); -webkit-transform-origin: bottom right; right: 100%; } .post-form-style-tabbed-slideout #qr:hover #qrtab, .post-form-style-tabbed-slideout #qr.has-focus #qrtab, .post-form-style-tabbed-slideout #qr.dump #qrtab { opacity: 0 !important; } .post-form-style-slideout #qrtab input, .post-form-style-slideout #qrtab .rice, .post-form-style-tabbed-slideout #qrtab input, .post-form-style-tabbed-slideout #qrtab .close, .post-form-style-tabbed-slideout #qrtab .rice, .post-form-style-tabbed-slideout #qrtab span { display: none; } .post-form-style-tabbed-slideout #qrtab .selectrice { text-align: center; } .transparent-post-form #qr { opacity: 0.2; transition: opacity .3s ease-in-out 1s; } .transparent-post-form #qr:hover, .transparent-post-form #qr.has-focus, .transparent-post-form #qr.dump { opacity: 1; transition: opacity .3s linear; } :root:not(.show-post-form-header):not(.post-form-style-float):not(.post-form-style-tabbed-slideout) #qrtab, .post-form-style-float .autohide:not(:hover):not(.has-focus) form, .show-post-form-header.post-form-style-fixed .autohide:not(:hover):not(.has-focus) form { display: none !important; } :root:not(.post-form-style-tabbed-slideout) #qrtab { margin-bottom: 1px; } #qr.autohide:not(:hover):not(.has-focus) #qrtab { margin-bottom: 0; } .post-form-slideout-transitions.post-form-style-slideout #qr, .post-form-slideout-transitions.post-form-style-tabbed-slideout #qr { transition: -webkit-transform .3s ease-in-out 1s; } .post-form-slideout-transitions.post-form-style-tabbed-slideout #qr.dump, .post-form-slideout-transitions.post-form-style-tabbed-slideout #qr:hover, .post-form-slideout-transitions.post-form-style-tabbed-slideout #qr.has-focus, .post-form-slideout-transitions.post-form-style-slideout #qr.dump, .post-form-slideout-transitions.post-form-style-slideout #qr:hover, .post-form-slideout-transitions.post-form-style-slideout #qr.has-focus { transition: -webkit-transform .3s linear; } .post-form-slideout-transitions #qrtab { transition: opacity .3s ease-in-out 1s; } .post-form-slideout-transitions #qr:hover #qrtab { transition: opacity .3s linear; } #qr .close { float: right; padding: 0 3px; } #qr .warning { min-height: 1.6em; vertical-align: middle; padding: 0 1px; border-width: 1px; border-style: solid; } .persona { width: 248px; max-width: 100%; min-width: 100%; } .persona input.field { width: 100%; } #qr textarea.field { height: 11.6em; min-height: 6em; } #qr.has-captcha textarea.field { height: 6em; } .compact-post-form-inputs .persona input.field { width: 33%; } .compact-post-form-inputs .persona input.field:first-child { margin: 0; } .compact-post-form-inputs .persona input.field { margin: 0 0 0 0.5%; } .compact-post-form-inputs #qr textarea.field { height: 14.9em; min-height: 9em; } .compact-post-form-inputs #qr.has-captcha textarea.field { height: 9em; } .tripcode-hider .tripped:not(:hover):not(:focus) { color: transparent !important; } .textarea-resize-horizontal #qr textarea { resize: horizontal; } .textarea-resize-vertical #qr textarea { resize: vertical; } .textarea-resize-both #qr textarea { resize: both; } .textarea-resize-none #qr textarea { resize: none; } .captcha-img { margin: 1px 0 0; text-align: center; line-height: 0; } .captcha-img img { width: 246px; } .captcha-img, .captcha-img img { height: 4em; } .captcha-input { width: 100%; margin: 1px 0 0; } .field, .selectrice, button, input:not([type=radio]) { box-sizing: border-box; height: 1.6em; margin: 1px 0 0; vertical-align: bottom; padding: 0 1px; outline: none; } .selectrice { padding-right: 1.6em; } #qr textarea { min-width: 100%; } #qr [type='submit'] { width: 25%; } [type='file'] { position: absolute; opacity: 0; z-index: -1; } /* Fake File Input */ #qr-filename, #qr-filerm, .has-file #qr-no-file { display: none; } #qr-no-file, .has-file #qr-filename { display: block; } .has-file #qr-filerm { display: inline-block; } #qr-extras-container { position: absolute; right: 0; top: 0; z-index: 2; } #qr-extras-container > label, #qr-extras-container > a { cursor: pointer; margin-right: 3px; } #qr-filename-container { box-sizing: border-box; display: inline-block; position: relative; width: 100px; min-width: 74.6%; max-width: 74.6%; margin-right: 0.4%; overflow: hidden; padding: 2px 1px 0; } /* Thread Select */ #qr-thread-select, #qr-thread-select .selectrice div { display: inline; } #qr-thread-select .selectrice { cursor: pointer; display: inline-block; width: 120px; border: none; background: none transparent; padding: 0; margin: 0; height: auto; } #qr-thread-select .selectrice::before, #qr-thread-select .selectrice::after { display: none; } /* Dumping UI */ .dump #dump-list-container { display: block; } #dump-list-container { display: none; position: relative; overflow-y: hidden; margin-top: 1px; } #dump-list { overflow-x: auto; overflow-y: hidden; white-space: nowrap; width: 248px; max-width: 100%; min-width: 100%; } #dump-list:hover { overflow-x: auto; } .qr-preview { box-sizing: border-box; counter-increment: thumbnails; cursor: move; display: inline-block; height: 90px; width: 90px; padding: 2px; opacity: .5; overflow: hidden; position: relative; text-shadow: 0 1px 1px #000; transition: opacity .25s ease-in-out; vertical-align: top; } .qr-preview:hover, .qr-preview:focus { opacity: .9; } .qr-preview::before { content: counter(thumbnails); color: #fff; position: absolute; top: 3px; right: 3px; text-shadow: 0 0 3px #000, 0 0 8px #000; } .qr-preview#selected { opacity: 1; } .qr-preview.drag { box-shadow: 0 0 10px rgba(0,0,0,.5); } .qr-preview.over { border-color: #fff; } .qr-preview > span { color: #fff; } .remove { background: none; color: #e00; font-weight: 700; padding: 3px; } a:only-of-type > .remove { display: none; } .remove:hover::after { content: \" Remove\"; } .qr-preview > label { background: rgba(0,0,0,.5); color: #fff; right: 0; bottom: 0; left: 0; position: absolute; text-align: center; } .qr-preview > label > input { margin: 0; } #add-post { cursor: pointer; font-size: 2em; position: absolute; top: 50%; right: 10px; -webkit-transform: translateY(-50%); } /* Ads */ .fade-ads .topad img, .fade-ads .middlead img, .fade-ads .bottomad img { opacity: 0.3; transition: opacity .3s linear; } .fade-ads .topad img:hover, .fade-ads .middlead img:hover, .fade-ads .bottomad img:hover { opacity: 1; } .hide-ads .bottomad + hr, .hide-ads .topad, .hide-ads .middlead, .hide-ads .bottomad, .hide-ads .ad-plea { display: none; } .shrink-ads .topad a img, .shrink-ads .middlead a img, .shrink-ads .bottomad a img { width: 500px; height: auto; } /* Mascot Positions */ #mascot { display: none; position: fixed; z-index: -1; bottom: 0; left: 0; right: 0; line-height: 0; cursor: pointer; } .mascot-position-above-post-form.post-form-style-fixed:not(.post-form-decorations) #mascot img { margin-bottom: -2px; } .mascots #mascot { display: block; } .sidebar-location-right.mascot-location-sidebar #mascot, .sidebar-location-left.mascot-location-opposite #mascot { left: auto; } .sidebar-location-left.mascot-location-sidebar #mascot, .sidebar-location-right.mascot-location-opposite #mascot { right: auto; } .sidebar-location-left.mascot-location-sidebar #mascot img, .sidebar-location-right.mascot-location-opposite #mascot img { -webkit-transform: scaleX(-1); } .fourchan-ss-navigation.bottom.fixed #mascot, .fourchan-ss-navigation.index.pagination-sticky-bottom #mascot { bottom: 1.5em } .mascots-overlap-posts #mascot { z-index: 3; } .mascot-position-middle #mascot { bottom: 50% !important; -webkit-transform: translateY(50%); } .mascot-position-top #mascot { bottom: auto !important; top: 17px; } .grayscale-mascots #mascot { -webkit-filter: url('#grayscale'); } .silhouettize-mascots #mascot img { -webkit-filter: url('#mascot-filter'); } /* Options */ #overlay { position: fixed; z-index: 30; top: 0; right: 0; left: 0; bottom: 0; background: rgba(0,0,0,.5); } #appchanx-settings { width: auto; left: 15%; right: 15%; top: 15%; bottom: 15%; position: fixed; z-index: 31; padding: .3em; } .rounded-edges #appchanx-settings, .rounded-edges #appchanx-settings fieldset, .rounded-edges .mascots-container, .rounded-edges .section-container, .rounded-edges .sections-list > a { border-radius: 3px; } .description { display: none; } #appchanx-settings h3, .section-keybinds, .section-mascots, .section-script, .style { text-align: center; } .section-keybinds table, .section-script fieldset, .section-style fieldset { text-align: left; } .section-keybinds table { margin: auto; } #appchanx-settings fieldset { padding: 5px 0; vertical-align: top; border: 0; margin: 0 3px 6px; display: inline-block; } .single-column-mode #appchanx-settings fieldset { display: block; margin: 0 auto 6px; } #appchanx-settings .section-advanced fieldset { display: block; margin: 0 auto 6px; } .section-advanced .archive-cell { min-width: 200px; } .section-advanced .selectrice { display: inline-block; clear: both; } .section-container { overflow: auto; position: absolute; top: 1.7em; right: 5px; bottom: 5px; left: 5px; padding: 5px; } .sections-list { padding: 0 3px; float: left; } .sections-list > a { cursor: pointer; position: relative; padding: 0 4px; z-index: 1; height: 1.4em; display: inline-block; border-width: 1px 1px 0 1px; border-color: transparent; border-style: solid; } .sections-list > a.tab-selected { border-style: solid; } .credits { float: right; } #appchanx-settings h3 { margin: 0; } .section-script fieldset > div, .section-style fieldset > div, .section-advanced fieldset > div { overflow: visible; padding: 0 5px 0 7px; } #appchanx-settings tr:nth-of-type(2n+1), .section-script fieldset > div:nth-of-type(2n+1), .section-advanced fieldset > div:nth-of-type(2n+1), .section-style fieldset > div:nth-of-type(2n+1), .section-keybinds tr:nth-of-type(2n+1), #selectrice li:nth-of-type(2n+1) { background-color: rgba(0, 0, 0, 0.05); } article li { margin: 10px 0 10px 2em; } #appchanx-settings .option { width: 50%; display: inline-block; vertical-align: bottom; } .option input { width: 100%; } .optionlabel { padding-left: 18px; } .rice + .optionlabel { padding-left: 0; } .section-script fieldset, .styleoption { text-align: left; } .section-style fieldset { width: 370px; } .section-script fieldset { width: 200px; } #mascotcontent, #themecontent, .suboptions { overflow: auto; position: absolute; top: 0; right: 0; bottom: 1.7em; left: 0; } #mascotcontent, #themecontent { padding: 5px; } #themecontent { top: 1.8em; } .mAlign { height: 250px; vertical-align: bottom; display: table-cell; line-height: 0; } #save, .stylesettings { position: absolute; right: 10px; bottom: 0; } .section-style .suboptions { bottom: 0; } .section-container textarea { font-family: monospace; min-height: 150px; resize: vertical; width: 100%; } /* Hover Functionality */ #mouseover { z-index: 33; position: fixed; max-width: 70%; } #mouseover:empty { display: none; } /* Mascot Tab */ #mascot_hide { padding: 3px; position: absolute; top: 2px; right: 18px; } #mascot_hide .rice { float: left; } #mascot_hide > div { height: 0; text-align: right; overflow: hidden; } #mascot_hide:hover > div { height: auto; } #mascot_hide label { width: 100%; display: block; clear: both; text-decoration: none; } .mascots-container { padding: 0; text-align: center; } .mascot, .mascotcontainer { overflow: hidden; } .mascot { position: relative; border: none; margin: 5px; padding: 0; width: 200px; display: inline-block; background-color: transparent; } .mascotcontainer { height: 250px; border: 0; margin: 0; max-height: 250px; cursor: pointer; bottom: 0; border-width: 0 1px 1px; border-style: solid; border-color: transparent; overflow: hidden; } .mascot img { max-width: 200px; } .export-button, .mascotname, #mascot-options { box-sizing: border-box; padding: 0; width: 100%; } #mascot-options { opacity: 0; transition: opacity .3s linear; } .mascot:hover #mascot-options { opacity: 1; } #mascot-options { position: absolute; bottom: 0; right: 0; left: 0; } .export-button { position: absolute; bottom: 1.7em; right: 0; left: 0; text-align: center; } #mascot-options a { display: inline-block; width: 33%; } #upload { position: absolute; width: 100px; left: 50%; margin-left: -50px; text-align: center; bottom: 0; } #mascots_batch { position: absolute; left: 10px; bottom: 0; } /* Themes Tab */ #themes h1 { position: absolute; right: 300px; bottom: 10px; margin: 0; transition: all .2s ease-in-out; opacity: 0; } #themes .selectedtheme h1 { right: 11px; opacity: 1; } #addthemes { position: absolute; left: 10px; bottom: 0; } .theme { margin: 1em; } /* Theme Editor */ #themeConf { position: fixed; top: 0; bottom: 0; width: 296px; z-index: 10; } .sidebar-location-right #themeConf { right: 2px; left: auto; } .sidebar-location-right #themeConf { left: 2px; right: auto; } #themebar input { width: 30%; } .option .color { width: 10%; border-left: none !important; color: transparent !important; } .option .colorfield { width: 90%; } .themevar textarea { min-width: 100%; max-width: 100%; height: 20em; resize: vertical; } /* Mascot Editor */ #mascotConf { position: fixed; height: 17em; bottom: 0; left: 50%; width: 500px; margin-left: -250px; overflow: auto; z-index: 10; } #mascotConf .option, #mascotConf .optionlabel { box-sizing: border-box; width: 50%; display: inline-block; vertical-align: middle; } #mascotConf .option input { width: 100%; } #close { position: absolute; left: 10px; bottom: 0; } /* Catalog */ #content .navLinks, #info .navLinks, .btn-wrap { display: block; } .navLinks > .btn-wrap:not(:first-of-type)::before { content: ' - '; } .button { cursor: pointer; } #content .btn-wrap, #info .btn-wrap { display: inline-block; } #post-preview, #quote-preview { position: absolute; z-index: 22; } .rounded-edges #post-preview { border-radius: 3px; } #settings, #threads, #info .navLinks, #content .navLinks { text-align: center; } #threads .thread { vertical-align: top; display: inline-block; word-wrap: break-word; overflow: hidden; margin: 1px; padding: 5px 0 3px; text-align: center; } .extended-small .thread, .small .thread { width: 165px; max-height: 320px; } .small .teaser, .large .teaser { display: none; } .extended-large .thread, .large .thread { width: 270px; max-height: 410px; } .extended-small .thumb, .small .thumb { max-width: 150px; max-height: 150px; } .panel { position: fixed; top: 50% !important; left: 50%; -webkit-transform: translate(-50%, -50%); padding: 5px; } .icon::after { display: inline-block; float: right; width: 1em; cursor: pointer; } .helpIcon::after { content: '?'; } .closeIcon::after { content: '✖'; } /* Front Page */ #logo { text-align: center; } #doc { box-sizing: border-box; margin: 10px auto; width: 1006px; padding: 2px; position: relative; } .rounded-edges #doc, .rounded-edges #doc div { border-radius: 3px; } #boards .boxcontent { vertical-align: top; text-align: center; } #filter-container, #options-container { top: 4px; right: 8px; position: absolute; } #filtermenu, #optionsmenu { top: 100% !important; left: auto !important; right: 0 !important; } #boards .column { box-sizing: border-box; display: inline-block; width: 180px; text-align: left; vertical-align: top; } .bd ul, .boxcontent ul { vertical-align: top; padding: 0; margin: 0; } .right-box .boxcontent ul { padding: 0 10px; } .yuimenuitem, .boxcontent li { list-style-type: none; } .boxbar { position: relative; } #doc h3, .boxbar h2 { margin: 0; } #doc h3 { text-decoration: none !important; } .underline-links #doc h3 { text-decoration: underline !important; } #ft, .box-outer { margin: 2px 0 0; overflow: hidden; } #ft, .boxbar, .boxcontent { padding: 0 8px; } .yui-module { position: absolute; } .yuimenuitem::before { content: \" [ ] \"; font-family: monospace; } .yuimenuitem-checked::before { content: \" [x] \" } .yui-g { overflow: hidden; } .yui-u { display: inline-block; vertical-align: top; width: 499px; float: right; } .yui-u.first { float: left; } #recent-images .boxcontent { text-align: center; } #ft { text-align: center; } #ft ul { padding: 0; } #ft li { list-style-type: none; display: inline-block; width: 100px; } #preview-tooltip-nws, #preview-tooltip-ws, #ft .fill, .clear-bug { display: none; } /* ExLinks */ #exlinks-options-content { padding: 5px; }", + layout: "/* Cleanup */ #absbot, #boardNavDesktop, #delPassword, #delform > hr:last-of-type, #navbotright, #postForm, #search-label, #search-label-bottom, #styleSwitcher, #togglePostForm, .boardBanner > div, .mobile, .next form, .next span, .postingMode, .prev form, .prev span, .riced, .sideArrows, .stylechanger, body > br, body > div[style^=\"text-align\"], body > hr { display: none; } /* Empties */ #qr .warning:empty, #qr-thread-select:empty { display: none; } /* File Name Trunctuate / /p/ exif */ .exif, .fileText:hover .fntrunc, .fileText:not(:hover) .fnfull { display: none; } /* Unnecessary */ #qp input, #qp .rice, .inline .rice { display: none !important; } /* Hidden Content */ .forwarded, .hidden, .hidden_thread ~ div, .hidden_thread ~ a, .replyContainer .stub ~ div, .replyContainer .stub ~ a, .stub + div, .thread > .stub:first-child ~ .postContainer, .thread > .stub:first-child ~ .summary, [hidden] { display: none !important; } /* Hidden UI */ #catalog, #navlinks, #navtopright, #svg_filters, .cataloglink, .navLinks { z-index: 7; position: fixed; top: 100%; left: 100%; } /* Hide last horizontal rule, keep clear functionality. */ .board > hr:last-of-type { visibility: hidden; } /* Fappe Tyme */ .fappeTyme .thread > .noFile, .fappeTyme .threadContainer > .noFile { display: none; } /* Defaults */ a { text-decoration: none; outline: none; } .underline-links a { text-decoration: underline; } body, html { min-height: 100%; box-sizing: border-box; } body { outline: none; min-height: 100%; } .sidebar-hide body { margin: 0 2px; } .sidebar-minimal body { margin: 0 20px; } .sidebar-normal body { margin: 0 252px } .sidebar-large body { margin: 0 303px; } .sidebar-location-right body { margin-left: 2px; } .sidebar-location-left body { margin-right: 2px; } body.unscroll { overflow: hidden; } .fourchan-ss-sidebar body::before { content: ''; position: fixed; top: 0; bottom: 0; box-sizing: border-box; display: block; z-index: 0; } .fourchan-ss-sidebar.sidebar-large body::before { width: 306px; } .fourchan-ss-sidebar.sidebar-normal body::before { width: 255px; } .fourchan-ss-sidebar.sidebar-minimal body::before { width: 23px; } .sidebar-location-right body::before { right: 0; } sidebar-location-left body::before { left: 0; } .fourchan-ss-sidebar.sidebar-location-right body { padding-right: 2px; } .fourchan-ss-sidebar.sidebar-location-left body { padding-left: 2px; } hr { clear: both; border: 0; padding: 0; margin: 0 0 1px; } .hide-horizontal-rules hr { visibility: hidden; } th { text-align: left; } .center { text-align: center; } .disabled { opacity: 0.5; } .pointer { cursor: pointer; } /* Symbols */ .drop-marker { vertical-align: middle; display: inline-block; margin: 2px 2px 3px; border-top: .5em solid; border-right: .3em solid transparent; border-left: .3em solid transparent; } .brackets-wrap::before { content: \" [\"; } .brackets-wrap::after { content: \"] \"; } /* Thread / Reply Nav */ #navlinks a { position: fixed; z-index: 12; opacity: 0.5; display: inline-block; border-right: 6px solid transparent; border-left: 6px solid transparent; margin: 1.5px; } #navlinks a:first-of-type { border-bottom: 11px solid rgb(130,130,130); } #navlinks a:last-of-type { border-top: 11px solid rgb(130,130,130); } /* Header */ #header-bar { z-index: 6; border-width: 1px; padding: 0 2px; border-style: solid; } .pagination-sticky-top .pagelist, .pagination-sticky-bottom .pagelist, #header-bar { left: 2px; right: 2px; } .navigation-alignment-center #header-bar { text-align: center; } .navigation-alignment-right #header-bar { text-align: right; } .sidebar-location-left.sidebar-large:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-left #header-bar { left: 303px; } .sidebar-location-left.sidebar-normal:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-left #header-bar { left: 252px; } .sidebar-location-left.sidebar-minimal:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-left.sidebar-minimal:not(.fourchan-ss-navigation) #header-bar { left: 20px; } .sidebar-location-right.sidebar-large:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-right #header-bar { right: 303px; } .sidebar-location-right.sidebar-normal:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-right #header-bar { right: 252px; } .sidebar-location-right.sidebar-minimal:not(.pagination-on-side):not(.fourchan-ss-navigation) .pagelist, .sidebar-location-right.sidebar-minimal:not(.fourchan-ss-navigation) #header-bar { right: 20px; } .fourchan-ss-navigation .pagelist, .fourchan-ss-navigation #header-bar { left: 0; right: 0; border-left: 0; border-right: 0; border-radius: 0 !important; } .hide-navigation-decorations #header-bar { font-size: 0; color: transparent; word-spacing: 2px; } #shortcuts { float: right; } .fixed #header-bar.autohide { z-index: 24; } .fixed #header-bar { position: fixed; } .top #header-bar { top: 0; border-top-width: 0; } .rounded-edges.top #header-bar { border-radius: 0 0 3px 3px; } .fixed.bottom #header-bar { bottom: 0; border-bottom-width: 0; } .rounded-edges.bottom #header-bar { border-radius: 3px 3px 0 0; } .hide #header-bar { position: fixed; top: 110%; bottom: auto; } /* Header Autohide */ .fixed #header-bar.autohide:not(:hover) { box-shadow: none; transition: all .8s .6s cubic-bezier(.55, .055, .675, .19); } .fixed.top #header-bar.autohide:not(:hover) { margin-bottom: -1em; -webkit-transform: translateY(-100%); } .fixed.bottom #header-bar.autohide:not(:hover) { -webkit-transform: translateY(100%); } #scroll-marker { left: 0; right: 0; height: 10px; position: absolute; } #header-bar #scroll-marker { display: none; } .fixed #header-bar #scroll-marker { display: block; } .fixed.top header-bar #scroll-marker { top: 100%; } .fixed.bottom #header-bar #scroll-marker { bottom: 100%; } /* Notifications */ #notifications { position: fixed; top: 0; text-align: center; right: 0; left: 0; transition: all .8s .6s cubic-bezier(.55, .055, .675, .19); } .fixed.top #header-bar #notifications { position: absolute; top: 100%; } .notification { font-weight: 700; text-shadow: 0 1px 2px rgba(0, 0, 0, .5); box-shadow: 0 1px 2px rgba(0, 0, 0, .15); border-radius: 2px; margin: 1px auto; width: 500px; max-width: 100%; position: relative; transition: all .25s ease-in-out; } .notification.error { background-color: hsla(0, 100%, 38%, .9); } .notification.warning { background-color: hsla(36, 100%, 38%, .9); } .notification.info { background-color: hsla(200, 100%, 38%, .9); } .notification.success { background-color: hsla(104, 100%, 38%, .9); } .notification, .notification a { color: #fff !important; } .notification > .close { top: 0; padding: 2px; right: 4px; position: absolute; color: #fff; } .message { box-sizing: border-box; padding: 6px 20px; max-height: 200px; width: 100%; overflow: auto; } /* Updater / Thread Stats */ .float #thread-stats, .float #updater { position: fixed; } #update-status.new::after { content: ', '; } /* Pagination */ .pagelist { border-style: solid; border-width: 1px; z-index: 6; } .pagination-alignment-center .pagelist { text-align: center; } .pagination-alignment-right .pagelist { text-align: right; } .pagination-sticky-top .pagelist { position: fixed; top: 0; border-top-width: 0; } .pagination-sticky-bottom .pagelist { position: fixed; bottom: 0; border-bottom-width: 0; } .pagination-top .pagelist { position: static; border-top-width: 0; } .pagination-bottom .pagelist { position: static; } .pagination-top.rounded-edges .pagelist, .pagination-sticky-top.rounded-edges .pagelist { border-radius: 0 0 3px 3px; } .pagination-bottom.rounded-edges .pagelist, .pagination-sticky-bottom.rounded-edges .pagelist { border-radius: 3px 3px 0 0; } .pagination-hide .pagelist { display: none; } .pagination-on-side .pagelist { position: fixed; padding: 0; top: auto; bottom: 0.5em; margin: 0; background: none transparent !important; border: 0 none !important; text-align: right; } .pagination-on-side.post-form-style-fixed.show-post-form-header .pagelist { bottom: 23.1em; } .pagination-on-side.post-form-style-fixed .pagelist { bottom: 21.6em; } .sidebar-location-left.pagination-on-side .pagelist { -webkit-transform: rotate(-90deg); -webkit-transform-origin: bottom left; } .sidebar-location-right.pagination-on-side .pagelist { -webkit-transform: rotate(90deg); -webkit-transform-origin: bottom right; } .sidebar-location-right.sidebar-large.pagination-on-side .pagelist { left: auto; right: 301px; } .sidebar-location-left.sidebar-large.pagination-on-side .pagelist { right: auto; left: 301px; } .sidebar-location-right.sidebar-normal.pagination-on-side .pagelist { left: auto; right: 246px; } .sidebar-location-left.sidebar-normal.pagination-on-side .pagelist { right: auto; left: 246px; } .sidebar-location-right.sidebar-minimal.pagination-on-side .pagelist { left: auto; right: 246px; } .sidebar-location-left.sidebar-minimal.pagination-on-side .pagelist { right: auto; left: 18px; } .hide-navigation-decorations .pagelist { font-size: 0; color: transparent; word-spacing: 0; } .pagelist input, .pagelist div { vertical-align: middle; } .hide-navigation-decorations .pages a { margin: 0 1px; } .next, .pages, .prev { display: inline-block; margin: 0 3px; } /* Icons */ .icons-4chan-ss #navtopright .exlinksOptionsLink::after, .icons-4chan-ss #main-menu, .icons-4chan-ss .navLinks > a:first-of-type::after, .icons-4chan-ss #thread-watcher::after, .icons-4chan-ss #globalMessage::after, .icons-4chan-ss #boardNavDesktopFoot::after, .icons-4chan-ss #img-controls, .icons-4chan-ss #catalog::after, .icons-4chan-ss #fappeTyme { background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAACWCAMAAAA2YSLzAAAAPFBMVEVkZGRlZWVjY2NmZmZnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dZxmG7AAAAE3RSTlMFFQ0AJD8eQFRqf5CgssDM4+73gHqZRAAAA0pJREFUSMetVlmy5CgMZDMGxK7737Ulgcu8ejMREzHtD7sShJRaKWV/Psq3iz7QGwTF2BZ01hp3N6yasctZJANiN5ZlItDLtNkQDGNeMLU7EqmCbUwhkhZbwsIuNbyWPX7dIyHOrDYOc8SOiEUJjojN0EsWlCXRrq2qvJCsIjic2OcFrwrOpdmTimqVyWG7ZkrWy97p7z/hACd2FUetBcQDpTN+nuKsGng881L5xOz/VQ88xL/eQkyZT3axp+4dUMwvH0Pnhn6wSyR+8IdR4f43/v8XX1BHjXpjwy5RdEcQ7DiuzlBUsFD+GeIFEy6W0pKXoSZOiUz5tf99nvTDD/1sP9VRPvb/un86lT57SVqwSk8KR+L6kgTOlcZslRQe5WmJRKovETW7Anb+HzxUW4Xgnv11fuuj82aKXHz1Tzztx9v4VA9+/6le26B+3VhTC9RMPIr0qx4zaWNsnFRO0s8FWgEIFIRiVUAIlJGciqMmCwpQWyI/OplXA1RrXG1YI2svTQ3ufhWjNlKFqtXFI7Yg+zAXRcBZ+HygJuVHd0ys35bVn6QojLL5cZeVvPht/mVu/r/8s7GMXsLjv2s71GZhgjnEwsEVXogiSl/pl7LWra0IQgO3poTsieoYd4dhWfJlGWqyQf6sLxWt3/MRa4Im04ixeSdAWnxvqCX6tObVmzpZOPOZvrBNJF8gmGciBChsV+YdRYwnAvNpS4AnYFBm0KA2a35Unh+efxjercaLfV7wW0rtUTNl2j715al/9VtfutF+NZ/+aZSa+py/GCpRyvr17EsVLbRhmN++BBY/ik5/+YPK6bKnf2T8fh7P+uEYn0D3E4L3i6QHmvc3+k+8PN6Mb1w52tje6LbAi+M0FT4YneqVbpVDPnL2Xqx7m3tf9ENXHba9H/a/+X3z/+XfCnOo+Zy/o4SgY5Z6iq0nb+9Mc4JxL5f1qYs+xhTP/uiX/cMe4+hDHAfGnmGe+Ev+G88vnG7Ie20wHiUt/S1Kv+6BCM/9fkEfz73/9HNufQ4ZKdzvnwtS/LXltRcJB/yJ23H/mo89nPFa85Li3XOYu435LwTXKVWwO+cnlWFTB47L/AdfR//KI2bvF8sAb0c/M+1+YE3/oS77B8N+UUVHraV6AAAAAElFTkSuQmCC\"); } .icons-oneechan #navtopright .exlinksOptionsLink::after, .icons-oneechan #main-menu, .icons-oneechan .navLinks > a:first-of-type::after, .icons-oneechan #thread-watcher::after, .icons-oneechan #globalMessage::after, .icons-oneechan #boardNavDesktopFoot::after, .icons-oneechan #img-controls, .icons-oneechan #catalog::after, .icons-oneechan #fappeTyme { background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAACWCAMAAAA2YSLzAAAAPFBMVEVoaGhqampeXl5sbGxsbGxra2tsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGzXmsRLAAAAE3RSTlMAEAYnHBg2QExbcYaWqM++2+z4BMdvAwAAAtVJREFUSMfFVgmu3CAMhYRPAmb3/e9aL5Bl2kptVbXWSOSBsY15NmOMMZs1KnNExC+ezgV4MBtNMIw58+qX2REtQwiifdC6hwlNQBGfUlBzc+KYkP3IxH5hNvicCPXrMfEVi3ts2WrzaiN6jie2OI2GXbBfXiA/XPyexPpEHrHdyDV8YAt6vEYCVpJ3S7rXAZKkkfbnuR8Uk/32xsac6Y01La2ZfyIh1VrX9Rnfu5ygd6/XeQAGFxACkopDb3mkeXug48x5FCKhNzW+1j2t8/5EEwHTIfPm6G3aP37o/w/ir3QZ2V/xY0spdSxWL7MrLU7slmnDSY0UrH6CBJ/wFI3TNGECCDY9G4xmrpDkZvQMJ4q31EzLQuhipr7ag8ueFa+hUQy2d43nnPGg7NopHTUVyYlWpE+lUT4qfhDCnLpzB8oXLLJb4leptD/JblswOaZd0gRkDV0cJi69NNOUaclRpG6S1NPdRVPLjI3VSjWV8+FmaARknTxqfipl0tGR1DXvd0h251Ww/ZlaNQoaX3bqUS+IK6ZX4hysvuQinS+6n9638/6BbK4RLi6R11O8rPS4OnO66KHtw6yK96BWrg5QxDGcVzcoB8cYb/dE1zPO6C+pHxN0Ttw/JtJrx55+oV9Jq+ScF22IfBWDD+sHfTnBmKlpS99hPGSC4SBsi+dP3p0PjVBVedMdO3WoG57cAEbYVNkRHFROIzjYuGjoM7LOaEQKbtQjkuo5hCSMmezaNq3Gl6TE5J3ZLMu26SjpPJZo4h/9FJhT4JQJzjFXD7x54fBgzO9RvDH9Vl5vHIetcGHct1apLh/6gU3c2PYy5rrYh7a1NP29/H/G9xn/d+f7FNVcw9/H/9sf8ymXPnqdDd7Wx3OpzWRJuP8+iMTFe7wZq48Tce7QciNetUzku+pT/t4UHK/iIq2yPR/8y/315M/rWl1A/sM83phVh6+aeZY39OLNN4Y0P2GdHOWPAAAAAElFTkSuQmCC\"); } /* Banner & Board Title */ .boardBanner { line-height: 0; } .faded-4chan-banner .boardBanner { opacity: 0.5; transition: opacity 0.3s ease-in-out .5s; } .faded-4chan-banner .boardBanner:hover { opacity: 1; transition: opacity 0.3s ease-in; } /* From 4chan SS / OneeChan */ .fourchan-banner-reflection #Banner { -webkit-box-reflect: below 0 -webkit-linear-gradient(rgba(255,255,255,0), rgba(255,255,255,0) 10%, rgba(255,255,255,.5)); } .fourchan-banner-at-sidebar-top .boardBanner, .fourchan-banner-at-sidebar-bottom .boardBanner, .fourchan-banner-at-sidebar-bottom .boardBanner { position: fixed; } .fourchan-banner-at-sidebar-top .boardBanner { top: 16px; } .fourchan-banner-at-sidebar-bottom .boardBanner { bottom: 270px; } .fourchan-banner-under-post-form .boardBanner { bottom: 130px; } .board-title-at-sidebar-top.sidebar-location-right #boardTitle, .board-title-at-sidebar-bottom.sidebar-location-right #boardTitle, .board-title-under-post-form.sidebar-location-right #boardTitle, .fourchan-banner-at-sidebar-top.sidebar-location-right .boardBanner, .fourchan-banner-at-sidebar-bottom.sidebar-location-right .boardBanner, .fourchan-banner-under-post-form.sidebar-location-right .boardBanner { right: 2px; } .board-title-at-sidebar-top.sidebar-location-left #boardTitle, .board-title-at-sidebar-bottom.sidebar-location-left #boardTitle, .board-title-under-post-form.sidebar-location-left #boardTitle, .fourchan-banner-at-sidebar-top.sidebar-location-left .boardBanner, .fourchan-banner-at-sidebar-bottom.sidebar-location-left .boardBanner, .fourchan-banner-under-post-form.sidebar-location-left .boardBanner { left: 2px; } .board-title-at-sidebar-top #boardTitle, .board-title-at-sidebar-bottom #boardTitle, .board-title-under-post-form #boardTitle, .fourchan-banner-at-sidebar-top .boardBanner img, .fourchan-banner-at-sidebar-bottom .boardBanner img, .fourchan-banner-under-post-form .boardBanner img { width: 248px; } .board-title-at-sidebar-top.sidebar-large #boardTitle, .board-title-at-sidebar-bottom.sidebar-large #boardTitle, .board-title-under-post-form.sidebar-large #boardTitle, .fourchan-banner-at-sidebar-top.sidebar-large .boardBanner img, .fourchan-banner-at-sidebar-bottom.sidebar-large .boardBanner img, .fourchan-banner-under-post-form.sidebar-large .boardBanner img { width: 299px; } .fourchan-banner-at-top .boardBanner { position: relative; display: table; margin: 12px auto; text-align: center; } :root:not(.board-subtitle) .boardSubtitle, .board-title-hide #boardTitle, .fourchan-banner-hide .boardBanner { display: none; } #boardTitle { text-align: center; z-index: 4; } .board-title-at-sidebar-top #boardTitle, .board-title-at-sidebar-bottom #boardTitle, .board-title-under-post-form #boardTitle { position: fixed; } .board-title-at-sidebar-top.fourchan-banner-at-sidebar-top.sidebar-large #boardTitle { top: 121px; } .board-title-at-sidebar-top.fourchan-banner-at-sidebar-top #boardTitle { top: 104px; } .board-title-at-sidebar-top #boardTitle { top: 40px; } .board-title-at-sidebar-bottom #boardTitle { bottom: 280px; } .board-title-under-post-form #boardTitle { bottom: 140px; } /* Hover UI */ .move { cursor: pointer; } #ihover { position: fixed; max-height: 97%; max-width: 75%; z-index: 22; } #qp { position: fixed; z-index: 22; } #qp .postMessage::after { clear: both; display: block; content: \"\"; } #qp .full-image { max-height: 300px; max-width: 500px; } #menu { position: fixed; outline: none; z-index: 22; } /* Image Expansion */ .fit-width .full-image { max-width: 100%; width: 100%; } .fit-height .full-image { max-height: 95vh; } .images-overlap-post-form .full-image { position: relative; z-index: 21; } /* Delete Buttons */ .hide-delete-ui .deleteform, .hide-delete-ui .post:not(#exlinks-options) .rice { display: none; } .hide-delete-ui .postInfo { padding: 0 0 0 3px; } .deleteform { position: fixed; z-index: 18; width: 0; bottom: 0; right: 0; border-width: 1px 0 0 1px; border-style: solid; font-size: 0; color: transparent; } .deleteform:hover { width: auto; } .deleteform::before { z-index: 18; border-width: 1px 0 0 1px; border-style: solid; content: '✖'; display: block; position: fixed; bottom: 0; right: 0; box-sizing: border-box; height: 1.6em; width: 1.4em; text-align: center; } .deleteform:hover::before { display: none; } .deleteform input { margin: 0 1px 0 0; } /* Slideout Navigation */ #boardNavDesktopFoot { position: fixed; text-align: center; font-size: 0; color: transparent; overflow: hidden; box-sizing: border-box; width: 248px; } .sidebar-large #boardNavDesktopFoot { width: 299px; } .sidebar-location-right #boardNavDesktopFoot { right: 2px; } .sidebar-location-left #boardNavDesktopFoot { left: 2px; } #boardNavDesktopFoot:hover { overflow-y: auto; padding: 2px; } #boardNavDesktopFoot:not(:hover) { border-color: transparent; background-color: transparent; height: 0; overflow: hidden; padding: 0; border: 0 none; } .slideout-navigation-compact #boardNavDesktopFoot { word-spacing: 1px; } .slideout-navigation-list #boardNavDesktopFoot a { display: block; } .slideout-navigation-list #boardNavDesktopFoot:hover { max-height: 400px; } .slideout-navigation-list #boardNavDesktopFoot a::after { content: ' - ' attr(title); } .slideout-navigation-list #boardNavDesktopFoot a[href*='//boards.4chan.org/']::after, .slideout-navigation-list #boardNavDesktopFoot a[href*='//rs.4chan.org/']::after { content: '/ - ' attr(title); } .slideout-navigation-list #boardNavDesktopFoot a[href*='//boards.4chan.org/']::before, .slideout-navigation-list #boardNavDesktopFoot a[href*='//rs.4chan.org/']::before { content: '/'; } .slideout-navigation-hide #boardNavDesktopFoot { display: none; } /* Watcher */ #thread-watcher { position: fixed; z-index: 14; padding: 2px; } #thread-watcher { width: 200px; } #thread-watcher:not(:hover) { max-height: 200px; overflow: hidden; } .rounded-edges #thread-watcher { border-radius: 3px; } #thread-watcher > div { max-height: 1.3em; overflow: hidden; } .slideout-watcher #thread-watcher { box-sizing: border-box; width: 248px; } .slideout-watcher.sidebar-large #boardNavDesktopFoot { width: 299px; } .slideout-watcher.sidebar-location-right #thread-watcher { left: auto !important; right: 2px !important; } .slideout-watcher.sidebar-location-left #thread-watcher { right: auto !important; left: 2px !important; } .slideout-watcher #thread-watcher .move { cursor: default; } .slideout-watcher.underline-links #thread-watcher .move { text-decoration: underline; } .slideout-watcher #thread-watcher > div { overflow: hidden; } .slideout-watcher #thread-watcher:hover { overflow-y: auto; } .slideout-watcher #thread-watcher:not(:hover) { height: 0; overflow: hidden; border: 0 none; padding: 0; } .watch-thread-link { padding-top: 18px; width: 18px; height: 0px; display: inline-block; background-repeat: no-repeat; opacity: 0.2; position: relative; top: 1px; } .watch-thread-link.watched { opacity: 1; } /* Announcements */ #globalMessage { text-align: center; } .rounded-edges #globalMessage { border-radius: 3px; } .announcements-slideout #globalMessage { position: fixed; padding: 2px; width: 248px; } .announcements-slideout.sidebar-location-right #globalMessage { left: auto; right: 2px; } .announcements-slideout.sidebar-location-left #globalMessage { right: auto; left: 2px; } .announcements-slideout.sidebar-large #globalMessage { width: 299px; } .announcements-slideout #globalMessage h3 { margin: 0; } .announcements-slideout #globalMessage:hover { box-sizing: border-box; overflow-y: auto; } .announcements-slideout #globalMessage:not(:hover) { height: 0; overflow: hidden; padding: 0; border: 0 none; } .announcements-hide #globalMessage { display: none !important; } /* Threads */ #threads, .rounded-edges .board > .thread { border-radius: 4px; } /* Thread Clearfix */ .thread > .threadContainer:last-of-type::after, .thread > .postContainer:last-of-type::after { display: block; content: ' '; clear: both; } /* Posts */ .expanding { opacity: .5; } .fileText:hover .fntrunc, .fileText:not(:hover) .fnfull, .expanded-image > .post > .file > .fileThumb > img[data-md5], .post > .file > .fileThumb > .full-image { display: none; } .expanded-image > .post > .file > .fileThumb > .full-image { display: block; } .thread > .replyContainer:last-of-type .post { margin-bottom: 0; } .menu-button { position: relative; } .stub .menu-button, .post .menu-button, .hide-thread-button, .show-thread-button span, .hide-reply-button, .show-reply-button span { float: right; } .post .menu-button, .hide-thread-button, .hide-reply-button { margin: 0 3px; opacity: 0; transition: opacity .3s ease-out 0s; } .post:hover .hide-reply-button, .post:hover .menu-button, .post:hover .hide-thread-button, .hidden_thread .hide-thread-button, .hidden_thread .menu-button, .inline .hide-reply-button, .inline .menu-button { opacity: 1; } .hidden_thread { text-align: right; } .color-user-ids .posteruid .hand { padding: .1em .3em; border-radius: 1em; font-size: 80%; } .postInfo > span { vertical-align: bottom; } .bolds .subject, .bolds .name { font-weight: 600; } .italics .postertrip { font-style: italic; } .underline-links .replylink { text-decoration: underline; } .fileInfo { padding: 0 3px; } .fileThumb { float: left; margin: 3px 20px; outline: none; } .reply.post { box-sizing: border-box; display: inline-block; } .fit-width-replies .reply.post { display: block; overflow: hidden; } .fit-width-replies .expanded-image .reply.post, .fit-width-replies .hasInline .reply.post { width: 100%; } .indent-replies #unread-line, .indent-replies .thread > .replyContainer, .indent-replies .threadContainer > .replyContainer { margin-left: 2em; } .expanded-image .reply.post, .hasInline .reply.post { display: inline-block; overflow: visible; clear: both; } .rounded-edges .post { border-radius: 3px; } .spoiler, s { text-decoration: none; } /* Emoji */ a.useremail:last-of-type { vertical-align: top; } /* Reply Clearfix */ .reply.post .postMessage { clear: right; } .op-background .op.post .postMessage::after, .force-reply-break .op.post .postMessage::after { display: block; content: ' '; clear: both; } /* OP */ .favicon { vertical-align: bottom; } .op-background .op.post { box-sizing: border-box; } /* Summary */ .force-reply-break .summary { clear: both; } /* Inlined */ .inline { margin: 2px 8px 2px 2px; } .post .inline { margin: 2px; } .inline .replyContainer { display: inline-block; } /* Inlined Clearfix */ .inline .postMessage::after { clear: both; display: block; content: \"\"; } /* Quotes */ .inlined { opacity: .5; } .underline-links .quotelink { text-decoration: underline; } .filtered, .quotelink.filtered { text-decoration: line-through !important; } .inline + .hashlink { display: none; } /* Quote Threading */ .threadContainer { padding-left: 2em; border-left: 1px solid; } .indent-replies .threadContainer { margin-left: 2em; padding-left: 0; } .threadOP { clear: both; } /* Backlinks */ .underline-links .forwardlink, .underline-links .backlink { text-decoration: underline; } .backlink.dead { text-decoration: none; } .filtered-backlinks .filtered.backlink { display: none; } .backlinks-position-lower-left .container, .backlinks-position-lower-right .container { max-width: 100%; padding: 0 5px; } .backlinks-position-lower-left .reply.quoted, .backlinks-position-lower-right .reply.quoted { position: relative; padding-bottom: 1.7em; } .backlinks-position-lower-left .inline .reply.quoted, .backlinks-position-lower-right .inline .reply.quoted, .backlinks-position-lower-right #qp .reply.quoted, .backlinks-position-lower-left #qp .reply.quoted { position: static; padding-bottom: 0; } .backlinks-position-lower-right .reply .container, .backlinks-position-lower-left .reply .container { position: absolute; bottom: 0; padding: 0 5px; } .backlinks-position-lower-left .reply .container { left: 0; } .backlinks-position-lower-right .reply .container { right: 0; } .backlinks-position-lower-right .container::before, .backlinks-position-lower-left .reply .container::before { content: 'REPLIES: '; } .container:empty { display: none; } .backlinks-position-lower-left #qp .container, .backlinks-position-lower-left .inline .container, .backlinks-position-lower-right .inline .container, .backlinks-position-lower-right #qp .container { position: static; max-width: 100%; } .backlinks-position-lower-left #qp .container::before, .backlinks-position-lower-left .inline .container::before, .backlinks-position-lower-right #qp .container::before, .backlinks-position-lower-right .inline .container::before { content: ''; } .backlinks-position-lower-right .inline .container { float: none; } /* Fixes text spoilers */ .remove-spoilers.indicate-spoilers .spoiler::before, .remove-spoilers.indicate-spoilers s::before { content: '[spoiler]'; } .remove-spoilers.indicate-spoilers .spoiler::after, .remove-spoilers.indicate-spoilers s::after { content: '[/spoiler]'; } :root:not(.remove-spoilers) .spoiler:not(:hover) *, :root:not(.remove-spoilers) s:not(:hover) * { color: rgb(0,0,0) !important; text-shadow: none !important; } :root:not(.remove-spoilers) spoiler:not(:hover), :root:not(.remove-spoilers) s:not(:hover) { background-color: rgb(0,0,0); color: rgb(0,0,0) !important; text-shadow: none !important; } /* Code */ .prettyprint { box-sizing: border-box; font-family: monospace; display: inline-block; margin: 0 auto .1em 0; vertical-align: middle; white-space: pre-wrap; border-radius: 2px; overflow-x: auto; padding: 3px; max-width: 100%; } /* Menu */ .entry { border-bottom: 1px solid rgba(0,0,0,.25); cursor: pointer; display: block; outline: none; padding: 3px 1em 3px 7px; position: relative; text-decoration: none; white-space: nowrap; } .entry:last-child { border-bottom: 0; } .has-submenu::after { content: \"\"; border-left: .5em solid; border-top: .3em solid transparent; border-bottom: .3em solid transparent; display: inline-block; margin: .3em; position: absolute; right: 0; } .submenu { display: none; position: absolute; top: -1px; } .focused .submenu { display: block; } /* Stubs */ .fit-width-replies .stub { display: block; text-align: right; clear: both; } /* Element Replacing: */ /* Checkboxes */ .rice { cursor: pointer; width: 9px; height: 9px; margin: 2px 3px 3px; display: inline-block; vertical-align: bottom; } input[type=checkbox]:checked + .rice { position: relative; } input[type=checkbox]:checked + .rice::after { content: \"\"; display: block; width: 4px; height: 10px; border-width: 0 3px 3px 0; border-style: solid; -webkit-transform: rotate(45deg); position: absolute; left: 2px; bottom: -1px; } .rounded-edges .rice { border-radius: 2px;} } .circle-checkboxes .rice { border-radius: 6px;} } input:checked + .rice { background-attachment: scroll; background-repeat: no-repeat; background-position: bottom right; } /* Selects */ .selectrice { position: relative; cursor: default; overflow: hidden; text-align: left; } #settings .selectrice { display: inline-block; } .selectrice::after { content: \"\"; border-right: .25em solid transparent; border-left: .25em solid transparent; position: absolute; right: .4em; top: .5em; } .selectrice::before { content: \"\"; height: 1.6em; position: absolute; right: 1.3em; top: 0; } /* Select Dropdown */ #selectrice { padding: 0; margin: 0; position: fixed; max-height: 120px; overflow-y: auto; overflow-x: hidden; z-index: 32; } #selectrice:empty { display: none; } /* Post Form Shortcut */ .qr-shortcut.on-page { font-size: 250%; } /* Post Form */ #qr { z-index: 20; position: fixed; background: none; border: none; padding: 1px; min-width: 248px; background: transparent; border: 1px solid transparent; } .sidebar-large #qr { min-width: 299px; } .rounded-edges #qr, .rounded-edges #qrtab { border-radius: 3px 3px 0 0; } .post-form-style-fixed #qr { top: auto !important; } .sidebar-location-left:not(.post-form-style-float) #qr { left: 0 !important; right: auto !important; } .sidebar-location-right:not(.post-form-style-float) #qr { right: 0 !important; left: auto !important; } :root:not(.post-form-style-float) #qr { bottom: 0 !important; } .fourchan-ss-navigation.fixed.bottom:not(.post-form-style-float) #qr, .fourchan-ss-navigation.index.pagination-sticky-bottom:not(.post-form-style-float) #qr { bottom: 1.5em !important; } .post-form-style-slideout #qr { top: auto !important; } .post-form-style-slideout.sidebar-location-left #qr { -webkit-transform: translateX(-93%); } .post-form-style-slideout.sidebar-location-right #qr { -webkit-transform: translateX(93%); } .post-form-style-slideout #qr:hover, .post-form-style-slideout #qr.has-focus, .post-form-style-slideout #qr.dump { -webkit-transform: translate(0); } .post-form-style-tabbed-slideout #qr { top: auto !important; } .post-form-style-tabbed-slideout.sidebar-location-left #qr { -webkit-transform: translateX(-100%); } .post-form-style-tabbed-slideout.sidebar-location-right #qr { -webkit-transform: translateX(100%); } .post-form-style-tabbed-slideout #qr:hover, .post-form-style-tabbed-slideout #qr.has-focus, .post-form-style-tabbed-slideout #qr.dump { -webkit-transform: translateX(0); } .post-form-style-tabbed-slideout #qrtab { position: absolute; top: 0; width: 120px; text-align: center; border-width: 1px 1px 0 1px; cursor: default; } .post-form-style-tabbed-slideout.sidebar-location-left #qrtab { -webkit-transform: rotate(90deg); -webkit-transform-origin: bottom right; left: 100%; } .post-form-style-tabbed-slideout.sidebar-location-right #qrtab { -webkit-transform: rotate(-90deg); -webkit-transform-origin: bottom right; right: 100%; } .post-form-style-tabbed-slideout #qr:hover #qrtab, .post-form-style-tabbed-slideout #qr.has-focus #qrtab, .post-form-style-tabbed-slideout #qr.dump #qrtab { opacity: 0 !important; } .post-form-style-slideout #qrtab input, .post-form-style-slideout #qrtab .rice, .post-form-style-tabbed-slideout #qrtab input, .post-form-style-tabbed-slideout #qrtab .close, .post-form-style-tabbed-slideout #qrtab .rice, .post-form-style-tabbed-slideout #qrtab span { display: none; } .post-form-style-tabbed-slideout #qrtab .selectrice { text-align: center; } .transparent-post-form #qr { opacity: 0.2; transition: opacity .3s ease-in-out 1s; } .transparent-post-form #qr:hover, .transparent-post-form #qr.has-focus, .transparent-post-form #qr.dump { opacity: 1; transition: opacity .3s linear; } :root:not(.show-post-form-header):not(.post-form-style-float):not(.post-form-style-tabbed-slideout) #qrtab, .post-form-style-float .autohide:not(:hover):not(.has-focus) form, .show-post-form-header.post-form-style-fixed .autohide:not(:hover):not(.has-focus) form { display: none !important; } :root:not(.post-form-style-tabbed-slideout) #qrtab { margin-bottom: 1px; } #qr.autohide:not(:hover):not(.has-focus) #qrtab { margin-bottom: 0; } .post-form-slideout-transitions.post-form-style-slideout #qr, .post-form-slideout-transitions.post-form-style-tabbed-slideout #qr { transition: -webkit-transform .3s ease-in-out 1s; } .post-form-slideout-transitions.post-form-style-tabbed-slideout #qr.dump, .post-form-slideout-transitions.post-form-style-tabbed-slideout #qr:hover, .post-form-slideout-transitions.post-form-style-tabbed-slideout #qr.has-focus, .post-form-slideout-transitions.post-form-style-slideout #qr.dump, .post-form-slideout-transitions.post-form-style-slideout #qr:hover, .post-form-slideout-transitions.post-form-style-slideout #qr.has-focus { transition: -webkit-transform .3s linear; } .post-form-slideout-transitions #qrtab { transition: opacity .3s ease-in-out 1s; } .post-form-slideout-transitions #qr:hover #qrtab { transition: opacity .3s linear; } #qr .close { float: right; padding: 0 3px; } #qr .warning { min-height: 1.6em; vertical-align: middle; padding: 0 1px; border-width: 1px; border-style: solid; } .persona { width: 248px; max-width: 100%; min-width: 100%; } .persona input.field { width: 100%; } #qr textarea.field { height: 11.6em; min-height: 6em; } #qr.has-captcha textarea.field { height: 6em; } .compact-post-form-inputs .persona input.field { width: 33%; } .compact-post-form-inputs .persona input.field:first-child { margin: 0; } .compact-post-form-inputs .persona input.field { margin: 0 0 0 0.5%; } .compact-post-form-inputs #qr textarea.field { height: 14.9em; min-height: 9em; } .compact-post-form-inputs #qr.has-captcha textarea.field { height: 9em; } .tripcode-hider .tripped:not(:hover):not(:focus) { color: transparent !important; } .textarea-resize-horizontal #qr textarea { resize: horizontal; } .textarea-resize-vertical #qr textarea { resize: vertical; } .textarea-resize-both #qr textarea { resize: both; } .textarea-resize-none #qr textarea { resize: none; } .captcha-img { margin: 1px 0 0; text-align: center; line-height: 0; } .captcha-img img { width: 246px; } .captcha-img, .captcha-img img { height: 4em; } .captcha-input { width: 100%; margin: 1px 0 0; } .field, .selectrice, button, input:not([type=radio]) { box-sizing: border-box; height: 1.6em; margin: 1px 0 0; vertical-align: bottom; padding: 0 1px; outline: none; } .selectrice { padding-right: 1.6em; } #qr textarea { min-width: 100%; } #qr [type='submit'] { width: 25%; } [type='file'] { position: absolute; opacity: 0; z-index: -1; } /* Fake File Input */ #qr-filename, #qr-filerm, .has-file #qr-no-file { display: none; } #qr-no-file, .has-file #qr-filename { display: block; } .has-file #qr-filerm { display: inline-block; } #qr-extras-container { position: absolute; right: 0; top: 0; z-index: 2; } #qr-extras-container > label, #qr-extras-container > a { cursor: pointer; margin-right: 3px; } #qr-filename-container { box-sizing: border-box; display: inline-block; position: relative; width: 100px; min-width: 74.6%; max-width: 74.6%; margin-right: 0.4%; overflow: hidden; padding: 2px 1px 0; } /* Thread Select */ #qr-thread-select, #qr-thread-select .selectrice div { display: inline; } #qr-thread-select .selectrice { cursor: pointer; display: inline-block; width: 120px; border: none; background: none transparent; padding: 0; margin: 0; height: auto; } #qr-thread-select .selectrice::before, #qr-thread-select .selectrice::after { display: none; } /* Dumping UI */ .dump #dump-list-container { display: block; } #dump-list-container { display: none; position: relative; overflow-y: hidden; margin-top: 1px; } #dump-list { overflow-x: auto; overflow-y: hidden; white-space: nowrap; width: 248px; max-width: 100%; min-width: 100%; } #dump-list:hover { overflow-x: auto; } .qr-preview { box-sizing: border-box; counter-increment: thumbnails; cursor: move; display: inline-block; height: 90px; width: 90px; padding: 2px; opacity: .5; overflow: hidden; position: relative; text-shadow: 0 1px 1px #000; transition: opacity .25s ease-in-out; vertical-align: top; } .qr-preview:hover, .qr-preview:focus { opacity: .9; } .qr-preview::before { content: counter(thumbnails); color: #fff; position: absolute; top: 3px; right: 3px; text-shadow: 0 0 3px #000, 0 0 8px #000; } .qr-preview#selected { opacity: 1; } .qr-preview.drag { box-shadow: 0 0 10px rgba(0,0,0,.5); } .qr-preview.over { border-color: #fff; } .qr-preview > span { color: #fff; } .remove { background: none; color: #e00; font-weight: 700; padding: 3px; } a:only-of-type > .remove { display: none; } .remove:hover::after { content: \" Remove\"; } .qr-preview > label { background: rgba(0,0,0,.5); color: #fff; right: 0; bottom: 0; left: 0; position: absolute; text-align: center; } .qr-preview > label > input { margin: 0; } #add-post { cursor: pointer; font-size: 2em; position: absolute; top: 50%; right: 10px; -webkit-transform: translateY(-50%); } /* Ads */ .fade-ads .topad img, .fade-ads .middlead img, .fade-ads .bottomad img { opacity: 0.3; transition: opacity .3s linear; } .fade-ads .topad img:hover, .fade-ads .middlead img:hover, .fade-ads .bottomad img:hover { opacity: 1; } .hide-ads .bottomad + hr, .hide-ads .topad, .hide-ads .middlead, .hide-ads .bottomad, .hide-ads .ad-plea { display: none; } .shrink-ads .topad a img, .shrink-ads .middlead a img, .shrink-ads .bottomad a img { width: 500px; height: auto; } /* Mascot Positions */ #mascot { display: none; position: fixed; z-index: -1; bottom: 0; left: 0; right: 0; line-height: 0; cursor: pointer; } .mascot-position-above-post-form.post-form-style-fixed:not(.post-form-decorations) #mascot img { margin-bottom: -2px; } .mascots #mascot { display: block; } .sidebar-location-right.mascot-location-sidebar #mascot, .sidebar-location-left.mascot-location-opposite #mascot { left: auto; } .sidebar-location-left.mascot-location-sidebar #mascot, .sidebar-location-right.mascot-location-opposite #mascot { right: auto; } .sidebar-location-left.mascot-location-sidebar #mascot img, .sidebar-location-right.mascot-location-opposite #mascot img { -webkit-transform: scaleX(-1); } .fourchan-ss-navigation.bottom.fixed #mascot, .fourchan-ss-navigation.index.pagination-sticky-bottom #mascot { bottom: 1.5em } .mascots-overlap-posts #mascot { z-index: 3; } .mascot-position-middle #mascot { bottom: 50% !important; -webkit-transform: translateY(50%); } .mascot-position-top #mascot { bottom: auto !important; top: 17px; } .grayscale-mascots #mascot { -webkit-filter: url('#grayscale'); } .silhouettize-mascots #mascot img { -webkit-filter: url('#mascot-filter'); } /* Options */ #overlay { position: fixed; z-index: 30; top: 0; right: 0; left: 0; bottom: 0; background: rgba(0,0,0,.5); } #appchanx-settings { width: auto; left: 15%; right: 15%; top: 15%; bottom: 15%; position: fixed; z-index: 31; padding: .3em; } .rounded-edges #appchanx-settings, .rounded-edges #appchanx-settings fieldset, .rounded-edges .mascots-container, .rounded-edges .section-container, .rounded-edges .sections-list > a { border-radius: 3px; } .description { display: none; } #appchanx-settings h3, .section-keybinds, .section-mascots, .section-script, .style { text-align: center; } .section-keybinds table, .section-script fieldset, .section-style fieldset { text-align: left; } .section-keybinds table { margin: auto; } #appchanx-settings fieldset { padding: 5px 0; vertical-align: top; border: 0; margin: 0 3px 6px; display: inline-block; } .single-column-mode #appchanx-settings fieldset { display: block; margin: 0 auto 6px; } #appchanx-settings .section-advanced fieldset { display: block; margin: 0 auto 6px; } .section-advanced .archive-cell { min-width: 200px; } .section-advanced .selectrice { display: inline-block; clear: both; } .section-container { overflow: auto; position: absolute; top: 1.7em; right: 5px; bottom: 5px; left: 5px; padding: 5px; } .sections-list { padding: 0 3px; float: left; } .sections-list > a { cursor: pointer; position: relative; padding: 0 4px; z-index: 1; height: 1.4em; display: inline-block; border-width: 1px 1px 0 1px; border-color: transparent; border-style: solid; } .sections-list > a.tab-selected { border-style: solid; } .credits { float: right; } #appchanx-settings h3 { margin: 0; } .section-script fieldset > div, .section-style fieldset > div, .section-advanced fieldset > div { overflow: visible; padding: 0 5px 0 7px; } #appchanx-settings tr:nth-of-type(2n+1), .section-script fieldset > div:nth-of-type(2n+1), .section-advanced fieldset > div:nth-of-type(2n+1), .section-style fieldset > div:nth-of-type(2n+1), .section-keybinds tr:nth-of-type(2n+1), #selectrice li:nth-of-type(2n+1) { background-color: rgba(0, 0, 0, 0.05); } article li { margin: 10px 0 10px 2em; } #appchanx-settings .option { width: 50%; display: inline-block; vertical-align: bottom; } .option input { width: 100%; } .optionlabel { padding-left: 18px; } .rice + .optionlabel { padding-left: 0; } .section-script fieldset, .styleoption { text-align: left; } .section-style fieldset { width: 370px; } .section-script fieldset { width: 200px; } #mascotcontent, #themecontent, .suboptions { overflow: auto; position: absolute; top: 0; right: 0; bottom: 1.7em; left: 0; } #mascotcontent, #themecontent { padding: 5px; } #themecontent { top: 1.8em; } .mAlign { height: 250px; vertical-align: bottom; display: table-cell; line-height: 0; } #save, .stylesettings { position: absolute; right: 10px; bottom: 0; } .section-style .suboptions { bottom: 0; } .section-container textarea { font-family: monospace; min-height: 150px; resize: vertical; width: 100%; } /* Hover Functionality */ #mouseover { z-index: 33; position: fixed; max-width: 70%; } #mouseover:empty { display: none; } /* Mascot Tab */ #mascot_hide { padding: 3px; position: absolute; top: 2px; right: 18px; } #mascot_hide .rice { float: left; } #mascot_hide > div { height: 0; text-align: right; overflow: hidden; } #mascot_hide:hover > div { height: auto; } #mascot_hide label { width: 100%; display: block; clear: both; text-decoration: none; } .mascots-container { padding: 0; text-align: center; } .mascot, .mascotcontainer { overflow: hidden; } .mascot { position: relative; border: none; margin: 5px; padding: 0; width: 200px; display: inline-block; background-color: transparent; } .mascotcontainer { height: 250px; border: 0; margin: 0; max-height: 250px; cursor: pointer; bottom: 0; border-width: 0 1px 1px; border-style: solid; border-color: transparent; overflow: hidden; } .mascot img { max-width: 200px; } .export-button, .mascotname, #mascot-options { box-sizing: border-box; padding: 0; width: 100%; } #mascot-options { opacity: 0; transition: opacity .3s linear; } .mascot:hover #mascot-options { opacity: 1; } #mascot-options { position: absolute; bottom: 0; right: 0; left: 0; } .export-button { position: absolute; bottom: 1.7em; right: 0; left: 0; text-align: center; } #mascot-options a { display: inline-block; width: 33%; } #upload { position: absolute; width: 100px; left: 50%; margin-left: -50px; text-align: center; bottom: 0; } #mascots_batch { position: absolute; left: 10px; bottom: 0; } /* Themes Tab */ #themes h1 { position: absolute; right: 300px; bottom: 10px; margin: 0; transition: all .2s ease-in-out; opacity: 0; } #themes .selectedtheme h1 { right: 11px; opacity: 1; } #addthemes { position: absolute; left: 10px; bottom: 0; } .theme { margin: 1em; } /* Theme Editor */ #themeConf { position: fixed; top: 0; bottom: 0; width: 296px; z-index: 10; } .sidebar-location-right #themeConf { right: 2px; left: auto; } .sidebar-location-right #themeConf { left: 2px; right: auto; } #themebar input { width: 30%; } .option .color { width: 10%; border-left: none !important; color: transparent !important; } .option .colorfield { width: 90%; } .themevar textarea { min-width: 100%; max-width: 100%; height: 20em; resize: vertical; } /* Mascot Editor */ #mascotConf { position: fixed; height: 17em; bottom: 0; left: 50%; width: 500px; margin-left: -250px; overflow: auto; z-index: 10; } #mascotConf .option, #mascotConf .optionlabel { box-sizing: border-box; width: 50%; display: inline-block; vertical-align: middle; } #mascotConf .option input { width: 100%; } #close { position: absolute; left: 10px; bottom: 0; } /* Catalog */ #content .navLinks, #info .navLinks, .btn-wrap { display: block; } .navLinks > .btn-wrap:not(:first-of-type)::before { content: ' - '; } .button { cursor: pointer; } #content .btn-wrap, #info .btn-wrap { display: inline-block; } #post-preview, #quote-preview { position: absolute; z-index: 22; } .rounded-edges #post-preview { border-radius: 3px; } #settings, #threads, #info .navLinks, #content .navLinks { text-align: center; } #threads .thread { vertical-align: top; display: inline-block; word-wrap: break-word; overflow: hidden; margin: 1px; padding: 5px 0 3px; text-align: center; } .extended-small .thread, .small .thread { width: 165px; max-height: 320px; } .small .teaser, .large .teaser { display: none; } .extended-large .thread, .large .thread { width: 270px; max-height: 410px; } .extended-small .thumb, .small .thumb { max-width: 150px; max-height: 150px; } .panel { position: fixed; top: 50% !important; left: 50%; -webkit-transform: translate(-50%, -50%); padding: 5px; } .icon::after { display: inline-block; float: right; width: 1em; cursor: pointer; } .helpIcon::after { content: '?'; } .closeIcon::after { content: '✖'; } /* Front Page */ #logo { text-align: center; } #doc { box-sizing: border-box; margin: 10px auto; width: 1006px; padding: 2px; position: relative; } .rounded-edges #doc, .rounded-edges #doc div { border-radius: 3px; } #boards .boxcontent { vertical-align: top; text-align: center; } #filter-container, #options-container { top: 4px; right: 8px; position: absolute; } #filtermenu, #optionsmenu { top: 100% !important; left: auto !important; right: 0 !important; } #boards .column { box-sizing: border-box; display: inline-block; width: 180px; text-align: left; vertical-align: top; } .bd ul, .boxcontent ul { vertical-align: top; padding: 0; margin: 0; } .right-box .boxcontent ul { padding: 0 10px; } .yuimenuitem, .boxcontent li { list-style-type: none; } .boxbar { position: relative; } #doc h3, .boxbar h2 { margin: 0; } #doc h3 { text-decoration: none !important; } .underline-links #doc h3 { text-decoration: underline !important; } #ft, .box-outer { margin: 2px 0 0; overflow: hidden; } #ft, .boxbar, .boxcontent { padding: 0 8px; } .yui-module { position: absolute; } .yuimenuitem::before { content: \" [ ] \"; font-family: monospace; } .yuimenuitem-checked::before { content: \" [x] \" } .yui-g { overflow: hidden; } .yui-u { display: inline-block; vertical-align: top; width: 499px; float: right; } .yui-u.first { float: left; } #recent-images .boxcontent { text-align: center; } #ft { text-align: center; } #ft ul { padding: 0; } #ft li { list-style-type: none; display: inline-block; width: 100px; } #preview-tooltip-nws, #preview-tooltip-ws, #ft .fill, .clear-bug { display: none; } /* ExLinks */ #exlinks-options-content { padding: 5px; }", dynamic: function() { var editSpace, sidebarLocation; @@ -11812,12 +12168,12 @@ replyRGB = "rgb(" + (replybg.shiftRGB(parseInt(Conf['Silhouette Contrast'], 10), true)) + ")"; Style.lightTheme = bgColor.isLight(); Style.svg.innerHTML = "\n\n\n"; - return (".hide_thread_button span > span, .hide_reply_button span > span { background-color: " + theme["Links"] + "; } #mascot_hide label { border-bottom: 1px solid " + theme["Reply Border"] + "; } #content .thumb { box-shadow: 0 0 5px " + theme["Reply Border"] + "; } .export-button, .mascotname, #mascot-options { background: " + theme["Dialog Background"] + "; border: 1px solid " + theme["Buttons Border"] + "; } .highlight-you .opContainer.quotesYou, .highlight-own .opContainer.yourPost, .opContainer.filter-highlight { box-shadow: inset 5px 0 " + theme["Backlinked Reply Outline"] + "; } .highlight-you .quotesYou > .reply, .highlight-own .yourPost > .reply, .filter-highlight > .reply { box-shadow: -5px 0 " + theme["Backlinked Reply Outline"] + "; } hr { border-bottom: 1px solid " + theme["Reply Border"] + "; } hr#unread-line { border-bottom: 1px solid " + theme["Reply Background"] + "; visibility: visible; } .threadContainer { border-color: " + theme["Reply Border"] + " !important; } html { background: " + (backgroundC || '') + "; background-image: " + (theme["Background Image"] || '') + "; background-repeat: " + (theme["Background Repeat"] || '') + "; background-attachment: " + (theme["Background Attachment"] || '') + "; background-position: " + (theme["Background Position"] || '') + "; } .panel, .section-container, #exlinks-options-content, #themecontent { background: " + backgroundC + "; border: 1px solid " + theme["Reply Border"] + "; } .sections-list > a.tab-selected { background: " + backgroundC + "; border-color: " + theme["Reply Border"] + "; } .captcha-img img { -webkit-filter: url(\"#captcha-filter\"); } #boardTitle { text-shadow: 1px 1px " + backgroundC + ", -1px -1px " + backgroundC + ", 1px -1px " + backgroundC + ", -1px 1px " + backgroundC + "; } .sidebar-glow #boardTitle { text-shadow: 1px 1px 1px " + backgroundC + ", -1px -1px 1px " + backgroundC + ", 1px -1px 1px " + backgroundC + ", -1px 1px 1px " + backgroundC + ", 0 2px 4px rgba(0,0,0,.6), 0 0 10px rgba(0,0,0,.6); } #exlinks-options, #appchanx-settings, #qrtab, input[type=\"submit\"], input[value=\"Report\"], span[style=\"left: 5px; position: absolute;\"] a { background: " + theme["Buttons Background"] + "; border: 1px solid " + theme["Buttons Border"] + "; } .enabled .mascotcontainer { background: " + theme["Buttons Background"] + "; border-color: " + theme["Buttons Border"] + "; } #dump, #qr-filename-container, #appchanx-settings input, .captcha-img, .dump #dump, .qr-preview, .selectrice, button, input, textarea { background: " + theme["Input Background"] + "; border: 1px solid " + theme["Input Border"] + "; } .has-file #qr-extras-container { background: " + theme["Input Background"] + "; } #dump:hover, #qr-filename-container:hover, .selectrice:hover, #selectrice li:hover, #selectrice li:nth-of-type(2n+1):hover, input:hover, textarea:hover { background: " + theme["Hovered Input Background"] + "; border-color: " + theme["Hovered Input Border"] + "; } .has-file #qr-filename-container:hover #qr-extras-container { background: " + theme["Hovered Input Background"] + "; } #dump:active, #dump:focus, #selectrice li:focus, .selectrice:focus, #qr-filename-container:active, #qr-filename-container:focus, input:focus, textarea:focus, textarea.field:focus { background: " + theme["Focused Input Background"] + "; border-color: " + theme["Focused Input Border"] + "; color: " + theme["Inputs"] + "; } .has-file #qr-filename-container:active #qr-extras-container, .has-file #qr-filename-container:focus #qr-extras-container { background: " + theme["Focused Input Background"] + "; } #ft, #mouseover, #post-preview, #qp .post, #threads > .thread, #xupdater, .box-outer, .reply.post { border-width: 1px; border-style: solid; border-color: " + theme["Reply Border"] + "; background: " + theme["Reply Background"] + "; } .exblock.reply, .reply.post.highlight, .reply.post:target { background: " + theme["Highlighted Reply Background"] + "; border: 1px solid " + theme["Highlighted Reply Border"] + "; } #header-bar, .pagelist { background: " + theme["Navigation Background"] + "; border-color: " + theme["Navigation Border"] + "; } #doc, #threads, .board > .thread { background: " + theme["Thread Wrapper Background"] + "; border: 1px solid " + theme["Thread Wrapper Border"] + "; } #boardNavDesktopFoot, #mascot_hide, #menu, #selectrice, #themeConf, #watcher, #watcher:hover, .announcements-slideout #globalMessage, .dialog, .post-form-style-float #qr, .post-form-decorations #qr, .submenu { background: " + theme["Dialog Background"] + "; border: 1px solid " + theme["Dialog Border"] + "; } #qp.dialog { border: none; } .watch-thread-link { background-image: url(\"data:image/svg+xml,\"); } .deleteform::before, .deleteform, #qr .warning { background: " + theme["Input Background"] + "; border-color: " + theme["Input Border"] + "; } .disabledwarning, .warning { color: " + theme["Warnings"] + "; } #charCount { color: " + (Style.lightTheme ? "rgba(0,0,0,0.7)" : "rgba(255,255,255,0.7)") + "; } .postNum a { color: " + theme["Post Numbers"] + "; } .subject { color: " + theme["Subjects"] + " !important; } .dateTime, .post-ago { color: " + theme["Timestamps"] + " !important; } #fs_status a, #updater #update-status:not(.new)::after, #showQR, .abbr, .boxbar, .boxcontent, .deleteform::before, .pages strong, .pln, .reply, .reply.highlight, .summary, body, button, span[style=\"left: 5px; position: absolute;\"] a, input, textarea { color: " + theme["Text"] + "; } #exlinks-options-content > table, #appchanx-settings fieldset, #selectrice { border-bottom: 1px solid " + theme["Reply Border"] + "; box-shadow: inset " + theme["Shadow Color"] + " 0 0 5px; } .quote + .spoiler:hover, .quote { color: " + theme["Greentext"] + "; } .forwardlink { border-bottom: 1px dashed " + theme["Backlinks"] + "; } .container::before { color: " + theme["Timestamps"] + "; } .quote-shadows #menu, .quote-shadows #post-preview, .quote-shadows #qp .opContainer, .quote-shadows #qp .replyContainer, .quote-shadows .submenu { box-shadow: 5px 5px 5px " + theme['Shadow Color'] + "; } .rice { background: " + theme["Checkbox Background"] + "; border: 1px solid " + theme["Checkbox Border"] + "; } .selectrice::before { border-left: 1px solid " + theme["Input Border"] + "; } .selectrice::after { border-top: .45em solid " + theme["Inputs"] + "; } .bd { background: " + theme["Buttons Background"] + "; border: 1px solid " + theme["Buttons Border"] + "; } .pages a, #header-bar a { color: " + theme["Navigation Links"] + "; } input[type=checkbox]:checked + .rice::after { border-color: " + theme["Inputs"] + "; } #addReply, #dump, .button, .entry, .replylink, a { color: " + theme["Links"] + "; } .backlink { color: " + theme["Backlinks"] + "; } .qiQuote, .quotelink { color: " + theme["Quotelinks"] + "; } #addReply:hover, #dump:hover, .entry:hover, .replylink:hover, .qiQuote:hover, .quotelink:hover, a .name:hover, a .postertrip:hover, a:hover { color: " + theme["Hovered Links"] + "; } #header-bar a:hover, #boardTitle a:hover { color: " + theme["Hovered Navigation Links"] + "; } #boardTitle { color: " + theme["Board Title"] + "; } .name, .post-author { color: " + theme["Names"] + " !important; } .post-tripcode, .postertrip, .trip { color: " + theme["Tripcodes"] + " !important; } a .postertrip, a .name { color: " + theme["Emails"] + "; } .post.reply.qphl, .post.op.qphl { border-color: " + theme["Backlinked Reply Outline"] + "; background: " + theme["Highlighted Reply Background"] + "; } .quote-shadows .inline .post { box-shadow: 5px 5px 5px " + theme['Shadow Color'] + "; } .placeholder, #qr input::placeholder, #qr textarea::placeholder { color: " + (Style.lightTheme ? "rgba(0,0,0,0.3)" : "rgba(255,255,255,0.2)") + " !important; } #qr input:placeholder, #qr textarea:placeholder, .placeholder { color: " + (Style.lightTheme ? "rgba(0,0,0,0.3)" : "rgba(255,255,255,0.2)") + " !important; } #appchanx-settings fieldset, .boxcontent dd, .selectrice ul { border-color: " + (Style.lightTheme ? "rgba(0,0,0,0.1)" : "rgba(255,255,255,0.1)") + "; } #appchanx-settings li, #selectrice li:not(:first-of-type) { border-top: 1px solid " + (Style.lightTheme ? "rgba(0,0,0,0.05)" : "rgba(255,255,255,0.025)") + "; } #navtopright .exlinksOptionsLink::after, #main-menu, .navLinks > a:first-of-type::after, #watcher::after, #globalMessage::after, #boardNavDesktopFoot::after, #img-controls, #catalog::after, #fappeTyme { " + (!Style.lightTheme ? "-webkit-filter: url(\"#icons-filter\");" : "") + " } .alternate-post-colors #threads > .thread:nth-of-type(2n+1), .alternate-post-colors .replyContainer:nth-of-type(2n+1) .post { background-image: linear-gradient(" + (replybg ? "rgba(" + (replybg.shiftRGB(-4, false)) + ",0.8), rgba(" + (replybg.shiftRGB(-4, false)) + ",0.8)" : Style.lightTheme ? "rgba(0,0,0,0.05), rgba(0,0,0,0.05)" : "rgba(255,255,255,0.02), rgba(255,255,255,0.02)") + "); } .color-reply-headings .boxbar, .color-reply-headings .postInfo { background: " + (replybg ? "rgba(" + (replybg.shiftRGB(-12, false)) + ",0.8)" : "rgba(0,0,0,0.1)") + "; border-bottom: 1px solid " + theme["Reply Border"] + " } .color-file-info .file { background: " + (replybg ? "rgba(" + (replybg.shiftRGB(-8, false)) + ",0.8)" : "rgba(0,0,0,0.1)") + "; border-bottom: 1px solid " + theme["Reply Border"] + " border-top: 1px solid " + theme["Reply Border"] + " } .color-reply.headings.color-file-info { border-top: none; } .op-background .op.post { background: " + theme["Reply Background"] + "; border: 1px solid " + theme["Reply Border"] + "; } .op-background .op.post:target .op-background .op.post.highlight { background: " + theme["Highlighted Reply Background"] + "; border: 1px solid " + theme["Highlighted Reply Border"] + "; } .fourchan-banner-at-sidebar-top.icon-orientation-vertical body::after { background: " + backgroundC + "; } .fourchan-banner-at-sidebar-top.icon-orientation-vertical.fourchan-ss-sidebar body::after, .fourchan-banner-at-sidebar-top.fourchan-ss-sidebar body::before { background: rgba(" + ((background = new Style.color(Style.colorToHex(theme["Reply Background"]))) ? background.shiftRGB(-18) : void 0) + ", 0.8); } .fourchan-ss-sidebar.sidebar-location-right body::before { border-left: 2px solid " + backgroundC + "; box-shadow: inset 1px 0 0 " + theme["Reply Border"] + ", -1px 0 0 " + theme["Reply Border"] + "; } .fourchan-ss-sidebar.sidebar-location-left body::before { border-right: 2px solid " + backgroundC + "; box-shadow: 1px 0 0 " + theme["Reply Border"] + ", inset -1px 0 0 " + theme["Reply Border"] + "; } .sage-highlighting-text.sage-highlight-position-before a.useremail[href*=\"sage\"]:last-of-type::before, .sage-highlighting-text.sage-highlight-position-before a.useremail[href*=\"Sage\"]:last-of-type::before, .sage-highlighting-text.sage-highlight-position-before a.useremail[href*=\"SAGE\"]:last-of-type::before, .sage-highlighting-text.sage-highlight-position-after a.useremail[href*=\"sage\"]:last-of-type::after, .sage-highlighting-text.sage-highlight-position-after a.useremail[href*=\"Sage\"]:last-of-type::after, .sage-highlighting-text.sage-highlight-position-after a.useremail[href*=\"SAGE\"]:last-of-type::after { content: \" (sage) \"; color: " + theme["Sage"] + "; } .quote-shadows #qr { box-shadow: 5px 5px 5px " + theme['Shadow Color'] + "; } " + (theme["Custom CSS"].replace(/\s+/g, ' ').trim())) + ("" + (Style.lightTheme ? " .prettyprint { background-color: #e7e7e7; border: 1px solid #dcdcdc; } .com { color: #dd0000; } .str, .atv { color: #7fa61b; } .pun { color: #61663a; } .tag { color: #117743; } .kwd { color: #5a6F9e; } .typ, .atn { color: #9474bd; } .lit { color: #368c72; } " : " .prettyprint { background-color: rgba(0,0,0,.1); border: 1px solid rgba(0,0,0,0.5); } .tag { color: #96562c; } .pun { color: #5b6f2a; } .com { color: #a34443; } .str, .atv { color: #8ba446; } .kwd { color: #987d3e; } .typ, .atn { color: #897399; } .lit { color: #558773; } ")); + return (".hide_thread_button span > span, .hide_reply_button span > span { background-color: " + theme["Links"] + "; } #mascot_hide label { border-bottom: 1px solid " + theme["Reply Border"] + "; } #content .thumb { box-shadow: 0 0 5px " + theme["Reply Border"] + "; } .export-button, .mascotname, #mascot-options { background: " + theme["Dialog Background"] + "; border: 1px solid " + theme["Buttons Border"] + "; } .highlight-you .opContainer.quotesYou, .highlight-own .opContainer.yourPost, .opContainer.filter-highlight { box-shadow: inset 5px 0 " + theme["Backlinked Reply Outline"] + "; } .highlight-you .quotesYou > .reply, .highlight-own .yourPost > .reply, .filter-highlight > .reply { box-shadow: -5px 0 " + theme["Backlinked Reply Outline"] + "; } hr { border-bottom: 1px solid " + theme["Reply Border"] + "; } hr#unread-line { border-bottom: 1px solid " + theme["Reply Background"] + "; visibility: visible; } .threadContainer { border-color: " + theme["Reply Border"] + " !important; } html { background: " + (backgroundC || '') + "; background-image: " + (theme["Background Image"] || '') + "; background-repeat: " + (theme["Background Repeat"] || '') + "; background-attachment: " + (theme["Background Attachment"] || '') + "; background-position: " + (theme["Background Position"] || '') + "; } .panel, .section-container, #exlinks-options-content, #themecontent { background: " + backgroundC + "; border: 1px solid " + theme["Reply Border"] + "; } .sections-list > a.tab-selected { background: " + backgroundC + "; border-color: " + theme["Reply Border"] + "; } .captcha-img img { -webkit-filter: url(\"#captcha-filter\"); } #boardTitle { text-shadow: 1px 1px " + backgroundC + ", -1px -1px " + backgroundC + ", 1px -1px " + backgroundC + ", -1px 1px " + backgroundC + "; } .sidebar-glow #boardTitle { text-shadow: 1px 1px 1px " + backgroundC + ", -1px -1px 1px " + backgroundC + ", 1px -1px 1px " + backgroundC + ", -1px 1px 1px " + backgroundC + ", 0 2px 4px rgba(0,0,0,.6), 0 0 10px rgba(0,0,0,.6); } #exlinks-options, #appchanx-settings, #qrtab, input[type=\"submit\"], input[value=\"Report\"], span[style=\"left: 5px; position: absolute;\"] a { background: " + theme["Buttons Background"] + "; border: 1px solid " + theme["Buttons Border"] + "; } .enabled .mascotcontainer { background: " + theme["Buttons Background"] + "; border-color: " + theme["Buttons Border"] + "; } #dump, #qr-filename-container, #appchanx-settings input, .captcha-img, .dump #dump, .qr-preview, .selectrice, button, input, textarea { background: " + theme["Input Background"] + "; border: 1px solid " + theme["Input Border"] + "; } .has-file #qr-extras-container { background: " + theme["Input Background"] + "; } #dump:hover, #qr-filename-container:hover, .selectrice:hover, #selectrice li:hover, #selectrice li:nth-of-type(2n+1):hover, input:hover, textarea:hover { background: " + theme["Hovered Input Background"] + "; border-color: " + theme["Hovered Input Border"] + "; } .has-file #qr-filename-container:hover #qr-extras-container { background: " + theme["Hovered Input Background"] + "; } #dump:active, #dump:focus, #selectrice li:focus, .selectrice:focus, #qr-filename-container:active, #qr-filename-container:focus, input:focus, textarea:focus, textarea.field:focus { background: " + theme["Focused Input Background"] + "; border-color: " + theme["Focused Input Border"] + "; color: " + theme["Inputs"] + "; } .has-file #qr-filename-container:active #qr-extras-container, .has-file #qr-filename-container:focus #qr-extras-container { background: " + theme["Focused Input Background"] + "; } #ft, #mouseover, #post-preview, #qp .post, #threads > .thread, #xupdater, .box-outer, .reply.post { border-width: 1px; border-style: solid; border-color: " + theme["Reply Border"] + "; background: " + theme["Reply Background"] + "; } .exblock.reply, .reply.post.highlight, .reply.post:target { background: " + theme["Highlighted Reply Background"] + "; border: 1px solid " + theme["Highlighted Reply Border"] + "; } #header-bar, .pagelist { background: " + theme["Navigation Background"] + "; border-color: " + theme["Navigation Border"] + "; } #doc, #threads, .board > .thread { background: " + theme["Thread Wrapper Background"] + "; border: 1px solid " + theme["Thread Wrapper Border"] + "; } #boardNavDesktopFoot, #mascot_hide, #menu, #selectrice, #themeConf, #thread-watcher, #thread-watcher:hover, .announcements-slideout #globalMessage, .dialog, .post-form-style-float #qr, .post-form-decorations #qr, .submenu { background: " + theme["Dialog Background"] + "; border: 1px solid " + theme["Dialog Border"] + "; } #qp.dialog { border: none; } .watch-thread-link { background-image: url(\"data:image/svg+xml,\"); } .deleteform::before, .deleteform, #qr .warning { background: " + theme["Input Background"] + "; border-color: " + theme["Input Border"] + "; } .disabledwarning, .warning { color: " + theme["Warnings"] + "; } #charCount { color: " + (Style.lightTheme ? "rgba(0,0,0,0.7)" : "rgba(255,255,255,0.7)") + "; } .postNum a { color: " + theme["Post Numbers"] + "; } .subject { color: " + theme["Subjects"] + " !important; } .dateTime, .post-ago { color: " + theme["Timestamps"] + " !important; } #fs_status a, #updater #update-status:not(.new)::after, #showQR, .abbr, .boxbar, .boxcontent, .deleteform::before, .pages strong, .pln, .reply, .reply.highlight, .summary, body, button, span[style=\"left: 5px; position: absolute;\"] a, input, textarea { color: " + theme["Text"] + "; } #exlinks-options-content > table, #appchanx-settings fieldset, #selectrice { border-bottom: 1px solid " + theme["Reply Border"] + "; box-shadow: inset " + theme["Shadow Color"] + " 0 0 5px; } .quote + .spoiler:hover, .quote { color: " + theme["Greentext"] + "; } .forwardlink { border-bottom: 1px dashed " + theme["Backlinks"] + "; } .container::before { color: " + theme["Timestamps"] + "; } .quote-shadows #menu, .quote-shadows #post-preview, .quote-shadows #qp .opContainer, .quote-shadows #qp .replyContainer, .quote-shadows .submenu { box-shadow: 5px 5px 5px " + theme['Shadow Color'] + "; } .rice { background: " + theme["Checkbox Background"] + "; border: 1px solid " + theme["Checkbox Border"] + "; } .selectrice::before { border-left: 1px solid " + theme["Input Border"] + "; } .selectrice::after { border-top: .45em solid " + theme["Inputs"] + "; } .bd { background: " + theme["Buttons Background"] + "; border: 1px solid " + theme["Buttons Border"] + "; } .pages a, #header-bar a { color: " + theme["Navigation Links"] + "; } input[type=checkbox]:checked + .rice::after { border-color: " + theme["Inputs"] + "; } #addReply, #dump, .button, .entry, .replylink, a { color: " + theme["Links"] + "; } .backlink { color: " + theme["Backlinks"] + "; } .qiQuote, .quotelink { color: " + theme["Quotelinks"] + "; } #addReply:hover, #dump:hover, .entry:hover, .replylink:hover, .qiQuote:hover, .quotelink:hover, a .name:hover, a .postertrip:hover, a:hover { color: " + theme["Hovered Links"] + "; } #header-bar a:hover, #boardTitle a:hover { color: " + theme["Hovered Navigation Links"] + "; } #boardTitle { color: " + theme["Board Title"] + "; } .name, .post-author { color: " + theme["Names"] + " !important; } .post-tripcode, .postertrip, .trip { color: " + theme["Tripcodes"] + " !important; } a .postertrip, a .name { color: " + theme["Emails"] + "; } .post.reply.qphl, .post.op.qphl { border-color: " + theme["Backlinked Reply Outline"] + "; background: " + theme["Highlighted Reply Background"] + "; } .quote-shadows .inline .post { box-shadow: 5px 5px 5px " + theme['Shadow Color'] + "; } .placeholder, #qr input::placeholder, #qr textarea::placeholder { color: " + (Style.lightTheme ? "rgba(0,0,0,0.3)" : "rgba(255,255,255,0.2)") + " !important; } #qr input:placeholder, #qr textarea:placeholder, .placeholder { color: " + (Style.lightTheme ? "rgba(0,0,0,0.3)" : "rgba(255,255,255,0.2)") + " !important; } #appchanx-settings fieldset, .boxcontent dd, .selectrice ul { border-color: " + (Style.lightTheme ? "rgba(0,0,0,0.1)" : "rgba(255,255,255,0.1)") + "; } #appchanx-settings li, #selectrice li:not(:first-of-type) { border-top: 1px solid " + (Style.lightTheme ? "rgba(0,0,0,0.05)" : "rgba(255,255,255,0.025)") + "; } #navtopright .exlinksOptionsLink::after, #main-menu, .navLinks > a:first-of-type::after, #thread-watcher::after, #globalMessage::after, #boardNavDesktopFoot::after, #img-controls, #catalog::after, #fappeTyme { " + (!Style.lightTheme ? "-webkit-filter: url(\"#icons-filter\");" : "") + " } .alternate-post-colors #threads > .thread:nth-of-type(2n+1), .alternate-post-colors .replyContainer:nth-of-type(2n+1) .post { background-image: linear-gradient(" + (replybg ? "rgba(" + (replybg.shiftRGB(-4, false)) + ",0.8), rgba(" + (replybg.shiftRGB(-4, false)) + ",0.8)" : Style.lightTheme ? "rgba(0,0,0,0.05), rgba(0,0,0,0.05)" : "rgba(255,255,255,0.02), rgba(255,255,255,0.02)") + "); } .color-reply-headings .boxbar, .color-reply-headings .postInfo { background: " + (replybg ? "rgba(" + (replybg.shiftRGB(-12, false)) + ",0.8)" : "rgba(0,0,0,0.1)") + "; border-bottom: 1px solid " + theme["Reply Border"] + " } .color-file-info .file { background: " + (replybg ? "rgba(" + (replybg.shiftRGB(-8, false)) + ",0.8)" : "rgba(0,0,0,0.1)") + "; border-bottom: 1px solid " + theme["Reply Border"] + " border-top: 1px solid " + theme["Reply Border"] + " } .color-reply.headings.color-file-info { border-top: none; } .op-background .op.post { background: " + theme["Reply Background"] + "; border: 1px solid " + theme["Reply Border"] + "; } .op-background .op.post:target .op-background .op.post.highlight { background: " + theme["Highlighted Reply Background"] + "; border: 1px solid " + theme["Highlighted Reply Border"] + "; } .fourchan-banner-at-sidebar-top.icon-orientation-vertical body::after { background: " + backgroundC + "; } .fourchan-banner-at-sidebar-top.icon-orientation-vertical.fourchan-ss-sidebar body::after, .fourchan-banner-at-sidebar-top.fourchan-ss-sidebar body::before { background: rgba(" + ((background = new Style.color(Style.colorToHex(theme["Reply Background"]))) ? background.shiftRGB(-18) : void 0) + ", 0.8); } .fourchan-ss-sidebar.sidebar-location-right body::before { border-left: 2px solid " + backgroundC + "; box-shadow: inset 1px 0 0 " + theme["Reply Border"] + ", -1px 0 0 " + theme["Reply Border"] + "; } .fourchan-ss-sidebar.sidebar-location-left body::before { border-right: 2px solid " + backgroundC + "; box-shadow: 1px 0 0 " + theme["Reply Border"] + ", inset -1px 0 0 " + theme["Reply Border"] + "; } .sage-highlighting-text.sage-highlight-position-before a.useremail[href*=\"sage\"]:last-of-type::before, .sage-highlighting-text.sage-highlight-position-before a.useremail[href*=\"Sage\"]:last-of-type::before, .sage-highlighting-text.sage-highlight-position-before a.useremail[href*=\"SAGE\"]:last-of-type::before, .sage-highlighting-text.sage-highlight-position-after a.useremail[href*=\"sage\"]:last-of-type::after, .sage-highlighting-text.sage-highlight-position-after a.useremail[href*=\"Sage\"]:last-of-type::after, .sage-highlighting-text.sage-highlight-position-after a.useremail[href*=\"SAGE\"]:last-of-type::after { content: \" (sage) \"; color: " + theme["Sage"] + "; } .quote-shadows #qr { box-shadow: 5px 5px 5px " + theme['Shadow Color'] + "; } " + (theme["Custom CSS"].replace(/\s+/g, ' ').trim())) + ("" + (Style.lightTheme ? " .prettyprint { background-color: #e7e7e7; border: 1px solid #dcdcdc; } .com { color: #dd0000; } .str, .atv { color: #7fa61b; } .pun { color: #61663a; } .tag { color: #117743; } .kwd { color: #5a6F9e; } .typ, .atn { color: #9474bd; } .lit { color: #368c72; } " : " .prettyprint { background-color: rgba(0,0,0,.1); border: 1px solid rgba(0,0,0,0.5); } .tag { color: #96562c; } .pun { color: #5b6f2a; } .com { color: #a34443; } .str, .atv { color: #8ba446; } .kwd { color: #987d3e; } .typ, .atn { color: #897399; } .lit { color: #558773; } ")); }, iconPositions: function() { var align, aligner, css, i, iconOffset, navlinks, notCatalog, notEither, position, psa, sidebar; - css = "#navtopright .exlinksOptionsLink::after, #main-menu, body > div.navLinks > a:first-of-type::after, .slideout-watcher #watcher::after, .announcements-slideout #globalMessage::after, #boardNavDesktopFoot::after, #img-controls, #catalog::after, #fappeTyme { z-index: 18; position: fixed; display: block; width: 15px; height: 15px; content: \"\"; opacity: 0.5; } body::after { content: \"\"; display: block; position: fixed; z-index: 5; width: 18px; height: 18px; } .invisible-icons #navtopright .exlinksOptionsLink::after, .invisible-icons #main-menu, .invisible-icons body > div.navLinks > a:first-of-type::after, .invisible-icons.slideout-watcher #watcher::after, .invisible-icons.announcements-slideout #globalMessage::after, .invisible-icons #boardNavDesktopFoot::after, .invisible-icons #img-controls, .invisible-icons #catalog::after, .invisible-icons #fappeTyme { opacity: 0; } #navtopright .exlinksOptionsLink, body > div.navLinks > a:first-of-type, " + (Conf['Slideout Watcher'] ? '#watcher,' : '') + " " + (Conf['Announcements'] === 'slideout' ? '#globalMessage,' : '') + " #boardNavDesktopFoot, #catalog { z-index: 16; } #navtopright .exlinksOptionsLink:hover, body > div.navLinks > a:first-of-type:hover, .slideout-watcher #watcher:hover, .announcements-slideout #globalMessage:hover, #boardNavDesktopFoot:hover, #img-controls, #catalog:hover { z-index: 17; } #main-menu { visibility: visible; background-position: 0 0; cursor: pointer; } body > div.navLinks > a:first-of-type::after { cursor: pointer; background-position: 0 -15px; } .slideout-watcher #watcher::after { background-position: 0 -30px; } .announcements-slideout #globalMessage::after { background-position: 0 -45px; } #boardNavDesktopFoot::after { background-position: 0 -60px; } #img-controls { background-position: 0 -90px; } #navtopright .exlinksOptionsLink::after { background-position: 0 -105px; } #catalog::after { visibility: visible; background-position: 0 -120px; } #fappeTyme { background-position: 0 -135px; } #boardNavDesktopFoot:hover::after, .announcements-slideout #globalMessage:hover::after, #img-controls:hover, #navlinks a:hover, #appchanOptions:hover, #main-menu:hover, #navtopright .exlinksOptionsLink:hover::after, #qr #qrtab, .slideout-watcher #watcher:hover::after, .thumbnail#selected, div.navLinks > a:first-of-type:hover::after, #catalog:hover::after, #fappeTyme:hover { opacity: 1 !important; }"; + css = "#navtopright .exlinksOptionsLink::after, #main-menu, body > div.navLinks > a:first-of-type::after, .slideout-watcher #thread-watcher::after, .announcements-slideout #globalMessage::after, #boardNavDesktopFoot::after, #img-controls, #catalog::after, #fappeTyme { z-index: 18; position: fixed; display: block; width: 15px; height: 15px; content: \"\"; opacity: 0.5; } body::after { content: \"\"; display: block; position: fixed; z-index: 5; width: 18px; height: 18px; } .invisible-icons #navtopright .exlinksOptionsLink::after, .invisible-icons #main-menu, .invisible-icons body > div.navLinks > a:first-of-type::after, .invisible-icons.slideout-watcher #thread-watcher::after, .invisible-icons.announcements-slideout #globalMessage::after, .invisible-icons #boardNavDesktopFoot::after, .invisible-icons #img-controls, .invisible-icons #catalog::after, .invisible-icons #fappeTyme { opacity: 0; } #navtopright .exlinksOptionsLink, body > div.navLinks > a:first-of-type, " + (Conf['Slideout Watcher'] ? '#thread-watcher,' : '') + " " + (Conf['Announcements'] === 'slideout' ? '#globalMessage,' : '') + " #boardNavDesktopFoot, #catalog { z-index: 16; } #navtopright .exlinksOptionsLink:hover, body > div.navLinks > a:first-of-type:hover, .slideout-watcher #thread-watcher:hover, .announcements-slideout #globalMessage:hover, #boardNavDesktopFoot:hover, #img-controls, #catalog:hover { z-index: 17; } #main-menu { visibility: visible; background-position: 0 0; cursor: pointer; } body > div.navLinks > a:first-of-type::after { cursor: pointer; background-position: 0 -15px; } .slideout-watcher #thread-watcher::after { background-position: 0 -30px; } .announcements-slideout #globalMessage::after { background-position: 0 -45px; } #boardNavDesktopFoot::after { background-position: 0 -60px; } #img-controls { background-position: 0 -90px; } #navtopright .exlinksOptionsLink::after { background-position: 0 -105px; } #catalog::after { visibility: visible; background-position: 0 -120px; } #fappeTyme { background-position: 0 -135px; } #boardNavDesktopFoot:hover::after, .announcements-slideout #globalMessage:hover::after, #img-controls:hover, #navlinks a:hover, #appchanOptions:hover, #main-menu:hover, #navtopright .exlinksOptionsLink:hover::after, #qr #qrtab, .slideout-watcher #thread-watcher:hover::after, .thumbnail#selected, div.navLinks > a:first-of-type:hover::after, #catalog:hover::after, #fappeTyme:hover { opacity: 1 !important; }"; i = 0; align = Conf['Sidebar Location']; sidebar = { @@ -11844,14 +12200,14 @@ if (iconOffset < 0) { iconOffset = 0; } - css += "body::after { " + align + ": " + (position[i] - 1) + "px; } /* Appchan X Options */ #main-menu { " + align + ": " + position[i++] + "px; } /* Slideout Navigation */ #boardNavDesktopFoot::after { " + align + ": " + position[i++] + "px; } /* Global Message */ .announcements-slideout #globalMessage::after { " + align + ": " + position[i++] + "px; } /* Watcher */ .slideout-watcher #watcher::after { " + align + ": " + position[i++] + "px; } /* ExLinks */ #navtopright .exlinksOptionsLink::after { " + align + ": " + position[i++] + "px; } /* Expand Images */ #img-controls { " + align + ": " + position[i++] + "px; } /* 4chan Catalog */ #catalog::after { " + align + ": " + position[i++] + "px; } /* Back */ div.navLinks > a:first-of-type::after { " + align + ": " + position[i++] + "px; } /* Fappe Tyme */ #fappeTyme { " + align + ": " + position[i++] + "px; } /* Thread Navigation Links */ #navlinks a { margin: 2px; top: 1px; } #navlinks a:last-of-type { " + align + ": " + position[i++] + "px; } #navlinks a:first-of-type { " + align + ": " + position[i++] + "px; } body::after { width: " + (position[i] - 2) + "px; top: 0; } #boardNavDesktopFoot::after, #navtopright .exlinksOptionsLink::after, #main-menu, .slideout-watcher #watcher::after, .announcements-slideout #globalMessage::after, #img-controls, #fappeTyme, div.navLinks > a:first-of-type::after, #catalog::after { top: 1px !important; } .slideout-watcher #globalMessage, .slideout-watcher #watcher, #boardNavDesktopFoot { top: 16px !important; } .fourchan-ss-navigation.fixed.top #header-bar, .fourchan-ss-navigation.pagination-top .pagelist, .fourchan-ss-navigation.pagination-sticky-top .pagelist { padding-" + align + ": " + iconOffset + "px; } .fixed.top:not(.fourchan-ss-navigation) #header-bar, .pagination-top:not(.fourchan-ss-navigation) .pagelist, .pagination-sticky-top:not(.fourchan-ss-navigation) .pagelist { margin-" + align + ": " + iconOffset + "px; }"; + css += "body::after { " + align + ": " + (position[i] - 1) + "px; } /* Appchan X Options */ #main-menu { " + align + ": " + position[i++] + "px; } /* Slideout Navigation */ #boardNavDesktopFoot::after { " + align + ": " + position[i++] + "px; } /* Global Message */ .announcements-slideout #globalMessage::after { " + align + ": " + position[i++] + "px; } /* Watcher */ .slideout-watcher #thread-watcher::after { " + align + ": " + position[i++] + "px; } /* ExLinks */ #navtopright .exlinksOptionsLink::after { " + align + ": " + position[i++] + "px; } /* Expand Images */ #img-controls { " + align + ": " + position[i++] + "px; } /* 4chan Catalog */ #catalog::after { " + align + ": " + position[i++] + "px; } /* Back */ div.navLinks > a:first-of-type::after { " + align + ": " + position[i++] + "px; } /* Fappe Tyme */ #fappeTyme { " + align + ": " + position[i++] + "px; } /* Thread Navigation Links */ #navlinks a { margin: 2px; top: 1px; } #navlinks a:last-of-type { " + align + ": " + position[i++] + "px; } #navlinks a:first-of-type { " + align + ": " + position[i++] + "px; } body::after { width: " + (position[i] - 2) + "px; top: 0; } #boardNavDesktopFoot::after, #navtopright .exlinksOptionsLink::after, #main-menu, .slideout-watcher #thread-watcher::after, .announcements-slideout #globalMessage::after, #img-controls, #fappeTyme, div.navLinks > a:first-of-type::after, #catalog::after { top: 1px !important; } .slideout-watcher #globalMessage, .slideout-watcher #thread-watcher, #boardNavDesktopFoot { top: 16px !important; } .fourchan-ss-navigation.fixed.top #header-bar, .fourchan-ss-navigation.pagination-top .pagelist, .fourchan-ss-navigation.pagination-sticky-top .pagelist { padding-" + align + ": " + iconOffset + "px; } .fixed.top:not(.fourchan-ss-navigation) #header-bar, .pagination-top:not(.fourchan-ss-navigation) .pagelist, .pagination-sticky-top:not(.fourchan-ss-navigation) .pagelist { margin-" + align + ": " + iconOffset + "px; }"; } else { position = aligner(2, [notEither && Conf['Image Expansion'], true, Conf['Slideout Navigation'] !== 'hide', Conf['Announcements'] === 'slideout' && (psa = $('#globalMessage', d.body)) && !psa.hidden, Conf['Thread Watcher'] && Conf['Slideout Watcher'], $('#navtopright .exlinksOptionsLink', d.body), notEither, g.VIEW === 'thread', notEither && Conf['Fappe Tyme'], navlinks = ((g.VIEW !== 'thread' && Conf['Index Navigation']) || (g.VIEW === 'thread' && Conf['Reply Navigation'])) && notCatalog, navlinks]); iconOffset = (20 + (g.VIEW === 'thread' && Conf['Updater Position'] === 'top' ? 100 : 0)) - (Conf['4chan SS Navigation'] ? 0 : sidebar + parseInt(Conf[align.charAt(0).toUpperCase() + align.slice(1) + " Thread Padding"], 10)); if (iconOffset < 0) { iconOffset = 0; } - css += "/* Expand Images */ body::after { top: " + (position[i] - 1) + "px; } #img-controls { top: " + position[i++] + "px; } /* Appchan X Options */ #main-menu { top: " + position[i++] + "px; } /* Slideout Navigation */ #boardNavDesktopFoot, #boardNavDesktopFoot::after { top: " + position[i++] + "px; } /* Global Message */ .announcements-slideout #globalMessage, .announcements-slideout #globalMessage::after { top: " + position[i++] + "px; } /* Watcher */ .slideout-watcher #watcher, .slideout-watcher #watcher::after { top: " + position[i++] + "px !important; } /* ExLinks */ #navtopright .exlinksOptionsLink::after { top: " + position[i++] + "px; } /* 4chan Catalog */ #catalog::after { top: " + position[i++] + "px; } /* Back */ div.navLinks > a:first-of-type::after { top: " + position[i++] + "px; } /* Fappe Tyme */ #fappeTyme { top: " + position[i++] + "px; } /* Thread Navigation Links */ #navlinks a:first-of-type { top: " + position[i++] + "px !important; } #navlinks a:last-of-type { top: " + position[i++] + "px !important; } body::after { height: " + (position[i] - 2) + "px; " + align + ": 2px; } #navlinks a, #navtopright .exlinksOptionsLink::after, #main-menu, #boardNavDesktopFoot::after, #globalMessage::after, #img-controls, #fappeTyme, .slideout-watcher #watcher::after, #catalog::after, div.navLinks > a:first-of-type::after { " + align + ": 3px !important; } #boardNavDesktopFoot, #globalMessage, .slideout-watcher #watcher.dialog { box-sizing: border-box; width: 232px !important; " + align + ": 18px !important; } .sidebar-large #boardNavDesktopFoot, .sidebar-large #globalMessage, .sidebar-large #watcher { width: 288px !important; } .fourchan-ss-navigation.fixed.top #header-bar, .fourchan-ss-navigation.pagination-top .pagelist, .fourchan-ss-navigation.pagination-sticky-top .pagelist { padding-" + align + ": " + iconOffset + "px; } .fixed.top:not(.fourchan-ss-navigation) #header-bar, .pagination-top:not(.fourchan-ss-navigation) .pagelist, .pagination-sticky-top:not(.fourchan-ss-navigation) .pagelist { margin-" + align + ": " + iconOffset + "px; }"; + css += "/* Expand Images */ body::after { top: " + (position[i] - 1) + "px; } #img-controls { top: " + position[i++] + "px; } /* Appchan X Options */ #main-menu { top: " + position[i++] + "px; } /* Slideout Navigation */ #boardNavDesktopFoot, #boardNavDesktopFoot::after { top: " + position[i++] + "px; } /* Global Message */ .announcements-slideout #globalMessage, .announcements-slideout #globalMessage::after { top: " + position[i++] + "px; } /* Watcher */ .slideout-watcher #thread-watcher, .slideout-watcher #thread-watcher::after { top: " + position[i++] + "px !important; } /* ExLinks */ #navtopright .exlinksOptionsLink::after { top: " + position[i++] + "px; } /* 4chan Catalog */ #catalog::after { top: " + position[i++] + "px; } /* Back */ div.navLinks > a:first-of-type::after { top: " + position[i++] + "px; } /* Fappe Tyme */ #fappeTyme { top: " + position[i++] + "px; } /* Thread Navigation Links */ #navlinks a:first-of-type { top: " + position[i++] + "px !important; } #navlinks a:last-of-type { top: " + position[i++] + "px !important; } body::after { height: " + (position[i] - 2) + "px; " + align + ": 2px; } #navlinks a, #navtopright .exlinksOptionsLink::after, #main-menu, #boardNavDesktopFoot::after, #globalMessage::after, #img-controls, #fappeTyme, .slideout-watcher #thread-watcher::after, #catalog::after, div.navLinks > a:first-of-type::after { " + align + ": 3px !important; } #boardNavDesktopFoot, #globalMessage, .slideout-watcher #thread-watcher.dialog { box-sizing: border-box; width: 232px !important; " + align + ": 18px !important; } .sidebar-large #boardNavDesktopFoot, .sidebar-large #globalMessage, .sidebar-large #thread-watcher { width: 288px !important; } .fourchan-ss-navigation.fixed.top #header-bar, .fourchan-ss-navigation.pagination-top .pagelist, .fourchan-ss-navigation.pagination-sticky-top .pagelist { padding-" + align + ": " + iconOffset + "px; } .fixed.top:not(.fourchan-ss-navigation) #header-bar, .pagination-top:not(.fourchan-ss-navigation) .pagelist, .pagination-sticky-top:not(.fourchan-ss-navigation) .pagelist { margin-" + align + ": " + iconOffset + "px; }"; } return Style.icons.textContent = css; }, @@ -12471,11 +12827,8 @@ }, callbacks: [], cb: function(e) { - var post; - e.preventDefault(); - post = Get.postFromNode(this); - return ExpandComment.expand(post); + return ExpandComment.expand(Get.postFromNode(this)); }, expand: function(post) { var a; @@ -12538,6 +12891,12 @@ } quote.href = "/" + post.board + "/res/" + href; } + Build.capcodeReplies({ + boardID: post.board.ID, + threadID: post.thread.ID, + bq: clone, + capcodeReplies: postObj.capcode_replies + }); post.nodes.shortComment = comment; $.replace(comment, clone); post.nodes.comment = post.nodes.longComment = clone; @@ -13584,7 +13943,8 @@ $.on(d, '4chanXInitFinished', Settings.open); } return $.set({ - lastchecked: Date.now(), + archives: Conf['archives'], + lastarchivecheck: now, previousversion: g.VERSION }); }); @@ -13793,7 +14153,6 @@ version: g.VERSION, date: now }; - Conf['WatchedThreads'] = {}; for (_i = 0, _len = DataBoards.length; _i < _len; _i++) { db = DataBoards[_i]; Conf[db] = { @@ -13849,9 +14208,12 @@ return reader.readAsText(file); }, loadSettings: function(data) { - var version; - - version = data.version.split('.'); + if (data.Conf['WatchedThreads']) { + data.Conf['watchedThreads'] = { + boards: ThreadWatcher.convert(data.Conf['WatchedThreads']) + }; + delete data.Conf['WatchedThreads']; + } return $.set(data.Conf); }, convertSettings: function(data, map) { @@ -14891,6 +15253,7 @@ 'Thread Updater': ThreadUpdater, 'Thread Stats': ThreadStats, 'Thread Watcher': ThreadWatcher, + 'Thread Watcher (Menu)': ThreadWatcher.menu, 'Index Navigation': Nav, 'Keybinds': Keybinds, 'Show Dice Roll': Dice diff --git a/css/style.css b/css/style.css new file mode 100644 index 000000000..32819ef69 --- /dev/null +++ b/css/style.css @@ -0,0 +1,929 @@ +/* General */ +.dialog { + box-shadow: 0 1px 2px rgba(0, 0, 0, .15); + border: 1px solid; + display: block; + padding: 0; +} +.field { + background-color: #FFF; + border: 1px solid #CCC; + -moz-box-sizing: border-box; + box-sizing: border-box; + color: #333; + font-family: inherit; + font-size: 13px; + margin: 0; + padding: 2px 4px 3px; + outline: none; + transition: color .25s, border-color .25s, -webkit-flex .25s; + transition: color .25s, border-color .25s, flex .25s; +} +.field::-moz-placeholder, +.field:hover::-moz-placeholder { + color: #AAA !important; +} +.field:hover { + border-color: #999; +} +.field:hover, .field:focus { + color: #000; +} +.field[disabled] { + background-color: #F2F2F2; + color: #888; +} +.move { + cursor: move; +} +label, .watcher-toggler { + cursor: pointer; +} +a[href="javascript:;"] { + text-decoration: none; +} +.warning { + color: red; +} + +/* 4chan style fixes */ +.opContainer, .op { + display: block !important; +} +.post { + overflow: visible !important; +} +[hidden] { + display: none !important; +} + +/* fixed, z-index */ +#overlay, +#qp, #ihover, +#updater, #thread-stats, +#navlinks, #header, +#qr { + position: fixed; +} +#overlay { + z-index: 999; +} +#notifications { + z-index: 70; +} +#qp, #ihover { + z-index: 60; +} +#menu { + z-index: 50; +} +#navlinks, #updater, #thread-stats { + z-index: 40; +} +#qr { + z-index: 30; +} +#thread-watcher:hover { + z-index: 20; +} +#header { + z-index: 10; +} +#thread-watcher { + z-index: 5; +} + +/* Header */ +:root.top-header body { + margin-top: 2em; +} +:root.bottom-header body { + margin-bottom: 2em; +} +:root.fourchan-x #navtopright, +:root.fourchan-x #navbotright, +:root.fourchan-x:not(.show-original-top-board-list) #boardNavDesktop, +:root.fourchan-x:not(.show-original-bot-board-list) #boardNavDesktopFoot { + display: none !important; +} +#header { + right: 0; + left: 0; +} +#header.top { + top: 0; +} +#header.bottom { + bottom: 0; +} +#header-bar { + border-width: 0; + display: -webkit-flex; + display: flex; + padding: 3px 4px 4px; + position: relative; + transition: all .1s .05s ease-in-out; +} +#header.top #header-bar { + border-bottom-width: 1px; +} +#header.bottom #header-bar { + box-shadow: 0 -1px 2px rgba(0, 0, 0, .15); + border-top-width: 1px; +} +#header.bottom .menu-button i { + border-top: none; + border-bottom: 6px solid; +} +#board-list { + -webkit-flex: 1; + flex: 1; + text-align: center; +} +#header-bar.autohide:not(:hover) { + box-shadow: none; + transition: all .8s .6s cubic-bezier(.55, .055, .675, .19); +} +#header.top #header-bar.autohide:not(:hover) { + margin-bottom: -1em; + -webkit-transform: translateY(-100%); + transform: translateY(-100%); +} +#header.bottom #header-bar.autohide:not(:hover) { + -webkit-transform: translateY(100%); + transform: translateY(100%); +} +#toggle-header-bar { + left: 0; + right: 0; + height: 10px; + position: absolute; +} +#header.top #toggle-header-bar { + cursor: n-resize; + bottom: -8px; +} +#header.bottom #toggle-header-bar { + cursor: s-resize; + top: -8px; +} +#header-bar.autohide:not(:hover) #toggle-header-bar, +#toggle-header-bar:hover { + height: 18px; +} +#header.top #header-bar.autohide:not(:hover) #toggle-header-bar, +#header.top #toggle-header-bar:hover { + bottom: -16px; +} +#header.bottom #header-bar.autohide:not(:hover) #toggle-header-bar, +#header.bottom #toggle-header-bar:hover { + top: -16px; +} +#header.top #header-bar.autohide #toggle-header-bar { + cursor: s-resize; +} +#header.bottom #header-bar.autohide #toggle-header-bar { + cursor: n-resize; +} +#header-bar a:not(.entry) { + text-decoration: none; + padding: 1px; +} +#shortcuts:empty { + display: none; +} +.shortcut:not(:last-child)::after { + content: " / "; +} +.brackets-wrap::before { + content: "\\00a0["; +} +.brackets-wrap::after { + content: "]\\00a0"; +} +.expand-all-shortcut { + opacity: .35; +} + +/* Notifications */ +#notifications { + height: 0; + text-align: center; +} +#header.bottom #notifications { + position: fixed; + top: 0; + left: 0; + width: 100%; +} +.notification { + color: #FFF; + font-weight: 700; + text-shadow: 0 1px 2px rgba(0, 0, 0, .5); + box-shadow: 0 1px 2px rgba(0, 0, 0, .15); + border-radius: 2px; + margin: 1px auto; + width: 500px; + max-width: 100%; + position: relative; + transition: all .25s ease-in-out; +} +.notification.error { + background-color: hsla(0, 100%, 38%, .9); +} +.notification.warning { + background-color: hsla(36, 100%, 38%, .9); +} +.notification.info { + background-color: hsla(200, 100%, 38%, .9); +} +.notification.success { + background-color: hsla(104, 100%, 38%, .9); +} +.notification a { + color: white; +} +.notification > .close { + padding: 6px; + top: 0; + right: 0; + position: absolute; +} +.message { + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 6px 20px; + max-height: 200px; + width: 100%; + overflow: auto; +} + +/* Settings */ +:root.fourchan-x body { + -moz-box-sizing: border-box; + box-sizing: border-box; +} +#overlay { + background-color: rgba(0, 0, 0, .5); + display: -webkit-flex; + display: flex; + position: fixed; + top: 0; + left: 0; + height: 100%; + width: 100%; +} +#fourchanx-settings { + -moz-box-sizing: border-box; + box-sizing: border-box; + box-shadow: 0 0 15px rgba(0, 0, 0, .15); + height: 600px; + max-height: 100%; + width: 900px; + max-width: 100%; + margin: auto; + padding: 3px; + display: -webkit-flex; + display: flex; + -webkit-flex-direction: column; + flex-direction: column; +} +#fourchanx-settings > nav { + display: -webkit-flex; + display: flex; + padding: 2px 2px 0; +} +#fourchanx-settings > nav a { + text-decoration: underline; +} +#fourchanx-settings > nav a.close { + text-decoration: none; + padding: 2px; +} +.sections-list { + -webkit-flex: 1; + flex: 1; +} +.tab-selected { + font-weight: 700; +} +.section-container { + -webkit-flex: 1; + flex: 1; + position: relative; +} +.section-container > section { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + overflow: auto; +} +.section-sauce ul, +.section-rice ul { + list-style: none; + margin: 0; + padding: 8px; +} +.section-sauce li, +.section-rice li { + padding-left: 4px; +} +.section-main label { + text-decoration: underline; +} +.section-filter ul, +.section-qr ul { + padding: 0; +} +.section-filter li, +.section-qr li { + margin: 10px 40px; +} +.section-filter textarea { + height: 500px; +} +.section-qr textarea { + height: 200px; +} +.section-sauce textarea { + height: 350px; +} +.section-rice .field[name="boardnav"] { + width: 100%; +} +.section-rice textarea { + height: 150px; +} +.section-archives table { + width: 100%; +} +.section-archives th:not(:first-child) { + width: 30%; +} +.section-archives td { + text-align: center; +} +.section-archives select { + width: 90%; +} +.section-keybinds .field { + font-family: monospace; +} +#fourchanx-settings fieldset { + border: 1px solid; + border-radius: 3px; +} +#fourchanx-settings legend { + font-weight: 700; +} +#fourchanx-settings textarea { + font-family: monospace; + min-width: 100%; + max-width: 100%; +} +#fourchanx-settings code { + color: #000; + background-color: #FFF; + padding: 0 2px; +} +.unscroll { + overflow: hidden; +} + +/* Announcement Hiding */ +:root.hide-announcement #globalMessage, +:root.hide-announcement-enabled #toggleMsgBtn { + display: none; +} +a.hide-announcement { + float: left; +} + +/* Unread */ +#unread-line { + margin: 0; +} + +/* Thread Updater */ +#updater:not(:hover) { + background: none; + border: none; + box-shadow: none; +} +#updater > .move { + padding: 0 3px; +} +#updater > div:last-child { + text-align: center; +} +#updater input[type=number] { + width: 4em; +} +#updater:not(:hover) > div:not(.move) { + display: none; +} +#updater input[type="button"] { + width: 100%; +} +.new { + color: limegreen; +} + +/* Thread Watcher */ +#thread-watcher { + max-width: 200px; + min-width: 150px; + padding: 3px; + position: absolute; +} +#thread-watcher > div:first-child { + display: -webkit-flex; + display: flex; + -webkit-align-items: center; + align-items: center; +} +#thread-watcher .move { + -webkit-flex: 1; + flex: 1; +} +#watcher-status:not(:empty)::before { + content: "("; +} +#watcher-status:not(:empty)::after { + content: ")"; +} +#watched-threads:not(:hover) { + max-height: 150px; + overflow: hidden; +} +#watched-threads div { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +#watched-threads .current { + font-weight: 700; +} +#watched-threads a { + text-decoration: none; +} +#watched-threads .dead-thread a[title] { + text-decoration: line-through; +} + +/* Thread Stats */ +#thread-stats { + background: none; + border: none; + box-shadow: none; +} + +/* Quote */ +.deadlink { + text-decoration: none !important; +} +.backlink.deadlink:not(.forwardlink), +.quotelink.deadlink:not(.forwardlink) { + text-decoration: underline !important; +} +.inlined { + opacity: .5; +} +#qp input, .forwarded { + display: none; +} +.quotelink.forwardlink, +.backlink.forwardlink { + text-decoration: none; + border-bottom: 1px dashed; +} +.filtered { + text-decoration: underline line-through; +} +.inline { + border: 1px solid; + display: table; + margin: 2px 0; +} +.inline .post { + border: 0 !important; + background-color: transparent !important; + display: table !important; + margin: 0 !important; + padding: 1px 2px !important; +} +#qp > .opContainer::after { + content: ''; + clear: both; + display: table; +} +#qp .post { + border: none; + margin: 0; + padding: 2px 2px 5px; +} +#qp img { + max-height: 80vh; + max-width: 50vw; +} +.qphl { + outline: 2px solid rgba(216, 94, 49, .7); +} + +/* File */ +.fileText:hover .fntrunc, +.fileText:not(:hover) .fnfull, +.expanded-image > .post > .file > .fileThumb > img[data-md5], +:not(.expanded-image) > .post > .file > .fileThumb > .full-image { + display: none; +} +.expanding { + opacity: .5; +} +.expanded-image { + clear: both; +} +.expanded-image > .op > .file::after { + content: ''; + clear: both; + display: table; +} +:root.fit-height .full-image { + max-height: 100vh; +} +:root.fit-width .full-image { + max-width: 100%; +} +:root.gecko.fit-width .full-image { + width: 100%; +} +#ihover { + -moz-box-sizing: border-box; + box-sizing: border-box; + max-height: 100%; + max-width: 75%; + padding-bottom: 16px; +} + +/* Index/Reply Navigation */ +#navlinks { + font-size: 16px; + top: 25px; + right: 10px; +} + +/* Filter */ +.opContainer.filter-highlight { + box-shadow: inset 5px 0 rgba(255, 0, 0, .5); +} +.filter-highlight > .reply { + box-shadow: -5px 0 rgba(255, 0, 0, .5); +} + +/* Thread & Reply Hiding */ +.hide-thread-button, +.hide-reply-button { + float: left; + margin-right: 2px; +} +.stub ~ * { + display: none !important; +} +.stub input { + display: inline-block; +} + +/* QR */ +:root.hide-original-post-form #postForm, +:root.hide-original-post-form .postingMode, +:root.hide-original-post-form #togglePostForm, +#qr.autohide:not(.has-focus):not(:hover) > form { + display: none; +} +#qr select, #dump-button, .remove, .captcha-img { + cursor: pointer; +} +#qr > div { + min-width: 300px; + display: -webkit-flex; + display: flex; + -webkit-align-items: center; + align-items: center; +} +#qr .move { + -webkit-align-self: stretch; + align-self: stretch; + -webkit-flex: 1; + flex: 1; +} +#qr select { + margin: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border: none; + background: none; +} +#qr option { + color: #000; + background-color: #F7F7F7; +} +#qr .close { + padding: 0 3px; +} +#qr > form { + display: -webkit-flex; + display: flex; + -webkit-flex-direction: column; + flex-direction: column; +} +.persona { + display: -webkit-flex; + display: flex; +} +.persona .field { + -webkit-flex: 1; + flex: 1; +} +.persona .field:hover, +.persona .field:focus { + -webkit-flex: 3; + flex: 3; +} +#dump-button { + background: linear-gradient(#EEE, #CCC); + border: 1px solid #CCC; + margin: 0; + padding: 2px 4px 3px; + outline: none; + width: 30px; +} +#dump-button:hover, +#dump-button:focus { + background: linear-gradient(#FFF, #DDD); +} +#dump-button:active, +.dump #dump-button:not(:hover):not(:focus) { + background: linear-gradient(#CCC, #DDD); +} +:root.gecko #dump-button { + padding: 0; +} +#qr:not(.dump) #dump-list-container { + display: none; +} +#dump-list-container { + height: 100px; + position: relative; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +#dump-list { + counter-reset: qrpreviews; + top: 0; + right: 0; + bottom: 0; + left: 0; + overflow: hidden; + position: absolute; + white-space: nowrap; +} +#dump-list:hover { + bottom: -12px; + overflow-x: auto; + z-index: 1; +} +#dump-list::-webkit-scrollbar { + height: 12px; +} +#dump-list::-webkit-scrollbar-thumb { + border: 1px solid; +} +.qr-preview { + background-position: 50% 20%; + background-size: cover; + border: 1px solid #808080; + color: #FFF !important; + font-size: 12px; + -moz-box-sizing: border-box; + box-sizing: border-box; + cursor: move; + display: inline-block; + height: 92px; + width: 92px; + margin: 4px; + padding: 2px; + opacity: .6; + outline: none; + overflow: hidden; + position: relative; + text-shadow: 0 1px 1px #000; + transition: opacity .25s ease-in-out; + vertical-align: top; + white-space: pre; +} +.qr-preview:hover, +.qr-preview:focus { + opacity: .9; + color: #FFF !important; +} +.qr-preview#selected { + opacity: 1; +} +.qr-preview::before { + counter-increment: qrpreviews; + content: counter(qrpreviews); + font-weight: 700; + text-shadow: 0 0 3px #000, 0 0 5px #000; + position: absolute; + top: 3px; + right: 3px; +} +.qr-preview.drag { + border-color: red; + border-style: dashed; +} +.qr-preview.over { + border-color: #FFF; + border-style: dashed; +} +.remove { + color: #E00 !important; + font-weight: 700; + padding: 3px; +} +.remove:hover::after { + content: ' Remove'; +} +.qr-preview > label { + background: rgba(0, 0, 0, .5); + right: 0; + bottom: 0; + left: 0; + position: absolute; + text-align: center; +} +.qr-preview > label > input { + margin: 1px 0; + vertical-align: bottom; +} +#add-post { + display: inline-block; + font-size: 30px; + height: 30px; + width: 30px; + line-height: 1; + text-align: center; + position: absolute; + right: 0; + bottom: 0; + z-index: 1; +} +#qr textarea { + min-height: 160px; + min-width: 100%; + display: block; +} +#qr.has-captcha textarea { + min-height: 120px; +} +.textarea { + position: relative; +} +#char-count { + color: #000; + background: hsla(0, 0%, 100%, .5); + font-size: 8pt; + position: absolute; + bottom: 1px; + right: 1px; + pointer-events: none; +} +#char-count.warning { + color: red; +} +.captcha-img { + background: #FFF; + outline: 1px solid #CCC; + outline-offset: -1px; +} +.captcha-img > img { + display: block; + height: 57px; + width: 300px; +} +#file-n-submit > input { + margin: 0; +} +#file-n-submit.has-file #qr-no-file { + visibility: hidden; +} +#file-n-submit:not(.has-file) #qr-filename, +#file-n-submit:not(.has-file) #qr-file-spoiler, +#file-n-submit:not(.has-file) #qr-filerm { + display: none; +} +#file-n-submit { + display: -webkit-flex; + display: flex; + -webkit-flex-direction: row; + flex-direction: row; + -webkit-align-items: center; + align-items: center; +} +#qr-no-file, #qr-filename-container { + -webkit-flex: 1; + flex: 1; +} +#qr-filename-container { + cursor: default; + position: relative; + margin-left: 2px; +} +#qr-filename { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} +#qr-filerm { + padding: 0 2px; +} +#file-n-submit > #qr-file-spoiler { + margin: 0 2px; +} +#file-n-submit input[type='submit'] { + min-width: 40px; + -webkit-order: 1; + order: 1; +} + +/* Menu */ +.menu-button { + display: inline-block; + position: relative; +} +.menu-button i { + border-top: 6px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + display: inline-block; + margin: 2px; + vertical-align: middle; +} +#menu { + border-bottom: 0; + display: -webkit-flex; + display: flex; + margin: 2px 0; + -webkit-flex-direction: column; + flex-direction: column; + position: absolute; + outline: none; +} +.entry { + cursor: pointer; + outline: none; + padding: 3px 7px; + position: relative; + text-decoration: none; + white-space: nowrap; +} +.entry.disabled { + color: graytext !important; +} +.entry.has-submenu { + padding-right: 20px; +} +.has-submenu::after { + content: ''; + border-left: 6px solid; + border-top: 4px solid transparent; + border-bottom: 4px solid transparent; + display: inline-block; + margin: 4px; + position: absolute; + right: 3px; +} +.has-submenu:not(.focused) > .submenu { + display: none; +} +.submenu { + border-bottom: 0; + display: -webkit-flex; + display: flex; + -webkit-flex-direction: column; + flex-direction: column; + position: absolute; + margin: -1px 0; +} +.entry input { + margin: 0; +} diff --git a/json/archives.json b/json/archives.json index 95ac1a37a..647889b55 100644 --- a/json/archives.json +++ b/json/archives.json @@ -50,8 +50,8 @@ "http": true, "https": true, "software": "foolfuuka", - "boards": ["adv", "asp", "cm", "e", "i", "lgbt", "n", "o", "p", "pol", "s", "s4s", "t", "trv", "y"], - "files": ["adv", "asp", "cm", "e", "i", "lgbt", "n", "o", "p", "s", "s4s", "t", "trv", "y"] + "boards": ["adv", "asp", "cm", "d", "e", "i", "lgbt", "n", "o", "p", "pol", "s", "s4s", "t", "trv", "y"], + "files": ["cm", "d", "e", "i", "n", "o", "p", "s", "trv", "y"] }, { "uid": 12, "name": "fap archive", diff --git a/src/Archive/Redirect.coffee b/src/Archive/Redirect.coffee index 3f3904287..9eaa101c0 100644 --- a/src/Archive/Redirect.coffee +++ b/src/Archive/Redirect.coffee @@ -50,8 +50,8 @@ Redirect = http: true https: true software: 'foolfuuka' - boards: ['adv', 'asp', 'cm', 'i', 'lgbt', 'n', 'o', 'p', 's4s', 't', 'trv'] - files: ['adv', 'asp', 'cm', 'i', 'lgbt', 'n', 'o', 'p', 's4s', 't', 'trv'] + boards: ['adv', 'asp', 'cm', 'd', 'e', 'i', 'lgbt', 'n', 'o', 'p', 'pol', 's', 's4s', 't', 'trv', 'y'] + files: ['cm', 'd', 'e', 'i', 'n', 'o', 'p', 's', 'trv', 'y'] 'Foolz Beta': domain: 'beta.foolz.us' diff --git a/src/General/Build.coffee b/src/General/Build.coffee index cd4f73e01..6a1683a38 100644 --- a/src/General/Build.coffee +++ b/src/General/Build.coffee @@ -27,7 +27,7 @@ Build = date: data.now dateUTC: data.time comment: data.com - capReps: data.capcode_replies + capcodeReplies: data.capcode_replies # thread status isSticky: !!data.sticky isClosed: !!data.closed @@ -59,7 +59,7 @@ Build = postID, threadID, boardID name, capcode, tripcode, uniqueID, email, subject, flagCode, flagName, date, dateUTC isSticky, isClosed - comment, capReps + comment, capcodeReplies file } = o isOP = postID is threadID @@ -191,26 +191,6 @@ Build = else '' - capcodeReplies = '' - if capReps - generateCapcodeReplies = (capcodeType, array) -> - "#{ - switch capcodeType - when 'admin' - 'Administrator' - when 'mod' - 'Moderator' - when 'developer' - 'Developer' - } Repl#{if array.length > 1 then 'ies' else 'y'}: #{ - array.map (ID) -> - ">>#{ID}" - .join ' ' - }
" - for capcodeType, array of capReps - capcodeReplies += generateCapcodeReplies capcodeType, array - capcodeReplies = "

#{capcodeReplies}" - container = $.el 'div', id: "pc#{postID}" className: "postContainer #{if isOP then 'op' else 'reply'}Container" @@ -221,4 +201,36 @@ Build = continue if href[0] is '/' # Cross-board quote, or board link quote.href = "/#{boardID}/res/#{href}" # Fix pathnames + Build.capcodeReplies {boardID, threadID, root: container, capcodeReplies} + container + + capcodeReplies: ({boardID, threadID, bq, root, capcodeReplies}) -> + return unless capcodeReplies + + generateCapcodeReplies = (capcodeType, array) -> + "#{ + switch capcodeType + when 'admin' + 'Administrator' + when 'mod' + 'Moderator' + when 'developer' + 'Developer' + } Repl#{if array.length > 1 then 'ies' else 'y'}: #{ + array.map (ID) -> + ">>#{ID}" + .join ' ' + }
" + html = [] + for capcodeType, array of capcodeReplies + html.push generateCapcodeReplies capcodeType, array + + bq or= $ 'blockquote', root + $.add bq, [ + $.el 'br' + $.el 'br' + $.el 'span', + className: 'capcodeReplies' + innerHTML: html.join '' + ] diff --git a/src/General/Config.coffee b/src/General/Config.coffee index cc7b7daf0..017916204 100644 --- a/src/General/Config.coffee +++ b/src/General/Config.coffee @@ -53,12 +53,6 @@ Config = true 'Show dice that were entered into the email field.' ] - <% if (type !== 'crx') { %> - 'Check for Updates': [ - true - 'Check for updated versions of <%= meta.name %>.' - ] - <% } %> 'Color User IDs': [ false 'Assign unique colors to user IDs on boards that use them' @@ -239,14 +233,6 @@ Config = true 'Bookmark threads.' ] - 'Auto Watch': [ - true - 'Automatically watch threads you start.' - ] - 'Auto Watch Reply': [ - false - 'Automatically watch threads you reply to.' - ] 'Posting': 'Header Shortcut': [ @@ -754,6 +740,24 @@ Config = ['before', 'after'] ] + threadWatcher: + 'Current Board': [ + false + 'Only show watched threads from the current board.' + ] + 'Auto Watch': [ + true + 'Automatically watch threads you start.' + ] + 'Auto Watch Reply': [ + false + 'Automatically watch threads you reply to.' + ] + 'Auto Prune': [ + false + 'Automatically prune 404\'d threads.' + ] + filter: name: """ # Filter any namefags: diff --git a/src/General/Header.coffee b/src/General/Header.coffee index 5ff841eba..ae02eb70a 100644 --- a/src/General/Header.coffee +++ b/src/General/Header.coffee @@ -79,7 +79,6 @@ Header = fourchannav = $.id 'boardNavDesktop' if a = $ "a[href*='/#{g.BOARD}/']", fourchannav a.className = 'current' - boardList = $.el 'span', id: 'board-list' innerHTML: "" diff --git a/src/General/Main.coffee b/src/General/Main.coffee index 740f1a9ea..d9d80648c 100644 --- a/src/General/Main.coffee +++ b/src/General/Main.coffee @@ -163,6 +163,7 @@ Main = 'Thread Updater': ThreadUpdater 'Thread Stats': ThreadStats 'Thread Watcher': ThreadWatcher + 'Thread Watcher (Menu)': ThreadWatcher.menu 'Index Navigation': Nav 'Keybinds': Keybinds 'Show Dice Roll': Dice @@ -204,9 +205,6 @@ Main = Main.callbackNodes Thread, threads Main.callbackNodesDB Post, posts, -> $.event '4chanXInitFinished' - <% if (type !== 'crx') { %> - Main.checkUpdate() - <% } %> if styleSelector = $.id 'styleSelector' passLink = $.el 'a', @@ -226,9 +224,6 @@ Main = new Notification 'warning', 'Cookies need to be enabled on 4chan for <%= meta.name %> to properly function.', 30 $.event '4chanXInitFinished' - <% if (type !== 'crx') { %> - Main.checkUpdate() - <% } %> callbackNodes: (klass, nodes) -> # get the nodes' length only once @@ -302,27 +297,6 @@ Main = obj.callback.isAddon = true Klass::callbacks.push obj.callback - <% if (type !== 'crx') { %> - message: (e) -> - {version} = e.data - if version and version isnt g.VERSION - el = $.el 'span', - innerHTML: "Update: <%= meta.name %> v#{version} is out, get it target=_blank>here." - new Notification 'info', el, 120 - - checkUpdate: -> - return unless Conf['Check for Updates'] and Main.isThisPageLegit() - now = Date.now() - $.get 'lastchecked', 0, ({lastchecked}) -> - if (lastchecked > now - $.DAY) - return - $.ready -> - $.on window, 'message', Main.message - $.set 'lastchecked', now - $.add d.head, $.el 'script', - src: '<%= meta.repo %>raw/<%= meta.mainBranch %>/latest.js' - <% } %> - handleErrors: (errors) -> unless errors instanceof Array error = errors diff --git a/src/General/Settings.coffee b/src/General/Settings.coffee index 420ae4ca6..ba78e60c4 100644 --- a/src/General/Settings.coffee +++ b/src/General/Settings.coffee @@ -29,7 +29,8 @@ Settings = else $.on d, '4chanXInitFinished', Settings.open $.set - lastchecked: Date.now() + archives: Conf['archives'] + lastarchivecheck: now previousversion: g.VERSION Settings.addSection 'Style', Settings.style @@ -173,7 +174,6 @@ Settings = data = version: g.VERSION date: now - Conf['WatchedThreads'] = {} for db in DataBoards Conf[db] = boards: {} # Make sure to export the most recent data. @@ -220,7 +220,9 @@ Settings = reader.readAsText file loadSettings: (data) -> - version = data.version.split '.' + if data.Conf['WatchedThreads'] + data.Conf['watchedThreads'] = boards: ThreadWatcher.convert data.Conf['WatchedThreads'] + delete data.Conf['WatchedThreads'] $.set data.Conf convertSettings: (data, map) -> diff --git a/src/General/css/icons.base.css b/src/General/css/icons.base.css index e025821a2..0e84efe4a 100644 --- a/src/General/css/icons.base.css +++ b/src/General/css/icons.base.css @@ -1,7 +1,7 @@ #navtopright .exlinksOptionsLink::after, #main-menu, body > div.navLinks > a:first-of-type::after, -.slideout-watcher #watcher::after, +.slideout-watcher #thread-watcher::after, .announcements-slideout #globalMessage::after, #boardNavDesktopFoot::after, #img-controls, @@ -26,7 +26,7 @@ body::after { .invisible-icons #navtopright .exlinksOptionsLink::after, .invisible-icons #main-menu, .invisible-icons body > div.navLinks > a:first-of-type::after, -.invisible-icons.slideout-watcher #watcher::after, +.invisible-icons.slideout-watcher #thread-watcher::after, .invisible-icons.announcements-slideout #globalMessage::after, .invisible-icons #boardNavDesktopFoot::after, .invisible-icons #img-controls, @@ -36,7 +36,7 @@ body::after { } #navtopright .exlinksOptionsLink, body > div.navLinks > a:first-of-type, -#{if Conf['Slideout Watcher'] then '#watcher,' else ''} +#{if Conf['Slideout Watcher'] then '#thread-watcher,' else ''} #{if Conf['Announcements'] is 'slideout' then '#globalMessage,' else ''} #boardNavDesktopFoot, #catalog { @@ -44,7 +44,7 @@ body > div.navLinks > a:first-of-type, } #navtopright .exlinksOptionsLink:hover, body > div.navLinks > a:first-of-type:hover, -.slideout-watcher #watcher:hover, +.slideout-watcher #thread-watcher:hover, .announcements-slideout #globalMessage:hover, #boardNavDesktopFoot:hover, #img-controls, @@ -60,7 +60,7 @@ body > div.navLinks > a:first-of-type::after { cursor: pointer; background-position: 0 -15px; } -.slideout-watcher #watcher::after { +.slideout-watcher #thread-watcher::after { background-position: 0 -30px; } .announcements-slideout #globalMessage::after { @@ -90,7 +90,7 @@ body > div.navLinks > a:first-of-type::after { #main-menu:hover, #navtopright .exlinksOptionsLink:hover::after, #qr #qrtab, -.slideout-watcher #watcher:hover::after, +.slideout-watcher #thread-watcher:hover::after, .thumbnail#selected, div.navLinks > a:first-of-type:hover::after, #catalog:hover::after, diff --git a/src/General/css/icons.horz.css b/src/General/css/icons.horz.css index 6c826800a..1b3dedb75 100644 --- a/src/General/css/icons.horz.css +++ b/src/General/css/icons.horz.css @@ -14,7 +14,7 @@ body::after { #{align}: #{position[i++]}px; } /* Watcher */ -.slideout-watcher #watcher::after { +.slideout-watcher #thread-watcher::after { #{align}: #{position[i++]}px; } /* ExLinks */ @@ -55,7 +55,7 @@ body::after { #boardNavDesktopFoot::after, #navtopright .exlinksOptionsLink::after, #main-menu, -.slideout-watcher #watcher::after, +.slideout-watcher #thread-watcher::after, .announcements-slideout #globalMessage::after, #img-controls, #fappeTyme, @@ -64,7 +64,7 @@ div.navLinks > a:first-of-type::after, top: 1px !important; } .slideout-watcher #globalMessage, -.slideout-watcher #watcher, +.slideout-watcher #thread-watcher, #boardNavDesktopFoot { top: 16px !important; } diff --git a/src/General/css/icons.vert.css b/src/General/css/icons.vert.css index 16500f846..8ecd63c00 100644 --- a/src/General/css/icons.vert.css +++ b/src/General/css/icons.vert.css @@ -20,8 +20,8 @@ body::after { top: #{position[i++]}px; } /* Watcher */ -.slideout-watcher #watcher, -.slideout-watcher #watcher::after { +.slideout-watcher #thread-watcher, +.slideout-watcher #thread-watcher::after { top: #{position[i++]}px !important; } /* ExLinks */ @@ -58,21 +58,21 @@ body::after { #globalMessage::after, #img-controls, #fappeTyme, -.slideout-watcher #watcher::after, +.slideout-watcher #thread-watcher::after, #catalog::after, div.navLinks > a:first-of-type::after { #{align}: 3px !important; } #boardNavDesktopFoot, #globalMessage, -.slideout-watcher #watcher.dialog { +.slideout-watcher #thread-watcher.dialog { <%= sizing %>: border-box; width: 232px !important; #{align}: 18px !important; } .sidebar-large #boardNavDesktopFoot, .sidebar-large #globalMessage, -.sidebar-large #watcher { +.sidebar-large #thread-watcher { width: 288px !important; } .fourchan-ss-navigation.fixed.top #header-bar, diff --git a/src/General/css/layout.css b/src/General/css/layout.css index 701ed429c..534f74d43 100644 --- a/src/General/css/layout.css +++ b/src/General/css/layout.css @@ -482,7 +482,7 @@ th { .icons-4chan-ss #navtopright .exlinksOptionsLink::after, .icons-4chan-ss #main-menu, .icons-4chan-ss .navLinks > a:first-of-type::after, -.icons-4chan-ss #watcher::after, +.icons-4chan-ss #thread-watcher::after, .icons-4chan-ss #globalMessage::after, .icons-4chan-ss #boardNavDesktopFoot::after, .icons-4chan-ss #img-controls, @@ -493,7 +493,7 @@ th { .icons-oneechan #navtopright .exlinksOptionsLink::after, .icons-oneechan #main-menu, .icons-oneechan .navLinks > a:first-of-type::after, -.icons-oneechan #watcher::after, +.icons-oneechan #thread-watcher::after, .icons-oneechan #globalMessage::after, .icons-oneechan #boardNavDesktopFoot::after, .icons-oneechan #img-controls, @@ -751,53 +751,53 @@ th { display: none; } /* Watcher */ -#watcher { +#thread-watcher { position: fixed; z-index: 14; padding: 2px; } -#watcher { +#thread-watcher { width: 200px; } -#watcher:not(:hover) { +#thread-watcher:not(:hover) { max-height: 200px; overflow: hidden; } -.rounded-edges #watcher { +.rounded-edges #thread-watcher { border-radius: 3px; } -#watcher > div { +#thread-watcher > div { max-height: 1.3em; overflow: hidden; } -.slideout-watcher #watcher { +.slideout-watcher #thread-watcher { <%= sizing %>: border-box; width: 248px; } .slideout-watcher.sidebar-large #boardNavDesktopFoot { width: 299px; } -.slideout-watcher.sidebar-location-right #watcher { +.slideout-watcher.sidebar-location-right #thread-watcher { left: auto !important; right: 2px !important; } -.slideout-watcher.sidebar-location-left #watcher { +.slideout-watcher.sidebar-location-left #thread-watcher { right: auto !important; left: 2px !important; } -.slideout-watcher #watcher .move { +.slideout-watcher #thread-watcher .move { cursor: default; } -.slideout-watcher.underline-links #watcher .move { +.slideout-watcher.underline-links #thread-watcher .move { text-decoration: underline; } -.slideout-watcher #watcher > div { +.slideout-watcher #thread-watcher > div { overflow: hidden; } -.slideout-watcher #watcher:hover { +.slideout-watcher #thread-watcher:hover { overflow-y: auto; } -.slideout-watcher #watcher:not(:hover) { +.slideout-watcher #thread-watcher:not(:hover) { height: 0; overflow: hidden; border: 0 none; diff --git a/src/General/css/style.css b/src/General/css/style.css index eb04ca52a..af1cf0b10 100644 --- a/src/General/css/style.css +++ b/src/General/css/style.css @@ -97,10 +97,10 @@ a { #qr { z-index: 30; } -#watcher { +#thread-watcher { z-index: 8; } -:root.fixed-watcher #watcher { +:root.fixed-watcher #thread-watcher { z-index: 20; } .fixed #header-bar { @@ -465,10 +465,10 @@ a.hide-announcement { } /* Thread Watcher */ -#watcher { +#thread-watcher { position: absolute; } -#watcher { +#thread-watcher { padding-bottom: 3px; overflow: hidden; white-space: nowrap; @@ -476,27 +476,27 @@ a.hide-announcement { max-height: 92%; overflow-y: auto; } -:root.fixed-watcher #watcher { +:root.fixed-watcher #thread-watcher { position: fixed; } -:root:not(.fixed-watcher) #watcher:not(:hover) { +:root:not(.fixed-watcher) #thread-watcher:not(:hover) { max-height: 210px; overflow-y: hidden; } -#watcher > .move { +#thread-watcher > .move { padding-top: 3px; } -#watcher > div { +#thread-watcher > div { max-width: 250px; overflow: hidden; padding-left: 3px; padding-right: 3px; text-overflow: ellipsis; } -#watcher a { +#thread-watcher a { text-decoration: none; } -#watcher .move>.close { +#thread-watcher .move>.close { position: absolute; right: 0px; top: 0px; diff --git a/src/General/css/theme.css b/src/General/css/theme.css index f6eff9f60..1d7cfc312 100644 --- a/src/General/css/theme.css +++ b/src/General/css/theme.css @@ -165,8 +165,8 @@ textarea.field:focus { #menu, #selectrice, #themeConf, -#watcher, -#watcher:hover, +#thread-watcher, +#thread-watcher:hover, .announcements-slideout #globalMessage, .dialog, .post-form-style-float #qr, @@ -343,7 +343,7 @@ a .name { #navtopright .exlinksOptionsLink::after, #main-menu, .navLinks > a:first-of-type::after, -#watcher::after, +#thread-watcher::after, #globalMessage::after, #boardNavDesktopFoot::after, #img-controls, diff --git a/src/General/html/Build/post.html b/src/General/html/Build/post.html index cf833ebdd..239dec4f7 100644 --- a/src/General/html/Build/post.html +++ b/src/General/html/Build/post.html @@ -54,6 +54,6 @@ #{if isOP then '' else fileHTML} -
#{comment or ''}#{capcodeReplies}
#{" "} +
#{comment or ''}
#{" "} """ \ No newline at end of file diff --git a/src/General/html/Monitoring/ThreadWatcher.html b/src/General/html/Monitoring/ThreadWatcher.html new file mode 100644 index 000000000..3059ef7b5 --- /dev/null +++ b/src/General/html/Monitoring/ThreadWatcher.html @@ -0,0 +1,5 @@ +
+ Thread Watcher + +
+
diff --git a/src/General/lib/$.coffee b/src/General/lib/$.coffee index 09cdb71fa..1709f69ac 100644 --- a/src/General/lib/$.coffee +++ b/src/General/lib/$.coffee @@ -54,18 +54,23 @@ $.extend = (object, properties) -> object[key] = val return -$.ajax = (url, options, extra={}) -> - {type, headers, upCallbacks, form, sync} = extra - r = new XMLHttpRequest() - r.overrideMimeType 'text/html' - type or= form and 'post' or 'get' - r.open type, url, !sync - for key, val of headers - r.setRequestHeader key, val - $.extend r, options - $.extend r.upload, upCallbacks - r.send form - r +$.ajax = do -> + # Status Code 304: Not modified + # With the `If-Modified-Since` header we only receive the HTTP headers and no body for 304 responses. + # This saves a lot of bandwidth and CPU time for both the users and the servers. + lastModified = {} + (url, options, extra={}) -> + {type, whenModified, upCallbacks, form, sync} = extra + r = new XMLHttpRequest() + type or= form and 'post' or 'get' + r.open type, url, !sync + if whenModified + r.setRequestHeader 'If-Modified-Since', lastModified[url] or '0' + $.on r, 'load', -> lastModified[url] = r.getResponseHeader 'Last-Modified' + $.extend r, options + $.extend r.upload, upCallbacks + r.send form + r $.cache = do -> reqs = {} diff --git a/src/General/lib/databoard.class b/src/General/lib/databoard.class index 80c190f17..e1f58ed47 100644 --- a/src/General/lib/databoard.class +++ b/src/General/lib/databoard.class @@ -1,10 +1,10 @@ -DataBoards = ['hiddenThreads', 'hiddenPosts', 'lastReadPosts', 'yourPosts'] +DataBoards = ['hiddenThreads', 'hiddenPosts', 'lastReadPosts', 'yourPosts', 'watchedThreads'] class DataBoard - constructor: (@key, sync) -> + constructor: (@key, sync, dontClean) -> @data = Conf[key] $.sync key, @onSync.bind @ - @clean() + @clean() unless dontClean return unless sync # Chrome also fires the onChanged callback on the current tab, # so we only start syncing when we're ready. @@ -13,6 +13,9 @@ class DataBoard @sync = sync $.on d, '4chanXInitFinished', init + save: -> + $.set @key, @data + delete: ({boardID, threadID, postID}) -> if postID delete @data.boards[boardID][threadID][postID] @@ -22,7 +25,7 @@ class DataBoard @deleteIfEmpty {boardID} else delete @data.boards[boardID] - $.set @key, @data + @save() deleteIfEmpty: ({boardID, threadID}) -> if threadID @@ -39,7 +42,7 @@ class DataBoard (@data.boards[boardID] or= {})[threadID] = val else @data.boards[boardID] = val - $.set @key, @data + @save() get: ({boardID, threadID, postID, defaultValue}) -> if board = @data.boards[boardID] @@ -67,8 +70,7 @@ class DataBoard @data.lastChecked = now for boardID of @data.boards @ajaxClean boardID - - $.set @key, @data + @save() ajaxClean: (boardID) -> $.cache "//api.4chan.org/#{boardID}/threads.json", (e) => @@ -84,7 +86,7 @@ class DataBoard threads[thread.no] = board[thread.no] @data.boards[boardID] = threads @deleteIfEmpty {boardID} - $.set @key, @data + @save() onSync: (data) -> @data = data or boards: {} diff --git a/src/General/lib/polyfill.coffee b/src/General/lib/polyfill.coffee index 5d9ddc124..3cec1905a 100644 --- a/src/General/lib/polyfill.coffee +++ b/src/General/lib/polyfill.coffee @@ -1,6 +1,16 @@ Polyfill = init: -> + Polyfill.toBlob() Polyfill.visibility() + toBlob: -> + HTMLCanvasElement::toBlob or= (cb) -> + data = atob @toDataURL()[22..] + # DataUrl to Binary code from Aeosynth's 4chan X repo + l = data.length + ui8a = new Uint8Array l + for i in [0...l] + ui8a[i] = data.charCodeAt i + cb new Blob [ui8a], type: 'image/png' visibility: -> # page visibility API return unless 'webkitHidden' of document diff --git a/src/Images/ImageExpand.coffee b/src/Images/ImageExpand.coffee index a442ab73b..246c61493 100644 --- a/src/Images/ImageExpand.coffee +++ b/src/Images/ImageExpand.coffee @@ -173,8 +173,8 @@ ImageExpand = {createSubEntry} = ImageExpand.menu subEntries = [] - for key, conf of Config.imageExpansion - subEntries.push createSubEntry key, conf + for name, conf of Config.imageExpansion + subEntries.push createSubEntry name, conf[1] $.event 'AddMenuEntry', type: 'header' @@ -182,17 +182,16 @@ ImageExpand = order: 105 subEntries: subEntries - createSubEntry: (type, config) -> + createSubEntry: (name, desc) -> label = $.el 'label', - innerHTML: " #{type}" + innerHTML: " #{name}" + title: desc input = label.firstElementChild - if type in ['Fit width', 'Fit height'] + if name in ['Fit width', 'Fit height'] $.on input, 'change', ImageExpand.cb.setFitness - if config - label.title = config[1] - input.checked = Conf[type] - $.event 'change', null, input - $.on input, 'change', $.cb.checked + input.checked = Conf[name] + $.event 'change', null, input + $.on input, 'change', $.cb.checked el: label menuToggle: (e) -> diff --git a/src/Linkification/Linkify.coffee b/src/Linkification/Linkify.coffee index f017b2b3d..ef1684dce 100644 --- a/src/Linkification/Linkify.coffee +++ b/src/Linkification/Linkify.coffee @@ -4,23 +4,20 @@ Linkify = @regString = if Conf['Allow False Positives'] ///( - \b( - [-a-z]+:// - | - [a-z]{3,}\.[-a-z0-9]+\.[a-z] - | - [-a-z0-9]+\.[a-z] - | - [\d]+\.[\d]+\.[\d]+\.[\d]+/ - | - [a-z]{3,}:[a-z0-9?] - | - [^\s@]+@[a-z0-9.-]+\.[a-z0-9] - ) - [^\s'"]+ - )///gi + [-a-z]+:// + | + [a-z]{3,}\.[-a-z0-9]+\.[a-z] + | + [-a-z0-9]+\.[a-z] + | + [\d]+\.[\d]+\.[\d]+\.[\d]+/ + | + [a-z]{3,}:[a-z0-9?] + | + [^\s@]+@[a-z0-9.-]+\.[a-z0-9] + )///i else - /(((magnet|mailto)\:|(www\.)|(news|(ht|f)tp(s?))\:\/\/){1}\S+)/gi + /(((magnet|mailto)\:|(www\.)|(news|(ht|f)tp(s?))\:\/\/){1})/i if Conf['Comment Expansion'] ExpandComment.callbacks.push @node @@ -43,16 +40,44 @@ Linkify = return + test = /[^\s'"]+/g + space = /[\s'"]/ + snapshot = $.X './/br|.//text()', @nodes.comment i = 0 while node = snapshot.snapshotItem i++ + links = [] + {data} = node + continue if node.parentElement.nodeName is "A" or not data - continue if node.parentElement.nodeName is "A" - links = [] + while result = test.exec data + {index} = result + endNode = node + if (length = index + result[0].length) is data.length - if Linkify.regString.test node.data - Linkify.regString.lastIndex = 0 - Linkify.gatherLinks snapshot, @, node, links, i + while (saved = snapshot.snapshotItem i++) + break if saved.nodeName is 'BR' + + endNode = saved + {length} = saved.data + + if end = space.exec saved.data + length = end.index + i-- + break + + if length is endNode.data.length then test.lastIndex = 0 + range = Linkify.makeRange node, endNode, index, length + if link = Linkify.regString.exec text = range.toString() + if lIndex = link.index + range.setStart node, lIndex + index + links.push [range, text] + break + + else + if link = Linkify.regString.exec result[0] + range = Linkify.makeRange node, node, link.index, link.length + links.push [range, link] for range in links.reverse() @nodes.links.push Linkify.makeLink range, @ @@ -68,66 +93,29 @@ Linkify = return - gatherLinks: (snapshot, post, node, links, i) -> - {data} = node - len = data.length - - while (match = Linkify.regString.exec data) - {index} = match - link = match[0] - len2 = index + link.length - - break if len is len2 - - range = document.createRange(); - range.setStart node, index - range.setEnd node, len2 - links.push range - - Linkify.regString.lastIndex = 0 - - if match - links.push Linkify.seek snapshot, post, node, links, match, i - - return - - seek: (snapshot, post, node, links, match, i) -> - link = match[0] - range = document.createRange() - range.setStart node, match.index - - while (next = snapshot.snapshotItem i++) and next.nodeName isnt 'BR' - node = next - data = node.data - if result = /[\s'"]/.exec data - {index} = result - range.setEnd node, index - Linkify.regString.lastIndex = index - Linkify.gatherLinks snapshot, post, node, links, i - return range - - if range.collapsed - range.setEnd node, node.data.length - + makeRange: (startNode, endNode, startOffset, endOffset) -> + range = document.createRange(); + range.setStart startNode, startOffset + range.setEnd endNode, endOffset range - makeLink: (range) -> - link = range.toString() - link = - if link.contains ':' - link + makeLink: ([range, text]) -> + text + text = + if text.contains ':' + text else ( - if link.contains '@' + if text.contains '@' 'mailto:' else 'http://' - ) + link + ) + text a = $.el 'a', className: 'linkify' rel: 'nofollow noreferrer' target: '_blank' - href: link + href: text $.add a, range.extractContents() range.insertNode a a diff --git a/src/Miscellaneous/ExpandComment.coffee b/src/Miscellaneous/ExpandComment.coffee index e66a458ef..d06f140c2 100644 --- a/src/Miscellaneous/ExpandComment.coffee +++ b/src/Miscellaneous/ExpandComment.coffee @@ -19,9 +19,8 @@ ExpandComment = cb: (e) -> e.preventDefault() - post = Get.postFromNode @ - ExpandComment.expand post - + ExpandComment.expand Get.postFromNode @ + expand: (post) -> if post.nodes.longComment and !post.nodes.longComment.parentNode $.replace post.nodes.shortComment, post.nodes.longComment @@ -61,6 +60,11 @@ ExpandComment = href = quote.getAttribute 'href' continue if href[0] is '/' # Cross-board quote, or board link quote.href = "/#{post.board}/res/#{href}" # Fix pathnames + Build.capcodeReplies + boardID: post.board.ID + threadID: post.thread.ID + bq: clone + capcodeReplies: postObj.capcode_replies post.nodes.shortComment = comment $.replace comment, clone post.nodes.comment = post.nodes.longComment = clone diff --git a/src/Monitoring/ThreadStats.coffee b/src/Monitoring/ThreadStats.coffee index a8002a575..452caf4cd 100644 --- a/src/Monitoring/ThreadStats.coffee +++ b/src/Monitoring/ThreadStats.coffee @@ -18,7 +18,6 @@ ThreadStats = @postCountEl = $ '#post-count', sc @fileCountEl = $ '#file-count', sc @pageCountEl = $ '#page-count', sc - @lastModified = '0' Thread::callbacks.push name: 'Thread Stats' @@ -55,12 +54,10 @@ ThreadStats = return setTimeout ThreadStats.fetchPage, 2 * $.MINUTE $.ajax "//api.4chan.org/#{ThreadStats.thread.board}/threads.json", onload: ThreadStats.onThreadsLoad, - headers: 'If-Modified-Since': ThreadStats.lastModified + whenModified: true onThreadsLoad: -> - return if !Conf["Page Count in Stats"] - ThreadStats.lastModified = @getResponseHeader 'Last-Modified' - return if @status isnt 200 + return unless Conf["Page Count in Stats"] and @status is 200 pages = JSON.parse @response for page in pages for thread in page.threads diff --git a/src/Monitoring/ThreadUpdater.coffee b/src/Monitoring/ThreadUpdater.coffee index 115bea3f1..3bd125c7a 100644 --- a/src/Monitoring/ThreadUpdater.coffee +++ b/src/Monitoring/ThreadUpdater.coffee @@ -64,7 +64,6 @@ ThreadUpdater = ThreadUpdater.root = @OP.nodes.root.parentNode ThreadUpdater.lastPost = +ThreadUpdater.root.lastElementChild.id.match(/\d+/)[0] ThreadUpdater.outdateCount = 0 - ThreadUpdater.lastModified = '0' ThreadUpdater.cb.interval.call $.el 'input', value: Conf['Interval'] @@ -137,9 +136,7 @@ ThreadUpdater = when 200 g.DEAD = false ThreadUpdater.parse JSON.parse(req.response).posts - ThreadUpdater.lastModified = req.getResponseHeader 'Last-Modified' - if Conf['Auto Update'] - ThreadUpdater.set 'timer', ThreadUpdater.getInterval() + ThreadUpdater.set 'timer', ThreadUpdater.getInterval() when 404 g.DEAD = true ThreadUpdater.set 'timer', null @@ -150,14 +147,8 @@ ThreadUpdater = 404: true thread: ThreadUpdater.thread else - if Conf['Auto Update'] - ThreadUpdater.outdateCount++ - ThreadUpdater.set 'timer', ThreadUpdater.getInterval() - ### - Status Code 304: Not modified - By sending the `If-Modified-Since` header we get a proper status code, and no response. - This saves bandwidth for both the user and the servers and avoid unnecessary computation. - ### + ThreadUpdater.outdateCount++ + ThreadUpdater.set 'timer', ThreadUpdater.getInterval() [text, klass] = if req.status is 304 [null, null] else @@ -219,7 +210,7 @@ ThreadUpdater = ThreadUpdater.req.abort() url = "//api.4chan.org/#{ThreadUpdater.thread.board}/res/#{ThreadUpdater.thread}.json" ThreadUpdater.req = $.ajax url, onloadend: ThreadUpdater.cb.load, - headers: 'If-Modified-Since': ThreadUpdater.lastModified + whenModified: true updateThreadStatus: (title, OP) -> titleLC = title.toLowerCase() diff --git a/src/Monitoring/ThreadWatcher.coffee b/src/Monitoring/ThreadWatcher.coffee index 50895fed9..bab77a3e0 100644 --- a/src/Monitoring/ThreadWatcher.coffee +++ b/src/Monitoring/ThreadWatcher.coffee @@ -2,98 +2,282 @@ ThreadWatcher = init: -> return unless Conf['Thread Watcher'] - @dialog = UI.dialog 'watcher', 'top: 50px; left: 0px;', - '
Thread Watcher
' + + @db = new DataBoard 'watchedThreads', @refresh, true + @dialog = UI.dialog 'thread-watcher', 'top: 50px; left: 0px;', """ + <%= grunt.file.read('src/General/html/Monitoring/ThreadWatcher.html').replace(/>\s+<').trim() %> + """ + @status = $ '#watcher-status', @dialog + @list = @dialog.lastElementChild $.on d, 'QRPostSuccessful', @cb.post - $.sync 'WatchedThreads', @refresh + $.on d, 'ThreadUpdate', @cb.threadUpdate if g.VIEW is 'thread' + $.on d, '4chanXInitFinished', @ready - $.ready -> - ThreadWatcher.refresh() - $.add d.body, ThreadWatcher.dialog + now = Date.now() + if (@db.data.lastChecked or 0) < now - 2 * $.HOUR + @db.data.lastChecked = now + ThreadWatcher.fetchAllStatus() + @db.save() + + # XXX tmp conversion from old to new format + $.get 'WatchedThreads', null, ({WatchedThreads}) -> + return unless WatchedThreads + for boardID, threads of ThreadWatcher.convert WatchedThreads + for threadID, data of threads + ThreadWatcher.db.set {boardID, threadID, val: data} + $.delete 'WatchedThreads' Thread::callbacks.push name: 'Thread Watcher' cb: @node node: -> - favicon = $.el 'a', - className: 'watch-thread-link' - href: 'javascript:;' - $.on favicon, 'click', ThreadWatcher.cb.toggle - $.before $('input', @OP.nodes.post), favicon - return if g.VIEW isnt 'thread' - $.get 'AutoWatch', 0, (item) => - return if item['AutoWatch'] isnt @ID - ThreadWatcher.watch @ + toggler = $.el 'img', + className: 'watcher-toggler' + $.on toggler, 'click', ThreadWatcher.cb.toggle + $.before $('input', @OP.nodes.post), toggler + + ready: -> + $.off d, '4chanXInitFinished', ThreadWatcher.ready + return unless Main.isThisPageLegit() + ThreadWatcher.refresh() + $.add d.body, ThreadWatcher.dialog + + return unless Conf['Auto Watch'] + $.get 'AutoWatch', 0, ({AutoWatch}) -> + return unless thread = g.BOARD.threads[AutoWatch] + ThreadWatcher.add thread $.delete 'AutoWatch' - refresh: (watched) -> - unless watched - $.get 'WatchedThreads', {}, (item) -> - ThreadWatcher.refresh item['WatchedThreads'] - return - nodes = [$('.move', ThreadWatcher.dialog)] - for board of watched - for id, props of watched[board] - x = $.el 'a', - textContent: '✖' - className: 'close' - href: 'javascript:;' - $.on x, 'click', ThreadWatcher.cb.x - link = $.el 'a', props - link.title = link.textContent - - div = $.el 'div' - $.add div, [x, $.tn(' '), link] - nodes.push div - - $.rmAll ThreadWatcher.dialog - $.add ThreadWatcher.dialog, nodes - - watched = watched[g.BOARD] or {} - for ID, thread of g.BOARD.threads - favicon = $ '.watch-thread-link', thread.OP.nodes.post - if ID of watched - $.addClass favicon, 'watched' - else - $.rmClass favicon, 'watched' - return - cb: + openAll: -> + return if $.hasClass @, 'disabled' + for a in $$ 'a[title]', ThreadWatcher.list + $.open a.href + $.event 'CloseMenu' + checkThreads: -> + return if $.hasClass @, 'disabled' + ThreadWatcher.fetchAllStatus() + pruneDeads: -> + return if $.hasClass @, 'disabled' + for {boardID, threadID, data} in ThreadWatcher.getAll() when data.isDead + delete ThreadWatcher.db.data.boards[boardID][threadID] + ThreadWatcher.db.deleteIfEmpty {boardID} + ThreadWatcher.db.save() + ThreadWatcher.refresh() + $.event 'CloseMenu' toggle: -> ThreadWatcher.toggle Get.postFromNode(@).thread - x: -> - thread = @nextElementSibling.pathname.split '/' - ThreadWatcher.unwatch thread[1], thread[3] + rm: -> + [boardID, threadID] = @parentNode.dataset.fullID.split '.' + ThreadWatcher.rm boardID, +threadID post: (e) -> {board, postID, threadID} = e.detail if postID is threadID if Conf['Auto Watch'] $.set 'AutoWatch', threadID else if Conf['Auto Watch Reply'] - ThreadWatcher.watch board.threads[threadID] + ThreadWatcher.add board.threads[threadID] + threadUpdate: (e) -> + {thread} = e.detail + return unless e.detail[404] and ThreadWatcher.db.get {boardID: thread.board.ID, threadID: thread.ID} + # Update 404 status. + ThreadWatcher.add thread + + fetchCount: + fetched: 0 + fetching: 0 + fetchAllStatus: -> + ThreadWatcher.status.textContent = '...' + for thread in ThreadWatcher.getAll() + ThreadWatcher.fetchStatus thread + return + fetchStatus: ({boardID, threadID, data}) -> + return if data.isDead + {fetchCount} = ThreadWatcher + fetchCount.fetching++ + $.ajax "//api.4chan.org/#{boardID}/res/#{threadID}.json", + onloadend: -> + fetchCount.fetched++ + if fetchCount.fetched is fetchCount.fetching + fetchCount.fetched = 0 + fetchCount.fetching = 0 + status = '' + else + status = "#{Math.round fetchCount.fetched / fetchCount.fetching * 100}%" + ThreadWatcher.status.textContent = status + return if @status isnt 404 + if Conf['Auto Prune'] + ThreadWatcher.rm boardID, threadID + else + data.isDead = true + ThreadWatcher.db.set {boardID, threadID, val: data} + ThreadWatcher.refresh() + , + type: 'head' + + getAll: -> + all = [] + for boardID, threads of ThreadWatcher.db.data.boards + if Conf['Current Board'] and boardID isnt g.BOARD.ID + continue + for threadID, data of threads + all.push {boardID, threadID, data} + all + + makeLine: (boardID, threadID, data) -> + x = $.el 'a', + textContent: '✖' + href: 'javascript:;' + $.on x, 'click', ThreadWatcher.cb.rm + + if data.isDead + href = Redirect.to 'thread', {boardID, threadID} + link = $.el 'a', + href: href or "/#{boardID}/res/#{threadID}" + textContent: data.excerpt + title: data.excerpt + + div = $.el 'div' + fullID = "#{boardID}.#{threadID}" + div.dataset.fullID = fullID + $.addClass div, 'current' if g.VIEW is 'thread' and fullID is "#{g.BOARD}.#{g.THREADID}" + $.addClass div, 'dead-thread' if data.isDead + $.add div, [x, $.tn(' '), link] + div + refresh: -> + nodes = [] + for {boardID, threadID, data} in ThreadWatcher.getAll() + nodes.push ThreadWatcher.makeLine boardID, threadID, data + + {list} = ThreadWatcher + $.rmAll list + $.add list, nodes + + for threadID, thread of g.BOARD.threads + toggler = $ '.watcher-toggler', thread.OP.nodes.post + toggler.src = if ThreadWatcher.db.get {boardID: thread.board.ID, threadID} + Favicon.default + else + Favicon.empty + + for refresher in ThreadWatcher.menu.refreshers + refresher() + return toggle: (thread) -> - unless $.hasClass $('.watch-thread-link', thread.OP.nodes.post), 'watched' - ThreadWatcher.watch thread + boardID = thread.board.ID + threadID = thread.ID + if ThreadWatcher.db.get {boardID, threadID} + ThreadWatcher.rm boardID, threadID else - ThreadWatcher.unwatch thread.board, thread.ID + ThreadWatcher.add thread + add: (thread) -> + data = {} + boardID = thread.board.ID + threadID = thread.ID + if thread.isDead + if Conf['Auto Prune'] and ThreadWatcher.db.get {boardID, threadID} + ThreadWatcher.rm boardID, threadID + return + data.isDead = true + data.excerpt = Get.threadExcerpt thread + ThreadWatcher.db.set {boardID, threadID, val: data} + ThreadWatcher.refresh() + rm: (boardID, threadID) -> + ThreadWatcher.db.delete {boardID, threadID} + ThreadWatcher.refresh() - unwatch: (board, threadID) -> - $.get 'WatchedThreads', {}, (item) -> - watched = item['WatchedThreads'] - delete watched[board][threadID] - delete watched[board] unless Object.keys(watched[board]).length - ThreadWatcher.refresh watched - $.set 'WatchedThreads', watched + convert: (oldFormat) -> + newFormat = {} + for boardID, threads of oldFormat + for threadID, data of threads + (newFormat[boardID] or= {})[threadID] = excerpt: data.textContent + newFormat - watch: (thread) -> - $.get 'WatchedThreads', {}, (item) -> - watched = item['WatchedThreads'] - watched[thread.board] or= {} - watched[thread.board][thread] = - href: "/#{thread.board}/res/#{thread}" - textContent: Get.threadExcerpt thread - ThreadWatcher.refresh watched - $.set 'WatchedThreads', watched \ No newline at end of file + menu: + refreshers: [] + init: -> + return if !Conf['Thread Watcher'] + menu = new UI.Menu 'thread watcher' + $.on $('.menu-button', ThreadWatcher.dialog), 'click', (e) -> + menu.toggle e, @, ThreadWatcher + @addHeaderMenuEntry() + @addMenuEntries() + + addHeaderMenuEntry: -> + return if g.VIEW isnt 'thread' + entryEl = $.el 'a', + href: 'javascript:;' + $.event 'AddMenuEntry', + type: 'header' + el: entryEl + order: 60 + $.on entryEl, 'click', -> ThreadWatcher.toggle g.threads["#{g.BOARD}.#{g.THREADID}"] + @refreshers.push -> + [addClass, rmClass, text] = if $ '.current', ThreadWatcher.list + ['unwatch-thread', 'watch-thread', 'Unwatch thread'] + else + ['watch-thread', 'unwatch-thread', 'Watch thread'] + $.addClass entryEl, addClass + $.rmClass entryEl, rmClass + entryEl.textContent = text + + addMenuEntries: -> + entries = [] + + # `Open all` entry + entries.push + cb: ThreadWatcher.cb.openAll + entry: + type: 'thread watcher' + el: $.el 'a', + textContent: 'Open all threads' + refresh: -> (if ThreadWatcher.list.firstElementChild then $.rmClass else $.addClass) @el, 'disabled' + + # `Check 404'd threads` entry + entries.push + cb: ThreadWatcher.cb.checkThreads + entry: + type: 'thread watcher' + el: $.el 'a', + textContent: 'Check 404\'d threads' + refresh: -> (if $('div:not(.dead-thread)', ThreadWatcher.list) then $.rmClass else $.addClass) @el, 'disabled' + + # `Prune 404'd threads` entry + entries.push + cb: ThreadWatcher.cb.pruneDeads + entry: + type: 'thread watcher' + el: $.el 'a', + textContent: 'Prune 404\'d threads' + refresh: -> (if $('.dead-thread', ThreadWatcher.list) then $.rmClass else $.addClass) @el, 'disabled' + + # `Settings` entries: + subEntries = [] + for name, conf of Config.threadWatcher + subEntries.push @createSubEntry name, conf[1] + entries.push + entry: + type: 'thread watcher' + el: $.el 'span', + textContent: 'Settings' + subEntries: subEntries + + for {entry, cb, refresh} in entries + entry.el.href = 'javascript:;' if entry.el.nodeName is 'A' + $.on entry.el, 'click', cb if cb + @refreshers.push refresh.bind entry if refresh + $.event 'AddMenuEntry', entry + createSubEntry: (name, desc) -> + entry = + type: 'thread watcher' + el: $.el 'label', + innerHTML: " #{name}" + title: desc + input = entry.el.firstElementChild + input.checked = Conf[name] + $.on input, 'change', $.cb.checked + $.on input, 'change', ThreadWatcher.refresh if name is 'Current Board' + entry diff --git a/src/Posting/QuickReply.coffee b/src/Posting/QuickReply.coffee index 5907fec94..c1a40cad4 100644 --- a/src/Posting/QuickReply.coffee +++ b/src/Posting/QuickReply.coffee @@ -665,21 +665,9 @@ QR = cv.width = img.width = width cv.getContext('2d').drawImage img, 0, 0, width, height URL.revokeObjectURL fileURL - applyBlob = (blob) => + cv.toBlob (blob) => @URL = URL.createObjectURL blob @nodes.el.style.backgroundImage = "url(#{@URL})" - if cv.toBlob - cv.toBlob applyBlob - return - data = atob cv.toDataURL().split(',')[1] - - # DataUrl to Binary code from Aeosynth's 4chan X repo - l = data.length - ui8a = new Uint8Array l - for i in [0...l] - ui8a[i] = data.charCodeAt i - - applyBlob new Blob [ui8a], type: 'image/png' fileURL = URL.createObjectURL @file img.src = fileURL diff --git a/src/Quotelinks/QuoteYou.coffee b/src/Quotelinks/QuoteYou.coffee index 2e5da0dc2..898f89fe4 100644 --- a/src/Quotelinks/QuoteYou.coffee +++ b/src/Quotelinks/QuoteYou.coffee @@ -16,7 +16,6 @@ QuoteYou = cb: @node node: -> - # Stop there if it's a clone. return if @isClone if @info.yours