diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 452e6b6..4794ff5 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use Illuminate\Support\Facades\Vite; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -19,6 +20,15 @@ public function register(): void */ public function boot(): void { - // + Vite::useStyleTagAttributes(function (?string $src, string $url, ?array $chunk, ?array $manifest) { + if ($src !== null) { + return [ + 'class' => preg_match("/(resources\/assets\/vendor\/scss\/(rtl\/)?core)-?.*/i", $src) ? 'template-customizer-core-css' : + (preg_match("/(resources\/assets\/vendor\/scss\/(rtl\/)?theme)-?.*/i", $src) ? 'template-customizer-theme-css' : ''), + ]; + } + + return []; + }); } } diff --git a/app/Services/ThemeHelper.php b/app/Services/ThemeHelper.php new file mode 100644 index 0000000..f03cf1c --- /dev/null +++ b/app/Services/ThemeHelper.php @@ -0,0 +1,227 @@ + '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): void + { + $demo = 'custom'; + if (isset($pageConfigs)) { + if (count($pageConfigs) > 0) { + foreach ($pageConfigs as $config => $val) { + Config::set('custom.'.$demo.'.'.$config, $val); + } + } + } + } +} diff --git a/resources/views/auth/confirm-password.blade.php b/resources/views/auth/confirm-password.blade.php index 67b21d8..5d2399c 100644 --- a/resources/views/auth/confirm-password.blade.php +++ b/resources/views/auth/confirm-password.blade.php @@ -1,7 +1,7 @@ @php - use App\Helpers\Helper; + use App\Services\ThemeHelper; use Illuminate\Support\Facades\Route; - $configData = Helper::appClasses(); + $configData = ThemeHelper::appClasses(); $customizerHidden = 'customizer-hide'; @endphp @@ -10,58 +10,65 @@ @section('title', 'Confirm Password') @section('page-style') -{{-- Page Css files --}} -@vite('resources/assets/vendor/scss/pages/page-auth.scss') + {{-- Page Css files --}} + @vite('resources/assets/vendor/scss/pages/page-auth.scss') @endsection @section('content') -
- - - - {{config('variables.templateName')}} - - -
+
+ + + + {{config('variables.templateName')}} + + +
- -
- auth-illustration - mask -
- + +
+ auth-illustration + mask +
+ - -
-
-

Confirm Password? 🔒

-

Please confirm your password before continuing.

-
- @csrf -
-
-
-
- - -
- -
- @error('password') - + +
+
+

Confirm Password? 🔒

+

Please confirm your password before continuing.

+ + @csrf +
+
+
+
+ + +
+ +
+ @error('password') + {{ $message }} - @enderror + @enderror +
+
+ + +
-
- - -
+ +
- -
-
@endsection diff --git a/resources/views/auth/forgot-password.blade.php b/resources/views/auth/forgot-password.blade.php index 53c85fd..575f8f6 100644 --- a/resources/views/auth/forgot-password.blade.php +++ b/resources/views/auth/forgot-password.blade.php @@ -1,7 +1,7 @@ @php - use App\Helpers\Helper; + use App\Services\ThemeHelper; use Illuminate\Support\Facades\Route; - $configData = Helper::appClasses(); + $configData = ThemeHelper::appClasses(); $customizerHidden = 'customizer-hide'; @endphp @@ -10,62 +10,69 @@ @section('title', 'Forgot Password') @section('page-style') -{{-- Page Css files --}} -@vite('resources/assets/vendor/scss/pages/page-auth.scss') + {{-- Page Css files --}} + @vite('resources/assets/vendor/scss/pages/page-auth.scss') @endsection @section('content') -
- - - - {{config('variables.templateName')}} - - -
+
+ + + + {{config('variables.templateName')}} + + +
- -
- auth-illustration - mask -
- + +
+ auth-illustration + mask +
+ - -
-
-

Forgot Password? 🔒

-

Enter your email and we'll send you instructions to reset your password

+ +
+
+

Forgot Password? 🔒

+

Enter your email and we'll send you instructions to reset your password

- @if (session('status')) -
- {{ session('status') }} -
- @endif -
- @csrf -
- - - @error('email') - + @if (session('status')) +
+ {{ session('status') }} +
+ @endif + + @csrf +
+ + + @error('email') + {{ $message }} - @enderror -
- - -
- @if (Route::has('login')) - - - Back to login - - @endif + @enderror +
+ + +
+ @if (Route::has('login')) + + + Back to login + + @endif +
+
+
+
-
- -
-
@endsection diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index 6726853..3d91ef9 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -1,7 +1,7 @@ @php - use App\Helpers\Helper; + use App\Services\ThemeHelper; use Illuminate\Support\Facades\Route; - $configData = Helper::appClasses(); + $configData = ThemeHelper::appClasses(); $customizerHidden = 'customizer-hide'; @endphp @@ -10,120 +10,131 @@ @section('title', 'Login') @section('page-style') -{{-- Page Css files --}} -@vite('resources/assets/vendor/scss/pages/page-auth.scss') + {{-- Page Css files --}} + @vite('resources/assets/vendor/scss/pages/page-auth.scss') @endsection @section('content') -
- - - - {{config('variables.templateName')}} - - -
- -
- auth-illustration - mask -
- - - -
-
-

Welcome to {{config('variables.templateName')}}! 👋

-

Please sign-in to your account and start the adventure

- - @if (session('status')) - @endsection diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php index 8315f47..efe99ad 100644 --- a/resources/views/auth/register.blade.php +++ b/resources/views/auth/register.blade.php @@ -1,7 +1,7 @@ @php - use App\Helpers\Helper; + use App\Services\ThemeHelper; use Illuminate\Support\Facades\Route; - $configData = Helper::appClasses(); + $configData = ThemeHelper::appClasses(); $customizerHidden = 'customizer-hide'; @endphp @@ -10,129 +10,144 @@ @section('title', 'Register Pages') @section('page-style') -{{-- Page Css files --}} -@vite('resources/assets/vendor/scss/pages/page-auth.scss') + {{-- Page Css files --}} + @vite('resources/assets/vendor/scss/pages/page-auth.scss') @endsection @section('content') -
- - - - {{config('variables.templateName')}} - - -
+
+ + + + {{config('variables.templateName')}} + + +
- -
- auth-illustration - mask -
- + +
+ auth-illustration + mask +
+ - -
-
-

Adventure starts here 🚀

-

Make your app management easy and fun!

+ +
+
+

Adventure starts here 🚀

+

Make your app management easy and fun!

-
- @csrf -
- - - @error('name') - + + @csrf +
+ + + @error('name') + {{ $message }} - @enderror -
-
- - - @error('email') - + @enderror +
+
+ + + @error('email') + {{ $message }} - @enderror -
-
-
-
- - -
- -
- @error('password') - + @enderror +
+
+
+
+ + +
+ +
+ @error('password') + {{ $message }} - @enderror -
-
-
-
- - -
- -
-
- @if (Laravel\Jetstream\Jetstream::hasTermsAndPrivacyPolicyFeature()) -
-
- - -
- @error('terms') - - @enderror -
- @endif - - + @enderror +
+
+
+
+ + +
+ +
+
+ @if (Laravel\Jetstream\Jetstream::hasTermsAndPrivacyPolicyFeature()) +
+
+ + +
+ @error('terms') + + @enderror +
+ @endif + + -

- Already have an account? - @if (Route::has('login')) - - Sign in instead - - @endif -

+

+ Already have an account? + @if (Route::has('login')) + + Sign in instead + + @endif +

-
-
or
+
+
or
+
+ + +
+
+
- - -
- -
-
@endsection diff --git a/resources/views/auth/reset-password.blade.php b/resources/views/auth/reset-password.blade.php index 85a2431..9a29c13 100644 --- a/resources/views/auth/reset-password.blade.php +++ b/resources/views/auth/reset-password.blade.php @@ -1,7 +1,7 @@ @php - use App\Helpers\Helper; + use App\Services\ThemeHelper; use Illuminate\Support\Facades\Route; - $configData = Helper::appClasses(); + $configData = ThemeHelper::appClasses(); $customizerHidden = 'customizer-hide'; @endphp @@ -10,85 +10,102 @@ @section('title', 'Reset Password') @section('page-style') -{{-- Page Css files --}} -@vite('resources/assets/vendor/scss/pages/page-auth.scss') + {{-- Page Css files --}} + @vite('resources/assets/vendor/scss/pages/page-auth.scss') @endsection @section('content') -
-
- - - - {{config('variables.templateName')}} - - -
+
+
+ + + + {{config('variables.templateName')}} + + +
- -
- auth-illustration - mask -
- + +
+ auth-illustration + mask +
+ - -
-
-

Reset Password 🔒

-

Your new password must be different from previously used passwords

-
- @csrf - + +
+
+

Reset Password 🔒

+

Your new password must be different from previously used passwords

+ + @csrf + -
- - - @error('email') - +
+ + + @error('email') + {{ $message }} - @enderror -
-
-
-
- - -
- -
- @error('password') - + @enderror +
+
+
+
+ + +
+ +
+ @error('password') + {{ $message }} - @enderror -
-
-
-
- - + @enderror +
+
+
+
+ + +
+ +
+
+ +
+ @if (Route::has('login')) + + + Back to login + + @endif +
+ +
- -
+
- -
- @if (Route::has('login')) - - - Back to login - - @endif -
-
-
-
-
-
@endsection diff --git a/resources/views/auth/two-factor-challenge.blade.php b/resources/views/auth/two-factor-challenge.blade.php index 4aa8ed6..9d1df75 100644 --- a/resources/views/auth/two-factor-challenge.blade.php +++ b/resources/views/auth/two-factor-challenge.blade.php @@ -1,7 +1,7 @@ @php - use App\Helpers\Helper; + use App\Services\ThemeHelper; use Illuminate\Support\Facades\Route; - $configData = Helper::appClasses(); + $configData = ThemeHelper::appClasses(); $customizerHidden = 'customizer-hide'; @endphp @@ -10,69 +10,82 @@ @section('title', 'Two Steps Verifications') @section('page-style') -{{-- Page Css files --}} -@vite('resources/assets/vendor/scss/pages/page-auth.scss') + {{-- Page Css files --}} + @vite('resources/assets/vendor/scss/pages/page-auth.scss') @endsection @section('content') -
- - - - {{config('variables.templateName')}} - - -
+
+ + + + {{config('variables.templateName')}} + + +
- -
- auth-illustration - mask -
- - - -
-
- -

Two Step Verification 💬

-
-
- Please confirm access to your account by entering the authentication code provided by your authenticator application. -
- -
- Please confirm access to your account by entering one of your emergency recovery codes. -
- - - -
- @csrf -
- - - + +
+ auth-illustration + mask
-
- - - + + + +
+
+ +

Two Step Verification 💬

+
+
+ Please confirm access to your account by entering the authentication code provided by your + authenticator application. +
+ +
+ Please confirm access to your account by entering one of your emergency recovery codes. +
+ + + + + @csrf +
+ + + +
+
+ + + +
+
+
+ +
+
+ +
+ Log in +
+ +
+
-
-
- -
-
- -
- Log in -
- +
-
- -
-
@endsection diff --git a/resources/views/auth/verify-email.blade.php b/resources/views/auth/verify-email.blade.php index 091699e..b6f9550 100644 --- a/resources/views/auth/verify-email.blade.php +++ b/resources/views/auth/verify-email.blade.php @@ -1,8 +1,8 @@ @php - use App\Helpers\Helper; + use App\Services\ThemeHelper; use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Auth; - $configData = Helper::appClasses(); + $configData = ThemeHelper::appClasses(); $customizerHidden = 'customizer-hide'; @endphp @@ -11,56 +11,68 @@ @section('title', 'Verify Email') @section('page-style') -{{-- Page Css files --}} -@vite('resources/assets/vendor/scss/pages/page-auth.scss') + {{-- Page Css files --}} + @vite('resources/assets/vendor/scss/pages/page-auth.scss') @endsection @section('content') -
- - - - {{config('variables.templateName')}} - - -
+
+ + + + {{config('variables.templateName')}} + + +
- -
- auth-illustration - mask -
- + +
+ auth-illustration + mask +
+ - -
-
-

Verify your email ✉️

+ +
+
+

Verify your email ✉️

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

- Account activation link sent to your email address: {{Auth::user()->email}} Please follow the link inside to continue. -

-
-
- @csrf - -
- -
- @csrf - -
-
-
- -
-
@endsection