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 -
- -
- - - - - - -
- -
-
- - - - -@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') }} - -
-
-
- - -
-
-
-
- - -
-
- @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()) -
- - -
- @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' : '' }}> - -
-
-
-
- - 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 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 @@ -
- -
- -
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->title }} -
-

{{ $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) -
- {{ $category->newestThread->title }} - @include ('forum::partials.timestamp', ['carbon' => $category->newestThread->created_at]) -
- @endif - @if ($category->latestActiveThread && $category->latestActiveThread->post_count > 1) -
- Re: {{ $category->latestActiveThread->title }} - @include ('forum::partials.timestamp', ['carbon' => $category->latestActiveThread->lastPost->created_at]) -
- @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) -
- {{ $subcategory->newestThread->title }} - @include ('forum::partials.timestamp', ['carbon' => $subcategory->newestThread->created_at]) -
- @endif - @if ($subcategory->latestActiveThread && $subcategory->latestActiveThread->post_count > 1) -
- Re: {{ $subcategory->latestActiveThread->title }} - @include ('forum::partials.timestamp', ['carbon' => $subcategory->latestActiveThread->lastPost->created_at]) -
- @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)) - - @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) -
- @csrf - - -
-
- - -
-
- @endcan - @endif - -
- @foreach ($threads as $thread) - @include ('forum::thread.partials.list') - @endforeach -
- - @if (count($selectableThreadIds) > 0) - @can ('manageThreads', $category) -
-
-
- {{ trans('forum::general.with_selection') }} -
-
-
-
- {{ trans_choice('forum::general.actions', 1) }} -
- - - @can ('deleteThreads', $category) - - @endcan - @can ('restoreThreads', $category) - - @endcan - @can ('moveThreadsFrom', $category) - - @endcan - @can ('lockThreads', $category) - - - @endcan - @can ('pinThreads', $category) - - - @endcan - -
- -
-
- -
- - @include ('forum::category.partials.options', [ - 'categories' => $threadDestinationCategories, - 'hide' => $category - ]) - -
- - @if (config('forum.general.soft_deletes')) -
- - -
- @endif - -
- -
-
-
-
-
- @endcan - @endif - @else -
-
- {{ trans('forum::threads.none_found') }} - @can ('createThreads', $category) -
- {{ trans('forum::threads.post_the_first') }} - @endcan -
-
- @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 @@ - 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 @@ - 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 @@ - 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 @@ -
- -
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']) - - - - -
- @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 @@ - 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 @@ - 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 @@ - \ 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]) - -
    - @csrf - @method('DELETE') - -
    -
    - - @if (config('forum.general.soft_deletes')) -
    - - -
    - @else - {{ trans('forum::general.generic_confirm') }} - @endif -
    -
    - -
    - {{ trans('forum::general.cancel') }} - {{ trans('forum::general.delete') }} -
    -
    -
    -@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]) - -
    - @csrf - @method('POST') - -
    -
    - {{ trans('forum::general.generic_confirm') }} -
    -
    - -
    - {{ trans('forum::general.cancel') }} - - {{ trans('forum::general.restore') }} - -
    -
    -
    -@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 - -
    - -
    - {!! csrf_field() !!} - - @if ($post !== null) - - @endif - -
    - {{ old('content') }} -
    - -
    - {{ trans('forum::general.cancel') }} - {{ trans('forum::general.reply') }} -
    -
    -
    -@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 - -
    - @csrf - @method('PATCH') - -
    - {{ old('content') !== null ? old('content') : $post->content }} -
    - -
    - {{ trans('forum::general.cancel') }} - {{ trans('forum::general.save') }} -
    -
    -
    -@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('forum::posts.actions') }} -
    -
    -
    -
    - - -
    -
    - -
    -
    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) -
    - @if (!$post->trashed()) - {{ trans('forum::general.permalink') }} - @if ($post->sequence != 1) - @can ('deletePosts', $post->thread) - @can ('delete', $post) - {{ trans('forum::general.delete') }} - @endcan - @endcan - @endif - @can ('edit', $post) - {{ trans('forum::general.edit') }} - @endcan - @can ('reply', $post->thread) - {{ trans('forum::general.reply') }} - @endcan - @else - @can ('restorePosts', $post->thread) - @can ('restore', $post) - {{ trans('forum::general.restore') }} - @endcan - @endcan - @endif -
    - @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 @@ -
    -
    -
    - - #{{ $post->sequence }} - -
    - {{ $post->authorName }} {{ $post->posted }} -
    -
    - {!! \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 }})

    - -
    - @csrf - -
    - {{ trans('forum::general.title') }} - -
    - -
    - {{ old('content') }} -
    - -
    - {{ trans('forum::general.cancel') }} - {{ trans('forum::general.create') }} -
    -
    -
    -@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 @@ -
    -
    -
    - - {{ $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) -
    - {{ trans('forum::posts.view') }} » -
    - {{ $thread->lastPost->authorName }} - @include ('forum::partials.timestamp', ['carbon' => $thread->lastPost->created_at]) -
    -
    - @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) -
    - @csrf - - @endif - -
    -
    - {{ $posts->links('forum::pagination') }} -
    -
    - @if (!$thread->trashed()) - @can ('reply', $thread) - - - {{ trans('forum::general.new_reply') }} - - - {{ trans('forum::general.quick_reply') }} - - - @endcan - @endif -
    -
    - - @if ((count($posts) > 1 || $posts->currentPage() > 1) && (Gate::allows('deletePosts', $thread) || Gate::allows('restorePosts', $thread)) && count($selectablePosts) > 0) -
    -
    - - -
    -
    - @endif - - @foreach ($posts as $post) - @include ('forum::post.partials.list', compact('post')) - @endforeach - - @if ((count($posts) > 1 || $posts->currentPage() > 1) && (Gate::allows('deletePosts', $thread) || Gate::allows('restorePosts', $thread)) && count($selectablePosts) > 0) -
    -
    -
    - {{ trans('forum::general.with_selection') }} -
    -
    -
    -
    - {{ trans_choice('forum::general.actions', 1) }} -
    - - - - - -
    - - @if (config('forum.general.soft_deletes')) -
    - - -
    - @endif - -
    - {{ trans('forum::general.proceed') }} -
    -
    -
    -
    -
    - @endif - - {{ $posts->links('forum::pagination') }} - - @if (!$thread->trashed()) - @can ('reply', $thread) -

    {{ trans('forum::general.quick_reply') }}

    -
    -
    - @csrf - -
    - {{ old('content') }} -
    - -
    - {{ trans('forum::general.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 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 @@ + 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) + +@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']) + + 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 + +
    +
    +
    +
    + +
    + {{ $slot }} +
    +
    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 @@ + 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 @@ + 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']) + + +
    +
    + + + +
    + +
    + {{ $slot }} +
    +
    + + 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); + } +}; ?> + + 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.') }} +
    + +
    + +
    + + + + + +
    + +
    + + {{ __('Confirm') }} + +
    +
    +
    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.') }} +
    + + + + +
    + +
    + + + +
    + +
    + + {{ __('Email Password Reset Link') }} + +
    +
    +
    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); + } +}; ?> + +
    + + + +
    + +
    + + + +
    + + +
    + + + + + +
    + + +
    + +
    + +
    + @if (Route::has('password.request')) + + {{ __('Forgot your password?') }} + + @endif + + + {{ __('Log in') }} + +
    +
    +
    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); + } +}; ?> + +
    +
    + +
    + + + +
    + + +
    + + + +
    + + +
    + + + + + +
    + + +
    + + + + + +
    + +
    + + {{ __('Already registered?') }} + + + + {{ __('Register') }} + +
    +
    +
    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); + } +}; ?> + +
    +
    + +
    + + + +
    + + +
    + + + +
    + + +
    + + + + + +
    + +
    + + {{ __('Reset Password') }} + +
    +
    +
    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') }} + + + +
    +
    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') }} + + +
    + +

    + {{ __('Are you sure you want to delete your account?') }} +

    + +

    + {{ __('Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.') }} +

    + +
    + + + + + +
    + +
    + + {{ __('Cancel') }} + + + + {{ __('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'); + } +}; ?> + +
    +
    +

    + {{ __('Update Password') }} +

    + +

    + {{ __('Ensure your account is using a long, random password to stay secure.') }} +

    +
    + +
    +
    + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + {{ __('Save') }} + + + {{ __('Saved.') }} + +
    +
    +
    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'); + } +}; ?> + +
    +
    +

    + {{ __('Profile Information') }} +

    + +

    + {{ __("Update your account's profile information and email address.") }} +

    +
    + +
    +
    + + + +
    + +
    + + + + + @if (auth()->user() instanceof \Illuminate\Contracts\Auth\MustVerifyEmail && ! auth()->user()->hasVerifiedEmail()) +
    +

    + {{ __('Your email address is unverified.') }} + + +

    + + @if (session('status') === 'verification-link-sent') +

    + {{ __('A new verification link has been sent to your email address.') }} +

    + @endif +
    + @endif +
    + +
    + {{ __('Save') }} + + + {{ __('Saved.') }} + +
    +
    +
    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 @@ + 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], +};