Initial commit

This commit is contained in:
root
2026-05-09 17:28:23 +02:00
commit 9d73f82529
5575 changed files with 281989 additions and 0 deletions
@@ -0,0 +1,24 @@
@props(['article'])
<div class="swiper-slide relative article-image rounded-lg overflow-hidden" style="background-image: url({{ asset('storage/' . $article->image) }})">
<div class="absolute h-[90px] w-full left-0 bottom-0 bg-[#171a23]/95 text-white py-2 px-4">
<h2 class="text-xl font-bold truncate">
{{ $article->title }}
</h2>
<div class="flex justify-between items-center mt-1">
<div class="py-1 px-2 rounded-md bg-black/60 text-sm mt-2 flex gap-1 items-center">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-4 h-4">
<path stroke-linecap="round" stroke-linejoin="round" d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10" />
</svg>
{{ $article->user->username }}
</div>
<a href="{{ route('article.show', $article->slug) }}" class="text-sm mt-1 read-more-link hover:underline">
Read more
</a>
</div>
</div>
</div>
@@ -0,0 +1,50 @@
<x-slot name="title">
<h2 class="text-2xl font-semibold">{{ __('Hello!') }}</h2>
<p class="dark:text-gray-400">
{{ __('There is currently :online users online', ['online' => cache()->remember('online_user_count', 30, fn() => DB::table('users')->where('online', '1')->count())]) }}
</p>
</x-slot>
<form class="flex flex-col gap-y-3" action="{{ route('login') }}" method="POST">
@csrf
<div>
<x-form.label for="username">
{{ __('Username') }}
</x-form.label>
<x-form.input error-bag="login" name="username" value="{{ old('username') }}" placeholder="{{ __('Username') }}"
:autofocus="true" />
</div>
<div>
<x-form.label for="password">
{{ __('Password') }}
</x-form.label>
<x-form.input error-bag="login" name="password" placeholder="{{ __('Password') }}" type="password" />
</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>
{{ __('Login') }}
</x-form.primary-button>
<div class="text-center text-sm font-semibold text-gray-700 dark:text-gray-400">
<a href="{{ route('forgot.password.get') }}" class="hover:underline" x-on:click="open = false">
{{ __('Did you forget your password?') }}
</a>
</div>
<div class="text-center text-sm font-semibold text-gray-700 dark:text-gray-400">
<a href="{{ route('register') }}" class="hover:underline" x-on:click="open = false">
{{ __('Dont have an account? Join now!') }}
</a>
</div>
</form>
@@ -0,0 +1,6 @@
@props(['classes' => ''])
<div
class="text-white rounded bg-[#eeb425] hover:bg-[#e3aa1e] border-[2px] border-[#cf9d15] transition ease-in-out text-center rounded py-1 px-2 text-sm text-white cursor-pointer {{ $classes }}">
{{ $slot }}
</div>
@@ -0,0 +1,34 @@
@props(['user'])
<div class="relative group bg-[#1a1d26] rounded-xl overflow-hidden border border-gray-800 hover:border-gray-600 transition-all duration-300 hover:shadow-lg hover:shadow-black/20">
<div class="absolute inset-0 bg-gradient-to-br from-[#1e222d] to-[#15171f]"></div>
<div class="relative p-5 flex items-center gap-4">
<div class="relative">
<div class="w-20 h-20 rounded-full overflow-hidden border-2 {{ $user->online ? 'border-green-500' : 'border-gray-600' }} shadow-lg">
<img style="image-rendering: pixelated;"
src="{{ setting('avatar_imager') }}{{ $user->look }}&direction=2&head_direction=3&gesture=sml&action=wav&size=l"
alt="{{ $user->username }}"
class="w-full h-full object-cover">
</div>
<div class="absolute -bottom-1 -right-1 w-5 h-5 rounded-full border-2 border-[#1a1d26] {{ $user->online ? 'bg-green-500' : 'bg-gray-500' }}"></div>
</div>
<div class="flex-1 min-w-0">
<a href="{{ route('profile.show', $user->username) }}" class="block">
<h3 class="text-lg font-bold text-white truncate hover:text-blue-400 transition-colors">
{{ $user->username }}
</h3>
</a>
<p class="text-sm text-gray-400 truncate mt-1">
{{ $user->motto ?: 'No motto set' }}
</p>
<div class="flex items-center gap-2 mt-2">
<span class="inline-flex items-center gap-1 text-xs {{ $user->online ? 'text-green-400' : 'text-gray-500' }}">
<span class="w-2 h-2 rounded-full {{ $user->online ? 'bg-green-400' : 'bg-gray-500' }}"></span>
{{ $user->online ? 'Online' : 'Offline' }}
</span>
</div>
</div>
</div>
</div>
@@ -0,0 +1,22 @@
@props(['icon' => '', 'classes' => ''])
<div class="w-full flex flex-col gap-y-4 rounded-lg overflow-hidden bg-[#2b303c] pb-4 shadow-sm text-gray-100 {{ $classes }}">
<div class="flex gap-x-2 bg-[#21242e] p-3">
@if (!empty($icon))
<div class="max-w-12.5 max-h-12.5 min-w-12.5 min-h-12.5 rounded-full relative flex items-center justify-center {{ $icon }}"></div>
@endif
<div class="flex flex-col justify-center text-sm">
<p class="font-semibold text-gray-100">{{ $title }}</p>
@if(isset($underTitle))
<p class="text-gray-300">{{ $underTitle }}</p>
@endif
</div>
</div>
<section class="h-full flex flex-col px-4">
{{ $slot }}
</section>
</div>
@@ -0,0 +1,19 @@
@props(['icon', 'classes' => ''])
<div class="w-full flex flex-col gap-y-4 p-3 rounded-lg overflow-hidden {{ $classes }}">
<div class="flex gap-x-2">
<div
class="max-w-[50px] max-h-[50px] min-w-[50px] min-h-[50px] rounded-full {{ $icon }} relative flex items-center justify-center">
</div>
<div class="flex flex-col">
<p class="font-semibold text-black dark:text-gray-200">{{ $title }}</p>
@if(isset($underTitle))
<p class="dark:text-gray-500">{{ $underTitle }}</p>
@endif
</div>
</div>
{{ $slot }}
</div>
@@ -0,0 +1,22 @@
@props(['iconUrl' => '', 'color' => '', 'classes' => ''])
<div class="w-full flex flex-col gap-y-4 rounded overflow-hidden bg-[#2b303c] pb-3 shadow-sm text-gray-100 {{ $classes }}">
<div class="flex gap-x-2 bg-[#21242e] p-3 text-gray-100">
@if (!empty($iconUrl))
<div style="background-image: url({{ $iconUrl }}); background-color: {{ $color }}; background-repeat: no-repeat; background-position: center;" class="max-w-[50px] max-h-[50px] min-w-[50px] min-h-[50px] rounded-full relative flex items-center justify-center "></div>
@endif
<div class="flex flex-col justify-center text-sm w-full">
<div class="w-full text-[16px]">{{ $title }}</div>
@if(isset($underTitle))
<p class="text-gray-300">{{ $underTitle }}</p>
@endif
</div>
</div>
<section class="h-full flex flex-col px-3">
{{ $slot }}
</section>
</div>
@@ -0,0 +1,22 @@
@props(['badge' => '', 'color' => '#327fa8'])
<div class="w-full flex flex-col gap-y-4 rounded-lg overflow-hidden bg-[#2b303c] pb-4 shadow-sm text-gray-100">
<div class="flex gap-x-2 bg-[#21242e] p-3">
<div class="max-w-12.5 max-h-12.5 min-w-12.5 min-h-12.5 rounded-full relative flex items-center justify-center"
style="background-color: {{ $color }}">
<img src="{{ asset(sprintf('%s/%s.gif', setting('badges_path'), $badge)) }}" alt="">
</div>
<div class="flex flex-col justify-center text-sm">
<p class="font-semibold text-gray-300">{{ $title }}</p>
@if(isset($underTitle))
<p class="text-gray-500">{{ $underTitle }}</p>
@endif
</div>
</div>
<section class="px-3">
{{ $slot }}
</section>
</div>
+13
View File
@@ -0,0 +1,13 @@
@props(['icon'])
<div class="gap-x-3 flex">
<div class="h-[25px] w-[25px] rounded-full {{ $icon }} outline-offset-[3px]"></div>
<div class="dark:text-gray-400 flex gap-x-2">
<span class="font-semibold dark:text-white">
{{ $currency }}
</span>
{{ $slot }}
</div>
</div>
@@ -0,0 +1,21 @@
<div class="h-[210px] dark:bg-gray-900 rounded w-full bg-white shadow-sm relative overflow-hidden transition ease-in-out duration-200">
<div style="background: url('https://i.imgur.com/uGLDOUu.png');" class="article-image">
</div>
<div class="mt-4 px-4">
<p class="font-semibold text-lg truncate dark:text-gray-200">
{{ __('No published articles') }}
</p>
<div class="flex items-center gap-x-2">
<div
class="mt-3 flex h-10 w-10 items-center justify-center overflow-hidden rounded-full bg-gray-100 dark:bg-gray-800">
<img src="{{ setting('avatar_imager') }}&headonly=1" alt="">
</div>
<p class="mt-4 font-semibold dark:text-gray-400">
{{ setting('hotel_name') }}
</p>
</div>
</div>
</div>
+123
View File
@@ -0,0 +1,123 @@
<footer class="w-full h-14 flex items-center justify-center bg-gray-900 text-gray-500 font-bold cursor-pointer transition duration-200 ease-in-out hover:text-gray-400" onclick="showFooter()">
&copy {{ date('Y') }} {{ setting('hotel_name') }} is a not for profit educational project & is in no way affiliated with Sulake Corporation Oy.
</footer>
<style>
.swal2-modal {
background-color: #21242e;
color: #fff;
}
.swal2-html-container {
max-height: 300px;
overflow-y: scroll;
}
</style>
<script>
function showFooter() {
const creditList = [
{
contributor: 'Kasja',
contributions: 'Designing Dusk theme, helping with general design, Fonts for the logo generator, ideas & GFX'
},
{
contributor: 'Nicollas',
contributions: 'Dark mode, Turbolinks, Performance improvements, Article reactions, User sessions, Layout improvements & PT-BR translations'
},
{
contributor: 'Dominic/Mikkel',
contributions: 'Performance improvements & User sessions'
},
{
contributor: 'EntenKoeniq',
contributions: 'Automatic language registration, rooms page, profile page fixes & Paypal shop contributions'
},
{
contributor: 'Kani',
contributions: 'Rcon System & Findretros API'
},
{
contributor: 'Beny',
contributions: 'Findretros API fixes & CF Fixes'
},
{
contributor: 'Live',
contributions: 'French translations, bugfixes & tweaks'
},
{
contributor: 'MisterDeen',
contributions: 'Custom Discord widget, bugfixes & tweaks'
},
{
contributor: 'Assholic',
contributions: 'Fonts for the logo generator'
},
{
contributor: 'DamienJolly',
contributions: 'Bugfixes'
},
{
contributor: 'Danbo',
contributions: 'Bugfixes'
},
{
contributor: 'Diddy/Josh',
contributions: 'Code readability improvements'
},
{
contributor: 'Oliver',
contributions: 'Finnish translations'
},
{
contributor: 'Damue & EntenKoeniq',
contributions: 'German translations'
},
{
contributor: 'Talion',
contributions: 'Turkish translations'
},
{
contributor: 'CentralCee, Rille & Tuborgs',
contributions: 'Swedish translations'
},
{
contributor: 'Yannick',
contributions: 'Netherland translations'
},
{
contributor: 'Gedomi',
contributions: 'Spanish translations'
},
{
contributor: 'Lorenzune',
contributions: 'Italian translations'
},
{
contributor: 'Twana',
contributions: 'Norwegian translations'
},
{
contributor: 'Plow',
contributions: 'French translations'
},
];
const formattedCredits = creditList.map(credit =>
`<strong>${credit.contributor}</strong> ${credit.contributions} <br/>`
).join('');
const creator =
'<a class="text-blue-400 underline" href="https://devbest.com/threads/atom-cms-a-multi-theme-cms.93034/" target="_blank">Object</a>';
const content =
'{{ __('Thank you for playing :hotel. We have put a lot of effort into making the hotel what it is, and we truly appreciate you being here', ['hotel' => setting('hotel_name')]) }}' + '❤️';
const drivenBy = '{{ __(':hotel is driven by Atom CMS made by:', ['hotel' => setting('hotel_name')]) }}';
Swal.fire(
'<span class="text-[26px]">{{ setting('hotel_name') }}</span>',
`<span class="text-sm">${content}<br/><br/>${drivenBy} ${creator}<br/><br/><span class="flex flex-col space-y-2">{{ __('Credits:') }}<br/>${formattedCredits}</span></span>`,
'question'
);
}
</script>
@@ -0,0 +1,6 @@
@props(['classes' => '', 'type' => 'submit'])
<button type="{{ $type }}"
class="w-full rounded bg-[var(--button-danger-color)] hover:bg-[var(--button-danger-hover-color)] text-[var(--button-danger-text-color)] border-2 border-[var(--button-danger-border-color)] transition ease-in-out duration-150 font-semibold px-6 py-2 {{ $classes }}">
{{ $slot }}
</button>
@@ -0,0 +1,14 @@
@props(['errorBag' => '', 'classes' => '', 'name', 'type' => 'text', 'value' => '', 'placeholder' => '', 'required' => true, 'autofocus' => false, 'readonly' => false])
<input
class="{{ $classes }} focus:ring-0 border-2 border-gray-700 rounded bg-[#21242e] focus:border-[#eeb425] w-full text-gray-200 @error($name, $errorBag) border-red-600 ring-red-500 @enderror"
id="{{ $name }}" type="{{ $type }}" name="{{ $name }}" value="{{ $value }}"
autocomplete="{{ $name }}" placeholder="{{ $placeholder }}" @if ($readonly) required @endif
@if ($autofocus) autofocus="{{ $name }}" @endif
@if ($readonly) readonly @endif>
@error($name, $errorBag)
<p class="mt-1 text-xs italic text-red-500">
{{ $message }}
</p>
@enderror
@@ -0,0 +1,11 @@
@props(['for', 'info' => ''])
<div class="mb-2">
<label class="block font-semibold text-gray-700 dark:text-gray-200" for="{{ $for }}">
{{ $slot }}
</label>
<p class="text-gray-500 dark:text-gray-400 text-[14px]">
{{ $info }}
</p>
</div>
@@ -0,0 +1,6 @@
@props(['classes' => '', 'type' => 'submit'])
<button type="{{ $type }}"
class="w-full rounded bg-transparent hover:bg-[var(--button-outline-hover-color)] text-[var(--button-outline-text-color)] border-2 border-[var(--button-outline-color)] transition ease-in-out duration-150 font-semibold px-6 py-2 {{ $classes }}">
{{ $slot }}
</button>
@@ -0,0 +1,6 @@
@props(['classes' => '', 'type' => 'submit'])
<button type="{{ $type }}"
class="{{ $classes }} w-full rounded bg-[#eeb425] text-white p-2 border-2 border-yellow-400 transition ease-in-out duration-200 hover:bg-[#d49f1c] font-semibold">
{{ $slot }}
</button>
@@ -0,0 +1,6 @@
@props(['classes' => '', 'type' => 'submit'])
<button type="{{ $type }}"
class="w-full rounded bg-[var(--button-secondary-color)] hover:bg-[var(--button-secondary-hover-color)] text-[var(--button-secondary-text-color)] border-2 border-[var(--button-secondary-border-color)] transition ease-in-out duration-150 font-semibold px-6 py-2 {{ $classes }}">
{{ $slot }}
</button>
@@ -0,0 +1,19 @@
@props(['name', 'content' => null])
<div class="mt-3">
<textarea name="content" id="editor">
{{ $content ?? ''}}
</textarea>
</div>
<script src="https://cdn.tiny.cloud/1/{{ setting('tinymce_api_key') }}/tinymce/7/tinymce.min.js" referrerpolicy="origin"></script>
<script>
tinymce.init({
selector: 'textarea#editor',
plugins: 'lists image',
toolbar: 'undo redo | blocks| bold italic | bullist numlist checklist | code | table'
});
</script>
@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M2.25 3h1.386c.51 0 .955.343 1.087.835l.383 1.437M7.5 14.25a3 3 0 0 0-3 3h15.75m-12.75-3h11.218c1.121-2.3 2.1-4.684 2.924-7.138a60.114 60.114 0 0 0-16.536-1.84M7.5 14.25 5.106 5.272M6 20.25a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0Zm12.75 0a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0Z" />
</svg>

After

Width:  |  Height:  |  Size: 478 B

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor"
stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7" />
</svg>

After

Width:  |  Height:  |  Size: 218 B

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="h-6 w-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z" />
<path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z" />
</svg>

After

Width:  |  Height:  |  Size: 487 B

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
class="h-5 w-5">
<path stroke-linecap="round" stroke-linejoin="round"
d="M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15" />
</svg>

After

Width:  |  Height:  |  Size: 363 B

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="h-6 w-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M21 11.25v8.25a1.5 1.5 0 0 1-1.5 1.5H5.25a1.5 1.5 0 0 1-1.5-1.5v-8.25M12 4.875A2.625 2.625 0 1 0 9.375 7.5H12m0-2.625V7.5m0-2.625A2.625 2.625 0 1 1 14.625 7.5H12m0 0V21m-8.625-9.75h18c.621 0 1.125-.504 1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125h-18c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125Z" />
</svg>

After

Width:  |  Height:  |  Size: 518 B

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="h-5 w-5">
<path
d="M11.47 3.84a.75.75 0 011.06 0l8.69 8.69a.75.75 0 101.06-1.06l-8.689-8.69a2.25 2.25 0 00-3.182 0l-8.69 8.69a.75.75 0 001.061 1.06l8.69-8.69z" />
<path
d="M12 5.432l8.159 8.159c.03.03.06.058.091.086v6.198c0 1.035-.84 1.875-1.875 1.875H15a.75.75 0 01-.75-.75v-4.5a.75.75 0 00-.75-.75h-3a.75.75 0 00-.75.75V21a.75.75 0 01-.75.75H5.625a1.875 1.875 0 01-1.875-1.875v-6.198a2.29 2.29 0 00.091-.086L12 5.43z" />
</svg>

After

Width:  |  Height:  |  Size: 541 B

@@ -0,0 +1,4 @@
<svg {{ $attributes }} fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"></path>
</svg>

After

Width:  |  Height:  |  Size: 300 B

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
class="h-5 w-5">
<path stroke-linecap="round" stroke-linejoin="round"
d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99" />
</svg>

After

Width:  |  Height:  |  Size: 377 B

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="h-4 w-4">
<path fill-rule="evenodd"
d="M7.5 6a4.5 4.5 0 119 0 4.5 4.5 0 01-9 0zM3.751 20.105a8.25 8.25 0 0116.498 0 .75.75 0 01-.437.695A18.683 18.683 0 0112 22.5c-2.786 0-5.433-.608-7.812-1.7a.75.75 0 01-.437-.695z"
clip-rule="evenodd" />
</svg>

After

Width:  |  Height:  |  Size: 354 B

@@ -0,0 +1,52 @@
@props([
'title',
'icon',
'data',
'valueKey',
'valueType',
'relationship' => null,
'formatValue' => null,
])
<div class="flex flex-col gap-y-3">
<div class="flex gap-2 rounded-md py-2 px-4 bg-[#21242e]/90 text-gray-100 font-bold">
<div class="flex items-center">
<img src="{{ asset('/assets/images/icons/' . $icon) }}" alt="" class="w-4" style="image-rendering: pixelated;">
</div>
{{ $valueType }}
</div>
@foreach ($data as $index => $entry)
<div class="p-3 rounded-md flex items-center justify-between h-[60px] overflow-hidden bg-[#21242e]/90">
<div class="flex gap-2 items-center">
<div class="w-12 h-12 rounded-full overflow-hidden relative leaderboard-background">
<img class="absolute -top-2 left-0"
src="{{ setting('avatar_imager') }}{{ $relationship ? $entry->{$relationship}?->look : $entry->look }}&head_direction=3&gesture=sml"
alt=""/>
</div>
<div class="flex flex-col">
<p class="font-bold text-gray-100">
{{ $relationship ? $entry->{$relationship}?->username : $entry->username }}
</p>
<p class="text-gray-200 text-sm">
{{ $formatValue ? $formatValue($entry->{$valueKey}) : $entry->{$valueKey} }} {{ $valueType }}
</p>
</div>
</div>
<div @class([
'flex items-center justify-center',
'w-8 h-8 rounded-full bg-gray-300' => ($index + 1) > 3,
'leaderboard-position first' => ($index + 1) == 1,
'leaderboard-position second' => ($index + 1) == 2,
'leaderboard-position third' => ($index + 1) == 3,
])>
@if(($index + 1) > 3)
{{ ($index + 1) }}
@endif
</div>
</div>
@endforeach
</div>
@@ -0,0 +1,55 @@
<script src="//cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
var Toast = Swal.mixin({
toast: true,
position: 'top-end',
showConfirmButton: false,
timer: 4000,
timerProgressBar: true,
didOpen: (toast) => {
toast.addEventListener('mouseenter', Swal.stopTimer)
toast.addEventListener('mouseleave', Swal.resumeTimer)
}
})
</script>
@if (session()->has('message'))
<script>
Toast.fire({
icon: 'error',
title: '{{ session()->get('message') }}'
})
</script>
@endif
@if ($errors->any())
@foreach ($errors->all() as $error)
<script>
Toast.fire({
icon: 'error',
title: '{{ $error }}'
})
</script>
@endforeach
@endif
@if ($errors->login)
@foreach ($errors->login->all() as $error)
<script>
Toast.fire({
icon: 'error',
title: '{{ $error }}'
})
</script>
@endforeach
@endif
@if (session()->has('success'))
<script>
Toast.fire({
icon: 'success',
title: '{{ session()->get('success') }}'
})
</script>
@endif
@@ -0,0 +1,5 @@
@props(['classes' => ''])
<div x-data="{ open: false }" class="relative {{ $classes }}">
{{ $slot }}
</div>
@@ -0,0 +1,29 @@
<div x-show="open" style="display: none" x-on:keydown.escape.prevent.stop="open = false" role="dialog" aria-modal="true"
x-id="['modal-title']" :aria-labelledby="$id('modal-title')" class="fixed inset-0 z-50 overflow-y-auto">
<div x-show="open" x-transition x-on:click="open = false"
class="relative flex min-h-screen items-center justify-center overflow-hidden p-4">
{{-- Overlay --}}
<div x-show="open" x-transition.opacity class="fixed inset-0 bg-black/50"></div>
<div x-on:click.stop x-trap.noscroll.inert="open"
class="relative w-full max-w-xl rounded px-6 py-6 shadow-md bg-[#21242e] text-gray-200 lg:max-w-2xl lg:px-8">
<button type="button" x-on:click="open = false"
class="absolute top-3 right-2.5 text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm p-1.5 ml-auto inline-flex items-center dark:hover:bg-gray-800 dark:hover:text-white">
<svg aria-hidden="true" class="h-5 w-5" fill="currentColor" viewBox="0 0 20 20"
xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
clip-rule="evenodd"></path>
</svg>
<span class="sr-only">{{ __('Close modal') }}</span>
</button>
<div class="my-4 flex flex-col items-center" :id="$id('modal-title')">
{{ $title }}
</div>
{{ $slot }}
</div>
</div>
</div>
@@ -0,0 +1,6 @@
@props(['route' => '', 'classes' => '', 'target' => '_self'])
<a href="{{ $route }}" target="{{ $target }}" @class(['dropdown-item
', $classes])>
{{ $slot }}
</a>
@@ -0,0 +1,75 @@
@props(['icon', 'routeGroup' => '', 'classes' => '', 'childClasses' => 'min-w-[150px]', 'uppercase' => false, 'showChevron' => false, 'flexCol' => true])
<div
x-data="{
open: false,
toggle() {
if (this.open) {
return this.close()
}
this.$refs.button.focus()
this.open = true
},
close(focusAfter) {
if (! this.open) return
this.open = false
focusAfter && focusAfter.focus()
},
isTouchDevice: isTouchDevice()
}"
x-on:keydown.escape.prevent.stop="close($refs.button)"
x-on:focusin.window="! $refs.panel.contains($event.target) && close()"
x-id="['dropdown-button']"
x-on:mouseenter="isTouchDevice ? false : toggle()"
x-on:mouseleave="isTouchDevice ? false : toggle()"
x-on:click.stop="isTouchDevice ? toggle() : {}"
@class([
'relative h-auto font-semibold transition duration-300 ease-in-out z-5',
'active' => request()->is($routeGroup),
$classes,
])
>
<!-- Button -->
<button
x-ref="button"
:aria-expanded="open"
:aria-controls="$id('dropdown-button')"
type="button"
@class([
'flex gap-1 items-center transition ease-in-out hover:text-[#ac93da] dropdown-parent',
'flex-col' => $flexCol,
])
>
@if(isset($icon))
<img class="icon" src="{{ asset(sprintf('/assets/images/dusk/%s', $icon)) }}" alt="Missing icon">
@endif
{{ $slot }}
@if($showChevron)
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-gray-400" viewBox="0 0 20 20"
fill="currentColor">
<path fill-rule="evenodd"
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
clip-rule="evenodd"/>
</svg>
@endif
</button>
<!-- Panel -->
<div
x-ref="panel"
x-show="open"
x-transition.origin.top.left
x-on:click.outside="close($refs.button)"
:id="$id('dropdown-button')"
style="display: none;"
@class(['absolute left-0 rounded bg-[#ac93da] shadow-sm whitespace-nowrap overflow-hidden z-[100] flex flex-col py-2 items-center gap-2 dropdown-children mt-1', $childClasses])
>
{{ $children }}
</div>
</div>
@@ -0,0 +1,11 @@
<x-navigation.dropdown classes="!border-none" childClasses="w-[50px] -ml-2 flex items-center" :show-chevron="true" :flex-col="false">
{{ $slot }}
<x-slot:children>
@foreach (languages() as $lang)
<x-navigation.dropdown-child :route="route('language.select', $lang->country_code)" classes="transition ease-in-out duration-300 hover:scale-110 flex justify-center">
<img src="/assets/images/icons/flags/{{ $lang->country_code }}.png" alt="{{ $lang->country_code }}">
</x-navigation.dropdown-child>
@endforeach
</x-slot:children>
</x-navigation.dropdown>
@@ -0,0 +1,109 @@
<nav class="nav-header" x-data="{
open: false,
}" x-on:keydown.escape="open = false" x-effect="document.body.classList.toggle('menu-open', open)">
<div class="w-full min-h-[60px] text-white px-5 relative">
<button @click="open = !open" class="absolute right-5 top-5 z-50 p-2 rounded-lg transition-all duration-200 hover:bg-white/10" aria-controls="dusk-mobile-menu" :aria-expanded="open">
<span class="sr-only">{{ __('Open main menu') }}</span>
<svg x-show="!open" x-cloak xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-7 h-7">
<path stroke-linecap="round" stroke-linejoin="round" d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" />
</svg>
<svg x-show="open" x-cloak xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-7 h-7">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
<div x-show="open" x-cloak
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0 -translate-y-4"
x-transition:enter-end="opacity-100 translate-y-0"
x-transition:leave="transition ease-in duration-200"
x-transition:leave-start="opacity-100 translate-y-0"
x-transition:leave-end="opacity-0 -translate-y-4"
class="flex flex-col text-white gap-x-14 p-4 space-y-3">
<x-navigation.dropdown route-group="help-center*" :show-chevron="true" :flex-col="false">
{{ __('Community') }}
<x-slot:children>
<x-navigation.dropdown-child :route="route('article.index')" @click="open = false">
{{ __('Articles') }}
</x-navigation.dropdown-child>
<x-navigation.dropdown-child :route="route('staff.index')" @click="open = false">
{{ __('Staff') }}
</x-navigation.dropdown-child>
<x-navigation.dropdown-child :route="route('teams.index')" @click="open = false">
{{ __('Teams') }}
</x-navigation.dropdown-child>
<x-navigation.dropdown-child :route="route('staff-applications.index')" @click="open = false">
{{ __('Staff applications') }}
</x-navigation.dropdown-child>
<x-navigation.dropdown-child :route="route('help-center.index')" @click="open = false">
{{ __('Help center') }}
</x-navigation.dropdown-child>
<x-navigation.dropdown-child :route="route('photos.index')" @click="open = false">
{{ __('Photos') }}
</x-navigation.dropdown-child>
</x-slot:children>
</x-navigation.dropdown>
<a href="{{ route('leaderboard.index') }}" class="transition ease-in-out hover:text-[#ac93da]" @click="open = false">
{{ __('Leaderboards') }}
</a>
<a href="{{ route('article.index') }}" class="transition ease-in-out hover:text-[#ac93da]" @click="open = false">
{{ __('News') }}
</a>
<a href="{{ route('welcome') }}" class="transition ease-in-out hover:text-[#ac93da]" @click="open = false">
{{ __('Events') }}
</a>
<a href="{{ route('shop.index') }}" class="transition ease-in-out hover:text-[#ac93da]" @click="open = false">
{{ __('Store') }}
</a>
<x-navigation.dropdown route-group="help-center*" :show-chevron="true" :flex-col="false">
{{ __('Home') }}
<x-slot:children>
@auth
<x-navigation.dropdown-child :route="route('profile.show', Auth::user()->username)" @click="open = false">
{{ __('My profile') }}
</x-navigation.dropdown-child>
<x-navigation.dropdown-child :route="route('settings.account.show')" @click="open = false">
{{ __('Account settings') }}
</x-navigation.dropdown-child>
<form action="{{ route('logout') }}" method="POST">
@csrf
<button type="submit" class="dropdown-item dark:text-gray-200 dark:hover:bg-gray-700 w-full text-left flex items-center gap-2 text-red-400 hover:text-red-300">
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" />
</svg>
{{ __('Logout') }}
</button>
</form>
@endauth
@guest
<x-navigation.dropdown-child :route="route('login')" @click="open = false">
{{ __('Login') }}
</x-navigation.dropdown-child>
<x-navigation.dropdown-child :route="route('register')" @click="open = false">
{{ __('Register') }}
</x-navigation.dropdown-child>
@endguest
</x-slot:children>
</x-navigation.dropdown>
</div>
</div>
</nav>
@@ -0,0 +1,107 @@
<nav class="nav-header">
<div class="max-w-7xl w-full flex justify-between items-center h-[120px]">
<a href="/" class="transition duration-300 ease-in-out hover:scale-105">
<img src="{{ setting('cms_logo') }}" alt="">
</a>
<div class="flex text-white gap-x-14">
<x-navigation.dropdown icon="community_icon.png" route-group="help-center*" :uppercase="true">
{{ __('Community') }}
<x-slot:children>
<x-navigation.dropdown-child :route="route('staff.index')">
{{ __('Staff') }}
</x-navigation.dropdown-child>
<x-navigation.dropdown-child :route="route('teams.index')">
{{ __('Teams') }}
</x-navigation.dropdown-child>
<x-navigation.dropdown-child :route="route('team-applications.index')">
{{ __('Team applications') }}
</x-navigation.dropdown-child>
<x-navigation.dropdown-child :route="route('staff-applications.index')">
{{ __('Staff applications') }}
</x-navigation.dropdown-child>
<x-navigation.dropdown-child :route="route('values.index')">
{{ __('Rare values') }}
</x-navigation.dropdown-child>
<x-navigation.dropdown-child :route="route('help-center.index')">
{{ __('Help center') }}
</x-navigation.dropdown-child>
<x-navigation.dropdown-child :route="route('photos.index')">
{{ __('Photos') }}
</x-navigation.dropdown-child>
</x-slot:children>
</x-navigation.dropdown>
<a href="{{ route('leaderboard.index') }}" class="flex flex-col gap-1 items-center transition ease-in-out hover:text-[#ac93da]">
<img class="icon" src="{{ asset('/assets/images/dusk/leaderboard_icon.png') }}" alt="community icon">
Leaderboards
</a>
<a href="{{ route('article.index') }}" class="flex flex-col gap-1 items-center transition ease-in-out hover:text-[#ac93da]">
<img class="icon" src="{{ asset('/assets/images/dusk/news_icon.png') }}" alt="community icon">
News
</a>
{{--
<a href="#" class="flex flex-col gap-1 items-center transition ease-in-out hover:text-[#ac93da]">
<img class="icon" src="{{ asset('/assets/images/dusk/events_icon.png') }}" alt="community icon">
Events
</a>
--}}
<a href="{{ route('shop.index') }}" class="flex flex-col gap-1 items-center transition ease-in-out hover:text-[#ac93da]">
<img class="icon" src="{{ asset('/assets/images/dusk/store_icon.png') }}" alt="community icon">
Store
</a>
<x-navigation.dropdown icon="home_icon.png" route-group="user*" :uppercase="true">
{{ __('Home') }}
<x-slot:children>
@auth
<x-navigation.dropdown-child :route="route('profile.show', Auth::user()->username)">
{{ __('My profile') }}
</x-navigation.dropdown-child>
<x-navigation.dropdown-child :route="route('draw-badge')">
{{ __('Badge Drawer') }}
</x-navigation.dropdown-child>
<x-navigation.dropdown-child :route="route('settings.account.show')">
{{ __('Account settings') }}
</x-navigation.dropdown-child>
<form action="{{ route('logout') }}" method="POST">
@csrf
<button type="submit" class="dropdown-item text-red-400 hover:text-red-300 flex items-center gap-2">
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" />
</svg>
{{ __('Logout') }}
</button>
</form>
@endauth
@guest
<x-navigation.dropdown-child :route="route('login')">
{{ __('Login') }}
</x-navigation.dropdown-child>
<x-navigation.dropdown-child :route="route('register')">
{{ __('Register') }}
</x-navigation.dropdown-child>
@endguest
</x-slot:children>
</x-navigation.dropdown>
</div>
</div>
</nav>
@@ -0,0 +1,17 @@
@props(['icon' => '', 'classes' => '', 'subHeader'])
<div class="w-full bg-[#21242e] p-3 rounded-lg flex gap-2 items-center {{ $classes }}">
@if (!empty($icon))
{{ $icon }}
@endif
<div class="flex-col px-2">
<div class="text-lg font-bold text-gray-100 flex items-center">
{{ $slot }}
</div>
@if(isset($subHeader))
<p class="text-gray-500">{{ $subHeader }}</p>
@endif
</div>
</div>
+13
View File
@@ -0,0 +1,13 @@
@props(['photo'])
<a href="{{ $photo->url }}" data-fancybox="gallery" class="cursor-pointer relative transition duration-300 ease-in-out hover:scale-[102%]">
<div class="photo-overlay"></div>
<img class="h-[250px] w-full object-cover object-center rounded-md custom-shadow" src="{{ $photo->url }}" alt="">
<div class="absolute right-2 bottom-2 bg-black/70 p-2 rounded-md text-white flex gap-x-2 z-[5]">
<img class="self-center" src="{{ asset('/assets/images/dusk/author_camera_icon.png') }}" alt="">
<small>
{{ $photo->user->username }}
</small>
</div>
</a>
@@ -0,0 +1,43 @@
@props(['rare'])
<div class="p-3 rounded bg-gray-200 dark:bg-gray-700 flex gap-x-6 gap-4 items-center overflow-hidden">
<div class="w-8 h-8">
<div class="w-10 h-10 overflow-hidden rounded-full flex items-center justify-center bg-gray-300 dark:bg-gray-800">
<img src="{{ sprintf('%s/%s', setting('furniture_icons_path'), $rare->furniture_icon) }}" alt="">
</div>
</div>
<div class="flex flex-col w-full">
<div class="font-bold text-gray-700 dark:text-gray-200 truncate flex items-center gap-x-[5px]">
@if($rare->item_id)
<a href="{{ route('values.value', $rare) }}" class="underline">
{{ strLimit($rare->name, 15) }}
</a>
@else
{{ strLimit($rare->name, 20) }}
@endif
@if($rare->isLimitedEdition())
<img class="w-4 h-4" src="{{ asset('/assets/images/icons/ltd.png') }}" alt="">
@endif
</div>
<div class="w-full bg-yellow-400 rounded h-[35px] flex items-center mt-2">
<div class="bg-yellow-500 rounded-l w-1/3 px-4 h-full flex items-center justify-center">
<img src="{{ asset('assets/images/icons/currency/credits.png') }}" alt="">
</div>
<p class="w-full text-center truncate">
{{ $rare->credit_value ?? 0 }} {{ __('credits') }}
</p>
</div>
<div class="w-full bg-gray-500 rounded h-[35px] flex items-center mt-1">
<div class="bg-gray-600 rounded-l w-1/3 px-4 h-full flex items-center justify-center">
<img src="{{ asset('/assets/images/icons/navigation/shop.png') }}" alt="">
</div>
<p class="w-full text-center truncate">
{{ $rare->currency_value ?? 0 }} {{ $rare->currency_type === 0 ? 'Duckets' : ($rare->currency_type === 5 ? 'Diamonds' : 'Other') }}
</p>
</div>
</div>
</div>
@@ -0,0 +1,95 @@
@props(['package', 'gift' => false])
<x-modals.regular-modal>
<x-slot name="title">
<h2 class="text-2xl">
{{ __(':package contents', ['package' => $package->name]) }}
</h2>
</x-slot>
<ul class="list-disc pl-4">
@if($package->features)
@foreach($package->features as $feature)
<li class="ml-3">
{{ $feature->content }}
</li>
@endforeach
@endif
@if ($package->credits)
<li class="ml-3">{{ number_format($package->credits, 0, '.', '.') }} credits</li>
@endif
@if ($package->duckets)
<li class="ml-3">{{ number_format($package->duckets, 0, '.', '.') }} duckets</li>
@endif
@if ($package->diamonds)
<li class="ml-3">{{ number_format($package->diamonds, 0, '.', '.') }} diamonds</li>
@endif
@if ($package->rank)
<li class="ml-3">
{{ $package->rank->rank_name }} rank
</li>
@endif
</ul>
<div class="mt-6">
<p class="font-bold">
{{ __('Other features:') }}
</p>
<div class="flex flex-col gap-3 text-gray-100 mt-3 bg-[#303642] p-4 rounded-md">
@if (!empty($package->badges))
<p>
{{ __('Badge(s) included:') }}
</p>
<div class="flex flex-wrap gap-2 items-center">
@foreach (explode(';', $package->badges) as $badge)
<div
class="h-[50px] w-[50px] overflow-hidden p-2 bg-[#444d5c] rounded-md flex items-center justify-center">
<img data-tippy-content="1x {{ $badge }}"
src="/client/flash/c_images/album1584/{{$badge}}.gif" alt="{{ $badge }}"
style="image-rendering: auto;">
</div>
@endforeach
</div>
@endif
@if ($package->furniture)
<p>
{{ __('Furniture included:') }}
</p>
<div class="flex flex-col dark:text-white">
<div class="flex flex-wrap gap-2 items-center">
@foreach ($package->furniItems() as $furni)
<div
class="h-[50px] w-[50px] overflow-hidden p-2 bg-[#444d5c] rounded-md flex items-center justify-center">
<img
data-tippy-content="{{ collect(json_decode($package->furniture))->firstWhere('item_id', $furni->id)->amount }}x {{ $furni->public_name }}"
src="{{$furni->icon()}}" alt="{{ __('Missing icon') }}">
</div>
@endforeach
</div>
</div>
@endif
</div>
</div>
<div class="mt-4">
<form action="{{ route('shop.buy', $package) }}" method="POST" class="w-full">
@csrf
@if($gift)
<x-form.input name="receiver" type="text" placeholder="Enter the name of the recipient you want to gift" classes="mb-2"/>
@endif
<button type="submit"
class="w-full rounded bg-green-600 hover:bg-green-700 text-white p-2 border-2 border-green-500 transition ease-in-out duration-150 font-semibold">
{{ __('Buy for $:cost', ['cost' => $package->price()]) }}
</button>
</form>
</div>
</x-modals.regular-modal>
@@ -0,0 +1,62 @@
<x-content.shop-card color="{{ $article->color }}">
<x-slot:title>
<div class="flex justify-between w-full">
<p>
{{ $article->name }}
</p>
<span class="font-bold">
${{ $article->price() }}
</span>
</div>
</x-slot:title>
<div class="flex justify-between dark:text-white w-full">
<div class="flex flex-col items-center w-full">
<div class="flex justify-center w-full">
<div class="p-2 max-w-[65px] max-h-[65px]">
<img src="{{ $article->icon_url }}" alt="">
</div>
</div>
<div class="text-gray-100 mt-4">
{{ $article->info }}
</div>
</div>
</div>
<div class="pt-4 mt-auto flex gap-4">
<div class="w-full flex gap-2">
<x-modals.modal-wrapper>
<div x-on:click="open = true">
<x-form.primary-button classes="px-4 w-full !text-yellow-100">
<x-icons.eye />
</x-form.primary-button>
</div>
<x-shop.package-content :package="$article"/>
</x-modals.modal-wrapper>
@if($article->is_giftable)
<x-modals.modal-wrapper>
<div x-on:click="open = true">
<x-form.primary-button classes="!text-blue-100 px-4 w-full !bg-[#0b80b3] !border-[#1891c4] hover:!bg-[#096891] transition-all">
<x-icons.gift />
</x-form.primary-button>
</div>
<x-shop.package-content :package="$article" :gift="true"/>
</x-modals.modal-wrapper>
@endif
</div>
<form action="{{ route('shop.buy', $article) }}" method="POST">
@csrf
<x-form.secondary-button type="submit" classes="text-green-100 px-4">
Buy
</x-form.secondary-button>
</form>
</div>
</x-content.shop-card>
@@ -0,0 +1,20 @@
@props(['placement' => 'left', 'classes' => ''])
<div
@class([
'w-full flex mt-3',
'justify-start' => $placement === 'left',
'justify-center' => $placement === 'center',
'justify-end' => $placement === 'right',
])
class="{{ $classes }}"
>
@if (setting('google_recaptcha_enabled'))
<div class="mt-4 g-recaptcha"
data-sitekey="{{ config('habbo.site.recaptcha_site_key') }}"></div>
@endif
@if (setting('cloudflare_turnstile_enabled') === '1')
<x-turnstile />
@endif
</div>
@@ -0,0 +1,121 @@
<x-content.content-card icon="discord-icon" classes="border dark:border-gray-900">
<x-slot:title>
{{ __('Discord') }}
</x-slot:title>
<x-slot:under-title>
<span id="guildName"></span>
</x-slot:under-title>
<div class="text-sm dark:text-gray-200">
<div id="guildUsers" class="h-[129px] overflow-auto"> </div>
<a id="guildInvite" target="blank">
<x-form.secondary-button classes="mt-3">
{{ __('Join server') }}
</x-form.secondary-button>
</a>
</div>
</x-content.content-card>
@push('javascript')
<script>
window.onload = DiscordApi();
function DiscordApi() {
let init = {
method: 'GET',
mode: 'cors',
cache: 'reload'
}
//gets discord widget json from url with in settings specifed id
fetch("https://discordapp.com/api/guilds/{{ setting('discord_widget_id') }}/widget.json", init).then(
function(res) {
//if there is a problem with discord or id sends an error message in console
if (res.status != 200) {
console.error("Discord widget cant connect to discord (" + res.status + ")");
return;
}
res.json().then(function(data) {
let users = data.members;
let guildName = data.name;
//sets the subtitle of the card to the guild name
document.getElementById('guildName').innerText = guildName;
//loops over every user in json array and display them in the widget
for (let i = 0; i < data.members.length; i++) {
let container = document.createElement('div')
let leftContainer = document.createElement('div')
let imgContainer = document.createElement('div')
let img = document.createElement('img')
let status = document.createElement('div')
let rightContainer = document.createElement('div')
let name = document.createElement('p')
let motto = document.createElement('p')
//sets styleing
container.classList.add('flex', 'items-center', 'gap-x-2')
leftContainer.classList.add('relative')
imgContainer.classList.add('h-9', 'w-9', 'bg-gray-100', 'dark:bg-gray-800',
'rounded-full', 'flex', 'items-center', 'justify-center', 'overflow-hidden')
status.classList.add('absolute', 'bottom-0', 'right-0', 'w-3', 'h-3',
'rounded-full', 'border-2', 'dark:border-gray-800')
name.classList.add('font-semibold')
motto.classList.add('dark:text-gray-400')
//sets styling for exceptions
if (i === 0) {
name.classList.add('mt-1')
}
if (i !== 0) {
imgContainer.classList.add('mt-1')
name.classList.add('mt-3')
}
if (users[i].status === 'online') {
status.style.backgroundColor = "#16a34a";
}
if (users[i].status === 'idle') {
status.style.backgroundColor = "#e9b124";
}
if (users[i].status === 'dnd') {
status.style.backgroundColor = "#9c0017";
}
//adds attributes to elements
img.setAttribute('src', data.members[i].avatar_url);
if (users[i].nick === undefined) {
name.innerText = users[i].username;
} else {
name.innerText = users[i].nick;
}
if (users[i].game !== undefined) {
motto.innerText = users[i].game.name;
}
//append all elements to each other
container.appendChild(leftContainer)
leftContainer.appendChild(imgContainer)
imgContainer.appendChild(img)
leftContainer.appendChild(status)
container.appendChild(rightContainer)
rightContainer.appendChild(name)
rightContainer.appendChild(motto)
document.getElementById('guildUsers').appendChild(container)
}
//Checks if join server link is null and removes btn form webpage
if (data.instant_invite === null) {
document.getElementById('guildInvite').remove()
document.getElementById('guildUsers').style.height = "176px"
} else {
//Gives the "Join server" button a href to the default selected channel in the server
//link is recived from widget json
document.getElementById('guildInvite').setAttribute('href', data.instant_invite)
}
})
});
}
</script>
@endpush
@@ -0,0 +1,21 @@
@props(['user'])
<div class="relative flex items-center justify-between overflow-hidden rounded px-10 me-backdrop"
style="background: rgba(0, 0, 0, 0.3) url({{ setting('cms_me_backdrop') }});">
<div>
<a href="{{ route('profile.show', $user) }}"
class="absolute -bottom-12 left-0 drop-shadow transition duration-300 ease-in-out hover:scale-105">
<img style="image-rendering: pixelated;"
src="{{ setting('avatar_imager') }}{{ $user->look }}&direction=2&head_direction=3&gesture=sml&action=wav&size=l"
alt="">
</a>
</div>
<a data-turbolinks="false" href="{{ route('nitro-client') }}">
<button
class="cms-button bg-yellow-500 hover:bg-yellow-400 text-yellow-900 font-bold py-2 px-4 rounded-lg shadow-lg transition-all duration-300 hover:scale-105">
{{ __('Go to :hotel', ['hotel' => setting('hotel_name')]) }}
</button>
</a>
</div>
@@ -0,0 +1,15 @@
@props(['colSpan'])
<div class="col-span-2 lg:col-span-{{ $colSpan }}">
{{ $image }}
<div class="shadow">
<div class="flex gap-x-2 rounded-t border-b bg-gray-50 p-3 dark:border-gray-700 dark:bg-gray-900">
<p class="font-semibold text-black dark:text-white">{{ $title }}</p>
</div>
<section class="rounded-b bg-white p-3 dark:bg-gray-800 dark:text-white">
{{ $slot }}
</section>
</div>
</div>
@@ -0,0 +1,47 @@
<a href="{{ route('settings.account.show') }}"
class="{{ request()->routeIs('settings.account.show') ? 'bg-[#eeb425] text-white' : 'bg-[#21242e]' }} text-gray-100 flex gap-x-2 justify-center items-center rounded p-2 md:p-6 text-center md:text-xl font-semibold transition duration-200 ease-in-out hover:bg-[#eeb425] hover:text-white">
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"
stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round"
d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
<path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
{{ __('Account settings') }}
</a>
<a href="{{ route('settings.password.show') }}"
class="{{ request()->routeIs('settings.password.show') ? 'bg-[#eeb425] text-white' : 'bg-[#21242e]' }} text-gray-100 flex gap-x-2 justify-center rounded p-2 md:p-6 text-center md:text-xl font-semibold transition duration-200 ease-in-out hover:bg-[#eeb425] hover:text-white">
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"
stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round"
d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" />
</svg>
{{ __('Password settings') }}
</a>
<a href="{{ route('settings.two-factor') }}"
class="{{ request()->routeIs('settings.two-factor') ? 'bg-[#eeb425] text-white' : 'bg-[#21242e]' }} text-gray-100 flex gap-x-2 justify-center rounded p-2 md:p-6 text-center md:text-xl font-semibold transition duration-200 ease-in-out hover:bg-[#eeb425] hover:text-white">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
class="h-6 w-6">
<path stroke-linecap="round" stroke-linejoin="round"
d="M7.864 4.243A7.5 7.5 0 0119.5 10.5c0 2.92-.556 5.709-1.568 8.268M5.742 6.364A7.465 7.465 0 004.5 10.5a7.464 7.464 0 01-1.15 3.993m1.989 3.559A11.209 11.209 0 008.25 10.5a3.75 3.75 0 117.5 0c0 .527-.021 1.049-.064 1.565M12 10.5a14.94 14.94 0 01-3.6 9.75m6.633-4.596a18.666 18.666 0 01-2.485 5.33" />
</svg>
{{ __('Two factor') }}
</a>
<a href="{{ route('settings.session-logs') }}"
class="{{ request()->routeIs('settings.session-logs') ? 'bg-[#eeb425] text-white' : 'bg-[#21242e]' }} text-gray-100 flex gap-x-2 justify-center rounded p-2 md:p-6 text-center md:text-xl font-semibold transition duration-200 ease-in-out hover:bg-[#eeb425] hover:text-white">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5"
stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<rect x="5" y="3" width="14" height="18" rx="2" />
<line x1="9" y1="7" x2="15" y2="7" />
<line x1="9" y1="11" x2="15" y2="11" />
<line x1="9" y1="15" x2="13" y2="15" />
</svg>
{{ __('Session logs') }}
</a>