Files
tuliprox/frontend/scss/app/components/_loading_indicator.scss
euzuandGitHub 49573dd6b1 Feature/UI improvements (#770)
* 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
2026-06-04 18:00:37 +02:00

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
}
}