diff --git a/index.html b/index.html index cfc3c50..fa6a388 100644 --- a/index.html +++ b/index.html @@ -22,7 +22,7 @@
-
CONNECTING...
+
CONNECTING
@@ -92,7 +92,10 @@
-
Downloading...
+
+ +
Downloading
+
diff --git a/renderer.js b/renderer.js index df621a9..5c2230c 100644 --- a/renderer.js +++ b/renderer.js @@ -1125,7 +1125,11 @@ async function fetchGitHubData() { const offlineInd = document.getElementById('offline-indicator'); if (loader) loader.style.display = 'flex'; - if (loaderText) loaderText.textContent = "SYNCING: " + repo; + if (loaderText) { + const loaderLabel = document.getElementById('loader-text-label'); + if (loaderLabel) loaderLabel.textContent = "SYNCING: " + repo; + else loaderText.textContent = "SYNCING: " + repo; + } const hideLoader = () => { if (loader) { @@ -1416,8 +1420,29 @@ function setProcessingState(active) { function updateProgress(percent, text) { const bar = document.getElementById('progress-bar-fill'); if (bar) bar.style.width = percent + "%"; + + const label = document.getElementById('progress-text-label'); + const dots = document.getElementById('progress-dots'); + const suffix = document.getElementById('progress-text-suffix'); const txt = document.getElementById('progress-text'); - if (text && txt) txt.textContent = text; + + if (!text) return; + + if (label && dots && suffix) { + const match = text.match(/^(Downloading)(?:\.{0,3})?(.*)$/i); + if (match) { + label.textContent = match[1]; + suffix.textContent = match[2] || ''; + dots.classList.add('animate'); + return; + } + label.textContent = text; + suffix.textContent = ''; + dots.classList.remove('animate'); + return; + } + + if (txt) txt.textContent = text; } async function handleElectronFlow(url) { diff --git a/style.css b/style.css index bd8aabc..07ae620 100644 --- a/style.css +++ b/style.css @@ -568,12 +568,71 @@ body.steamdeck-mode .sidebar { transition: width 0.2s ease-out; } +.progress-text-wrap { + display: flex; + align-items: center; + justify-content: flex-start; + gap: 8px; + margin-bottom: 6px; +} + +.progress-spinner { + width: 12px; + height: 12px; + border-width: 2px; + border-color: #333; + border-top-color: var(--mc-progress-fill); + margin: 0; + flex-shrink: 0; + animation-duration: 1s; +} + .progress-text { color: #fff; font-size: 20px; text-shadow: 2px 2px 0 #000; - margin-bottom: 6px; - text-align: center; + text-align: left; + display: inline-flex; + align-items: center; +} + +.loading-dots { + display: inline-flex; + width: 1.8em; + justify-content: flex-start; +} + +.loading-dots span { + visibility: hidden; +} + +.loading-dots.animate span:nth-child(1) { + animation: dotCycle1 1.1s steps(1, end) infinite; +} + +.loading-dots.animate span:nth-child(2) { + animation: dotCycle2 1.1s steps(1, end) infinite; +} + +.loading-dots.animate span:nth-child(3) { + animation: dotCycle3 1.1s steps(1, end) infinite; +} + +@keyframes dotCycle1 { + 0%, 49% { visibility: hidden; } + 50%, 100% { visibility: visible; } +} + +@keyframes dotCycle2 { + 0%, 32% { visibility: hidden; } + 33%, 66% { visibility: visible; } + 67%, 100% { visibility: hidden; } +} + +@keyframes dotCycle3 { + 0%, 16% { visibility: hidden; } + 17%, 82% { visibility: visible; } + 83%, 100% { visibility: hidden; } } .modal-overlay { @@ -803,12 +862,18 @@ body.steamdeck-mode .sidebar { background: rgba(0,0,0,0.8); } + .loader-content { position: relative; z-index: 1; text-align: center; } +#loader-text { + display: inline-flex; + align-items: center; +} + .loader-spinner { width: 80px; height: 80px;