This commit is contained in:
Dr Masroor Ehsan 2025-01-02 18:51:00 +06:00
parent 84eac51a8d
commit ca13f405e9
63 changed files with 14389 additions and 5113 deletions

View File

@ -1,17 +0,0 @@
<?php
namespace App\View\Components;
use Illuminate\View\Component;
use Illuminate\View\View;
class AppLayout extends Component
{
/**
* Get the view / contents that represents the component.
*/
public function render(): View
{
return view('layouts.app');
}
}

View File

@ -1,17 +0,0 @@
<?php
namespace App\View\Components;
use Illuminate\View\Component;
use Illuminate\View\View;
class GuestLayout extends Component
{
/**
* Get the view / contents that represents the component.
*/
public function render(): View
{
return view('layouts.guest');
}
}

View File

@ -1,227 +0,0 @@
<?php
namespace App\Helpers;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Str;
final readonly class Theme
{
public static function appClasses()
{
$data = config('custom.custom');
// default data array
$DefaultData = [
'myLayout' => 'vertical',
'myTheme' => 'theme-default',
'myStyle' => 'light',
'myRTLSupport' => true,
'myRTLMode' => true,
'hasCustomizer' => true,
'showDropdownOnHover' => true,
'displayCustomizer' => true,
'contentLayout' => 'compact',
'headerType' => 'fixed',
'navbarType' => 'fixed',
'menuFixed' => true,
'menuCollapsed' => false,
'footerFixed' => false,
'menuFlipped' => false,
// 'menuOffcanvas' => false,
'customizerControls' => [
'rtl',
'style',
'headerType',
'contentLayout',
'layoutCollapsed',
'showDropdownOnHover',
'layoutNavbarOptions',
'themes',
],
// 'defaultLanguage'=>'en',
];
// if any key missing of array from custom.php file it will be merge and set a default value from dataDefault array and store in data variable
$data = array_merge($DefaultData, $data);
// All options available in the template
$allOptions = [
'myLayout' => ['vertical', 'horizontal', 'blank', 'front'],
'menuCollapsed' => [true, false],
'hasCustomizer' => [true, false],
'showDropdownOnHover' => [true, false],
'displayCustomizer' => [true, false],
'contentLayout' => ['compact', 'wide'],
'headerType' => ['fixed', 'static'],
'navbarType' => ['fixed', 'static', 'hidden'],
'myStyle' => ['light', 'dark', 'system'],
'myTheme' => ['theme-default', 'theme-bordered', 'theme-semi-dark'],
'myRTLSupport' => [true, false],
'myRTLMode' => [true, false],
'menuFixed' => [true, false],
'footerFixed' => [true, false],
'menuFlipped' => [true, false],
// 'menuOffcanvas' => [true, false],
'customizerControls' => [],
// 'defaultLanguage'=>array('en'=>'en','fr'=>'fr','de'=>'de','ar'=>'ar'),
];
// if myLayout value empty or not match with default options in custom.php config file then set a default value
foreach ($allOptions as $key => $value) {
if (array_key_exists($key, $DefaultData)) {
if (gettype($DefaultData[$key]) === gettype($data[$key])) {
// data key should be string
if (is_string($data[$key])) {
// data key should not be empty
if (isset($data[$key]) && $data[$key] !== null) {
// data key should not be exist inside allOptions array's sub array
if (! array_key_exists($data[$key], $value)) {
// ensure that passed value should be match with any of allOptions array value
$result = array_search($data[$key], $value, 'strict');
if (empty($result) && $result !== 0) {
$data[$key] = $DefaultData[$key];
}
}
} else {
// if data key not set or
$data[$key] = $DefaultData[$key];
}
}
} else {
$data[$key] = $DefaultData[$key];
}
}
}
$styleVal = $data['myStyle'] == 'dark' ? 'dark' : 'light';
$styleUpdatedVal = $data['myStyle'] == 'dark' ? 'dark' : $data['myStyle'];
// Determine if the layout is admin or front based on cookies
$layoutName = $data['myLayout'];
$isAdmin = Str::contains($layoutName, 'front') ? false : true;
$modeCookieName = $isAdmin ? 'admin-mode' : 'front-mode';
$colorPrefCookieName = $isAdmin ? 'admin-colorPref' : 'front-colorPref';
// Determine style based on cookies, only if not 'blank-layout'
if ($layoutName !== 'blank') {
if (isset($_COOKIE[$modeCookieName])) {
$styleVal = $_COOKIE[$modeCookieName];
if ($styleVal === 'system') {
$styleVal = isset($_COOKIE[$colorPrefCookieName]) ? $_COOKIE[$colorPrefCookieName] : 'light';
}
$styleUpdatedVal = $_COOKIE[$modeCookieName];
}
}
isset($_COOKIE['theme']) ? $themeVal = $_COOKIE['theme'] : $themeVal = $data['myTheme'];
$directionVal = isset($_COOKIE['direction']) ? ($_COOKIE['direction'] === 'true' ? 'rtl' : 'ltr') : $data['myRTLMode'];
// layout classes
$layoutClasses = [
'layout' => $data['myLayout'],
'theme' => $themeVal,
'themeOpt' => $data['myTheme'],
'style' => $styleVal,
'styleOpt' => $data['myStyle'],
'styleOptVal' => $styleUpdatedVal,
'rtlSupport' => $data['myRTLSupport'],
'rtlMode' => $data['myRTLMode'],
'textDirection' => $directionVal, // $data['myRTLMode'],
'menuCollapsed' => $data['menuCollapsed'],
'hasCustomizer' => $data['hasCustomizer'],
'showDropdownOnHover' => $data['showDropdownOnHover'],
'displayCustomizer' => $data['displayCustomizer'],
'contentLayout' => $data['contentLayout'],
'headerType' => $data['headerType'],
'navbarType' => $data['navbarType'],
'menuFixed' => $data['menuFixed'],
'footerFixed' => $data['footerFixed'],
'menuFlipped' => $data['menuFlipped'],
'customizerControls' => $data['customizerControls'],
];
// sidebar Collapsed
if ($layoutClasses['menuCollapsed'] == true) {
$layoutClasses['menuCollapsed'] = 'layout-menu-collapsed';
}
// Header Type
if ($layoutClasses['headerType'] == 'fixed') {
$layoutClasses['headerType'] = 'layout-menu-fixed';
}
// Navbar Type
if ($layoutClasses['navbarType'] == 'fixed') {
$layoutClasses['navbarType'] = 'layout-navbar-fixed';
} elseif ($layoutClasses['navbarType'] == 'static') {
$layoutClasses['navbarType'] = '';
} else {
$layoutClasses['navbarType'] = 'layout-navbar-hidden';
}
// Menu Fixed
if ($layoutClasses['menuFixed'] == true) {
$layoutClasses['menuFixed'] = 'layout-menu-fixed';
}
// Footer Fixed
if ($layoutClasses['footerFixed'] == true) {
$layoutClasses['footerFixed'] = 'layout-footer-fixed';
}
// Menu Flipped
if ($layoutClasses['menuFlipped'] == true) {
$layoutClasses['menuFlipped'] = 'layout-menu-flipped';
}
// Menu Offcanvas
// if ($layoutClasses['menuOffcanvas'] == true) {
// $layoutClasses['menuOffcanvas'] = 'layout-menu-offcanvas';
// }
// RTL Supported template
if ($layoutClasses['rtlSupport'] == true) {
$layoutClasses['rtlSupport'] = '/rtl';
}
// RTL Layout/Mode
if ($layoutClasses['rtlMode'] == true) {
$layoutClasses['rtlMode'] = 'rtl';
$layoutClasses['textDirection'] = isset($_COOKIE['direction']) ? ($_COOKIE['direction'] === 'true' ? 'rtl' : 'ltr') : 'rtl';
} else {
$layoutClasses['rtlMode'] = 'ltr';
$layoutClasses['textDirection'] = isset($_COOKIE['direction']) && $_COOKIE['direction'] === 'true' ? 'rtl' : 'ltr';
}
// Show DropdownOnHover for Horizontal Menu
if ($layoutClasses['showDropdownOnHover'] == true) {
$layoutClasses['showDropdownOnHover'] = true;
} else {
$layoutClasses['showDropdownOnHover'] = false;
}
// To hide/show display customizer UI, not js
if ($layoutClasses['displayCustomizer'] == true) {
$layoutClasses['displayCustomizer'] = true;
} else {
$layoutClasses['displayCustomizer'] = false;
}
return $layoutClasses;
}
public static function updatePageConfig($pageConfigs)
{
$demo = 'custom';
if (isset($pageConfigs)) {
if (count($pageConfigs) > 0) {
foreach ($pageConfigs as $config => $val) {
Config::set('custom.'.$demo.'.'.$config, $val);
}
}
}
}
}

View File

@ -73,7 +73,7 @@
| |
*/ */
'home' => '/dashboard', 'home' => '/',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------

10960
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,19 +1,183 @@
{ {
"name": "Materialize",
"version": "2.0.1",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "Commercial",
"scripts": { "scripts": {
"build": "vite build", "dev": "vite",
"dev": "vite" "build": "vite build"
}, },
"devDependencies": { "devDependencies": {
"@tailwindcss/forms": "^0.5.7", "@babel/core": "7.23.7",
"@tailwindcss/typography": "^0.5.10", "@babel/plugin-syntax-dynamic-import": "7.8.3",
"autoprefixer": "^10.4.16", "@babel/plugin-transform-object-rest-spread": "7.23.4",
"axios": "^1.7.4", "@babel/plugin-transform-runtime": "7.23.7",
"concurrently": "^9.0.1", "@babel/preset-env": "7.23.8",
"laravel-vite-plugin": "^1.0", "@prettier/plugin-php": "0.22.1",
"postcss": "^8.4.32", "@rollup/plugin-html": "1.0.3",
"tailwindcss": "^3.4.0", "@types/typeahead": "0.11.32",
"vite": "^6.0" "ajv": "8.16.0",
"autoprefixer": "10.4.19",
"axios": "1.7.2",
"babel-loader": "9.1.3",
"browser-sync": "2.29.3",
"cross-env": "7.0.3",
"glob": "10.4.5",
"eslint": "8.57.0",
"eslint-config-airbnb-base": "15.0.0",
"eslint-config-prettier": "9.1.0",
"eslint-plugin-import": "2.29.1",
"eslint-plugin-prettier": "5.1.3",
"lodash": "4.17.21",
"postcss": "8.4.39",
"prettier": "3.2.2",
"resolve-url-loader": "5.0.0",
"sass": "1.76.0",
"sass-loader": "14.0.0",
"vite": "5.3.3"
},
"overrides": {
"datatables.net": "1.13.11",
"datatables.net-bs5": "1.13.11",
"datatables.net-buttons": "2.4.3",
"datatables.net-buttons-bs5": "2.4.3",
"datatables.net-fixedcolumns": "4.3.1",
"datatables.net-fixedheader": "3.4.1",
"datatables.net-responsive": "2.5.1",
"datatables.net-rowgroup": "1.4.1",
"datatables.net-select": "1.7.1",
"prop-types": "15.8.1",
"sass": "1.76.0"
},
"resolutions": {
"datatables.net": "1.13.11",
"datatables.net-bs5": "1.13.11",
"datatables.net-buttons": "2.4.3",
"datatables.net-buttons-bs5": "2.4.3",
"datatables.net-fixedcolumns": "4.3.1",
"datatables.net-fixedheader": "3.4.1",
"datatables.net-responsive": "2.5.1",
"datatables.net-rowgroup": "1.4.1",
"datatables.net-select": "1.7.1",
"prop-types": "15.8.1",
"sass": "1.76.0"
},
"browserslist": [
">= 1%",
"last 2 versions",
"not dead",
"Chrome >= 45",
"Firefox >= 38",
"Edge >= 12",
"Explorer >= 10",
"iOS >= 9",
"Safari >= 9",
"Android >= 4.4",
"Opera >= 30"
],
"babel": {
"presets": [
[
"@babel/env",
{
"targets": {
"browsers": [
">= 1%",
"last 2 versions",
"not dead",
"Chrome >= 45",
"Firefox >= 38",
"Edge >= 12",
"Explorer >= 10",
"iOS >= 9",
"Safari >= 9",
"Android >= 4.4",
"Opera >= 30"
]
}
}
]
]
},
"dependencies": {
"@form-validation/bundle": "2.4.0",
"@form-validation/core": "2.4.0",
"@form-validation/plugin-alias": "2.4.0",
"@form-validation/plugin-auto-focus": "2.4.0",
"@form-validation/plugin-bootstrap5": "2.4.0",
"@form-validation/plugin-excluded": "2.4.0",
"@form-validation/plugin-field-status": "2.4.0",
"@form-validation/plugin-framework": "2.4.0",
"@form-validation/plugin-message": "2.4.0",
"@fullcalendar/core": "6.1.14",
"@fullcalendar/daygrid": "6.1.14",
"@fullcalendar/interaction": "6.1.14",
"@fullcalendar/list": "6.1.14",
"@fullcalendar/timegrid": "6.1.14",
"@fullcalendar/timeline": "6.1.14",
"@popperjs/core": "2.11.8",
"@simonwep/pickr": "1.9.1",
"@yaireo/tagify": "4.18.3",
"animate.css": "4.1.1",
"aos": "2.3.4",
"apexcharts-clevision": "3.28.5",
"autosize": "6.0.1",
"block-ui": "2.70.1",
"bloodhound-js": "1.2.3",
"bootstrap": "5.3.3",
"bootstrap-datepicker": "1.10.0",
"bootstrap-daterangepicker": "3.1.0",
"bootstrap-maxlength": "1.10.1",
"bootstrap-select": "1.14.0-beta3",
"bs-stepper": "1.7.0",
"chart.js": "4.4.3",
"cleave.js": "1.6.0",
"clipboard": "2.0.11",
"datatables.net-bs5": "1.13.11",
"datatables.net-buttons": "2.4.3",
"datatables.net-buttons-bs5": "2.4.3",
"datatables.net-fixedcolumns-bs5": "4.3.1",
"datatables.net-fixedheader-bs5": "3.4.1",
"datatables.net-responsive": "2.5.1",
"datatables.net-responsive-bs5": "2.5.1",
"datatables.net-rowgroup-bs5": "1.4.1",
"datatables.net-select-bs5": "1.7.1",
"dropzone": "5.9.3",
"flag-icons": "7.2.3",
"flatpickr": "4.6.13",
"hammerjs": "2.0.8",
"highlight.js": "11.9.0",
"jkanban": "1.3.1",
"jquery": "3.7.1",
"jquery-datatables-checkboxes": "1.2.14",
"jquery-sticky": "1.0.4",
"jquery.repeater": "1.2.1",
"jstree": "3.3.16",
"jszip": "3.10.1",
"katex": "0.16.11",
"laravel-vite-plugin": "1.0.1",
"leaflet": "1.9.4",
"mapbox-gl": "3.0.1",
"masonry-layout": "4.2.2",
"moment": "2.30.1",
"node-waves": "0.7.6",
"nouislider": "15.7.2",
"numeral": "2.0.6",
"pdfmake": "0.2.10",
"perfect-scrollbar": "1.5.5",
"plyr": "3.7.8",
"quill": "1.3.7",
"rateyo": "2.3.5",
"remixicon": "4.3.0",
"select2": "4.0.13",
"shepherd.js": "11.2.0",
"sortablejs": "1.15.2",
"spinkit": "2.0.1",
"sweetalert2": "11.10.8",
"swiper": "11.0.7",
"timepicker": "1.14.1",
"toastr": "2.1.4",
"typeahead.js": "0.11.1"
} }
} }

View File

@ -1,6 +0,0 @@
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};

View File

@ -1,7 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
[x-cloak] {
display: none;
}

View File

@ -1 +1,9 @@
import './bootstrap'; import './bootstrap';
/*
Add custom scripts here
*/
import.meta.glob([
'../assets/img/**',
// '../assets/json/**',
'../assets/vendor/fonts/**'
]);

View File

@ -1,3 +0,0 @@
# Privacy Policy
Edit this file to define the privacy policy for your application.

View File

@ -1,3 +0,0 @@
# Terms of Service
Edit this file to define the terms of service for your application.

View File

@ -10,24 +10,36 @@
</x-slot> </x-slot>
<x-slot name="form"> <x-slot name="form">
<x-action-message on="created">
{{ __('Created.') }}
</x-action-message>
<!-- Token Name --> <!-- Token Name -->
<div class="col-span-6 sm:col-span-4"> <div class="mb-5">
<x-label for="name" value="{{ __('Token Name') }}" /> <x-label for="name" class="form-label" value="{{ __('Token Name') }}" />
<x-input id="name" type="text" class="mt-1 block w-full" wire:model="createApiTokenForm.name" autofocus /> <x-input id="name" type="text" class="{{ $errors->has('name') ? 'is-invalid' : '' }}"
<x-input-error for="name" class="mt-2" /> wire:model="createApiTokenForm.name" autofocus />
<x-input-error for="name" />
</div> </div>
<!-- Token Permissions --> <!-- Token Permissions -->
@if (Laravel\Jetstream\Jetstream::hasPermissions()) @if (Laravel\Jetstream\Jetstream::hasPermissions())
<div class="col-span-6"> <div>
<x-label for="permissions" value="{{ __('Permissions') }}" /> <x-label class="form-label" for="permissions" value="{{ __('Permissions') }}" />
<div class="mt-2 grid grid-cols-1 md:grid-cols-2 gap-4"> <div class="mt-2 row">
@foreach (Laravel\Jetstream\Jetstream::$permissions as $permission) @foreach (Laravel\Jetstream\Jetstream::$permissions as $permission)
<label class="flex items-center"> <div class="col-6">
<x-checkbox wire:model="createApiTokenForm.permissions" :value="$permission"/> <div class="mb-3">
<span class="ms-2 text-sm text-gray-600">{{ $permission }}</span> <div class="form-check">
<x-checkbox wire:model="createApiTokenForm.permissions"
id="{{ 'create-' . $permission }}" :value="$permission" />
<label class="form-check-label" for="{{ 'create-' . $permission }}">
{{ $permission }}
</label> </label>
</div>
</div>
</div>
@endforeach @endforeach
</div> </div>
</div> </div>
@ -35,10 +47,6 @@
</x-slot> </x-slot>
<x-slot name="actions"> <x-slot name="actions">
<x-action-message class="me-3" on="created">
{{ __('Created.') }}
</x-action-message>
<x-button> <x-button>
{{ __('Create') }} {{ __('Create') }}
</x-button> </x-button>
@ -46,10 +54,9 @@
</x-form-section> </x-form-section>
@if ($this->user->tokens->isNotEmpty()) @if ($this->user->tokens->isNotEmpty())
<x-section-border />
<!-- Manage API Tokens --> <!-- Manage API Tokens -->
<div class="mt-10 sm:mt-0"> <div class="mt-4">
<x-action-section> <x-action-section>
<x-slot name="title"> <x-slot name="title">
{{ __('Manage API Tokens') }} {{ __('Manage API Tokens') }}
@ -61,27 +68,29 @@
<!-- API Token List --> <!-- API Token List -->
<x-slot name="content"> <x-slot name="content">
<div class="space-y-6"> <div>
@foreach ($this->user->tokens->sortBy('name') as $token) @foreach ($this->user->tokens->sortBy('name') as $token)
<div class="flex items-center justify-between"> <div class="d-flex justify-content-between align-items-center mb-2">
<div class="break-all"> <div class="fw-medium">
{{ $token->name }} {{ $token->name }}
</div> </div>
<div class="flex items-center ms-2"> <div class="d-flex">
@if ($token->last_used_at) @if ($token->last_used_at)
<div class="text-sm text-gray-400"> <div class="text-muted">
{{ __('Last used') }} {{ $token->last_used_at->diffForHumans() }} {{ __('Last used') }} {{ $token->last_used_at->diffForHumans() }}
</div> </div>
@endif @endif
@if (Laravel\Jetstream\Jetstream::hasPermissions()) @if (Laravel\Jetstream\Jetstream::hasPermissions())
<button class="cursor-pointer ms-6 text-sm text-gray-400 underline" wire:click="manageApiTokenPermissions({{ $token->id }})"> <button class="btn btn-link text-secondary me-2"
wire:click="manageApiTokenPermissions({{ $token->id }})">
{{ __('Permissions') }} {{ __('Permissions') }}
</button> </button>
@endif @endif
<button class="cursor-pointer ms-6 text-sm text-red-500" wire:click="confirmApiTokenDeletion({{ $token->id }})"> <button class="btn btn-link text-danger text-decoration-none"
wire:click="confirmApiTokenDeletion({{ $token->id }})">
{{ __('Delete') }} {{ __('Delete') }}
</button> </button>
</div> </div>
@ -100,15 +109,15 @@
</x-slot> </x-slot>
<x-slot name="content"> <x-slot name="content">
<div> <div class="mb-2">
{{ __('Please copy your new API token. For your security, it won\'t be shown again.') }} {{ __('Please copy your new API token. For your security, it won\'t be shown again.') }}
</div> </div>
<x-input x-ref="plaintextToken" type="text" readonly :value="$plainTextToken" <div class="mb-5">
class="mt-4 bg-gray-100 px-4 py-2 rounded font-mono text-sm text-gray-500 w-full break-all" <x-input x-ref="plaintextToken" type="text" readonly :value="$plainTextToken" autofocus autocomplete="off"
autofocus autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" autocorrect="off" autocapitalize="off" spellcheck="false"
@showing-token-modal.window="setTimeout(() => $refs.plaintextToken.select(), 250)" @showing-token-modal.window="setTimeout(() => $refs.plaintextToken.select(), 250)" />
/> </div>
</x-slot> </x-slot>
<x-slot name="footer"> <x-slot name="footer">
@ -125,12 +134,19 @@ class="mt-4 bg-gray-100 px-4 py-2 rounded font-mono text-sm text-gray-500 w-full
</x-slot> </x-slot>
<x-slot name="content"> <x-slot name="content">
<div class="grid grid-cols-1 md:grid-cols-2 gap-4"> <div class="mt-2 row">
@foreach (Laravel\Jetstream\Jetstream::$permissions as $permission) @foreach (Laravel\Jetstream\Jetstream::$permissions as $permission)
<label class="flex items-center"> <div class="col-6">
<x-checkbox wire:model="updateApiTokenForm.permissions" :value="$permission"/> <div class="mb-3">
<span class="ms-2 text-sm text-gray-600">{{ $permission }}</span> <div class="form-check">
<x-checkbox wire:model="updateApiTokenForm.permissions" id="{{ 'update-' . $permission }}"
:value="$permission" />
<label class="form-check-label" for="{{ 'update-' . $permission }}">
{{ $permission }}
</label> </label>
</div>
</div>
</div>
@endforeach @endforeach
</div> </div>
</x-slot> </x-slot>
@ -140,7 +156,7 @@ class="mt-4 bg-gray-100 px-4 py-2 rounded font-mono text-sm text-gray-500 w-full
{{ __('Cancel') }} {{ __('Cancel') }}
</x-secondary-button> </x-secondary-button>
<x-button class="ms-3" wire:click="updateApiToken" wire:loading.attr="disabled"> <x-button wire:click="updateApiToken" wire:loading.attr="disabled">
{{ __('Save') }} {{ __('Save') }}
</x-button> </x-button>
</x-slot> </x-slot>
@ -161,7 +177,7 @@ class="mt-4 bg-gray-100 px-4 py-2 rounded font-mono text-sm text-gray-500 w-full
{{ __('Cancel') }} {{ __('Cancel') }}
</x-secondary-button> </x-secondary-button>
<x-danger-button class="ms-3" wire:click="deleteApiToken" wire:loading.attr="disabled"> <x-danger-button wire:loading.attr="disabled" wire:click="deleteApiToken">
{{ __('Delete') }} {{ __('Delete') }}
</x-danger-button> </x-danger-button>
</x-slot> </x-slot>

View File

@ -1,13 +1,18 @@
<x-app-layout> @extends('layouts/layoutMaster')
<x-slot name="header">
<h2 class="font-semibold text-xl text-gray-800 leading-tight">
{{ __('API Tokens') }}
</h2>
</x-slot>
<div> @php
<div class="max-w-7xl mx-auto py-10 sm:px-6 lg:px-8"> $breadcrumbs = [['link' => 'home', 'name' => 'Home'], ['name' => 'API Tokens']];
@endphp
@section('title', 'API Tokens')
@section('page-style')
@vite([
'resources/assets/vendor/scss/pages/page-auth.scss'
])
@endsection
@section('content')
@livewire('api.api-token-manager') @livewire('api.api-token-manager')
</div> @endsection
</div>
</x-app-layout>

View File

@ -1,28 +1,67 @@
<x-guest-layout> @php
<x-authentication-card> use App\Helpers\Helper;
<x-slot name="logo"> use Illuminate\Support\Facades\Route;
<x-authentication-card-logo /> $configData = Helper::appClasses();
</x-slot> $customizerHidden = 'customizer-hide';
@endphp
<div class="mb-4 text-sm text-gray-600"> @extends('layouts/blankLayout')
{{ __('This is a secure area of the application. Please confirm your password before continuing.') }}
@section('title', 'Confirm Password')
@section('page-style')
{{-- Page Css files --}}
@vite('resources/assets/vendor/scss/pages/page-auth.scss')
@endsection
@section('content')
<div class="authentication-wrapper authentication-cover">
<!-- Logo -->
<a href="{{url('/')}}" class="auth-cover-brand d-flex align-items-center gap-2">
<span class="app-brand-logo demo">@include('_partials.macros',["width"=>25,"withbg"=>'var(--bs-primary)'])</span>
<span class="app-brand-text demo text-heading fw-semibold">{{config('variables.templateName')}}</span>
</a>
<!-- /Logo -->
<div class="authentication-inner row m-0">
<!-- /Left Section -->
<div class="d-none d-lg-flex col-lg-7 col-xl-8 align-items-center justify-content-center p-12 pb-2">
<img src="{{asset('assets/img/illustrations/auth-forgot-password-illustration-'.$configData['style'].'.png') }}" class="auth-cover-illustration w-100" alt="auth-illustration" data-app-light-img="illustrations/auth-forgot-password-illustration-light.png" data-app-dark-img="illustrations/auth-forgot-password-illustration-dark.png" />
<img src="{{asset('assets/img/illustrations/auth-cover-forgot-password-mask-'.$configData['style'].'.png') }}" class="authentication-image" alt="mask" data-app-light-img="illustrations/auth-cover-forgot-password-mask-light.png" data-app-dark-img="illustrations/auth-cover-forgot-password-mask-dark.png" />
</div> </div>
<!-- /Left Section -->
<x-validation-errors class="mb-4" /> <!-- Confirm Password -->
<div class="d-flex col-12 col-lg-5 col-xl-4 align-items-center authentication-bg p-sm-12 p-6">
<form method="POST" action="{{ route('password.confirm') }}"> <div class="w-px-400 mx-auto">
<h4 class="mb-1">Confirm Password? 🔒</h4>
<p class="mb-5">Please confirm your password before continuing.</p>
<form id="twoStepsForm" class="mb-5" action="{{ route('password.confirm') }}" method="POST">
@csrf @csrf
<div class="mb-5">
<div> <div class="form-password-toggle">
<x-label for="password" value="{{ __('Password') }}" /> <div class="input-group input-group-merge @error('password') is-invalid @enderror">
<x-input id="password" class="block mt-1 w-full" type="password" name="password" required autocomplete="current-password" autofocus /> <div class="form-floating form-floating-outline">
<input type="password" id="password"
class="form-control @error('password') is-invalid @enderror" name="password"
placeholder="&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;"
aria-describedby="password" />
<label for="password">Password</label>
</div> </div>
<span class="input-group-text cursor-pointer"><i class="ri-eye-off-line"></i></span>
<div class="flex justify-end mt-4">
<x-button class="ms-4">
{{ __('Confirm') }}
</x-button>
</div> </div>
@error('password')
<span class="invalid-feedback" role="alert">
<span class="fw-medium">{{ $message }}</span>
</span>
@enderror
</div>
</div>
<button class="btn btn-primary d-grid w-100">Confirm Password</button>
</form> </form>
</x-authentication-card> </div>
</x-guest-layout> </div>
<!-- /Confirm Password -->
</div>
</div>
@endsection

View File

@ -1,34 +1,71 @@
<x-guest-layout> @php
<x-authentication-card> use App\Helpers\Helper;
<x-slot name="logo"> use Illuminate\Support\Facades\Route;
<x-authentication-card-logo /> $configData = Helper::appClasses();
</x-slot> $customizerHidden = 'customizer-hide';
@endphp
<div class="mb-4 text-sm text-gray-600"> @extends('layouts/blankLayout')
{{ __('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.') }}
@section('title', 'Forgot Password')
@section('page-style')
{{-- Page Css files --}}
@vite('resources/assets/vendor/scss/pages/page-auth.scss')
@endsection
@section('content')
<div class="authentication-wrapper authentication-cover">
<!-- Logo -->
<a href="{{url('/')}}" class="auth-cover-brand d-flex align-items-center gap-2">
<span class="app-brand-logo demo">@include('_partials.macros',["width"=>25,"withbg"=>'var(--bs-primary)'])</span>
<span class="app-brand-text demo text-heading fw-semibold">{{config('variables.templateName')}}</span>
</a>
<!-- /Logo -->
<div class="authentication-inner row m-0">
<!-- /Left Section -->
<div class="d-none d-lg-flex col-lg-7 col-xl-8 align-items-center justify-content-center p-12 pb-2">
<img src="{{asset('assets/img/illustrations/auth-forgot-password-illustration-'.$configData['style'].'.png') }}" class="auth-cover-illustration w-100" alt="auth-illustration" data-app-light-img="illustrations/auth-forgot-password-illustration-light.png" data-app-dark-img="illustrations/auth-forgot-password-illustration-dark.png" />
<img src="{{asset('assets/img/illustrations/auth-cover-forgot-password-mask-'.$configData['style'].'.png') }}" class="authentication-image" alt="mask" data-app-light-img="illustrations/auth-cover-forgot-password-mask-light.png" data-app-dark-img="illustrations/auth-cover-forgot-password-mask-dark.png" />
</div> </div>
<!-- /Left Section -->
@session('status') <!-- Forgot Password -->
<div class="mb-4 font-medium text-sm text-green-600"> <div class="d-flex col-12 col-lg-5 col-xl-4 align-items-center authentication-bg p-sm-12 p-6">
{{ $value }} <div class="w-px-400 mx-auto">
<h4 class="mb-1">Forgot Password? 🔒</h4>
<p class="mb-5">Enter your email and we'll send you instructions to reset your password</p>
@if (session('status'))
<div class="mb-1 text-success">
{{ session('status') }}
</div> </div>
@endsession @endif
<form id="formAuthentication" class="mb-5" action="{{ route('password.email') }}" method="POST">
<x-validation-errors class="mb-4" />
<form method="POST" action="{{ route('password.email') }}">
@csrf @csrf
<div class="form-floating form-floating-outline mb-5">
<div class="block"> <input type="text" class="form-control @error('email') is-invalid @enderror" id="email" name="email" placeholder="john@example.com" autofocus>
<x-label for="email" value="{{ __('Email') }}" /> <label for="email">Email</label>
<x-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email')" required autofocus autocomplete="username" /> @error('email')
</div> <span class="invalid-feedback" role="alert">
<span class="fw-medium">{{ $message }}</span>
<div class="flex items-center justify-end mt-4"> </span>
<x-button> @enderror
{{ __('Email Password Reset Link') }}
</x-button>
</div> </div>
<button type="submit" class="btn btn-primary d-grid w-100">Send Reset Link</button>
</form> </form>
</x-authentication-card> <div class="text-center">
</x-guest-layout> @if (Route::has('login'))
<a href="{{ route('login') }}" class="d-flex align-items-center justify-content-center">
<i class="ri-arrow-left-s-line scaleX-n1-rtl ri-20px me-1_5"></i>
Back to login
</a>
@endif
</div>
</div>
</div>
<!-- /Forgot Password -->
</div>
</div>
@endsection

View File

@ -1,48 +1,129 @@
<x-guest-layout> @php
<x-authentication-card> use App\Helpers\Helper;
<x-slot name="logo"> use Illuminate\Support\Facades\Route;
<x-authentication-card-logo /> $configData = Helper::appClasses();
</x-slot> $customizerHidden = 'customizer-hide';
@endphp
<x-validation-errors class="mb-4" /> @extends('layouts/blankLayout')
@session('status') @section('title', 'Login')
<div class="mb-4 font-medium text-sm text-green-600">
{{ $value }} @section('page-style')
{{-- Page Css files --}}
@vite('resources/assets/vendor/scss/pages/page-auth.scss')
@endsection
@section('content')
<div class="authentication-wrapper authentication-cover">
<!-- Logo -->
<a href="{{url('/')}}" class="auth-cover-brand d-flex align-items-center gap-2">
<span class="app-brand-logo demo">@include('_partials.macros',["width"=>25,"withbg"=>'var(--bs-primary)'])</span>
<span class="app-brand-text demo text-heading fw-semibold">{{config('variables.templateName')}}</span>
</a>
<!-- /Logo -->
<div class="authentication-inner row m-0">
<!-- /Left Section -->
<div class="d-none d-lg-flex col-lg-7 col-xl-8 align-items-center justify-content-center p-12 pb-2">
<img src="{{asset('assets/img/illustrations/auth-login-illustration-'.$configData['style'].'.png') }}" class="auth-cover-illustration w-100" alt="auth-illustration" data-app-light-img="illustrations/auth-login-illustration-light.png" data-app-dark-img="illustrations/auth-login-illustration-dark.png" />
<img src="{{asset('assets/img/illustrations/auth-cover-login-mask-'.$configData['style'].'.png') }}" class="authentication-image" alt="mask" data-app-light-img="illustrations/auth-cover-login-mask-light.png" data-app-dark-img="illustrations/auth-cover-login-mask-dark.png" />
</div> </div>
@endsession <!-- /Left Section -->
<form method="POST" action="{{ route('login') }}"> <!-- Login -->
<div class="d-flex col-12 col-lg-5 col-xl-4 align-items-center authentication-bg position-relative py-sm-12 px-12 py-6">
<div class="w-px-400 mx-auto pt-5 pt-lg-0">
<h4 class="mb-1">Welcome to {{config('variables.templateName')}}! 👋</h4>
<p class="mb-5">Please sign-in to your account and start the adventure</p>
@if (session('status'))
<div class="alert alert-success mb-3" role="alert">
<div class="alert-body">
{{ session('status') }}
</div>
</div>
@endif
<form id="formAuthentication" class="mb-5" action="{{ route('login') }}" method="POST">
@csrf @csrf
<div class="form-floating form-floating-outline mb-5">
<div> <input type="text" class="form-control @error('email') is-invalid @enderror" id="login-email" name="email" placeholder="john@example.com" autofocus value="{{ old('email') }}">
<x-label for="username" value="{{ __('Username') }}" /> <label for="login-email">Email</label>
<x-input id="username" class="block mt-1 w-full" name="username" :value="old('username')" required autofocus autocomplete="username" /> @error('email')
<span class="invalid-feedback" role="alert">
<span class="fw-medium">{{ $message }}</span>
</span>
@enderror
</div> </div>
<div class="mb-5">
<div class="mt-4"> <div class="form-password-toggle">
<x-label for="password" value="{{ __('Password') }}" /> <div class="input-group input-group-merge @error('password') is-invalid @enderror">
<x-input id="password" class="block mt-1 w-full" type="password" name="password" required autocomplete="current-password" /> <div class="form-floating form-floating-outline">
<input type="password" id="login-password"
class="form-control @error('password') is-invalid @enderror" name="password"
placeholder="&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;"
aria-describedby="password" />
<label for="login-password">Password</label>
</div> </div>
<span class="input-group-text cursor-pointer"><i class="ri-eye-off-line"></i></span>
<div class="block mt-4"> </div>
<label for="remember_me" class="flex items-center"> @error('password')
<x-checkbox id="remember_me" name="remember" /> <span class="invalid-feedback" role="alert">
<span class="ms-2 text-sm text-gray-600">{{ __('Remember me') }}</span> <span class="fw-medium">{{ $message }}</span>
</span>
@enderror
</div>
</div>
<div class="mb-5 d-flex justify-content-between mt-5">
<div class="form-check mt-2">
<input class="form-check-input" type="checkbox" id="remember-me">
<label class="form-check-label" for="remember-me">
Remember Me
</label> </label>
</div> </div>
<div class="flex items-center justify-end mt-4">
@if (Route::has('password.request')) @if (Route::has('password.request'))
<a class="underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" href="{{ route('password.request') }}"> <a href="{{ route('password.request') }}" class="float-end mb-1 mt-2">
{{ __('Forgot your password?') }} <span>Forgot Password?</span>
</a> </a>
@endif @endif
<x-button class="ms-4">
{{ __('Log in') }}
</x-button>
</div> </div>
<button class="btn btn-primary d-grid w-100">
Sign in
</button>
</form> </form>
</x-authentication-card>
</x-guest-layout> <p class="text-center">
<span>New on our platform?</span>
@if (Route::has('register'))
<a href="{{ route('register') }}">
<span>Create an account</span>
</a>
@endif
</p>
<div class="divider my-5">
<div class="divider-text">or</div>
</div>
<div class="d-flex justify-content-center gap-2">
<a href="javascript:;" class="btn btn-icon rounded-circle btn-text-facebook">
<i class="tf-icons ri-facebook-fill"></i>
</a>
<a href="javascript:;" class="btn btn-icon rounded-circle btn-text-twitter">
<i class="tf-icons ri-twitter-fill"></i>
</a>
<a href="javascript:;" class="btn btn-icon rounded-circle btn-text-github">
<i class="tf-icons ri-github-fill"></i>
</a>
<a href="javascript:;" class="btn btn-icon rounded-circle btn-text-google-plus">
<i class="tf-icons ri-google-fill"></i>
</a>
</div>
</div>
</div>
<!-- /Login -->
</div>
</div>
@endsection

View File

@ -1,70 +1,138 @@
<x-guest-layout> @php
<x-authentication-card> use App\Helpers\Helper;
<x-slot name="logo"> use Illuminate\Support\Facades\Route;
<x-authentication-card-logo /> $configData = Helper::appClasses();
</x-slot> $customizerHidden = 'customizer-hide';
@endphp
<x-validation-errors class="mb-4" /> @extends('layouts/blankLayout')
<form method="POST" action="{{ route('register') }}"> @section('title', 'Register Pages')
@section('page-style')
{{-- Page Css files --}}
@vite('resources/assets/vendor/scss/pages/page-auth.scss')
@endsection
@section('content')
<div class="authentication-wrapper authentication-cover">
<!-- Logo -->
<a href="{{url('/')}}" class="auth-cover-brand d-flex align-items-center gap-2">
<span class="app-brand-logo demo">@include('_partials.macros',["width"=>25,"withbg"=>'var(--bs-primary)'])</span>
<span class="app-brand-text demo text-heading fw-semibold">{{config('variables.templateName')}}</span>
</a>
<!-- /Logo -->
<div class="authentication-inner row m-0">
<!-- /Left Text -->
<div class="d-none d-lg-flex col-lg-7 col-xl-8 align-items-center justify-content-center p-12 pb-2">
<img src="{{asset('assets/img/illustrations/auth-register-illustration-'.$configData['style'].'.png') }}" class="auth-cover-illustration w-100" alt="auth-illustration" data-app-light-img="illustrations/auth-register-illustration-light.png" data-app-dark-img="illustrations/auth-register-illustration-dark.png" />
<img src="{{asset('assets/img/illustrations/auth-cover-register-mask-'.$configData['style'].'.png') }}" class="authentication-image" alt="mask" data-app-light-img="illustrations/auth-cover-register-mask-light.png" data-app-dark-img="illustrations/auth-cover-register-mask-dark.png" />
</div>
<!-- /Left Text -->
<!-- Register -->
<div class="d-flex col-12 col-lg-5 col-xl-4 align-items-center authentication-bg position-relative py-sm-12 px-12 py-6">
<div class="w-px-400 mx-auto pt-5 pt-lg-0">
<h4 class="mb-1">Adventure starts here 🚀</h4>
<p class="mb-5">Make your app management easy and fun!</p>
<form id="formAuthentication" class="mb-5" action="{{ route('register') }}" method="POST">
@csrf @csrf
<div class="form-floating form-floating-outline mb-5">
<div> <input type="text" class="form-control @error('name') is-invalid @enderror" id="username" name="name" placeholder="johndoe" autofocus value="{{ old('name') }}">
<x-label for="name" value="{{ __('Name') }}" /> <label for="username">Username</label>
<x-input id="name" class="block mt-1 w-full" type="text" name="name" :value="old('name')" required autofocus autocomplete="name" /> @error('name')
<span class="invalid-feedback" role="alert">
<span class="fw-medium">{{ $message }}</span>
</span>
@enderror
</div> </div>
<div class="form-floating form-floating-outline mb-5">
<div class="mt-4"> <input type="text" class="form-control @error('email') is-invalid @enderror" id="email" name="email" placeholder="john@example.com" value="{{ old('email') }}">
<x-label for="username" value="{{ __('Username') }}" /> <label for="email">Email</label>
<x-input id="username" class="block mt-1 w-full" name="username" :value="old('username')" required autofocus autocomplete="username" /> @error('email')
<span class="invalid-feedback" role="alert">
<span class="fw-medium">{{ $message }}</span>
</span>
@enderror
</div> </div>
<div class="mb-5 form-password-toggle">
<div class="mt-4"> <div class="input-group input-group-merge @error('password') is-invalid @enderror">
<x-label for="email" value="{{ __('Email') }}" /> <div class="form-floating form-floating-outline">
<x-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email')" required autocomplete="email" /> <input type="password" id="password" class="form-control @error('password') is-invalid @enderror" name="password" placeholder="&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;" aria-describedby="password" />
<label for="password">Password</label>
</div> </div>
<span class="input-group-text cursor-pointer"><i class="ri-eye-off-line"></i></span>
<div class="mt-4">
<x-label for="phone" value="{{ __('Mobile Phone') }}" />
<x-input id="phone" class="block mt-1 w-full" name="phone" :value="old('phone')" required autocomplete="phone" />
</div> </div>
@error('password')
<div class="mt-4"> <span class="invalid-feedback" role="alert">
<x-label for="password" value="{{ __('Password') }}" /> <span class="fw-medium">{{ $message }}</span>
<x-input id="password" class="block mt-1 w-full" type="password" name="password" required autocomplete="new-password" /> </span>
@enderror
</div>
<div class="mb-5 form-password-toggle">
<div class="input-group input-group-merge">
<div class="form-floating form-floating-outline">
<input type="password" id="password-confirm" class="form-control" name="password_confirmation" placeholder="&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;" aria-describedby="password" />
<label for="password-confirm">Confirm Password</label>
</div>
<span class="input-group-text cursor-pointer"><i class="ri-eye-off-line"></i></span>
</div> </div>
<div class="mt-4">
<x-label for="password_confirmation" value="{{ __('Confirm Password') }}" />
<x-input id="password_confirmation" class="block mt-1 w-full" type="password" name="password_confirmation" required autocomplete="new-password" />
</div> </div>
@if (Laravel\Jetstream\Jetstream::hasTermsAndPrivacyPolicyFeature()) @if (Laravel\Jetstream\Jetstream::hasTermsAndPrivacyPolicyFeature())
<div class="mt-4"> <div class="mb-5">
<x-label for="terms"> <div class="form-check mt-2 @error('terms') is-invalid @enderror">
<div class="flex items-center"> <input class="form-check-input @error('terms') is-invalid @enderror" type="checkbox" id="terms" name="terms" />
<x-checkbox name="terms" id="terms" required /> <label class="form-check-label" for="terms">
I agree to
<div class="ms-2"> <a href="{{ route('policy.show') }}" target="_blank">privacy policy</a> &
{!! __('I agree to the :terms_of_service and :privacy_policy', [ <a href="{{ route('terms.show') }}" target="_blank">terms</a>
'terms_of_service' => '<a target="_blank" href="'.route('terms.show').'" class="underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">'.__('Terms of Service').'</a>', </label>
'privacy_policy' => '<a target="_blank" href="'.route('policy.show').'" class="underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">'.__('Privacy Policy').'</a>',
]) !!}
</div> </div>
@error('terms')
<div class="invalid-feedback" role="alert">
<span class="fw-medium">{{ $message }}</span>
</div> </div>
</x-label> @enderror
</div> </div>
@endif @endif
<button type="submit" class="btn btn-primary d-grid w-100">Sign up</button>
</form>
<div class="flex items-center justify-end mt-4"> <p class="text-center">
<a class="underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" href="{{ route('login') }}"> <span>Already have an account?</span>
{{ __('Already registered?') }} @if (Route::has('login'))
<a href="{{ route('login') }}">
<span>Sign in instead</span>
</a>
@endif
</p>
<div class="divider my-5">
<div class="divider-text">or</div>
</div>
<div class="d-flex justify-content-center gap-2">
<a href="javascript:;" class="btn btn-icon rounded-circle btn-text-facebook">
<i class="tf-icons ri-facebook-fill"></i>
</a> </a>
<x-button class="ms-4"> <a href="javascript:;" class="btn btn-icon rounded-circle btn-text-twitter">
{{ __('Register') }} <i class="tf-icons ri-twitter-fill"></i>
</x-button> </a>
<a href="javascript:;" class="btn btn-icon rounded-circle btn-text-github">
<i class="tf-icons ri-github-fill"></i>
</a>
<a href="javascript:;" class="btn btn-icon rounded-circle btn-text-google-plus">
<i class="tf-icons ri-google-fill"></i>
</a>
</div> </div>
</form> </div>
</x-authentication-card> </div>
</x-guest-layout> <!-- /Register -->
</div>
</div>
@endsection

View File

@ -1,36 +1,94 @@
<x-guest-layout> @php
<x-authentication-card> use App\Helpers\Helper;
<x-slot name="logo"> use Illuminate\Support\Facades\Route;
<x-authentication-card-logo /> $configData = Helper::appClasses();
</x-slot> $customizerHidden = 'customizer-hide';
@endphp
<x-validation-errors class="mb-4" /> @extends('layouts/blankLayout')
<form method="POST" action="{{ route('password.update') }}"> @section('title', 'Reset Password')
@section('page-style')
{{-- Page Css files --}}
@vite('resources/assets/vendor/scss/pages/page-auth.scss')
@endsection
@section('content')
<div class="position-relative">
<div class="authentication-wrapper authentication-cover">
<!-- Logo -->
<a href="{{url('/')}}" class="auth-cover-brand d-flex align-items-center gap-2">
<span class="app-brand-logo demo">@include('_partials.macros',["width"=>25,"withbg"=>'var(--bs-primary)'])</span>
<span class="app-brand-text demo text-heading fw-semibold">{{config('variables.templateName')}}</span>
</a>
<!-- /Logo -->
<div class="authentication-inner row m-0">
<!-- /Left Section -->
<div class="d-none d-lg-flex col-lg-7 col-xl-8 align-items-center justify-content-center p-12 pb-2">
<img src="{{asset('assets/img/illustrations/auth-reset-password-illustration-'.$configData['style'].'.png') }}" class="auth-cover-illustration w-100" alt="auth-illustration" data-app-light-img="illustrations/auth-reset-password-illustration-light.png" data-app-dark-img="illustrations/auth-reset-password-illustration-dark.png" />
<img src="{{asset('assets/img/illustrations/auth-cover-reset-password-mask-'.$configData['style'].'.png') }}" class="authentication-image" alt="mask" data-app-light-img="illustrations/auth-cover-reset-password-mask-light.png" data-app-dark-img="illustrations/auth-cover-reset-password-mask-dark.png" />
</div>
<!-- /Left Section -->
<!-- Reset Password -->
<div class="d-flex col-12 col-lg-5 col-xl-4 align-items-center authentication-bg position-relative py-sm-12 px-12 py-6">
<div class="w-px-400 mx-auto pt-5 pt-lg-0">
<h4 class="mb-1">Reset Password 🔒</h4>
<p class="mb-5">Your new password must be different from previously used passwords</p>
<form id="formAuthentication" class="mb-5" action="{{ route('password.update') }}" method="POST">
@csrf @csrf
<input type="hidden" name="token" value="{{ $request->route('token') }}"> <input type="hidden" name="token" value="{{ $request->route('token') }}">
<div class="block"> <div class="form-floating form-floating-outline mb-5">
<x-label for="email" value="{{ __('Email') }}" /> <input type="email" class="form-control @error('email') is-invalid @enderror" id="email" name="email" placeholder="john@example.com" value="{{Request()->email}}" readonly />
<x-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email', $request->email)" required autofocus autocomplete="username" /> <label for="email">Email</label>
@error('email')
<span class="invalid-feedback" role="alert">
<span class="fw-medium">{{ $message }}</span>
</span>
@enderror
</div> </div>
<div class="mb-5 form-password-toggle">
<div class="mt-4"> <div class="input-group input-group-merge @error('password') is-invalid @enderror">
<x-label for="password" value="{{ __('Password') }}" /> <div class="form-floating form-floating-outline">
<x-input id="password" class="block mt-1 w-full" type="password" name="password" required autocomplete="new-password" /> <input type="password" id="password" class="form-control @error('password') is-invalid @enderror" name="password" placeholder="&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;" aria-describedby="password" autofocus />
<label for="password">New Password</label>
</div> </div>
<span class="input-group-text cursor-pointer"><i class="ri-eye-off-line"></i></span>
<div class="mt-4">
<x-label for="password_confirmation" value="{{ __('Confirm Password') }}" />
<x-input id="password_confirmation" class="block mt-1 w-full" type="password" name="password_confirmation" required autocomplete="new-password" />
</div> </div>
@error('password')
<div class="flex items-center justify-end mt-4"> <span class="invalid-feedback" role="alert">
<x-button> <span class="fw-medium">{{ $message }}</span>
{{ __('Reset Password') }} </span>
</x-button> @enderror
</div>
<div class="mb-5 form-password-toggle">
<div class="input-group input-group-merge">
<div class="form-floating form-floating-outline">
<input type="password" id="confirm-password" class="form-control" name="password_confirmation" placeholder="&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;" aria-describedby="password" />
<label for="confirm-password">Confirm Password</label>
</div>
<span class="input-group-text cursor-pointer"><i class="ri-eye-off-line"></i></span>
</div>
</div>
<button class="btn btn-primary d-grid w-100 mb-5">
Set new password
</button>
<div class="text-center">
@if (Route::has('login'))
<a href="{{ route('login') }}" class="d-flex align-items-center justify-content-center">
<i class="ri-arrow-left-s-line scaleX-n1-rtl ri-20px me-1_5"></i>
Back to login
</a>
@endif
</div> </div>
</form> </form>
</x-authentication-card> </div>
</x-guest-layout> </div>
<!-- /Reset Password -->
</div>
</div>
</div>
@endsection

View File

@ -1,58 +1,78 @@
<x-guest-layout> @php
<x-authentication-card> use App\Helpers\Helper;
<x-slot name="logo"> use Illuminate\Support\Facades\Route;
<x-authentication-card-logo /> $configData = Helper::appClasses();
</x-slot> $customizerHidden = 'customizer-hide';
@endphp
@extends('layouts/blankLayout')
@section('title', 'Two Steps Verifications')
@section('page-style')
{{-- Page Css files --}}
@vite('resources/assets/vendor/scss/pages/page-auth.scss')
@endsection
@section('content')
<div class="authentication-wrapper authentication-cover">
<!-- Logo -->
<a href="{{url('/')}}" class="auth-cover-brand d-flex align-items-center gap-2">
<span class="app-brand-logo demo">@include('_partials.macros',["width"=>25,"withbg"=>'var(--bs-primary)'])</span>
<span class="app-brand-text demo text-heading fw-semibold">{{config('variables.templateName')}}</span>
</a>
<!-- /Logo -->
<div class="authentication-inner row m-0">
<!-- /Left Section -->
<div class="d-none d-lg-flex col-lg-7 col-xl-8 align-items-center justify-content-center p-12 pb-2">
<img src="{{asset('assets/img/illustrations/auth-two-steps-illustration-'.$configData['style'].'.png') }}" class="auth-cover-illustration w-100" alt="auth-illustration" data-app-light-img="illustrations/auth-two-steps-illustration-light.png" data-app-dark-img="illustrations/auth-two-steps-illustration-dark.png" />
<img src="{{asset('assets/img/illustrations/auth-cover-register-mask-'.$configData['style'].'.png') }}" class="authentication-image" alt="mask" data-app-light-img="illustrations/auth-cover-register-mask-light.png" data-app-dark-img="illustrations/auth-cover-register-mask-dark.png" />
</div>
<!-- /Left Section -->
<!-- Two Steps Verification -->
<div class="d-flex col-12 col-lg-5 col-xl-4 align-items-center authentication-bg position-relative py-sm-12 px-12 py-6">
<div class="w-px-400 mx-auto pt-5 pt-lg-0">
<h4 class="mb-1">Two Step Verification 💬</h4>
<div x-data="{ recovery: false }"> <div x-data="{ recovery: false }">
<div class="mb-4 text-sm text-gray-600" x-show="! recovery"> <div class="mb-6" x-show="! recovery">
{{ __('Please confirm access to your account by entering the authentication code provided by your authenticator application.') }} Please confirm access to your account by entering the authentication code provided by your authenticator application.
</div> </div>
<div class="mb-4 text-sm text-gray-600" x-cloak x-show="recovery"> <div class="mb-6" x-show="recovery">
{{ __('Please confirm access to your account by entering one of your emergency recovery codes.') }} Please confirm access to your account by entering one of your emergency recovery codes.
</div> </div>
<x-validation-errors class="mb-4" /> <x-validation-errors class="mb-1" />
<form method="POST" action="{{ route('two-factor.login') }}"> <form method="POST" action="{{ route('two-factor.login') }}">
@csrf @csrf
<div class="mb-5" x-show="! recovery">
<div class="mt-4" x-show="! recovery"> <x-label class="form-label" value="{{ __('Code') }}" />
<x-label for="code" value="{{ __('Code') }}" /> <x-input class="{{ $errors->has('code') ? 'is-invalid' : '' }}" type="text" inputmode="numeric" name="code" autofocus x-ref="code" autocomplete="one-time-code" />
<x-input id="code" class="block mt-1 w-full" type="text" inputmode="numeric" name="code" autofocus x-ref="code" autocomplete="one-time-code" /> <x-input-error for="code"></x-input-error>
</div> </div>
<div class="mb-5" x-show="recovery">
<div class="mt-4" x-cloak x-show="recovery"> <x-label class="form-label" value="{{ __('Recovery Code') }}" />
<x-label for="recovery_code" value="{{ __('Recovery Code') }}" /> <x-input class="{{ $errors->has('recovery_code') ? 'is-invalid' : '' }}" type="text" name="recovery_code" x-ref="recovery_code" autocomplete="one-time-code" />
<x-input id="recovery_code" class="block mt-1 w-full" type="text" name="recovery_code" x-ref="recovery_code" autocomplete="one-time-code" /> <x-input-error for="recovery_code"></x-input-error>
</div> </div>
<div class="d-flex justify-content-end gap-2">
<div class="flex items-center justify-end mt-4"> <div x-show="! recovery" x-on:click="recovery = true; $nextTick(() => { $refs.recovery_code.focus()})">
<button type="button" class="text-sm text-gray-600 hover:text-gray-900 underline cursor-pointer" <button type="button" class="btn btn-outline-secondary">Use a recovery code</button>
x-show="! recovery" </div>
x-on:click=" <div x-cloak x-show="recovery" x-on:click="recovery = false; $nextTick(() => { $refs.code.focus() })">
recovery = true; <button type="button" class="btn btn-outline-secondary">Use an authentication code</button>
$nextTick(() => { $refs.recovery_code.focus() }) </div>
"> <x-button class="px-3">Log in</x-button>
{{ __('Use a recovery code') }}
</button>
<button type="button" class="text-sm text-gray-600 hover:text-gray-900 underline cursor-pointer"
x-cloak
x-show="recovery"
x-on:click="
recovery = false;
$nextTick(() => { $refs.code.focus() })
">
{{ __('Use an authentication code') }}
</button>
<x-button class="ms-4">
{{ __('Log in') }}
</x-button>
</div> </div>
</form> </form>
</div> </div>
</x-authentication-card> </div>
</x-guest-layout> </div>
<!-- /Two Steps Verification -->
</div>
</div>
@endsection

View File

@ -1,45 +1,66 @@
<x-guest-layout> @php
<x-authentication-card> use App\Helpers\Helper;
<x-slot name="logo"> use Illuminate\Support\Facades\Route;
<x-authentication-card-logo /> use Illuminate\Support\Facades\Auth;
</x-slot> $configData = Helper::appClasses();
$customizerHidden = 'customizer-hide';
@endphp
<div class="mb-4 text-sm text-gray-600"> @extends('layouts/blankLayout')
{{ __('Before continuing, 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.') }}
@section('title', 'Verify Email')
@section('page-style')
{{-- Page Css files --}}
@vite('resources/assets/vendor/scss/pages/page-auth.scss')
@endsection
@section('content')
<div class="authentication-wrapper authentication-cover">
<!-- Logo -->
<a href="{{url('/')}}" class="auth-cover-brand d-flex align-items-center gap-2">
<span class="app-brand-logo demo">@include('_partials.macros',["width"=>25,"withbg"=>'var(--bs-primary)'])</span>
<span class="app-brand-text demo text-heading fw-semibold">{{config('variables.templateName')}}</span>
</a>
<!-- /Logo -->
<div class="authentication-inner row m-0">
<!-- /Left Section -->
<div class="d-none d-lg-flex col-lg-7 col-xl-8 align-items-center justify-content-center p-12 pb-2">
<img src="{{asset('assets/img/illustrations/auth-verify-email-illustration-'.$configData['style'].'.png') }}" class="auth-cover-illustration w-100" alt="auth-illustration" data-app-light-img="illustrations/auth-verify-email-illustration-light.png" data-app-dark-img="illustrations/auth-verify-email-illustration-dark.png" />
<img src="{{asset('assets/img/illustrations/auth-cover-login-mask-'.$configData['style'].'.png') }}" class="authentication-image" alt="mask" data-app-light-img="illustrations/auth-cover-login-mask-light.png" data-app-dark-img="illustrations/auth-cover-login-mask-dark.png" />
</div> </div>
<!-- /Left Section -->
<!-- Verify email -->
<div class="d-flex col-12 col-lg-5 col-xl-4 align-items-center authentication-bg position-relative py-sm-12 px-12 py-6">
<div class="w-px-400 mx-auto pt-5 pt-lg-0">
<h4 class="mb-1">Verify your email ✉️</h4>
@if (session('status') == 'verification-link-sent') @if (session('status') == 'verification-link-sent')
<div class="mb-4 font-medium text-sm text-green-600"> <div class="alert alert-success" role="alert">
{{ __('A new verification link has been sent to the email address you provided in your profile settings.') }} <div class="alert-body">
A new verification link has been sent to the email address you provided during registration.
</div>
</div> </div>
@endif @endif
<p class="text-start mb-0">
<div class="mt-4 flex items-center justify-between"> Account activation link sent to your email address: <span class="h6">{{Auth::user()->email}}</span> Please follow the link inside to continue.
</p>
<div class="mt-5 d-flex flex-column gap-2">
<form method="POST" action="{{ route('verification.send') }}"> <form method="POST" action="{{ route('verification.send') }}">
@csrf @csrf
<button type="submit" class="w-100 btn btn-label-secondary">click here to request another</button>
<div>
<x-button type="submit">
{{ __('Resend Verification Email') }}
</x-button>
</div>
</form> </form>
<div> <form method="POST" action="{{route('logout')}}">
<a
href="{{ route('profile.show') }}"
class="underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500"
>
{{ __('Edit Profile') }}</a>
<form method="POST" action="{{ route('logout') }}" class="inline">
@csrf @csrf
<button type="submit" class="w-100 btn btn-danger">Log Out</button>
<button type="submit" class="underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 ms-2">
{{ __('Log Out') }}
</button>
</form> </form>
</div> </div>
</div> </div>
</x-authentication-card> </div>
</x-guest-layout> <!-- / Verify email -->
</div>
</div>
@endsection

View File

@ -1,10 +1,12 @@
@props(['on']) @props(['on'])
<div x-data="{ shown: false, timeout: null }" <div class="alert alert-success" role="alert" x-data="{ shown: false, timeout: null }"
x-init="@this.on('{{ $on }}', () => { clearTimeout(timeout); shown = true; timeout = setTimeout(() => { shown = false }, 2000); })" x-init="@this.on('{{ $on }}', () => { clearTimeout(timeout); shown = true; timeout = setTimeout(() => { shown = false }, 2000); })"
x-show.transition.out.opacity.duration.1500ms="shown" x-show.transition.out.opacity.duration.1500ms="shown"
x-transition:leave.opacity.duration.1500ms x-transition:leave.opacity.duration.1500ms
style="display: none;" style="display: none;"
{{ $attributes->merge(['class' => 'text-sm text-gray-600']) }}> {{ $attributes->merge(['class' => 'small']) }}>
<div class="alert-body">
{{ $slot->isEmpty() ? 'Saved.' : $slot }} {{ $slot->isEmpty() ? 'Saved.' : $slot }}
</div> </div>
</div>

View File

@ -1,12 +1,7 @@
<div {{ $attributes->merge(['class' => 'md:grid md:grid-cols-3 md:gap-6']) }}> <div class="card">
<x-section-title> <div class="card-header">
<x-slot name="title">{{ $title }}</x-slot> <h5 class="card-title">{{ $title }}</h5>
<x-slot name="description">{{ $description }}</x-slot> <p class="card-subtitle">{{ $description }}</p>
</x-section-title>
<div class="mt-5 md:mt-0 md:col-span-2">
<div class="px-4 py-5 sm:p-6 bg-white shadow sm:rounded-lg">
{{ $content }}
</div>
</div> </div>
<div class="card-body">{{ $content }}</div>
</div> </div>

View File

@ -1,5 +1,17 @@
<svg viewBox="0 0 317 48" fill="none" xmlns="http://www.w3.org/2000/svg" {{ $attributes }}> <svg viewbox="0 0 148 80" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="20">
<path d="M74.09 30.04V13h-4.14v21H82.1v-3.96h-8.01zM95.379 19v1.77c-1.08-1.35-2.7-2.19-4.89-2.19-3.99 0-7.29 3.45-7.29 7.92s3.3 7.92 7.29 7.92c2.19 0 3.81-.84 4.89-2.19V34h3.87V19h-3.87zm-4.17 11.73c-2.37 0-4.14-1.71-4.14-4.23 0-2.52 1.77-4.23 4.14-4.23 2.4 0 4.17 1.71 4.17 4.23 0 2.52-1.77 4.23-4.17 4.23zM106.628 21.58V19h-3.87v15h3.87v-7.17c0-3.15 2.55-4.05 4.56-3.81V18.7c-1.89 0-3.78.84-4.56 2.88zM124.295 19v1.77c-1.08-1.35-2.7-2.19-4.89-2.19-3.99 0-7.29 3.45-7.29 7.92s3.3 7.92 7.29 7.92c2.19 0 3.81-.84 4.89-2.19V34h3.87V19h-3.87zm-4.17 11.73c-2.37 0-4.14-1.71-4.14-4.23 0-2.52 1.77-4.23 4.14-4.23 2.4 0 4.17 1.71 4.17 4.23 0 2.52-1.77 4.23-4.17 4.23zM141.544 19l-3.66 10.5-3.63-10.5h-4.26l5.7 15h4.41l5.7-15h-4.26zM150.354 28.09h11.31c.09-.51.15-1.02.15-1.59 0-4.41-3.15-7.92-7.59-7.92-4.71 0-7.92 3.45-7.92 7.92s3.18 7.92 8.22 7.92c2.88 0 5.13-1.17 6.54-3.21l-3.12-1.8c-.66.87-1.86 1.5-3.36 1.5-2.04 0-3.69-.84-4.23-2.82zm-.06-3c.45-1.92 1.86-3.03 3.93-3.03 1.62 0 3.24.87 3.72 3.03h-7.65zM164.516 34h3.87V12.1h-3.87V34zM185.248 34.36c3.69 0 6.9-2.01 6.9-6.3V13h-2.1v15.06c0 3.03-2.07 4.26-4.8 4.26-2.19 0-3.93-.78-4.62-2.61l-1.77 1.05c1.05 2.43 3.57 3.6 6.39 3.6zM203.124 18.64c-4.65 0-7.83 3.45-7.83 7.86 0 4.53 3.24 7.86 7.98 7.86 3.03 0 5.34-1.41 6.6-3.45l-1.74-1.02c-.81 1.44-2.46 2.55-4.83 2.55-3.18 0-5.55-1.89-5.97-4.95h13.17c.03-.3.06-.63.06-.93 0-4.11-2.85-7.92-7.44-7.92zm0 1.92c2.58 0 4.98 1.71 5.4 5.01h-11.19c.39-2.94 2.64-5.01 5.79-5.01zM221.224 20.92V19h-4.32v-4.2l-1.98.6V19h-3.15v1.92h3.15v9.09c0 3.6 2.25 4.59 6.3 3.99v-1.74c-2.91.12-4.32.33-4.32-2.25v-9.09h4.32zM225.176 22.93c0-1.62 1.59-2.37 3.15-2.37 1.44 0 2.97.57 3.6 2.1l1.65-.96c-.87-1.86-2.79-3.06-5.25-3.06-3 0-5.13 1.89-5.13 4.29 0 5.52 8.76 3.39 8.76 7.11 0 1.77-1.68 2.4-3.45 2.4-2.01 0-3.57-.99-4.11-2.52l-1.68.99c.75 1.92 2.79 3.45 5.79 3.45 3.21 0 5.43-1.77 5.43-4.32 0-5.52-8.76-3.39-8.76-7.11zM244.603 20.92V19h-4.32v-4.2l-1.98.6V19h-3.15v1.92h3.15v9.09c0 3.6 2.25 4.59 6.3 3.99v-1.74c-2.91.12-4.32.33-4.32-2.25v-9.09h4.32zM249.883 21.49V19h-1.98v15h1.98v-8.34c0-3.72 2.34-4.98 4.74-4.98v-1.92c-1.92 0-3.69.63-4.74 2.73zM263.358 18.64c-4.65 0-7.83 3.45-7.83 7.86 0 4.53 3.24 7.86 7.98 7.86 3.03 0 5.34-1.41 6.6-3.45l-1.74-1.02c-.81 1.44-2.46 2.55-4.83 2.55-3.18 0-5.55-1.89-5.97-4.95h13.17c.03-.3.06-.63.06-.93 0-4.11-2.85-7.92-7.44-7.92zm0 1.92c2.58 0 4.98 1.71 5.4 5.01h-11.19c.39-2.94 2.64-5.01 5.79-5.01zM286.848 19v2.94c-1.26-2.01-3.39-3.3-6.06-3.3-4.23 0-7.74 3.42-7.74 7.86s3.51 7.86 7.74 7.86c2.67 0 4.8-1.29 6.06-3.3V34h1.98V19h-1.98zm-5.91 13.44c-3.33 0-5.91-2.61-5.91-5.94 0-3.33 2.58-5.94 5.91-5.94s5.91 2.61 5.91 5.94c0 3.33-2.58 5.94-5.91 5.94zM309.01 18.64c-1.92 0-3.75.87-4.86 2.73-.84-1.74-2.46-2.73-4.56-2.73-1.8 0-3.42.72-4.59 2.55V19h-1.98v15H295v-8.31c0-3.72 2.16-5.13 4.32-5.13 2.13 0 3.51 1.41 3.51 4.08V34h1.98v-8.31c0-3.72 1.86-5.13 4.17-5.13 2.13 0 3.66 1.41 3.66 4.08V34h1.98v-9.36c0-3.75-2.31-6-5.61-6z" class="fill-black"/> <defs>
<path d="M11.395 44.428C4.557 40.198 0 32.632 0 24 0 10.745 10.745 0 24 0a23.891 23.891 0 0113.997 4.502c-.2 17.907-11.097 33.245-26.602 39.926z" fill="#6875F5"/> <lineargradient id="a1" x1="46.49" x2="62.46" y1="53.39" y2="48.2" gradientunits="userSpaceOnUse">
<path d="M14.134 45.885A23.914 23.914 0 0024 48c13.255 0 24-10.745 24-24 0-3.516-.756-6.856-2.115-9.866-4.659 15.143-16.608 27.092-31.75 31.751z" fill="#6875F5"/> <stop stop-opacity=".25" offset="0"></stop>
<stop stop-opacity=".1" offset=".3"></stop>
<stop stop-opacity="0" offset=".9"></stop>
</lineargradient>
<lineargradient id="e2" x1="76.9" x2="92.64" y1="26.38" y2="31.49" xlink:href="#a"></lineargradient>
<lineargradient id="d3" x1="107.12" x2="122.74" y1="53.41" y2="48.33" xlink:href="#a"></lineargradient>
</defs>
<path transform="translate(-.1)" d="M121.36,0,104.42,45.08,88.71,3.28A5.09,5.09,0,0,0,83.93,0H64.27A5.09,5.09,0,0,0,59.5,3.28L43.79,45.08,26.85,0H.1L29.43,76.74A5.09,5.09,0,0,0,34.19,80H53.39a5.09,5.09,0,0,0,4.77-3.26L74.1,35l16,41.74A5.09,5.09,0,0,0,94.82,80h18.95a5.09,5.09,0,0,0,4.76-3.24L148.1,0Z">
</path>
<path transform="translate(-.1)" d="M52.19,22.73l-8.4,22.35L56.51,78.94a5,5,0,0,0,1.64-2.19l7.34-19.2Z" fill="url(#a)"></path>
<path transform="translate(-.1)" d="M95.73,22l-7-18.69a5,5,0,0,0-1.64-2.21L74.1,35l8.33,21.79Z" fill="url(#e)"></path>
<path transform="translate(-.1)" d="M112.73,23l-8.31,22.12,12.66,33.7a5,5,0,0,0,1.45-2l7.3-18.93Z" fill="url(#d)">
</path>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1,6 +1,19 @@
<a href="/"> <a class="d-flex justify-content-center" href="/">
<svg class="size-16" viewbox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"> <span class="app-brand-logo demo bg-primary">
<path d="M11.395 44.428C4.557 40.198 0 32.632 0 24 0 10.745 10.745 0 24 0a23.891 23.891 0 0113.997 4.502c-.2 17.907-11.097 33.245-26.602 39.926z" fill="#6875F5"/> <svg viewBox="0 0 148 80" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="20">
<path d="M14.134 45.885A23.914 23.914 0 0024 48c13.255 0 24-10.745 24-24 0-3.516-.756-6.856-2.115-9.866-4.659 15.143-16.608 27.092-31.75 31.751z" fill="#6875F5"/> <defs>
<linearGradient id="a1" x1="46.49" x2="62.46" y1="53.39" y2="48.2" gradientUnits="userSpaceOnUse">
<stop stop-opacity=".25" offset="0"></stop>
<stop stop-opacity=".1" offset=".3"></stop>
<stop stop-opacity="0" offset=".9"></stop>
</linearGradient>
<linearGradient id="e2" x1="76.9" x2="92.64" y1="26.38" y2="31.49" xlink:href="#a"></linearGradient>
<linearGradient id="d3" x1="107.12" x2="122.74" y1="53.41" y2="48.33" xlink:href="#a"></linearGradient>
</defs>
<path style="fill: #fff" transform="translate(-.1)" d="M121.36,0,104.42,45.08,88.71,3.28A5.09,5.09,0,0,0,83.93,0H64.27A5.09,5.09,0,0,0,59.5,3.28L43.79,45.08,26.85,0H.1L29.43,76.74A5.09,5.09,0,0,0,34.19,80H53.39a5.09,5.09,0,0,0,4.77-3.26L74.1,35l16,41.74A5.09,5.09,0,0,0,94.82,80h18.95a5.09,5.09,0,0,0,4.76-3.24L148.1,0Z"></path>
<path transform="translate(-.1)" d="M52.19,22.73l-8.4,22.35L56.51,78.94a5,5,0,0,0,1.64-2.19l7.34-19.2Z" fill="url(#a)"></path>
<path transform="translate(-.1)" d="M95.73,22l-7-18.69a5,5,0,0,0-1.64-2.21L74.1,35l8.33,21.79Z" fill="url(#e)"></path>
<path transform="translate(-.1)" d="M112.73,23l-8.31,22.12,12.66,33.7a5,5,0,0,0,1.45-2l7.3-18.93Z" fill="url(#d)"></path>
</svg> </svg>
</span>
</a> </a>

View File

@ -1,9 +1,13 @@
<div class="min-h-screen flex flex-col sm:justify-center items-center pt-6 sm:pt-0 bg-gray-100"> <div class="container">
<div class="row justify-content-center my-5">
<div class="col-sm-12 col-md-8 col-lg-5 my-4">
<div> <div>
{{ $logo }} {{ $logo }}
</div> </div>
<div class="w-full sm:max-w-md mt-6 px-6 py-4 bg-white shadow-md overflow-hidden sm:rounded-lg"> <div class="card px-1 mx-4">
{{ $slot }} {{ $slot }}
</div> </div>
</div> </div>
</div>
</div>

View File

@ -1,48 +1,43 @@
@props(['style' => session('flash.bannerStyle', 'success'), 'message' => session('flash.banner')]) @props(['style' => session('flash.bannerStyle', 'success'), 'message' => session('flash.banner')])
<div x-data="{{ json_encode(['show' => true, 'style' => $style, 'message' => $message]) }}" <div class="alert alert-banner mb-0 rounded-0"
:class="{ 'bg-indigo-500': style == 'success', 'bg-red-700': style == 'danger', 'bg-yellow-500': style == 'warning', 'bg-gray-500': style != 'success' && style != 'danger' && style != 'warning'}" :class="{'bg-success': style == 'success', 'bg-danger': style == 'danger', 'bg-secondary': style != 'success' && style != 'danger'}"
style="display: none;" role="alert"
x-data="{show: true, style: '{{ $style }}', message: '{{ $message }}'}"
x-show="show && message" x-show="show && message"
x-on:banner-message.window=" x-init="
document.addEventListener('banner-message', event => {
style = event.detail.style; style = event.detail.style;
message = event.detail.message; message = event.detail.message;
show = true; show = true;
"> });
<div class="max-w-screen-xl mx-auto py-2 px-3 sm:px-6 lg:px-8"> " style="display: none;">
<div class="flex items-center justify-between flex-wrap"> <div class="d-flex justify-content-between align-items-center">
<div class="w-0 flex-1 flex items-center min-w-0"> <div>
<span class="flex p-2 rounded-lg" :class="{ 'bg-indigo-600': style == 'success', 'bg-red-600': style == 'danger', 'bg-yellow-600': style == 'warning' }"> <span class="badge rounded-pill py-2" :class="{'bg-success': style == 'success', 'bg-danger': style == 'danger'}">
<svg x-show="style == 'success'" class="size-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"> <svg x-show="style == 'success'" class="h-px-20 w-px-20 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /> <path stroke-linecap="round" stroke-linejoin="round" d="M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg> </svg>
<svg x-show="style == 'danger'" class="size-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"> <svg x-show="style == 'danger'" class="h-px-20 w-px-20 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z" /> <path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z" />
</svg> </svg>
<svg x-show="style != 'success' && style != 'danger' && style != 'warning'" class="size-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"> <svg x-show="style != 'success' && style != 'danger'" class="h-px-20 w-px-20 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z" /> <path stroke-linecap="round" stroke-linejoin="round" d="M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z" />
</svg> </svg>
<svg x-show="style == 'warning'" class="size-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="1.5" fill="none" />
<path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4v.01 0 0 " />
</svg>
</span> </span>
<span class="text-white" x-text="message"></span>
<p class="ms-3 font-medium text-sm text-white truncate" x-text="message"></p>
</div> </div>
<div class="shrink-0 sm:ms-3"> <div class="text-end">
<button <button type="button"
type="button" class="btn btn-icon btn-sm"
class="-me-1 flex p-2 rounded-md focus:outline-none sm:-me-2 transition" :class="{'btn-success': style == 'success', 'btn-danger': style == 'danger'}"
:class="{ 'hover:bg-indigo-600 focus:bg-indigo-600': style == 'success', 'hover:bg-red-600 focus:bg-red-600': style == 'danger', 'hover:bg-yellow-600 focus:bg-yellow-600': style == 'warning'}"
aria-label="Dismiss" aria-label="Dismiss"
x-on:click="show = false"> x-on:click="show = false">
<svg class="size-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"> <svg class="h-px-20 w-px-20 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" /> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
</svg> </svg>
</button> </button>
</div> </div>
</div> </div>
</div> </div>
</div>

View File

@ -1,3 +1,3 @@
<button {{ $attributes->merge(['type' => 'submit', 'class' => 'inline-flex items-center px-4 py-2 bg-gray-800 border border-transparent rounded-md font-semibold text-xs text-white uppercase tracking-widest hover:bg-gray-700 focus:bg-gray-700 active:bg-gray-900 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 disabled:opacity-50 transition ease-in-out duration-150']) }}> <button {{ $attributes->merge(['type' => 'submit', 'class' => 'btn btn-primary']) }}>
{{ $slot }} {{ $slot }}
</button> </button>

View File

@ -1 +1 @@
<input type="checkbox" {!! $attributes->merge(['class' => 'rounded border-gray-300 text-indigo-600 shadow-sm focus:ring-indigo-500']) !!}> <input type="checkbox" {!! $attributes->merge(['class' => 'form-check-input']) !!}>

View File

@ -1,27 +1,16 @@
@props(['id' => null, 'maxWidth' => null]) @props(['id' => null, 'maxWidth' => null])
<x-modal :id="$id" :maxWidth="$maxWidth" {{ $attributes }}> <x-modal :id="$id" :maxWidth="$maxWidth" {{ $attributes }}>
<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"> <div class="modal-content">
<div class="sm:flex sm:items-start"> <div class="modal-header">
<div class="mx-auto shrink-0 flex items-center justify-center size-12 rounded-full bg-red-100 sm:mx-0 sm:size-10"> <h4 class="modal-title">{{ $title }}</h4>
<svg class="size-6 text-red-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z" />
</svg>
</div> </div>
<div class="modal-body">
<div class="mt-3 text-center sm:mt-0 sm:ms-4 sm:text-start">
<h3 class="text-lg font-medium text-gray-900">
{{ $title }}
</h3>
<div class="mt-4 text-sm text-gray-600">
{{ $content }} {{ $content }}
</div> </div>
</div> <div class="modal-footer">
</div>
</div>
<div class="flex flex-row justify-end px-6 py-4 bg-gray-100 text-end">
{{ $footer }} {{ $footer }}
</div> </div>
</div>
</x-modal> </x-modal>

View File

@ -4,13 +4,9 @@
$confirmableId = md5($attributes->wire('then')); $confirmableId = md5($attributes->wire('then'));
@endphp @endphp
<span <span {{ $attributes->wire('then') }} x-data x-ref="span"
{{ $attributes->wire('then') }}
x-data
x-ref="span"
x-on:click="$wire.startConfirmingPassword('{{ $confirmableId }}')" x-on:click="$wire.startConfirmingPassword('{{ $confirmableId }}')"
x-on:password-confirmed.window="setTimeout(() => $event.detail.id === '{{ $confirmableId }}' && $refs.span.dispatchEvent(new CustomEvent('then', { bubbles: false })), 250);" x-on:password-confirmed.window="setTimeout(() => $event.detail.id === '{{ $confirmableId }}' && $refs.span.dispatchEvent(new CustomEvent('then', { bubbles: false })), 250);">
>
{{ $slot }} {{ $slot }}
</span> </span>
@ -23,13 +19,13 @@
<x-slot name="content"> <x-slot name="content">
{{ $content }} {{ $content }}
<div class="mt-4" x-data="{}" x-on:confirming-password.window="setTimeout(() => $refs.confirmable_password.focus(), 250)"> <div class="mt-3" x-data="{}"
<x-input type="password" class="mt-1 block w-3/4" placeholder="{{ __('Password') }}" autocomplete="current-password" x-on:confirming-password.window="setTimeout(() => $refs.confirmable_password.focus(), 250)">
x-ref="confirmable_password" <x-input type="password" class="{{ $errors->has('confirmable_password') ? 'is-invalid' : '' }}"
wire:model="confirmablePassword" placeholder="{{ __('Password') }}" x-ref="confirmable_password" wire:model="confirmablePassword"
wire:keydown.enter="confirmPassword" /> wire:keydown.enter="confirmPassword" />
<x-input-error for="confirmable_password" class="mt-2" /> <x-input-error for="confirmable_password" />
</div> </div>
</x-slot> </x-slot>
@ -38,7 +34,7 @@
{{ __('Cancel') }} {{ __('Cancel') }}
</x-secondary-button> </x-secondary-button>
<x-button class="ms-3" dusk="confirm-password-button" wire:click="confirmPassword" wire:loading.attr="disabled"> <x-button class="ms-1" dusk="confirm-password-button" wire:click="confirmPassword" wire:loading.attr="disabled">
{{ $button }} {{ $button }}
</x-button> </x-button>
</x-slot> </x-slot>

View File

@ -1,3 +1,3 @@
<button {{ $attributes->merge(['type' => 'button', 'class' => 'inline-flex items-center justify-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 transition ease-in-out duration-150']) }}> <button {{ $attributes->merge(['type' => 'button', 'class' => 'btn btn-danger text-white']) }}>
{{ $slot }} {{ $slot }}
</button> </button>

View File

@ -1,17 +1,16 @@
@props(['id' => null, 'maxWidth' => null]) @props(['id' => null, 'maxWidth' => null])
<x-modal :id="$id" :maxWidth="$maxWidth" {{ $attributes }}> <x-modal :id="$id" :maxWidth="$maxWidth" {{ $attributes }}>
<div class="px-6 py-4"> <div class="modal-content">
<div class="text-lg font-medium text-gray-900"> <div class="modal-header">
{{ $title }} <h5 class="modal-title">{{ $title }}</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </div>
<div class="modal-body">
<div class="mt-4 text-sm text-gray-600">
{{ $content }} {{ $content }}
</div> </div>
</div> <div class="modal-footer">
<div class="flex flex-row justify-end px-6 py-4 bg-gray-100 text-end">
{{ $footer }} {{ $footer }}
</div> </div>
</div>
</x-modal> </x-modal>

View File

@ -1 +1 @@
<a {{ $attributes->merge(['class' => 'block w-full px-4 py-2 text-start text-sm leading-5 text-gray-700 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 transition duration-150 ease-in-out']) }}>{{ $slot }}</a> <a {{ $attributes->merge(['class' => 'dropdown-item']) }}>{{ $slot }}</a>

View File

@ -1,37 +1,11 @@
@props(['align' => 'right', 'width' => '48', 'contentClasses' => 'py-1 bg-white', 'dropdownClasses' => '']) @props(['id' => 'navbarDropdown'])
@php <li class="nav-item dropdown">
$alignmentClasses = match ($align) { <a id="{{ $id }}" {!! $attributes->merge(['class' => 'nav-link']) !!} role="button" data-toggle="dropdown" aria-expanded="false">
'left' => 'ltr:origin-top-left rtl:origin-top-right start-0',
'top' => 'origin-top',
'none', 'false' => '',
default => 'ltr:origin-top-right rtl:origin-top-left end-0',
};
$width = match ($width) {
'48' => 'w-48',
'60' => 'w-60',
default => 'w-48',
};
@endphp
<div class="relative" x-data="{ open: false }" @click.away="open = false" @close.stop="open = false">
<div @click="open = ! open">
{{ $trigger }} {{ $trigger }}
</div> </a>
<div x-show="open" <div class="dropdown-menu dropdown-menu-right animate slideIn" aria-labelledby="{{ $id }}">
x-transition:enter="transition ease-out duration-200"
x-transition:enter-start="transform opacity-0 scale-95"
x-transition:enter-end="transform opacity-100 scale-100"
x-transition:leave="transition ease-in duration-75"
x-transition:leave-start="transform opacity-100 scale-100"
x-transition:leave-end="transform opacity-0 scale-95"
class="absolute z-50 mt-2 {{ $width }} rounded-md shadow-lg {{ $alignmentClasses }} {{ $dropdownClasses }}"
style="display: none;"
@click="open = false">
<div class="rounded-md ring-1 ring-black ring-opacity-5 {{ $contentClasses }}">
{{ $content }} {{ $content }}
</div> </div>
</div> </li>
</div>

View File

@ -1,21 +1,15 @@
@props(['submit']) @props(['submit'])
<div {{ $attributes->merge(['class' => 'md:grid md:grid-cols-3 md:gap-6']) }}> <div class="card">
<x-section-title> <div class="card-header">
<x-slot name="title">{{ $title }}</x-slot> <h5 class="card-title">{{ $title }}</h5>
<x-slot name="description">{{ $description }}</x-slot> <p class="card-subtitle">{{ $description }}</p>
</x-section-title> </div>
<div class="card-body">
<div class="mt-5 md:mt-0 md:col-span-2"> <form wire:submit.prevent="{{ $submit }}">
<form wire:submit="{{ $submit }}">
<div class="px-4 py-5 bg-white sm:p-6 shadow {{ isset($actions) ? 'sm:rounded-tl-md sm:rounded-tr-md' : 'sm:rounded-md' }}">
<div class="grid grid-cols-6 gap-6">
{{ $form }} {{ $form }}
</div>
</div>
@if (isset($actions)) @if (isset($actions))
<div class="flex items-center justify-end px-4 py-3 bg-gray-50 text-end sm:px-6 shadow sm:rounded-bl-md sm:rounded-br-md"> <div class="d-flex justify-content-end">
{{ $actions }} {{ $actions }}
</div> </div>
@endif @endif

View File

@ -1,5 +1,7 @@
@props(['for']) @props(['for'])
@error($for) @error($for)
<p {{ $attributes->merge(['class' => 'text-sm text-red-600']) }}>{{ $message }}</p> <span {{ $attributes->merge(['class' => 'invalid-feedback']) }} role="alert">
<span class="fw-medium">{{ $message }}</span>
</span>
@enderror @enderror

View File

@ -1,3 +1,3 @@
@props(['disabled' => false]) @props(['disabled' => false])
<input {{ $disabled ? 'disabled' : '' }} {!! $attributes->merge(['class' => 'border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm']) !!}> <input {{ $disabled ? 'disabled' : '' }} {!! $attributes->merge(['class' => 'form-control']) !!}>

View File

@ -1,5 +1,5 @@
@props(['value']) @props(['value'])
<label {{ $attributes->merge(['class' => 'block font-medium text-sm text-gray-700']) }}> <label {{ $attributes }}>
{{ $value ?? $slot }} {{ $value ?? $slot }}
</label> </label>

View File

@ -1,43 +1,47 @@
@props(['id', 'maxWidth']) @props(['id', 'maxWidth', 'modal' => false])
@php @php
$id = $id ?? md5($attributes->wire('model')); $id = $id ?? md5($attributes->wire('model'));
$maxWidth = [ switch ($maxWidth ?? '') {
'sm' => 'sm:max-w-sm', case 'sm':
'md' => 'sm:max-w-md', $maxWidth = ' modal-sm';
'lg' => 'sm:max-w-lg', break;
'xl' => 'sm:max-w-xl', case 'md':
'2xl' => 'sm:max-w-2xl', $maxWidth = '';
][$maxWidth ?? '2xl']; break;
case 'lg':
$maxWidth = ' modal-lg';
break;
case 'xl':
$maxWidth = ' modal-xl';
break;
case '2xl':
default:
$maxWidth = '';
break;
}
@endphp @endphp
<!-- Modal -->
<div <div
x-data="{ show: @entangle($attributes->wire('model')) }" x-data="{ show: @entangle($attributes->wire('model')) }"
x-on:close.stop="show = false" x-init="() => {
x-on:keydown.escape.window="show = false" let modal = $('#{{ $id }}');
x-show="show" $watch('show', value => {
id="{{ $id }}" if (value) {
class="jetstream-modal fixed inset-0 overflow-y-auto px-4 py-6 sm:px-0 z-50" modal.modal('show')
style="display: none;" } else {
> modal.modal('hide')
<div x-show="show" class="fixed inset-0 transform transition-all" x-on:click="show = false" x-transition:enter="ease-out duration-300" }
x-transition:enter-start="opacity-0" });
x-transition:enter-end="opacity-100"
x-transition:leave="ease-in duration-200"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0">
<div class="absolute inset-0 bg-gray-500 opacity-75"></div>
</div>
<div x-show="show" class="mb-6 bg-white rounded-lg overflow-hidden shadow-xl transform transition-all sm:w-full {{ $maxWidth }} sm:mx-auto" modal.on('hide.bs.modal', function () {
x-trap.inert.noscroll="show" show = false
x-transition:enter="ease-out duration-300" })
x-transition:enter-start="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95" }" wire:ignore.self class="modal fade" tabindex="-1" id="{{ $id }}" aria-labelledby="{{ $id }}"
x-transition:enter-end="opacity-100 translate-y-0 sm:scale-100" aria-hidden="true" x-ref="{{ $id }}">
x-transition:leave="ease-in duration-200" <div class="modal-dialog{{ $maxWidth }}">
x-transition:leave-start="opacity-100 translate-y-0 sm:scale-100"
x-transition:leave-end="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95">
{{ $slot }} {{ $slot }}
</div> </div>
</div> </div>

View File

@ -1,11 +1,11 @@
@props(['active']) @props(['active'])
@php @php
$classes = ($active ?? false) $classes = $active ?? false ? 'nav-link active fw-medium' : 'nav-link';
? 'inline-flex items-center px-1 pt-1 border-b-2 border-indigo-400 text-sm font-medium leading-5 text-gray-900 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 hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-300 transition duration-150 ease-in-out';
@endphp @endphp
<li class="nav-item">
<a {{ $attributes->merge(['class' => $classes]) }}> <a {{ $attributes->merge(['class' => $classes]) }}>
{{ $slot }} {{ $slot }}
</a> </a>
</li>

View File

@ -2,8 +2,8 @@
@php @php
$classes = ($active ?? false) $classes = ($active ?? false)
? 'block w-full ps-3 pe-4 py-2 border-l-4 border-indigo-400 text-start text-base font-medium text-indigo-700 bg-indigo-50 focus:outline-none focus:text-indigo-800 focus:bg-indigo-100 focus:border-indigo-700 transition duration-150 ease-in-out' ? 'd-block w-100 ps-1 pe-2 py-2 border-start border-primary text-left fw-medium text-primary bg-light-primary'
: 'block w-full ps-3 pe-4 py-2 border-l-4 border-transparent text-start text-base font-medium text-gray-600 hover:text-gray-800 hover:bg-gray-50 hover:border-gray-300 focus:outline-none focus:text-gray-800 focus:bg-gray-50 focus:border-gray-300 transition duration-150 ease-in-out'; : 'd-block w-100 ps-1 pe-2 py-2 border-start border-transparent text-left fw-medium text-body';
@endphp @endphp
<a {{ $attributes->merge(['class' => $classes]) }}> <a {{ $attributes->merge(['class' => $classes]) }}>

View File

@ -1,3 +1,3 @@
<button {{ $attributes->merge(['type' => 'button', 'class' => 'inline-flex items-center px-4 py-2 bg-white border border-gray-300 rounded-md font-semibold text-xs text-gray-700 uppercase tracking-widest shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 disabled:opacity-25 transition ease-in-out duration-150']) }}> <button {{ $attributes->merge(['type' => 'button', 'class' => 'btn btn-label-secondary']) }}>
{{ $slot }} {{ $slot }}
</button> </button>

View File

@ -1,5 +1,5 @@
<div class="hidden sm:block"> <div class="d-none d-sm-block">
<div class="py-8"> <div class="py-4">
<div class="border-t border-gray-200"></div> <hr class="border-top border-gray-200">
</div> </div>
</div> </div>

View File

@ -1,13 +1,9 @@
<div class="md:col-span-1 flex justify-between"> <div class="col-md-6 d-flex justify-content-between">
<div class="px-4 sm:px-0"> <div class="px-4">
<h3 class="text-lg font-medium text-gray-900">{{ $title }}</h3> <h3 class="text-lg font-medium text-gray-900">{{ $title }}</h3>
<p class="mt-1 text-sm text-gray-600"> <p class="mt-1 text-sm text-gray-600">{{ $description }}</p>
{{ $description }}
</p>
</div> </div>
<div class="px-4 sm:px-0"> <div class="px-4">{{ $aside ?? '' }}</div>
{{ $aside ?? '' }}
</div>
</div> </div>

View File

@ -1,21 +1,27 @@
@php
use Illuminate\Support\Facades\Auth;
@endphp
@props(['team', 'component' => 'dropdown-link']) @props(['team', 'component' => 'dropdown-link'])
<form method="POST" action="{{ route('current-team.update') }}" x-data> <form method="POST" action="{{ route('current-team.update') }}" id="switch-team-form-{{ $team->id }}">
@method('PUT') @method('PUT')
@csrf @csrf
<!-- Hidden Team ID --> <!-- Hidden Team ID -->
<input type="hidden" name="team_id" value="{{ $team->id }}"> <input type="hidden" name="team_id" value="{{ $team->id }}">
<x-dynamic-component :component="$component" href="#" x-on:click.prevent="$root.submit();"> <x-dynamic-component :component="$component" href="#"
<div class="flex items-center"> onclick="event.preventDefault(); document.getElementById('switch-team-form-{{ $team->id }}').submit();">
<div class="d-flex align-content-center">
@if (Auth::user()->isCurrentTeam($team)) @if (Auth::user()->isCurrentTeam($team))
<svg class="me-2 size-5 text-green-400" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"> <svg class="me-2 text-success" width="20" fill="none" stroke-linecap="round" stroke-linejoin="round"
<path stroke-linecap="round" stroke-linejoin="round" d="M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /> stroke-width="2" stroke="currentColor" viewBox="0 0 24 24">
<path d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg> </svg>
@endif @endif
<div class="truncate">{{ $team->name }}</div> <div>{{ $team->name }}</div>
</div> </div>
</x-dynamic-component> </x-dynamic-component>
</form> </form>

View File

@ -1,11 +1,13 @@
@if ($errors->any()) @if ($errors->any())
<div {{ $attributes }}> <div {!! $attributes->merge(['class' => 'alert alert-danger']) !!} role="alert">
<div class="font-medium text-red-600">{{ __('Whoops! Something went wrong.') }}</div> <div class="alert-body">
<div class="fw-bold">{{ __('Whoops! Something went wrong.') }}</div>
<ul class="mt-3 list-disc list-inside text-sm text-red-600"> <ul>
@foreach ($errors->all() as $error) @foreach ($errors->all() as $error)
<li>{{ $error }}</li> <li>{{ $error }}</li>
@endforeach @endforeach
</ul> </ul>
</div> </div>
</div>
@endif @endif

View File

@ -1,96 +0,0 @@
<div class="p-6 lg:p-8 bg-white border-b border-gray-200">
<x-application-logo class="block h-12 w-auto" />
<h1 class="mt-8 text-2xl font-medium text-gray-900">
Welcome to your Jetstream application!
</h1>
<p class="mt-6 text-gray-500 leading-relaxed">
Laravel Jetstream provides a beautiful, robust starting point for your next Laravel application. Laravel is designed
to help you build your application using a development environment that is simple, powerful, and enjoyable. We believe
you should love expressing your creativity through programming, so we have spent time carefully crafting the Laravel
ecosystem to be a breath of fresh air. We hope you love it.
</p>
</div>
<div class="bg-gray-200 bg-opacity-25 grid grid-cols-1 md:grid-cols-2 gap-6 lg:gap-8 p-6 lg:p-8">
<div>
<div class="flex items-center">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" class="size-6 stroke-gray-400">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 6.042A8.967 8.967 0 006 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 016 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 016-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0018 18a8.967 8.967 0 00-6 2.292m0-14.25v14.25" />
</svg>
<h2 class="ms-3 text-xl font-semibold text-gray-900">
<a href="https://laravel.com/docs">Documentation</a>
</h2>
</div>
<p class="mt-4 text-gray-500 text-sm leading-relaxed">
Laravel has wonderful documentation covering every aspect of the framework. Whether you're new to the framework or have previous experience, we recommend reading all of the documentation from beginning to end.
</p>
<p class="mt-4 text-sm">
<a href="https://laravel.com/docs" class="inline-flex items-center font-semibold text-indigo-700">
Explore the documentation
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" class="ms-1 size-5 fill-indigo-500">
<path fill-rule="evenodd" d="M5 10a.75.75 0 01.75-.75h6.638L10.23 7.29a.75.75 0 111.04-1.08l3.5 3.25a.75.75 0 010 1.08l-3.5 3.25a.75.75 0 11-1.04-1.08l2.158-1.96H5.75A.75.75 0 015 10z" clip-rule="evenodd" />
</svg>
</a>
</p>
</div>
<div>
<div class="flex items-center">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" class="size-6 stroke-gray-400">
<path stroke-linecap="round" d="M15.75 10.5l4.72-4.72a.75.75 0 011.28.53v11.38a.75.75 0 01-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 002.25-2.25v-9a2.25 2.25 0 00-2.25-2.25h-9A2.25 2.25 0 002.25 7.5v9a2.25 2.25 0 002.25 2.25z" />
</svg>
<h2 class="ms-3 text-xl font-semibold text-gray-900">
<a href="https://laracasts.com">Laracasts</a>
</h2>
</div>
<p class="mt-4 text-gray-500 text-sm leading-relaxed">
Laracasts offers thousands of video tutorials on Laravel, PHP, and JavaScript development. Check them out, see for yourself, and massively level up your development skills in the process.
</p>
<p class="mt-4 text-sm">
<a href="https://laracasts.com" class="inline-flex items-center font-semibold text-indigo-700">
Start watching Laracasts
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" class="ms-1 size-5 fill-indigo-500">
<path fill-rule="evenodd" d="M5 10a.75.75 0 01.75-.75h6.638L10.23 7.29a.75.75 0 111.04-1.08l3.5 3.25a.75.75 0 010 1.08l-3.5 3.25a.75.75 0 11-1.04-1.08l2.158-1.96H5.75A.75.75 0 015 10z" clip-rule="evenodd" />
</svg>
</a>
</p>
</div>
<div>
<div class="flex items-center">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" class="size-6 stroke-gray-400">
<path stroke-linecap="round" stroke-linejoin="round" d="M2.25 15.75l5.159-5.159a2.25 2.25 0 013.182 0l5.159 5.159m-1.5-1.5l1.409-1.409a2.25 2.25 0 013.182 0l2.909 2.909m-18 3.75h16.5a1.5 1.5 0 001.5-1.5V6a1.5 1.5 0 00-1.5-1.5H3.75A1.5 1.5 0 002.25 6v12a1.5 1.5 0 001.5 1.5zm10.5-11.25h.008v.008h-.008V8.25zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0z" />
</svg>
<h2 class="ms-3 text-xl font-semibold text-gray-900">
<a href="https://tailwindcss.com/">Tailwind</a>
</h2>
</div>
<p class="mt-4 text-gray-500 text-sm leading-relaxed">
Laravel Jetstream is built with Tailwind, an amazing utility first CSS framework that doesn't get in your way. You'll be amazed how easily you can build and maintain fresh, modern designs with this wonderful framework at your fingertips.
</p>
</div>
<div>
<div class="flex items-center">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" class="size-6 stroke-gray-400">
<path stroke-linecap="round" stroke-linejoin="round" d="M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z" />
</svg>
<h2 class="ms-3 text-xl font-semibold text-gray-900">
Authentication
</h2>
</div>
<p class="mt-4 text-gray-500 text-sm leading-relaxed">
Authentication and registration views are included with Laravel Jetstream, as well as support for user email verification and resetting forgotten passwords. So, you're free to get started with what matters most: building your application.
</p>
</div>
</div>

View File

@ -1,15 +0,0 @@
<x-app-layout>
<x-slot name="header">
<h2 class="font-semibold text-xl text-gray-800 leading-tight">
{{ __('Dashboard') }}
</h2>
</x-slot>
<div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<div class="bg-white overflow-hidden shadow-xl sm:rounded-lg">
<x-welcome />
</div>
</div>
</div>
</x-app-layout>

View File

@ -1,53 +0,0 @@
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ config('app.name', 'Laravel') }}</title>
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.bunny.net">
<link href="https://fonts.bunny.net/css?family=figtree:400,500,600&display=swap" rel="stylesheet" />
<!-- Scripts -->
@vite(['resources/css/app.css', 'resources/js/app.js'])
<!-- Styles -->
@livewireStyles
@if (isset($header_scripts))
{!! $header_scripts !!}
@endisset
</head>
<body class="font-sans antialiased">
<x-banner />
<div class="min-h-screen bg-gray-100">
@livewire('navigation-menu')
<!-- Page Heading -->
@if (isset($header))
<header class="bg-white shadow">
<div class="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">
{{ $header }}
</div>
</header>
@endif
<!-- Page Content -->
<main>
{{ $slot }}
</main>
</div>
@stack('modals')
@livewireScripts
@if (isset($footer_scripts))
{!! $footer_scripts !!}
@endisset
</body>
</html>

View File

@ -1,27 +0,0 @@
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ config('app.name', 'Laravel') }}</title>
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.bunny.net">
<link href="https://fonts.bunny.net/css?family=figtree:400,500,600&display=swap" rel="stylesheet" />
<!-- Scripts -->
@vite(['resources/css/app.css', 'resources/js/app.js'])
<!-- Styles -->
@livewireStyles
</head>
<body>
<div class="font-sans text-gray-900 antialiased">
{{ $slot }}
</div>
@livewireScripts
</body>
</html>

View File

@ -1,219 +0,0 @@
<nav x-data="{ open: false }" class="bg-white border-b border-gray-100">
<!-- Primary Navigation Menu -->
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between h-16">
<div class="flex">
<!-- Logo -->
<div class="shrink-0 flex items-center">
<a href="{{ route('dashboard') }}">
<x-application-mark class="block h-9 w-auto" />
</a>
</div>
<!-- Navigation Links -->
<div class="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex">
<x-nav-link href="{{ route('dashboard') }}" :active="request()->routeIs('dashboard')">
{{ __('Dashboard') }}
</x-nav-link>
</div>
</div>
<div class="hidden sm:flex sm:items-center sm:ms-6">
<!-- Teams Dropdown -->
@if (Laravel\Jetstream\Jetstream::hasTeamFeatures())
<div class="ms-3 relative">
<x-dropdown align="right" width="60">
<x-slot name="trigger">
<span class="inline-flex rounded-md">
<button type="button" class="inline-flex items-center px-3 py-2 border border-transparent text-sm leading-4 font-medium rounded-md text-gray-500 bg-white hover:text-gray-700 focus:outline-none focus:bg-gray-50 active:bg-gray-50 transition ease-in-out duration-150">
{{ Auth::user()->currentTeam->name }}
<svg class="ms-2 -me-0.5 size-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M8.25 15L12 18.75 15.75 15m-7.5-6L12 5.25 15.75 9" />
</svg>
</button>
</span>
</x-slot>
<x-slot name="content">
<div class="w-60">
<!-- Team Management -->
<div class="block px-4 py-2 text-xs text-gray-400">
{{ __('Manage Team') }}
</div>
<!-- Team Settings -->
<x-dropdown-link href="{{ route('teams.show', Auth::user()->currentTeam->id) }}">
{{ __('Team Settings') }}
</x-dropdown-link>
@can('create', Laravel\Jetstream\Jetstream::newTeamModel())
<x-dropdown-link href="{{ route('teams.create') }}">
{{ __('Create New Team') }}
</x-dropdown-link>
@endcan
<!-- Team Switcher -->
@if (Auth::user()->allTeams()->count() > 1)
<div class="border-t border-gray-200"></div>
<div class="block px-4 py-2 text-xs text-gray-400">
{{ __('Switch Teams') }}
</div>
@foreach (Auth::user()->allTeams() as $team)
<x-switchable-team :team="$team" />
@endforeach
@endif
</div>
</x-slot>
</x-dropdown>
</div>
@endif
<!-- Settings Dropdown -->
<div class="ms-3 relative">
<x-dropdown align="right" width="48">
<x-slot name="trigger">
@if (Laravel\Jetstream\Jetstream::managesProfilePhotos())
<button class="flex text-sm border-2 border-transparent rounded-full focus:outline-none focus:border-gray-300 transition">
<img class="size-8 rounded-full object-cover" src="{{ Auth::user()->profile_photo_url }}" alt="{{ Auth::user()->name }}" />
</button>
@else
<span class="inline-flex rounded-md">
<button type="button" class="inline-flex items-center px-3 py-2 border border-transparent text-sm leading-4 font-medium rounded-md text-gray-500 bg-white hover:text-gray-700 focus:outline-none focus:bg-gray-50 active:bg-gray-50 transition ease-in-out duration-150">
{{ Auth::user()->name }}
<svg class="ms-2 -me-0.5 size-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5" />
</svg>
</button>
</span>
@endif
</x-slot>
<x-slot name="content">
<!-- Account Management -->
<div class="block px-4 py-2 text-xs text-gray-400">
{{ __('Manage Account') }}
</div>
<x-dropdown-link href="{{ route('profile.show') }}">
{{ __('Profile') }}
</x-dropdown-link>
@if (Laravel\Jetstream\Jetstream::hasApiFeatures())
<x-dropdown-link href="{{ route('api-tokens.index') }}">
{{ __('API Tokens') }}
</x-dropdown-link>
@endif
<div class="border-t border-gray-200"></div>
<!-- Authentication -->
<form method="POST" action="{{ route('logout') }}" x-data>
@csrf
<x-dropdown-link href="{{ route('logout') }}"
@click.prevent="$root.submit();">
{{ __('Log Out') }}
</x-dropdown-link>
</form>
</x-slot>
</x-dropdown>
</div>
</div>
<!-- Hamburger -->
<div class="-me-2 flex items-center sm:hidden">
<button @click="open = ! open" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 focus:text-gray-500 transition duration-150 ease-in-out">
<svg class="size-6" stroke="currentColor" fill="none" viewBox="0 0 24 24">
<path :class="{'hidden': open, 'inline-flex': ! open }" class="inline-flex" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
<path :class="{'hidden': ! open, 'inline-flex': open }" class="hidden" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
</div>
</div>
<!-- Responsive Navigation Menu -->
<div :class="{'block': open, 'hidden': ! open}" class="hidden sm:hidden">
<div class="pt-2 pb-3 space-y-1">
<x-responsive-nav-link href="{{ route('dashboard') }}" :active="request()->routeIs('dashboard')">
{{ __('Dashboard') }}
</x-responsive-nav-link>
</div>
<!-- Responsive Settings Options -->
<div class="pt-4 pb-1 border-t border-gray-200">
<div class="flex items-center px-4">
@if (Laravel\Jetstream\Jetstream::managesProfilePhotos())
<div class="shrink-0 me-3">
<img class="size-10 rounded-full object-cover" src="{{ Auth::user()->profile_photo_url }}" alt="{{ Auth::user()->name }}" />
</div>
@endif
<div>
<div class="font-medium text-base text-gray-800">{{ Auth::user()->name }}</div>
<div class="font-medium text-sm text-gray-500">{{ Auth::user()->email }}</div>
</div>
</div>
<div class="mt-3 space-y-1">
<!-- Account Management -->
<x-responsive-nav-link href="{{ route('profile.show') }}" :active="request()->routeIs('profile.show')">
{{ __('Profile') }}
</x-responsive-nav-link>
@if (Laravel\Jetstream\Jetstream::hasApiFeatures())
<x-responsive-nav-link href="{{ route('api-tokens.index') }}" :active="request()->routeIs('api-tokens.index')">
{{ __('API Tokens') }}
</x-responsive-nav-link>
@endif
<!-- Authentication -->
<form method="POST" action="{{ route('logout') }}" x-data>
@csrf
<x-responsive-nav-link href="{{ route('logout') }}"
@click.prevent="$root.submit();">
{{ __('Log Out') }}
</x-responsive-nav-link>
</form>
<!-- Team Management -->
@if (Laravel\Jetstream\Jetstream::hasTeamFeatures())
<div class="border-t border-gray-200"></div>
<div class="block px-4 py-2 text-xs text-gray-400">
{{ __('Manage Team') }}
</div>
<!-- Team Settings -->
<x-responsive-nav-link href="{{ route('teams.show', Auth::user()->currentTeam->id) }}" :active="request()->routeIs('teams.show')">
{{ __('Team Settings') }}
</x-responsive-nav-link>
@can('create', Laravel\Jetstream\Jetstream::newTeamModel())
<x-responsive-nav-link href="{{ route('teams.create') }}" :active="request()->routeIs('teams.create')">
{{ __('Create New Team') }}
</x-responsive-nav-link>
@endcan
<!-- Team Switcher -->
@if (Auth::user()->allTeams()->count() > 1)
<div class="border-t border-gray-200"></div>
<div class="block px-4 py-2 text-xs text-gray-400">
{{ __('Switch Teams') }}
</div>
@foreach (Auth::user()->allTeams() as $team)
<x-switchable-team :team="$team" component="responsive-nav-link" />
@endforeach
@endif
@endif
</div>
</div>
</div>
</nav>

View File

@ -1,13 +1,34 @@
<x-guest-layout> @php
<div class="pt-4 bg-gray-100"> $configData = Helper::appClasses();
<div class="min-h-screen flex flex-col items-center pt-6 sm:pt-0"> $customizerHidden = 'customizer-hide';
<div> @endphp
<x-authentication-card-logo />
</div>
<div class="w-full sm:max-w-2xl mt-6 p-6 bg-white shadow-md overflow-hidden sm:rounded-lg prose"> @extends('layouts/blankLayout')
{!! $policy !!}
@section('title', 'Privacy Policy')
@section('page-style')
{{-- Page Css files --}}
@vite('resources/assets/vendor/scss/pages/page-auth.scss')
@endsection
@section('content')
<div class="position-relative">
<div class="authentication-wrapper authentication-basic container-p-y p-4 p-sm-0">
<div class="authentication-inner py-6">
<div class="card p-md-7 p-1">
<!-- Logo -->
<div class="app-brand justify-content-center mt-5">
<a href="{{url('/')}}" class="app-brand-link gap-2">
<span class="app-brand-logo demo">@include('_partials.macros',["width"=>25,"withbg"=>'var(--bs-primary)'])</span>
<span class="app-brand-text demo text-heading fw-semibold">{{config('variables.templateName')}}</span>
</a>
</div>
<!-- /Logo -->
<div class="card-body mt-1">{!! $policy !!}</div>
</div>
<img alt="mask" src="{{asset('assets/img/illustrations/auth-basic-login-mask-'.$configData['style'].'.png') }}" class="authentication-image d-none d-lg-block" data-app-light-img="illustrations/auth-basic-login-mask-light.png" data-app-dark-img="illustrations/auth-basic-login-mask-dark.png" />
</div> </div>
</div> </div>
</div> </div>
</x-guest-layout> @endsection

View File

@ -8,11 +8,11 @@
</x-slot> </x-slot>
<x-slot name="content"> <x-slot name="content">
<div class="max-w-xl text-sm text-gray-600"> <div>
{{ __('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.') }} {{ __('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.') }}
</div> </div>
<div class="mt-5"> <div class="mt-3">
<x-danger-button wire:click="confirmUserDeletion" wire:loading.attr="disabled"> <x-danger-button wire:click="confirmUserDeletion" wire:loading.attr="disabled">
{{ __('Delete Account') }} {{ __('Delete Account') }}
</x-danger-button> </x-danger-button>
@ -27,15 +27,13 @@
<x-slot name="content"> <x-slot name="content">
{{ __('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.') }} {{ __('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.') }}
<div class="mt-4" x-data="{}" x-on:confirming-delete-user.window="setTimeout(() => $refs.password.focus(), 250)"> <div class="mt-2" x-data="{}"
<x-input type="password" class="mt-1 block w-3/4" x-on:confirming-delete-user.window="setTimeout(() => $refs.password.focus(), 250)">
autocomplete="current-password" <x-input type="password" class="{{ $errors->has('password') ? 'is-invalid' : '' }}"
placeholder="{{ __('Password') }}" placeholder="{{ __('Password') }}" x-ref="password" wire:model="password"
x-ref="password"
wire:model="password"
wire:keydown.enter="deleteUser" /> wire:keydown.enter="deleteUser" />
<x-input-error for="password" class="mt-2" /> <x-input-error for="password" />
</div> </div>
</x-slot> </x-slot>
@ -44,10 +42,11 @@
{{ __('Cancel') }} {{ __('Cancel') }}
</x-secondary-button> </x-secondary-button>
<x-danger-button class="ms-3" wire:click="deleteUser" wire:loading.attr="disabled"> <x-danger-button class="ms-1" wire:click="deleteUser" wire:loading.attr="disabled">
{{ __('Delete Account') }} {{ __('Delete Account') }}
</x-danger-button> </x-danger-button>
</x-slot> </x-slot>
</x-dialog-modal> </x-dialog-modal>
</x-slot> </x-slot>
</x-action-section> </x-action-section>

View File

@ -8,38 +8,50 @@
</x-slot> </x-slot>
<x-slot name="content"> <x-slot name="content">
<div class="max-w-xl text-sm text-gray-600"> <x-action-message on="loggedOut">
{{ __('Done.') }}
</x-action-message>
<p class="card-text">
{{ __('If necessary, you may log out of all of your other browser sessions across all of your devices. Some of your recent sessions are listed below; however, this list may not be exhaustive. If you feel your account has been compromised, you should also update your password.') }} {{ __('If necessary, you may log out of all of your other browser sessions across all of your devices. Some of your recent sessions are listed below; however, this list may not be exhaustive. If you feel your account has been compromised, you should also update your password.') }}
</div> </p>
@if (count($this->sessions) > 0) @if (count($this->sessions) > 0)
<div class="mt-5 space-y-6"> <div class="mt-5">
<!-- Other Browser Sessions --> <!-- Other Browser Sessions -->
@foreach ($this->sessions as $session) @foreach ($this->sessions as $session)
<div class="flex items-center"> <div class="d-flex">
<div> <div>
@if ($session->agent->isDesktop()) @if ($session->agent->isDesktop())
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-8 text-gray-500"> <svg fill="none" width="32" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
<path stroke-linecap="round" stroke-linejoin="round" d="M9 17.25v1.007a3 3 0 01-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0115 18.257V17.25m6-12V15a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 15V5.25m18 0A2.25 2.25 0 0018.75 3H5.25A2.25 2.25 0 003 5.25m18 0V12a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 12V5.25" /> viewBox="0 0 24 24" stroke="currentColor" class="text-muted">
<path
d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z">
</path>
</svg> </svg>
@else @else
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-8 text-gray-500"> <svg xmlns="http://www.w3.org/2000/svg" width="32" viewBox="0 0 24 24" stroke-width="2"
<path stroke-linecap="round" stroke-linejoin="round" d="M10.5 1.5H8.25A2.25 2.25 0 006 3.75v16.5a2.25 2.25 0 002.25 2.25h7.5A2.25 2.25 0 0018 20.25V3.75a2.25 2.25 0 00-2.25-2.25H13.5m-3 0V3h3V1.5m-3 0h3m-3 18.75h3" /> stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"
class="text-muted">
<path d="M0 0h24v24H0z" stroke="none"></path>
<rect x="7" y="4" width="10" height="16" rx="1"></rect>
<path d="M11 5h2M12 17v.01"></path>
</svg> </svg>
@endif @endif
</div> </div>
<div class="ms-3"> <div class="ms-2">
<div class="text-sm text-gray-600"> <div>
{{ $session->agent->platform() ? $session->agent->platform() : __('Unknown') }} - {{ $session->agent->browser() ? $session->agent->browser() : __('Unknown') }} {{ $session->agent->platform() ? $session->agent->platform() : 'Unknown' }} -
{{ $session->agent->browser() ? $session->agent->browser() : 'Unknown' }}
</div> </div>
<div> <div>
<div class="text-xs text-gray-500"> <div class="small text-muted">
{{ $session->ip_address }}, {{ $session->ip_address }},
@if ($session->is_current_device) @if ($session->is_current_device)
<span class="text-green-500 font-semibold">{{ __('This device') }}</span> <span class="text-success fw-medium">{{ __('This device') }}</span>
@else @else
{{ __('Last active') }} {{ $session->last_active }} {{ __('Last active') }} {{ $session->last_active }}
@endif @endif
@ -51,17 +63,13 @@
</div> </div>
@endif @endif
<div class="flex items-center mt-5"> <div class="d-flex mt-5">
<x-button wire:click="confirmLogout" wire:loading.attr="disabled"> <x-button wire:click="confirmLogout" wire:loading.attr="disabled">
{{ __('Log Out Other Browser Sessions') }} {{ __('Log Out Other Browser Sessions') }}
</x-button> </x-button>
<x-action-message class="ms-3" on="loggedOut">
{{ __('Done.') }}
</x-action-message>
</div> </div>
<!-- Log Out Other Devices Confirmation Modal --> <!-- Log out Other Devices Confirmation Modal -->
<x-dialog-modal wire:model.live="confirmingLogout"> <x-dialog-modal wire:model.live="confirmingLogout">
<x-slot name="title"> <x-slot name="title">
{{ __('Log Out Other Browser Sessions') }} {{ __('Log Out Other Browser Sessions') }}
@ -70,12 +78,10 @@
<x-slot name="content"> <x-slot name="content">
{{ __('Please enter your password to confirm you would like to log out of your other browser sessions across all of your devices.') }} {{ __('Please enter your password to confirm you would like to log out of your other browser sessions across all of your devices.') }}
<div class="mt-4" x-data="{}" x-on:confirming-logout-other-browser-sessions.window="setTimeout(() => $refs.password.focus(), 250)"> <div class="mt-3" x-data="{}"
<x-input type="password" class="mt-1 block w-3/4" x-on:confirming-logout-other-browser-sessions.window="setTimeout(() => $refs.password.focus(), 250)">
autocomplete="current-password" <x-input type="password" placeholder="{{ __('Password') }}" x-ref="password"
placeholder="{{ __('Password') }}" class="{{ $errors->has('password') ? 'is-invalid' : '' }}" wire:model="password"
x-ref="password"
wire:model="password"
wire:keydown.enter="logoutOtherBrowserSessions" /> wire:keydown.enter="logoutOtherBrowserSessions" />
<x-input-error for="password" class="mt-2" /> <x-input-error for="password" class="mt-2" />
@ -87,12 +93,12 @@
{{ __('Cancel') }} {{ __('Cancel') }}
</x-secondary-button> </x-secondary-button>
<x-button class="ms-3" <button class="btn btn-danger ms-1" wire:click="logoutOtherBrowserSessions"
wire:click="logoutOtherBrowserSessions"
wire:loading.attr="disabled"> wire:loading.attr="disabled">
{{ __('Log Out Other Browser Sessions') }} {{ __('Log out Other Browser Sessions') }}
</x-button> </button>
</x-slot> </x-slot>
</x-dialog-modal> </x-dialog-modal>
</x-slot> </x-slot>
</x-action-section> </x-action-section>

View File

@ -1,45 +1,38 @@
<x-app-layout> @extends('layouts.layoutMaster')
<x-slot name="header">
<h2 class="font-semibold text-xl text-gray-800 leading-tight"> @php
{{ __('Profile') }} $breadcrumbs = [['link' => 'home', 'name' => 'Home'], ['link' => 'javascript:void(0)', 'name' => 'User'], ['name' => 'Profile']];
</h2> @endphp
</x-slot>
@section('title', 'Profile')
@section('content')
<div>
<div class="max-w-7xl mx-auto py-10 sm:px-6 lg:px-8">
@if (Laravel\Fortify\Features::canUpdateProfileInformation()) @if (Laravel\Fortify\Features::canUpdateProfileInformation())
<div class="mb-6">
@livewire('profile.update-profile-information-form') @livewire('profile.update-profile-information-form')
</div>
<x-section-border />
@endif @endif
@if (Laravel\Fortify\Features::enabled(Laravel\Fortify\Features::updatePasswords())) @if (Laravel\Fortify\Features::enabled(Laravel\Fortify\Features::updatePasswords()))
<div class="mt-10 sm:mt-0"> <div class="mb-6">
@livewire('profile.update-password-form') @livewire('profile.update-password-form')
</div> </div>
<x-section-border />
@endif @endif
@if (Laravel\Fortify\Features::canManageTwoFactorAuthentication()) @if (Laravel\Fortify\Features::canManageTwoFactorAuthentication())
<div class="mt-10 sm:mt-0"> <div class="mb-6">
@livewire('profile.two-factor-authentication-form') @livewire('profile.two-factor-authentication-form')
</div> </div>
<x-section-border />
@endif @endif
<div class="mt-10 sm:mt-0"> <div class="mb-6">
@livewire('profile.logout-other-browser-sessions-form') @livewire('profile.logout-other-browser-sessions-form')
</div> </div>
@if (Laravel\Jetstream\Jetstream::hasAccountDeletionFeatures()) @if (Laravel\Jetstream\Jetstream::hasAccountDeletionFeatures())
<x-section-border />
<div class="mt-10 sm:mt-0">
@livewire('profile.delete-user-form') @livewire('profile.delete-user-form')
</div>
@endif @endif
</div>
</div> @endsection
</x-app-layout>

View File

@ -8,67 +8,59 @@
</x-slot> </x-slot>
<x-slot name="content"> <x-slot name="content">
<h3 class="text-lg font-medium text-gray-900"> <h6>
@if ($this->enabled) @if ($this->enabled)
@if ($showingConfirmation) @if ($showingConfirmation)
{{ __('Finish enabling two factor authentication.') }} {{ __('You are enabling two factor authentication.') }}
@else @else
{{ __('You have enabled two factor authentication.') }} {{ __('You have enabled two factor authentication.') }}
@endif @endif
@else @else
{{ __('You have not enabled two factor authentication.') }} {{ __('You have not enabled two factor authentication.') }}
@endif @endif
</h3> </h6>
<div class="mt-3 max-w-xl text-sm text-gray-600"> <p class="card-text">
<p>
{{ __('When two factor authentication is enabled, you will be prompted for a secure, random token during authentication. You may retrieve this token from your phone\'s Google Authenticator application.') }} {{ __('When two factor authentication is enabled, you will be prompted for a secure, random token during authentication. You may retrieve this token from your phone\'s Google Authenticator application.') }}
</p> </p>
</div>
@if ($this->enabled) @if ($this->enabled)
@if ($showingQrCode) @if ($showingQrCode)
<div class="mt-4 max-w-xl text-sm text-gray-600"> <p class="card-text mt-2">
<p class="font-semibold">
@if ($showingConfirmation) @if ($showingConfirmation)
{{ __('To finish enabling two factor authentication, scan the following QR code using your phone\'s authenticator application or enter the setup key and provide the generated OTP code.') }} {{ __('Scan the following QR code using your phone\'s authenticator application and confirm it with the generated OTP code.') }}
@else @else
{{ __('Two factor authentication is now enabled. Scan the following QR code using your phone\'s authenticator application or enter the setup key.') }} {{ __('Two factor authentication is now enabled. Scan the following QR code using your phone\'s authenticator application.') }}
@endif @endif
</p> </p>
</div>
<div class="mt-4 p-2 inline-block bg-white"> <div class="mt-2">
{!! $this->user->twoFactorQrCodeSvg() !!} {!! $this->user->twoFactorQrCodeSvg() !!}
</div> </div>
<div class="mt-4 max-w-xl text-sm text-gray-600"> <div class="mt-4">
<p class="font-semibold"> <p class="fw-medium">
{{ __('Setup Key') }}: {{ decrypt($this->user->two_factor_secret) }} {{ __('Setup Key') }}: {{ decrypt($this->user->two_factor_secret) }}
</p> </p>
</div> </div>
@if ($showingConfirmation) @if ($showingConfirmation)
<div class="mt-4"> <div class="mt-2">
<x-label for="code" value="{{ __('Code') }}" /> <x-label for="code" value="{{ __('Code') }}" />
<x-input id="code" class="d-block mt-3 w-100" type="text" inputmode="numeric" name="code" autofocus autocomplete="one-time-code"
<x-input id="code" type="text" name="code" class="block mt-1 w-1/2" inputmode="numeric" autofocus autocomplete="one-time-code"
wire:model="code" wire:model="code"
wire:keydown.enter="confirmTwoFactorAuthentication" /> wire:keydown.enter="confirmTwoFactorAuthentication" />
<x-input-error for="code" class="mt-3" />
<x-input-error for="code" class="mt-2" />
</div> </div>
@endif @endif
@endif @endif
@if ($showingRecoveryCodes) @if ($showingRecoveryCodes)
<div class="mt-4 max-w-xl text-sm text-gray-600"> <p class="card-text mt-2">
<p class="font-semibold">
{{ __('Store these recovery codes in a secure password manager. They can be used to recover access to your account if your two factor authentication device is lost.') }} {{ __('Store these recovery codes in a secure password manager. They can be used to recover access to your account if your two factor authentication device is lost.') }}
</p> </p>
</div>
<div class="grid gap-1 max-w-xl mt-4 px-4 py-4 font-mono text-sm bg-gray-100 rounded-lg"> <div class="bg-light rounded p-2">
@foreach (json_decode(decrypt($this->user->two_factor_recovery_codes), true) as $code) @foreach (json_decode(decrypt($this->user->two_factor_recovery_codes), true) as $code)
<div>{{ $code }}</div> <div>{{ $code }}</div>
@endforeach @endforeach
@ -76,7 +68,7 @@
@endif @endif
@endif @endif
<div class="mt-5"> <div class="mt-2">
@if (!$this->enabled) @if (!$this->enabled)
<x-confirms-password wire:then="enableTwoFactorAuthentication"> <x-confirms-password wire:then="enableTwoFactorAuthentication">
<x-button type="button" wire:loading.attr="disabled"> <x-button type="button" wire:loading.attr="disabled">
@ -86,39 +78,30 @@
@else @else
@if ($showingRecoveryCodes) @if ($showingRecoveryCodes)
<x-confirms-password wire:then="regenerateRecoveryCodes"> <x-confirms-password wire:then="regenerateRecoveryCodes">
<x-secondary-button class="me-3"> <x-secondary-button class="me-1">
{{ __('Regenerate Recovery Codes') }} {{ __('Regenerate Recovery Codes') }}
</x-secondary-button> </x-secondary-button>
</x-confirms-password> </x-confirms-password>
@elseif ($showingConfirmation) @elseif ($showingConfirmation)
<x-confirms-password wire:then="confirmTwoFactorAuthentication"> <x-confirms-password wire:then="confirmTwoFactorAuthentication">
<x-button type="button" class="me-3" wire:loading.attr="disabled"> <x-button type="button" wire:loading.attr="disabled">
{{ __('Confirm') }} {{ __('Confirm') }}
</x-button> </x-button>
</x-confirms-password> </x-confirms-password>
@else @else
<x-confirms-password wire:then="showRecoveryCodes"> <x-confirms-password wire:then="showRecoveryCodes">
<x-secondary-button class="me-3"> <x-secondary-button class="me-1">
{{ __('Show Recovery Codes') }} {{ __('Show Recovery Codes') }}
</x-secondary-button> </x-secondary-button>
</x-confirms-password> </x-confirms-password>
@endif @endif
@if ($showingConfirmation)
<x-confirms-password wire:then="disableTwoFactorAuthentication">
<x-secondary-button wire:loading.attr="disabled">
{{ __('Cancel') }}
</x-secondary-button>
</x-confirms-password>
@else
<x-confirms-password wire:then="disableTwoFactorAuthentication"> <x-confirms-password wire:then="disableTwoFactorAuthentication">
<x-danger-button wire:loading.attr="disabled"> <x-danger-button wire:loading.attr="disabled">
{{ __('Disable') }} {{ __('Disable') }}
</x-danger-button> </x-danger-button>
</x-confirms-password> </x-confirms-password>
@endif @endif
@endif
</div> </div>
</x-slot> </x-slot>
</x-action-section> </x-action-section>

View File

@ -8,30 +8,32 @@
</x-slot> </x-slot>
<x-slot name="form"> <x-slot name="form">
<div class="col-span-6 sm:col-span-4"> <div class="mb-5">
<x-label for="current_password" value="{{ __('Current Password') }}" /> <x-label class="form-label" for="current_password" value="{{ __('Current Password') }}" />
<x-input id="current_password" type="password" class="mt-1 block w-full" wire:model="state.current_password" autocomplete="current-password" /> <x-input id="current_password" type="password"
<x-input-error for="current_password" class="mt-2" /> class="{{ $errors->has('current_password') ? 'is-invalid' : '' }}" wire:model="state.current_password"
autocomplete="current-password" />
<x-input-error for="current_password" />
</div> </div>
<div class="col-span-6 sm:col-span-4"> <div class="mb-5">
<x-label for="password" value="{{ __('New Password') }}" /> <x-label class="form-label" for="password" value="{{ __('New Password') }}" />
<x-input id="password" type="password" class="mt-1 block w-full" wire:model="state.password" autocomplete="new-password" /> <x-input id="password" type="password" class="{{ $errors->has('password') ? 'is-invalid' : '' }}"
<x-input-error for="password" class="mt-2" /> wire:model="state.password" autocomplete="new-password" />
<x-input-error for="password" />
</div> </div>
<div class="col-span-6 sm:col-span-4"> <div class="mb-5">
<x-label for="password_confirmation" value="{{ __('Confirm Password') }}" /> <x-label class="form-label" for="password_confirmation" value="{{ __('Confirm Password') }}" />
<x-input id="password_confirmation" type="password" class="mt-1 block w-full" wire:model="state.password_confirmation" autocomplete="new-password" /> <x-input id="password_confirmation" type="password"
<x-input-error for="password_confirmation" class="mt-2" /> class="{{ $errors->has('password_confirmation') ? 'is-invalid' : '' }}"
wire:model="state.password_confirmation" autocomplete="new-password" />
<x-input-error for="password_confirmation" />
</div> </div>
</x-slot> </x-slot>
<x-slot name="actions">
<x-action-message class="me-3" on="saved">
{{ __('Saved.') }}
</x-action-message>
<x-slot name="actions">
<x-button> <x-button>
{{ __('Save') }} {{ __('Save') }}
</x-button> </x-button>

View File

@ -8,34 +8,26 @@
</x-slot> </x-slot>
<x-slot name="form"> <x-slot name="form">
<x-action-message on="saved">
{{ __('Saved.') }}
</x-action-message>
<!-- Profile Photo --> <!-- Profile Photo -->
@if (Laravel\Jetstream\Jetstream::managesProfilePhotos()) @if (Laravel\Jetstream\Jetstream::managesProfilePhotos())
<div x-data="{photoName: null, photoPreview: null}" class="col-span-6 sm:col-span-4"> <div class="mb-6" x-data="{photoName: null, photoPreview: null}">
<!-- Profile Photo File Input --> <!-- Profile Photo File Input -->
<input type="file" id="photo" class="hidden" <input type="file" hidden wire:model.live="photo" x-ref="photo"
wire:model.live="photo" x-on:change=" photoName = $refs.photo.files[0].name; const reader = new FileReader(); reader.onload = (e) => { photoPreview = e.target.result;}; reader.readAsDataURL($refs.photo.files[0]);" />
x-ref="photo"
x-on:change="
photoName = $refs.photo.files[0].name;
const reader = new FileReader();
reader.onload = (e) => {
photoPreview = e.target.result;
};
reader.readAsDataURL($refs.photo.files[0]);
" />
<x-label for="photo" value="{{ __('Photo') }}" />
<!-- Current Profile Photo --> <!-- Current Profile Photo -->
<div class="mt-2" x-show="! photoPreview"> <div class="mt-2" x-show="! photoPreview">
<img src="{{ $this->user->profile_photo_url }}" alt="{{ $this->user->name }}" class="rounded-full size-20 object-cover"> <img src="{{ $this->user->profile_photo_url }}" class="rounded-circle" height="80px" width="80px">
</div> </div>
<!-- New Profile Photo Preview --> <!-- New Profile Photo Preview -->
<div class="mt-2" x-show="photoPreview" style="display: none;"> <div class="mt-2" x-show="photoPreview">
<span class="block rounded-full size-20 bg-cover bg-no-repeat bg-center" <img x-bind:src="photoPreview" class="rounded-circle" width="80px" height="80px">
x-bind:style="'background-image: url(\'' + photoPreview + '\');'">
</span>
</div> </div>
<x-secondary-button class="mt-2 me-2" type="button" x-on:click.prevent="$refs.photo.click()"> <x-secondary-button class="mt-2 me-2" type="button" x-on:click.prevent="$refs.photo.click()">
@ -43,9 +35,9 @@
</x-secondary-button> </x-secondary-button>
@if ($this->user->profile_photo_path) @if ($this->user->profile_photo_path)
<x-secondary-button type="button" class="mt-2" wire:click="deleteProfilePhoto"> <button type="button" class="btn btn-danger mt-2" wire:click="deleteProfilePhoto">
{{ __('Remove Photo') }} {{ __('Remove Photo') }}
</x-secondary-button> </button>
@endif @endif
<x-input-error for="photo" class="mt-2" /> <x-input-error for="photo" class="mt-2" />
@ -53,43 +45,27 @@
@endif @endif
<!-- Name --> <!-- Name -->
<div class="col-span-6 sm:col-span-4"> <div class="mb-5">
<x-label for="name" value="{{ __('Name') }}" /> <x-label class="form-label" for="name" value="{{ __('Name') }}" />
<x-input id="name" type="text" class="mt-1 block w-full" wire:model="state.name" required autocomplete="name" /> <x-input id="name" type="text" class="{{ $errors->has('name') ? 'is-invalid' : '' }}"
<x-input-error for="name" class="mt-2" /> wire:model="state.name" autocomplete="name" />
<x-input-error for="name" />
</div> </div>
<!-- Email --> <!-- Email -->
<div class="col-span-6 sm:col-span-4"> <div class="mb-5">
<x-label for="email" value="{{ __('Email') }}" /> <x-label class="form-label" for="email" value="{{ __('Email') }}" />
<x-input id="email" type="email" class="mt-1 block w-full" wire:model="state.email" required autocomplete="username" /> <x-input id="email" type="email" class="{{ $errors->has('email') ? 'is-invalid' : '' }}"
<x-input-error for="email" class="mt-2" /> wire:model="state.email" />
<x-input-error for="email" />
@if (Laravel\Fortify\Features::enabled(Laravel\Fortify\Features::emailVerification()) && ! $this->user->hasVerifiedEmail())
<p class="text-sm mt-2">
{{ __('Your email address is unverified.') }}
<button type="button" class="underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" wire:click.prevent="sendEmailVerification">
{{ __('Click here to re-send the verification email.') }}
</button>
</p>
@if ($this->verificationLinkSent)
<p class="mt-2 font-medium text-sm text-green-600">
{{ __('A new verification link has been sent to your email address.') }}
</p>
@endif
@endif
</div> </div>
</x-slot> </x-slot>
<x-slot name="actions"> <x-slot name="actions">
<x-action-message class="me-3" on="saved"> <div class="d-flex align-items-baseline">
{{ __('Saved.') }} <x-button>
</x-action-message>
<x-button wire:loading.attr="disabled" wire:target="photo">
{{ __('Save') }} {{ __('Save') }}
</x-button> </x-button>
</div>
</x-slot> </x-slot>
</x-form-section> </x-form-section>

View File

@ -1,13 +1,34 @@
<x-guest-layout> @php
<div class="pt-4 bg-gray-100"> $configData = Helper::appClasses();
<div class="min-h-screen flex flex-col items-center pt-6 sm:pt-0"> $customizerHidden = 'customizer-hide';
<div> @endphp
<x-authentication-card-logo />
</div>
<div class="w-full sm:max-w-2xl mt-6 p-6 bg-white shadow-md overflow-hidden sm:rounded-lg prose"> @extends('layouts/blankLayout')
{!! $terms !!}
@section('title', 'Terms Of Service')
@section('page-style')
{{-- Page Css files --}}
@vite('resources/assets/vendor/scss/pages/page-auth.scss')
@endsection
@section('content')
<div class="position-relative">
<div class="authentication-wrapper authentication-basic container-p-y p-4 p-sm-0">
<div class="authentication-inner py-6">
<!-- Logo -->
<div class="card p-md-7 p-1">
<div class="app-brand justify-content-center mt-5">
<a href="{{url('/')}}" class="app-brand-link gap-2">
<span class="app-brand-logo demo">@include('_partials.macros',["width"=>25,"withbg"=>'var(--bs-primary)'])</span>
<span class="app-brand-text demo text-heading fw-semibold">{{config('variables.templateName')}}</span>
</a>
</div>
<!-- /Logo -->
<div class="card-body mt-1">{!! $terms !!}</div>
</div>
<img alt="mask" src="{{asset('assets/img/illustrations/auth-basic-forgot-password-mask-'.$configData['style'].'.png') }}" class="authentication-image d-none d-lg-block" data-app-light-img="illustrations/auth-basic-forgot-password-mask-light.png" data-app-dark-img="illustrations/auth-basic-forgot-password-mask-dark.png" />
</div> </div>
</div> </div>
</div> </div>
</x-guest-layout> @endsection

File diff suppressed because one or more lines are too long

View File

@ -1,23 +0,0 @@
import defaultTheme from 'tailwindcss/defaultTheme';
import forms from '@tailwindcss/forms';
import typography from '@tailwindcss/typography';
/** @type {import('tailwindcss').Config} */
export default {
content: [
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
'./vendor/laravel/jetstream/**/*.blade.php',
'./storage/framework/views/*.php',
'./resources/views/**/*.blade.php',
],
theme: {
extend: {
fontFamily: {
sans: ['Figtree', ...defaultTheme.fontFamily.sans],
},
},
},
plugins: [forms, typography],
};

View File

@ -1,11 +1,75 @@
import { defineConfig } from 'vite'; import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin'; import laravel from 'laravel-vite-plugin';
import html from '@rollup/plugin-html';
import { glob } from 'glob';
/**
* Get Files from a directory
* @param {string} query
* @returns array
*/
function GetFilesArray(query) {
return glob.sync(query);
}
/**
* Js Files
*/
// Page JS Files
const pageJsFiles = GetFilesArray('resources/assets/js/*.js');
// Processing Vendor JS Files
const vendorJsFiles = GetFilesArray('resources/assets/vendor/js/*.js');
// Processing Libs JS Files
const LibsJsFiles = GetFilesArray('resources/assets/vendor/libs/**/*.js');
/**
* Scss Files
*/
// Processing Core, Themes & Pages Scss Files
const CoreScssFiles = GetFilesArray('resources/assets/vendor/scss/**/!(_)*.scss');
// Processing Libs Scss & Css Files
const LibsScssFiles = GetFilesArray('resources/assets/vendor/libs/**/!(_)*.scss');
const LibsCssFiles = GetFilesArray('resources/assets/vendor/libs/**/*.css');
// Processing Fonts Scss Files
const FontsScssFiles = GetFilesArray('resources/assets/vendor/fonts/**/!(_)*.scss');
// Processing Window Assignment for Libs like jKanban, pdfMake
function libsWindowAssignment() {
return {
name: 'libsWindowAssignment',
transform(src, id) {
if (id.includes('jkanban.js')) {
return src.replace('this.jKanban', 'window.jKanban');
} else if (id.includes('vfs_fonts')) {
return src.replaceAll('this.pdfMake', 'window.pdfMake');
}
}
};
}
export default defineConfig({ export default defineConfig({
plugins: [ plugins: [
laravel({ laravel({
input: ['resources/css/app.css', 'resources/js/app.js'], input: [
refresh: true, 'resources/css/app.css',
}), 'resources/assets/css/demo.css',
'resources/js/app.js',
...pageJsFiles,
...vendorJsFiles,
...LibsJsFiles,
'resources/js/laravel-user-management.js', // Processing Laravel User Management CRUD JS File
...CoreScssFiles,
...LibsScssFiles,
...LibsCssFiles,
...FontsScssFiles
], ],
refresh: true
}),
html(),
libsWindowAssignment()
]
}); });