diff --git a/config/forum.api.php b/config/forum/api.php
similarity index 86%
rename from config/forum.api.php
rename to config/forum/api.php
index e54d1807f..75811cc2b 100644
--- a/config/forum.api.php
+++ b/config/forum/api.php
@@ -4,10 +4,10 @@ return [
/*
|--------------------------------------------------------------------------
- | Enable/disable
+ | Enable/disable feature
|--------------------------------------------------------------------------
|
- | Set to false if you want to effectively disable the API.
+ | Whether or not to enable the API feature.
|
*/
@@ -24,21 +24,6 @@ return [
'enable_search' => true,
- /*
- |--------------------------------------------------------------------------
- | Resources
- |--------------------------------------------------------------------------
- |
- | Override to return your own resources for API responses
- |
- */
-
- 'resources' => [
- 'category' => TeamTeaTime\Forum\Http\Resources\CategoryResource::class,
- 'thread' => TeamTeaTime\Forum\Http\Resources\ThreadResource::class,
- 'post' => TeamTeaTime\Forum\Http\Resources\PostResource::class,
- ],
-
/*
|--------------------------------------------------------------------------
| Router
@@ -51,9 +36,24 @@ return [
'router' => [
'prefix' => '/forum/api',
'as' => 'forum.api.',
- 'namespace' => '\TeamTeaTime\Forum\Http\Controllers\Api',
+ 'namespace' => '\\TeamTeaTime\\Forum\\Http\\Controllers\\Api',
'middleware' => ['api', 'auth:api'],
'auth_middleware' => ['auth:api'],
],
+ /*
+ |--------------------------------------------------------------------------
+ | Resources
+ |--------------------------------------------------------------------------
+ |
+ | Override to return your own resources for API responses.
+ |
+ */
+
+ 'resources' => [
+ 'category' => TeamTeaTime\Forum\Http\Resources\CategoryResource::class,
+ 'thread' => TeamTeaTime\Forum\Http\Resources\ThreadResource::class,
+ 'post' => TeamTeaTime\Forum\Http\Resources\PostResource::class,
+ ],
+
];
diff --git a/config/forum.web.php b/config/forum/frontend.php
similarity index 69%
rename from config/forum.web.php
rename to config/forum/frontend.php
index 5cf84265b..82433e8f2 100644
--- a/config/forum.web.php
+++ b/config/forum/frontend.php
@@ -4,28 +4,39 @@ return [
/*
|--------------------------------------------------------------------------
- | Enable/disable
+ | Enable/disable feature
|--------------------------------------------------------------------------
|
- | Set to false if you want to effectively disable the frontend.
+ | Whether or not to enable the frontend feature.
|
*/
'enable' => true,
+ /*
+ |--------------------------------------------------------------------------
+ | Preset
+ |--------------------------------------------------------------------------
+ |
+ | The frontend preset to use. Must be installed with the
+ | forum:preset-install command.
+ |
+ */
+
+ 'preset' => 'livewire-tailwind',
+
/*
|--------------------------------------------------------------------------
| Router
|--------------------------------------------------------------------------
|
- | Web router config.
+ | Router config for the frontend routes.
|
*/
'router' => [
'prefix' => '/forum',
'as' => 'forum.',
- 'namespace' => '\TeamTeaTime\Forum\Http\Controllers\Web',
'middleware' => ['web'],
'auth_middleware' => ['auth'],
],
@@ -35,7 +46,7 @@ return [
| Route Prefixes
|--------------------------------------------------------------------------
|
- | Prefixes to use for each model.
+ | Prefixes to use for each model in frontend routes.
|
*/
@@ -61,11 +72,11 @@ return [
| Utility Class
|--------------------------------------------------------------------------
|
- | Here we specify the class to use for various web utility methods.
+ | Here we specify the class to use for various frontend utility methods.
| This is automatically aliased to 'Forum' for ease of use in views.
|
*/
- 'utility_class' => TeamTeaTime\Forum\Support\Web\Forum::class,
+ 'utility_class' => TeamTeaTime\Forum\Support\Frontend\Forum::class,
];
diff --git a/config/forum.general.php b/config/forum/general.php
similarity index 98%
rename from config/forum.general.php
rename to config/forum/general.php
index 776db8d37..f95132fa3 100644
--- a/config/forum.general.php
+++ b/config/forum/general.php
@@ -16,7 +16,7 @@ return [
|
*/
- 'old_thread_threshold' => '30 days',
+ 'old_thread_threshold' => '7 days',
/*
|--------------------------------------------------------------------------
diff --git a/config/forum.integration.php b/config/forum/integration.php
similarity index 100%
rename from config/forum.integration.php
rename to config/forum/integration.php
diff --git a/config/gearer.php b/config/gearer.php
deleted file mode 100644
index 2433d60c2..000000000
--- a/config/gearer.php
+++ /dev/null
@@ -1,24 +0,0 @@
- env('MYCELIUM_GATEWAY_ID', ''),
- 'gateway_secret' => env('MYCELIUM_GATEWAY_SECRET', ''),
-
- /*
- |--------------------------------------------------------------------------
- | Default configuration
- |--------------------------------------------------------------------------
- |
- | Define default callback data that will be used before any custom data are set
- */
- 'defaults' => [
- 'callback_data' => [
- //'foo' => 'bar'
- ],
- ],
-];
diff --git a/resources/css/app.css b/resources/css/app.css
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/forum/blade-tailwind/css/forum.css b/resources/forum/blade-tailwind/css/forum.css
new file mode 100644
index 000000000..6e72d22ce
--- /dev/null
+++ b/resources/forum/blade-tailwind/css/forum.css
@@ -0,0 +1,35 @@
+@import url('https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap');
+
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ .forum {
+ font-family: "Open Sans", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: 400;
+ font-style: normal;
+ font-variation-settings: "wdth" 100;
+ }
+
+ h1 {
+ @apply text-4xl my-6;
+ }
+
+ h2 {
+ @apply text-2xl;
+ }
+
+ h3 {
+ @apply text-xl;
+ }
+
+ a {
+ @apply text-blue-500;
+ }
+
+ a:hover {
+ @apply text-blue-800;
+ }
+}
diff --git a/resources/forum/blade-tailwind/js/forum.js b/resources/forum/blade-tailwind/js/forum.js
new file mode 100644
index 000000000..828787a00
--- /dev/null
+++ b/resources/forum/blade-tailwind/js/forum.js
@@ -0,0 +1,154 @@
+import feather from 'feather-icons';
+import { createApp, ref, reactive, watch } from 'vue/dist/vue.esm-bundler.js';
+import axios from 'axios';
+import Pickr from '@simonwep/pickr';
+import draggable from 'vuedraggable/src/vuedraggable';
+
+import '@simonwep/pickr/dist/themes/classic.min.css';
+
+window.axios = axios;
+window.Vue = { createApp, ref, reactive, watch };
+window.VueDraggable = draggable;
+
+document.addEventListener('DOMContentLoaded', function () {
+ createApp({
+ setup() {
+ const isCollapsed = ref(true);
+ const isUserDropdownCollapsed = ref(true);
+
+ window.addEventListener('click', event => {
+ const ignore = ['navbar-toggler', 'navbar-toggler-icon', 'dropdown-toggle'];
+ if (ignore.some(className => event.target.classList.contains(className))) return;
+ if (!isCollapsed.value) isCollapsed.value = true;
+ if (!isUserDropdownCollapsed.value) isUserDropdownCollapsed.value = true;
+ });
+
+ return {
+ isCollapsed,
+ isUserDropdownCollapsed,
+ };
+ }
+ }).mount('.v-navbar');
+
+ function findModal(key)
+ {
+ const modal = document.querySelector(`[data-modal=${key}]`);
+
+ if (!modal) throw `Attempted to open modal '${key}' but no such modal found.`;
+
+ return modal;
+ }
+
+ function openModal(modal)
+ {
+ setTimeout(function()
+ {
+ modal.classList.remove('hidden');
+ modal.classList.add('flex');
+ }, 200);
+ }
+
+ document.querySelectorAll('[data-open-modal]').forEach(item =>
+ {
+ item.addEventListener('click', event =>
+ {
+ event.preventDefault();
+
+ openModal(findModal(event.currentTarget.dataset.openModal));
+ });
+ });
+
+ document.querySelectorAll('[data-close-modal]').forEach(modalClose =>
+ {
+ modalClose.addEventListener('click', event =>
+ {
+ event.preventDefault
+
+ setTimeout(function()
+ {
+ modalClose.closest('[data-modal]').classList.remove('flex');
+ modalClose.closest('[data-modal]').classList.add('hidden');
+ }, 200);
+ });
+ });
+
+ document.querySelectorAll('[data-dismiss]').forEach(item =>
+ {
+ item.addEventListener('click', event => event.currentTarget.parentElement.style.display = 'none');
+ });
+
+ const hash = window.location.hash.substr(1);
+ if (hash.startsWith('modal='))
+ {
+ openModal(findModal(hash.replace('modal=','')));
+ }
+
+ feather.replace();
+
+ const input = document.querySelector('input[name=color]');
+
+ if (!input) return;
+
+ const pickr = Pickr.create({
+ el: '.pickr',
+ theme: 'classic',
+ default: input.value || null,
+
+ swatches: [
+ window.defaultCategoryColor,
+ '#f44336',
+ '#e91e63',
+ '#9c27b0',
+ '#673ab7',
+ '#3f51b5',
+ '#2196f3',
+ '#03a9f4',
+ '#00bcd4',
+ '#009688',
+ '#4caf50',
+ '#8bc34a',
+ '#cddc39',
+ '#ffeb3b',
+ '#ffc107'
+ ],
+
+ components: {
+ preview: true,
+ hue: true,
+ interaction: {
+ input: true,
+ save: true
+ }
+ },
+
+ strings: {
+ save: 'Apply'
+ }
+ });
+
+ pickr.on('save', instance => pickr.hide())
+ .on('clear', instance =>
+ {
+ input.value = '';
+ input.dispatchEvent(new Event('change'));
+ })
+ .on('cancel', instance =>
+ {
+ const selectedColor = instance
+ .getSelectedColor()
+ .toHEXA()
+ .toString();
+
+ input.value = selectedColor;
+ input.dispatchEvent(new Event('change'));
+ })
+ .on('change', (color, instance) =>
+ {
+ const selectedColor = color
+ .toHEXA()
+ .toString();
+
+ input.value = selectedColor;
+ input.dispatchEvent(new Event('change'));
+ });
+});
diff --git a/resources/forum/blade-tailwind/views/category/index.blade.php b/resources/forum/blade-tailwind/views/category/index.blade.php
new file mode 100644
index 000000000..93eeb6de4
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/category/index.blade.php
@@ -0,0 +1,20 @@
+{{-- $category is passed as NULL to the master layout view to prevent it from showing in the breadcrumbs --}}
+@extends ('forum::layouts.main', ['category' => null])
+
+@section ('content')
+
+
{{ trans('forum::general.index') }}
+
+ @can ('createCategories')
+
+ {{ trans('forum::categories.create') }}
+
+
+ @include ('forum::category.modals.create')
+ @endcan
+
+
+ @foreach ($categories as $category)
+ @include ('forum::category.partials.list', ['titleClass' => 'lead'])
+ @endforeach
+@stop
diff --git a/resources/forum/blade-tailwind/views/category/manage.blade.php b/resources/forum/blade-tailwind/views/category/manage.blade.php
new file mode 100644
index 000000000..be48382b5
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/category/manage.blade.php
@@ -0,0 +1,115 @@
+@extends ('forum::layouts.main', ['category' => null, 'thread' => null, 'breadcrumbs_append' => [trans('forum::general.manage')]])
+
+@section ('content')
+
+
{{ trans('forum::general.manage') }}
+
+ @can ('createCategories')
+
+ {{ trans('forum::categories.create') }}
+
+
+ @include ('forum::category.modals.create')
+ @endcan
+
+
+
+
+
+
+
+ {{ trans('forum::general.changes_applied') }}
+
+
+
+
+
+
+
+
+
+
+
+@stop
diff --git a/resources/forum/blade-tailwind/views/category/modals/create.blade.php b/resources/forum/blade-tailwind/views/category/modals/create.blade.php
new file mode 100644
index 000000000..6d8301610
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/category/modals/create.blade.php
@@ -0,0 +1,31 @@
+@component('forum::modal-form')
+ @slot('key', 'create-category')
+ @slot('title', trans('forum::categories.create'))
+ @slot('route', Forum::route('category.store'))
+
+
+ {{ trans('forum::general.title') }}
+
+
+
+ {{ trans('forum::general.description') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @include ('forum::category.partials.inputs.color')
+
+ @slot('actions')
+ {{ trans('forum::general.create') }}
+ @endslot
+@endcomponent
diff --git a/resources/forum/blade-tailwind/views/category/modals/delete.blade.php b/resources/forum/blade-tailwind/views/category/modals/delete.blade.php
new file mode 100644
index 000000000..e313edb40
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/category/modals/delete.blade.php
@@ -0,0 +1,21 @@
+@component('forum::modal-form')
+ @slot('key', 'delete-category')
+ @slot('title', trans('forum::general.delete'))
+ @slot('route', Forum::route('category.delete', $category))
+ @slot('method', 'DELETE')
+
+ {{ trans('forum::general.generic_confirm') }}
+
+ @if(!$category->isEmpty())
+
+
+
+
+ @endif
+
+ @slot('actions')
+ {{ trans('forum::general.delete') }}
+ @endslot
+@endcomponent
diff --git a/resources/forum/blade-tailwind/views/category/modals/edit.blade.php b/resources/forum/blade-tailwind/views/category/modals/edit.blade.php
new file mode 100644
index 000000000..c5a6ce3a0
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/category/modals/edit.blade.php
@@ -0,0 +1,40 @@
+@component('forum::modal-form')
+ @slot('key', 'edit-category')
+ @slot('title', trans('forum::general.edit'))
+ @slot('route', Forum::route('category.update', $category))
+ @slot('method', 'PATCH')
+
+
+ {{ trans('forum::general.title') }}
+
+
+
+ {{ trans('forum::general.description') }}
+
+
+
+
+
+ accepts_threads ? 'checked' : '' }}>
+
+
+
+
+
+
+ is_private ? 'checked' : '' }} {{ $privateAncestor != null ? 'disabled' : '' }}>
+
+
+
+ @if ($privateAncestor != null)
+
+ @endif
+
+ @include ('forum::category.partials.inputs.color')
+
+ @slot('actions')
+ {{ trans('forum::general.save') }}
+ @endslot
+@endcomponent
diff --git a/resources/forum/blade-tailwind/views/category/modals/mark-threads-as-read.blade.php b/resources/forum/blade-tailwind/views/category/modals/mark-threads-as-read.blade.php
new file mode 100644
index 000000000..b2fc42d07
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/category/modals/mark-threads-as-read.blade.php
@@ -0,0 +1,16 @@
+@component('forum::modal-form')
+ @slot('key', 'mark-threads-as-read')
+ @slot('title', trans('forum::categories.mark_read'))
+ @slot('route', Forum::route('unread.mark-as-read'))
+ @slot('method', 'PATCH')
+
+
+
+ {{ trans('forum::general.generic_confirm') }}
+
+ @slot('actions')
+
+ {{ trans('forum::general.mark_read') }}
+
+ @endslot
+@endcomponent
diff --git a/resources/forum/blade-tailwind/views/category/partials/inputs/color.blade.php b/resources/forum/blade-tailwind/views/category/partials/inputs/color.blade.php
new file mode 100644
index 000000000..37f675ba8
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/category/partials/inputs/color.blade.php
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/resources/forum/blade-tailwind/views/category/partials/list.blade.php b/resources/forum/blade-tailwind/views/category/partials/list.blade.php
new file mode 100644
index 000000000..b92a05463
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/category/partials/list.blade.php
@@ -0,0 +1,75 @@
+
+
+
+
+
+
{{ $category->description }}
+
+
+ @if ($category->accepts_threads)
+
+ {{ trans_choice('forum::threads.thread', 2) }}: {{ $category->thread_count }}
+
+
+ {{ trans_choice('forum::posts.post', 2) }}: {{ $category->post_count }}
+
+ @endif
+
+
+ @if ($category->accepts_threads)
+ @if ($category->newestThread)
+
+ @endif
+ @if ($category->latestActiveThread && $category->latestActiveThread->post_count > 1)
+
+ @endif
+ @endif
+
+
+
+
+ @if ($category->children->count() > 0)
+
+ @foreach ($category->children as $subcategory)
+
+
+
+
{{ $subcategory->title }}
+
{{ $subcategory->description }}
+
+
+
+ {{ trans_choice('forum::threads.thread', 2) }}: {{ $subcategory->thread_count }}
+
+
+ {{ trans_choice('forum::posts.post', 2) }}: {{ $subcategory->post_count }}
+
+
+
+ @if ($subcategory->newestThread)
+
+ @endif
+ @if ($subcategory->latestActiveThread && $subcategory->latestActiveThread->post_count > 1)
+
+ @endif
+
+
+
+ @endforeach
+
+ @endif
+
diff --git a/resources/forum/blade-tailwind/views/category/partials/options.blade.php b/resources/forum/blade-tailwind/views/category/partials/options.blade.php
new file mode 100644
index 000000000..338024af2
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/category/partials/options.blade.php
@@ -0,0 +1,12 @@
+@foreach ($categories as $cat)
+ @if (!isset($hide) || (isset($hide) && $cat->id != $hide->id))
+
+ @endif
+
+ @if ($cat->children)
+ @include ('forum::category.partials.options', ['categories' => $cat->children])
+ @endif
+@endforeach
diff --git a/resources/forum/blade-tailwind/views/category/show.blade.php b/resources/forum/blade-tailwind/views/category/show.blade.php
new file mode 100644
index 000000000..e8f5591a7
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/category/show.blade.php
@@ -0,0 +1,248 @@
+{{-- $thread is passed as NULL to the master layout view to prevent it from showing in the breadcrumbs --}}
+@extends('forum::layouts.main', ['thread' => null])
+
+@section('content')
+
+
+ {{ $category->title }}
+ @if ($category->description)
+ {{ $category->description }}
+ @endif
+
+
+
+
+
+ @if ($category->accepts_threads)
+ @can ('createThreads', $category)
+ {{ trans('forum::threads.new_thread') }}
+ @endcan
+ @endif
+
+
+ @can ('editCategories')
+ @can ('edit', $category)
+
+ {{ trans('forum::general.edit') }}
+
+ @endcan
+ @endcan
+
+
+
+ @if (!$category->children->isEmpty())
+ @foreach ($category->children as $subcategory)
+ @include ('forum::category.partials.list', ['category' => $subcategory])
+ @endforeach
+ @endif
+
+ @if ($category->accepts_threads)
+ @if (!$threads->isEmpty())
+
+ {{ $threads->links('forum::pagination') }}
+
+
+ @if (count($selectableThreadIds) > 0)
+ @can ('manageThreads', $category)
+
+ @endcan
+ @endif
+ @else
+
+ @endif
+
+
+
+ {{ $threads->links('forum::pagination') }}
+
+
+ @if ($category->accepts_threads)
+ @can ('createThreads', $category)
+ {{ trans('forum::threads.new_thread') }}
+ @endcan
+ @endif
+
+
+ @endif
+
+
+ @if (!$threads->isEmpty())
+ @can ('markThreadsAsRead')
+
+
+ {{ trans('forum::general.mark_read') }}
+
+
+
+ @include ('forum::category.modals.mark-threads-as-read')
+ @endcan
+ @endif
+
+ @can ('editCategories')
+ @can ('edit', $category)
+ @include ('forum::category.modals.edit')
+ @endcan
+ @endcan
+ @can ('deleteCategories')
+ @can ('delete', $category)
+ @include ('forum::category.modals.delete')
+ @endcan
+ @endcan
+
+
+@stop
diff --git a/resources/forum/blade-tailwind/views/components/badge.blade.php b/resources/forum/blade-tailwind/views/components/badge.blade.php
new file mode 100644
index 000000000..652c1cc0b
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/components/badge.blade.php
@@ -0,0 +1,27 @@
+@props([
+ 'type' => 'default'
+])
+
+@php
+switch($type) {
+ case('info'):
+ $color = 'bg-blue-500';
+ break;
+
+ case('danger'):
+ $color = 'bg-red-500';
+ break;
+
+ case('warning'):
+ $color = 'bg-orange-500';
+ break;
+
+ default:
+ $color = 'bg-gray-400';
+ break;
+}
+@endphp
+
+merge(['class' => "$color rounded-full px-2 py-1 text-white text-xs font-semibold"]) }}>
+ {{ $slot }}
+
diff --git a/resources/forum/blade-tailwind/views/components/button-group.blade.php b/resources/forum/blade-tailwind/views/components/button-group.blade.php
new file mode 100644
index 000000000..008539dc3
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/components/button-group.blade.php
@@ -0,0 +1,3 @@
+
+ {{ $slot }}
+
diff --git a/resources/forum/blade-tailwind/views/components/button-link.blade.php b/resources/forum/blade-tailwind/views/components/button-link.blade.php
new file mode 100644
index 000000000..6968d4e44
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/components/button-link.blade.php
@@ -0,0 +1,3 @@
+merge(['class' => 'bg-blue-500 hover:bg-blue-400 text-white font-semibold hover:text-white px-3 py-2 rounded-md inline-block']) }}>
+ {{ $slot }}
+
diff --git a/resources/forum/blade-tailwind/views/components/button-secondary.blade.php b/resources/forum/blade-tailwind/views/components/button-secondary.blade.php
new file mode 100644
index 000000000..519f991fa
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/components/button-secondary.blade.php
@@ -0,0 +1,3 @@
+
diff --git a/resources/forum/blade-tailwind/views/components/button.blade.php b/resources/forum/blade-tailwind/views/components/button.blade.php
new file mode 100644
index 000000000..afccd7b4e
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/components/button.blade.php
@@ -0,0 +1,3 @@
+
diff --git a/resources/forum/blade-tailwind/views/components/input.blade.php b/resources/forum/blade-tailwind/views/components/input.blade.php
new file mode 100644
index 000000000..2e221f669
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/components/input.blade.php
@@ -0,0 +1 @@
+merge(['type' => 'text', 'class' => 'px-3 py-1 border-gray-300 focus:border-blue-500 focus:ring-blue-500 rounded-md border shadow-sm']) }}>
diff --git a/resources/forum/blade-tailwind/views/components/label.blade.php b/resources/forum/blade-tailwind/views/components/label.blade.php
new file mode 100644
index 000000000..4d9a6b565
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/components/label.blade.php
@@ -0,0 +1,3 @@
+
diff --git a/resources/forum/blade-tailwind/views/components/select.blade.php b/resources/forum/blade-tailwind/views/components/select.blade.php
new file mode 100644
index 000000000..2df5e15da
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/components/select.blade.php
@@ -0,0 +1,5 @@
+
+
+
diff --git a/resources/forum/blade-tailwind/views/components/textarea.blade.php b/resources/forum/blade-tailwind/views/components/textarea.blade.php
new file mode 100644
index 000000000..01483e3bd
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/components/textarea.blade.php
@@ -0,0 +1 @@
+
diff --git a/resources/forum/blade-tailwind/views/layouts/main.blade.php b/resources/forum/blade-tailwind/views/layouts/main.blade.php
new file mode 100644
index 000000000..8457adbdd
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/layouts/main.blade.php
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+ @if (isset($thread_title))
+ {{ $thread_title }} —
+ @endif
+ @if (isset($category))
+ {{ $category->title }} —
+ @endif
+ {{ trans('forum::general.home_title') }}
+
+
+ @vite(['resources/forum/blade-tailwind/css/forum.css', 'resources/forum/blade-tailwind/js/forum.js'])
+
+
+
+
+
+ @include ('forum::partials.breadcrumbs')
+ @include ('forum::partials.alerts')
+
+ @yield('content')
+
+
+ @yield('footer')
+
+
+
+
diff --git a/resources/forum/blade-tailwind/views/modal-form.blade.php b/resources/forum/blade-tailwind/views/modal-form.blade.php
new file mode 100644
index 000000000..35d368f2c
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/modal-form.blade.php
@@ -0,0 +1,30 @@
+
+
+
+
+
+
{!!$title !!}
+
+
+
+
+
+
diff --git a/resources/forum/blade-tailwind/views/pagination.blade.php b/resources/forum/blade-tailwind/views/pagination.blade.php
new file mode 100644
index 000000000..63c6f56b5
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/pagination.blade.php
@@ -0,0 +1,46 @@
+@if ($paginator->hasPages())
+
+@endif
diff --git a/resources/forum/blade-tailwind/views/partials/alert.blade.php b/resources/forum/blade-tailwind/views/partials/alert.blade.php
new file mode 100644
index 000000000..e3c1b5dee
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/partials/alert.blade.php
@@ -0,0 +1,18 @@
+@php
+$colorClasses = match ($type) {
+ 'primary', '', null => 'bg-blue-100 text-blue-700',
+ 'success', '', null => 'bg-green-100 text-green-700',
+ 'danger' => 'bg-orange-100 text-orange-700'
+};
+@endphp
+
+
+
+ {!! $message !!}
+
+
+
diff --git a/resources/forum/blade-tailwind/views/partials/alerts.blade.php b/resources/forum/blade-tailwind/views/partials/alerts.blade.php
new file mode 100644
index 000000000..e2a0e35a9
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/partials/alerts.blade.php
@@ -0,0 +1,11 @@
+@if (Session::has('alerts'))
+ @foreach (Session::get('alerts') as $alert)
+ @include ('forum::partials.alert', $alert)
+ @endforeach
+@endif
+
+@if (isset($errors) && !$errors->isEmpty())
+ @foreach ($errors->all() as $error)
+ @include ('forum::partials.alert', ['type' => 'danger', 'message' => $error])
+ @endforeach
+@endif
diff --git a/resources/forum/blade-tailwind/views/partials/breadcrumb-categories.blade.php b/resources/forum/blade-tailwind/views/partials/breadcrumb-categories.blade.php
new file mode 100644
index 000000000..521e55241
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/partials/breadcrumb-categories.blade.php
@@ -0,0 +1,4 @@
+@if ($category->parent !== null)
+ @include ('forum::partials.breadcrumb-categories', ['category' => $category->parent])
+@endif
+{{ $category->title }}
diff --git a/resources/forum/blade-tailwind/views/partials/breadcrumbs.blade.php b/resources/forum/blade-tailwind/views/partials/breadcrumbs.blade.php
new file mode 100644
index 000000000..b60634275
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/partials/breadcrumbs.blade.php
@@ -0,0 +1,16 @@
+
diff --git a/resources/forum/blade-tailwind/views/partials/timestamp.blade.php b/resources/forum/blade-tailwind/views/partials/timestamp.blade.php
new file mode 100644
index 000000000..c01cce7a9
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/partials/timestamp.blade.php
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/forum/blade-tailwind/views/post/confirm-delete.blade.php b/resources/forum/blade-tailwind/views/post/confirm-delete.blade.php
new file mode 100644
index 000000000..ae71f083f
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/post/confirm-delete.blade.php
@@ -0,0 +1,37 @@
+@extends ('forum::layouts.main', ['breadcrumbs_append' => [trans_choice('forum::posts.delete', 1)]])
+
+@section ('content')
+
+
{{ trans_choice('forum::posts.delete', 1) }}
+
+
+
+ @include ('forum::post.partials.list', ['post' => $post, 'single' => true])
+
+
+
+@stop
diff --git a/resources/forum/blade-tailwind/views/post/confirm-restore.blade.php b/resources/forum/blade-tailwind/views/post/confirm-restore.blade.php
new file mode 100644
index 000000000..66d4deb9c
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/post/confirm-restore.blade.php
@@ -0,0 +1,29 @@
+@extends ('forum::layouts.main', ['breadcrumbs_append' => [trans_choice('forum::posts.restore', 1)]])
+
+@section ('content')
+
+
{{ trans_choice('forum::posts.restore', 1) }}
+
+
+
+ @include ('forum::post.partials.list', ['post' => $post, 'single' => true])
+
+
+
+@stop
diff --git a/resources/forum/blade-tailwind/views/post/create.blade.php b/resources/forum/blade-tailwind/views/post/create.blade.php
new file mode 100644
index 000000000..46bd4e78a
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/post/create.blade.php
@@ -0,0 +1,32 @@
+@extends ('forum::layouts.main', ['breadcrumbs_append' => [trans('forum::general.new_reply')]])
+
+@section ('content')
+
+
{{ trans('forum::general.new_reply') }} ({{ $thread->title }})
+
+ @if ($post !== null && !$post->trashed())
+
{{ trans('forum::general.replying_to', ['item' => $post->authorName]) }}:
+
+ @include ('forum::post.partials.quote')
+ @endif
+
+
+
+
+
+@stop
diff --git a/resources/forum/blade-tailwind/views/post/edit.blade.php b/resources/forum/blade-tailwind/views/post/edit.blade.php
new file mode 100644
index 000000000..295b79487
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/post/edit.blade.php
@@ -0,0 +1,29 @@
+@extends ('forum::layouts.main', ['breadcrumbs_append' => [trans('forum::posts.edit')]])
+
+@section ('content')
+
+
{{ trans('forum::posts.edit') }} ({{ $thread->title }})
+
+
+
+ @if ($post->parent)
+
{{ trans('forum::general.response_to', ['item' => $post->parent->authorName]) }}...
+
+ @include ('forum::post.partials.list', ['post' => $post->parent, 'single' => true])
+ @endif
+
+
+
+@stop
diff --git a/resources/forum/blade-tailwind/views/post/partials/actions.blade.php b/resources/forum/blade-tailwind/views/post/partials/actions.blade.php
new file mode 100644
index 000000000..e7eb921ac
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/post/partials/actions.blade.php
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/forum/blade-tailwind/views/post/partials/list.blade.php b/resources/forum/blade-tailwind/views/post/partials/list.blade.php
new file mode 100644
index 000000000..ecf26f53d
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/post/partials/list.blade.php
@@ -0,0 +1,70 @@
+trashed())id="post-{{ $post->sequence }}"@endif
+ class="bg-white border mb-2 rounded-md {{ $post->trashed() || $thread->trashed() ? 'opacity-50' : '' }}"
+ :class="{ 'border-blue-500': state.selectedPosts.includes({{ $post->id }}) }">
+
+ @if (!isset($single) || !$single)
+
+ #{{ $post->sequence }}
+ @if ($post->sequence != 1)
+ @can ('deletePosts', $post->thread)
+ @can ('delete', $post)
+
+ @endcan
+ @endcan
+ @endif
+
+ @endif
+
+
+ {{ $post->authorName }}
+
+ @include ('forum::partials.timestamp', ['carbon' => $post->created_at])
+ @if ($post->hasBeenUpdated())
+ ({{ trans('forum::general.last_updated') }} @include ('forum::partials.timestamp', ['carbon' => $post->updated_at]))
+ @endif
+
+
+
+
+ @if ($post->parent !== null)
+ @include ('forum::post.partials.quote', ['post' => $post->parent])
+ @endif
+
+ @if ($post->trashed())
+ @can ('viewTrashedPosts')
+ {!! Forum::render($post->content) !!}
+
+ @endcan
+
{{ trans('forum::general.deleted') }}
+ @else
+ {!! Forum::render($post->content) !!}
+ @endif
+
+ @if (!isset($single) || !$single)
+
+ @endif
+
+
diff --git a/resources/forum/blade-tailwind/views/post/partials/quote.blade.php b/resources/forum/blade-tailwind/views/post/partials/quote.blade.php
new file mode 100644
index 000000000..9c7649f9e
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/post/partials/quote.blade.php
@@ -0,0 +1,13 @@
+
+
+
+ {!! \Illuminate\Support\Str::limit(Forum::render($post->content)) !!}
+
+
diff --git a/resources/forum/blade-tailwind/views/post/show.blade.php b/resources/forum/blade-tailwind/views/post/show.blade.php
new file mode 100644
index 000000000..9e1d1b056
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/post/show.blade.php
@@ -0,0 +1,14 @@
+@extends ('forum::layouts.main', ['breadcrumbs_append' => [trans('forum::posts.view')]])
+
+@section ('content')
+
+
+
{{ trans('forum::posts.view') }} ({{ $thread->title }})
+ {{ trans('forum::threads.view') }}
+
+
+
+
+ @include ('forum::post.partials.list', ['post' => $post, 'single' => true])
+
+@stop
diff --git a/resources/forum/blade-tailwind/views/thread/create.blade.php b/resources/forum/blade-tailwind/views/thread/create.blade.php
new file mode 100644
index 000000000..d9effc59f
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/thread/create.blade.php
@@ -0,0 +1,25 @@
+@extends ('forum::layouts.main', ['breadcrumbs_append' => [trans('forum::threads.new_thread')]])
+
+@section ('content')
+
+
{{ trans('forum::threads.new_thread') }} ({{ $category->title }})
+
+
+
+@stop
diff --git a/resources/forum/blade-tailwind/views/thread/modals/mark-as-read.blade.php b/resources/forum/blade-tailwind/views/thread/modals/mark-as-read.blade.php
new file mode 100644
index 000000000..8c196ac65
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/thread/modals/mark-as-read.blade.php
@@ -0,0 +1,14 @@
+@component('forum::modal-form')
+ @slot('key', 'mark-as-read')
+ @slot('title', trans('forum::general.mark_read'))
+ @slot('route', Forum::route('unread.mark-as-read'))
+ @slot('method', 'PATCH')
+
+ {{ trans('forum::general.generic_confirm') }}
+
+ @slot('actions')
+
+ {{ trans('forum::general.mark_read') }}
+
+ @endslot
+@endcomponent
diff --git a/resources/forum/blade-tailwind/views/thread/partials/list.blade.php b/resources/forum/blade-tailwind/views/thread/partials/list.blade.php
new file mode 100644
index 000000000..a30f82fa3
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/thread/partials/list.blade.php
@@ -0,0 +1,52 @@
+
+
+
+
+ color_light_mode }};"@endif class="text-lg">{{ $thread->title }}
+
+
+ {{ $thread->authorName }}
+
@include ('forum::partials.timestamp', ['carbon' => $thread->created_at])
+
+ @if (!isset($category))
+
+
{{ $thread->category->title }}
+ @endif
+
+
+
+ @if ($thread->pinned)
+ {{ trans('forum::threads.pinned') }}
+ @endif
+ @if ($thread->locked)
+ {{ trans('forum::threads.locked') }}
+ @endif
+ @if ($thread->userReadStatus !== null && !$thread->trashed())
+ {{ trans($thread->userReadStatus) }}
+ @endif
+ @if ($thread->trashed())
+ {{ trans('forum::general.deleted') }}
+ @endif
+
+ {{ trans('forum::general.replies') }}:
+ {{ $thread->reply_count }}
+
+
+
+ @if ($thread->lastPost)
+
+ @endif
+
+ @if (isset($category) && isset($selectableThreadIds) && in_array($thread->id, $selectableThreadIds))
+
+
+
+ @endif
+
+
diff --git a/resources/forum/blade-tailwind/views/thread/recent.blade.php b/resources/forum/blade-tailwind/views/thread/recent.blade.php
new file mode 100644
index 000000000..b96988453
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/thread/recent.blade.php
@@ -0,0 +1,21 @@
+@extends ('forum::layouts.main', ['thread' => null, 'breadcrumbs_append' => [trans('forum::threads.recent')]])
+
+@section ('content')
+
+
{{ trans('forum::threads.recent') }}
+
+ @if (!$threads->isEmpty())
+
+ @foreach ($threads as $thread)
+ @include ('forum::thread.partials.list')
+ @endforeach
+
+ @else
+
+
+ {{ trans('forum::threads.none_found') }}
+
+
+ @endif
+
+@stop
diff --git a/resources/forum/blade-tailwind/views/thread/show.blade.php b/resources/forum/blade-tailwind/views/thread/show.blade.php
new file mode 100644
index 000000000..0e8afc3bd
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/thread/show.blade.php
@@ -0,0 +1,391 @@
+@extends ('forum::layouts.main', ['thread' => null, 'breadcrumbs_append' => [$thread->title], 'thread_title' => $thread->title])
+
+@section ('content')
+
+
+
{{ $thread->title }}
+
+
+ @if (Gate::allows('deleteThreads', $thread->category) && Gate::allows('delete', $thread))
+ @if ($thread->trashed())
+
+ {{ trans('forum::general.perma_delete') }}
+
+ @else
+
+ {{ trans('forum::general.delete') }}
+
+ @endif
+ @endif
+ @if ($thread->trashed() && Gate::allows('restoreThreads', $thread->category) && Gate::allows('restore', $thread))
+
+ {{ trans('forum::general.restore') }}
+
+ @endif
+
+ @if (Gate::allows('lockThreads', $category)
+ || Gate::allows('pinThreads', $category)
+ || Gate::allows('rename', $thread)
+ || Gate::allows('moveThreadsFrom', $category))
+
+ @if (!$thread->trashed())
+ @can ('lockThreads', $category)
+ @if ($thread->locked)
+
+ {{ trans('forum::threads.unlock') }}
+
+ @else
+
+ {{ trans('forum::threads.lock') }}
+
+ @endif
+ @endcan
+ @can ('pinThreads', $category)
+ @if ($thread->pinned)
+
+ {{ trans('forum::threads.unpin') }}
+
+ @else
+
+ {{ trans('forum::threads.pin') }}
+
+ @endif
+ @endcan
+ @can ('rename', $thread)
+
+ {{ trans('forum::general.rename') }}
+
+ @endcan
+ @can ('moveThreadsFrom', $category)
+
+ {{ trans('forum::general.move') }}
+
+ @endcan
+ @endif
+
+ @endcan
+
+
+
+
+ @if ($thread->trashed())
+ {{ trans('forum::general.deleted') }}
+ @endif
+ @if ($thread->pinned)
+ {{ trans('forum::threads.pinned') }}
+ @endif
+ @if ($thread->locked)
+ {{ trans('forum::threads.locked') }}
+ @endif
+
+
+ @if ((count($posts) > 1 || $posts->currentPage() > 1) && (Gate::allows('deletePosts', $thread) || Gate::allows('restorePosts', $thread)) && count($selectablePosts) > 0)
+
+ @endif
+
+ {{ $posts->links('forum::pagination') }}
+
+ @if (!$thread->trashed())
+ @can ('reply', $thread)
+
{{ trans('forum::general.quick_reply') }}
+
+ @endcan
+ @endif
+
+
+ @if ($thread->trashed() && Gate::allows('restoreThreads', $thread->category) && Gate::allows('restore', $thread))
+ @component('forum::modal-form')
+ @slot('key', 'restore-thread')
+ @slot('title', '' . trans('forum::general.restore'))
+ @slot('route', Forum::route('thread.restore', $thread))
+ @slot('method', 'POST')
+
+ {{ trans('forum::general.generic_confirm') }}
+
+ @slot('actions')
+ {{ trans('forum::general.proceed') }}
+ @endslot
+ @endcomponent
+ @endif
+
+ @if (Gate::allows('deleteThreads', $thread->category) && Gate::allows('delete', $thread))
+ @component('forum::modal-form')
+ @slot('key', 'delete-thread')
+ @slot('title', '' . trans('forum::threads.delete'))
+ @slot('route', Forum::route('thread.delete', $thread))
+ @slot('method', 'DELETE')
+
+ @if (config('forum.general.soft_deletes'))
+
+
+
+
+ @else
+ {{ trans('forum::general.generic_confirm') }}
+ @endif
+
+ @slot('actions')
+ {{ trans('forum::general.proceed') }}
+ @endslot
+ @endcomponent
+
+ @if (config('forum.general.soft_deletes'))
+ @component('forum::modal-form')
+ @slot('key', 'perma-delete-thread')
+ @slot('title', '' . trans_choice('forum::threads.perma_delete', 1))
+ @slot('route', Forum::route('thread.delete', $thread))
+ @slot('method', 'DELETE')
+
+
+
+ {{ trans('forum::general.generic_confirm') }}
+
+ @slot('actions')
+ {{ trans('forum::general.proceed') }}
+ @endslot
+ @endcomponent
+ @endif
+ @endif
+
+ @if (!$thread->trashed())
+ @can ('lockThreads', $category)
+ @if ($thread->locked)
+ @component('forum::modal-form')
+ @slot('key', 'unlock-thread')
+ @slot('title', ' ' . trans('forum::threads.unlock'))
+ @slot('route', Forum::route('thread.unlock', $thread))
+ @slot('method', 'POST')
+
+ {{ trans('forum::general.generic_confirm') }}
+
+ @slot('actions')
+ {{ trans('forum::general.proceed') }}
+ @endslot
+ @endcomponent
+ @else
+ @component('forum::modal-form')
+ @slot('key', 'lock-thread')
+ @slot('title', ' ' . trans('forum::threads.lock'))
+ @slot('route', Forum::route('thread.lock', $thread))
+ @slot('method', 'POST')
+
+ {{ trans('forum::general.generic_confirm') }}
+
+ @slot('actions')
+ {{ trans('forum::general.proceed') }}
+ @endslot
+ @endcomponent
+ @endif
+ @endcan
+
+ @can ('pinThreads', $category)
+ @if ($thread->pinned)
+ @component('forum::modal-form')
+ @slot('key', 'unpin-thread')
+ @slot('title', ' ' . trans('forum::threads.unpin'))
+ @slot('route', Forum::route('thread.unpin', $thread))
+ @slot('method', 'POST')
+
+ {{ trans('forum::general.generic_confirm') }}
+
+ @slot('actions')
+ {{ trans('forum::general.proceed') }}
+ @endslot
+ @endcomponent
+ @else
+ @component('forum::modal-form')
+ @slot('key', 'pin-thread')
+ @slot('title', ' ' . trans('forum::threads.pin'))
+ @slot('route', Forum::route('thread.pin', $thread))
+ @slot('method', 'POST')
+
+ {{ trans('forum::general.generic_confirm') }}
+
+ @slot('actions')
+ {{ trans('forum::general.proceed') }}
+ @endslot
+ @endcomponent
+ @endif
+ @endcan
+
+ @can ('rename', $thread)
+ @component('forum::modal-form')
+ @slot('key', 'rename-thread')
+ @slot('title', ' ' . trans('forum::general.rename'))
+ @slot('route', Forum::route('thread.rename', $thread))
+ @slot('method', 'POST')
+
+
+ {{ trans('forum::general.title') }}
+
+
+
+ @slot('actions')
+ {{ trans('forum::general.proceed') }}
+ @endslot
+ @endcomponent
+ @endcan
+
+ @can ('moveThreadsFrom', $category)
+ @component('forum::modal-form')
+ @slot('key', 'move-thread')
+ @slot('title', ' ' . trans('forum::general.move'))
+ @slot('route', Forum::route('thread.move', $thread))
+ @slot('method', 'POST')
+
+
+
+ @slot('actions')
+ {{ trans('forum::general.proceed') }}
+ @endslot
+ @endcomponent
+ @endcan
+ @endif
+
+
+@stop
diff --git a/resources/forum/blade-tailwind/views/thread/unread.blade.php b/resources/forum/blade-tailwind/views/thread/unread.blade.php
new file mode 100644
index 000000000..560ac0edd
--- /dev/null
+++ b/resources/forum/blade-tailwind/views/thread/unread.blade.php
@@ -0,0 +1,31 @@
+@extends ('forum::layouts.main', ['thread' => null, 'breadcrumbs_append' => [trans('forum::threads.unread_updated')]])
+
+@section ('content')
+
+
{{ trans('forum::threads.unread_updated') }}
+
+ @if (!$threads->isEmpty())
+
+ @foreach ($threads as $thread)
+ @include ('forum::thread.partials.list')
+ @endforeach
+
+ @else
+
+ {{ trans('forum::threads.none_found') }}
+
+ @endif
+
+
+ @if (!$threads->isEmpty())
+ @can ('markThreadsAsRead')
+
+
+ {{ trans('forum::general.mark_read') }}
+
+
+
+ @include ('forum::thread.modals.mark-as-read')
+ @endcan
+ @endif
+@stop
diff --git a/resources/forum/livewire-tailwind/css/forum.css b/resources/forum/livewire-tailwind/css/forum.css
new file mode 100644
index 000000000..f1f6bcc75
--- /dev/null
+++ b/resources/forum/livewire-tailwind/css/forum.css
@@ -0,0 +1,83 @@
+@import url('https://fonts.googleapis.com/css2?family=Source+Sans+3:ital,wght@0,400;0,500;0,700;1,400&display=swap');
+
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ .forum {
+ font-family: "Source Sans 3", sans-serif;
+ font-optical-sizing: auto;
+ font-size: 18px;
+ @apply text-slate-900;
+ }
+
+ .breadcrumbs ol li {
+ display: inline-block;
+ }
+
+ .breadcrumbs ol li + li {
+ margin-left: .5rem;
+ }
+
+ .breadcrumbs ol li + li::before {
+ float: left;
+ padding-right: .5rem;
+ color: #6c757d;
+ content: "/";
+ }
+
+ .forum .clr-field button {
+ @apply w-6 h-6 mr-2 rounded-full;
+ }
+
+ .forum .nested-sort .ns-targeted {
+ @apply rounded-md border-green-500 outline outline-green-500;
+ }
+
+ .bg-category {
+ background-color: var(--category-light);
+ }
+
+ .text-category {
+ color: var(--category-light);
+ }
+
+ div, p {
+ font-size: 1rem;
+ }
+
+ h1 {
+ @apply text-4xl my-6;
+ }
+
+ h2 {
+ @apply text-2xl;
+ }
+
+ h3 {
+ @apply text-xl;
+ }
+
+ a:not(.link-button):not(.group-button):not(.text-category) {
+ @apply text-slate-600 hover:text-slate-900;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ .forum {
+ @apply text-slate-400;
+ }
+
+ .bg-category {
+ background-color: var(--category-dark);
+ }
+
+ .text-category {
+ color: var(--category-dark);
+ }
+
+ a:not(.link-button):not(.group-button):not(.text-category) {
+ @apply text-slate-300 hover:text-white;
+ }
+ }
+}
diff --git a/resources/forum/livewire-tailwind/js/forum.js b/resources/forum/livewire-tailwind/js/forum.js
new file mode 100644
index 000000000..1d0f67295
--- /dev/null
+++ b/resources/forum/livewire-tailwind/js/forum.js
@@ -0,0 +1,9 @@
+import { formatDistance } from 'date-fns';
+import '@melloware/coloris/dist/coloris.css';
+import Coloris from '@melloware/coloris';
+import NestedSort from 'nested-sort';
+
+window.dateFormatDistance = formatDistance;
+window.Coloris = Coloris;
+window.Coloris.init();
+window.NestedSort = NestedSort;
diff --git a/resources/forum/livewire-tailwind/views/components/alerts.blade.php b/resources/forum/livewire-tailwind/views/components/alerts.blade.php
new file mode 100644
index 000000000..56e135179
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/alerts.blade.php
@@ -0,0 +1,64 @@
+
+
+@script
+
+@endscript
diff --git a/resources/forum/livewire-tailwind/views/components/breadcrumb-categories.blade.php b/resources/forum/livewire-tailwind/views/components/breadcrumb-categories.blade.php
new file mode 100644
index 000000000..cc919d74f
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/breadcrumb-categories.blade.php
@@ -0,0 +1,4 @@
+@if ($category->parent !== null)
+ @include ('forum::components.breadcrumb-categories', ['category' => $category->parent])
+@endif
+{{ $category->title }}
diff --git a/resources/forum/livewire-tailwind/views/components/breadcrumbs.blade.php b/resources/forum/livewire-tailwind/views/components/breadcrumbs.blade.php
new file mode 100644
index 000000000..d1d243464
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/breadcrumbs.blade.php
@@ -0,0 +1,23 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/button.blade.php b/resources/forum/livewire-tailwind/views/components/button.blade.php
new file mode 100644
index 000000000..b0db803de
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/button.blade.php
@@ -0,0 +1,21 @@
+@php
+$colorClasses = match ($intent) {
+ 'primary', '', null => 'text-white bg-blue-600 hover:text-white hover:bg-blue-500',
+ 'secondary' => 'text-zinc-800 bg-zinc-400/50 hover:bg-zinc-400/35 dark:text-slate-800 dark:bg-slate-400/50 dark:hover:bg-slate-400/65',
+ 'danger' => 'text-white bg-red-500 hover:bg-red-400'
+};
+
+$sizeClasses = match ($size) {
+ 'regular', '', null => 'min-w-36 px-4 py-2',
+ 'small' => 'px-4 py-1',
+};
+@endphp
+
+
diff --git a/resources/forum/livewire-tailwind/views/components/category/card.blade.php b/resources/forum/livewire-tailwind/views/components/category/card.blade.php
new file mode 100644
index 000000000..850278fe0
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/category/card.blade.php
@@ -0,0 +1,103 @@
+
+
+
+
+
+
{{ $category->description }}
+
+
+ @if ($category->accepts_threads)
+
+
+ @endif
+
+
+ @if ($category->accepts_threads)
+ @if ($category->newestThread)
+
+ @endif
+ @if ($category->latestActiveThread && $category->latestActiveThread->reply_count > 1)
+
+ @endif
+ @endif
+
+
+
+ @if (count($category->children) > 0)
+ @foreach ($category->children as $subcategory)
+
+
+ @include ('forum::components.icons.subcategory', ['size' => '12'])
+
+
+
+
+
{{ $subcategory->description }}
+
+
+ @if ($subcategory->accepts_threads)
+
+
+ @endif
+
+
+ @if ($subcategory->accepts_threads)
+ @if ($subcategory->newestThread)
+
+ @endif
+ @if ($subcategory->latestActiveThread && $subcategory->latestActiveThread->reply_count > 1)
+
+ @endif
+ @endif
+
+
+
+ @endforeach
+ @endif
+
diff --git a/resources/forum/livewire-tailwind/views/components/category/draggable-items.blade.php b/resources/forum/livewire-tailwind/views/components/category/draggable-items.blade.php
new file mode 100644
index 000000000..4e05635c1
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/category/draggable-items.blade.php
@@ -0,0 +1,18 @@
+@foreach ($categories as $category)
+
+
+
+ @include ('forum::components.icons.drag-area-vertical')
+
+ {{ $category->title }}
+
+ {{ trans('forum::general.edit') }}
+
+
+ @if (count($category->children) > 0)
+
+ @include ('forum::components.category.draggable-items', ['categories' => $category->children])
+
+ @endif
+
+@endforeach
diff --git a/resources/forum/livewire-tailwind/views/components/category/options.blade.php b/resources/forum/livewire-tailwind/views/components/category/options.blade.php
new file mode 100644
index 000000000..9736cda0a
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/category/options.blade.php
@@ -0,0 +1,10 @@
+@foreach ($categories as $category)
+
+
+ @if ($category->children)
+ @include ('forum::components.category.options', ['categories' => $category->children])
+ @endif
+@endforeach
diff --git a/resources/forum/livewire-tailwind/views/components/form/error.blade.php b/resources/forum/livewire-tailwind/views/components/form/error.blade.php
new file mode 100644
index 000000000..ef252c72f
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/form/error.blade.php
@@ -0,0 +1,3 @@
+
+ @error($id) {{ $message }} @enderror
+
diff --git a/resources/forum/livewire-tailwind/views/components/form/input-checkbox.blade.php b/resources/forum/livewire-tailwind/views/components/form/input-checkbox.blade.php
new file mode 100644
index 000000000..6b643223f
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/form/input-checkbox.blade.php
@@ -0,0 +1,11 @@
+
+
+ @if (isset($label))
+
+ @endif
+
diff --git a/resources/forum/livewire-tailwind/views/components/form/input-select.blade.php b/resources/forum/livewire-tailwind/views/components/form/input-select.blade.php
new file mode 100644
index 000000000..c88db127a
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/form/input-select.blade.php
@@ -0,0 +1,11 @@
+
+
+
+
+ @include ('forum::components.form.error')
+
diff --git a/resources/forum/livewire-tailwind/views/components/form/input-text.blade.php b/resources/forum/livewire-tailwind/views/components/form/input-text.blade.php
new file mode 100644
index 000000000..f5531a4b5
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/form/input-text.blade.php
@@ -0,0 +1,11 @@
+
+
+
+
+ @include ('forum::components.form.error')
+
diff --git a/resources/forum/livewire-tailwind/views/components/form/input-textarea.blade.php b/resources/forum/livewire-tailwind/views/components/form/input-textarea.blade.php
new file mode 100644
index 000000000..afb0004bf
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/form/input-textarea.blade.php
@@ -0,0 +1,11 @@
+
+ @if (isset($label))
+
+ @endif
+
+
+ @include ('forum::components.form.error')
+
diff --git a/resources/forum/livewire-tailwind/views/components/group-button.blade.php b/resources/forum/livewire-tailwind/views/components/group-button.blade.php
new file mode 100644
index 000000000..60dfea7b7
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/group-button.blade.php
@@ -0,0 +1,14 @@
+@php
+$colorClasses = match ($intent) {
+ 'primary', '', null => 'text-white bg-blue-600 hover:text-white hover:bg-blue-500',
+ 'secondary' => 'text-zinc-800 bg-zinc-400/50 hover:bg-zinc-400/35 dark:text-slate-800 dark:bg-slate-400/50 dark:hover:bg-slate-400/65',
+ 'danger' => 'text-white bg-red-500 hover:bg-red-400'
+};
+@endphp
+
+
+ @if (isset($icon) && !empty($icon))
+ @include ("forum::components.icons.{$icon}", ['size' => '5'])
+ @endif
+ {{ $label }}
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/arrow-down-mini.blade.php b/resources/forum/livewire-tailwind/views/components/icons/arrow-down-mini.blade.php
new file mode 100644
index 000000000..94a3f2e41
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/arrow-down-mini.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/arrow-path-mini.blade.php b/resources/forum/livewire-tailwind/views/components/icons/arrow-path-mini.blade.php
new file mode 100644
index 000000000..cc91c2a2d
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/arrow-path-mini.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/arrow-right-mini.blade.php b/resources/forum/livewire-tailwind/views/components/icons/arrow-right-mini.blade.php
new file mode 100644
index 000000000..ec405c168
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/arrow-right-mini.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/arrow-up-circle-mini.blade.php b/resources/forum/livewire-tailwind/views/components/icons/arrow-up-circle-mini.blade.php
new file mode 100644
index 000000000..76fda48ea
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/arrow-up-circle-mini.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/arrow-up-mini.blade.php b/resources/forum/livewire-tailwind/views/components/icons/arrow-up-mini.blade.php
new file mode 100644
index 000000000..d0034033f
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/arrow-up-mini.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/book-open-outline.blade.php b/resources/forum/livewire-tailwind/views/components/icons/book-open-outline.blade.php
new file mode 100644
index 000000000..5e4afca6c
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/book-open-outline.blade.php
@@ -0,0 +1,9 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/chat-bubble-text-mini.blade.php b/resources/forum/livewire-tailwind/views/components/icons/chat-bubble-text-mini.blade.php
new file mode 100644
index 000000000..04ad9f24b
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/chat-bubble-text-mini.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/chat-bubble-text-outline.blade.php b/resources/forum/livewire-tailwind/views/components/icons/chat-bubble-text-outline.blade.php
new file mode 100644
index 000000000..9ddb8cb28
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/chat-bubble-text-outline.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/chat-bubbles-mini.blade.php b/resources/forum/livewire-tailwind/views/components/icons/chat-bubbles-mini.blade.php
new file mode 100644
index 000000000..33905dd0f
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/chat-bubbles-mini.blade.php
@@ -0,0 +1,8 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/chat-bubbles-outline.blade.php b/resources/forum/livewire-tailwind/views/components/icons/chat-bubbles-outline.blade.php
new file mode 100644
index 000000000..f94d5de70
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/chat-bubbles-outline.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/drag-area-vertical.blade.php b/resources/forum/livewire-tailwind/views/components/icons/drag-area-vertical.blade.php
new file mode 100644
index 000000000..be107bf12
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/drag-area-vertical.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/home-mini.blade.php b/resources/forum/livewire-tailwind/views/components/icons/home-mini.blade.php
new file mode 100644
index 000000000..64ff3200f
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/home-mini.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/lock-closed-mini.blade.php b/resources/forum/livewire-tailwind/views/components/icons/lock-closed-mini.blade.php
new file mode 100644
index 000000000..2a0be423c
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/lock-closed-mini.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/lock-open-mini.blade.php b/resources/forum/livewire-tailwind/views/components/icons/lock-open-mini.blade.php
new file mode 100644
index 000000000..2bba2f070
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/lock-open-mini.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/pencil-mini.blade.php b/resources/forum/livewire-tailwind/views/components/icons/pencil-mini.blade.php
new file mode 100644
index 000000000..5889e1357
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/pencil-mini.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/pencil-outline.blade.php b/resources/forum/livewire-tailwind/views/components/icons/pencil-outline.blade.php
new file mode 100644
index 000000000..39d34e482
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/pencil-outline.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/sparkles-mini.blade.php b/resources/forum/livewire-tailwind/views/components/icons/sparkles-mini.blade.php
new file mode 100644
index 000000000..508d57150
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/sparkles-mini.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/squares-plus-outline.blade.php b/resources/forum/livewire-tailwind/views/components/icons/squares-plus-outline.blade.php
new file mode 100644
index 000000000..dc17a13e8
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/squares-plus-outline.blade.php
@@ -0,0 +1,9 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/subcategory.blade.php b/resources/forum/livewire-tailwind/views/components/icons/subcategory.blade.php
new file mode 100644
index 000000000..e9e7691ad
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/subcategory.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/trash-mini.blade.php b/resources/forum/livewire-tailwind/views/components/icons/trash-mini.blade.php
new file mode 100644
index 000000000..de2a9e41b
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/trash-mini.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/icons/x-mark.blade.php b/resources/forum/livewire-tailwind/views/components/icons/x-mark.blade.php
new file mode 100644
index 000000000..ac9f2466a
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/icons/x-mark.blade.php
@@ -0,0 +1,8 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/link-button.blade.php b/resources/forum/livewire-tailwind/views/components/link-button.blade.php
new file mode 100644
index 000000000..06fcc448e
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/link-button.blade.php
@@ -0,0 +1,19 @@
+@php
+$colorClasses = match ($intent) {
+ 'primary', '', null => 'text-white bg-blue-600 hover:text-white hover:bg-blue-500',
+ 'secondary' => 'text-zinc-800 bg-zinc-400/50 hover:bg-zinc-400/35 dark:text-slate-800 dark:bg-slate-400/50 dark:hover:bg-slate-400/65',
+ 'danger' => 'text-white bg-red-500 hover:bg-red-400'
+};
+
+$sizeClasses = match ($size) {
+ 'regular', '', null => 'min-w-36 px-4 py-2',
+ 'small' => 'px-4 py-1',
+};
+@endphp
+
+
+ @if (isset($icon) && !empty($icon))
+ @include ("forum::components.icons.{$icon}", ['size' => '5'])
+ @endif
+ {{ $label }}
+
diff --git a/resources/forum/livewire-tailwind/views/components/loading-overlay.blade.php b/resources/forum/livewire-tailwind/views/components/loading-overlay.blade.php
new file mode 100644
index 000000000..5432e33a6
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/loading-overlay.blade.php
@@ -0,0 +1,15 @@
+
diff --git a/resources/forum/livewire-tailwind/views/components/modal.blade.php b/resources/forum/livewire-tailwind/views/components/modal.blade.php
new file mode 100644
index 000000000..2c3974dcd
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/modal.blade.php
@@ -0,0 +1,21 @@
+
+
+
+
+
+
{{ $heading }}
+
+ @if (!empty($onClose))
+
+ @endif
+
+
+ {{ $slot }}
+
+
+
+
diff --git a/resources/forum/livewire-tailwind/views/components/pagination.blade.php b/resources/forum/livewire-tailwind/views/components/pagination.blade.php
new file mode 100644
index 000000000..f8f1a3fc0
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/pagination.blade.php
@@ -0,0 +1,106 @@
+@if ($paginator->hasPages())
+
+@endif
diff --git a/resources/forum/livewire-tailwind/views/components/pill.blade.php b/resources/forum/livewire-tailwind/views/components/pill.blade.php
new file mode 100644
index 000000000..391726ed4
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/pill.blade.php
@@ -0,0 +1,14 @@
+
+ @if (isset($icon))
+ @include ("forum::components.icons.{$icon}")
+ @endif
+ {{ $text }}
+
diff --git a/resources/forum/livewire-tailwind/views/components/post/card.blade.php b/resources/forum/livewire-tailwind/views/components/post/card.blade.php
new file mode 100644
index 000000000..03433ffe3
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/post/card.blade.php
@@ -0,0 +1,101 @@
+
+
+ @if ($showAuthorPane)
+
+
+ {{ $post->authorName }}
+
+
+
+ @endif
+
+ @if (isset($post->parent))
+
+ @endif
+
+
+ @if ($post->trashed())
+ @can ('viewTrashedPosts')
+
+ {!! Forum::render($post->content) !!}
+
+ @endcan
+
+
+
+
+ @else
+ {!! Forum::render($post->content) !!}
+ @endif
+
+
+
+
+
+
+
+
+@script
+
+@endscript
diff --git a/resources/forum/livewire-tailwind/views/components/post/quote.blade.php b/resources/forum/livewire-tailwind/views/components/post/quote.blade.php
new file mode 100644
index 000000000..9f260440a
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/post/quote.blade.php
@@ -0,0 +1,16 @@
+
+ {!! Forum::render($post->content) !!}
+
+
+
+ {{ $post->authorName }}
+
+
+
+
+
+
+
+
diff --git a/resources/forum/livewire-tailwind/views/components/thread/card.blade.php b/resources/forum/livewire-tailwind/views/components/thread/card.blade.php
new file mode 100644
index 000000000..7186ab0cb
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/thread/card.blade.php
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+ @if ($selectable)
+
+
+
+ @endif
+
+
+
+@script
+
+@endscript
diff --git a/resources/forum/livewire-tailwind/views/components/timestamp.blade.php b/resources/forum/livewire-tailwind/views/components/timestamp.blade.php
new file mode 100644
index 000000000..1cabe4359
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/components/timestamp.blade.php
@@ -0,0 +1,20 @@
+
+
+@script
+
+@endscript
diff --git a/resources/forum/livewire-tailwind/views/layouts/main.blade.php b/resources/forum/livewire-tailwind/views/layouts/main.blade.php
new file mode 100644
index 000000000..7fd2162a5
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/layouts/main.blade.php
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
+ @if (isset($thread))
+ {{ $thread->title }} —
+ @endif
+ @if (isset($category))
+ {{ $category->title }} —
+ @endif
+ {{ trans('forum::general.home_title') }}
+
+
+ @vite([
+ 'resources/forum/livewire-tailwind/css/forum.css',
+ 'resources/forum/livewire-tailwind/js/forum.js'
+ ])
+
+
+
+
+
+ {{ $slot }}
+
+
+
+
+
+
+
diff --git a/resources/forum/livewire-tailwind/views/pages/category/create.blade.php b/resources/forum/livewire-tailwind/views/pages/category/create.blade.php
new file mode 100644
index 000000000..af65f9781
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/pages/category/create.blade.php
@@ -0,0 +1,60 @@
+
+ @include ('forum::components.loading-overlay')
+ @include ('forum::components.breadcrumbs')
+
+
+
+
{{ trans('forum::categories.create') }}
+
+
+
+
+
diff --git a/resources/forum/livewire-tailwind/views/pages/category/edit.blade.php b/resources/forum/livewire-tailwind/views/pages/category/edit.blade.php
new file mode 100644
index 000000000..1261410c3
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/pages/category/edit.blade.php
@@ -0,0 +1,107 @@
+
+ @include ('forum::components.loading-overlay')
+ @include ('forum::components.breadcrumbs')
+
+
+
+
{{ trans('forum::categories.edit') }}
+
{{ $category->title }}
+
+
+
+
+
+
+ {{ trans('forum::categories.confirm_nonempty_delete') }}
+
+
+
+
+
+@script
+
+@endscript
diff --git a/resources/forum/livewire-tailwind/views/pages/category/index.blade.php b/resources/forum/livewire-tailwind/views/pages/category/index.blade.php
new file mode 100644
index 000000000..4e809f492
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/pages/category/index.blade.php
@@ -0,0 +1,23 @@
+
+ @include ('forum::components.loading-overlay')
+ @include ('forum::components.breadcrumbs')
+
+
{{ trans('forum::general.index') }}
+
+
+
+
+
+ @can ('createCategories')
+
+ @endcan
+
+
+
+ @foreach ($categories as $category)
+
+ @endforeach
+
diff --git a/resources/forum/livewire-tailwind/views/pages/category/manage.blade.php b/resources/forum/livewire-tailwind/views/pages/category/manage.blade.php
new file mode 100644
index 000000000..2f9561193
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/pages/category/manage.blade.php
@@ -0,0 +1,83 @@
+
+ @include ('forum::components.loading-overlay')
+ @include ('forum::components.breadcrumbs')
+
+
+
+
{{ trans('forum::general.manage') }}
+
+ @can ('createCategories')
+
+
+
+ @endcan
+
+
+
+ @include ('forum::components.category.draggable-items', ['categories' => $categories])
+
+
+
+
+
+
+
+
+
+
+@script
+
+@endscript
diff --git a/resources/forum/livewire-tailwind/views/pages/category/show.blade.php b/resources/forum/livewire-tailwind/views/pages/category/show.blade.php
new file mode 100644
index 000000000..0756ea1b5
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/pages/category/show.blade.php
@@ -0,0 +1,197 @@
+
+ @include ('forum::components.loading-overlay')
+ @include ('forum::components.breadcrumbs')
+
+
{{ $category->title }}
+
{{ $category->description }}
+
+
+
+ @can ('edit', $category)
+
+ @endcan
+
+ @can ('createCategories')
+
+
+
+ @endcan
+
+
+ @foreach ($category->descendants as $child)
+
+ @endforeach
+
+
+
+
+ @if ($category->accepts_threads)
+ @can ('createThreads', $category)
+
+
+
+ @endcan
+ @endif
+
+
+ @if (count($selectableThreadIds) > 0)
+
+
+
+ @endif
+
+
+ @foreach ($threads as $thread)
+
+ @endforeach
+
+ @if ($category->accepts_threads && $threads->count() == 0)
+
+ {{ trans('forum::threads.none_found') }}
+
+ @endif
+
+
+
+
{{ trans('forum::general.with_selection') }}
+
+
+
+ @can ('deleteThreads', $category)
+
+ @endcan
+ @can ('restoreThreads', $category)
+
+ @endcan
+ @can ('moveThreadsFrom', $category)
+
+ @endcan
+ @can ('lockThreads', $category)
+
+
+ @endcan
+ @can ('pinThreads', $category)
+
+
+ @endcan
+
+
+ @if (config('forum.general.soft_deletes'))
+
+ @endif
+
+
+
+ @include ('forum::components.category.options', ['categories' => $threadDestinationCategories, 'disable' => $category->id])
+
+
+
+
+
+ {{ $threads->links('forum::components.pagination') }}
+
+
+@script
+
+@endscript
diff --git a/resources/forum/livewire-tailwind/views/pages/post/edit.blade.php b/resources/forum/livewire-tailwind/views/pages/post/edit.blade.php
new file mode 100644
index 000000000..4e02cbd81
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/pages/post/edit.blade.php
@@ -0,0 +1,75 @@
+
+ @include ('forum::components.loading-overlay')
+ @include ('forum::components.breadcrumbs')
+
+
+
+
{{ trans('forum::posts.edit') }}
+
Re: {{ $post->thread->title }}
+
+
+
+
+
+
+
+
+
+
+ {{ trans_choice('forum::posts.confirm_delete', 1) }}
+
+
+
+
+
+@script
+
+@endscript
diff --git a/resources/forum/livewire-tailwind/views/pages/post/show.blade.php b/resources/forum/livewire-tailwind/views/pages/post/show.blade.php
new file mode 100644
index 000000000..71eace7ee
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/pages/post/show.blade.php
@@ -0,0 +1,17 @@
+
+ @include ('forum::components.loading-overlay')
+ @include ('forum::components.breadcrumbs')
+
+
+
+
{{ trans('forum::posts.view') }}
+
Re: {{ $post->thread->title }}
+
+
+
+
+
+
+
+
+
diff --git a/resources/forum/livewire-tailwind/views/pages/thread/create.blade.php b/resources/forum/livewire-tailwind/views/pages/thread/create.blade.php
new file mode 100644
index 000000000..03991d98b
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/pages/thread/create.blade.php
@@ -0,0 +1,36 @@
+
+ @include ('forum::components.loading-overlay')
+ @include ('forum::components.breadcrumbs')
+
+
+
+
{{ trans('forum::threads.new_thread') }} ({{ $category->title }})
+
+
+
+
+
diff --git a/resources/forum/livewire-tailwind/views/pages/thread/recent.blade.php b/resources/forum/livewire-tailwind/views/pages/thread/recent.blade.php
new file mode 100644
index 000000000..a6f91509c
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/pages/thread/recent.blade.php
@@ -0,0 +1,22 @@
+
+ @include ('forum::components.loading-overlay')
+ @include ('forum::components.breadcrumbs')
+
+
{{ trans('forum::threads.recent') }}
+
+
+ @foreach ($threads as $thread)
+
+ @endforeach
+
+ @if ($threads->count() == 0)
+
+ {{ trans('forum::threads.none_found') }}
+
+ @endif
+
+
diff --git a/resources/forum/livewire-tailwind/views/pages/thread/reply.blade.php b/resources/forum/livewire-tailwind/views/pages/thread/reply.blade.php
new file mode 100644
index 000000000..09849db1a
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/pages/thread/reply.blade.php
@@ -0,0 +1,36 @@
+
+ @include ('forum::components.loading-overlay')
+ @include ('forum::components.breadcrumbs')
+
+
+
+
{{ trans('forum::general.reply') }}
+
Re: {{ $thread->title }}
+
+ @if (isset($parent) && !$parent->trashed())
+
{{ trans('forum::general.replying_to', ['item' => $parent->authorName]) }}
+
+ @endif
+
+
+
+
+
diff --git a/resources/forum/livewire-tailwind/views/pages/thread/show.blade.php b/resources/forum/livewire-tailwind/views/pages/thread/show.blade.php
new file mode 100644
index 000000000..53916f7a0
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/pages/thread/show.blade.php
@@ -0,0 +1,369 @@
+
+ @include ('forum::components.loading-overlay')
+ @include ('forum::components.breadcrumbs')
+
+
{{ $thread->title }}
+
+
+
+ @if ($thread->pinned)
+
+ @endif
+ @if ($thread->locked)
+
+ @endif
+ @if ($thread->trashed())
+
+ @endif
+
+
+ @if (count($selectablePostIds) > 0)
+
+
+
+ @endif
+
+
+
+
+
+ @if (Gate::allows('deleteThreads', $thread->category) && Gate::allows('delete', $thread))
+ @if ($thread->trashed())
+
+ @else
+
+ @endif
+ @endif
+ @if ($thread->trashed() && Gate::allows('restoreThreads', $thread->category) && Gate::allows('restore', $thread))
+
+ @endif
+ @if (!$thread->trashed())
+ @can ('lockThreads', $thread->category)
+ @if ($thread->locked)
+
+ @else
+
+ @endif
+ @endcan
+ @can ('pinThreads', $thread->category)
+ @if ($thread->pinned)
+
+ @else
+
+ @endif
+ @endcan
+ @can ('rename', $thread)
+
+ @endcan
+ @can ('moveThreadsFrom', $thread->category)
+
+ @endcan
+ @endif
+
+
+ @if (!$thread->trashed())
+ @can ('reply', $thread)
+
+
+
+
+
+ @endcan
+ @endif
+
+
+
+ @foreach ($posts as $post)
+
+ @endforeach
+
+
+ {{ $posts->links('forum::components.pagination') }}
+
+ @if (!$thread->trashed() && Gate::allows('reply', $thread))
+
+
{{ trans('forum::general.quick_reply') }}
+
+
+
+ @endif
+
+
+
{{ trans('forum::general.with_selection') }}
+
+
+
+ @can ('deletePosts', $thread)
+
+ @endcan
+ @can ('restorePosts', $thread)
+
+ @endcan
+
+
+ @if (config('forum.general.soft_deletes'))
+
+ @endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @include ('forum::components.category.options', ['categories' => $threadDestinationCategories, 'disable' => $thread->category->id])
+
+
+
+
+
+
+
+ {{ trans('forum::general.generic_confirm') }}
+
+
+
+
+
+@script
+
+@endscript
diff --git a/resources/forum/livewire-tailwind/views/pages/thread/unread.blade.php b/resources/forum/livewire-tailwind/views/pages/thread/unread.blade.php
new file mode 100644
index 000000000..e80bc32a7
--- /dev/null
+++ b/resources/forum/livewire-tailwind/views/pages/thread/unread.blade.php
@@ -0,0 +1,66 @@
+
+ @include ('forum::components.loading-overlay')
+ @include ('forum::components.breadcrumbs')
+
+
{{ trans('forum::threads.unread_updated') }}
+
+
+ @foreach ($threads as $thread)
+
+ @endforeach
+
+ @if ($threads->count() == 0)
+
+ {{ trans('forum::threads.none_found') }}
+
+ @else
+
+
+
+ @endif
+
+
+
+ {{ trans('forum::general.generic_confirm') }}
+
+
+
+
+
+@script
+
+@endscript
diff --git a/resources/js/app.js b/resources/js/app.js
new file mode 100644
index 000000000..e59d6a0ad
--- /dev/null
+++ b/resources/js/app.js
@@ -0,0 +1 @@
+import './bootstrap';
diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js
new file mode 100644
index 000000000..5f1390b01
--- /dev/null
+++ b/resources/js/bootstrap.js
@@ -0,0 +1,4 @@
+import axios from 'axios';
+window.axios = axios;
+
+window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';