Warning: fopen(/www/sites/update.greasyfork.icu/index/store/temp/33388ce3970f3efb01e4393a55e454fa.js): failed to open stream: No space left on device in /www/sites/update.greasyfork.icu/index/scriptControl.php on line 65
// ==UserScript==
// @name FIMFiction - Clickable Read Flow
// @namespace Selbi
// @include http*://*fimfiction.net/story/*/*/*
// @include http*://*fimfiction.net/chapter/*
// @version 3.2
// @grant none
// @description Adds the ability to scroll through a story by clicking on paragraphs
// @downloadURL https://update.greasyfork.icu/scripts/17377/FIMFiction%20-%20Clickable%20Read%20Flow.user.js
// @updateURL https://update.greasyfork.icu/scripts/17377/FIMFiction%20-%20Clickable%20Read%20Flow.meta.js
// ==/UserScript==
(function() {
"use strict";
// Get elements
let chapterBody = document.getElementById("chapter-body");
let paragraphOptionsCloseButton = document.querySelector("#paragraph-options a:last-child");
// Install scroll event listener when clicking on paragraphs
const MARGIN_TOP = 20;
const BOOKMARK_BOX_MARGIN = 80;
const DOUBLE_CLICK_TOLERANCE = 10;
fQuery.addScopedEventListener(chapterBody, "p", "click", clickEventListener);
function clickEventListener() {
if (window.getSelection().toString().length == 0) { // Prevent scroll when anything is selected
let y = getTargetY(this);
if (Math.abs(y - window.scrollY) < DOUBLE_CLICK_TOLERANCE) {
scrollToY(y - BOOKMARK_BOX_MARGIN);
} else {
scrollToY(y);
paragraphOptionsCloseButton.click();
}
}
}
function getTargetY(elem) {
let y = Math.round(elem.getBoundingClientRect().top + window.scrollY - MARGIN_TOP);
return y;
}
function scrollToY(y) {
window.scrollTo({top: y});
}
// Styling
function addGlobalStyle(css) {
let style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = css;
document.getElementsByTagName('head')[0].appendChild(style);
}
addGlobalStyle(`
#chapter-body p:hover {
cursor: pointer;
transition: all 200ms ease;
color: white !important;
}
#chapter_toolbar_container {
padding-bottom: 0px !important;
}
`);
})();