- // ==UserScript==
- // @name Youtube Custom Font
- // @version 0.1.1
- // @author Amm1rr
- // @description Applies a custom font, Vazirmatn, to all text elements on the current web page (YouTube).
- // @homepage https://github.com/Amm1rr/
- // @namespace amm1rr.youtube.custom.font
- // @match https://*.youtube.*/*
- // @icon https://cdn.jsdelivr.net/gh/Amm1rr/Userscripts@main/Youtube-Custom-Font/Icon.png
- // @grant none
- // @license MIT
- // ==/UserScript==
-
- // Description:
- // This script injects a small "bubble float button" on the top left corner of the YouTube page.
- // Clicking the button applies a custom font, Vazirmatn, to all text elements on the webpage.
- // You can customize the font family and element selector to your preference.
-
- (function () {
- // Configuration object for easy customization
- const config = {
- fontFamily: "Vazirmatn",
- // selector: ".style-scope", //Youtube Class
- selector: "*",
- buttonID: "yt-custom-font",
- buttonText: "A",
- notificationDuration: 2000,
- buttonFadeDuration: 2000,
- notificationMessage: "Fonts updated: Vazirmatn font applied.",
- buttonTooltip: "Enhance readability with Vazirmatn font",
- };
-
- if (document.getElementById(config.buttonID)) {
- console.log(
- "Custom Font: " + config.buttonID + " button already exists.\n bye bye()"
- );
- // console.log("Custom Font: bye bye()");
- return;
- }
-
- // Apply custom font to selected elements
- function applyCustomFont(selector, fontFamily) {
- const style = document.createElement("style");
- style.textContent = `${selector} * {font-family: ${fontFamily} !important;}`;
- document.head.appendChild(style);
- }
-
- // Show notification with fade effect
- function showNotification(message, duration) {
- const notification = document.createElement("div");
- Object.assign(notification.style, {
- position: "fixed",
- bottom: "80%",
- left: "50%",
- transform: "translateX(-50%)",
- padding: "10px 20px",
- backgroundColor: "rgba(0, 123, 255, 0.8)",
- color: "yellow",
- borderRadius: "5px",
- boxShadow: "0 2px 5px rgba(0,0,0,0.2)",
- zIndex: "10000",
- opacity: "0",
- transition: "opacity 0.5s ease",
- textAlign: "center",
- });
- notification.textContent = message;
- document.body.appendChild(notification);
-
- requestAnimationFrame(() => {
- notification.style.opacity = "1";
- });
-
- setTimeout(() => {
- notification.style.opacity = "0";
- notification.addEventListener(
- "transitionend",
- () => notification.remove(),
- { once: true }
- );
- }, duration);
- }
-
- // Create and add font change button
- function addFontChangeButton() {
- const button = document.createElement("button");
- button.id = config.buttonID;
- button.textContent = config.buttonText;
- button.title = config.buttonTooltip;
-
- const buttonStyle = {
- position: "fixed",
- top: "10px",
- left: "3px",
- zIndex: "9999",
- width: "20px",
- height: "20px",
- borderRadius: "50%",
- backgroundColor: "rgba(123, 110, 242, 0.3)",
- color: "#FFFFFF",
- border: "none",
- fontWeight: "bold",
- fontFamily: "Arial",
- cursor: "pointer",
- boxShadow: "0 2px 5px rgba(0,0,0,0.3)",
- transition: "background-color 0.3s ease, opacity 0.3s ease",
- };
- Object.assign(button.style, buttonStyle);
-
- function setButtonHoverState(isHover) {
- if (!button.disabled) {
- button.style.backgroundColor = isHover
- ? "rgba(123, 110, 242, 0.8)"
- : "rgba(123, 110, 242, 0.3)";
- }
- }
-
- button.addEventListener("mouseenter", () => setButtonHoverState(true));
- button.addEventListener("mousemove", () => setButtonHoverState(true));
- button.addEventListener("mouseover", () => setButtonHoverState(true));
- button.addEventListener("mouseleave", () => setButtonHoverState(false));
-
- button.addEventListener("click", () => {
- button.disabled = true;
- button.style.cursor = "default";
- button.style.backgroundColor = "rgba(123, 110, 242, 0.3)";
-
- applyCustomFont(config.selector, config.fontFamily);
- showNotification(config.notificationMessage, config.notificationDuration);
-
- button.style.opacity = "0";
- setTimeout(() => {
- button.disabled = false;
- button.style.cursor = "pointer";
- button.style.opacity = "1";
- }, config.buttonFadeDuration);
- });
-
- document.body.appendChild(button);
-
- function handleFullscreenChange() {
- const isFullscreen = !!document.fullscreenElement;
- button.style.opacity = isFullscreen ? "0" : "1";
- button.style.pointerEvents = isFullscreen ? "none" : "auto";
- }
-
- document.addEventListener("fullscreenchange", handleFullscreenChange);
- document.addEventListener("webkitfullscreenchange", handleFullscreenChange);
- }
-
- // Initialize the font change functionality
- addFontChangeButton();
- })();