├── .editorconfig ├── .env ├── .env.example ├── .gitattributes ├── .github └── workflows │ ├── lint.yml │ └── tests.yml ├── .gitignore ├── LICENSE ├── app ├── Http │ └── Controllers │ │ ├── Auth │ │ └── VerifyEmailController.php │ │ └── Controller.php ├── Livewire │ └── Actions │ │ └── Logout.php ├── Models │ └── User.php └── Providers │ ├── AppServiceProvider.php │ └── VoltServiceProvider.php ├── artisan ├── bootstrap ├── app.php ├── cache │ └── .gitignore └── providers.php ├── composer.json ├── composer.lock ├── config ├── app.php ├── auth.php ├── cache.php ├── database.php ├── filesystems.php ├── logging.php ├── mail.php ├── queue.php ├── services.php ├── session.php └── variables.php ├── database ├── .gitignore ├── factories │ └── UserFactory.php ├── migrations │ ├── 0001_01_01_000000_create_users_table.php │ ├── 0001_01_01_000001_create_cache_table.php │ └── 0001_01_01_000002_create_jobs_table.php └── seeders │ └── DatabaseSeeder.php ├── documentation.html ├── hire-us.html ├── package-lock.json ├── package.json ├── phpunit.xml ├── public ├── .htaccess ├── assets │ └── img │ │ ├── avatars │ │ └── 1.png │ │ ├── favicon │ │ └── favicon.ico │ │ └── illustrations │ │ ├── boy-with-rocket-light.png │ │ └── laravel-livewire-sneat.png ├── favicon.ico ├── index.php └── robots.txt ├── resources ├── assets │ ├── css │ │ └── demo.css │ └── vendor │ │ ├── fonts │ │ ├── boxicons.scss │ │ ├── boxicons │ │ │ ├── boxicons.eot │ │ │ ├── boxicons.svg │ │ │ ├── boxicons.ttf │ │ │ ├── boxicons.woff │ │ │ └── boxicons.woff2 │ │ └── iconify │ │ │ └── iconify.js │ │ ├── js │ │ └── bootstrap.js │ │ ├── libs │ │ ├── jquery │ │ │ └── jquery.js │ │ └── popper │ │ │ └── popper.js │ │ └── scss │ │ ├── _bootstrap-extended.scss │ │ ├── _bootstrap-extended │ │ ├── _accordion.scss │ │ ├── _alert.scss │ │ ├── _badge.scss │ │ ├── _breadcrumb.scss │ │ ├── _button-group.scss │ │ ├── _buttons.scss │ │ ├── _card.scss │ │ ├── _carousel.scss │ │ ├── _dropdown.scss │ │ ├── _forms.scss │ │ ├── _functions.scss │ │ ├── _helpers.scss │ │ ├── _include.scss │ │ ├── _list-group.scss │ │ ├── _mixins.scss │ │ ├── _modal.scss │ │ ├── _nav.scss │ │ ├── _navbar.scss │ │ ├── _offcanvas.scss │ │ ├── _pagination.scss │ │ ├── _popover.scss │ │ ├── _progress.scss │ │ ├── _reboot.scss │ │ ├── _root.scss │ │ ├── _spinners.scss │ │ ├── _tables.scss │ │ ├── _toasts.scss │ │ ├── _tooltip.scss │ │ ├── _type.scss │ │ ├── _utilities.scss │ │ ├── _variables.scss │ │ ├── forms │ │ │ ├── _floating-labels.scss │ │ │ ├── _form-check.scss │ │ │ ├── _form-control.scss │ │ │ ├── _form-range.scss │ │ │ ├── _form-select.scss │ │ │ ├── _input-group.scss │ │ │ └── _labels.scss │ │ ├── helpers │ │ │ └── _color-bg.scss │ │ └── mixins │ │ │ ├── _border-radius.scss │ │ │ ├── _caret.scss │ │ │ └── _misc.scss │ │ ├── _bootstrap.scss │ │ ├── _colors.scss │ │ ├── _components.scss │ │ ├── _components │ │ ├── _app-brand.scss │ │ ├── _avatar.scss │ │ ├── _base.scss │ │ ├── _common.scss │ │ ├── _footer.scss │ │ ├── _include.scss │ │ ├── _layout.scss │ │ ├── _menu.scss │ │ ├── _root.scss │ │ ├── _text-divider.scss │ │ └── _variables.scss │ │ ├── _custom-styles.scss │ │ ├── _custom-variables │ │ ├── _bootstrap-extended.scss │ │ └── _components.scss │ │ ├── core.scss │ │ └── pages │ │ └── page-auth.scss ├── css │ └── app.css ├── js │ ├── app.js │ └── bootstrap.js └── views │ ├── components │ ├── action-message.blade.php │ ├── app-logo-icon.blade.php │ ├── app-logo.blade.php │ ├── auth-header.blade.php │ ├── auth-session-status.blade.php │ ├── layouts │ │ ├── app.blade.php │ │ ├── auth.blade.php │ │ ├── auth │ │ │ ├── card.blade.php │ │ │ └── split.blade.php │ │ ├── footer │ │ │ └── default.blade.php │ │ ├── menu │ │ │ └── vertical.blade.php │ │ └── navbar │ │ │ └── default.blade.php │ ├── placeholder-pattern.blade.php │ └── settings │ │ └── layout.blade.php │ ├── dashboard.blade.php │ ├── livewire │ ├── auth │ │ ├── confirm-password.blade.php │ │ ├── forgot-password.blade.php │ │ ├── login.blade.php │ │ ├── register.blade.php │ │ ├── reset-password.blade.php │ │ └── verify-email.blade.php │ └── settings │ │ ├── delete-user-form.blade.php │ │ ├── password.blade.php │ │ └── profile.blade.php │ ├── partials │ ├── head.blade.php │ ├── scripts.blade.php │ ├── settings-heading.blade.php │ └── styles.blade.php │ └── welcome.blade.php ├── routes ├── auth.php ├── console.php └── web.php ├── storage ├── app │ ├── .gitignore │ ├── private │ │ └── .gitignore │ └── public │ │ └── .gitignore ├── framework │ ├── .gitignore │ ├── cache │ │ ├── .gitignore │ │ └── data │ │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ ├── testing │ │ └── .gitignore │ └── views │ │ └── .gitignore └── logs │ └── .gitignore ├── tests ├── Feature │ ├── Auth │ │ ├── AuthenticationTest.php │ │ ├── EmailVerificationTest.php │ │ ├── PasswordConfirmationTest.php │ │ ├── PasswordResetTest.php │ │ └── RegistrationTest.php │ ├── DashboardTest.php │ ├── ExampleTest.php │ └── Settings │ │ ├── PasswordUpdateTest.php │ │ └── ProfileUpdateTest.php ├── Pest.php ├── TestCase.php └── Unit │ └── ExampleTest.php └── vite.config.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 2 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | 17 | [docker-compose.yml] 18 | indent_size = 4 19 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | APP_NAME=Laravel 2 | APP_ENV=local 3 | APP_KEY=base64:LaYkWg+iRjh3F1uxA2NA5oE5MlO9fNnaSC6s2MLQDVI= 4 | APP_DEBUG=true 5 | APP_URL=http://localhost 6 | 7 | APP_LOCALE=en 8 | APP_FALLBACK_LOCALE=en 9 | APP_FAKER_LOCALE=en_US 10 | 11 | APP_MAINTENANCE_DRIVER=file 12 | # APP_MAINTENANCE_STORE=database 13 | 14 | PHP_CLI_SERVER_WORKERS=4 15 | 16 | BCRYPT_ROUNDS=12 17 | 18 | LOG_CHANNEL=stack 19 | LOG_STACK=single 20 | LOG_DEPRECATIONS_CHANNEL=null 21 | LOG_LEVEL=debug 22 | 23 | DB_CONNECTION=mysql 24 | DB_HOST=127.0.0.1 25 | DB_PORT=3306 26 | DB_DATABASE=laravel 27 | DB_USERNAME=root 28 | DB_PASSWORD= 29 | 30 | SESSION_DRIVER=database 31 | SESSION_LIFETIME=120 32 | SESSION_ENCRYPT=false 33 | SESSION_PATH=/ 34 | SESSION_DOMAIN=null 35 | 36 | BROADCAST_CONNECTION=log 37 | FILESYSTEM_DISK=local 38 | QUEUE_CONNECTION=database 39 | 40 | CACHE_STORE=database 41 | # CACHE_PREFIX= 42 | 43 | MEMCACHED_HOST=127.0.0.1 44 | 45 | REDIS_CLIENT=phpredis 46 | REDIS_HOST=127.0.0.1 47 | REDIS_PASSWORD=null 48 | REDIS_PORT=6379 49 | 50 | MAIL_MAILER=log 51 | MAIL_SCHEME=null 52 | MAIL_HOST=127.0.0.1 53 | MAIL_PORT=2525 54 | MAIL_USERNAME=null 55 | MAIL_PASSWORD=null 56 | MAIL_FROM_ADDRESS="hello@example.com" 57 | MAIL_FROM_NAME="${APP_NAME}" 58 | 59 | AWS_ACCESS_KEY_ID= 60 | AWS_SECRET_ACCESS_KEY= 61 | AWS_DEFAULT_REGION=us-east-1 62 | AWS_BUCKET= 63 | AWS_USE_PATH_STYLE_ENDPOINT=false 64 | 65 | VITE_APP_NAME="${APP_NAME}" 66 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=Laravel 2 | APP_ENV=local 3 | APP_KEY= 4 | APP_DEBUG=true 5 | APP_URL=http://localhost 6 | 7 | APP_LOCALE=en 8 | APP_FALLBACK_LOCALE=en 9 | APP_FAKER_LOCALE=en_US 10 | 11 | APP_MAINTENANCE_DRIVER=file 12 | # APP_MAINTENANCE_STORE=database 13 | 14 | PHP_CLI_SERVER_WORKERS=4 15 | 16 | BCRYPT_ROUNDS=12 17 | 18 | LOG_CHANNEL=stack 19 | LOG_STACK=single 20 | LOG_DEPRECATIONS_CHANNEL=null 21 | LOG_LEVEL=debug 22 | 23 | DB_CONNECTION=sqlite 24 | # DB_HOST=127.0.0.1 25 | # DB_PORT=3306 26 | # DB_DATABASE=laravel 27 | # DB_USERNAME=root 28 | # DB_PASSWORD= 29 | 30 | SESSION_DRIVER=database 31 | SESSION_LIFETIME=120 32 | SESSION_ENCRYPT=false 33 | SESSION_PATH=/ 34 | SESSION_DOMAIN=null 35 | 36 | BROADCAST_CONNECTION=log 37 | FILESYSTEM_DISK=local 38 | QUEUE_CONNECTION=database 39 | 40 | CACHE_STORE=database 41 | # CACHE_PREFIX= 42 | 43 | MEMCACHED_HOST=127.0.0.1 44 | 45 | REDIS_CLIENT=phpredis 46 | REDIS_HOST=127.0.0.1 47 | REDIS_PASSWORD=null 48 | REDIS_PORT=6379 49 | 50 | MAIL_MAILER=log 51 | MAIL_SCHEME=null 52 | MAIL_HOST=127.0.0.1 53 | MAIL_PORT=2525 54 | MAIL_USERNAME=null 55 | MAIL_PASSWORD=null 56 | MAIL_FROM_ADDRESS="hello@example.com" 57 | MAIL_FROM_NAME="${APP_NAME}" 58 | 59 | AWS_ACCESS_KEY_ID= 60 | AWS_SECRET_ACCESS_KEY= 61 | AWS_DEFAULT_REGION=us-east-1 62 | AWS_BUCKET= 63 | AWS_USE_PATH_STYLE_ENDPOINT=false 64 | 65 | VITE_APP_NAME="${APP_NAME}" 66 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | 3 | *.blade.php diff=html 4 | *.css diff=css 5 | *.html diff=html 6 | *.md diff=markdown 7 | *.php diff=php 8 | 9 | CHANGELOG.md export-ignore 10 | README.md export-ignore 11 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: Linter 2 | 3 | on: 4 | push: 5 | branches: 6 | - develop 7 | - main 8 | pull_request: 9 | branches: 10 | - develop 11 | - main 12 | 13 | permissions: 14 | contents: write 15 | 16 | jobs: 17 | quality: 18 | runs-on: ubuntu-latest 19 | environment: Testing 20 | steps: 21 | - name: Checkout repository 22 | uses: actions/checkout@v4 23 | 24 | - name: Setup PHP 8.4 25 | uses: shivammathur/setup-php@v2 26 | with: 27 | php-version: "8.4" 28 | extensions: mbstring, bcmath, intl 29 | 30 | - name: Install PHP dependencies 31 | run: | 32 | composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist 33 | npm install 34 | 35 | - name: Run Pint 36 | run: vendor/bin/pint 37 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: tests 2 | 3 | on: 4 | push: 5 | branches: 6 | - develop 7 | - main 8 | pull_request: 9 | branches: 10 | - develop 11 | - main 12 | 13 | jobs: 14 | ci: 15 | runs-on: ubuntu-latest 16 | environment: Testing 17 | 18 | steps: 19 | - name: Checkout 20 | uses: actions/checkout@v4 21 | 22 | - name: Setup PHP 23 | uses: shivammathur/setup-php@v2 24 | with: 25 | php-version: 8.4 26 | tools: composer:v2 27 | coverage: xdebug 28 | 29 | - name: Setup Node 30 | uses: actions/setup-node@v4 31 | with: 32 | node-version: "22" 33 | cache: "npm" 34 | 35 | - name: Install Node Dependencies 36 | run: npm install 37 | 38 | - name: Install Dependencies 39 | run: composer install --no-interaction --prefer-dist --optimize-autoloader 40 | 41 | - name: Copy Environment File 42 | run: cp .env.example .env 43 | 44 | - name: Generate Application Key 45 | run: php artisan key:generate 46 | 47 | - name: Build Assets 48 | run: npm run build 49 | 50 | - name: Run Tests 51 | run: ./vendor/bin/pest 52 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.phpunit.cache 2 | /node_modules 3 | /public/build 4 | /public/hot 5 | /public/storage 6 | /storage/*.key 7 | /storage/pail 8 | /vendor 9 | .env.backup 10 | .env.production 11 | .phpactor.json 12 | .phpunit.result.cache 13 | Homestead.json 14 | Homestead.yaml 15 | npm-debug.log 16 | yarn-error.log 17 | /auth.json 18 | /.fleet 19 | /.idea 20 | /.nova 21 | /.vscode 22 | /.zed 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 ThemeSelection 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/VerifyEmailController.php: -------------------------------------------------------------------------------- 1 | user()->hasVerifiedEmail()) { 18 | return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); 19 | } 20 | 21 | if ($request->user()->markEmailAsVerified()) { 22 | /** @var \Illuminate\Contracts\Auth\MustVerifyEmail $user */ 23 | $user = $request->user(); 24 | 25 | event(new Verified($user)); 26 | } 27 | 28 | return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | logout(); 16 | 17 | Session::invalidate(); 18 | Session::regenerateToken(); 19 | 20 | return redirect('/'); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Models/User.php: -------------------------------------------------------------------------------- 1 | */ 14 | use HasFactory, Notifiable; 15 | 16 | /** 17 | * The attributes that are mass assignable. 18 | * 19 | * @var list 20 | */ 21 | protected $fillable = [ 22 | 'name', 23 | 'email', 24 | 'password', 25 | ]; 26 | 27 | /** 28 | * The attributes that should be hidden for serialization. 29 | * 30 | * @var list 31 | */ 32 | protected $hidden = [ 33 | 'password', 34 | 'remember_token', 35 | ]; 36 | 37 | /** 38 | * Get the attributes that should be cast. 39 | * 40 | * @return array 41 | */ 42 | protected function casts(): array 43 | { 44 | return [ 45 | 'email_verified_at' => 'datetime', 46 | 'password' => 'hashed', 47 | ]; 48 | } 49 | 50 | /** 51 | * Get the user's initials 52 | */ 53 | public function initials(): string 54 | { 55 | return Str::of($this->name) 56 | ->explode(' ') 57 | ->map(fn (string $name) => Str::of($name)->substr(0, 1)) 58 | ->implode(''); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | handleCommand(new ArgvInput); 17 | 18 | exit($status); 19 | -------------------------------------------------------------------------------- /bootstrap/app.php: -------------------------------------------------------------------------------- 1 | withRouting( 9 | web: __DIR__.'/../routes/web.php', 10 | commands: __DIR__.'/../routes/console.php', 11 | health: '/up', 12 | ) 13 | ->withMiddleware(function (Middleware $middleware) { 14 | // 15 | }) 16 | ->withExceptions(function (Exceptions $exceptions) { 17 | // 18 | })->create(); 19 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /bootstrap/providers.php: -------------------------------------------------------------------------------- 1 | env('APP_NAME', 'Laravel'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Application Environment 21 | |-------------------------------------------------------------------------- 22 | | 23 | | This value determines the "environment" your application is currently 24 | | running in. This may determine how you prefer to configure various 25 | | services the application utilizes. Set this in your ".env" file. 26 | | 27 | */ 28 | 29 | 'env' => env('APP_ENV', 'production'), 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Application Debug Mode 34 | |-------------------------------------------------------------------------- 35 | | 36 | | When your application is in debug mode, detailed error messages with 37 | | stack traces will be shown on every error that occurs within your 38 | | application. If disabled, a simple generic error page is shown. 39 | | 40 | */ 41 | 42 | 'debug' => (bool) env('APP_DEBUG', false), 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Application URL 47 | |-------------------------------------------------------------------------- 48 | | 49 | | This URL is used by the console to properly generate URLs when using 50 | | the Artisan command line tool. You should set this to the root of 51 | | the application so that it's available within Artisan commands. 52 | | 53 | */ 54 | 55 | 'url' => env('APP_URL', 'http://localhost'), 56 | 57 | /* 58 | |-------------------------------------------------------------------------- 59 | | Application Timezone 60 | |-------------------------------------------------------------------------- 61 | | 62 | | Here you may specify the default timezone for your application, which 63 | | will be used by the PHP date and date-time functions. The timezone 64 | | is set to "UTC" by default as it is suitable for most use cases. 65 | | 66 | */ 67 | 68 | 'timezone' => 'UTC', 69 | 70 | /* 71 | |-------------------------------------------------------------------------- 72 | | Application Locale Configuration 73 | |-------------------------------------------------------------------------- 74 | | 75 | | The application locale determines the default locale that will be used 76 | | by Laravel's translation / localization methods. This option can be 77 | | set to any locale for which you plan to have translation strings. 78 | | 79 | */ 80 | 81 | 'locale' => env('APP_LOCALE', 'en'), 82 | 83 | 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), 84 | 85 | 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), 86 | 87 | /* 88 | |-------------------------------------------------------------------------- 89 | | Encryption Key 90 | |-------------------------------------------------------------------------- 91 | | 92 | | This key is utilized by Laravel's encryption services and should be set 93 | | to a random, 32 character string to ensure that all encrypted values 94 | | are secure. You should do this prior to deploying the application. 95 | | 96 | */ 97 | 98 | 'cipher' => 'AES-256-CBC', 99 | 100 | 'key' => env('APP_KEY'), 101 | 102 | 'previous_keys' => [ 103 | ...array_filter( 104 | explode(',', env('APP_PREVIOUS_KEYS', '')) 105 | ), 106 | ], 107 | 108 | /* 109 | |-------------------------------------------------------------------------- 110 | | Maintenance Mode Driver 111 | |-------------------------------------------------------------------------- 112 | | 113 | | These configuration options determine the driver used to determine and 114 | | manage Laravel's "maintenance mode" status. The "cache" driver will 115 | | allow maintenance mode to be controlled across multiple machines. 116 | | 117 | | Supported drivers: "file", "cache" 118 | | 119 | */ 120 | 121 | 'maintenance' => [ 122 | 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), 123 | 'store' => env('APP_MAINTENANCE_STORE', 'database'), 124 | ], 125 | 126 | ]; 127 | -------------------------------------------------------------------------------- /config/auth.php: -------------------------------------------------------------------------------- 1 | [ 17 | 'guard' => env('AUTH_GUARD', 'web'), 18 | 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), 19 | ], 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | Authentication Guards 24 | |-------------------------------------------------------------------------- 25 | | 26 | | Next, you may define every authentication guard for your application. 27 | | Of course, a great default configuration has been defined for you 28 | | which utilizes session storage plus the Eloquent user provider. 29 | | 30 | | All authentication guards have a user provider, which defines how the 31 | | users are actually retrieved out of your database or other storage 32 | | system used by the application. Typically, Eloquent is utilized. 33 | | 34 | | Supported: "session" 35 | | 36 | */ 37 | 38 | 'guards' => [ 39 | 'web' => [ 40 | 'driver' => 'session', 41 | 'provider' => 'users', 42 | ], 43 | ], 44 | 45 | /* 46 | |-------------------------------------------------------------------------- 47 | | User Providers 48 | |-------------------------------------------------------------------------- 49 | | 50 | | All authentication guards have a user provider, which defines how the 51 | | users are actually retrieved out of your database or other storage 52 | | system used by the application. Typically, Eloquent is utilized. 53 | | 54 | | If you have multiple user tables or models you may configure multiple 55 | | providers to represent the model / table. These providers may then 56 | | be assigned to any extra authentication guards you have defined. 57 | | 58 | | Supported: "database", "eloquent" 59 | | 60 | */ 61 | 62 | 'providers' => [ 63 | 'users' => [ 64 | 'driver' => 'eloquent', 65 | 'model' => env('AUTH_MODEL', App\Models\User::class), 66 | ], 67 | 68 | // 'users' => [ 69 | // 'driver' => 'database', 70 | // 'table' => 'users', 71 | // ], 72 | ], 73 | 74 | /* 75 | |-------------------------------------------------------------------------- 76 | | Resetting Passwords 77 | |-------------------------------------------------------------------------- 78 | | 79 | | These configuration options specify the behavior of Laravel's password 80 | | reset functionality, including the table utilized for token storage 81 | | and the user provider that is invoked to actually retrieve users. 82 | | 83 | | The expiry time is the number of minutes that each reset token will be 84 | | considered valid. This security feature keeps tokens short-lived so 85 | | they have less time to be guessed. You may change this as needed. 86 | | 87 | | The throttle setting is the number of seconds a user must wait before 88 | | generating more password reset tokens. This prevents the user from 89 | | quickly generating a very large amount of password reset tokens. 90 | | 91 | */ 92 | 93 | 'passwords' => [ 94 | 'users' => [ 95 | 'provider' => 'users', 96 | 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), 97 | 'expire' => 60, 98 | 'throttle' => 60, 99 | ], 100 | ], 101 | 102 | /* 103 | |-------------------------------------------------------------------------- 104 | | Password Confirmation Timeout 105 | |-------------------------------------------------------------------------- 106 | | 107 | | Here you may define the amount of seconds before a password confirmation 108 | | window expires and users are asked to re-enter their password via the 109 | | confirmation screen. By default, the timeout lasts for three hours. 110 | | 111 | */ 112 | 113 | 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), 114 | 115 | ]; 116 | -------------------------------------------------------------------------------- /config/cache.php: -------------------------------------------------------------------------------- 1 | env('CACHE_STORE', 'database'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Cache Stores 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may define all of the cache "stores" for your application as 26 | | well as their drivers. You may even define multiple stores for the 27 | | same cache driver to group types of items stored in your caches. 28 | | 29 | | Supported drivers: "array", "database", "file", "memcached", 30 | | "redis", "dynamodb", "octane", "null" 31 | | 32 | */ 33 | 34 | 'stores' => [ 35 | 36 | 'array' => [ 37 | 'driver' => 'array', 38 | 'serialize' => false, 39 | ], 40 | 41 | 'database' => [ 42 | 'driver' => 'database', 43 | 'connection' => env('DB_CACHE_CONNECTION'), 44 | 'table' => env('DB_CACHE_TABLE', 'cache'), 45 | 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), 46 | 'lock_table' => env('DB_CACHE_LOCK_TABLE'), 47 | ], 48 | 49 | 'file' => [ 50 | 'driver' => 'file', 51 | 'path' => storage_path('framework/cache/data'), 52 | 'lock_path' => storage_path('framework/cache/data'), 53 | ], 54 | 55 | 'memcached' => [ 56 | 'driver' => 'memcached', 57 | 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), 58 | 'sasl' => [ 59 | env('MEMCACHED_USERNAME'), 60 | env('MEMCACHED_PASSWORD'), 61 | ], 62 | 'options' => [ 63 | // Memcached::OPT_CONNECT_TIMEOUT => 2000, 64 | ], 65 | 'servers' => [ 66 | [ 67 | 'host' => env('MEMCACHED_HOST', '127.0.0.1'), 68 | 'port' => env('MEMCACHED_PORT', 11211), 69 | 'weight' => 100, 70 | ], 71 | ], 72 | ], 73 | 74 | 'redis' => [ 75 | 'driver' => 'redis', 76 | 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), 77 | 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), 78 | ], 79 | 80 | 'dynamodb' => [ 81 | 'driver' => 'dynamodb', 82 | 'key' => env('AWS_ACCESS_KEY_ID'), 83 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 84 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 85 | 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), 86 | 'endpoint' => env('DYNAMODB_ENDPOINT'), 87 | ], 88 | 89 | 'octane' => [ 90 | 'driver' => 'octane', 91 | ], 92 | 93 | ], 94 | 95 | /* 96 | |-------------------------------------------------------------------------- 97 | | Cache Key Prefix 98 | |-------------------------------------------------------------------------- 99 | | 100 | | When utilizing the APC, database, memcached, Redis, and DynamoDB cache 101 | | stores, there might be other applications using the same cache. For 102 | | that reason, you may prefix every cache key to avoid collisions. 103 | | 104 | */ 105 | 106 | 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), 107 | 108 | ]; 109 | -------------------------------------------------------------------------------- /config/filesystems.php: -------------------------------------------------------------------------------- 1 | env('FILESYSTEM_DISK', 'local'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Filesystem Disks 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Below you may configure as many filesystem disks as necessary, and you 24 | | may even configure multiple disks for the same driver. Examples for 25 | | most supported storage drivers are configured here for reference. 26 | | 27 | | Supported drivers: "local", "ftp", "sftp", "s3" 28 | | 29 | */ 30 | 31 | 'disks' => [ 32 | 33 | 'local' => [ 34 | 'driver' => 'local', 35 | 'root' => storage_path('app/private'), 36 | 'serve' => true, 37 | 'throw' => false, 38 | 'report' => false, 39 | ], 40 | 41 | 'public' => [ 42 | 'driver' => 'local', 43 | 'root' => storage_path('app/public'), 44 | 'url' => env('APP_URL').'/storage', 45 | 'visibility' => 'public', 46 | 'throw' => false, 47 | 'report' => false, 48 | ], 49 | 50 | 's3' => [ 51 | 'driver' => 's3', 52 | 'key' => env('AWS_ACCESS_KEY_ID'), 53 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 54 | 'region' => env('AWS_DEFAULT_REGION'), 55 | 'bucket' => env('AWS_BUCKET'), 56 | 'url' => env('AWS_URL'), 57 | 'endpoint' => env('AWS_ENDPOINT'), 58 | 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), 59 | 'throw' => false, 60 | 'report' => false, 61 | ], 62 | 63 | ], 64 | 65 | /* 66 | |-------------------------------------------------------------------------- 67 | | Symbolic Links 68 | |-------------------------------------------------------------------------- 69 | | 70 | | Here you may configure the symbolic links that will be created when the 71 | | `storage:link` Artisan command is executed. The array keys should be 72 | | the locations of the links and the values should be their targets. 73 | | 74 | */ 75 | 76 | 'links' => [ 77 | public_path('storage') => storage_path('app/public'), 78 | ], 79 | 80 | ]; 81 | -------------------------------------------------------------------------------- /config/mail.php: -------------------------------------------------------------------------------- 1 | env('MAIL_MAILER', 'log'), 18 | 19 | /* 20 | |-------------------------------------------------------------------------- 21 | | Mailer Configurations 22 | |-------------------------------------------------------------------------- 23 | | 24 | | Here you may configure all of the mailers used by your application plus 25 | | their respective settings. Several examples have been configured for 26 | | you and you are free to add your own as your application requires. 27 | | 28 | | Laravel supports a variety of mail "transport" drivers that can be used 29 | | when delivering an email. You may specify which one you're using for 30 | | your mailers below. You may also add additional mailers if needed. 31 | | 32 | | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", 33 | | "postmark", "resend", "log", "array", 34 | | "failover", "roundrobin" 35 | | 36 | */ 37 | 38 | 'mailers' => [ 39 | 40 | 'smtp' => [ 41 | 'transport' => 'smtp', 42 | 'scheme' => env('MAIL_SCHEME'), 43 | 'url' => env('MAIL_URL'), 44 | 'host' => env('MAIL_HOST', '127.0.0.1'), 45 | 'port' => env('MAIL_PORT', 2525), 46 | 'username' => env('MAIL_USERNAME'), 47 | 'password' => env('MAIL_PASSWORD'), 48 | 'timeout' => null, 49 | 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url(env('APP_URL', 'http://localhost'), PHP_URL_HOST)), 50 | ], 51 | 52 | 'ses' => [ 53 | 'transport' => 'ses', 54 | ], 55 | 56 | 'postmark' => [ 57 | 'transport' => 'postmark', 58 | // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), 59 | // 'client' => [ 60 | // 'timeout' => 5, 61 | // ], 62 | ], 63 | 64 | 'resend' => [ 65 | 'transport' => 'resend', 66 | ], 67 | 68 | 'sendmail' => [ 69 | 'transport' => 'sendmail', 70 | 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), 71 | ], 72 | 73 | 'log' => [ 74 | 'transport' => 'log', 75 | 'channel' => env('MAIL_LOG_CHANNEL'), 76 | ], 77 | 78 | 'array' => [ 79 | 'transport' => 'array', 80 | ], 81 | 82 | 'failover' => [ 83 | 'transport' => 'failover', 84 | 'mailers' => [ 85 | 'smtp', 86 | 'log', 87 | ], 88 | ], 89 | 90 | 'roundrobin' => [ 91 | 'transport' => 'roundrobin', 92 | 'mailers' => [ 93 | 'ses', 94 | 'postmark', 95 | ], 96 | ], 97 | 98 | ], 99 | 100 | /* 101 | |-------------------------------------------------------------------------- 102 | | Global "From" Address 103 | |-------------------------------------------------------------------------- 104 | | 105 | | You may wish for all emails sent by your application to be sent from 106 | | the same address. Here you may specify a name and address that is 107 | | used globally for all emails that are sent by your application. 108 | | 109 | */ 110 | 111 | 'from' => [ 112 | 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), 113 | 'name' => env('MAIL_FROM_NAME', 'Example'), 114 | ], 115 | 116 | ]; 117 | -------------------------------------------------------------------------------- /config/queue.php: -------------------------------------------------------------------------------- 1 | env('QUEUE_CONNECTION', 'database'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Queue Connections 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here you may configure the connection options for every queue backend 24 | | used by your application. An example configuration is provided for 25 | | each backend supported by Laravel. You're also free to add more. 26 | | 27 | | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'sync' => [ 34 | 'driver' => 'sync', 35 | ], 36 | 37 | 'database' => [ 38 | 'driver' => 'database', 39 | 'connection' => env('DB_QUEUE_CONNECTION'), 40 | 'table' => env('DB_QUEUE_TABLE', 'jobs'), 41 | 'queue' => env('DB_QUEUE', 'default'), 42 | 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), 43 | 'after_commit' => false, 44 | ], 45 | 46 | 'beanstalkd' => [ 47 | 'driver' => 'beanstalkd', 48 | 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), 49 | 'queue' => env('BEANSTALKD_QUEUE', 'default'), 50 | 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), 51 | 'block_for' => 0, 52 | 'after_commit' => false, 53 | ], 54 | 55 | 'sqs' => [ 56 | 'driver' => 'sqs', 57 | 'key' => env('AWS_ACCESS_KEY_ID'), 58 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 59 | 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 60 | 'queue' => env('SQS_QUEUE', 'default'), 61 | 'suffix' => env('SQS_SUFFIX'), 62 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 63 | 'after_commit' => false, 64 | ], 65 | 66 | 'redis' => [ 67 | 'driver' => 'redis', 68 | 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), 69 | 'queue' => env('REDIS_QUEUE', 'default'), 70 | 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), 71 | 'block_for' => null, 72 | 'after_commit' => false, 73 | ], 74 | 75 | ], 76 | 77 | /* 78 | |-------------------------------------------------------------------------- 79 | | Job Batching 80 | |-------------------------------------------------------------------------- 81 | | 82 | | The following options configure the database and table that store job 83 | | batching information. These options can be updated to any database 84 | | connection and table which has been defined by your application. 85 | | 86 | */ 87 | 88 | 'batching' => [ 89 | 'database' => env('DB_CONNECTION', 'sqlite'), 90 | 'table' => 'job_batches', 91 | ], 92 | 93 | /* 94 | |-------------------------------------------------------------------------- 95 | | Failed Queue Jobs 96 | |-------------------------------------------------------------------------- 97 | | 98 | | These options configure the behavior of failed queue job logging so you 99 | | can control how and where failed jobs are stored. Laravel ships with 100 | | support for storing failed jobs in a simple file or in a database. 101 | | 102 | | Supported drivers: "database-uuids", "dynamodb", "file", "null" 103 | | 104 | */ 105 | 106 | 'failed' => [ 107 | 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), 108 | 'database' => env('DB_CONNECTION', 'sqlite'), 109 | 'table' => 'failed_jobs', 110 | ], 111 | 112 | ]; 113 | -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | [ 18 | 'token' => env('POSTMARK_TOKEN'), 19 | ], 20 | 21 | 'ses' => [ 22 | 'key' => env('AWS_ACCESS_KEY_ID'), 23 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 24 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 25 | ], 26 | 27 | 'resend' => [ 28 | 'key' => env('RESEND_KEY'), 29 | ], 30 | 31 | 'slack' => [ 32 | 'notifications' => [ 33 | 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), 34 | 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), 35 | ], 36 | ], 37 | 38 | ]; 39 | -------------------------------------------------------------------------------- /config/variables.php: -------------------------------------------------------------------------------- 1 | "ThemeSelection", 5 | "creatorUrl" => "https://themeselection.com", 6 | "templateName" => "Sneat", 7 | "templateSuffix" => "Laravel Bootstrap Starter Kit", 8 | "templateVersion" => "1.0.0", 9 | "templateFree" => true, 10 | "templateDescription" => "Laravel 12 Starter Kit with Bootstrap 5 – Powerful template for developers, offering clean code and seamless integration with Bootstrap 5 components.", 11 | "templateKeyword" => "laravel 12 starter kit, laravel bootstrap 5, bootstrap 5 starter kit, laravel bootstrap template, developer-friendly dashboard template", 12 | "licenseUrl" => "https://themeselection.com/license/", 13 | "livePreview" => "https://demos.themeselection.com/sneat-bootstrap-html-laravel-admin-template-free/demo/", 14 | "productPage" => "https://themeselection.com/item/sneat-free-bootstrap-laravel-livewire-starter-kit/", 15 | "ogTitle" => "Laravel Bootstrap Starter Kit by ThemeSelection", 16 | "ogType" => "product", 17 | "ogImage" => "https://github-production-user-asset-6210df.s3.amazonaws.com/61959920/427962312-a4f2c59c-92a0-4624-a0f0-d53ee0acf7d9.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAVCODYLSA53PQK4ZA%2F20250328%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250328T104541Z&X-Amz-Expires=300&X-Amz-Signature=88f19338f62219496631c44f4da216a3f2da10169fb75377cdc9146dc1722352&X-Amz-SignedHeaders=host", 18 | "support" => "https://github.com/themeselection/sneat-bootstrap-laravel-livewire-starter-kit/issues", 19 | "moreThemes" => "https://themeselection.com/", 20 | "documentation" => "https://demos.themeselection.com/sneat-bootstrap-html-admin-template/documentation", 21 | "repository" => "https://github.com/themeselection/sneat-bootstrap-laravel-livewire-starter-kit", 22 | "gitRepo" => "https://github.com/themeselection/sneat-bootstrap-laravel-livewire-starter-kit.git", 23 | "gitRepoAccess" => "https://tools.themeselection.com/github/github-access", 24 | "githubFreeUrl" => "https://github.com/themeselection", 25 | "facebookUrl" => "https://www.facebook.com/ThemeSelections/", 26 | "twitterUrl" => "https://x.com/Theme_Selection", 27 | "githubUrl" => "https://github.com/themeselection", 28 | "dribbbleUrl" => "https://dribbble.com/themeselection", 29 | "instagramUrl" => "https://www.instagram.com/themeselection/" 30 | ]; 31 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite* 2 | -------------------------------------------------------------------------------- /database/factories/UserFactory.php: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | class UserFactory extends Factory 13 | { 14 | /** 15 | * The current password being used by the factory. 16 | */ 17 | protected static ?string $password; 18 | 19 | /** 20 | * Define the model's default state. 21 | * 22 | * @return array 23 | */ 24 | public function definition(): array 25 | { 26 | return [ 27 | 'name' => fake()->name(), 28 | 'email' => fake()->unique()->safeEmail(), 29 | 'email_verified_at' => now(), 30 | 'password' => static::$password ??= Hash::make('password'), 31 | 'remember_token' => Str::random(10), 32 | ]; 33 | } 34 | 35 | /** 36 | * Indicate that the model's email address should be unverified. 37 | */ 38 | public function unverified(): static 39 | { 40 | return $this->state(fn (array $attributes) => [ 41 | 'email_verified_at' => null, 42 | ]); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /database/migrations/0001_01_01_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->string('name'); 17 | $table->string('email')->unique(); 18 | $table->timestamp('email_verified_at')->nullable(); 19 | $table->string('password'); 20 | $table->rememberToken(); 21 | $table->timestamps(); 22 | }); 23 | 24 | Schema::create('password_reset_tokens', function (Blueprint $table) { 25 | $table->string('email')->primary(); 26 | $table->string('token'); 27 | $table->timestamp('created_at')->nullable(); 28 | }); 29 | 30 | Schema::create('sessions', function (Blueprint $table) { 31 | $table->string('id')->primary(); 32 | $table->foreignId('user_id')->nullable()->index(); 33 | $table->string('ip_address', 45)->nullable(); 34 | $table->text('user_agent')->nullable(); 35 | $table->longText('payload'); 36 | $table->integer('last_activity')->index(); 37 | }); 38 | } 39 | 40 | /** 41 | * Reverse the migrations. 42 | */ 43 | public function down(): void 44 | { 45 | Schema::dropIfExists('users'); 46 | Schema::dropIfExists('password_reset_tokens'); 47 | Schema::dropIfExists('sessions'); 48 | } 49 | }; 50 | -------------------------------------------------------------------------------- /database/migrations/0001_01_01_000001_create_cache_table.php: -------------------------------------------------------------------------------- 1 | string('key')->primary(); 16 | $table->mediumText('value'); 17 | $table->integer('expiration'); 18 | }); 19 | 20 | Schema::create('cache_locks', function (Blueprint $table) { 21 | $table->string('key')->primary(); 22 | $table->string('owner'); 23 | $table->integer('expiration'); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | */ 30 | public function down(): void 31 | { 32 | Schema::dropIfExists('cache'); 33 | Schema::dropIfExists('cache_locks'); 34 | } 35 | }; 36 | -------------------------------------------------------------------------------- /database/migrations/0001_01_01_000002_create_jobs_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->string('queue')->index(); 17 | $table->longText('payload'); 18 | $table->unsignedTinyInteger('attempts'); 19 | $table->unsignedInteger('reserved_at')->nullable(); 20 | $table->unsignedInteger('available_at'); 21 | $table->unsignedInteger('created_at'); 22 | }); 23 | 24 | Schema::create('job_batches', function (Blueprint $table) { 25 | $table->string('id')->primary(); 26 | $table->string('name'); 27 | $table->integer('total_jobs'); 28 | $table->integer('pending_jobs'); 29 | $table->integer('failed_jobs'); 30 | $table->longText('failed_job_ids'); 31 | $table->mediumText('options')->nullable(); 32 | $table->integer('cancelled_at')->nullable(); 33 | $table->integer('created_at'); 34 | $table->integer('finished_at')->nullable(); 35 | }); 36 | 37 | Schema::create('failed_jobs', function (Blueprint $table) { 38 | $table->id(); 39 | $table->string('uuid')->unique(); 40 | $table->text('connection'); 41 | $table->text('queue'); 42 | $table->longText('payload'); 43 | $table->longText('exception'); 44 | $table->timestamp('failed_at')->useCurrent(); 45 | }); 46 | } 47 | 48 | /** 49 | * Reverse the migrations. 50 | */ 51 | public function down(): void 52 | { 53 | Schema::dropIfExists('jobs'); 54 | Schema::dropIfExists('job_batches'); 55 | Schema::dropIfExists('failed_jobs'); 56 | } 57 | }; 58 | -------------------------------------------------------------------------------- /database/seeders/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | create(); 17 | 18 | User::factory()->create([ 19 | 'name' => 'Test User', 20 | 'email' => 'test@example.com', 21 | ]); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /documentation.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Sneat - Bootstrap 5 + Laravel Starter Kit 5 | 6 | 7 | 8 | 9 |

10 | If you do not redirect please visit : 11 | https://demos.themeselection.com/sneat-bootstrap-html-admin-template/documentation/laravel-introduction.html 12 |

13 | 14 | 15 | -------------------------------------------------------------------------------- /hire-us.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Hire Us 5 | 6 | 7 | 8 | 9 |

10 | If you do not redirect please visit : 11 | https://themeselection.com/hire-us/ 12 |

13 | 14 | 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Master starter kit", 3 | "version": "1.0.0", 4 | "private": true, 5 | "type": "module", 6 | "scripts": { 7 | "build": "vite build", 8 | "dev": "vite" 9 | }, 10 | "dependencies": { 11 | "autoprefixer": "^10.4.20", 12 | "axios": "^1.7.4", 13 | "boxicons": "~2.1.4", 14 | "@iconify/json": "^2.2.319", 15 | "@iconify/tools": "^4.1.2", 16 | "@iconify/types": "^2.0.0", 17 | "@iconify/utils": "^2.3.0", 18 | "concurrently": "^9.0.1", 19 | "jquery": "~3.7.1", 20 | "laravel-vite-plugin": "^1.0", 21 | "vite": "^6.2.2" 22 | }, 23 | "devDependencies": { 24 | "@popperjs/core": "^2.11.8", 25 | "@rollup/plugin-html": "^2.0.0", 26 | "bootstrap": "~5.3.3", 27 | "glob": "^10.4.5", 28 | "sass": "1.76.0", 29 | "sass-loader": "~14.0.0" 30 | }, 31 | "overrides": { 32 | "sass": "1.76.0" 33 | }, 34 | "resolutions": { 35 | "sass": "1.76.0" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | tests/Unit 10 | 11 | 12 | tests/Feature 13 | 14 | 15 | 16 | 17 | app 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Handle X-XSRF-Token Header 13 | RewriteCond %{HTTP:x-xsrf-token} . 14 | RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}] 15 | 16 | # Redirect Trailing Slashes If Not A Folder... 17 | RewriteCond %{REQUEST_FILENAME} !-d 18 | RewriteCond %{REQUEST_URI} (.+)/$ 19 | RewriteRule ^ %1 [L,R=301] 20 | 21 | # Send Requests To Front Controller... 22 | RewriteCond %{REQUEST_FILENAME} !-d 23 | RewriteCond %{REQUEST_FILENAME} !-f 24 | RewriteRule ^ index.php [L] 25 | 26 | -------------------------------------------------------------------------------- /public/assets/img/avatars/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/themeselection/sneat-bootstrap-laravel-livewire-starter-kit/2cc4b76712490a1410ed604f13b4889ce4f8ddbf/public/assets/img/avatars/1.png -------------------------------------------------------------------------------- /public/assets/img/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/themeselection/sneat-bootstrap-laravel-livewire-starter-kit/2cc4b76712490a1410ed604f13b4889ce4f8ddbf/public/assets/img/favicon/favicon.ico -------------------------------------------------------------------------------- /public/assets/img/illustrations/boy-with-rocket-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/themeselection/sneat-bootstrap-laravel-livewire-starter-kit/2cc4b76712490a1410ed604f13b4889ce4f8ddbf/public/assets/img/illustrations/boy-with-rocket-light.png -------------------------------------------------------------------------------- /public/assets/img/illustrations/laravel-livewire-sneat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/themeselection/sneat-bootstrap-laravel-livewire-starter-kit/2cc4b76712490a1410ed604f13b4889ce4f8ddbf/public/assets/img/illustrations/laravel-livewire-sneat.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/themeselection/sneat-bootstrap-laravel-livewire-starter-kit/2cc4b76712490a1410ed604f13b4889ce4f8ddbf/public/favicon.ico -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | handleRequest(Request::capture()); 21 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /resources/assets/css/demo.css: -------------------------------------------------------------------------------- 1 | /* 2 | * demo.css 3 | * File include item demo only specific css only 4 | ******************************************************************************/ 5 | 6 | .menu .app-brand.demo { 7 | height: 64px; 8 | margin-top: 12px; 9 | } 10 | 11 | .app-brand-logo.demo svg { 12 | width: 22px; 13 | height: 38px; 14 | } 15 | 16 | .app-brand-text.demo { 17 | font-size: 1.75rem; 18 | letter-spacing: -0.5px; 19 | } 20 | 21 | /* ! For .layout-navbar-fixed added fix padding top to .layout-page */ 22 | /* Detached navbar */ 23 | .layout-navbar-fixed .layout-wrapper:not(.layout-horizontal):not(.layout-without-menu) .layout-page { 24 | padding-top: 74px !important; 25 | } 26 | /* Default navbar */ 27 | .layout-navbar-fixed .layout-wrapper:not(.layout-without-menu) .layout-page { 28 | padding-top: 64px !important; 29 | } 30 | .docs-page .layout-navbar-fixed.layout-wrapper:not(.layout-without-menu) .layout-page, 31 | .docs-page .layout-menu-fixed.layout-wrapper:not(.layout-without-menu) .layout-page { 32 | padding-top: 62px !important; 33 | } 34 | 35 | /* Navbar page z-index issue solution */ 36 | .content-wrapper .navbar { 37 | z-index: auto; 38 | } 39 | 40 | /* 41 | * Content 42 | ******************************************************************************/ 43 | 44 | .demo-blocks > * { 45 | display: block !important; 46 | } 47 | 48 | .demo-inline-spacing > * { 49 | margin: 1rem 0.375rem 0 0 !important; 50 | } 51 | 52 | /* ? .demo-vertical-spacing class is used to have vertical margins between elements. To remove margin-top from the first-child, use .demo-only-element class with .demo-vertical-spacing class. For example, we have used this class in forms-input-groups.html file. */ 53 | .demo-vertical-spacing > * { 54 | margin-top: 1rem !important; 55 | margin-bottom: 0 !important; 56 | } 57 | .demo-vertical-spacing.demo-only-element > :first-child { 58 | margin-top: 0 !important; 59 | } 60 | 61 | .demo-vertical-spacing-lg > * { 62 | margin-top: 1.875rem !important; 63 | margin-bottom: 0 !important; 64 | } 65 | .demo-vertical-spacing-lg.demo-only-element > :first-child { 66 | margin-top: 0 !important; 67 | } 68 | 69 | .demo-vertical-spacing-xl > * { 70 | margin-top: 5rem !important; 71 | margin-bottom: 0 !important; 72 | } 73 | .demo-vertical-spacing-xl.demo-only-element > :first-child { 74 | margin-top: 0 !important; 75 | } 76 | 77 | .rtl-only { 78 | display: none !important; 79 | text-align: left !important; 80 | direction: ltr !important; 81 | } 82 | 83 | [dir='rtl'] .rtl-only { 84 | display: block !important; 85 | } 86 | 87 | /* Dropdown buttons going out of small screens */ 88 | @media (max-width: 576px) { 89 | #dropdown-variation-demo .btn-group .text-truncate { 90 | width: 231px; 91 | position: relative; 92 | } 93 | #dropdown-variation-demo .btn-group .text-truncate::after { 94 | position: absolute; 95 | top: 45%; 96 | right: 0.65rem; 97 | } 98 | } 99 | 100 | /* 101 | * Layout demo 102 | ******************************************************************************/ 103 | 104 | .layout-demo-wrapper { 105 | display: -webkit-box; 106 | display: -ms-flexbox; 107 | display: flex; 108 | -webkit-box-align: center; 109 | -ms-flex-align: center; 110 | align-items: center; 111 | -webkit-box-orient: vertical; 112 | -webkit-box-direction: normal; 113 | -ms-flex-direction: column; 114 | flex-direction: column; 115 | margin-top: 1rem; 116 | } 117 | .layout-demo-placeholder img { 118 | width: 900px; 119 | } 120 | .layout-demo-info { 121 | text-align: center; 122 | margin-top: 1rem; 123 | } 124 | -------------------------------------------------------------------------------- /resources/assets/vendor/fonts/boxicons.scss: -------------------------------------------------------------------------------- 1 | $boxicons-font-path: "boxicons"; 2 | $boxicons-font-size-base: 16px; 3 | 4 | @import "boxicons/css/boxicons"; 5 | 6 | .bx { 7 | font-size: 1.25rem; 8 | line-height: 1; 9 | vertical-align: middle; 10 | } 11 | // Override font path 12 | @font-face { 13 | font-family: boxicons; 14 | font-style: normal; 15 | font-weight: 400; 16 | src: url("../fonts/#{$boxicons-font-path}/boxicons.eot"); 17 | src: 18 | url("../fonts/#{$boxicons-font-path}/boxicons.eot") format("embedded-opentype"), 19 | url("../fonts/#{$boxicons-font-path}/boxicons.woff2") format("woff2"), 20 | url("../fonts/#{$boxicons-font-path}/boxicons.woff") format("woff"), 21 | url("../fonts/#{$boxicons-font-path}/boxicons.ttf") format("truetype"), 22 | url("../fonts/#{$boxicons-font-path}/boxicons.svg?#boxicons") format("svg"); 23 | } 24 | 25 | // icon sizes 26 | 27 | .bx-xs { 28 | font-size: 1rem !important; 29 | } 30 | 31 | .bx-sm { 32 | font-size: 1.125rem !important; 33 | } 34 | 35 | .bx-md { 36 | font-size: 1.375rem !important; 37 | } 38 | 39 | .bx-lg { 40 | font-size: 1.5rem !important; 41 | } 42 | 43 | .bx-6px { 44 | &, 45 | &::before { 46 | font-size: 6px; 47 | } 48 | } 49 | 50 | .bx-8px { 51 | &, 52 | &::before { 53 | font-size: 8px; 54 | } 55 | } 56 | 57 | .bx-10px { 58 | &, 59 | &::before { 60 | font-size: 10px; 61 | } 62 | } 63 | 64 | .bx-12px { 65 | &, 66 | &::before { 67 | font-size: 12px; 68 | } 69 | } 70 | 71 | .bx-14px { 72 | &, 73 | &::before { 74 | font-size: 14px; 75 | } 76 | } 77 | 78 | .bx-16px { 79 | &, 80 | &::before { 81 | font-size: 16px; 82 | } 83 | } 84 | 85 | .bx-18px { 86 | &, 87 | &::before { 88 | font-size: 18px; 89 | } 90 | } 91 | 92 | .bx-20px { 93 | &, 94 | &::before { 95 | font-size: 20px; 96 | } 97 | } 98 | 99 | .bx-22px { 100 | &, 101 | &::before { 102 | font-size: 22px; 103 | } 104 | } 105 | 106 | .bx-24px { 107 | &, 108 | &::before { 109 | font-size: 24px; 110 | } 111 | } 112 | 113 | .bx-26px { 114 | &, 115 | &::before { 116 | font-size: 26px; 117 | } 118 | } 119 | 120 | .bx-28px { 121 | &, 122 | &::before { 123 | font-size: 28px; 124 | } 125 | } 126 | 127 | .bx-30px { 128 | &, 129 | &::before { 130 | font-size: 30px; 131 | } 132 | } 133 | 134 | .bx-32px { 135 | &, 136 | &::before { 137 | font-size: 32px; 138 | } 139 | } 140 | 141 | .bx-36px { 142 | &, 143 | &::before { 144 | font-size: 36px; 145 | } 146 | } 147 | 148 | .bx-40px { 149 | &, 150 | &::before { 151 | font-size: 40px; 152 | } 153 | } 154 | 155 | .bx-42px { 156 | &, 157 | &::before { 158 | font-size: 42px; 159 | } 160 | } 161 | 162 | .bx-48px { 163 | &, 164 | &::before { 165 | font-size: 48px; 166 | } 167 | } 168 | -------------------------------------------------------------------------------- /resources/assets/vendor/fonts/boxicons/boxicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/themeselection/sneat-bootstrap-laravel-livewire-starter-kit/2cc4b76712490a1410ed604f13b4889ce4f8ddbf/resources/assets/vendor/fonts/boxicons/boxicons.eot -------------------------------------------------------------------------------- /resources/assets/vendor/fonts/boxicons/boxicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/themeselection/sneat-bootstrap-laravel-livewire-starter-kit/2cc4b76712490a1410ed604f13b4889ce4f8ddbf/resources/assets/vendor/fonts/boxicons/boxicons.ttf -------------------------------------------------------------------------------- /resources/assets/vendor/fonts/boxicons/boxicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/themeselection/sneat-bootstrap-laravel-livewire-starter-kit/2cc4b76712490a1410ed604f13b4889ce4f8ddbf/resources/assets/vendor/fonts/boxicons/boxicons.woff -------------------------------------------------------------------------------- /resources/assets/vendor/fonts/boxicons/boxicons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/themeselection/sneat-bootstrap-laravel-livewire-starter-kit/2cc4b76712490a1410ed604f13b4889ce4f8ddbf/resources/assets/vendor/fonts/boxicons/boxicons.woff2 -------------------------------------------------------------------------------- /resources/assets/vendor/fonts/iconify/iconify.js: -------------------------------------------------------------------------------- 1 | import { 2 | getIconsCSS 3 | } from '@iconify/utils'; // Utility for CSS generation 4 | import bx from '@iconify/json/json/bx.json'; // Boxicons JSON 5 | import bxl from '@iconify/json/json/bxl.json'; // Boxicons Light JSON 6 | import bxs from '@iconify/json/json/bxs.json'; // Boxicons Solid JSON 7 | 8 | // Combine all icon sets 9 | const iconSets = [bx, bxl, bxs]; 10 | 11 | // Generate CSS content for the icons 12 | function generateIconifyCSS() { 13 | const allIcons = iconSets.map(iconSet => { 14 | return getIconsCSS(iconSet, Object.keys(iconSet.icons), { 15 | iconSelector: '.{prefix}-{name}', // Example: .bx-cog 16 | commonSelector: '.bx', // Common selector for all icons, can be adjusted 17 | format: 'expanded' // Use 'compressed' for minified CSS 18 | }); 19 | }).join('\n'); 20 | 21 | // Inject CSS directly into the page (instead of generating a file) 22 | const styleElement = document.createElement('style'); 23 | styleElement.innerHTML = allIcons; 24 | document.head.appendChild(styleElement); // Append generated CSS to the document 25 | } 26 | 27 | // Call the function to generate and inject the CSS 28 | generateIconifyCSS(); 29 | -------------------------------------------------------------------------------- /resources/assets/vendor/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | import * as bootstrap from 'bootstrap' 2 | 3 | try { 4 | window.bootstrap = bootstrap 5 | } catch (e) {} 6 | 7 | export { bootstrap } 8 | -------------------------------------------------------------------------------- /resources/assets/vendor/libs/jquery/jquery.js: -------------------------------------------------------------------------------- 1 | import jQuery from 'jquery/dist/jquery'; 2 | 3 | const $ = jQuery; 4 | try { 5 | window.jQuery = window.$ = jQuery; 6 | } catch (e) {} 7 | 8 | export { jQuery, $ }; 9 | -------------------------------------------------------------------------------- /resources/assets/vendor/libs/popper/popper.js: -------------------------------------------------------------------------------- 1 | import Popper from '@popperjs/core/dist/umd/popper.min'; 2 | 3 | // Required to enable animations on dropdowns/tooltips/popovers 4 | // Popper.Defaults.modifiers.computeStyle.gpuAcceleration = false 5 | 6 | try { 7 | window.Popper = Popper; 8 | } catch (e) {} 9 | 10 | export { 11 | Popper 12 | }; 13 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended.scss: -------------------------------------------------------------------------------- 1 | // Configuration 2 | @import "_bootstrap-extended/include"; 3 | @import "_bootstrap-extended/utilities"; 4 | 5 | // Layout & components 6 | @import "_bootstrap-extended/root"; 7 | @import "_bootstrap-extended/reboot"; 8 | @import "_bootstrap-extended/type"; 9 | @import "_bootstrap-extended/tables"; 10 | @import "_bootstrap-extended/forms"; 11 | @import "_bootstrap-extended/buttons"; 12 | @import "_bootstrap-extended/dropdown"; 13 | @import "_bootstrap-extended/button-group"; 14 | @import "_bootstrap-extended/nav"; 15 | @import "_bootstrap-extended/navbar"; 16 | @import "_bootstrap-extended/card"; 17 | @import "_bootstrap-extended/accordion"; 18 | @import "_bootstrap-extended/breadcrumb"; 19 | @import "_bootstrap-extended/pagination"; 20 | @import "_bootstrap-extended/badge"; 21 | @import "_bootstrap-extended/alert"; 22 | @import "_bootstrap-extended/progress"; 23 | @import "_bootstrap-extended/list-group"; 24 | @import "_bootstrap-extended/toasts"; 25 | @import "_bootstrap-extended/modal"; 26 | @import "_bootstrap-extended/tooltip"; 27 | @import "_bootstrap-extended/popover"; 28 | @import "_bootstrap-extended/carousel"; 29 | @import "_bootstrap-extended/spinners"; 30 | @import "_bootstrap-extended/offcanvas"; 31 | 32 | // Helpers 33 | @import "_bootstrap-extended/helpers"; 34 | 35 | // Utilities 36 | @import "bootstrap/scss/utilities/api"; 37 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_accordion.scss: -------------------------------------------------------------------------------- 1 | // Accordions 2 | // ******************************************************************************* 3 | .accordion { 4 | --#{$prefix}accordion-box-shadow: #{$box-shadow-sm}; 5 | --#{$prefix}accordion-active-box-shadow: #{$box-shadow}; 6 | --#{$prefix}accordion-active-bg: var(--#{$prefix}accordion-bg); 7 | --#{$prefix}accordion-btn-active-bg: var(--#{$prefix}accordion-active-bg); 8 | --#{$prefix}accordion-btn-focus-box-shadow: none; 9 | --#{$prefix}accordion-btn-focus-shadow-width: 0; 10 | 11 | .accordion-button { 12 | &::after { 13 | background: var(--#{$prefix}accordion-btn-color); 14 | mask-image: var(--#{$prefix}accordion-btn-icon); 15 | mask-repeat: no-repeat; 16 | mask-size: 100% 100%; 17 | } 18 | &:not(.collapsed) { 19 | &::after { 20 | background: var(--#{$prefix}accordion-btn-color); 21 | mask-image: var(--#{$prefix}accordion-btn-active-icon); 22 | } 23 | } 24 | } 25 | 26 | &.accordion-without-arrow { 27 | .accordion-button::after { 28 | background: none; 29 | } 30 | } 31 | & .accordion-item { 32 | @include border-radius(var(--#{$prefix}accordion-border-radius)); 33 | > .accordion-header .accordion-button { 34 | @include border-radius(var(--#{$prefix}accordion-inner-border-radius)); 35 | } 36 | &:not(:first-of-type) { 37 | border-block-start: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); 38 | } 39 | &:not(:last-of-type) { 40 | margin-block-end: $spacer * .5; 41 | } 42 | } 43 | } 44 | 45 | .accordion-item { 46 | box-shadow: var(--#{$prefix}accordion-box-shadow); 47 | &.active { 48 | background-color: var(--#{$prefix}accordion-active-bg); 49 | box-shadow: var(--#{$prefix}accordion-active-box-shadow); 50 | } 51 | } 52 | 53 | .accordion-header { 54 | line-height: $line-height-base; 55 | & + .accordion-collapse .accordion-body { 56 | padding-block-start: 0; 57 | padding-inline-start: $accordion-padding-x; 58 | } 59 | } 60 | 61 | /* Accordion border radius */ 62 | .accordion-button { 63 | font-weight: inherit; 64 | padding-inline-end: 1.1875rem; 65 | &::after{ 66 | margin-inline-end: initial; 67 | margin-inline-start: auto; 68 | } 69 | &:not(.collapsed) { 70 | background-color: var(--#{$prefix}accordion-btn-active-bg); 71 | box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-btn-focus-shadow-width)) 0 var(--#{$prefix}accordion-border-color); 72 | padding-block-end: .793rem; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_alert.scss: -------------------------------------------------------------------------------- 1 | // Alerts 2 | // ******************************************************************************* 3 | 4 | /* Alert icon styles */ 5 | .alert { 6 | --#{$prefix}alert-link-hover-color: var(--#{$prefix}primary); 7 | --#{$prefix}alert-hr: var(--#{$prefix}black); 8 | --#{$prefix}alert-icon-color: var(--#{$prefix}white); 9 | --#{$prefix}alert-icon-bg: var(--#{$prefix}black); 10 | --#{$prefix}alert-icon-shadow-color: var(--#{$prefix}primary); 11 | --#{$prefix}alert-icon-shadow-scale: 16%; 12 | --#{$prefix}alert-close-icon: var(--#{$prefix}black); 13 | line-height: 1.375rem; 14 | &[class*="alert-"] { 15 | hr { 16 | background-color: var(--#{$prefix}alert-hr); 17 | color: var(--#{$prefix}alert-hr); 18 | } 19 | } 20 | .alert-link { 21 | &:hover { 22 | color: var(--#{$prefix}alert-link-hover-color); 23 | } 24 | } 25 | } 26 | 27 | /* Adjust close link position */ 28 | .alert-dismissible { 29 | padding-inline-end: $alert-dismissible-padding-r; 30 | padding-inline-start: $alert-padding-x; 31 | .btn-close { 32 | padding: 0; 33 | background: var(--#{$prefix}alert-close-icon); 34 | block-size: .8125rem; 35 | filter: none; 36 | inline-size: .8125rem; 37 | inset-inline: auto 0; 38 | margin-block: calc(#{$alert-padding-y} * 1.37); 39 | margin-inline: calc(#{$alert-padding-x} * .9); 40 | mask-image: str-replace($btn-close-bg, "#{$btn-close-color}", currentColor); 41 | mask-repeat: no-repeat; 42 | mask-size: 100% 100%; 43 | } 44 | } 45 | 46 | // scss-docs-start alert-modifiers 47 | 48 | // Generate contextual modifier classes for colorizing the alert 49 | @each $state in map-keys($theme-colors) { 50 | .alert-#{$state} { 51 | @if $state == "light" { 52 | --#{$prefix}alert-color: var(--#{$prefix}#{$state}-contrast); 53 | --#{$prefix}alert-close-icon: var(--#{$prefix}#{$state}-contrast); 54 | } @else { 55 | --#{$prefix}alert-color: var(--#{$prefix}#{$state}); 56 | --#{$prefix}alert-close-icon: var(--#{$prefix}#{$state}); 57 | } 58 | --#{$prefix}alert-icon-shadow-color: var(--#{$prefix}#{$state}-rgb); 59 | --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-bg-subtle); 60 | --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}); 61 | --#{$prefix}alert-link-hover-color: var(--#{$prefix}#{$state}); 62 | --#{$prefix}alert-hr: var(--#{$prefix}#{$state}); 63 | --#{$prefix}alert-icon-bg: var(--#{$prefix}#{$state}); 64 | } 65 | } 66 | 67 | // scss-docs-end alert-modifiers 68 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_badge.scss: -------------------------------------------------------------------------------- 1 | // Badges 2 | // ? Bootstrap use bg-label-variant and bg color for solid and label style, hence we have not created mixin for that. 3 | // ******************************************************************************* 4 | 5 | .badge { 6 | --#{$prefix}badge-border-width: #{$badge-border-width}; 7 | --#{$prefix}badge-border-color: var(--#{$prefix}primary); 8 | --#{$prefix}badge-bg-color: #{$badge-bg-color}; 9 | border: var(--#{$prefix}badge-border-width) var(--#{$prefix}border-style) var(--#{$prefix}badge-border-color); 10 | background-color: var(--#{$prefix}badge-bg-color); 11 | } 12 | 13 | /* Badge Center Style */ 14 | 15 | .badge-center { 16 | display: inline-flex; 17 | align-items: center; 18 | justify-content: center; 19 | padding: 0; 20 | block-size: #{$badge-height}; 21 | inline-size: #{$badge-width}; 22 | --#{$prefix}badge-font-size: #{$badge-center-font-size}; 23 | .icon-base { 24 | @include icon-base(.875rem); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_breadcrumb.scss: -------------------------------------------------------------------------------- 1 | // Breadcrumbs 2 | // ******************************************************************************* 3 | 4 | 5 | .breadcrumb { 6 | --#{$prefix}breadcrumb-color: #{$breadcrumb-color}; 7 | } 8 | 9 | .breadcrumb-item { 10 | line-height: 1.5rem; 11 | a { 12 | color: var(--#{$prefix}breadcrumb-color); 13 | 14 | &:hover, 15 | &:focus { 16 | color: var(--#{$prefix}breadcrumb-item-active-color); 17 | } 18 | } 19 | .icon-base.breadcrumb-icon { 20 | color: var(--#{$prefix}breadcrumb-divider-color); 21 | margin-inline-start: $breadcrumb-item-padding-x; 22 | } 23 | } 24 | 25 | .breadcrumb-item.active a { 26 | &, 27 | &:hover, 28 | &:focus, 29 | &:active { 30 | color: inherit; 31 | } 32 | } 33 | 34 | .breadcrumb-custom-icon .breadcrumb-item + .breadcrumb-item::before { 35 | content: none !important; 36 | } 37 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_card.scss: -------------------------------------------------------------------------------- 1 | // Cards 2 | // ******************************************************************************* 3 | 4 | .card { 5 | --#{$prefix}card-hover-box-shadow: #{$box-shadow-lg}; 6 | --#{$prefix}card-border-bottom-color: #{$card-border-color}; 7 | --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; 8 | box-shadow: var(--#{$prefix}card-box-shadow); 9 | 10 | .card-header + .card-body, 11 | .card-header + .card-content > .card-body:first-of-type, 12 | .card-header + .card-footer, 13 | .card-body + .card-footer { 14 | padding-block-start: 0; 15 | } 16 | 17 | .card-header, 18 | .card-footer { 19 | --#{$prefix}card-border-width: #{$card-border-width}; 20 | } 21 | 22 | .card-link { 23 | display: inline-block; 24 | + .card-link { 25 | margin-inline: $card-spacer-x 0; 26 | } 27 | } 28 | 29 | hr { 30 | color: var(--#{$prefix}card-border-color); 31 | } 32 | 33 | /* List groups */ 34 | > .list-group { 35 | border-block-end-width: $border-width; 36 | border-block-start-width: $border-width; 37 | .list-group-item { 38 | padding-inline: $card-spacer-x; 39 | } 40 | } 41 | 42 | .collapse > .card-body, 43 | .collapsing > .card-body { 44 | padding-block-start: 0; 45 | } 46 | } 47 | 48 | /* card-subtitle */ 49 | .card-subtitle { 50 | font-weight: $font-weight-normal; 51 | } 52 | 53 | /* adding class with card background color */ 54 | .bg-card { 55 | background-color: var(--#{$prefix}card-bg); 56 | } 57 | 58 | /* Card header elements 59 | ******************************************************** */ 60 | .card-title { 61 | &:not(:is(h1, h2, h3, h4, h5, h6)) { 62 | color: var(--#{$prefix}body-color); 63 | } 64 | } 65 | 66 | /* Horizontal card radius issue fix 67 | ******************************************************** */ 68 | .card-img-left, 69 | .card-img-right { 70 | block-size: 100%; 71 | object-fit: cover; 72 | } 73 | .card-img-left { 74 | @include border-start-radius($card-inner-border-radius); 75 | @include border-end-radius(0); 76 | 77 | @include media-breakpoint-down(md) { 78 | @include border-top-radius($card-inner-border-radius); 79 | @include border-bottom-radius(0); 80 | } 81 | } 82 | 83 | .card-img-right { 84 | @include border-end-radius($card-inner-border-radius); 85 | @include border-start-radius(0); 86 | @include media-breakpoint-down(md) { 87 | @include border-bottom-radius($card-inner-border-radius); 88 | @include border-top-radius(0); 89 | } 90 | } 91 | 92 | // Card group 93 | // ******************************************************** 94 | .card-group { 95 | --#{$prefix}card-box-shadow: #{$card-box-shadow}; 96 | --#{$prefix}card-bg: #{$card-bg}; 97 | @include media-breakpoint-up(sm) { 98 | @include border-radius($card-border-radius); 99 | background-color: var(--#{$prefix}card-bg); 100 | box-shadow: var(--#{$prefix}card-box-shadow); 101 | .card { 102 | box-shadow: none; 103 | + .card { 104 | border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); 105 | border-inline-start: 0; 106 | margin-inline: 0; 107 | } 108 | .card-img-top, 109 | .card-header, 110 | .card-img-bottom, 111 | .card-footer { 112 | @include border-radius(0); 113 | } 114 | &:is(:last-child) { 115 | .card-img-top, 116 | .card-header { 117 | @include border-top-end-radius($card-border-radius); 118 | } 119 | .card-img-bottom, 120 | .card-footer { 121 | @include border-bottom-end-radius($card-border-radius); 122 | } 123 | } 124 | &:is(:first-child) { 125 | .card-img-top, 126 | .card-header { 127 | @include border-top-start-radius($card-border-radius); 128 | } 129 | .card-img-bottom, 130 | .card-footer { 131 | @include border-bottom-start-radius($card-border-radius); 132 | } 133 | } 134 | } 135 | } 136 | } 137 | 138 | /* Card action */ 139 | .card-action { 140 | /* Card header */ 141 | .card-header { 142 | display: flex; 143 | &.collapsed { 144 | border-block-end: 0; 145 | } 146 | } 147 | 148 | .collapse > .card-body, 149 | .collapsing > .card-body { 150 | padding-block-start: 0; 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_carousel.scss: -------------------------------------------------------------------------------- 1 | // Carousel 2 | // ******************************************************************************* 3 | 4 | .carousel { 5 | .carousel-item.active, 6 | .carousel-item.carousel-item-start { 7 | h1, 8 | .h1, 9 | h2, 10 | .h2, 11 | h3, 12 | .h3, 13 | h4, 14 | .h4, 15 | h5, 16 | .h5, 17 | h6, 18 | .h6 { 19 | color: $carousel-caption-color; 20 | } 21 | } 22 | .carousel-control-prev-icon, 23 | .carousel-control-next-icon { 24 | filter: invert(1); 25 | } 26 | } 27 | 28 | .carousel.carousel-dark { 29 | .carousel-item.active, 30 | .carousel-item.carousel-item-start { 31 | h1, 32 | .h1, 33 | h2, 34 | .h2, 35 | h3, 36 | .h3, 37 | h4, 38 | .h4, 39 | h5, 40 | .h5, 41 | h6, 42 | .h6 { 43 | color: $carousel-dark-caption-color; 44 | } 45 | } 46 | .carousel-control-prev-icon, 47 | .carousel-control-next-icon { 48 | filter: invert(0); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_dropdown.scss: -------------------------------------------------------------------------------- 1 | // Dropdowns 2 | // ***************************************************************** 3 | 4 | .dropdown-menu { 5 | box-shadow: var(--#{$prefix}dropdown-box-shadow); 6 | margin-block-start: 1px !important; 7 | 8 | text-align: start; 9 | > li:not(.disabled) > a:not(.dropdown-item):active, 10 | > li:not(.disabled) > a:not(.dropdown-item).active, 11 | > li.active:not(.disabled) > a:not(.dropdown-item) { 12 | background-color: var(--#{$prefix}dropdown-link-active-bg); 13 | color: var(--#{$prefix}dropdown-link-active-color); 14 | } 15 | } 16 | 17 | .btn-xs.dropdown-toggle::after { 18 | @include caret-down(.45em); 19 | } 20 | 21 | /* Split dropdowns */ 22 | .dropdown-toggle-split { 23 | &::after, 24 | .dropup &::after, 25 | .dropend &::after { 26 | margin-inline: 0; 27 | } 28 | .dropstart &::before { 29 | margin-inline: 0; 30 | } 31 | } 32 | 33 | /* Dropdown item line height */ 34 | .dropdown-item { 35 | li:not(:first-child) &, 36 | .dropdown-menu &:not(:first-child) { 37 | margin-block-start: 2px; 38 | } 39 | &.text-danger:active { 40 | color: var(--#{$prefix}primary) !important; 41 | } 42 | } 43 | 44 | /* Hidden dropdown toggle arrow */ 45 | .dropdown-toggle.hide-arrow, 46 | .dropdown-toggle-hide-arrow > .dropdown-toggle { 47 | &::before, 48 | &::after { 49 | display: none; 50 | } 51 | } 52 | 53 | @each $breakpoint in map-keys($grid-breakpoints) { 54 | @include media-breakpoint-up($breakpoint) { 55 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints); 56 | 57 | .dropdown-menu#{$infix}-start { 58 | --bs-position: start; 59 | &[data-bs-popper] { 60 | inset-inline: 0 auto; 61 | } 62 | } 63 | 64 | .dropdown-menu#{$infix}-end { 65 | --bs-position: end; 66 | &[data-bs-popper] { 67 | inset-inline: auto 0; 68 | } 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_forms.scss: -------------------------------------------------------------------------------- 1 | // Forms 2 | // ***************************************************************** 3 | 4 | @import "forms/labels"; 5 | @import "forms/form-control"; 6 | @import "forms/form-select"; 7 | @import "forms/form-check"; 8 | @import "forms/form-range"; 9 | @import "forms/input-group"; 10 | @import "forms/floating-labels"; 11 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_functions.scss: -------------------------------------------------------------------------------- 1 | // Functions 2 | 3 | // Remove the unit of a length 4 | @function strip-unit($number) { 5 | @if type-of($number) == "number" and not unitless($number) { 6 | @return divide($number, ($number * 0 + 1)); 7 | } 8 | 9 | @return $number; 10 | } 11 | 12 | // Convert size px to rem 13 | @function px-to-rem($value) { 14 | // Assumes the browser default font size = `16px` 15 | @return (divide(strip-unit($value), 16)) * 1rem; 16 | } 17 | 18 | // Convert size rem to px 19 | @function rem-to-px($value) { 20 | // Assumes the browser default font size = `16px` 21 | @return (strip-unit($value) * 16) * 1px; 22 | } 23 | 24 | // Colors 25 | // ******************************************************************************* 26 | 27 | // ? Override shade, tint and shift function with custom background color option i.e $card-bg to make it similar like design 28 | // Shade a color: mix a color with background/white 29 | @function tint-color($color, $weight, $background: null) { 30 | $background: if($background, $background, #fff); 31 | 32 | @return mix($background, $color, $weight); 33 | } 34 | 35 | // Shade a color: mix a color with background/black 36 | @function shade-color($color, $weight, $background: null) { 37 | $background: if($background, $background, #000); 38 | 39 | @return mix($background, $color, $weight); 40 | } 41 | 42 | // Shade the color if the weight is positive, else tint it 43 | @function shift-color($color, $weight, $background: null) { 44 | @return if($weight > 0, shade-color($color, $weight, $background), tint-color($color, -$weight)); 45 | } 46 | 47 | 48 | // RGBA to HEX 49 | @function rgba-to-hex($color, $background: #fff) { 50 | @if $color and alpha($color) != 1 { 51 | $percent: alpha($color) * 100%; 52 | $opaque: opacify($color, 1); 53 | 54 | @return mix($opaque, $background, $percent); 55 | } @else { 56 | @return $color; 57 | } 58 | } 59 | 60 | // Calculating Color Contrast 61 | @function contrast-value($color) { 62 | @if $color == transparent { 63 | @return $body-color; 64 | } @else if alpha($color) != 1 { 65 | $color: rgba-to-hex($color); 66 | } 67 | 68 | $r: red($color); 69 | $g: green($color); 70 | $b: blue($color); 71 | 72 | @return divide((($r * 299) + ($g * 587) + ($b * 114)), 1000); 73 | } 74 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_helpers.scss: -------------------------------------------------------------------------------- 1 | @import "helpers/color-bg"; 2 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_include.scss: -------------------------------------------------------------------------------- 1 | // Functions 2 | @import "bootstrap/scss/functions"; // Bootstrap core functions 3 | @import "functions"; // Bootstrap extended functions 4 | 5 | // Variables 6 | @import "../_custom-variables/bootstrap-extended"; // Bootstrap extended custom variable (for customization purpose) 7 | @import "variables"; // Bootstrap extended variable 8 | @import "bootstrap/scss/variables"; // Bootstrap core variable 9 | @import "bootstrap/scss/maps"; // Bootstrap core maps 10 | 11 | // Mixins 12 | @import "bootstrap/scss/mixins"; // Bootstrap core mixins 13 | @import "mixins"; // Bootstrap extended mixins 14 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_list-group.scss: -------------------------------------------------------------------------------- 1 | /* List groups 2 | ******************************************************************************* */ 3 | 4 | /* List Group Mixin */ 5 | .list-group { 6 | --#{$prefix}list-group-timeline-bg: var(--#{$prefix}primary); 7 | --#{$prefix}list-group-border-color: var(--#{$prefix}border-color); 8 | --#{$prefix}list-group-active-border-color: var(--#{$prefix}border-color); 9 | --#{$prefix}list-group-action-hover-color: var(--#{$prefix}body-color); 10 | --#{$prefix}list-group-action-active-color: var(--#{$prefix}body-color); 11 | --#{$prefix}list-group-active-bg: var(--#{$prefix}primary-bg-subtle); 12 | 13 | 14 | .list-group-item { 15 | line-height: 1.375rem; 16 | padding-block-end: calc($list-group-item-padding-y - 1px); 17 | } 18 | &:not([class*="list-group-flush"]) .list-group-item:first-of-type { 19 | padding-block-start: calc($list-group-item-padding-y - 1px); 20 | } 21 | &[class*="list-group-flush"] .list-group-item:last-of-type { 22 | padding-block-end: $list-group-item-padding-y; 23 | } 24 | &[class*="list-group-horizontal-md"] .list-group-item { 25 | @include media-breakpoint-up(md) { 26 | padding-block-start: calc($list-group-item-padding-y - 1px); 27 | } 28 | } 29 | 30 | .list-group-item.active { 31 | h1, 32 | .h1, 33 | h2, 34 | .h2, 35 | h3, 36 | .h3, 37 | h4, 38 | .h4, 39 | h5, 40 | .h5, 41 | h6, 42 | .h6 { 43 | color: var(--#{$prefix}primary); 44 | } 45 | &, 46 | &:hover, 47 | &:focus { 48 | --#{$prefix}list-group-color: var(--#{$prefix}white); 49 | } 50 | } 51 | } 52 | 53 | // scss-docs-start list-group-modifiers 54 | 55 | @each $state in map-keys($theme-colors) { 56 | .list-group-item-#{$state} { 57 | --#{$prefix}list-group-border-color: var(--#{$prefix}#{$state}); 58 | --#{$prefix}list-group-active-border-color: var(--#{$prefix}#{$state}); 59 | --#{$prefix}list-group-active-bg: var(--#{$prefix}#{$state}-bg-subtle); 60 | --#{$prefix}list-group-color: var(--#{$prefix}#{$state}-text-emphasis); 61 | --#{$prefix}list-group-action-hover-color: var(--#{$prefix}#{$state}-text-emphasis); 62 | --#{$prefix}list-group-action-active-color: var(--#{$prefix}#{$state}-text-emphasis); 63 | } 64 | } 65 | 66 | // scss-docs-end list-group-modifiers 67 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins - Template mixins (custom and overrides) 2 | @import "mixins/caret"; 3 | @import "mixins/misc"; 4 | @import "mixins/border-radius"; 5 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_modal.scss: -------------------------------------------------------------------------------- 1 | /* Modals 2 | ******************************************************************************* */ 3 | 4 | /* Modal Shadow */ 5 | .modal-content { 6 | box-shadow: var(--#{$prefix}modal-box-shadow); 7 | } 8 | 9 | .modal { 10 | .btn-close { 11 | padding: .563rem; 12 | background-color: var(--#{$prefix}paper-bg); 13 | background-image: none; 14 | box-shadow: var(--#{$prefix}box-shadow-xs); 15 | filter: none; 16 | opacity: 1; 17 | transform: translate(23px, -25px); 18 | @include border-radius($border-radius-sm); 19 | @include transition(all .23s ease .1s); 20 | 21 | /* For hover effect of close btn */ 22 | &:hover, 23 | &:focus, 24 | &:active { 25 | opacity: 1; 26 | outline: 0; 27 | transform: translate(20px, -20px); 28 | } 29 | &::before{ 30 | display: block; 31 | background-color: var(--#{$prefix}secondary-color); 32 | block-size: .6875rem; 33 | content: ""; 34 | inline-size: .6875rem; 35 | mask-image: str-replace(str-replace($btn-close-bg, "#{$btn-close-color}", currentColor), "#", "%23"); 36 | mask-repeat: no-repeat; 37 | mask-size: 100% 100%; 38 | } 39 | } 40 | .modal-header { 41 | position: relative; 42 | .btn-close { 43 | position: absolute; 44 | inset-block-start: $modal-dialog-margin - .5625rem; 45 | inset-inline-end: $modal-dialog-margin - .6875rem; 46 | } 47 | } 48 | 49 | /* modal footer */ 50 | .modal-footer { 51 | padding: $modal-footer-padding; 52 | > * { 53 | margin-block: 0; 54 | &:last-child { 55 | margin-inline-end: 0; 56 | } 57 | &:first-child { 58 | margin-inline-start: 0; 59 | } 60 | } 61 | } 62 | 63 | /* 64 | ! remove close button animation & shadow for .modal-dialog-scrollable, .modal-fullscreen, .modal-top modal */ 65 | .modal-dialog-scrollable, 66 | .modal-fullscreen, 67 | &.modal-top { 68 | .btn-close { 69 | box-shadow: none; 70 | transform: translate(0, 0); 71 | &:hover { 72 | transform: translate(0, 0); 73 | } 74 | } 75 | } 76 | } 77 | 78 | /* Top modals 79 | ******************************************************************************* */ 80 | 81 | .modal-top { 82 | .modal-dialog { 83 | margin-block-start: 0; 84 | } 85 | 86 | .modal-content { 87 | @include border-top-radius(0); 88 | } 89 | } 90 | 91 | /* Modal Animations 92 | ****************************************************************************** */ 93 | 94 | /* Slide from Top */ 95 | .modal-top.fade .modal-dialog, 96 | .modal-top .modal.fade .modal-dialog { 97 | transform: translateY(-100%); 98 | } 99 | 100 | .modal-top.show .modal-dialog, 101 | .modal-top .modal.show .modal-dialog { 102 | transform: translateY(0); 103 | } 104 | 105 | /* Responsive 106 | ******************************************************************************* */ 107 | 108 | @include media-breakpoint-down(md) { 109 | .modal { 110 | .modal-dialog:not(.modal-fullscreen) { 111 | padding-block: 0; 112 | padding-inline: .75rem; 113 | } 114 | } 115 | } 116 | 117 | @include media-breakpoint-up(sm) { 118 | .modal-content { 119 | box-shadow: var(--#{$prefix}modal-box-shadow); 120 | } 121 | 122 | .modal-dialog.modal-sm { 123 | max-inline-size: $modal-sm; 124 | } 125 | } 126 | 127 | @include media-breakpoint-up(xl) { 128 | .modal-xl .modal-dialog { 129 | max-inline-size: $modal-xl; 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_navbar.scss: -------------------------------------------------------------------------------- 1 | /* Navbar 2 | ******************************************************************************* */ 3 | .layout-navbar { 4 | background-color: var(--#{$prefix}paper-bg); 5 | } 6 | 7 | /* IE fix */ 8 | 9 | .navbar { 10 | &.bg-body-tertiary { 11 | --#{$prefix}navbar-color: var(--#{$prefix}body-color); 12 | --#{$prefix}navbar-hover-color: var(--#{$prefix}heading-color); 13 | --#{$prefix}navbar-disabled-color: color-mix(in sRGB, var(--#{$prefix}base-color) 40%, var(--#{$prefix}paper-bg)); 14 | --#{$prefix}navbar-active-color: var(--#{$prefix}heading-color); 15 | --#{$prefix}navbar-brand-color: var(--#{$prefix}heading-color); 16 | --#{$prefix}navbar-brand-hover-color: color-mix(in sRGB, var(--#{$prefix}base-color) 70%, var(--#{$prefix}paper-bg)); 17 | } 18 | &.bg-light { 19 | --#{$prefix}navbar-color: var(--#{$prefix}body-color); 20 | --#{$prefix}navbar-hover-color: var(--#{$prefix}heading-color); 21 | --#{$prefix}navbar-disabled-color: color-mix(in sRGB, var(--#{$prefix}base-color) 40%, var(--#{$prefix}paper-bg)); 22 | --#{$prefix}navbar-active-color: var(--#{$prefix}heading-color); 23 | --#{$prefix}navbar-brand-color: var(--#{$prefix}heading-color); 24 | --#{$prefix}navbar-brand-hover-color: color-mix(in sRGB, var(--#{$prefix}base-color) 70%, var(--#{$prefix}paper-bg)); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_offcanvas.scss: -------------------------------------------------------------------------------- 1 | /* Offcanvas 2 | ******************************************************************************* */ 3 | 4 | .offcanvas { 5 | box-shadow: var(--#{$prefix}offcanvas-box-shadow); 6 | .offcanvas-header { 7 | padding-block-end: $offcanvas-padding-y * .5; 8 | } 9 | } 10 | 11 | /* styles for dark offcanvas */ 12 | [data-bs-theme="dark"].offcanvas { 13 | background-color: #2b2c40; 14 | color: #b2b2c4; 15 | .offcanvas-title { 16 | color: #d5d5e2; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_pagination.scss: -------------------------------------------------------------------------------- 1 | /* Pagination 2 | ******************************************************************************* */ 3 | 4 | .pagination { 5 | --#{$prefix}pagination-box-shadow-color: #{$pagination-box-shadow-color}; 6 | padding-inline-start: 0; 7 | .page-link { 8 | border-color: transparent; 9 | } 10 | &.pagination-lg { 11 | --#{$prefix}pagination-font-size: #{$font-size-lg}; 12 | } 13 | &.pagination-sm { 14 | --#{$prefix}pagination-font-size: #{$font-size-sm}; 15 | } 16 | .page-item .page-link, 17 | & li > a:not(.page-link) { 18 | &:focus { 19 | color: var(--#{$prefix}pagination-focus-color); 20 | } 21 | } 22 | .page-item.active .page-link, 23 | & li.active > a:not(.page-link) { 24 | box-shadow: 0 .125rem .25rem 0 rgba(var(--#{$prefix}pagination-box-shadow-color), .4); 25 | color: var(--#{$prefix}pagination-active-color); 26 | } 27 | } 28 | 29 | /* Pagination next, prev, first & last css padding */ 30 | .page-item { 31 | &.disabled, 32 | &[disabled] { 33 | .page-link { 34 | opacity: $pagination-disabled-opacity; 35 | pointer-events: none; 36 | } 37 | } 38 | } 39 | .page-item:last-child .icon-base { 40 | transform: translateX(7%); 41 | } 42 | 43 | /* Pagination basic style */ 44 | .page-link, 45 | .page-link > a { 46 | @include border-radius($border-radius); 47 | display: inline-flex !important; 48 | align-items: center; 49 | justify-content: center; 50 | min-block-size: 51 | calc( 52 | #{"#{($font-size-base * $pagination-line-height) + ($pagination-padding-y * 2)} + calc(#{$pagination-border-width} * 2)"} 53 | ); 54 | min-inline-size: 55 | calc( 56 | #{"#{($font-size-base * $pagination-line-height) + ($pagination-padding-x * 1.923)} + calc(#{$pagination-border-width} * 2)"} 57 | ); 58 | } 59 | 60 | /* Sizing 61 | ******************************************************************************* */ 62 | 63 | /* Pagination Large */ 64 | .pagination-lg .page-link, 65 | .pagination-lg > li > a:not(.page-link) { 66 | min-block-size: 67 | calc( 68 | #{"#{($font-size-base * $pagination-line-height) + ($pagination-padding-y-lg * 2.33)} + calc(#{$pagination-border-width} * 2)"} 69 | ); 70 | min-inline-size: 71 | calc( 72 | #{"#{($font-size-base * $pagination-line-height) + ($pagination-padding-x-lg * 1.615)} + calc(#{$pagination-border-width} * 2)"} 73 | ); 74 | } 75 | 76 | .pagination-lg > .page-item { 77 | &.first, 78 | &.last, 79 | &.next, 80 | &.prev, 81 | &.previous { 82 | .page-link { 83 | padding-inline: $pagination-padding-y-lg - .0845rem; 84 | } 85 | } 86 | } 87 | 88 | /* Pagination Small */ 89 | .pagination-sm .page-link, 90 | .pagination-sm > li > a:not(.page-link) { 91 | min-block-size: 92 | calc( 93 | #{"#{($font-size-sm * $pagination-line-height) + ($pagination-padding-y-sm * 2)} + calc(#{$pagination-border-width} * 2)"} 94 | ); 95 | min-inline-size: 96 | calc( 97 | #{"#{($font-size-sm * $pagination-line-height) + ($pagination-padding-x-sm * 2.356)} + calc(#{$pagination-border-width} * 2)"} 98 | ); 99 | } 100 | 101 | .pagination-sm > .page-item { 102 | &.first, 103 | &.last, 104 | &.next, 105 | &.prev, 106 | &.previous { 107 | .page-link { 108 | padding-block: $pagination-padding-y-sm - .1055rem; 109 | padding-inline: $pagination-padding-y-sm - .1055rem; 110 | } 111 | } 112 | } 113 | 114 | /* Add spacing between pagination items */ 115 | .page-item + .page-item .page-link, 116 | .pagination li + li > a:not(.page-link) { 117 | .pagination-sm & { 118 | margin-inline-start: .25rem; 119 | } 120 | .pagination-lg & { 121 | margin-inline-start: .5rem; 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_popover.scss: -------------------------------------------------------------------------------- 1 | /* Popovers 2 | ******************************************************************************* */ 3 | 4 | .modal-open .popover { 5 | z-index: $zindex-modal + 1; 6 | } 7 | .popover:not(.custom-popover) { 8 | --#{$prefix}popover-header-bg: transparent; 9 | .popover-header { 10 | --#{$prefix}popover-border-width: 0; 11 | padding-block-end: 0; 12 | } 13 | .popover-arrow::after { 14 | --#{$prefix}popover-arrow-border: var(--#{$prefix}popover-bg); 15 | } 16 | } 17 | .popover:has([class^="popover-"]):not(.custom-popover) { 18 | --#{$prefix}popover-border-color: transparent; 19 | --#{$prefix}popover-header-bg: transparent; 20 | .popover-body { 21 | background-color: transparent; 22 | } 23 | } 24 | .popover:has([class^="popover-header-"]) { 25 | --#{$prefix}popover-border-color: #{$popover-border-color}; 26 | --#{$prefix}popover-body-color: var(--#{$prefix}body-color); 27 | --#{$prefix}popover-header-bg: var(--#{$prefix}primary); 28 | } 29 | 30 | .popover { 31 | box-shadow: var(--#{$prefix}popover-box-shadow); 32 | 33 | .popover-arrow { 34 | z-index: 1; 35 | } 36 | 37 | &:not(.custom-popover).bs-popover-auto { 38 | > .popover-arrow::before { 39 | --#{$prefix}popover-bg: #{rgba(var(--#{$prefix}white-rgb), .1)}; 40 | } 41 | &[data-popper-placement="bottom"] > { 42 | .popover-arrow { 43 | &::after { 44 | border-block-end-color: var(--#{$prefix}popover-arrow-border); 45 | inset-block-start: 1px; 46 | } 47 | } 48 | .popover-header::before { 49 | --#{$prefix}popover-border-width: 0; 50 | } 51 | } 52 | } 53 | &.popover-dark { 54 | --#{$prefix}popover-bg: color-mix(in sRGB, var(--#{$prefix}base-color) 90%, var(--#{$prefix}paper-bg)); 55 | } 56 | } 57 | 58 | /* custom popover 59 | ******************************************************************************* */ 60 | .custom-popover { 61 | --#{$prefix}popover-max-width: 200px; 62 | --#{$prefix}popover-header-color: var(--#{$prefix}white); 63 | --#{$prefix}popover-body-padding-x: 1rem; 64 | --#{$prefix}popover-body-padding-y: .5rem; 65 | .popover-header { 66 | --#{$prefix}popover-header-bg: var(--#{$prefix}primary); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_progress.scss: -------------------------------------------------------------------------------- 1 | /* Progress 2 | ******************************************************************************* */ 3 | 4 | .progress { 5 | --#{$prefix}progress-bar-shadow-color: #{$progress-bar-shadow-color}; 6 | overflow: initial; 7 | .progress-bar { 8 | background-color: var(--#{$prefix}primary); 9 | box-shadow: 0 2px 4px 0 var(--#{$prefix}progress-bar-shadow-color); 10 | color: var(--#{$prefix}white); 11 | } 12 | 13 | .progress-bar:first-child { 14 | @include border-start-radius($progress-border-radius); 15 | } 16 | .progress-bar:last-child { 17 | @include border-end-radius($progress-border-radius); 18 | } 19 | } 20 | 21 | @each $state in map-keys($theme-colors) { 22 | .progress-bar.bg-#{$state} { 23 | --#{$prefix}progress-bar-shadow-color: rgba(var(--#{$prefix}#{$state}-rgb), .4); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_reboot.scss: -------------------------------------------------------------------------------- 1 | /* Reboot */ 2 | 3 | b, 4 | strong { 5 | font-weight: $font-weight-bold; 6 | } 7 | 8 | caption { 9 | text-align: start; 10 | } 11 | 12 | dd { 13 | margin-inline-start: 0; 14 | } 15 | 16 | // TODO: checkinbs6 - a new variable has been created because the $link-color scss variable was being used,and changing the color did not reflect the update. this new variable ensures that future color changes are applied correctly. 17 | a { 18 | color: var(--#{$prefix}custom-link-color); 19 | &:hover { 20 | color: color-mix(in sRGB, var(--#{$prefix}custom-link-color) 80%, var(--#{$prefix}base-color)); 21 | } 22 | &:not([href]) { 23 | &, 24 | &:hover { 25 | color: inherit; 26 | text-decoration: none; 27 | } 28 | } 29 | } 30 | 31 | /* Autofill input bg and text color issue on different OS and browsers */ 32 | input:-webkit-autofill, 33 | input:-webkit-autofill:hover, 34 | input:-webkit-autofill:focus, 35 | textarea:-webkit-autofill, 36 | textarea:-webkit-autofill:hover, 37 | textarea:-webkit-autofill:focus, 38 | select:-webkit-autofill, 39 | select:-webkit-autofill:hover, 40 | select:-webkit-autofill:focus, 41 | input:-internal-autofill-selected { 42 | background-clip: text !important; 43 | } 44 | 45 | h1 { 46 | line-height: $h1-line-height; 47 | } 48 | 49 | h2 { 50 | line-height: $h2-line-height; 51 | } 52 | 53 | h3 { 54 | line-height: $h3-line-height; 55 | } 56 | 57 | h4 { 58 | line-height: $h4-line-height; 59 | } 60 | 61 | h5 { 62 | line-height: $h5-line-height; 63 | } 64 | 65 | h6 { 66 | line-height: $h6-line-height; 67 | } 68 | 69 | img[data-app-light-img][data-app-dark-img] { 70 | visibility: visible; 71 | } 72 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_root.scss: -------------------------------------------------------------------------------- 1 | /* The color-scheme CSS property https://web.dev/color-scheme/ */ 2 | :root{ 3 | // variable prefix 4 | --prefix: #{$prefix}; 5 | 6 | --#{$prefix}pure-black: #{$pure-black}; 7 | 8 | // Icons sizing 9 | --#{$prefix}icon-size: #{$icon-size}; 10 | --#{$prefix}icon-size-xs: #{$icon-size-xs}; 11 | --#{$prefix}icon-size-sm: #{$icon-size-sm}; 12 | --#{$prefix}icon-size-md: #{$icon-size-md}; 13 | --#{$prefix}icon-size-lg: #{$icon-size-lg}; 14 | --#{$prefix}icon-size-xl: #{$icon-size-xl}; 15 | 16 | @function calculate-contrast($color) { 17 | @return if(lightness($color) > 75%, var(--#{$prefix}pure-black), var(--#{$prefix}white)); 18 | } 19 | @each $color, $value in $theme-colors { 20 | // Construct CSS variable names with Sass interpolation 21 | --#{$prefix}#{$color}-contrast: #{calculate-contrast($value)}; 22 | } 23 | 24 | // global custom variables 25 | --#{$prefix}bg-label-tint-amount: #{$bg-label-tint-amount}; 26 | --#{$prefix}border-subtle-amount: #{$border-subtle-amount}; 27 | --#{$prefix}base-color: #{$black}; 28 | --#{$prefix}base-color-rgb: #{$base-rgb}; 29 | --#{$prefix}paper-bg: #{$paper-bg}; 30 | --#{$prefix}paper-bg-rgb: #{$paper-bg-rgb}; 31 | 32 | --#{$prefix}min-contrast-ratio: #{$min-contrast-ratio}; 33 | 34 | // Box-shadow variables 35 | --#{$prefix}box-shadow: #{$box-shadow}; 36 | --#{$prefix}box-shadow-xs: #{$box-shadow-xs}; 37 | --#{$prefix}box-shadow-sm: #{$box-shadow-sm}; 38 | --#{$prefix}box-shadow-lg: #{$box-shadow-lg}; 39 | --#{$prefix}box-shadow-xl: #{$box-shadow-xl}; 40 | 41 | --#{$prefix}floating-component-shadow: #{$floating-component-shadow}; 42 | 43 | // TODO: CheckInBS6 - A new variable has been created because the `$link-color` SCSS #{to-rgb($link-color)} variable was being used, and changing the color did not reflect the update. This new variable ensures that future color changes are applied correctly. 44 | --#{$prefix}custom-link-color: var(--#{$prefix}primary); 45 | 46 | // Navbar 47 | --#{$prefix}navbar-bg: #{$navbar-bg}; 48 | --#{$prefix}navbar-box-shadow: #{$navbar-box-shadow}; 49 | --#{$prefix}navbar-border-width: #{$border-width}; 50 | --#{$prefix}navbar-border-color: #{$navbar-bg}; 51 | 52 | // Menu 53 | --#{$prefix}menu-header-color: #{$navbar-light-color}; 54 | 55 | // Tabs & Pills 56 | --#{$prefix}nav-box-shadow: #{$nav-box-shadow}; 57 | --#{$prefix}nav-border-color: #{$nav-border-color}; 58 | 59 | } 60 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_spinners.scss: -------------------------------------------------------------------------------- 1 | /* Spinners */ 2 | 3 | /* Large size */ 4 | .spinner-border-lg, 5 | .spinner-grow-lg { 6 | --#{$prefix}spinner-border-width: #{$spinner-border-width-lg}; 7 | --#{$prefix}spinner-height: #{$spinner-height-lg}; 8 | --#{$prefix}spinner-width: #{$spinner-width-lg}; 9 | } 10 | 11 | /* Within button 12 | ******************************************************************************* */ 13 | 14 | .btn { 15 | .spinner-border, 16 | .spinner-grow { 17 | --#{$prefix}spinner-height: 1em; 18 | --#{$prefix}spinner-width: 1em; 19 | inset-block-start: -.0625rem; 20 | } 21 | 22 | .spinner-border { 23 | --#{$prefix}spinner-border-width: .15em; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_tables.scss: -------------------------------------------------------------------------------- 1 | /* Tables 2 | ******************************************************************************** */ 3 | 4 | /* ios fix for drodown-menu being clipped off when used in tables */ 5 | .ios .table tr > td .dropdown { 6 | position: relative; 7 | } 8 | 9 | 10 | /* Firefox fix for table head border bottom */ 11 | .table { 12 | > :not(caption) > * > * { 13 | background-clip: padding-box; 14 | } 15 | tr { 16 | > td { 17 | .dropdown { 18 | position: static; 19 | } 20 | } 21 | } 22 | 23 | .btn-icon, 24 | .btn:not([class*="btn-"]) { 25 | color: var(--#{$prefix}table-color); 26 | } 27 | 28 | // Table heading style 29 | th { 30 | color: var(--#{$prefix}heading-color); 31 | font-size: $font-size-sm; 32 | letter-spacing: .2px; 33 | text-transform: uppercase; 34 | } 35 | &:not(.table-borderless):not(.table-without-card, .dataTable) thead th { 36 | border-block-start-width: var(--#{$prefix}border-width); 37 | } 38 | 39 | // Removed left padding from the first column and right padding from the last column 40 | &.table-flush-spacing { 41 | thead, 42 | tbody { 43 | tr > td:first-child { 44 | padding-inline-start: 0; 45 | } 46 | tr > td:last-child { 47 | padding-inline-end: 0; 48 | } 49 | } 50 | } 51 | 52 | // Style for table inside card 53 | .card & { 54 | margin-block-end: 0; 55 | } 56 | 57 | &.table-dark, 58 | .table-dark { 59 | border-color: #{$gray-900}; 60 | th { 61 | --#{$prefix}heading-color: #{$white}; 62 | } 63 | } 64 | &.table-light, 65 | .table-light { 66 | border-color: var(--#{$prefix}border-color); 67 | th { 68 | --#{$prefix}heading-color: var(--#{$prefix}heading-color); 69 | } 70 | } 71 | caption { 72 | padding-block: $table-cell-padding-y; 73 | padding-inline: $table-cell-padding-x; 74 | } 75 | thead tr th { 76 | padding-block: $table-head-padding-y; 77 | } 78 | &.table-borderless:not(.table-sm) { 79 | > :not(thead) > * > * { 80 | padding-block: $table-cell-padding-y + .0313rem; 81 | } 82 | > thead > * > * { 83 | padding-block: $table-head-padding-y + .0313rem; 84 | } 85 | } 86 | } 87 | 88 | /* class for to remove table border bottom */ 89 | .table-border-bottom-0 { 90 | tr:last-child { 91 | td { 92 | border-block-end-width: 0; 93 | } 94 | } 95 | } 96 | 97 | /* class for to remove table border top */ 98 | .table-border-top-0 { 99 | tr:first-child { 100 | td, 101 | th { 102 | border-block-start-width: 0 !important; 103 | } 104 | } 105 | } 106 | 107 | // TODO: CheckInBS6 Review the `table-variants` mixin in Bootstrap 6 and update our overrides if needed to reflect any changes. 108 | 109 | @each $state in map-keys($theme-colors) { 110 | .table-#{$state} { 111 | --#{$prefix}table-bg: rgba(var(--#{$prefix}#{$state}-rgb), .2); 112 | --#{$prefix}table-hover-bg: color-mix(in sRGB, var(--#{$prefix}body-bg) #{$table-hover-bg-factor-amount}, var(--#{$prefix}table-bg)); 113 | --#{$prefix}table-border-color: color-mix(in sRGB, var(--#{$prefix}table-bg) #{$table-border-factor-amount}, var(--#{$prefix}table-color)); 114 | --#{$prefix}table-active-bg: color-mix(in sRGB, var(--#{$prefix}body-bg) #{$table-active-bg-factor-amount}, var(--#{$prefix}table-bg)); 115 | @if $state == "dark" or $state == "light" { 116 | --#{$prefix}table-bg: var(--#{$prefix}#{$state}); 117 | --#{$prefix}table-hover-bg: color-mix(in sRGB, var(--#{$prefix}table-color) 3.5%, var(--#{$prefix}table-bg)); 118 | --#{$prefix}table-active-bg: color-mix(in sRGB, var(--#{$prefix}table-color) 4%, var(--#{$prefix}table-bg)); 119 | } 120 | @if $state == "default" or $state == "active" { 121 | --#{$prefix}table-border-color: #{$gray-200}; 122 | } 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_toasts.scss: -------------------------------------------------------------------------------- 1 | /* Toasts 2 | ******************************************************************************* */ 3 | 4 | .bs-toast[class^="bg-"], 5 | .bs-toast[class*=" bg-"] { 6 | --#{$prefix}toast-header-color: var(--#{$prefix}white); 7 | --#{$prefix}toast-color: var(--#{$prefix}white); 8 | } 9 | 10 | .toast.bs-toast { 11 | --#{$prefix}toast-btn-close-bg: var(--#{$prefix}paper-bg); 12 | --#{$prefix}toast-bg: rgba(var(--#{$prefix}white-rgb), .85); 13 | --#{$prefix}toast-btn-close: #{$btn-close-gray}; 14 | z-index: $zindex-toast; 15 | background-color: var(--#{$prefix}toast-bg) !important; 16 | .toast-header { 17 | position: relative; 18 | padding-block-end: .5rem; 19 | .btn-close { 20 | position: absolute; 21 | padding: .45rem; 22 | background-color: var(--#{$prefix}toast-btn-close-bg); 23 | background-image: var(--#{$prefix}toast-btn-close); 24 | background-size: $toast-btn-close-size; 25 | box-shadow: var(--#{$prefix}toast-box-shadow); 26 | filter: none; 27 | inset-block-start: -8px; 28 | inset-inline-end: 2px; 29 | @include border-radius($border-radius); 30 | @include transition(all .23s ease .1s); 31 | 32 | /* For hover effect of close btn */ 33 | &:hover, 34 | &:focus, 35 | &:active { 36 | opacity: 1; 37 | outline: 0; 38 | } 39 | } 40 | } 41 | .toast-header ~ .toast-body { 42 | padding-block-start: 0; 43 | } 44 | } 45 | .toast-container { 46 | --#{$prefix}toast-zindex: 8; 47 | } 48 | 49 | .toast-header { 50 | .btn-close { 51 | margin-inline: $toast-padding-x $toast-padding-x * -.5; 52 | } 53 | } 54 | 55 | /* Placement Toast example */ 56 | .toast-placement-ex { 57 | position: fixed; 58 | } 59 | 60 | /* Generate contextual modifier classes for colorizing the alert */ 61 | @each $state in map-keys($theme-colors) { 62 | .bs-toast{ 63 | &.bg-#{$state} { 64 | --#{$prefix}toast-bg: rgba(var(--#{$prefix}#{$state}-rgb), .85); 65 | --#{$prefix}toast-box-shadow: 0 .25rem 1rem rgba(var(--#{$prefix}#{$state}-rgb), .4); 66 | --#{$prefix}toast-btn-close-bg: var(--#{$prefix}#{$state}); 67 | --#{$prefix}toast-btn-close: #{$btn-close-white}; 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_tooltip.scss: -------------------------------------------------------------------------------- 1 | /* Tooltips 2 | ******************************************************************************* */ 3 | 4 | 5 | /* Open modal tooltip z-index */ 6 | .modal-open .tooltip { 7 | z-index: $zindex-modal + 2; 8 | } 9 | 10 | .tooltip-inner { 11 | display: flex; 12 | align-items: center; 13 | font-weight: $font-weight-medium; 14 | gap: 3px; 15 | } 16 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/_type.scss: -------------------------------------------------------------------------------- 1 | /* Type */ 2 | 3 | .list-inline, 4 | .list-unstyled { 5 | padding-inline-start: 0; 6 | } 7 | 8 | .list-inline-item:not(:last-child) { 9 | margin-inline: 0 $list-inline-padding; 10 | } 11 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/forms/_floating-labels.scss: -------------------------------------------------------------------------------- 1 | /* Floating Labels 2 | ******************************************************************************* */ 3 | 4 | // Display placeholder on focus 5 | .form-floating { 6 | > label { 7 | inset-inline-start: 0; 8 | } 9 | > .form-control:focus, 10 | > .form-control:not(:placeholder-shown) { 11 | &::placeholder { 12 | color: $input-placeholder-color; 13 | } 14 | } 15 | > .form-control:focus, 16 | > .form-control:focus:not(:placeholder-shown), 17 | > .form-select:focus, 18 | > .form-select:focus:not(:placeholder-shown) { 19 | ~ label { 20 | color: $component-active-bg; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/forms/_form-check.scss: -------------------------------------------------------------------------------- 1 | /* Checkboxes and Radios 2 | ******************************************************************************* */ 3 | .form-check { 4 | position: relative; 5 | padding-inline: $form-check-padding-start 0; 6 | .form-check-input { 7 | float: inline-start; 8 | margin-inline-start: $form-check-padding-start * -1; 9 | } 10 | &.form-check-reverse { 11 | padding-inline: 0 $form-check-padding-start; 12 | .form-check-input { 13 | float: inline-end; 14 | margin-inline-end: $form-check-padding-start * -1; 15 | } 16 | } 17 | } 18 | .form-check-input { 19 | --#{$prefix}form-check-input-checked-bg: #{$form-check-input-checked-bg-color}; 20 | --#{$prefix}form-check-input-checked-border-color: #{$form-check-input-checked-border-color}; 21 | --#{$prefix}form-check-shadow-color: var(--#{$prefix}primary-rgb); 22 | --#{$prefix}form-check-box-shadow: 0 .125rem .25rem 0 rgba(var(--#{$prefix}form-check-shadow-color), .4); 23 | cursor: $form-check-label-cursor; 24 | &:disabled { 25 | --#{$prefix}form-check-bg: #{$form-check-input-disabled-bg}; 26 | border-color: $form-check-input-disabled-bg; 27 | } 28 | &:checked { 29 | border-color: var(--#{$prefix}form-check-input-checked-border-color); 30 | background-color: var(--#{$prefix}form-check-input-checked-bg); 31 | box-shadow: var(--#{$prefix}form-check-box-shadow); 32 | } 33 | &[type="checkbox"]:indeterminate { 34 | border-color: var(--#{$prefix}form-check-input-checked-border-color); 35 | background-color: var(--#{$prefix}form-check-input-checked-bg); 36 | box-shadow: var(--#{$prefix}form-check-box-shadow); 37 | } 38 | &:active { 39 | filter: none; 40 | } 41 | } 42 | 43 | /* Only for checkbox and radio (not for bs default switch) 44 | ? .dt-checkboxes-cell class is used for DataTables checkboxes */ 45 | .form-check:not(.form-switch), 46 | .dt-checkboxes-cell { 47 | .form-check-input[type="radio"] { 48 | background-size: 1.3125rem; 49 | &:not(:checked) { 50 | background-size: .75rem; 51 | } 52 | } 53 | } 54 | 55 | .form-check-inline { 56 | margin-inline: 0 $form-check-inline-margin-end; 57 | } 58 | 59 | // Switches 60 | // ******************************************************************************* 61 | 62 | .form-switch { 63 | padding-inline-start: $form-switch-padding-start; 64 | .form-check-input { 65 | &:not(:checked) { 66 | background-color: $form-switch-bg; 67 | box-shadow: $form-switch-box-shadow; 68 | } 69 | border: 0; 70 | margin-inline-start: $form-switch-padding-start * -1; 71 | } 72 | &.form-check-reverse { 73 | padding-inline-end: $form-switch-padding-start; 74 | .form-check-input { 75 | margin-inline-end: $form-switch-padding-start * -1; 76 | } 77 | } 78 | } 79 | 80 | // Generate contextual modifier classes for colorizing the form check 81 | @each $state in map-keys($theme-colors) { 82 | .form-check-#{$state} { 83 | .form-check-input { 84 | --#{$prefix}form-check-input-checked-bg: var(--#{$prefix}#{$state}); 85 | --#{$prefix}form-check-input-checked-border-color: var(--#{$prefix}#{$state}); 86 | --#{$prefix}form-check-shadow-color: var(--#{$prefix}#{$state}-rgb); 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/forms/_form-control.scss: -------------------------------------------------------------------------------- 1 | // Form control 2 | // ******************************************************************************* 3 | 4 | .form-control { 5 | --#{$prefix}input-border-color: #{$input-border-color}; 6 | --#{$prefix}input-disabled-border-color: #{$input-disabled-border-color}; 7 | border-color: var(--#{$prefix}input-border-color); 8 | 9 | // ? Form control (all size) padding calc due to border increase on focus 10 | padding-block: calc($input-padding-y - $input-border-width); 11 | padding-inline: calc($input-padding-x - $input-border-width); 12 | 13 | // form input placeholder animation 14 | &::placeholder, 15 | &:focus::placeholder { 16 | @include transition(all ease .2s); 17 | } 18 | 19 | /* border color on hover state when element not in focus or disabled */ 20 | &:hover { 21 | &:not(:focus):not(:disabled) { 22 | border-color: $input-hover-border-color; 23 | } 24 | } 25 | &:disabled { 26 | border-color: var(--#{$prefix}input-disabled-border-color); 27 | } 28 | 29 | /* 30 | ! FIX: wizard-ex input type number placeholder align issue */ 31 | &[type="number"] { 32 | .input-group & { 33 | line-height: 1.375rem; 34 | min-block-size: 2.375rem; 35 | } 36 | .input-group-lg & { 37 | line-height: 1.5rem; 38 | min-block-size: 3rem; 39 | } 40 | .input-group-sm & { 41 | min-block-size: 1.875rem; 42 | } 43 | } 44 | 45 | &:not([readonly]) { 46 | &:focus::placeholder { 47 | transform: translateX(5px); 48 | } 49 | } 50 | 51 | &:focus { 52 | border-width: $input-focus-border-width; 53 | padding-block: calc($input-padding-y - $input-focus-border-width); 54 | padding-inline: calc($input-padding-x - $input-focus-border-width); 55 | &::file-selector-button { 56 | box-shadow: $input-border-width 0 0 $input-focus-border-color; 57 | } 58 | } 59 | &.form-control-lg { 60 | padding-block: calc($input-padding-y-lg - $input-border-width); 61 | padding-inline: calc($input-padding-x-lg - $input-border-width); 62 | &:focus { 63 | padding-block: calc($input-padding-y-lg - $input-focus-border-width); 64 | padding-inline: calc($input-padding-x-lg - $input-focus-border-width); 65 | } 66 | &::file-selector-button { 67 | margin-block: (-$input-padding-y-lg - .0625rem); 68 | padding-block: calc($input-padding-y-lg + .0625rem); 69 | } 70 | } 71 | &.form-control-sm { 72 | padding-block: calc($input-padding-y-sm - $input-border-width); 73 | padding-inline: calc($input-padding-x-sm - $input-border-width); 74 | &:focus { 75 | padding-block: calc($input-padding-y-sm - $input-focus-border-width); 76 | padding-inline: calc($input-padding-x-sm - $input-focus-border-width); 77 | } 78 | &::file-selector-button { 79 | margin-block: (-$input-padding-y-sm - .0625rem); 80 | padding-block: calc($input-padding-y-sm + .0625rem); 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/forms/_form-range.scss: -------------------------------------------------------------------------------- 1 | /* Range select 2 | ******************************************************************************* */ 3 | 4 | .form-range { 5 | // Chrome specific 6 | &::-webkit-slider-thumb { 7 | box-shadow: $form-range-thumb-box-shadow; 8 | transform-origin: center; 9 | @include transition(transform .2s, box-shadow .2s ease); 10 | 11 | &:hover { 12 | box-shadow: 0 0 0 .5rem rgba(var(--#{$prefix}primary-rgb), .16); 13 | } 14 | &:active, 15 | &:focus { 16 | box-shadow: 0 0 0 .8125rem rgba(var(--#{$prefix}primary-rgb), .16); 17 | } 18 | } 19 | &::-webkit-slider-runnable-track { 20 | background-color: var(--#{$prefix}primary); 21 | } 22 | 23 | // Mozilla specific 24 | &::-moz-range-thumb { 25 | box-shadow: $form-range-thumb-box-shadow; 26 | transform-origin: center; 27 | @include transition(transform .2s, box-shadow .2s ease); 28 | &:hover { 29 | box-shadow: 0 0 0 .5rem rgba(var(--#{$prefix}primary-rgb), .16); 30 | } 31 | &:active, 32 | &:focus { 33 | box-shadow: 0 0 0 .8125rem rgba(var(--#{$prefix}primary-rgb), .16); 34 | } 35 | } 36 | 37 | &::-moz-range-track { 38 | background-color: var(--#{$prefix}primary); 39 | } 40 | &:disabled { 41 | &::-webkit-slider-runnable-track { 42 | background-color: $form-range-track-disabled-bg; 43 | } 44 | 45 | &::-moz-range-track { 46 | background-color: $form-range-track-disabled-bg; 47 | } 48 | 49 | &::-webkit-slider-thumb { 50 | border-color: $form-range-track-disabled-border-color; 51 | box-shadow: none; 52 | } 53 | 54 | &::-moz-range-thumb { 55 | border-color: $form-range-track-disabled-border-color; 56 | box-shadow: none; 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/forms/_form-select.scss: -------------------------------------------------------------------------------- 1 | /* Select 2 | ******************************************************************************* */ 3 | 4 | .form-select { 5 | --#{$prefix}form-select-border-color: #{$form-select-border-color}; 6 | border-color: var(--#{$prefix}form-select-border-color); 7 | background-clip: padding-box; 8 | padding-block: calc($form-select-padding-y - $input-border-width); 9 | padding-inline-end: calc($form-select-indicator-padding - $input-border-width); 10 | padding-inline-start: calc($form-select-padding-x - $input-border-width); 11 | optgroup, 12 | option { 13 | background-color: var(--#{$prefix}paper-bg); 14 | } 15 | &[multiple], 16 | &[size]:not([size="1"]) { 17 | padding-inline-end: $form-select-padding-x; 18 | } 19 | &:hover { 20 | &:not(:focus):not(:disabled) { 21 | border-color: $input-hover-border-color; 22 | } 23 | } 24 | &:disabled { 25 | background-image: escape-svg($form-select-disabled-indicator); 26 | } 27 | &:focus, 28 | &:focus-within { 29 | border-width: $input-focus-border-width; 30 | background-position: right calc($form-select-padding-x - 1px) center; 31 | padding-block: calc($form-select-padding-y - $input-focus-border-width); 32 | padding-inline-end: calc($form-select-indicator-padding - $input-focus-border-width); 33 | padding-inline-start: calc($form-select-padding-x - $input-focus-border-width); 34 | } 35 | &.form-select-lg { 36 | background-size: 24px 24px; 37 | min-block-size: $input-height-lg; 38 | padding-block: calc($form-select-padding-y-lg - $input-border-width); 39 | padding-inline-start: calc($form-select-padding-x-lg - $input-border-width); 40 | &:focus { 41 | padding-block: calc($form-select-padding-y-lg - $input-focus-border-width); 42 | padding-inline-start: calc($form-select-padding-x-lg - $input-focus-border-width); 43 | } 44 | } 45 | &.form-select-sm { 46 | background-size: 20px 20px; 47 | min-block-size: $input-height-sm; 48 | padding-block: calc($form-select-padding-y-sm - $input-border-width); 49 | padding-inline-start: calc($form-select-padding-x-sm - $input-border-width); 50 | &:focus { 51 | padding-block: calc($form-select-padding-y-sm - $input-focus-border-width); 52 | padding-inline-start: calc($form-select-padding-x-sm - $input-focus-border-width); 53 | } 54 | } 55 | &[multiple]:focus { 56 | padding-inline-end: .875rem !important; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/forms/_labels.scss: -------------------------------------------------------------------------------- 1 | /* Labels 2 | ******************************************************************************* */ 3 | 4 | .col-form-label { 5 | white-space: nowrap; 6 | } 7 | 8 | /* Default (vertical ) form label size */ 9 | .form-label-lg { 10 | @include font-size($input-font-size-lg); 11 | } 12 | 13 | .form-label-sm { 14 | @include font-size($input-font-size-sm); 15 | } 16 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/helpers/_color-bg.scss: -------------------------------------------------------------------------------- 1 | $color-classes: $theme-colors !default; 2 | 3 | @each $color, $value in $color-classes { 4 | .bg-label-#{$color} { 5 | background-color: color-mix(in sRGB, var(--#{$prefix}paper-bg) var(--#{$prefix}bg-label-tint-amount), var(--#{$prefix}#{$color})) if($enable-important-utilities, !important, null); 6 | @if $color == "light" { 7 | color: RGBA(color-contrast($value), var(--#{$prefix}bg-label-tint-amount)) if($enable-important-utilities, !important, null); 8 | } @else { 9 | color: var(--#{$prefix}#{$color}) if($enable-important-utilities, !important, null); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/mixins/_border-radius.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable property-disallowed-list 2 | 3 | // Single side border-radius 4 | 5 | @mixin border-end-radius($radius: $border-radius) { 6 | @if $enable-rounded { 7 | border-end-end-radius: valid-radius($radius); 8 | border-start-end-radius: valid-radius($radius); 9 | } 10 | } 11 | 12 | @mixin border-start-radius($radius: $border-radius) { 13 | @if $enable-rounded { 14 | border-end-start-radius: valid-radius($radius); 15 | border-start-start-radius: valid-radius($radius); 16 | } 17 | } 18 | 19 | @mixin border-top-start-radius($radius: $border-radius) { 20 | @if $enable-rounded { 21 | border-start-start-radius: valid-radius($radius); 22 | } 23 | } 24 | 25 | @mixin border-top-end-radius($radius: $border-radius) { 26 | @if $enable-rounded { 27 | border-start-end-radius: valid-radius($radius); 28 | } 29 | } 30 | 31 | @mixin border-bottom-end-radius($radius: $border-radius) { 32 | @if $enable-rounded { 33 | border-end-end-radius: valid-radius($radius); 34 | } 35 | } 36 | 37 | @mixin border-bottom-start-radius($radius: $border-radius) { 38 | @if $enable-rounded { 39 | border-end-start-radius: valid-radius($radius); 40 | } 41 | } 42 | 43 | // scss-docs-end border-radius-mixins 44 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/mixins/_caret.scss: -------------------------------------------------------------------------------- 1 | // Carets - for dropdown arrows 2 | // ******************************************************************************* 3 | 4 | @mixin caret-up($caret-width) { 5 | border: $caret-border-width solid; 6 | block-size: $caret-width; 7 | border-block-end: 0; 8 | border-inline-start: 0; 9 | inline-size: $caret-width; 10 | margin-block-start: .97 * divide($caret-width, 2); 11 | margin-inline: .8em 0; 12 | transform: rotate(-45deg); 13 | } 14 | 15 | @mixin caret-down($caret-width) { 16 | border: $caret-border-width solid; 17 | block-size: $caret-width; 18 | border-block-start: 0; 19 | border-inline-start: 0; 20 | inline-size: $caret-width; 21 | margin-block-start: -1.07 * divide($caret-width, 2); 22 | margin-inline: .8em 0; 23 | transform: rotate(45deg); 24 | } 25 | 26 | @mixin caret-start($caret-width) { 27 | border: $caret-border-width solid; 28 | block-size: $caret-width; 29 | border-block-start: 0; 30 | border-inline-end: 0; 31 | inline-size: $caret-width; 32 | margin-block-start: 0; 33 | margin-inline: 0 $caret-spacing; 34 | transform: rotate(45deg); 35 | } 36 | 37 | @mixin caret-end($caret-width) { 38 | border: $caret-border-width solid; 39 | block-size: $caret-width; 40 | border-block-start: 0; 41 | border-inline-start: 0; 42 | inline-size: $caret-width; 43 | margin-block-start: 0; 44 | margin-inline: $caret-spacing 0; 45 | transform: rotate(-45deg); 46 | } 47 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap-extended/mixins/_misc.scss: -------------------------------------------------------------------------------- 1 | // Keyframes 2 | // ******************************************************************************* 3 | 4 | @mixin keyframes($name) { 5 | @keyframes #{$name} { 6 | @content; 7 | } 8 | } 9 | 10 | // icons 11 | // ******************************************************************************* 12 | 13 | @mixin icon-base($size: var(--#{$prefix}icon-size)) { 14 | block-size: $size; 15 | font-size: $size; 16 | inline-size: $size; 17 | } 18 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_bootstrap.scss: -------------------------------------------------------------------------------- 1 | @import "bootstrap/scss/mixins/banner"; 2 | @include bsBanner(""); 3 | 4 | // Configuration 5 | @import "_bootstrap-extended/include"; 6 | 7 | // Layout & components 8 | @import "bootstrap/scss/root"; 9 | @import "bootstrap/scss/reboot"; 10 | @import "bootstrap/scss/type"; 11 | @import "bootstrap/scss/images"; 12 | @import "bootstrap/scss/containers"; 13 | @import "bootstrap/scss/grid"; 14 | @import "bootstrap/scss/tables"; 15 | @import "bootstrap/scss/forms"; 16 | @import "bootstrap/scss/buttons"; 17 | @import "bootstrap/scss/transitions"; 18 | @import "bootstrap/scss/dropdown"; 19 | @import "bootstrap/scss/button-group"; 20 | @import "bootstrap/scss/nav"; 21 | @import "bootstrap/scss/navbar"; 22 | @import "bootstrap/scss/card"; 23 | @import "bootstrap/scss/accordion"; 24 | @import "bootstrap/scss/breadcrumb"; 25 | @import "bootstrap/scss/pagination"; 26 | @import "bootstrap/scss/badge"; 27 | @import "bootstrap/scss/alert"; 28 | @import "bootstrap/scss/progress"; 29 | @import "bootstrap/scss/list-group"; 30 | @import "bootstrap/scss/close"; 31 | @import "bootstrap/scss/toasts"; 32 | @import "bootstrap/scss/modal"; 33 | @import "bootstrap/scss/tooltip"; 34 | @import "bootstrap/scss/popover"; 35 | @import "bootstrap/scss/carousel"; 36 | @import "bootstrap/scss/spinners"; 37 | @import "bootstrap/scss/offcanvas"; 38 | @import "bootstrap/scss/placeholders"; 39 | 40 | // Helpers 41 | @import "bootstrap/scss/helpers"; 42 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_colors.scss: -------------------------------------------------------------------------------- 1 | /* Custom colors 2 | ******************************************************************************* */ 3 | :root { 4 | @each $color, $value in $theme-colors { 5 | --#{$prefix}#{$color}: #{$value}; 6 | --#{$prefix}#{$color}-rgb: #{red($value)}, #{green($value)}, #{blue($value)}; 7 | } 8 | 9 | @each $state in map-keys($theme-colors) { 10 | .bg-gradient-#{$state} { 11 | --#{$prefix}bg-gradient-color-start: color-mix(in sRGB, var(--#{$prefix}pure-black) 10%, var(--#{$prefix}#{$state})); 12 | --#{$prefix}bg-gradient-color-end: color-mix(in sRGB, var(--#{$prefix}white) 20%, var(--#{$prefix}#{$state})); 13 | background-image: linear-gradient(45deg, var(--#{$prefix}bg-gradient-color-start) 0%, var(--#{$prefix}bg-gradient-color-end) 100%) !important; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_components.scss: -------------------------------------------------------------------------------- 1 | @import "_components/include"; 2 | 3 | // Import components scss 4 | @import "_components/root"; 5 | @import "_components/base"; 6 | @import "_components/common"; 7 | @import "_components/menu"; 8 | @import "_components/layout"; 9 | @import "_components/app-brand"; 10 | @import "_components/avatar"; 11 | @import "_components/text-divider"; 12 | @import "_components/footer"; 13 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_components/_app-brand.scss: -------------------------------------------------------------------------------- 1 | /* App Brand 2 | ******************************************************************************* */ 3 | .app-brand { 4 | display: flex; 5 | flex-grow: 0; 6 | flex-shrink: 0; 7 | align-items: center; 8 | 9 | 10 | .app-brand-text { 11 | opacity: 1; 12 | transition: opacity $menu-animation-duration ease-in-out; 13 | } 14 | 15 | 16 | .layout-menu-toggle { 17 | display: block; 18 | } 19 | 20 | .app-brand-img{ 21 | display: block; 22 | } 23 | .app-brand-img-collapsed{ 24 | display: none; 25 | } 26 | } 27 | 28 | .app-brand-link { 29 | display: flex; 30 | align-items: center; 31 | } 32 | 33 | /* App brand with vertical menu */ 34 | .menu-horizontal .app-brand, 35 | .menu-horizontal .app-brand + .menu-divider { 36 | display: none !important; 37 | } 38 | 39 | @include media-breakpoint-up($menu-collapsed-layout-breakpoint) { 40 | // .layout-menu-collapsed:not(.layout-menu-hover, .layout-menu-offcanvas, .layout-menu-fixed-offcanvas) .layout-menu { 41 | .layout-menu-collapsed:not(.layout-menu-hover) .layout-menu, 42 | .menu-collapsed:not(:hover) .app-brand { 43 | .app-brand-logo ~ .app-brand-text{ 44 | opacity: 0; 45 | } 46 | .app-brand-img{ 47 | display: none; 48 | } 49 | .app-brand-img-collapsed{ 50 | display: block; 51 | } 52 | } 53 | } 54 | 55 | /* Within menu */ 56 | :not(.layout-menu) > .menu-vertical.menu-collapsed:not(.layout-menu):not(:hover), 57 | .layout-menu-collapsed:not(.layout-menu-hover):not(.layout-menu-offcanvas):not(.layout-menu-fixed-offcanvas) .layout-menu { 58 | .app-brand { 59 | inline-size: $menu-collapsed-width; 60 | } 61 | 62 | .app-brand-logo, 63 | .app-brand-link, 64 | .app-brand-text { 65 | margin-inline: auto; 66 | } 67 | 68 | .app-brand-logo ~ .app-brand-text { 69 | overflow: hidden; 70 | opacity: 0; 71 | text-overflow: ellipsis; 72 | white-space: nowrap; 73 | } 74 | .app-brand .layout-menu-toggle { 75 | inset-inline-start: calc(#{$menu-collapsed-width} - 1.5rem); 76 | opacity: 0; 77 | } 78 | 79 | .app-brand-img { 80 | display: none; 81 | } 82 | 83 | .app-brand-img-collapsed { 84 | display: block; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_components/_avatar.scss: -------------------------------------------------------------------------------- 1 | /* Avatar 2 | ******************************************************************************* */ 3 | 4 | /* Avatar Styles */ 5 | .avatar { 6 | --#{$prefix}avatar-size: #{$avatar-size}; 7 | --#{$prefix}avatar-group-border: #{$avatar-group-border}; 8 | --#{$prefix}avatar-initial-inline: 3px; 9 | --#{$prefix}avatar-initial-bg: #{$avatar-initial-bg}; 10 | position: relative; 11 | block-size: var(--#{$prefix}avatar-size); 12 | cursor: pointer; 13 | inline-size: var(--#{$prefix}avatar-size); 14 | 15 | .avatar-initial { 16 | position: absolute; 17 | display: flex; 18 | align-items: center; 19 | justify-content: center; 20 | background-color: var(--#{$prefix}avatar-initial-bg); 21 | color: var(--#{$prefix}white); 22 | font-size: var(--#{$prefix}avatar-initial); 23 | font-weight: $font-weight-medium; 24 | inset: 0; 25 | text-transform: uppercase; 26 | } 27 | 28 | &.avatar-online, 29 | &.avatar-offline, 30 | &.avatar-away, 31 | &.avatar-busy { 32 | &::after { 33 | position: absolute; 34 | @include border-radius(100%); 35 | block-size: calc(var(--#{$prefix}avatar-size) * .2); 36 | box-shadow: 0 0 0 2px var(--#{$prefix}white); 37 | content: ""; 38 | inline-size: calc(var(--#{$prefix}avatar-size) * .2); 39 | inset-block-end: 0; 40 | inset-inline-end: var(--#{$prefix}avatar-initial-inline); 41 | } 42 | } 43 | img { 44 | block-size: 100%; 45 | inline-size: 100%; 46 | } 47 | 48 | &.avatar-online::after { 49 | background-color: var(--#{$prefix}success); 50 | } 51 | 52 | &.avatar-offline::after { 53 | background-color: var(--#{$prefix}secondary); 54 | } 55 | 56 | &.avatar-away::after { 57 | background-color: var(--#{$prefix}warning); 58 | } 59 | 60 | &.avatar-busy::after { 61 | background-color: var(--#{$prefix}danger); 62 | } 63 | [class*="avatar-shadow-"] { 64 | background-color: var(--#{$prefix}avatar-icon-bg); 65 | box-shadow: 0 0 0 .25rem rgba(var(--#{$prefix}avatar-icon-shadow-color), .06); 66 | color: var(--#{$prefix}avatar-icon-color); 67 | } 68 | } 69 | 70 | /* Pull up avatar style */ 71 | .pull-up { 72 | transition: all .25s ease; 73 | 74 | &:hover { 75 | z-index: 30; 76 | @include border-radius(50%); 77 | box-shadow: var(--#{$prefix}box-shadow); 78 | transform: translateY(-4px) scale(1.02); 79 | } 80 | } 81 | 82 | 83 | @each $size, $values in $avatar-sizes { 84 | .avatar-#{$size} { 85 | --#{$prefix}avatar-size: #{nth($values, 1)}; 86 | --#{$prefix}avatar-initial: #{nth($values, 2)}; 87 | --#{$prefix}avatar-initial-inline: #{nth($values, 3)}; 88 | } 89 | } 90 | 91 | /* Avatar Group SCSS */ 92 | .avatar-group { 93 | .avatar { 94 | margin-inline-start: -.8rem; 95 | transition: all .25s ease; 96 | 97 | &:first-child { 98 | margin-inline-start: 0; 99 | } 100 | 101 | img, 102 | .avatar-initial { 103 | border: 2px solid var(--#{$prefix}avatar-group-border); 104 | color: var(--#{$prefix}heading-color); 105 | } 106 | 107 | &:hover { 108 | z-index: 30; 109 | transition: all .25s ease; 110 | } 111 | } 112 | 113 | // Avatar Group Sizings 114 | .avatar-xs { 115 | margin-inline-start: -.65rem; 116 | } 117 | 118 | .avatar-sm { 119 | margin-inline-start: -.75rem; 120 | } 121 | 122 | .avatar-md { 123 | margin-inline-start: -.9rem; 124 | } 125 | 126 | .avatar-lg { 127 | margin-inline-start: -1.5rem; 128 | } 129 | 130 | .avatar-xl { 131 | margin-inline-start: -1.75rem; 132 | } 133 | } 134 | 135 | @each $state in map-keys($theme-colors) { 136 | .avatar .avatar-shadow-#{$state} { 137 | --#{$prefix}avatar-icon-color: var(--#{$prefix}#{$state}); 138 | --#{$prefix}avatar-icon-shadow-color: var(--#{$prefix}#{$state}-rgb); 139 | --#{$prefix}avatar-icon-bg: var(--#{$prefix}#{$state}-bg-subtle); 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_components/_base.scss: -------------------------------------------------------------------------------- 1 | /* App Overlay 2 | ******************************************************************************* */ 3 | 4 | .app-overlay { 5 | position: absolute; 6 | z-index: 3; 7 | background-color: transparent; 8 | inset: 0; 9 | transition: all .25s ease-in-out; 10 | visibility: hidden; 11 | 12 | &.show { 13 | background-color: rgba($black, .5); 14 | visibility: visible; 15 | } 16 | } 17 | 18 | /* IE Fixes 19 | ******************************************************************************* */ 20 | 21 | @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) { 22 | /* Fix IE parent container height bug when containing image with fluid width */ 23 | .card, 24 | .card-body, 25 | .media, 26 | .flex-column, 27 | .tab-content { 28 | min-block-size: 1px; 29 | } 30 | 31 | img { 32 | block-size: auto; 33 | min-block-size: 1px; 34 | } 35 | } 36 | 37 | /* Containers 38 | ******************************************************************************* */ 39 | 40 | .container, 41 | .container-fluid, 42 | .container-xxl { 43 | padding-inline: $container-padding-x-sm; 44 | 45 | @include media-breakpoint-up(lg) { 46 | padding-inline: $container-padding-x; 47 | } 48 | } 49 | 50 | /* Buy now section 51 | ******************************************************************************* */ 52 | .buy-now { 53 | .btn-buy-now { 54 | position: fixed; 55 | z-index: $zindex-menu-fixed; 56 | box-shadow: 0 1px 20px 1px $danger; 57 | inset-block-end: 3rem; 58 | inset-inline-end: $container-padding-x; 59 | 60 | &:hover { 61 | box-shadow: none; 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_components/_common.scss: -------------------------------------------------------------------------------- 1 | /* Common 2 | ******************************************************************************* */ 3 | 4 | @import "../_bootstrap-extended/include"; 5 | 6 | /* Line Clamp with ellipsis 7 | ******************************************************************************* */ 8 | 9 | $clamp-numbers: ( 10 | "1": 1, 11 | "2": 2, 12 | "3": 3 13 | ) !default; 14 | 15 | @each $clamp-class, $clamp-value in $clamp-numbers { 16 | .line-clamp-#{$clamp-class} { 17 | display: -webkit-box; 18 | overflow: hidden; 19 | -webkit-box-orient: vertical; 20 | -webkit-line-clamp: $clamp-value; 21 | } 22 | } 23 | 24 | /* Background 25 | ******************************************************************************* */ 26 | 27 | .ui-bg-cover { 28 | background-color: rgb(0 0 0 / 0%); 29 | background-position: center center; 30 | background-size: cover; 31 | } 32 | 33 | .ui-bg-overlay-container, 34 | .ui-bg-video-container { 35 | position: relative; 36 | 37 | > * { 38 | position: relative; 39 | } 40 | } 41 | 42 | .ui-bg-overlay-container .ui-bg-overlay { 43 | position: absolute; 44 | display: block; 45 | background-color: var(--#{$prefix}gray-900); 46 | inset: 0; 47 | } 48 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_components/_footer.scss: -------------------------------------------------------------------------------- 1 | /* Footer 2 | ******************************************************************************* */ 3 | 4 | .footer { 5 | --#{$prefix}footer-color: #{$footer-color}; 6 | --#{$prefix}footer-bg: #{$footer-bg}; 7 | --#{$prefix}footer-border-width: #{$footer-border-width}; 8 | --#{$prefix}footer-border-color: #{$footer-border-color}; 9 | --#{$prefix}footer-link-color: #{$footer-link-color}; 10 | --#{$prefix}footer-link-hover-color: #{$footer-link-hover-color}; 11 | --#{$prefix}footer-link-disabled-color: #{$footer-link-disabled-color}; 12 | --#{$prefix}footer-link-active-color: #{$footer-link-active-color}; 13 | --#{$prefix}footer-brand-color: #{$footer-brand-color}; 14 | --#{$prefix}footer-brand-hover-color: #{$footer-brand-hover-color}; 15 | --#{$prefix}footer-box-shadow: #{$footer-box-shadow}; 16 | 17 | color: var(--#{$prefix}footer-color); 18 | 19 | .footer-brand{ 20 | color: var(--#{$prefix}footer-brand-color); 21 | &:hover, 22 | &:focus { 23 | color: var(--#{$prefix}footer-brand-hover-color); 24 | } 25 | } 26 | 27 | &.content-footer .footer-container { 28 | block-size: 54px; 29 | } 30 | 31 | .footer-link { 32 | display: inline-block; 33 | color: var(--#{$prefix}footer-link-color); 34 | &:hover, 35 | &:focus { 36 | color: var(--#{$prefix}footer-link-hover-color); 37 | } 38 | &.disabled { 39 | color: var(--#{$prefix}footer-link-disabled-color) !important; 40 | } 41 | &:active, 42 | &.active { 43 | color: var(--#{$prefix}footer-link-active-color); 44 | } 45 | } 46 | &.bg-footer-theme { 47 | --#{$prefix}footer-brand-color: var(--#{$prefix}body-color); 48 | } 49 | &.bg-light { 50 | --#{$prefix}footer-brand-hover-color: color-mix(in sRGB, var(--#{$prefix}paper-bg) 40%, var(--#{$prefix}light-contrast)); 51 | --#{$prefix}footer-link-hover-color: var(--#{$prefix}light-contrast); 52 | --#{$prefix}footer-color: var(--#{$prefix}body-color); 53 | --#{$prefix}footer-link-color: var(--#{$prefix}body-color); 54 | --#{$prefix}footer-brand-color: var(--#{$prefix}heading-color); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_components/_include.scss: -------------------------------------------------------------------------------- 1 | // Include 2 | // ******************************************************************************* 3 | 4 | @import "../_bootstrap-extended/include"; 5 | 6 | 7 | // Components variables 8 | @import "../_custom-variables/components"; // Components variable (for customization purpose) 9 | @import "variables"; // Components variable 10 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_components/_root.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | /* Menu */ 3 | --#{$prefix}menu-bg: #{$menu-bg}; 4 | --#{$prefix}menu-bg-rgb: #{$menu-bg-rgb}; 5 | --#{$prefix}menu-color: #{$menu-color}; 6 | --#{$prefix}menu-color-rgb: #{$menu-color-rgb}; 7 | --#{$prefix}menu-hover-bg: #{$menu-hover-bg}; 8 | --#{$prefix}menu-hover-color: #{$menu-hover-color}; 9 | --#{$prefix}menu-sub-active-bg: var(--#{$prefix}primary-bg-subtle); 10 | --#{$prefix}menu-sub-active-color: var(--#{$prefix}primary); 11 | --#{$prefix}menu-active-color: #{$menu-active-color}; 12 | --#{$prefix}menu-active-bg: #{$menu-active-bg}; 13 | --#{$prefix}menu-active-toggle-bg: #{$menu-active-toggle-bg}; 14 | --#{$prefix}menu-horizontal-active-bg: var(--#{$prefix}menu-bg); 15 | --#{$prefix}menu-box-shadow: #{$menu-box-shadow}; 16 | --#{$prefix}menu-divider-color: #{var(--#{$prefix}white)}; 17 | --#{$prefix}menu-width: #{$menu-width}; 18 | --#{$prefix}menu-collapsed-width: #{$menu-collapsed-width}; 19 | --#{$prefix}menu-item-spacer: #{$menu-item-spacer}; 20 | --#{$prefix}menu-vertical-link-padding-y: #{$menu-vertical-link-padding-y}; 21 | --#{$prefix}menu-vertical-link-padding-x: #{$menu-vertical-link-padding-x}; 22 | --#{$prefix}menu-vertical-menu-link-padding-y: #{$menu-vertical-menu-link-padding-y}; 23 | --#{$prefix}menu-vertical-menu-level-spacer: #{$menu-vertical-menu-level-spacer}; 24 | --#{$prefix}menu-horizontal-menu-box-shadow: #{$menu-horizontal-menu-box-shadow}; 25 | } 26 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_components/_text-divider.scss: -------------------------------------------------------------------------------- 1 | /* Divider 2 | ******************************************************************************* */ 3 | 4 | .divider { 5 | --#{$prefix}divider-color: #{$divider-color}; 6 | display: block; 7 | overflow: hidden; 8 | margin-block: $divider-margin-y; 9 | margin-inline: $divider-margin-x; 10 | text-align: center; 11 | white-space: nowrap; 12 | 13 | .divider-text { 14 | position: relative; 15 | display: inline-block; 16 | color: $divider-text-color; 17 | font-size: $divider-font-size; 18 | padding-block: $divider-text-padding-y; 19 | padding-inline: $divider-text-padding-x; 20 | 21 | .icon-base { 22 | @include icon-base($divider-icon-size); 23 | } 24 | 25 | &::before, 26 | &::after { 27 | position: absolute; 28 | border-block-start: 1px solid var(--#{$prefix}divider-color); 29 | content: ""; 30 | inline-size: 100vw; 31 | inset-block-start: 50%; 32 | } 33 | 34 | &::before { 35 | inset-inline-end: 100%; 36 | } 37 | 38 | &::after { 39 | inset-inline-start: 100%; 40 | } 41 | } 42 | 43 | &.text-start { 44 | .divider-text { 45 | padding-inline-start: 0; 46 | } 47 | } 48 | 49 | &.text-end { 50 | .divider-text { 51 | padding-inline-end: 0; 52 | } 53 | } 54 | 55 | &.text-start-center { 56 | .divider-text { 57 | inset-inline-start: -25%; 58 | } 59 | } 60 | 61 | &.text-end-center { 62 | .divider-text { 63 | inset-inline-end: -25%; 64 | } 65 | } 66 | 67 | // Dotted Bordered Divider 68 | &.divider-dotted { 69 | .divider-text { 70 | &::before, 71 | &::after { 72 | border-width: 0 1px 1px; 73 | border-style: dotted; 74 | border-color: var(--#{$prefix}divider-color); 75 | } 76 | } 77 | } 78 | 79 | // Dashed Bordered Divider 80 | &.divider-dashed { 81 | .divider-text { 82 | &::before, 83 | &::after { 84 | border-width: 0 1px 1px; 85 | border-style: dashed; 86 | border-color: var(--#{$prefix}divider-color); 87 | } 88 | } 89 | } 90 | } 91 | 92 | @each $state in map-keys($theme-colors) { 93 | .divider-#{$state} { 94 | --#{$prefix}divider-color: var(--#{$prefix}#{$state}); 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_components/_variables.scss: -------------------------------------------------------------------------------- 1 | // Navbar (custom navbar) 2 | // ******************************************************************************* 3 | $navbar-height: 4rem !default; 4 | $navbar-suggestion-width: 100% !default; 5 | $navbar-suggestion-height: 28rem !default; 6 | $navbar-suggestion-border-radius: .5rem !default; 7 | $navbar-dropdown-width: 22rem !default; 8 | $navbar-dropdown-content-height: 30rem !default; 9 | $navbar-dropdown-hover-bg: var(--#{$prefix}gray-60) !default; 10 | $navbar-dropdown-icon-bg: var(--#{$prefix}gray-80) !default; 11 | $navbar-notifications-dropdown-item-padding-y: .75rem !default; 12 | $navbar-notifications-dropdown-item-padding-x: 1rem !default; 13 | 14 | // Menu 15 | // ******************************************************************************* 16 | 17 | $menu-width: 16.25rem !default; 18 | $menu-collapsed-width: 5.25rem !default; 19 | $menu-collapsed-layout-breakpoint: xl !default; 20 | $menu-font-size: $font-size-base !default; 21 | 22 | $menu-item-spacer: .125rem !default; 23 | $menu-link-spacer-x: .5rem !default; 24 | 25 | $menu-vertical-link-margin-x: 1rem !default; 26 | $menu-vertical-link-padding-y: .3125rem !default; 27 | $menu-vertical-link-padding-x: .9375rem !default; 28 | $menu-vertical-header-margin-y: 1rem !default; 29 | $menu-vertical-header-margin-x: 0 !default; 30 | $menu-vertical-menu-link-padding-y: .3125rem !default; 31 | $menu-vertical-menu-level-spacer: .65rem !default; 32 | 33 | $menu-horizontal-spacer-x: .375rem !default; 34 | $menu-horizontal-item-spacer: .5rem !default; 35 | $menu-horizontal-link-padding-y: .625rem !default; 36 | $menu-horizontal-link-padding-x: 1rem !default; 37 | $menu-horizontal-menu-link-padding-y: .625rem !default; 38 | $menu-horizontal-menu-level-spacer: 2rem !default; 39 | $menu-horizontal-menu-box-shadow: $dropdown-box-shadow !default; 40 | 41 | $menu-sub-width: 14.5rem !default; 42 | $menu-control-width: 2.25rem !default; 43 | $menu-control-arrow-size: .5rem !default; 44 | 45 | $menu-icon-expanded-width: 1.5rem !default; 46 | $menu-icon-expanded-left-spacer: 1.675rem !default; 47 | $menu-icon-expanded-font-size: 1.375rem !default; 48 | $menu-icon-expanded-spacer: .5rem !default; 49 | 50 | $menu-animation-duration: .3s !default; 51 | 52 | $menu-bg: var(--#{$prefix}paper-bg) !default; 53 | $menu-bg-rgb: var(--#{$prefix}paper-bg-rgb) !default; 54 | $menu-color: $headings-color !default; 55 | $menu-color-rgb: #{to-rgb($menu-color)} !default; 56 | $menu-hover-bg: $gray-60 !default; 57 | $menu-hover-color: $headings-color !default; 58 | $menu-active-bg: var(--#{$prefix}primary-bg-subtle) !default; 59 | $menu-active-color: var(--#{$prefix}primary) !default; 60 | $menu-active-toggle-bg: $gray-80 !default; 61 | $menu-box-shadow: $box-shadow-sm !default; 62 | $menu-divider-color: transparent !default; 63 | 64 | 65 | $menu-max-levels: 5 !default; 66 | 67 | // Footer 68 | // ******************************************************************************* 69 | 70 | 71 | $footer-bg: var(--#{$prefix}paper-bg) !default; 72 | $footer-color: var(--#{$prefix}body-color) !default; 73 | $footer-border-width: 0 !default; 74 | $footer-border-color: var(--#{$prefix}border-color) !default; 75 | $footer-link-color: var(--#{$prefix}primary) !default; 76 | $footer-link-hover-color: rgba(var(--#{$prefix}primary-rgb), .8) !default; 77 | $footer-link-disabled-color: var(--#{$prefix}gray-300) !default; 78 | $footer-link-active-color: var(--#{$prefix}primary) !default; 79 | $footer-brand-color: $footer-link-active-color !default; 80 | $footer-brand-hover-color: color-mix(in sRGB, #{$footer-link-active-color} #{$bg-label-tint-amount}, var(--#{$prefix}paper-bg)) !default; 81 | $footer-box-shadow: var(--#{$prefix}box-shadow-lg) !default; 82 | 83 | // Avatars 84 | // ******************************************************************************* 85 | 86 | // (Height & Width, Font Size, status indicator position) 87 | 88 | $avatar-size: 2.375rem !default; /* Default */ 89 | $avatar-sizes: ( 90 | xs: (1.5rem, .625rem, 1px), 91 | sm: (2rem, .8125rem, 2px), 92 | md: (3rem, 1.125rem, 3px), 93 | lg: (3.5rem, 1.5rem, 4px), 94 | xl: (4rem, 1.875rem, 5px) 95 | ) !default; 96 | 97 | $avatar-group-border: var(--#{$prefix}paper-bg) !default; 98 | $avatar-initial-bg: #eeedf0 !default; 99 | 100 | // Text Divider 101 | // ******************************************************************************* 102 | $divider-color: var(--#{$prefix}gray-200) !default; 103 | $divider-text-color: var(--#{$prefix}heading-color) !default; 104 | 105 | $divider-margin-y: 1rem !default; 106 | $divider-margin-x: 0 !default; 107 | $divider-text-padding-y: 0 !default; 108 | $divider-text-padding-x: .677rem !default; 109 | 110 | $divider-font-size: $font-size-base !default; 111 | $divider-icon-size: 1rem !default; 112 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_custom-styles.scss: -------------------------------------------------------------------------------- 1 | // This file is used for writing your custom styles 2 | 3 | // .card { 4 | // background-color: #fd0000; 5 | // } 6 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_custom-variables/_bootstrap-extended.scss: -------------------------------------------------------------------------------- 1 | // =================================================================================================================== 2 | // ? TIP: It is recommended to use this file for overriding bootstrap extended variables (_bootstrap-extended/_variables.scss). 3 | // Copy and paste variables as needed, modify their values, and remove the !default flag. 4 | // =================================================================================================================== 5 | 6 | // $font-size-root: 14px !default; 7 | // $success: #00ff00 !default; 8 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/_custom-variables/_components.scss: -------------------------------------------------------------------------------- 1 | // ================================================================================================ 2 | // ? TIP: It is recommended to use this file for overriding component variables (_components/_variables.scss). 3 | // Copy and paste variables as needed, modify their values, and remove the !default flag. 4 | // ================================================================================================ 5 | 6 | // $menu-color: #000 !default; 7 | -------------------------------------------------------------------------------- /resources/assets/vendor/scss/core.scss: -------------------------------------------------------------------------------- 1 | @import "bootstrap"; 2 | @import "colors"; 3 | @import "bootstrap-extended"; 4 | @import "components"; 5 | @import "custom-styles"; 6 | -------------------------------------------------------------------------------- /resources/css/app.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/themeselection/sneat-bootstrap-laravel-livewire-starter-kit/2cc4b76712490a1410ed604f13b4889ce4f8ddbf/resources/css/app.css -------------------------------------------------------------------------------- /resources/js/app.js: -------------------------------------------------------------------------------- 1 | import './bootstrap'; 2 | /* 3 | Add custom scripts here 4 | */ 5 | -------------------------------------------------------------------------------- /resources/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | /** 2 | * We'll load the axios HTTP library which allows us to easily issue requests 3 | * to our Laravel back-end. This library automatically handles sending the 4 | * CSRF token as a header based on the value of the "XSRF" token cookie. 5 | */ 6 | 7 | import axios from 'axios'; 8 | window.axios = axios; 9 | 10 | window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 11 | -------------------------------------------------------------------------------- /resources/views/components/action-message.blade.php: -------------------------------------------------------------------------------- 1 | @props([ 2 | 'on', 3 | ]) 4 | 5 |
merge(['class' => 'text-sm']) }} 12 | > 13 | {{ $slot->isEmpty() ? __('Saved.') : $slot }} 14 |
15 | -------------------------------------------------------------------------------- /resources/views/components/app-logo-icon.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | $width = $width ?? '25'; 3 | @endphp 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /resources/views/components/app-logo.blade.php: -------------------------------------------------------------------------------- 1 | 2 | {{ config('variables.templateName') ? config('variables.templateName') : '' }} 3 | -------------------------------------------------------------------------------- /resources/views/components/auth-header.blade.php: -------------------------------------------------------------------------------- 1 | @props([ 2 | 'title', 3 | 'description', 4 | ]) 5 | 6 |

{{ $title }} 👋

7 |

{{ $description }}

-------------------------------------------------------------------------------- /resources/views/components/auth-session-status.blade.php: -------------------------------------------------------------------------------- 1 | @props([ 2 | 'status', 3 | ]) 4 | 5 | @if ($status) 6 |
merge(['class' => 'font-medium text-sm text-green-600']) }}> 7 | {{ $status }} 8 |
9 | @endif 10 | -------------------------------------------------------------------------------- /resources/views/components/layouts/app.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @include('partials.head') 5 | 6 | 7 | 8 | 9 |
10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 |
26 | {{ $slot }} 27 |
28 | 29 | 30 | 31 | 32 | 33 |
34 | 35 |
36 |
37 | 38 |
39 |
40 | 41 | 42 | @include('partials.scripts') 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /resources/views/components/layouts/auth.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @include('partials.head') 5 | 6 | 7 | 8 | 9 | 10 | {{ $slot }} 11 | 12 | 13 | 14 | @include('partials.scripts') 15 | 16 | 17 | -------------------------------------------------------------------------------- /resources/views/components/layouts/auth/card.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 |
7 | 8 |
9 | 10 |
11 | 12 | 13 | 14 | {{ $slot }} 15 | 16 | 17 |
18 |
or
19 |
20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |
38 |
39 |
40 |
41 |
42 |
-------------------------------------------------------------------------------- /resources/views/components/layouts/auth/split.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 |
7 | 8 | 9 | 10 | Login image 11 |
12 |
13 |
14 | 15 | 16 | 17 |
18 |
19 |
20 | {{ $slot }} 21 |
22 |
or
23 |
24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 |
42 |
43 |
44 |
45 | 46 |
47 |
48 | -------------------------------------------------------------------------------- /resources/views/components/layouts/footer/default.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | -------------------------------------------------------------------------------- /resources/views/components/layouts/menu/vertical.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 32 | 33 | 34 | 44 | -------------------------------------------------------------------------------- /resources/views/components/placeholder-pattern.blade.php: -------------------------------------------------------------------------------- 1 | @props([ 2 | 'id' => uniqid(), 3 | ]) 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /resources/views/components/settings/layout.blade.php: -------------------------------------------------------------------------------- 1 |

{{ $heading ?? '' }}

2 |
{{ $subheading ?? '' }}
3 |
4 | {{ $slot }} 5 |
6 | -------------------------------------------------------------------------------- /resources/views/dashboard.blade.php: -------------------------------------------------------------------------------- 1 | @section('title', __('Dashboard')) 2 | 3 |
4 |
5 |
6 | 7 |
8 |
9 |
10 |
11 | 12 |
13 |
14 |
15 |
16 | 17 |
18 |
19 |
20 |
21 | 22 |
23 |
24 |
25 |
26 | -------------------------------------------------------------------------------- /resources/views/livewire/auth/confirm-password.blade.php: -------------------------------------------------------------------------------- 1 | validate([ 17 | 'password' => ['required', 'string'], 18 | ]); 19 | 20 | if (! Auth::guard('web')->validate([ 21 | 'email' => Auth::user()->email, 22 | 'password' => $this->password, 23 | ])) { 24 | throw ValidationException::withMessages([ 25 | 'password' => __('auth.password'), 26 | ]); 27 | } 28 | 29 | session(['auth.password_confirmed_at' => time()]); 30 | 31 | $this->redirectIntended(default: route('dashboard', absolute: false), navigate: true); 32 | } 33 | }; ?> 34 | 35 | @section('title', 'Confirm Password') 36 | 37 | @section('page-style') 38 | @vite([ 39 | 'resources/assets/vendor/scss/pages/page-auth.scss' 40 | ]) 41 | @endsection 42 | 43 |
44 |

{{ __('Security Verification') }} 🔐

45 |

{{ __('This is a secure area. Please confirm your password before continuing.') }}

46 | 47 | 48 | @if (session('status')) 49 |
50 | {{ session('status') }} 51 |
52 | @endif 53 | 54 |
55 |
56 | 57 |
58 | 67 | 68 | @error('password') 69 |
{{ $message }}
70 | @enderror 71 |
72 |
73 | 74 | 77 |
78 | 79 | 85 |
86 | -------------------------------------------------------------------------------- /resources/views/livewire/auth/forgot-password.blade.php: -------------------------------------------------------------------------------- 1 | validate([ 16 | 'email' => ['required', 'string', 'email'], 17 | ]); 18 | 19 | Password::sendResetLink($this->only('email')); 20 | 21 | session()->flash('status', __('A reset link will be sent if the account exists.')); 22 | } 23 | }; ?> 24 | 25 | @section('title', 'Forgot Password') 26 | 27 | @section('page-style') 28 | @vite([ 29 | 'resources/assets/vendor/scss/pages/page-auth.scss' 30 | ]) 31 | @endsection 32 | 33 |
34 |

{{ __('Forgot Password?') }} 🔒

35 |

{{ __('Enter your email and we\'ll send you instructions to reset your password') }}

36 | 37 | 38 | @if (session('status')) 39 |
40 | {{ session('status') }} 41 |
42 | @endif 43 | 44 |
45 |
46 | 47 | 57 | @error('email') 58 |
{{ $message }}
59 | @enderror 60 |
61 | 62 | 65 |
66 | 67 | 73 |
74 | -------------------------------------------------------------------------------- /resources/views/livewire/auth/verify-email.blade.php: -------------------------------------------------------------------------------- 1 | hasVerifiedEmail()) { 16 | $this->redirectIntended(default: route('dashboard', absolute: false), navigate: true); 17 | return; 18 | } 19 | 20 | Auth::user()->sendEmailVerificationNotification(); 21 | Session::flash('status', 'verification-link-sent'); 22 | } 23 | 24 | /** 25 | * Log the current user out of the application. 26 | */ 27 | public function logout(Logout $logout): void 28 | { 29 | $logout(); 30 | $this->redirect('/', navigate: true); 31 | } 32 | }; ?> 33 | 34 | @section('title', 'Verify Email') 35 | 36 | @section('page-style') 37 | @vite([ 38 | 'resources/assets/vendor/scss/pages/page-auth.scss' 39 | ]) 40 | @endsection 41 | 42 |
43 |

{{ __('Verify Your Email') }} 📧

44 |

{{ __('Please verify your email address by clicking on the link we just emailed to you.') }}

45 | 46 | @if (session('status') == 'verification-link-sent') 47 |
48 | {{ __('A new verification link has been sent to the email address you provided during registration.') }} 49 |
50 | @endif 51 | 52 |
53 | 56 | 57 | 60 |
61 |
62 | -------------------------------------------------------------------------------- /resources/views/livewire/settings/delete-user-form.blade.php: -------------------------------------------------------------------------------- 1 | validate([ 16 | 'password' => ['required', 'string', 'current_password'], 17 | ]); 18 | 19 | tap(Auth::user(), $logout(...))->delete(); 20 | 21 | $this->redirect('/', navigate: true); 22 | } 23 | }; ?> 24 | 25 | @section('title', 'Delete account') 26 | 27 |
28 |
29 |
30 |
{{ __('Delete account') }}
31 |

{{ __('Delete your account and all of its resources') }}

32 |
33 | 34 | 35 | 38 | 39 | 40 | 65 |
66 | -------------------------------------------------------------------------------- /resources/views/livewire/settings/password.blade.php: -------------------------------------------------------------------------------- 1 | validate([ 21 | 'current_password' => ['required', 'string', 'current_password'], 22 | 'password' => ['required', 'string', Password::defaults(), 'confirmed'], 23 | ]); 24 | } catch (ValidationException $e) { 25 | $this->reset('current_password', 'password', 'password_confirmation'); 26 | 27 | throw $e; 28 | } 29 | 30 | Auth::user()->update([ 31 | 'password' => Hash::make($validated['password']), 32 | ]); 33 | 34 | $this->reset('current_password', 'password', 'password_confirmation'); 35 | 36 | $this->dispatch('password-updated'); 37 | } 38 | }; ?> 39 | 40 | @section('title', 'Update password') 41 | 42 |
43 | @include('partials.settings-heading') 44 | 45 | 46 |
47 |
48 | 49 | 50 |
51 | 52 |
53 | 54 | 55 |
56 | 57 |
58 | 59 | 60 |
61 | 62 |
63 | 64 | 65 | 66 | {{ __('Saved.') }} 67 | 68 |
69 |
70 |
71 |
72 | -------------------------------------------------------------------------------- /resources/views/livewire/settings/profile.blade.php: -------------------------------------------------------------------------------- 1 | name = Auth::user()->name; 19 | $this->email = Auth::user()->email; 20 | } 21 | 22 | /** 23 | * Update the profile information for the currently authenticated user. 24 | */ 25 | public function updateProfileInformation(): void 26 | { 27 | $user = Auth::user(); 28 | 29 | $validated = $this->validate([ 30 | 'name' => ['required', 'string', 'max:255'], 31 | 'email' => [ 32 | 'required', 33 | 'string', 34 | 'lowercase', 35 | 'email', 36 | 'max:255', 37 | Rule::unique(User::class)->ignore($user->id) 38 | ], 39 | ]); 40 | 41 | $user->fill($validated); 42 | 43 | if ($user->isDirty('email')) { 44 | $user->email_verified_at = null; 45 | } 46 | 47 | $user->save(); 48 | 49 | $this->dispatch('profile-updated', name: $user->name); 50 | } 51 | 52 | /** 53 | * Send an email verification notification to the current user. 54 | */ 55 | public function resendVerificationNotification(): void 56 | { 57 | $user = Auth::user(); 58 | 59 | if ($user->hasVerifiedEmail()) { 60 | $this->redirectIntended(default: route('dashboard', absolute: false)); 61 | 62 | return; 63 | } 64 | 65 | $user->sendEmailVerificationNotification(); 66 | 67 | Session::flash('status', 'verification-link-sent'); 68 | } 69 | }; ?> 70 | 71 | @section('title', 'Profile') 72 | 73 |
74 | @include('partials.settings-heading') 75 | 76 | 77 |
78 |
79 | 80 | 81 |
82 | 83 |
84 | 85 |
86 | 87 | @example.com 88 |
89 | 90 | @if (auth()->user() instanceof \Illuminate\Contracts\Auth\MustVerifyEmail && !auth()->user()->hasVerifiedEmail()) 91 |
92 |

93 | {{ __('Your email address is unverified.') }} 94 | {{ __('Click here to re-send the verification email.') }} 95 |

96 | 97 | @if (session('status') === 'verification-link-sent') 98 |

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

101 | @endif 102 |
103 | @endif 104 |
105 | 106 |
107 | 108 | 109 | {{ __('Saved.') }} 110 | 111 |
112 |
113 | 114 | 115 |
116 |
117 | -------------------------------------------------------------------------------- /resources/views/partials/head.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | @props([ 6 | 'pageTitle', 7 | ]) 8 | 9 | 10 | @yield('title') | 11 | {{ config('variables.templateName') ? config('variables.templateName') : 'TemplateName' }} - 12 | {{ config('variables.templateSuffix') ? config('variables.templateSuffix') : 'TemplateSuffix' }} 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | @include('partials.styles') 33 | 34 | @livewireStyles 35 | -------------------------------------------------------------------------------- /resources/views/partials/scripts.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | @vite([ 4 | 'resources/assets/vendor/libs/jquery/jquery.js', 5 | 'resources/assets/vendor/libs/popper/popper.js', 6 | 'resources/assets/vendor/js/bootstrap.js', 7 | ]) 8 | 9 | 10 | @yield('vendor-script') 11 | 12 | 13 | @vite(['resources/js/app.js']) 14 | 15 | 16 | @yield('page-script') 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /resources/views/partials/settings-heading.blade.php: -------------------------------------------------------------------------------- 1 |
2 |

{{ __('Settings') }}

3 |

4 | {{ __('Manage your profile and account settings') }} 5 |

6 |
7 |
8 | -------------------------------------------------------------------------------- /resources/views/partials/styles.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | @vite(['resources/assets/vendor/fonts/iconify/iconify.js']) 8 | 9 | 10 | @vite(['resources/assets/vendor/scss/core.scss','resources/assets/css/demo.css', 'resources/css/app.css']) 11 | 12 | 13 | @yield('vendor-style') 14 | 15 | 16 | @yield('page-style') 17 | -------------------------------------------------------------------------------- /resources/views/welcome.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | @section('title', __('Welcome')) 4 | 5 | @include('partials.head') 6 | 7 | 8 |
9 |
10 | @if (Route::has('login')) 11 | @auth 12 | Dashboard 13 | @else 14 | Log in 15 | 16 | @if (Route::has('register')) 17 | Register 18 | @endif 19 | @endauth 20 | @endif 21 |
22 |
23 |
24 |
25 |
26 |
27 |

Sneat Design Laravel Livewire

28 |

The Starter Kit integrates Sneat components into Laravel Livewire. Visit our live docs and demo to explore the components.

29 | 34 |
35 |
36 |
37 | Card image 38 |
39 |
40 |
41 |
42 |
43 | 44 | 45 | @include('partials.scripts') 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /routes/auth.php: -------------------------------------------------------------------------------- 1 | group(function () { 8 | Volt::route('login', 'auth.login') 9 | ->name('login'); 10 | 11 | Volt::route('register', 'auth.register') 12 | ->name('register'); 13 | 14 | Volt::route('forgot-password', 'auth.forgot-password') 15 | ->name('password.request'); 16 | 17 | Volt::route('reset-password/{token}', 'auth.reset-password') 18 | ->name('password.reset'); 19 | 20 | }); 21 | 22 | Route::middleware('auth')->group(function () { 23 | Volt::route('verify-email', 'auth.verify-email') 24 | ->name('verification.notice'); 25 | 26 | Route::get('verify-email/{id}/{hash}', VerifyEmailController::class) 27 | ->middleware(['signed', 'throttle:6,1']) 28 | ->name('verification.verify'); 29 | 30 | Volt::route('confirm-password', 'auth.confirm-password') 31 | ->name('password.confirm'); 32 | }); 33 | 34 | Route::post('logout', App\Livewire\Actions\Logout::class) 35 | ->name('logout'); 36 | -------------------------------------------------------------------------------- /routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 8 | })->purpose('Display an inspiring quote'); 9 | -------------------------------------------------------------------------------- /routes/web.php: -------------------------------------------------------------------------------- 1 | name('home'); 9 | 10 | Route::view('dashboard', 'dashboard') 11 | ->middleware(['auth', 'verified']) 12 | ->name('dashboard'); 13 | 14 | Route::middleware(['auth'])->group(function () { 15 | Route::redirect('settings', 'settings/profile'); 16 | 17 | Volt::route('settings/profile', 'settings.profile')->name('settings.profile'); 18 | Volt::route('settings/password', 'settings.password')->name('settings.password'); 19 | }); 20 | 21 | require __DIR__ . '/auth.php'; 22 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !private/ 3 | !public/ 4 | !.gitignore 5 | -------------------------------------------------------------------------------- /storage/app/private/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | compiled.php 2 | config.php 3 | down 4 | events.scanned.php 5 | maintenance.php 6 | routes.php 7 | routes.scanned.php 8 | schedule-* 9 | services.json 10 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /tests/Feature/Auth/AuthenticationTest.php: -------------------------------------------------------------------------------- 1 | get('/login'); 10 | 11 | $response->assertStatus(200); 12 | }); 13 | 14 | test('users can authenticate using the login screen', function () { 15 | $user = User::factory()->create(); 16 | 17 | $response = LivewireVolt::test('auth.login') 18 | ->set('email', $user->email) 19 | ->set('password', 'password') 20 | ->call('login'); 21 | 22 | $response 23 | ->assertHasNoErrors() 24 | ->assertRedirect(route('dashboard', absolute: false)); 25 | 26 | $this->assertAuthenticated(); 27 | }); 28 | 29 | test('users can not authenticate with invalid password', function () { 30 | $user = User::factory()->create(); 31 | 32 | $this->post('/login', [ 33 | 'email' => $user->email, 34 | 'password' => 'wrong-password', 35 | ]); 36 | 37 | $this->assertGuest(); 38 | }); 39 | 40 | test('users can logout', function () { 41 | $user = User::factory()->create(); 42 | 43 | $response = $this->actingAs($user)->post('/logout'); 44 | 45 | $this->assertGuest(); 46 | $response->assertRedirect('/'); 47 | }); -------------------------------------------------------------------------------- /tests/Feature/Auth/EmailVerificationTest.php: -------------------------------------------------------------------------------- 1 | unverified()->create(); 12 | 13 | $response = $this->actingAs($user)->get('/verify-email'); 14 | 15 | $response->assertStatus(200); 16 | }); 17 | 18 | test('email can be verified', function () { 19 | $user = User::factory()->unverified()->create(); 20 | 21 | Event::fake(); 22 | 23 | $verificationUrl = URL::temporarySignedRoute( 24 | 'verification.verify', 25 | now()->addMinutes(60), 26 | ['id' => $user->id, 'hash' => sha1($user->email)] 27 | ); 28 | 29 | $response = $this->actingAs($user)->get($verificationUrl); 30 | 31 | Event::assertDispatched(Verified::class); 32 | 33 | expect($user->fresh()->hasVerifiedEmail())->toBeTrue(); 34 | $response->assertRedirect(route('dashboard', absolute: false).'?verified=1'); 35 | }); 36 | 37 | test('email is not verified with invalid hash', function () { 38 | $user = User::factory()->unverified()->create(); 39 | 40 | $verificationUrl = URL::temporarySignedRoute( 41 | 'verification.verify', 42 | now()->addMinutes(60), 43 | ['id' => $user->id, 'hash' => sha1('wrong-email')] 44 | ); 45 | 46 | $this->actingAs($user)->get($verificationUrl); 47 | 48 | expect($user->fresh()->hasVerifiedEmail())->toBeFalse(); 49 | }); -------------------------------------------------------------------------------- /tests/Feature/Auth/PasswordConfirmationTest.php: -------------------------------------------------------------------------------- 1 | create(); 10 | 11 | $response = $this->actingAs($user)->get('/confirm-password'); 12 | 13 | $response->assertStatus(200); 14 | }); 15 | 16 | test('password can be confirmed', function () { 17 | $user = User::factory()->create(); 18 | 19 | $this->actingAs($user); 20 | 21 | $response = Volt::test('auth.confirm-password') 22 | ->set('password', 'password') 23 | ->call('confirmPassword'); 24 | 25 | $response 26 | ->assertHasNoErrors() 27 | ->assertRedirect(route('dashboard', absolute: false)); 28 | }); 29 | 30 | test('password is not confirmed with invalid password', function () { 31 | $user = User::factory()->create(); 32 | 33 | $this->actingAs($user); 34 | 35 | $response = Volt::test('auth.confirm-password') 36 | ->set('password', 'wrong-password') 37 | ->call('confirmPassword'); 38 | 39 | $response->assertHasErrors(['password']); 40 | }); -------------------------------------------------------------------------------- /tests/Feature/Auth/PasswordResetTest.php: -------------------------------------------------------------------------------- 1 | get('/forgot-password'); 12 | 13 | $response->assertStatus(200); 14 | }); 15 | 16 | test('reset password link can be requested', function () { 17 | Notification::fake(); 18 | 19 | $user = User::factory()->create(); 20 | 21 | Volt::test('auth.forgot-password') 22 | ->set('email', $user->email) 23 | ->call('sendPasswordResetLink'); 24 | 25 | Notification::assertSentTo($user, ResetPassword::class); 26 | }); 27 | 28 | test('reset password screen can be rendered', function () { 29 | Notification::fake(); 30 | 31 | $user = User::factory()->create(); 32 | 33 | Volt::test('auth.forgot-password') 34 | ->set('email', $user->email) 35 | ->call('sendPasswordResetLink'); 36 | 37 | Notification::assertSentTo($user, ResetPassword::class, function ($notification) { 38 | $response = $this->get('/reset-password/'.$notification->token); 39 | 40 | $response->assertStatus(200); 41 | 42 | return true; 43 | }); 44 | }); 45 | 46 | test('password can be reset with valid token', function () { 47 | Notification::fake(); 48 | 49 | $user = User::factory()->create(); 50 | 51 | Volt::test('auth.forgot-password') 52 | ->set('email', $user->email) 53 | ->call('sendPasswordResetLink'); 54 | 55 | Notification::assertSentTo($user, ResetPassword::class, function ($notification) use ($user) { 56 | $response = Volt::test('auth.reset-password', ['token' => $notification->token]) 57 | ->set('email', $user->email) 58 | ->set('password', 'password') 59 | ->set('password_confirmation', 'password') 60 | ->call('resetPassword'); 61 | 62 | $response 63 | ->assertHasNoErrors() 64 | ->assertRedirect(route('login', absolute: false)); 65 | 66 | return true; 67 | }); 68 | }); -------------------------------------------------------------------------------- /tests/Feature/Auth/RegistrationTest.php: -------------------------------------------------------------------------------- 1 | get('/register'); 9 | 10 | $response->assertStatus(200); 11 | }); 12 | 13 | test('new users can register', function () { 14 | $response = Volt::test('auth.register') 15 | ->set('name', 'Test User') 16 | ->set('email', 'test@example.com') 17 | ->set('password', 'password') 18 | ->set('password_confirmation', 'password') 19 | ->set('terms', true) // Add this line to set the terms checkbox to true 20 | ->call('register'); 21 | 22 | $response 23 | ->assertHasNoErrors() 24 | ->assertRedirect(route('dashboard', absolute: false)); 25 | 26 | $this->assertAuthenticated(); 27 | }); 28 | -------------------------------------------------------------------------------- /tests/Feature/DashboardTest.php: -------------------------------------------------------------------------------- 1 | get('/dashboard'); 9 | $response->assertRedirect('/login'); 10 | }); 11 | 12 | test('authenticated users can visit the dashboard', function () { 13 | $user = User::factory()->create(); 14 | $this->actingAs($user); 15 | 16 | $response = $this->get('/dashboard'); 17 | $response->assertStatus(200); 18 | }); -------------------------------------------------------------------------------- /tests/Feature/ExampleTest.php: -------------------------------------------------------------------------------- 1 | get('/'); 5 | 6 | $response->assertStatus(200); 7 | }); 8 | -------------------------------------------------------------------------------- /tests/Feature/Settings/PasswordUpdateTest.php: -------------------------------------------------------------------------------- 1 | create([ 11 | 'password' => Hash::make('password'), 12 | ]); 13 | 14 | $this->actingAs($user); 15 | 16 | $response = Volt::test('settings.password') 17 | ->set('current_password', 'password') 18 | ->set('password', 'new-password') 19 | ->set('password_confirmation', 'new-password') 20 | ->call('updatePassword'); 21 | 22 | $response->assertHasNoErrors(); 23 | 24 | expect(Hash::check('new-password', $user->refresh()->password))->toBeTrue(); 25 | }); 26 | 27 | test('correct password must be provided to update password', function () { 28 | $user = User::factory()->create([ 29 | 'password' => Hash::make('password'), 30 | ]); 31 | 32 | $this->actingAs($user); 33 | 34 | $response = Volt::test('settings.password') 35 | ->set('current_password', 'wrong-password') 36 | ->set('password', 'new-password') 37 | ->set('password_confirmation', 'new-password') 38 | ->call('updatePassword'); 39 | 40 | $response->assertHasErrors(['current_password']); 41 | }); -------------------------------------------------------------------------------- /tests/Feature/Settings/ProfileUpdateTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->create()); 10 | 11 | $this->get('/settings/profile')->assertOk(); 12 | }); 13 | 14 | test('profile information can be updated', function () { 15 | $user = User::factory()->create(); 16 | 17 | $this->actingAs($user); 18 | 19 | $response = Volt::test('settings.profile') 20 | ->set('name', 'Test User') 21 | ->set('email', 'test@example.com') 22 | ->call('updateProfileInformation'); 23 | 24 | $response->assertHasNoErrors(); 25 | 26 | $user->refresh(); 27 | 28 | expect($user->name)->toEqual('Test User'); 29 | expect($user->email)->toEqual('test@example.com'); 30 | expect($user->email_verified_at)->toBeNull(); 31 | }); 32 | 33 | test('email verification status is unchanged when email address is unchanged', function () { 34 | $user = User::factory()->create(); 35 | 36 | $this->actingAs($user); 37 | 38 | $response = Volt::test('settings.profile') 39 | ->set('name', 'Test User') 40 | ->set('email', $user->email) 41 | ->call('updateProfileInformation'); 42 | 43 | $response->assertHasNoErrors(); 44 | 45 | expect($user->refresh()->email_verified_at)->not->toBeNull(); 46 | }); 47 | 48 | test('user can delete their account', function () { 49 | $user = User::factory()->create(); 50 | 51 | $this->actingAs($user); 52 | 53 | $response = Volt::test('settings.delete-user-form') 54 | ->set('password', 'password') 55 | ->call('deleteUser'); 56 | 57 | $response 58 | ->assertHasNoErrors() 59 | ->assertRedirect('/'); 60 | 61 | expect($user->fresh())->toBeNull(); 62 | expect(auth()->check())->toBeFalse(); 63 | }); 64 | 65 | test('correct password must be provided to delete account', function () { 66 | $user = User::factory()->create(); 67 | 68 | $this->actingAs($user); 69 | 70 | $response = Volt::test('settings.delete-user-form') 71 | ->set('password', 'wrong-password') 72 | ->call('deleteUser'); 73 | 74 | $response->assertHasErrors(['password']); 75 | 76 | expect($user->fresh())->not->toBeNull(); 77 | }); -------------------------------------------------------------------------------- /tests/Pest.php: -------------------------------------------------------------------------------- 1 | extend(Tests\TestCase::class) 15 | ->use(Illuminate\Foundation\Testing\RefreshDatabase::class) 16 | ->in('Feature'); 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Expectations 21 | |-------------------------------------------------------------------------- 22 | | 23 | | When you're writing tests, you often need to check that values meet certain conditions. The 24 | | "expect()" function gives you access to a set of "expectations" methods that you can use 25 | | to assert different things. Of course, you may extend the Expectation API at any time. 26 | | 27 | */ 28 | 29 | expect()->extend('toBeOne', function () { 30 | return $this->toBe(1); 31 | }); 32 | 33 | /* 34 | |-------------------------------------------------------------------------- 35 | | Functions 36 | |-------------------------------------------------------------------------- 37 | | 38 | | While Pest is very powerful out-of-the-box, you may have some testing code specific to your 39 | | project that you don't want to repeat in every file. Here you can also expose helpers as 40 | | global functions to help you to reduce the number of lines of code in your test files. 41 | | 42 | */ 43 | 44 | function something() 45 | { 46 | // .. 47 | } 48 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | toBeTrue(); 5 | }); 6 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { 2 | defineConfig 3 | } from 'vite'; 4 | import laravel from 'laravel-vite-plugin'; 5 | import html from '@rollup/plugin-html'; 6 | import { 7 | glob 8 | } from 'glob'; 9 | import path from 'path'; 10 | 11 | /** 12 | * Get Files from a directory 13 | * @param {string} query 14 | * @returns array 15 | */ 16 | function GetFilesArray(query) { 17 | return glob.sync(query); 18 | } 19 | 20 | // Page JS Files 21 | const pageJsFiles = GetFilesArray('resources/assets/js/*.js'); 22 | 23 | // Processing Vendor JS Files 24 | const vendorJsFiles = GetFilesArray('resources/assets/vendor/js/*.js'); 25 | 26 | // Processing Libs JS Files 27 | const LibsJsFiles = GetFilesArray('resources/assets/vendor/libs/**/*.js'); 28 | 29 | // Processing Libs Scss & Css Files 30 | const LibsScssFiles = GetFilesArray('resources/assets/vendor/libs/**/!(_)*.scss'); 31 | const LibsCssFiles = GetFilesArray('resources/assets/vendor/libs/**/*.css'); 32 | 33 | // Processing Core, Themes & Pages Scss Files 34 | const CoreScssFiles = GetFilesArray('resources/assets/vendor/scss/**/!(_)*.scss'); 35 | 36 | // Processing Fonts Scss & JS Files 37 | const FontsScssFiles = GetFilesArray('resources/assets/vendor/fonts/!(_)*.scss'); 38 | const FontsJsFiles = GetFilesArray('resources/assets/vendor/fonts/**/!(_)*.js'); 39 | 40 | export default defineConfig({ 41 | plugins: [ 42 | laravel({ 43 | input: [ 44 | 'resources/css/app.css', 45 | 'resources/assets/css/demo.css', 46 | 'resources/js/app.js', 47 | ...pageJsFiles, 48 | ...vendorJsFiles, 49 | ...LibsJsFiles, 50 | ...CoreScssFiles, 51 | ...LibsScssFiles, 52 | ...LibsCssFiles, 53 | ...FontsScssFiles, 54 | ...FontsJsFiles 55 | ], 56 | refresh: true 57 | }), 58 | html() 59 | ], 60 | resolve: { 61 | alias: { 62 | '@': path.resolve(__dirname, 'resources'), 63 | }, 64 | }, 65 | }); 66 | --------------------------------------------------------------------------------