diff --git a/.github/listen.md b/.github/listen.md
index 8d149994..7084aed9 100644
--- a/.github/listen.md
+++ b/.github/listen.md
@@ -628,17 +628,16 @@ The smart `cyclelock` system provides reliable cycle state tracking:
3. **State management**: Explicit state fields (like cyclelock) are more reliable than inferring state from timestamps
4. **FOUC prevention**: Hidden elements need explicit JavaScript to make them visible after initialization
5. **Log level optimization**: Move ALL verbose authentication, log streaming, and stats increment messages to DEBUG level to reduce log noise and improve readability. This includes:
- - "Request IP address" messages in `auth.py`
- - "Local Bypass Mode is DISABLED" messages in `auth.py`
- - "Direct IP is a local network IP" messages in `auth.py`
- - "Local network access - Authentication bypassed" messages in `auth.py`
- - "Starting log stream" messages in `web_server.py`
- - "Log stream generator started" messages in `web_server.py`
- - "Client disconnected from log stream" messages in `web_server.py`
- - "Successfully removed client from active log streams" messages in `web_server.py`
- - "Log stream generator finished" messages in `web_server.py`
- - "*** STATS INCREMENT ***" messages in `stats_manager.py`
- - "*** STATS ONLY INCREMENT ***" messages in `stats_manager.py`
- - "*** STATS INCREMENT ***" messages in app-specific files (e.g., `sonarr/missing.py`, `sonarr/upgrade.py`)
- - "Successfully incremented and verified" messages in `stats_manager.py`
+ - Authentication messages: "Local Bypass Mode is DISABLED", "Request IP address", "Direct IP is a local network IP"
+ - Log streaming messages: "Starting log stream", "Client disconnected", "Log stream generator finished"
+ - Stats messages: "STATS ONLY INCREMENT", "STATS INCREMENT", "Successfully incremented and verified", "Successfully wrote stats to file"
+ - "Attempt to get user info failed: Not authenticated" messages in `routes/common.py`
6. **Logger name formatting consistency**: Use lowercase for logger name prefixes in log streaming. Change `name.upper()` to `name.lower()` in `web_server.py` log stream generator to ensure consistent formatting (e.g., "huntarr.hunting" instead of "HUNTARR.HUNTING").
+7. **Sidebar content sizing**: When resizing sidebar elements, reduce all related dimensions proportionally (fonts, padding, margins, icon containers) while preserving key elements like logo icons. For 20% reduction: reduce font-size from 14px to 11px, padding from 12px to 10px, icon wrapper from 38px to 30px, etc. Always maintain visual hierarchy and usability while achieving the desired size reduction.
+8. **Low Usage Mode Indicator Removal**:
+ - Completely removed the visual indicator that appeared when Low Usage Mode was enabled
+ - Modified `showIndicator()` function in `low-usage-mode.js` to not create any DOM elements
+ - Updated `applyLowUsageMode()` function in `new-main.js` to remove indicator creation logic
+ - Removed CSS styles for `#low-usage-mode-indicator` from `low-usage-mode.css`
+ - Low Usage Mode now runs silently without any visual indicator for a cleaner interface
+ - All performance optimizations (animation disabling, timer throttling) still work as intended
diff --git a/frontend/static/css/low-usage-mode.css b/frontend/static/css/low-usage-mode.css
index a626afc8..b4b8dff1 100644
--- a/frontend/static/css/low-usage-mode.css
+++ b/frontend/static/css/low-usage-mode.css
@@ -64,16 +64,3 @@
animation: none !important;
background: var(--bg-secondary) !important;
}
-
-/* Style for the Low Usage Mode indicator */
-#low-usage-mode-indicator {
- display: flex;
- align-items: center;
- gap: 5px;
- font-weight: 500;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
-}
-
-#low-usage-mode-indicator i {
- margin-right: 5px;
-}
diff --git a/frontend/static/js/low-usage-mode.js b/frontend/static/js/low-usage-mode.js
index 3b55ea0e..384778bc 100644
--- a/frontend/static/js/low-usage-mode.js
+++ b/frontend/static/js/low-usage-mode.js
@@ -172,20 +172,11 @@ window.LowUsageMode = (function() {
}
}
- // Create and show indicator when Low Usage Mode is active
+ // Remove indicator creation - Low Usage Mode runs without visual indicator
function showIndicator() {
- // Check if the indicator already exists
- indicator = document.getElementById('low-usage-mode-indicator');
-
- if (!indicator) {
- // Create indicator element
- indicator = document.createElement('div');
- indicator.id = 'low-usage-mode-indicator';
- indicator.innerHTML = ' Low Usage Mode';
- document.body.appendChild(indicator);
- }
-
- indicator.style.display = 'flex';
+ // Low Usage Mode is now active without showing any visual indicator
+ // This provides a cleaner interface while still applying all performance optimizations
+ return;
}
// Hide the Low Usage Mode indicator
diff --git a/frontend/static/js/new-main.js b/frontend/static/js/new-main.js
index 9b01162f..eddb231b 100644
--- a/frontend/static/js/new-main.js
+++ b/frontend/static/js/new-main.js
@@ -3125,39 +3125,14 @@ let huntarrUI = {
// Store the previous state to detect changes
const wasEnabled = document.body.classList.contains('low-usage-mode');
- // Check if the indicator already exists, if not create it
- let indicator = document.getElementById('low-usage-mode-indicator');
-
if (enabled) {
// Add CSS class to body to disable animations
document.body.classList.add('low-usage-mode');
- // Create or show the indicator
- if (!indicator) {
- indicator = document.createElement('div');
- indicator.id = 'low-usage-mode-indicator';
- indicator.innerHTML = ' Low Usage Mode';
- indicator.style.position = 'fixed';
- indicator.style.top = '10px';
- indicator.style.right = '10px';
- indicator.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
- indicator.style.color = 'white';
- indicator.style.padding = '5px 10px';
- indicator.style.borderRadius = '4px';
- indicator.style.fontSize = '12px';
- indicator.style.zIndex = '9999';
- document.body.appendChild(indicator);
- } else {
- indicator.style.display = 'block';
- }
+ // Low Usage Mode now runs without any visual indicator for a cleaner interface
} else {
// Remove CSS class from body to enable animations
document.body.classList.remove('low-usage-mode');
-
- // Hide the indicator if it exists
- if (indicator) {
- indicator.style.display = 'none';
- }
}
// If low usage mode state changed and we have stats data, update the display
@@ -3219,14 +3194,10 @@ let huntarrUI = {
// 2. Check if the standalone low-usage-mode.js module is enabled
const standaloneModuleEnabled = window.LowUsageMode && window.LowUsageMode.isEnabled && window.LowUsageMode.isEnabled();
- // 3. Check if the low usage mode indicator is visible
- const indicator = document.getElementById('low-usage-mode-indicator');
- const indicatorVisible = indicator && indicator.style.display !== 'none' && indicator.style.display !== '';
+ // 3. Final determination based on reliable sources (no indicator checking needed)
+ const isEnabled = hasLowUsageClass || standaloneModuleEnabled;
- // 4. Store the result for consistency during this update cycle
- const isEnabled = hasLowUsageClass || standaloneModuleEnabled || indicatorVisible;
-
- console.log(`[huntarrUI] Low usage mode detection - CSS class: ${hasLowUsageClass}, Module: ${standaloneModuleEnabled}, Indicator: ${indicatorVisible}, Final: ${isEnabled}`);
+ console.log(`[huntarrUI] Low usage mode detection - CSS class: ${hasLowUsageClass}, Module: ${standaloneModuleEnabled}, Final: ${isEnabled}`);
return isEnabled;
},
diff --git a/frontend/templates/components/sidebar.html b/frontend/templates/components/sidebar.html
index b9232945..f0da1d2f 100644
--- a/frontend/templates/components/sidebar.html
+++ b/frontend/templates/components/sidebar.html
@@ -158,9 +158,9 @@
.logo-container {
display: flex;
align-items: center;
- padding: 15px 20px 0px;
+ padding: 12px 16px 0px;
border-bottom: none;
- margin-bottom: -15px;
+ margin-bottom: -12px;
position: relative;
}
@@ -202,9 +202,9 @@
}
.logo {
- width: 60px; /* 50% bigger than original 40px */
+ width: 60px;
height: 60px;
- margin-right: 15px;
+ margin-right: 12px;
border-radius: 50%;
animation: logo-glow 10s infinite ease-in-out;
transition: all 0.3s ease;
@@ -215,12 +215,12 @@
}
.logo-container h1 {
- font-size: 22px;
+ font-size: 18px;
font-weight: 700;
margin: 0;
color: #fff;
text-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
- letter-spacing: 0.5px;
+ letter-spacing: 0.4px;
background: linear-gradient(to right, #fff, #bbb);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
@@ -229,19 +229,19 @@
.nav-menu {
display: flex;
flex-direction: column;
- padding: 5px 0 20px 0;
+ padding: 4px 0 16px 0;
flex-grow: 1;
}
.nav-item {
display: flex;
align-items: center;
- padding: 12px 20px;
+ padding: 10px 16px;
color: rgba(255, 255, 255, 0.8);
text-decoration: none;
transition: all 0.3s ease;
border-radius: 0 6px 6px 0;
- margin: 2px 0 2px 0;
+ margin: 1.5px 0 1.5px 0;
position: relative;
overflow: hidden;
}
@@ -259,21 +259,21 @@
}
.nav-icon-wrapper {
- width: 38px;
- height: 38px;
+ width: 30px;
+ height: 30px;
display: flex;
justify-content: center;
align-items: center;
- margin-right: 15px;
+ margin-right: 12px;
position: relative;
- border-radius: 10px;
+ border-radius: 8px;
transition: all 0.3s ease;
background: rgba(30, 39, 56, 0.3);
border: 1px solid rgba(255, 255, 255, 0.05);
}
.nav-icon-wrapper i {
- font-size: 16px;
+ font-size: 13px;
position: absolute;
top: 50%;
left: 50%;
@@ -288,8 +288,8 @@
}
.nav-group {
- margin-top: 5px;
- margin-bottom: 15px;
+ margin-top: 4px;
+ margin-bottom: 12px;
}
/* Specific adjustment for the Core nav group */
@@ -298,23 +298,23 @@
}
.nav-group-title {
- font-size: 12px;
+ font-size: 10px;
font-weight: 700;
color: rgba(52, 152, 219, 0.8);
text-transform: uppercase;
- letter-spacing: 2px;
- padding: 0 20px 8px;
- margin-top: 15px;
+ letter-spacing: 1.6px;
+ padding: 0 16px 6px;
+ margin-top: 12px;
border-bottom: 1px solid rgba(52, 152, 219, 0.2);
text-shadow: 0 0 10px rgba(52, 152, 219, 0.3);
position: relative;
}
.nav-item span {
- font-size: 14px;
+ font-size: 11px;
font-weight: 500;
transition: all 0.3s ease;
- letter-spacing: 0.3px;
+ letter-spacing: 0.24px;
}
.nav-item:hover {
diff --git a/src/primary/routes/common.py b/src/primary/routes/common.py
index e67aea4e..8652bcee 100644
--- a/src/primary/routes/common.py
+++ b/src/primary/routes/common.py
@@ -226,7 +226,7 @@ def get_user_info_route():
username = get_username_from_session(session_token) # Use auth function
if not username:
- logger.warning("Attempt to get user info failed: Not authenticated (no valid session).")
+ logger.debug("Attempt to get user info failed: Not authenticated (no valid session).")
return jsonify({"error": "Not authenticated"}), 401
# Pass username to is_2fa_enabled