From 5f21285d5a7b5ffc53ee98f3a54626fbd8ec4f49 Mon Sep 17 00:00:00 2001 From: meowarex Date: Tue, 3 Jun 2025 20:42:32 +1000 Subject: [PATCH 1/4] Cleanup Plugin Names --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ac8e8dc..9fe9a1a 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ A collection of Luna plugins for Tidal, ported from Neptune framework. ## Plugins -### 🎨 OLED Theme Luna +### 🎨 OLED Theme **Location:** `plugins/oled-theme-luna/` A dark OLED-friendly theme plugin that transforms Tidal Luna's appearance. @@ -15,7 +15,7 @@ A dark OLED-friendly theme plugin that transforms Tidal Luna's appearance. - Reduces battery consumption on OLED displays.. i guess <3 - Modern, sleek dark interface -### 🎵 Radiant Lyrics Luna +### 🎵 Radiant Lyrics **Location:** `plugins/radiant-lyrics-luna/` A radiant and beautiful lyrics view for TIDAL with dynamic visual effects. @@ -24,7 +24,7 @@ A radiant and beautiful lyrics view for TIDAL with dynamic visual effects. - Dynamic album art backgrounds with blur and rotation effects - Glowing Animated Lyrics with clean scrolling -### 📋 Copy Lyrics Luna +### 📋 Copy Lyrics **Location:** `plugins/copy-lyrics-luna/` Allows users to copy song lyrics by selecting them directly in the interface. From 6ef38c5da27de3e831096a4a7204a53dbf7614a3 Mon Sep 17 00:00:00 2001 From: meowarex Date: Wed, 4 Jun 2025 18:54:54 +1000 Subject: [PATCH 2/4] Added Experimental Cover Everywhere Setting --- plugins/radiant-lyrics-luna/src/Settings.tsx | 15 ++ plugins/radiant-lyrics-luna/src/index.ts | 184 ++++++++++++++++++- 2 files changed, 197 insertions(+), 2 deletions(-) diff --git a/plugins/radiant-lyrics-luna/src/Settings.tsx b/plugins/radiant-lyrics-luna/src/Settings.tsx index 793a4e4..2a3eabb 100644 --- a/plugins/radiant-lyrics-luna/src/Settings.tsx +++ b/plugins/radiant-lyrics-luna/src/Settings.tsx @@ -6,12 +6,14 @@ export const settings = await ReactiveStore.getPluginStorage("RadiantLyrics", { hideUIEnabled: true, playerBarVisible: true, lyricsGlowEnabled: true, + spinningCoverEverywhere: false, }); export const Settings = () => { const [hideUIEnabled, setHideUIEnabled] = React.useState(settings.hideUIEnabled); const [playerBarVisible, setPlayerBarVisible] = React.useState(settings.playerBarVisible); const [lyricsGlowEnabled, setLyricsGlowEnabled] = React.useState(settings.lyricsGlowEnabled); + const [spinningCoverEverywhere, setSpinningCoverEverywhere] = React.useState(settings.spinningCoverEverywhere); return ( @@ -28,6 +30,19 @@ export const Settings = () => { } }} /> + { + console.log("Spinning Cover Everywhere:", checked ? "enabled" : "disabled"); + setSpinningCoverEverywhere((settings.spinningCoverEverywhere = checked)); + // Update styles immediately when setting changes + if ((window as any).updateRadiantLyricsGlobalBackground) { + (window as any).updateRadiantLyricsGlobalBackground(); + } + }} + /> img.remove()); + const existingBlackBg = appContainer.querySelector('.global-spinning-black-bg'); + if (existingBlackBg) existingBlackBg.remove(); + + // Add a solid black background behind the spinning images + const blackBg = document.createElement('div'); + blackBg.className = 'global-spinning-black-bg'; + blackBg.style.position = 'fixed'; + blackBg.style.left = '0'; + blackBg.style.top = '0'; + blackBg.style.width = '100vw'; + blackBg.style.height = '100vh'; + blackBg.style.background = '#000'; + blackBg.style.zIndex = '-2'; + blackBg.style.pointerEvents = 'none'; + appContainer.appendChild(blackBg); + + // Create and append spinning background images to the app container + const globalImg1 = document.createElement('img'); + globalImg1.src = albumImageSrc; + globalImg1.className = 'global-spinning-image'; + globalImg1.style.position = 'fixed'; + globalImg1.style.left = '50%'; + globalImg1.style.top = '50%'; + globalImg1.style.transform = 'translate(-50%, -50%)'; + globalImg1.style.width = '100vw'; + globalImg1.style.height = '100vh'; + globalImg1.style.objectFit = 'cover'; + globalImg1.style.zIndex = '-1'; + globalImg1.style.filter = 'blur(80px) brightness(0.3) contrast(1.4) saturate(1.3)'; + globalImg1.style.opacity = '1'; + globalImg1.style.animation = 'spinGlobal 45s linear infinite'; + globalImg1.style.animationDelay = '0s'; + appContainer.appendChild(globalImg1); + + const globalImg2 = document.createElement('img'); + globalImg2.src = albumImageSrc; + globalImg2.className = 'global-spinning-image'; + globalImg2.style.position = 'fixed'; + globalImg2.style.left = '50%'; + globalImg2.style.top = '50%'; + globalImg2.style.transform = 'translate(-50%, -50%)'; + globalImg2.style.width = '100vw'; + globalImg2.style.height = '100vh'; + globalImg2.style.objectFit = 'cover'; + globalImg2.style.zIndex = '-1'; + globalImg2.style.filter = 'blur(80px) brightness(0.25) contrast(1.4) saturate(1.3)'; + globalImg2.style.opacity = '1'; + globalImg2.style.animation = 'spinGlobal 45s linear infinite reverse'; + globalImg2.style.animationDelay = '22.5s'; + appContainer.appendChild(globalImg2); + + // Add a semi-transparent overlay to enhance visibility + const overlay = document.createElement('div'); + overlay.className = 'global-spinning-overlay'; + overlay.style.position = 'fixed'; + overlay.style.left = '0'; + overlay.style.top = '0'; + overlay.style.width = '100vw'; + overlay.style.height = '100vh'; + overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.3)'; + overlay.style.zIndex = '-1'; + overlay.style.pointerEvents = 'none'; + appContainer.appendChild(overlay); + + // Add keyframe animation for global spinning if it doesn't exist + if (!document.querySelector('#spinGlobalAnimation')) { + const styleSheet = document.createElement('style'); + styleSheet.id = 'spinGlobalAnimation'; + styleSheet.textContent = ` + @keyframes spinGlobal { + from { transform: translate(-50%, -50%) rotate(0deg); } + to { transform: translate(-50%, -50%) rotate(360deg); } + } + + /* Make background visible through all containers */ + body, + #wimp, + main, + [class^="_sidebarWrapper"], + [class^="_mainContainer"], + [class*="smallHeader"], + [data-test="main-layout-sidebar-wrapper"], + [data-test="main-layout-header"], + [data-test="feed-sidebar"], + [data-test="stream-metadata"], + [data-test="footer-player"] { + background: unset !important; + } + + /* Make sidebar and player bar semi-transparent */ + [data-test="footer-player"], + [data-test="main-layout-sidebar-wrapper"], + [class^="_bar"], + [class^="_sidebarItem"]:hover { + background-color: rgba(0, 0, 0, 0.3) !important; + backdrop-filter: blur(10px) !important; + -webkit-backdrop-filter: blur(10px) !important; + } + + /* Remove bottom gradient */ + [class^="_bottomGradient"] { + display: none !important; + } + + /* Make sure the background is visible through all containers */ + [class^="_sidebarWrapper"], + [class^="_mainContainer"], + [class*="smallHeader"], + [data-test="main-layout-sidebar-wrapper"], + [data-test="main-layout-header"], + [data-test="feed-sidebar"], + [data-test="stream-metadata"], + [data-test="footer-player"] { + background: unset !important; + } + `; + document.head.appendChild(styleSheet); + } +}; + +// Function to clean up global spinning background +const cleanUpGlobalSpinningBackground = function(): void { + const globalImages = document.getElementsByClassName("global-spinning-image"); + Array.from(globalImages).forEach((element) => { + element.remove(); + }); + + // Also remove the overlay + const overlay = document.querySelector('.global-spinning-overlay'); + if (overlay && overlay.parentNode) { + overlay.parentNode.removeChild(overlay); + } + // Also remove the black bg + const blackBg = document.querySelector('.global-spinning-black-bg'); + if (blackBg && blackBg.parentNode) { + blackBg.parentNode.removeChild(blackBg); + } + + currentGlobalTrackSrc = null; // Reset current global track source +}; + +// Function to update global background when settings change +const updateRadiantLyricsGlobalBackground = function(): void { + if (settings.spinningCoverEverywhere && currentTrackSrc) { + applyGlobalSpinningBackground(currentTrackSrc); + } else { + cleanUpGlobalSpinningBackground(); + } +}; + +// Make these functions available globally so Settings can call them (window as any).updateRadiantLyricsStyles = updateRadiantLyricsStyles; +(window as any).updateRadiantLyricsGlobalBackground = updateRadiantLyricsGlobalBackground; const toggleRadiantLyrics = function(): void { // Toggle the state first @@ -338,6 +501,12 @@ const onTrackChanged = function (method: number = 0): void { currentTrackSrc = albumImageSrc; //trace.msg.log(`Track changed, updating background: ${albumImageSrc}`); - Accidentally left this in Prod... + // Apply global spinning background if enabled + if (settings.spinningCoverEverywhere && albumImageSrc !== currentGlobalTrackSrc) { + currentGlobalTrackSrc = albumImageSrc; + applyGlobalSpinningBackground(albumImageSrc); + } + // Setting background to the *="nowPlayingContainer" element const nowPlayingContainerElement = document.querySelector('[class*="_nowPlayingContainer"]') as HTMLElement; if (nowPlayingContainerElement) { @@ -399,6 +568,9 @@ const cleanUpDynamicArt = function (): void { element.remove(); }); currentTrackSrc = null; // Reset current track source + + // Also clean up global spinning backgrounds + cleanUpGlobalSpinningBackground(); }; // Initialize the button creation and observers @@ -422,9 +594,17 @@ unloads.add(() => { unhideButton.parentNode.removeChild(unhideButton); } - // Clean up spin animation + // Clean up spin animations const spinAnimationStyle = document.querySelector('#spinAnimation'); if (spinAnimationStyle && spinAnimationStyle.parentNode) { spinAnimationStyle.parentNode.removeChild(spinAnimationStyle); } + + const spinGlobalAnimationStyle = document.querySelector('#spinGlobalAnimation'); + if (spinGlobalAnimationStyle && spinGlobalAnimationStyle.parentNode) { + spinGlobalAnimationStyle.parentNode.removeChild(spinGlobalAnimationStyle); + } + + // Clean up global spinning backgrounds + cleanUpGlobalSpinningBackground(); }); \ No newline at end of file From 2d7c4dd2e62b6beea767e6175f526e9448e411f6 Mon Sep 17 00:00:00 2001 From: meowarex Date: Wed, 4 Jun 2025 19:14:41 +1000 Subject: [PATCH 3/4] Improved Cover Everywhere --- plugins/radiant-lyrics-luna/src/Settings.tsx | 2 +- plugins/radiant-lyrics-luna/src/index.ts | 34 +++++++------------- 2 files changed, 12 insertions(+), 24 deletions(-) diff --git a/plugins/radiant-lyrics-luna/src/Settings.tsx b/plugins/radiant-lyrics-luna/src/Settings.tsx index 2a3eabb..9efc2fe 100644 --- a/plugins/radiant-lyrics-luna/src/Settings.tsx +++ b/plugins/radiant-lyrics-luna/src/Settings.tsx @@ -31,7 +31,7 @@ export const Settings = () => { }} /> { diff --git a/plugins/radiant-lyrics-luna/src/index.ts b/plugins/radiant-lyrics-luna/src/index.ts index a0ac26c..a16b2b3 100644 --- a/plugins/radiant-lyrics-luna/src/index.ts +++ b/plugins/radiant-lyrics-luna/src/index.ts @@ -82,6 +82,9 @@ const applyGlobalSpinningBackground = function(albumImageSrc: string): void { existingGlobalImages.forEach(img => img.remove()); const existingBlackBg = appContainer.querySelector('.global-spinning-black-bg'); if (existingBlackBg) existingBlackBg.remove(); + // Remove overlay if it exists (for safety) + const existingOverlay = appContainer.querySelector('.global-spinning-overlay'); + if (existingOverlay) existingOverlay.remove(); // Add a solid black background behind the spinning images const blackBg = document.createElement('div'); @@ -104,11 +107,11 @@ const applyGlobalSpinningBackground = function(albumImageSrc: string): void { globalImg1.style.left = '50%'; globalImg1.style.top = '50%'; globalImg1.style.transform = 'translate(-50%, -50%)'; - globalImg1.style.width = '100vw'; - globalImg1.style.height = '100vh'; + globalImg1.style.width = '150vw'; + globalImg1.style.height = '150vh'; globalImg1.style.objectFit = 'cover'; globalImg1.style.zIndex = '-1'; - globalImg1.style.filter = 'blur(80px) brightness(0.3) contrast(1.4) saturate(1.3)'; + globalImg1.style.filter = 'blur(100px) brightness(0.4) contrast(1.2) saturate(1)'; globalImg1.style.opacity = '1'; globalImg1.style.animation = 'spinGlobal 45s linear infinite'; globalImg1.style.animationDelay = '0s'; @@ -121,29 +124,16 @@ const applyGlobalSpinningBackground = function(albumImageSrc: string): void { globalImg2.style.left = '50%'; globalImg2.style.top = '50%'; globalImg2.style.transform = 'translate(-50%, -50%)'; - globalImg2.style.width = '100vw'; - globalImg2.style.height = '100vh'; + globalImg2.style.width = '150vw'; + globalImg2.style.height = '150vh'; globalImg2.style.objectFit = 'cover'; globalImg2.style.zIndex = '-1'; - globalImg2.style.filter = 'blur(80px) brightness(0.25) contrast(1.4) saturate(1.3)'; + globalImg2.style.filter = 'blur(100px) brightness(0.4) contrast(1.2) saturate(1)'; globalImg2.style.opacity = '1'; - globalImg2.style.animation = 'spinGlobal 45s linear infinite reverse'; - globalImg2.style.animationDelay = '22.5s'; + globalImg2.style.animation = 'spinGlobal 45s linear infinite'; + globalImg2.style.animationDelay = '0s'; appContainer.appendChild(globalImg2); - // Add a semi-transparent overlay to enhance visibility - const overlay = document.createElement('div'); - overlay.className = 'global-spinning-overlay'; - overlay.style.position = 'fixed'; - overlay.style.left = '0'; - overlay.style.top = '0'; - overlay.style.width = '100vw'; - overlay.style.height = '100vh'; - overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.3)'; - overlay.style.zIndex = '-1'; - overlay.style.pointerEvents = 'none'; - appContainer.appendChild(overlay); - // Add keyframe animation for global spinning if it doesn't exist if (!document.querySelector('#spinGlobalAnimation')) { const styleSheet = document.createElement('style'); @@ -206,7 +196,6 @@ const cleanUpGlobalSpinningBackground = function(): void { Array.from(globalImages).forEach((element) => { element.remove(); }); - // Also remove the overlay const overlay = document.querySelector('.global-spinning-overlay'); if (overlay && overlay.parentNode) { @@ -217,7 +206,6 @@ const cleanUpGlobalSpinningBackground = function(): void { if (blackBg && blackBg.parentNode) { blackBg.parentNode.removeChild(blackBg); } - currentGlobalTrackSrc = null; // Reset current global track source }; From eed5505464f0e0543d02297e69a0c835fd96f6e8 Mon Sep 17 00:00:00 2001 From: meowarex Date: Wed, 4 Jun 2025 19:49:25 +1000 Subject: [PATCH 4/4] Refactored Cover Everywhere Logic --- .../src/cover-everywhere.css | 61 +++++++++ plugins/radiant-lyrics-luna/src/index.ts | 127 +++--------------- 2 files changed, 76 insertions(+), 112 deletions(-) create mode 100644 plugins/radiant-lyrics-luna/src/cover-everywhere.css diff --git a/plugins/radiant-lyrics-luna/src/cover-everywhere.css b/plugins/radiant-lyrics-luna/src/cover-everywhere.css new file mode 100644 index 0000000..9817156 --- /dev/null +++ b/plugins/radiant-lyrics-luna/src/cover-everywhere.css @@ -0,0 +1,61 @@ +/* Global Spinning Background Styles */ + +.global-spinning-black-bg { + position: fixed; + left: 0; + top: 0; + width: 100vw; + height: 100vh; + background: #000; + z-index: -2; + pointer-events: none; +} + +.global-spinning-image { + position: fixed; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + width: 150vw; + height: 150vh; + object-fit: cover; + z-index: -1; + filter: blur(100px) brightness(0.4) contrast(1.2) saturate(1); + opacity: 1; + animation: spinGlobal 45s linear infinite; +} + +@keyframes spinGlobal { + from { transform: translate(-50%, -50%) rotate(0deg); } + to { transform: translate(-50%, -50%) rotate(360deg); } +} + +/* Make background visible through all containers */ +body, +#wimp, +main, +[class^="_sidebarWrapper"], +[class^="_mainContainer"], +[class*="smallHeader"], +[data-test="main-layout-sidebar-wrapper"], +[data-test="main-layout-header"], +[data-test="feed-sidebar"], +[data-test="stream-metadata"], +[data-test="footer-player"] { + background: unset !important; +} + +/* Make sidebar and player bar semi-transparent */ +[data-test="footer-player"], +[data-test="main-layout-sidebar-wrapper"], +[class^="_bar"], +[class^="_sidebarItem"]:hover { + background-color: rgba(0, 0, 0, 0.3) !important; + backdrop-filter: blur(10px) !important; + -webkit-backdrop-filter: blur(10px) !important; +} + +/* Remove bottom gradient */ +[class^="_bottomGradient"] { + display: none !important; +} \ No newline at end of file diff --git a/plugins/radiant-lyrics-luna/src/index.ts b/plugins/radiant-lyrics-luna/src/index.ts index a16b2b3..e538342 100644 --- a/plugins/radiant-lyrics-luna/src/index.ts +++ b/plugins/radiant-lyrics-luna/src/index.ts @@ -7,6 +7,7 @@ import baseStyles from "file://styles.css?minify"; import separatedLyrics from "file://separated-lyrics.css?minify"; import playerBarHidden from "file://player-bar-hidden.css?minify"; import lyricsGlow from "file://lyrics-glow.css?minify"; +import coverEverywhereCss from "file://cover-everywhere.css?minify"; export const { trace } = Tracer("[Radiant Lyrics]"); export { Settings }; @@ -20,6 +21,9 @@ const baseStyleTag = new StyleTag("RadiantLyrics-base", unloads); const playerBarStyleTag = new StyleTag("RadiantLyrics-player-bar", unloads); const lyricsGlowStyleTag = new StyleTag("RadiantLyrics-lyrics-glow", unloads); +// StyleTag for global spinning background CSS +const globalSpinningBgStyleTag = new StyleTag("RadiantLyrics-global-spinning-bg", unloads, coverEverywhereCss); + // Apply lyrics glow styles if enabled if (settings.lyricsGlowEnabled) { lyricsGlowStyleTag.css = lyricsGlow; @@ -70,123 +74,27 @@ const updateRadiantLyricsStyles = function(): void { }; // Function to apply spinning background to the entire app -const applyGlobalSpinningBackground = function(albumImageSrc: string): void { +const applyGlobalSpinningBackground = (albumImageSrc: string): void => { if (!settings.spinningCoverEverywhere) return; - // Apply background to the main app container const appContainer = document.querySelector('[data-test="main"]') as HTMLElement; if (!appContainer) return; - // Remove existing global background images and black bg if they exist - const existingGlobalImages = appContainer.querySelectorAll('.global-spinning-image'); - existingGlobalImages.forEach(img => img.remove()); - const existingBlackBg = appContainer.querySelector('.global-spinning-black-bg'); - if (existingBlackBg) existingBlackBg.remove(); - // Remove overlay if it exists (for safety) - const existingOverlay = appContainer.querySelector('.global-spinning-overlay'); - if (existingOverlay) existingOverlay.remove(); + // Remove any existing background elements + appContainer.querySelectorAll('.global-spinning-image, .global-spinning-black-bg').forEach(el => el.remove()); - // Add a solid black background behind the spinning images + // Add black background const blackBg = document.createElement('div'); blackBg.className = 'global-spinning-black-bg'; - blackBg.style.position = 'fixed'; - blackBg.style.left = '0'; - blackBg.style.top = '0'; - blackBg.style.width = '100vw'; - blackBg.style.height = '100vh'; - blackBg.style.background = '#000'; - blackBg.style.zIndex = '-2'; - blackBg.style.pointerEvents = 'none'; appContainer.appendChild(blackBg); - // Create and append spinning background images to the app container - const globalImg1 = document.createElement('img'); - globalImg1.src = albumImageSrc; - globalImg1.className = 'global-spinning-image'; - globalImg1.style.position = 'fixed'; - globalImg1.style.left = '50%'; - globalImg1.style.top = '50%'; - globalImg1.style.transform = 'translate(-50%, -50%)'; - globalImg1.style.width = '150vw'; - globalImg1.style.height = '150vh'; - globalImg1.style.objectFit = 'cover'; - globalImg1.style.zIndex = '-1'; - globalImg1.style.filter = 'blur(100px) brightness(0.4) contrast(1.2) saturate(1)'; - globalImg1.style.opacity = '1'; - globalImg1.style.animation = 'spinGlobal 45s linear infinite'; - globalImg1.style.animationDelay = '0s'; - appContainer.appendChild(globalImg1); - - const globalImg2 = document.createElement('img'); - globalImg2.src = albumImageSrc; - globalImg2.className = 'global-spinning-image'; - globalImg2.style.position = 'fixed'; - globalImg2.style.left = '50%'; - globalImg2.style.top = '50%'; - globalImg2.style.transform = 'translate(-50%, -50%)'; - globalImg2.style.width = '150vw'; - globalImg2.style.height = '150vh'; - globalImg2.style.objectFit = 'cover'; - globalImg2.style.zIndex = '-1'; - globalImg2.style.filter = 'blur(100px) brightness(0.4) contrast(1.2) saturate(1)'; - globalImg2.style.opacity = '1'; - globalImg2.style.animation = 'spinGlobal 45s linear infinite'; - globalImg2.style.animationDelay = '0s'; - appContainer.appendChild(globalImg2); - - // Add keyframe animation for global spinning if it doesn't exist - if (!document.querySelector('#spinGlobalAnimation')) { - const styleSheet = document.createElement('style'); - styleSheet.id = 'spinGlobalAnimation'; - styleSheet.textContent = ` - @keyframes spinGlobal { - from { transform: translate(-50%, -50%) rotate(0deg); } - to { transform: translate(-50%, -50%) rotate(360deg); } - } - - /* Make background visible through all containers */ - body, - #wimp, - main, - [class^="_sidebarWrapper"], - [class^="_mainContainer"], - [class*="smallHeader"], - [data-test="main-layout-sidebar-wrapper"], - [data-test="main-layout-header"], - [data-test="feed-sidebar"], - [data-test="stream-metadata"], - [data-test="footer-player"] { - background: unset !important; - } - - /* Make sidebar and player bar semi-transparent */ - [data-test="footer-player"], - [data-test="main-layout-sidebar-wrapper"], - [class^="_bar"], - [class^="_sidebarItem"]:hover { - background-color: rgba(0, 0, 0, 0.3) !important; - backdrop-filter: blur(10px) !important; - -webkit-backdrop-filter: blur(10px) !important; - } - - /* Remove bottom gradient */ - [class^="_bottomGradient"] { - display: none !important; - } - - /* Make sure the background is visible through all containers */ - [class^="_sidebarWrapper"], - [class^="_mainContainer"], - [class*="smallHeader"], - [data-test="main-layout-sidebar-wrapper"], - [data-test="main-layout-header"], - [data-test="feed-sidebar"], - [data-test="stream-metadata"], - [data-test="footer-player"] { - background: unset !important; - } - `; - document.head.appendChild(styleSheet); + // Add two spinning images + for (let i = 0; i < 2; i++) { + const img = document.createElement('img'); + img.src = albumImageSrc; + img.className = 'global-spinning-image'; + img.style.animationDelay = '0s'; + appContainer.appendChild(img); } }; @@ -588,11 +496,6 @@ unloads.add(() => { spinAnimationStyle.parentNode.removeChild(spinAnimationStyle); } - const spinGlobalAnimationStyle = document.querySelector('#spinGlobalAnimation'); - if (spinGlobalAnimationStyle && spinGlobalAnimationStyle.parentNode) { - spinGlobalAnimationStyle.parentNode.removeChild(spinGlobalAnimationStyle); - } - // Clean up global spinning backgrounds cleanUpGlobalSpinningBackground(); }); \ No newline at end of file