Neon Hydrogen

A modification for Infinite Craft that adds neon-looking elements. Based on the Hydrogen theme by LofiHD.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Neon Hydrogen
// @namespace    N/A
// @version      1.1.0
// @description  A modification for Infinite Craft that adds neon-looking elements. Based on the Hydrogen theme by LofiHD.
// @author       coolkase
// @match        https://neal.fun/infinite-craft/*
// @icon         https://i.imgur.com/9wzoOH4.png
// @grant        none
// @license      GPL2
// ==/UserScript==

class Toast
{
    constructor(defaultTimeoutMiliseconds)
    {
        this.timeout = defaultTimeoutMiliseconds
        const _style = `

        #toast
        {
            left: 0px;
            top: 20px;
            right: 0px;
            width: 100%;
            z-index: 20;
            height: 100%;
            color: white;
            padding: 15px;
            font-size: 18px;
            max-width: 450px;
            max-height: 60px;
            margin-left: auto;
            visibility: hidden;
            margin-right: auto;
            position: absolute;
            border-radius: 16px;
            text-align: center left;
            border: 2px solid #1F79FF;
            backdrop-filter: blur(6px);
            background: rgba(38, 125, 255, 0.5);
            box-shadow: 0px 0px 64px 4px rgba(0,0,0,0.75);
            -moz-box-shadow: 0px 0px 64px 4px rgba(0,0,0,0.75);
            -webkit-box-shadow: 0px 0px 64px 4px rgba(0,0,0,0.75);
            text-shadow: 0px 0px 12px rgba(0, 0, 0, 1), 0px 0px 6px rgba(0, 0, 0, 0.75);
        }

        #toast.show
        {
            visibility: visible;
            animation: fadein 0.5s, fadeout 0.5s 2.5s forwards;
            -webkit-animation: fadein 0.5s, fadeout 0.5s 2.5s forwards;
        }

        @keyframes fadein
        {
            from
            {
                transform: translateY(20px);
                opacity: 0%;
            }

            to
            {
                transform: translateY(0px);
                opacity: 100%;
            }
        }

        @keyframes fadeout
        {
            from
            {
                transform: translateY(0px);
                opacity: 100%;
            }

            to
            {
                transform: translateY(20px);
                opacity: 0%;
            }
        }

        #toast.success
        {
            border: 2px solid #01E17B;
            background: rgba(0, 237, 81, 0.5);
        }

        #toast.error
        {
            border: 2px solid #F04349;
            background: rgba(240, 66, 72, 0.5);
        }

        #toast.warning
        {
            border: 2px solid #FFD21F;
            background: rgba(255, 212, 38, 0.5);
        }

        @keyframes background-pan
        {
            from
            {
                background-position: 0% center;
            }

            to
            {
                background-position: -200% center;
            }
        }

        #toast.top
        {
            top: 20px;
            bottom: auto;
        }

        #toast.bottom
        {
            top: auto;
            bottom: 20px;
        }

        #toast.right
        {
            left: auto;
            right: 40px;
        }

        #toast.left
        {
            left: 20px;
            right: auto;
        }

        `

        document.head.insertAdjacentHTML('beforeend', `<style>${_style}</style>`)
        document.body.insertAdjacentHTML('beforeend', `<div id='toast'></div>`)
    }

    pop(toastMessage, toastPosition, toastType)
    {
        setTimeout(() => {
            const toast = document.getElementById('toast')
            const toastClassName = ` show ${toastPosition} ${toastType}`

            toast.innerHTML = toastMessage
            toast.className += toastClassName

            setTimeout(() => {toast.className = toast.className.replace(toastClassName, '')}, this.timeout)
        }, 200)
    }
}

const ToastLibrary = new Toast(3000)

const themes = {
    NeonHydrogen: `
        @import url('https://fonts.googleapis.com/css2?family=Tilt+Neon');


        * {
            font-family: Tilt Neon, sans-serif;
        }

        body
        {
            overflow: hidden !important;
            -ms-overflow-style: none !important;
        }

        .container
        {
            background-color: #13181D !important;
        }

        .items
        {
            background-color: #070C10 !important;
            align-items: center !important;
            display: ruby-text !important;
            z-index: 501 !important;
        }

        .reset
        {
            color: white !important;
        }

        .item
        {
            background: #070C10 !important;
            border-radius: 25px !important;
            -webkit-box-shadow: 0px 0px 48px 6px rgba(0,0,0,0.75) !important;
            -moz-box-shadow: 0px 0px 48px 6px rgba(0,0,0,0.75) !important;
            box-shadow: 0px 0px 48px 6px rgba(0,0,0,0.75) !important;
            color: white !important;
            transition: border-radius 400ms ease-in-out, background 400ms ease-in-out, scale 200ms ease-in-out, backdrop-filter 400ms ease-in-out !important;
            border: 2px solid #6e1717 !important;
            font-family: Tilt Neon, sans-serif;
        }

        .item-discovered
        {
            background: #070C10 !important;
            border: 2px solid #8c6200 !important;
            border-radius: 25px !important;
            -webkit-box-shadow: 0px 0px 64px 4px rgba(245, 159, 0,0.5) !important;
            -moz-box-shadow: 0px 0px 64px 4px rgba(245, 159, 0,0.25) !important;
            box-shadow: 0px 0px 64px 4px rgba(245, 159, 0,0.25) !important;
            color: white !important;
            transition: border-radius 400ms ease-in-out, background 400ms ease-in-out, scale 200ms ease-in-out, backdrop-filter 400ms ease-in-out !important;
        }

        .item:has(.instance-discovered-text)
        {
            background: #070C10 !important;
            border-radius: 25px !important;
            -webkit-box-shadow: 0px 0px 48px 6px rgba(245, 159, 0, 1) !important;
            -moz-box-shadow: 0px 0px 48px 6px rgba(245, 159, 0, 1) !important;
            border: 2px solid #f59f00 !important;
            box-shadow: 0px 0px 64px 4px rgba(255,255,0,0.5) !important;
            color: white !important;
            transition: border-radius 400ms ease-in-out, background 400ms ease-in-out, scale 200ms ease-in-out, backdrop-filter 400ms ease-in-out !important;
        }

        .instance
        {
            -webkit-box-shadow: 0px 0px 48px 6px rgba(255,0,0,0.5) !important;
            -moz-box-shadow: 0px 0px 48px 6px rgba(255,0,0,0.5) !important;
            border: 2px solid #e03131 !important;
        }

        .instance:has(.instance-discovered-text):hover
        {
            background: rgba(38, 38, 17, .5) !important;
            backdrop-filter: blur(8px) !important;
            scale: 1.05 1.05 !important;
        }


        .item:hover
        {
            background: rgba(44, 10, 17, .5) !important;
            backdrop-filter: blur(8px) !important;
            scale: 1.05 1.05 !important;
        }

        .item-discovered:hover
        {
            background: rgba(38, 38, 17, .5) !important;
            backdrop-filter: blur(8px) !important;
            scale: 1.05 1.05 !important;
        }

        .sidebar-sorting-item
        {
            color: white !important;
            background: #020508 !important;
            -webkit-box-shadow: 0px 0px 48px 6px rgba(0,0,0,0.75) !important;
            -moz-box-shadow: 0px 0px 48px 6px rgba(0,0,0,0.75) !important;
            box-shadow: 0px 0px 48px 6px rgba(0,0,0,0.75) !important;
        }

        .sidebar-input-close
        {
            filter: invert(1) !important;
        }

        .sidebar-input
        {
            font-family: Tilt Neon, sans-serif !important;
            background-color: #020508 !important;
            color: white !important;
            -webkit-box-shadow: 0px 0px 48px 6px rgba(0,187,0.33) !important;
            -moz-box-shadow: 0px 0px 48px 6px rgba(0,187,0,0.33) !important;
            box-shadow: 0px 0px 48px 6px rgba(0,187,0,0.33) !important;
        }

        div .sidebar-input {
            border: 1px solid #0b0 !important;
        }

        .sidebar-input-close
        {
            filter: invert(1) !important;
            visibility: hidden !important;
        }

        .sidebar-input::after
        {
            visibility: hidden !important;
            border-color: #800000 !important;
        }

        .empty-sidebar-icon
        {
            filter: invert(1) !important;
        }

        .empty-sidebar
        {
            color: white !important;
        }

        .instance-discovered-text
        {
            -webkit-animation: background-pan 3s linear infinite !important;
            animation: background-pan 3s linear infinite !important;
            background: linear-gradient(
                to right,
                #e67700,
                #f59f00,
                #fcc419,
                #e67700
            ) !important;
            -webkit-background-clip: text !important;
            -webkit-text-fill-color: transparent !important;
            white-space: nowrap !important;
            z-index: 200;
            font-weight: bold !important;
            font-size: 16px !important;
            width: 200px !important;
            background-size: 200% !important;
        }

        .instance-discovered-emoji
        {
            filter: brightness(0) invert(1) sepia(1) hue-rotate(-60deg) saturate(10000%) grayscale(0) contrast(1) !important;
        }

        .sidebar-sorting-icon
        {
            filter: invert(1) !important;
        }

        .instruction-icon
        {
            filter: invert(1) !important;
        }

        .instruction
        {
            color: white !important;
        }

        .particles,
        .logo,
        .clear,
        .sound,
        .site-title,
        .coffee
        {
            filter: invert(1) !important;
        }

        .logo, .version {
            z-index: 500;
        }

        .sidebar
        {
            border-left: 1px solid #800000 !important;
            -webkit-box-shadow: 0px 0px 48px 6px rgba(255,0,0,0.5) !important;
            -moz-box-shadow: 0px 0px 48px 6px rgba(255,0,0,0.5) !important;
            box-shadow: 0px 0px 48px 6px rgba(255,0,0,0.5) !important;
            -ms-overflow-style: none !important;
            border-color: #800000 !important;
        }

        div.sidebar-sorting {
            border-top: none;
            grid-gap: 0 !important;
        }

        .sidebar-discoveries.sidebar-sorting-item {
            border-left: none !important;
        }

        .settings-content
        {
            background: #020508 !important;
            color: white !important;
            -webkit-box-shadow: 0px 0px 48px 6px rgba(0,0,187,0.5) !important;
            -moz-box-shadow: 0px 0px 48px 6px rgba(0,0,187,0.5) !important;
            box-shadow: 0px 0px 48px 6px rgba(0,0,187,0.5) !important;
            z-index: 200 !important;
            width: 184px !important;
        }

        .settings-details {
            background-color: #020508 !important;
            border-color: #00e !important;
            -webkit-box-shadow: 0px 0px 48px 6px rgba(0,0,187,0.75) !important;
            -moz-box-shadow: 0px 0px 48px 6px rgba(0,0,187,0.75) !important;
            box-shadow: 0px 0px 48px 6px rgba(0,0,187,0.75) !important;
        }

        div .settings-content {
            border-color: #00c;
            -webkit-box-shadow: 0px 0px 48px 6px rgba(0,0,187,0.5) !important;
            -moz-box-shadow: 0px 0px 48px 6px rgba(0,0,187,0.5) !important;
            box-shadow: 0px 0px 48px 6px rgba(0,0,187,0.5) !important;
            clip-path: polygon(0 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%);
        }

        .setting
        {
            text-align: left !important;
            display: block !important;
            border-color: #00c !important;
        }

        .setting > img
        {
            position: absolute !important;
            right: 16px !important;
        }

        .sidebar-controls::after
        {
            background: linear-gradient(180deg,hsla(0,0%,100%,0), hsla(234, 96%, 11%, 0.125)) !important;
        }

        .sidebar-header
        {
            background: #020508 !important;
            color: white !important;
            -webkit-box-shadow: 0px 0px 48px 6px rgba(0,0,0,0.75) !important;
            -moz-box-shadow: 0px 0px 48px 6px rgba(0,0,0,0.75) !important;
            box-shadow: 0px 0px 48px 6px rgba(0,0,0,0.75) !important;
            border-color: #800000 !important;
             z-index: -500;
            /* overflow: hidden; */
        }

        .container.dark-mode {
            --border-color: #ff0000 !important;
        }

    `,
}

class ThemeManager
{
    constructor()
    {
        this.currentTheme = themes.NeonHydrogen
        this.themeChangeAnimation = `

            .particles,
            .logo,
            .clear,
            .sound,
            .site-title,
            .coffee,
            .container,
            .items,
            .sidebar-input,
            .sidebar,
            .sidebar-sorting-item,
            .reset,
            .instruction,
            .sidebar-input-close
            {
                transition: all 400ms ease-in-out;
            }

            :root
            {
                transition: all 400ms ease-in-out;
            }

            .item
            {
                transition: border-radius 400ms ease-in-out,
                background 400ms ease-in-out,
                color 400ms ease-in-out;
            }

        `

        document.head.insertAdjacentHTML('beforeend', `<style>${this.themeChangeAnimation}</style>`)
    }

    change(themeId)
    {
        const theme = themes[themeId]
        if (!theme)
        {
            ToastLibrary.pop(`Attempt to apply invalid theme '${themeId}'.`, 'top right', 'error')
            return
        }

        document.head.insertAdjacentHTML('beforeend', `<style>${theme}</style>`)

        ToastLibrary.pop(`Theme '${themeId}' applied.\nThanks for using!`, 'top right', 'success')
    }
}

const Theme = new ThemeManager

setTimeout(() => {Theme.change('NeonHydrogen')}, 200)