NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name SDMB Tweaker 2
// @namespace BigTSDMB
// @version 3.4.0
// @description New tweaks for the new(er) Discourse SDMB
// @author BigTSDMB
// @updateURL https://openuserjs.org/meta/BigTSDMB/SDMB_Tweaker_2.meta.js
// @downloadURL https://openuserjs.org/install/BigTSDMB/SDMB_Tweaker_2.user.js
// @license MIT
// @match https://boards.straightdope.com/*
// @grant none
// @run-at document-start
// @require https://openuserjs.org/src/libs/BigTSDMB/setStyle.js
// ==/UserScript==
/* jshint esversion: 6 */ /* globals setStyle */
//------------------------
// DYNAMIC CONTENT HELPERS
//------------------------
//Create url-change event
['pushState', 'replaceState'].forEach( changeState => {
window.history[changeState] = new Proxy(window.history[changeState], {
apply: (target, thisArg, argArray) => {
let output = target.apply(thisArg, argArray);
window.dispatchEvent(new Event('url-change'));
console.log('Event url-change fired');
return output;
},
});
});
addEventListener('popstate', _=>{ window.dispatchEvent(new Event('url-change')); });
setTimeout(/*'DOMContentLoaded',*/ _=>{ window.dispatchEvent(new Event('url-change')); });
//-----------------------
function onElement(selector, callback, persistent, observerOptions) {
if (!observerOptions) { observerOptions = { childList:true, subtree: true }; }
let elementArrival = new MutationObserver(_=>{
let elements = document.querySelectorAll(selector);
if (elements.length) {
if (!persistent) { elementArrival.disconnect(); }
callback(elements[0], elements);
}
}); elementArrival.observe(document, observerOptions);
}
function addElement (parent, tag, properties, textContent) {
const SVG_NS = 'http://www.w3.org/2000/svg';
let element, tagName, namespace
if (typeof tag == 'object') {
tagName = tag.tagName || tag.tag || tag.name;
namespace = tag.namespace;
} else if ( tag?.startsWith('svg:') ) {
tagName = tag.substr(4);
namespace = SVG_NS;
} else {
tagName = tag + ''; //coerce to string
namespace = '';
}
if (namespace) { element = document.createElementNS(namespace, tagName); }
else { element = document.createElement(tagName); }
if (properties) {
/*if (properties.class && namespace == SVG_NS) {
element.className.baseVal = properties.class;
delete properties.class;
}/**/
for (let key in properties) {
element.setAttribute(key, properties[key]);
}
}
if (textContent) { element.textContent = textContent; }
if (parent) { parent.appendChild(element); }
return element;
}
//-------------
// GET OPTIONS
//-------------
let optionsList = JSON.parse(localStorage.getItem('sdmb-tweaker-options') || '{}');
//--------------------
// VISUAL-ONLY TWEAKS
//--------------------
let mainStyles = `
.cooked a:not(.mention)/*, .d-editor-preview a:not(.mention)*/ {
text-decoration: underline;
text-decoration-skip: trailing-spaces; /* currently doesn't work. used gradient workaround */
}
.cooked :not(.source) > a:not(.mention):visited:not([href*="youtube.com"]), aside.onebox .onebox-body a[href]:visited {
color: var(--success);
}
a:hover:not(.post-activity), .title a:hover {
text-decoration: underline !important;
}
.title a, .menu-panel a:hover {
text-decoration: none !important;
}
.badge-notification.clicks {
left: -0.7ch;
margin-right: -0.7ch;
border-radius: 10px 10px 10px 0px;
background: radial-gradient(67% 79%, var(--primary-low) 68%, transparent 73%),
linear-gradient(to left, var(--primary-low) 60%, var(--secondary) 60%);
}
.MJXc-TeX-sans-R {
font-family: var(--font-family) !important;
}
/*.d-editor-textarea-column {
flex: none;
}*/
a.mention {
font-weight: bold;
color: var(--primary-very-high);
}
.time-gap {
background: var(--primary-200);
font-weight: bold;
height: 30px;
}
.custom-header-links .headerLink a {
padding: 0 !important;
}
user-menu-button-likes {
display: none;
}
@font-face { /* used in Vincent, but also can be custom font */
font-family: "Assistant-google";
font-style: normal;
font-weight: 200 800;
font-display: swap;
src: url(https://fonts.gstatic.com/s/assistant/v19/2sDcZGJYnIjSi6H75xkzaGW5.woff2) format('woff2');
}
`;
var optionalStyles = '';
if (!optionsList['sticky-avatars']) { optionalStyles += `
.topic-post.sticky-avatar .topic-avatar {
position: unset !important;
}
`; }
if (!optionsList['circular-avatars']) { optionalStyles += `
img.avatar {
border-radius: unset;
}
`; } else { optionalStyles += `
img.avatar {
border-radius: 50%;
}
`; }
if (optionsList['bolder-titles']) { optionalStyles +=`
.topic-list .main-link a.title {
font-weight: bold;
}
.visited .main-link a.title {
font-weight: normal;
}
`; }
if (optionsList['tighter-buttons']) { optionalStyles +=`
.d-editor-button-bar {
grid-template-columns: repeat(auto-fill, minmax(1.75em, 1fr)) !important;
}
`; }
if (optionsList['remove-share']) { optionalStyles +=`
.quote-sharing, .copy-quote {
display: none !important;
}
`; }
if (optionsList['change-font-text']) {
let font = optionsList['change-font-text'];
optionalStyles += `
body { font:family: var(--font-family); }`;
font = font.replace(/ ss\d\d?$/i, (match) => {
match = match.trim().toLowerCase();
optionalStyles += `
body, textarea { font-feature-settings: "${match}"; } `;
return '';
});
optionalStyles +=`
:root { --font-family: "${font}"; } `;
}
function addConditionalStyling() {
let conditionalStyles = '';
if (document.querySelector('[data-theme-name="straight dope light"]')) {
conditionalStyles += `
a, .cooked :not(.source) > a:active:not(.mention):not([href*="youtube.com"]), /*aside.onebox .onebox-body a[href],*/
.cooked :not(.source) > a:hover:not(.mention) {
color: var(--tertiary-high);
}
.cooked :not(.source) > a:not(.mention):visited:not([href*="youtube.com"]), aside.onebox .onebox-body a[href]:visited {
color: #551a8b; /* default visited color in most browsers */
}
.custom-tagline {
background-color: #8b1610 !important;
width: 100% !important;
color: #e9bd38 !important;
font-size: var(--font-down-1);
}
span.custom-tagline-main {
text-transform: UPPERCASE;
}
span.custom-tagline-secondary {
font-variant-caps: all-small-caps;
}
.d-header-icons .unread-notifications {
background-color: #ffc15e;
color: #081a8a;
}
`;
} else if (document.querySelector('[data-theme-name="vincent"]')) {
conditionalStyles = `
.moderator .cooked p {
color: white !important;
-webkit-text-stroke: 0.05px gray !important;
}
.moderator .cooked {
background: rgba(211,80,30,0.65) !important;
padding-left: 67px !important;
}
.moderator .topic-body {
border-left: none !important;
}
/* fix font to actually have bold */
:root {
font-family: var(--font-family);
${optionsList['change-font-text']? '' :
'--font-family: "Assistant-google", "Assistant", sans;'}
}
b, strong {
font-weight: bold; /* not bolder, which doesn't work */
/*
text-shadow: -0.6px 0, 0 0.6px, 0.6px 0, 0 -0.6px, -0.6px -0.6px, 0.6px 0.6px,
-0.6px 0.6px, 0.6px -0.6px;
font-synthesis: weight;
filter: brightness(110%)
/**/
}
`;
} else if (document.querySelector('[data-theme-name="minima"]')) {
conditionalStyles = `
.MJXc-TeX-sans-R {
font-family: sans-serif !important;
}
`;
} else if (document.querySelector('[data-theme-name~="dark"]')) {
conditionalStyles = `
.custom-footer {
background: var(--primary-low);
color: var(--primary-very-high);
font-weight: 600;
}
.custom-footer .flexbox {
color: var(--primary-very-high);
}
`;
}
setStyle(mainStyles + optionalStyles + conditionalStyles, 'sdmb-tweaker');
}
//-----------------
// REPLYBOX TWEAKS
//-----------------
function addButtons() {
makeButton('underline','Underline','u','italic', _=>{ wrapSelection('[u]', 'underlined text') });
makeButton('strikethrough', 'Strikethrough', 's', 'underline-button', _=>{ wrapSelection('[s]', 'struckthrough text') });
}
function makeButton(name, displayName, shortcutKey, beforeButton, callback) {
if (document.querySelector('#reply-control.open') === null) { return; }
if (document.querySelector(`.${name}-button`)) { return; }
let cloneButton = beforeButton;
if (beforeButton instanceof Array) { [beforeButton, cloneButton] = beforeButton; }
let shiftRequired = /^[A-Z]$/.test(shortcutKey);
let shortcutText = 'Ctrl-' + ( shiftRequired ? 'Shift-' : '' ) +
shortcutKey.replace(/^Arrow/, '').toUpperCase();
let newButton = document.querySelector(`button.${cloneButton}`).cloneNode(true);
document.querySelector(`button.${beforeButton}`).after(newButton);
newButton.id = `${name}-button`; //may remove later
newButton.classList.replace(cloneButton, `${name}-button`);
newButton.title = `${displayName} (${shortcutText})`;
newButton.addEventListener('click', callback);
addShortcutKey(shortcutKey, shiftRequired, newButton);
newButton.querySelector('svg').classList.remove(`d-icon-${cloneButton}`);
newButton.querySelector('use').href.baseVal = `#${name}`;
}
function addShortcutKey(shortcutKey, shiftRequired, button) {
let textbox = document.querySelector('textarea');
textbox.addEventListener('keydown', event => {
if (event.ctrlKey && event.key == shortcutKey) {
if (shiftRequired && !event.shiftKey) { return; }
button.click();
event.preventDefault();
event.stopPropagation();
}
});
}
function fixLinkButton() { // fix link button behavior for elements surrounded by [tag][/tag]
let linkButton = document.querySelector('button.link');
if (linkButton) {
if (document.querySelector('.link.clone')) { return; }
let cloneButton = linkButton.cloneNode(true);
linkButton.classList.add('original');
linkButton.style.display = 'none';
linkButton.after(cloneButton);
cloneButton.classList.add('clone');
cloneButton.onclick = _=>{ //addEventListner adds multiples, even with a named function
let replyBox = document.querySelector('textarea');
let selection = getTextareaSelection(replyBox);
selection.replace(/^(\[)(.+]).+(\[\/\2)$/, (e, p1, p2, p3) => {
replyBox.selectionStart += p1.length + p2.length;
replyBox.selectionEnd -= p3.length;
});
document.querySelector('.link.original').click();
};
}
}
function addButtonSVG() {
if (document.querySelector('svg.tweak-icons') == null) {
let svg = addElement('', 'svg:svg', {
class: 'tweak-icons',
style: 'display: none;'
}); console.log(svg)
svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg'); //for dev console aesthetics only
let symbol = addElement(svg, 'svg:symbol', { id: 'underline', viewBox: '0 0 448 512'});
addElement(symbol, 'svg:path', {
d: 'M416 448H32c-17.69 0-32 14.31-32 32s14.31 32 32 32h384c17.69 0 32-14.31 32-32S433.7 448 416 448zM48 64.01H64v160c0 88.22 71.78 159.1 160 159.1s160-71.78 160-159.1v-160h16c17.69 0 32-14.32 32-32s-14.31-31.1-32-31.1l-96-.0049c-17.69 0-32 14.32-32 32s14.31 32 32 32H320v160c0 52.94-43.06 95.1-96 95.1S128 276.1 128 224v-160h16c17.69 0 32-14.31 32-32s-14.31-32-32-32l-96 .0049c-17.69 0-32 14.31-32 31.1S30.31 64.01 48 64.01z'
});
symbol = addElement(svg, 'svg:symbol', { id: 'strikethrough', viewBox: '0 0 512 512' });
addElement(symbol, 'svg:path', {
d: 'M161.3 144c3.2-17.2 14-30.1 33.7-38.6c21.1-9 51.8-12.3 88.6-6.5c11.9 1.9 48.8 9.1 60.1 12c17.1 4.5 34.6-5.6 39.2-22.7s-5.6-34.6-22.7-39.2c-14.3-3.8-53.6-11.4-66.6-13.4c-44.7-7-88.3-4.2-123.7 10.9c-36.5 15.6-64.4 44.8-71.8 87.3c-.1 .6-.2 1.1-.2 1.7c-2.8 23.9 .5 45.6 10.1 64.6c4.5 9 10.2 16.9 16.7 23.9H32c-17.7 0-32 14.3-32 32s14.3 32 32 32H480c17.7 0 32-14.3 32-32s-14.3-32-32-32H270.1c-.1 0-.3-.1-.4-.1l-1.1-.3c-36-10.8-65.2-19.6-85.2-33.1c-9.3-6.3-15-12.6-18.2-19.1c-3.1-6.1-5.2-14.6-3.8-27.4zM348.9 337.2c2.7 6.5 4.4 15.8 1.9 30.1c-3 17.6-13.8 30.8-33.9 39.4c-21.1 9-51.7 12.3-88.5 6.5c-18-2.9-49.1-13.5-74.4-22.1c-5.6-1.9-11-3.7-15.9-5.4c-16.8-5.6-34.9 3.5-40.5 20.3s3.5 34.9 20.3 40.5c3.6 1.2 7.9 2.7 12.7 4.3l0 0 0 0c24.9 8.5 63.6 21.7 87.6 25.6l0 0 .2 0c44.7 7 88.3 4.2 123.7-10.9c36.5-15.6 64.4-44.8 71.8-87.3c3.6-21 2.7-40.4-3.1-58.1H335.1c7 5.6 11.4 11.2 13.9 17.2z'
});
document.documentElement.appendChild(svg);
}
setStyle(`
button.upload, button.local-dates { display: none; }
#underline-button > svg { padding-top: 1px; }
/*.tweaked-date { text-align: center; white-space: pre }*/
`);
}
function fixQuoteButton() { //prevents Discourse from removing fully quoted posts
let quoteButton = document.querySelector('.quote.btn');
if (!quoteButton) { return; }
function clickAction() { //named function to avoid adding event listener more than once.
let replybox = document.querySelector('textarea');
replybox.onchange = _=> { //faster than addEventListener, needed to catch quote being added
setTimeout( () => {
replybox.value = replybox.value.replace(/([^\u2062])(\n\[\/quote]\n)/g, '$1 \u2062$2');
console.log('replybox = ' + replybox.value.replace(/\u2062/g, '{@}'))
}, 50);
replybox.onchange = null;
};
};
quoteButton.onclick = clickAction; //addEventListener adds multiple copies for some reason
}
function changeDefaultText(string) {
let textarea = document.querySelector('textarea');
if (!textarea) { return; }
if (!string) {
let remove = / Drag or paste images\.$/;
string = textarea.placeholder.replace(remove, '');
}
textarea.placeholder = string;
textarea.ariaLabel = string;
}
//--------------------------
// TEXTBOX HELPER FUNCTIONS
//--------------------------
function escapeRegex(string) {
return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}
function getTextareaSelection(textarea, trim = true, before, after) {
if (!textarea) { textarea = document.querySelector('textarea'); }
if (typeof textarea == 'string') { textarea = document.querySelector(textarea) }
textarea.focus();
let selectionStart = textarea.selectionStart + (before || 0);
let selectionEnd = textarea.selectionEnd + (after || 0);
let selection = textarea.value.slice(selectionStart, selectionEnd);
if (trim && selection.trim() !== '' ) {
while (selection[0] == ' ') {
textarea.selectionStart++;
selection = selection.slice(1);
}
while (selection.slice(-1) == ' ') {
textarea.selectionEnd--;
selection = selection.slice(0, -1);
}
}
return selection;
}
function wrapSelection(tag, dummyText, trim = true, textarea) {
if (!textarea) { textarea = document.querySelector('textarea'); }
if (typeof textarea == 'string') { textarea = document.querySelector(textarea); }
if (typeof tag != 'object') {
tag = [tag, tag];
if (tag[0][0] == '[' || tag[0][0] == '<') {
tag[1] = tag[0][0] + '/' + tag[0].slice(1);
}
}
textarea.focus();
let selection = getTextareaSelection(textarea, trim) || dummyText;
let output = tag[0] + selection + tag[1];
//undo if already underlined
if (textarea.value.slice(textarea.selectionStart - tag[0].length, //remove dummy text
textarea.selectionEnd + tag[1].length) == tag[0] + dummyText + tag[1]) {
textarea.selectionStart -= tag[0].length; textarea.selectionEnd += tag[1].length;
output = '';
} else if (selection.match('^' + escapeRegex(tag[0]) + '.*' + escapeRegex(tag[1]) + '$')) {
output = selection.replace(new RegExp('^' + escapeRegex(tag[0])), '');
output = output.replace(new RegExp(escapeRegex(tag[1]) + '$'), '');
}
textarea.setRangeText(output);
//select dummy text if necessary
if (textarea.selectionStart == textarea.selectionEnd && output != '') {
textarea.selectionEnd = textarea.selectionStart + output.length - tag[1].length;
textarea.selectionStart += tag[0].length;
}
textarea.dispatchEvent( new Event('change') );
}
//------------------------
// CATEGORY/THREAD TWEAKS
// -----------------------
function fixDates() {
//console.log ('fixDates fired');
document.querySelectorAll('span.relative-date').forEach(span => {
let dateString;
if (false && optionsList?.['full-date-time'] && !span.firstChild?.classList?.contains('tweaked-date')) {
dateString = span.title || msToDiscourseDate(span.getAttribute('data-time'));
if (span.parentElement?.classList.contains('post-activity')) {
dateString = dateString.replace(/ (\d*:)/, '<br> $1');
}
} else {
if ( span.firstChild?.classList?.contains('tweaked-date') || /m|h$/.test(span.textContent) ) {
return span.textContent;
}
//console.log('attempt to fix datestrings');
dateString = span.title || msToDiscourseDate(span.getAttribute('data-time'));
dateString = dateString.replace(/^(.*) \d\d?:\d\d [ap]m$/, (_, date) => {
let [monthDay, year] = date.split(',');
if (year == new Date().getFullYear()) { return monthDay; }
return date;
})
//console.log(span);
if (span.parentElement?.classList.contains('post-activity')) {
dateString = dateString.replace(/,/, '\n ');
}
}
span.innerHTML =
`<span class="tweaked-date" style="text-align: center; white-space: pre">${dateString}</span>`;
});
}
function injectFixedDates() {
if ( !(new RegExp('^/[tc]/')).test(location.pathname) ) { return; }
//console.log ('date tweaker fired')
onElement('span.relative-date', _=> {
fixDates();
setTimeout(fixDates, 100);
let postsColumn = document.querySelector('div.posts-wrapper');
let observer = new MutationObserver(_=> {
observer.disconnect();
fixDates();
if (postsColumn) { observer.observe(postsColumn, {childList: true, subtree: true}); }
});
if (postsColumn) { observer.observe(postsColumn, {childList: true, subtree: true}); }
});
}
function msToDiscourseDate(milliseconds) {
let dateTime = new Date(+milliseconds);
let date = dateTime.toLocaleDateString('en-us', { dateStyle: 'medium' });
let time = dateTime.toLocaleTimeString('en-us', { timeStyle:'short' }).toLowerCase();
return `${date} ${time}`;
}
function fixTwitterNames() {
onElement('.twitter-screen-name > a', (_, nameList) => {
nameList.forEach(name => {
name.textContent = '@' + name.href.split('/')[3];
});
});
}
//----------------------------
// PROFILE/PREFERENCES TWEAKS
//----------------------------
function addMutedThreadsShow() { /*
if (!location.pathname.endsWith('/preferences/tags') || !document.body) { return }
onElement('svg.muted', mutedIcon => {
let mutedLabel = mutedIcon.parentNode;
if (mutedLabel) {
mutedLabel.style.display = 'block';
mutedLabel.appendChild(Object.assign(document.createElement('a'), {
style: 'float: right;',
href: 'https://boards.straightdope.com/latest?state=muted',
textContent: 'Show'
}));
}
});*/
}
//-------------------
// ADD OPTIONS PANEL
//-------------------
function createOptionControls(optionList) {
let optionControls = addElement('', 'fieldset', {
class: 'control-group sdmb-tweaker-preferences'
});
addElement(optionControls, 'legend', { class: 'control-label' }, 'SDMB Tweaker');
for (let key in optionList) {
if (key.endsWith('-text')) {
let div = addElement(optionControls, 'div', {
class: 'controls',
style: 'width: max-content;'
});
let label = addElement(div, 'label', { class: 'checkbox-label' }, optionList[key]);
let input = addElement(label, 'input', {
id: key,
maxlength: '255',
type: 'text',
class: 'sdmb-tweaker-setting',
style: 'padding: 0 0 0 0.2em; margin 0 0.5em 0 0.5em;'
});
addElement(label, 'small', '', '(press Enter to apply)');
} else {
let div = addElement(optionControls, 'div', { class: 'controls' });
let label = addElement(div, 'label', { class: 'checkbox-label' });
addElement(label, 'input', {
id: key,
type: 'checkbox',
class: 'ember-checkbox sdmb-tweaker-setting'
});
label.append(optionList[key]);
}
}
addElement(optionControls, 'small', '',
'You may need to refresh the page to activate Tweaker settings.'
);
return optionControls;
}
function addOptions() {
if (!location.pathname.endsWith('/preferences/interface') || !document.body) { return; }
let observer = new MutationObserver( () => {
if (document.querySelector('fieldset.sdmb-tweaker-preferences')) { return; }
let fieldset = document.querySelector('fieldset.other');
if (fieldset) {
observer.disconnect()
let additionalOptions = createOptionControls({
'bolder-titles': 'Make unread thread titles more bold',
'sticky-avatars': 'Move avatars as you scroll',
'circular-avatars': 'Make avatars circular',
'full-date-time': 'Always show full date/timestamp',
'tighter-buttons': 'Decrease space between buttons in text editor',
'remove-share': 'Remove share options when highlighting text',
'change-font-text': 'Replace main font with '
});
fieldset.after(additionalOptions);
let optionsList = JSON.parse(localStorage.getItem('sdmb-tweaker-options') || '{}');
let settingsList = document.getElementsByClassName('sdmb-tweaker-setting');
for (let option of settingsList) {
if (optionsList[option.id] == true) { option.checked = true; }
if (typeof optionsList[option.id] == 'string' ) { option.value = optionsList[option.id]; }
option.addEventListener('change', () => {
let value = option.value;
if (value == 'on') { value = option.checked }
optionsList[option.id] = value;
console.log (value);
localStorage.setItem('sdmb-tweaker-options', JSON.stringify(optionsList) );
});
}
}
}); observer.observe(document.body, { childList:true, subtree: true });
}
//-----------------
// ACTIVATE TWEAKS
//-----------------
setStyle(mainStyles + optionalStyles, 'sdmb-tweaker');
onElement('body', _=>{ //Do not know why, but sometimes the above doesn't work.
if (!document.getElementById('sdmb-tweaker')) {
setStyle(mainStyles + optionalStyles, 'sdmb-tweaker');
}
});
addEventListener('DOMContentLoaded', _=> {
addConditionalStyling()
addButtonSVG();
onElement('#reply-control', _=>{
let tasks = _=> {
addButtons();
fixLinkButton();
fixQuoteButton();
changeDefaultText();
}; tasks();
let getReplybox = new MutationObserver(tasks);
getReplybox.observe(document.querySelector('#reply-control'),
{ attributes: true, attributeFilter: ['class'], attributeOldValue: true }
);
});
});
addEventListener('url-change', _=>{
console.log ('inserting changes')
addOptions();
addMutedThreadsShow();
injectFixedDates();
//fixTwitterNames();
});
/*scratch for later
<details id="ember115" class="options select-kit single-select dropdown-select-box toolbar-popup-menu-options is-expanded ember-view">
<summary aria-label="Select a value to filter" name="Select a value to filter" data-name="" tabindex="-1" role="listbox" id="ember115-header" class="select-kit-header single-select-header dropdown-select-box-header btn no-text btn-icon ember-view">
<div class="select-kit-header-wrapper">
<svg class="fa d-icon d-icon-cog svg-icon svg-string" xmlns="http://www.w3.org/2000/svg">
<use href="#cog"></use>
</svg>
</div>
</summary>
<!----->
<div id="ember115-body" class="select-kit-body ember-view" style="position: fixed; min-width: 220px; max-width: 300px; inset: 0px auto auto 0px; margin: 0px; transform: translate3d(${element.getBoundingClientRect().x}px, ${element.getBoundingClientRect().y}px, 0px);" data-popper-placement="bottom-start">
<div id="ember115-filter" class="select-kit-filter ember-view"></div>
<ul class="select-kit-collection" aria-live="polite" role="menu">
<li data-guid="ember201" aria-checked="false" role="menuitemradio" data-name="Hide Details" data-value="insertDetails" title="Hide Details" tabindex="0" id="ember202" class="select-kit-row dropdown-select-box-row ember-view">
<div class="icons">
<span class="selection-indicator"></span>
<span class="svg-icon-title" title="hide-details">
<svg class="fa d-icon d-icon-caret-right svg-icon svg-string" xmlns="http://www.w3.org/2000/svg">
<use href="#caret-right"></use>
</svg>
</span>
</div>
<div class="texts">
<span class="name">Hide Details</span>
<span class="desc"><!----></span>
</div>
</li>
</ul>
</div>
<!---->
</details>
Request URL: https://boards.straightdope.com/t/950518/notifications
Request Method: POST
Status Code: 200
Remote Address: 64.71.144.203:443
Referrer Policy: strict-origin-when-cross-origin
cache-control: no-cache, no-store
cdck-proxy-id: app-router-tiehunter03.sea1
cdck-proxy-id: app-balancer-tieinterceptor1b.sea1
content-encoding: gzip
content-type: application/json; charset=utf-8
date: Thu, 30 Jun 2022 03:48:56 GMT
referrer-policy: strict-origin-when-cross-origin
server: nginx
set-cookie: _forum_session=7hljlWzitxpsY4A%2F%2Bmjt9Lyy8v%2BKoANCylQTb9ezO310kvfFEH9tose7CEROyRHy8q4KrDptlB71bDhoNRw0%2BmBGzE94lIBI7Yo%2Fe%2FgeUO4Zwvl3bmVBhcivPC4oAGkhwccwLWs%2F0cL3Qo%2FJXentnS3vJQ%2F46yfhzZyArWh%2FU9KpYB7TDZW7KoZJ8DC50DZWHGav8LFumTivsx4HB5JxMfWSNbW%2FWA5x1jEYgikKFJTHvBckCBzhMJ%2BRxbJO1Ozf3ozkPUUZs7e%2FtMFGNdRhFKgqe7bvWKzJ5dxxBU%2BOOy2BinQv7%2Br%2BYW%2FWMNZgzIwmBPjxxXJpnma7sti7VDXEeWp7d4eMzdyHiUWrzgH0Z7u9lt0sN9bQKPR9cM8LUYUQ42p%2B2oJ5KUYq3UBrKdbhcGd0x5VNKQFyQ2mKZbdveALgREbfcPmtqn9AZO1a2JzLGPfA%2B5g%2F8XzkKDi5mEK1efS76t1SRu7xZgct%2F9fAW1oT9UyLI191SxEOXB6FT8PepGWt5SYIFdKRoA7WvO7vMx3%2BZS6wNeikLPe2A5K7QNR1%2BCsgemQuMEwoxVm9wapNlx3Eaoo9EveHceCqhVw%3D--oenVyqEu7bfJSpGO--Sqp88jqcNk6J7mKuBeiELA%3D%3D; path=/; secure; HttpOnly; SameSite=Lax; Secure
strict-transport-security: max-age=31536000
vary: Accept-Encoding
vary: Accept
x-content-type-options: nosniff
x-discourse-route: topics/set_notifications
x-discourse-username: BigT
x-download-options: noopen
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
x-request-id: a8b41a07-cdd9-4fc8-a446-0c1dc53c61ec
x-xss-protection: 0
:authority: boards.straightdope.com
:method: POST
:path: /t/950518/notifications
:scheme: https
accept: *\/*
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
cache-control: no-cache
content-length: 20
content-type: application/x-www-form-urlencoded; charset=UTF-8
cookie: mjx.menu=zscale%3A200%25%26%3Brenderer%3ACommonHTML%26%3Bscale%3A100; vmidv1=9d38b8f8-2eaa-43fd-b805-99990016ffaf; _t=eQsHLjioTH23Z9vqU0pr7mC8DlhIkSpR9vZ3exfrugxIxgjCOP4Uk6DHwc9yvJq5Y3xgrIj4Dz2PcpUj%2B6TYhyWnut2l9DQZzgwL6Ys8eHbBV4hIGnI7Y2QUo3Aq9pTGu5%2FnhC4jbz83zZxarD6OUKHwJKqOSzo4t%2FJ%2FN4o3mt1KodAJpAPJF5GwExcmlGPHwz0zgtSyUXJceTbSQALvol9bjxDpDBh7bb%2BRk0FA0zzhulTZYvovD2K9RSxzdGb5sgGHLmdp3zprJW7gi6B2zw%3D%3D--SFoyHI0vE2QqdX4f--wW%2FGaT9BROoCahgz7Obqig%3D%3D; _forum_session=93akPS3Vb4IkmiM2jioJyY0J6bJJ0LyUsxR9XTl78TivCU%2FsD6ZU2qv02KYo1a%2B4rivCGiStArPOUtIMjIBfl0CgsWdum%2BpCWoKU5PG42127arCcKQgmcanDPImatFT%2FPMizlx1L%2Bat%2BGfhB2KeH%2F%2FCXDkKd3YrjhEidPHfj8S6GhniYXMzftl%2F%2BDdSV8M1rxDY0GAu%2BXJi4sg1urdH2PEGgIKAffrfR19HcqoI%2BXNv3DYJz3nOU2Town20PL5d132wUYpnzb6ZTDYQJGQ1t9P8Ydz3s7Zy9RG5sC4uJDGNnCPTK2F3SC0vdFHxUO6l1tVNiwuMvSM4L1s7qSBW54dFuePgvg5rWtWRhYhzBRhPDrDwBSZ7XrV5K7yiSv0nXwjGwBSxuC2L7pOQ0TbZdVx82YMlAFdidqaKIR8zl11fjINTYHYLiBA9OYGoaQ9mEZ%2BeLU9q4zZxBeIVBNGKjMKLMnW9uxyC3Ta4DzEzUQ7XVLqjm80m9%2BWxPTj5WVDUz9N3YmqVEq7%2FrYHba1Ah126KOxPqofe5LJOMakKDvqPpi%2FTt2G2PsVGpZUXX7BReo22HJn4E9lBQfgRN1%2Fxg%3D--Af2b5bIsduzPDDsA--XcMk%2F%2B5m%2BD3zUhPyj8fPQQ%3D%3D
discourse-logged-in: true
discourse-present: true
origin: https://boards.straightdope.com
pragma: no-cache
referer: https://boards.straightdope.com/t/trolls-r-us-resurrections/950518/1915
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="102", "Google Chrome";v="102"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: same-origin
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36
x-csrf-token: DH8FyPkLH2FwcJXAaIjzf0CH8hy3VnE2KZT8xFh3g652xD9cUmoxdDUHULf0vj1Mx1k3nfA_x_U-OBDdnSR5hQ
x-requested-with: XMLHttpRequest
*/