diff --git a/resources/views/components/btn.blade.php b/resources/views/components/btn.blade.php
index af346a3..80b9e84 100644
--- a/resources/views/components/btn.blade.php
+++ b/resources/views/components/btn.blade.php
@@ -1,13 +1,15 @@
@props(['variant' => 'secondary', 'icon' => false, 'href' => null, 'size' => 'sm'])
@php
- // One button style for the whole app — compact, consistent (R10).
+ // One button style for the whole app — EVERY variant carries a persistent
+ // border + background (R10). No borderless variants: low-emphasis actions use
+ // `secondary`, destructive ones use `danger-soft` (red-tinted, always — not
+ // only on hover). Unknown variants fall back to the bordered `secondary`.
$variants = [
'primary' => 'bg-accent text-void hover:bg-accent-bright',
'accent' => 'border border-accent/25 bg-accent/10 text-accent-text hover:bg-accent/15',
'secondary' => 'border border-line bg-inset text-ink-2 hover:bg-raised hover:text-ink',
'danger' => 'bg-offline text-void hover:bg-offline/90',
- 'ghost' => 'text-ink-2 hover:bg-raised hover:text-ink',
- 'ghost-danger' => 'text-ink-3 hover:bg-offline/10 hover:text-offline',
+ 'danger-soft' => 'border border-offline/25 bg-offline/10 text-offline hover:bg-offline/15',
];
// sm = compact toolbar/row buttons; lg = full-height primary CTA (≥44px touch target, R7).
$sizes = [
diff --git a/resources/views/livewire/files/index.blade.php b/resources/views/livewire/files/index.blade.php
index f22c99b..8fc11b1 100644
--- a/resources/views/livewire/files/index.blade.php
+++ b/resources/views/livewire/files/index.blade.php
@@ -119,10 +119,10 @@
{{-- Row actions --}}
@unless ($isDir)
- {{ __('files.download') }}
- {{ __('common.edit') }}
+ {{ __('files.download') }}
+ {{ __('common.edit') }}
@endunless
- {{ __('common.delete') }}
+ {{ __('common.delete') }}
@endforeach
diff --git a/resources/views/livewire/servers/show.blade.php b/resources/views/livewire/servers/show.blade.php
index d295eb5..8b4eb1a 100644
--- a/resources/views/livewire/servers/show.blade.php
+++ b/resources/views/livewire/servers/show.blade.php
@@ -125,7 +125,7 @@
{{ $cred->disabled ? __('common.unlock') : __('common.lock') }}
-
+
{{ __('common.delete') }}
@@ -207,7 +207,7 @@
@if ($supported)
@if ($check['key'] === 'fail2ban')
-
@@ -320,7 +320,7 @@
'text-offline' => $ruleTone === 'offline',
])>{{ strtolower($rule['action'] ?? 'allow') }}
@unless ($fwReadOnly)
-
@@ -351,7 +351,7 @@
:padded="false">
@if ($f2bSupported && $f2bInstalled && $f2bActive)
-
@@ -395,7 +395,7 @@
@foreach ($jail['bannedIps'] as $ip)
{{ $ip }}
- {{ __('common.unlock') }}
+ {{ __('common.unlock') }}
@endforeach
@@ -504,7 +504,7 @@
{{ $key['fingerprint'] }}
-
+
diff --git a/resources/views/livewire/settings/index.blade.php b/resources/views/livewire/settings/index.blade.php
index 8ddc5d8..08b86e4 100644
--- a/resources/views/livewire/settings/index.blade.php
+++ b/resources/views/livewire/settings/index.blade.php
@@ -106,7 +106,7 @@
@if ($twoFactorEnabled)
- {{ __('common.disable') }}
+ {{ __('common.disable') }}
@else
{{ __('settings.twofa_setup') }}
diff --git a/tests/Feature/ButtonComponentTest.php b/tests/Feature/ButtonComponentTest.php
new file mode 100644
index 0000000..b1e2362
--- /dev/null
+++ b/tests/Feature/ButtonComponentTest.php
@@ -0,0 +1,25 @@
+x');
+ $this->assertStringContainsString('border border-offline/25', $html);
+ $this->assertStringContainsString('bg-offline/10', $html);
+ $this->assertStringContainsString('text-offline', $html);
+ }
+
+ public function test_no_borderless_ghost_variants_remain(): void
+ {
+ // Unknown variants fall back to secondary (bordered) — never borderless.
+ $html = Blade::render('x');
+ $this->assertStringContainsString('border border-line', $html);
+ $this->assertStringContainsString('bg-inset', $html);
+ }
+}