From 46dcab551954c2a29466ca7f87a89d81786d9dd0 Mon Sep 17 00:00:00 2001 From: "Joseph.Rawlings" Date: Sat, 24 Jan 2026 21:06:16 -0500 Subject: [PATCH] style: replace simple spinner with animated loader - Add new .loader CSS class with clip-path animation - Uses loader-clip and loader-rotate keyframe animations - Replaces border-spinner with more polished visual effect - Applied across storage, firewall, backups, overview, subdomain views --- .../Servers/Proxmox/views/backups.blade.php | 2 +- .../Servers/Proxmox/views/firewall.blade.php | 6 +-- .../Servers/Proxmox/views/overview.blade.php | 4 +- .../Servers/Proxmox/views/storage.blade.php | 16 ++++---- .../Servers/Proxmox/views/subdomain.blade.php | 4 +- themes/lucentui/css/app.css | 40 +++++++++++++++++++ 6 files changed, 56 insertions(+), 16 deletions(-) diff --git a/extensions/Servers/Proxmox/views/backups.blade.php b/extensions/Servers/Proxmox/views/backups.blade.php index 4699f226f..63209eaa7 100644 --- a/extensions/Servers/Proxmox/views/backups.blade.php +++ b/extensions/Servers/Proxmox/views/backups.blade.php @@ -109,7 +109,7 @@ wire:loading.attr="disabled" wire:target="promptDelete('{{ $backup->volid }}')" class="bg-background border border-neutral px-3 py-2 rounded-md text-sm font-semibold flex items-center gap-2 text-error disabled:opacity-50 disabled:cursor-not-allowed"> - + Delete diff --git a/extensions/Servers/Proxmox/views/firewall.blade.php b/extensions/Servers/Proxmox/views/firewall.blade.php index 2a0855117..6bd7fa700 100644 --- a/extensions/Servers/Proxmox/views/firewall.blade.php +++ b/extensions/Servers/Proxmox/views/firewall.blade.php @@ -384,7 +384,7 @@

Firewall Rules

@@ -663,7 +663,7 @@

Create named references to IP addresses or CIDR ranges

@@ -714,7 +714,7 @@

Group multiple IPs/CIDRs for easier rule management

diff --git a/extensions/Servers/Proxmox/views/overview.blade.php b/extensions/Servers/Proxmox/views/overview.blade.php index c116bbe6b..84f0a9fda 100644 --- a/extensions/Servers/Proxmox/views/overview.blade.php +++ b/extensions/Servers/Proxmox/views/overview.blade.php @@ -439,7 +439,7 @@ wire:target="startEditingHostname" class="text-base/70 hover:text-base/60 ml-2 disabled:opacity-50 disabled:cursor-not-allowed" aria-label="Edit Hostname"> - + @@ -603,7 +603,7 @@ wire:loading.attr="disabled" wire:target="startEditingPassword" aria-label="Edit Root Password"> - + diff --git a/extensions/Servers/Proxmox/views/storage.blade.php b/extensions/Servers/Proxmox/views/storage.blade.php index db063242a..e6500f45c 100644 --- a/extensions/Servers/Proxmox/views/storage.blade.php +++ b/extensions/Servers/Proxmox/views/storage.blade.php @@ -152,7 +152,7 @@ wire:loading.attr="disabled" wire:loading.class="opacity-75" class="inline-flex items-center gap-2 px-3 py-2 text-sm font-medium rounded-lg bg-primary text-white hover:bg-primary/90 transition-colors"> - + Add Drive @@ -350,7 +350,7 @@ wire:loading.attr="disabled" wire:target="openEditDriveModal('{{ $driveKey }}')" class="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-lg border border-neutral bg-background hover:bg-background-secondary transition-colors"> - + Settings @@ -358,7 +358,7 @@ wire:loading.attr="disabled" wire:target="openMoveDriveModal('{{ $driveKey }}')" class="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-lg border border-neutral bg-background hover:bg-background-secondary transition-colors"> - + Device Bus @@ -376,7 +376,7 @@ style="display: inline-flex; align-items: center; gap: 0.375rem; padding: 0.375rem 0.75rem; font-size: 0.75rem; font-weight: 500; border-radius: 0.5rem; border: 1px solid rgb(234 179 8 / 0.5); background-color: rgb(234 179 8 / 0.1); color: rgb(234 179 8); transition: background-color 0.15s ease;" onmouseover="this.style.backgroundColor='rgb(234 179 8 / 0.2)'" onmouseout="this.style.backgroundColor='rgb(234 179 8 / 0.1)'"> - + Detach @@ -385,7 +385,7 @@ wire:loading.attr="disabled" wire:target="openDeleteModal('{{ $driveKey }}')" class="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-lg border border-danger/50 bg-danger/10 text-danger hover:bg-danger/20 transition-colors"> - + Delete @@ -483,7 +483,7 @@ style="display: inline-flex; align-items: center; gap: 0.375rem; padding: 0.375rem 0.75rem; font-size: 0.75rem; font-weight: 500; border-radius: 0.5rem; border: 1px solid rgb(239 68 68 / 0.5); background-color: rgb(239 68 68 / 0.1); color: rgb(239 68 68); transition: background-color 0.15s ease;" onmouseover="this.style.backgroundColor='rgb(239 68 68 / 0.2)'" onmouseout="this.style.backgroundColor='rgb(239 68 68 / 0.1)'"> - + Delete @@ -492,7 +492,7 @@ wire:loading.attr="disabled" wire:target="openReattachModal('{{ $unusedKey }}')" class="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-lg border border-success/50 bg-success/10 text-success hover:bg-success/20 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"> - + Reattach @@ -503,7 +503,7 @@ style="display: inline-flex; align-items: center; gap: 0.375rem; padding: 0.375rem 0.75rem; font-size: 0.75rem; font-weight: 500; border-radius: 0.5rem; border: 1px solid rgb(239 68 68 / 0.5); background-color: rgb(239 68 68 / 0.1); color: rgb(239 68 68); transition: background-color 0.15s ease;" onmouseover="this.style.backgroundColor='rgb(239 68 68 / 0.2)'" onmouseout="this.style.backgroundColor='rgb(239 68 68 / 0.1)'"> - + Delete diff --git a/extensions/Servers/Proxmox/views/subdomain.blade.php b/extensions/Servers/Proxmox/views/subdomain.blade.php index 444f5176f..6f5080bb1 100644 --- a/extensions/Servers/Proxmox/views/subdomain.blade.php +++ b/extensions/Servers/Proxmox/views/subdomain.blade.php @@ -156,7 +156,7 @@ - + Create Subdomain @@ -257,7 +257,7 @@
- + Delete diff --git a/themes/lucentui/css/app.css b/themes/lucentui/css/app.css index fd0c98a3a..c8d8f5ee9 100644 --- a/themes/lucentui/css/app.css +++ b/themes/lucentui/css/app.css @@ -629,6 +629,46 @@ x-navigation-link svg { 100% { background-position: -200% 0; } } +/* ============================================================================= + BUTTON LOADING SPINNER + ============================================================================= */ + +.loader { + width: 1em; + aspect-ratio: 1; + border-radius: 50%; + border: 2px solid currentColor; + animation: + loader-clip 0.8s infinite linear alternate, + loader-rotate 1.6s infinite linear; +} + +.loader-sm { + width: 0.875em; +} + +.loader-lg { + width: 1.25em; + border-width: 3px; +} + +@keyframes loader-clip { + 0% { clip-path: polygon(50% 50%, 0 0, 50% 0%, 50% 0%, 50% 0%, 50% 0%, 50% 0%); } + 12.5% { clip-path: polygon(50% 50%, 0 0, 50% 0%, 100% 0%, 100% 0%, 100% 0%, 100% 0%); } + 25% { clip-path: polygon(50% 50%, 0 0, 50% 0%, 100% 0%, 100% 100%, 100% 100%, 100% 100%); } + 50% { clip-path: polygon(50% 50%, 0 0, 50% 0%, 100% 0%, 100% 100%, 50% 100%, 0% 100%); } + 62.5% { clip-path: polygon(50% 50%, 100% 0, 100% 0%, 100% 0%, 100% 100%, 50% 100%, 0% 100%); } + 75% { clip-path: polygon(50% 50%, 100% 100%, 100% 100%, 100% 100%, 100% 100%, 50% 100%, 0% 100%); } + 100% { clip-path: polygon(50% 50%, 50% 100%, 50% 100%, 50% 100%, 50% 100%, 50% 100%, 0% 100%); } +} + +@keyframes loader-rotate { + 0% { transform: scaleY(1) rotate(0deg); } + 49.99% { transform: scaleY(1) rotate(135deg); } + 50% { transform: scaleY(-1) rotate(0deg); } + 100% { transform: scaleY(-1) rotate(-135deg); } +} + /* ============================================================================= CRITICAL PERFORMANCE FIXES ============================================================================= */