Greasy Fork

来自缓存

Greasy Fork is available in English.

Power Mode Input 输入特效

Activate power mode:网页内输入(如 input, textarea)内容时触发抖动/烟花特效,(!注意:可能有一些网站不会生效)原作者:https://github.com/disjukr,原作者 GitHub 仓库 https://github.com/disjukr/activate-power-mode

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Power Mode Input 输入特效
// @description  Activate power mode:网页内输入(如 input, textarea)内容时触发抖动/烟花特效,(!注意:可能有一些网站不会生效)原作者:https://github.com/disjukr,原作者 GitHub 仓库 https://github.com/disjukr/activate-power-mode
// @namespace    http://greasyfork.icu/users/686525-flexiston
// @version      0.2.1
// @author       Flexiston
// @run-at       document-idle
// @icon         https://cdn.jsdelivr.net/gh/Flexiston/CDN/favicon.png
// @include      *://*/*
// @match.       *://*/*
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// ==/UserScript==

(function() {
    if (typeof POWERMODE !== 'function') {
        // 原作者:https://github.com/disjukr
        // 原作者仓库:https://github.com/disjukr/activate-power-mode

        // 预览地址:http://0xabcdef.com/activate-power-mode/

        // ==activate-power-mode start==
        (function webpackUniversalModuleDefinition(root,factory) {
            if(typeof exports === 'object' && typeof module === 'object')
                module.exports = factory();
            else if(typeof define === 'function' && define.amd)
                define([], factory);
            else if(typeof exports === 'object')
                exports["POWERMODE"] = factory();
            else
                root["POWERMODE"] = factory();
        })(this, function() {
            return /******/ (function(modules) { // webpackBootstrap
                /******/ // The module cache
                /******/ var installedModules = {};
                /******/ // The require function
                /******/ function __webpack_require__(moduleId) {
                    /******/ // Check if module is in cache
                    /******/ if(installedModules[moduleId])
                        /******/ return installedModules[moduleId].exports;
                    /******/ // Create a new module (and put it into the cache)
                    /******/ var module = installedModules[moduleId] = {
                        /******/ exports: {},
                        /******/ id: moduleId,
                        /******/ loaded: false
                        /******/ };
                    /******/ // Execute the module function
                    /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
                    /******/ // Flag the module as loaded
                    /******/ module.loaded = true;
                    /******/ // Return the exports of the module
                    /******/ return module.exports;
                    /******/ }
                /******/ // expose the modules object (__webpack_modules__)
                /******/ __webpack_require__.m = modules;
                /******/ // expose the module cache
                /******/ __webpack_require__.c = installedModules;
                /******/ // __webpack_public_path__
                /******/ __webpack_require__.p = "";
                /******/ // Load entry module and return exports
                /******/ return __webpack_require__(0);
                /******/ })
            /*******************************************************************
                *****/
            /******/ ([
                /* 0 */
                /***/ (function(module, exports, __webpack_require__) {
                    'use strict';
                    var canvas = document.createElement('canvas');
                    canvas.width = window.innerWidth;
                    canvas.height = window.innerHeight;
                    canvas.style.cssText = 'position:fixed;top:0;left:0;pointer-events:none;zindex:999999';
                    window.addEventListener('resize', function () {
                        canvas.width = window.innerWidth;
                        canvas.height = window.innerHeight;
                    });
                    document.body.appendChild(canvas);
                    var context = canvas.getContext('2d');
                    var particles = [];
                    var particlePointer = 0;
                    var rendering = false;
                    POWERMODE.shake = true;
                    function getRandom(min, max) {
                        return Math.random() * (max - min) + min;
                    }
                    function getColor(el) {
                        if (POWERMODE.colorful) {
                            var u = getRandom(0, 360);
                            return 'hsla(' + getRandom(u - 10, u + 10) + ', 100%, ' + getRandom(50, 80) + '%, ' + 1 + ')';
                        } else {
                            return window.getComputedStyle(el).color;
                        }
                    }
                    function getCaret() {
                        var el = document.activeElement;
                        var bcr;
                        if (el.tagName === 'TEXTAREA' ||
                            (el.tagName === 'INPUT' && el.getAttribute('type') === 'text')) {
                            var offset = __webpack_require__(1)(el, el.selectionEnd);
                            bcr = el.getBoundingClientRect();
                            return {
                                x: offset.left + bcr.left,
                                y: offset.top + bcr.top,
                                color: getColor(el)
                            };
                        }
                        var selection = window.getSelection();
                        if (selection.rangeCount) {
                            var range = selection.getRangeAt(0);
                            var startNode = range.startContainer;
                            if (startNode.nodeType === document.TEXT_NODE) {
                                startNode = startNode.parentNode;
                            }
                            bcr = range.getBoundingClientRect();
                            return {
                                x: bcr.left,
                                y: bcr.top,
                                color: getColor(startNode)
                            };
                        }
                        return { x: 0, y: 0, color: 'transparent' };
                    }
                    function createParticle(x, y, color) {
                        return {
                            x: x,
                            y: y,
                            alpha: 1,
                            color: color,
                            velocity: {
                                x: -1 + Math.random() * 2,
                                y: -3.5 + Math.random() * 2
                            }
                        };
                    }
                    function POWERMODE() {
                        { // spawn particles
                            var caret = getCaret();
                            var numParticles = 5 + Math.round(Math.random() * 10);
                            while (numParticles--) {
                                particles[particlePointer] = createParticle(caret.x, caret.y, caret.color);
                                particlePointer = (particlePointer + 1) % 500;
                            }
                        }
                        { // shake screen
                            if (POWERMODE.shake) {
                                var intensity = 1 + 2 * Math.random();
                                var x = intensity * (Math.random() > 0.5 ? -1 : 1);
                                var y = intensity * (Math.random() > 0.5 ? -1 : 1);
                                document.body.style.marginLeft = x + 'px';
                                document.body.style.marginTop = y + 'px';
                                setTimeout(function() {
                                    document.body.style.marginLeft = '';
                                    document.body.style.marginTop = '';
                                }, 75);
                            }
                        }
                        if(!rendering){
                            requestAnimationFrame(loop);
                        }
                    };
                    POWERMODE.colorful = false;
                    function loop() {
                        rendering = true;
                        context.clearRect(0, 0, canvas.width, canvas.height);
                        var rendered = false;
                        var rect = canvas.getBoundingClientRect();
                        for (var i = 0; i < particles.length; ++i) {
                            var particle = particles[i];
                            if (particle.alpha <= 0.1) continue;
                            particle.velocity.y += 0.075;
                            particle.x += particle.velocity.x;
                            particle.y += particle.velocity.y;
                            particle.alpha *= 0.96;
                            context.globalAlpha = particle.alpha;
                            context.fillStyle = particle.color;
                            context.fillRect(
                                Math.round(particle.x - 1.5) - rect.left,
                                Math.round(particle.y - 1.5) - rect.top,
                                3, 3
                            );
                            rendered = true;
                        }
                        if(rendered){
                            requestAnimationFrame(loop);
                        }else{
                            rendering = false;
                        }
                    }
                    module.exports = POWERMODE;
                    /***/ }),
                /* 1 */
                /***/ (function(module, exports) {
                    /* jshint browser: true */
                    (function () {
                        // The properties that we copy into a mirrored div.
                        // Note that some browsers, such as Firefox,
                        // do not concatenate properties, i.e. paddingtop, bottom etc. -> padding,
                        // so we have to do every single property specifically.
                        var properties = [
                            'direction', // RTL support
                            'boxSizing',
                            'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does
                            'height',
                            'overflowX',
                            'overflowY', // copy the scrollbar for IE
                            'borderTopWidth',
                            'borderRightWidth',
                            'borderBottomWidth',
                            'borderLeftWidth',
                            'borderStyle',
                            'paddingTop',
                            'paddingRight',
                            'paddingBottom',
                            'paddingLeft',
                            // https://developer.mozilla.org/en-US/docs/Web/CSS/font
                            'fontStyle',
                            'fontVariant',
                            'fontWeight',
                            'fontStretch',
                            'fontSize',
                            'fontSizeAdjust',
                            'lineHeight',
                            'fontFamily',
                            'textAlign',
                            'textTransform',
                            'textIndent',
                            'textDecoration', // might not make a difference, but better be safe
                            'letterSpacing',
                            'wordSpacing',
                            'tabSize',
                            'MozTabSize'
                        ];
                        var isFirefox = window.mozInnerScreenX != null;
                        function getCaretCoordinates(element, position, options) {
                            var debug = options && options.debug || false;
                            if (debug) {
                                var el = document.querySelector('#inputtextarea-caret-position-mirror-div');
                                if ( el ) { el.parentNode.removeChild(el); }
                            }
                            // mirrored div
                            var div = document.createElement('div');
                            div.id = 'input-textarea-caret-position-mirrordiv';
                            document.body.appendChild(div);
                            var style = div.style;
                            var computed = window.getComputedStyle? getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9
                            // default textarea styles
                            style.whiteSpace = 'pre-wrap';
                            if (element.nodeName !== 'INPUT')
                                style.wordWrap = 'break-word'; // only for textarea-s
                            // position off-screen
                            style.position = 'absolute'; // required to return coordinates properly
                            if (!debug)
                                style.visibility = 'hidden'; // not 'display: none' because we want rendering
                            // transfer the element's properties to the div
                            properties.forEach(function (prop) {
                                style[prop] = computed[prop];
                            });
                            if (isFirefox) {
                                // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275
                                if (element.scrollHeight > parseInt(computed.height))
                                    style.overflowY = 'scroll';
                            } else {
                                style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll'
                            }
                            div.textContent = element.value.substring(0, position);
                            // the second special handling for input type="text" vs textarea: spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/
                            13402035/1269037
                            if (element.nodeName === 'INPUT')
                                div.textContent = div.textContent.replace(/\s/g, "\u00a0");
                            var span = document.createElement('span');
                            // Wrapping must be replicated *exactly*, including when a long word gets
                            // onto the next line, with whitespace at the end of the line before (#7).
                            // The *only* reliable way to do that is to copy the *entire* rest of the
                            // textarea's content into the <span> created at the caret position.
                            // for inputs, just '.' would be enough, but why bother?
                            span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all
                            div.appendChild(span);
                            var coordinates = {
                                top: span.offsetTop + parseInt(computed['borderTopWidth']),
                                left: span.offsetLeft + parseInt(computed['borderLeftWidth'])
                            };
                            if (debug) {
                                span.style.backgroundColor = '#aaa';
                            } else {
                                document.body.removeChild(div);
                            }
                            return coordinates;
                        }
                        if (typeof module != "undefined" && typeof module.exports != "undefined") {
                            module.exports = getCaretCoordinates;
                        } else {
                            window.getCaretCoordinates = getCaretCoordinates;
                        }
                    }());
                    /***/ })
                /******/ ])
        });
        ;
        // ==activate-power-mode end==
    }

    var colorfulOn = GM_getValue('colorfulOn');
    var shakeOn = GM_getValue('shakeOn');

    POWERMODE.colorful = colorfulOn;
    POWERMODE.shake = shakeOn;

    if (colorfulOn) {
        console.log('Power Mode Input: 开启彩色');
    } else {
        console.log('Power Mode Input: 关闭彩色');
    }

    if (shakeOn) {
        console.log('Power Mode Input: 开启抖动');
    } else {
        console.log('Power Mode Input: 关闭抖动');
    }

    function colorfulToggle() {
        if (colorfulOn){
            console.log('Power Mode Input: 已关闭彩色');
            GM_setValue('colorfulOn', false);
            window.location.reload();
        } else {
            console.log('Power Mode Input: 已开启彩色');
            GM_setValue('colorfulOn', true);
            window.location.reload();
        }
    }

    function shakeToggle() {
        if (shakeOn) {
            console.log('Power Mode Input: 已关闭抖动');
            GM_setValue('shakeOn', false);
            window.location.reload();
        } else {
            console.log('Power Mode Input: 已开启抖动');
            GM_setValue('shakeOn', true);
            window.location.reload();
        }
    }

    GM_registerMenuCommand('点击开启/关闭彩色', colorfulToggle, '');
    GM_registerMenuCommand('点击开启/关闭抖动', shakeToggle, '');

    document.body.addEventListener('input', POWERMODE);
})();