您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Color picker for Sketchful
当前为
// ==UserScript== // @name Color Picker // @namespace https://greasyfork.org/users/281093 // @match https://sketchful.io/* // @grant none // @version 0.4 // @author Bell // @description Color picker for Sketchful // @run-at document-end // jshint esversion: 6 // ==/UserScript== let storedPalettes = JSON.parse(localStorage.getItem('palettes')); let paletteIndex = 0; let palettes = storedPalettes || [ [], [ "#3a3a3c", "#8e8e93", "#f8f9fa", "#ffadad", "#ffd6a5", "#fdffb6", "#caffbf", "#9bf6ff", "#a0c4ff", "#bdb2ff", "#ffc6ff", "#fdad88", "#9e5425", "#2c2c2e", "#636366", "#e0e0e0", "#ff7070", "#f3a220", "#f9e079", "#049d6f", "#92ddea", "#6dafe0", "#ab87ff", "#ff87ab", "#e38a5e", "#5e320d", "#1c1c1e", "#48484a", "#c2c2c2", "#f54d4d", "#dc8700", "#f0c808", "#00766a", "#219bc3", "#548bbc", "#715aff", "#ff5d8f", "#d1754e", "#421e06" ], ]; const canvas = document.querySelector("#canvas"); const ctx = canvas.getContext("2d"); const gameTools = document.querySelector("#gameTools"); const chatBox = document.querySelector("#gameChat"); const colorButtons = document.querySelectorAll(".gameToolsColor"); const colorsDiv = document.querySelector("#gameToolsColors"); const colorButton = document.querySelector("#gameToolsColors > div:nth-child(1) > div:nth-child(1)"); const colorPickerWrapper = document.createElement("div"); const colorInput = document.createElement("input"); const colorPicker = document.createElement("input"); const inputStyle = `margin: 5px 0; height: 20px; width: 50%; text-align: center; border: none;font-weight: 800; border-radius: 5px; background-color: #CBCBCB;`; const wrapperStyle = `position: absolute; margin: 5px 50%; height: 20px; width: 30px; border-radius: 5px;`; (function init() { updatePageStyle(); addListeners(); addObservers(); addPicker(); })(); function addPicker() { colorPicker.type = "color"; colorPicker.setAttribute("style", "opacity: 0; width: 30px; cursor: pointer;"); colorPicker.oninput = updatePicker; colorPickerWrapper.setAttribute("style", wrapperStyle); colorPickerWrapper.style.backgroundColor = colorPicker.value; colorPickerWrapper.appendChild(colorPicker); colorInput.oninput = updateInput; colorInput.addEventListener("click", selectInputText, false); colorInput.setAttribute("style", inputStyle); colorInput.setAttribute("spellcheck", "false"); colorInput.value = colorPicker.value; gameTools.appendChild(colorPickerWrapper); gameTools.appendChild(colorInput); addButtons(); } function addObservers() { const heightObserver = new MutationObserver(adjustChatSize); const config = { attributes: true, childList: false, subtree: false }; heightObserver.observe(gameTools, config); heightObserver.observe(chatBox, config); } function addListeners() { canvas.addEventListener('pointerdown', pickCanvasColor, false); colorsDiv.addEventListener("click", removeColor, false); } function updatePageStyle() { document.querySelector("#gameToolsSlider").style.top = "77px"; gameTools.style.height = "200px"; getDefaultPalette(); } function addButtons() { let prevPaletteBtn = document.createElement("button"); let nextPaletteBtn = document.createElement("button"); let saveColorBtn = document.createElement("button"); addButton(saveColorBtn, "save", "5px 5px 5px 70px;"); addButton(prevPaletteBtn, "arrow-left", "5px 5px 5px 40px;"); addButton(nextPaletteBtn, "arrow-right", "5px 5px 5px 100px;"); prevPaletteBtn.addEventListener("click", prevPalette, false); nextPaletteBtn.addEventListener("click", nextPalette, false); saveColorBtn.addEventListener("click", saveColor, false); } function nextPalette() { paletteIndex < (palettes.length - 1) && paletteIndex++; changePalette(paletteIndex); } function prevPalette() { paletteIndex > 0 && paletteIndex--; changePalette(paletteIndex); } function saveColor() { let currentPalette = palettes[paletteIndex]; while (currentPalette.length >= 39) { paletteIndex++; if (paletteIndex === palettes.length) { palettes.push([]); } currentPalette = palettes[paletteIndex]; } palettes[paletteIndex].push(colorPicker.value); changePalette(paletteIndex); localStorage.setItem("palettes", JSON.stringify(palettes)); } function removeColor(event) { if (event.altKey) { event.preventDefault(); let color = event.target; let index = Array.prototype.indexOf.call(colorButtons, color); if (index >= 0 && paletteIndex > 1) { let palette = palettes[paletteIndex]; palette.splice(index, 1); if (!palette.length) { palettes.splice(paletteIndex, 1); paletteIndex--; } changePalette(paletteIndex); localStorage.setItem("palettes", JSON.stringify(palettes)); } } } function addButton(button, icon, pos, id = "") { let buttonStyle = `margin: ${pos}; position: absolute; height: 20px; border: none; background-color: #CBCBCB; border-radius: 5px;`; button.setAttribute("style", buttonStyle); button.setAttribute("class", `fas fa-${icon}`); button.id = id; gameTools.appendChild(button); } function updatePicker(event) { let color = event.target.value; colorPickerWrapper.style.backgroundColor = color; colorInput.value = color; setColor(color); } function updateInput(event) { let color = event.target.value; colorPickerWrapper.style.backgroundColor = color; colorPicker.value = color; setColor(color); } function setColor(color) { let prevColor = colorButton.style.backgroundColor; colorButton.style.backgroundColor = color; colorButton.dispatchEvent(new Event("pointerdown")); colorButton.style.backgroundColor = prevColor; } function selectInputText() { colorInput.select(); } function pickCanvasColor(event) { if (event.altKey) { event.stopImmediatePropagation(); let pos = getPos(event); let [r, g, b, a] = ctx.getImageData(pos.x, pos.y, 1, 1).data; let color = `rgb(${r}, ${g}, ${b})`; setColor(color); } } function getPos(event) { let canvasRect = canvas.getBoundingClientRect(); let canvasScale = canvas.width / canvasRect.width; return { x: (event.clientX - canvasRect.left) * canvasScale, y: (event.clientY - canvasRect.top) * canvasScale }; } function changePalette(palette) { colorButtons.forEach((button, idx) => { let color = palettes[palette][idx] || "#fff"; button.style.backgroundColor = color; }); } function getDefaultPalette() { if (!palettes[0][0]) { colorButtons.forEach((button, idx) => { palettes[0][idx] = button.style.backgroundColor; }); } } function isDrawing() { return document.querySelector("#gameTools").style.display !== "none"; } function adjustChatSize() { chatBox.style.height = isDrawing() ? "calc(100% - 200px)" : "calc(100% - 180px)"; }