Complete Hubbly theme conversion: all pages rewritten with CSS variable theming

- Converted all views from Dusk components (x-content.content-card, x-form.*) to inline Hubbly style
- All pages use consistent card pattern: rounded-lg, gradient headers, color-mix borders
- Added Hubbly-style homepage with 2-column layout, login card, swiper news carousel
- Rewrote navigation with Alpine.js dropdowns, CSS variable colors, Hubbly assets
- Updated profile page with Hubbly cards, fixed data bugs (friend/guild relationships)
- Rewrote register page to match Hubbly layout: banner header, avatar preview with Frank GIF, 2-column form, avatar carousel selector, border-4 inputs
- Rewrote login, settings, help center, radio, applications, utility pages
- All colors use CSS variables controlled by Filament theme editor
- Added Hubbly assets: banner, Frank GIF, navigation icons, online badge
- Removed all dependencies on x-content.* and x-form.* components
This commit is contained in:
root
2026-06-27 17:01:02 +02:00
parent 61bb70ac1d
commit c53a5a8a2c
68 changed files with 4708 additions and 4608 deletions
@@ -3,71 +3,86 @@
<div class="col-span-12 lg:col-span-9 lg:w-[96%]">
<div class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-2">
@forelse($positions as $position)
@continue(!$position->permission) {{-- skip if the rank relation is missing --}}
@continue(!$position->permission)
<x-content.staff-content-section :badge="$position->permission->badge" :color="$position->permission->staff_color">
<x-slot:title>
{{ $position->permission->rank_name }}
</x-slot:title>
<x-slot:under-title>
{{ $position->permission->job_description }}
</x-slot:under-title>
<div class="rounded-lg overflow-hidden" style="background-color: var(--color-surface); border: 1px solid color-mix(in srgb, var(--color-text-muted) 15%, transparent);">
<div class="flex gap-x-2.5 p-3.5" style="border-bottom: 1px solid color-mix(in srgb, var(--color-primary) 30%, transparent);">
<div class="w-12 h-12 min-w-[3rem] rounded-full flex items-center justify-center" style="background-color: {{ $position->permission->staff_color }}">
<img src="{{ asset(sprintf('%s/%s.gif', setting('badges_path'), $position->permission->badge)) }}" alt="">
</div>
<div class="flex flex-col justify-center text-sm">
<p class="font-semibold" style="color: var(--color-text)">{{ $position->permission->rank_name }}</p>
<p style="color: var(--color-text-muted)">{{ $position->permission->job_description }}</p>
</div>
</div>
<div class="text-center dark:text-gray-400">
<div class="mb-4 text-sm">
{!! $position->description !!}
</div>
<div class="mb-4 text-sm font-semibold">
{{ __('Application Deadline :date', [
'date' => $position->apply_to ? $position->apply_to->format('F j, Y, g:i A') : __('No deadline set')
]) }}
</div>
</div>
<div class="p-3" style="color: var(--color-text)">
<div class="text-center">
<div class="mb-4 text-sm">
{!! $position->description !!}
</div>
<div class="mb-4 text-sm font-semibold">
{{ __('Application Deadline :date', [
'date' => $position->apply_to ? $position->apply_to->format('F j, Y, g:i A') : __('No deadline set')
]) }}
</div>
</div>
<div class="flex justify-between">
@if (auth()->check() && auth()->user()->hasAppliedForPosition($position->permission->id))
<x-form.danger-button>
{{ __('You have already applied for :position', ['position' => $position->permission->rank_name]) }}
</x-form.danger-button>
@else
<a href="{{ route('staff-applications.show', $position) }}" class="w-full">
<x-form.secondary-button>
{{ __('Apply for :position', ['position' => $position->permission->rank_name]) }}
</x-form.secondary-button>
</a>
@endif
<div class="flex justify-between">
@if (auth()->check() && auth()->user()->hasAppliedForPosition($position->permission->id))
<button type="button" class="rounded-lg px-4 py-2 text-sm font-semibold transition-all duration-200 hover:opacity-90" style="background-color: #dc2626; color: white;">
{{ __('You have already applied for :position', ['position' => $position->permission->rank_name]) }}
</button>
@else
<a href="{{ route('staff-applications.show', $position) }}" class="w-full">
<button type="button" class="rounded-lg px-4 py-2 text-sm font-semibold transition-all duration-200 hover:opacity-90" style="background-color: var(--color-background); color: var(--color-text); border: 1px solid color-mix(in srgb, var(--color-text-muted) 15%, transparent);">
{{ __('Apply for :position', ['position' => $position->permission->rank_name]) }}
</button>
</a>
@endif
</div>
</div>
</div>
</x-content.staff-content-section>
@empty
<x-content.content-card icon="lighthouse-icon" classes="border dark:border-gray-900 col-span-full">
<x-slot:title>
{{ __('No positions open') }}
</x-slot:title>
<x-slot:under-title>
{{ __('There is currently no positions open') }}
</x-slot:under-title>
<div class="px-2 text-sm space-y-4 dark:text-gray-200">
<p>
{{ __('Please come back at a later time to check if we have any positions open by then! Thank you for your interest.', ['hotel' => setting('hotel_name')]) }}
</p>
<div class="rounded-lg overflow-hidden col-span-full" style="background-color: var(--color-surface); border: 1px solid color-mix(in srgb, var(--color-text-muted) 15%, transparent);">
<div class="relative w-full" style="background: linear-gradient(140deg, var(--color-primary) 0%, color-mix(in srgb, var(--color-primary) 80%, black) 100%);">
<div class="flex items-center h-full px-4 py-3 gap-3">
<div class="w-8 h-8 rounded-full flex items-center justify-center text-lg shadow-lg" style="background-color: color-mix(in srgb, var(--color-primary) 30%, transparent);">
🏮
</div>
<div>
<p class="text-white font-bold text-sm">{{ __('No positions open') }}</p>
<p class="text-xs" style="color: rgba(255,255,255,0.8)">{{ __('There is currently no positions open') }}</p>
</div>
</div>
</div>
<div class="p-4 text-sm space-y-4" style="color: var(--color-text)">
<p>
{{ __('Please come back at a later time to check if we have any positions open by then! Thank you for your interest.', ['hotel' => setting('hotel_name')]) }}
</p>
</div>
</div>
</x-content.content-card>
@endforelse
</div>
</div>
<div class="col-span-12 lg:col-span-3 lg:w-[110%] space-y-4 lg:-ml-[32px]">
<x-content.content-card icon="chat-icon" classes="border dark:border-gray-900">
<x-slot:title>
{{ __('Apply for :hotel staff', ['hotel' => setting('hotel_name')]) }}
</x-slot:title>
<x-slot:under-title>
{{ __('Select position to get started', ['hotel' => setting('hotel_name')]) }}
</x-slot:under-title>
<div class="px-2 text-sm space-y-4 dark:text-gray-200">
<p>
{{ __('Here at :hotel we open up for staff applications every now and then. Sometimes you will find this page empty other times it might be filled with positions, if you ever come across a position you feel you would fit perfectly into, then do not hesitate to apply for it.', ['hotel' => setting('hotel_name')]) }}
</p>
<div class="rounded-lg overflow-hidden" style="background-color: var(--color-surface); border: 1px solid color-mix(in srgb, var(--color-text-muted) 15%, transparent);">
<div class="relative w-full" style="background: linear-gradient(140deg, var(--color-primary) 0%, color-mix(in srgb, var(--color-primary) 80%, black) 100%);">
<div class="flex items-center h-full px-4 py-3 gap-3">
<div class="w-8 h-8 rounded-full flex items-center justify-center text-lg shadow-lg" style="background-color: color-mix(in srgb, var(--color-primary) 30%, transparent);">
💬
</div>
<div>
<p class="text-white font-bold text-sm">{{ __('Apply for :hotel staff', ['hotel' => setting('hotel_name')]) }}</p>
<p class="text-xs" style="color: rgba(255,255,255,0.8)">{{ __('Select position to get started', ['hotel' => setting('hotel_name')]) }}</p>
</div>
</div>
</div>
<div class="p-4 text-sm space-y-4" style="color: var(--color-text)">
<p>
{{ __('Here at :hotel we open up for staff applications every now and then. Sometimes you will find this page empty other times it might be filled with positions, if you ever come across a position you feel you would fit perfectly into, then do not hesitate to apply for it.', ['hotel' => setting('hotel_name')]) }}
</p>
</div>
</div>
</x-content.content-card>
</div>
</x-app-layout>