diff --git a/database/migrations/2024_03_30_095622_update_forum_category_colors.php b/database/migrations/2024_03_30_095622_update_forum_category_colors.php
new file mode 100644
index 000000000..156eccc34
--- /dev/null
+++ b/database/migrations/2024_03_30_095622_update_forum_category_colors.php
@@ -0,0 +1,30 @@
+renameColumn('color', 'color_light_mode');
+ $table->string('color_dark_mode')->nullable();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('forum_categories', function (Blueprint $table) {
+ $table->renameColumn('color_light_mode', 'color');
+ $table->dropColumn('color_dark_mode');
+ });
+ }
+};
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 000000000..49c0612d5
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/resources/forum/blade-tailwind/css/forum.css b/resources/forum/blade-tailwind/css/forum.css
deleted file mode 100644
index 6e72d22ce..000000000
--- a/resources/forum/blade-tailwind/css/forum.css
+++ /dev/null
@@ -1,35 +0,0 @@
-@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
deleted file mode 100644
index 828787a00..000000000
--- a/resources/forum/blade-tailwind/js/forum.js
+++ /dev/null
@@ -1,154 +0,0 @@
-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
deleted file mode 100644
index 93eeb6de4..000000000
--- a/resources/forum/blade-tailwind/views/category/index.blade.php
+++ /dev/null
@@ -1,20 +0,0 @@
-{{-- $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
deleted file mode 100644
index be48382b5..000000000
--- a/resources/forum/blade-tailwind/views/category/manage.blade.php
+++ /dev/null
@@ -1,115 +0,0 @@
-@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') }}
-
-
-
-
-
- {{ trans('forum::general.save') }}
-
-
-
-
-
-
-
-@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
deleted file mode 100644
index 6d8301610..000000000
--- a/resources/forum/blade-tailwind/views/category/modals/create.blade.php
+++ /dev/null
@@ -1,31 +0,0 @@
-@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') }}
-
-
-
-
-
- {{ trans('forum::categories.enable_threads') }}
-
-
-
-
-
- {{ trans('forum::categories.make_private') }}
-
-
- @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
deleted file mode 100644
index e313edb40..000000000
--- a/resources/forum/blade-tailwind/views/category/modals/delete.blade.php
+++ /dev/null
@@ -1,21 +0,0 @@
-@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())
-
-
-
- {{ trans('forum::categories.confirm_nonempty_delete') }}
-
-
- @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
deleted file mode 100644
index c5a6ce3a0..000000000
--- a/resources/forum/blade-tailwind/views/category/modals/edit.blade.php
+++ /dev/null
@@ -1,40 +0,0 @@
-@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' : '' }}>
- {{ trans('forum::categories.enable_threads') }}
-
-
-
-
-
- is_private ? 'checked' : '' }} {{ $privateAncestor != null ? 'disabled' : '' }}>
- {{ trans('forum::categories.make_private') }}
-
-
- @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
deleted file mode 100644
index b2fc42d07..000000000
--- a/resources/forum/blade-tailwind/views/category/modals/mark-threads-as-read.blade.php
+++ /dev/null
@@ -1,16 +0,0 @@
-@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
deleted file mode 100644
index 37f675ba8..000000000
--- a/resources/forum/blade-tailwind/views/category/partials/inputs/color.blade.php
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
{{ trans('forum::general.color') }}
-
-
-
diff --git a/resources/forum/blade-tailwind/views/category/partials/list.blade.php b/resources/forum/blade-tailwind/views/category/partials/list.blade.php
deleted file mode 100644
index b92a05463..000000000
--- a/resources/forum/blade-tailwind/views/category/partials/list.blade.php
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
-
-
{{ $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
deleted file mode 100644
index 338024af2..000000000
--- a/resources/forum/blade-tailwind/views/category/partials/options.blade.php
+++ /dev/null
@@ -1,12 +0,0 @@
-@foreach ($categories as $cat)
- @if (!isset($hide) || (isset($hide) && $cat->id != $hide->id))
- id == $category->id) ? 'selected' : '' }}>
- @for ($i = 0; $i < $cat->depth; $i++)- @endfor
- {{ $cat->title }}
-
- @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
deleted file mode 100644
index e8f5591a7..000000000
--- a/resources/forum/blade-tailwind/views/category/show.blade.php
+++ /dev/null
@@ -1,248 +0,0 @@
-{{-- $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
deleted file mode 100644
index 652c1cc0b..000000000
--- a/resources/forum/blade-tailwind/views/components/badge.blade.php
+++ /dev/null
@@ -1,27 +0,0 @@
-@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
deleted file mode 100644
index 008539dc3..000000000
--- a/resources/forum/blade-tailwind/views/components/button-group.blade.php
+++ /dev/null
@@ -1,3 +0,0 @@
-
- {{ $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
deleted file mode 100644
index 6968d4e44..000000000
--- a/resources/forum/blade-tailwind/views/components/button-link.blade.php
+++ /dev/null
@@ -1,3 +0,0 @@
-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
deleted file mode 100644
index 519f991fa..000000000
--- a/resources/forum/blade-tailwind/views/components/button-secondary.blade.php
+++ /dev/null
@@ -1,3 +0,0 @@
-merge(['class' => 'bg-gray-300 hover:bg-gray-200 text-gray-600 font-semibold px-3 py-2 rounded-md inline-block']) }}>
- {{ $slot }}
-
diff --git a/resources/forum/blade-tailwind/views/components/button.blade.php b/resources/forum/blade-tailwind/views/components/button.blade.php
deleted file mode 100644
index afccd7b4e..000000000
--- a/resources/forum/blade-tailwind/views/components/button.blade.php
+++ /dev/null
@@ -1,3 +0,0 @@
-merge(['class' => 'bg-blue-500 hover:bg-blue-400 text-white font-semibold px-3 py-2 rounded-md inline-block']) }}>
- {{ $slot }}
-
diff --git a/resources/forum/blade-tailwind/views/components/input.blade.php b/resources/forum/blade-tailwind/views/components/input.blade.php
deleted file mode 100644
index 2e221f669..000000000
--- a/resources/forum/blade-tailwind/views/components/input.blade.php
+++ /dev/null
@@ -1 +0,0 @@
- 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
deleted file mode 100644
index 4d9a6b565..000000000
--- a/resources/forum/blade-tailwind/views/components/label.blade.php
+++ /dev/null
@@ -1,3 +0,0 @@
-merge(['class' => 'block w-full mb-1']) }}>
- {{ $slot }}
-
diff --git a/resources/forum/blade-tailwind/views/components/select.blade.php b/resources/forum/blade-tailwind/views/components/select.blade.php
deleted file mode 100644
index 2df5e15da..000000000
--- a/resources/forum/blade-tailwind/views/components/select.blade.php
+++ /dev/null
@@ -1,5 +0,0 @@
-
- merge(['class' => 'block appearance-none w-full bg-white border border-gray-400 hover:border-gray-500 px-4 py-2 pr-8 rounded shadow leading-tight focus:outline-none focus:shadow-outline']) }}>
- {{ $slot }}
-
-
diff --git a/resources/forum/blade-tailwind/views/components/textarea.blade.php b/resources/forum/blade-tailwind/views/components/textarea.blade.php
deleted file mode 100644
index 01483e3bd..000000000
--- a/resources/forum/blade-tailwind/views/components/textarea.blade.php
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/resources/forum/blade-tailwind/views/layouts/main.blade.php b/resources/forum/blade-tailwind/views/layouts/main.blade.php
deleted file mode 100644
index 8457adbdd..000000000
--- a/resources/forum/blade-tailwind/views/layouts/main.blade.php
+++ /dev/null
@@ -1,94 +0,0 @@
-
-
-
-
-
-
-
- @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'])
-
-
-
-
-
-
-
-
- @if (Auth::check())
-
-
-
-
- @else
-
- Log in
-
-
- Register
-
- @endif
-
-
-
-
-
-
- @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
deleted file mode 100644
index 35d368f2c..000000000
--- a/resources/forum/blade-tailwind/views/modal-form.blade.php
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
{!!$title !!}
-
-
-
-
-
-
-
-
-
-
diff --git a/resources/forum/blade-tailwind/views/pagination.blade.php b/resources/forum/blade-tailwind/views/pagination.blade.php
deleted file mode 100644
index 63c6f56b5..000000000
--- a/resources/forum/blade-tailwind/views/pagination.blade.php
+++ /dev/null
@@ -1,46 +0,0 @@
-@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
deleted file mode 100644
index e3c1b5dee..000000000
--- a/resources/forum/blade-tailwind/views/partials/alert.blade.php
+++ /dev/null
@@ -1,18 +0,0 @@
-@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
deleted file mode 100644
index e2a0e35a9..000000000
--- a/resources/forum/blade-tailwind/views/partials/alerts.blade.php
+++ /dev/null
@@ -1,11 +0,0 @@
-@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
deleted file mode 100644
index 521e55241..000000000
--- a/resources/forum/blade-tailwind/views/partials/breadcrumb-categories.blade.php
+++ /dev/null
@@ -1,4 +0,0 @@
-@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
deleted file mode 100644
index b60634275..000000000
--- a/resources/forum/blade-tailwind/views/partials/breadcrumbs.blade.php
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
- {{ trans('forum::general.index') }}
- @if (isset($category) && $category)
- @include ('forum::partials.breadcrumb-categories', ['category' => $category])
- @endif
- @if (isset($thread) && $thread)
- {{ $thread->title }}
- @endif
- @if (isset($breadcrumbs_append) && count($breadcrumbs_append) > 0)
- @foreach ($breadcrumbs_append as $breadcrumb)
- {{ $breadcrumb }}
- @endforeach
- @endif
-
-
diff --git a/resources/forum/blade-tailwind/views/partials/timestamp.blade.php b/resources/forum/blade-tailwind/views/partials/timestamp.blade.php
deleted file mode 100644
index c01cce7a9..000000000
--- a/resources/forum/blade-tailwind/views/partials/timestamp.blade.php
+++ /dev/null
@@ -1 +0,0 @@
-{{ $carbon->diffForHumans() }}
\ 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
deleted file mode 100644
index ae71f083f..000000000
--- a/resources/forum/blade-tailwind/views/post/confirm-delete.blade.php
+++ /dev/null
@@ -1,37 +0,0 @@
-@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
deleted file mode 100644
index 66d4deb9c..000000000
--- a/resources/forum/blade-tailwind/views/post/confirm-restore.blade.php
+++ /dev/null
@@ -1,29 +0,0 @@
-@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
deleted file mode 100644
index 46bd4e78a..000000000
--- a/resources/forum/blade-tailwind/views/post/create.blade.php
+++ /dev/null
@@ -1,32 +0,0 @@
-@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
deleted file mode 100644
index 295b79487..000000000
--- a/resources/forum/blade-tailwind/views/post/edit.blade.php
+++ /dev/null
@@ -1,29 +0,0 @@
-@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
deleted file mode 100644
index e7eb921ac..000000000
--- a/resources/forum/blade-tailwind/views/post/partials/actions.blade.php
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
- {{ trans_choice('forum::general.actions', 1) }}
-
- @can ('deletePosts', $post->thread)
- @can ('delete', $post)
- {{ trans('forum::general.delete') }}
- @endcan
- @endcan
-
-
-
-
-
-
diff --git a/resources/forum/blade-tailwind/views/post/partials/list.blade.php b/resources/forum/blade-tailwind/views/post/partials/list.blade.php
deleted file mode 100644
index ecf26f53d..000000000
--- a/resources/forum/blade-tailwind/views/post/partials/list.blade.php
+++ /dev/null
@@ -1,70 +0,0 @@
-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
deleted file mode 100644
index 9c7649f9e..000000000
--- a/resources/forum/blade-tailwind/views/post/partials/quote.blade.php
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
- {!! \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
deleted file mode 100644
index 9e1d1b056..000000000
--- a/resources/forum/blade-tailwind/views/post/show.blade.php
+++ /dev/null
@@ -1,14 +0,0 @@
-@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
deleted file mode 100644
index d9effc59f..000000000
--- a/resources/forum/blade-tailwind/views/thread/create.blade.php
+++ /dev/null
@@ -1,25 +0,0 @@
-@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
deleted file mode 100644
index 8c196ac65..000000000
--- a/resources/forum/blade-tailwind/views/thread/modals/mark-as-read.blade.php
+++ /dev/null
@@ -1,14 +0,0 @@
-@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
deleted file mode 100644
index a30f82fa3..000000000
--- a/resources/forum/blade-tailwind/views/thread/partials/list.blade.php
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-
-
- 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
deleted file mode 100644
index b96988453..000000000
--- a/resources/forum/blade-tailwind/views/thread/recent.blade.php
+++ /dev/null
@@ -1,21 +0,0 @@
-@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
deleted file mode 100644
index 0e8afc3bd..000000000
--- a/resources/forum/blade-tailwind/views/thread/show.blade.php
+++ /dev/null
@@ -1,391 +0,0 @@
-@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'))
-
-
-
- {{ trans('forum::general.perma_delete') }}
-
-
- @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
deleted file mode 100644
index 560ac0edd..000000000
--- a/resources/forum/blade-tailwind/views/thread/unread.blade.php
+++ /dev/null
@@ -1,31 +0,0 @@
-@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/views/components/action-message.blade.php b/resources/views/components/action-message.blade.php
new file mode 100644
index 000000000..46ac232ad
--- /dev/null
+++ b/resources/views/components/action-message.blade.php
@@ -0,0 +1,10 @@
+@props(['on'])
+
+merge(['class' => 'text-sm text-gray-600 dark:text-gray-400']) }}>
+ {{ $slot->isEmpty() ? 'Saved.' : $slot }}
+
diff --git a/resources/views/components/application-logo.blade.php b/resources/views/components/application-logo.blade.php
new file mode 100644
index 000000000..46579cf07
--- /dev/null
+++ b/resources/views/components/application-logo.blade.php
@@ -0,0 +1,3 @@
+
+
+
diff --git a/resources/views/components/auth-session-status.blade.php b/resources/views/components/auth-session-status.blade.php
new file mode 100644
index 000000000..a39bc7d2e
--- /dev/null
+++ b/resources/views/components/auth-session-status.blade.php
@@ -0,0 +1,7 @@
+@props(['status'])
+
+@if ($status)
+ merge(['class' => 'font-medium text-sm text-green-600 dark:text-green-400']) }}>
+ {{ $status }}
+
+@endif
diff --git a/resources/views/components/danger-button.blade.php b/resources/views/components/danger-button.blade.php
new file mode 100644
index 000000000..d7417b210
--- /dev/null
+++ b/resources/views/components/danger-button.blade.php
@@ -0,0 +1,3 @@
+merge(['type' => 'submit', 'class' => 'inline-flex items-center px-4 py-2 bg-red-600 border border-transparent rounded-md font-semibold text-xs text-white uppercase tracking-widest hover:bg-red-500 active:bg-red-700 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800 transition ease-in-out duration-150']) }}>
+ {{ $slot }}
+
diff --git a/resources/views/components/dropdown-link.blade.php b/resources/views/components/dropdown-link.blade.php
new file mode 100644
index 000000000..6d5279d8b
--- /dev/null
+++ b/resources/views/components/dropdown-link.blade.php
@@ -0,0 +1 @@
+merge(['class' => 'block w-full px-4 py-2 text-start text-sm leading-5 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 focus:outline-none focus:bg-gray-100 dark:focus:bg-gray-800 transition duration-150 ease-in-out']) }}>{{ $slot }}
diff --git a/resources/views/components/dropdown.blade.php b/resources/views/components/dropdown.blade.php
new file mode 100644
index 000000000..65d29d88d
--- /dev/null
+++ b/resources/views/components/dropdown.blade.php
@@ -0,0 +1,43 @@
+@props(['align' => 'right', 'width' => '48', 'contentClasses' => 'py-1 bg-white dark:bg-gray-700'])
+
+@php
+switch ($align) {
+ case 'left':
+ $alignmentClasses = 'ltr:origin-top-left rtl:origin-top-right start-0';
+ break;
+ case 'top':
+ $alignmentClasses = 'origin-top';
+ break;
+ case 'right':
+ default:
+ $alignmentClasses = 'ltr:origin-top-right rtl:origin-top-left end-0';
+ break;
+}
+
+switch ($width) {
+ case '48':
+ $width = 'w-48';
+ break;
+}
+@endphp
+
+
+
+ {{ $trigger }}
+
+
+
+
diff --git a/resources/views/components/input-error.blade.php b/resources/views/components/input-error.blade.php
new file mode 100644
index 000000000..ad95f6b57
--- /dev/null
+++ b/resources/views/components/input-error.blade.php
@@ -0,0 +1,9 @@
+@props(['messages'])
+
+@if ($messages)
+ merge(['class' => 'text-sm text-red-600 dark:text-red-400 space-y-1']) }}>
+ @foreach ((array) $messages as $message)
+ {{ $message }}
+ @endforeach
+
+@endif
diff --git a/resources/views/components/input-label.blade.php b/resources/views/components/input-label.blade.php
new file mode 100644
index 000000000..e93b059ac
--- /dev/null
+++ b/resources/views/components/input-label.blade.php
@@ -0,0 +1,5 @@
+@props(['value'])
+
+merge(['class' => 'block font-medium text-sm text-gray-700 dark:text-gray-300']) }}>
+ {{ $value ?? $slot }}
+
diff --git a/resources/views/components/modal.blade.php b/resources/views/components/modal.blade.php
new file mode 100644
index 000000000..384662a1f
--- /dev/null
+++ b/resources/views/components/modal.blade.php
@@ -0,0 +1,78 @@
+@props([
+ 'name',
+ 'show' => false,
+ 'maxWidth' => '2xl'
+])
+
+@php
+$maxWidth = [
+ 'sm' => 'sm:max-w-sm',
+ 'md' => 'sm:max-w-md',
+ 'lg' => 'sm:max-w-lg',
+ 'xl' => 'sm:max-w-xl',
+ '2xl' => 'sm:max-w-2xl',
+][$maxWidth];
+@endphp
+
+
diff --git a/resources/views/components/nav-link.blade.php b/resources/views/components/nav-link.blade.php
new file mode 100644
index 000000000..37bad5542
--- /dev/null
+++ b/resources/views/components/nav-link.blade.php
@@ -0,0 +1,11 @@
+@props(['active'])
+
+@php
+$classes = ($active ?? false)
+ ? 'inline-flex items-center px-1 pt-1 border-b-2 border-indigo-400 dark:border-indigo-600 text-sm font-medium leading-5 text-gray-900 dark:text-gray-100 focus:outline-none focus:border-indigo-700 transition duration-150 ease-in-out'
+ : 'inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 hover:border-gray-300 dark:hover:border-gray-700 focus:outline-none focus:text-gray-700 dark:focus:text-gray-300 focus:border-gray-300 dark:focus:border-gray-700 transition duration-150 ease-in-out';
+@endphp
+
+merge(['class' => $classes]) }}>
+ {{ $slot }}
+
diff --git a/resources/views/components/primary-button.blade.php b/resources/views/components/primary-button.blade.php
new file mode 100644
index 000000000..99bf38907
--- /dev/null
+++ b/resources/views/components/primary-button.blade.php
@@ -0,0 +1,3 @@
+merge(['type' => 'submit', 'class' => 'inline-flex items-center px-4 py-2 bg-gray-800 dark:bg-gray-200 border border-transparent rounded-md font-semibold text-xs text-white dark:text-gray-800 uppercase tracking-widest hover:bg-gray-700 dark:hover:bg-white focus:bg-gray-700 dark:focus:bg-white active:bg-gray-900 dark:active:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800 transition ease-in-out duration-150']) }}>
+ {{ $slot }}
+
diff --git a/resources/views/components/responsive-nav-link.blade.php b/resources/views/components/responsive-nav-link.blade.php
new file mode 100644
index 000000000..98b55d19e
--- /dev/null
+++ b/resources/views/components/responsive-nav-link.blade.php
@@ -0,0 +1,11 @@
+@props(['active'])
+
+@php
+$classes = ($active ?? false)
+ ? 'block w-full ps-3 pe-4 py-2 border-l-4 border-indigo-400 dark:border-indigo-600 text-start text-base font-medium text-indigo-700 dark:text-indigo-300 bg-indigo-50 dark:bg-indigo-900/50 focus:outline-none focus:text-indigo-800 dark:focus:text-indigo-200 focus:bg-indigo-100 dark:focus:bg-indigo-900 focus:border-indigo-700 dark:focus:border-indigo-300 transition duration-150 ease-in-out'
+ : 'block w-full ps-3 pe-4 py-2 border-l-4 border-transparent text-start text-base font-medium text-gray-600 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 hover:border-gray-300 dark:hover:border-gray-600 focus:outline-none focus:text-gray-800 dark:focus:text-gray-200 focus:bg-gray-50 dark:focus:bg-gray-700 focus:border-gray-300 dark:focus:border-gray-600 transition duration-150 ease-in-out';
+@endphp
+
+merge(['class' => $classes]) }}>
+ {{ $slot }}
+
diff --git a/resources/views/components/secondary-button.blade.php b/resources/views/components/secondary-button.blade.php
new file mode 100644
index 000000000..fa1c54918
--- /dev/null
+++ b/resources/views/components/secondary-button.blade.php
@@ -0,0 +1,3 @@
+merge(['type' => 'button', 'class' => 'inline-flex items-center px-4 py-2 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-500 rounded-md font-semibold text-xs text-gray-700 dark:text-gray-300 uppercase tracking-widest shadow-sm hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800 disabled:opacity-25 transition ease-in-out duration-150']) }}>
+ {{ $slot }}
+
diff --git a/resources/views/components/text-input.blade.php b/resources/views/components/text-input.blade.php
new file mode 100644
index 000000000..7779a13ad
--- /dev/null
+++ b/resources/views/components/text-input.blade.php
@@ -0,0 +1,3 @@
+@props(['disabled' => false])
+
+ merge(['class' => 'border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 rounded-md shadow-sm']) !!}>
diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php
new file mode 100644
index 000000000..4024c64a8
--- /dev/null
+++ b/resources/views/dashboard.blade.php
@@ -0,0 +1,17 @@
+
+
+
+ {{ __('Dashboard') }}
+
+
+
+
+
+
+
+ {{ __("You're logged in!") }}
+
+
+
+
+
diff --git a/resources/views/layouts/guest.blade.php b/resources/views/layouts/guest.blade.php
new file mode 100644
index 000000000..eaa606538
--- /dev/null
+++ b/resources/views/layouts/guest.blade.php
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+ {{ config('app.name', 'Laravel') }}
+
+
+
+
+
+
+ @vite(['resources/css/app.css', 'resources/js/app.js'])
+
+
+
+
+
diff --git a/resources/views/livewire/.gitkeep b/resources/views/livewire/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/views/livewire/layout/navigation.blade.php b/resources/views/livewire/layout/navigation.blade.php
new file mode 100644
index 000000000..6f6211384
--- /dev/null
+++ b/resources/views/livewire/layout/navigation.blade.php
@@ -0,0 +1,110 @@
+redirect('/', navigate: true);
+ }
+}; ?>
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ __('Dashboard') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ __('Profile') }}
+
+
+
+
+
+ {{ __('Log Out') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ __('Dashboard') }}
+
+
+
+
+
+
+
+
{{ auth()->user()->email }}
+
+
+
+
+ {{ __('Profile') }}
+
+
+
+
+
+ {{ __('Log Out') }}
+
+
+
+
+
+
diff --git a/resources/views/livewire/pages/auth/confirm-password.blade.php b/resources/views/livewire/pages/auth/confirm-password.blade.php
new file mode 100644
index 000000000..1c1e31006
--- /dev/null
+++ b/resources/views/livewire/pages/auth/confirm-password.blade.php
@@ -0,0 +1,62 @@
+validate([
+ 'password' => ['required', 'string'],
+ ]);
+
+ if (! Auth::guard('web')->validate([
+ 'email' => Auth::user()->email,
+ 'password' => $this->password,
+ ])) {
+ throw ValidationException::withMessages([
+ 'password' => __('auth.password'),
+ ]);
+ }
+
+ session(['auth.password_confirmed_at' => time()]);
+
+ $this->redirectIntended(default: route('dashboard', absolute: false), navigate: true);
+ }
+}; ?>
+
+
+
+ {{ __('This is a secure area of the application. Please confirm your password before continuing.') }}
+
+
+
+
diff --git a/resources/views/livewire/pages/auth/forgot-password.blade.php b/resources/views/livewire/pages/auth/forgot-password.blade.php
new file mode 100644
index 000000000..b80401225
--- /dev/null
+++ b/resources/views/livewire/pages/auth/forgot-password.blade.php
@@ -0,0 +1,61 @@
+validate([
+ 'email' => ['required', 'string', 'email'],
+ ]);
+
+ // We will send the password reset link to this user. Once we have attempted
+ // to send the link, we will examine the response then see the message we
+ // need to show to the user. Finally, we'll send out a proper response.
+ $status = Password::sendResetLink(
+ $this->only('email')
+ );
+
+ if ($status != Password::RESET_LINK_SENT) {
+ $this->addError('email', __($status));
+
+ return;
+ }
+
+ $this->reset('email');
+
+ session()->flash('status', __($status));
+ }
+}; ?>
+
+
+
+ {{ __('Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.') }}
+
+
+
+
+
+
+
diff --git a/resources/views/livewire/pages/auth/login.blade.php b/resources/views/livewire/pages/auth/login.blade.php
new file mode 100644
index 000000000..e8b5f9484
--- /dev/null
+++ b/resources/views/livewire/pages/auth/login.blade.php
@@ -0,0 +1,71 @@
+validate();
+
+ $this->form->authenticate();
+
+ Session::regenerate();
+
+ $this->redirectIntended(default: route('dashboard', absolute: false), navigate: true);
+ }
+}; ?>
+
+
diff --git a/resources/views/livewire/pages/auth/register.blade.php b/resources/views/livewire/pages/auth/register.blade.php
new file mode 100644
index 000000000..59ba2be9d
--- /dev/null
+++ b/resources/views/livewire/pages/auth/register.blade.php
@@ -0,0 +1,88 @@
+validate([
+ 'name' => ['required', 'string', 'max:255'],
+ 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class],
+ 'password' => ['required', 'string', 'confirmed', Rules\Password::defaults()],
+ ]);
+
+ $validated['password'] = Hash::make($validated['password']);
+
+ event(new Registered($user = User::create($validated)));
+
+ Auth::login($user);
+
+ $this->redirect(route('dashboard', absolute: false), navigate: true);
+ }
+}; ?>
+
+
diff --git a/resources/views/livewire/pages/auth/reset-password.blade.php b/resources/views/livewire/pages/auth/reset-password.blade.php
new file mode 100644
index 000000000..310a1966c
--- /dev/null
+++ b/resources/views/livewire/pages/auth/reset-password.blade.php
@@ -0,0 +1,105 @@
+token = $token;
+
+ $this->email = request()->string('email');
+ }
+
+ /**
+ * Reset the password for the given user.
+ */
+ public function resetPassword(): void
+ {
+ $this->validate([
+ 'token' => ['required'],
+ 'email' => ['required', 'string', 'email'],
+ 'password' => ['required', 'string', 'confirmed', Rules\Password::defaults()],
+ ]);
+
+ // Here we will attempt to reset the user's password. If it is successful we
+ // will update the password on an actual user model and persist it to the
+ // database. Otherwise we will parse the error and return the response.
+ $status = Password::reset(
+ $this->only('email', 'password', 'password_confirmation', 'token'),
+ function ($user) {
+ $user->forceFill([
+ 'password' => Hash::make($this->password),
+ 'remember_token' => Str::random(60),
+ ])->save();
+
+ event(new PasswordReset($user));
+ }
+ );
+
+ // If the password was successfully reset, we will redirect the user back to
+ // the application's home authenticated view. If there is an error we can
+ // redirect them back to where they came from with their error message.
+ if ($status != Password::PASSWORD_RESET) {
+ $this->addError('email', __($status));
+
+ return;
+ }
+
+ Session::flash('status', __($status));
+
+ $this->redirectRoute('login', navigate: true);
+ }
+}; ?>
+
+
diff --git a/resources/views/livewire/pages/auth/verify-email.blade.php b/resources/views/livewire/pages/auth/verify-email.blade.php
new file mode 100644
index 000000000..92e87ba87
--- /dev/null
+++ b/resources/views/livewire/pages/auth/verify-email.blade.php
@@ -0,0 +1,58 @@
+hasVerifiedEmail()) {
+ $this->redirectIntended(default: route('dashboard', absolute: false), navigate: true);
+
+ return;
+ }
+
+ Auth::user()->sendEmailVerificationNotification();
+
+ Session::flash('status', 'verification-link-sent');
+ }
+
+ /**
+ * Log the current user out of the application.
+ */
+ public function logout(Logout $logout): void
+ {
+ $logout();
+
+ $this->redirect('/', navigate: true);
+ }
+}; ?>
+
+
+
+ {{ __('Thanks for signing up! Before getting started, could you verify your email address by clicking on the link we just emailed to you? If you didn\'t receive the email, we will gladly send you another.') }}
+
+
+ @if (session('status') == 'verification-link-sent')
+
+ {{ __('A new verification link has been sent to the email address you provided during registration.') }}
+
+ @endif
+
+
+
+ {{ __('Resend Verification Email') }}
+
+
+
+ {{ __('Log Out') }}
+
+
+
diff --git a/resources/views/livewire/profile/delete-user-form.blade.php b/resources/views/livewire/profile/delete-user-form.blade.php
new file mode 100644
index 000000000..92c9579ea
--- /dev/null
+++ b/resources/views/livewire/profile/delete-user-form.blade.php
@@ -0,0 +1,79 @@
+validate([
+ 'password' => ['required', 'string', 'current_password'],
+ ]);
+
+ tap(Auth::user(), $logout(...))->delete();
+
+ $this->redirect('/', navigate: true);
+ }
+}; ?>
+
+
+
+
+ {{ __('Delete Account') }}
+
+
+
+ {{ __('Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.') }}
+
+
+
+ {{ __('Delete Account') }}
+
+
+
+
+
diff --git a/resources/views/livewire/profile/update-password-form.blade.php b/resources/views/livewire/profile/update-password-form.blade.php
new file mode 100644
index 000000000..568cf2fd2
--- /dev/null
+++ b/resources/views/livewire/profile/update-password-form.blade.php
@@ -0,0 +1,79 @@
+validate([
+ 'current_password' => ['required', 'string', 'current_password'],
+ 'password' => ['required', 'string', Password::defaults(), 'confirmed'],
+ ]);
+ } catch (ValidationException $e) {
+ $this->reset('current_password', 'password', 'password_confirmation');
+
+ throw $e;
+ }
+
+ Auth::user()->update([
+ 'password' => Hash::make($validated['password']),
+ ]);
+
+ $this->reset('current_password', 'password', 'password_confirmation');
+
+ $this->dispatch('password-updated');
+ }
+}; ?>
+
+
diff --git a/resources/views/livewire/profile/update-profile-information-form.blade.php b/resources/views/livewire/profile/update-profile-information-form.blade.php
new file mode 100644
index 000000000..4ff4d86ef
--- /dev/null
+++ b/resources/views/livewire/profile/update-profile-information-form.blade.php
@@ -0,0 +1,115 @@
+name = Auth::user()->name;
+ $this->email = Auth::user()->email;
+ }
+
+ /**
+ * Update the profile information for the currently authenticated user.
+ */
+ public function updateProfileInformation(): void
+ {
+ $user = Auth::user();
+
+ $validated = $this->validate([
+ 'name' => ['required', 'string', 'max:255'],
+ 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', Rule::unique(User::class)->ignore($user->id)],
+ ]);
+
+ $user->fill($validated);
+
+ if ($user->isDirty('email')) {
+ $user->email_verified_at = null;
+ }
+
+ $user->save();
+
+ $this->dispatch('profile-updated', name: $user->name);
+ }
+
+ /**
+ * Send an email verification notification to the current user.
+ */
+ public function sendVerification(): void
+ {
+ $user = Auth::user();
+
+ if ($user->hasVerifiedEmail()) {
+ $this->redirectIntended(default: route('dashboard', absolute: false));
+
+ return;
+ }
+
+ $user->sendEmailVerificationNotification();
+
+ Session::flash('status', 'verification-link-sent');
+ }
+}; ?>
+
+
diff --git a/resources/views/livewire/welcome/navigation.blade.php b/resources/views/livewire/welcome/navigation.blade.php
new file mode 100644
index 000000000..7d079deb7
--- /dev/null
+++ b/resources/views/livewire/welcome/navigation.blade.php
@@ -0,0 +1,26 @@
+
+ @auth
+
+ Dashboard
+
+ @else
+
+ Log in
+
+
+ @if (Route::has('register'))
+
+ Register
+
+ @endif
+ @endauth
+
diff --git a/resources/views/profile.blade.php b/resources/views/profile.blade.php
new file mode 100644
index 000000000..b14bcc1b9
--- /dev/null
+++ b/resources/views/profile.blade.php
@@ -0,0 +1,29 @@
+
+
+
+ {{ __('Profile') }}
+
+
+
+
+
diff --git a/routes/auth.php b/routes/auth.php
new file mode 100644
index 000000000..131252e73
--- /dev/null
+++ b/routes/auth.php
@@ -0,0 +1,31 @@
+group(function () {
+ Volt::route('register', 'pages.auth.register')
+ ->name('register');
+
+ Volt::route('login', 'pages.auth.login')
+ ->name('login');
+
+ Volt::route('forgot-password', 'pages.auth.forgot-password')
+ ->name('password.request');
+
+ Volt::route('reset-password/{token}', 'pages.auth.reset-password')
+ ->name('password.reset');
+});
+
+Route::middleware('auth')->group(function () {
+ Volt::route('verify-email', 'pages.auth.verify-email')
+ ->name('verification.notice');
+
+ Route::get('verify-email/{id}/{hash}', VerifyEmailController::class)
+ ->middleware(['signed', 'throttle:6,1'])
+ ->name('verification.verify');
+
+ Volt::route('confirm-password', 'pages.auth.confirm-password')
+ ->name('password.confirm');
+});
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 000000000..c29eb1a15
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,21 @@
+import defaultTheme from 'tailwindcss/defaultTheme';
+import forms from '@tailwindcss/forms';
+
+/** @type {import('tailwindcss').Config} */
+export default {
+ content: [
+ './vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
+ './storage/framework/views/*.php',
+ './resources/views/**/*.blade.php',
+ ],
+
+ theme: {
+ extend: {
+ fontFamily: {
+ sans: ['Figtree', ...defaultTheme.fontFamily.sans],
+ },
+ },
+ },
+
+ plugins: [forms],
+};