Kirka Keybind Overlay

Customizable keybind overlay for Kirka.io

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Kirka Keybind Overlay
// @namespace    http://tampermonkey.net/
// @version      1.0 
// @license      Life.css - https://github.com/LifeCss
// @description  Customizable keybind overlay for Kirka.io
// @author       You
// @match        https://kirka.io/*
// @match        https://snipers.io/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=kirka.io
// @grant        none
// ==/UserScript==
(function() {
    'use strict';

    window.addEventListener('load', () => {
        console.log('Script loaded successfully.'); // Debugging

        // Default settings
        const defaultSettings = {
            keybindColors: {
                W: 'rgba(0, 0, 0, 0.3)',
                A: 'rgba(0, 0, 0, 0.3)',
                S: 'rgba(0, 0, 0, 0.3)',
                D: 'rgba(0, 0, 0, 0.3)',
                Shift: 'rgba(0, 0, 0, 0.3)',
                LeftMouse: 'rgba(0, 0, 0, 0.3)',
                RightMouse: 'rgba(0, 0, 0, 0.3)',
            },
            keybindButtonSize: '40',
            keybindButtonOpacity: '1',
            keybindPressedColor: 'rgba(0, 255, 0, 0.7)',
            keybindFontSize: '14',
            keybindBorderThickness: '2',
            keybindDarkMode: 'false',
            keybindButtonShape: 'circle',
            keybindTheme: 'light',
            keybindMenuBackground: 'transparent',
            keybindMenuBlur: 'false',
            keybindMenuOpaque: 'false',
            keybindButtonsVisible: 'true',
            keybindButtonOutline: 'true',
            keybindButtonPositionX: '20', // Horizontal position
            keybindButtonPositionY: '50', // Vertical position
            customCSS: '', // Added custom CSS to default settings
            sliderColor: '#007BFF', // Default slider color
        };

        // Load saved settings or use defaults
        const savedColors = JSON.parse(localStorage.getItem('keybindColors')) || defaultSettings.keybindColors;
        const savedButtonSize = localStorage.getItem('keybindButtonSize') || defaultSettings.keybindButtonSize;
        const savedButtonOpacity = localStorage.getItem('keybindButtonOpacity') || defaultSettings.keybindButtonOpacity;
        const savedPressedColor = localStorage.getItem('keybindPressedColor') || defaultSettings.keybindPressedColor;
        const savedFontSize = localStorage.getItem('keybindFontSize') || defaultSettings.keybindFontSize;
        const savedBorderThickness = localStorage.getItem('keybindBorderThickness') || defaultSettings.keybindBorderThickness;
        const savedDarkMode = localStorage.getItem('keybindDarkMode') || defaultSettings.keybindDarkMode;
        const savedButtonShape = localStorage.getItem('keybindButtonShape') || defaultSettings.keybindButtonShape;
        const savedTheme = localStorage.getItem('keybindTheme') || defaultSettings.keybindTheme;
        const savedMenuBackground = localStorage.getItem('keybindMenuBackground') || defaultSettings.keybindMenuBackground;
        const savedMenuBlur = localStorage.getItem('keybindMenuBlur') || defaultSettings.keybindMenuBlur;
        const savedMenuOpaque = localStorage.getItem('keybindMenuOpaque') || defaultSettings.keybindMenuOpaque;
        const savedButtonsVisible = localStorage.getItem('keybindButtonsVisible') || defaultSettings.keybindButtonsVisible;
        const savedButtonOutline = localStorage.getItem('keybindButtonOutline') || defaultSettings.keybindButtonOutline;
        const savedButtonPositionX = localStorage.getItem('keybindButtonPositionX') || defaultSettings.keybindButtonPositionX;
        const savedButtonPositionY = localStorage.getItem('keybindButtonPositionY') || defaultSettings.keybindButtonPositionY;
        const savedCustomCSS = localStorage.getItem('customCSS') || defaultSettings.customCSS; // Load saved CSS
        const savedSliderColor = localStorage.getItem('sliderColor') || defaultSettings.sliderColor; // Load saved slider color

        const keys = [
            { id: 'W', label: 'W', keyCode: 'KeyW' },
            { id: 'A', label: 'A', keyCode: 'KeyA' },
            { id: 'S', label: 'S', keyCode: 'KeyS' },
            { id: 'D', label: 'D', keyCode: 'KeyD' },
            { id: 'Shift', label: 'Shift', keyCode: 'ShiftLeft' },
            { id: 'LeftMouse', label: 'LMB', keyCode: 'Mouse0' },
            { id: 'RightMouse', label: 'RMB', keyCode: 'Mouse2' },
        ];

        let pressedColor = savedPressedColor;
        let fontSize = parseInt(savedFontSize, 10);
        let borderThickness = parseInt(savedBorderThickness, 10);
        let buttonSize = parseInt(savedButtonSize, 10);
        let buttonOpacity = parseFloat(savedButtonOpacity);
        let buttonShape = savedButtonShape;
        let isDarkMode = savedDarkMode === 'true';
        let currentTheme = savedTheme;
        let menuBackground = savedMenuBackground;
        let menuBlur = savedMenuBlur === 'true';
        let menuOpaque = savedMenuOpaque === 'true';
        let buttonsVisible = savedButtonsVisible === 'true';
        let buttonOutline = savedButtonOutline === 'true';
        let buttonPositionX = parseInt(savedButtonPositionX, 10); // Horizontal position
        let buttonPositionY = parseInt(savedButtonPositionY, 10); // Vertical position
        let customCSS = savedCustomCSS; // Load saved CSS
        let sliderColor = savedSliderColor; // Load saved slider color

        let buttonColors = { ...savedColors };

        const container = document.createElement('div');
        container.style.position = 'fixed';
        container.style.left = `${buttonPositionX}px`; // Set initial horizontal position
        container.style.top = `${buttonPositionY}%`; // Set initial vertical position
        container.style.transform = 'translateY(-50%)';
        container.style.display = buttonsVisible ? 'flex' : 'none';
        container.style.flexDirection = 'column';
        container.style.alignItems = 'center';
        container.style.zIndex = '9999';
        container.style.opacity = buttonOpacity;

        const buttonElements = {};

        function createButton(key) {
            const button = document.createElement('div');
            button.id = key.id;
            button.style.width = `${buttonSize}px`;
            button.style.height = `${buttonSize}px`;
            button.style.borderRadius = buttonShape === 'circle' ? '50%' : '0';
            button.style.margin = '5px';
            button.style.backgroundColor = buttonColors[key.id];
            button.style.border = buttonOutline ? `${borderThickness}px solid ${isDarkMode ? 'black' : 'white'}` : 'none';
            button.style.display = 'flex';
            button.style.justifyContent = 'center';
            button.style.alignItems = 'center';
            button.style.color = 'white';
            button.style.fontSize = `${fontSize}px`;
            button.style.fontWeight = 'bold';
            button.innerText = key.label;
            button.style.transition = 'background-color 0.2s ease';
            buttonElements[key.id] = button;
            return button;
        }

        keys.forEach(key => {
            const button = createButton(key);
            container.appendChild(button);
        });
        document.body.appendChild(container);

        // Event listeners for key and mouse presses
        document.addEventListener('keydown', (event) => {
            const key = keys.find(k => k.keyCode === event.code);
            if (key) {
                const button = buttonElements[key.id];
                button.style.backgroundColor = pressedColor;
            }
        });

        document.addEventListener('keyup', (event) => {
            const key = keys.find(k => k.keyCode === event.code);
            if (key) {
                const button = buttonElements[key.id];
                button.style.backgroundColor = buttonColors[key.id];
            }
        });

        document.addEventListener('mousedown', (event) => {
            if (event.button === 0) { // Left mouse button
                const button = buttonElements['LeftMouse'];
                button.style.backgroundColor = pressedColor;
            } else if (event.button === 2) { // Right mouse button
                const button = buttonElements['RightMouse'];
                button.style.backgroundColor = pressedColor;
            }
        });

        document.addEventListener('mouseup', (event) => {
            if (event.button === 0) { // Left mouse button
                const button = buttonElements['LeftMouse'];
                button.style.backgroundColor = buttonColors['LeftMouse'];
            } else if (event.button === 2) { // Right mouse button
                const button = buttonElements['RightMouse'];
                button.style.backgroundColor = buttonColors['RightMouse'];
            }
        });

        // Settings menu creation
        let colorMenuVisible = false;
        const menu = document.createElement('div');
        menu.style.position = 'fixed';
        menu.style.top = '50%';
        menu.style.left = '50%';
        menu.style.transform = 'translate(-50%, -50%)';
        menu.style.display = 'grid';
        menu.style.gridTemplateColumns = 'repeat(3, 1fr)';
        menu.style.gap = '10px';
        menu.style.backgroundColor = menuOpaque ? (isDarkMode ? 'rgba(0, 0, 0, 0.8)' : 'rgba(255, 255, 255, 0.8)') : menuBackground;
        menu.style.color = isDarkMode ? 'white' : 'black';
        menu.style.padding = '20px';
        menu.style.width = '600px';
        menu.style.borderRadius = '10px';
        menu.style.boxShadow = '0 0 15px rgba(0, 0, 0, 0.2)';
        menu.style.zIndex = '10000';
        menu.style.display = 'none';
        menu.style.opacity = '0';
        menu.style.transition = 'opacity 0.3s ease, transform 0.3s ease';
        menu.style.backdropFilter = menuBlur ? 'blur(10px)' : 'none';

        // Color inputs
        keys.forEach(key => {
            const colorInputContainer = document.createElement('div');
            colorInputContainer.style.display = 'flex';
            colorInputContainer.style.flexDirection = 'column';
            colorInputContainer.style.alignItems = 'center';

            const label = document.createElement('label');
            label.innerText = `${key.label} Color: `;
            label.style.marginBottom = '5px';

            const colorInput = document.createElement('input');
            colorInput.type = 'color';
            colorInput.value = buttonColors[key.id];
            colorInput.style.marginBottom = '10px';

            colorInput.addEventListener('input', function() {
                buttonColors[key.id] = colorInput.value;
                const button = document.getElementById(key.id);
                button.style.backgroundColor = colorInput.value;
                localStorage.setItem('keybindColors', JSON.stringify(buttonColors));
            });

            colorInputContainer.appendChild(label);
            colorInputContainer.appendChild(colorInput);
            menu.appendChild(colorInputContainer);
        });

        // Pressed color picker
        const pressedColorContainer = document.createElement('div');
        pressedColorContainer.style.display = 'flex';
        pressedColorContainer.style.flexDirection = 'column';
        pressedColorContainer.style.alignItems = 'center';

        const pressedColorLabel = document.createElement('label');
        pressedColorLabel.innerText = 'Pressed Color: ';
        pressedColorLabel.style.marginBottom = '5px';

        const pressedColorInput = document.createElement('input');
        pressedColorInput.type = 'color';
        pressedColorInput.value = pressedColor;
        pressedColorInput.style.marginBottom = '10px';

        pressedColorInput.addEventListener('input', function() {
            pressedColor = pressedColorInput.value;
            localStorage.setItem('keybindPressedColor', pressedColor);
        });

        pressedColorContainer.appendChild(pressedColorLabel);
        pressedColorContainer.appendChild(pressedColorInput);
        menu.appendChild(pressedColorContainer);

        // Button size slider
        const sizeContainer = document.createElement('div');
        sizeContainer.style.display = 'flex';
        sizeContainer.style.flexDirection = 'column';
        sizeContainer.style.alignItems = 'center';

        const sizeLabel = document.createElement('label');
        sizeLabel.innerText = 'Button Size: ';
        sizeLabel.style.marginBottom = '5px';

        const sizeSlider = document.createElement('input');
        sizeSlider.type = 'range';
        sizeSlider.min = '20';
        sizeSlider.max = '100';
        sizeSlider.value = buttonSize;
        sizeSlider.addEventListener('input', function() {
            buttonSize = parseInt(sizeSlider.value, 10);
            updateButtonSize(buttonSize);
        });

        sizeContainer.appendChild(sizeLabel);
        sizeContainer.appendChild(sizeSlider);
        menu.appendChild(sizeContainer);

        // Button opacity slider
        const opacityContainer = document.createElement('div');
        opacityContainer.style.display = 'flex';
        opacityContainer.style.flexDirection = 'column';
        opacityContainer.style.alignItems = 'center';

        const opacityLabel = document.createElement('label');
        opacityLabel.innerText = 'Button Opacity: ';
        opacityLabel.style.marginBottom = '5px';

        const opacitySlider = document.createElement('input');
        opacitySlider.type = 'range';
        opacitySlider.min = '0.1';
        opacitySlider.max = '1';
        opacitySlider.step = '0.1';
        opacitySlider.value = buttonOpacity;
        opacitySlider.addEventListener('input', function() {
            buttonOpacity = parseFloat(opacitySlider.value);
            updateButtonOpacity(buttonOpacity);
        });

        opacityContainer.appendChild(opacityLabel);
        opacityContainer.appendChild(opacitySlider);
        menu.appendChild(opacityContainer);

        // Button shape toggle
        const shapeContainer = document.createElement('div');
        shapeContainer.style.display = 'flex';
        shapeContainer.style.flexDirection = 'column';
        shapeContainer.style.alignItems = 'center';

        const shapeLabel = document.createElement('label');
        shapeLabel.innerText = 'Button Shape: ';
        shapeLabel.style.marginBottom = '5px';

        const shapeToggle = document.createElement('button');
        shapeToggle.innerText = buttonShape === 'circle' ? 'Switch to Square' : 'Switch to Circle';
        shapeToggle.addEventListener('click', () => {
            buttonShape = buttonShape === 'circle' ? 'square' : 'circle';
            shapeToggle.innerText = buttonShape === 'circle' ? 'Switch to Square' : 'Switch to Circle';
            updateButtonShape(buttonShape);
        });

        shapeContainer.appendChild(shapeLabel);
        shapeContainer.appendChild(shapeToggle);
        menu.appendChild(shapeContainer);

        // Theme dropdown
        const themeContainer = document.createElement('div');
        themeContainer.style.display = 'flex';
        themeContainer.style.flexDirection = 'column';
        themeContainer.style.alignItems = 'center';

        const themeLabel = document.createElement('label');
        themeLabel.innerText = 'Theme: ';
        themeLabel.style.marginBottom = '5px';

        const themeDropdown = document.createElement('select');
        themeDropdown.innerHTML = `
            <option value="light">Light</option>
            <option value="dark">Dark</option>
            <option value="custom">Custom</option>
        `;
        themeDropdown.value = currentTheme;
        themeDropdown.addEventListener('change', () => {
            currentTheme = themeDropdown.value;
            applyTheme(currentTheme);
        });

        themeContainer.appendChild(themeLabel);
        themeContainer.appendChild(themeDropdown);
        menu.appendChild(themeContainer);

        // Menu background style dropdown
        const menuBackgroundContainer = document.createElement('div');
        menuBackgroundContainer.style.display = 'flex';
        menuBackgroundContainer.style.flexDirection = 'column';
        menuBackgroundContainer.style.alignItems = 'center';

        const menuBackgroundLabel = document.createElement('label');
        menuBackgroundLabel.innerText = 'Menu Background: ';
        menuBackgroundLabel.style.marginBottom = '5px';

        const menuBackgroundDropdown = document.createElement('select');
        menuBackgroundDropdown.innerHTML = `
            <option value="transparent">Transparent</option>
            <option value="opaque">Opaque</option>
        `;
        menuBackgroundDropdown.value = menuBackground;
        menuBackgroundDropdown.addEventListener('change', () => {
            menuBackground = menuBackgroundDropdown.value;
            updateMenuBackground(menuBackground);
        });

        menuBackgroundContainer.appendChild(menuBackgroundLabel);
        menuBackgroundContainer.appendChild(menuBackgroundDropdown);
        menu.appendChild(menuBackgroundContainer);

        // Menu blur toggle
        const menuBlurContainer = document.createElement('div');
        menuBlurContainer.style.display = 'flex';
        menuBlurContainer.style.flexDirection = 'column';
        menuBlurContainer.style.alignItems = 'center';

        const menuBlurLabel = document.createElement('label');
        menuBlurLabel.innerText = 'Menu Blur: ';
        menuBlurLabel.style.marginBottom = '5px';

        const menuBlurToggle = document.createElement('button');
        menuBlurToggle.innerText = menuBlur ? 'Disable Blur' : 'Enable Blur';
        menuBlurToggle.addEventListener('click', () => {
            menuBlur = !menuBlur;
            menuBlurToggle.innerText = menuBlur ? 'Disable Blur' : 'Enable Blur';
            updateMenuBlur(menuBlur);
        });

        menuBlurContainer.appendChild(menuBlurLabel);
        menuBlurContainer.appendChild(menuBlurToggle);
        menu.appendChild(menuBlurContainer);

        // Menu opaque toggle
        const menuOpaqueContainer = document.createElement('div');
        menuOpaqueContainer.style.display = 'flex';
        menuOpaqueContainer.style.flexDirection = 'column';
        menuOpaqueContainer.style.alignItems = 'center';

        const menuOpaqueLabel = document.createElement('label');
        menuOpaqueLabel.innerText = 'Menu Opaque: ';
        menuOpaqueLabel.style.marginBottom = '5px';

        const menuOpaqueToggle = document.createElement('button');
        menuOpaqueToggle.innerText = menuOpaque ? 'Disable Opaque' : 'Enable Opaque';
        menuOpaqueToggle.addEventListener('click', () => {
            menuOpaque = !menuOpaque;
            menuOpaqueToggle.innerText = menuOpaque ? 'Disable Opaque' : 'Enable Opaque';
            updateMenuOpaque(menuOpaque);
        });

        menuOpaqueContainer.appendChild(menuOpaqueLabel);
        menuOpaqueContainer.appendChild(menuOpaqueToggle);
        menu.appendChild(menuOpaqueContainer);

        // Button visibility toggle
        const buttonsVisibleContainer = document.createElement('div');
        buttonsVisibleContainer.style.display = 'flex';
        buttonsVisibleContainer.style.flexDirection = 'column';
        buttonsVisibleContainer.style.alignItems = 'center';

        const buttonsVisibleLabel = document.createElement('label');
        buttonsVisibleLabel.innerText = 'Show Buttons: ';
        buttonsVisibleLabel.style.marginBottom = '5px';

        const buttonsVisibleToggle = document.createElement('button');
        buttonsVisibleToggle.innerText = buttonsVisible ? 'Hide Buttons' : 'Show Buttons';
        buttonsVisibleToggle.addEventListener('click', () => {
            buttonsVisible = !buttonsVisible;
            buttonsVisibleToggle.innerText = buttonsVisible ? 'Hide Buttons' : 'Show Buttons';
            updateButtonsVisibility(buttonsVisible);
        });

        buttonsVisibleContainer.appendChild(buttonsVisibleLabel);
        buttonsVisibleContainer.appendChild(buttonsVisibleToggle);
        menu.appendChild(buttonsVisibleContainer);

        // Button outline toggle
        const buttonOutlineContainer = document.createElement('div');
        buttonOutlineContainer.style.display = 'flex';
        buttonOutlineContainer.style.flexDirection = 'column';
        buttonOutlineContainer.style.alignItems = 'center';

        const buttonOutlineLabel = document.createElement('label');
        buttonOutlineLabel.innerText = 'Button Outline: ';
        buttonOutlineLabel.style.marginBottom = '5px';

        const buttonOutlineToggle = document.createElement('button');
        buttonOutlineToggle.innerText = buttonOutline ? 'Disable Outline' : 'Enable Outline';
        buttonOutlineToggle.addEventListener('click', () => {
            buttonOutline = !buttonOutline;
            buttonOutlineToggle.innerText = buttonOutline ? 'Disable Outline' : 'Enable Outline';
            updateButtonOutline(buttonOutline);
        });

        buttonOutlineContainer.appendChild(buttonOutlineLabel);
        buttonOutlineContainer.appendChild(buttonOutlineToggle);
        menu.appendChild(buttonOutlineContainer);

        // Button position sliders
        const positionXContainer = document.createElement('div');
        positionXContainer.style.display = 'flex';
        positionXContainer.style.flexDirection = 'column';
        positionXContainer.style.alignItems = 'center';

        const positionXLabel = document.createElement('label');
        positionXLabel.innerText = 'Horizontal Position: ';
        positionXLabel.style.marginBottom = '5px';

        const positionXSlider = document.createElement('input');
        positionXSlider.type = 'range';
        positionXSlider.min = '-50'; // Extended range for horizontal position
        positionXSlider.max = '150'; // Extended range for horizontal position
        positionXSlider.value = buttonPositionX;
        positionXSlider.addEventListener('input', function() {
            buttonPositionX = parseInt(positionXSlider.value, 10);
            updateButtonPosition();
        });

        positionXContainer.appendChild(positionXLabel);
        positionXContainer.appendChild(positionXSlider);
        menu.appendChild(positionXContainer);

        const positionYContainer = document.createElement('div');
        positionYContainer.style.display = 'flex';
        positionYContainer.style.flexDirection = 'column';
        positionYContainer.style.alignItems = 'center';

        const positionYLabel = document.createElement('label');
        positionYLabel.innerText = 'Vertical Position: ';
        positionYLabel.style.marginBottom = '5px';

        const positionYSlider = document.createElement('input');
        positionYSlider.type = 'range';
        positionYSlider.min = '0';
        positionYSlider.max = '100';
        positionYSlider.value = buttonPositionY;
        positionYSlider.addEventListener('input', function() {
            buttonPositionY = parseInt(positionYSlider.value, 10);
            updateButtonPosition();
        });

        positionYContainer.appendChild(positionYLabel);
        positionYContainer.appendChild(positionYSlider);
        menu.appendChild(positionYContainer);

        // Reset to defaults button
        const resetContainer = document.createElement('div');
        resetContainer.style.display = 'flex';
        resetContainer.style.flexDirection = 'column';
        resetContainer.style.alignItems = 'center';

        const resetButton = document.createElement('button');
        resetButton.innerText = 'Reset to Defaults';
        resetButton.addEventListener('click', () => {
            resetToDefaults();
        });

        resetContainer.appendChild(resetButton);
        menu.appendChild(resetContainer);

        // Add Live CSS Injector to the menu
        const cssInjectorContainer = document.createElement('div');
        cssInjectorContainer.style.display = 'flex';
        cssInjectorContainer.style.flexDirection = 'column';
        cssInjectorContainer.style.alignItems = 'center';

        const cssInjectorLabel = document.createElement('label');
        cssInjectorLabel.innerText = 'Live CSS Injector:';
        cssInjectorLabel.style.marginBottom = '5px';

        const cssTextarea = document.createElement('textarea');
        cssTextarea.style.width = '100%';
        cssTextarea.style.height = '100px';
        cssTextarea.style.marginBottom = '10px';
        cssTextarea.style.backgroundColor = isDarkMode ? 'rgba(0, 0, 0, 0.5)' : 'rgba(255, 255, 255, 0.5)';
        cssTextarea.style.color = isDarkMode ? 'white' : 'black';
        cssTextarea.style.border = 'none';
        cssTextarea.style.borderRadius = '5px';
        cssTextarea.style.padding = '10px';
        cssTextarea.value = customCSS; // Load saved CSS

        const applyCssButton = document.createElement('button');
        applyCssButton.innerText = 'Apply CSS';
        applyCssButton.style.backgroundColor = isDarkMode ? '#444' : '#ddd';
        applyCssButton.style.color = isDarkMode ? 'white' : 'black';
        applyCssButton.style.border = 'none';
        applyCssButton.style.borderRadius = '5px';
        applyCssButton.style.padding = '10px';
        applyCssButton.style.cursor = 'pointer';

        applyCssButton.addEventListener('click', () => {
            customCSS = cssTextarea.value;
            localStorage.setItem('customCSS', customCSS); // Save CSS to localStorage
            applyCustomCSS(customCSS); // Apply the CSS
        });

        cssInjectorContainer.appendChild(cssInjectorLabel);
        cssInjectorContainer.appendChild(cssTextarea);
        cssInjectorContainer.appendChild(applyCssButton);
        menu.appendChild(cssInjectorContainer);

        // Add Slider Color Picker to the menu
        const sliderColorContainer = document.createElement('div');
        sliderColorContainer.style.display = 'flex';
        sliderColorContainer.style.flexDirection = 'column';
        sliderColorContainer.style.alignItems = 'center';

        const sliderColorLabel = document.createElement('label');
        sliderColorLabel.innerText = 'Slider Color: ';
        sliderColorLabel.style.marginBottom = '5px';

        const sliderColorInput = document.createElement('input');
        sliderColorInput.type = 'color';
        sliderColorInput.value = sliderColor;
        sliderColorInput.style.marginBottom = '10px';

        sliderColorInput.addEventListener('input', function() {
            sliderColor = sliderColorInput.value;
            localStorage.setItem('sliderColor', sliderColor); // Save slider color to localStorage
            updateSliderColor(sliderColor); // Apply the new slider color
        });

        sliderColorContainer.appendChild(sliderColorLabel);
        sliderColorContainer.appendChild(sliderColorInput);
        menu.appendChild(sliderColorContainer);

        document.body.appendChild(menu);

        // Apply saved CSS on page load
        if (customCSS) {
            applyCustomCSS(customCSS);
        }

        // Apply saved slider color on page load
        updateSliderColor(sliderColor);

        // Helper functions
        function applyCustomCSS(css) {
            const styleElement = document.createElement('style');
            styleElement.type = 'text/css';
            styleElement.innerHTML = css;
            document.head.appendChild(styleElement);
        }

        function updateSliderColor(color) {
            const sliders = document.querySelectorAll('input[type="range"]');
            sliders.forEach(slider => {
                slider.style.accentColor = color; // Modern browsers support accent-color
            });
        }

        function updateButtonSize(newSize) {
            Object.values(buttonElements).forEach(button => {
                button.style.width = `${newSize}px`;
                button.style.height = `${newSize}px`;
            });
            localStorage.setItem('keybindButtonSize', newSize.toString());
        }

        function updateButtonOpacity(newOpacity) {
            container.style.opacity = newOpacity;
            localStorage.setItem('keybindButtonOpacity', newOpacity.toString());
        }

        function updateButtonShape(newShape) {
            Object.values(buttonElements).forEach(button => {
                button.style.borderRadius = newShape === 'circle' ? '50%' : '0';
            });
            localStorage.setItem('keybindButtonShape', newShape);
        }

        function applyTheme(theme) {
            isDarkMode = theme === 'dark';
            menu.style.backgroundColor = menuOpaque ? (isDarkMode ? 'rgba(0, 0, 0, 0.8)' : 'rgba(255, 255, 255, 0.8)') : menuBackground;
            menu.style.color = isDarkMode ? 'white' : 'black';
            Object.values(buttonElements).forEach(button => {
                button.style.border = buttonOutline ? `${borderThickness}px solid ${isDarkMode ? 'black' : 'white'}` : 'none';
            });
            localStorage.setItem('keybindTheme', theme);
        }

        function updateMenuBackground(background) {
            menuBackground = background;
            menu.style.backgroundColor = menuOpaque ? (isDarkMode ? 'rgba(0, 0, 0, 0.8)' : 'rgba(255, 255, 255, 0.8)') : background;
            localStorage.setItem('keybindMenuBackground', background);
        }

        function updateMenuBlur(blur) {
            menuBlur = blur;
            menu.style.backdropFilter = blur ? 'blur(10px)' : 'none';
            localStorage.setItem('keybindMenuBlur', blur.toString());
        }

        function updateMenuOpaque(opaque) {
            menuOpaque = opaque;
            menu.style.backgroundColor = opaque ? (isDarkMode ? 'rgba(0, 0, 0, 0.8)' : 'rgba(255, 255, 255, 0.8)') : menuBackground;
            localStorage.setItem('keybindMenuOpaque', opaque.toString());
        }

        function updateButtonsVisibility(visible) {
            container.style.display = visible ? 'flex' : 'none';
            localStorage.setItem('keybindButtonsVisible', visible.toString());
        }

        function updateButtonOutline(outline) {
            buttonOutline = outline;
            Object.values(buttonElements).forEach(button => {
                button.style.border = outline ? `${borderThickness}px solid ${isDarkMode ? 'black' : 'white'}` : 'none';
            });
            localStorage.setItem('keybindButtonOutline', outline.toString());
        }

        function updateButtonPosition() {
            container.style.left = `${buttonPositionX}px`;
            container.style.top = `${buttonPositionY}%`;
            localStorage.setItem('keybindButtonPositionX', buttonPositionX.toString());
            localStorage.setItem('keybindButtonPositionY', buttonPositionY.toString());
        }

        function resetToDefaults() {
            buttonColors = { ...defaultSettings.keybindColors };
            buttonSize = parseInt(defaultSettings.keybindButtonSize, 10);
            buttonOpacity = parseFloat(defaultSettings.keybindButtonOpacity);
            pressedColor = defaultSettings.keybindPressedColor;
            fontSize = parseInt(defaultSettings.keybindFontSize, 10);
            borderThickness = parseInt(defaultSettings.keybindBorderThickness, 10);
            buttonShape = defaultSettings.keybindButtonShape;
            currentTheme = defaultSettings.keybindTheme;
            menuBackground = defaultSettings.keybindMenuBackground;
            menuBlur = defaultSettings.keybindMenuBlur === 'true';
            menuOpaque = defaultSettings.keybindMenuOpaque === 'true';
            buttonsVisible = defaultSettings.keybindButtonsVisible === 'true';
            buttonOutline = defaultSettings.keybindButtonOutline === 'true';
            buttonPositionX = parseInt(defaultSettings.keybindButtonPositionX, 10);
            buttonPositionY = parseInt(defaultSettings.keybindButtonPositionY, 10);
            customCSS = defaultSettings.customCSS; // Reset CSS to default
            sliderColor = defaultSettings.sliderColor; // Reset slider color to default

            // Update UI
            keys.forEach(key => {
                const button = document.getElementById(key.id);
                button.style.backgroundColor = buttonColors[key.id];
            });
            updateButtonSize(buttonSize);
            updateButtonOpacity(buttonOpacity);
            updateButtonShape(buttonShape);
            applyTheme(currentTheme);
            updateMenuBackground(menuBackground);
            updateMenuBlur(menuBlur);
            updateMenuOpaque(menuOpaque);
            updateButtonsVisibility(buttonsVisible);
            updateButtonOutline(buttonOutline);
            updateButtonPosition();
            updateSliderColor(sliderColor); // Reset slider color

            // Update settings menu
            pressedColorInput.value = pressedColor;
            sizeSlider.value = buttonSize;
            opacitySlider.value = buttonOpacity;
            shapeToggle.innerText = buttonShape === 'circle' ? 'Switch to Square' : 'Switch to Circle';
            themeDropdown.value = currentTheme;
            menuBackgroundDropdown.value = menuBackground;
            menuBlurToggle.innerText = menuBlur ? 'Disable Blur' : 'Enable Blur';
            menuOpaqueToggle.innerText = menuOpaque ? 'Disable Opaque' : 'Enable Opaque';
            buttonsVisibleToggle.innerText = buttonsVisible ? 'Hide Buttons' : 'Show Buttons';
            buttonOutlineToggle.innerText = buttonOutline ? 'Disable Outline' : 'Enable Outline';
            positionXSlider.value = buttonPositionX;
            positionYSlider.value = buttonPositionY;
            cssTextarea.value = customCSS; // Reset CSS textarea
            sliderColorInput.value = sliderColor; // Reset slider color input

            // Save defaults to localStorage
            localStorage.setItem('keybindColors', JSON.stringify(buttonColors));
            localStorage.setItem('keybindButtonSize', buttonSize.toString());
            localStorage.setItem('keybindButtonOpacity', buttonOpacity.toString());
            localStorage.setItem('keybindPressedColor', pressedColor);
            localStorage.setItem('keybindFontSize', fontSize.toString());
            localStorage.setItem('keybindBorderThickness', borderThickness.toString());
            localStorage.setItem('keybindButtonShape', buttonShape);
            localStorage.setItem('keybindTheme', currentTheme);
            localStorage.setItem('keybindMenuBackground', menuBackground);
            localStorage.setItem('keybindMenuBlur', menuBlur.toString());
            localStorage.setItem('keybindMenuOpaque', menuOpaque.toString());
            localStorage.setItem('keybindButtonsVisible', buttonsVisible.toString());
            localStorage.setItem('keybindButtonOutline', buttonOutline.toString());
            localStorage.setItem('keybindButtonPositionX', buttonPositionX.toString());
            localStorage.setItem('keybindButtonPositionY', buttonPositionY.toString());
            localStorage.setItem('customCSS', customCSS); // Save default CSS
            localStorage.setItem('sliderColor', sliderColor); // Save default slider color
        }

        // Add Export Settings Button
        const exportContainer = document.createElement('div');
        exportContainer.style.display = 'flex';
        exportContainer.style.flexDirection = 'column';
        exportContainer.style.alignItems = 'center';

        const exportButton = document.createElement('button');
        exportButton.innerText = 'Export Settings';
        exportButton.addEventListener('click', exportSettings);

        exportContainer.appendChild(exportButton);
        menu.appendChild(exportContainer);

        // Add Import Settings Button
        const importContainer = document.createElement('div');
        importContainer.style.display = 'flex';
        importContainer.style.flexDirection = 'column';
        importContainer.style.alignItems = 'center';

        const importButton = document.createElement('button');
        importButton.innerText = 'Import Settings';
        const fileInput = document.createElement('input');
        fileInput.type = 'file';
        fileInput.accept = '.json';
        fileInput.style.display = 'none';
        fileInput.addEventListener('change', importSettings);
        importButton.addEventListener('click', () => fileInput.click());

        importContainer.appendChild(importButton);
        importContainer.appendChild(fileInput);
        menu.appendChild(importContainer);

        // Export Settings Function
        function exportSettings() {
            const settings = {
                keybindColors: JSON.parse(localStorage.getItem('keybindColors')) || defaultSettings.keybindColors,
                keybindButtonSize: localStorage.getItem('keybindButtonSize') || defaultSettings.keybindButtonSize,
                keybindButtonOpacity: localStorage.getItem('keybindButtonOpacity') || defaultSettings.keybindButtonOpacity,
                keybindPressedColor: localStorage.getItem('keybindPressedColor') || defaultSettings.keybindPressedColor,
                keybindFontSize: localStorage.getItem('keybindFontSize') || defaultSettings.keybindFontSize,
                keybindBorderThickness: localStorage.getItem('keybindBorderThickness') || defaultSettings.keybindBorderThickness,
                keybindDarkMode: localStorage.getItem('keybindDarkMode') || defaultSettings.keybindDarkMode,
                keybindButtonShape: localStorage.getItem('keybindButtonShape') || defaultSettings.keybindButtonShape,
                keybindTheme: localStorage.getItem('keybindTheme') || defaultSettings.keybindTheme,
                keybindMenuBackground: localStorage.getItem('keybindMenuBackground') || defaultSettings.keybindMenuBackground,
                keybindMenuBlur: localStorage.getItem('keybindMenuBlur') || defaultSettings.keybindMenuBlur,
                keybindMenuOpaque: localStorage.getItem('keybindMenuOpaque') || defaultSettings.keybindMenuOpaque,
                keybindButtonsVisible: localStorage.getItem('keybindButtonsVisible') || defaultSettings.keybindButtonsVisible,
                keybindButtonOutline: localStorage.getItem('keybindButtonOutline') || defaultSettings.keybindButtonOutline,
                keybindButtonPositionX: localStorage.getItem('keybindButtonPositionX') || defaultSettings.keybindButtonPositionX,
                keybindButtonPositionY: localStorage.getItem('keybindButtonPositionY') || defaultSettings.keybindButtonPositionY,
                customCSS: localStorage.getItem('customCSS') || defaultSettings.customCSS, // Include custom CSS in export
                sliderColor: localStorage.getItem('sliderColor') || defaultSettings.sliderColor, // Include slider color in export
            };

            const dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(settings));
            const downloadAnchorNode = document.createElement('a');
            downloadAnchorNode.setAttribute("href", dataStr);
            downloadAnchorNode.setAttribute("download", "keybind_settings.json");
            document.body.appendChild(downloadAnchorNode); // Required for Firefox
            downloadAnchorNode.click();
            downloadAnchorNode.remove();
        }

        // Import Settings Function
        function importSettings(event) {
            const file = event.target.files[0];
            if (!file) {
                return;
            }

            const reader = new FileReader();
            reader.onload = function(e) {
                const text = e.target.result;
                const settings = JSON.parse(text);

                // Update localStorage with imported settings
                localStorage.setItem('keybindColors', JSON.stringify(settings.keybindColors));
                localStorage.setItem('keybindButtonSize', settings.keybindButtonSize);
                localStorage.setItem('keybindButtonOpacity', settings.keybindButtonOpacity);
                localStorage.setItem('keybindPressedColor', settings.keybindPressedColor);
                localStorage.setItem('keybindFontSize', settings.keybindFontSize);
                localStorage.setItem('keybindBorderThickness', settings.keybindBorderThickness);
                localStorage.setItem('keybindDarkMode', settings.keybindDarkMode);
                localStorage.setItem('keybindButtonShape', settings.keybindButtonShape);
                localStorage.setItem('keybindTheme', settings.keybindTheme);
                localStorage.setItem('keybindMenuBackground', settings.keybindMenuBackground);
                localStorage.setItem('keybindMenuBlur', settings.keybindMenuBlur);
                localStorage.setItem('keybindMenuOpaque', settings.keybindMenuOpaque);
                localStorage.setItem('keybindButtonsVisible', settings.keybindButtonsVisible);
                localStorage.setItem('keybindButtonOutline', settings.keybindButtonOutline);
                localStorage.setItem('keybindButtonPositionX', settings.keybindButtonPositionX);
                localStorage.setItem('keybindButtonPositionY', settings.keybindButtonPositionY);
                localStorage.setItem('customCSS', settings.customCSS); // Import custom CSS
                localStorage.setItem('sliderColor', settings.sliderColor); // Import slider color

                // Reload the page to apply new settings
                window.location.reload();
            };
            reader.readAsText(file);
        }

        // Event listener for Ctrl + O
        document.addEventListener('keydown', function(event) {
            if (event.ctrlKey && event.key === 'o') {
                event.preventDefault();
                colorMenuVisible = !colorMenuVisible;
                if (colorMenuVisible) {
                    menu.style.display = 'grid';
                    setTimeout(() => {
                        menu.style.opacity = '1';
                        menu.style.transform = 'translate(-50%, -50%) scale(1)';
                    }, 10);
                } else {
                    menu.style.opacity = '0';
                    menu.style.transform = 'translate(-50%, -50%) scale(0.9)';
                    setTimeout(() => {
                        menu.style.display = 'none';
                    }, 300);
                }
            }
        });
    });
})();