mirror of
https://github.com/euzu/tuliprox.git
synced 2026-09-17 14:42:11 +02:00
* catchup fixes * feat(frontend): bookmarkable views via URL hash deep linking Persist the active view to the URL hash so views are bookmarkable and survive a page refresh. Restore the view from the hash on load, sync the hash on navigation, and handle browser back/forward via a hashchange listener. * feat(dev): add dev container for reproducible development * feat(frontend): interactive multi-series metric sparklines on stats cards * feat(frontend): aggregate status health banner with capacity breakdown * feat(frontend): add guided empty states with hints * chore(devcontainer): add gh CLI, dev tooling, cache volumes, and tasks - Install GitHub CLI, git, build-essential, clang, lld, mold, jq - Add cargo-watch, cargo-llvm-cov, cargo-deny, cargo-machete - Persist cargo registry, target, and gh config via named volumes - Fix volume ownership for the dev user in post-create * chore(vscode): add tasks and launch configs for dev workflow - tasks.json: backend/frontend dev servers, test, lint, fmt, coverage, deps checks, docs - launch.json: CodeLLDB configs for backend and workspace tests * a11y: add accessible labels to inputs and collapsed sidebar buttons - Input: add aria_label prop, falling back to placeholder when no visible label - Sidebar: pass translated hint + aria_label to collapsed-mode icon buttons * feat(frontend): warn on unsaved config changes before page unload * feat(frontend): handle session expiry with client-side logout Schedule a client-side logout when the JWT expires, showing a notification and returning the user to the login screen instead of silently failing with 401s. * chore(vscode): update tasks.json * New Features Session expiration detection with proactive logout warning Real-time health status banner showing connectivity and provider status Live metric sparklines for CPU, memory, and network usage Deep-linkable views via URL hash with back/forward browser support Enhanced empty states with guided messages across app sections Improvements Faster system metrics sampling (2-second intervals) Archive and catchup-aware EPG handling for accurate program guides * New Features Session expiration detection with proactive logout warning Real-time health status banner showing connectivity and provider status Live metric sparklines for CPU, memory, and network usage Deep-linkable views via URL hash with back/forward browser support Enhanced empty states with guided messages across app sections Improvements Faster system metrics sampling (2-second intervals) Archive and catchup-aware EPG handling for accurate program guides
58 lines
1.8 KiB
SCSS
58 lines
1.8 KiB
SCSS
$indicator-height: 5px;
|
|
|
|
.tp__busy-indicator {
|
|
position: fixed;
|
|
z-index: var(--z-index-overlay);
|
|
top: var(--app-header-height);
|
|
left: 0;
|
|
display: inline-block;
|
|
width: 100%; // Full width of the container
|
|
height: $indicator-height; // Thin height for the container
|
|
min-height: $indicator-height;
|
|
max-height: $indicator-height;
|
|
.tp__loading-bar-placeholder, .tp__loading-bar-container {
|
|
position: fixed;
|
|
}
|
|
}
|
|
|
|
.tp__loading-bar-placeholder, .tp__loading-bar-container {
|
|
display: inline-block;
|
|
width: 100%; // Full width of the container
|
|
height: $indicator-height; // Thin height for the container
|
|
min-height: $indicator-height;
|
|
max-height: $indicator-height;
|
|
margin: 0;
|
|
padding: 0;
|
|
}
|
|
|
|
|
|
// Container for the loading bar
|
|
.tp__loading-bar-container {
|
|
background-color: var(--spinner-color); // Light gray background for the container
|
|
border-radius: 10px; // Optional: rounded corners for the container
|
|
overflow: hidden; // Prevents overflow content from showing outside the container
|
|
}
|
|
|
|
// The actual loading bar
|
|
.tp__loading-bar {
|
|
height: 100%; // Full height of the loading bar (matches the container's height)
|
|
width: 100%; // Start the width of the loading bar at 100%
|
|
background-color: var(--spinner-highlight-color);
|
|
position: relative;
|
|
animation: loading 2s infinite ease-in-out; // Animation runs infinitely with easing
|
|
transform-origin: center center; // The animation will scale from the center of the element
|
|
}
|
|
|
|
// The keyframes for the loading animation
|
|
@keyframes loading {
|
|
0% {
|
|
transform: scaleX(0); // At the start, the bar is not visible (scale from the center)
|
|
}
|
|
50% {
|
|
transform: scaleX(1); // The bar reaches full width, expanding to the edges
|
|
}
|
|
100% {
|
|
transform: scaleX(0); // The bar contracts back to the center
|
|
}
|
|
}
|