// ==UserScript==
// @name C.ai Color Enhancer
// @namespace GreasyFork Scripts
// @match https://character.ai/*
// @match https://*.character.ai/*
// @grant none
// @license MIT
// @version 1.0.0.2
// @author Vishanka & suggestingpain & elifwlrr (edit by Ciel_145)
// @description Lets you change the text colors as you wish and highlight chosen words. Hides the text "(edited)" or "Edited" after editing text. Removes the blue border around text after editing a chat on Character AI. Fixed for mobile users.
// @icon https://i.imgur.com/ynjBqKW.png
// ==/UserScript==
(function() {
function loop() {
let elements = document.querySelectorAll("div, p");
elements.forEach(function(val) {
if (val.innerText == "(edited)") {
val.style.display = 'none';
}
if (val.innerText == "Edited") {
val.style.display = 'none';
}
});
requestAnimationFrame(loop);
}
loop();
})();
(function() {
'use strict';
// Function to change the CSS variable value
function changeBlueColor() {
const root = document.documentElement;
// Set the new color value for --blue
root.style.setProperty('--blue', '#242525');
}
// Wait for the page to load completely and then change the color
window.addEventListener('load', () => {
changeBlueColor();
});
})();
(function () {
const currentTheme = document.documentElement.classList.contains('dark') ? 'dark' : 'light';
var plaintextColor = localStorage.getItem('plaintext_color');
var italicColor = localStorage.getItem('italic_color');
var charbubbleColor = localStorage.getItem('charbubble_color') || '#26272B';
var userbubbleColor = localStorage.getItem('userbubble_color') || '#303136';
var defaultColor = '#FFFFFF'; // Default color if 'plaintext_color' is not set
var GuideColor = localStorage.getItem('guide_color') || '#131316';
var BodyColor = localStorage.getItem('body_color') || '#18181B';
var InputColor = localStorage.getItem('input_color') || '#202024';
var AccentColor = localStorage.getItem('accent_color') || '#26272b';
const charbubbleMarginTop = localStorage.getItem('charbubbleMarginTop_color') || '0px';
const charbubbleMarginLeft = localStorage.getItem('charbubbleMarginLeft_color') || '0px';
// Use the retrieved color or default color
var color = plaintextColor || defaultColor;
// Retrieve the selected font and font size from local storage, or use defaults
var selectedFont = localStorage.getItem('selected_font') || 'Inter';
var fontSize = localStorage.getItem('font_size') || '16px';
var fontWeight = localStorage.getItem('fontWeight_color') || '300';
var titlesWeight = localStorage.getItem('boldTitles') || 'normal';
var imageSize = localStorage.getItem('ImageSize') || '24px';
var removeTitle = localStorage.getItem('removeTitles') || 'block';
var removeUserImage = localStorage.getItem('removeUserImage') || 'block';
var cpfpPaddingRight = localStorage.getItem('cpfpPaddingRight') || '0px';
var cpfpPaddingTop = localStorage.getItem('cpfpPaddingTop') || '0px';
var upfpPaddingLeft = localStorage.getItem('upfpPaddingLeft') || '0px';
var proseMarginTop = localStorage.getItem('proseMarginTop') || '1.25em';
var proseMarginBottom = localStorage.getItem('proseMarginBottom') || '1.25em';
var showMobilePfP = localStorage.getItem('showMobilePfP') || 'none';
var uBubbleWidth = localStorage.getItem('uBubbleWidth') || '100%';
//var uBubbleWidth = showMobilePfP === 'block' ? '100%' : '100%';
//localStorage.setItem('uBubbleWidth', uBubbleWidth);
var uBubblerem = removeUserImage === 'none' ? '0px' : (showMobilePfP === 'block' ? '-2rem' : '0px');
localStorage.setItem('uBubblerem', uBubblerem);
// Store the correct value of 'uBubblerem' in localStorage
// Determine the value of upfpMobileWidth based on removeUserImage
var upfpMobileWidth = removeUserImage === 'block' ? imageSize : '0px';
// Optionally, you can store the value of upfpMobileWidth in localStorage
localStorage.setItem('upfpMobileWidth', upfpMobileWidth);
// Create the CSS style using the selected font, stored colors, and font size
var css = `
p[node='[object Object]'] {
color: ${color} !important;
font-family: '${selectedFont}', 'Onest', sans-serif !important;
font-size: ${fontSize} !important;
font-weight: ${fontWeight} !important;
}
p, textarea, button, div.text-sm {
font-family: '${selectedFont}', 'Onest', sans-serif !important;
}
em {
color: ${italicColor} !important;
}
`;
css += `
.mt-1.bg-surface-elevation-2 {
background-color: ${charbubbleColor};
margin-top: ${charbubbleMarginTop};
margin-left: ${charbubbleMarginLeft};
}
.mt-1.bg-surface-elevation-3 {
background-color: ${userbubbleColor};
}
`;
// Apply styles to specific elements for the bold titles
css += `
.mx-2.flex.flex-row.items-center.gap-2.font-light .text-small:not(.text-muted-foreground) {
font-weight: ${titlesWeight} !important;
}
`;
css +=`
.max-w-7xl.self-center.w-full
`;
// Apply image size to specified elements, excluding the exception class
// Add styles for elements with specific classes and exclude images under .h-dvh > div:nth-child(1)
css += `
.mt-0.hidden.md\\:flex.flex-col.gap-3.items-center:not(
.h-dvh > div:nth-child(1) *):not(
.text-center *):not(
.w-80 *):not(
.m-0.flex.items-start.gap-2.justify-start.mr-0.md\\:mr-6.flex-row-reverse *):not(
.flex.flex-col.items-center.justify-center.p-6.pt-0.mt-32.max-w-lg.mx-auto *):not(
.flex.flex-col.items-center.h-full.overflow-y-hidden *):not(
.flex.flex-col.justify-between.px-4.sm\\:px-8.pt-6 *):not(
.flex.flex-col.flex-auto.gap-4.w-full.max-w-2xl *):not(
.w-full.h-full.overflow-y-auto *):not(
.flex.flex-col.justify-between.p-4 *):not(
.flex.gap-3 *):not(
.flex.flex-col.flex-auto.gap-4.w-full.max-w-2xl *) {
width: ${imageSize} !important;
height: ${imageSize} !important;
border-radius: 50px;
}
`;
// Add styles for elements with specific classes and exclude images under .h-dvh.fixed.z-50
css += `
.relative.flex.h-auto.w-full.overflow-hidden.rounded-full.shrink-0.grow-0:not(
.h-dvh.fixed.z-50 *):not(
.text-center *):not(
.w-80 *):not(
.flex.flex-col.items-center.justify-center.p-6.pt-0.mt-32.max-w-lg.mx-auto *):not(
.flex.flex-col.items-center.h-full.overflow-y-hidden *):not(
.flex.flex-col.justify-between.px-4.sm\\:px-8.pt-6 *):not(
.flex.flex-col.flex-auto.gap-4.w-full.max-w-2xl *):not(
.w-full.h-full.overflow-y-auto *):not(
.flex.flex-col.justify-between.p-4 *):not(
.flex.gap-3 *):not(
.flex.flex-col.flex-auto.gap-4.w-full.max-w-2xl *) {
width: ${imageSize} !important;
height: ${imageSize} !important;
border-radius: 50px;
}
`;
// Add styles for elements with specific classes and exclude images under .w-full.h-full.flex
css += `
.object-cover.object-center.bg-card.shrink-0.grow-0.h-full:not(
.h-dvh.fixed.z-50 *):not(
.text-center *):not(
.w-80 *):not(
.flex.flex-col.items-center.justify-center.p-6.pt-0.mt-32.max-w-lg.mx-auto *):not(
.flex.flex-col.items-center.h-full.overflow-y-hidden *):not(
.flex.flex-col.justify-between.px-4.sm\\:px-8.pt-6 *):not(
.flex.flex-col.items-center.justify-center.p-6.pt-0.mt-32.max-w-lg.mx-auto *):not(
.flex.flex-col.items-center.h-full.overflow-y-hidden *):not(
.flex.flex-col.justify-between.px-4.sm\\:px-8.pt-6 *):not(
.w-full.h-full.overflow-y-auto *):not(
.flex.flex-col.justify-between.p-4 *):not(
.flex.gap-3 *):not(
.flex.flex-col.flex-auto.gap-4.w-full.max-w-2xl *) {
width: ${imageSize} !important;
height: ${imageSize} !important;
border-radius: 50px;
}
`;
//Char pfp
css += `
/* Apply styles for screen widths greater than or equal to 768px (e.g., tablets and desktops) */
@media (min-width: 768px) {
.mt-0.hidden.md\\:flex.flex-col.gap-3.items-center:not(.h-dvh > div:nth-child(1) *):not(.text-center *):not(.w-80 *):not(.m-0.flex.items-start.gap-2.justify-start.mr-0.md\\:mr-6.flex-row-reverse *) {
padding-right: ${cpfpPaddingRight};
padding-top: ${cpfpPaddingTop};
}
}
/* Apply styles for screen widths less than 768px (e.g., mobile devices) */
@media (max-width: 767px) {
.mt-0.hidden.md\\:flex.flex-col.gap-3.items-center:not(.h-dvh > div:nth-child(1) *):not(.text-center *):not(.w-80 *):not(.m-0.flex.items-start.gap-2.justify-start.mr-0.md\\:mr-6.flex-row-reverse *) {
padding-right: 0px; /* Example padding values for smaller screens */
padding-top: 0px; /* Example padding values for smaller screens */
}
}
`;
if (removeUserImage === 'none') {
css +=`
@media (max-width: 767px) {
.mt-0.hidden.md\\:flex.flex-col.gap-3.items-center:not(.h-dvh > div:nth-child(1) *):not(.text-center *):not(.w-80 *):not(.m-0.flex.items-start.gap-2.justify-start.mr-0.md\\:mr-6.flex-row-reverse *) {
padding-top: 14px;
}
}
`;
}
//user pfp
css += `
/* Apply styles for screen widths greater than or equal to 768px (e.g., tablets and desktops) */
@media (min-width: 768px) {
.mt-0.hidden.md\\:flex.flex-col.gap-3.items-center:not(
.h-dvh > div:nth-child(1) *):not(
.text-center *):not(
.w-80 *):not(
.m-0.flex.flex-row.items-start.gap-2.justify-start.ml-0.md\\:ml-6 *):not(
.flex.flex-col.justify-end.pb-2.px-5 *) {
padding-left: ${upfpPaddingLeft};
}
}
/* Apply styles for screen widths less than 768px (e.g., mobile devices) */
@media (max-width: 767px) {
.mt-0.hidden.md\\:flex.flex-col.gap-3.items-center:not(
.h-dvh > div:nth-child(1) *):not(
.text-center *):not(
.w-80 *):not(
.m-0.flex.flex-row.items-start.gap-2.justify-start.ml-0.md\\:ml-6 *):not(
.flex.flex-col.justify-end.pb-2.px-5 *) {
width: ${upfpMobileWidth};
}
}
`;
//This changes user input bubble width, mainly for gpt
if (removeUserImage === 'none') {
css += `
@media (max-width: 767px) {
.mt-1.max-w-xl.rounded-2xl.px-3.min-h-12.flex.justify-center.py-3.bg-surface-elevation-3 {
max-width: 70%;
/* margin-right: ${uBubblerem}; */
}
}
`;
}
if (removeUserImage === 'none') {
css += `
@media (min-width: 767px) {
.mt-1.max-w-xl.rounded-2xl.px-3.min-h-12.flex.justify-center.py-3.bg-surface-elevation-3 {
max-width: 70%;
/* margin-right: ${uBubblerem}; */
}
}
`;
}
/*
css += `
@media (max-width: 767px) {
.mt-1.max-w-xl.rounded-2xl.px-3.min-h-12.flex.justify-center.py-3.bg-surface-elevation-2 {
width: ${uBubbleWidth};
margin-left: ${uBubblerem};
}
}
`;
*/
//remove user pfp
css += `
.object-cover.object-top:not(
.flex.flex-col.justify-end.pb-2.px-5 *):not(
.flex.flex-col.items-center.justify-center.p-6.pt-0.mt-32.max-w-lg.mx-auto *):not(
.flex.flex-col.items-center.h-full.overflow-y-hidden *):not(
.flex.flex-col.items-center.justify-center.p-6.pt-0.mt-32.max-w-lg.mx-auto *):not(
.flex.flex-col.items-center.h-full.overflow-y-hidden *):not(
.flex.flex-col.flex-auto.gap-4.w-full.max-w-2xl *) {
display: ${removeUserImage};
}
`;
css += `.mx-2.flex.flex-row.items-center.gap-2.font-light > .text-small {
display: ${removeTitle} !important;
}
`;
css += `
.flex.items-center > .rounded-2xl.text-sm.bg-secondary.px-2.font-light.h-fit,
.rounded-2xl.text-sm.bg-secondary.px-2.font-light.h-fit {
display: ${removeTitle} !important;
}
`;
css += `
.prose :where(p):not(:where([class~="not-prose"], [class~="not-prose"] *)) {
margin-top: ${proseMarginTop};
margin-bottom: ${proseMarginBottom};
}
`;
/* For the first element: only apply margin-bottom */
css += `
.prose :where(p):first-of-type:not(:where([class~="not-prose"], [class~="not-prose"] *)) {
margin-top: 0;
}
`;
/* For the last element: only apply margin-top */
css += `
.prose :where(p):last-of-type:not(:where([class~="not-prose"], [class~="not-prose"] *)) {
margin-bottom: 0;
}
`;
// Show pfps on mobile
css += `
@media (max-width: 767px) {
.mt-0.hidden.md\\:flex.flex-col.gap-3.items-center {
display: ${showMobilePfP};
}
}
`;
/*
css += `
.w-fit,
.swiper-slide.px-1.swiper-slide-visible.swiper-slide-fully-visible.swiper-slide-next *,
.swiper-slide.px-1.swiper-slide-visible.swiper-slide-fully-visible.swiper-slide-active *,
.swiper-slide.px-1.swiper-slide-visible.swiper-slide-fully-visible * {
background-color: ${userbubbleColor};
border-radius: 20px;
}
`;
*/
/* For elements in the middle: apply both margins (this is covered by the default rule above) */
/*css += `
.text-small { display: ${removeTitle} !important; }`;
*/
var head = document.getElementsByTagName("head")[0];
var style = document.createElement("style");
style.setAttribute("type", "text/css");
style.innerHTML = css;
head.appendChild(style);
// Function to update CSS variables
function updateCSSVariable(variableName, value) {
document.documentElement.style.setProperty(variableName, value);
}
if (currentTheme === 'dark') {
// Update the specific CSS variables
updateCSSVariable('--G800', AccentColor);
updateCSSVariable('--G850', InputColor);
updateCSSVariable('--G900', BodyColor);
updateCSSVariable('--G950', GuideColor);
updateCSSVariable('--G50', '#fafafa');
updateCSSVariable('--G100', '#f4f4f5');
updateCSSVariable('--G150', '#ececee');
}
else {
// Update CSS variables for light theme (or any other theme)
updateCSSVariable('--G850', '#202024');
updateCSSVariable('--G900', '#18181B');
updateCSSVariable('--G950', '#131316');
updateCSSVariable('--G50', InputColor);
updateCSSVariable('--G100', BodyColor);
updateCSSVariable('--G150', GuideColor);
}
})();
function changeColors() {
const pTags = document.getElementsByTagName("p");
const quotationMarksColor = localStorage.getItem('quotationmarks_color') || '#FFFFFF';
const customColor = localStorage.getItem('custom_color') || '#FFFFFF';
const wordlistCc = JSON.parse(localStorage.getItem('wordlist_cc')) || [];
const wordRegex = wordlistCc.length > 0 ? new RegExp('\\b(' + wordlistCc.map(word => word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|') + ')\\b', 'gi') : null;
Array.from(pTags).forEach((pTag) => {
if (
pTag.dataset.colorChanged === "true" ||
pTag.querySelector("code") ||
pTag.querySelector("img") ||
pTag.querySelector("textarea") ||
pTag.querySelector("button") ||
pTag.querySelector("div")
) {
return; // Skip iteration
}
let text = pTag.innerHTML;
// Save .katex elements' original HTML and replace with placeholders
const katexElems = Array.from(pTag.querySelectorAll(".katex"));
const katexReplacements = katexElems.map((elem, index) => {
const placeholder = `KATEX_PLACEHOLDER_${index}`;
text = text.replace(elem.outerHTML, placeholder);
return { html: elem.outerHTML, placeholder };
});
// Handle <a> tags by removing them temporarily and saving their HTML for later restoration
const aTags = Array.from(pTag.getElementsByTagName("a"));
const aTagsReplacements = aTags.map((aTag, j) => {
const placeholder = `REPLACE_ME_${j}`;
text = text.replace(aTag.outerHTML, placeholder);
return { tag: aTag, placeholder };
});
// Change text within quotation marks and for specific words based on the regex
text = text.replace(/(["“”«»].*?["“”«»])/g, `<span style="color: ${quotationMarksColor}">$1</span>`);
// text = text.replace(/(["“”«»][^"]*?,["“”«»])/g, `<span style="color: #E0DF7F">$1</span>`);
if (wordRegex) {
text = text.replace(wordRegex, `<span style="color: ${customColor}">$1</span>`);
}
// Restore .katex elements and <a> tags
[...katexReplacements, ...aTagsReplacements].forEach(({ html, placeholder, tag }) => {
text = text.replace(placeholder, html || tag.outerHTML);
});
// Update the innerHTML and mark the <p> tag to avoid re-processing
pTag.innerHTML = text;
pTag.dataset.colorChanged = "true";
});
console.log("Changed colors");
}
const divElements = document.querySelectorAll('div');
divElements.forEach(div => {
const observer = new MutationObserver(changeColors);
observer.observe(div, { subtree: true, childList: true });
});
function createButton(symbol, onClick) {
const colorpalettebutton = document.createElement('button');
colorpalettebutton.innerHTML = symbol;
colorpalettebutton.style.position = 'relative';
colorpalettebutton.style.background = 'none';
colorpalettebutton.style.border = 'none';
colorpalettebutton.style.fontSize = '18px';
colorpalettebutton.style.top = '-5px';
colorpalettebutton.style.cursor = 'pointer';
colorpalettebutton.addEventListener('click', onClick);
return colorpalettebutton;
}
// Function to create the color selector panel
function createColorPanel() {
const panel = document.createElement('div');
panel.id = 'colorPanel';
panel.style.position = 'fixed';
panel.style.top = '50%';
panel.style.left = '50%';
panel.style.transform = 'translate(-50%, -50%)';
const currentTheme = document.documentElement.classList.contains('dark') ? 'dark' : 'light';
if (currentTheme === 'dark') {
panel.style.backgroundColor = 'rgba(19, 19, 22, 0.85)';
} else {
panel.style.backgroundColor = 'rgba(214, 214, 221, 0.85)';
}
panel.style.border = 'none';
panel.style.borderRadius = '5px';
panel.style.padding = '20px';
// panel.style.border = '2px solid #000';
panel.style.zIndex = '9999';
const categories = ['italic', 'quotationmarks', 'plaintext', 'custom', 'charbubble', 'userbubble', 'guide', 'body', 'input', 'accent'];
const colorPickers = {};
const transparentCheckboxes = {}; // Store checkboxes separately
// Set a fixed width for the labels
const labelWidth = '150px';
categories.forEach(category => {
const colorPicker = document.createElement('input');
colorPicker.type = 'color';
// Retrieve stored color from local storage
const storedColor = localStorage.getItem(`${category}_color`);
if (storedColor && storedColor !== 'transparent') {
colorPicker.value = storedColor;
} else {
colorPicker.value = '#000000'; // Default color if not set
}
colorPickers[category] = colorPicker;
// Create a div to hold color picker
const colorDiv = document.createElement('div');
colorDiv.style.position = 'relative';
colorDiv.style.width = '20px';
colorDiv.style.height = '20px';
colorDiv.style.marginLeft = '10px';
colorDiv.style.top = '0px';
colorDiv.style.backgroundColor = storedColor === 'transparent' ? 'transparent' : colorPicker.value;
colorDiv.style.display = 'inline-block';
colorDiv.style.marginRight = '10px';
colorDiv.style.cursor = 'pointer';
colorDiv.style.border = '1px solid black';
// Event listener to open color picker when the color square is clicked
colorDiv.addEventListener('click', function () {
if (!transparentCheckbox.checked) {
colorPicker.click();
}
});
// Event listener to update the color div when the color changes
colorPicker.addEventListener('input', function () {
if (!transparentCheckbox.checked) {
colorDiv.style.backgroundColor = colorPicker.value;
localStorage.setItem(`${category}_color`, colorPicker.value);
}
});
// Checkbox for transparency
const transparentCheckbox = document.createElement('input');
transparentCheckbox.type = 'checkbox';
transparentCheckbox.style.marginLeft = '10px';
transparentCheckbox.checked = storedColor === 'transparent';
transparentCheckbox.title = 'Toggle transparency'; // Add tooltip text
transparentCheckbox.style.marginRight = '5px'; // Add spacing between the checkbox and the reset button
// Store the checkbox reference for later use
transparentCheckboxes[category] = transparentCheckbox;
transparentCheckbox.addEventListener('change', function () {
if (transparentCheckbox.checked) {
// Set color to transparent and lock the color picker behavior
colorDiv.style.backgroundColor = 'transparent';
localStorage.setItem(`${category}_color`, 'transparent');
} else {
// Revert to the current value of the color picker
colorDiv.style.backgroundColor = colorPicker.value;
localStorage.setItem(`${category}_color`, colorPicker.value);
}
});
const label = document.createElement('label');
label.style.width = labelWidth; // Set fixed width for the label
label.style.margin = '0'; // Reduce label margin
label.style.padding = '0'; // Reduce label padding
label.appendChild(document.createTextNode(`${category}: `));
// Reset button for each color picker
const resetButton = createButton('↺', function () {
const defaultColor = getDefaultColor(category);
colorPicker.value = defaultColor;
colorDiv.style.backgroundColor = defaultColor;
transparentCheckbox.checked = false;
localStorage.setItem(`${category}_color`, defaultColor);
});
resetButton.style.position = 'relative';
resetButton.style.top = '-2px';
resetButton.style.margin = '0'; // Reduce button margin
resetButton.style.padding = '0'; // Reduce button padding
// Create a div to hold label, color picker, and reset button
const containerDiv = document.createElement('div');
containerDiv.style.margin = '2px 0'; // Reduce vertical margin between rows
containerDiv.style.padding = '0'; // Reduce padding within each row
containerDiv.style.display = 'flex'; // Flex display for better control over spacing
containerDiv.style.alignItems = 'center'; // Center align items vertically
containerDiv.appendChild(label);
containerDiv.appendChild(colorDiv);
containerDiv.appendChild(transparentCheckbox);
containerDiv.appendChild(resetButton);
panel.appendChild(containerDiv);
});
function createButton(text, onClick) {
const button = document.createElement('button');
button.textContent = text;
button.addEventListener('click', onClick);
return button;
}
// Create a new button for custom font selection
/*const fontSelectorButton = document.createElement('button');
fontSelectorButton.style.marginBottom = '20px';
fontSelectorButton.style.borderRadius = '3px';
fontSelectorButton.style.width = '120px';
fontSelectorButton.style.marginLeft = '0px';
fontSelectorButton.style.height = '30px';
fontSelectorButton.style.border = 'none';
fontSelectorButton.style.textAlign = 'left';
fontSelectorButton.style.paddingLeft = '-10px';
fontSelectorButton.innerText = 'Select Font';
*/
const fontSelectorButton = document.createElement('label');
fontSelectorButton.innerText = 'Font: ';
fontSelectorButton.style.marginRight = '5px';
// Create a dropdown for font selection
const fontDropdown = document.createElement('select');
fontDropdown.style.marginLeft = '5px';
fontDropdown.style.marginBottom = '20px';
fontDropdown.style.borderRadius = '3px';
fontDropdown.style.paddingLeft = '-20px';
fontDropdown.style.height = '30px';
// List of font options
const fonts = [
{ name: 'Onest', value: 'Onest' },
{ name: 'Inter', value: 'Inter' },
{ name: 'Noto Sans', value: 'Noto Sans' },
{ name: 'Arial', value: 'Arial' },
{ name: 'Times New Roman', value: 'Times New Roman' },
{ name: 'Verdana', value: 'Verdana' },
{ name: 'Roboto', value: 'Roboto' }
];
// Add fonts to the dropdown
fonts.forEach(font => {
const option = document.createElement('option');
option.value = font.value;
option.text = font.name;
fontDropdown.appendChild(option);
});
// Load saved font from local storage
const savedFont = localStorage.getItem('selected_font');
if (savedFont) {
fontDropdown.value = savedFont;
}
// Create a dropdown for font size selection
const fontSizeDropdown = document.createElement('select');
fontSizeDropdown.style.marginLeft = '5px';
fontSizeDropdown.style.marginBottom = '20px';
fontSizeDropdown.style.borderRadius = '3px';
fontSizeDropdown.style.height = '30px';
// List of font size options
const fontSizes = [
{ name: '12px', value: '12px' },
{ name: '14px', value: '14px' },
{ name: '15px', value: '15px' },
{ name: '16px', value: '16px' }, // Default font size
{ name: '17px', value: '17px' },
{ name: '18px', value: '18px' },
{ name: '20px', value: '20px' },
{ name: '24px', value: '24px' },
{ name: '28px', value: '28px' }
];
// Add font sizes to the dropdown
fontSizes.forEach(size => {
const option = document.createElement('option');
option.value = size.value;
option.text = size.name;
fontSizeDropdown.appendChild(option);
});
// Load saved font size from local storage
const savedFontSize = localStorage.getItem('font_size') || '16px';
fontSizeDropdown.value = savedFontSize;
// Add event listener to save the selected font size to local storage and apply it
fontSizeDropdown.addEventListener('change', function () {
const selectedFontSize = fontSizeDropdown.value;
localStorage.setItem('font_size', selectedFontSize);
// Apply the selected font size to the document
document.documentElement.style.setProperty('--font-size', selectedFontSize);
// Update CSS dynamically
const css = `
p[node='[object Object]'] {
font-size: ${selectedFontSize} !important;
}
p, textarea, button, div.text-sm {
/* Other styles here, without font-size modification */
}
`;
// Apply the new style
const styleSheet = document.createElement('style');
styleSheet.type = 'text/css';
styleSheet.innerText = css;
document.head.appendChild(styleSheet);
alert('Font size changed to ' + selectedFontSize);
});
// =========================== IMAGES
// Create a label for the dimension input
const dimensionLabel = document.createElement('label');
dimensionLabel.innerText = 'Image Size: ';
dimensionLabel.style.marginRight = '5px'; // Optional styling to space the label and input
// Create an input field for dimension selection
const dimensionInput = document.createElement('input');
dimensionInput.type = 'number';
dimensionInput.style.marginLeft = '5px';
dimensionInput.style.marginBottom = '20px';
dimensionInput.style.borderRadius = '3px';
dimensionInput.style.height = '30px';
dimensionInput.style.width = '60px'; // Optional styling for width
dimensionInput.min = 1; // Optional: Set a minimum value
// Load saved dimension from local storage
const savedImageSize = localStorage.getItem('ImageSize') || '24px'; // Default value set to '24px'
dimensionInput.value = savedImageSize.replace('px', ''); // Remove 'px' for display in the input
// Add event listener to save the entered dimension to local storage with 'px' suffix
dimensionInput.addEventListener('change', function () {
const selectedSize = dimensionInput.value + 'px';
localStorage.setItem('ImageSize', selectedSize);
// alert('Image size saved as ' + selectedSize);
});
// Append the new dropdown to your existing setup
// =========================== END IMAGES
// Create a checkbox for font weight selection
const fontWeightCheckbox = document.createElement('input');
fontWeightCheckbox.type = 'checkbox';
fontWeightCheckbox.style.marginLeft = '5px';
fontWeightCheckbox.style.marginBottom = '20px';
fontWeightCheckbox.style.width = '20px';
fontWeightCheckbox.style.height = '20px';
// Label for the font weight checkbox
const fontWeightLabel = document.createElement('label');
fontWeightLabel.textContent = 'Bold Font';
fontWeightLabel.style.marginLeft = '5px';
fontWeightLabel.style.userSelect = 'none';
// Create a checkbox for bold titles
const boldTitlesCheckbox = document.createElement('input');
boldTitlesCheckbox.type = 'checkbox';
boldTitlesCheckbox.style.marginLeft = '10px';
boldTitlesCheckbox.style.marginBottom = '20px';
boldTitlesCheckbox.style.width = '20px';
boldTitlesCheckbox.style.height = '20px';
// Label for the bold titles checkbox
const boldTitlesLabel = document.createElement('label');
boldTitlesLabel.textContent = 'Bold Titles';
boldTitlesLabel.style.marginLeft = '5px';
boldTitlesLabel.style.userSelect = 'none';
// Create a checkbox for PfP display
const pfPCheckbox = document.createElement('input');
pfPCheckbox.type = 'checkbox';
pfPCheckbox.style.marginLeft = '10px';
pfPCheckbox.style.marginBottom = '20px';
pfPCheckbox.style.width = '20px';
pfPCheckbox.style.height = '20px';
// Label for the PfP checkbox
const pfPLabel = document.createElement('label');
pfPLabel.textContent = 'Mobile PfP';
pfPLabel.style.marginLeft = '5px';
pfPLabel.style.userSelect = 'none';
// Load saved settings from local storage
const savedFontWeight = localStorage.getItem('fontWeight_color') || '300';
const savedBoldTitles = localStorage.getItem('boldTitles') || 'normal';
const savedPfPDisplay = localStorage.getItem('showMobilePfP') || 'none';
fontWeightCheckbox.checked = savedFontWeight === '400';
boldTitlesCheckbox.checked = savedBoldTitles === 'bold';
pfPCheckbox.checked = savedPfPDisplay === 'block';
// Function to apply the selected font weight and display settings
function applyFontWeight(weight, titlesWeight) {
document.documentElement.style.setProperty('--font-weight', weight);
// Update CSS dynamically
let css = `
p[node='[object Object]'], p, textarea, button, div.text-sm {
font-weight: ${weight} !important;
}
`;
// Add CSS for bold titles
css += `
.mx-2.flex.flex-row.items-center.gap-2.font-light .text-small:not(.text-muted-foreground) {
font-weight: ${titlesWeight} !important;
}
`;
// Add CSS for PfP display
css += `
@media (max-width: 767px) {
.mt-0.hidden.md\\:flex.flex-col.gap-3.items-center {
display: ${savedPfPDisplay};
}
}
`;
// Remove existing style element if any
let existingStyle = document.getElementById('dynamicFontWeightStyle');
if (existingStyle) existingStyle.remove();
// Apply the new style
const styleSheet = document.createElement('style');
styleSheet.type = 'text/css';
styleSheet.id = 'dynamicFontWeightStyle';
styleSheet.innerText = css;
document.head.appendChild(styleSheet);
}
// Apply initial settings based on saved preferences
applyFontWeight(savedFontWeight, savedBoldTitles);
// Event listener for font weight checkbox
fontWeightCheckbox.addEventListener('change', () => {
const weight = fontWeightCheckbox.checked ? '400' : '300';
localStorage.setItem('fontWeight_color', weight);
applyFontWeight(weight, boldTitlesCheckbox.checked ? 'bold' : 'normal');
});
// Event listener for bold titles checkbox
boldTitlesCheckbox.addEventListener('change', () => {
const titlesWeight = boldTitlesCheckbox.checked ? 'bold' : 'normal';
localStorage.setItem('boldTitles', titlesWeight);
applyFontWeight(fontWeightCheckbox.checked ? '400' : '300', titlesWeight);
});
// Event listener for PfP checkbox
pfPCheckbox.addEventListener('change', () => {
const displayValue = pfPCheckbox.checked ? 'block' : 'none';
localStorage.setItem('showMobilePfP', displayValue);
applyFontWeight(fontWeightCheckbox.checked ? '400' : '300', boldTitlesCheckbox.checked ? 'bold' : 'normal');
});
// Function to make text-small elements bold under a specific parent, except text-muted-foreground
function makeTextSmallBold(weight) {
const parents = document.querySelectorAll('.mx-2.flex.flex-row.items-center.gap-2.font-light');
parents.forEach(parent => {
const textSmallElements = parent.querySelectorAll('.text-small:not(.text-muted-foreground)');
textSmallElements.forEach(element => {
element.style.fontWeight = weight;
});
});
}
// Apply saved settings on page load
applyFontWeight(savedFontWeight);
makeTextSmallBold(savedBoldTitles);
// Event listener for font weight checkbox
fontWeightCheckbox.addEventListener('change', function () {
const selectedFontWeight = fontWeightCheckbox.checked ? '400' : '300';
localStorage.setItem('fontWeight_color', selectedFontWeight);
applyFontWeight(selectedFontWeight);
});
// Event listener for bold titles checkbox
boldTitlesCheckbox.addEventListener('change', function () {
const boldTitleWeight = boldTitlesCheckbox.checked ? 'bold' : 'normal';
localStorage.setItem('boldTitles', boldTitleWeight);
makeTextSmallBold(boldTitleWeight);
});
// ============== END FONT WEIGHT
// Add event listener to save the selected font to local storage and apply it
fontDropdown.addEventListener('change', function () {
const selectedFont = fontDropdown.value;
localStorage.setItem('selected_font', selectedFont);
// Apply the selected font to the document
document.documentElement.style.setProperty('--font-family', selectedFont);
// Update CSS dynamically
const css = `
p[node='[object Object]'], p, textarea, button, div.text-sm {
font-family: '${selectedFont}', sans-serif !important;
}
`;
// Apply the new style
const styleSheet = document.createElement('style');
styleSheet.type = 'text/css';
styleSheet.innerText = css;
document.head.appendChild(styleSheet);
// alert('Font changed to ' + fontDropdown.options[fontDropdown.selectedIndex].text);
});
// Append the button and dropdowns to the panel
panel.appendChild(fontSelectorButton);
panel.appendChild(fontDropdown);
panel.appendChild(fontSizeDropdown);
// Append the checkbox and label to the document
panel.appendChild(document.createElement('br'));
// Append the label and dropdown to the document
panel.appendChild(dimensionLabel);
panel.appendChild(dimensionInput);
panel.appendChild(pfPCheckbox);
panel.appendChild(pfPLabel);
panel.appendChild(document.createElement('br'));
// Append the checkboxes and labels to the document
panel.appendChild(fontWeightCheckbox);
panel.appendChild(fontWeightLabel);
panel.appendChild(boldTitlesCheckbox);
panel.appendChild(boldTitlesLabel);
// Custom word list input
const wordListInput = document.createElement('input');
wordListInput.type = 'text';
wordListInput.placeholder = 'Separate words with commas';
wordListInput.style.width = '250px';
wordListInput.style.height = '35px';
wordListInput.style.borderRadius = '3px';
wordListInput.style.marginBottom = '10px';
panel.appendChild(wordListInput);
panel.appendChild(document.createElement('br'));
const wordListContainer = document.createElement('div');
wordListContainer.style.display = 'flex';
wordListContainer.style.flexWrap = 'wrap';
wordListContainer.style.maxWidth = '300px'; // Set a fixed maximum width for the container
// Display custom word list buttons
const wordListArray = JSON.parse(localStorage.getItem('wordlist_cc')) || [];
const wordListButtons = [];
function createWordButton(word) {
const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
const removeSymbol = isMobile ? '×' : '🞮';
const wordButton = createButton(`${word} ${removeSymbol}`, function() {
// Remove the word from the list and update the panel
const index = wordListArray.indexOf(word);
if (index !== -1) {
wordListArray.splice(index, 1);
updateWordListButtons();
}
});
// Word Buttons
wordButton.style.borderRadius = '3px';
wordButton.style.border = 'none';
if (currentTheme === 'dark') {
wordButton.style.backgroundColor = '#26272B';
} else {
wordButton.style.backgroundColor = '#E4E4E7';
}
wordButton.style.marginBottom = '5px';
wordButton.style.marginRight = '5px';
wordButton.style.fontSize = '16px';
wordButton.classList.add('word-button');
return wordButton;
}
function updateWordListButtons() {
wordListContainer.innerHTML = ''; // Clear the container
wordListArray.forEach(word => {
const wordButton = createWordButton(word);
wordListContainer.appendChild(wordButton);
});
}
updateWordListButtons();
// Add Words button
const addWordsButton = document.createElement('button');
addWordsButton.textContent = 'Add';
addWordsButton.style.marginTop = '-8px';
addWordsButton.style.marginLeft = '5px';
addWordsButton.style.borderRadius = '3px';
addWordsButton.style.border = 'none';
if (currentTheme === 'dark') {
addWordsButton.style.backgroundColor = '#26272B';
} else {
addWordsButton.style.backgroundColor = '#E4E4E7';
}
addWordsButton.addEventListener('click', function() {
// Get the input value, split into words, and add to wordListArray
const wordListValue = wordListInput.value;
const newWords = wordListValue.split(',').map(word => word.trim().toLowerCase()).filter(word => word !== ''); // Convert to lowercase and remove empty entries
wordListArray.push(...newWords);
// Update the word list buttons in the panel
updateWordListButtons();
});
// Create a div to group the input and button on the same line
const inputButtonContainer = document.createElement('div');
inputButtonContainer.style.display = 'flex';
inputButtonContainer.style.alignItems = 'center';
inputButtonContainer.appendChild(wordListInput);
inputButtonContainer.appendChild(addWordsButton);
// Append the container to the panel
panel.appendChild(inputButtonContainer);
panel.appendChild(wordListContainer);
// Create initial word list buttons
updateWordListButtons();
// OK button
const okButton = document.createElement('button');
okButton.textContent = 'Confirm';
okButton.style.marginTop = '-20px';
okButton.style.width = '75px';
okButton.style.height = '35px';
okButton.style.marginRight = '5px';
okButton.style.borderRadius = '3px';
okButton.style.border = 'none';
if (currentTheme === 'dark') {
okButton.style.backgroundColor = '#26272B';
} else {
okButton.style.backgroundColor = '#D9D9DF';
}
okButton.style.position = 'relative';
okButton.style.left = '24%';
okButton.addEventListener('click', function () {
// Save selected colors to local storage
categories.forEach(category => {
const colorPicker = colorPickers[category];
const transparentCheckbox = transparentCheckboxes[category]; // Access the checkbox from stored references
// Determine the value to save: color picker value or 'transparent'
const newValue = transparentCheckbox.checked ? 'transparent' : colorPicker.value;
const oldValue = localStorage.getItem(`${category}_color`);
if (oldValue !== newValue) {
localStorage.setItem(`${category}_color`, newValue);
// If 'plaintext' color is changed, auto-reload the page
if (category === 'plaintext' || category === 'guide' || category === 'body' || category === 'input') {
window.location.reload();
}
}
});
// Save custom word list to local storage
const wordListValue = wordListInput.value;
const newWords = wordListValue.split(',').map(word => word.trim().toLowerCase()).filter(word => word !== ''); // Convert to lowercase and remove empty entries
const uniqueNewWords = Array.from(new Set(newWords)); // Remove duplicates
// Check for existing words and add only new ones
uniqueNewWords.forEach(newWord => {
if (!wordListArray.includes(newWord)) {
wordListArray.push(newWord);
}
});
localStorage.setItem('wordlist_cc', JSON.stringify(wordListArray));
updateWordListButtons();
// Close the panel
panel.remove();
});
// Cancel button
const cancelButton = document.createElement('button');
cancelButton.textContent = 'Cancel';
cancelButton.style.marginTop = '-20px';
cancelButton.style.borderRadius = '3px';
cancelButton.style.width = '75px';
cancelButton.style.marginLeft = '5px';
cancelButton.style.height = '35px';
cancelButton.style.border = 'none';
if (currentTheme === 'dark') {
cancelButton.style.backgroundColor = '#5E5E5E';
} else {
cancelButton.style.backgroundColor = '#CBD2D4';
}
cancelButton.style.position = 'relative';
cancelButton.style.left = '25%';
cancelButton.addEventListener('click', function() {
// Close the panel without saving
panel.remove();
});
// ==== PRESETS ========
// Create button
const preset1 = document.createElement('button');
preset1.style.marginBottom = '20px';
preset1.style.borderRadius = '3px';
preset1.style.width = '30px';
preset1.style.marginLeft = '5px';
preset1.style.height = '30px';
preset1.style.border = 'none';
// Set image as button background
preset1.style.backgroundImage = "url('https://i.imgur.com/91Z4AwP.png')";
preset1.style.backgroundSize = 'contain';
preset1.style.backgroundRepeat = 'no-repeat';
preset1.style.backgroundPosition = 'center';
// Event listener for button click
preset1.addEventListener('click', function () {
// Show confirmation dialog
const userConfirmed = confirm('All colors will be replaced with Discord pallet. Proceed?');
if (userConfirmed) {
function updateCSSVariable(variableName, value) {
document.documentElement.style.setProperty(variableName, value);
}
updateCSSVariable('--G850', '#383A40'); //input
updateCSSVariable('--G900', '#313338'); //body
updateCSSVariable('--G950', '#232428'); //guide
// Hardcode the selected colors to local storage
const hardcodedColors = {
'guide': '#232428',
'input': '#383A40',
'body': '#313338',
'charbubble': '#383A40',
'userbubble': '#41434A',
'accent': '#3E4047'
};
localStorage.setItem('ImageSize', '42px');
localStorage.setItem('cpfpPaddingRight', '12px');
localStorage.setItem('upfpPaddingLeft', '8px');
localStorage.setItem('cpfpPaddingTop', '0px');
localStorage.removeItem('charbubbleMarginTop_color');
localStorage.removeItem('charbubbleMarginLeft_color');
localStorage.setItem('removeTitles', 'block');
localStorage.setItem('removeUserImage', 'block');
localStorage.setItem('proseMarginTop', '0.8em');
localStorage.setItem('proseMarginBottom', '0.8em');
// Save hardcoded values to local storage
Object.keys(hardcodedColors).forEach(category => {
const newValue = hardcodedColors[category];
localStorage.setItem(`${category}_color`, newValue);
});
window.location.reload();
}
});
const preset2 = document.createElement('button');
preset2.style.marginBottom = '20px';
preset2.style.borderRadius = '3px';
preset2.style.width = '30px';
preset2.style.marginLeft = '5px';
preset2.style.height = '30px';
preset2.style.border = 'none';
// Set image as button background
preset2.style.backgroundImage = "url('https://i.imgur.com/PSkZ4Yq.png')";
preset2.style.backgroundSize = 'contain';
preset2.style.backgroundRepeat = 'no-repeat';
preset2.style.backgroundPosition = 'center';
// Event listener for button click
preset2.addEventListener('click', function () {
// Show confirmation dialog
const userConfirmed = confirm('All colors will be replaced with ChatGPT pallet. Proceed?');
if (userConfirmed) {
function updateCSSVariable(variableName, value) {
document.documentElement.style.setProperty(variableName, value);
}
// Update CSS variables with the new values
updateCSSVariable('--G850', '#2F2F2F'); // input
updateCSSVariable('--G900', '#212121'); // body
updateCSSVariable('--G950', '#171717'); // guide
// Hardcode the selected colors to local storage
const hardcodedColors = {
guide: '#171717',
input: '#2F2F2F',
body: '#212121',
charbubble: 'transparent',
userbubble: '#2F2F2F',
accent: '#323232',
charbubbleMarginTop: '-10px',
charbubbleMarginLeft: '-5px',
fontWeight: '400'
};
// Save hardcoded values to local storage
Object.keys(hardcodedColors).forEach(category => {
const newValue = hardcodedColors[category];
localStorage.setItem(`${category}_color`, newValue);
});
// Set the boldTitles variable in local storage to 'bold'
// localStorage.setItem('boldTitles', 'bold');
localStorage.setItem('removeTitles', 'none');
localStorage.setItem('removeUserImage', 'none');
localStorage.setItem('cpfpPaddingRight', '16px');
localStorage.setItem('cpfpPaddingTop', '14px');
localStorage.setItem('upfpPaddingLeft', '30px');
localStorage.setItem('proseMarginTop', '0.9em');
localStorage.setItem('proseMarginBottom', '0.9em');
localStorage.setItem('ImageSize', '34px');
// Reload the page to apply changes
window.location.reload();
}
});
const preset3 = document.createElement('button');
preset3.style.marginBottom = '20px';
preset3.style.borderRadius = '3px';
preset3.style.width = '30px';
preset3.style.marginLeft = '5px';
preset3.style.height = '30px';
preset3.style.border = 'none';
// Set image as button background
preset3.style.backgroundImage = "url('https://i.imgur.com/wWpHDIj.png')";
preset3.style.backgroundSize = 'contain';
preset3.style.backgroundRepeat = 'no-repeat';
preset3.style.backgroundPosition = 'center';
// localStorage.setItem('charbubbleMarginTop_color', '-20px');
// Event listener for button click
preset3.addEventListener('click', function () {
// Show confirmation dialog
const userConfirmed = confirm('All colors will be replaced with old.character.ai pallet. Proceed?');
if (userConfirmed) {
function updateCSSVariable(variableName, value) {
document.documentElement.style.setProperty(variableName, value);
}
updateCSSVariable('--G850', '#2B2C2D'); //input
updateCSSVariable('--G900', '#242525'); //body
updateCSSVariable('--G950', '#2B2C2D'); //guide
// Hardcode the selected colors to local storage
const hardcodedColors = {
guide: '#2B2C2D',
input: '#2B2C2D',
body: '#242525',
charbubble: 'transparent',
userbubble: '#2B2C2D',
accent: '#363838',
charbubbleMarginTop: '-10px',
charbubbleMarginLeft: '0px'
};
localStorage.removeItem('charbubbleMarginTop_color');
localStorage.removeItem('charbubbleMarginLeft_color');
localStorage.setItem('removeTitles', 'block');
localStorage.setItem('removeUserImage', 'block');
localStorage.setItem('cpfpPaddingRight', '5px');
localStorage.setItem('cpfpPaddingTop', '0px');
localStorage.setItem('upfpPaddingLeft', '5px');
localStorage.setItem('ImageSize', '45px');
localStorage.setItem('proseMarginTop', '1.0em');
localStorage.setItem('proseMarginBottom', '1.0em');
// Save hardcoded values to local storage
Object.keys(hardcodedColors).forEach(category => {
const newValue = hardcodedColors[category];
localStorage.setItem(`${category}_color`, newValue);
});
window.location.reload();
}
});
// Create 'resetall' button
const resetAll = document.createElement('button');
resetAll.style.marginBottom = '20px';
resetAll.style.borderRadius = '3px';
resetAll.style.width = '80px'; // Adjust width for text
resetAll.style.marginLeft = '5px';
resetAll.style.height = '30px';
resetAll.style.border = 'none';
resetAll.textContent = 'Reset All'; // Button text
// Add event listener to 'resetall' button
resetAll.addEventListener('click', function () {
// Reset all colors to their default values
function resetToDefault() {
const categories = [
'italic', 'quotationmarks', 'plaintext', 'custom',
'charbubble', 'userbubble', 'guide', 'input',
'body', 'accent'
];
// Set default colors based on the current theme
categories.forEach(category => {
const defaultColor = getDefaultColor(category);
updateCSSVariable(`--${category}`, defaultColor);
localStorage.setItem(`${category}_color`, defaultColor);
});
// Delete additional values from local storage
localStorage.removeItem('charbubbleMarginTop_color');
localStorage.removeItem('charbubbleMarginLeft_color');
localStorage.setItem('removeTitles', 'block');
localStorage.setItem('removeUserImage', 'block');
localStorage.setItem('cpfpPaddingRight', '0px');
localStorage.setItem('cpfpPaddingTop', '0px');
localStorage.setItem('upfpPaddingLeft', '0px');
localStorage.setItem('ImageSize', '24px');
localStorage.setItem('proseMarginTop', '1.25em');
localStorage.setItem('proseMarginBottom', '1.25em');
// Reload the page to apply changes
window.location.reload();
}
// Show confirmation dialog
const resetConfirmed = confirm('This will reset all settings to default. Proceed?');
if (resetConfirmed) {
resetToDefault();
}
});
// Append 'resetall' button to the document
// Function to update CSS variable
function updateCSSVariable(variableName, value) {
document.documentElement.style.setProperty(variableName, value);
}
panel.appendChild(document.createElement('br'));
panel.appendChild(preset1);
panel.appendChild(preset2);
panel.appendChild(preset3);
panel.appendChild(resetAll);
panel.appendChild(document.createElement('br'));
panel.appendChild(okButton);
panel.appendChild(cancelButton);
document.body.appendChild(panel);
}
// Function to get the default color for a category
function getDefaultColor(category) {
const currentTheme = document.documentElement.classList.contains('dark') ? 'dark' : 'light';
if (currentTheme === 'dark') {
const defaultColors = {
'italic': '#FFFFFF',
'quotationmarks': '#FFFFFF',
'plaintext': '#FFFFFF',
'custom': '#FFFFFF',
'charbubble': '#26272B',
'userbubble': '#303136',
'guide': '#131316',
'input': '#202024',
'body': '#18181B',
'accent': '#26272B'
};
return defaultColors[category];
}
else {
const defaultColors = {
'italic': '#000000',
'quotationmarks': '#000000',
'plaintext': '#000000',
'custom': '#000000',
'charbubble': '#E4E4E7',
'userbubble': '#D9D9DF',
'guide': '#FAFAFA',
'input': '#F4F4F5',
'body': '#ECECEE',
'accent': '#26272B'
};
return defaultColors[category];
}
}
// Retrieve saved position from local storage
var storedTop = localStorage.getItem('buttonTop') || '50%';
var storedLeft = localStorage.getItem('buttonLeft') || '50%';
const mainButton = createButton('', function() {
const colorPanelExists = document.getElementById('colorPanel');
if (!colorPanelExists) {
createColorPanel();
}
});
// Create a new button element for the main function
//var mainButton = document.createElement('button');
mainButton.id = 'mainButton';
mainButton.style.position = 'fixed';
mainButton.style.zIndex = '9999';
mainButton.style.top = '5px';
mainButton.style.right = '120px';
//mainButton.style.transform = 'translateX(10%)';
mainButton.style.borderRadius = '50%';
mainButton.style.width = "35px";
mainButton.style.height = "35px";
mainButton.style.backgroundImage = "url('https://i.imgur.com/yBgJ3za.png')";
mainButton.style.backgroundSize = "cover";
// Function to insert the mainButton into the body of the document
function insertMainButton() {
document.body.appendChild(mainButton);
}
// Call the function to insert the mainButton into the body
insertMainButton();
console.info('c.ai Text Color Button appended to the top center.');