Dark mode - Bonk.io

Recolors some elements to be darker, and allows toggling dark mode with a hotkey

目前為 2021-11-20 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Dark mode - Bonk.io
// @description  Recolors some elements to be darker, and allows toggling dark mode with a hotkey
// @author       Excigma
// @namespace    https://greasyfork.org/users/416480
// @license      MIT
// @version      0.0.4
// @match        https://bonk.io/*
// @grant        GM_addStyle
// @grant        unsafeWindow
// @run-at       document-body
// ==/UserScript==

(() => {
	// Some values are hoisted out from the CSS into the object below, however this was made to create a dark theme
	// If you want to make a light theme, you'd need to understand some of the CSS below to find where i darken certain elements and text
	
	// auto_on is used to control whether dark mode is turned on automatically
	// key is the hotkey used to toggle, when pressed with ctrl and alt

	// brown is used for button colors, I kept it as it gave bonk its distinct feeling
	// browndark is used for button hover colors

	// accent is used for window title colors
	// accentlight is used for text color when your friend is in a room

	// brightness_lighter is used to make things that are too dark lighter (votes on maps, usernames in chat)
	// brightness_darker is used to make things that are too bright darker (the things about bonk at the bottom of the page)

	// replay_opacity is the opacity of the replay

	// I just randomly used the other colors lmao idk
	const cfg = {
		auto_on: true,
		key: "d",
		brown: "#4f382f",
		browndark: "#362620",
		accent: "#2b6351",
		accentlight: "#40c99e",
		brightness_lighter: 2,
		brightness_darker: 0.5,
		veryverydark: "#111111",
		verydark: "#191919",
		darker: "#222222",
		dark: "#333333",
		light: "#444444",
		lighter: "#bebebe",
		verylight: "#f8fafd",
		veryverylight: "#ffffff"
	};

	if (cfg.auto_on) document.body.classList.add("dark-mode");

	// Hotkey to turn the script on and off
	document.addEventListener("keydown", evt => {

		if (evt.key?.toLowerCase() === cfg.key && evt.ctrlKey && evt.altKey) {
			document.body.classList.toggle("dark-mode");
			// Detect if we're in maingameframe or the outer bonk.io website
			if (unsafeWindow.parent === unsafeWindow) {
				const maingameframe = document.getElementById("maingameframe");
				maingameframe.contentDocument.body.classList.toggle("dark-mode");
			} else {
				unsafeWindow.parent.document.body.classList.toggle("dark-mode");
			}
		}
	});

	// Please consider forgetting you have ever read the below. It's really bad.
	// eslint-disable-next-line no-undef
	GM_addStyle(`
	/* Page background */
	.dark-mode #pagecontainer, body.dark-mode { background-color: ${cfg.veryverydark} !important; }

	/* Dark scroll bar tracks on Chromium */
	.dark-mode ::-webkit-scrollbar-track-piece { background-color: ${cfg.verydark}; }
	
	.dark-mode #bonkiocontainer,
	.dark-mode #friendsToolTip { 
		background-color: ${cfg.verydark} !important; 
	}

	/* Style a lot of dialogs */
	/* I can just do windowShadow, but it might break things if new things are added */
	/* It's better to have a new thing visibly light rather than broken */
	.dark-mode .dark-container,
	.dark-mode #autoLoginContainer,
	.dark-mode #guestOrAccountContainer_accountBox,
	.dark-mode #guestOrAccountContainer_guestBox,
	.dark-mode #guestContainer, 
	.dark-mode .accountContainer,
	.dark-mode #registerwindow_remember_label,
	.dark-mode #loginwindow_remember_label,
	.dark-mode #loginwindow,
	.dark-mode #registerwindow,
	.dark-mode #settingsContainer,
	.dark-mode .settingsHeading,
	.dark-mode .redefineControls_selectionCell:hover,
	.dark-mode #newswindow,
	.dark-mode #skinmanager,
	.dark-mode .skineditor_shapewindow,
	.dark-mode .skineditor_shapewindow_imagecontainer,
	.dark-mode #skineditor_propertiesbox,
	.dark-mode #skineditor_propertiesbox_table,
	.dark-mode #skineditor_previewbox,
	.dark-mode #skineditor_layerbox,
	.dark-mode #skineditor_layerbox_baselabel,
	.dark-mode #quickPlayWindow,
	.dark-mode #roomlistcreatewindow,
	.dark-mode .roomlistcreatewindowlabel,
	.dark-mode #roomlistjoinpasswordwindow,
	.dark-mode #sm_connectingWindow,
	.dark-mode #newbonklobby_specbox,
	.dark-mode #newbonklobby_playerbox,
	.dark-mode #newbonklobby_chatbox,
	.dark-mode #newbonklobby_settingsbox,
	.dark-mode #newbonklobby_votewindow,
	.dark-mode #newbonklobby_votewindow_maptitle,
	.dark-mode #newbonklobby_votewindow_mapauthor,
	.dark-mode #leaveconfirmwindow,
	.dark-mode #leaveconfirmwindow_text2,
	.dark-mode #maploadwindow,
	.dark-mode #maploadwindowgreybar,
	.dark-mode #maploadwindowstatustext,
	.dark-mode #mapeditor_leftbox,
	.dark-mode #mapeditor_midbox,
	.dark-mode #mapeditor_rightbox,
	.dark-mode #mapeditor_save_window,
	.dark-mode #kkleeRoot,
	.dark-mode #skineditor_colorpicker,
	.dark-mode #mapeditor_colorpicker,
	.dark-mode #friendsSendWindow,
	.dark-mode #roomlistfilterwindow {
		background-color: ${cfg.darker} !important;
		color: ${cfg.verylight} !important;
	}
	
	/* Lighter bg */
	.dark-mode .dark-text,
	.dark-mode #bonkioheader,
	.dark-mode .windowTopBar_classic,
	.dark-mode #autoLogin_text,
	.dark-mode .guestOrAccountContainerLabelBox,
	.dark-mode #guest_nametext,
	.dark-mode #loginwindow_username,
	.dark-mode #loginwindow_password,
	.dark-mode #registerwindow_username,
	.dark-mode #registerwindow_password,
	.dark-mode #guest_skinbox,
	.dark-mode #redefineControls_table,
	.dark-mode #redefineControls_table th,
	.dark-mode #skineditor_propertiesbox_blocker,
	.dark-mode #newswindow_white,
	.dark-mode .quickPlayWindowModeDiv,
	.dark-mode .quickPlayWindowText1,
	.dark-mode .quickPlayWindowText2,
	.dark-mode .quickPlayWindowText3,
	.dark-mode #roomlist,
	.dark-mode #roomlisttableheadercontainer,
	.dark-mode .roomlistcreatewindowinput,
	.dark-mode .whiteInputField,
	.dark-mode #sm_connectingWindow_text,
	.dark-mode #friendsContainer,
	.dark-mode .friends_table,
	.dark-mode .skinmanager_icon,
	.dark-mode .newbonklobby_playerentry_menu,
	.dark-mode .newbonklobby_playerentry_menu_submenu,
	.dark-mode #maploadwindowsearchinput,
	.dark-mode .maploadwindowmapdiv,
	.dark-mode #mapeditor_midbox_explain,
	.dark-mode .mapeditor_rightbox_table_shape_headerfield,
	.dark-mode #mapeditor_rightbox_namefield,
	.dark-mode .mapeditor_field,
	.dark-mode .skineditor_field {
		border: none !important;
		background-color: ${cfg.dark} !important;
		color: ${cfg.verylight} !important;
	}

	.dark-mode .newbonklobby_playerentry_name,
	.dark-mode #newbonklobby_modetext,
	.dark-mode #newbonklobby_roundslabel,
	.dark-mode .maploadwindowtext_picks,
	.dark-mode .maploadwindowtext,
	.dark-mode #roomliststatustext, 
	.dark-mode #roomlisttable,
	.dark-mode .mapeditor_rightbox_table_leftcell,
	.dark-mode .mapeditor_rightbox_table_rightcell {
		color: ${cfg.verylight} !important;
	}

	.dark-mode .newbonklobby_playerentry_level,
	.dark-mode .newbonklobby_playerentry_pingtext, 
	.dark-mode #newbonklobby_chat_lowerinstruction,
	.dark-mode #newbonklobby_chat_lowerline, 
	.dark-mode .newbonklobby_chat_msg_txt,
	.dark-mode #newbonklobby_chat_input,
	.dark-mode #newbonklobby_maptext,
	.dark-mode #newbonklobby_roundsinput,
	.dark-mode #newbonklobby_mapauthortext,
	.dark-mode #newbonklobby_votewindow_maptitle_by,
	.dark-mode #leaveconfirmwindow_text1 {
		color: ${cfg.lighter} !important;
	}

	.dark-mode .newbonklobby_playerentry_balance,
	.dark-mode .newbonklobby_chat_msg_name,
	.dark-mode .newbonklobby_chat_status,
	.dark-mode .maploadwindowtextvotediff_picks,
	.dark-mode .maploadwindowtextvotediff {
		filter: brightness(${cfg.brightness_lighter}) !important;
	}

	.dark-mode #descriptioncontainer,
	.dark-mode #gamethumbbox,
	.dark-mode #bgreplay {
		filter: brightness(${cfg.brightness_darker}) !important;
	}

	/* Style sliders and buttons */
	.dark-mode .compactSlider {
		background-color: transparent !important;
		color: ${cfg.verylight} !important;
	}

	.dark-mode .brownButton_classic,
	.dark-mode .dropdown_classic,
	.dark-mode .skineditor_field_button,
	.dark-mode .mapeditor_field_button {
		background-color: ${cfg.brown} !important;
		color: ${cfg.verylight} !important;
	}

	.dark-mode .brownButtonDisabled,
	.dark-mode .brownButton_disabled_classic {
		background-color: ${cfg.light} !important;
		color: ${cfg.verylight} !important;
	}

	.dark-mode .brownButton_classic:hover,
	.dark-mode .dropdown_classic:hover {
		background-color: ${cfg.browndark} !important;
		color: ${cfg.verylight} !important;
	}

	/* Tables in the game - Skin editor, Map editor and Custom game list*/
	.dark-mode #roomlisttable tr:nth-child(odd),
	.dark-mode .friends_table>tbody:nth-child(odd),
	.dark-mode #skineditor_layerbox_layertable tr:nth-child(odd),
	.dark-mode #mapeditor_leftbox_platformtable tr:nth-child(odd),
	.dark-mode #mapeditor_leftbox_spawntable tr:nth-child(odd),
	.dark-mode .roomlistfilterwindow_a {
		background-color: ${cfg.light} !important;
		color: ${cfg.verylight} !important;
	}

	.dark-mode #roomlisttable tr:nth-child(even),
	.dark-mode .friends_table tr:nth-child(even),
	.dark-mode #skineditor_layerbox_layertable tr:nth-child(even),
	.dark-mode #mapeditor_leftbox_platformtable tr:nth-child(even),
	.dark-mode #mapeditor_leftbox_spawntable tr:nth-child(even) ,
	.dark-mode .roomlistfilterwindow_b {
		background-color: ${cfg.dark} !important;
		color: ${cfg.verylight} !important;
	}

	.dark-mode #roomlisttable tr.FRIENDSPRESENT { color: ${cfg.accentlight} !important; }

	.dark-mode tr.HOVERUNSELECTED:hover td { background-color: ${cfg.darker} !important; }

	.dark-mode tr.HOVERSELECTED td,
	.dark-mode tr.SELECTED td {
		background-color: ${cfg.veryverydark} !important;
	}

	/* "popup" color, custom room list top bar */
	.dark-mode .windowTopBar_classic, 
	.dark-mode .classicTopBar,
	.dark-mode .friends_topbar,
	.dark-mode .newbonklobby_boxtop, 
	.dark-mode .newbonklobby_boxtop_classic {
		background-color: ${cfg.accent} !important;
		color: ${cfg.verylight} !important;
	}

	/* I'm lazy. I'm not gonna style #pretty_bottom */
	/* Style the top bar */
	.dark-mode #pretty_top_bar {
		background-color: ${cfg.dark}c7 !important;
		color: ${cfg.lighter} !important;
	}

	.dark-mode .pretty_top_button {
		background-color: ${cfg.dark}c7 !important;
		color: ${cfg.lighter} !important;
	}

	.dark-mode .pretty_top_button:hover {
		background-color: ${cfg.light}c7 !important;
		color: ${cfg.lighter} !important;
	}

	/* Other random stuff */
	/* Invert the Bonk.io description at the bottom of the page */
	.dark-mode #descriptioninner,
	.dark-mode #descriptioninner .descriptionthumbr,
	.dark-mode #descriptioninner .descriptionthumbl {
		filter: invert(1) !important;
	}


	/* Change settings borders */
	.dark-mode #redefineControls_table td,
	.dark-mode #redefineControls_table th,
	.dark-mode #redefineControls_table {
		border: 1px solid ${cfg.light} !important;
	}

	/* Player in lobby */
	.dark-mode .newbonklobby_playerentry {
		border-left: 4px solid ${cfg.darker} !important;
		border-top: 4px solid ${cfg.darker} !important;
		border-right: 4px solid ${cfg.darker} !important;
		background-color: ${cfg.darker} !important;
		color: ${cfg.verylight} !important;
	}

	.dark-mode .newbonklobby_playerentry:hover {
		border-left: 4px solid ${cfg.dark} !important;
		border-top: 4px solid ${cfg.dark} !important;
		border-right: 4px solid ${cfg.dark} !important;
		background-color: ${cfg.dark} !important;
	}

	.dark-mode #newbonklobby_chat_lowerline {
		border-top: 1px solid ${cfg.light} !important;
	}

	/* Fix friends list  - This value is hardcoded because bonk hardcodes this in the map editor too */
	.dark-mode .friends_titles {
		background-color: hsl(184 72% 18% / 0.2) !important;
	}

	#xpbarfill {
		background-color: ${cfg.accent} !important;
	}
	`);
})();