// ==UserScript== // @name Libib - Custom status indicator style // @name:it Libib - Stile indicatore stato personalizzato // @description Set a custom color and style for libib.com item status indicator and more // @description:it Modifica i colori e lo stile dell'indicatore dello stato di un oggetto di libib.com // @author JetpackCat // @namespace https://github.com/JetpackCat-IT/libib-custom-status-style // @supportURL https://github.com/JetpackCat-IT/libib-custom-status-style/issues // @icon https://cdn.jsdelivr.net/gh/JetpackCat-IT/libib-custom-status-style/img/icon_64.png // @version 3.0.0 // @license GPL-3.0-or-later; https://raw.githubusercontent.com/JetpackCat-IT/libib-custom-status-style/master/LICENSE // @match https://www.libib.com/library // @run-at document-idle // @grant GM.getValue // @grant GM.setValue // @grant GM.xmlHttpRequest // @connect libib-sync.jetpackcat.workers.dev // @downloadURL https://update.greasyfork.org/scripts/526007/Libib%20-%20Custom%20status%20indicator%20style.user.js // @updateURL https://update.greasyfork.org/scripts/526007/Libib%20-%20Custom%20status%20indicator%20style.meta.js // ==/UserScript== (function () { "use strict"; const STATUS_SETTINGS_ICONS = { "cog": "https://cdn.jsdelivr.net/gh/JetpackCat-IT/libib-custom-status-style@main/img/assets/cog.svg", "cloudUp": "https://cdn.jsdelivr.net/gh/JetpackCat-IT/libib-custom-status-style@main/img/assets/cloud-up.svg", "cloudDown": "https://cdn.jsdelivr.net/gh/JetpackCat-IT/libib-custom-status-style@main/img/assets/cloud-down.svg", "trash": "https://cdn.jsdelivr.net/gh/JetpackCat-IT/libib-custom-status-style@main/img/assets/trash.svg", "crossedEye": "https://cdn.jsdelivr.net/gh/JetpackCat-IT/libib-custom-status-style@main/img/assets/crossed-eye.svg", "eye": "https://cdn.jsdelivr.net/gh/JetpackCat-IT/libib-custom-status-style@main/img/assets/eye.svg" } const CLOUD_SYNC_URL = "https://libib-sync.jetpackcat.workers.dev/"; const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; const STATUS_SETTINGS_FIELDS = [ {"id": "type", "label": "Indicator type", "default": "Triangle", "inputId": "status-settings-indicator-type", "inputType": "select", "options": ["Triangle", "Border"]}, {"id": "trianglePosition", "label": "Triangle position", "default": "Top left", "inputId": "status-settings-triangle-position", "inputType": "select", "options": ["Top left", "Top right", "Bottom left", "Bottom right"]}, {"id": "borderPosition", "label": "Border position", "default": "Bottom", "inputId": "status-settings-border-position", "inputType": "select", "options": ["Top", "Bottom"]}, {"id": "borderHeight", "label": "Border height", "default": 5, "inputId": "status-settings-border-height", "inputType": "number"}, {"id": "colorNotBegun", "label": '"Not begun" color', "default": "#ffffff", "inputId": "status-settings-color-notbegun", "inputType": "color"}, {"id": "colorCompleted", "label": '"Completed" color', "default": "#76eb99", "inputId": "status-settings-color-completed", "inputType": "color"}, {"id": "colorProgress", "label": '"In progress" color', "default": "#ffec8a", "inputId": "status-settings-color-inprogress", "inputType": "color"}, {"id": "colorAbandoned", "label": '"Abandoned" color', "default": "#ff7a7a", "inputId": "status-settings-color-abandoned", "inputType": "color"}, {"id": "blurGroups", "label": "Blur all covers from specified groups (separated by \";\")", "default": "", "inputId": "status-settings-blurgroups", "inputType": "text"}, {"id": "noBlurOnHover", "label": "Disable blur on hover", "default": false, "inputId": "status-settings-nobluronhover", "inputType": "checkbox"} ]; // For cover blur let BLUR_GROUPS = []; let settingsCleanupTimeout = null; let hasInternalHistory = false; const statusSettingsInit = async () => { const JSONConfig = await getJSONConfigFromGM(); const css = await generateCSS(JSONConfig); setCustomStyle(css); BLUR_GROUPS = JSONConfig.blurGroups; loadBlurredCovers(JSONConfig); } // Get libib sidebar menu. The settings button will be added to the sidebar const libibSidebarMenu = document.getElementById("primary-menu"); // General CSS const scriptCssStyle = ` .button-icon, .button-icon:hover { &.cloud-up { background-image: url(${STATUS_SETTINGS_ICONS.cloudUp}) !important; } &.cloud-down { background-image: url(${STATUS_SETTINGS_ICONS.cloudDown}) !important; } &.cloud-delete { background-image: url(${STATUS_SETTINGS_ICONS.trash}) !important; } background-repeat: no-repeat !important; background-position: left 20px center !important; background-size: 18px auto !important; padding-left: 50px !important; } .status-settings-detail-container { display: grid; } .status-settings-detail-body { display: flex; flex-direction: column; gap: 20px; } .status-settings-items { display: flex; flex-direction: column; gap: 8px; label { font-weight: 700; padding-left: 3px; margin: 0; } } .status-settings-preview { width: 100%; box-sizing: border-box; text-align: center; .item-group { background: none; padding-left: 0px; padding-right: 0px; display: flex; justify-content: center; } .cover { max-width: 100%; height: auto; box-sizing: border-box; } } #status-settings-preview-item { display: flex; flex-wrap: wrap; justify-content: center; } @media (max-width: 600px) { .status-settings-detail-container { .jump-save-wrapper { flex-direction: column; } .jump-save-wrapper .button { width: 100%; /* On mobile take 100% width */ margin-bottom: 5px !important; } } } @media (min-width: 768px) { .status-settings-detail-body { flex-direction: row; } .status-settings-items { flex: 2; } .status-settings-preview { flex: 1; } } #libib-status-settings-link>a { text-decoration: underline; user-select: none; } ul#primary-menu li#libib-status-settings-link a.active { text-indent: 0px; !important; } ul#primary-menu li#libib-status-settings-link:hover a.active { text-indent: 35px !important; } li#libib-status-settings-link a:hover { background: url('${STATUS_SETTINGS_ICONS.cog}') no-repeat left 40px center #fff; background-size: 20px auto; } .dark li#libib-status-settings-link a:hover { background: url('${STATUS_SETTINGS_ICONS.cog}') no-repeat left 40px center #1b1b1b; background-size: 20px auto; } `; const generateSettingsHTML = () => { // Input container structure let html = `
Live preview