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
============================================================================= */