🆙 Add fixed cms 🆙

This commit is contained in:
Remco
2026-02-02 19:30:21 +01:00
parent b1a2cab62d
commit b67e0ec2b9
3982 changed files with 193682 additions and 0 deletions
@@ -0,0 +1,187 @@
<x-app-layout>
@push('title', $article->title)
<div class="col-span-12 rounded space-y-3 md:col-span-3">
<div
class="relative mt-6 h-24 w-full overflow-hidden rounded border bg-white shadow-sm dark:border-gray-900 dark:bg-gray-800 md:mt-0">
<div
class="absolute top-1 right-1 rounded bg-white px-2 text-sm font-semibold dark:bg-gray-700 dark:text-gray-100">
{{ $article->user && !$article->user->hidden_staff ? $article->user->permission->rank_name ?? 'Member' : 'Member' }}
</div>
<div class="h-[65%] w-full staff-bg"
style="background: rgba(0, 0, 0, 0.5) url({{ asset(sprintf('assets/images/%s', $article->user ? $article->user->permission->staff_background ?? 'staff-bg.png' : 'staff-bg.png')) }});">
</div>
<a href="{{ route('profile.show', $article->user ?? \App\Models\User::first()) }}" class="absolute top-4 left-1 drop-shadow">
<img style="image-rendering: pixelated;" class="transition duration-300 ease-in-out hover:scale-105"
src="{{ setting('avatar_imager') }}{{ $article->user?->look }}&direction=2&head_direction=3&gesture=sml&action=wav"
alt="">
</a>
<p class="text-2xl font-semibold ml-[70px] text-white -mt-[35px]">
{{ $article->user->username ?? setting('hotel_name') }}
</p>
<div class="flex w-full items-center justify-between px-4">
<p class="ml-[57px] text-sm mt-[10px] font-semibold text-gray-500">
{{ $article->user->motto ?? setting('start_motto') }}
</p>
@if($article->user)
<div class="w-4 h-4 rounded-full mt-2 {{ $article->user->online ? 'bg-green-600' : 'bg-red-600' }}">
</div>
@endif
</div>
</div>
<x-content.content-card icon="article-icon" classes="border dark:bg-gray-800 dark:border-gray-900">
<x-slot:title>
{{ __('Other articles') }}
</x-slot:title>
<x-slot:under-title>
{{ __('Our most recent articles') }}
</x-slot:under-title>
<div class="flex flex-col gap-y-2">
@forelse($otherArticles as $art)
<a href="{{ route('article.show', $art->slug) }}"
style="background: rgba(0, 0, 0, 0.5) url({{ $art->image }}) center;"
class="w-full rounded h-12 bg-blue-200 transition ease-in-out duration-200 hover:scale-[103%] text-white flex justify-center items-center font-bold recent-articles">
{{ Str::limit($art->title, 20) }}
</a>
@empty
<p class="dark:text-gray-400">
{{ __('There is currently no other articles') }}
</p>
@endforelse
</div>
</x-content.content-card>
</div>
<div class="col-span-12 space-y-4 md:col-span-9">
<div
class="relative flex flex-col gap-y-8 overflow-hidden rounded bg-white p-3 shadow-sm dark:bg-gray-800 dark:text-gray-300">
<div class="relative flex h-24 flex-col items-center justify-center gap-y-1 overflow-hidden rounded px-2 text-white"
style="background: url(/storage/{{ $article->image }}) center; background-size: cover;">
<div class="absolute h-full w-full bg-black/50"></div>
<p class="relative w-full truncate text-center text-xl font-semibold lg:text-2xl xl:text-3xl">
{{ $article->title }}</p>
<p class="relative w-full truncate text-center">{{ $article->short_story }}</p>
</div>
<div class="px-2" id="article-content">
{!! $article->full_story !!}
</div>
<div class="w-full h-10 lg:h-1/2 py-1 flex gap-1 items-center justify-start flex-wrap">
@forelse ($article->tags as $tag)
<span @class([
"text-xs font-medium rounded-lg px-2",
"text-slate-600" => $tag->background_color,
"text-white" => $tag->background_color
]) style="background-color: {{ $tag->background_color }}">{{ $tag->name }}</span>
@empty
<span @class([
"text-xs font-medium rounded-lg px-2",
"text-slate-600",
"text-white"
]) style="background-color: #000000">{{ __('No tags found.') }}</span>
</span>
@endforelse
</div>
@include('community.partials.article-reactions')
</div>
@if ($article->can_comment)
@if (auth()->check() && !$article->userHasReachedArticleCommentLimit())
<x-content.content-card icon="hotel-icon" classes="border dark:border-gray-900">
<x-slot:title>
{{ __('Post a comment') }}
</x-slot:title>
<x-slot:under-title>
{{ __('Post a comment on the article, to let us know what you think about it') }}
</x-slot:under-title>
<div class="px-2 text-sm dark:text-gray-200">
<form action="{{ route('article.comment.store', $article) }}" method="POST">
@csrf
<textarea name="comment"
class="focus:ring-0 border-2 border-gray-200 rounded dark:bg-gray-800 dark:border-gray-700 dark:text-gray-200 focus:border-[#eeb425] w-full min-h-[100px] max-h-[100px] @error('comment') border-red-600 ring-red-500 @enderror"></textarea>
<x-form.primary-button classes="mt-2">
{{ __('Post comment') }}
</x-form.primary-button>
</form>
</div>
</x-content.content-card>
@endif
<x-content.content-card icon="hotel-icon" classes="border dark:border-gray-900">
<x-slot:title>
{{ __('Comments') }}
</x-slot:title>
<x-slot:under-title>
{{ __('Below you will see all the comments, written on this article') }}
</x-slot:under-title>
<div class="px-1 dark:text-gray-200 space-y-[13px]">
@foreach ($article->comments->sortByDesc('created_at') as $comment)
<div
class="relative w-full rounded bg-[#f5f5f5] dark:bg-gray-700 p-4 h-[90px] overflow-hidden flex items-center shadow-sm">
<a href="{{ route('profile.show', $comment->user) }}"
class="absolute top-2 left-1 drop-shadow">
<img style="image-rendering: pixelated;"
class="transition duration-300 ease-in-out hover:scale-105"
src="{{ setting('avatar_imager') }}{{ $comment->user->look }}&direction=2&head_direction=3&gesture=sml&action=wav"
alt="">
</a>
<div class="flex justify-between ml-[60px] w-full">
<div class="text-sm">
<a href="{{ route('profile.show', $comment->user) }}"
class="font-semibold text-[#89cdf0] dark:text-blue-300 hover:underline">
{{ $comment->user->username }}
</a>
<p class="block dark:text-gray-200">
{{ $comment->comment }}
</p>
</div>
<div class="flex gap-x-2">
<p class="text-xs dark:text-gray-200">
{{ $comment->created_at->diffForHumans() }}
</p>
@if ($comment->canBeDeleted())
<form action="{{ route('article.comment.destroy', $comment) }}" method="POST"
class="cursor-pointer transition duration-200 ease-in-out hover:scale-105">
@method('DELETE')
@csrf
<button type="submit">
<svg xmlns="http://www.w3.org/2000/svg" fill="none"
viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
class="h-4 w-4">
<path stroke-linecap="round" stroke-linejoin="round"
d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0" />
</svg>
</button>
</form>
@endif
</div>
</div>
</div>
@endforeach
</div>
</x-content.content-card>
@endif
</div>
</x-app-layout>
@@ -0,0 +1,17 @@
<x-app-layout>
@push('title', __('Articles'))
<div class="col-span-12">
<div class="grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4">
@forelse($articles as $article)
<x-article-card :article="$article" />
@empty
<x-filler-article-card />
@endforelse
</div>
<div class="mt-4">
{{ $articles->links() }}
</div>
</div>
</x-app-layout>
@@ -0,0 +1,76 @@
<x-modals.modal-wrapper>
<div class="select-none"
x-data='reactions(@json($myReactions), @json($articleReactions), "{{ route('article.toggle-reaction', $article->slug) }}")'>
<div class="mt-4 flex w-full flex-wrap gap-2 rounded-lg bg-gray-100 p-2 dark:bg-gray-900">
<div x-show="isAuthenticated"
class="px-2 hover:scale-110 transition-all font-semibold h-8 flex items-center justify-center border-2 text-xs border-yellow-400 cursor-pointer bg-[#eeb425] text-white rounded-lg"
x-on:click="open = true">
{{ __('Add') }}
</div>
<template x-for="articleReaction in articleReactions">
<div>
<div class="flex h-8 w-12 items-center justify-center gap-2 rounded-lg border-2 border-gray-300 text-sm font-bold dark:border-gray-800"
:class="{
'bg-gray-300 dark:bg-gray-800 dark:border-gray-700': userHasReaction(
articleReaction),
'cursor-pointer hover:bg-gray-200 hover:scale-110 transition-all dark:hover:bg-gray-700': isAuthenticated
}"
@click="toggleReaction(articleReaction.name)" :data-popover-target="articleReaction.id">
<img :src="'/assets/images/icons/reactions/' + articleReaction.name + '.png'"
:alt="articleReaction.name">
<span x-text="articleReaction.count"></span>
</div>
<div data-popover :id="articleReaction.id" role="tooltip"
class="invisible absolute z-10 inline-block w-64 rounded-lg border border-gray-200 bg-white text-sm font-light text-gray-500 opacity-0 shadow-xs transition-opacity duration-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-400">
<div
class="rounded-t-lg border-b border-gray-200 bg-gray-100 px-3 py-2 dark:border-gray-600 dark:bg-gray-700">
<div
class="flex w-full items-center justify-center font-semibold text-gray-900 dark:text-white">
{{ __('Reactions with') }} <img
:src="'/assets/images/icons/reactions/' + articleReaction.name + '.png'"
class="ml-1" :alt="articleReaction.name">
</div>
</div>
<div class="overflow-y-auto px-3 py-2" style="max-height: 200px">
<template x-for="user in articleReaction.users">
<p class="w-full text-center" x-text="user"></p>
</template>
</div>
<div data-popper-arrow></div>
</div>
</div>
</template>
</div>
<div x-show="isAuthenticated">
<x-modals.regular-modal>
<x-slot name="title">
<h2 class="text-2xl">
{{ __('Insert Reaction') }}
</h2>
</x-slot>
<div class="flex w-full flex-wrap justify-center gap-3 p-2">
<template x-for="defaultReaction in allReactions">
<div class="cursor-pointer rounded-lg border-2 border-gray-300 px-3 py-2 hover:bg-gray-200 dark:hover:bg-gray-700 dark:hover:border-g dark:border-gray-800"
x-show="canAddReactionFromModal(defaultReaction)" @click="toggleReaction(defaultReaction)">
<img :src="'/assets/images/icons/reactions/' + defaultReaction + '.png'"
:alt="defaultReaction">
</div>
</template>
</div>
</x-modals.regular-modal>
</div>
</div>
</x-modals.modal-wrapper>
@push('scripts')
<script>
window.App = {
defaultReactions: @json(config('habbo.reactions')),
isAuthenticated: @json(auth()->check())
}
</script>
@endpush
@@ -0,0 +1,25 @@
<x-app-layout>
@push('title', __('Photos'))
<div class="col-span-12">
<x-content.content-card icon="camera-icon">
<x-slot:title>
{{ __('Latest Photos') }}
</x-slot:title>
<x-slot:under-title>
{{ __('Have a look at some of the great moments captured by users around the hotel.') }}
</x-slot:under-title>
<x-photos :photos="$photos" />
</x-content.content-card>
{{ $photos->links() }}
</div>
@push('javascript')
<script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui@4.0/dist/fancybox.umd.js"></script>
@endpush
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox.css" />
</x-app-layout>
@@ -0,0 +1,73 @@
<x-app-layout>
@push('title', __('Staff'))
<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 --}}
<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="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="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>
</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>
</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>
</x-content.content-card>
</div>
</x-app-layout>
@@ -0,0 +1,56 @@
<x-app-layout>
@push('title', __('Staff'))
<div class="col-span-12 lg:col-span-9 lg:w-[96%]">
<x-content.staff-content-section :badge="$position->permission->badge" :color="$position->permission->staff_color">
<x-slot:title>
{{ __('You are applying for :position', ['position' => $position->permission->rank_name]) }}
</x-slot:title>
<x-slot:under-title>
{{ __('Please fill out the fields below to apply for :position', ['position' => $position->permission->rank_name]) }}
</x-slot:under-title>
<form class="flex flex-col gap-y-3" action="{{ route('staff-applications.store', $position) }}" method="POST">
@csrf
<div>
<x-form.label for="username" disabled>{{ __('Username') }}</x-form.label>
<x-form.input name="username" value="{{ auth()->user()->username }}" :readonly="true" />
</div>
<div>
<x-form.label for="content" disabled>{{ __('About you') }}</x-form.label>
<textarea name="content" class="focus:ring-0 border-4 border-gray-200 rounded dark:bg-gray-800 dark:border-gray-700 dark:text-gray-200 focus:border-[#eeb425] w-full min-h-[180px]">{{ old('content') }}</textarea>
@error('content')
<p class="text-red-600 text-sm mt-1">{{ $message }}</p>
@enderror
</div>
@if (setting('google_recaptcha_enabled'))
<div class="g-recaptcha" data-sitekey="{{ config('habbo.site.recaptcha_site_key') }}"></div>
@endif
@if (setting('cloudflare_turnstile_enabled'))
<x-turnstile />
@endif
<x-form.primary-button>
{{ __('Apply for :position', ['position' => $position->permission->rank_name]) }}
</x-form.primary-button>
</form>
</x-content.staff-content-section>
</div>
<div class="col-span-12 lg:col-span-3 lg:w-[110%] space-y-4 lg:-ml-[32px]">
<x-content.content-card icon="hotel-icon" classes="border dark:border-gray-900">
<x-slot:title>{{ __('Applying for :position', ['position' => $position->permission->rank_name]) }}</x-slot:title>
<x-slot:under-title>{{ __('Read before applying') }}</x-slot:under-title>
<div class="px-2 text-sm space-y-4 dark:text-gray-200">
<p>
{{ __('Please fill out all the fields to apply for :position. Be honest and transparent. Providing incorrect information may lead to removal if hired.', ['position' => $position->permission->rank_name]) }}
</p>
</div>
</x-content.content-card>
</div>
</x-app-layout>
@@ -0,0 +1,76 @@
<x-app-layout>
@push('title', __('Staff'))
<div class="col-span-12 lg:col-span-9 lg:w-[96%]">
<div class="flex flex-col gap-y-4">
@foreach ($employees as $employee)
<x-content.staff-content-section :badge="$employee->badge" :color="$employee->staff_color">
<x-slot:title>
{{ $employee->rank_name }}
</x-slot:title>
<x-slot:under-title>
{{ $employee->job_description }}
</x-slot:under-title>
<div class="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3">
@foreach ($employee->users as $staff)
<x-community.staff-card :user="$staff" />
@endforeach
</div>
@if (count($employee->users) === 0)
<div class="text-center dark:text-gray-400">
{{ __('We currently have no staff in this position') }}
</div>
@endif
</x-content.staff-content-section>
@endforeach
</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>
{{ __(':hotel staff', ['hotel' => setting('hotel_name')]) }}
</x-slot:title>
<x-slot:under-title>
{{ __('About the :hotel staff', ['hotel' => setting('hotel_name')]) }}
</x-slot:under-title>
<div class="px-2 text-sm space-y-4 dark:text-gray-200">
<p>
{{ __('The :hotel staff team is one big happy family, each staff member has a different role and duties to fulfill.', ['hotel' => setting('hotel_name')]) }}
</p>
<p>
{{ __('Most of our team usually consists of players that have been around :hotel for quite a while, but this does not mean we only recruit old & known players, we recruit those who shine out to us!', ['hotel' => setting('hotel_name')]) }}
</p>
</div>
</x-content.content-card>
<x-content.content-card icon="chat-icon" classes="border dark:border-gray-900">
<x-slot:title>
{{ __('Apply for staff') }}
</x-slot:title>
<x-slot:under-title>
{{ __('How to join the staff team', ['hotel' => setting('hotel_name')]) }}
</x-slot:under-title>
<div class="px-2 text-sm space-y-4 dark:text-gray-200">
<p>
{{ __('Every now and then staff applications may open up. Once they do we always make sure to post a news article explaining the process - So make sure you keep an eye out for those in you are interested in joining the :hotel staff team.', ['hotel' => setting('hotel_name')]) }}
</p>
<p>
{!! __(
'You can occasionally also look at the :startTag Staff application page :endTag which will show you all of our current open positions.',
['startTag' => '<a href="/community/staff-applications" class="underline">', 'endTag' => '</a>'],
) !!}
</p>
</div>
</x-content.content-card>
</div>
</x-app-layout>
@@ -0,0 +1,105 @@
<x-app-layout>
@push('title', __('Staff'))
<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->team)
@php
$status = auth()->check()
? ($userAppStatuses[$position->team->id] ?? null) // 'pending'|'approved'|'rejected'|null
: null;
$statusLabel = $status ? ucfirst($status) : null;
$statusColorClasses = match ($status) {
'approved' => 'bg-green-100 text-green-800 dark:bg-green-900/40 dark:text-green-300 border-green-200 dark:border-green-800',
'pending' => 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/40 dark:text-yellow-300 border-yellow-200 dark:border-yellow-800',
'rejected' => 'bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-300 border-red-200 dark:border-red-800',
default => '',
};
@endphp
<x-content.staff-content-section :badge="$position->team->badge" :color="$position->team->staff_color">
<x-slot:title>
<span class="inline-flex items-center gap-2">
{{ $position->team->rank_name }}
@if ($statusLabel)
<span class="inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium {{ $statusColorClasses }}">
{{ $statusLabel }}
</span>
@endif
</span>
</x-slot:title>
<x-slot:under-title>
{{ $position->team?->job_description }}
</x-slot:under-title>
<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="flex justify-between">
@auth
@if ($status)
{{-- Already applied: show a disabled button indicating status --}}
<x-form.secondary-button class="w-full justify-center" disabled>
@switch($status)
@case('pending')
{{ __('Your application is pending') }}
@break
@case('approved')
{{ __('You have been approved') }}
@break
@case('rejected')
{{ __('Your application was rejected') }}
@break
@default
{{ __('Application submitted') }}
@endswitch
</x-form.secondary-button>
@else
{{-- No application yet: show Apply --}}
<a href="{{ route('team-applications.show', $position) }}" class="w-full">
<x-form.primary-button class="w-full justify-center">
{{ __('Apply for :position', ['position' => $position->team->rank_name]) }}
</x-form.primary-button>
</a>
@endif
@else
<a href="{{ route('login') }}" class="w-full">
<x-form.secondary-button class="w-full justify-center">
{{ __('Login to apply') }}
</x-form.secondary-button>
</a>
@endauth
</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 team positions open') }}</x-slot:title>
<x-slot:under-title>{{ __('There are currently no open team positions') }}</x-slot:under-title>
<div class="px-2 text-sm space-y-4 dark:text-gray-200">
<p>{{ __('Please come back later to check for new openings. Thank you!') }}</p>
</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 Team', ['hotel' => setting('hotel_name')]) }}</x-slot:title>
<x-slot:under-title>{{ __('Select a team to get started') }}</x-slot:under-title>
<div class="px-2 text-sm space-y-4 dark:text-gray-200">
<p>{{ __('We open team applications periodically. If you see a team you fit, do not hesitate to apply!') }}</p>
</div>
</x-content.content-card>
</div>
</x-app-layout>
@@ -0,0 +1,56 @@
<x-app-layout>
@push('title', __('Staff'))
<div class="col-span-12 lg:col-span-9 lg:w-[96%]">
<x-content.staff-content-section :badge="$position->team->badge" :color="$position->team->staff_color">
<x-slot:title>
{{ __('You are applying for :position', ['position' => $position->team->rank_name]) }}
</x-slot:title>
<x-slot:under-title>
{{ __('Please fill out the fields below to apply for :position', ['position' => $position->team->rank_name]) }}
</x-slot:under-title>
<form class="flex flex-col gap-y-3" action="{{ route('team-applications.store', $position) }}" method="POST">
@csrf
<div>
<x-form.label for="username" disabled>{{ __('Username') }}</x-form.label>
<x-form.input classes="bg-gray-100" name="username" value="{{ auth()->user()->username }}" :readonly="true" />
</div>
<div>
<x-form.label for="content" disabled>{{ __('About you') }}</x-form.label>
<textarea name="content" class="focus:ring-0 border-4 border-gray-200 rounded dark:bg-gray-800 dark:border-gray-700 dark:text-gray-200 focus:border-[#eeb425] w-full min-h-[180px]">{{ old('content') }}</textarea>
@error('content')
<span class="text-red-500 text-sm">{{ $message }}</span>
@enderror
</div>
@if (setting('google_recaptcha_enabled'))
<div class="g-recaptcha" data-sitekey="{{ config('habbo.site.recaptcha_site_key') }}"></div>
@endif
@if (setting('cloudflare_turnstile_enabled'))
<x-turnstile />
@endif
<x-form.primary-button>
{{ __('Apply for :position', ['position' => $position->team->rank_name]) }}
</x-form.primary-button>
</form>
</x-content.staff-content-section>
</div>
<div class="col-span-12 lg:col-span-3 lg:w-[110%] space-y-4 lg:-ml-[32px]">
<x-content.content-card icon="hotel-icon" classes="border dark:border-gray-900">
<x-slot:title>{{ __('Applying for :position', ['position' => $position->team->rank_name]) }}</x-slot:title>
<x-slot:under-title>{{ __('Read before applying') }}</x-slot:under-title>
<div class="px-2 text-sm space-y-4 dark:text-gray-200">
<p>
{{ __('Please fill out all the fields to apply for :position. Be honest and transparent. Providing incorrect information may lead to removal if hired.', ['position' => $position->team->rank_name]) }}
</p>
</div>
</x-content.content-card>
</div>
</x-app-layout>
@@ -0,0 +1,100 @@
<x-app-layout>
@push('title', __('Staff'))
<div
x-data="{ q: '', hideEmpty: false }"
class="col-span-12 space-y-4"
>
{{-- Toolbar --}}
<div class="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
<h1 class="text-2xl font-semibold tracking-tight">{{ __('Teams') }}</h1>
<div class="flex w-full flex-col items-stretch gap-3 sm:w-auto sm:flex-row sm:items-center">
<div class="relative sm:w-80">
<input
x-model="q"
type="text"
placeholder="{{ __('Search teams…') }}"
class="w-full rounded-xl border border-gray-200 px-4 py-2.5 pr-10 text-sm focus:border-[#eeb425] focus:outline-none focus:ring-0 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-100"
/>
<svg class="pointer-events-none absolute right-3 top-1/2 h-5 w-5 -translate-y-1/2 opacity-60"
xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="m21 21-4.35-4.35M10 18a8 8 0 1 1 0-16 8 8 0 0 1 0 16z" />
</svg>
</div>
<label class="inline-flex items-center gap-2 text-sm">
<input type="checkbox" x-model="hideEmpty"
class="rounded border-gray-300 text-[#eeb425] focus:ring-[#eeb425]" />
<span class="select-none">{{ __('Hide empty teams') }}</span>
</label>
</div>
</div>
{{-- Teams --}}
<div class="flex flex-col gap-y-4">
@forelse ($employees as $employee)
@php
/** @var \Illuminate\Support\Collection $users */
$users = $employee->users ?? collect();
$memberCount = $users->count();
$searchText = trim(($employee->rank_name ?? '') . ' ' . ($employee->job_description ?? ''));
@endphp
<section
x-data="{
name: @js($searchText),
hasMembers: {{ $memberCount > 0 ? 'true' : 'false' }}
}"
x-show="(name.toLowerCase().includes(q.toLowerCase())) && (!hideEmpty || hasMembers)"
x-cloak
>
<x-content.staff-content-section
:badge="$employee->badge"
:color="$employee->staff_color"
class="overflow-hidden rounded-2xl border border-gray-100 shadow-sm dark:border-gray-800"
>
{{-- Header --}}
<div class="flex items-start justify-between">
<div>
<x-slot:title>
{{ $employee->rank_name }}
</x-slot:title>
<x-slot:under-title>
{{ $employee?->job_description }}
</x-slot:under-title>
</div>
{{-- Member count chip --}}
<span class="ml-4 shrink-0 rounded-full border border-gray-200 px-3 py-1 text-xs font-medium dark:border-gray-700">
{{ $memberCount }} {{ \Illuminate\Support\Str::plural(__('member'), $memberCount) }}
</span>
</div>
{{-- Members grid --}}
<div class="mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4">
@forelse ($users as $staff)
<x-community.staff-card :user="$staff" />
@empty
<div class="col-span-full">
<div class="rounded-xl border border-dashed border-gray-200 p-6 text-center text-sm text-gray-500 dark:border-gray-700 dark:text-gray-400">
{{ __('We currently have no staff in this team') }}
</div>
</div>
@endforelse
</div>
</x-content.staff-content-section>
</section>
@empty
<x-content.content-card icon="lighthouse-icon" classes="border dark:border-gray-900">
<x-slot:title>{{ __('No teams found') }}</x-slot:title>
<x-slot:under-title>{{ __('Please check back later.') }}</x-slot:under-title>
<div class="px-2 text-sm space-y-4 dark:text-gray-200">
<p>{{ __('There are no teams to display right now.') }}</p>
</div>
</x-content.content-card>
@endforelse
</div>
</div>
</x-app-layout>