Custom Coloris Palette

Modifies Coloris color pickers in Kanka to offer the user’s selection of preset colors.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Custom Coloris Palette
// @namespace    http://tampermonkey.net/
// @version      4
// @description  Modifies Coloris color pickers in Kanka to offer the user’s selection of preset colors.
// @author       Salvatos
// @match        https://app.kanka.io/*relations*
// @match        https://app.kanka.io/*entity_events*
// @match        https://app.kanka.io/*map_markers*
// @match        https://app.kanka.io/*presets*
// @match        https://app.kanka.io/*calendars*
// @match        https://app.kanka.io/*families/*/tree*
// @match        https://app.kanka.io/*theme-builder
// @icon         https://www.google.com/s2/favicons?domain=kanka.io
// @grant        none
// @run-at       document-end
// ==/UserScript==

/*** INSTRUCTIONS
Add your color values in any valid format to the "customColors" setting below.
- Values are enclosed in quotation marks and separated by commas (line breaks are optional).
- All standard web color formats are accepted: named, hexadecimal, RGB(A), HSL, etc.

Example:
var customColorsExample = [
    'navy',
    '#07b',
    '#123321',
    '#00b4d880',
    'rgb(244,162,97)',
    'rgba(0,119,182,0.8)',
    'hsl(0, 100%, 50%)',
];

Remember you can also define a palette on each campaign; details on GreasyFork.
***/

var customColors = [
    
];

// Prepare to check for supported themes in the campaign
var rootFlags = getComputedStyle(document.documentElement);

/* Campaign-specific swatches */
if (rootFlags.getPropertyValue('--coloris-presets')) {
    let campaignSwatches = rootFlags.getPropertyValue('--coloris-presets').split(" ");
    // Merge browser and campaign arrays, removing duplicates
    customColors = customColors.concat(campaignSwatches.filter((item) => customColors.indexOf(item) < 0));
}

/* Build swatches */
var swatches = `<div>`;
for (let i = 0; i < customColors.length; i++) {
    swatches += `<button type="button" id="clr-swatch-${i}" aria-labelledby="clr-swatch-label clr-swatch-${i}" style="color: ${customColors[i]};">${customColors[i]}</button>`;
}
swatches += `</div>`;

/* Select the element to watch for the appearance of a color picker based on the current page */
/* Use the closest parent to input.spectrum that exists at page load to keep MutationObserver lean */

// Buld relations edit modal
if (window.location.href.indexOf("relations") != -1 && window.location.href.indexOf("entities") == -1) {
	document.targetNode = document.getElementById("bulk-edit");
}
// Map marker edit page
else if (window.location.href.indexOf("map_markers") != -1) {
	document.targetNode = document.getElementById("map-marker-form");
}
// Map marker preset edit page
else if (window.location.href.indexOf("presets") != -1) {
    document.targetNode = document.querySelector("section.content .grid");
}
// Family tree relation edit modal
else if (window.location.href.indexOf("tree") != -1) {
	document.targetNode = document.getElementById("family-tree");
}
// Theme Builder
// Form is created at page load, so no need to observe mutations
else if (window.location.href.indexOf("theme-builder") != -1) {
    // Just add the swatches once, but allow a second for Coloris to initialize
    setTimeout(() => {
        document.getElementById("clr-swatches").insertAdjacentHTML("beforeend", swatches);
    }, "1000");

}
// Default (entity relations and reminders, calendar reminders, theme builder, etc.)
else {
	document.targetNode = document.getElementById("primary-dialog");
}

// Start observing the page for the appearance of a "Spectrum" input, except for the Theme Builder
if (document.targetNode) {
    let observer = new MutationObserver(function(mutations) {
        if (document.querySelector(':is(.spectrum, .picker)')) {
            // If swatches have not already been added, append them to the existing container
            if (document.getElementById("clr-swatches").children.length < 1) {
                document.getElementById("clr-swatches").insertAdjacentHTML("beforeend", swatches);
            }
            // Keep the observer running in case the modal is closed and reopened
        }
    });

    observer.observe(document.targetNode, {attributes: false, childList: true, characterData: false, subtree:true});
}