diff --git a/package-lock.json b/package-lock.json
index a0dd525..e0686c7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7,6 +7,7 @@
"": {
"name": "nodecast-tv",
"version": "1.0.0",
+ "license": "GPL-3.0-only",
"dependencies": {
"express": "^4.18.2",
"xml2js": "^0.6.2"
@@ -856,4 +857,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/public/css/main.css b/public/css/main.css
index 4526496..209f4db 100644
--- a/public/css/main.css
+++ b/public/css/main.css
@@ -2021,6 +2021,12 @@ kbd {
color: var(--color-warning);
}
-.icon.text-error {
- color: var(--color-error);
+/* Animation Utilities */
+@keyframes spin {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+}
+
+.spin {
+ animation: spin 1s linear infinite;
}
\ No newline at end of file
diff --git a/public/js/components/SourceManager.js b/public/js/components/SourceManager.js
index 8f3d144..1e4232c 100644
--- a/public/js/components/SourceManager.js
+++ b/public/js/components/SourceManager.js
@@ -62,10 +62,10 @@ class SourceManager {
${source.url}
-
-
+
+
@@ -294,7 +294,8 @@ class SourceManager {
const btn = document.querySelector(`.source-item[data-id="${id}"] [data-action="refresh"]`);
if (btn) {
btn.disabled = true;
- btn.innerHTML = '
';
+ const icon = btn.querySelector('.icon');
+ if (icon) icon.classList.add('spin');
}
// Clear cache for this source first
@@ -322,7 +323,8 @@ class SourceManager {
if (btn) {
btn.disabled = false;
- btn.innerHTML = Icons.play;
+ const icon = btn.querySelector('.icon');
+ if (icon) icon.classList.remove('spin');
}
} catch (err) {
console.error('Error refreshing source:', err);
diff --git a/public/js/icons.js b/public/js/icons.js
index b7dd72b..bbaab05 100644
--- a/public/js/icons.js
+++ b/public/js/icons.js
@@ -21,6 +21,10 @@ const Icons = {
chevronRight: `
`,
expandAll: `
`, // Unfold More
collapseAll: `
`, // Unfold Less
+ refresh: `
`,
+ link: `
`,
+ check: `
`,
+ circle: `
`,
close: `
`,
};